xref: /llvm-project/llvm/test/CodeGen/LoongArch/lsx/mulh.ll (revision a5c90e48b6f11bc6db7344503589648f76b16d80)
1e9cd197dSwanglei; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2e9cd197dSwanglei; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s
3e9cd197dSwanglei
4e9cd197dSwangleidefine void @mulhs_v16i8(ptr %res, ptr %a0, ptr %a1) nounwind {
5e9cd197dSwanglei; CHECK-LABEL: mulhs_v16i8:
6e9cd197dSwanglei; CHECK:       # %bb.0: # %entry
7*a5c90e48Swanglei; CHECK-NEXT:    vld $vr0, $a1, 0
8*a5c90e48Swanglei; CHECK-NEXT:    vld $vr1, $a2, 0
9*a5c90e48Swanglei; CHECK-NEXT:    vmuh.b $vr0, $vr0, $vr1
10e9cd197dSwanglei; CHECK-NEXT:    vst $vr0, $a0, 0
11e9cd197dSwanglei; CHECK-NEXT:    ret
12e9cd197dSwangleientry:
13e9cd197dSwanglei  %v0 = load <16 x i8>, ptr %a0
14e9cd197dSwanglei  %v1 = load <16 x i8>, ptr %a1
15e9cd197dSwanglei  %v0s = sext <16 x i8> %v0 to <16 x i16>
16e9cd197dSwanglei  %v1s = sext <16 x i8> %v1 to <16 x i16>
17e9cd197dSwanglei  %m = mul <16 x i16> %v0s, %v1s
18e9cd197dSwanglei  %s = ashr <16 x i16> %m, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
19e9cd197dSwanglei  %v2 = trunc <16 x i16> %s to <16 x i8>
20e9cd197dSwanglei  store <16 x i8> %v2, ptr %res
21e9cd197dSwanglei  ret void
22e9cd197dSwanglei}
23e9cd197dSwanglei
24e9cd197dSwangleidefine void @mulhu_v16i8(ptr %res, ptr %a0, ptr %a1) nounwind {
25e9cd197dSwanglei; CHECK-LABEL: mulhu_v16i8:
26e9cd197dSwanglei; CHECK:       # %bb.0: # %entry
27*a5c90e48Swanglei; CHECK-NEXT:    vld $vr0, $a1, 0
28*a5c90e48Swanglei; CHECK-NEXT:    vld $vr1, $a2, 0
29*a5c90e48Swanglei; CHECK-NEXT:    vmuh.bu $vr0, $vr0, $vr1
30e9cd197dSwanglei; CHECK-NEXT:    vst $vr0, $a0, 0
31e9cd197dSwanglei; CHECK-NEXT:    ret
32e9cd197dSwangleientry:
33e9cd197dSwanglei  %v0 = load <16 x i8>, ptr %a0
34e9cd197dSwanglei  %v1 = load <16 x i8>, ptr %a1
35e9cd197dSwanglei  %v0z = zext <16 x i8> %v0 to <16 x i16>
36e9cd197dSwanglei  %v1z = zext <16 x i8> %v1 to <16 x i16>
37e9cd197dSwanglei  %m = mul <16 x i16> %v0z, %v1z
38e9cd197dSwanglei  %s = lshr <16 x i16> %m, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
39e9cd197dSwanglei  %v2 = trunc <16 x i16> %s to <16 x i8>
40e9cd197dSwanglei  store <16 x i8> %v2, ptr %res
41e9cd197dSwanglei  ret void
42e9cd197dSwanglei}
43e9cd197dSwanglei
44e9cd197dSwangleidefine void @mulhs_v8i16(ptr %res, ptr %a0, ptr %a1) nounwind {
45e9cd197dSwanglei; CHECK-LABEL: mulhs_v8i16:
46e9cd197dSwanglei; CHECK:       # %bb.0: # %entry
47*a5c90e48Swanglei; CHECK-NEXT:    vld $vr0, $a1, 0
48*a5c90e48Swanglei; CHECK-NEXT:    vld $vr1, $a2, 0
49*a5c90e48Swanglei; CHECK-NEXT:    vmuh.h $vr0, $vr0, $vr1
50e9cd197dSwanglei; CHECK-NEXT:    vst $vr0, $a0, 0
51e9cd197dSwanglei; CHECK-NEXT:    ret
52e9cd197dSwangleientry:
53e9cd197dSwanglei  %v0 = load <8 x i16>, ptr %a0
54e9cd197dSwanglei  %v1 = load <8 x i16>, ptr %a1
55e9cd197dSwanglei  %v0s = sext <8 x i16> %v0 to <8 x i32>
56e9cd197dSwanglei  %v1s = sext <8 x i16> %v1 to <8 x i32>
57e9cd197dSwanglei  %m = mul <8 x i32> %v0s, %v1s
58e9cd197dSwanglei  %s = ashr <8 x i32> %m, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
59e9cd197dSwanglei  %v2 = trunc <8 x i32> %s to <8 x i16>
60e9cd197dSwanglei  store <8 x i16> %v2, ptr %res
61e9cd197dSwanglei  ret void
62e9cd197dSwanglei}
63e9cd197dSwanglei
64e9cd197dSwangleidefine void @mulhu_v8i16(ptr %res, ptr %a0, ptr %a1) nounwind {
65e9cd197dSwanglei; CHECK-LABEL: mulhu_v8i16:
66e9cd197dSwanglei; CHECK:       # %bb.0: # %entry
67*a5c90e48Swanglei; CHECK-NEXT:    vld $vr0, $a1, 0
68*a5c90e48Swanglei; CHECK-NEXT:    vld $vr1, $a2, 0
69*a5c90e48Swanglei; CHECK-NEXT:    vmuh.hu $vr0, $vr0, $vr1
70e9cd197dSwanglei; CHECK-NEXT:    vst $vr0, $a0, 0
71e9cd197dSwanglei; CHECK-NEXT:    ret
72e9cd197dSwangleientry:
73e9cd197dSwanglei  %v0 = load <8 x i16>, ptr %a0
74e9cd197dSwanglei  %v1 = load <8 x i16>, ptr %a1
75e9cd197dSwanglei  %v0z = zext <8 x i16> %v0 to <8 x i32>
76e9cd197dSwanglei  %v1z = zext <8 x i16> %v1 to <8 x i32>
77e9cd197dSwanglei  %m = mul <8 x i32> %v0z, %v1z
78e9cd197dSwanglei  %s = lshr <8 x i32> %m, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
79e9cd197dSwanglei  %v2 = trunc <8 x i32> %s to <8 x i16>
80e9cd197dSwanglei  store <8 x i16> %v2, ptr %res
81e9cd197dSwanglei  ret void
82e9cd197dSwanglei}
83e9cd197dSwanglei
84e9cd197dSwangleidefine void @mulhs_v4i32(ptr %res, ptr %a0, ptr %a1) nounwind {
85e9cd197dSwanglei; CHECK-LABEL: mulhs_v4i32:
86e9cd197dSwanglei; CHECK:       # %bb.0: # %entry
87*a5c90e48Swanglei; CHECK-NEXT:    vld $vr0, $a1, 0
88*a5c90e48Swanglei; CHECK-NEXT:    vld $vr1, $a2, 0
89*a5c90e48Swanglei; CHECK-NEXT:    vmuh.w $vr0, $vr0, $vr1
90e9cd197dSwanglei; CHECK-NEXT:    vst $vr0, $a0, 0
91e9cd197dSwanglei; CHECK-NEXT:    ret
92e9cd197dSwangleientry:
93e9cd197dSwanglei  %v0 = load <4 x i32>, ptr %a0
94e9cd197dSwanglei  %v1 = load <4 x i32>, ptr %a1
95e9cd197dSwanglei  %v0s = sext <4 x i32> %v0 to <4 x i64>
96e9cd197dSwanglei  %v1s = sext <4 x i32> %v1 to <4 x i64>
97e9cd197dSwanglei  %m = mul <4 x i64> %v0s, %v1s
98e9cd197dSwanglei  %s = ashr <4 x i64> %m, <i64 32, i64 32, i64 32, i64 32>
99e9cd197dSwanglei  %v2 = trunc <4 x i64> %s to <4 x i32>
100e9cd197dSwanglei  store <4 x i32> %v2, ptr %res
101e9cd197dSwanglei  ret void
102e9cd197dSwanglei}
103e9cd197dSwanglei
104e9cd197dSwangleidefine void @mulhu_v4i32(ptr %res, ptr %a0, ptr %a1) nounwind {
105e9cd197dSwanglei; CHECK-LABEL: mulhu_v4i32:
106e9cd197dSwanglei; CHECK:       # %bb.0: # %entry
107*a5c90e48Swanglei; CHECK-NEXT:    vld $vr0, $a1, 0
108*a5c90e48Swanglei; CHECK-NEXT:    vld $vr1, $a2, 0
109*a5c90e48Swanglei; CHECK-NEXT:    vmuh.wu $vr0, $vr0, $vr1
110e9cd197dSwanglei; CHECK-NEXT:    vst $vr0, $a0, 0
111e9cd197dSwanglei; CHECK-NEXT:    ret
112e9cd197dSwangleientry:
113e9cd197dSwanglei  %v0 = load <4 x i32>, ptr %a0
114e9cd197dSwanglei  %v1 = load <4 x i32>, ptr %a1
115e9cd197dSwanglei  %v0z = zext <4 x i32> %v0 to <4 x i64>
116e9cd197dSwanglei  %v1z = zext <4 x i32> %v1 to <4 x i64>
117e9cd197dSwanglei  %m = mul <4 x i64> %v0z, %v1z
118e9cd197dSwanglei  %s = lshr <4 x i64> %m, <i64 32, i64 32, i64 32, i64 32>
119e9cd197dSwanglei  %v2 = trunc <4 x i64> %s to <4 x i32>
120e9cd197dSwanglei  store <4 x i32> %v2, ptr %res
121e9cd197dSwanglei  ret void
122e9cd197dSwanglei}
123e9cd197dSwanglei
124e9cd197dSwangleidefine void @mulhs_v2i64(ptr %res, ptr %a0, ptr %a1) nounwind {
125e9cd197dSwanglei; CHECK-LABEL: mulhs_v2i64:
126e9cd197dSwanglei; CHECK:       # %bb.0: # %entry
127*a5c90e48Swanglei; CHECK-NEXT:    vld $vr0, $a1, 0
128*a5c90e48Swanglei; CHECK-NEXT:    vld $vr1, $a2, 0
129*a5c90e48Swanglei; CHECK-NEXT:    vmuh.d $vr0, $vr0, $vr1
130e9cd197dSwanglei; CHECK-NEXT:    vst $vr0, $a0, 0
131e9cd197dSwanglei; CHECK-NEXT:    ret
132e9cd197dSwangleientry:
133e9cd197dSwanglei  %v0 = load <2 x i64>, ptr %a0
134e9cd197dSwanglei  %v1 = load <2 x i64>, ptr %a1
135e9cd197dSwanglei  %v0s = sext <2 x i64> %v0 to <2 x i128>
136e9cd197dSwanglei  %v1s = sext <2 x i64> %v1 to <2 x i128>
137e9cd197dSwanglei  %m = mul <2 x i128> %v0s, %v1s
138e9cd197dSwanglei  %s = ashr <2 x i128> %m, <i128 64, i128 64>
139e9cd197dSwanglei  %v2 = trunc <2 x i128> %s to <2 x i64>
140e9cd197dSwanglei  store <2 x i64> %v2, ptr %res
141e9cd197dSwanglei  ret void
142e9cd197dSwanglei}
143e9cd197dSwanglei
144e9cd197dSwangleidefine void @mulhu_v2i64(ptr %res, ptr %a0, ptr %a1) nounwind {
145e9cd197dSwanglei; CHECK-LABEL: mulhu_v2i64:
146e9cd197dSwanglei; CHECK:       # %bb.0: # %entry
147*a5c90e48Swanglei; CHECK-NEXT:    vld $vr0, $a1, 0
148*a5c90e48Swanglei; CHECK-NEXT:    vld $vr1, $a2, 0
149*a5c90e48Swanglei; CHECK-NEXT:    vmuh.du $vr0, $vr0, $vr1
150e9cd197dSwanglei; CHECK-NEXT:    vst $vr0, $a0, 0
151e9cd197dSwanglei; CHECK-NEXT:    ret
152e9cd197dSwangleientry:
153e9cd197dSwanglei  %v0 = load <2 x i64>, ptr %a0
154e9cd197dSwanglei  %v1 = load <2 x i64>, ptr %a1
155e9cd197dSwanglei  %v0z = zext <2 x i64> %v0 to <2 x i128>
156e9cd197dSwanglei  %v1z = zext <2 x i64> %v1 to <2 x i128>
157e9cd197dSwanglei  %m = mul <2 x i128> %v0z, %v1z
158e9cd197dSwanglei  %s = lshr <2 x i128> %m, <i128 64, i128 64>
159e9cd197dSwanglei  %v2 = trunc <2 x i128> %s to <2 x i64>
160e9cd197dSwanglei  store <2 x i64> %v2, ptr %res
161e9cd197dSwanglei  ret void
162e9cd197dSwanglei}
163