From 9f24188ec885d0d09ca8823ccf3210467dc61e11 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 5 Aug 2020 22:51:24 +0100 Subject: Fix #708 --- src/ir.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'src/ir.cpp') diff --git a/src/ir.cpp b/src/ir.cpp index bfed55083..6561c0beb 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -3316,7 +3316,19 @@ irValue *ir_emit_call(irProcedure *p, irValue *value, Array const &ar } else if (is_type_tuple(new_type)) { Type *abi_type = pt->Proc.abi_compat_params[i]; Type *st = struct_type_from_systemv_distribute_struct_fields(abi_type); - irValue *x = ir_emit_transmute(p, args[i], st); + irValue *x = nullptr; + i64 st_sz = type_size_of(st); + i64 arg_sz = type_size_of(ir_type(args[i])); + if (st_sz == arg_sz) { + x = ir_emit_transmute(p, args[i], st); + } else { + // NOTE(bill): struct{f32, f32, f32} != struct{#simd[2]f32, f32} + GB_ASSERT(st_sz > arg_sz); + irValue *xx = ir_add_local_generated(p, st, false); + irValue *pp = ir_emit_conv(p, xx, alloc_type_pointer(ir_type(args[i]))); + ir_emit_store(p, pp, args[i]); + x = ir_emit_load(p, xx); + } for (isize j = 0; j < new_type->Tuple.variables.count; j++) { irValue *xx = ir_emit_struct_ev(p, x, cast(i32)j); array_add(&processed_args, xx); -- cgit v1.2.3