--- np2/i386c/ia32/instructions/shift_rotate.mcr 2004/03/10 07:41:48 1.6 +++ np2/i386c/ia32/instructions/shift_rotate.mcr 2004/03/10 23:01:08 1.8 @@ -1,4 +1,4 @@ -/* $Id: shift_rotate.mcr,v 1.6 2004/03/10 07:41:48 yui Exp $ */ +/* $Id: shift_rotate.mcr,v 1.8 2004/03/10 23:01:08 yui Exp $ */ /* * Copyright (c) 2003 NONAKA Kimihiro @@ -30,6 +30,8 @@ #ifndef IA32_CPU_SHIFT_ROTATE_MCR__ #define IA32_CPU_SHIFT_ROTATE_MCR__ +/* Pentium!!! - シフトカウント != 1の場合はOVは不変らすい */ + /* * SAR */ @@ -54,8 +56,7 @@ do { \ CPU_FLAGL = (UINT8)(A_FLAG | ((s) & 1)); /* C_FLAG */ \ if ((d) == 0) { \ CPU_FLAGL |= Z_FLAG; \ - } \ - if ((d) & 0x80000000) { \ + } else if ((d) & 0x80000000) { \ CPU_FLAGL |= S_FLAG; \ } \ CPU_FLAGL |= (szpcflag[(UINT8)(d)] & P_FLAG); \ @@ -64,11 +65,15 @@ do { \ #define _BYTE_SARCL(d, s, c) \ do { \ (c) &= 0x1f; \ - if (c) { \ - (s) = ((SINT8)(s)) >> ((c) - 1); \ + if ((c)) { \ + (c)--; \ + if ((c)) { \ + (s) = ((SINT8)(s)) >> (c); \ + } else { \ + CPU_OV = 0; \ + } \ CPU_FLAGL = (UINT8)((s) & 1); /* C_FLAG */ \ (s) = (UINT8)(((SINT8)(s)) >> 1); \ - CPU_OV = 0; \ CPU_FLAGL |= (szpcflag[(UINT8)(s)] | A_FLAG); \ } \ (d) = (s); \ @@ -77,11 +82,15 @@ do { \ #define _WORD_SARCL(d, s, c) \ do { \ (c) &= 0x1f; \ - if (c) { \ - (s) = ((SINT16)(s)) >> ((c) - 1); \ + if ((c)) { \ + (c)--; \ + if ((c)) { \ + (s) = ((SINT16)(s)) >> (c); \ + } else { \ + CPU_OV = 0; \ + } \ CPU_FLAGL = (UINT8)((s) & 1); /* C_FLAG */ \ (s) = (UINT16)(((SINT16)(s)) >> 1); \ - CPU_OV = 0; \ CPU_FLAGL |= szpflag_w[(UINT16)(s)]; \ } \ (d) = (s); \ @@ -91,14 +100,17 @@ do { \ do { \ (c) &= 0x1f; \ if ((c)) { \ - (s) = ((SINT32)(s)) >> ((c) - 1); \ + (c)--; \ + if ((c)) { \ + (s) = ((SINT32)(s)) >> (c); \ + } else { \ + CPU_OV = 0; \ + } \ CPU_FLAGL = (UINT8)((s) & 1); /* C_FLAG */ \ (s) = (UINT32)(((SINT32)(s)) >> 1); \ - 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); \ @@ -134,77 +146,18 @@ do { \ CPU_FLAGL |= (szpcflag[(UINT8)(d)] & P_FLAG); \ } while (/*CONSTCOND*/ 0) -#if 1 // fix ov #define _BYTE_SHRCL(d, s, c) \ do { \ (c) &= 0x1f; \ - if (c) { \ - if ((c) >= 0x10) { \ - (c) = 10; \ - } \ - (c)--; \ - if (c) { \ - (s) >>= (c); \ - } \ - else { \ - CPU_OV = (s) & 0x80; \ - } \ - CPU_FLAGL = (UINT8)((s) & 1); \ - (s) >>= 1; \ - CPU_FLAGL |= (szpcflag[(UINT8)(s)] | A_FLAG); \ - } \ - (d) = (s); \ -} while (/*CONSTCOND*/ 0) - -#define _WORD_SHRCL(d, s, c) \ -do { \ - (c) &= 0x1f; \ - if (c) { \ - (c)--; \ - if (c) { \ - (s) >>= (c); \ - } else { \ - CPU_OV = (s) & 0x8000; \ - } \ - CPU_FLAGL = (UINT8)((s) & 1); \ - (s) >>= 1; \ - CPU_FLAGL |= szpflag_w[(UINT16)(s)]; \ - } \ - (d) = (s); \ -} while (/*CONSTCOND*/ 0) - -#define _DWORD_SHRCL(d, s, c) \ -do { \ - (c) &= 0x1f; \ - if (c) { \ + if ((c)) { \ (c)--; \ - if (c) { \ + if ((c)) { \ (s) >>= (c); \ } else { \ - CPU_OV = (s) & 0x80000000; \ - } \ - CPU_FLAGL = (UINT8)((s) & 1); \ - (s) >>= 1; \ - if ((s) == 0) { \ - CPU_FLAGL |= Z_FLAG; \ - } \ - CPU_FLAGL |= (szpcflag[(UINT8)(s)] & P_FLAG); \ - } \ - (d) = (s); \ -} while (/*CONSTCOND*/ 0) -#else -#define _BYTE_SHRCL(d, s, c) \ -do { \ - (c) &= 0x1f; \ - if (c) { \ - if ((c) >= 0x10) { \ - (c) &= 7; \ - (c) |= 8; \ + 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); \ @@ -213,11 +166,10 @@ do { \ #define _WORD_SHRCL(d, s, c) \ do { \ (c) &= 0x1f; \ - if (c) { \ + if ((c)) { \ (c)--; \ - if (c) { \ + if ((c)) { \ (s) >>= (c); \ - CPU_OV = 0; \ } else { \ CPU_OV = (s) & 0x8000; \ } \ @@ -231,11 +183,10 @@ do { \ #define _DWORD_SHRCL(d, s, c) \ do { \ (c) &= 0x1f; \ - if (c) { \ + if ((c)) { \ (c)--; \ - if (c) { \ + if ((c)) { \ (s) >>= (c); \ - CPU_OV = 0; \ } else { \ CPU_OV = (s) & 0x80000000; \ } \ @@ -248,7 +199,6 @@ do { \ } \ (d) = (s); \ } while (/*CONSTCOND*/ 0) -#endif /* * SHL @@ -277,20 +227,15 @@ 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; \ - if (c) { \ - if ((c) > 0x10) { \ - (c) = 10; \ - } \ + if ((c)) { \ if ((c) == 1) { \ CPU_OV = ((s) + 0x40) & 0x80; \ } \ @@ -304,70 +249,7 @@ do { \ #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) -#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)) { \ if ((c) == 1) { \ CPU_OV = ((s) + 0x4000) & 0x8000; \ } \ @@ -382,11 +264,10 @@ do { \ #define _DWORD_SHLCL(d, s, c) \ do { \ (c) &= 0x1f; \ - if (c) { \ + if ((c)) { \ (c)--; \ if ((c)) { \ (s) <<= (c); \ - CPU_OV = 0; \ } else { \ CPU_OV = ((s) + 0x40000000) & 0x80000000; \ } \ @@ -397,20 +278,17 @@ do { \ (s) <<= 1; \ 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); \ } \ (d) = (s); \ } while (/*CONSTCOND*/ 0) -#endif /* * SHRD */ -#if 1 // fix ov #define _WORD_SHRD(d, s, c) \ do { \ (c) &= 0x1f; \ @@ -440,52 +318,16 @@ do { \ (d) |= (s) << (32 - (c)); \ if ((d) == 0) { \ CPU_FLAGL |= Z_FLAG; \ - } \ - if ((d) & 0x80000000) { \ + } else if ((d) & 0x80000000) { \ CPU_FLAGL |= S_FLAG; \ } \ 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; \ @@ -515,47 +357,12 @@ do { \ (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); \ - } \ -} 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) { \ + } else if ((d) & 0x80000000) { \ CPU_FLAGL |= S_FLAG; \ } \ CPU_FLAGL |= (szpcflag[(UINT8)(d)] & P_FLAG); \ - CPU_OV = (d) & 0x80000000; \ } \ } while (/*CONSTCOND*/ 0) -#endif /* * ROR