xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/fcvt-int.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -o - %s -mtriple=arm64-apple-ios7.0 | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine i32 @test_floattoi32(float %in) {
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_floattoi32:
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker  %signed = fptosi float %in to i32
7*9880d681SAndroid Build Coastguard Worker  %unsigned = fptoui float %in to i32
8*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvtzu [[UNSIG:w[0-9]+]], {{s[0-9]+}}
9*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvtzs [[SIG:w[0-9]+]], {{s[0-9]+}}
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Worker  %res = sub i32 %signed, %unsigned
12*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{w[0-9]+}}, [[SIG]], [[UNSIG]]
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker  ret i32 %res
15*9880d681SAndroid Build Coastguard Worker; CHECK: ret
16*9880d681SAndroid Build Coastguard Worker}
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerdefine i32 @test_doubletoi32(double %in) {
19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_doubletoi32:
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker  %signed = fptosi double %in to i32
22*9880d681SAndroid Build Coastguard Worker  %unsigned = fptoui double %in to i32
23*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvtzu [[UNSIG:w[0-9]+]], {{d[0-9]+}}
24*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvtzs [[SIG:w[0-9]+]], {{d[0-9]+}}
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker  %res = sub i32 %signed, %unsigned
27*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{w[0-9]+}}, [[SIG]], [[UNSIG]]
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker  ret i32 %res
30*9880d681SAndroid Build Coastguard Worker; CHECK: ret
31*9880d681SAndroid Build Coastguard Worker}
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerdefine i64 @test_floattoi64(float %in) {
34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_floattoi64:
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker  %signed = fptosi float %in to i64
37*9880d681SAndroid Build Coastguard Worker  %unsigned = fptoui float %in to i64
38*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvtzu [[UNSIG:x[0-9]+]], {{s[0-9]+}}
39*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvtzs [[SIG:x[0-9]+]], {{s[0-9]+}}
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker  %res = sub i64 %signed, %unsigned
42*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, [[SIG]], [[UNSIG]]
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker  ret i64 %res
45*9880d681SAndroid Build Coastguard Worker; CHECK: ret
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerdefine i64 @test_doubletoi64(double %in) {
49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_doubletoi64:
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker  %signed = fptosi double %in to i64
52*9880d681SAndroid Build Coastguard Worker  %unsigned = fptoui double %in to i64
53*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvtzu [[UNSIG:x[0-9]+]], {{d[0-9]+}}
54*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fcvtzs [[SIG:x[0-9]+]], {{d[0-9]+}}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker  %res = sub i64 %signed, %unsigned
57*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{x[0-9]+}}, [[SIG]], [[UNSIG]]
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker  ret i64 %res
60*9880d681SAndroid Build Coastguard Worker; CHECK: ret
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerdefine float @test_i32tofloat(i32 %in) {
64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i32tofloat:
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker  %signed = sitofp i32 %in to float
67*9880d681SAndroid Build Coastguard Worker  %unsigned = uitofp i32 %in to float
68*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ucvtf [[UNSIG:s[0-9]+]], {{w[0-9]+}}
69*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: scvtf [[SIG:s[0-9]+]], {{w[0-9]+}}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker  %res = fsub float %signed, %unsigned
72*9880d681SAndroid Build Coastguard Worker; CHECK: fsub {{s[0-9]+}}, [[SIG]], [[UNSIG]]
73*9880d681SAndroid Build Coastguard Worker  ret float %res
74*9880d681SAndroid Build Coastguard Worker; CHECK: ret
75*9880d681SAndroid Build Coastguard Worker}
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerdefine double @test_i32todouble(i32 %in) {
78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i32todouble:
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker  %signed = sitofp i32 %in to double
81*9880d681SAndroid Build Coastguard Worker  %unsigned = uitofp i32 %in to double
82*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ucvtf [[UNSIG:d[0-9]+]], {{w[0-9]+}}
83*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: scvtf [[SIG:d[0-9]+]], {{w[0-9]+}}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker  %res = fsub double %signed, %unsigned
86*9880d681SAndroid Build Coastguard Worker; CHECK: fsub {{d[0-9]+}}, [[SIG]], [[UNSIG]]
87*9880d681SAndroid Build Coastguard Worker  ret double %res
88*9880d681SAndroid Build Coastguard Worker; CHECK: ret
89*9880d681SAndroid Build Coastguard Worker}
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerdefine float @test_i64tofloat(i64 %in) {
92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i64tofloat:
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker  %signed = sitofp i64 %in to float
95*9880d681SAndroid Build Coastguard Worker  %unsigned = uitofp i64 %in to float
96*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ucvtf [[UNSIG:s[0-9]+]], {{x[0-9]+}}
97*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: scvtf [[SIG:s[0-9]+]], {{x[0-9]+}}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Worker  %res = fsub float %signed, %unsigned
100*9880d681SAndroid Build Coastguard Worker; CHECK: fsub {{s[0-9]+}}, [[SIG]], [[UNSIG]]
101*9880d681SAndroid Build Coastguard Worker  ret float %res
102*9880d681SAndroid Build Coastguard Worker; CHECK: ret
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerdefine double @test_i64todouble(i64 %in) {
106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i64todouble:
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker  %signed = sitofp i64 %in to double
109*9880d681SAndroid Build Coastguard Worker  %unsigned = uitofp i64 %in to double
110*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ucvtf [[UNSIG:d[0-9]+]], {{x[0-9]+}}
111*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: scvtf [[SIG:d[0-9]+]], {{x[0-9]+}}
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker  %res = fsub double %signed, %unsigned
114*9880d681SAndroid Build Coastguard Worker; CHECK: sub {{d[0-9]+}}, [[SIG]], [[UNSIG]]
115*9880d681SAndroid Build Coastguard Worker  ret double %res
116*9880d681SAndroid Build Coastguard Worker; CHECK: ret
117*9880d681SAndroid Build Coastguard Worker}
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerdefine i32 @test_bitcastfloattoi32(float %in) {
120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_bitcastfloattoi32:
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker   %res = bitcast float %in to i32
123*9880d681SAndroid Build Coastguard Worker; CHECK: fmov {{w[0-9]+}}, {{s[0-9]+}}
124*9880d681SAndroid Build Coastguard Worker   ret i32 %res
125*9880d681SAndroid Build Coastguard Worker}
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workerdefine i64 @test_bitcastdoubletoi64(double %in) {
128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_bitcastdoubletoi64:
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker   %res = bitcast double %in to i64
131*9880d681SAndroid Build Coastguard Worker; CHECK: fmov {{x[0-9]+}}, {{d[0-9]+}}
132*9880d681SAndroid Build Coastguard Worker   ret i64 %res
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerdefine float @test_bitcasti32tofloat(i32 %in) {
136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_bitcasti32tofloat:
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker   %res = bitcast i32 %in to float
139*9880d681SAndroid Build Coastguard Worker; CHECK: fmov {{s[0-9]+}}, {{w[0-9]+}}
140*9880d681SAndroid Build Coastguard Worker   ret float %res
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Worker}
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerdefine double @test_bitcasti64todouble(i64 %in) {
145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_bitcasti64todouble:
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker   %res = bitcast i64 %in to double
148*9880d681SAndroid Build Coastguard Worker; CHECK: fmov {{d[0-9]+}}, {{x[0-9]+}}
149*9880d681SAndroid Build Coastguard Worker   ret double %res
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker}
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Workerdefine double @bitcast_fabs(double %x) {
154*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bitcast_fabs:
155*9880d681SAndroid Build Coastguard Worker; CHECK:       ; BB#0:
156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fabs d0, d0
157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
158*9880d681SAndroid Build Coastguard Worker;
159*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast double %x to i64
160*9880d681SAndroid Build Coastguard Worker  %and = and i64 %bc1, 9223372036854775807
161*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast i64 %and to double
162*9880d681SAndroid Build Coastguard Worker  ret double %bc2
163*9880d681SAndroid Build Coastguard Worker}
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Workerdefine float @bitcast_fneg(float %x) {
166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: bitcast_fneg:
167*9880d681SAndroid Build Coastguard Worker; CHECK:       ; BB#0:
168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fneg s0, s0
169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
170*9880d681SAndroid Build Coastguard Worker;
171*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast float %x to i32
172*9880d681SAndroid Build Coastguard Worker  %xor = xor i32 %bc1, 2147483648
173*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast i32 %xor to float
174*9880d681SAndroid Build Coastguard Worker  ret float %bc2
175*9880d681SAndroid Build Coastguard Worker}
176*9880d681SAndroid Build Coastguard Worker
177