From 72693700237afd9b75d0bf3d92407d64f2d1fe17 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Thu, 9 Jul 2020 09:49:05 -0500 Subject: [PATCH] Added all other intrinsics (for now) --- include/onyxastnodes.h | 48 ++++++++++++++++- onyx | Bin 211328 -> 223408 bytes progs/test.onyx | 51 ++++++++++++++++-- src/onyxchecker.c | 57 +++++++++++++++++--- src/onyxwasm.c | 120 +++++++++++++++++++++++++++-------------- 5 files changed, 226 insertions(+), 50 deletions(-) diff --git a/include/onyxastnodes.h b/include/onyxastnodes.h index 8b7a4d09..ecc36099 100644 --- a/include/onyxastnodes.h +++ b/include/onyxastnodes.h @@ -250,8 +250,52 @@ struct AstNodeArgument { typedef enum OnyxIntrinsic { ONYX_INTRINSIC_UNDEFINED, - ONYX_INTRINSIC_FLOAT32_SQRT, - ONYX_INTRINSIC_FLOAT64_SQRT, + ONYX_INTRINSIC_MEMORY_SIZE, + ONYX_INTRINSIC_MEMORY_GROW, + + ONYX_INTRINSIC_I32_CLZ, + ONYX_INTRINSIC_I32_CTZ, + ONYX_INTRINSIC_I32_POPCNT, + ONYX_INTRINSIC_I32_AND, + ONYX_INTRINSIC_I32_OR, + ONYX_INTRINSIC_I32_XOR, + ONYX_INTRINSIC_I32_SHL, + ONYX_INTRINSIC_I32_SLR, + ONYX_INTRINSIC_I32_SAR, + ONYX_INTRINSIC_I32_ROTL, + ONYX_INTRINSIC_I32_ROTR, + + ONYX_INTRINSIC_I64_CLZ, + ONYX_INTRINSIC_I64_CTZ, + ONYX_INTRINSIC_I64_POPCNT, + ONYX_INTRINSIC_I64_AND, + ONYX_INTRINSIC_I64_OR, + ONYX_INTRINSIC_I64_XOR, + ONYX_INTRINSIC_I64_SHL, + ONYX_INTRINSIC_I64_SLR, + ONYX_INTRINSIC_I64_SAR, + ONYX_INTRINSIC_I64_ROTL, + ONYX_INTRINSIC_I64_ROTR, + + ONYX_INTRINSIC_F32_ABS, + ONYX_INTRINSIC_F32_CEIL, + ONYX_INTRINSIC_F32_FLOOR, + ONYX_INTRINSIC_F32_TRUNC, + ONYX_INTRINSIC_F32_NEAREST, + ONYX_INTRINSIC_F32_SQRT, + ONYX_INTRINSIC_F32_MIN, + ONYX_INTRINSIC_F32_MAX, + ONYX_INTRINSIC_F32_COPYSIGN, + + ONYX_INTRINSIC_F64_ABS, + ONYX_INTRINSIC_F64_CEIL, + ONYX_INTRINSIC_F64_FLOOR, + ONYX_INTRINSIC_F64_TRUNC, + ONYX_INTRINSIC_F64_NEAREST, + ONYX_INTRINSIC_F64_SQRT, + ONYX_INTRINSIC_F64_MIN, + ONYX_INTRINSIC_F64_MAX, + ONYX_INTRINSIC_F64_COPYSIGN, } OnyxIntrinsic; // NOTE: This needs to have 'arguments' in the diff --git a/onyx b/onyx index 0d7801ec9f78940218113e72d96d622d38e674d9..11e0a223d083689be923236ac124cff10a443b56 100755 GIT binary patch delta 53959 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 z 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 delta 48194 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 R#=jOn$N*ugXshHg{{cP|ug?Gg diff --git a/progs/test.onyx b/progs/test.onyx index 47fa4740..f70b6816 100644 --- a/progs/test.onyx +++ b/progs/test.onyx @@ -11,9 +11,53 @@ export in_unit_circle :: proc (x: f32, y: f32) -> bool { return (x * x) + (y * y) < 1.0f; } -sqrt_f32 :: - proc #intrinsic - (val: f32) -> f32 --- +memory_size :: proc #intrinsic -> i32 --- +memory_grow :: proc #intrinsic -> i32 --- + +clz_i32 :: proc #intrinsic (val: i32) -> i32 --- +ctz_i32 :: proc #intrinsic (val: i32) -> i32 --- +popcnt_i32 :: proc #intrinsic (val: i32) -> i32 --- +and_i32 :: proc #intrinsic (val: i32) -> i32 --- +or_i32 :: proc #intrinsic (val: i32) -> i32 --- +xor_i32 :: proc #intrinsic (val: i32) -> i32 --- +shl_i32 :: proc #intrinsic (val: i32) -> i32 --- +slr_i32 :: proc #intrinsic (val: i32) -> i32 --- +sar_i32 :: proc #intrinsic (val: i32) -> i32 --- +rotl_i32 :: proc #intrinsic (val: i32) -> i32 --- +rotr_i32 :: proc #intrinsic (val: i32) -> i32 --- + +clz_i64 :: proc #intrinsic (val: i64) -> i64 --- +ctz_i64 :: proc #intrinsic (val: i64) -> i64 --- +popcnt_i64 :: proc #intrinsic (val: i64) -> i64 --- +and_i64 :: proc #intrinsic (val: i64) -> i64 --- +or_i64 :: proc #intrinsic (val: i64) -> i64 --- +xor_i64 :: proc #intrinsic (val: i64) -> i64 --- +shl_i64 :: proc #intrinsic (val: i64) -> i64 --- +slr_i64 :: proc #intrinsic (val: i64) -> i64 --- +sar_i64 :: proc #intrinsic (val: i64) -> i64 --- +rotl_i64 :: proc #intrinsic (val: i64) -> i64 --- +rotr_i64 :: proc #intrinsic (val: i64) -> i64 --- + +abs_f32 :: proc #intrinsic (val: f32) -> f32 --- +ceil_f32 :: proc #intrinsic (val: f32) -> f32 --- +floor_f32 :: proc #intrinsic (val: f32) -> f32 --- +trunc_f32 :: proc #intrinsic (val: f32) -> f32 --- +nearest_f32 :: proc #intrinsic (val: f32) -> f32 --- +sqrt_f32 :: proc #intrinsic (val: f32) -> f32 --- +min_f32 :: proc #intrinsic (val: f32) -> f32 --- +max_f32 :: proc #intrinsic (val: f32) -> f32 --- +copysign_f32 :: proc #intrinsic (val: f32) -> f32 --- + +abs_f64 :: proc #intrinsic (val: f64) -> f64 --- +ceil_f64 :: proc #intrinsic (val: f64) -> f64 --- +floor_f64 :: proc #intrinsic (val: f64) -> f64 --- +trunc_f64 :: proc #intrinsic (val: f64) -> f64 --- +nearest_f64 :: proc #intrinsic (val: f64) -> f64 --- +sqrt_f64 :: proc #intrinsic (val: f64) -> f64 --- +min_f64 :: proc #intrinsic (val: f64) -> f64 --- +max_f64 :: proc #intrinsic (val: f64) -> f64 --- +copysign_f64 :: proc #intrinsic (val: f64) -> f64 --- + // This is the entry point export main2 :: proc { @@ -66,6 +110,7 @@ export main2 :: proc { export main :: proc { print_f32(sqrt_f32(2.0f)); + print_i32(5 * 6 + 2 * 3); print_bool(in_unit_circle(0.5f, 0.5f)); diff --git a/src/onyxchecker.c b/src/onyxchecker.c index 27e4a4c4..dfc905cc 100644 --- a/src/onyxchecker.c +++ b/src/onyxchecker.c @@ -126,13 +126,58 @@ static void check_call(OnyxSemPassState* state, AstNodeCall* call) { call->callee = NULL; onyx_token_null_toggle(callee->base.token); + char* intr_name = callee->base.token->token; - if (!strcmp("sqrt_f32", intr_name)) { - ((AstNodeIntrinsicCall *) call)->intrinsic = ONYX_INTRINSIC_FLOAT32_SQRT; - } - else if (!strcmp("sqrt_f64", intr_name)) { - ((AstNodeIntrinsicCall *) call)->intrinsic = ONYX_INTRINSIC_FLOAT64_SQRT; - } + OnyxIntrinsic intrinsic = ONYX_INTRINSIC_UNDEFINED; + + if (!strcmp("memory_size", intr_name)) intrinsic = ONYX_INTRINSIC_MEMORY_SIZE; + else if (!strcmp("memory_grow", intr_name)) intrinsic = ONYX_INTRINSIC_MEMORY_GROW; + + else if (!strcmp("clz_i32", intr_name)) intrinsic = ONYX_INTRINSIC_I32_CLZ; + else if (!strcmp("ctz_i32", intr_name)) intrinsic = ONYX_INTRINSIC_I32_CTZ; + else if (!strcmp("popcnt_i32", intr_name)) intrinsic = ONYX_INTRINSIC_I32_POPCNT; + else if (!strcmp("and_i32", intr_name)) intrinsic = ONYX_INTRINSIC_I32_AND; + else if (!strcmp("or_i32", intr_name)) intrinsic = ONYX_INTRINSIC_I32_OR; + else if (!strcmp("xor_i32", intr_name)) intrinsic = ONYX_INTRINSIC_I32_XOR; + else if (!strcmp("shl_i32", intr_name)) intrinsic = ONYX_INTRINSIC_I32_SHL; + else if (!strcmp("slr_i32", intr_name)) intrinsic = ONYX_INTRINSIC_I32_SLR; + else if (!strcmp("sar_i32", intr_name)) intrinsic = ONYX_INTRINSIC_I32_SAR; + else if (!strcmp("rotl_i32", intr_name)) intrinsic = ONYX_INTRINSIC_I32_ROTL; + else if (!strcmp("rotr_i32", intr_name)) intrinsic = ONYX_INTRINSIC_I32_ROTR; + + else if (!strcmp("clz_i64", intr_name)) intrinsic = ONYX_INTRINSIC_I64_CLZ; + else if (!strcmp("ctz_i64", intr_name)) intrinsic = ONYX_INTRINSIC_I64_CTZ; + else if (!strcmp("popcnt_i64", intr_name)) intrinsic = ONYX_INTRINSIC_I64_POPCNT; + else if (!strcmp("and_i64", intr_name)) intrinsic = ONYX_INTRINSIC_I64_AND; + else if (!strcmp("or_i64", intr_name)) intrinsic = ONYX_INTRINSIC_I64_OR; + else if (!strcmp("xor_i64", intr_name)) intrinsic = ONYX_INTRINSIC_I64_XOR; + else if (!strcmp("shl_i64", intr_name)) intrinsic = ONYX_INTRINSIC_I64_SHL; + else if (!strcmp("slr_i64", intr_name)) intrinsic = ONYX_INTRINSIC_I64_SLR; + else if (!strcmp("sar_i64", intr_name)) intrinsic = ONYX_INTRINSIC_I64_SAR; + else if (!strcmp("rotl_i64", intr_name)) intrinsic = ONYX_INTRINSIC_I64_ROTL; + else if (!strcmp("rotr_i64", intr_name)) intrinsic = ONYX_INTRINSIC_I64_ROTR; + + else if (!strcmp("abs_f32", intr_name)) intrinsic = ONYX_INTRINSIC_F32_ABS; + else if (!strcmp("ceil_f32", intr_name)) intrinsic = ONYX_INTRINSIC_F32_CEIL; + else if (!strcmp("floor_f32", intr_name)) intrinsic = ONYX_INTRINSIC_F32_FLOOR; + else if (!strcmp("trunc_f32", intr_name)) intrinsic = ONYX_INTRINSIC_F32_TRUNC; + else if (!strcmp("nearest_f32", intr_name)) intrinsic = ONYX_INTRINSIC_F32_NEAREST; + else if (!strcmp("sqrt_f32", intr_name)) intrinsic = ONYX_INTRINSIC_F32_SQRT; + else if (!strcmp("min_f32", intr_name)) intrinsic = ONYX_INTRINSIC_F32_MIN; + else if (!strcmp("max_f32", intr_name)) intrinsic = ONYX_INTRINSIC_F32_MAX; + else if (!strcmp("copysign_f32", intr_name)) intrinsic = ONYX_INTRINSIC_F32_COPYSIGN; + + else if (!strcmp("abs_f64", intr_name)) intrinsic = ONYX_INTRINSIC_F64_ABS; + else if (!strcmp("ceil_f64", intr_name)) intrinsic = ONYX_INTRINSIC_F64_CEIL; + else if (!strcmp("floor_f64", intr_name)) intrinsic = ONYX_INTRINSIC_F64_FLOOR; + else if (!strcmp("trunc_f64", intr_name)) intrinsic = ONYX_INTRINSIC_F64_TRUNC; + else if (!strcmp("nearest_f64", intr_name)) intrinsic = ONYX_INTRINSIC_F64_NEAREST; + else if (!strcmp("sqrt_f64", intr_name)) intrinsic = ONYX_INTRINSIC_F64_SQRT; + else if (!strcmp("min_f64", intr_name)) intrinsic = ONYX_INTRINSIC_F64_MIN; + else if (!strcmp("max_f64", intr_name)) intrinsic = ONYX_INTRINSIC_F64_MAX; + else if (!strcmp("copysign_f64", intr_name)) intrinsic = ONYX_INTRINSIC_F64_COPYSIGN; + + ((AstNodeIntrinsicCall *)call)->intrinsic = intrinsic; onyx_token_null_toggle(callee->base.token); } diff --git a/src/onyxwasm.c b/src/onyxwasm.c index 6001f20f..20faa77a 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -209,6 +209,9 @@ static WasmType onyx_type_to_wasm_type(TypeInfo* type) { return WASM_TYPE_VOID; } +#define WI(instr) bh_arr_push(code, ((WasmInstruction){ instr, 0x00 })); +#define WID(instr, data) bh_arr_push(code, ((WasmInstruction){ instr, data })); + static void compile_function_body(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, AstNodeFunction* fd); static void compile_block(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, AstNodeBlock* block); static void compile_statement(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, AstNode* stmt); @@ -233,7 +236,7 @@ static void compile_function_body(OnyxWasmModule* mod, bh_arr(WasmInstruction)* compile_statement(mod, &code, stmt); } - bh_arr_push(code, ((WasmInstruction){ WI_BLOCK_END, 0x00 })); + WI(WI_BLOCK_END); *pcode = code; } @@ -241,13 +244,13 @@ static void compile_function_body(OnyxWasmModule* mod, bh_arr(WasmInstruction)* static void compile_block(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, AstNodeBlock* block) { bh_arr(WasmInstruction) code = *pcode; - bh_arr_push(code, ((WasmInstruction){ WI_BLOCK_START, 0x40 })); + WID(WI_BLOCK_START, 0x40); forll (AstNode, stmt, block->body, next) { compile_statement(mod, &code, stmt); } - bh_arr_push(code, ((WasmInstruction){ WI_BLOCK_END, 0x00 })); + WI(WI_BLOCK_END); *pcode = code; } @@ -270,7 +273,7 @@ static void compile_structured_jump(OnyxWasmModule* mod, bh_arr(WasmInstruction) } if (success) { - bh_arr_push(code, ((WasmInstruction){ WI_JUMP, labelidx })); + WID(WI_JUMP, labelidx); } else { assert(("Invalid structured jump", 0)); } @@ -308,12 +311,12 @@ static void compile_assign_lval(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pc if (lval->kind == AST_NODE_KIND_LOCAL || lval->kind == AST_NODE_KIND_PARAM) { i32 localidx = (i32) bh_imap_get(&mod->local_map, (u64) lval); - bh_arr_push(code, ((WasmInstruction){ WI_LOCAL_SET, localidx })); + WID(WI_LOCAL_SET, localidx); } else if (lval->kind == AST_NODE_KIND_GLOBAL) { i32 globalidx = (i32) bh_imap_get(&mod->global_map, (u64) lval); - bh_arr_push(code, ((WasmInstruction){ WI_GLOBAL_SET, globalidx })); + WID(WI_GLOBAL_SET, globalidx); } else { assert(("Invalid lval", 0)); @@ -326,7 +329,7 @@ static void compile_if(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, AstN bh_arr(WasmInstruction) code = *pcode; compile_expression(mod, &code, if_node->cond); - bh_arr_push(code, ((WasmInstruction){ WI_IF_START, 0x40 })); + WID(WI_IF_START, 0x40); bh_arr_push(mod->structured_jump_target, 0); @@ -345,7 +348,7 @@ static void compile_if(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, AstN } if (if_node->false_block.as_if) { - bh_arr_push(code, ((WasmInstruction){ WI_ELSE, 0x00 })); + WI(WI_ELSE); if (if_node->false_block.as_if->base.kind == AST_NODE_KIND_IF) { forll (AstNode, stmt, (AstNode *) if_node->false_block.as_if, next) { @@ -360,7 +363,7 @@ static void compile_if(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, AstN bh_arr_pop(mod->structured_jump_target); - bh_arr_push(code, ((WasmInstruction){ WI_IF_END, 0x00 })); + WI(WI_IF_END); *pcode = code; } @@ -368,12 +371,12 @@ static void compile_if(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, AstN static void compile_while(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, AstNodeWhile* while_node) { bh_arr(WasmInstruction) code = *pcode; - bh_arr_push(code, ((WasmInstruction){ WI_BLOCK_START, 0x40 })); - bh_arr_push(code, ((WasmInstruction){ WI_LOOP_START, 0x40 })); + WID(WI_BLOCK_START, 0x40); + WID(WI_LOOP_START, 0x40); compile_expression(mod, &code, while_node->cond); - bh_arr_push(code, ((WasmInstruction){ WI_I32_EQZ, 0x00 })); - bh_arr_push(code, ((WasmInstruction){ WI_COND_JUMP, 0x01 })); + WI(WI_I32_EQZ); + WID(WI_COND_JUMP, 0x01); bh_arr_push(mod->structured_jump_target, 1); bh_arr_push(mod->structured_jump_target, 2); @@ -385,10 +388,10 @@ static void compile_while(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, A bh_arr_pop(mod->structured_jump_target); bh_arr_pop(mod->structured_jump_target); - bh_arr_push(code, ((WasmInstruction){ WI_JUMP, 0x00 })); + WID(WI_JUMP, 0x00); - bh_arr_push(code, ((WasmInstruction){ WI_LOOP_END, 0x00 })); - bh_arr_push(code, ((WasmInstruction){ WI_BLOCK_END, 0x00 })); + WI(WI_LOOP_END); + WI(WI_BLOCK_END); *pcode = code; } @@ -462,7 +465,7 @@ static void compile_binop(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, A compile_expression(mod, &code, binop->left); compile_expression(mod, &code, binop->right); - bh_arr_push(code, ((WasmInstruction){ binop_instr, 0x00 })); + WI(binop_instr); *pcode = code; } @@ -476,23 +479,23 @@ static void compile_unaryop(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, TypeInfoKind type_kind = unop->base.type->kind; if (type_kind == TYPE_INFO_KIND_INT32) { - bh_arr_push(code, ((WasmInstruction){ WI_I32_CONST, 0x00 })); + WID(WI_I32_CONST, 0x00); compile_expression(mod, &code, unop->expr); - bh_arr_push(code, ((WasmInstruction){ WI_I32_SUB, 0x00 })); + WI(WI_I32_SUB); } else if (type_kind == TYPE_INFO_KIND_INT64) { - bh_arr_push(code, ((WasmInstruction){ WI_I64_CONST, 0x00 })); + WID(WI_I64_CONST, 0x00); compile_expression(mod, &code, unop->expr); - bh_arr_push(code, ((WasmInstruction){ WI_I64_SUB, 0x00 })); + WI(WI_I64_SUB); } else { compile_expression(mod, &code, unop->expr); if (type_kind == TYPE_INFO_KIND_FLOAT32) - bh_arr_push(code, ((WasmInstruction){ WI_F32_NEG, 0x00 })); + WI(WI_F32_NEG); if (type_kind == TYPE_INFO_KIND_FLOAT64) - bh_arr_push(code, ((WasmInstruction){ WI_F32_NEG, 0x00 })); + WI(WI_F64_NEG); } break; @@ -501,7 +504,7 @@ static void compile_unaryop(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, case ONYX_UNARY_OP_NOT: compile_expression(mod, &code, unop->expr); - bh_arr_push(code, ((WasmInstruction){ WI_I32_EQZ, 0x00 })); + WI(WI_I32_EQZ); break; case ONYX_UNARY_OP_CAST: compile_cast(mod, &code, unop); break; @@ -543,17 +546,54 @@ static void compile_intrinsic_call(OnyxWasmModule* mod, bh_arr(WasmInstruction)* } switch (call->intrinsic) { - case ONYX_INTRINSIC_UNDEFINED: - assert(0); - break; - - case ONYX_INTRINSIC_FLOAT32_SQRT: - bh_arr_push(code, ((WasmInstruction){ WI_F32_SQRT, 0x00})); - break; - - case ONYX_INTRINSIC_FLOAT64_SQRT: - bh_arr_push(code, ((WasmInstruction){ WI_F64_SQRT, 0x00 })); - break; + case ONYX_INTRINSIC_MEMORY_SIZE: WID(WI_MEMORY_SIZE, 0x00); break; + case ONYX_INTRINSIC_MEMORY_GROW: WID(WI_MEMORY_GROW, 0x00); break; + + case ONYX_INTRINSIC_I32_CLZ: WI(WI_I32_CLZ); break; + case ONYX_INTRINSIC_I32_CTZ: WI(WI_I32_CTZ); break; + case ONYX_INTRINSIC_I32_POPCNT: WI(WI_I32_POPCNT); break; + case ONYX_INTRINSIC_I32_AND: WI(WI_I32_AND); break; + case ONYX_INTRINSIC_I32_OR: WI(WI_I32_OR); break; + case ONYX_INTRINSIC_I32_XOR: WI(WI_I32_XOR); break; + case ONYX_INTRINSIC_I32_SHL: WI(WI_I32_SHL); break; + case ONYX_INTRINSIC_I32_SLR: WI(WI_I32_SHR_U); break; + case ONYX_INTRINSIC_I32_SAR: WI(WI_I32_SHR_S); break; + case ONYX_INTRINSIC_I32_ROTL: WI(WI_I32_ROTL); break; + case ONYX_INTRINSIC_I32_ROTR: WI(WI_I32_ROTR); break; + + case ONYX_INTRINSIC_I64_CLZ: WI(WI_I64_CLZ); break; + case ONYX_INTRINSIC_I64_CTZ: WI(WI_I64_CTZ); break; + case ONYX_INTRINSIC_I64_POPCNT: WI(WI_I64_POPCNT); break; + case ONYX_INTRINSIC_I64_AND: WI(WI_I64_AND); break; + case ONYX_INTRINSIC_I64_OR: WI(WI_I64_OR); break; + case ONYX_INTRINSIC_I64_XOR: WI(WI_I64_XOR); break; + case ONYX_INTRINSIC_I64_SHL: WI(WI_I64_SHL); break; + case ONYX_INTRINSIC_I64_SLR: WI(WI_I64_SHR_U); break; + case ONYX_INTRINSIC_I64_SAR: WI(WI_I64_SHR_S); break; + case ONYX_INTRINSIC_I64_ROTL: WI(WI_I64_ROTL); break; + case ONYX_INTRINSIC_I64_ROTR: WI(WI_I64_ROTR); break; + + case ONYX_INTRINSIC_F32_ABS: WI(WI_F32_ABS); break; + case ONYX_INTRINSIC_F32_CEIL: WI(WI_F32_CEIL); break; + case ONYX_INTRINSIC_F32_FLOOR: WI(WI_F32_FLOOR); break; + case ONYX_INTRINSIC_F32_TRUNC: WI(WI_F32_TRUNC); break; + case ONYX_INTRINSIC_F32_NEAREST: WI(WI_F32_NEAREST); break; + case ONYX_INTRINSIC_F32_SQRT: WI(WI_F32_SQRT); break; + case ONYX_INTRINSIC_F32_MIN: WI(WI_F32_MIN); break; + case ONYX_INTRINSIC_F32_MAX: WI(WI_F32_MAX); break; + case ONYX_INTRINSIC_F32_COPYSIGN: WI(WI_F32_COPYSIGN); break; + + case ONYX_INTRINSIC_F64_ABS: WI(WI_F64_ABS); break; + case ONYX_INTRINSIC_F64_CEIL: WI(WI_F64_CEIL); break; + case ONYX_INTRINSIC_F64_FLOOR: WI(WI_F64_FLOOR); break; + case ONYX_INTRINSIC_F64_TRUNC: WI(WI_F64_TRUNC); break; + case ONYX_INTRINSIC_F64_NEAREST: WI(WI_F64_NEAREST); break; + case ONYX_INTRINSIC_F64_SQRT: WI(WI_F64_SQRT); break; + case ONYX_INTRINSIC_F64_MIN: WI(WI_F64_MIN); break; + case ONYX_INTRINSIC_F64_MAX: WI(WI_F64_MAX); break; + case ONYX_INTRINSIC_F64_COPYSIGN: WI(WI_F64_COPYSIGN); break; + + default: assert(("Unsupported intrinsic", 0)); } *pcode = code; @@ -576,7 +616,7 @@ static void compile_expression(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pco { i32 localidx = (i32) bh_imap_get(&mod->local_map, (u64) expr); - bh_arr_push(code, ((WasmInstruction){ WI_LOCAL_GET, localidx })); + WID(WI_LOCAL_GET, localidx); break; } @@ -584,7 +624,7 @@ static void compile_expression(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pco { i32 globalidx = (i32) bh_imap_get(&mod->global_map, (u64) expr); - bh_arr_push(code, ((WasmInstruction){ WI_GLOBAL_GET, globalidx })); + WID(WI_GLOBAL_GET, globalidx); break; } @@ -673,7 +713,7 @@ static void compile_cast(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, As WasmInstructionType cast_op = cast_map[fromidx][toidx]; if (cast_op != WI_NOP) { - bh_arr_push(code, ((WasmInstruction){ cast_op, 0x00 })); + WI(cast_op); } *pcode = code; @@ -686,7 +726,7 @@ static void compile_return(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, compile_expression(mod, &code, ret->expr); } - bh_arr_push(code, ((WasmInstruction){ WI_RETURN, 0x00 })); + WI(WI_RETURN); *pcode = code; } @@ -1256,6 +1296,8 @@ static void output_instruction(WasmInstruction* instr, bh_buffer* buff) { case WI_JUMP: case WI_COND_JUMP: case WI_IF_START: + case WI_MEMORY_SIZE: + case WI_MEMORY_GROW: leb = uint_to_uleb128((u64) instr->data.i1, &leb_len); bh_buffer_append(buff, leb, leb_len); break; -- 2.25.1