From a2a92e5e91c8c9555e0590185a5a7e37702d0c1b Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Thu, 27 Aug 2020 22:47:31 +0900 Subject: [PATCH] Allow to define a function that takes/returns flonums --- codegen.c | 22 +++++++++++++++++++--- test/function.c | 11 +++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/codegen.c b/codegen.c index ec48c2c..af4f85b 100644 --- a/codegen.c +++ b/codegen.c @@ -714,6 +714,18 @@ static void emit_data(Var *prog) { } } +static void store_fp(int r, int offset, int sz) { + switch (sz) { + case 4: + println(" movss %%xmm%d, %d(%%rbp)", r, offset); + return; + case 8: + println(" movsd %%xmm%d, %d(%%rbp)", r, offset); + return; + } + unreachable(); +} + static void store_gp(int r, int offset, int sz) { switch (sz) { case 1: @@ -782,9 +794,13 @@ static void emit_text(Var *prog) { } // Save passed-by-register arguments to the stack - int i = 0; - for (Var *var = fn->params; var; var = var->next) - store_gp(i++, var->offset, var->ty->size); + int gp = 0, fp = 0; + for (Var *var = fn->params; var; var = var->next) { + if (is_flonum(var->ty)) + store_fp(fp++, var->offset, var->ty->size); + else + store_gp(gp++, var->offset, var->ty->size); + } // Emit code gen_stmt(fn->body); diff --git a/test/function.c b/test/function.c index 450531b..df271a2 100644 --- a/test/function.c +++ b/test/function.c @@ -100,6 +100,14 @@ char *fmt(char *buf, char *fmt, ...) { double add_double(double x, double y); float add_float(float x, float y); +float add_float3(float x, float y, float z) { + return x + y + z; +} + +double add_double3(double x, double y, double z) { + return x + y + z; +} + int main() { ASSERT(3, ret3()); ASSERT(8, add2(3, 5)); @@ -163,6 +171,9 @@ int main() { ASSERT(6, add_float(2.3, 3.8)); ASSERT(6, add_double(2.3, 3.8)); + ASSERT(7, add_float3(2.5, 2.5, 2.5)); + ASSERT(7, add_double3(2.5, 2.5, 2.5)); + printf("OK\n"); return 0; } -- GitLab