Skip to content

Commit 676c619

Browse files
committed
Support reg_addr register class in s390x inline assembly
1 parent 03b5019 commit 676c619

File tree

5 files changed

+49
-17
lines changed

5 files changed

+49
-17
lines changed

compiler/rustc_codegen_gcc/src/asm.rs

+4-1
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
}

compiler/rustc_codegen_llvm/src/asm.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,7 @@ fn reg_to_llvm(reg: InlineAsmRegOrRegClass, layout: Option<&TyAndLayout<'_>>) ->
690690
InlineAsmRegClass::Avr(AvrInlineAsmRegClass::reg_iw) => "w",
691691
InlineAsmRegClass::Avr(AvrInlineAsmRegClass::reg_ptr) => "e",
692692
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::reg) => "r",
693+
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::reg_addr) => "a",
693694
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::freg) => "f",
694695
InlineAsmRegClass::Msp430(Msp430InlineAsmRegClass::reg) => "r",
695696
InlineAsmRegClass::M68k(M68kInlineAsmRegClass::reg) => "r",
@@ -867,7 +868,9 @@ fn dummy_output_type<'ll>(cx: &CodegenCx<'ll, '_>, reg: InlineAsmRegClass) -> &'
867868
InlineAsmRegClass::Avr(AvrInlineAsmRegClass::reg_pair) => cx.type_i16(),
868869
InlineAsmRegClass::Avr(AvrInlineAsmRegClass::reg_iw) => cx.type_i16(),
869870
InlineAsmRegClass::Avr(AvrInlineAsmRegClass::reg_ptr) => cx.type_i16(),
870-
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::reg) => cx.type_i32(),
871+
InlineAsmRegClass::S390x(
872+
S390xInlineAsmRegClass::reg | S390xInlineAsmRegClass::reg_addr,
873+
) => cx.type_i32(),
871874
InlineAsmRegClass::S390x(S390xInlineAsmRegClass::freg) => cx.type_f64(),
872875
InlineAsmRegClass::Msp430(Msp430InlineAsmRegClass::reg) => cx.type_i16(),
873876
InlineAsmRegClass::M68k(M68kInlineAsmRegClass::reg) => cx.type_i32(),

compiler/rustc_target/src/asm/s390x.rs

+15-14
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use std::fmt;
66
def_reg_class! {
77
S390x S390xInlineAsmRegClass {
88
reg,
9+
reg_addr,
910
freg,
1011
}
1112
}
@@ -36,7 +37,7 @@ impl S390xInlineAsmRegClass {
3637
arch: InlineAsmArch,
3738
) -> &'static [(InlineAsmType, Option<Symbol>)] {
3839
match (self, arch) {
39-
(Self::reg, _) => types! { _: I8, I16, I32, I64; },
40+
(Self::reg | Self::reg_addr, _) => types! { _: I8, I16, I32, I64; },
4041
(Self::freg, _) => types! { _: F32, F64; },
4142
}
4243
}
@@ -45,19 +46,19 @@ impl S390xInlineAsmRegClass {
4546
def_regs! {
4647
S390x S390xInlineAsmReg S390xInlineAsmRegClass {
4748
r0: reg = ["r0"],
48-
r1: reg = ["r1"],
49-
r2: reg = ["r2"],
50-
r3: reg = ["r3"],
51-
r4: reg = ["r4"],
52-
r5: reg = ["r5"],
53-
r6: reg = ["r6"],
54-
r7: reg = ["r7"],
55-
r8: reg = ["r8"],
56-
r9: reg = ["r9"],
57-
r10: reg = ["r10"],
58-
r12: reg = ["r12"],
59-
r13: reg = ["r13"],
60-
r14: reg = ["r14"],
49+
r1: reg, reg_addr = ["r1"],
50+
r2: reg, reg_addr = ["r2"],
51+
r3: reg, reg_addr = ["r3"],
52+
r4: reg, reg_addr = ["r4"],
53+
r5: reg, reg_addr = ["r5"],
54+
r6: reg, reg_addr = ["r6"],
55+
r7: reg, reg_addr = ["r7"],
56+
r8: reg, reg_addr = ["r8"],
57+
r9: reg, reg_addr = ["r9"],
58+
r10: reg, reg_addr = ["r10"],
59+
r12: reg, reg_addr = ["r12"],
60+
r13: reg, reg_addr = ["r13"],
61+
r14: reg, reg_addr = ["r14"],
6162
f0: freg = ["f0"],
6263
f1: freg = ["f1"],
6364
f2: freg = ["f2"],

src/doc/unstable-book/src/language-features/asm-experimental-arch.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ This feature tracks `asm!` and `global_asm!` support for the following architect
8484
| M68k | `reg_data` | None | `i8`, `i16`, `i32` |
8585
| CSKY | `reg` | None | `i8`, `i16`, `i32` |
8686
| CSKY | `freg` | None | `f32`, |
87-
| s390x | `reg` | None | `i8`, `i16`, `i32`, `i64` |
87+
| s390x | `reg`, `reg_addr` | None | `i8`, `i16`, `i32`, `i64` |
8888
| s390x | `freg` | None | `f32`, `f64` |
8989

9090
## Register aliases
@@ -161,6 +161,7 @@ This feature tracks `asm!` and `global_asm!` support for the following architect
161161
| PowerPC | `reg_nonzero` | None | `3` | `b` |
162162
| PowerPC | `freg` | None | `0` | None |
163163
| s390x | `reg` | None | `%r0` | None |
164+
| s390x | `reg_addr` | None | `%r1` | `a` |
164165
| s390x | `freg` | None | `%f0` | None |
165166
| CSKY | `reg` | None | `r0` | None |
166167
| CSKY | `freg` | None | `f0` | None |

tests/assembly/asm/s390x-types.rs

+24
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,30 @@ check!(reg_i32, i32, reg, "lgr");
112112
// CHECK: #NO_APP
113113
check!(reg_i64, i64, reg, "lgr");
114114

115+
// CHECK-LABEL: reg_i8_addr:
116+
// CHECK: #APP
117+
// CHECK: lgr %r{{[0-9]+}}, %r{{[0-9]+}}
118+
// CHECK: #NO_APP
119+
check!(reg_i8_addr, i8, reg_addr, "lgr");
120+
121+
// CHECK-LABEL: reg_i16_addr:
122+
// CHECK: #APP
123+
// CHECK: lgr %r{{[0-9]+}}, %r{{[0-9]+}}
124+
// CHECK: #NO_APP
125+
check!(reg_i16_addr, i16, reg_addr, "lgr");
126+
127+
// CHECK-LABEL: reg_i32_addr:
128+
// CHECK: #APP
129+
// CHECK: lgr %r{{[0-9]+}}, %r{{[0-9]+}}
130+
// CHECK: #NO_APP
131+
check!(reg_i32_addr, i32, reg_addr, "lgr");
132+
133+
// CHECK-LABEL: reg_i64_addr:
134+
// CHECK: #APP
135+
// CHECK: lgr %r{{[0-9]+}}, %r{{[0-9]+}}
136+
// CHECK: #NO_APP
137+
check!(reg_i64_addr, i64, reg_addr, "lgr");
138+
115139
// CHECK-LABEL: reg_f32:
116140
// CHECK: #APP
117141
// CHECK: ler %f{{[0-9]+}}, %f{{[0-9]+}}

0 commit comments

Comments
 (0)