mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-28 06:14:46 +00:00
adds Num.subWrap
This commit is contained in:
parent
c6b258c50c
commit
176cdd0274
7 changed files with 23 additions and 2 deletions
|
@ -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,
|
||||||
|
|
|
@ -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 };
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -31,6 +31,7 @@ pub enum LowLevel {
|
||||||
NumAddWrap,
|
NumAddWrap,
|
||||||
NumAddChecked,
|
NumAddChecked,
|
||||||
NumSub,
|
NumSub,
|
||||||
|
NumSubWrap,
|
||||||
NumMul,
|
NumMul,
|
||||||
NumGt,
|
NumGt,
|
||||||
NumGte,
|
NumGte,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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]),
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue