streamline mcode
This commit is contained in:
46
mcode.cm
46
mcode.cm
@@ -1428,6 +1428,52 @@ var mcode = function(ast) {
|
||||
return d
|
||||
}
|
||||
|
||||
// Tier 1 intrinsic inlining: emit direct opcodes instead of frame/invoke
|
||||
if (callee_kind == "name" && callee.intrinsic == true) {
|
||||
fname = callee.name
|
||||
nargs = args_list != null ? length(args_list) : 0
|
||||
// 1-arg type check intrinsics → direct opcode
|
||||
if (nargs == 1) {
|
||||
if (fname == "is_array" || fname == "is_function" ||
|
||||
fname == "is_object" || fname == "is_stone" ||
|
||||
fname == "is_integer" || fname == "is_text" ||
|
||||
fname == "is_number" || fname == "is_logical" ||
|
||||
fname == "is_null" || fname == "length") {
|
||||
a0 = gen_expr(args_list[0], -1)
|
||||
d = alloc_slot()
|
||||
if (fname == "is_array") {
|
||||
emit_2("is_array", d, a0)
|
||||
} else if (fname == "is_function") {
|
||||
emit_2("is_func", d, a0)
|
||||
} else if (fname == "is_object") {
|
||||
emit_2("is_record", d, a0)
|
||||
} else if (fname == "is_stone") {
|
||||
emit_2("is_stone", d, a0)
|
||||
} else if (fname == "is_integer") {
|
||||
emit_2("is_int", d, a0)
|
||||
} else if (fname == "is_text") {
|
||||
emit_2("is_text", d, a0)
|
||||
} else if (fname == "is_number") {
|
||||
emit_2("is_num", d, a0)
|
||||
} else if (fname == "is_logical") {
|
||||
emit_2("is_bool", d, a0)
|
||||
} else if (fname == "is_null") {
|
||||
emit_2("is_null", d, a0)
|
||||
} else if (fname == "length") {
|
||||
emit_2("length", d, a0)
|
||||
}
|
||||
return d
|
||||
}
|
||||
}
|
||||
// 2-arg push: push(arr, val) → direct opcode
|
||||
if (nargs == 2 && fname == "push") {
|
||||
a0 = gen_expr(args_list[0], -1)
|
||||
a1 = gen_expr(args_list[1], -1)
|
||||
emit_2("push", a0, a1)
|
||||
return a1
|
||||
}
|
||||
}
|
||||
|
||||
// Collect arg slots
|
||||
arg_slots = []
|
||||
_i = 0
|
||||
|
||||
Reference in New Issue
Block a user