adds Num.subWrap

This commit is contained in:
Celso Bonutti Filho 2020-12-22 22:17:45 -03:00
parent c6b258c50c
commit 176cdd0274
7 changed files with 23 additions and 2 deletions

View file

@ -104,6 +104,12 @@ pub fn types() -> MutMap<Symbol, (SolvedType, Region)> {
), ),
); );
// subWrap : Int, Int -> Int
add_type(
Symbol::NUM_SUB_WRAP,
top_level_function(vec![int_type(), int_type()], Box::new(int_type())),
);
// mul or (*) : Num a, Num a -> Num a // mul or (*) : Num a, Num a -> Num a
add_type( add_type(
Symbol::NUM_MUL, Symbol::NUM_MUL,

View file

@ -174,6 +174,12 @@ pub fn types() -> MutMap<Symbol, (SolvedType, Region)> {
unique_function(vec![num_type(u, num), num_type(v, num)], num_type(w, num)) unique_function(vec![num_type(u, num), num_type(v, num)], num_type(w, num))
}); });
// subWrap : Num a, Num a -> Num a
add_type(Symbol::NUM_SUB_WRAP, {
let_tvars! { u, v, w, num };
unique_function(vec![num_type(u, num), num_type(v, num)], num_type(w, num))
});
// mul or (*) : Num a, Num a -> Num a // mul or (*) : Num a, Num a -> Num a
add_type(Symbol::NUM_MUL, { add_type(Symbol::NUM_MUL, {
let_tvars! { u, v, w, num }; let_tvars! { u, v, w, num };

View file

@ -82,6 +82,7 @@ pub fn builtin_defs_map(symbol: Symbol, var_store: &mut VarStore) -> Option<Def>
NUM_ADD_CHECKED => num_add_checked, NUM_ADD_CHECKED => num_add_checked,
NUM_ADD_WRAP => num_add_wrap, NUM_ADD_WRAP => num_add_wrap,
NUM_SUB => num_sub, NUM_SUB => num_sub,
NUM_SUB_WRAP => num_sub_wrap,
NUM_MUL => num_mul, NUM_MUL => num_mul,
NUM_GT => num_gt, NUM_GT => num_gt,
NUM_GTE => num_gte, NUM_GTE => num_gte,
@ -472,6 +473,11 @@ fn num_sub(symbol: Symbol, var_store: &mut VarStore) -> Def {
num_binop(symbol, var_store, LowLevel::NumSub) num_binop(symbol, var_store, LowLevel::NumSub)
} }
/// Num.subWrap : Num a, Num a -> Num a
fn num_sub_wrap(symbol: Symbol, var_store: &mut VarStore) -> Def {
num_binop(symbol, var_store, LowLevel::NumSubWrap)
}
/// Num.mul : Num a, Num a -> Num a /// Num.mul : Num a, Num a -> Num a
fn num_mul(symbol: Symbol, var_store: &mut VarStore) -> Def { fn num_mul(symbol: Symbol, var_store: &mut VarStore) -> Def {
num_binop(symbol, var_store, LowLevel::NumMul) num_binop(symbol, var_store, LowLevel::NumMul)

View file

@ -3002,7 +3002,7 @@ fn run_low_level<'a, 'ctx, 'env>(
} }
NumAdd | NumSub | NumMul | NumLt | NumLte | NumGt | NumGte | NumRemUnchecked NumAdd | NumSub | NumMul | NumLt | NumLte | NumGt | NumGte | NumRemUnchecked
| NumAddWrap | NumAddChecked | NumDivUnchecked | NumPow | NumPowInt => { | NumAddWrap | NumAddChecked | NumDivUnchecked | NumPow | NumPowInt | NumSubWrap => {
debug_assert_eq!(args.len(), 2); debug_assert_eq!(args.len(), 2);
let (lhs_arg, lhs_layout) = load_symbol_and_layout(env, scope, &args[0]); let (lhs_arg, lhs_layout) = load_symbol_and_layout(env, scope, &args[0]);
@ -3256,6 +3256,7 @@ fn build_int_binop<'a, 'ctx, 'env>(
sub_result sub_result
} }
NumSubWrap => bd.build_int_sub(lhs, rhs, "sub_int").into(),
NumMul => bd.build_int_mul(lhs, rhs, "mul_int").into(), NumMul => bd.build_int_mul(lhs, rhs, "mul_int").into(),
NumGt => bd.build_int_compare(SGT, lhs, rhs, "int_gt").into(), NumGt => bd.build_int_compare(SGT, lhs, rhs, "int_gt").into(),
NumGte => bd.build_int_compare(SGE, lhs, rhs, "int_gte").into(), NumGte => bd.build_int_compare(SGE, lhs, rhs, "int_gte").into(),

View file

@ -31,6 +31,7 @@ pub enum LowLevel {
NumAddWrap, NumAddWrap,
NumAddChecked, NumAddChecked,
NumSub, NumSub,
NumSubWrap,
NumMul, NumMul,
NumGt, NumGt,
NumGte, NumGte,

View file

@ -798,6 +798,7 @@ define_builtins! {
55 NUM_ACOS: "acos" 55 NUM_ACOS: "acos"
56 NUM_ASIN: "asin" 56 NUM_ASIN: "asin"
57 NUM_BITWISE_AND: "bitwiseAnd" 57 NUM_BITWISE_AND: "bitwiseAnd"
58 NUM_SUB_WRAP: "subWrap"
} }
2 BOOL: "Bool" => { 2 BOOL: "Bool" => {
0 BOOL_BOOL: "Bool" imported // the Bool.Bool type alias 0 BOOL_BOOL: "Bool" imported // the Bool.Bool type alias

View file

@ -539,7 +539,7 @@ pub fn lowlevel_borrow_signature(arena: &Bump, op: LowLevel) -> &[bool] {
ListWalkBackwards => arena.alloc_slice_copy(&[borrowed, irrelevant, owned]), ListWalkBackwards => arena.alloc_slice_copy(&[borrowed, irrelevant, owned]),
ListSum => arena.alloc_slice_copy(&[borrowed]), ListSum => arena.alloc_slice_copy(&[borrowed]),
Eq | NotEq | And | Or | NumAdd | NumAddWrap | NumAddChecked | NumSub | NumMul | NumGt Eq | NotEq | And | Or | NumAdd | NumAddWrap | NumAddChecked | NumSub | NumSubWrap | NumMul | NumGt
| NumGte | NumLt | NumLte | NumCompare | NumDivUnchecked | NumRemUnchecked | NumPow | NumGte | NumLt | NumLte | NumCompare | NumDivUnchecked | NumRemUnchecked | NumPow
| NumPowInt | NumBitwiseAnd => arena.alloc_slice_copy(&[irrelevant, irrelevant]), | NumPowInt | NumBitwiseAnd => arena.alloc_slice_copy(&[irrelevant, irrelevant]),