tccgen: arm/i386: save_reg_upstack
commitb691585785086024549cfb9ac65f3397263965aa
authorgrischka <grischka>
Tue, 4 Oct 2016 15:36:51 +0000 (4 17:36 +0200)
committergrischka <grischka>
Tue, 4 Oct 2016 15:36:51 +0000 (4 17:36 +0200)
treee7b13cf60f7c967c7230b4175d2e81eed950d7ac
parent1c4cf1855632d712a67f3cc28e43469f8b5f936a
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)
arm-gen.c
i386-gen.c
tcc.h
tccgen.c
tests/tcctest.c