File: SPIRVRegisterInfo.td

package info (click to toggle)
swiftlang 6.1.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,791,604 kB
  • sloc: cpp: 9,901,740; ansic: 2,201,431; asm: 1,091,827; python: 308,252; objc: 82,166; f90: 80,126; lisp: 38,358; pascal: 25,559; sh: 20,429; ml: 5,058; perl: 4,745; makefile: 4,484; awk: 3,535; javascript: 3,018; xml: 918; fortran: 664; cs: 573; ruby: 396
file content (63 lines) | stat: -rw-r--r-- 2,470 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//===-- 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 ID640 : Register<"ID640">;
  def fID0 : Register<"fID0">;
  def fID640 : Register<"fID640">;
  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 ID64 : RegisterClass<"SPIRV", [i64], 32, (add ID640)>;
  def fID : RegisterClass<"SPIRV", [f32], 32, (add fID0)>;
  def fID64 : RegisterClass<"SPIRV", [f64], 32, (add fID640)>;
  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, i64, f32, f64, p32, p64, v2i32, v2f32, v2p32, v2p64],
      32,
      (add ID0, ID640, fID0, fID640, 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)>;
}