- added instructions how to update the online documentation
[bochs-mirror.git] / cpu / logical32.cc
blobbfcdae22f9574b8ec863bb59516148b9eb0f0f1a
1 /////////////////////////////////////////////////////////////////////////
2 // $Id: logical32.cc,v 1.43 2008/08/11 20:34:05 sshwarts Exp $
3 /////////////////////////////////////////////////////////////////////////
4 //
5 // Copyright (C) 2001 MandrakeSoft S.A.
6 //
7 // MandrakeSoft S.A.
8 // 43, rue d'Aboukir
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
29 #include "bochs.h"
30 #include "cpu.h"
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.
35 #define RAX EAX
36 #endif
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());
46 op1_32 ^= op2_32;
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());
58 op1_32 ^= op2_32;
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)
66 Bit32u op1_32;
68 op1_32 = EAX;
69 op1_32 ^= i->Id();
70 RAX = op1_32;
72 SET_FLAGS_OSZAPC_LOGIC_32(op1_32);
75 void BX_CPP_AttrRegparmN(1) BX_CPU_C::XOR_EdIdM(bxInstruction_c *i)
77 Bit32u op1_32;
79 bx_address eaddr = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
81 op1_32 = read_RMW_virtual_dword(i->seg(), eaddr);
82 op1_32 ^= i->Id();
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());
91 op1_32 ^= i->Id();
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)
99 Bit32u op1_32;
101 bx_address eaddr = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
103 op1_32 = read_RMW_virtual_dword(i->seg(), eaddr);
104 op1_32 |= i->Id();
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());
113 op1_32 |= i->Id();
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)
121 Bit32u op1_32;
123 bx_address eaddr = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
125 op1_32 = read_RMW_virtual_dword(i->seg(), eaddr);
126 op1_32 = ~op1_32;
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());
133 op1_32 = ~op1_32;
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());
145 op1_32 |= op2_32;
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());
157 op1_32 |= op2_32;
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;
167 op1_32 = EAX;
168 op2_32 = i->Id();
169 op1_32 |= op2_32;
170 RAX = op1_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());
183 op1_32 &= op2_32;
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());
195 op1_32 &= op2_32;
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;
205 op1_32 = EAX;
206 op2_32 = i->Id();
207 op1_32 &= op2_32;
208 RAX = op1_32;
210 SET_FLAGS_OSZAPC_LOGIC_32(op1_32);
213 void BX_CPP_AttrRegparmN(1) BX_CPU_C::AND_EdIdM(bxInstruction_c *i)
215 Bit32u op1_32;
217 bx_address eaddr = BX_CPU_CALL_METHODR(i->ResolveModrm, (i));
219 op1_32 = read_RMW_virtual_dword(i->seg(), eaddr);
220 op1_32 &= i->Id();
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());
229 op1_32 &= i->Id();
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());
241 op1_32 &= op2_32;
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;
250 op1_32 = EAX;
251 op2_32 = i->Id();
252 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());
260 op1_32 &= i->Id();
261 SET_FLAGS_OSZAPC_LOGIC_32(op1_32);