]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Fix undefined shifts
authorToni Wilen <twilen@winuae.net>
Sat, 11 Jan 2025 14:31:51 +0000 (16:31 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 11 Jan 2025 14:31:51 +0000 (16:31 +0200)
gencpu.cpp
readcpu.cpp

index ecbf2c64d24fb93b236383dd9d13265105d52567..75708268781f8543169ed7d38fedf60ae0d5c593 100644 (file)
@@ -9107,7 +9107,7 @@ bccl_not68020:
                        if (curi->dmode == Dreg) {
                                out("uae_u32 tmp = m68k_dreg(regs, dstreg);\n");
                                out("offset &= 0x1f;\n");
-                               out("tmp = (tmp << offset) | (tmp >> (32 - offset));\n");
+                               out("if (offset) tmp = (tmp << offset) | (tmp >> (32 - offset));\n");
                                out("bdata[0] = tmp & ((1 << (32 - width)) - 1);\n");
                        } else {
                                out("uae_u32 tmp;\n");
@@ -9156,7 +9156,7 @@ bccl_not68020:
                                || curi->mnemo == i_BFINS) {
                                        if (curi->dmode == Dreg) {
                                                out("tmp = bdata[0] | (tmp << (32 - width));\n");
-                                               out("m68k_dreg(regs, dstreg) = (tmp >> offset) | (tmp << (32 - offset));\n");
+                                               out("m68k_dreg(regs, dstreg) = offset ? ((tmp >> offset) | (tmp << (32 - offset))) : tmp;\n");
                                        } else {
                                                out("%s(dsta, bdata, tmp, offset, width);\n", putb);
                                        }
index d2689cf74509a799da7de20877ac95dfef2aa1ae..61a87f01458c2795813f038313d67ae655b32186 100644 (file)
@@ -867,9 +867,11 @@ static void handle_merges (long int opcode)
        for (srcreg=0; srcreg < sbitdst; srcreg++) {
                for (dstreg=0; dstreg < dstend; dstreg++) {
                        uae_u16 code = (uae_u16)opcode;
+                       uae_u8 spos = (table68k[opcode].spos < 0) ? 0 : table68k[opcode].spos;
+                       uae_u8 dpos = (table68k[opcode].dpos < 0) ? 0 : table68k[opcode].dpos;
 
-                       code = (code & ~smsk) | (srcreg << table68k[opcode].spos);
-                       code = (code & ~dmsk) | (dstreg << table68k[opcode].dpos);
+                       code = (code & ~smsk) | (srcreg << spos);
+                       code = (code & ~dmsk) | (dstreg << dpos);
 
                        /* Check whether this is in fact the same instruction.
                        * The instructions should never differ, except for the