blob: 9231d22e8d8362c2632ed6ffc25e3e5dc71e2178 [file] [log] [blame]
//===-- SPIRVRegisterInfo.td - SPIR-V Register defs --------*- tablegen -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Declarations that describe the SPIR-V register file.
//
//===----------------------------------------------------------------------===//
let Namespace = "SPIRV" in {
// Pointer types for patterns with the GlobalISelEmitter
def p32 : PtrValueType <i32, 0>;
def p64 : PtrValueType <i64, 0>;
class VTPtrVec<int nelem, PtrValueType ptr>
: VTVec<nelem, ValueType<ptr.Size, ptr.Value>, ptr.Value> {
int isPointer = true;
}
def v2p32 : VTPtrVec<2, p32>;
def v2p64 : VTPtrVec<2, p64>;
// Class for type registers
def TYPE0 : Register<"TYPE0">;
def TYPE : RegisterClass<"SPIRV", [i32], 32, (add TYPE0)>;
// Class for non-type registers
def ID0 : Register<"ID0">;
def fID0 : Register<"fID0">;
def pID320 : Register<"pID320">;
def pID640 : Register<"pID640">;
def vID0 : Register<"vID0">;
def vfID0 : Register<"vfID0">;
def vpID320 : Register<"vpID320">;
def vpID640 : Register<"vpID640">;
def ID : RegisterClass<"SPIRV", [i32], 32, (add ID0)>;
def fID : RegisterClass<"SPIRV", [f32], 32, (add fID0)>;
def pID32 : RegisterClass<"SPIRV", [p32], 32, (add pID320)>;
def pID64 : RegisterClass<"SPIRV", [p64], 32, (add pID640)>;
def vID : RegisterClass<"SPIRV", [v2i32], 32, (add vID0)>;
def vfID : RegisterClass<"SPIRV", [v2f32], 32, (add vfID0)>;
def vpID32 : RegisterClass<"SPIRV", [v2p32], 32, (add vpID320)>;
def vpID64 : RegisterClass<"SPIRV", [v2p64], 32, (add vpID640)>;
def ANYID : RegisterClass<
"SPIRV",
[i32, f32, p32, p64, v2i32, v2f32, v2p32, v2p64],
32,
(add ID0, fID0, pID320, pID640, vID0, vfID0, vpID320, vpID640)>;
// A few instructions like OpName can take ids from both type and non-type
// instructions, so we need a super-class to allow for both to count as valid
// arguments for these instructions.
def ANY : RegisterClass<"SPIRV", [i32], 32, (add TYPE, ID)>;
}