From c4cf19ebfc1532b25190e70b350e0b9eae62f076 Mon Sep 17 00:00:00 2001 From: ghidorahrex Date: Fri, 3 Mar 2023 17:14:41 +0000 Subject: [PATCH] GP-2013 Fixed additional issues with shifts and rotates --- .../68000/data/languages/68000.sinc | 96 +++++++++---------- 1 file changed, 44 insertions(+), 52 deletions(-) diff --git a/Ghidra/Processors/68000/data/languages/68000.sinc b/Ghidra/Processors/68000/data/languages/68000.sinc index 4a9e173133..41c512b13a 100644 --- a/Ghidra/Processors/68000/data/languages/68000.sinc +++ b/Ghidra/Processors/68000/data/languages/68000.sinc @@ -701,97 +701,89 @@ macro extendedResultFlags(result) { } macro arithmeticShiftLeft(count, register, width) { - local modcount = count % 64; - CF = 0; - resflags(register); - if (count == 0) goto inst_next; - local msbBefore:4 = zext(register) >> (width - 1); - getbit(CF, register, width - modcount); + local modcount = count & 63; + local lbit:1 = ((register >> (width - modcount) & 1) != 0); + local msbBefore:4 = zext(register s< 0); register = register << modcount; resflags(register); - local msbAfter:4 = zext(register) >> (width - 1); + local msbAfter:4 = zext(register s< 0); VF = (msbBefore ^ msbAfter) != 0; - XF = CF; + CF = (modcount != 0) * lbit; + XF = ((modcount == 0) * XF) + ((modcount != 0) * CF); } macro arithmeticShiftRight(count, register, width) { - local modcount = count % 64; - CF = 0; - resflags(register); - if (count == 0) goto inst_next; - local msbBefore:4 = zext(register) >> (width - 1); - getbit(CF, register, modcount - 1); + local modcount = count & 63; + local lbit:1 = ((register >> (modcount-1) & 1) != 0); + local msbBefore:4 = zext(register s< 0); register = register s>> modcount; resflags(register); - local msbAfter:4 = zext(register) >> (width - 1); + local msbAfter:4 = zext(register s< 0); VF = (msbBefore ^ msbAfter) != 0; - XF = CF; + CF = (modcount != 0) * lbit; + XF = ((modcount == 0) * XF) + ((modcount != 0) * CF); } macro logicalShiftLeft(count, register, width) { - local modcount = count % 64; - CF = 0; - VF = 0; - resflags(register); - if (modcount == 0) goto inst_next; - getbit(CF, register, width - modcount); + local modcount = count & 63; + local lbit:1 = ((register >> (width - modcount) & 1) != 0); + local msbBefore:4 = zext(register s< 0); register = register << modcount; resflags(register); - XF = CF; + local msbAfter:4 = zext(register s< 0); + VF = (msbBefore ^ msbAfter) != 0; + CF = (modcount != 0) * lbit; + XF = ((modcount == 0) * XF) + ((modcount != 0) * CF); } macro logicalShiftRight(count, register, width) { - local modcount = count % 64; - CF = 0; - VF = 0; - resflags(register); - if (modcount == 0) goto inst_next; - getbit(CF, register, width - modcount); + local modcount = count & 63; + local lbit:1 = ((register >> (modcount-1) & 1) != 0); + local msbBefore:4 = zext(register s< 0); register = register >> modcount; resflags(register); - XF = CF; + local msbAfter:4 = zext(register s< 0); + VF = (msbBefore ^ msbAfter) != 0; + CF = (modcount != 0) * lbit; + XF = ((modcount == 0) * XF) + ((modcount != 0) * CF); } macro rotateLeft(count, register, width) { - local modcount = (count % 64) % width; - VF = 0; + local modcount = count & 63; register = (register << modcount) | (register >> (width - modcount)); - getbit(CF, register, width - 1); resflags(register); + CF = (register & 1) != 0; + VF = 0; } macro rotateRight(count, register, width) { - local modcount = (count % 64) % width; - VF = 0; + local modcount = count & 63; register = (register << (width - modcount)) | (register >> modcount); - getbit(CF, register, 0); resflags(register); + CF = zext(register s< 0); + VF = 0; } macro rotateLeftExtended(count, register, width) { - local modcount = (count % 64) % width; + local modcount = count & 63; + local xflag = (register & (1 << (width - modcount))) != 0; + local result = (register << modcount) | (zext(XF) << (modcount - 1)) | (register >> (width - modcount + 1)); + register = (zext(modcount != 0) * result) + (zext(modcount == 0) * register); + resflags(register); + XF = (zext(modcount != 0) * xflag) + (zext(modcount == 0) * XF); CF = XF; VF = 0; - resflags(register); - if (modcount == 0) goto inst_next; - local xflag = (register & (1 << (width - modcount))) != 0; - register = (register << modcount) | (zext(XF) << (modcount - 1)) | (register >> (width - modcount + 1)); - XF = xflag; - CF = XF; - resflags(register); } macro rotateRightExtended(count, register, width) { - local modcount = (count % 64) % width; + local modcount = count & 63; + local xflag = (register & (1 << (modcount - 1))) != 0; + local result = (zext(XF) << (width - modcount)) | (register >> modcount) | (register << (width - modcount + 1)); + register = (zext(modcount != 0) * result) + (zext(modcount == 0) * register); + resflags(register); + XF = (zext(modcount != 0) * xflag) + (zext(modcount == 0) * XF); CF = XF; VF = 0; - resflags(register); - if (modcount == 0) goto inst_next; - local xflag = (register & (1 << (modcount - 1))) != 0; - register = (zext(XF) << (width - modcount)) | (register >> modcount) | (register << (width - modcount + 1)); - XF = xflag; - CF = XF; - resflags(register); } :^instruction is extGUARD=0 & mode2 & reg9an & mode & regan & instruction