aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Preud'homme <robotux@celest.fr>2014-02-03 11:13:42 +0800
committerThomas Preud'homme <robotux@celest.fr>2014-02-03 11:13:42 +0800
commit4760804dbac18646d9c3cbfaa88cee962f195cda (patch)
treeb413d74e0eca061cb326dda2620dadda078c7a6a
parent9fc57302f88a31ff7a42caf161ebcf7b07243a98 (diff)
downloadtinycc-4760804dbac18646d9c3cbfaa88cee962f195cda.tar.gz
tinycc-4760804dbac18646d9c3cbfaa88cee962f195cda.tar.bz2
Fix fct param passing of struct with size < 4
-rw-r--r--arm-gen.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/arm-gen.c b/arm-gen.c
index 4465043..4c38cb9 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