|
5 | 5 | ; 1. from packed Int4 to ... : |
6 | 6 | ; a. packed in 32-bit |
7 | 7 | ; b. packed in 8-bit |
| 8 | +; c. packed in 16-bit |
| 9 | +; d. packed in 64-bit |
| 10 | +; e. packed in vector of 8-bit integers |
8 | 11 | ; 2. to packed Int4 from ... : |
9 | 12 | ; a. packed in 32-bit |
10 | 13 | ; b. packed in 8-bit |
| 14 | +; c. packed in 16-bit |
| 15 | +; d. packed in 64-bit |
| 16 | +; e. packed in vector of 8-bit integers |
11 | 17 |
|
12 | 18 | ; RUN: llvm-as %s -o %t.bc |
13 | 19 | ; RUN: llvm-spirv %t.bc -o %t.spv --spirv-ext=+SPV_EXT_float8,+SPV_INTEL_int4,+SPV_KHR_bfloat16 |
|
28 | 34 | ; CHECK-SPIRV-DAG: Name [[#int4_e4m3_8:]] "int4_e4m3_8" |
29 | 35 | ; CHECK-SPIRV-DAG: Name [[#hf16_int4_32:]] "hf16_int4_32" |
30 | 36 | ; CHECK-SPIRV-DAG: Name [[#hf16_int4_8:]] "hf16_int4_8" |
| 37 | +; CHECK-SPIRV-DAG: Name [[#int4_e4m3_16:]] "int4_e4m3_16" |
| 38 | +; CHECK-SPIRV-DAG: Name [[#int4_e4m3_64:]] "int4_e4m3_64" |
| 39 | +; CHECK-SPIRV-DAG: Name [[#int4_e4m3_vec2xi8:]] "int4_e4m3_vec2xi8" |
| 40 | +; CHECK-SPIRV-DAG: Name [[#hf16_int4_16:]] "hf16_int4_16" |
| 41 | +; CHECK-SPIRV-DAG: Name [[#hf16_int4_64:]] "hf16_int4_64" |
| 42 | +; CHECK-SPIRV-DAG: Name [[#hf16_int4_vec2xi8:]] "hf16_int4_vec2xi8" |
31 | 43 |
|
32 | 44 | ; CHECK-SPIRV-DAG: TypeInt [[#Int32Ty:]] 32 0 |
33 | 45 | ; CHECK-SPIRV-DAG: Constant [[#Int32Ty]] [[#Int32Const:]] 1 |
34 | 46 |
|
35 | 47 | ; CHECK-SPIRV-DAG: TypeInt [[#Int8Ty:]] 8 0 |
| 48 | +; CHECK-SPIRV-DAG: TypeInt [[#Int16Ty:]] 16 0 |
| 49 | +; CHECK-SPIRV-DAG: TypeInt [[#Int64Ty:]] 64 0 |
36 | 50 | ; CHECK-SPIRV-DAG: TypeVector [[#Int8Vec8Ty:]] [[#Int8Ty]] 8 |
37 | 51 | ; CHECK-SPIRV-DAG: TypeVector [[#Int8Vec2Ty:]] [[#Int8Ty]] 2 |
| 52 | +; CHECK-SPIRV-DAG: TypeVector [[#Int8Vec4Ty:]] [[#Int8Ty]] 4 |
| 53 | +; CHECK-SPIRV-DAG: TypeVector [[#Int8Vec16Ty:]] [[#Int8Ty]] 16 |
38 | 54 | ; CHECK-SPIRV-DAG: Constant [[#Int8Ty]] [[#Int8Const:]] 1 |
| 55 | +; CHECK-SPIRV-DAG: Constant [[#Int16Ty]] [[#Int16Const:]] 1 |
| 56 | +; CHECK-SPIRV-DAG: Constant [[#Int64Ty]] [[#Int64Const:]] 1 |
| 57 | +; CHECK-SPIRV-DAG: ConstantComposite [[#Int8Vec2Ty]] [[#Int8Vec2Const:]] [[#Int8Const]] [[#Int8Const]] |
39 | 58 |
|
40 | 59 | ; CHECK-SPIRV-DAG: TypeInt [[#Int4Ty:]] 4 0 |
41 | 60 | ; CHECK-SPIRV-DAG: TypeVector [[#Int4Vec8Ty:]] [[#Int4Ty]] 8 |
42 | 61 | ; CHECK-SPIRV-DAG: TypeVector [[#Int4Vec2Ty:]] [[#Int4Ty]] 2 |
| 62 | +; CHECK-SPIRV-DAG: TypeVector [[#Int4Vec4Ty:]] [[#Int4Ty]] 4 |
| 63 | +; CHECK-SPIRV-DAG: TypeVector [[#Int4Vec16Ty:]] [[#Int4Ty]] 16 |
43 | 64 |
|
44 | 65 | ; CHECK-SPIRV-DAG: TypeFloat [[#Float8E4M3Ty:]] 8 4214 |
45 | 66 | ; CHECK-SPIRV-DAG: TypeVector [[#Float8E4M3Vec8Ty:]] [[#Float8E4M3Ty]] 8 |
46 | 67 | ; CHECK-SPIRV-DAG: TypeVector [[#Float8E4M3Vec2Ty:]] [[#Float8E4M3Ty]] 2 |
| 68 | +; CHECK-SPIRV-DAG: TypeVector [[#Float8E4M3Vec4Ty:]] [[#Float8E4M3Ty]] 4 |
| 69 | +; CHECK-SPIRV-DAG: TypeVector [[#Float8E4M3Vec16Ty:]] [[#Float8E4M3Ty]] 16 |
47 | 70 |
|
48 | 71 | ; CHECK-SPIRV-DAG: TypeFloat [[#HFloat16Ty:]] 16 {{$}} |
49 | 72 | ; CHECK-SPIRV-DAG: TypeVector [[#HFloat16Vec8Ty:]] [[#HFloat16Ty]] 8 |
50 | 73 | ; CHECK-SPIRV-DAG: TypeVector [[#HFloat16Vec2Ty:]] [[#HFloat16Ty]] 2 |
| 74 | +; CHECK-SPIRV-DAG: TypeVector [[#HFloat16Vec4Ty:]] [[#HFloat16Ty]] 4 |
| 75 | +; CHECK-SPIRV-DAG: TypeVector [[#HFloat16Vec16Ty:]] [[#HFloat16Ty]] 16 |
51 | 76 | ; CHECK-SPIRV-DAG: Constant [[#HFloat16Ty]] [[#HFloat16Const:]] 15360 |
52 | 77 | ; CHECK-SPIRV-DAG: ConstantComposite [[#HFloat16Vec8Ty]] [[#HFloat16Vec8Const:]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] |
53 | 78 | ; CHECK-SPIRV-DAG: ConstantComposite [[#HFloat16Vec2Ty]] [[#HFloat16Vec2Const:]] [[#HFloat16Const]] [[#HFloat16Const]] |
| 79 | +; CHECK-SPIRV-DAG: ConstantComposite [[#HFloat16Vec4Ty]] [[#HFloat16Vec4Const:]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] |
| 80 | +; CHECK-SPIRV-DAG: ConstantComposite [[#HFloat16Vec16Ty]] [[#HFloat16Vec16Const:]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] [[#HFloat16Const]] |
54 | 81 |
|
55 | 82 | target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024" |
56 | 83 | target triple = "spir-unknown-unknown" |
@@ -136,3 +163,126 @@ entry: |
136 | 163 | } |
137 | 164 |
|
138 | 165 | declare dso_local spir_func i8 @_Z38__builtin_spirv_ConvertFP16ToInt4INTELc(<2 x half>) |
| 166 | + |
| 167 | +; Packed in 16-bit integer |
| 168 | + |
| 169 | +; CHECK-SPIRV: Function [[#]] [[#int4_e4m3_16]] [[#]] |
| 170 | +; CHECK-SPIRV: Bitcast [[#Int4Vec4Ty]] [[#Cast1:]] [[#Int16Const]] |
| 171 | +; CHECK-SPIRV: ConvertSToF [[#Float8E4M3Vec4Ty]] [[#Conv:]] [[#Cast1]] |
| 172 | +; CHECK-SPIRV: Bitcast [[#Int8Vec4Ty]] [[#Cast2:]] [[#Conv]] |
| 173 | +; CHECK-SPIRV: ReturnValue [[#Cast2]] |
| 174 | + |
| 175 | +; CHECK-LLVM-LABEL: int4_e4m3_16 |
| 176 | +; CHECK-LLVM: %[[#Cast:]] = bitcast i16 1 to <4 x i4> |
| 177 | +; CHECK-LLVM: %[[#Call:]] = call <4 x i8> @_Z38__builtin_spirv_ConvertInt4ToE4M3INTELDv4_i(<4 x i4> %[[#Cast]]) |
| 178 | +; CHECK-LLVM: ret <4 x i8> %[[#Call]] |
| 179 | + |
| 180 | +define spir_func <4 x i8> @int4_e4m3_16() { |
| 181 | +entry: |
| 182 | + %0 = call spir_func <4 x i8> @_Z38__builtin_spirv_ConvertInt4ToE4M3INTELs(i16 1) |
| 183 | + ret <4 x i8> %0 |
| 184 | +} |
| 185 | + |
| 186 | +declare dso_local spir_func <4 x i8> @_Z38__builtin_spirv_ConvertInt4ToE4M3INTELs(i16) |
| 187 | + |
| 188 | +; Packed in 64-bit integer |
| 189 | + |
| 190 | +; CHECK-SPIRV: Function [[#]] [[#int4_e4m3_64]] [[#]] |
| 191 | +; CHECK-SPIRV: Bitcast [[#Int4Vec16Ty]] [[#Cast1:]] [[#Int64Const]] |
| 192 | +; CHECK-SPIRV: ConvertSToF [[#Float8E4M3Vec16Ty]] [[#Conv:]] [[#Cast1]] |
| 193 | +; CHECK-SPIRV: Bitcast [[#Int8Vec16Ty]] [[#Cast2:]] [[#Conv]] |
| 194 | +; CHECK-SPIRV: ReturnValue [[#Cast2]] |
| 195 | + |
| 196 | +; CHECK-LLVM-LABEL: int4_e4m3_64 |
| 197 | +; CHECK-LLVM: %[[#Cast:]] = bitcast i64 1 to <16 x i4> |
| 198 | +; CHECK-LLVM: %[[#Call:]] = call <16 x i8> @_Z38__builtin_spirv_ConvertInt4ToE4M3INTELDv16_i(<16 x i4> %[[#Cast]]) |
| 199 | +; CHECK-LLVM: ret <16 x i8> %[[#Call]] |
| 200 | + |
| 201 | +define spir_func <16 x i8> @int4_e4m3_64() { |
| 202 | +entry: |
| 203 | + %0 = call spir_func <16 x i8> @_Z38__builtin_spirv_ConvertInt4ToE4M3INTELl(i64 1) |
| 204 | + ret <16 x i8> %0 |
| 205 | +} |
| 206 | + |
| 207 | +declare dso_local spir_func <16 x i8> @_Z38__builtin_spirv_ConvertInt4ToE4M3INTELl(i64) |
| 208 | + |
| 209 | +; Packed in vector of 8-bit integers |
| 210 | + |
| 211 | +; CHECK-SPIRV: Function [[#]] [[#int4_e4m3_vec2xi8]] [[#]] |
| 212 | +; CHECK-SPIRV: Bitcast [[#Int4Vec4Ty]] [[#Cast1:]] [[#Int8Vec2Const]] |
| 213 | +; CHECK-SPIRV: ConvertSToF [[#Float8E4M3Vec4Ty]] [[#Conv:]] [[#Cast1]] |
| 214 | +; CHECK-SPIRV: Bitcast [[#Int8Vec4Ty]] [[#Cast2:]] [[#Conv]] |
| 215 | +; CHECK-SPIRV: ReturnValue [[#Cast2]] |
| 216 | + |
| 217 | +; CHECK-LLVM-LABEL: int4_e4m3_vec2xi8 |
| 218 | +; CHECK-LLVM: %[[#Cast:]] = bitcast <2 x i8> <i8 1, i8 1> to <4 x i4> |
| 219 | +; CHECK-LLVM: %[[#Call:]] = call <4 x i8> @_Z38__builtin_spirv_ConvertInt4ToE4M3INTELDv4_i(<4 x i4> %[[#Cast]]) |
| 220 | +; CHECK-LLVM: ret <4 x i8> %[[#Call]] |
| 221 | + |
| 222 | +define spir_func <4 x i8> @int4_e4m3_vec2xi8() { |
| 223 | +entry: |
| 224 | + %0 = call spir_func <4 x i8> @_Z38__builtin_spirv_ConvertInt4ToE4M3INTELDv4_i(<2 x i8> <i8 1, i8 1>) |
| 225 | + ret <4 x i8> %0 |
| 226 | +} |
| 227 | + |
| 228 | +declare dso_local spir_func <4 x i8> @_Z38__builtin_spirv_ConvertInt4ToE4M3INTELDv4_i(<2 x i8>) |
| 229 | + |
| 230 | +; To packed in 16-bit integer |
| 231 | + |
| 232 | +; CHECK-SPIRV: Function [[#]] [[#hf16_int4_16]] [[#]] |
| 233 | +; CHECK-SPIRV: ConvertFToS [[#Int4Vec4Ty]] [[#Conv:]] [[#HFloat16Vec4Const]] |
| 234 | +; CHECK-SPIRV: Bitcast [[#Int16Ty]] [[#Cast2:]] [[#Conv]] |
| 235 | +; CHECK-SPIRV: ReturnValue [[#Cast2]] |
| 236 | + |
| 237 | +; CHECK-LLVM-LABEL: hf16_int4_16 |
| 238 | +; CHECK-LLVM: %[[#Call:]] = call <4 x i4> @_Z38__builtin_spirv_ConvertFP16ToInt4INTELDv4_Dh(<4 x half> <half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00>) |
| 239 | +; CHECK-LLVM: %[[#Cast:]] = bitcast <4 x i4> %[[#Call]] to i16 |
| 240 | +; CHECK-LLVM: ret i16 %[[#Cast]] |
| 241 | + |
| 242 | +define spir_func i16 @hf16_int4_16() { |
| 243 | +entry: |
| 244 | + %0 = call i16 @_Z38__builtin_spirv_ConvertFP16ToInt4INTELDv4_Dh(<4 x half> <half 1.0, half 1.0, half 1.0, half 1.0>) |
| 245 | + ret i16 %0 |
| 246 | +} |
| 247 | + |
| 248 | +declare dso_local spir_func i16 @_Z38__builtin_spirv_ConvertFP16ToInt4INTELDv4_Dh(<4 x half>) |
| 249 | + |
| 250 | +; To packed in 64-bit integer |
| 251 | + |
| 252 | +; CHECK-SPIRV: Function [[#]] [[#hf16_int4_64]] [[#]] |
| 253 | +; CHECK-SPIRV: ConvertFToS [[#Int4Vec16Ty]] [[#Conv:]] [[#HFloat16Vec16Const]] |
| 254 | +; CHECK-SPIRV: Bitcast [[#Int64Ty]] [[#Cast2:]] [[#Conv]] |
| 255 | +; CHECK-SPIRV: ReturnValue [[#Cast2]] |
| 256 | + |
| 257 | +; CHECK-LLVM-LABEL: hf16_int4_64 |
| 258 | +; CHECK-LLVM: %[[#Call:]] = call <16 x i4> @_Z38__builtin_spirv_ConvertFP16ToInt4INTELDv16_Dh(<16 x half> <half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00>) |
| 259 | +; CHECK-LLVM: %[[#Cast:]] = bitcast <16 x i4> %[[#Call]] to i64 |
| 260 | +; CHECK-LLVM: ret i64 %[[#Cast]] |
| 261 | + |
| 262 | +define spir_func i64 @hf16_int4_64() { |
| 263 | +entry: |
| 264 | + %0 = call i64 @_Z38__builtin_spirv_ConvertFP16ToInt4INTELDv16_Dh(<16 x half> <half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0>) |
| 265 | + ret i64 %0 |
| 266 | +} |
| 267 | + |
| 268 | +declare dso_local spir_func i64 @_Z38__builtin_spirv_ConvertFP16ToInt4INTELDv16_Dh(<16 x half>) |
| 269 | + |
| 270 | +; To packed in vector of 8-bit integers |
| 271 | + |
| 272 | +; CHECK-SPIRV: Function [[#]] [[#hf16_int4_vec2xi8]] [[#]] |
| 273 | +; CHECK-SPIRV: ConvertFToS [[#Int4Vec4Ty]] [[#Conv:]] [[#HFloat16Vec4Const]] |
| 274 | +; CHECK-SPIRV: Bitcast [[#Int8Vec2Ty]] [[#Cast:]] [[#Conv]] |
| 275 | +; CHECK-SPIRV: ReturnValue [[#Cast]] |
| 276 | + |
| 277 | +; CHECK-LLVM-LABEL: hf16_int4_vec2xi8 |
| 278 | +; CHECK-LLVM: %[[#Call:]] = call <4 x i4> @_Z38__builtin_spirv_ConvertFP16ToInt4INTELDv4_Dh(<4 x half> <half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00>) |
| 279 | +; CHECK-LLVM: %[[#Cast:]] = bitcast <4 x i4> %[[#Call]] to <2 x i8> |
| 280 | +; CHECK-LLVM: ret <2 x i8> %[[#Cast]] |
| 281 | + |
| 282 | +define spir_func <2 x i8> @hf16_int4_vec2xi8() { |
| 283 | +entry: |
| 284 | + %0 = call <2 x i8> @_Z38__builtin_spirv_ConvertFP16ToInt4INTELKDv4_Dh(<4 x half> <half 1.0, half 1.0, half 1.0, half 1.0>) |
| 285 | + ret <2 x i8> %0 |
| 286 | +} |
| 287 | + |
| 288 | +declare dso_local spir_func <2 x i8> @_Z38__builtin_spirv_ConvertFP16ToInt4INTELKDv4_Dh(<4 x half>) |
0 commit comments