Builtin handling in c_factor(). Add before the general function call:
if (is_letter(cur())) {
const name: []const u8 = read_name();
if (cur() == '(') {
// Builtins
if (streq(name, "load8")) {
pos += 1; skip();
c_expression();
if (cur() == ')') { pos += 1; skip(); }
emit_op("i32.wrap_i64");
emit_op("i32.load8_u");
emit_op("i64.extend_i32_u");
return;
}
if (streq(name, "store8")) {
pos += 1; skip();
c_expression();
if (cur() == ',') { pos += 1; skip(); }
c_expression();
if (cur() == ')') { pos += 1; skip(); }
emit_str(" local.set $__tmp\n");
emit_str(" i32.wrap_i64\n");
emit_str(" local.get $__tmp\n");
emit_str(" i32.wrap_i64\n");
emit_op("i32.store8");
emit_const(0);
return;
}
if (streq(name, "load64")) {
pos += 1; skip();
c_expression();
if (cur() == ')') { pos += 1; skip(); }
emit_op("i32.wrap_i64");
emit_op("i64.load");
return;
}
if (streq(name, "store64")) {
pos += 1; skip();
c_expression();
if (cur() == ',') { pos += 1; skip(); }
c_expression();
if (cur() == ')') { pos += 1; skip(); }
emit_str(" local.set $__tmp\n");
emit_str(" i32.wrap_i64\n");
emit_str(" local.get $__tmp\n");
emit_op("i64.store");
emit_const(0);
return;
}
// General function call
c_call(name);
return;
}
// Variable reference
if (c_is_global(name)) {
emit_str(" global.get $");
} else {
emit_str(" local.get $");
}
emit_str(name);
emit_byte('\n');
return;
}