diff --git a/compiler/can/src/builtins.rs b/compiler/can/src/builtins.rs index 6751010d0f..0f27af068c 100644 --- a/compiler/can/src/builtins.rs +++ b/compiler/can/src/builtins.rs @@ -271,6 +271,77 @@ pub fn builtin_defs(var_store: &mut VarStore) -> MutMap { } } +fn lowlevel_1(symbol: Symbol, op: LowLevel, var_store: &mut VarStore) -> Def { + let arg1_var = var_store.fresh(); + let ret_var = var_store.fresh(); + + let body = RunLowLevel { + op, + args: vec![(arg1_var, Var(Symbol::ARG_1))], + ret_var, + }; + + defn( + symbol, + vec![(arg1_var, Symbol::ARG_1)], + var_store, + body, + ret_var, + ) +} + +fn lowlevel_2(symbol: Symbol, op: LowLevel, var_store: &mut VarStore) -> Def { + let arg1_var = var_store.fresh(); + let arg2_var = var_store.fresh(); + let ret_var = var_store.fresh(); + + let body = RunLowLevel { + op, + args: vec![ + (arg1_var, Var(Symbol::ARG_1)), + (arg2_var, Var(Symbol::ARG_2)), + ], + ret_var, + }; + + defn( + symbol, + vec![(arg1_var, Symbol::ARG_1), (arg2_var, Symbol::ARG_2)], + var_store, + body, + ret_var, + ) +} + +fn lowlevel_3(symbol: Symbol, op: LowLevel, var_store: &mut VarStore) -> Def { + let arg1_var = var_store.fresh(); + let arg2_var = var_store.fresh(); + let arg3_var = var_store.fresh(); + let ret_var = var_store.fresh(); + + let body = RunLowLevel { + op, + args: vec![ + (arg1_var, Var(Symbol::ARG_1)), + (arg2_var, Var(Symbol::ARG_2)), + (arg3_var, Var(Symbol::ARG_3)), + ], + ret_var, + }; + + defn( + symbol, + vec![ + (arg1_var, Symbol::ARG_1), + (arg2_var, Symbol::ARG_2), + (arg3_var, Symbol::ARG_3), + ], + var_store, + body, + ret_var, + ) +} + /// Num.maxInt : Int fn num_max_int(symbol: Symbol, var_store: &mut VarStore) -> Def { let int_var = var_store.fresh();