@@ -32,6 +32,208 @@ entry:
32
32
ret half %c
33
33
}
34
34
35
+
36
+ define half @fptrunc_f128_f16 (fp128 %a ) {
37
+ ; CHECK-SD-LABEL: fptrunc_f128_f16:
38
+ ; CHECK-SD: // %bb.0: // %entry
39
+ ; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
40
+ ; CHECK-SD-NEXT: .cfi_def_cfa_offset 16
41
+ ; CHECK-SD-NEXT: .cfi_offset w30, -16
42
+ ; CHECK-SD-NEXT: bl __trunctfhf2
43
+ ; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
44
+ ; CHECK-SD-NEXT: ret
45
+ ;
46
+ ; CHECK-GI-LABEL: fptrunc_f128_f16:
47
+ ; CHECK-GI: // %bb.0: // %entry
48
+ ; CHECK-GI-NEXT: b __trunctfhf2
49
+ entry:
50
+ %c = fptrunc fp128 %a to half
51
+ ret half %c
52
+ }
53
+
54
+ define float @fptrunc_f128_f32 (fp128 %a ) {
55
+ ; CHECK-SD-LABEL: fptrunc_f128_f32:
56
+ ; CHECK-SD: // %bb.0: // %entry
57
+ ; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
58
+ ; CHECK-SD-NEXT: .cfi_def_cfa_offset 16
59
+ ; CHECK-SD-NEXT: .cfi_offset w30, -16
60
+ ; CHECK-SD-NEXT: bl __trunctfsf2
61
+ ; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
62
+ ; CHECK-SD-NEXT: ret
63
+ ;
64
+ ; CHECK-GI-LABEL: fptrunc_f128_f32:
65
+ ; CHECK-GI: // %bb.0: // %entry
66
+ ; CHECK-GI-NEXT: b __trunctfsf2
67
+ entry:
68
+ %c = fptrunc fp128 %a to float
69
+ ret float %c
70
+ }
71
+
72
+ define double @fptrunc_f128_f64 (fp128 %a ) {
73
+ ; CHECK-SD-LABEL: fptrunc_f128_f64:
74
+ ; CHECK-SD: // %bb.0: // %entry
75
+ ; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
76
+ ; CHECK-SD-NEXT: .cfi_def_cfa_offset 16
77
+ ; CHECK-SD-NEXT: .cfi_offset w30, -16
78
+ ; CHECK-SD-NEXT: bl __trunctfdf2
79
+ ; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
80
+ ; CHECK-SD-NEXT: ret
81
+ ;
82
+ ; CHECK-GI-LABEL: fptrunc_f128_f64:
83
+ ; CHECK-GI: // %bb.0: // %entry
84
+ ; CHECK-GI-NEXT: b __trunctfdf2
85
+ entry:
86
+ %c = fptrunc fp128 %a to double
87
+ ret double %c
88
+ }
89
+
90
+ define <2 x half > @fptrunc_v2f128_v2f16 (<2 x fp128 > %a ) {
91
+ ; CHECK-SD-LABEL: fptrunc_v2f128_v2f16:
92
+ ; CHECK-SD: // %bb.0: // %entry
93
+ ; CHECK-SD-NEXT: sub sp, sp, #48
94
+ ; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
95
+ ; CHECK-SD-NEXT: .cfi_def_cfa_offset 48
96
+ ; CHECK-SD-NEXT: .cfi_offset w30, -16
97
+ ; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
98
+ ; CHECK-SD-NEXT: mov v0.16b, v1.16b
99
+ ; CHECK-SD-NEXT: bl __trunctfhf2
100
+ ; CHECK-SD-NEXT: // kill: def $h0 killed $h0 def $q0
101
+ ; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
102
+ ; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
103
+ ; CHECK-SD-NEXT: bl __trunctfhf2
104
+ ; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
105
+ ; CHECK-SD-NEXT: // kill: def $h0 killed $h0 def $q0
106
+ ; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
107
+ ; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]
108
+ ; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
109
+ ; CHECK-SD-NEXT: add sp, sp, #48
110
+ ; CHECK-SD-NEXT: ret
111
+ ;
112
+ ; CHECK-GI-LABEL: fptrunc_v2f128_v2f16:
113
+ ; CHECK-GI: // %bb.0: // %entry
114
+ ; CHECK-GI-NEXT: sub sp, sp, #64
115
+ ; CHECK-GI-NEXT: str x30, [sp, #48] // 8-byte Folded Spill
116
+ ; CHECK-GI-NEXT: .cfi_def_cfa_offset 64
117
+ ; CHECK-GI-NEXT: .cfi_offset w30, -16
118
+ ; CHECK-GI-NEXT: mov v2.d[0], x8
119
+ ; CHECK-GI-NEXT: str q1, [sp] // 16-byte Folded Spill
120
+ ; CHECK-GI-NEXT: mov v2.d[1], x8
121
+ ; CHECK-GI-NEXT: str q2, [sp, #32] // 16-byte Folded Spill
122
+ ; CHECK-GI-NEXT: bl __trunctfhf2
123
+ ; CHECK-GI-NEXT: // kill: def $h0 killed $h0 def $q0
124
+ ; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
125
+ ; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
126
+ ; CHECK-GI-NEXT: bl __trunctfhf2
127
+ ; CHECK-GI-NEXT: // kill: def $h0 killed $h0 def $q0
128
+ ; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
129
+ ; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload
130
+ ; CHECK-GI-NEXT: bl __trunctfhf2
131
+ ; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload
132
+ ; CHECK-GI-NEXT: bl __trunctfhf2
133
+ ; CHECK-GI-NEXT: ldp q1, q0, [sp] // 32-byte Folded Reload
134
+ ; CHECK-GI-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload
135
+ ; CHECK-GI-NEXT: mov v0.h[1], v1.h[0]
136
+ ; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
137
+ ; CHECK-GI-NEXT: add sp, sp, #64
138
+ ; CHECK-GI-NEXT: ret
139
+ entry:
140
+ %c = fptrunc <2 x fp128 > %a to <2 x half >
141
+ ret <2 x half > %c
142
+ }
143
+
144
+
145
+ define <2 x float > @fptrunc_v2f128_v2f32 (<2 x fp128 > %a ) {
146
+ ; CHECK-SD-LABEL: fptrunc_v2f128_v2f32:
147
+ ; CHECK-SD: // %bb.0: // %entry
148
+ ; CHECK-SD-NEXT: sub sp, sp, #48
149
+ ; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
150
+ ; CHECK-SD-NEXT: .cfi_def_cfa_offset 48
151
+ ; CHECK-SD-NEXT: .cfi_offset w30, -16
152
+ ; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
153
+ ; CHECK-SD-NEXT: mov v0.16b, v1.16b
154
+ ; CHECK-SD-NEXT: bl __trunctfsf2
155
+ ; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
156
+ ; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
157
+ ; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
158
+ ; CHECK-SD-NEXT: bl __trunctfsf2
159
+ ; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
160
+ ; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0
161
+ ; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
162
+ ; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]
163
+ ; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
164
+ ; CHECK-SD-NEXT: add sp, sp, #48
165
+ ; CHECK-SD-NEXT: ret
166
+ ;
167
+ ; CHECK-GI-LABEL: fptrunc_v2f128_v2f32:
168
+ ; CHECK-GI: // %bb.0: // %entry
169
+ ; CHECK-GI-NEXT: sub sp, sp, #48
170
+ ; CHECK-GI-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
171
+ ; CHECK-GI-NEXT: .cfi_def_cfa_offset 48
172
+ ; CHECK-GI-NEXT: .cfi_offset w30, -16
173
+ ; CHECK-GI-NEXT: str q1, [sp] // 16-byte Folded Spill
174
+ ; CHECK-GI-NEXT: bl __trunctfsf2
175
+ ; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
176
+ ; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
177
+ ; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
178
+ ; CHECK-GI-NEXT: bl __trunctfsf2
179
+ ; CHECK-GI-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
180
+ ; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0
181
+ ; CHECK-GI-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
182
+ ; CHECK-GI-NEXT: mov v1.s[1], v0.s[0]
183
+ ; CHECK-GI-NEXT: fmov d0, d1
184
+ ; CHECK-GI-NEXT: add sp, sp, #48
185
+ ; CHECK-GI-NEXT: ret
186
+ entry:
187
+ %c = fptrunc <2 x fp128 > %a to <2 x float >
188
+ ret <2 x float > %c
189
+ }
190
+
191
+
192
+ define <2 x double > @fptrunc_v2f128_v2f64 (<2 x fp128 > %a ) {
193
+ ; CHECK-SD-LABEL: fptrunc_v2f128_v2f64:
194
+ ; CHECK-SD: // %bb.0: // %entry
195
+ ; CHECK-SD-NEXT: sub sp, sp, #48
196
+ ; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
197
+ ; CHECK-SD-NEXT: .cfi_def_cfa_offset 48
198
+ ; CHECK-SD-NEXT: .cfi_offset w30, -16
199
+ ; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
200
+ ; CHECK-SD-NEXT: mov v0.16b, v1.16b
201
+ ; CHECK-SD-NEXT: bl __trunctfdf2
202
+ ; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
203
+ ; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
204
+ ; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
205
+ ; CHECK-SD-NEXT: bl __trunctfdf2
206
+ ; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
207
+ ; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
208
+ ; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
209
+ ; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]
210
+ ; CHECK-SD-NEXT: add sp, sp, #48
211
+ ; CHECK-SD-NEXT: ret
212
+ ;
213
+ ; CHECK-GI-LABEL: fptrunc_v2f128_v2f64:
214
+ ; CHECK-GI: // %bb.0: // %entry
215
+ ; CHECK-GI-NEXT: sub sp, sp, #48
216
+ ; CHECK-GI-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
217
+ ; CHECK-GI-NEXT: .cfi_def_cfa_offset 48
218
+ ; CHECK-GI-NEXT: .cfi_offset w30, -16
219
+ ; CHECK-GI-NEXT: str q1, [sp] // 16-byte Folded Spill
220
+ ; CHECK-GI-NEXT: bl __trunctfdf2
221
+ ; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
222
+ ; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
223
+ ; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
224
+ ; CHECK-GI-NEXT: bl __trunctfdf2
225
+ ; CHECK-GI-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload
226
+ ; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
227
+ ; CHECK-GI-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
228
+ ; CHECK-GI-NEXT: mov v1.d[1], v0.d[0]
229
+ ; CHECK-GI-NEXT: mov v0.16b, v1.16b
230
+ ; CHECK-GI-NEXT: add sp, sp, #48
231
+ ; CHECK-GI-NEXT: ret
232
+ entry:
233
+ %c = fptrunc <2 x fp128 > %a to <2 x double >
234
+ ret <2 x double > %c
235
+ }
236
+
35
237
define <2 x float > @fptrunc_v2f64_v2f32 (<2 x double > %a ) {
36
238
; CHECK-LABEL: fptrunc_v2f64_v2f32:
37
239
; CHECK: // %bb.0: // %entry
0 commit comments