diff options
| author | bjorn3 <bjorn3@users.noreply.github.com> | 2019-12-23 15:56:20 +0100 |
|---|---|---|
| committer | bjorn3 <bjorn3@users.noreply.github.com> | 2019-12-25 14:38:37 +0100 |
| commit | dadfbeab6c9d09d44f97181e32bec765ecd9b5bb (patch) | |
| tree | 14dfd9fbf84bed1479767b6ebbd9b4e7f1c419bc /src/pointer.rs | |
| parent | 78cdcd62be95069569ec75f9c099e7632f1e7e9e (diff) | |
| download | rust-dadfbeab6c9d09d44f97181e32bec765ecd9b5bb.tar.gz rust-dadfbeab6c9d09d44f97181e32bec765ecd9b5bb.zip | |
Don't use stack_{load,store} for vectors
Diffstat (limited to 'src/pointer.rs')
| -rw-r--r-- | src/pointer.rs | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/src/pointer.rs b/src/pointer.rs index 7483d4cc6a5..8ba9582f554 100644 --- a/src/pointer.rs +++ b/src/pointer.rs @@ -126,8 +126,8 @@ impl Pointer { ) -> Value { match self.base { PointerBase::Addr(base_addr) => fx.bcx.ins().load(ty, flags, base_addr, self.offset), - PointerBase::Stack(stack_slot) => if ty == types::I128 { - // WORKAROUND for stack_load.i128 not being implemented + PointerBase::Stack(stack_slot) => if ty == types::I128 || ty.is_vector() { + // WORKAROUND for stack_load.i128 and stack_load.iXxY not being implemented let base_addr = fx.bcx.ins().stack_addr(fx.pointer_type, stack_slot, 0); fx.bcx.ins().load(ty, flags, base_addr, self.offset) } else { @@ -146,12 +146,15 @@ impl Pointer { PointerBase::Addr(base_addr) => { fx.bcx.ins().store(flags, value, base_addr, self.offset); } - PointerBase::Stack(stack_slot) => if fx.bcx.func.dfg.value_type(value) == types::I128 { - // WORKAROUND for stack_load.i128 not being implemented - let base_addr = fx.bcx.ins().stack_addr(fx.pointer_type, stack_slot, 0); - fx.bcx.ins().store(flags, value, base_addr, self.offset); - } else { - fx.bcx.ins().stack_store(value, stack_slot, self.offset); + PointerBase::Stack(stack_slot) => { + let val_ty = fx.bcx.func.dfg.value_type(value); + if val_ty == types::I128 || val_ty.is_vector() { + // WORKAROUND for stack_store.i128 and stack_store.iXxY not being implemented + let base_addr = fx.bcx.ins().stack_addr(fx.pointer_type, stack_slot, 0); + fx.bcx.ins().store(flags, value, base_addr, self.offset); + } else { + fx.bcx.ins().stack_store(value, stack_slot, self.offset); + } } } } |
