--- np2/i386c/ia32/instructions/data_trans.c 2003/12/08 00:55:32 1.1 +++ np2/i386c/ia32/instructions/data_trans.c 2004/02/05 16:43:45 1.6 @@ -1,4 +1,4 @@ -/* $Id: data_trans.c,v 1.1 2003/12/08 00:55:32 yui Exp $ */ +/* $Id: data_trans.c,v 1.6 2004/02/05 16:43:45 monaka Exp $ */ /* * Copyright (c) 2003 NONAKA Kimihiro @@ -121,7 +121,7 @@ MOV_EwSw(void) BYTE idx; GET_PCBYTE(op); - idx = (op >> 3) & 3; + idx = (op >> 3) & 7; if (idx < CPU_SEGREG_NUM) { src = CPU_REGS_SREG(idx); if (op >= 0xc0) { @@ -144,7 +144,7 @@ MOV_SwEw(void) BYTE idx; GET_PCBYTE(op); - idx = (op >> 3) & 3; + idx = (op >> 3) & 7; if (idx != CPU_CS_INDEX && idx < CPU_SEGREG_NUM) { if (op >= 0xc0) { CPU_WORKCLOCK(2); @@ -814,6 +814,34 @@ void XCHG_EDIEAX(void) { CPU_WORKCLOCK(3 /* * BSWAP */ +#if defined(bswap32) && !defined(IA32_USE_ASM_BSWAP) +#define BSWAP_DWORD(v) bswap32(v) +#else /* !bswap32 || IA32_USE_ASM_BSWAP */ +INLINE static DWORD +BSWAP_DWORD(DWORD val) +{ +#if defined(__GNUC__) && (defined(i386) || defined(__i386__)) + __asm__ __volatile__ ( +#if defined(IA32_USE_ASM_BSWAP) + "bswap %0" +#else /* !IA32_USE_ASM_BSWAP */ + "rorw $8, %w1\n\t" + "rorl $16, %1\n\t" + "rorw $8, %w1\n\t" +#endif /* IA32_USE_ASM_BSWAP */ + : "=r" (val) : "0" (val)); + return val; +#else /* !(__GNUC__ && (i386 || __i386__)) */ + DWORD v; + v = (val & 0x000000ff) << 24; + v |= (val & 0x0000ff00) << 8; + v |= (val & 0x00ff0000) >> 8; + v |= (val & 0xff000000) >> 24; + return v; +#endif /* __GNUC__ && (i386 || __i386__) */ +} +#endif /* bswap32 && !IA32_USE_ASM_BSWAP */ + void BSWAP_EAX(void) { CPU_WORKCLOCK(2); CPU_EAX = BSWAP_DWORD(CPU_EAX); } void BSWAP_ECX(void) { CPU_WORKCLOCK(2); CPU_ECX = BSWAP_DWORD(CPU_ECX); } void BSWAP_EDX(void) { CPU_WORKCLOCK(2); CPU_EDX = BSWAP_DWORD(CPU_EDX); } @@ -1016,7 +1044,7 @@ void PUSH_AX(void) { CPU_WORKCLOCK(3); P void PUSH_CX(void) { CPU_WORKCLOCK(3); PUSH0_16(CPU_CX); } void PUSH_DX(void) { CPU_WORKCLOCK(3); PUSH0_16(CPU_DX); } void PUSH_BX(void) { CPU_WORKCLOCK(3); PUSH0_16(CPU_BX); } -void PUSH_SP(void) { CPU_WORKCLOCK(3); SP_PUSH0_16(CPU_SP); } +void PUSH_SP(void) { CPU_WORKCLOCK(3); SP_PUSH_16(CPU_SP); } void PUSH_BP(void) { CPU_WORKCLOCK(3); PUSH0_16(CPU_BP); } void PUSH_SI(void) { CPU_WORKCLOCK(3); PUSH0_16(CPU_SI); } void PUSH_DI(void) { CPU_WORKCLOCK(3); PUSH0_16(CPU_DI); } @@ -1025,7 +1053,7 @@ void PUSH_EAX(void) { CPU_WORKCLOCK(3); void PUSH_ECX(void) { CPU_WORKCLOCK(3); PUSH0_32(CPU_ECX); } void PUSH_EDX(void) { CPU_WORKCLOCK(3); PUSH0_32(CPU_EDX); } void PUSH_EBX(void) { CPU_WORKCLOCK(3); PUSH0_32(CPU_EBX); } -void PUSH_ESP(void) { CPU_WORKCLOCK(3); ESP_PUSH0_32(CPU_ESP); } +void PUSH_ESP(void) { CPU_WORKCLOCK(3); ESP_PUSH_32(CPU_ESP); } void PUSH_EBP(void) { CPU_WORKCLOCK(3); PUSH0_32(CPU_EBP); } void PUSH_ESI(void) { CPU_WORKCLOCK(3); PUSH0_32(CPU_ESI); } void PUSH_EDI(void) { CPU_WORKCLOCK(3); PUSH0_32(CPU_EDI); } @@ -1071,7 +1099,7 @@ PUSH_Ib(void) CPU_WORKCLOCK(3); GET_PCBYTESD(val); - XPUSH0((WORD)val); + XPUSH0(val); } void @@ -1115,7 +1143,7 @@ void POP_AX(void) { CPU_WORKCLOCK(5); PO void POP_CX(void) { CPU_WORKCLOCK(5); POP0_16(CPU_CX); } void POP_DX(void) { CPU_WORKCLOCK(5); POP0_16(CPU_DX); } void POP_BX(void) { CPU_WORKCLOCK(5); POP0_16(CPU_BX); } -void POP_SP(void) { CPU_WORKCLOCK(5); SP_POP0_16(CPU_SP); } +void POP_SP(void) { CPU_WORKCLOCK(5); SP_POP_16(CPU_SP); } void POP_BP(void) { CPU_WORKCLOCK(5); POP0_16(CPU_BP); } void POP_SI(void) { CPU_WORKCLOCK(5); POP0_16(CPU_SI); } void POP_DI(void) { CPU_WORKCLOCK(5); POP0_16(CPU_DI); } @@ -1124,7 +1152,7 @@ void POP_EAX(void) { CPU_WORKCLOCK(5); P void POP_ECX(void) { CPU_WORKCLOCK(5); POP0_32(CPU_ECX); } void POP_EDX(void) { CPU_WORKCLOCK(5); POP0_32(CPU_EDX); } void POP_EBX(void) { CPU_WORKCLOCK(5); POP0_32(CPU_EBX); } -void POP_ESP(void) { CPU_WORKCLOCK(5); ESP_POP0_32(CPU_ESP); } +void POP_ESP(void) { CPU_WORKCLOCK(5); ESP_POP_32(CPU_ESP); } void POP_EBP(void) { CPU_WORKCLOCK(5); POP0_32(CPU_EBP); } void POP_ESI(void) { CPU_WORKCLOCK(5); POP0_32(CPU_ESI); } void POP_EDI(void) { CPU_WORKCLOCK(5); POP0_32(CPU_EDI); } @@ -1316,6 +1344,7 @@ POP32_GS(void) void PUSHA(void) { + WORD sp = CPU_SP; CPU_WORKCLOCK(17); if (!CPU_STAT_SS32) { @@ -1326,19 +1355,19 @@ PUSHA(void) REGPUSH0(CPU_CX); REGPUSH0(CPU_DX); REGPUSH0(CPU_BX); - SP_PUSH0(CPU_SP); + REGPUSH0(sp); REGPUSH0(CPU_BP); REGPUSH0(CPU_SI); REGPUSH0(CPU_DI); } else { if (CPU_STAT_PM) { - CHECK_STACK_PUSH(&CPU_STAT_SREG(CPU_SS_INDEX), CPU_ESP, 32); + CHECK_STACK_PUSH(&CPU_STAT_SREG(CPU_SS_INDEX), CPU_ESP, 16); } REGPUSH0_16_32(CPU_AX); REGPUSH0_16_32(CPU_CX); REGPUSH0_16_32(CPU_DX); REGPUSH0_16_32(CPU_BX); - SP_PUSH0_16_32(CPU_SP); + REGPUSH0_16_32(sp); REGPUSH0_16_32(CPU_BP); REGPUSH0_16_32(CPU_SI); REGPUSH0_16_32(CPU_DI); @@ -1348,17 +1377,18 @@ PUSHA(void) void PUSHAD(void) { + DWORD esp = CPU_ESP; CPU_WORKCLOCK(17); if (!CPU_STAT_SS32) { if (CPU_STAT_PM) { - CHECK_STACK_PUSH(&CPU_STAT_SREG(CPU_SS_INDEX), CPU_SP, 16); + CHECK_STACK_PUSH(&CPU_STAT_SREG(CPU_SS_INDEX), CPU_SP, 32); } REGPUSH0_32_16(CPU_EAX); REGPUSH0_32_16(CPU_ECX); REGPUSH0_32_16(CPU_EDX); REGPUSH0_32_16(CPU_EBX); - ESP_PUSH0_32_16(CPU_ESP); + REGPUSH0_32_16(esp); REGPUSH0_32_16(CPU_EBP); REGPUSH0_32_16(CPU_ESI); REGPUSH0_32_16(CPU_EDI); @@ -1370,7 +1400,7 @@ PUSHAD(void) REGPUSH0_32(CPU_ECX); REGPUSH0_32(CPU_EDX); REGPUSH0_32(CPU_EBX); - ESP_PUSH0_32(CPU_ESP); + REGPUSH0_32(esp); REGPUSH0_32(CPU_EBP); REGPUSH0_32(CPU_ESI); REGPUSH0_32(CPU_EDI); @@ -1396,7 +1426,7 @@ POPA(void) REGPOP0(CPU_AX); } else { if (CPU_STAT_PM) { - CHECK_STACK_POP(&CPU_STAT_SREG(CPU_SS_INDEX), CPU_ESP, 32); + CHECK_STACK_POP(&CPU_STAT_SREG(CPU_SS_INDEX), CPU_ESP, 16); } REGPOP0_16_32(CPU_DI); REGPOP0_16_32(CPU_SI); @@ -1416,7 +1446,7 @@ POPAD(void) CPU_WORKCLOCK(19); if (!CPU_STAT_SS32) { if (CPU_STAT_PM) { - CHECK_STACK_POP(&CPU_STAT_SREG(CPU_SS_INDEX), CPU_SP, 16); + CHECK_STACK_POP(&CPU_STAT_SREG(CPU_SS_INDEX), CPU_SP, 32); } REGPOP0_32_16(CPU_EDI); REGPOP0_32_16(CPU_ESI); @@ -1471,7 +1501,7 @@ IN_EAXDX(void) void IN_ALIb(void) { - BYTE port; + WORD port; CPU_WORKCLOCK(5); GET_PCBYTE(port); @@ -1481,7 +1511,7 @@ IN_ALIb(void) void IN_AXIb(void) { - BYTE port; + WORD port; CPU_WORKCLOCK(5); GET_PCBYTE(port); @@ -1491,7 +1521,7 @@ IN_AXIb(void) void IN_EAXIb(void) { - BYTE port; + WORD port; CPU_WORKCLOCK(5); GET_PCBYTE(port); @@ -1528,7 +1558,7 @@ OUT_DXEAX(void) void OUT_IbAL(void) { - BYTE port; + WORD port; CPU_WORKCLOCK(3); GET_PCBYTE(port); @@ -1538,7 +1568,7 @@ OUT_IbAL(void) void OUT_IbAX(void) { - BYTE port; + WORD port; CPU_WORKCLOCK(3); GET_PCBYTE(port); @@ -1548,11 +1578,11 @@ OUT_IbAX(void) void OUT_IbEAX(void) { - BYTE port; + WORD port; CPU_WORKCLOCK(3); GET_PCBYTE(port); - cpu_out_w(port, CPU_EAX); + cpu_out_d(port, CPU_EAX); } /* @@ -1616,6 +1646,16 @@ MOVSX_GwEb(void) } void +MOVSX_GwEw(void) +{ + WORD *out; + DWORD op, src; + + PREPART_REG16_EA(op, src, out, 2, 5); + *out = src; +} + +void MOVSX_GdEb(void) { DWORD *out; @@ -1649,6 +1689,16 @@ MOVZX_GwEb(void) } void +MOVZX_GwEw(void) +{ + WORD *out; + DWORD op, src; + + PREPART_REG16_EA(op, src, out, 2, 5); + *out = src; +} + +void MOVZX_GdEb(void) { DWORD *out;