xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/vdiv_combine.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=armv7-apple-ios | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker@in = global float 0x400921FA00000000, align 4
4*9880d681SAndroid Build Coastguard Worker@iin = global i32 -1023, align 4
5*9880d681SAndroid Build Coastguard Worker@uin = global i32 1023, align 4
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdeclare void @foo_int32x4_t(<4 x i32>)
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; Test signed conversion.
10*9880d681SAndroid Build Coastguard Worker; CHECK: t1
11*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{vdiv|vmul}}
12*9880d681SAndroid Build Coastguard Workerdefine void @t1() nounwind {
13*9880d681SAndroid Build Coastguard Workerentry:
14*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* @iin, align 4
15*9880d681SAndroid Build Coastguard Worker  %vecinit.i = insertelement <2 x i32> undef, i32 %tmp, i32 0
16*9880d681SAndroid Build Coastguard Worker  %vecinit2.i = insertelement <2 x i32> %vecinit.i, i32 %tmp, i32 1
17*9880d681SAndroid Build Coastguard Worker  %vcvt.i = sitofp <2 x i32> %vecinit2.i to <2 x float>
18*9880d681SAndroid Build Coastguard Worker  %div.i = fdiv <2 x float> %vcvt.i, <float 8.000000e+00, float 8.000000e+00>
19*9880d681SAndroid Build Coastguard Worker  tail call void @foo_float32x2_t(<2 x float> %div.i) nounwind
20*9880d681SAndroid Build Coastguard Worker  ret void
21*9880d681SAndroid Build Coastguard Worker}
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerdeclare void @foo_float32x2_t(<2 x float>)
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker; Test unsigned conversion.
26*9880d681SAndroid Build Coastguard Worker; CHECK: t2
27*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{vdiv|vmul}}
28*9880d681SAndroid Build Coastguard Workerdefine void @t2() nounwind {
29*9880d681SAndroid Build Coastguard Workerentry:
30*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* @uin, align 4
31*9880d681SAndroid Build Coastguard Worker  %vecinit.i = insertelement <2 x i32> undef, i32 %tmp, i32 0
32*9880d681SAndroid Build Coastguard Worker  %vecinit2.i = insertelement <2 x i32> %vecinit.i, i32 %tmp, i32 1
33*9880d681SAndroid Build Coastguard Worker  %vcvt.i = uitofp <2 x i32> %vecinit2.i to <2 x float>
34*9880d681SAndroid Build Coastguard Worker  %div.i = fdiv <2 x float> %vcvt.i, <float 8.000000e+00, float 8.000000e+00>
35*9880d681SAndroid Build Coastguard Worker  tail call void @foo_float32x2_t(<2 x float> %div.i) nounwind
36*9880d681SAndroid Build Coastguard Worker  ret void
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; Test which should not fold due to non-power of 2.
40*9880d681SAndroid Build Coastguard Worker; CHECK: t3
41*9880d681SAndroid Build Coastguard Worker; CHECK: {{vdiv|vmul}}
42*9880d681SAndroid Build Coastguard Workerdefine void @t3() nounwind {
43*9880d681SAndroid Build Coastguard Workerentry:
44*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* @iin, align 4
45*9880d681SAndroid Build Coastguard Worker  %vecinit.i = insertelement <2 x i32> undef, i32 %tmp, i32 0
46*9880d681SAndroid Build Coastguard Worker  %vecinit2.i = insertelement <2 x i32> %vecinit.i, i32 %tmp, i32 1
47*9880d681SAndroid Build Coastguard Worker  %vcvt.i = sitofp <2 x i32> %vecinit2.i to <2 x float>
48*9880d681SAndroid Build Coastguard Worker  %div.i = fdiv <2 x float> %vcvt.i, <float 0x401B333340000000, float 0x401B333340000000>
49*9880d681SAndroid Build Coastguard Worker  tail call void @foo_float32x2_t(<2 x float> %div.i) nounwind
50*9880d681SAndroid Build Coastguard Worker  ret void
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker; Test which should not fold due to power of 2 out of range.
54*9880d681SAndroid Build Coastguard Worker; CHECK: t4
55*9880d681SAndroid Build Coastguard Worker; CHECK: {{vdiv|vmul}}
56*9880d681SAndroid Build Coastguard Workerdefine void @t4() nounwind {
57*9880d681SAndroid Build Coastguard Workerentry:
58*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* @iin, align 4
59*9880d681SAndroid Build Coastguard Worker  %vecinit.i = insertelement <2 x i32> undef, i32 %tmp, i32 0
60*9880d681SAndroid Build Coastguard Worker  %vecinit2.i = insertelement <2 x i32> %vecinit.i, i32 %tmp, i32 1
61*9880d681SAndroid Build Coastguard Worker  %vcvt.i = sitofp <2 x i32> %vecinit2.i to <2 x float>
62*9880d681SAndroid Build Coastguard Worker  %div.i = fdiv <2 x float> %vcvt.i, <float 0x4200000000000000, float 0x4200000000000000>
63*9880d681SAndroid Build Coastguard Worker  tail call void @foo_float32x2_t(<2 x float> %div.i) nounwind
64*9880d681SAndroid Build Coastguard Worker  ret void
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker; Test case where const is max power of 2 (i.e., 2^32).
68*9880d681SAndroid Build Coastguard Worker; CHECK: t5
69*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{vdiv|vmul}}
70*9880d681SAndroid Build Coastguard Workerdefine void @t5() nounwind {
71*9880d681SAndroid Build Coastguard Workerentry:
72*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* @iin, align 4
73*9880d681SAndroid Build Coastguard Worker  %vecinit.i = insertelement <2 x i32> undef, i32 %tmp, i32 0
74*9880d681SAndroid Build Coastguard Worker  %vecinit2.i = insertelement <2 x i32> %vecinit.i, i32 %tmp, i32 1
75*9880d681SAndroid Build Coastguard Worker  %vcvt.i = sitofp <2 x i32> %vecinit2.i to <2 x float>
76*9880d681SAndroid Build Coastguard Worker  %div.i = fdiv <2 x float> %vcvt.i, <float 0x41F0000000000000, float 0x41F0000000000000>
77*9880d681SAndroid Build Coastguard Worker  tail call void @foo_float32x2_t(<2 x float> %div.i) nounwind
78*9880d681SAndroid Build Coastguard Worker  ret void
79*9880d681SAndroid Build Coastguard Worker}
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker; Test quadword.
82*9880d681SAndroid Build Coastguard Worker; CHECK: t6
83*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{vdiv|vmul}}
84*9880d681SAndroid Build Coastguard Workerdefine void @t6() nounwind {
85*9880d681SAndroid Build Coastguard Workerentry:
86*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* @iin, align 4
87*9880d681SAndroid Build Coastguard Worker  %vecinit.i = insertelement <4 x i32> undef, i32 %tmp, i32 0
88*9880d681SAndroid Build Coastguard Worker  %vecinit2.i = insertelement <4 x i32> %vecinit.i, i32 %tmp, i32 1
89*9880d681SAndroid Build Coastguard Worker  %vecinit4.i = insertelement <4 x i32> %vecinit2.i, i32 %tmp, i32 2
90*9880d681SAndroid Build Coastguard Worker  %vecinit6.i = insertelement <4 x i32> %vecinit4.i, i32 %tmp, i32 3
91*9880d681SAndroid Build Coastguard Worker  %vcvt.i = sitofp <4 x i32> %vecinit6.i to <4 x float>
92*9880d681SAndroid Build Coastguard Worker  %div.i = fdiv <4 x float> %vcvt.i, <float 8.000000e+00, float 8.000000e+00, float 8.000000e+00, float 8.000000e+00>
93*9880d681SAndroid Build Coastguard Worker  tail call void @foo_float32x4_t(<4 x float> %div.i) nounwind
94*9880d681SAndroid Build Coastguard Worker  ret void
95*9880d681SAndroid Build Coastguard Worker}
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerdeclare void @foo_float32x4_t(<4 x float>)
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @fix_unsigned_i16_to_float(<4 x i16> %in) {
100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fix_unsigned_i16_to_float:
101*9880d681SAndroid Build Coastguard Worker; CHECK: vmovl.u16 [[TMP:q[0-9]+]], {{d[0-9]+}}
102*9880d681SAndroid Build Coastguard Worker; CHECK: vcvt.f32.u32 {{q[0-9]+}}, [[TMP]], #1
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker    %conv = uitofp <4 x i16> %in to <4 x float>
105*9880d681SAndroid Build Coastguard Worker    %shift = fdiv <4 x float> %conv, <float 2.0, float 2.0, float 2.0, float 2.0>
106*9880d681SAndroid Build Coastguard Worker    ret <4 x float> %shift
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @fix_signed_i16_to_float(<4 x i16> %in) {
110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fix_signed_i16_to_float:
111*9880d681SAndroid Build Coastguard Worker; CHECK: vmovl.s16 [[TMP:q[0-9]+]], {{d[0-9]+}}
112*9880d681SAndroid Build Coastguard Worker; CHECK: vcvt.f32.s32 {{q[0-9]+}}, [[TMP]], #1
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Worker    %conv = sitofp <4 x i16> %in to <4 x float>
115*9880d681SAndroid Build Coastguard Worker    %shift = fdiv <4 x float> %conv, <float 2.0, float 2.0, float 2.0, float 2.0>
116*9880d681SAndroid Build Coastguard Worker    ret <4 x float> %shift
117*9880d681SAndroid Build Coastguard Worker}
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @fix_i64_to_float(<2 x i64> %in) {
120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fix_i64_to_float:
121*9880d681SAndroid Build Coastguard Worker; CHECK: bl
122*9880d681SAndroid Build Coastguard Worker; CHECK: bl
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker    %conv = uitofp <2 x i64> %in to <2 x float>
125*9880d681SAndroid Build Coastguard Worker    %shift = fdiv <2 x float> %conv, <float 2.0, float 2.0>
126*9880d681SAndroid Build Coastguard Worker    ret <2 x float> %shift
127*9880d681SAndroid Build Coastguard Worker}
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @fix_i64_to_double(<2 x i64> %in) {
130*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fix_i64_to_double:
131*9880d681SAndroid Build Coastguard Worker; CHECK: bl
132*9880d681SAndroid Build Coastguard Worker; CHECK: bl
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker    %conv = uitofp <2 x i64> %in to <2 x double>
135*9880d681SAndroid Build Coastguard Worker    %shift = fdiv <2 x double> %conv, <double 2.0, double 2.0>
136*9880d681SAndroid Build Coastguard Worker    ret <2 x double> %shift
137*9880d681SAndroid Build Coastguard Worker}
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Worker; Don't combine with 8 lanes.  Just make sure things don't crash.
140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7
141*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @test7(<8 x i32> %in) nounwind {
142*9880d681SAndroid Build Coastguard Workerentry:
143*9880d681SAndroid Build Coastguard Worker  %vcvt.i = sitofp <8 x i32> %in to <8 x float>
144*9880d681SAndroid Build Coastguard Worker  %div.i = fdiv <8 x float> %vcvt.i, <float 8.0, float 8.0, float 8.0, float 8.0, float 8.0, float 8.0, float 8.0, float 8.0>
145*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %div.i
146*9880d681SAndroid Build Coastguard Worker}
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Worker; Can combine splat with an undef.
149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8
150*9880d681SAndroid Build Coastguard Worker; CHECK: vcvt.f32.s32 q{{[0-9]+}}, q{{[0-9]+}}, #1
151*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test8(<4 x i32> %in) {
152*9880d681SAndroid Build Coastguard Worker  %vcvt.i = sitofp <4 x i32> %in to <4 x float>
153*9880d681SAndroid Build Coastguard Worker  %div.i = fdiv <4 x float> %vcvt.i, <float 2.0, float 2.0, float 2.0, float undef>
154*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %div.i
155*9880d681SAndroid Build Coastguard Worker}
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_illegal_int_to_fp:
158*9880d681SAndroid Build Coastguard Worker; CHECK: vcvt.f32.s32
159*9880d681SAndroid Build Coastguard Workerdefine <3 x float> @test_illegal_int_to_fp(<3 x i32> %in) {
160*9880d681SAndroid Build Coastguard Worker  %conv = sitofp <3 x i32> %in to <3 x float>
161*9880d681SAndroid Build Coastguard Worker  %res = fdiv <3 x float> %conv, <float 4.0, float 4.0, float 4.0>
162*9880d681SAndroid Build Coastguard Worker  ret <3 x float> %res
163*9880d681SAndroid Build Coastguard Worker}