Skip to content

Commit dadfbea

Browse files
committed
Don't use stack_{load,store} for vectors
1 parent 78cdcd6 commit dadfbea

File tree

1 file changed

+11
-8
lines changed

1 file changed

+11
-8
lines changed

src/pointer.rs

+11-8
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ impl Pointer {
126126
) -> Value {
127127
match self.base {
128128
PointerBase::Addr(base_addr) => fx.bcx.ins().load(ty, flags, base_addr, self.offset),
129-
PointerBase::Stack(stack_slot) => if ty == types::I128 {
130-
// WORKAROUND for stack_load.i128 not being implemented
129+
PointerBase::Stack(stack_slot) => if ty == types::I128 || ty.is_vector() {
130+
// WORKAROUND for stack_load.i128 and stack_load.iXxY not being implemented
131131
let base_addr = fx.bcx.ins().stack_addr(fx.pointer_type, stack_slot, 0);
132132
fx.bcx.ins().load(ty, flags, base_addr, self.offset)
133133
} else {
@@ -146,12 +146,15 @@ impl Pointer {
146146
PointerBase::Addr(base_addr) => {
147147
fx.bcx.ins().store(flags, value, base_addr, self.offset);
148148
}
149-
PointerBase::Stack(stack_slot) => if fx.bcx.func.dfg.value_type(value) == types::I128 {
150-
// WORKAROUND for stack_load.i128 not being implemented
151-
let base_addr = fx.bcx.ins().stack_addr(fx.pointer_type, stack_slot, 0);
152-
fx.bcx.ins().store(flags, value, base_addr, self.offset);
153-
} else {
154-
fx.bcx.ins().stack_store(value, stack_slot, self.offset);
149+
PointerBase::Stack(stack_slot) => {
150+
let val_ty = fx.bcx.func.dfg.value_type(value);
151+
if val_ty == types::I128 || val_ty.is_vector() {
152+
// WORKAROUND for stack_store.i128 and stack_store.iXxY not being implemented
153+
let base_addr = fx.bcx.ins().stack_addr(fx.pointer_type, stack_slot, 0);
154+
fx.bcx.ins().store(flags, value, base_addr, self.offset);
155+
} else {
156+
fx.bcx.ins().stack_store(value, stack_slot, self.offset);
157+
}
155158
}
156159
}
157160
}

0 commit comments

Comments
 (0)