|
17 | 17 | ; CHECK-EXP-DAG: %[[#twentyfour:]] = OpConstant %[[#int_8]] 24 |
18 | 18 |
|
19 | 19 | ; CHECK-LABEL: Begin function test_dot |
20 | | -define noundef i32 @test_dot(i32 noundef %a, i32 noundef %b, i32 noundef %c) { |
| 20 | +define noundef i32 @test_dot(i32 noundef %acc, i32 noundef %x, i32 noundef %y) { |
21 | 21 | entry: |
22 | | -; CHECK: %[[#A:]] = OpFunctionParameter %[[#int_32]] |
23 | | -; CHECK: %[[#B:]] = OpFunctionParameter %[[#int_32]] |
24 | | -; CHECK: %[[#C:]] = OpFunctionParameter %[[#int_32]] |
| 22 | +; CHECK: %[[#ACC:]] = OpFunctionParameter %[[#int_32]] |
| 23 | +; CHECK: %[[#X:]] = OpFunctionParameter %[[#int_32]] |
| 24 | +; CHECK: %[[#Y:]] = OpFunctionParameter %[[#int_32]] |
25 | 25 |
|
26 | 26 | ; Test that we use the dot product op when capabilities allow |
27 | 27 |
|
28 | | -; CHECK-DOT: %[[#DOT:]] = OpSDot %[[#int_32]] %[[#A]] %[[#B]] |
29 | | -; CHECK-DOT: %[[#RES:]] = OpIAdd %[[#int_32]] %[[#DOT]] %[[#C]] |
| 28 | +; CHECK-DOT: %[[#DOT:]] = OpSDot %[[#int_32]] %[[#X]] %[[#Y]] |
| 29 | +; CHECK-DOT: %[[#RES:]] = OpIAdd %[[#int_32]] %[[#DOT]] %[[#ACC]] |
30 | 30 |
|
31 | 31 | ; Test expansion is used when spirv dot product capabilities aren't available: |
32 | 32 |
|
33 | 33 | ; First element of the packed vector |
34 | | -; CHECK-EXP: %[[#A0:]] = OpBitFieldSExtract %[[#int_32]] %[[#A]] %[[#zero]] %[[#eight]] |
35 | | -; CHECK-EXP: %[[#B0:]] = OpBitFieldSExtract %[[#int_32]] %[[#B]] %[[#zero]] %[[#eight]] |
36 | | -; CHECK-EXP: %[[#MUL0:]] = OpIMul %[[#int_32]] %[[#A0]] %[[#B0]] |
| 34 | +; CHECK-EXP: %[[#X0:]] = OpBitFieldSExtract %[[#int_32]] %[[#X]] %[[#zero]] %[[#eight]] |
| 35 | +; CHECK-EXP: %[[#Y0:]] = OpBitFieldSExtract %[[#int_32]] %[[#Y]] %[[#zero]] %[[#eight]] |
| 36 | +; CHECK-EXP: %[[#MUL0:]] = OpIMul %[[#int_32]] %[[#X0]] %[[#Y0]] |
37 | 37 | ; CHECK-EXP: %[[#MASK0:]] = OpBitFieldSExtract %[[#int_32]] %[[#MUL0]] %[[#zero]] %[[#eight]] |
38 | | -; CHECK-EXP: %[[#ACC0:]] = OpIAdd %[[#int_32]] %[[#C]] %[[#MASK0]] |
| 38 | +; CHECK-EXP: %[[#ACC0:]] = OpIAdd %[[#int_32]] %[[#ACC]] %[[#MASK0]] |
39 | 39 |
|
40 | 40 | ; Second element of the packed vector |
41 | | -; CHECK-EXP: %[[#A1:]] = OpBitFieldSExtract %[[#int_32]] %[[#A]] %[[#eight]] %[[#eight]] |
42 | | -; CHECK-EXP: %[[#B1:]] = OpBitFieldSExtract %[[#int_32]] %[[#B]] %[[#eight]] %[[#eight]] |
43 | | -; CHECK-EXP: %[[#MUL1:]] = OpIMul %[[#int_32]] %[[#A1]] %[[#B1]] |
| 41 | +; CHECK-EXP: %[[#X1:]] = OpBitFieldSExtract %[[#int_32]] %[[#X]] %[[#eight]] %[[#eight]] |
| 42 | +; CHECK-EXP: %[[#Y1:]] = OpBitFieldSExtract %[[#int_32]] %[[#Y]] %[[#eight]] %[[#eight]] |
| 43 | +; CHECK-EXP: %[[#MUL1:]] = OpIMul %[[#int_32]] %[[#X1]] %[[#Y1]] |
44 | 44 | ; CHECK-EXP: %[[#MASK1:]] = OpBitFieldSExtract %[[#int_32]] %[[#MUL1]] %[[#zero]] %[[#eight]] |
45 | 45 | ; CHECK-EXP: %[[#ACC1:]] = OpIAdd %[[#int_32]] %[[#ACC0]] %[[#MASK1]] |
46 | 46 |
|
47 | 47 | ; Third element of the packed vector |
48 | | -; CHECK-EXP: %[[#A2:]] = OpBitFieldSExtract %[[#int_32]] %[[#A]] %[[#sixteen]] %[[#eight]] |
49 | | -; CHECK-EXP: %[[#B2:]] = OpBitFieldSExtract %[[#int_32]] %[[#B]] %[[#sixteen]] %[[#eight]] |
50 | | -; CHECK-EXP: %[[#MUL2:]] = OpIMul %[[#int_32]] %[[#A2]] %[[#B2]] |
| 48 | +; CHECK-EXP: %[[#X2:]] = OpBitFieldSExtract %[[#int_32]] %[[#X]] %[[#sixteen]] %[[#eight]] |
| 49 | +; CHECK-EXP: %[[#Y2:]] = OpBitFieldSExtract %[[#int_32]] %[[#Y]] %[[#sixteen]] %[[#eight]] |
| 50 | +; CHECK-EXP: %[[#MUL2:]] = OpIMul %[[#int_32]] %[[#X2]] %[[#Y2]] |
51 | 51 | ; CHECK-EXP: %[[#MASK2:]] = OpBitFieldSExtract %[[#int_32]] %[[#MUL2]] %[[#zero]] %[[#eight]] |
52 | 52 | ; CHECK-EXP: %[[#ACC2:]] = OpIAdd %[[#int_32]] %[[#ACC1]] %[[#MASK2]] |
53 | 53 |
|
54 | 54 | ; Fourth element of the packed vector |
55 | | -; CHECK-EXP: %[[#A3:]] = OpBitFieldSExtract %[[#int_32]] %[[#A]] %[[#twentyfour]] %[[#eight]] |
56 | | -; CHECK-EXP: %[[#B3:]] = OpBitFieldSExtract %[[#int_32]] %[[#B]] %[[#twentyfour]] %[[#eight]] |
57 | | -; CHECK-EXP: %[[#MUL3:]] = OpIMul %[[#int_32]] %[[#A3]] %[[#B3]] |
| 55 | +; CHECK-EXP: %[[#X3:]] = OpBitFieldSExtract %[[#int_32]] %[[#X]] %[[#twentyfour]] %[[#eight]] |
| 56 | +; CHECK-EXP: %[[#Y3:]] = OpBitFieldSExtract %[[#int_32]] %[[#Y]] %[[#twentyfour]] %[[#eight]] |
| 57 | +; CHECK-EXP: %[[#MUL3:]] = OpIMul %[[#int_32]] %[[#X3]] %[[#Y3]] |
58 | 58 | ; CHECK-EXP: %[[#MASK3:]] = OpBitFieldSExtract %[[#int_32]] %[[#MUL3]] %[[#zero]] %[[#eight]] |
59 | 59 |
|
60 | 60 | ; CHECK-EXP: %[[#RES:]] = OpIAdd %[[#int_32]] %[[#ACC2]] %[[#MASK3]] |
61 | 61 | ; CHECK: OpReturnValue %[[#RES]] |
62 | | - %spv.dot = call i32 @llvm.spv.dot4add.i8packed(i32 %a, i32 %b, i32 %c) |
| 62 | + %spv.dot = call i32 @llvm.spv.dot4add.i8packed(i32 %acc, i32 %x, i32 %y) |
63 | 63 |
|
64 | 64 | ret i32 %spv.dot |
65 | 65 | } |
0 commit comments