aboutsummaryrefslogtreecommitdiff
path: root/i386-gen.c
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2016-12-15 17:41:16 +0100
committerMichael Matz <matz@suse.de>2016-12-15 17:53:09 +0100
commitcd9514abc4f4d7d90acce108b98ea2af58a1b80a (patch)
tree6e401550a4eddcc55a9db4b685e6a4968550a661 /i386-gen.c
parent3980e07fe52457579364a098c2e8d2ecc06fa130 (diff)
downloadtinycc-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.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/i386-gen.c b/i386-gen.c
index cd4cebd..a8c6f4a 100644
--- a/i386-gen.c
+++ b/i386-gen.c
@@ -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--;
}
}