if (call->arg_count < ol_type->needed_param_count) continue;
- AstArgument* arg = call->arguments;
Type** param_type = ol_type->params;
- while (arg != NULL) {
- fill_in_type((AstTyped *) arg);
-
+ bh_arr_each(AstArgument*, arg, call->arg_arr) {
+ fill_in_type((AstTyped *) *arg);
if ((*param_type)->kind == Type_Kind_VarArgs) {
- if (!type_check_or_auto_cast(&arg->value, (*param_type)->VarArgs.ptr_to_data->Pointer.elem))
+ if (!type_check_or_auto_cast(&(*arg)->value, (*param_type)->VarArgs.ptr_to_data->Pointer.elem))
goto no_match;
}
- else if (!type_check_or_auto_cast(&arg->value, *param_type)) goto no_match;
+ else if (!type_check_or_auto_cast(&(*arg)->value, *param_type)) goto no_match;
param_type++;
- arg = (AstArgument *) arg->next;
}
return (AstTyped *) overload;
char* arg_str = bh_alloc(global_scratch_allocator, 1024);
- AstArgument* arg = call->arguments;
- while (arg != NULL) {
- strncat(arg_str, type_get_name(arg->value->type), 1023);
+ bh_arr_each(AstArgument *, arg, call->arg_arr) {
+ strncat(arg_str, type_get_name((*arg)->value->type), 1023);
- if (arg->next != NULL)
+ if ((*arg)->next != NULL)
strncat(arg_str, ", ", 1023);
-
- arg = (AstArgument *) arg->next;
}
onyx_report_error(call->token->pos, "unable to match overloaded function with provided argument types: (%s)", arg_str);
CHECK(expression, &call->callee);
AstFunction* callee = (AstFunction *) call->callee;
- bh_arr(AstArgument *) arg_arr = NULL;
- bh_arr_new(global_heap_allocator, arg_arr, call->arg_count);
+ bh_arr(AstArgument *) arg_arr = call->arg_arr;
// NOTE: Check arguments
- AstArgument* actual = call->arguments;
- while (actual != NULL) {
- CHECK(expression, (AstTyped **) &actual);
+ bh_arr_each (AstArgument *, actual, arg_arr) {
+ CHECK(expression, (AstTyped **) actual);
- if (actual->value->kind == Ast_Kind_Overloaded_Function) {
- onyx_report_error(actual->token->pos,
+ if ((*actual)->value->kind == Ast_Kind_Overloaded_Function) {
+ onyx_report_error((*actual)->token->pos,
"Cannot pass overloaded function '%b' as argument.",
- actual->value->token->text, actual->value->token->length);
+ (*actual)->value->token->text, (*actual)->value->token->length);
return Check_Error;
}
-
- bh_arr_push(arg_arr, actual);
- actual = (AstArgument *) actual->next;
}
if (callee->kind == Ast_Kind_Overloaded_Function) {
// little endian integers.
#define SIMD_INT_CONST_INTRINSIC(type, count) { \
type* byte_buffer = bh_alloc(mod->extended_instr_alloc, 16); \
- AstArgument* arg = call->arguments; \
+ bh_arr(AstArgument *) arg_arr = call->arg_arr; \
fori (i, 0, count) { \
- if (arg->value->kind != Ast_Kind_NumLit) { \
- onyx_report_error(arg->token->pos, \
+ if (arg_arr[i]->value->kind != Ast_Kind_NumLit) { \
+ onyx_report_error(arg_arr[i]->token->pos, \
"SIMD constants expect compile time constants as parameters. The %d%s parameter was not.", \
i, bh_num_suffix(i)); \
*pcode = code; \
return; \
} \
- byte_buffer[i] = (type) ((AstNumLit *) arg->value)->value.l; \
- arg = (AstArgument *) arg->next; \
+ byte_buffer[i] = (type) ((AstNumLit *) arg_arr[i]->value)->value.l; \
} \
WIP(WI_V128_CONST, byte_buffer); \
}
-#define SIMD_EXTRACT_LANE_INSTR(instr, arg) \
- emit_expression(mod, &code, arg->value);\
- arg = (AstArgument *) arg->next; \
- if (arg->value->kind != Ast_Kind_NumLit) { \
- onyx_report_error(arg->token->pos, "SIMD lane instructions expect a compile time lane number."); \
+#define SIMD_EXTRACT_LANE_INSTR(instr, arg_arr) \
+ emit_expression(mod, &code, arg_arr[1]->value);\
+ if (arg_arr[1]->value->kind != Ast_Kind_NumLit) { \
+ onyx_report_error(arg_arr[1]->token->pos, "SIMD lane instructions expect a compile time lane number."); \
*pcode = code; \
return; \
} \
- WID(instr, (u8) ((AstNumLit *) arg->value)->value.i);
+ WID(instr, (u8) ((AstNumLit *) arg_arr[1]->value)->value.i);
-#define SIMD_REPLACE_LANE_INSTR(instr, arg) { \
- emit_expression(mod, &code, arg->value);\
- arg = (AstArgument *) arg->next; \
- if (arg->value->kind != Ast_Kind_NumLit) { \
- onyx_report_error(arg->token->pos, "SIMD lane instructions expect a compile time lane number."); \
+#define SIMD_REPLACE_LANE_INSTR(instr, arg_arr) { \
+ emit_expression(mod, &code, arg_arr[1]->value);\
+ if (arg_arr[1]->value->kind != Ast_Kind_NumLit) { \
+ onyx_report_error(arg_arr[1]->token->pos, "SIMD lane instructions expect a compile time lane number."); \
*pcode = code; \
return; \
} \
- u8 lane = (u8) ((AstNumLit *) arg->value)->value.i; \
- arg = (AstArgument *) arg->next; \
- emit_expression(mod, &code, arg->value); \
+ u8 lane = (u8) ((AstNumLit *) arg_arr[1]->value)->value.i; \
+ emit_expression(mod, &code, arg_arr[2]->value); \
WID(instr, lane); \
}
}
if (place_arguments_normally) {
- for (AstArgument *arg = call->arguments;
- arg != NULL;
- arg = (AstArgument *) arg->next) {
- emit_expression(mod, &code, arg->value);
+ bh_arr_each(AstArgument *, arg, call->arg_arr) {
+ emit_expression(mod, &code, (*arg)->value);
}
}
case ONYX_INTRINSIC_I64X2_CONST: SIMD_INT_CONST_INTRINSIC(u64, 2); break;
case ONYX_INTRINSIC_F32X4_CONST: {
f32* byte_buffer = bh_alloc(mod->extended_instr_alloc, 16);
- AstArgument* arg = call->arguments;
+ bh_arr(AstArgument *) arg_arr = call->arg_arr;
fori (i, 0, 4) {
- if (arg->value->kind != Ast_Kind_NumLit) {
- onyx_report_error(arg->token->pos,
+ if (arg_arr[i]->value->kind != Ast_Kind_NumLit) {
+ onyx_report_error(arg_arr[i]->token->pos,
"SIMD constants expect compile time constants as parameters. The %d%s parameter was not.",
i, bh_num_suffix(i));
*pcode = code;
return;
}
- byte_buffer[i] = (f32) ((AstNumLit *) arg->value)->value.f;
- arg = (AstArgument *) arg->next;
+ byte_buffer[i] = (f32) ((AstNumLit *) arg_arr[i]->value)->value.f;
}
WIP(WI_V128_CONST, byte_buffer);
break;
case ONYX_INTRINSIC_F64X2_CONST: {
f64* byte_buffer = bh_alloc(mod->extended_instr_alloc, 16);
- AstArgument* arg = call->arguments;
+ bh_arr(AstArgument *) arg_arr = call->arg_arr;
fori (i, 0, 2) {
- if (arg->value->kind != Ast_Kind_NumLit) {
- onyx_report_error(arg->token->pos,
+ if (arg_arr[i]->value->kind != Ast_Kind_NumLit) {
+ onyx_report_error(arg_arr[i]->token->pos,
"SIMD constants expect compile time constants as parameters. The %d%s parameter was not.",
i, bh_num_suffix(i));
*pcode = code;
return;
}
- byte_buffer[i] = (f64) ((AstNumLit *) arg->value)->value.d;
- arg = (AstArgument *) arg->next;
+ byte_buffer[i] = (f64) ((AstNumLit *) arg_arr[i]->value)->value.d;
}
WIP(WI_V128_CONST, byte_buffer);
break;
case ONYX_INTRINSIC_I8X16_SHUFFLE: {
u8* byte_buffer = bh_alloc(mod->extended_instr_alloc, 16);
- AstArgument* arg = call->arguments;
+ bh_arr(AstArgument *) arg_arr = call->arg_arr;
// NOTE: There are two parameters that have to be outputted before
// the immediate bytes
- emit_expression(mod, &code, arg->value);
- arg = (AstArgument *) arg->next;
- emit_expression(mod, &code, arg->value);
- arg = (AstArgument *) arg->next;
+ emit_expression(mod, &code, arg_arr[0]->value);
+ emit_expression(mod, &code, arg_arr[1]->value);
fori (i, 0, 16) {
- if (arg->value->kind != Ast_Kind_NumLit) {
- onyx_report_error(arg->token->pos,
+ if (arg_arr[i + 2]->value->kind != Ast_Kind_NumLit) {
+ onyx_report_error(arg_arr[i + 2]->token->pos,
"SIMD constants expect compile time constants as parameters. The %d%s parameter was not.",
i, bh_num_suffix(i));
*pcode = code;
return;
}
- byte_buffer[i] = (u8) ((AstNumLit *) arg->value)->value.i;
- arg = (AstArgument *) arg->next;
+ byte_buffer[i] = (u8) ((AstNumLit *) arg_arr[i + 2]->value)->value.i;
}
WIP(WI_I8X16_SHUFFLE, byte_buffer);
break;
}
- case ONYX_INTRINSIC_I8X16_EXTRACT_LANE_S: SIMD_EXTRACT_LANE_INSTR(WI_I8X16_EXTRACT_LANE_S, call->arguments); break;
- case ONYX_INTRINSIC_I8X16_EXTRACT_LANE_U: SIMD_EXTRACT_LANE_INSTR(WI_I8X16_EXTRACT_LANE_U, call->arguments); break;
- case ONYX_INTRINSIC_I8X16_REPLACE_LANE: SIMD_REPLACE_LANE_INSTR(WI_I8X16_REPLACE_LANE, call->arguments); break;
- case ONYX_INTRINSIC_I16X8_EXTRACT_LANE_S: SIMD_EXTRACT_LANE_INSTR(WI_I16X8_EXTRACT_LANE_S, call->arguments); break;
- case ONYX_INTRINSIC_I16X8_EXTRACT_LANE_U: SIMD_EXTRACT_LANE_INSTR(WI_I16X8_EXTRACT_LANE_U, call->arguments); break;
- case ONYX_INTRINSIC_I16X8_REPLACE_LANE: SIMD_REPLACE_LANE_INSTR(WI_I16X8_REPLACE_LANE, call->arguments); break;
- case ONYX_INTRINSIC_I32X4_EXTRACT_LANE: SIMD_EXTRACT_LANE_INSTR(WI_I32X4_EXTRACT_LANE, call->arguments); break;
- case ONYX_INTRINSIC_I32X4_REPLACE_LANE: SIMD_REPLACE_LANE_INSTR(WI_I32X4_REPLACE_LANE, call->arguments); break;
- case ONYX_INTRINSIC_I64X2_EXTRACT_LANE: SIMD_EXTRACT_LANE_INSTR(WI_I64X2_EXTRACT_LANE, call->arguments); break;
- case ONYX_INTRINSIC_I64X2_REPLACE_LANE: SIMD_REPLACE_LANE_INSTR(WI_I64X2_REPLACE_LANE, call->arguments); break;
- case ONYX_INTRINSIC_F32X4_EXTRACT_LANE: SIMD_EXTRACT_LANE_INSTR(WI_F32X4_EXTRACT_LANE, call->arguments); break;
- case ONYX_INTRINSIC_F32X4_REPLACE_LANE: SIMD_REPLACE_LANE_INSTR(WI_F32X4_REPLACE_LANE, call->arguments); break;
- case ONYX_INTRINSIC_F64X2_EXTRACT_LANE: SIMD_EXTRACT_LANE_INSTR(WI_F64X2_EXTRACT_LANE, call->arguments); break;
- case ONYX_INTRINSIC_F64X2_REPLACE_LANE: SIMD_REPLACE_LANE_INSTR(WI_F64X2_REPLACE_LANE, call->arguments); break;
+ case ONYX_INTRINSIC_I8X16_EXTRACT_LANE_S: SIMD_EXTRACT_LANE_INSTR(WI_I8X16_EXTRACT_LANE_S, call->arg_arr); break;
+ case ONYX_INTRINSIC_I8X16_EXTRACT_LANE_U: SIMD_EXTRACT_LANE_INSTR(WI_I8X16_EXTRACT_LANE_U, call->arg_arr); break;
+ case ONYX_INTRINSIC_I8X16_REPLACE_LANE: SIMD_REPLACE_LANE_INSTR(WI_I8X16_REPLACE_LANE, call->arg_arr); break;
+ case ONYX_INTRINSIC_I16X8_EXTRACT_LANE_S: SIMD_EXTRACT_LANE_INSTR(WI_I16X8_EXTRACT_LANE_S, call->arg_arr); break;
+ case ONYX_INTRINSIC_I16X8_EXTRACT_LANE_U: SIMD_EXTRACT_LANE_INSTR(WI_I16X8_EXTRACT_LANE_U, call->arg_arr); break;
+ case ONYX_INTRINSIC_I16X8_REPLACE_LANE: SIMD_REPLACE_LANE_INSTR(WI_I16X8_REPLACE_LANE, call->arg_arr); break;
+ case ONYX_INTRINSIC_I32X4_EXTRACT_LANE: SIMD_EXTRACT_LANE_INSTR(WI_I32X4_EXTRACT_LANE, call->arg_arr); break;
+ case ONYX_INTRINSIC_I32X4_REPLACE_LANE: SIMD_REPLACE_LANE_INSTR(WI_I32X4_REPLACE_LANE, call->arg_arr); break;
+ case ONYX_INTRINSIC_I64X2_EXTRACT_LANE: SIMD_EXTRACT_LANE_INSTR(WI_I64X2_EXTRACT_LANE, call->arg_arr); break;
+ case ONYX_INTRINSIC_I64X2_REPLACE_LANE: SIMD_REPLACE_LANE_INSTR(WI_I64X2_REPLACE_LANE, call->arg_arr); break;
+ case ONYX_INTRINSIC_F32X4_EXTRACT_LANE: SIMD_EXTRACT_LANE_INSTR(WI_F32X4_EXTRACT_LANE, call->arg_arr); break;
+ case ONYX_INTRINSIC_F32X4_REPLACE_LANE: SIMD_REPLACE_LANE_INSTR(WI_F32X4_REPLACE_LANE, call->arg_arr); break;
+ case ONYX_INTRINSIC_F64X2_EXTRACT_LANE: SIMD_EXTRACT_LANE_INSTR(WI_F64X2_EXTRACT_LANE, call->arg_arr); break;
+ case ONYX_INTRINSIC_F64X2_REPLACE_LANE: SIMD_REPLACE_LANE_INSTR(WI_F64X2_REPLACE_LANE, call->arg_arr); break;
case ONYX_INTRINSIC_I8X16_SWIZZLE: WI(WI_I8X16_SWIZZLE); break;
case ONYX_INTRINSIC_I8X16_SPLAT: WI(WI_I8X16_SPLAT); break;