Home | History | Annotate | Download | only in source
      1 // Copyright (c) 2015-2016 The Khronos Group Inc.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //     http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 #ifndef SOURCE_INSTRUCTION_H_
     16 #define SOURCE_INSTRUCTION_H_
     17 
     18 #include <cstdint>
     19 #include <vector>
     20 
     21 #include "source/latest_version_spirv_header.h"
     22 #include "spirv-tools/libspirv.h"
     23 
     24 // Describes an instruction.
     25 struct spv_instruction_t {
     26   // Normally, both opcode and extInstType contain valid data.
     27   // However, when the assembler parses !<number> as the first word in
     28   // an instruction and opcode and extInstType are invalid.
     29   SpvOp opcode;
     30   spv_ext_inst_type_t extInstType;
     31 
     32   // The Id of the result type, if this instruction has one.  Zero otherwise.
     33   uint32_t resultTypeId;
     34 
     35   // The instruction, as a sequence of 32-bit words.
     36   // For a regular instruction the opcode and word count are combined
     37   // in words[0], as described in the SPIR-V spec.
     38   // Otherwise, the first token was !<number>, and that number appears
     39   // in words[0].  Subsequent elements are the result of parsing
     40   // tokens in the alternate parsing mode as described in syntax.md.
     41   std::vector<uint32_t> words;
     42 };
     43 
     44 // Appends a word to an instruction, without checking for overflow.
     45 inline void spvInstructionAddWord(spv_instruction_t* inst, uint32_t value) {
     46   inst->words.push_back(value);
     47 }
     48 
     49 #endif  // SOURCE_INSTRUCTION_H_
     50