Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 753fb07

Browse files
committedJun 21, 2024··
Add f16 inline ASM support for 32-bit ARM
1 parent 12b33d3 commit 753fb07

File tree

3 files changed

+365
-183
lines changed

3 files changed

+365
-183
lines changed
 

‎compiler/rustc_codegen_llvm/src/asm.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,6 +1020,19 @@ fn llvm_fixup_input<'ll, 'tcx>(
10201020
value
10211021
}
10221022
}
1023+
(
1024+
InlineAsmRegClass::Arm(
1025+
ArmInlineAsmRegClass::dreg
1026+
| ArmInlineAsmRegClass::dreg_low8
1027+
| ArmInlineAsmRegClass::dreg_low16
1028+
| ArmInlineAsmRegClass::qreg
1029+
| ArmInlineAsmRegClass::qreg_low4
1030+
| ArmInlineAsmRegClass::qreg_low8,
1031+
),
1032+
Abi::Vector { element, count: count @ (4 | 8) },
1033+
) if element.primitive() == Primitive::Float(Float::F16) => {
1034+
bx.bitcast(value, bx.type_vector(bx.type_i16(), count))
1035+
}
10231036
(InlineAsmRegClass::Mips(MipsInlineAsmRegClass::reg), Abi::Scalar(s)) => {
10241037
match s.primitive() {
10251038
// MIPS only supports register-length arithmetics.
@@ -1130,6 +1143,19 @@ fn llvm_fixup_output<'ll, 'tcx>(
11301143
value
11311144
}
11321145
}
1146+
(
1147+
InlineAsmRegClass::Arm(
1148+
ArmInlineAsmRegClass::dreg
1149+
| ArmInlineAsmRegClass::dreg_low8
1150+
| ArmInlineAsmRegClass::dreg_low16
1151+
| ArmInlineAsmRegClass::qreg
1152+
| ArmInlineAsmRegClass::qreg_low4
1153+
| ArmInlineAsmRegClass::qreg_low8,
1154+
),
1155+
Abi::Vector { element, count: count @ (4 | 8) },
1156+
) if element.primitive() == Primitive::Float(Float::F16) => {
1157+
bx.bitcast(value, bx.type_vector(bx.type_f16(), count))
1158+
}
11331159
(InlineAsmRegClass::Mips(MipsInlineAsmRegClass::reg), Abi::Scalar(s)) => {
11341160
match s.primitive() {
11351161
// MIPS only supports register-length arithmetics.
@@ -1233,6 +1259,19 @@ fn llvm_fixup_output_type<'ll, 'tcx>(
12331259
layout.llvm_type(cx)
12341260
}
12351261
}
1262+
(
1263+
InlineAsmRegClass::Arm(
1264+
ArmInlineAsmRegClass::dreg
1265+
| ArmInlineAsmRegClass::dreg_low8
1266+
| ArmInlineAsmRegClass::dreg_low16
1267+
| ArmInlineAsmRegClass::qreg
1268+
| ArmInlineAsmRegClass::qreg_low4
1269+
| ArmInlineAsmRegClass::qreg_low8,
1270+
),
1271+
Abi::Vector { element, count: count @ (4 | 8) },
1272+
) if element.primitive() == Primitive::Float(Float::F16) => {
1273+
cx.type_vector(cx.type_i16(), count)
1274+
}
12361275
(InlineAsmRegClass::Mips(MipsInlineAsmRegClass::reg), Abi::Scalar(s)) => {
12371276
match s.primitive() {
12381277
// MIPS only supports register-length arithmetics.

‎compiler/rustc_target/src/asm/arm.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,18 @@ impl ArmInlineAsmRegClass {
4747
_arch: InlineAsmArch,
4848
) -> &'static [(InlineAsmType, Option<Symbol>)] {
4949
match self {
50-
Self::reg => types! { _: I8, I16, I32, F32; },
51-
Self::sreg | Self::sreg_low16 => types! { vfp2: I32, F32; },
50+
Self::reg => types! { _: I8, I16, I32, F16, F32; },
51+
Self::sreg | Self::sreg_low16 => types! { vfp2: I32, F16, F32; },
5252
Self::dreg_low16 | Self::dreg_low8 => types! {
53-
vfp2: I64, F64, VecI8(8), VecI16(4), VecI32(2), VecI64(1), VecF32(2);
53+
vfp2: I64, F64;
54+
neon: VecI8(8), VecI16(4), VecI32(2), VecI64(1), VecF16(4), VecF32(2);
5455
},
5556
Self::dreg => types! {
56-
d32: I64, F64, VecI8(8), VecI16(4), VecI32(2), VecI64(1), VecF32(2);
57+
d32: I64, F64;
58+
neon: VecI8(8), VecI16(4), VecI32(2), VecI64(1), VecF16(4), VecF32(2);
5759
},
5860
Self::qreg | Self::qreg_low8 | Self::qreg_low4 => types! {
59-
neon: VecI8(16), VecI16(8), VecI32(4), VecI64(2), VecF32(4);
61+
neon: VecI8(16), VecI16(8), VecI32(4), VecI64(2), VecF16(8), VecF32(4);
6062
},
6163
}
6264
}

‎tests/assembly/asm/arm-types.rs

Lines changed: 319 additions & 178 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
//@ revisions: base d32 neon
12
//@ assembly-output: emit-asm
23
//@ compile-flags: --target armv7-unknown-linux-gnueabihf
3-
//@ compile-flags: -C target-feature=+neon
44
//@ compile-flags: -C opt-level=0
5+
//@[d32] compile-flags: -C target-feature=+d32
6+
//@[neon] compile-flags: -C target-feature=+neon --cfg d32
7+
//@[neon] filecheck-flags: --check-prefix d32
58
//@ needs-llvm-components: arm
69

7-
#![feature(no_core, lang_items, rustc_attrs, repr_simd)]
10+
#![feature(no_core, lang_items, rustc_attrs, repr_simd, f16)]
811
#![crate_type = "rlib"]
912
#![no_core]
1013
#![allow(asm_sub_register, non_camel_case_types)]
@@ -38,6 +41,8 @@ pub struct i32x2(i32, i32);
3841
#[repr(simd)]
3942
pub struct i64x1(i64);
4043
#[repr(simd)]
44+
pub struct f16x4(f16, f16, f16, f16);
45+
#[repr(simd)]
4146
pub struct f32x2(f32, f32);
4247
#[repr(simd)]
4348
pub struct i8x16(i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8);
@@ -48,11 +53,14 @@ pub struct i32x4(i32, i32, i32, i32);
4853
#[repr(simd)]
4954
pub struct i64x2(i64, i64);
5055
#[repr(simd)]
56+
pub struct f16x8(f16, f16, f16, f16, f16, f16, f16, f16);
57+
#[repr(simd)]
5158
pub struct f32x4(f32, f32, f32, f32);
5259

5360
impl Copy for i8 {}
5461
impl Copy for i16 {}
5562
impl Copy for i32 {}
63+
impl Copy for f16 {}
5664
impl Copy for f32 {}
5765
impl Copy for i64 {}
5866
impl Copy for f64 {}
@@ -61,11 +69,13 @@ impl Copy for i8x8 {}
6169
impl Copy for i16x4 {}
6270
impl Copy for i32x2 {}
6371
impl Copy for i64x1 {}
72+
impl Copy for f16x4 {}
6473
impl Copy for f32x2 {}
6574
impl Copy for i8x16 {}
6675
impl Copy for i16x8 {}
6776
impl Copy for i32x4 {}
6877
impl Copy for i64x2 {}
78+
impl Copy for f16x8 {}
6979
impl Copy for f32x4 {}
7080

7181
extern "C" {
@@ -152,6 +162,12 @@ check!(reg_i16 i16 reg "mov");
152162
// CHECK: @NO_APP
153163
check!(reg_i32 i32 reg "mov");
154164

165+
// CHECK-LABEL: reg_f16:
166+
// CHECK: @APP
167+
// CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
168+
// CHECK: @NO_APP
169+
check!(reg_f16 f16 reg "mov");
170+
155171
// CHECK-LABEL: reg_f32:
156172
// CHECK: @APP
157173
// CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
@@ -170,6 +186,12 @@ check!(reg_ptr ptr reg "mov");
170186
// CHECK: @NO_APP
171187
check!(sreg_i32 i32 sreg "vmov.f32");
172188

189+
// CHECK-LABEL: sreg_f16:
190+
// CHECK: @APP
191+
// CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
192+
// CHECK: @NO_APP
193+
check!(sreg_f16 f16 sreg "vmov.f32");
194+
173195
// CHECK-LABEL: sreg_f32:
174196
// CHECK: @APP
175197
// CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
@@ -188,52 +210,72 @@ check!(sreg_ptr ptr sreg "vmov.f32");
188210
// CHECK: @NO_APP
189211
check!(sreg_low16_i32 i32 sreg_low16 "vmov.f32");
190212

191-
// CHECK-LABEL: sreg_low16_f32:
213+
// CHECK-LABEL: sreg_low16_f16:
192214
// CHECK: @APP
193215
// CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
194216
// CHECK: @NO_APP
195-
check!(sreg_low16_f32 f32 sreg_low16 "vmov.f32");
217+
check!(sreg_low16_f16 f16 sreg_low16 "vmov.f32");
196218

197-
// CHECK-LABEL: dreg_i64:
219+
// CHECK-LABEL: sreg_low16_f32:
198220
// CHECK: @APP
199-
// CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
221+
// CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}
200222
// CHECK: @NO_APP
223+
check!(sreg_low16_f32 f32 sreg_low16 "vmov.f32");
224+
225+
// d32-LABEL: dreg_i64:
226+
// d32: @APP
227+
// d32: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
228+
// d32: @NO_APP
229+
#[cfg(d32)]
201230
check!(dreg_i64 i64 dreg "vmov.f64");
202231

203-
// CHECK-LABEL: dreg_f64:
204-
// CHECK: @APP
205-
// CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
206-
// CHECK: @NO_APP
232+
// d32-LABEL: dreg_f64:
233+
// d32: @APP
234+
// d32: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
235+
// d32: @NO_APP
236+
#[cfg(d32)]
207237
check!(dreg_f64 f64 dreg "vmov.f64");
208238

209-
// CHECK-LABEL: dreg_i8x8:
210-
// CHECK: @APP
211-
// CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
212-
// CHECK: @NO_APP
239+
// neon-LABEL: dreg_i8x8:
240+
// neon: @APP
241+
// neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
242+
// neon: @NO_APP
243+
#[cfg(neon)]
213244
check!(dreg_i8x8 i8x8 dreg "vmov.f64");
214245

215-
// CHECK-LABEL: dreg_i16x4:
216-
// CHECK: @APP
217-
// CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
218-
// CHECK: @NO_APP
246+
// neon-LABEL: dreg_i16x4:
247+
// neon: @APP
248+
// neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
249+
// neon: @NO_APP
250+
#[cfg(neon)]
219251
check!(dreg_i16x4 i16x4 dreg "vmov.f64");
220252

221-
// CHECK-LABEL: dreg_i32x2:
222-
// CHECK: @APP
223-
// CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
224-
// CHECK: @NO_APP
253+
// neon-LABEL: dreg_i32x2:
254+
// neon: @APP
255+
// neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
256+
// neon: @NO_APP
257+
#[cfg(neon)]
225258
check!(dreg_i32x2 i32x2 dreg "vmov.f64");
226259

227-
// CHECK-LABEL: dreg_i64x1:
228-
// CHECK: @APP
229-
// CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
230-
// CHECK: @NO_APP
260+
// neon-LABEL: dreg_i64x1:
261+
// neon: @APP
262+
// neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
263+
// neon: @NO_APP
264+
#[cfg(neon)]
231265
check!(dreg_i64x1 i64x1 dreg "vmov.f64");
232266

233-
// CHECK-LABEL: dreg_f32x2:
234-
// CHECK: @APP
235-
// CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
236-
// CHECK: @NO_APP
267+
// neon-LABEL: dreg_f16x4:
268+
// neon: @APP
269+
// neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
270+
// neon: @NO_APP
271+
#[cfg(neon)]
272+
check!(dreg_f16x4 f16x4 dreg "vmov.f64");
273+
274+
// neon-LABEL: dreg_f32x2:
275+
// neon: @APP
276+
// neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
277+
// neon: @NO_APP
278+
#[cfg(neon)]
237279
check!(dreg_f32x2 f32x2 dreg "vmov.f64");
238280

239281
// CHECK-LABEL: dreg_low16_i64:
@@ -248,34 +290,46 @@ check!(dreg_low16_i64 i64 dreg_low16 "vmov.f64");
248290
// CHECK: @NO_APP
249291
check!(dreg_low16_f64 f64 dreg_low16 "vmov.f64");
250292

251-
// CHECK-LABEL: dreg_low16_i8x8:
252-
// CHECK: @APP
253-
// CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
254-
// CHECK: @NO_APP
293+
// neon-LABEL: dreg_low16_i8x8:
294+
// neon: @APP
295+
// neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
296+
// neon: @NO_APP
297+
#[cfg(neon)]
255298
check!(dreg_low16_i8x8 i8x8 dreg_low16 "vmov.f64");
256299

257-
// CHECK-LABEL: dreg_low16_i16x4:
258-
// CHECK: @APP
259-
// CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
260-
// CHECK: @NO_APP
300+
// neon-LABEL: dreg_low16_i16x4:
301+
// neon: @APP
302+
// neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
303+
// neon: @NO_APP
304+
#[cfg(neon)]
261305
check!(dreg_low16_i16x4 i16x4 dreg_low16 "vmov.f64");
262306

263-
// CHECK-LABEL: dreg_low16_i32x2:
264-
// CHECK: @APP
265-
// CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
266-
// CHECK: @NO_APP
307+
// neon-LABEL: dreg_low16_i32x2:
308+
// neon: @APP
309+
// neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
310+
// neon: @NO_APP
311+
#[cfg(neon)]
267312
check!(dreg_low16_i32x2 i32x2 dreg_low16 "vmov.f64");
268313

269-
// CHECK-LABEL: dreg_low16_i64x1:
270-
// CHECK: @APP
271-
// CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
272-
// CHECK: @NO_APP
314+
// neon-LABEL: dreg_low16_i64x1:
315+
// neon: @APP
316+
// neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
317+
// neon: @NO_APP
318+
#[cfg(neon)]
273319
check!(dreg_low16_i64x1 i64x1 dreg_low16 "vmov.f64");
274320

275-
// CHECK-LABEL: dreg_low16_f32x2:
276-
// CHECK: @APP
277-
// CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
278-
// CHECK: @NO_APP
321+
// neon-LABEL: dreg_low16_f16x4:
322+
// neon: @APP
323+
// neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
324+
// neon: @NO_APP
325+
#[cfg(neon)]
326+
check!(dreg_low16_f16x4 f16x4 dreg_low16 "vmov.f64");
327+
328+
// neon-LABEL: dreg_low16_f32x2:
329+
// neon: @APP
330+
// neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
331+
// neon: @NO_APP
332+
#[cfg(neon)]
279333
check!(dreg_low16_f32x2 f32x2 dreg_low16 "vmov.f64");
280334

281335
// CHECK-LABEL: dreg_low8_i64:
@@ -290,124 +344,172 @@ check!(dreg_low8_i64 i64 dreg_low8 "vmov.f64");
290344
// CHECK: @NO_APP
291345
check!(dreg_low8_f64 f64 dreg_low8 "vmov.f64");
292346

293-
// CHECK-LABEL: dreg_low8_i8x8:
294-
// CHECK: @APP
295-
// CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
296-
// CHECK: @NO_APP
347+
// neon-LABEL: dreg_low8_i8x8:
348+
// neon: @APP
349+
// neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
350+
// neon: @NO_APP
351+
#[cfg(neon)]
297352
check!(dreg_low8_i8x8 i8x8 dreg_low8 "vmov.f64");
298353

299-
// CHECK-LABEL: dreg_low8_i16x4:
300-
// CHECK: @APP
301-
// CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
302-
// CHECK: @NO_APP
354+
// neon-LABEL: dreg_low8_i16x4:
355+
// neon: @APP
356+
// neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
357+
// neon: @NO_APP
358+
#[cfg(neon)]
303359
check!(dreg_low8_i16x4 i16x4 dreg_low8 "vmov.f64");
304360

305-
// CHECK-LABEL: dreg_low8_i32x2:
306-
// CHECK: @APP
307-
// CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
308-
// CHECK: @NO_APP
361+
// neon-LABEL: dreg_low8_i32x2:
362+
// neon: @APP
363+
// neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
364+
// neon: @NO_APP
365+
#[cfg(neon)]
309366
check!(dreg_low8_i32x2 i32x2 dreg_low8 "vmov.f64");
310367

311-
// CHECK-LABEL: dreg_low8_i64x1:
312-
// CHECK: @APP
313-
// CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
314-
// CHECK: @NO_APP
368+
// neon-LABEL: dreg_low8_i64x1:
369+
// neon: @APP
370+
// neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
371+
// neon: @NO_APP
372+
#[cfg(neon)]
315373
check!(dreg_low8_i64x1 i64x1 dreg_low8 "vmov.f64");
316374

317-
// CHECK-LABEL: dreg_low8_f32x2:
318-
// CHECK: @APP
319-
// CHECK: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
320-
// CHECK: @NO_APP
375+
// neon-LABEL: dreg_low8_f16x4:
376+
// neon: @APP
377+
// neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
378+
// neon: @NO_APP
379+
#[cfg(neon)]
380+
check!(dreg_low8_f16x4 f16x4 dreg_low8 "vmov.f64");
381+
382+
// neon-LABEL: dreg_low8_f32x2:
383+
// neon: @APP
384+
// neon: vmov.f64 d{{[0-9]+}}, d{{[0-9]+}}
385+
// neon: @NO_APP
386+
#[cfg(neon)]
321387
check!(dreg_low8_f32x2 f32x2 dreg_low8 "vmov.f64");
322388

323-
// CHECK-LABEL: qreg_i8x16:
324-
// CHECK: @APP
325-
// CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
326-
// CHECK: @NO_APP
389+
// neon-LABEL: qreg_i8x16:
390+
// neon: @APP
391+
// neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
392+
// neon: @NO_APP
393+
#[cfg(neon)]
327394
check!(qreg_i8x16 i8x16 qreg "vmov");
328395

329-
// CHECK-LABEL: qreg_i16x8:
330-
// CHECK: @APP
331-
// CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
332-
// CHECK: @NO_APP
396+
// neon-LABEL: qreg_i16x8:
397+
// neon: @APP
398+
// neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
399+
// neon: @NO_APP
400+
#[cfg(neon)]
333401
check!(qreg_i16x8 i16x8 qreg "vmov");
334402

335-
// CHECK-LABEL: qreg_i32x4:
336-
// CHECK: @APP
337-
// CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
338-
// CHECK: @NO_APP
403+
// neon-LABEL: qreg_i32x4:
404+
// neon: @APP
405+
// neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
406+
// neon: @NO_APP
407+
#[cfg(neon)]
339408
check!(qreg_i32x4 i32x4 qreg "vmov");
340409

341-
// CHECK-LABEL: qreg_i64x2:
342-
// CHECK: @APP
343-
// CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
344-
// CHECK: @NO_APP
410+
// neon-LABEL: qreg_i64x2:
411+
// neon: @APP
412+
// neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
413+
// neon: @NO_APP
414+
#[cfg(neon)]
345415
check!(qreg_i64x2 i64x2 qreg "vmov");
346416

347-
// CHECK-LABEL: qreg_f32x4:
348-
// CHECK: @APP
349-
// CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
350-
// CHECK: @NO_APP
417+
// neon-LABEL: qreg_f16x8:
418+
// neon: @APP
419+
// neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
420+
// neon: @NO_APP
421+
#[cfg(neon)]
422+
check!(qreg_f16x8 f16x8 qreg "vmov");
423+
424+
// neon-LABEL: qreg_f32x4:
425+
// neon: @APP
426+
// neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
427+
// neon: @NO_APP
428+
#[cfg(neon)]
351429
check!(qreg_f32x4 f32x4 qreg "vmov");
352430

353-
// CHECK-LABEL: qreg_low8_i8x16:
354-
// CHECK: @APP
355-
// CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
356-
// CHECK: @NO_APP
431+
// neon-LABEL: qreg_low8_i8x16:
432+
// neon: @APP
433+
// neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
434+
// neon: @NO_APP
435+
#[cfg(neon)]
357436
check!(qreg_low8_i8x16 i8x16 qreg_low8 "vmov");
358437

359-
// CHECK-LABEL: qreg_low8_i16x8:
360-
// CHECK: @APP
361-
// CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
362-
// CHECK: @NO_APP
438+
// neon-LABEL: qreg_low8_i16x8:
439+
// neon: @APP
440+
// neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
441+
// neon: @NO_APP
442+
#[cfg(neon)]
363443
check!(qreg_low8_i16x8 i16x8 qreg_low8 "vmov");
364444

365-
// CHECK-LABEL: qreg_low8_i32x4:
366-
// CHECK: @APP
367-
// CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
368-
// CHECK: @NO_APP
445+
// neon-LABEL: qreg_low8_i32x4:
446+
// neon: @APP
447+
// neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
448+
// neon: @NO_APP
449+
#[cfg(neon)]
369450
check!(qreg_low8_i32x4 i32x4 qreg_low8 "vmov");
370451

371-
// CHECK-LABEL: qreg_low8_i64x2:
372-
// CHECK: @APP
373-
// CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
374-
// CHECK: @NO_APP
452+
// neon-LABEL: qreg_low8_i64x2:
453+
// neon: @APP
454+
// neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
455+
// neon: @NO_APP
456+
#[cfg(neon)]
375457
check!(qreg_low8_i64x2 i64x2 qreg_low8 "vmov");
376458

377-
// CHECK-LABEL: qreg_low8_f32x4:
378-
// CHECK: @APP
379-
// CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
380-
// CHECK: @NO_APP
459+
// neon-LABEL: qreg_low8_f16x8:
460+
// neon: @APP
461+
// neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
462+
// neon: @NO_APP
463+
#[cfg(neon)]
464+
check!(qreg_low8_f16x8 f16x8 qreg_low8 "vmov");
465+
466+
// neon-LABEL: qreg_low8_f32x4:
467+
// neon: @APP
468+
// neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
469+
// neon: @NO_APP
470+
#[cfg(neon)]
381471
check!(qreg_low8_f32x4 f32x4 qreg_low8 "vmov");
382472

383-
// CHECK-LABEL: qreg_low4_i8x16:
384-
// CHECK: @APP
385-
// CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
386-
// CHECK: @NO_APP
473+
// neon-LABEL: qreg_low4_i8x16:
474+
// neon: @APP
475+
// neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
476+
// neon: @NO_APP
477+
#[cfg(neon)]
387478
check!(qreg_low4_i8x16 i8x16 qreg_low4 "vmov");
388479

389-
// CHECK-LABEL: qreg_low4_i16x8:
390-
// CHECK: @APP
391-
// CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
392-
// CHECK: @NO_APP
480+
// neon-LABEL: qreg_low4_i16x8:
481+
// neon: @APP
482+
// neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
483+
// neon: @NO_APP
484+
#[cfg(neon)]
393485
check!(qreg_low4_i16x8 i16x8 qreg_low4 "vmov");
394486

395-
// CHECK-LABEL: qreg_low4_i32x4:
396-
// CHECK: @APP
397-
// CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
398-
// CHECK: @NO_APP
487+
// neon-LABEL: qreg_low4_i32x4:
488+
// neon: @APP
489+
// neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
490+
// neon: @NO_APP
491+
#[cfg(neon)]
399492
check!(qreg_low4_i32x4 i32x4 qreg_low4 "vmov");
400493

401-
// CHECK-LABEL: qreg_low4_i64x2:
402-
// CHECK: @APP
403-
// CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
404-
// CHECK: @NO_APP
494+
// neon-LABEL: qreg_low4_i64x2:
495+
// neon: @APP
496+
// neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
497+
// neon: @NO_APP
498+
#[cfg(neon)]
405499
check!(qreg_low4_i64x2 i64x2 qreg_low4 "vmov");
406500

407-
// CHECK-LABEL: qreg_low4_f32x4:
408-
// CHECK: @APP
409-
// CHECK: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
410-
// CHECK: @NO_APP
501+
// neon-LABEL: qreg_low4_f16x8:
502+
// neon: @APP
503+
// neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
504+
// neon: @NO_APP
505+
#[cfg(neon)]
506+
check!(qreg_low4_f16x8 f16x8 qreg_low4 "vmov");
507+
508+
// neon-LABEL: qreg_low4_f32x4:
509+
// neon: @APP
510+
// neon: vorr q{{[0-9]+}}, q{{[0-9]+}}, q{{[0-9]+}}
511+
// neon: @NO_APP
512+
#[cfg(neon)]
411513
check!(qreg_low4_f32x4 f32x4 qreg_low4 "vmov");
412514

413515
// CHECK-LABEL: r0_i8:
@@ -428,6 +530,12 @@ check_reg!(r0_i16 i16 "r0" "mov");
428530
// CHECK: @NO_APP
429531
check_reg!(r0_i32 i32 "r0" "mov");
430532

533+
// CHECK-LABEL: r0_f16:
534+
// CHECK: @APP
535+
// CHECK: mov r0, r0
536+
// CHECK: @NO_APP
537+
check_reg!(r0_f16 f16 "r0" "mov");
538+
431539
// CHECK-LABEL: r0_f32:
432540
// CHECK: @APP
433541
// CHECK: mov r0, r0
@@ -446,6 +554,12 @@ check_reg!(r0_ptr ptr "r0" "mov");
446554
// CHECK: @NO_APP
447555
check_reg!(s0_i32 i32 "s0" "vmov.f32");
448556

557+
// CHECK-LABEL: s0_f16:
558+
// CHECK: @APP
559+
// CHECK: vmov.f32 s0, s0
560+
// CHECK: @NO_APP
561+
check_reg!(s0_f16 f16 "s0" "vmov.f32");
562+
449563
// CHECK-LABEL: s0_f32:
450564
// CHECK: @APP
451565
// CHECK: vmov.f32 s0, s0
@@ -458,74 +572,101 @@ check_reg!(s0_f32 f32 "s0" "vmov.f32");
458572
// CHECK: @NO_APP
459573
check_reg!(s0_ptr ptr "s0" "vmov.f32");
460574

461-
// CHECK-LABEL: d0_i64:
462-
// CHECK: @APP
463-
// CHECK: vmov.f64 d0, d0
464-
// CHECK: @NO_APP
575+
// FIXME(#126797): "d0" should work with `i64` and `f64` even when `d32` is disabled.
576+
// d32-LABEL: d0_i64:
577+
// d32: @APP
578+
// d32: vmov.f64 d0, d0
579+
// d32: @NO_APP
580+
#[cfg(d32)]
465581
check_reg!(d0_i64 i64 "d0" "vmov.f64");
466582

467-
// CHECK-LABEL: d0_f64:
468-
// CHECK: @APP
469-
// CHECK: vmov.f64 d0, d0
470-
// CHECK: @NO_APP
583+
// d32-LABEL: d0_f64:
584+
// d32: @APP
585+
// d32: vmov.f64 d0, d0
586+
// d32: @NO_APP
587+
#[cfg(d32)]
471588
check_reg!(d0_f64 f64 "d0" "vmov.f64");
472589

473-
// CHECK-LABEL: d0_i8x8:
474-
// CHECK: @APP
475-
// CHECK: vmov.f64 d0, d0
476-
// CHECK: @NO_APP
590+
// neon-LABEL: d0_i8x8:
591+
// neon: @APP
592+
// neon: vmov.f64 d0, d0
593+
// neon: @NO_APP
594+
#[cfg(neon)]
477595
check_reg!(d0_i8x8 i8x8 "d0" "vmov.f64");
478596

479-
// CHECK-LABEL: d0_i16x4:
480-
// CHECK: @APP
481-
// CHECK: vmov.f64 d0, d0
482-
// CHECK: @NO_APP
597+
// neon-LABEL: d0_i16x4:
598+
// neon: @APP
599+
// neon: vmov.f64 d0, d0
600+
// neon: @NO_APP
601+
#[cfg(neon)]
483602
check_reg!(d0_i16x4 i16x4 "d0" "vmov.f64");
484603

485-
// CHECK-LABEL: d0_i32x2:
486-
// CHECK: @APP
487-
// CHECK: vmov.f64 d0, d0
488-
// CHECK: @NO_APP
604+
// neon-LABEL: d0_i32x2:
605+
// neon: @APP
606+
// neon: vmov.f64 d0, d0
607+
// neon: @NO_APP
608+
#[cfg(neon)]
489609
check_reg!(d0_i32x2 i32x2 "d0" "vmov.f64");
490610

491-
// CHECK-LABEL: d0_i64x1:
492-
// CHECK: @APP
493-
// CHECK: vmov.f64 d0, d0
494-
// CHECK: @NO_APP
611+
// neon-LABEL: d0_i64x1:
612+
// neon: @APP
613+
// neon: vmov.f64 d0, d0
614+
// neon: @NO_APP
615+
#[cfg(neon)]
495616
check_reg!(d0_i64x1 i64x1 "d0" "vmov.f64");
496617

497-
// CHECK-LABEL: d0_f32x2:
498-
// CHECK: @APP
499-
// CHECK: vmov.f64 d0, d0
500-
// CHECK: @NO_APP
618+
// neon-LABEL: d0_f16x4:
619+
// neon: @APP
620+
// neon: vmov.f64 d0, d0
621+
// neon: @NO_APP
622+
#[cfg(neon)]
623+
check_reg!(d0_f16x4 f16x4 "d0" "vmov.f64");
624+
625+
// neon-LABEL: d0_f32x2:
626+
// neon: @APP
627+
// neon: vmov.f64 d0, d0
628+
// neon: @NO_APP
629+
#[cfg(neon)]
501630
check_reg!(d0_f32x2 f32x2 "d0" "vmov.f64");
502631

503-
// CHECK-LABEL: q0_i8x16:
504-
// CHECK: @APP
505-
// CHECK: vorr q0, q0, q0
506-
// CHECK: @NO_APP
632+
// neon-LABEL: q0_i8x16:
633+
// neon: @APP
634+
// neon: vorr q0, q0, q0
635+
// neon: @NO_APP
636+
#[cfg(neon)]
507637
check_reg!(q0_i8x16 i8x16 "q0" "vmov");
508638

509-
// CHECK-LABEL: q0_i16x8:
510-
// CHECK: @APP
511-
// CHECK: vorr q0, q0, q0
512-
// CHECK: @NO_APP
639+
// neon-LABEL: q0_i16x8:
640+
// neon: @APP
641+
// neon: vorr q0, q0, q0
642+
// neon: @NO_APP
643+
#[cfg(neon)]
513644
check_reg!(q0_i16x8 i16x8 "q0" "vmov");
514645

515-
// CHECK-LABEL: q0_i32x4:
516-
// CHECK: @APP
517-
// CHECK: vorr q0, q0, q0
518-
// CHECK: @NO_APP
646+
// neon-LABEL: q0_i32x4:
647+
// neon: @APP
648+
// neon: vorr q0, q0, q0
649+
// neon: @NO_APP
650+
#[cfg(neon)]
519651
check_reg!(q0_i32x4 i32x4 "q0" "vmov");
520652

521-
// CHECK-LABEL: q0_i64x2:
522-
// CHECK: @APP
523-
// CHECK: vorr q0, q0, q0
524-
// CHECK: @NO_APP
653+
// neon-LABEL: q0_i64x2:
654+
// neon: @APP
655+
// neon: vorr q0, q0, q0
656+
// neon: @NO_APP
657+
#[cfg(neon)]
525658
check_reg!(q0_i64x2 i64x2 "q0" "vmov");
526659

527-
// CHECK-LABEL: q0_f32x4:
528-
// CHECK: @APP
529-
// CHECK: vorr q0, q0, q0
530-
// CHECK: @NO_APP
660+
// neon-LABEL: q0_f16x8:
661+
// neon: @APP
662+
// neon: vorr q0, q0, q0
663+
// neon: @NO_APP
664+
#[cfg(neon)]
665+
check_reg!(q0_f16x8 f16x8 "q0" "vmov");
666+
667+
// neon-LABEL: q0_f32x4:
668+
// neon: @APP
669+
// neon: vorr q0, q0, q0
670+
// neon: @NO_APP
671+
#[cfg(neon)]
531672
check_reg!(q0_f32x4 f32x4 "q0" "vmov");

0 commit comments

Comments
 (0)
Please sign in to comment.