Skip to content

Commit d380cfd

Browse files
committed
Disallow z0-z15 in Arm64EC inline assembly
1 parent 955d8c6 commit d380cfd

File tree

7 files changed

+379
-151
lines changed

7 files changed

+379
-151
lines changed

compiler/rustc_codegen_gcc/src/asm.rs

+22-10
Original file line numberDiff line numberDiff line change
@@ -611,10 +611,14 @@ fn reg_to_gcc(reg: InlineAsmRegOrRegClass) -> ConstraintOrRegister {
611611
}
612612
// They can be retrieved from https://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html
613613
InlineAsmRegOrRegClass::RegClass(reg) => match reg {
614-
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::reg) => "r",
615-
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg) => "w",
616-
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg_low16) => "x",
617-
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::preg) => {
614+
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::reg)
615+
| InlineAsmRegClass::Arm64EC(AArch64InlineAsmRegClass::reg) => "r",
616+
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg)
617+
| InlineAsmRegClass::Arm64EC(AArch64InlineAsmRegClass::vreg) => "w",
618+
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg_low16)
619+
| InlineAsmRegClass::Arm64EC(AArch64InlineAsmRegClass::vreg_low16) => "x",
620+
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::preg)
621+
| InlineAsmRegClass::Arm64EC(AArch64InlineAsmRegClass::preg) => {
618622
unreachable!("clobber-only")
619623
}
620624
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => "r",
@@ -698,12 +702,16 @@ fn reg_to_gcc(reg: InlineAsmRegOrRegClass) -> ConstraintOrRegister {
698702
/// the type is, as long as it is valid for the constraint code.
699703
fn dummy_output_type<'gcc, 'tcx>(cx: &CodegenCx<'gcc, 'tcx>, reg: InlineAsmRegClass) -> Type<'gcc> {
700704
match reg {
701-
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::reg) => cx.type_i32(),
705+
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::reg)
706+
| InlineAsmRegClass::Arm64EC(AArch64InlineAsmRegClass::reg) => cx.type_i32(),
702707
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg)
703-
| InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg_low16) => {
708+
| InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg_low16)
709+
| InlineAsmRegClass::Arm64EC(AArch64InlineAsmRegClass::vreg)
710+
| InlineAsmRegClass::Arm64EC(AArch64InlineAsmRegClass::vreg_low16) => {
704711
cx.type_vector(cx.type_i64(), 2)
705712
}
706-
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::preg) => {
713+
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::preg)
714+
| InlineAsmRegClass::Arm64EC(AArch64InlineAsmRegClass::preg) => {
707715
unreachable!("clobber-only")
708716
}
709717
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => cx.type_i32(),
@@ -863,12 +871,16 @@ fn modifier_to_gcc(
863871
// The modifiers can be retrieved from
864872
// https://gcc.gnu.org/onlinedocs/gcc/Modifiers.html#Modifiers
865873
match reg {
866-
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::reg) => modifier,
874+
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::reg)
875+
| InlineAsmRegClass::Arm64EC(AArch64InlineAsmRegClass::reg) => modifier,
867876
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg)
868-
| InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg_low16) => {
877+
| InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::vreg_low16)
878+
| InlineAsmRegClass::Arm64EC(AArch64InlineAsmRegClass::vreg)
879+
| InlineAsmRegClass::Arm64EC(AArch64InlineAsmRegClass::vreg_low16) => {
869880
if modifier == Some('v') { None } else { modifier }
870881
}
871-
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::preg) => {
882+
InlineAsmRegClass::AArch64(AArch64InlineAsmRegClass::preg)
883+
| InlineAsmRegClass::Arm64EC(AArch64InlineAsmRegClass::preg) => {
872884
unreachable!("clobber-only")
873885
}
874886
InlineAsmRegClass::Arm(ArmInlineAsmRegClass::reg) => None,

0 commit comments

Comments
 (0)