diff options
| author | Michael Matz <matz@suse.de> | 2016-12-15 17:41:16 +0100 |
|---|---|---|
| committer | Michael Matz <matz@suse.de> | 2016-12-15 17:53:09 +0100 |
| commit | cd9514abc4f4d7d90acce108b98ea2af58a1b80a (patch) | |
| tree | 6e401550a4eddcc55a9db4b685e6a4968550a661 /i386-gen.c | |
| parent | 3980e07fe52457579364a098c2e8d2ecc06fa130 (diff) | |
| download | tinycc-cd9514abc4f4d7d90acce108b98ea2af58a1b80a.tar.gz tinycc-cd9514abc4f4d7d90acce108b98ea2af58a1b80a.tar.bz2 | |
i386: Fix various testsuite issues
on 32bit long long support was sometimes broken. This fixes
code-gen for long long values in switches, disables a x86-64 specific
testcase and avoid an undefined shift amount. It comments out
a bitfield test involving long long bitfields > 32 bit; with GCC layout
they can straddle multiple words and code generation isn't prepared
for this.
Diffstat (limited to 'i386-gen.c')
| -rw-r--r-- | i386-gen.c | 29 |
1 files changed, 21 insertions, 8 deletions
@@ -694,14 +694,27 @@ ST_FUNC void gjmp_addr(int a) ST_FUNC void gtst_addr(int inv, int a) { - inv ^= (vtop--)->c.i; - a -= ind + 2; - if (a == (char)a) { - g(inv - 32); - g(a); - } else { - g(0x0f); - oad(inv - 16, a - 4); + int v = vtop->r & VT_VALMASK; + if (v == VT_CMP) { + inv ^= (vtop--)->c.i; + a -= ind + 2; + if (a == (char)a) { + g(inv - 32); + g(a); + } else { + g(0x0f); + oad(inv - 16, a - 4); + } + } else if ((v & ~1) == VT_JMP) { + if ((v & 1) != inv) { + gjmp_addr(a); + gsym(vtop->c.i); + } else { + gsym(vtop->c.i); + o(0x05eb); + gjmp_addr(a); + } + vtop--; } } |
