about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPetr Sumbera <petr.sumbera@oracle.com>2018-01-18 04:26:01 -0800
committerPetr Sumbera <petr.sumbera@oracle.com>2018-01-18 04:26:01 -0800
commitf4bcfc5317258c77e25ab5c0f3eec5599287fdbd (patch)
tree641c6081bbc179e69001330f4d7724a22543faf8
parent0f9c784751434c70ddd6719ccda6817c819126f9 (diff)
downloadrust-f4bcfc5317258c77e25ab5c0f3eec5599287fdbd.tar.gz
rust-f4bcfc5317258c77e25ab5c0f3eec5599287fdbd.zip
Fixes sparc64 cabi fixes.
Argument up to 16 bytes size is provided in registers.
Return value up to 32 bytes size is stored in registers.

Fixes: #46679
-rw-r--r--src/librustc_trans/cabi_sparc64.rs9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/librustc_trans/cabi_sparc64.rs b/src/librustc_trans/cabi_sparc64.rs
index fb94b09d626..6c5d3254191 100644
--- a/src/librustc_trans/cabi_sparc64.rs
+++ b/src/librustc_trans/cabi_sparc64.rs
@@ -24,7 +24,7 @@ fn is_homogeneous_aggregate<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, arg: &mut ArgTyp
         let valid_unit = match unit.kind {
             RegKind::Integer => false,
             RegKind::Float => true,
-            RegKind::Vector => arg.layout.size.bits() == 128
+            RegKind::Vector => arg.layout.size.bits() == 256
         };
 
         if valid_unit {
@@ -50,7 +50,7 @@ fn classify_ret_ty<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, ret: &mut ArgType<'tcx>)
     }
     let size = ret.layout.size;
     let bits = size.bits();
-    if bits <= 128 {
+    if bits <= 256 {
         let unit = if bits <= 8 {
             Reg::i8()
         } else if bits <= 16 {
@@ -84,6 +84,11 @@ fn classify_arg_ty<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, arg: &mut ArgType<'tcx>)
     }
 
     let total = arg.layout.size;
+    if total.bits() > 128 {
+        arg.make_indirect(cx);
+        return;
+    }
+
     arg.cast_to(Uniform {
         unit: Reg::i64(),
         total