Skip to content

Commit 3108dfa

Browse files
authored
Rollup merge of #126849 - workingjubilee:correctly-classify-arm-low-dregs, r=Amanieu
Fix 32-bit Arm reg classes by hierarchically sorting them We were rejecting legal `asm!` because we were asking for the "greatest" feature that includes a register class, instead of the "least" feature that includes a register class. This was only revealed on certain 32-bit Arm targets because not all have the same register limitations. This is a somewhat hacky solution, but other solutions would require potentially rearchitecting how the internals of parsing or rejecting register classes work for all targets. Fixes #126797 r​? ``@Amanieu``
2 parents dcace86 + 0d8f734 commit 3108dfa

File tree

2 files changed

+73
-40
lines changed

2 files changed

+73
-40
lines changed

compiler/rustc_target/src/asm/arm.rs

+40-40
Original file line numberDiff line numberDiff line change
@@ -148,22 +148,22 @@ def_regs! {
148148
r11: reg = ["r11", "fp"] % frame_pointer_r11,
149149
r12: reg = ["r12", "ip"] % not_thumb1,
150150
r14: reg = ["r14", "lr"] % not_thumb1,
151-
s0: sreg, sreg_low16 = ["s0"],
152-
s1: sreg, sreg_low16 = ["s1"],
153-
s2: sreg, sreg_low16 = ["s2"],
154-
s3: sreg, sreg_low16 = ["s3"],
155-
s4: sreg, sreg_low16 = ["s4"],
156-
s5: sreg, sreg_low16 = ["s5"],
157-
s6: sreg, sreg_low16 = ["s6"],
158-
s7: sreg, sreg_low16 = ["s7"],
159-
s8: sreg, sreg_low16 = ["s8"],
160-
s9: sreg, sreg_low16 = ["s9"],
161-
s10: sreg, sreg_low16 = ["s10"],
162-
s11: sreg, sreg_low16 = ["s11"],
163-
s12: sreg, sreg_low16 = ["s12"],
164-
s13: sreg, sreg_low16 = ["s13"],
165-
s14: sreg, sreg_low16 = ["s14"],
166-
s15: sreg, sreg_low16 = ["s15"],
151+
s0: sreg_low16, sreg = ["s0"],
152+
s1: sreg_low16, sreg = ["s1"],
153+
s2: sreg_low16, sreg = ["s2"],
154+
s3: sreg_low16, sreg = ["s3"],
155+
s4: sreg_low16, sreg = ["s4"],
156+
s5: sreg_low16, sreg = ["s5"],
157+
s6: sreg_low16, sreg = ["s6"],
158+
s7: sreg_low16, sreg = ["s7"],
159+
s8: sreg_low16, sreg = ["s8"],
160+
s9: sreg_low16, sreg = ["s9"],
161+
s10: sreg_low16, sreg = ["s10"],
162+
s11: sreg_low16, sreg = ["s11"],
163+
s12: sreg_low16, sreg = ["s12"],
164+
s13: sreg_low16, sreg = ["s13"],
165+
s14: sreg_low16, sreg = ["s14"],
166+
s15: sreg_low16, sreg = ["s15"],
167167
s16: sreg = ["s16"],
168168
s17: sreg = ["s17"],
169169
s18: sreg = ["s18"],
@@ -180,22 +180,22 @@ def_regs! {
180180
s29: sreg = ["s29"],
181181
s30: sreg = ["s30"],
182182
s31: sreg = ["s31"],
183-
d0: dreg, dreg_low16, dreg_low8 = ["d0"],
184-
d1: dreg, dreg_low16, dreg_low8 = ["d1"],
185-
d2: dreg, dreg_low16, dreg_low8 = ["d2"],
186-
d3: dreg, dreg_low16, dreg_low8 = ["d3"],
187-
d4: dreg, dreg_low16, dreg_low8 = ["d4"],
188-
d5: dreg, dreg_low16, dreg_low8 = ["d5"],
189-
d6: dreg, dreg_low16, dreg_low8 = ["d6"],
190-
d7: dreg, dreg_low16, dreg_low8 = ["d7"],
191-
d8: dreg, dreg_low16 = ["d8"],
192-
d9: dreg, dreg_low16 = ["d9"],
193-
d10: dreg, dreg_low16 = ["d10"],
194-
d11: dreg, dreg_low16 = ["d11"],
195-
d12: dreg, dreg_low16 = ["d12"],
196-
d13: dreg, dreg_low16 = ["d13"],
197-
d14: dreg, dreg_low16 = ["d14"],
198-
d15: dreg, dreg_low16 = ["d15"],
183+
d0: dreg_low8, dreg_low16, dreg = ["d0"],
184+
d1: dreg_low8, dreg_low16, dreg = ["d1"],
185+
d2: dreg_low8, dreg_low16, dreg = ["d2"],
186+
d3: dreg_low8, dreg_low16, dreg = ["d3"],
187+
d4: dreg_low8, dreg_low16, dreg = ["d4"],
188+
d5: dreg_low8, dreg_low16, dreg = ["d5"],
189+
d6: dreg_low8, dreg_low16, dreg = ["d6"],
190+
d7: dreg_low8, dreg_low16, dreg = ["d7"],
191+
d8: dreg_low16, dreg = ["d8"],
192+
d9: dreg_low16, dreg = ["d9"],
193+
d10: dreg_low16, dreg = ["d10"],
194+
d11: dreg_low16, dreg = ["d11"],
195+
d12: dreg_low16, dreg = ["d12"],
196+
d13: dreg_low16, dreg = ["d13"],
197+
d14: dreg_low16, dreg = ["d14"],
198+
d15: dreg_low16, dreg = ["d15"],
199199
d16: dreg = ["d16"],
200200
d17: dreg = ["d17"],
201201
d18: dreg = ["d18"],
@@ -212,14 +212,14 @@ def_regs! {
212212
d29: dreg = ["d29"],
213213
d30: dreg = ["d30"],
214214
d31: dreg = ["d31"],
215-
q0: qreg, qreg_low8, qreg_low4 = ["q0"],
216-
q1: qreg, qreg_low8, qreg_low4 = ["q1"],
217-
q2: qreg, qreg_low8, qreg_low4 = ["q2"],
218-
q3: qreg, qreg_low8, qreg_low4 = ["q3"],
219-
q4: qreg, qreg_low8 = ["q4"],
220-
q5: qreg, qreg_low8 = ["q5"],
221-
q6: qreg, qreg_low8 = ["q6"],
222-
q7: qreg, qreg_low8 = ["q7"],
215+
q0: qreg_low4, qreg_low8, qreg = ["q0"],
216+
q1: qreg_low4, qreg_low8, qreg = ["q1"],
217+
q2: qreg_low4, qreg_low8, qreg = ["q2"],
218+
q3: qreg_low4, qreg_low8, qreg = ["q3"],
219+
q4: qreg_low8, qreg = ["q4"],
220+
q5: qreg_low8, qreg = ["q5"],
221+
q6: qreg_low8, qreg = ["q6"],
222+
q7: qreg_low8, qreg = ["q7"],
223223
q8: qreg = ["q8"],
224224
q9: qreg = ["q9"],
225225
q10: qreg = ["q10"],

tests/ui/asm/arm-low-dreg.rs

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//@ build-pass
2+
//@ compile-flags: --target=armv7-unknown-linux-gnueabihf
3+
//@ needs-llvm-components: arm
4+
#![feature(no_core, rustc_attrs, decl_macro, lang_items)]
5+
#![crate_type = "rlib"]
6+
#![no_std]
7+
#![no_core]
8+
9+
// We accidentally classified "d0"..="d15" as dregs, even though they are in dreg_low16,
10+
// and thus didn't compile them on platforms with only 16 dregs.
11+
// Highlighted in https://github.com/rust-lang/rust/issues/126797
12+
13+
#[lang = "sized"]
14+
trait Sized {}
15+
16+
#[lang = "copy"]
17+
trait Copy {}
18+
19+
impl Copy for f64 {}
20+
21+
#[rustc_builtin_macro]
22+
pub macro asm("assembly template", $(operands,)* $(options($(option),*))?) {
23+
/* compiler built-in */
24+
}
25+
26+
27+
fn f(x: f64) -> f64 {
28+
let out: f64;
29+
unsafe {
30+
asm!("vmov.f64 d1, d0", out("d1") out, in("d0") x);
31+
}
32+
out
33+
}

0 commit comments

Comments
 (0)