mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-02 16:21:11 +00:00
wasm_interp: neater creation of Value from unsigned integers
This commit is contained in:
parent
f7dcd8f421
commit
78fbc75249
2 changed files with 21 additions and 18 deletions
|
@ -776,8 +776,7 @@ impl<'a> ExecutionState<'a> {
|
||||||
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;
|
let result: u32 = arg1 / arg2;
|
||||||
self.value_stack
|
self.value_stack.push(Value::from(result));
|
||||||
.push(Value::I32(i32::from_ne_bytes(result.to_ne_bytes())));
|
|
||||||
}
|
}
|
||||||
I32REMS => {
|
I32REMS => {
|
||||||
let arg2 = self.value_stack.pop_i32();
|
let arg2 = self.value_stack.pop_i32();
|
||||||
|
@ -788,37 +787,32 @@ impl<'a> ExecutionState<'a> {
|
||||||
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;
|
let result: u32 = arg1 % arg2;
|
||||||
self.value_stack
|
self.value_stack.push(Value::from(result));
|
||||||
.push(Value::I32(i32::from_ne_bytes(result.to_ne_bytes())));
|
|
||||||
}
|
}
|
||||||
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;
|
let result: u32 = arg1 & arg2;
|
||||||
self.value_stack
|
self.value_stack.push(Value::from(result));
|
||||||
.push(Value::I32(i32::from_ne_bytes(result.to_ne_bytes())));
|
|
||||||
}
|
}
|
||||||
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;
|
let result: u32 = arg1 | arg2;
|
||||||
self.value_stack
|
self.value_stack.push(Value::from(result));
|
||||||
.push(Value::I32(i32::from_ne_bytes(result.to_ne_bytes())));
|
|
||||||
}
|
}
|
||||||
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;
|
let result: u32 = arg1 ^ arg2;
|
||||||
self.value_stack
|
self.value_stack.push(Value::from(result));
|
||||||
.push(Value::I32(i32::from_ne_bytes(result.to_ne_bytes())));
|
|
||||||
}
|
}
|
||||||
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;
|
let result: u32 = arg1 << k;
|
||||||
self.value_stack
|
self.value_stack.push(Value::from(result));
|
||||||
.push(Value::I32(i32::from_ne_bytes(result.to_ne_bytes())));
|
|
||||||
}
|
}
|
||||||
I32SHRS => {
|
I32SHRS => {
|
||||||
let arg2 = self.value_stack.pop_i32();
|
let arg2 = self.value_stack.pop_i32();
|
||||||
|
@ -831,22 +825,19 @@ impl<'a> ExecutionState<'a> {
|
||||||
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;
|
let result: u32 = arg1 >> k;
|
||||||
self.value_stack
|
self.value_stack.push(Value::from(result));
|
||||||
.push(Value::I32(i32::from_ne_bytes(result.to_ne_bytes())));
|
|
||||||
}
|
}
|
||||||
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);
|
let result: u32 = arg1.rotate_left(arg2);
|
||||||
self.value_stack
|
self.value_stack.push(Value::from(result));
|
||||||
.push(Value::I32(i32::from_ne_bytes(result.to_ne_bytes())));
|
|
||||||
}
|
}
|
||||||
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);
|
let result: u32 = arg1.rotate_right(arg2);
|
||||||
self.value_stack
|
self.value_stack.push(Value::from(result));
|
||||||
.push(Value::I32(i32::from_ne_bytes(result.to_ne_bytes())));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
I64CLZ => todo!("{:?} @ {:#x}", op_code, file_offset),
|
I64CLZ => todo!("{:?} @ {:#x}", op_code, file_offset),
|
||||||
|
|
|
@ -721,6 +721,18 @@ impl Value {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<u32> for Value {
|
||||||
|
fn from(x: u32) -> Self {
|
||||||
|
Value::I32(i32::from_ne_bytes(x.to_ne_bytes()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<u64> for Value {
|
||||||
|
fn from(x: u64) -> Self {
|
||||||
|
Value::I64(i64::from_ne_bytes(x.to_ne_bytes()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// 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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue