--- np2/i386c/ia32/instructions/shift_rotate.mcr 2004/03/10 02:42:51 1.5 +++ np2/i386c/ia32/instructions/shift_rotate.mcr 2004/03/10 15:38:51 1.7 @@ -1,4 +1,4 @@ -/* $Id: shift_rotate.mcr,v 1.5 2004/03/10 02:42:51 yui Exp $ */ +/* $Id: shift_rotate.mcr,v 1.7 2004/03/10 15:38:51 monaka Exp $ */ /* * Copyright (c) 2003 NONAKA Kimihiro @@ -97,8 +97,7 @@ do { \ CPU_OV = 0; \ if ((s) == 0) { \ CPU_FLAGL |= Z_FLAG; \ - } \ - if ((s) & 0x80000000) { \ + } else if ((s) & 0x80000000) { \ CPU_FLAGL |= S_FLAG; \ } \ CPU_FLAGL |= (szpcflag[(UINT8)(s)] & P_FLAG); \ @@ -139,13 +138,17 @@ do { \ (c) &= 0x1f; \ if (c) { \ if ((c) >= 0x10) { \ - (c) &= 7; \ - (c) |= 8; \ + (c) = 10; \ + } \ + (c)--; \ + if (c) { \ + (s) >>= (c); \ + } \ + else { \ + CPU_OV = (s) & 0x80; \ } \ - (s) >>= (c) - 1; \ CPU_FLAGL = (UINT8)((s) & 1); \ (s) >>= 1; \ - CPU_OV = ((s) ^ ((s) >> 1)) & 0x40; \ CPU_FLAGL |= (szpcflag[(UINT8)(s)] | A_FLAG); \ } \ (d) = (s); \ @@ -158,7 +161,6 @@ do { \ (c)--; \ if (c) { \ (s) >>= (c); \ - CPU_OV = 0; \ } else { \ CPU_OV = (s) & 0x8000; \ } \ @@ -176,7 +178,6 @@ do { \ (c)--; \ if (c) { \ (s) >>= (c); \ - CPU_OV = 0; \ } else { \ CPU_OV = (s) & 0x80000000; \ } \ @@ -217,13 +218,11 @@ do { \ } \ if ((d) == 0) { \ CPU_FLAGL |= Z_FLAG; \ - } \ - if ((d) & 0x80000000) { \ + } else if ((d) & 0x80000000) { \ CPU_FLAGL |= S_FLAG; \ } \ } while (/*CONSTCOND*/ 0) -#if 1 // fix ov #define _BYTE_SHLCL(d, s, c) \ do { \ (c) &= 0x1f; \ @@ -231,7 +230,6 @@ do { \ if ((c) > 0x10) { \ (c) = 10; \ } \ - CPU_OV = 0; \ if ((c) == 1) { \ CPU_OV = ((s) + 0x40) & 0x80; \ } \ @@ -284,74 +282,10 @@ do { \ } \ (d) = (s); \ } while (/*CONSTCOND*/ 0) -#else -#define _BYTE_SHLCL(d, s, c) \ -do { \ - (c) &= 0x1f; \ - if (c) { \ - if ((c) >= 0x10) { \ - (c) &= 7; \ - (c) |= 8; \ - } \ - (s) <<= (c); \ - (s) &= 0x1ff; \ - CPU_FLAGL = (UINT8)(szpcflag[(s) & 0x1ff] | A_FLAG); \ - CPU_OV = 0; \ - if ((c) == 1) { \ - CPU_OV = ((s) ^ ((s) >> 1)) & 0x80; \ - } \ - } \ - (d) = (s); \ -} while (/*CONSTCOND*/ 0) - -#define _WORD_SHLCL(d, s, c) \ -do { \ - (c) &= 0x1f; \ - if (c) { \ - CPU_OV = 0; \ - if ((c) == 1) { \ - CPU_OV = ((s) + 0x4000) & 0x8000; \ - } \ - (s) <<= (c); \ - (s) &= 0x1ffff; \ - CPU_FLAGL = (UINT8)(szpflag_w[(UINT16)(s)] | A_FLAG); \ - CPU_FLAGL |= (UINT8)((s) >> 16); /* C_FLAG */ \ - } \ - (d) = (s); \ -} while (/*CONSTCOND*/ 0) - -#define _DWORD_SHLCL(d, s, c) \ -do { \ - (c) &= 0x1f; \ - if (c) { \ - (c)--; \ - if ((c)) { \ - (s) <<= (c); \ - CPU_OV = 0; \ - } else { \ - CPU_OV = ((s) + 0x40000000) & 0x80000000; \ - } \ - CPU_FLAGL = A_FLAG; \ - if ((s) & 0x80000000) { \ - CPU_FLAGL |= C_FLAG; \ - } \ - (s) <<= 1; \ - if ((s) == 0) { \ - CPU_FLAGL |= Z_FLAG; \ - } \ - if ((s) & 0x80000000) { \ - CPU_FLAGL |= S_FLAG; \ - } \ - CPU_FLAGL |= (szpcflag[(UINT8)(s)] & P_FLAG); \ - } \ - (d) = (s); \ -} while (/*CONSTCOND*/ 0) -#endif /* * SHRD */ -#if 1 // fix ov #define _WORD_SHRD(d, s, c) \ do { \ (c) &= 0x1f; \ @@ -388,45 +322,10 @@ do { \ CPU_FLAGL |= (szpcflag[(UINT8)(d)] & P_FLAG); \ } \ } while (/*CONSTCOND*/ 0) -#else -#define _WORD_SHRD(d, s, c) \ -do { \ - (c) &= 0x1f; \ - if ((c)) { \ - if ((c) < 16) { \ - CPU_FLAGL = (UINT8)(((d) >> ((c) - 1)) & 1); /*C_FLAG*/ \ - (d) |= (s) << 16; \ - (d) >>= (c); \ - (d) &= 0xffff; \ - CPU_FLAGL |= szpflag_w[(UINT16)(d)] | A_FLAG; \ - CPU_OV = (d) & 0x8000; \ - } \ - } \ -} while (/*CONSTCOND*/ 0) - -#define _DWORD_SHRD(d, s, c) \ -do { \ - (c) &= 0x1f; \ - if ((c)) { \ - CPU_FLAGL = (UINT8)(((d) >> ((c) - 1)) & 1); /* C_FLAG */ \ - (d) >>= (c); \ - (d) |= (s) << (32 - (c)); \ - if ((d) == 0) { \ - CPU_FLAGL |= Z_FLAG; \ - } \ - if ((d) & 0x80000000) { \ - CPU_FLAGL |= S_FLAG; \ - } \ - CPU_FLAGL |= (szpcflag[(UINT8)(d)] & P_FLAG); \ - CPU_OV = (d) & 0x80000000; \ - } \ -} while (/*CONSTCOND*/ 0) -#endif /* * SHLD */ -#if 1 // fix ov #define _WORD_SHLD(d, s, c) \ do { \ (c) &= 0x1f; \ @@ -463,40 +362,6 @@ do { \ CPU_FLAGL |= (szpcflag[(UINT8)(d)] & P_FLAG); \ } \ } while (/*CONSTCOND*/ 0) -#else -#define _WORD_SHLD(d, s, c) \ -do { \ - (c) &= 0x1f; \ - if ((c)) { \ - if ((c) < 16) { \ - CPU_FLAGL = (UINT8)(((d) >> (16 - (c))) & 1); /*C_FLAG*/\ - (d) = ((d) << 16) | (s); \ - (d) <<= (c); \ - (d) >>= 16; \ - CPU_FLAGL |= szpflag_w[(d)] | A_FLAG; \ - CPU_OV = (d) & 0x8000; \ - } \ - } \ -} while (/*CONSTCOND*/ 0) - -#define _DWORD_SHLD(d, s, c) \ -do { \ - (c) &= 0x1f; \ - if ((c)) { \ - CPU_FLAGL = (UINT8)(((d) >> (32 - (c))) & 1); /* C_FLAG */ \ - (d) <<= (c); \ - (d) |= ((s) >> (32 - (c))); \ - if ((d) == 0) { \ - CPU_FLAGL |= Z_FLAG; \ - } \ - if ((d) & 0x80000000) { \ - CPU_FLAGL |= S_FLAG; \ - } \ - CPU_FLAGL |= (szpcflag[(UINT8)(d)] & P_FLAG); \ - CPU_OV = (d) & 0x80000000; \ - } \ -} while (/*CONSTCOND*/ 0) -#endif /* * ROR