aboutsummaryrefslogtreecommitdiff
path: root/src/tilde_builtin.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-07-22 12:21:29 +0100
committergingerBill <bill@gingerbill.org>2023-07-22 12:21:29 +0100
commitd82c2ce50ff37ca624d32208f2e0249966b5542d (patch)
treede319cc8ccbc73577e904f98c4b815541622ae8b /src/tilde_builtin.cpp
parent6c12156b1a47cb3c39e5c12d443e482af2a218bb (diff)
Update Tilde; Add `min` and `max`
Diffstat (limited to 'src/tilde_builtin.cpp')
-rw-r--r--src/tilde_builtin.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/tilde_builtin.cpp b/src/tilde_builtin.cpp
index 08c3f7bdd..d6e161ec3 100644
--- a/src/tilde_builtin.cpp
+++ b/src/tilde_builtin.cpp
@@ -91,6 +91,18 @@ gb_internal cgValue cg_builtin_raw_data(cgProcedure *p, cgValue const &value) {
return res;
}
+gb_internal cgValue cg_builtin_min(cgProcedure *p, Type *t, cgValue x, cgValue y) {
+ x = cg_emit_conv(p, x, t);
+ y = cg_emit_conv(p, y, t);
+ return cg_emit_select(p, cg_emit_comp(p, Token_Lt, x, y), x, y);
+}
+gb_internal cgValue cg_builtin_max(cgProcedure *p, Type *t, cgValue x, cgValue y) {
+ x = cg_emit_conv(p, x, t);
+ y = cg_emit_conv(p, y, t);
+ return cg_emit_select(p, cg_emit_comp(p, Token_Gt, x, y), x, y);
+}
+
+
gb_internal cgValue cg_build_builtin(cgProcedure *p, BuiltinProcId id, Ast *expr) {
ast_node(ce, CallExpr, expr);
@@ -137,6 +149,32 @@ gb_internal cgValue cg_build_builtin(cgProcedure *p, BuiltinProcId id, Ast *expr
return cg_builtin_len(p, v);
}
+ case BuiltinProc_min:
+ if (ce->args.count == 2) {
+ Type *t = type_of_expr(expr);
+ return cg_builtin_min(p, t, cg_build_expr(p, ce->args[0]), cg_build_expr(p, ce->args[1]));
+ } else {
+ Type *t = type_of_expr(expr);
+ cgValue x = cg_build_expr(p, ce->args[0]);
+ for (isize i = 1; i < ce->args.count; i++) {
+ x = cg_builtin_min(p, t, x, cg_build_expr(p, ce->args[i]));
+ }
+ return x;
+ }
+ break;
+ case BuiltinProc_max:
+ if (ce->args.count == 2) {
+ Type *t = type_of_expr(expr);
+ return cg_builtin_max(p, t, cg_build_expr(p, ce->args[0]), cg_build_expr(p, ce->args[1]));
+ } else {
+ Type *t = type_of_expr(expr);
+ cgValue x = cg_build_expr(p, ce->args[0]);
+ for (isize i = 1; i < ce->args.count; i++) {
+ x = cg_builtin_max(p, t, x, cg_build_expr(p, ce->args[i]));
+ }
+ return x;
+ }
+ break;
}