Skip to content

Commit 22a1331

Browse files
authoredDec 9, 2021
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``
2 parents 856eefe + 908f300 commit 22a1331

File tree

8 files changed

+30
-65
lines changed

8 files changed

+30
-65
lines changed
 

‎compiler/rustc_codegen_gcc/src/asm.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,6 @@ fn reg_to_gcc(reg: InlineAsmRegOrRegClass) -> ConstraintOrRegister {
568568
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg) => unimplemented!(),
569569
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg_low16) => unimplemented!(),
570570
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => unimplemented!(),
571-
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg_thumb) => unimplemented!(),
572571
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg)
573572
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg_low16)
574573
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::qreg_low8) => unimplemented!(),
@@ -628,8 +627,7 @@ fn dummy_output_type<'gcc, 'tcx>(cx: &CodegenCx<'gcc, 'tcx>, reg: InlineAsmRegCl
628627
| InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg_low16) => {
629628
unimplemented!()
630629
}
631-
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg)
632-
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg_thumb) => cx.type_i32(),
630+
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg)=> cx.type_i32(),
633631
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg)
634632
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg_low16) => cx.type_f32(),
635633
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg)
@@ -737,8 +735,7 @@ fn modifier_to_gcc(arch: InlineAsmArch, reg: InlineAsmRegClass, modifier: Option
737735
| InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg_low16) => {
738736
unimplemented!()
739737
}
740-
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg)
741-
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg_thumb) => unimplemented!(),
738+
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => unimplemented!(),
742739
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg)
743740
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg_low16) => unimplemented!(),
744741
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg)

‎compiler/rustc_codegen_llvm/src/asm.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,6 @@ fn reg_to_llvm(reg: InlineAsmRegOrRegClass, layout: Option<&TyAndLayout<'tcx>>)
632632
unreachable!("clobber-only")
633633
}
634634
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => "r",
635-
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg_thumb) => "l",
636635
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg)
637636
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg_low16)
638637
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::qreg_low8) => "t",
@@ -703,8 +702,7 @@ fn modifier_to_llvm(
703702
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::preg) => {
704703
unreachable!("clobber-only")
705704
}
706-
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg)
707-
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg_thumb) => None,
705+
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => None,
708706
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg)
709707
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg_low16) => None,
710708
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg)
@@ -785,8 +783,7 @@ fn dummy_output_type(cx: &CodegenCx<'ll, 'tcx>, reg: InlineAsmRegClass) -> &'ll
785783
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::preg) => {
786784
unreachable!("clobber-only")
787785
}
788-
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg)
789-
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg_thumb) => cx.type_i32(),
786+
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => cx.type_i32(),
790787
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg)
791788
| InlineAsmRegClass::Arm(ArmInlineAsmRegClass::sreg_low16) => cx.type_f32(),
792789
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::dreg)

‎compiler/rustc_codegen_ssa/src/target_features.rs

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ const ARM_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[
3535
// since it should be enabled per-function using #[instruction_set], not
3636
// #[target_feature].
3737
("thumb-mode", Some(sym::arm_target_feature)),
38+
("thumb2", Some(sym::arm_target_feature)),
3839
];
3940

4041
const AARCH64_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[

‎compiler/rustc_span/src/symbol.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1058,7 +1058,6 @@ symbols! {
10581058
reg_nonzero,
10591059
reg_pair,
10601060
reg_ptr,
1061-
reg_thumb,
10621061
reg_upper,
10631062
register_attr,
10641063
register_tool,

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

+24-13
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use std::fmt;
66
def_reg_class! {
77
Arm ArmInlineAsmRegClass {
88
reg,
9-
reg_thumb,
109
sreg,
1110
sreg_low16,
1211
dreg,
@@ -47,7 +46,7 @@ impl ArmInlineAsmRegClass {
4746
_arch: InlineAsmArch,
4847
) -> &'static [(InlineAsmType, Option<&'static str>)] {
4948
match self {
50-
Self::reg | Self::reg_thumb => types! { _: I8, I16, I32, F32; },
49+
Self::reg => types! { _: I8, I16, I32, F32; },
5150
Self::sreg | Self::sreg_low16 => types! { "vfp2": I32, F32; },
5251
Self::dreg | Self::dreg_low16 | Self::dreg_low8 => types! {
5352
"vfp2": I64, F64, VecI8(8), VecI16(4), VecI32(2), VecI64(1), VecF32(2);
@@ -88,20 +87,32 @@ fn frame_pointer_r7(
8887
}
8988
}
9089

90+
fn not_thumb1(
91+
_arch: InlineAsmArch,
92+
mut has_feature: impl FnMut(&str) -> bool,
93+
_target: &Target,
94+
) -> Result<(), &'static str> {
95+
if has_feature("thumb-mode") && !has_feature("thumb2") {
96+
Err("high registers (r8+) cannot be used in Thumb-1 code")
97+
} else {
98+
Ok(())
99+
}
100+
}
101+
91102
def_regs! {
92103
Arm ArmInlineAsmReg ArmInlineAsmRegClass {
93-
r0: reg, reg_thumb = ["r0", "a1"],
94-
r1: reg, reg_thumb = ["r1", "a2"],
95-
r2: reg, reg_thumb = ["r2", "a3"],
96-
r3: reg, reg_thumb = ["r3", "a4"],
97-
r4: reg, reg_thumb = ["r4", "v1"],
98-
r5: reg, reg_thumb = ["r5", "v2"],
99-
r7: reg, reg_thumb = ["r7", "v4"] % frame_pointer_r7,
100-
r8: reg = ["r8", "v5"],
101-
r10: reg = ["r10", "sl"],
104+
r0: reg = ["r0", "a1"],
105+
r1: reg = ["r1", "a2"],
106+
r2: reg = ["r2", "a3"],
107+
r3: reg = ["r3", "a4"],
108+
r4: reg = ["r4", "v1"],
109+
r5: reg = ["r5", "v2"],
110+
r7: reg = ["r7", "v4"] % frame_pointer_r7,
111+
r8: reg = ["r8", "v5"] % not_thumb1,
112+
r10: reg = ["r10", "sl"] % not_thumb1,
102113
r11: reg = ["r11", "fp"] % frame_pointer_r11,
103-
r12: reg = ["r12", "ip"],
104-
r14: reg = ["r14", "lr"],
114+
r12: reg = ["r12", "ip"] % not_thumb1,
115+
r14: reg = ["r14", "lr"] % not_thumb1,
105116
s0: sreg, sreg_low16 = ["s0"],
106117
s1: sreg, sreg_low16 = ["s1"],
107118
s2: sreg, sreg_low16 = ["s2"],

‎src/doc/unstable-book/src/library-features/asm.md

+1-5
Original file line numberDiff line numberDiff line change
@@ -564,12 +564,8 @@ Here is the list of currently supported register classes:
564564
| AArch64 | `vreg` | `v[0-31]` | `w` |
565565
| AArch64 | `vreg_low16` | `v[0-15]` | `x` |
566566
| AArch64 | `preg` | `p[0-15]`, `ffr` | Only clobbers |
567-
| ARM (ARM) | `reg` | `r[0-12]`, `r14` | `r` |
568-
| ARM (Thumb2) | `reg` | `r[0-12]`, `r14` | `r` |
567+
| ARM (ARM/Thumb2) | `reg` | `r[0-12]`, `r14` | `r` |
569568
| ARM (Thumb1) | `reg` | `r[0-7]` | `r` |
570-
| ARM (ARM) | `reg_thumb` | `r[0-r12]`, `r14` | `l` |
571-
| ARM (Thumb2) | `reg_thumb` | `r[0-7]` | `l` |
572-
| ARM (Thumb1) | `reg_thumb` | `r[0-7]` | `l` |
573569
| ARM | `sreg` | `s[0-31]` | `t` |
574570
| ARM | `sreg_low16` | `s[0-15]` | `x` |
575571
| ARM | `dreg` | `d[0-31]` | `w` |

‎src/test/assembly/asm/arm-modifiers.rs

-6
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,6 @@ macro_rules! check {
5959
// CHECK: @NO_APP
6060
check!(reg "" reg i32 "mov");
6161

62-
// CHECK-LABEL: reg_thumb:
63-
// CHECK: @APP
64-
// CHECK: mov r0, r0
65-
// CHECK: @NO_APP
66-
check!(reg_thumb "" reg_thumb i32 "mov");
67-
6862
// CHECK-LABEL: sreg:
6963
// CHECK: @APP
7064
// CHECK: vmov.f32 s0, s0

‎src/test/assembly/asm/arm-types.rs

-30
Original file line numberDiff line numberDiff line change
@@ -163,36 +163,6 @@ check!(reg_f32 f32 reg "mov");
163163
// CHECK: @NO_APP
164164
check!(reg_ptr ptr reg "mov");
165165

166-
// CHECK-LABEL: reg_thumb_i8:
167-
// CHECK: @APP
168-
// CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
169-
// CHECK: @NO_APP
170-
check!(reg_thumb_i8 i8 reg_thumb "mov");
171-
172-
// CHECK-LABEL: reg_thumb_i16:
173-
// CHECK: @APP
174-
// CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
175-
// CHECK: @NO_APP
176-
check!(reg_thumb_i16 i16 reg_thumb "mov");
177-
178-
// CHECK-LABEL: reg_thumb_i32:
179-
// CHECK: @APP
180-
// CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
181-
// CHECK: @NO_APP
182-
check!(reg_thumb_i32 i32 reg_thumb "mov");
183-
184-
// CHECK-LABEL: reg_thumb_f32:
185-
// CHECK: @APP
186-
// CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
187-
// CHECK: @NO_APP
188-
check!(reg_thumb_f32 f32 reg_thumb "mov");
189-
190-
// CHECK-LABEL: reg_thumb_ptr:
191-
// CHECK: @APP
192-
// CHECK: mov {{[a-z0-9]+}}, {{[a-z0-9]+}}
193-
// CHECK: @NO_APP
194-
check!(reg_thumb_ptr ptr reg_thumb "mov");
195-
196166
// CHECK-LABEL: sreg_i32:
197167
// CHECK: @APP
198168
// CHECK: vmov.f32 s{{[0-9]+}}, s{{[0-9]+}}

0 commit comments

Comments
 (0)
Please sign in to comment.