Skip to content

Commit c8d983c

Browse files
authored
[LoongArch][NFC] Add tests for combining and(add(not)) (#159055)
1 parent ed30414 commit c8d983c

File tree

2 files changed

+188
-0
lines changed

2 files changed

+188
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
2+
; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx < %s | FileCheck %s
3+
; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s
4+
5+
define void @and_not_combine_v32i8(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
6+
; CHECK-LABEL: and_not_combine_v32i8:
7+
; CHECK: # %bb.0: # %entry
8+
; CHECK-NEXT: xvld $xr0, $a2, 0
9+
; CHECK-NEXT: xvld $xr1, $a3, 0
10+
; CHECK-NEXT: xvld $xr2, $a1, 0
11+
; CHECK-NEXT: xvxori.b $xr0, $xr0, 255
12+
; CHECK-NEXT: xvadd.b $xr0, $xr0, $xr1
13+
; CHECK-NEXT: xvand.v $xr0, $xr2, $xr0
14+
; CHECK-NEXT: xvst $xr0, $a0, 0
15+
; CHECK-NEXT: ret
16+
entry:
17+
%v0 = load <32 x i8>, ptr %a0
18+
%v1 = load <32 x i8>, ptr %a1
19+
%v2 = load <32 x i8>, ptr %a2
20+
%not = xor <32 x i8> %v1, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
21+
%add = add <32 x i8> %not, %v2
22+
%and = and <32 x i8> %v0, %add
23+
store <32 x i8> %and, ptr %res
24+
ret void
25+
}
26+
27+
define void @and_not_combine_v16i16(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
28+
; CHECK-LABEL: and_not_combine_v16i16:
29+
; CHECK: # %bb.0: # %entry
30+
; CHECK-NEXT: xvld $xr0, $a2, 0
31+
; CHECK-NEXT: xvld $xr1, $a3, 0
32+
; CHECK-NEXT: xvld $xr2, $a1, 0
33+
; CHECK-NEXT: xvrepli.b $xr3, -1
34+
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr3
35+
; CHECK-NEXT: xvadd.h $xr0, $xr0, $xr1
36+
; CHECK-NEXT: xvand.v $xr0, $xr2, $xr0
37+
; CHECK-NEXT: xvst $xr0, $a0, 0
38+
; CHECK-NEXT: ret
39+
entry:
40+
%v0 = load <16 x i16>, ptr %a0
41+
%v1 = load <16 x i16>, ptr %a1
42+
%v2 = load <16 x i16>, ptr %a2
43+
%not = xor <16 x i16> %v1, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
44+
%add = add <16 x i16> %not, %v2
45+
%and = and <16 x i16> %v0, %add
46+
store <16 x i16> %and, ptr %res
47+
ret void
48+
}
49+
50+
define void @and_not_combine_v8i32(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
51+
; CHECK-LABEL: and_not_combine_v8i32:
52+
; CHECK: # %bb.0: # %entry
53+
; CHECK-NEXT: xvld $xr0, $a2, 0
54+
; CHECK-NEXT: xvld $xr1, $a3, 0
55+
; CHECK-NEXT: xvld $xr2, $a1, 0
56+
; CHECK-NEXT: xvrepli.b $xr3, -1
57+
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr3
58+
; CHECK-NEXT: xvadd.w $xr0, $xr0, $xr1
59+
; CHECK-NEXT: xvand.v $xr0, $xr2, $xr0
60+
; CHECK-NEXT: xvst $xr0, $a0, 0
61+
; CHECK-NEXT: ret
62+
entry:
63+
%v0 = load <8 x i32>, ptr %a0
64+
%v1 = load <8 x i32>, ptr %a1
65+
%v2 = load <8 x i32>, ptr %a2
66+
%not = xor <8 x i32> %v1, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
67+
%add = add <8 x i32> %not, %v2
68+
%and = and <8 x i32> %v0, %add
69+
store <8 x i32> %and, ptr %res
70+
ret void
71+
}
72+
73+
define void @and_not_combine_v4i64(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
74+
; CHECK-LABEL: and_not_combine_v4i64:
75+
; CHECK: # %bb.0: # %entry
76+
; CHECK-NEXT: xvld $xr0, $a2, 0
77+
; CHECK-NEXT: xvld $xr1, $a3, 0
78+
; CHECK-NEXT: xvld $xr2, $a1, 0
79+
; CHECK-NEXT: xvrepli.b $xr3, -1
80+
; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr3
81+
; CHECK-NEXT: xvadd.d $xr0, $xr0, $xr1
82+
; CHECK-NEXT: xvand.v $xr0, $xr2, $xr0
83+
; CHECK-NEXT: xvst $xr0, $a0, 0
84+
; CHECK-NEXT: ret
85+
entry:
86+
%v0 = load <4 x i64>, ptr %a0
87+
%v1 = load <4 x i64>, ptr %a1
88+
%v2 = load <4 x i64>, ptr %a2
89+
%not = xor <4 x i64> %v1, <i64 -1, i64 -1, i64 -1, i64 -1>
90+
%add = add <4 x i64> %not, %v2
91+
%and = and <4 x i64> %v0, %add
92+
store <4 x i64> %and, ptr %res
93+
ret void
94+
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
2+
; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx < %s | FileCheck %s
3+
; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s
4+
5+
define void @and_not_combine_v16i8(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
6+
; CHECK-LABEL: and_not_combine_v16i8:
7+
; CHECK: # %bb.0: # %entry
8+
; CHECK-NEXT: vld $vr0, $a2, 0
9+
; CHECK-NEXT: vld $vr1, $a3, 0
10+
; CHECK-NEXT: vld $vr2, $a1, 0
11+
; CHECK-NEXT: vxori.b $vr0, $vr0, 255
12+
; CHECK-NEXT: vadd.b $vr0, $vr0, $vr1
13+
; CHECK-NEXT: vand.v $vr0, $vr2, $vr0
14+
; CHECK-NEXT: vst $vr0, $a0, 0
15+
; CHECK-NEXT: ret
16+
entry:
17+
%v0 = load <16 x i8>, ptr %a0
18+
%v1 = load <16 x i8>, ptr %a1
19+
%v2 = load <16 x i8>, ptr %a2
20+
%not = xor <16 x i8> %v1, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
21+
%add = add <16 x i8> %not, %v2
22+
%and = and <16 x i8> %v0, %add
23+
store <16 x i8> %and, ptr %res
24+
ret void
25+
}
26+
27+
define void @and_not_combine_v8i16(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
28+
; CHECK-LABEL: and_not_combine_v8i16:
29+
; CHECK: # %bb.0: # %entry
30+
; CHECK-NEXT: vld $vr0, $a2, 0
31+
; CHECK-NEXT: vld $vr1, $a3, 0
32+
; CHECK-NEXT: vld $vr2, $a1, 0
33+
; CHECK-NEXT: vrepli.b $vr3, -1
34+
; CHECK-NEXT: vxor.v $vr0, $vr0, $vr3
35+
; CHECK-NEXT: vadd.h $vr0, $vr0, $vr1
36+
; CHECK-NEXT: vand.v $vr0, $vr2, $vr0
37+
; CHECK-NEXT: vst $vr0, $a0, 0
38+
; CHECK-NEXT: ret
39+
entry:
40+
%v0 = load <8 x i16>, ptr %a0
41+
%v1 = load <8 x i16>, ptr %a1
42+
%v2 = load <8 x i16>, ptr %a2
43+
%not = xor <8 x i16> %v1, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
44+
%add = add <8 x i16> %not, %v2
45+
%and = and <8 x i16> %v0, %add
46+
store <8 x i16> %and, ptr %res
47+
ret void
48+
}
49+
50+
define void @and_not_combine_v4i32(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
51+
; CHECK-LABEL: and_not_combine_v4i32:
52+
; CHECK: # %bb.0: # %entry
53+
; CHECK-NEXT: vld $vr0, $a2, 0
54+
; CHECK-NEXT: vld $vr1, $a3, 0
55+
; CHECK-NEXT: vld $vr2, $a1, 0
56+
; CHECK-NEXT: vrepli.b $vr3, -1
57+
; CHECK-NEXT: vxor.v $vr0, $vr0, $vr3
58+
; CHECK-NEXT: vadd.w $vr0, $vr0, $vr1
59+
; CHECK-NEXT: vand.v $vr0, $vr2, $vr0
60+
; CHECK-NEXT: vst $vr0, $a0, 0
61+
; CHECK-NEXT: ret
62+
entry:
63+
%v0 = load <4 x i32>, ptr %a0
64+
%v1 = load <4 x i32>, ptr %a1
65+
%v2 = load <4 x i32>, ptr %a2
66+
%not = xor <4 x i32> %v1, <i32 -1, i32 -1, i32 -1, i32 -1>
67+
%add = add <4 x i32> %not, %v2
68+
%and = and <4 x i32> %v0, %add
69+
store <4 x i32> %and, ptr %res
70+
ret void
71+
}
72+
73+
define void @and_not_combine_v2i64(ptr %res, ptr %a0, ptr %a1, ptr %a2) nounwind {
74+
; CHECK-LABEL: and_not_combine_v2i64:
75+
; CHECK: # %bb.0: # %entry
76+
; CHECK-NEXT: vld $vr0, $a2, 0
77+
; CHECK-NEXT: vld $vr1, $a3, 0
78+
; CHECK-NEXT: vld $vr2, $a1, 0
79+
; CHECK-NEXT: vrepli.b $vr3, -1
80+
; CHECK-NEXT: vxor.v $vr0, $vr0, $vr3
81+
; CHECK-NEXT: vadd.d $vr0, $vr0, $vr1
82+
; CHECK-NEXT: vand.v $vr0, $vr2, $vr0
83+
; CHECK-NEXT: vst $vr0, $a0, 0
84+
; CHECK-NEXT: ret
85+
entry:
86+
%v0 = load <2 x i64>, ptr %a0
87+
%v1 = load <2 x i64>, ptr %a1
88+
%v2 = load <2 x i64>, ptr %a2
89+
%not = xor <2 x i64> %v1, <i64 -1, i64 -1>
90+
%add = add <2 x i64> %not, %v2
91+
%and = and <2 x i64> %v0, %add
92+
store <2 x i64> %and, ptr %res
93+
ret void
94+
}

0 commit comments

Comments
 (0)