1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s
3 ; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s
4 ; RUN: llc -mattr=+sme2p2 -force-streaming-compatible < %s | FileCheck %s --check-prefix=USE-NEON-NO-GPRS
5 ; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE
7 target triple = "aarch64-unknown-linux-gnu"
9 define double @t1(double %x) {
11 ; CHECK: // %bb.0: // %entry
12 ; CHECK-NEXT: ptrue p0.d
13 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
14 ; CHECK-NEXT: fcvtzs z0.d, p0/m, z0.d
15 ; CHECK-NEXT: scvtf z0.d, p0/m, z0.d
16 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
19 ; USE-NEON-NO-GPRS-LABEL: t1:
20 ; USE-NEON-NO-GPRS: // %bb.0: // %entry
21 ; USE-NEON-NO-GPRS-NEXT: fcvtzs d0, d0
22 ; USE-NEON-NO-GPRS-NEXT: scvtf d0, d0
23 ; USE-NEON-NO-GPRS-NEXT: ret
25 ; NONEON-NOSVE-LABEL: t1:
26 ; NONEON-NOSVE: // %bb.0: // %entry
27 ; NONEON-NOSVE-NEXT: fcvtzs x8, d0
28 ; NONEON-NOSVE-NEXT: scvtf d0, x8
29 ; NONEON-NOSVE-NEXT: ret
31 %conv = fptosi double %x to i64
32 %conv1 = sitofp i64 %conv to double
36 define float @t2(float %x) {
38 ; CHECK: // %bb.0: // %entry
39 ; CHECK-NEXT: ptrue p0.s
40 ; CHECK-NEXT: // kill: def $s0 killed $s0 def $z0
41 ; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.s
42 ; CHECK-NEXT: scvtf z0.s, p0/m, z0.s
43 ; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0
46 ; USE-NEON-NO-GPRS-LABEL: t2:
47 ; USE-NEON-NO-GPRS: // %bb.0: // %entry
48 ; USE-NEON-NO-GPRS-NEXT: fcvtzs s0, s0
49 ; USE-NEON-NO-GPRS-NEXT: scvtf s0, s0
50 ; USE-NEON-NO-GPRS-NEXT: ret
52 ; NONEON-NOSVE-LABEL: t2:
53 ; NONEON-NOSVE: // %bb.0: // %entry
54 ; NONEON-NOSVE-NEXT: fcvtzs w8, s0
55 ; NONEON-NOSVE-NEXT: scvtf s0, w8
56 ; NONEON-NOSVE-NEXT: ret
58 %conv = fptosi float %x to i32
59 %conv1 = sitofp i32 %conv to float
63 define half @t3(half %x) {
65 ; CHECK: // %bb.0: // %entry
66 ; CHECK-NEXT: ptrue p0.s
67 ; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0
68 ; CHECK-NEXT: fcvtzs z0.s, p0/m, z0.h
69 ; CHECK-NEXT: scvtf z0.h, p0/m, z0.s
70 ; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0
73 ; NONEON-NOSVE-LABEL: t3:
74 ; NONEON-NOSVE: // %bb.0: // %entry
75 ; NONEON-NOSVE-NEXT: fcvt s0, h0
76 ; NONEON-NOSVE-NEXT: fcvtzs w8, s0
77 ; NONEON-NOSVE-NEXT: scvtf s0, w8
78 ; NONEON-NOSVE-NEXT: fcvt h0, s0
79 ; NONEON-NOSVE-NEXT: ret
81 %conv = fptosi half %x to i32
82 %conv1 = sitofp i32 %conv to half
86 define double @t4(double %x) {
88 ; CHECK: // %bb.0: // %entry
89 ; CHECK-NEXT: ptrue p0.d
90 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
91 ; CHECK-NEXT: fcvtzu z0.d, p0/m, z0.d
92 ; CHECK-NEXT: ucvtf z0.d, p0/m, z0.d
93 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
96 ; USE-NEON-NO-GPRS-LABEL: t4:
97 ; USE-NEON-NO-GPRS: // %bb.0: // %entry
98 ; USE-NEON-NO-GPRS-NEXT: fcvtzu d0, d0
99 ; USE-NEON-NO-GPRS-NEXT: ucvtf d0, d0
100 ; USE-NEON-NO-GPRS-NEXT: ret
102 ; NONEON-NOSVE-LABEL: t4:
103 ; NONEON-NOSVE: // %bb.0: // %entry
104 ; NONEON-NOSVE-NEXT: fcvtzu x8, d0
105 ; NONEON-NOSVE-NEXT: ucvtf d0, x8
106 ; NONEON-NOSVE-NEXT: ret
108 %conv = fptoui double %x to i64
109 %conv1 = uitofp i64 %conv to double
113 define float @t5(float %x) {
115 ; CHECK: // %bb.0: // %entry
116 ; CHECK-NEXT: ptrue p0.s
117 ; CHECK-NEXT: // kill: def $s0 killed $s0 def $z0
118 ; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.s
119 ; CHECK-NEXT: ucvtf z0.s, p0/m, z0.s
120 ; CHECK-NEXT: // kill: def $s0 killed $s0 killed $z0
123 ; USE-NEON-NO-GPRS-LABEL: t5:
124 ; USE-NEON-NO-GPRS: // %bb.0: // %entry
125 ; USE-NEON-NO-GPRS-NEXT: fcvtzu s0, s0
126 ; USE-NEON-NO-GPRS-NEXT: ucvtf s0, s0
127 ; USE-NEON-NO-GPRS-NEXT: ret
129 ; NONEON-NOSVE-LABEL: t5:
130 ; NONEON-NOSVE: // %bb.0: // %entry
131 ; NONEON-NOSVE-NEXT: fcvtzu w8, s0
132 ; NONEON-NOSVE-NEXT: ucvtf s0, w8
133 ; NONEON-NOSVE-NEXT: ret
135 %conv = fptoui float %x to i32
136 %conv1 = uitofp i32 %conv to float
140 define half @t6(half %x) {
142 ; CHECK: // %bb.0: // %entry
143 ; CHECK-NEXT: ptrue p0.s
144 ; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0
145 ; CHECK-NEXT: fcvtzu z0.s, p0/m, z0.h
146 ; CHECK-NEXT: ucvtf z0.h, p0/m, z0.s
147 ; CHECK-NEXT: // kill: def $h0 killed $h0 killed $z0
150 ; NONEON-NOSVE-LABEL: t6:
151 ; NONEON-NOSVE: // %bb.0: // %entry
152 ; NONEON-NOSVE-NEXT: fcvt s0, h0
153 ; NONEON-NOSVE-NEXT: fcvtzu w8, s0
154 ; NONEON-NOSVE-NEXT: ucvtf s0, w8
155 ; NONEON-NOSVE-NEXT: fcvt h0, s0
156 ; NONEON-NOSVE-NEXT: ret
158 %conv = fptoui half %x to i32
159 %conv1 = uitofp i32 %conv to half