about summary refs log tree commit diff
path: root/src/pointer.rs
diff options
context:
space:
mode:
authorbjorn3 <bjorn3@users.noreply.github.com>2019-12-23 15:56:20 +0100
committerbjorn3 <bjorn3@users.noreply.github.com>2019-12-25 14:38:37 +0100
commitdadfbeab6c9d09d44f97181e32bec765ecd9b5bb (patch)
tree14dfd9fbf84bed1479767b6ebbd9b4e7f1c419bc /src/pointer.rs
parent78cdcd62be95069569ec75f9c099e7632f1e7e9e (diff)
downloadrust-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.rs19
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);
+                }
             }
         }
     }