wasm_interp: use Value::from in more places

This commit is contained in:
Brian Carroll 2022-11-27 20:57:50 +00:00
parent 78fbc75249
commit 8e15d49720
No known key found for this signature in database
GPG key ID: 5C7B2EC4101703C0
2 changed files with 30 additions and 29 deletions

View file

@ -740,104 +740,93 @@ impl<'a> ExecutionState<'a> {
I32CLZ => { I32CLZ => {
let arg = self.value_stack.pop_u32(); let arg = self.value_stack.pop_u32();
self.value_stack self.value_stack.push(Value::from(arg.leading_zeros()));
.push(Value::I32(arg.leading_zeros() as i32));
} }
I32CTZ => { I32CTZ => {
let arg = self.value_stack.pop_u32(); let arg = self.value_stack.pop_u32();
self.value_stack self.value_stack.push(Value::from(arg.trailing_zeros()));
.push(Value::I32(arg.trailing_zeros() as i32));
} }
I32POPCNT => { I32POPCNT => {
let arg = self.value_stack.pop_u32(); let arg = self.value_stack.pop_u32();
self.value_stack.push(Value::I32(arg.count_ones() as i32)); self.value_stack.push(Value::from(arg.count_ones()));
} }
I32ADD => { I32ADD => {
let arg2 = self.value_stack.pop_i32(); let arg2 = self.value_stack.pop_i32();
let arg1 = self.value_stack.pop_i32(); let arg1 = self.value_stack.pop_i32();
self.value_stack.push(Value::I32(arg1 + arg2)); self.value_stack.push(Value::from(arg1 + arg2));
} }
I32SUB => { I32SUB => {
let arg2 = self.value_stack.pop_i32(); let arg2 = self.value_stack.pop_i32();
let arg1 = self.value_stack.pop_i32(); let arg1 = self.value_stack.pop_i32();
self.value_stack.push(Value::I32(arg1 - arg2)); self.value_stack.push(Value::from(arg1 - arg2));
} }
I32MUL => { I32MUL => {
let arg2 = self.value_stack.pop_i32(); let arg2 = self.value_stack.pop_i32();
let arg1 = self.value_stack.pop_i32(); let arg1 = self.value_stack.pop_i32();
self.value_stack.push(Value::I32(arg1 * arg2)); self.value_stack.push(Value::from(arg1 * arg2));
} }
I32DIVS => { I32DIVS => {
let arg2 = self.value_stack.pop_i32(); let arg2 = self.value_stack.pop_i32();
let arg1 = self.value_stack.pop_i32(); let arg1 = self.value_stack.pop_i32();
self.value_stack.push(Value::I32(arg1 / arg2)); self.value_stack.push(Value::from(arg1 / arg2));
} }
I32DIVU => { I32DIVU => {
let arg2 = self.value_stack.pop_u32(); let arg2 = self.value_stack.pop_u32();
let arg1 = self.value_stack.pop_u32(); let arg1 = self.value_stack.pop_u32();
let result: u32 = arg1 / arg2; self.value_stack.push(Value::from(arg1 / arg2));
self.value_stack.push(Value::from(result));
} }
I32REMS => { I32REMS => {
let arg2 = self.value_stack.pop_i32(); let arg2 = self.value_stack.pop_i32();
let arg1 = self.value_stack.pop_i32(); let arg1 = self.value_stack.pop_i32();
self.value_stack.push(Value::I32(arg1 % arg2)); self.value_stack.push(Value::from(arg1 % arg2));
} }
I32REMU => { I32REMU => {
let arg2 = self.value_stack.pop_u32(); let arg2 = self.value_stack.pop_u32();
let arg1 = self.value_stack.pop_u32(); let arg1 = self.value_stack.pop_u32();
let result: u32 = arg1 % arg2; self.value_stack.push(Value::from(arg1 % arg2));
self.value_stack.push(Value::from(result));
} }
I32AND => { I32AND => {
let arg2 = self.value_stack.pop_u32(); let arg2 = self.value_stack.pop_u32();
let arg1 = self.value_stack.pop_u32(); let arg1 = self.value_stack.pop_u32();
let result: u32 = arg1 & arg2; self.value_stack.push(Value::from(arg1 & arg2));
self.value_stack.push(Value::from(result));
} }
I32OR => { I32OR => {
let arg2 = self.value_stack.pop_u32(); let arg2 = self.value_stack.pop_u32();
let arg1 = self.value_stack.pop_u32(); let arg1 = self.value_stack.pop_u32();
let result: u32 = arg1 | arg2; self.value_stack.push(Value::from(arg1 | arg2));
self.value_stack.push(Value::from(result));
} }
I32XOR => { I32XOR => {
let arg2 = self.value_stack.pop_u32(); let arg2 = self.value_stack.pop_u32();
let arg1 = self.value_stack.pop_u32(); let arg1 = self.value_stack.pop_u32();
let result: u32 = arg1 ^ arg2; self.value_stack.push(Value::from(arg1 ^ arg2));
self.value_stack.push(Value::from(result));
} }
I32SHL => { I32SHL => {
let arg2 = self.value_stack.pop_u32(); let arg2 = self.value_stack.pop_u32();
let arg1 = self.value_stack.pop_u32(); let arg1 = self.value_stack.pop_u32();
let k = arg2 % 32; let k = arg2 % 32;
let result: u32 = arg1 << k; self.value_stack.push(Value::from(arg1 << k));
self.value_stack.push(Value::from(result));
} }
I32SHRS => { I32SHRS => {
let arg2 = self.value_stack.pop_i32(); let arg2 = self.value_stack.pop_i32();
let arg1 = self.value_stack.pop_i32(); let arg1 = self.value_stack.pop_i32();
let k = arg2 % 32; let k = arg2 % 32;
self.value_stack.push(Value::I32(arg1 >> k)); self.value_stack.push(Value::from(arg1 >> k));
} }
I32SHRU => { I32SHRU => {
let arg2 = self.value_stack.pop_u32(); let arg2 = self.value_stack.pop_u32();
let arg1 = self.value_stack.pop_u32(); let arg1 = self.value_stack.pop_u32();
let k = arg2 % 32; let k = arg2 % 32;
let result: u32 = arg1 >> k; self.value_stack.push(Value::from(arg1 >> k));
self.value_stack.push(Value::from(result));
} }
I32ROTL => { I32ROTL => {
let arg2 = self.value_stack.pop_u32(); let arg2 = self.value_stack.pop_u32();
let arg1 = self.value_stack.pop_u32(); let arg1 = self.value_stack.pop_u32();
let result: u32 = arg1.rotate_left(arg2); self.value_stack.push(Value::from(arg1.rotate_left(arg2)));
self.value_stack.push(Value::from(result));
} }
I32ROTR => { I32ROTR => {
let arg2 = self.value_stack.pop_u32(); let arg2 = self.value_stack.pop_u32();
let arg1 = self.value_stack.pop_u32(); let arg1 = self.value_stack.pop_u32();
let result: u32 = arg1.rotate_right(arg2); self.value_stack.push(Value::from(arg1.rotate_right(arg2)));
self.value_stack.push(Value::from(result));
} }
I64CLZ => todo!("{:?} @ {:#x}", op_code, file_offset), I64CLZ => todo!("{:?} @ {:#x}", op_code, file_offset),

View file

@ -733,6 +733,18 @@ impl From<u64> for Value {
} }
} }
impl From<i32> for Value {
fn from(x: i32) -> Self {
Value::I32(x)
}
}
impl From<i64> for Value {
fn from(x: i64) -> Self {
Value::I64(x)
}
}
/// Wasm memory alignment for load/store instructions. /// Wasm memory alignment for load/store instructions.
/// Rust representation matches Wasm encoding. /// Rust representation matches Wasm encoding.
/// It's an error to specify alignment higher than the "natural" alignment of the instruction /// It's an error to specify alignment higher than the "natural" alignment of the instruction