From 4760804dbac18646d9c3cbfaa88cee962f195cda Mon Sep 17 00:00:00 2001 From: Thomas Preud'homme Date: Mon, 3 Feb 2014 11:13:42 +0800 Subject: [PATCH] Fix fct param passing of struct with size < 4 --- arm-gen.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/arm-gen.c b/arm-gen.c index 44650437..4c38cb9e 100644 --- a/arm-gen.c +++ b/arm-gen.c @@ -947,6 +947,8 @@ static int assign_regs(int nb_args, int float_abi, struct plan *plan, int *todo) for(i = nb_args; i-- ;) { int j, start_vfpreg = 0; size = type_size(&vtop[-i].type, &align); + size = (size + 3) & ~3; + align = (align + 3) & ~3; switch(vtop[-i].type.t & VT_BTYPE) { case VT_STRUCT: case VT_FLOAT: @@ -972,8 +974,7 @@ static int assign_regs(int nb_args, int float_abi, struct plan *plan, int *todo) break; } } - ncrn = (ncrn + (align-1)/4) & -(align/4); - size = (size + 3) & -4; + ncrn = (ncrn + (align-1)/4) & ~((align/4) - 1); if (ncrn + size/4 <= 4 || (ncrn < 4 && start_vfpreg != -1)) { /* The parameter is allocated both in core register and on stack. As * such, it can be of either class: it would either be the last of