Skip to content

Commit fe71e04

Browse files
authored
Rollup merge of rust-lang#119431 - taiki-e:asm-s390x-reg-addr, r=Amanieu
Support reg_addr register class in s390x inline assembly In s390x, `r0` cannot be used as an address register (it is evaluated as zero in an address context). Therefore, currently, in assemblies involving memory accesses, `r0` must be [marked as clobbered](https://github.com/taiki-e/atomic-maybe-uninit/blob/1a1155653a26667396c805954ab61c8cbb14de8c/src/arch/s390x.rs#L58) or [explicitly used to a non-address](https://github.com/taiki-e/atomic-maybe-uninit/blob/1a1155653a26667396c805954ab61c8cbb14de8c/src/arch/s390x.rs#L135) or explicitly use an address register to prevent `r0` from being allocated to a register for the address. This patch adds a register class for allocating general-purpose registers, except `r0`, to make it easier to use address registers. (powerpc already has a register class (reg_nonzero) for a similar purpose.) This is identical to the `a` constraint in LLVM and GCC: https://llvm.org/docs/LangRef.html#supported-constraint-code-list > a: A 32, 64, or 128-bit integer address register (excludes R0, which in an address context evaluates as zero). https://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html > a > Address register (general purpose register except r0) cc ``@uweigand`` r? ``@Amanieu``
2 parents a2efaf0 + f93e985 commit fe71e04

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

src/asm.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,7 @@ fn reg_to_gcc(reg: InlineAsmRegOrRegClass) -> ConstraintOrRegister {
634634
}
635635
InlineAsmRegClass::Wasm(WasmInlineAsmRegClass::local) => "r",
636636
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::reg) => "r",
637+
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::reg_addr) => "a",
637638
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::freg) => "f",
638639
InlineAsmRegClass::Err => unreachable!(),
639640
}
@@ -704,7 +705,9 @@ fn dummy_output_type<'gcc, 'tcx>(cx: &CodegenCx<'gcc, 'tcx>, reg: InlineAsmRegCl
704705
InlineAsmRegClass::SpirV(SpirVInlineAsmRegClass::reg) => {
705706
bug!("LLVM backend does not support SPIR-V")
706707
},
707-
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::reg) => cx.type_i32(),
708+
InlineAsmRegClass::S390x(
709+
S390xInlineAsmRegClass::reg | S390xInlineAsmRegClass::reg_addr
710+
) => cx.type_i32(),
708711
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::freg) => cx.type_f64(),
709712
InlineAsmRegClass::Err => unreachable!(),
710713
}

0 commit comments

Comments
 (0)