191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni#!/usr/bin/bash
291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni# script to generate code for LLVM/SPIR-V translator based on khronos 
391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni# header file spirv.hpp.
491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni#
591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni######################
891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni#
991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni# generate NameMap
1091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni#
1191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni######################
1291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
1391585d9acd75a2bdbfd177bf56c8b9436f442152Yang NigenNameMap() {
1491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Niprefix=$1
1591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Niecho "template<> inline void
1691585d9acd75a2bdbfd177bf56c8b9436f442152Yang NiSPIRVMap<$prefix, std::string>::init() {"
1791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
1891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nicat $spirvHeader | sed -n -e "/^ *${prefix}[^a-z]/s:^ *${prefix}\([^= ][^= ]*\)[= ][= ]*\([0x]*[0-9][0-9]*\).*:\1 \2:p"  | while read a b; do
1991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  printf "  add(${prefix}%s, \"%s\");\n" $a $a
2091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nidone
2191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
2291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Niecho "}
2391585d9acd75a2bdbfd177bf56c8b9436f442152Yang NiSPIRV_DEF_NAMEMAP($prefix, SPIRV${prefix}NameMap)
2491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni"
2591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
2691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni}
2791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
2891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni###########################
2991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni#
3091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni# generate isValid function
3191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni#
3291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni###########################
3391585d9acd75a2bdbfd177bf56c8b9436f442152Yang NigenIsValid() {
3491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Niprefix=$1
3591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Niecho "inline bool
3691585d9acd75a2bdbfd177bf56c8b9436f442152Yang NiisValid(spv::$prefix V) {
3791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  switch(V) {"
3891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
3991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  cat $spirvHeader | sed -n -e "/^ *${prefix}[^a-z]/s:^ *${prefix}\([^= ][^= ]*\)[= ][= ]*\(.*\).*:\1 \2:p"  | while read a b; do
4091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  if [[ $a == CapabilityNone ]]; then
4191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    continue
4291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  fi
4391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  printf "    case ${prefix}%s:\n" $a
4491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nidone
4591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
4691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Niecho "      return true;
4791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    default:
4891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni      return false;
4991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  }
5091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni}
5191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni"
5291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni}
5391585d9acd75a2bdbfd177bf56c8b9436f442152Yang NigenMaskIsValid() {
5491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Niprefix=$1
5591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nisubprefix=`echo $prefix | sed -e "s:Mask::g"`
5691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Niecho "inline bool
5791585d9acd75a2bdbfd177bf56c8b9436f442152Yang NiisValid$prefix(SPIRVWord Mask) {
5891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  SPIRVWord ValidMask = 0u;"
5991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
6091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  cat $spirvHeader | sed -n -e "/^ *${subprefix}[^a-z]/s:^ *${subprefix}\([^= ][^= ]*\)Mask[= ][= ]*\(.*\).*:\1 \2:p"  | while read a b; do
6191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  if [[ $a == None ]]; then
6291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    continue
6391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  fi
6491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  printf "  ValidMask |= ${subprefix}%sMask;\n" $a
6591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nidone
6691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
6791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Niecho "
6891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  return (Mask & ~ValidMask) == 0;
6991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni}
7091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni"
7191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni}
7291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
7391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni##############################
7491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni#
7591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni# generate entries for td file
7691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni#
7791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni##############################
7891585d9acd75a2bdbfd177bf56c8b9436f442152Yang NigenTd() {
7991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Niprefix=$1
8091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
8191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Niif [[ $prefix == "Capability" ]]; then
8291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  echo "class SPIRV${prefix}_ {"
8391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nielse
8491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  echo "def SPIRV${prefix} : Operand<i32> {
8591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  let PrintMethod = \"printSPIRV${prefix}\";
8691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni"
8791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nifi
8891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
8991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nicat $spirvHeader | sed -n -e "/^ *${prefix}[^a-z]/s:^ *${prefix}\([^= ][^= ]*\)[= ][= ]*\([0xX]*[0-9a-fA-F][0-9a-fA-F]*\).*:\1 \2:p"  | while read a b; do
9091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  if [[ $a == CapabilityNone ]]; then
9191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    continue
9291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  fi
9391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  printf "  int %s = %s;\n" $a $b
9491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nidone
9591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
9691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Niif [[ $prefix == "Capability" ]]; then
9791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  echo "}
9891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nidef SPIRV${prefix} : SPIRV${prefix}_;
9991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni"
10091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nielse 
10191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  echo "}
10291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni"
10391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nifi
10491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni}
10591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
10691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nigen() {
10791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nitype=$1
10891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nifor prefix in SourceLanguage ExecutionModel AddressingModel MemoryModel ExecutionMode StorageClass Dim SamplerAddressingMode SamplerFilterMode ImageFormat \
10991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  ImageChannelOrder ImageChannelDataType FPRoundingMode LinkageType AccessQualifier FunctionParameterAttribute Decoration BuiltIn Scope GroupOperation \
11091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  KernelEnqueueFlags Capability Op; do
11191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  if [[ "$type" == NameMap ]]; then
11291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    genNameMap $prefix
11391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  elif [[ "$type" == isValid ]]; then
11491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    genIsValid $prefix
11591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  elif [[ "$type" == td ]]; then
11691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    genTd $prefix
11791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  else
11891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    echo "invalid type \"$type\"."
11991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    exit
12091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  fi
12191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nidone
12291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nifor prefix in ImageOperandsMask FPFastMathModeMask SelectionControlMask LoopControlMask FunctionControlMask MemorySemanticsMask MemoryAccessMask \
12391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  KernelProfilingInfoMask; do
12491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  if [[ "$type" == isValid ]]; then
12591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni    genMaskIsValid $prefix
12691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  fi
12791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nidone
12891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni}
12991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
13091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni####################
13191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni#
13291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni# main
13391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni#
13491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni####################
13591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
13691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Niif [[ $# -ne 3 ]]; then
13791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  echo "usage: gen_spirv path_to_spirv.hpp [NameMap|isValid|td] output_file"
13891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni  exit
13991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nifi
14091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
14191585d9acd75a2bdbfd177bf56c8b9436f442152Yang NispirvHeader=$1
14291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nitype=$2
14391585d9acd75a2bdbfd177bf56c8b9436f442152Yang NioutputFile=$3
14491585d9acd75a2bdbfd177bf56c8b9436f442152Yang NiincludeGuard="`echo ${outputFile} | tr '[:lower:]' '[:upper:]' | sed -e 's/\./_/g'`_"
14591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
14691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Niecho "//===- ${outputFile} - SPIR-V ${type} enums ----------------*- C++ -*-===//
14791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//
14891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//                     The LLVM/SPIRV Translator
14991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//
15091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// This file is distributed under the University of Illinois Open Source
15191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// License. See LICENSE.TXT for details.
15291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//
15391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// Copyright (c) 2014 Advanced Micro Devices, Inc. All rights reserved.
15491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//
15591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// Permission is hereby granted, free of charge, to any person obtaining a
15691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// copy of this software and associated documentation files (the \"Software\"),
15791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// to deal with the Software without restriction, including without limitation
15891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// the rights to use, copy, modify, merge, publish, distribute, sublicense,
15991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// and/or sell copies of the Software, and to permit persons to whom the
16091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// Software is furnished to do so, subject to the following conditions:
16191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//
16291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// Redistributions of source code must retain the above copyright notice,
16391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// this list of conditions and the following disclaimers.
16491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// Redistributions in binary form must reproduce the above copyright notice,
16591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// this list of conditions and the following disclaimers in the documentation
16691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// and/or other materials provided with the distribution.
16791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// Neither the names of Advanced Micro Devices, Inc., nor the names of its
16891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// contributors may be used to endorse or promote products derived from this
16991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// Software without specific prior written permission.
17091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
17591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH
17691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// THE SOFTWARE.
17791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//
17891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//===----------------------------------------------------------------------===//
17991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni/// \\file
18091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni///
18191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni/// This file defines SPIR-V ${type} enums.
18291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni///
18391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//===----------------------------------------------------------------------===//
18491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// WARNING:
18591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//
18691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// This file has been generated using \`tools/spirv-tool/gen_spirv.bash\` and
18791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// should not be modified manually. If the file needs to be updated, edit the
18891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni// script and any other source file instead, before re-generating this file.
18991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni//===----------------------------------------------------------------------===//
19091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
19191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni#ifndef ${includeGuard}
19291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni#define ${includeGuard}
19391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
19491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni#include \"spirv.hpp\"
19591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni#include \"SPIRVEnum.h\"
19691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
19791585d9acd75a2bdbfd177bf56c8b9436f442152Yang Niusing namespace spv;
19891585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
19991585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ninamespace SPIRV {
20091585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni" > ${outputFile}
20191585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
20291585d9acd75a2bdbfd177bf56c8b9436f442152Yang Nigen $type >> ${outputFile}
20391585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
20491585d9acd75a2bdbfd177bf56c8b9436f442152Yang Niecho "} /* namespace SPIRV */
20591585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni
20691585d9acd75a2bdbfd177bf56c8b9436f442152Yang Ni#endif /* ${includeGuard} */" >> ${outputFile}
207