diff --git a/compiler/can/src/builtins.rs b/compiler/can/src/builtins.rs index ab00f998e6..9c4068a593 100644 --- a/compiler/can/src/builtins.rs +++ b/compiler/can/src/builtins.rs @@ -90,6 +90,7 @@ pub fn builtin_defs(var_store: &mut VarStore) -> MutMap { Symbol::NUM_IS_POSITIVE => num_is_positive, Symbol::NUM_IS_NEGATIVE => num_is_negative, Symbol::NUM_TO_FLOAT => num_to_float, + Symbol::NUM_POW => num_pow, } } @@ -578,6 +579,28 @@ fn num_round(symbol: Symbol, var_store: &mut VarStore) -> Def { ) } +/// Num.pow : Float, Float -> Float +fn num_pow(symbol: Symbol, var_store: &mut VarStore) -> Def { + let float_var = var_store.fresh(); + + let body = RunLowLevel { + op: LowLevel::NumPow, + args: vec![ + (float_var, Var(Symbol::ARG_1)), + (float_var, Var(Symbol::ARG_2)), + ], + ret_var: float_var, + }; + + defn( + symbol, + vec![(float_var, Symbol::ARG_1), (float_var, Symbol::ARG_2)], + var_store, + body, + float_var, + ) +} + /// List.isEmpty : List * -> Bool fn list_is_empty(symbol: Symbol, var_store: &mut VarStore) -> Def { let list_var = var_store.fresh(); diff --git a/compiler/gen/src/llvm/build.rs b/compiler/gen/src/llvm/build.rs index cf76f50137..0b7c3e38a0 100644 --- a/compiler/gen/src/llvm/build.rs +++ b/compiler/gen/src/llvm/build.rs @@ -1733,7 +1733,7 @@ fn run_low_level<'a, 'ctx, 'env>( } NumAdd | NumSub | NumMul | NumLt | NumLte | NumGt | NumGte | NumRemUnchecked - | NumDivUnchecked => { + | NumDivUnchecked | NumPow => { debug_assert_eq!(args.len(), 2); let (lhs_arg, lhs_layout) = load_symbol_and_layout(env, scope, &args[0]); diff --git a/compiler/module/src/low_level.rs b/compiler/module/src/low_level.rs index 1ca4f18770..489f05f143 100644 --- a/compiler/module/src/low_level.rs +++ b/compiler/module/src/low_level.rs @@ -35,6 +35,7 @@ pub enum LowLevel { NumSqrtUnchecked, NumRound, NumToFloat, + NumPow, Eq, NotEq, And, diff --git a/compiler/mono/src/borrow.rs b/compiler/mono/src/borrow.rs index f46fe365c4..ffebd21c5d 100644 --- a/compiler/mono/src/borrow.rs +++ b/compiler/mono/src/borrow.rs @@ -522,7 +522,7 @@ pub fn lowlevel_borrow_signature(arena: &Bump, op: LowLevel) -> &[bool] { ListWalkRight => arena.alloc_slice_copy(&[borrowed, irrelevant, owned]), Eq | NotEq | And | Or | NumAdd | NumSub | NumMul | NumGt | NumGte | NumLt | NumLte - | NumCompare | NumDivUnchecked | NumRemUnchecked => { + | NumCompare | NumDivUnchecked | NumRemUnchecked | NumPow => { arena.alloc_slice_copy(&[irrelevant, irrelevant]) }