1 /////////////////////////////////////////////////////////////////////////
2 // $Id: logical32.cc,v 1.43 2008/08/11 20:34:05 sshwarts Exp $
3 /////////////////////////////////////////////////////////////////////////
5 // Copyright (C) 2001 MandrakeSoft S.A.
9 // 75002 Paris - France
10 // http://www.linux-mandrake.com/
11 // http://www.mandrakesoft.com/
13 // This library is free software; you can redistribute it and/or
14 // modify it under the terms of the GNU Lesser General Public
15 // License as published by the Free Software Foundation; either
16 // version 2 of the License, or (at your option) any later version.
18 // This library is distributed in the hope that it will be useful,
19 // but WITHOUT ANY WARRANTY; without even the implied warranty of
20 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 // Lesser General Public License for more details.
23 // You should have received a copy of the GNU Lesser General Public
24 // License along with this library; if not, write to the Free Software
25 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 /////////////////////////////////////////////////////////////////////////
28 #define NEED_CPU_REG_SHORTCUTS 1
31 #define LOG_THIS BX_CPU_THIS_PTR
33 #if BX_SUPPORT_X86_64==0
34 // Make life easier for merging cpu64 and cpu32 code.
38 void BX_CPP_AttrRegparmN(1) BX_CPU_C::XOR_EdGdM(bxInstruction_c
*i
)
40 Bit32u op1_32
, op2_32
;
42 bx_address eaddr
= BX_CPU_CALL_METHODR(i
->ResolveModrm
, (i
));
44 op1_32
= read_RMW_virtual_dword(i
->seg(), eaddr
);
45 op2_32
= BX_READ_32BIT_REG(i
->nnn());
47 write_RMW_virtual_dword(op1_32
);
49 SET_FLAGS_OSZAPC_LOGIC_32(op1_32
);
52 void BX_CPP_AttrRegparmN(1) BX_CPU_C::XOR_GdEdR(bxInstruction_c
*i
)
54 Bit32u op1_32
, op2_32
;
56 op1_32
= BX_READ_32BIT_REG(i
->nnn());
57 op2_32
= BX_READ_32BIT_REG(i
->rm());
59 BX_WRITE_32BIT_REGZ(i
->nnn(), op1_32
);
61 SET_FLAGS_OSZAPC_LOGIC_32(op1_32
);
64 void BX_CPP_AttrRegparmN(1) BX_CPU_C::XOR_EAXId(bxInstruction_c
*i
)
72 SET_FLAGS_OSZAPC_LOGIC_32(op1_32
);
75 void BX_CPP_AttrRegparmN(1) BX_CPU_C::XOR_EdIdM(bxInstruction_c
*i
)
79 bx_address eaddr
= BX_CPU_CALL_METHODR(i
->ResolveModrm
, (i
));
81 op1_32
= read_RMW_virtual_dword(i
->seg(), eaddr
);
83 write_RMW_virtual_dword(op1_32
);
85 SET_FLAGS_OSZAPC_LOGIC_32(op1_32
);
88 void BX_CPP_AttrRegparmN(1) BX_CPU_C::XOR_EdIdR(bxInstruction_c
*i
)
90 Bit32u op1_32
= BX_READ_32BIT_REG(i
->rm());
92 BX_WRITE_32BIT_REGZ(i
->rm(), op1_32
);
94 SET_FLAGS_OSZAPC_LOGIC_32(op1_32
);
97 void BX_CPP_AttrRegparmN(1) BX_CPU_C::OR_EdIdM(bxInstruction_c
*i
)
101 bx_address eaddr
= BX_CPU_CALL_METHODR(i
->ResolveModrm
, (i
));
103 op1_32
= read_RMW_virtual_dword(i
->seg(), eaddr
);
105 write_RMW_virtual_dword(op1_32
);
107 SET_FLAGS_OSZAPC_LOGIC_32(op1_32
);
110 void BX_CPP_AttrRegparmN(1) BX_CPU_C::OR_EdIdR(bxInstruction_c
*i
)
112 Bit32u op1_32
= BX_READ_32BIT_REG(i
->rm());
114 BX_WRITE_32BIT_REGZ(i
->rm(), op1_32
);
116 SET_FLAGS_OSZAPC_LOGIC_32(op1_32
);
119 void BX_CPP_AttrRegparmN(1) BX_CPU_C::NOT_EdM(bxInstruction_c
*i
)
123 bx_address eaddr
= BX_CPU_CALL_METHODR(i
->ResolveModrm
, (i
));
125 op1_32
= read_RMW_virtual_dword(i
->seg(), eaddr
);
127 write_RMW_virtual_dword(op1_32
);
130 void BX_CPP_AttrRegparmN(1) BX_CPU_C::NOT_EdR(bxInstruction_c
*i
)
132 Bit32u op1_32
= BX_READ_32BIT_REG(i
->rm());
134 BX_WRITE_32BIT_REGZ(i
->rm(), op1_32
);
137 void BX_CPP_AttrRegparmN(1) BX_CPU_C::OR_EdGdM(bxInstruction_c
*i
)
139 Bit32u op1_32
, op2_32
;
141 bx_address eaddr
= BX_CPU_CALL_METHODR(i
->ResolveModrm
, (i
));
143 op1_32
= read_RMW_virtual_dword(i
->seg(), eaddr
);
144 op2_32
= BX_READ_32BIT_REG(i
->nnn());
146 write_RMW_virtual_dword(op1_32
);
148 SET_FLAGS_OSZAPC_LOGIC_32(op1_32
);
151 void BX_CPP_AttrRegparmN(1) BX_CPU_C::OR_GdEdR(bxInstruction_c
*i
)
153 Bit32u op1_32
, op2_32
;
155 op1_32
= BX_READ_32BIT_REG(i
->nnn());
156 op2_32
= BX_READ_32BIT_REG(i
->rm());
158 BX_WRITE_32BIT_REGZ(i
->nnn(), op1_32
);
160 SET_FLAGS_OSZAPC_LOGIC_32(op1_32
);
163 void BX_CPP_AttrRegparmN(1) BX_CPU_C::OR_EAXId(bxInstruction_c
*i
)
165 Bit32u op1_32
, op2_32
;
172 SET_FLAGS_OSZAPC_LOGIC_32(op1_32
);
175 void BX_CPP_AttrRegparmN(1) BX_CPU_C::AND_EdGdM(bxInstruction_c
*i
)
177 Bit32u op1_32
, op2_32
;
179 bx_address eaddr
= BX_CPU_CALL_METHODR(i
->ResolveModrm
, (i
));
181 op1_32
= read_RMW_virtual_dword(i
->seg(), eaddr
);
182 op2_32
= BX_READ_32BIT_REG(i
->nnn());
184 write_RMW_virtual_dword(op1_32
);
186 SET_FLAGS_OSZAPC_LOGIC_32(op1_32
);
189 void BX_CPP_AttrRegparmN(1) BX_CPU_C::AND_GdEdR(bxInstruction_c
*i
)
191 Bit32u op1_32
, op2_32
;
193 op1_32
= BX_READ_32BIT_REG(i
->nnn());
194 op2_32
= BX_READ_32BIT_REG(i
->rm());
196 BX_WRITE_32BIT_REGZ(i
->nnn(), op1_32
);
198 SET_FLAGS_OSZAPC_LOGIC_32(op1_32
);
201 void BX_CPP_AttrRegparmN(1) BX_CPU_C::AND_EAXId(bxInstruction_c
*i
)
203 Bit32u op1_32
, op2_32
;
210 SET_FLAGS_OSZAPC_LOGIC_32(op1_32
);
213 void BX_CPP_AttrRegparmN(1) BX_CPU_C::AND_EdIdM(bxInstruction_c
*i
)
217 bx_address eaddr
= BX_CPU_CALL_METHODR(i
->ResolveModrm
, (i
));
219 op1_32
= read_RMW_virtual_dword(i
->seg(), eaddr
);
221 write_RMW_virtual_dword(op1_32
);
223 SET_FLAGS_OSZAPC_LOGIC_32(op1_32
);
226 void BX_CPP_AttrRegparmN(1) BX_CPU_C::AND_EdIdR(bxInstruction_c
*i
)
228 Bit32u op1_32
= BX_READ_32BIT_REG(i
->rm());
230 BX_WRITE_32BIT_REGZ(i
->rm(), op1_32
);
232 SET_FLAGS_OSZAPC_LOGIC_32(op1_32
);
235 void BX_CPP_AttrRegparmN(1) BX_CPU_C::TEST_EdGdR(bxInstruction_c
*i
)
237 Bit32u op1_32
, op2_32
;
239 op1_32
= BX_READ_32BIT_REG(i
->rm());
240 op2_32
= BX_READ_32BIT_REG(i
->nnn());
243 SET_FLAGS_OSZAPC_LOGIC_32(op1_32
);
246 void BX_CPP_AttrRegparmN(1) BX_CPU_C::TEST_EAXId(bxInstruction_c
*i
)
248 Bit32u op1_32
, op2_32
;
254 SET_FLAGS_OSZAPC_LOGIC_32(op1_32
);
257 void BX_CPP_AttrRegparmN(1) BX_CPU_C::TEST_EdIdR(bxInstruction_c
*i
)
259 Bit32u op1_32
= BX_READ_32BIT_REG(i
->rm());
261 SET_FLAGS_OSZAPC_LOGIC_32(op1_32
);