diff --git a/src/value.ml b/src/value.ml index 9a4613045ca..763fb3afc7b 100644 --- a/src/value.ml +++ b/src/value.ml @@ -61,8 +61,8 @@ struct let lognot i = inj (Rep.lognot (proj i)) let logxor i j = inj (Rep.logxor (proj i) (proj j)) let shift_left i j = Rep.shift_left i j - let shift_right = Rep.shift_right - let shift_right_logical = Rep.shift_right_logical + let shift_right i j = let res = Rep.shift_right i j in inj (proj res) + let shift_right_logical i j = let res = Rep.shift_right_logical i j in inj (proj res) let of_int i = inj (Rep.of_int i) let to_int i = Rep.to_int (proj i) let to_string i = group_num (Rep.to_string (proj i)) diff --git a/test/run/ok/word-rotations.wasm-run.ok b/test/run/ok/word-rotations.wasm-run.ok new file mode 100644 index 00000000000..8f241da436a --- /dev/null +++ b/test/run/ok/word-rotations.wasm-run.ok @@ -0,0 +1 @@ +_out/word-rotations.wasm:0x___: runtime trap: unreachable executed diff --git a/test/run/ok/word-rotations.wasm.stderr.ok b/test/run/ok/word-rotations.wasm.stderr.ok new file mode 100644 index 00000000000..4a2e9f4a79f --- /dev/null +++ b/test/run/ok/word-rotations.wasm.stderr.ok @@ -0,0 +1,74 @@ +compile_binop: RotROp +compile_binop: RotROp +compile_eq: EqOp +of_type: Word16 +compile_lit: (Word16Lit 5_4715) +compile_binop: RotROp +of_type: Word16 +compile_lit: (Word16Lit 4) +compile_lit: (Word16Lit 23_485) +compile_eq: EqOp +of_type: Word16 +compile_lit: (Word16Lit 5_4715) +compile_binop: RotROp +of_type: Word16 +compile_lit: (Word16Lit 20) +compile_lit: (Word16Lit 23_485) +compile_eq: EqOp +of_type: Word8 +compile_lit: (Word8Lit 202) +compile_binop: RotROp +of_type: Word8 +compile_lit: (Word8Lit 3) +compile_lit: (Word8Lit 86) +compile_eq: EqOp +of_type: Word8 +compile_lit: (Word8Lit 202) +compile_binop: RotROp +of_type: Word8 +compile_lit: (Word8Lit 11) +compile_lit: (Word8Lit 86) +compile_eq: EqOp +of_type: Word8 +compile_lit: (Word8Lit 202) +compile_binop: RotROp +of_type: Word8 +compile_lit: (Word8Lit 19) +compile_lit: (Word8Lit 86) +compile_binop: RotLOp +compile_binop: RotLOp +compile_eq: EqOp +of_type: Word16 +compile_lit: (Word16Lit 4_8085) +compile_binop: RotLOp +of_type: Word16 +compile_lit: (Word16Lit 4) +compile_lit: (Word16Lit 23_485) +compile_eq: EqOp +of_type: Word16 +compile_lit: (Word16Lit 4_8085) +compile_binop: RotLOp +of_type: Word16 +compile_lit: (Word16Lit 20) +compile_lit: (Word16Lit 23_485) +compile_eq: EqOp +of_type: Word8 +compile_lit: (Word8Lit 178) +compile_binop: RotLOp +of_type: Word8 +compile_lit: (Word8Lit 3) +compile_lit: (Word8Lit 86) +compile_eq: EqOp +of_type: Word8 +compile_lit: (Word8Lit 178) +compile_binop: RotLOp +of_type: Word8 +compile_lit: (Word8Lit 11) +compile_lit: (Word8Lit 86) +compile_eq: EqOp +of_type: Word8 +compile_lit: (Word8Lit 178) +compile_binop: RotLOp +of_type: Word8 +compile_lit: (Word8Lit 19) +compile_lit: (Word8Lit 86) diff --git a/test/run/word-rotations.as b/test/run/word-rotations.as new file mode 100644 index 00000000000..1f2d5d5c90c --- /dev/null +++ b/test/run/word-rotations.as @@ -0,0 +1,21 @@ +assert ((0x5bafecbd : Word32) <>> (4 : Word32) == (0xd5bafecb : Word32)); +assert ((0x5bafecbd : Word32) <>> (36 : Word32) == (0xd5bafecb : Word32)); + +assert ((0x5bbd : Word16) <>> (4 : Word16) == (0xd5bb : Word16)); +assert ((0x5bbd : Word16) <>> (20 : Word16) == (0xd5bb : Word16)); + + +assert ((0x56 : Word8) <>> (3 : Word8) == (0xca : Word8)); // 01010110 -> 11001010 +assert ((0x56 : Word8) <>> (11 : Word8) == (0xca : Word8)); +assert ((0x56 : Word8) <>> (19 : Word8) == (0xca : Word8)); + + +assert ((0x5bafecbd : Word32) <<> (4 : Word32) == (0xbafecbd5 : Word32)); +assert ((0x5bafecbd : Word32) <<> (36 : Word32) == (0xbafecbd5 : Word32)); + +assert ((0x5bbd : Word16) <<> (4 : Word16) == (0xbbd5 : Word16)); +assert ((0x5bbd : Word16) <<> (20 : Word16) == (0xbbd5 : Word16)); + +assert ((0x56 : Word8) <<> (3 : Word8) == (0xb2 : Word8)); // 01010110 -> 10110010 +assert ((0x56 : Word8) <<> (11 : Word8) == (0xb2 : Word8)); +assert ((0x56 : Word8) <<> (19 : Word8) == (0xb2 : Word8));