Skip to content

Commit 1d46071

Browse files
authored
[LoongArch][NFC] Add tests for element extraction from binary add operation (#159725)
1 parent 02d8fb5 commit 1d46071

File tree

2 files changed

+226
-0
lines changed

2 files changed

+226
-0
lines changed
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
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 --check-prefixes=CHECK,LA32
3+
; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s --check-prefixes=CHECK,LA64
4+
5+
define i8 @extractelt_add_v32i8(ptr %p) {
6+
; CHECK-LABEL: extractelt_add_v32i8:
7+
; CHECK: # %bb.0: # %entry
8+
; CHECK-NEXT: xvld $xr0, $a0, 0
9+
; CHECK-NEXT: xvaddi.bu $xr0, $xr0, 13
10+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 2
11+
; CHECK-NEXT: ret
12+
entry:
13+
%x = load <32 x i8>, ptr %p
14+
%add = add <32 x i8> %x, <i8 11, i8 12, i8 13, i8 14, i8 11, i8 12, i8 13, i8 14, i8 11, i8 12, i8 13, i8 14, i8 11, i8 12, i8 13, i8 14, i8 11, i8 12, i8 13, i8 14, i8 11, i8 12, i8 13, i8 14, i8 11, i8 12, i8 13, i8 14, i8 11, i8 12, i8 13, i8 14>
15+
%ext = extractelement <32 x i8> %add, i32 2
16+
ret i8 %ext
17+
}
18+
19+
define i16 @extractelt_add_v16i16(ptr %p) {
20+
; CHECK-LABEL: extractelt_add_v16i16:
21+
; CHECK: # %bb.0: # %entry
22+
; CHECK-NEXT: xvld $xr0, $a0, 0
23+
; CHECK-NEXT: xvaddi.hu $xr0, $xr0, 13
24+
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 2
25+
; CHECK-NEXT: ret
26+
entry:
27+
%x = load <16 x i16>, ptr %p
28+
%add = add <16 x i16> %x, <i16 11, i16 12, i16 13, i16 14, i16 11, i16 12, i16 13, i16 14, i16 11, i16 12, i16 13, i16 14, i16 11, i16 12, i16 13, i16 14>
29+
%ext = extractelement <16 x i16> %add, i32 2
30+
ret i16 %ext
31+
}
32+
33+
define i32 @extractelt_add_v8i32(ptr %p) {
34+
; CHECK-LABEL: extractelt_add_v8i32:
35+
; CHECK: # %bb.0: # %entry
36+
; CHECK-NEXT: xvld $xr0, $a0, 0
37+
; CHECK-NEXT: xvaddi.wu $xr0, $xr0, 13
38+
; CHECK-NEXT: xvpickve2gr.w $a0, $xr0, 2
39+
; CHECK-NEXT: ret
40+
entry:
41+
%x = load <8 x i32>, ptr %p
42+
%add = add <8 x i32> %x, <i32 11, i32 12, i32 13, i32 14, i32 11, i32 12, i32 13, i32 14>
43+
%ext = extractelement <8 x i32> %add, i32 2
44+
ret i32 %ext
45+
}
46+
47+
define i64 @extractelt_add_v4i64(ptr %p) {
48+
; LA32-LABEL: extractelt_add_v4i64:
49+
; LA32: # %bb.0: # %entry
50+
; LA32-NEXT: xvld $xr0, $a0, 0
51+
; LA32-NEXT: xvaddi.du $xr0, $xr0, 12
52+
; LA32-NEXT: xvpickve2gr.w $a0, $xr0, 2
53+
; LA32-NEXT: xvpickve2gr.w $a1, $xr0, 3
54+
; LA32-NEXT: ret
55+
;
56+
; LA64-LABEL: extractelt_add_v4i64:
57+
; LA64: # %bb.0: # %entry
58+
; LA64-NEXT: xvld $xr0, $a0, 0
59+
; LA64-NEXT: xvaddi.du $xr0, $xr0, 12
60+
; LA64-NEXT: xvpickve2gr.d $a0, $xr0, 1
61+
; LA64-NEXT: ret
62+
entry:
63+
%x = load <4 x i64>, ptr %p
64+
%add = add <4 x i64> %x, <i64 11, i64 12, i64 13, i64 14>
65+
%ext = extractelement <4 x i64> %add, i32 1
66+
ret i64 %ext
67+
}
68+
69+
define float @extractelt_fadd_v8f32(ptr %p) {
70+
; CHECK-LABEL: extractelt_fadd_v8f32:
71+
; CHECK: # %bb.0: # %entry
72+
; CHECK-NEXT: xvld $xr0, $a0, 0
73+
; CHECK-NEXT: lu12i.w $a0, 267520
74+
; CHECK-NEXT: xvreplgr2vr.w $xr1, $a0
75+
; CHECK-NEXT: xvfadd.s $xr0, $xr0, $xr1
76+
; CHECK-NEXT: xvpickve.w $xr0, $xr0, 2
77+
; CHECK-NEXT: # kill: def $f0 killed $f0 killed $xr0
78+
; CHECK-NEXT: ret
79+
entry:
80+
%x = load <8 x float>, ptr %p
81+
%add = fadd <8 x float> %x, <float 11.0, float 12.0, float 13.0, float 14.0, float 11.0, float 12.0, float 13.0, float 14.0>
82+
%ext = extractelement <8 x float> %add, i32 2
83+
ret float %ext
84+
}
85+
86+
define double @extractelt_fadd_v4f64(ptr %p) {
87+
; LA32-LABEL: extractelt_fadd_v4f64:
88+
; LA32: # %bb.0: # %entry
89+
; LA32-NEXT: xvld $xr0, $a0, 0
90+
; LA32-NEXT: pcalau12i $a0, %pc_hi20(.LCPI5_0)
91+
; LA32-NEXT: xvld $xr1, $a0, %pc_lo12(.LCPI5_0)
92+
; LA32-NEXT: xvfadd.d $xr0, $xr0, $xr1
93+
; LA32-NEXT: xvpickve.d $xr0, $xr0, 1
94+
; LA32-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0
95+
; LA32-NEXT: ret
96+
;
97+
; LA64-LABEL: extractelt_fadd_v4f64:
98+
; LA64: # %bb.0: # %entry
99+
; LA64-NEXT: xvld $xr0, $a0, 0
100+
; LA64-NEXT: ori $a0, $zero, 0
101+
; LA64-NEXT: lu32i.d $a0, -524288
102+
; LA64-NEXT: lu52i.d $a0, $a0, 1026
103+
; LA64-NEXT: xvreplgr2vr.d $xr1, $a0
104+
; LA64-NEXT: xvfadd.d $xr0, $xr0, $xr1
105+
; LA64-NEXT: xvpickve.d $xr0, $xr0, 1
106+
; LA64-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0
107+
; LA64-NEXT: ret
108+
entry:
109+
%x = load <4 x double>, ptr %p
110+
%add = fadd <4 x double> %x, <double 11.0, double 12.0, double 13.0, double 14.0>
111+
%ext = extractelement <4 x double> %add, i32 1
112+
ret double %ext
113+
}
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
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 --check-prefixes=CHECK,LA32
3+
; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s --check-prefixes=CHECK,LA64
4+
5+
define i8 @extractelt_add_v16i8(ptr %p) {
6+
; CHECK-LABEL: extractelt_add_v16i8:
7+
; CHECK: # %bb.0: # %entry
8+
; CHECK-NEXT: vld $vr0, $a0, 0
9+
; CHECK-NEXT: vaddi.bu $vr0, $vr0, 13
10+
; CHECK-NEXT: vpickve2gr.b $a0, $vr0, 2
11+
; CHECK-NEXT: ret
12+
entry:
13+
%x = load <16 x i8>, ptr %p
14+
%add = add <16 x i8> %x, <i8 11, i8 12, i8 13, i8 14, i8 11, i8 12, i8 13, i8 14, i8 11, i8 12, i8 13, i8 14, i8 11, i8 12, i8 13, i8 14>
15+
%ext = extractelement <16 x i8> %add, i32 2
16+
ret i8 %ext
17+
}
18+
19+
define i16 @extractelt_add_v8i16(ptr %p) {
20+
; CHECK-LABEL: extractelt_add_v8i16:
21+
; CHECK: # %bb.0: # %entry
22+
; CHECK-NEXT: vld $vr0, $a0, 0
23+
; CHECK-NEXT: vaddi.hu $vr0, $vr0, 13
24+
; CHECK-NEXT: vpickve2gr.h $a0, $vr0, 2
25+
; CHECK-NEXT: ret
26+
entry:
27+
%x = load <8 x i16>, ptr %p
28+
%add = add <8 x i16> %x, <i16 11, i16 12, i16 13, i16 14, i16 11, i16 12, i16 13, i16 14>
29+
%ext = extractelement <8 x i16> %add, i32 2
30+
ret i16 %ext
31+
}
32+
33+
define i32 @extractelt_add_v4i32(ptr %p) {
34+
; CHECK-LABEL: extractelt_add_v4i32:
35+
; CHECK: # %bb.0: # %entry
36+
; CHECK-NEXT: vld $vr0, $a0, 0
37+
; CHECK-NEXT: vaddi.wu $vr0, $vr0, 13
38+
; CHECK-NEXT: vpickve2gr.w $a0, $vr0, 2
39+
; CHECK-NEXT: ret
40+
entry:
41+
%x = load <4 x i32>, ptr %p
42+
%add = add <4 x i32> %x, <i32 11, i32 12, i32 13, i32 14>
43+
%ext = extractelement <4 x i32> %add, i32 2
44+
ret i32 %ext
45+
}
46+
47+
define i64 @extractelt_add_v2i64(ptr %p) {
48+
; LA32-LABEL: extractelt_add_v2i64:
49+
; LA32: # %bb.0: # %entry
50+
; LA32-NEXT: vld $vr0, $a0, 0
51+
; LA32-NEXT: vaddi.du $vr0, $vr0, 12
52+
; LA32-NEXT: vpickve2gr.w $a0, $vr0, 2
53+
; LA32-NEXT: vpickve2gr.w $a1, $vr0, 3
54+
; LA32-NEXT: ret
55+
;
56+
; LA64-LABEL: extractelt_add_v2i64:
57+
; LA64: # %bb.0: # %entry
58+
; LA64-NEXT: vld $vr0, $a0, 0
59+
; LA64-NEXT: vaddi.du $vr0, $vr0, 12
60+
; LA64-NEXT: vpickve2gr.d $a0, $vr0, 1
61+
; LA64-NEXT: ret
62+
entry:
63+
%x = load <2 x i64>, ptr %p
64+
%add = add <2 x i64> %x, <i64 11, i64 12>
65+
%ext = extractelement <2 x i64> %add, i32 1
66+
ret i64 %ext
67+
}
68+
69+
define float @extractelt_fadd_v4f32(ptr %p) {
70+
; CHECK-LABEL: extractelt_fadd_v4f32:
71+
; CHECK: # %bb.0: # %entry
72+
; CHECK-NEXT: vld $vr0, $a0, 0
73+
; CHECK-NEXT: lu12i.w $a0, 267520
74+
; CHECK-NEXT: vreplgr2vr.w $vr1, $a0
75+
; CHECK-NEXT: vfadd.s $vr0, $vr0, $vr1
76+
; CHECK-NEXT: vreplvei.w $vr0, $vr0, 2
77+
; CHECK-NEXT: # kill: def $f0 killed $f0 killed $vr0
78+
; CHECK-NEXT: ret
79+
entry:
80+
%x = load <4 x float>, ptr %p
81+
%add = fadd <4 x float> %x, <float 11.0, float 12.0, float 13.0, float 14.0>
82+
%ext = extractelement <4 x float> %add, i32 2
83+
ret float %ext
84+
}
85+
86+
define double @extractelt_fadd_v2f64(ptr %p) {
87+
; LA32-LABEL: extractelt_fadd_v2f64:
88+
; LA32: # %bb.0: # %entry
89+
; LA32-NEXT: vld $vr0, $a0, 0
90+
; LA32-NEXT: pcalau12i $a0, %pc_hi20(.LCPI5_0)
91+
; LA32-NEXT: vld $vr1, $a0, %pc_lo12(.LCPI5_0)
92+
; LA32-NEXT: vfadd.d $vr0, $vr0, $vr1
93+
; LA32-NEXT: vreplvei.d $vr0, $vr0, 1
94+
; LA32-NEXT: # kill: def $f0_64 killed $f0_64 killed $vr0
95+
; LA32-NEXT: ret
96+
;
97+
; LA64-LABEL: extractelt_fadd_v2f64:
98+
; LA64: # %bb.0: # %entry
99+
; LA64-NEXT: vld $vr0, $a0, 0
100+
; LA64-NEXT: ori $a0, $zero, 0
101+
; LA64-NEXT: lu32i.d $a0, -524288
102+
; LA64-NEXT: lu52i.d $a0, $a0, 1026
103+
; LA64-NEXT: vreplgr2vr.d $vr1, $a0
104+
; LA64-NEXT: vfadd.d $vr0, $vr0, $vr1
105+
; LA64-NEXT: vreplvei.d $vr0, $vr0, 1
106+
; LA64-NEXT: # kill: def $f0_64 killed $f0_64 killed $vr0
107+
; LA64-NEXT: ret
108+
entry:
109+
%x = load <2 x double>, ptr %p
110+
%add = fadd <2 x double> %x, <double 11.0, double 12.0>
111+
%ext = extractelement <2 x double> %add, i32 1
112+
ret double %ext
113+
}

0 commit comments

Comments
 (0)