diff --git a/cranelift/codegen/src/ir/immediates.rs b/cranelift/codegen/src/ir/immediates.rs index 529a97a019..473a8e5ed3 100644 --- a/cranelift/codegen/src/ir/immediates.rs +++ b/cranelift/codegen/src/ir/immediates.rs @@ -26,6 +26,12 @@ impl IntoBytes for u8 { } } +impl IntoBytes for i8 { + fn into_bytes(self) -> Vec { + vec![self as u8] + } +} + impl IntoBytes for i16 { fn into_bytes(self) -> Vec { self.to_le_bytes().to_vec() diff --git a/cranelift/filetests/filetests/runtests/simd-saddsat-aarch64.clif b/cranelift/filetests/filetests/runtests/simd-saddsat-aarch64.clif new file mode 100644 index 0000000000..5b3cacaa87 --- /dev/null +++ b/cranelift/filetests/filetests/runtests/simd-saddsat-aarch64.clif @@ -0,0 +1,17 @@ +test interpret +test run +target aarch64 + +function %saddsat_i32x4(i32x4, i32x4) -> i32x4 { +block0(v0: i32x4, v1: i32x4): + v2 = sadd_sat v0, v1 + return v2 +} +; run: %saddsat_i32x4([256 -2147483000 2147483000 2147483000], [256 -1000 1000 1000]) == [512 -2147483648 2147483647 2147483647] + +function %saddsat_i64x2(i64x2, i64x2) -> i64x2 { +block0(v0: i64x2, v1: i64x2): + v2 = sadd_sat v0, v1 + return v2 +} +; run: %saddsat_i64x2([-9223372036854775000 9223372036854775000], [-1000 1000]) == [-9223372036854775808 9223372036854775807] diff --git a/cranelift/filetests/filetests/runtests/simd-saddsat.clif b/cranelift/filetests/filetests/runtests/simd-saddsat.clif new file mode 100644 index 0000000000..473dcef83e --- /dev/null +++ b/cranelift/filetests/filetests/runtests/simd-saddsat.clif @@ -0,0 +1,19 @@ +test interpret +test run +target aarch64 +set enable_simd +target x86_64 + +function %saddsat_i8x16(i8x16, i8x16) -> i8x16 { +block0(v0: i8x16, v1: i8x16): + v2 = sadd_sat v0, v1 + return v2 +} +; run: %saddsat_i8x16([1 100 100 100 100 100 100 100 -100 -100 -100 -100 -100 -100 -100 -100], [1 100 100 100 100 100 100 100 -100 -100 -100 -100 -100 -100 -100 -100]) == [2 127 127 127 127 127 127 127 -128 -128 -128 -128 -128 -128 -128 -128] + +function %saddsat_i16x8(i16x8, i16x8) -> i16x8 { +block0(v0: i16x8, v1: i16x8): + v2 = sadd_sat v0, v1 + return v2 +} +; run: %saddsat_i16x8([1 -32000 -32000 -32000 32000 32000 32000 32000], [1 -1000 -1000 -1000 1000 1000 1000 1000]) == [2 -32768 -32768 -32768 32767 32767 32767 32767] diff --git a/cranelift/filetests/filetests/runtests/simd-ssubsat-aarch64.clif b/cranelift/filetests/filetests/runtests/simd-ssubsat-aarch64.clif new file mode 100644 index 0000000000..7292e78f89 --- /dev/null +++ b/cranelift/filetests/filetests/runtests/simd-ssubsat-aarch64.clif @@ -0,0 +1,17 @@ +test interpret +test run +target aarch64 + +function %ssubsat_i32x4(i32x4, i32x4) -> i32x4 { +block0(v0: i32x4, v1: i32x4): + v2 = ssub_sat v0, v1 + return v2 +} +; run: %ssubsat_i32x4([256 -2147483000 2147483000 2147483000], [256 1000 -1000 -1000]) == [0 -2147483648 2147483647 2147483647] + +function %ssubsat_i64x2(i64x2, i64x2) -> i64x2 { +block0(v0: i64x2, v1: i64x2): + v2 = ssub_sat v0, v1 + return v2 +} +; run: %ssubsat_i64x2([-9223372036854775000 9223372036854775000], [1000 -1000]) == [-9223372036854775808 9223372036854775807] diff --git a/cranelift/filetests/filetests/runtests/simd-ssubsat.clif b/cranelift/filetests/filetests/runtests/simd-ssubsat.clif new file mode 100644 index 0000000000..0226b5a397 --- /dev/null +++ b/cranelift/filetests/filetests/runtests/simd-ssubsat.clif @@ -0,0 +1,19 @@ +test interpret +test run +target aarch64 +set enable_simd +target x86_64 + +function %ssubsat_i8x16(i8x16, i8x16) -> i8x16 { +block0(v0: i8x16, v1: i8x16): + v2 = ssub_sat v0, v1 + return v2 +} +; run: %ssubsat_i8x16([1 100 100 100 100 100 100 100 -100 -100 -100 -100 -100 -100 -100 -100], [1 -100 -100 -100 -100 -100 -100 -100 100 100 100 100 100 100 100 100]) == [0 127 127 127 127 127 127 127 -128 -128 -128 -128 -128 -128 -128 -128] + +function %ssubsat_i16x8(i16x8, i16x8) -> i16x8 { +block0(v0: i16x8, v1: i16x8): + v2 = ssub_sat v0, v1 + return v2 +} +; run: %ssubsat_i16x8([1 -32000 -32000 -32000 32000 32000 32000 32000], [1 1000 1000 1000 -1000 -1000 -1000 -1000]) == [0 -32768 -32768 -32768 32767 32767 32767 32767] diff --git a/cranelift/interpreter/src/step.rs b/cranelift/interpreter/src/step.rs index c2fe6be15b..c38b849010 100644 --- a/cranelift/interpreter/src/step.rs +++ b/cranelift/interpreter/src/step.rs @@ -503,7 +503,13 @@ where Value::add_sat, true, )?), - Opcode::SaddSat => unimplemented!("SaddSat"), + Opcode::SaddSat => assign(binary_arith( + arg(0)?, + arg(1)?, + ctrl_ty, + Value::add_sat, + false, + )?), Opcode::Isub => binary(Value::sub, arg(0)?, arg(1)?)?, Opcode::UsubSat => assign(binary_arith( arg(0)?, @@ -512,7 +518,13 @@ where Value::sub_sat, true, )?), - Opcode::SsubSat => unimplemented!("SsubSat"), + Opcode::SsubSat => assign(binary_arith( + arg(0)?, + arg(1)?, + ctrl_ty, + Value::sub_sat, + false, + )?), Opcode::Ineg => binary(Value::sub, Value::int(0, ctrl_ty)?, arg(0)?)?, Opcode::Iabs => unimplemented!("Iabs"), Opcode::Imul => binary(Value::mul, arg(0)?, arg(1)?)?, diff --git a/cranelift/reader/src/parser.rs b/cranelift/reader/src/parser.rs index 17dbdcba1a..97b4a7c77d 100644 --- a/cranelift/reader/src/parser.rs +++ b/cranelift/reader/src/parser.rs @@ -1106,7 +1106,7 @@ impl<'a> Parser<'a> { err!(self.loc, "Expected a controlling vector type, not {}", ty) } else { let constant_data = match ty.lane_type() { - I8 => consume!(ty, self.match_uimm8("Expected an 8-bit unsigned integer")?), + I8 => consume!(ty, self.match_imm8("Expected an 8-bit integer")?), I16 => consume!(ty, self.match_imm16("Expected a 16-bit integer")?), I32 => consume!(ty, self.match_imm32("Expected a 32-bit integer")?), I64 => consume!(ty, self.match_imm64("Expected a 64-bit integer")?),