1 # This file defines the possible types of each operand and result.
2 #
3 # In general, we're able to narrow this down on some attributes directly from
4 # the machine instruction descriptions, but the Go mappings need to further
5 # constrain them and how they relate. For example, on x86 we can't distinguish
6 # int and uint, though we can distinguish these from float.
7
8 in: !repeat
9 - !sum &types
10 - {class: vreg, go: Int8x16, base: "int", elemBits: 8, bits: 128, lanes: 16}
11 - {class: vreg, go: Uint8x16, base: "uint", elemBits: 8, bits: 128, lanes: 16}
12 - {class: vreg, go: Int16x8, base: "int", elemBits: 16, bits: 128, lanes: 8}
13 - {class: vreg, go: Uint16x8, base: "uint", elemBits: 16, bits: 128, lanes: 8}
14 - {class: vreg, go: Int32x4, base: "int", elemBits: 32, bits: 128, lanes: 4}
15 - {class: vreg, go: Uint32x4, base: "uint", elemBits: 32, bits: 128, lanes: 4}
16 - {class: vreg, go: Int64x2, base: "int", elemBits: 64, bits: 128, lanes: 2}
17 - {class: vreg, go: Uint64x2, base: "uint", elemBits: 64, bits: 128, lanes: 2}
18 - {class: vreg, go: Float32x4, base: "float", elemBits: 32, bits: 128, lanes: 4}
19 - {class: vreg, go: Float64x2, base: "float", elemBits: 64, bits: 128, lanes: 2}
20 - {class: vreg, go: Int8x32, base: "int", elemBits: 8, bits: 256, lanes: 32}
21 - {class: vreg, go: Uint8x32, base: "uint", elemBits: 8, bits: 256, lanes: 32}
22 - {class: vreg, go: Int16x16, base: "int", elemBits: 16, bits: 256, lanes: 16}
23 - {class: vreg, go: Uint16x16, base: "uint", elemBits: 16, bits: 256, lanes: 16}
24 - {class: vreg, go: Int32x8, base: "int", elemBits: 32, bits: 256, lanes: 8}
25 - {class: vreg, go: Uint32x8, base: "uint", elemBits: 32, bits: 256, lanes: 8}
26 - {class: vreg, go: Int64x4, base: "int", elemBits: 64, bits: 256, lanes: 4}
27 - {class: vreg, go: Uint64x4, base: "uint", elemBits: 64, bits: 256, lanes: 4}
28 - {class: vreg, go: Float32x8, base: "float", elemBits: 32, bits: 256, lanes: 8}
29 - {class: vreg, go: Float64x4, base: "float", elemBits: 64, bits: 256, lanes: 4}
30 - {class: vreg, go: Int8x64, base: "int", elemBits: 8, bits: 512, lanes: 64}
31 - {class: vreg, go: Uint8x64, base: "uint", elemBits: 8, bits: 512, lanes: 64}
32 - {class: vreg, go: Int16x32, base: "int", elemBits: 16, bits: 512, lanes: 32}
33 - {class: vreg, go: Uint16x32, base: "uint", elemBits: 16, bits: 512, lanes: 32}
34 - {class: vreg, go: Int32x16, base: "int", elemBits: 32, bits: 512, lanes: 16}
35 - {class: vreg, go: Uint32x16, base: "uint", elemBits: 32, bits: 512, lanes: 16}
36 - {class: vreg, go: Int64x8, base: "int", elemBits: 64, bits: 512, lanes: 8}
37 - {class: vreg, go: Uint64x8, base: "uint", elemBits: 64, bits: 512, lanes: 8}
38 - {class: vreg, go: Float32x16, base: "float", elemBits: 32, bits: 512, lanes: 16}
39 - {class: vreg, go: Float64x8, base: "float", elemBits: 64, bits: 512, lanes: 8}
40
41 - {class: mask, go: Mask8x16, base: "int", elemBits: 8, bits: 128, lanes: 16}
42 - {class: mask, go: Mask16x8, base: "int", elemBits: 16, bits: 128, lanes: 8}
43 - {class: mask, go: Mask32x4, base: "int", elemBits: 32, bits: 128, lanes: 4}
44 - {class: mask, go: Mask64x2, base: "int", elemBits: 64, bits: 128, lanes: 2}
45 - {class: mask, go: Mask8x32, base: "int", elemBits: 8, bits: 256, lanes: 32}
46 - {class: mask, go: Mask16x16, base: "int", elemBits: 16, bits: 256, lanes: 16}
47 - {class: mask, go: Mask32x8, base: "int", elemBits: 32, bits: 256, lanes: 8}
48 - {class: mask, go: Mask64x4, base: "int", elemBits: 64, bits: 256, lanes: 4}
49 - {class: mask, go: Mask8x64, base: "int", elemBits: 8, bits: 512, lanes: 64}
50 - {class: mask, go: Mask16x32, base: "int", elemBits: 16, bits: 512, lanes: 32}
51 - {class: mask, go: Mask32x16, base: "int", elemBits: 32, bits: 512, lanes: 16}
52 - {class: mask, go: Mask64x8, base: "int", elemBits: 64, bits: 512, lanes: 8}
53
54
55 - {class: greg, go: float64, base: "float", bits: 64, lanes: 1}
56 - {class: greg, go: float32, base: "float", bits: 32, lanes: 1}
57 - {class: greg, go: int64, base: "int", bits: 64, lanes: 1}
58 - {class: greg, go: int32, base: "int", bits: 32, lanes: 1}
59 - {class: greg, go: int16, base: "int", bits: 16, lanes: 1}
60 - {class: greg, go: int8, base: "int", bits: 8, lanes: 1}
61 - {class: greg, go: uint64, base: "uint", bits: 64, lanes: 1}
62 - {class: greg, go: uint32, base: "uint", bits: 32, lanes: 1}
63 - {class: greg, go: uint16, base: "uint", bits: 16, lanes: 1}
64 - {class: greg, go: uint8, base: "uint", bits: 8, lanes: 1}
65
66 # Special shapes just to make INSERT[IF]128 work.
67 # The elemBits field of these shapes are wrong, it would be overwritten by overwriteElemBits.
68 - {class: vreg, go: Int8x16, base: "int", elemBits: 128, bits: 128, lanes: 16}
69 - {class: vreg, go: Uint8x16, base: "uint", elemBits: 128, bits: 128, lanes: 16}
70 - {class: vreg, go: Int16x8, base: "int", elemBits: 128, bits: 128, lanes: 8}
71 - {class: vreg, go: Uint16x8, base: "uint", elemBits: 128, bits: 128, lanes: 8}
72 - {class: vreg, go: Int32x4, base: "int", elemBits: 128, bits: 128, lanes: 4}
73 - {class: vreg, go: Uint32x4, base: "uint", elemBits: 128, bits: 128, lanes: 4}
74 - {class: vreg, go: Int64x2, base: "int", elemBits: 128, bits: 128, lanes: 2}
75 - {class: vreg, go: Uint64x2, base: "uint", elemBits: 128, bits: 128, lanes: 2}
76
77 - {class: vreg, go: Int8x32, base: "int", elemBits: 128, bits: 256, lanes: 32}
78 - {class: vreg, go: Uint8x32, base: "uint", elemBits: 128, bits: 256, lanes: 32}
79 - {class: vreg, go: Int16x16, base: "int", elemBits: 128, bits: 256, lanes: 16}
80 - {class: vreg, go: Uint16x16, base: "uint", elemBits: 128, bits: 256, lanes: 16}
81 - {class: vreg, go: Int32x8, base: "int", elemBits: 128, bits: 256, lanes: 8}
82 - {class: vreg, go: Uint32x8, base: "uint", elemBits: 128, bits: 256, lanes: 8}
83 - {class: vreg, go: Int64x4, base: "int", elemBits: 128, bits: 256, lanes: 4}
84 - {class: vreg, go: Uint64x4, base: "uint", elemBits: 128, bits: 256, lanes: 4}
85
86 # Special shapes just to make VAES(ENC|DEC)(LAST)?512 work.
87 # The elemBits field of these shapes are wrong, it would be overwritten by overwriteElemBits.
88 - {class: vreg, go: Int8x32, base: "int", elemBits: 128, bits: 512, lanes: 32}
89 - {class: vreg, go: Uint8x32, base: "uint", elemBits: 128, bits: 512, lanes: 32}
90 - {class: vreg, go: Int16x16, base: "int", elemBits: 128, bits: 512, lanes: 16}
91 - {class: vreg, go: Uint16x16, base: "uint", elemBits: 128, bits: 512, lanes: 16}
92 - {class: vreg, go: Int32x8, base: "int", elemBits: 128, bits: 512, lanes: 8}
93 - {class: vreg, go: Uint32x8, base: "uint", elemBits: 128, bits: 512, lanes: 8}
94 - {class: vreg, go: Int64x4, base: "int", elemBits: 128, bits: 512, lanes: 4}
95 - {class: vreg, go: Uint64x4, base: "uint", elemBits: 128, bits: 512, lanes: 4}
96
97 - {class: immediate, go: Immediate} # TODO: we only support imms that are not used as value -- usually as instruction semantic predicate like VPCMP as of now.
98 inVariant: !repeat
99 - *types
100 out: !repeat
101 - *types
102
View as plain text