dev backend: implement subWrap for all integer types

This commit is contained in:
Christoph Rüßler 2022-09-22 20:09:13 +02:00 committed by Folkert
parent 081c61ead6
commit 1b023f828f
No known key found for this signature in database
GPG Key ID: 1F17F6FFD112B97C
2 changed files with 62 additions and 56 deletions

View File

@ -1035,19 +1035,9 @@ impl<
}
fn build_num_sub(&mut self, dst: &Symbol, src1: &Symbol, src2: &Symbol, layout: &InLayout<'a>) {
match self.layout_interner.get(*layout) {
Layout::Builtin(Builtin::Int(IntWidth::I64 | IntWidth::U64)) => {
let dst_reg = self.storage_manager.claim_general_reg(&mut self.buf, dst);
let src1_reg = self
.storage_manager
.load_to_general_reg(&mut self.buf, src1);
let src2_reg = self
.storage_manager
.load_to_general_reg(&mut self.buf, src2);
ASM::sub_reg64_reg64_reg64(&mut self.buf, dst_reg, src1_reg, src2_reg);
}
x => todo!("NumSub: layout, {:?}", x),
}
// for the time being, `num_sub` is implemented as wrapping subtraction. In roc, the normal
// `sub` should panic on overflow, but we just don't do that yet
self.build_num_sub_wrap(dst, src1, src2, layout)
}
fn build_num_sub_wrap(
@ -1058,7 +1048,7 @@ impl<
layout: &InLayout<'a>,
) {
match self.layout_interner.get(*layout) {
Layout::Builtin(Builtin::Int(IntWidth::I64 | IntWidth::U64)) => {
Layout::Builtin(Builtin::Int(quadword_and_smaller!())) => {
let dst_reg = self.storage_manager.claim_general_reg(&mut self.buf, dst);
let src1_reg = self
.storage_manager

View File

@ -1081,34 +1081,6 @@ fn gen_sub_dec() {
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn gen_sub_f64() {
assert_evals_to!(
indoc!(
r#"
1.5 - 2.4 - 3
"#
),
-3.9,
f64
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev", feature = "gen-wasm"))]
fn gen_sub_i64() {
assert_evals_to!(
indoc!(
r#"
1 - 2 - 3
"#
),
-4,
i64
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn gen_mul_dec() {
@ -1132,6 +1104,60 @@ fn gen_mul_dec() {
);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn gen_sub_f64() {
assert_evals_to!("1.5f64 - 2.4 - 3", -3.9, f64);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
fn gen_sub_f32() {
assert_evals_to!("1.5f32 - 2.4 - 3", -3.9, f32);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev", feature = "gen-wasm"))]
fn gen_sub_i8() {
assert_evals_to!("1i8 - 2i8 - 3i8", -4, i8);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev", feature = "gen-wasm"))]
fn gen_sub_u8() {
assert_evals_to!("8u8 - 2u8 - 3u8", 3, u8);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev", feature = "gen-wasm"))]
fn gen_sub_i16() {
assert_evals_to!("1i16 - 2i16 - 3i16", -4, i16);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev", feature = "gen-wasm"))]
fn gen_sub_u16() {
assert_evals_to!("8u16 - 2u16 - 3u16", 3, u16);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev", feature = "gen-wasm"))]
fn gen_sub_i32() {
assert_evals_to!("1i32 - 2i32 - 3i32", -4, i32);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev", feature = "gen-wasm"))]
fn gen_sub_u32() {
assert_evals_to!("8u32 - 2u32 - 3u32", 3, u32);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev", feature = "gen-wasm"))]
fn gen_sub_i64() {
assert_evals_to!("1 - 2 - 3", -4, i64);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev", feature = "gen-wasm"))]
fn gen_signed_mul_quadword_and_lower() {
@ -1869,29 +1895,19 @@ fn float_add_overflow() {
#[cfg(any(feature = "gen-llvm", feature = "gen-wasm"))]
#[should_panic(expected = r#"Roc failed with message: "integer subtraction overflowed!"#)]
fn int_sub_overflow() {
assert_evals_to!(
indoc!(
r#"
-9_223_372_036_854_775_808 - 1
"#
),
0,
i64
);
assert_evals_to!("-9_223_372_036_854_775_808 - 1", 0, i64);
}
#[test]
#[cfg(any(feature = "gen-llvm", feature = "gen-dev", feature = "gen-wasm"))]
fn int_sub_wrap() {
assert_evals_to!(
indoc!(
r#"
Num.subWrap -9_223_372_036_854_775_808 1
"#
),
"Num.subWrap -9_223_372_036_854_775_808 1",
std::i64::MAX,
i64
);
assert_evals_to!("Num.subWrap -128i8 1", std::i8::MAX, i8);
}
#[test]