xref: /llvm-project/llvm/test/CodeGen/AArch64/float-conv-elim.ll (revision 747c6a0c734e618db8132b503f432d8274cc56b5)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=aarch64-- < %s | FileCheck %s
3
4define i32 @s32_f32_s24_s32(i32 %a) {
5; CHECK-LABEL: s32_f32_s24_s32:
6; CHECK:       // %bb.0:
7; CHECK-NEXT:    sbfx w0, w0, #0, #24
8; CHECK-NEXT:    ret
9  %f = sitofp i32 %a to float
10  %i = fptosi float %f to i24
11  %r = sext i24 %i to i32
12  ret i32 %r
13}
14
15define i32 @s32_f32_u24_u32(i32 %a) {
16; CHECK-LABEL: s32_f32_u24_u32:
17; CHECK:       // %bb.0:
18; CHECK-NEXT:    and w0, w0, #0xffffff
19; CHECK-NEXT:    ret
20  %f = sitofp i32 %a to float
21  %i = fptoui float %f to i24
22  %r = zext i24 %i to i32
23  ret i32 %r
24}
25
26define i32 @u32_f32_s24_s32(i32 %a) {
27; CHECK-LABEL: u32_f32_s24_s32:
28; CHECK:       // %bb.0:
29; CHECK-NEXT:    sbfx w0, w0, #0, #24
30; CHECK-NEXT:    ret
31  %f = uitofp i32 %a to float
32  %i = fptosi float %f to i24
33  %r = sext i24 %i to i32
34  ret i32 %r
35}
36
37define i32 @u32_f32_u24_u32(i32 %a) {
38; CHECK-LABEL: u32_f32_u24_u32:
39; CHECK:       // %bb.0:
40; CHECK-NEXT:    and w0, w0, #0xffffff
41; CHECK-NEXT:    ret
42  %f = uitofp i32 %a to float
43  %i = fptoui float %f to i24
44  %r = zext i24 %i to i32
45  ret i32 %r
46}
47
48; This requires converting to FP and back.
49
50define i32 @s32_f32_s25_s32(i32 %a) {
51; CHECK-LABEL: s32_f32_s25_s32:
52; CHECK:       // %bb.0:
53; CHECK-NEXT:    scvtf s0, w0
54; CHECK-NEXT:    fcvtzs w0, s0
55; CHECK-NEXT:    ret
56  %f = sitofp i32 %a to float
57  %i = fptosi float %f to i25
58  %r = sext i25 %i to i32
59  ret i32 %r
60}
61
62define i32 @s32_f32_u25_u32(i32 %a) {
63; CHECK-LABEL: s32_f32_u25_u32:
64; CHECK:       // %bb.0:
65; CHECK-NEXT:    scvtf s0, w0
66; CHECK-NEXT:    fcvtzs w0, s0
67; CHECK-NEXT:    ret
68  %f = sitofp i32 %a to float
69  %i = fptoui float %f to i25
70  %r = zext i25 %i to i32
71  ret i32 %r
72}
73
74; TODO: This could avoid converting to FP.
75
76define i32 @u32_f32_s25_s32(i32 %a) {
77; CHECK-LABEL: u32_f32_s25_s32:
78; CHECK:       // %bb.0:
79; CHECK-NEXT:    ucvtf s0, w0
80; CHECK-NEXT:    fcvtzs w0, s0
81; CHECK-NEXT:    ret
82  %f = uitofp i32 %a to float
83  %i = fptosi float %f to i25
84  %r = sext i25 %i to i32
85  ret i32 %r
86}
87
88define i32 @u32_f32_u25_u32(i32 %a) {
89; CHECK-LABEL: u32_f32_u25_u32:
90; CHECK:       // %bb.0:
91; CHECK-NEXT:    ucvtf s0, w0
92; CHECK-NEXT:    fcvtzs w0, s0
93; CHECK-NEXT:    ret
94  %f = uitofp i32 %a to float
95  %i = fptoui float %f to i25
96  %r = zext i25 %i to i32
97  ret i32 %r
98}
99