about summary refs log tree commit diff
diff options
context:
space:
mode:
authorkennytm <kennytm@gmail.com>2018-03-16 01:49:50 +0800
committerkennytm <kennytm@gmail.com>2018-03-16 05:35:18 +0800
commit77cf02de189183c86d3e5f8e31a16d02201b5f8d (patch)
tree59d9b955b4537e7217bb91bf4fe6d86276248dc7
parent5a7aa6cae543f9507d916624d2e54b7f53ee9616 (diff)
parent19b5113c8d948f7324b4ef8826d1833e84ba8b49 (diff)
downloadrust-77cf02de189183c86d3e5f8e31a16d02201b5f8d.tar.gz
rust-77cf02de189183c86d3e5f8e31a16d02201b5f8d.zip
Rollup merge of #49024 - draganmladjenovic:mips64_cabi_sret, r=sanxiyn
 rustc_trans: fix small aggregate returns for big-endian mips64 FFI

 Current model of threating small aggregate returns as smallest encompassing integer works only for little-endian mips64.
 The patch forces small aggregate return values to be viewed as one or two i64 chunks leaving to the casting implementation
 to handle endianes differences.
-rw-r--r--src/librustc_trans/cabi_mips64.rs14
1 files changed, 1 insertions, 13 deletions
diff --git a/src/librustc_trans/cabi_mips64.rs b/src/librustc_trans/cabi_mips64.rs
index 94bf53cee1e..231fe4c6edb 100644
--- a/src/librustc_trans/cabi_mips64.rs
+++ b/src/librustc_trans/cabi_mips64.rs
@@ -28,18 +28,6 @@ fn extend_integer_width_mips(arg: &mut ArgType, bits: u64) {
     arg.extend_integer_width_to(bits);
 }
 
-fn bits_to_int_reg(bits: u64) -> Reg {
-    if bits <= 8 {
-        Reg::i8()
-    } else if bits <= 16 {
-        Reg::i16()
-    } else if bits <= 32 {
-        Reg::i32()
-    } else {
-        Reg::i64()
-    }
-}
-
 fn float_reg<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, ret: &ArgType<'tcx>, i: usize) -> Option<Reg> {
     match ret.layout.field(cx, i).abi {
         layout::Abi::Scalar(ref scalar) => match scalar.value {
@@ -82,7 +70,7 @@ fn classify_ret_ty<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, ret: &mut ArgType<'tcx>)
 
         // Cast to a uniform int structure
         ret.cast_to(Uniform {
-            unit: bits_to_int_reg(bits),
+            unit: Reg::i64(),
             total: size
         });
     } else {