1
Fork 0

Rollup merge of #90796 - Amanieu:remove_reg_thumb, r=joshtriplett

Remove the reg_thumb register class for asm! on ARM

Also restricts r8-r14 from being used on Thumb1 targets as per #90736.

cc ``@Lokathor``

r? ``@joshtriplett``
This commit is contained in:
Matthias Krüger 2021-12-09 05:08:32 +01:00 committed by GitHub
commit 22a1331112
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 30 additions and 65 deletions

View file

@ -568,7 +568,6 @@ fn reg_to_gcc(reg: InlineAsmRegOrRegClass) -> ConstraintOrRegister {
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg) => unimplemented!(), InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg) => unimplemented!(),
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg_low16) => unimplemented!(), InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg_low16) => unimplemented!(),
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => unimplemented!(), InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => unimplemented!(),
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg_thumb) => unimplemented!(),
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg) InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg)
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg_low16) | InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg_low16)
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::qreg_low8) => unimplemented!(), | InlineAsmRegClass::Arm(ArmInlineAsmRegClass::qreg_low8) => unimplemented!(),
@ -628,8 +627,7 @@ fn dummy_output_type<'gcc, 'tcx>(cx: &CodegenCx<'gcc, 'tcx>, reg: InlineAsmRegCl
| InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg_low16) => { | InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg_low16) => {
unimplemented!() unimplemented!()
} }
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg)=> cx.type_i32(),
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg_thumb) => cx.type_i32(),
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg) InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg)
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg_low16) => cx.type_f32(), | InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg_low16) => cx.type_f32(),
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg) InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg)
@ -737,8 +735,7 @@ fn modifier_to_gcc(arch: InlineAsmArch, reg: InlineAsmRegClass, modifier: Option
| InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg_low16) => { | InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg_low16) => {
unimplemented!() unimplemented!()
} }
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => unimplemented!(),
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg_thumb) => unimplemented!(),
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg) InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg)
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg_low16) => unimplemented!(), | InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg_low16) => unimplemented!(),
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg) InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg)

View file

@ -632,7 +632,6 @@ fn reg_to_llvm(reg: InlineAsmRegOrRegClass, layout: Option<&TyAndLayout<'tcx>>)
unreachable!("clobber-only") unreachable!("clobber-only")
} }
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => "r", InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => "r",
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg_thumb) => "l",
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg) InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg)
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg_low16) | InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg_low16)
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::qreg_low8) => "t", | InlineAsmRegClass::Arm(ArmInlineAsmRegClass::qreg_low8) => "t",
@ -703,8 +702,7 @@ fn modifier_to_llvm(
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::preg) => { InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::preg) => {
unreachable!("clobber-only") unreachable!("clobber-only")
} }
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => None,
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg_thumb) => None,
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg) InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg)
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg_low16) => None, | InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg_low16) => None,
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg) InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg)
@ -785,8 +783,7 @@ fn dummy_output_type(cx: &CodegenCx<'ll, 'tcx>, reg: InlineAsmRegClass) -> &'ll
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::preg) => { InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::preg) => {
unreachable!("clobber-only") unreachable!("clobber-only")
} }
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => cx.type_i32(),
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg_thumb) => cx.type_i32(),
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg) InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg)
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg_low16) => cx.type_f32(), | InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg_low16) => cx.type_f32(),
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg) InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg)

View file

@ -35,6 +35,7 @@ const ARM_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[
// since it should be enabled per-function using #[instruction_set], not // since it should be enabled per-function using #[instruction_set], not
// #[target_feature]. // #[target_feature].
("thumb-mode", Some(sym::arm_target_feature)), ("thumb-mode", Some(sym::arm_target_feature)),
("thumb2", Some(sym::arm_target_feature)),
]; ];
const AARCH64_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[ const AARCH64_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[

View file

@ -1058,7 +1058,6 @@ symbols! {
reg_nonzero, reg_nonzero,
reg_pair, reg_pair,
reg_ptr, reg_ptr,
reg_thumb,
reg_upper, reg_upper,
register_attr, register_attr,
register_tool, register_tool,

View file

@ -6,7 +6,6 @@ use std::fmt;
def_reg_class! { def_reg_class! {
Arm ArmInlineAsmRegClass { Arm ArmInlineAsmRegClass {
reg, reg,
reg_thumb,
sreg, sreg,
sreg_low16, sreg_low16,
dreg, dreg,
@ -47,7 +46,7 @@ impl ArmInlineAsmRegClass {
_arch: InlineAsmArch, _arch: InlineAsmArch,
) -> &'static [(InlineAsmType, Option<&'static str>)] { ) -> &'static [(InlineAsmType, Option<&'static str>)] {
match self { match self {
Self::reg | Self::reg_thumb => types! { _: I8, I16, I32, F32; }, Self::reg => types! { _: I8, I16, I32, F32; },
Self::sreg | Self::sreg_low16 => types! { "vfp2": I32, F32; }, Self::sreg | Self::sreg_low16 => types! { "vfp2": I32, F32; },
Self::dreg | Self::dreg_low16 | Self::dreg_low8 => types! { Self::dreg | Self::dreg_low16 | Self::dreg_low8 => types! {
"vfp2": I64, F64, VecI8(8), VecI16(4), VecI32(2), VecI64(1), VecF32(2); "vfp2": I64, F64, VecI8(8), VecI16(4), VecI32(2), VecI64(1), VecF32(2);
@ -88,20 +87,32 @@ fn frame_pointer_r7(
} }
} }
fn not_thumb1(
_arch: InlineAsmArch,
mut has_feature: impl FnMut(&str) -> bool,
_target: &Target,
) -> Result<(), &'static str> {
if has_feature("thumb-mode") && !has_feature("thumb2") {
Err("high registers (r8+) cannot be used in Thumb-1 code")
} else {
Ok(())
}
}
def_regs! { def_regs! {
Arm ArmInlineAsmReg ArmInlineAsmRegClass { Arm ArmInlineAsmReg ArmInlineAsmRegClass {
r0: reg, reg_thumb = ["r0", "a1"], r0: reg = ["r0", "a1"],
r1: reg, reg_thumb = ["r1", "a2"], r1: reg = ["r1", "a2"],
r2: reg, reg_thumb = ["r2", "a3"], r2: reg = ["r2", "a3"],
r3: reg, reg_thumb = ["r3", "a4"], r3: reg = ["r3", "a4"],
r4: reg, reg_thumb = ["r4", "v1"], r4: reg = ["r4", "v1"],
r5: reg, reg_thumb = ["r5", "v2"], r5: reg = ["r5", "v2"],
r7: reg, reg_thumb = ["r7", "v4"] % frame_pointer_r7, r7: reg = ["r7", "v4"] % frame_pointer_r7,
r8: reg = ["r8", "v5"], r8: reg = ["r8", "v5"] % not_thumb1,
r10: reg = ["r10", "sl"], r10: reg = ["r10", "sl"] % not_thumb1,
r11: reg = ["r11", "fp"] % frame_pointer_r11, r11: reg = ["r11", "fp"] % frame_pointer_r11,
r12: reg = ["r12", "ip"], r12: reg = ["r12", "ip"] % not_thumb1,
r14: reg = ["r14", "lr"], r14: reg = ["r14", "lr"] % not_thumb1,
s0: sreg, sreg_low16 = ["s0"], s0: sreg, sreg_low16 = ["s0"],
s1: sreg, sreg_low16 = ["s1"], s1: sreg, sreg_low16 = ["s1"],
s2: sreg, sreg_low16 = ["s2"], s2: sreg, sreg_low16 = ["s2"],

View file

@ -564,12 +564,8 @@ Here is the list of currently supported register classes:
| AArch64 | `vreg` | `v[0-31]` | `w` | | AArch64 | `vreg` | `v[0-31]` | `w` |
| AArch64 | `vreg_low16` | `v[0-15]` | `x` | | AArch64 | `vreg_low16` | `v[0-15]` | `x` |
| AArch64 | `preg` | `p[0-15]`, `ffr` | Only clobbers | | AArch64 | `preg` | `p[0-15]`, `ffr` | Only clobbers |
| ARM (ARM) | `reg` | `r[0-12]`, `r14` | `r` | | ARM (ARM/Thumb2) | `reg` | `r[0-12]`, `r14` | `r` |
| ARM (Thumb2) | `reg` | `r[0-12]`, `r14` | `r` |
| ARM (Thumb1) | `reg` | `r[0-7]` | `r` | | ARM (Thumb1) | `reg` | `r[0-7]` | `r` |
| ARM (ARM) | `reg_thumb` | `r[0-r12]`, `r14` | `l` |
| ARM (Thumb2) | `reg_thumb` | `r[0-7]` | `l` |
| ARM (Thumb1) | `reg_thumb` | `r[0-7]` | `l` |
| ARM | `sreg` | `s[0-31]` | `t` | | ARM | `sreg` | `s[0-31]` | `t` |
| ARM | `sreg_low16` | `s[0-15]` | `x` | | ARM | `sreg_low16` | `s[0-15]` | `x` |
| ARM | `dreg` | `d[0-31]` | `w` | | ARM | `dreg` | `d[0-31]` | `w` |

View file

@ -59,12 +59,6 @@ macro_rules! check {
// CHECK: @NO_APP // CHECK: @NO_APP
check!(reg "" reg i32 "mov"); check!(reg "" reg i32 "mov");
// CHECK-LABEL: reg_thumb:
// CHECK: @APP
// CHECK: mov r0, r0
// CHECK: @NO_APP
check!(reg_thumb "" reg_thumb i32 "mov");
// CHECK-LABEL: sreg: // CHECK-LABEL: sreg:
// CHECK: @APP // CHECK: @APP
// CHECK: vmov.f32 s0, s0 // CHECK: vmov.f32 s0, s0

View file

@ -163,36 +163,6 @@ check!(reg_f32 f32 reg "mov");
// CHECK: @NO_APP // CHECK: @NO_APP
check!(reg_ptr ptr reg "mov"); check!(reg_ptr ptr reg "mov");
// CHECK-LABEL: reg_thumb_i8:
// CHECK: @APP
// CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
// CHECK: @NO_APP
check!(reg_thumb_i8 i8 reg_thumb "mov");
// CHECK-LABEL: reg_thumb_i16:
// CHECK: @APP
// CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
// CHECK: @NO_APP
check!(reg_thumb_i16 i16 reg_thumb "mov");
// CHECK-LABEL: reg_thumb_i32:
// CHECK: @APP
// CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
// CHECK: @NO_APP
check!(reg_thumb_i32 i32 reg_thumb "mov");
// CHECK-LABEL: reg_thumb_f32:
// CHECK: @APP
// CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
// CHECK: @NO_APP
check!(reg_thumb_f32 f32 reg_thumb "mov");
// CHECK-LABEL: reg_thumb_ptr:
// CHECK: @APP
// CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
// CHECK: @NO_APP
check!(reg_thumb_ptr ptr reg_thumb "mov");
// CHECK-LABEL: sreg_i32: // CHECK-LABEL: sreg_i32:
// CHECK: @APP // CHECK: @APP
// CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}} // CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}