aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/ssa.cpp
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2016-09-02 14:14:12 +0100
committerGinger Bill <bill@gingerbill.org>2016-09-02 14:14:12 +0100
commit25e9b9bc87a5b4fa14fc7d47ca3077849ee5648d (patch)
tree115e165013c52edd77777f9bd64e212e0b29f7c8 /src/codegen/ssa.cpp
parentfa09d805e23c59cb881573a7a1aee5fbc5752ea2 (diff)
min, max, abs
Diffstat (limited to 'src/codegen/ssa.cpp')
-rw-r--r--src/codegen/ssa.cpp32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/codegen/ssa.cpp b/src/codegen/ssa.cpp
index b2eb6c6a4..077a4f218 100644
--- a/src/codegen/ssa.cpp
+++ b/src/codegen/ssa.cpp
@@ -1569,7 +1569,7 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
case_ast_node(i, Ident, expr);
Entity *e = *map_get(&proc->module->info->uses, hash_pointer(expr));
if (e->kind == Entity_Builtin) {
- GB_PANIC("TODO(bill): ssa_build_single_expr Entity_Builtin");
+ GB_PANIC("TODO(bill): ssa_build_single_expr Entity_Builtin `%.*s`", LIT(builtin_procs[e->Builtin.id].name));
return NULL;
}
@@ -2068,6 +2068,36 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
ssa_emit_store(proc, ssa_emit_struct_gep(proc, slice, v_two32, t_int), cap);
return ssa_emit_load(proc, slice);
} break;
+
+ case BuiltinProc_min: {
+ ssaValue *x = ssa_build_expr(proc, ce->arg_list);
+ ssaValue *y = ssa_build_expr(proc, ce->arg_list->next);
+ Type *t = get_base_type(ssa_type(x));
+ Token lt = {Token_Lt};
+ ssaValue *cond = ssa_emit_comp(proc, lt, x, y);
+ return ssa_emit_select(proc, cond, x, y);
+ } break;
+
+ case BuiltinProc_max: {
+ ssaValue *x = ssa_build_expr(proc, ce->arg_list);
+ ssaValue *y = ssa_build_expr(proc, ce->arg_list->next);
+ Type *t = get_base_type(ssa_type(x));
+ Token gt = {Token_Gt};
+ ssaValue *cond = ssa_emit_comp(proc, gt, x, y);
+ return ssa_emit_select(proc, cond, x, y);
+ } break;
+
+ case BuiltinProc_abs: {
+ Token lt = {Token_Lt};
+ Token sub = {Token_Sub};
+
+ ssaValue *x = ssa_build_expr(proc, ce->arg_list);
+ Type *t = ssa_type(x);
+
+ ssaValue *neg_x = ssa_emit_arith(proc, sub, v_zero, x, t);
+ ssaValue *cond = ssa_emit_comp(proc, lt, x, v_zero);
+ return ssa_emit_select(proc, cond, neg_x, x);
+ } break;
}
}
}