about summary refs log tree commit diff
diff options
context:
space:
mode:
authorlinux1 <tmaloney@pdx.edu>2021-08-22 17:26:18 -0400
committerlinux1 <tmaloney@pdx.edu>2021-08-22 17:55:03 -0400
commiteeb0b52bf852b902b2bd1adaf919c35e2387ce28 (patch)
tree8e43229518b37c4a0b81fdf035a4b066821db223
parent66e95b17ecfc93e39b1846436a86f0e924ab30b3 (diff)
downloadrust-eeb0b52bf852b902b2bd1adaf919c35e2387ce28.tar.gz
rust-eeb0b52bf852b902b2bd1adaf919c35e2387ce28.zip
Feat: further testing & support for i64 general register use
-rw-r--r--compiler/rustc_target/src/asm/s390x.rs2
-rw-r--r--src/test/assembly/asm/s390x-types.rs52
2 files changed, 47 insertions, 7 deletions
diff --git a/compiler/rustc_target/src/asm/s390x.rs b/compiler/rustc_target/src/asm/s390x.rs
index 0acbea80093..dbf4168e4a8 100644
--- a/compiler/rustc_target/src/asm/s390x.rs
+++ b/compiler/rustc_target/src/asm/s390x.rs
@@ -35,7 +35,7 @@ impl S390xInlineAsmRegClass {
         arch: InlineAsmArch,
     ) -> &'static [(InlineAsmType, Option<&'static str>)] {
         match (self, arch) {
-            (Self::reg, _) => types! { _: I8, I16, I32; },
+            (Self::reg, _) => types! { _: I8, I16, I32, I64; },
             (Self::freg, _) => types! { _: F32, F64; },
         }
     }
diff --git a/src/test/assembly/asm/s390x-types.rs b/src/test/assembly/asm/s390x-types.rs
index 0fbb77b9617..69219315840 100644
--- a/src/test/assembly/asm/s390x-types.rs
+++ b/src/test/assembly/asm/s390x-types.rs
@@ -60,7 +60,7 @@ macro_rules! check { ($func:ident, $ty:ty, $class:ident, $mov:literal) => {
 };}
 
 macro_rules! check_reg { ($func:ident, $ty:ty, $reg:tt, $mov:literal) => {
-    
+    #[no_mangle]    
     pub unsafe fn $func(x: $ty) -> $ty {
         dont_merge(stringify!(func));
 
@@ -70,17 +70,57 @@ macro_rules! check_reg { ($func:ident, $ty:ty, $reg:tt, $mov:literal) => {
     }
 };}
 
-// systemz-LABEL: sym_fn_32:
-// systemz: #APP
-// systemz: brasl %r14, extern_func@PLT
-// systemz: #NO_APP
+// CHECK-LABEL: sym_fn_32:
+// CHECK: #APP
+// CHECK: brasl %r14, extern_func
+// CHECK: #NO_APP
 #[cfg(s390x)]
+#[no_mangle]
 pub unsafe fn sym_fn_32() {
     asm!("brasl %r14, {}", sym extern_func);
 }
 
+// CHECK-LABEL: sym_static:
+// CHECK: #APP
+// CHECK: brasl %r14, extern_static
+// CHECK: #NO_APP
+#[no_mangle]
+pub unsafe fn sym_static() {
+    asm!("brasl %r14, {}", sym extern_static);
+}
+
+// CHECK-LABEL: reg_i8:
+// CHECK: #APP
+// CHECK: lgr %r{{[0-9]+}}, %r{{[0-9]+}}
+// CHECK: #NO_APP
+check!(reg_i8, i8, reg, "lgr");
+
+// CHECK-LABEL: reg_i16:
+// CHECK: #APP
+// CHECK: lgr %r{{[0-9]+}}, %r{{[0-9]+}}
+// CHECK: #NO_APP
+check!(reg_i16, i16, reg, "lgr");
+
 // CHECK-LABEL: reg_i32:
 // CHECK: #APP
-// CHECK: lgr r{{[0-15]+}}, r{{[0-15]+}}
+// CHECK: lgr %r{{[0-9]+}}, %r{{[0-9]+}}
 // CHECK: #NO_APP
 check!(reg_i32, i32, reg, "lgr");
+
+// CHECK-LABEL: reg_i64:
+// CHECK: #APP
+// CHECK: lgr %r{{[0-9]+}}, %r{{[0-9]+}}
+// CHECK: #NO_APP
+check!(reg_i64, i64, reg, "lgr");
+
+// CHECK-LABEL: reg_f32:
+// CHECK: #APP
+// CHECK: ler %f{{[0-9]+}}, %f{{[0-9]+}}
+// CHECK: #NO_APP
+check!(reg_f32, f32, freg, "ler");
+
+// CHECK-LABEL: reg_f64:
+// CHECK: #APP
+// CHECK: ldr %f{{[0-9]+}}, %f{{[0-9]+}}
+// CHECK: #NO_APP
+check!(reg_f64, f64, freg, "ldr");