Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / Hexagon / autohvx / qmul.ll
blob866bb283fbad641534c99440f6957c9fae2adcdd
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -march=hexagon < %s | FileCheck %s
4 define void @f0(ptr %a0, ptr %a1, ptr %a2) #0 {
5 ; CHECK-LABEL: f0:
6 ; CHECK:       // %bb.0: // %b0
7 ; CHECK-NEXT:    {
8 ; CHECK-NEXT:     v0 = vmem(r0+#0)
9 ; CHECK-NEXT:    }
10 ; CHECK-NEXT:    {
11 ; CHECK-NEXT:     v1 = vmem(r1+#0)
12 ; CHECK-NEXT:    }
13 ; CHECK-NEXT:    {
14 ; CHECK-NEXT:     v2.w = vmpye(v0.w,v1.uh)
15 ; CHECK-NEXT:    }
16 ; CHECK-NEXT:    {
17 ; CHECK-NEXT:     v2.w += vmpyo(v0.w,v1.h):<<1:sat:shift
18 ; CHECK-NEXT:    }
19 ; CHECK-NEXT:    {
20 ; CHECK-NEXT:     vmem(r2+#0) = v2
21 ; CHECK-NEXT:    }
22 ; CHECK-NEXT:    {
23 ; CHECK-NEXT:     jumpr r31
24 ; CHECK-NEXT:    }
25 b0:
26   %v0 = load <32 x i32>, ptr %a0, align 128
27   %v1 = load <32 x i32>, ptr %a1, align 128
28   %v2 = sext <32 x i32> %v0 to <32 x i64>
29   %v3 = sext <32 x i32> %v1 to <32 x i64>
30   %v4 = mul nsw <32 x i64> %v2, %v3
31   %v5 = lshr <32 x i64> %v4, <i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31>
32   %v6 = trunc <32 x i64> %v5 to <32 x i32>
33   store <32 x i32> %v6, ptr %a2, align 128
34   ret void
37 define void @f1(ptr %a0, ptr %a1, ptr %a2) #0 {
38 ; CHECK-LABEL: f1:
39 ; CHECK:       // %bb.0: // %b0
40 ; CHECK-NEXT:    {
41 ; CHECK-NEXT:     v0 = vmem(r0+#0)
42 ; CHECK-NEXT:    }
43 ; CHECK-NEXT:    {
44 ; CHECK-NEXT:     v1 = vmem(r1+#0)
45 ; CHECK-NEXT:    }
46 ; CHECK-NEXT:    {
47 ; CHECK-NEXT:     v2.w = vmpye(v0.w,v1.uh)
48 ; CHECK-NEXT:    }
49 ; CHECK-NEXT:    {
50 ; CHECK-NEXT:     v2.w += vmpyo(v0.w,v1.h):<<1:rnd:sat:shift
51 ; CHECK-NEXT:    }
52 ; CHECK-NEXT:    {
53 ; CHECK-NEXT:     vmem(r2+#0) = v2
54 ; CHECK-NEXT:    }
55 ; CHECK-NEXT:    {
56 ; CHECK-NEXT:     jumpr r31
57 ; CHECK-NEXT:    }
58 b0:
59   %v0 = load <32 x i32>, ptr %a0, align 128
60   %v1 = load <32 x i32>, ptr %a1, align 128
61   %v2 = sext <32 x i32> %v0 to <32 x i64>
62   %v3 = sext <32 x i32> %v1 to <32 x i64>
63   %v4 = mul nsw <32 x i64> %v2, %v3
64   %v5 = add nsw <32 x i64> %v4, <i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824, i64 1073741824>
65   %v6 = lshr <32 x i64> %v5, <i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31, i64 31>
66   %v7 = trunc <32 x i64> %v6 to <32 x i32>
67   store <32 x i32> %v7, ptr %a2, align 128
68   ret void
71 define void @f2(ptr %a0, ptr %a1, ptr %a2) #0 {
72 ; CHECK-LABEL: f2:
73 ; CHECK:       // %bb.0: // %b0
74 ; CHECK-NEXT:    {
75 ; CHECK-NEXT:     v0 = vmem(r1+#0)
76 ; CHECK-NEXT:    }
77 ; CHECK-NEXT:    {
78 ; CHECK-NEXT:     r7 = #124
79 ; CHECK-NEXT:    }
80 ; CHECK-NEXT:    {
81 ; CHECK-NEXT:     r3 = #15
82 ; CHECK-NEXT:    }
83 ; CHECK-NEXT:    {
84 ; CHECK-NEXT:     v1 = vmem(r0+#0)
85 ; CHECK-NEXT:    }
86 ; CHECK-NEXT:    {
87 ; CHECK-NEXT:     v1:0.w = vmpy(v0.h,v1.h)
88 ; CHECK-NEXT:    }
89 ; CHECK-NEXT:    {
90 ; CHECK-NEXT:     v1:0 = vshuff(v1,v0,r7)
91 ; CHECK-NEXT:    }
92 ; CHECK-NEXT:    {
93 ; CHECK-NEXT:     v0.uw = vlsr(v0.uw,r3)
94 ; CHECK-NEXT:    }
95 ; CHECK-NEXT:    {
96 ; CHECK-NEXT:     v1.uw = vlsr(v1.uw,r3)
97 ; CHECK-NEXT:    }
98 ; CHECK-NEXT:    {
99 ; CHECK-NEXT:     v0.h = vpacke(v1.w,v0.w)
100 ; CHECK-NEXT:    }
101 ; CHECK-NEXT:    {
102 ; CHECK-NEXT:     vmem(r2+#0) = v0
103 ; CHECK-NEXT:    }
104 ; CHECK-NEXT:    {
105 ; CHECK-NEXT:     jumpr r31
106 ; CHECK-NEXT:    }
108   %v0 = load <64 x i16>, ptr %a0, align 128
109   %v1 = load <64 x i16>, ptr %a1, align 128
110   %v2 = sext <64 x i16> %v0 to <64 x i32>
111   %v3 = sext <64 x i16> %v1 to <64 x i32>
112   %v4 = mul nsw <64 x i32> %v2, %v3
113   %v5 = lshr <64 x i32> %v4, <i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15>
114   %v6 = trunc <64 x i32> %v5 to <64 x i16>
115   store <64 x i16> %v6, ptr %a2, align 128
116   ret void
119 define void @f3(ptr %a0, ptr %a1, ptr %a2) #0 {
120 ; CHECK-LABEL: f3:
121 ; CHECK:       // %bb.0: // %b0
122 ; CHECK-NEXT:    {
123 ; CHECK-NEXT:     v0 = vmem(r0+#0)
124 ; CHECK-NEXT:    }
125 ; CHECK-NEXT:    {
126 ; CHECK-NEXT:     v1 = vmem(r1+#0)
127 ; CHECK-NEXT:    }
128 ; CHECK-NEXT:    {
129 ; CHECK-NEXT:     v0.h = vmpy(v0.h,v1.h):<<1:rnd:sat
130 ; CHECK-NEXT:    }
131 ; CHECK-NEXT:    {
132 ; CHECK-NEXT:     vmem(r2+#0) = v0
133 ; CHECK-NEXT:    }
134 ; CHECK-NEXT:    {
135 ; CHECK-NEXT:     jumpr r31
136 ; CHECK-NEXT:    }
138   %v0 = load <64 x i16>, ptr %a0, align 128
139   %v1 = load <64 x i16>, ptr %a1, align 128
140   %v2 = sext <64 x i16> %v0 to <64 x i32>
141   %v3 = sext <64 x i16> %v1 to <64 x i32>
142   %v4 = mul nsw <64 x i32> %v2, %v3
143   %v5 = add nsw <64 x i32> %v4, <i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384, i32 16384>
144   %v6 = lshr <64 x i32> %v5, <i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15>
145   %v7 = trunc <64 x i32> %v6 to <64 x i16>
146   store <64 x i16> %v7, ptr %a2, align 128
147   ret void
150 attributes #0 = { nounwind "target-features"="+v68,+hvxv68,+hvx-length128b,-packets" }