Fix types of SIMD or, xor, and
The operands of these bitwise instructions could have different types and still be valid Wasm (i.e. `v128`). Because of this, we must tell Cranelift to cast both operands to the same type--the default type, in this case. This undoes the work merged in https://github.com/bytecodealliance/cranelift/pull/1233.
This commit is contained in:
@@ -864,15 +864,15 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
|
||||
let (arg1, arg2) = state.pop2();
|
||||
state.push1(builder.ins().iadd(arg1, arg2));
|
||||
}
|
||||
Operator::I32And | Operator::I64And | Operator::V128And => {
|
||||
Operator::I32And | Operator::I64And => {
|
||||
let (arg1, arg2) = state.pop2();
|
||||
state.push1(builder.ins().band(arg1, arg2));
|
||||
}
|
||||
Operator::I32Or | Operator::I64Or | Operator::V128Or => {
|
||||
Operator::I32Or | Operator::I64Or => {
|
||||
let (arg1, arg2) = state.pop2();
|
||||
state.push1(builder.ins().bor(arg1, arg2));
|
||||
}
|
||||
Operator::I32Xor | Operator::I64Xor | Operator::V128Xor => {
|
||||
Operator::I32Xor | Operator::I64Xor => {
|
||||
let (arg1, arg2) = state.pop2();
|
||||
state.push1(builder.ins().bxor(arg1, arg2));
|
||||
}
|
||||
@@ -1331,6 +1331,18 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
|
||||
let (a, b) = pop2_with_bitcast(state, type_of(op), builder);
|
||||
state.push1(builder.ins().imul(a, b))
|
||||
}
|
||||
Operator::V128Or => {
|
||||
let (a, b) = pop2_with_bitcast(state, type_of(op), builder);
|
||||
state.push1(builder.ins().bor(a, b))
|
||||
}
|
||||
Operator::V128Xor => {
|
||||
let (a, b) = pop2_with_bitcast(state, type_of(op), builder);
|
||||
state.push1(builder.ins().bxor(a, b))
|
||||
}
|
||||
Operator::V128And => {
|
||||
let (a, b) = pop2_with_bitcast(state, type_of(op), builder);
|
||||
state.push1(builder.ins().band(a, b))
|
||||
}
|
||||
Operator::V128AndNot => {
|
||||
let (a, b) = pop2_with_bitcast(state, type_of(op), builder);
|
||||
state.push1(builder.ins().band_not(a, b))
|
||||
|
||||
Reference in New Issue
Block a user