aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorgrischka <grischka>2016-10-04 17:36:51 +0200
committergrischka <grischka>2016-10-04 17:36:51 +0200
commitb691585785086024549cfb9ac65f3397263965aa (patch)
treee7b13cf60f7c967c7230b4175d2e81eed950d7ac /tests
parent1c4cf1855632d712a67f3cc28e43469f8b5f936a (diff)
downloadtinycc-b691585785086024549cfb9ac65f3397263965aa.tar.gz
tinycc-b691585785086024549cfb9ac65f3397263965aa.tar.bz2
tccgen: arm/i386: save_reg_upstack
tccgen.c:gv() when loading long long from lvalue, before was saving all registers which caused problems in the arm function call register parameter preparation, as with void foo(long long y, int x); int main(void) { unsigned int *xx[1], x; unsigned long long *yy[1], y; foo(**yy, **xx); return 0; } Now only the modified register is saved if necessary, as in this case where it is used to store the result of the post-inc: long long *p, v, **pp; v = 1; p = &v; p[0]++; printf("another long long spill test : %lld\n", *p); i386-gen.c : - found a similar problem with TOK_UMULL caused by the vstack juggle in tccgen:gen_opl() (bug seen only when using EBX as 4th register)
Diffstat (limited to 'tests')
-rw-r--r--tests/tcctest.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/tests/tcctest.c b/tests/tcctest.c
index 5e9b07f..e55dc05 100644
--- a/tests/tcctest.c
+++ b/tests/tcctest.c
@@ -1953,6 +1953,11 @@ long long int value(struct S *v)
return ((long long int)v->item);
}
+long long llfunc2(long long x, long long y, int z)
+{
+ return x * y * z;
+}
+
void longlong_test(void)
{
long long a, b, c;
@@ -1999,15 +2004,17 @@ void longlong_test(void)
}
lloptest(0x80000000, 0);
- /* another long long spill test */
{
- long long *p, v;
+ long long *p, v, **pp;
v = 1;
p = &v;
p[0]++;
- printf("%lld\n", *p);
- }
+ printf("another long long spill test : %lld\n", *p);
+ pp = &p;
+ v = llfunc2(**pp, **pp, ia);
+ printf("a long long function (arm-)reg-args test : %lld\n", v);
+ }
a = 68719476720LL;
b = 4294967295LL;
printf("%d %d %d %d\n", a > b, a < b, a >= b, a <= b);