| // *** THIS FILE IS GENERATED - DO NOT EDIT *** |
| // See spirv_gramar_generator.py for modifications |
| |
| |
| /*************************************************************************** |
| * |
| * Copyright (c) 2021 The Khronos Group Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| * Author: Spencer Fricke <s.fricke@samsung.com> |
| * |
| * This file is related to anything that is found in the SPIR-V grammar |
| * file found in the SPIRV-Headers. Mainly used for SPIR-V util functions. |
| * |
| ****************************************************************************/ |
| |
| #include "spirv_grammar_helper.h" |
| #include <spirv/unified1/spirv.hpp> |
| |
| // Any non supported operation will be covered with VUID 01090 |
| bool AtomicOperation(uint32_t opcode) { |
| bool found = false; |
| switch (opcode) { |
| case spv::OpAtomicLoad: |
| case spv::OpAtomicStore: |
| case spv::OpAtomicExchange: |
| case spv::OpAtomicCompareExchange: |
| case spv::OpAtomicIIncrement: |
| case spv::OpAtomicIDecrement: |
| case spv::OpAtomicIAdd: |
| case spv::OpAtomicISub: |
| case spv::OpAtomicSMin: |
| case spv::OpAtomicUMin: |
| case spv::OpAtomicSMax: |
| case spv::OpAtomicUMax: |
| case spv::OpAtomicAnd: |
| case spv::OpAtomicOr: |
| case spv::OpAtomicXor: |
| case spv::OpAtomicFMinEXT: |
| case spv::OpAtomicFMaxEXT: |
| case spv::OpAtomicFAddEXT: |
| found = true; |
| break; |
| default: |
| break; |
| } |
| return found; |
| } |
| |
| // Any non supported operation will be covered with VUID 01090 |
| bool GroupOperation(uint32_t opcode) { |
| bool found = false; |
| switch (opcode) { |
| case spv::OpGroupNonUniformElect: |
| case spv::OpGroupNonUniformAll: |
| case spv::OpGroupNonUniformAny: |
| case spv::OpGroupNonUniformAllEqual: |
| case spv::OpGroupNonUniformBroadcast: |
| case spv::OpGroupNonUniformBroadcastFirst: |
| case spv::OpGroupNonUniformBallot: |
| case spv::OpGroupNonUniformInverseBallot: |
| case spv::OpGroupNonUniformBallotBitExtract: |
| case spv::OpGroupNonUniformBallotBitCount: |
| case spv::OpGroupNonUniformBallotFindLSB: |
| case spv::OpGroupNonUniformBallotFindMSB: |
| case spv::OpGroupNonUniformShuffle: |
| case spv::OpGroupNonUniformShuffleXor: |
| case spv::OpGroupNonUniformShuffleUp: |
| case spv::OpGroupNonUniformShuffleDown: |
| case spv::OpGroupNonUniformIAdd: |
| case spv::OpGroupNonUniformFAdd: |
| case spv::OpGroupNonUniformIMul: |
| case spv::OpGroupNonUniformFMul: |
| case spv::OpGroupNonUniformSMin: |
| case spv::OpGroupNonUniformUMin: |
| case spv::OpGroupNonUniformFMin: |
| case spv::OpGroupNonUniformSMax: |
| case spv::OpGroupNonUniformUMax: |
| case spv::OpGroupNonUniformFMax: |
| case spv::OpGroupNonUniformBitwiseAnd: |
| case spv::OpGroupNonUniformBitwiseOr: |
| case spv::OpGroupNonUniformBitwiseXor: |
| case spv::OpGroupNonUniformLogicalAnd: |
| case spv::OpGroupNonUniformLogicalOr: |
| case spv::OpGroupNonUniformLogicalXor: |
| case spv::OpGroupNonUniformQuadBroadcast: |
| case spv::OpGroupNonUniformQuadSwap: |
| case spv::OpGroupNonUniformPartitionNV: |
| found = true; |
| break; |
| default: |
| break; |
| } |
| return found; |
| } |
| |
| // Return paramater position of memory scope ID or zero if there is none |
| uint32_t MemoryScopeParam(uint32_t opcode) { |
| uint32_t position = 0; |
| switch (opcode) { |
| case spv::OpMemoryBarrier: |
| return 1; |
| case spv::OpControlBarrier: |
| case spv::OpAtomicStore: |
| return 2; |
| case spv::OpAtomicLoad: |
| case spv::OpAtomicExchange: |
| case spv::OpAtomicCompareExchange: |
| case spv::OpAtomicIIncrement: |
| case spv::OpAtomicIDecrement: |
| case spv::OpAtomicIAdd: |
| case spv::OpAtomicISub: |
| case spv::OpAtomicSMin: |
| case spv::OpAtomicUMin: |
| case spv::OpAtomicSMax: |
| case spv::OpAtomicUMax: |
| case spv::OpAtomicAnd: |
| case spv::OpAtomicOr: |
| case spv::OpAtomicXor: |
| case spv::OpAtomicFMinEXT: |
| case spv::OpAtomicFMaxEXT: |
| case spv::OpAtomicFAddEXT: |
| return 4; |
| break; |
| default: |
| break; |
| } |
| return position; |
| } |
| |
| // Return paramater position of execution scope ID or zero if there is none |
| uint32_t ExecutionScopeParam(uint32_t opcode) { |
| uint32_t position = 0; |
| switch (opcode) { |
| case spv::OpControlBarrier: |
| return 1; |
| case spv::OpGroupAll: |
| case spv::OpGroupAny: |
| case spv::OpGroupBroadcast: |
| case spv::OpGroupIAdd: |
| case spv::OpGroupFAdd: |
| case spv::OpGroupFMin: |
| case spv::OpGroupUMin: |
| case spv::OpGroupSMin: |
| case spv::OpGroupFMax: |
| case spv::OpGroupUMax: |
| case spv::OpGroupSMax: |
| case spv::OpGroupNonUniformElect: |
| case spv::OpGroupNonUniformAll: |
| case spv::OpGroupNonUniformAny: |
| case spv::OpGroupNonUniformAllEqual: |
| case spv::OpGroupNonUniformBroadcast: |
| case spv::OpGroupNonUniformBroadcastFirst: |
| case spv::OpGroupNonUniformBallot: |
| case spv::OpGroupNonUniformInverseBallot: |
| case spv::OpGroupNonUniformBallotBitExtract: |
| case spv::OpGroupNonUniformBallotBitCount: |
| case spv::OpGroupNonUniformBallotFindLSB: |
| case spv::OpGroupNonUniformBallotFindMSB: |
| case spv::OpGroupNonUniformShuffle: |
| case spv::OpGroupNonUniformShuffleXor: |
| case spv::OpGroupNonUniformShuffleUp: |
| case spv::OpGroupNonUniformShuffleDown: |
| case spv::OpGroupNonUniformIAdd: |
| case spv::OpGroupNonUniformFAdd: |
| case spv::OpGroupNonUniformIMul: |
| case spv::OpGroupNonUniformFMul: |
| case spv::OpGroupNonUniformSMin: |
| case spv::OpGroupNonUniformUMin: |
| case spv::OpGroupNonUniformFMin: |
| case spv::OpGroupNonUniformSMax: |
| case spv::OpGroupNonUniformUMax: |
| case spv::OpGroupNonUniformFMax: |
| case spv::OpGroupNonUniformBitwiseAnd: |
| case spv::OpGroupNonUniformBitwiseOr: |
| case spv::OpGroupNonUniformBitwiseXor: |
| case spv::OpGroupNonUniformLogicalAnd: |
| case spv::OpGroupNonUniformLogicalOr: |
| case spv::OpGroupNonUniformLogicalXor: |
| case spv::OpGroupNonUniformQuadBroadcast: |
| case spv::OpGroupNonUniformQuadSwap: |
| case spv::OpGroupIAddNonUniformAMD: |
| case spv::OpGroupFAddNonUniformAMD: |
| case spv::OpGroupFMinNonUniformAMD: |
| case spv::OpGroupUMinNonUniformAMD: |
| case spv::OpGroupSMinNonUniformAMD: |
| case spv::OpGroupFMaxNonUniformAMD: |
| case spv::OpGroupUMaxNonUniformAMD: |
| case spv::OpGroupSMaxNonUniformAMD: |
| case spv::OpReadClockKHR: |
| case spv::OpTypeCooperativeMatrixNV: |
| return 3; |
| break; |
| default: |
| break; |
| } |
| return position; |
| } |
| |
| |