aboutsummaryrefslogtreecommitdiff
path: root/src/ir.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir.c')
-rw-r--r--src/ir.c46
1 files changed, 35 insertions, 11 deletions
diff --git a/src/ir.c b/src/ir.c
index d28d93d07..fb638fb27 100644
--- a/src/ir.c
+++ b/src/ir.c
@@ -1659,6 +1659,39 @@ irValue *ir_emit_ptr_offset(irProcedure *proc, irValue *ptr, irValue *offset) {
return ir_emit(proc, ir_instr_ptr_offset(proc, ptr, offset));
}
+irValue *ir_emit_unary_arith(irProcedure *proc, TokenKind op, irValue *x, Type *type) {
+ switch (op) {
+ case Token_Add:
+ return x;
+ case Token_Not: // Boolean not
+ case Token_Xor: // Bitwise not
+ case Token_Sub: // Bitwise Not
+ break;
+ case Token_Pointer:
+ GB_PANIC("This should be handled elsewhere");
+ break;
+ }
+ if (is_type_vector(ir_type(x))) {
+ ir_emit_comment(proc, str_lit("vector.arith.begin"));
+ // IMPORTANT TODO(bill): This is very wasteful with regards to stack memory
+ Type *tl = base_type(ir_type(x));
+ irValue *val = ir_address_from_load_or_generate_local(proc, x);
+ GB_ASSERT(is_type_vector(type));
+ Type *elem_type = base_type(type)->Vector.elem;
+
+ irValue *res = ir_add_local_generated(proc, type);
+ for (i32 i = 0; i < tl->Vector.count; i++) {
+ irValue *e = ir_emit_load(proc, ir_emit_array_epi(proc, val, i));
+ irValue *z = ir_emit_unary_arith(proc, op, e, elem_type);
+ ir_emit_store(proc, ir_emit_array_epi(proc, res, i), z);
+ }
+ ir_emit_comment(proc, str_lit("vector.arith.end"));
+ return ir_emit_load(proc, res);
+
+ }
+ return ir_emit(proc, ir_instr_unary_op(proc, op, x, type));
+}
+
irValue *ir_emit_arith(irProcedure *proc, TokenKind op, irValue *left, irValue *right, Type *type) {
Type *t_left = ir_type(left);
Type *t_right = ir_type(right);
@@ -3143,17 +3176,8 @@ irValue *ir_build_expr(irProcedure *proc, AstNode *expr) {
switch (ue->op.kind) {
case Token_Pointer:
return ir_emit_ptr_offset(proc, ir_build_addr(proc, ue->expr).addr, v_zero); // Make a copy of the pointer
-
- // case Token_Maybe:
- // return ir_emit_conv(proc, ir_build_expr(proc, ue->expr), type_of_expr(proc->module->info, expr));
-
- case Token_Add:
- return ir_build_expr(proc, ue->expr);
-
- case Token_Not: // Boolean not
- case Token_Xor: // Bitwise not
- case Token_Sub: // Bitwise not
- return ir_emit(proc, ir_instr_unary_op(proc, ue->op.kind, ir_build_expr(proc, ue->expr), tv->type));
+ default:
+ return ir_emit_unary_arith(proc, ue->op.kind, ir_build_expr(proc, ue->expr), tv->type);
}
case_end;