walt icon indicating copy to clipboard operation
walt copied to clipboard

Unsigned integers

Open Razem opened this issue 6 years ago • 2 comments

Feature Request

Overview

Walt currently supports only signed integers and signed operations. Since WebAssembly also supports unsigned operations, it would be really neat to also have unsigned types u32 and u64. These operations should be used:

  • i32.div_u and i64.div_u (x / y)
  • i32.rem_u and i64.rem_u (x % y)
  • i32.shr_u and i64.shr_u (x >> y)
  • i32.lt_u and i64.lt_u (x < y)
  • i32.le_u and i64.le_u (x <= y)
  • i32.gt_u and i64.gt_u (x > y)
  • i32.ge_u and i64.ge_u (x >= y)
  • i64.load32_u (const x: u32 = 10; const y: u64 = x;)
  • i32.trunc_u/f32 (const x: f32 = 10; const y: u32 = x;)
  • i32.trunc_u/f64 (const x: f64 = 10; const y: u32 = x;)
  • i64.extend_u/i32 (const x: u32 = 10; const y: u64 = x;)
  • i64.trunc_u/f32 (const x: f32 = 10; const y: u64 = x;)
  • i64.trunc_u/f64 (const x: f64 = 10; const y: u64 = x;)
  • f32.convert_u/i32 (const x: u32 = 10; const y: f32 = x;)
  • f32.convert_u/i64 (const x: u64 = 10; const y: f32 = x;)
  • f64.convert_u/i32 (const x: u32 = 10; const y: f64 = x;)
  • f64.convert_u/i64 (const x: u64 = 10; const y: f64 = x;)

Example

const x: u32 = 42;
const y: u32 = 0xffffffff;
const z: i32 = x < y; // should be 1

Razem avatar May 19 '18 17:05 Razem

Hey, thanks for the suggestion! I can see this being useful for sure. This will add an edge case of signed < unsigned comparisons but without the types, we would have to expose the opcodes above directly.

Will implement this, in some near future.

ballercat avatar May 20 '18 14:05 ballercat

Well, I think in the case of signed < unsigned both operands should be treated as unsigned integers (with some additional option to manually cast an unsigned integer to a signed one). But it would be nice to also have all opcodes accessible in some form.

Razem avatar May 21 '18 13:05 Razem