diff options
-rw-r--r-- | qbe.c | 7 | ||||
-rw-r--r-- | test/alignas-local-32.qbe | 11 | ||||
-rw-r--r-- | test/alignas-local-strict.c (renamed from test/alignas-local-32.c) | 0 | ||||
-rw-r--r-- | test/alignas-local-strict.qbe | 12 |
4 files changed, 15 insertions, 15 deletions
@@ -268,24 +268,23 @@ funcalloc(struct func *f, struct decl *d) enum instkind op; struct block *end; struct value *v; - unsigned long long size; int align; assert(!d->type->incomplete); assert(d->type->size > 0); end = f->end; f->end = f->start; - size = d->type->size; + v = mkintconst(d->type->size); align = d->u.obj.align; switch (align) { case 1: case 2: case 4: op = IALLOC4; break; case 8: op = IALLOC8; break; - default: size += align - 16; /* fallthrough */ + default: v = funcinst(f, IADD, ptrclass, v, mkintconst(align - 16)); /* fallthrough */ case 16: op = IALLOC16; break; } - v = funcinst(f, op, ptrclass, mkintconst(size), NULL); + v = funcinst(f, op, ptrclass, v, NULL); if (align > 16) { /* TODO: implement alloc32 in QBE and use that instead */ v = funcinst(f, IADD, ptrclass, v, mkintconst(align - 16)); diff --git a/test/alignas-local-32.qbe b/test/alignas-local-32.qbe deleted file mode 100644 index 53bfab3..0000000 --- a/test/alignas-local-32.qbe +++ /dev/null @@ -1,11 +0,0 @@ -export -function w $main() { -@start.1 - %.1 =l alloc16 17 - %.2 =l add %.1, 16 - %.3 =l and %.2, 18446744073709551584 -@body.2 - %.4 =l extsw 32 - %.5 =l urem %.3, %.4 - ret %.5 -} diff --git a/test/alignas-local-32.c b/test/alignas-local-strict.c index e390713..e390713 100644 --- a/test/alignas-local-32.c +++ b/test/alignas-local-strict.c diff --git a/test/alignas-local-strict.qbe b/test/alignas-local-strict.qbe new file mode 100644 index 0000000..8c725ff --- /dev/null +++ b/test/alignas-local-strict.qbe @@ -0,0 +1,12 @@ +export +function w $main() { +@start.1 + %.1 =l add 1, 16 + %.2 =l alloc16 %.1 + %.3 =l add %.2, 16 + %.4 =l and %.3, 18446744073709551584 +@body.2 + %.5 =l extsw 32 + %.6 =l urem %.4, %.5 + ret %.6 +} |