xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/fdiv_combine.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-linux-gnu -aarch64-neon-syntax=apple -verify-machineinstrs -o - %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Test signed conversion.
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1
5*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.2s v0, v0, #4
6*9880d681SAndroid Build Coastguard Worker; CHECK: ret
7*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test1(<2 x i32> %in) {
8*9880d681SAndroid Build Coastguard Workerentry:
9*9880d681SAndroid Build Coastguard Worker  %vcvt.i = sitofp <2 x i32> %in to <2 x float>
10*9880d681SAndroid Build Coastguard Worker  %div.i = fdiv <2 x float> %vcvt.i, <float 16.0, float 16.0>
11*9880d681SAndroid Build Coastguard Worker  ret <2 x float> %div.i
12*9880d681SAndroid Build Coastguard Worker}
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker; Test unsigned conversion.
15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2
16*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf.2s v0, v0, #3
17*9880d681SAndroid Build Coastguard Worker; CHECK: ret
18*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test2(<2 x i32> %in) {
19*9880d681SAndroid Build Coastguard Workerentry:
20*9880d681SAndroid Build Coastguard Worker  %vcvt.i = uitofp <2 x i32> %in to <2 x float>
21*9880d681SAndroid Build Coastguard Worker  %div.i = fdiv <2 x float> %vcvt.i, <float 8.0, float 8.0>
22*9880d681SAndroid Build Coastguard Worker  ret <2 x float> %div.i
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker; Test which should not fold due to non-power of 2.
26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3
27*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.2s v0, v0
28*9880d681SAndroid Build Coastguard Worker; CHECK: fmov.2s v1, #9.00000000
29*9880d681SAndroid Build Coastguard Worker; CHECK: fdiv.2s v0, v0, v1
30*9880d681SAndroid Build Coastguard Worker; CHECK: ret
31*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test3(<2 x i32> %in) {
32*9880d681SAndroid Build Coastguard Workerentry:
33*9880d681SAndroid Build Coastguard Worker  %vcvt.i = sitofp <2 x i32> %in to <2 x float>
34*9880d681SAndroid Build Coastguard Worker  %div.i = fdiv <2 x float> %vcvt.i, <float 9.0, float 9.0>
35*9880d681SAndroid Build Coastguard Worker  ret <2 x float> %div.i
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker; Test which should not fold due to power of 2 out of range.
39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4
40*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.2s v0, v0
41*9880d681SAndroid Build Coastguard Worker; CHECK: movi.2s v1, #80, lsl #24
42*9880d681SAndroid Build Coastguard Worker; CHECK: fdiv.2s v0, v0, v1
43*9880d681SAndroid Build Coastguard Worker; CHECK: ret
44*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test4(<2 x i32> %in) {
45*9880d681SAndroid Build Coastguard Workerentry:
46*9880d681SAndroid Build Coastguard Worker  %vcvt.i = sitofp <2 x i32> %in to <2 x float>
47*9880d681SAndroid Build Coastguard Worker  %div.i = fdiv <2 x float> %vcvt.i, <float 0x4200000000000000, float 0x4200000000000000>
48*9880d681SAndroid Build Coastguard Worker  ret <2 x float> %div.i
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker; Test case where const is max power of 2 (i.e., 2^32).
52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5
53*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.2s v0, v0, #32
54*9880d681SAndroid Build Coastguard Worker; CHECK: ret
55*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test5(<2 x i32> %in) {
56*9880d681SAndroid Build Coastguard Workerentry:
57*9880d681SAndroid Build Coastguard Worker  %vcvt.i = sitofp <2 x i32> %in to <2 x float>
58*9880d681SAndroid Build Coastguard Worker  %div.i = fdiv <2 x float> %vcvt.i, <float 0x41F0000000000000, float 0x41F0000000000000>
59*9880d681SAndroid Build Coastguard Worker  ret <2 x float> %div.i
60*9880d681SAndroid Build Coastguard Worker}
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker; Test quadword.
63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6
64*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.4s v0, v0, #2
65*9880d681SAndroid Build Coastguard Worker; CHECK: ret
66*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test6(<4 x i32> %in) {
67*9880d681SAndroid Build Coastguard Workerentry:
68*9880d681SAndroid Build Coastguard Worker  %vcvt.i = sitofp <4 x i32> %in to <4 x float>
69*9880d681SAndroid Build Coastguard Worker  %div.i = fdiv <4 x float> %vcvt.i, <float 4.0, float 4.0, float 4.0, float 4.0>
70*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %div.i
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker; Test unsigned i16 to float
74*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7
75*9880d681SAndroid Build Coastguard Worker; CHECK: ushll.4s  v0, v0, #0
76*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf.4s  v0, v0, #1
77*9880d681SAndroid Build Coastguard Worker; CHECK: ret
78*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test7(<4 x i16> %in) {
79*9880d681SAndroid Build Coastguard Worker  %conv = uitofp <4 x i16> %in to <4 x float>
80*9880d681SAndroid Build Coastguard Worker  %shift = fdiv <4 x float> %conv, <float 2.0, float 2.0, float 2.0, float 2.0>
81*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %shift
82*9880d681SAndroid Build Coastguard Worker}
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker; Test signed i16 to float
85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8
86*9880d681SAndroid Build Coastguard Worker; CHECK: sshll.4s v0, v0, #0
87*9880d681SAndroid Build Coastguard Worker; CHECK: scvtf.4s v0, v0, #2
88*9880d681SAndroid Build Coastguard Worker; CHECK: ret
89*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test8(<4 x i16> %in) {
90*9880d681SAndroid Build Coastguard Worker  %conv = sitofp <4 x i16> %in to <4 x float>
91*9880d681SAndroid Build Coastguard Worker  %shift = fdiv <4 x float> %conv, <float 4.0, float 4.0, float 4.0, float 4.0>
92*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %shift
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker; Can't convert i64 to float.
96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9
97*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf.2d v0, v0
98*9880d681SAndroid Build Coastguard Worker; CHECK: fcvtn v0.2s, v0.2d
99*9880d681SAndroid Build Coastguard Worker; CHECK: movi.2s v1, #64, lsl #24
100*9880d681SAndroid Build Coastguard Worker; CHECK: fdiv.2s v0, v0, v1
101*9880d681SAndroid Build Coastguard Worker; CHECK: ret
102*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test9(<2 x i64> %in) {
103*9880d681SAndroid Build Coastguard Worker  %conv = uitofp <2 x i64> %in to <2 x float>
104*9880d681SAndroid Build Coastguard Worker  %shift = fdiv <2 x float> %conv, <float 2.0, float 2.0>
105*9880d681SAndroid Build Coastguard Worker  ret <2 x float> %shift
106*9880d681SAndroid Build Coastguard Worker}
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10
109*9880d681SAndroid Build Coastguard Worker; CHECK: ucvtf.2d v0, v0, #1
110*9880d681SAndroid Build Coastguard Worker; CHECK: ret
111*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test10(<2 x i64> %in) {
112*9880d681SAndroid Build Coastguard Worker  %conv = uitofp <2 x i64> %in to <2 x double>
113*9880d681SAndroid Build Coastguard Worker  %shift = fdiv <2 x double> %conv, <double 2.0, double 2.0>
114*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %shift
115*9880d681SAndroid Build Coastguard Worker}
116