xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/lower-bitcast.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mcpu=core2 -mattr=+sse2 | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mcpu=core2 -mattr=+sse2 -x86-experimental-vector-widening-legalization | FileCheck %s --check-prefix=CHECK-WIDE
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine double @test1(double %A) {
6*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <2 x i32>
7*9880d681SAndroid Build Coastguard Worker  %add = add <2 x i32> %1, <i32 3, i32 5>
8*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i32> %add to double
9*9880d681SAndroid Build Coastguard Worker  ret double %2
10*9880d681SAndroid Build Coastguard Worker}
11*9880d681SAndroid Build Coastguard Worker; FIXME: Ideally we should be able to fold the entire body of @test1 into a
12*9880d681SAndroid Build Coastguard Worker; single paddd instruction. At the moment we produce the sequence
13*9880d681SAndroid Build Coastguard Worker; pshufd+paddq+pshufd. This is fixed with the widening legalization.
14*9880d681SAndroid Build Coastguard Worker;
15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1
16*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movsd
17*9880d681SAndroid Build Coastguard Worker; CHECK: pshufd
18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: paddd
19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd
20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
21*9880d681SAndroid Build Coastguard Worker;
22*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-LABEL: test1
23*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: movsd
24*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: paddd
25*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NEXT: ret
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdefine double @test2(double %A, double %B) {
29*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <2 x i32>
30*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <2 x i32>
31*9880d681SAndroid Build Coastguard Worker  %add = add <2 x i32> %1, %2
32*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <2 x i32> %add to double
33*9880d681SAndroid Build Coastguard Worker  ret double %3
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2
36*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movsd
37*9880d681SAndroid Build Coastguard Worker; CHECK: paddd
38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
39*9880d681SAndroid Build Coastguard Worker;
40*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-LABEL: test2
41*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: movsd
42*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: paddd
43*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NEXT: ret
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerdefine i64 @test3(i64 %A) {
47*9880d681SAndroid Build Coastguard Worker  %1 = bitcast i64 %A to <2 x float>
48*9880d681SAndroid Build Coastguard Worker  %add = fadd <2 x float> %1, <float 3.0, float 5.0>
49*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x float> %add to i64
50*9880d681SAndroid Build Coastguard Worker  ret i64 %2
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3
53*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: pshufd
54*9880d681SAndroid Build Coastguard Worker; CHECK: addps
55*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: pshufd
56*9880d681SAndroid Build Coastguard Worker; CHECK: ret
57*9880d681SAndroid Build Coastguard Worker;
58*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-LABEL: test3
59*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: pshufd
60*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: addps
61*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: pshufd
62*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: ret
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerdefine i64 @test4(i64 %A) {
66*9880d681SAndroid Build Coastguard Worker  %1 = bitcast i64 %A to <2 x i32>
67*9880d681SAndroid Build Coastguard Worker  %add = add <2 x i32> %1, <i32 3, i32 5>
68*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x i32> %add to i64
69*9880d681SAndroid Build Coastguard Worker  ret i64 %2
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker; FIXME: At the moment we still produce the sequence pshufd+paddd+pshufd.
72*9880d681SAndroid Build Coastguard Worker; Ideally, we should fold that sequence into a single paddd. This is fixed with
73*9880d681SAndroid Build Coastguard Worker; the widening legalization.
74*9880d681SAndroid Build Coastguard Worker;
75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4
76*9880d681SAndroid Build Coastguard Worker; CHECK: pshufd
77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: paddd
78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd
79*9880d681SAndroid Build Coastguard Worker; CHECK: ret
80*9880d681SAndroid Build Coastguard Worker;
81*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-LABEL: test4
82*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: movd %{{rdi|rcx}},
83*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NEXT: paddd
84*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NEXT: movd {{.*}}, %rax
85*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: ret
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workerdefine double @test5(double %A) {
89*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <2 x float>
90*9880d681SAndroid Build Coastguard Worker  %add = fadd <2 x float> %1, <float 3.0, float 5.0>
91*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <2 x float> %add to double
92*9880d681SAndroid Build Coastguard Worker  ret double %2
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5
95*9880d681SAndroid Build Coastguard Worker; CHECK: addps
96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
97*9880d681SAndroid Build Coastguard Worker;
98*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-LABEL: test5
99*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: addps
100*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NEXT: ret
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdefine double @test6(double %A) {
104*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <4 x i16>
105*9880d681SAndroid Build Coastguard Worker  %add = add <4 x i16> %1, <i16 3, i16 4, i16 5, i16 6>
106*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <4 x i16> %add to double
107*9880d681SAndroid Build Coastguard Worker  ret double %2
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker; FIXME: Ideally we should be able to fold the entire body of @test6 into a
110*9880d681SAndroid Build Coastguard Worker; single paddw instruction. This is fixed with the widening legalization.
111*9880d681SAndroid Build Coastguard Worker;
112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6
113*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movsd
114*9880d681SAndroid Build Coastguard Worker; CHECK: punpcklwd
115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: paddw
116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufb
117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
118*9880d681SAndroid Build Coastguard Worker;
119*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-LABEL: test6
120*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: mov
121*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: punpcklwd
122*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: paddw
123*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NEXT: ret
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Workerdefine double @test7(double %A, double %B) {
127*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <4 x i16>
128*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <4 x i16>
129*9880d681SAndroid Build Coastguard Worker  %add = add <4 x i16> %1, %2
130*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <4 x i16> %add to double
131*9880d681SAndroid Build Coastguard Worker  ret double %3
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7
134*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movsd
135*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: punpcklwd
136*9880d681SAndroid Build Coastguard Worker; CHECK: paddw
137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
138*9880d681SAndroid Build Coastguard Worker;
139*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-LABEL: test7
140*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: movsd
141*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: punpcklwd
142*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: paddw
143*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NEXT: ret
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Workerdefine double @test8(double %A) {
147*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <8 x i8>
148*9880d681SAndroid Build Coastguard Worker  %add = add <8 x i8> %1, <i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10>
149*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <8 x i8> %add to double
150*9880d681SAndroid Build Coastguard Worker  ret double %2
151*9880d681SAndroid Build Coastguard Worker}
152*9880d681SAndroid Build Coastguard Worker; FIXME: Ideally we should be able to fold the entire body of @test8 into a
153*9880d681SAndroid Build Coastguard Worker; single paddb instruction. At the moment we produce the sequence
154*9880d681SAndroid Build Coastguard Worker; pshufd+paddw+pshufd. This is fixed with the widening legalization.
155*9880d681SAndroid Build Coastguard Worker;
156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8
157*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movsd
158*9880d681SAndroid Build Coastguard Worker; CHECK: punpcklbw
159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: paddb
160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufb
161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
162*9880d681SAndroid Build Coastguard Worker;
163*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-LABEL: test8
164*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: movsd
165*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: punpcklbw
166*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: paddb
167*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NEXT: ret
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Workerdefine double @test9(double %A, double %B) {
171*9880d681SAndroid Build Coastguard Worker  %1 = bitcast double %A to <8 x i8>
172*9880d681SAndroid Build Coastguard Worker  %2 = bitcast double %B to <8 x i8>
173*9880d681SAndroid Build Coastguard Worker  %add = add <8 x i8> %1, %2
174*9880d681SAndroid Build Coastguard Worker  %3 = bitcast <8 x i8> %add to double
175*9880d681SAndroid Build Coastguard Worker  ret double %3
176*9880d681SAndroid Build Coastguard Worker}
177*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9
178*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: movsd
179*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: punpcklbw
180*9880d681SAndroid Build Coastguard Worker; CHECK: paddb
181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
182*9880d681SAndroid Build Coastguard Worker;
183*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-LABEL: test9
184*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: movsd
185*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NOT: punpcklbw
186*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE: paddb
187*9880d681SAndroid Build Coastguard Worker; CHECK-WIDE-NEXT: ret
188*9880d681SAndroid Build Coastguard Worker
189