From f4bcfc5317258c77e25ab5c0f3eec5599287fdbd Mon Sep 17 00:00:00 2001 From: Petr Sumbera Date: Thu, 18 Jan 2018 04:26:01 -0800 Subject: [PATCH 1/3] 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 --- src/librustc_trans/cabi_sparc64.rs | 9 +++++++-- 1 file 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 From af632bc1c51a6a240c5e68b7eecc59440322ea62 Mon Sep 17 00:00:00 2001 From: Petr Sumbera Date: Thu, 18 Jan 2018 10:24:16 -0800 Subject: [PATCH 2/3] Removed uneeded change. --- src/librustc_trans/cabi_sparc64.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustc_trans/cabi_sparc64.rs b/src/librustc_trans/cabi_sparc64.rs index 6c5d3254191..8d560865287 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() == 256 + RegKind::Vector => arg.layout.size.bits() == 128 }; if valid_unit { From 1203b3d892b6f8424f6540173e31af1cda304e36 Mon Sep 17 00:00:00 2001 From: Petr Sumbera Date: Thu, 18 Jan 2018 11:03:49 -0800 Subject: [PATCH 3/3] Removed uneeded argument to make_indirect. --- src/librustc_trans/cabi_sparc64.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustc_trans/cabi_sparc64.rs b/src/librustc_trans/cabi_sparc64.rs index 8d560865287..b3fc6a68061 100644 --- a/src/librustc_trans/cabi_sparc64.rs +++ b/src/librustc_trans/cabi_sparc64.rs @@ -85,7 +85,7 @@ 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); + arg.make_indirect(); return; }