@@ -22,3 +22,181 @@ llvm.func @fdiv_fp16(%arg0 : f16, %arg1 : f16) -> f16 {
22
22
// CHECK: llvm.return %[[result]] : f16
23
23
llvm.return %result : f16
24
24
}
25
+
26
+ // CHECK-LABEL: llvm.func @ui16_to_f32
27
+ llvm.func @ui16_to_f32 (%arg0 : i16 ) -> f32 {
28
+ // CHECK-DAG: %[[zext:.*]] = llvm.zext %arg0 : i16 to i32
29
+ // CHECK-DAG: %[[bias:.*]] = llvm.mlir.constant(1262485504 : i32) : i32
30
+ // CHECK-DAG: %[[add:.*]] = llvm.add %[[zext]], %[[bias]] : i32
31
+ // CHECK-DAG: %[[cast:.*]] = llvm.bitcast %[[add]] : i32 to f32
32
+ // CHECK-DAG: %[[bias:.*]] = llvm.mlir.constant(0x4B400000 : f32) : f32
33
+ // CHECK-DAG: %[[result:.*]] = llvm.fsub %[[cast]], %[[bias]] : f32
34
+ %result = llvm.uitofp %arg0 : i16 to f32
35
+ // CHECK: llvm.return %[[result]] : f32
36
+ llvm.return %result : f32
37
+ }
38
+
39
+ // Checks that expansion only applies to integer width up to mantissa width.
40
+ // CHECK-LABEL: llvm.func @si32_to_float
41
+ llvm.func @si32_to_float_no_rewrite (%arg0 : i32 ) -> f32 {
42
+ // CHECK: %[[result:.*]] = llvm.sitofp %arg0 : i32 to f32
43
+ %result = llvm.sitofp %arg0 : i32 to f32
44
+ // CHECK: llvm.return %[[result]] : f32
45
+ llvm.return %result : f32
46
+ }
47
+
48
+ // CHECK-LABEL: llvm.func @si8_to_f16
49
+ llvm.func @si8_to_f16 (%arg0 : i8 ) -> f16 {
50
+ // CHECK-DAG: %[[sext:.*]] = llvm.sext %arg0 : i8 to i16
51
+ // CHECK-DAG: %[[bias:.*]] = llvm.mlir.constant(26112 : i16) : i16
52
+ // CHECK-DAG: %[[add:.*]] = llvm.add %[[sext]], %[[bias]] : i16
53
+ // CHECK-DAG: %[[cast:.*]] = llvm.bitcast %[[add]] : i16 to f16
54
+ // CHECK-DAG: %[[bias:.*]] = llvm.mlir.constant(1.536000e+03 : f16) : f16
55
+ // CHECK-DAG: %[[result:.*]] = llvm.fsub %[[cast]], %[[bias]] : f16
56
+ %result = llvm.sitofp %arg0 : i8 to f16
57
+ // CHECK: llvm.return %[[result]] : f16
58
+ llvm.return %result : f16
59
+ }
60
+
61
+ // CHECK-LABEL: llvm.func @vec_ui4_to_bf16
62
+ llvm.func @vec_ui4_to_bf16 (%arg0 : vector <4 xi4 >) -> vector <4 xbf16 > {
63
+ // CHECK-DAG: %[[zext:.*]] = llvm.zext %arg0 : vector<4xi4> to vector<4xi16>
64
+ // CHECK-DAG: %[[bias:.*]] = llvm.mlir.constant(dense<17216> : vector<4xi16>) : vector<4xi16>
65
+ // CHECK-DAG: %[[add:.*]] = llvm.add %[[zext]], %[[bias]] : vector<4xi16>
66
+ // CHECK-DAG: %[[cast:.*]] = llvm.bitcast %[[add]] : vector<4xi16> to vector<4xbf16>
67
+ // CHECK-DAG: %[[bias:.*]] = llvm.mlir.constant(dense<1.920000e+02> : vector<4xbf16>) : vector<4xbf16>
68
+ // CHECK-DAG: %[[result:.*]] = llvm.fsub %[[cast]], %[[bias]] : vector<4xbf16>
69
+ %result = llvm.uitofp %arg0 : vector <4 xi4 > to vector <4 xbf16 >
70
+ // CHECK: llvm.return %[[result]] : vector<4xbf16>
71
+ llvm.return %result : vector <4 xbf16 >
72
+ }
73
+
74
+ // Checks code path when integer width is equal to mantissa width.
75
+ // CHECK-LABEL: llvm.func @vec_si8_to_bf16
76
+ llvm.func @vec_si8_to_bf16 (%arg0 : vector <4 xi8 >) -> vector <4 xbf16 > {
77
+ // CHECK-DAG: %[[zext:.*]] = llvm.zext %arg0 : vector<4xi8> to vector<4xi16>
78
+ // CHECK-DAG: %[[const:.*]] = llvm.mlir.constant(dense<17152> : vector<4xi16>) : vector<4xi16>
79
+ // CHECK-DAG: %[[or:.*]] = llvm.or %[[zext]], %[[const]] : vector<4xi16>
80
+ // CHECK-DAG: %[[exp_mask:.*]] = llvm.mlir.constant(dense<-128> : vector<4xi16>) : vector<4xi16>
81
+ // CHECK-DAG: %[[man_mask:.*]] = llvm.mlir.constant(dense<-129> : vector<4xi16>) : vector<4xi16>
82
+ // CHECK-DAG: %[[exp_and:.*]] = llvm.and %[[or]], %[[exp_mask]] : vector<4xi16>
83
+ // CHECK-DAG: %[[man_and:.*]] = llvm.and %[[or]], %[[man_mask]] : vector<4xi16>
84
+ // CHECK-DAG: %[[exp_cast:.*]] = llvm.bitcast %[[exp_and]] : vector<4xi16> to vector<4xbf16>
85
+ // CHECK-DAG: %[[man_cast:.*]] = llvm.bitcast %[[man_and]] : vector<4xi16> to vector<4xbf16>
86
+ // CHECK-DAG: %[[result:.*]] = llvm.fsub %[[man_cast]], %[[exp_cast]] : vector<4xbf16>
87
+ %result = llvm.sitofp %arg0 : vector <4 xi8 > to vector <4 xbf16 >
88
+ // CHECK: llvm.return %[[result]] : vector<4xbf16>
89
+ llvm.return %result : vector <4 xbf16 >
90
+ }
91
+
92
+ // Checks code path when integer width is equal to mantissa width.
93
+ // CHECK-LABEL: llvm.func @ui8_to_bf16
94
+ llvm.func @ui8_to_bf16 (%arg0 : i8 ) -> bf16 {
95
+ // CHECK-DAG: %[[zext:.*]] = llvm.zext %arg0 : i8 to i16
96
+ // CHECK-DAG: %[[const:.*]] = llvm.mlir.constant(17152 : i16) : i16
97
+ // CHECK-DAG: %[[or:.*]] = llvm.or %[[zext]], %[[const]] : i16
98
+ // CHECK-DAG: %[[exp_mask:.*]] = llvm.mlir.constant(-128 : i16) : i16
99
+ // CHECK-DAG: %[[man_mask:.*]] = llvm.mlir.constant(-129 : i16) : i16
100
+ // CHECK-DAG: %[[exp_and:.*]] = llvm.and %[[or]], %[[exp_mask]] : i16
101
+ // CHECK-DAG: %[[man_and:.*]] = llvm.and %[[or]], %[[man_mask]] : i16
102
+ // CHECK-DAG: %[[exp_cast:.*]] = llvm.bitcast %[[exp_and]] : i16 to bf16
103
+ // CHECK-DAG: %[[man_cast:.*]] = llvm.bitcast %[[man_and]] : i16 to bf16
104
+ // CHECK-DAG: %[[result:.*]] = llvm.fadd %[[man_cast]], %[[exp_cast]] : bf16
105
+ %result = llvm.uitofp %arg0 : i8 to bf16
106
+ // CHECK: llvm.return %[[result]] : bf16
107
+ llvm.return %result : bf16
108
+ }
109
+
110
+ // Checks that expansion does not apply when exponent bias lsb is set.
111
+ // CHECK-LABEL: llvm.func @ui11_to_f16
112
+ llvm.func @ui11_to_f16 (%arg0 : i11 ) -> f16 {
113
+ // CHECK: %[[result:.*]] = llvm.uitofp %arg0 : i11 to f16
114
+ %result = llvm.uitofp %arg0 : i11 to f16
115
+ // CHECK: llvm.return %[[result]] : f16
116
+ llvm.return %result : f16
117
+ }
118
+
119
+ // CHECK-LABEL: llvm.func @ui16_to_f32
120
+ llvm.func @ui16_to_f32 (%arg0 : i16 ) -> f32 {
121
+ // CHECK-DAG: %[[zext:.*]] = llvm.zext %arg0 : i16 to i32
122
+ // CHECK-DAG: %[[bias:.*]] = llvm.mlir.constant(1262485504 : i32) : i32
123
+ // CHECK-DAG: %[[add:.*]] = llvm.add %[[zext]], %[[bias]] : i32
124
+ // CHECK-DAG: %[[cast:.*]] = llvm.bitcast %[[add]] : i32 to f32
125
+ // CHECK-DAG: %[[bias:.*]] = llvm.mlir.constant(0x4B400000 : f32) : f32
126
+ // CHECK-DAG: %[[result:.*]] = llvm.fsub %[[cast]], %[[bias]] : f32
127
+ %result = llvm.uitofp %arg0 : i16 to f32
128
+ // CHECK: llvm.return %[[result]] : f32
129
+ llvm.return %result : f32
130
+ }
131
+
132
+ // Checks that expansion only applies to integer width up to mantissa width.
133
+ // CHECK-LABEL: llvm.func @si32_to_float
134
+ llvm.func @si32_to_float_no_rewrite (%arg0 : i32 ) -> f32 {
135
+ // CHECK: %[[result:.*]] = llvm.sitofp %arg0 : i32 to f32
136
+ %result = llvm.sitofp %arg0 : i32 to f32
137
+ // CHECK: llvm.return %[[result]] : f32
138
+ llvm.return %result : f32
139
+ }
140
+
141
+ // CHECK-LABEL: llvm.func @si8_to_f16
142
+ llvm.func @si8_to_f16 (%arg0 : i8 ) -> f16 {
143
+ // CHECK-DAG: %[[sext:.*]] = llvm.sext %arg0 : i8 to i16
144
+ // CHECK-DAG: %[[bias:.*]] = llvm.mlir.constant(26112 : i16) : i16
145
+ // CHECK-DAG: %[[add:.*]] = llvm.add %[[sext]], %[[bias]] : i16
146
+ // CHECK-DAG: %[[cast:.*]] = llvm.bitcast %[[add]] : i16 to f16
147
+ // CHECK-DAG: %[[bias:.*]] = llvm.mlir.constant(1.536000e+03 : f16) : f16
148
+ // CHECK-DAG: %[[result:.*]] = llvm.fsub %[[cast]], %[[bias]] : f16
149
+ %result = llvm.sitofp %arg0 : i8 to f16
150
+ // CHECK: llvm.return %[[result]] : f16
151
+ llvm.return %result : f16
152
+ }
153
+
154
+ // CHECK-LABEL: llvm.func @vec_ui4_to_bf16
155
+ llvm.func @vec_ui4_to_bf16 (%arg0 : vector <4 xi4 >) -> vector <4 xbf16 > {
156
+ // CHECK-DAG: %[[zext:.*]] = llvm.zext %arg0 : vector<4xi4> to vector<4xi16>
157
+ // CHECK-DAG: %[[bias:.*]] = llvm.mlir.constant(dense<17216> : vector<4xi16>) : vector<4xi16>
158
+ // CHECK-DAG: %[[add:.*]] = llvm.add %[[zext]], %[[bias]] : vector<4xi16>
159
+ // CHECK-DAG: %[[cast:.*]] = llvm.bitcast %[[add]] : vector<4xi16> to vector<4xbf16>
160
+ // CHECK-DAG: %[[bias:.*]] = llvm.mlir.constant(dense<1.920000e+02> : vector<4xbf16>) : vector<4xbf16>
161
+ // CHECK-DAG: %[[result:.*]] = llvm.fsub %[[cast]], %[[bias]] : vector<4xbf16>
162
+ %result = llvm.uitofp %arg0 : vector <4 xi4 > to vector <4 xbf16 >
163
+ // CHECK: llvm.return %[[result]] : vector<4xbf16>
164
+ llvm.return %result : vector <4 xbf16 >
165
+ }
166
+
167
+ // Checks code path when integer width is equal to mantissa width.
168
+ // CHECK-LABEL: llvm.func @vec_si8_to_bf16
169
+ llvm.func @vec_si8_to_bf16 (%arg0 : vector <4 xi8 >) -> vector <4 xbf16 > {
170
+ // CHECK-DAG: %[[zext:.*]] = llvm.zext %arg0 : vector<4xi8> to vector<4xi16>
171
+ // CHECK-DAG: %[[const:.*]] = llvm.mlir.constant(dense<17152> : vector<4xi16>) : vector<4xi16>
172
+ // CHECK-DAG: %[[or:.*]] = llvm.or %[[zext]], %[[const]] : vector<4xi16>
173
+ // CHECK-DAG: %[[exp_mask:.*]] = llvm.mlir.constant(dense<-128> : vector<4xi16>) : vector<4xi16>
174
+ // CHECK-DAG: %[[man_mask:.*]] = llvm.mlir.constant(dense<-129> : vector<4xi16>) : vector<4xi16>
175
+ // CHECK-DAG: %[[exp_and:.*]] = llvm.and %[[or]], %[[exp_mask]] : vector<4xi16>
176
+ // CHECK-DAG: %[[man_and:.*]] = llvm.and %[[or]], %[[man_mask]] : vector<4xi16>
177
+ // CHECK-DAG: %[[exp_cast:.*]] = llvm.bitcast %[[exp_and]] : vector<4xi16> to vector<4xbf16>
178
+ // CHECK-DAG: %[[man_cast:.*]] = llvm.bitcast %[[man_and]] : vector<4xi16> to vector<4xbf16>
179
+ // CHECK-DAG: %[[result:.*]] = llvm.fsub %[[man_cast]], %[[exp_cast]] : vector<4xbf16>
180
+ %result = llvm.sitofp %arg0 : vector <4 xi8 > to vector <4 xbf16 >
181
+ // CHECK: llvm.return %[[result]] : vector<4xbf16>
182
+ llvm.return %result : vector <4 xbf16 >
183
+ }
184
+
185
+ // Checks that expansion does not apply when unsigned integer width is equal to
186
+ // mantissa width.
187
+ // CHECK-LABEL: llvm.func @ui8_to_bf16
188
+ llvm.func @ui8_to_bf16 (%arg0 : i8 ) -> bf16 {
189
+ // CHECK: %[[result:.*]] = llvm.uitofp %arg0 : i8 to bf16
190
+ %result = llvm.uitofp %arg0 : i8 to bf16
191
+ // CHECK: llvm.return %[[result]] : bf16
192
+ llvm.return %result : bf16
193
+ }
194
+
195
+ // Checks that expansion does not apply when exponent bias lsb is set.
196
+ // CHECK-LABEL: llvm.func @ui11_to_f16
197
+ llvm.func @ui11_to_f16 (%arg0 : i11 ) -> f16 {
198
+ // CHECK: %[[result:.*]] = llvm.uitofp %arg0 : i11 to f16
199
+ %result = llvm.uitofp %arg0 : i11 to f16
200
+ // CHECK: llvm.return %[[result]] : f16
201
+ llvm.return %result : f16
202
+ }
0 commit comments