diff --git a/runtime/src/vampir/stdlib.pir b/runtime/src/vampir/stdlib.pir index 246ae2de16..31f2237d51 100644 --- a/runtime/src/vampir/stdlib.pir +++ b/runtime/src/vampir/stdlib.pir @@ -63,6 +63,19 @@ def mul (x, e1) (y, e2) = { (x * y, e1 * e2 * range_check (x * y)) }; +def fadd (x, e1) (y, e2) = { + (x + y, e1 * e2) +}; +def fsub (x, e1) (y, e2) = { + (x - y, e1 * e2) +}; +def fmul (x, e1) (y, e2) = { + (x * y, e1 * e2) +}; +def fdiv (x, e1) (y, e2) = { + (x / y, e1 * e2) +}; + def equal (x, e1) (y, e2) = (isZero (x - y), e1 * e2); def if (b, e) (x, e1) (y, e2) = (b * x + (1 - b) * y, e * (b * e1 + (1 - b) * e2)); diff --git a/runtime/src/vampir/stdlib_unsafe.pir b/runtime/src/vampir/stdlib_unsafe.pir index f27cf00794..0855d2a73d 100644 --- a/runtime/src/vampir/stdlib_unsafe.pir +++ b/runtime/src/vampir/stdlib_unsafe.pir @@ -41,6 +41,11 @@ def add x y = x + y; def sub x y = x - y; def mul x y = x * y; +def fadd x y = x + y; +def fsub x y = x - y; +def fmul x y = x * y; +def fdiv x y = x / y; + def equal x y = isZero (x - y); def if b x y = b * x + (1 - b) * y; diff --git a/src/Juvix/Compiler/Backend/VampIR/Language.hs b/src/Juvix/Compiler/Backend/VampIR/Language.hs index 96b5a14f13..11c08d5198 100644 --- a/src/Juvix/Compiler/Backend/VampIR/Language.hs +++ b/src/Juvix/Compiler/Backend/VampIR/Language.hs @@ -16,6 +16,10 @@ data OpCode | OpMul | OpDiv | OpMod + | OpFieldAdd + | OpFieldSub + | OpFieldMul + | OpFieldDiv | OpEq | OpLt | OpLe diff --git a/src/Juvix/Compiler/Backend/VampIR/Pretty/Base.hs b/src/Juvix/Compiler/Backend/VampIR/Pretty/Base.hs index ca33753804..4c05c02867 100644 --- a/src/Juvix/Compiler/Backend/VampIR/Pretty/Base.hs +++ b/src/Juvix/Compiler/Backend/VampIR/Pretty/Base.hs @@ -29,6 +29,10 @@ instance PrettyCode OpCode where OpMul -> return kwMul OpDiv -> return kwDiv OpMod -> return kwMod + OpFieldAdd -> return kwFieldAdd + OpFieldSub -> return kwFieldSub + OpFieldMul -> return kwFieldMul + OpFieldDiv -> return kwFieldDiv OpEq -> return kwEqual OpLt -> return kwLessThan OpLe -> return kwLessOrEqual diff --git a/src/Juvix/Compiler/Backend/VampIR/Pretty/Keywords.hs b/src/Juvix/Compiler/Backend/VampIR/Pretty/Keywords.hs index a54fdb5967..c40416fa74 100644 --- a/src/Juvix/Compiler/Backend/VampIR/Pretty/Keywords.hs +++ b/src/Juvix/Compiler/Backend/VampIR/Pretty/Keywords.hs @@ -31,6 +31,18 @@ kwDiv = keyword Str.vampirDiv kwMod :: Doc Ann kwMod = keyword Str.vampirMod +kwFieldAdd :: Doc Ann +kwFieldAdd = keyword Str.fadd + +kwFieldSub :: Doc Ann +kwFieldSub = keyword Str.fsub + +kwFieldMul :: Doc Ann +kwFieldMul = keyword Str.fmul + +kwFieldDiv :: Doc Ann +kwFieldDiv = keyword Str.fdiv + kwEqual :: Doc Ann kwEqual = keyword Str.vampirEqual diff --git a/src/Juvix/Compiler/Backend/VampIR/Translation/FromCore.hs b/src/Juvix/Compiler/Backend/VampIR/Translation/FromCore.hs index 77bb107a37..2e7e86071f 100644 --- a/src/Juvix/Compiler/Backend/VampIR/Translation/FromCore.hs +++ b/src/Juvix/Compiler/Backend/VampIR/Translation/FromCore.hs @@ -92,11 +92,18 @@ fromCoreNode ii node = OpIntMod -> OpMod OpIntLt -> OpLt OpIntLe -> OpLe + Core.OpFieldAdd -> VampIR.OpFieldAdd + Core.OpFieldSub -> VampIR.OpFieldSub + Core.OpFieldMul -> VampIR.OpFieldMul + Core.OpFieldDiv -> VampIR.OpFieldDiv Core.OpEq -> VampIR.OpEq _ -> impossible - _ -> case _builtinAppOp of + [x] -> case _builtinAppOp of OpFail -> ExpressionFail + OpFieldToInt -> convertExpr x + OpFieldFromInt -> convertExpr x _ -> impossible + _ -> impossible goConstructor :: Constr -> Expression goConstructor Constr {..} = case _constrTag of