1# Copyright (c) 2007 The Hewlett-Packard Development Company
2# All rights reserved.
3#
4# The license below extends only to copyright in the software and shall
5# not be construed as granting a license to any other intellectual
6# property including but not limited to intellectual property relating
7# to a hardware implementation of the functionality of the software
8# licensed hereunder.  You may use the software subject to the license
9# terms below provided that you ensure that this notice is replicated
10# unmodified and in its entirety in all distributions of the software,
11# modified or unmodified, in source code or in binary form.
12#
13# Redistribution and use in source and binary forms, with or without
14# modification, are permitted provided that the following conditions are
15# met: redistributions of source code must retain the above copyright
16# notice, this list of conditions and the following disclaimer;
17# redistributions in binary form must reproduce the above copyright
18# notice, this list of conditions and the following disclaimer in the
19# documentation and/or other materials provided with the distribution;
20# neither the name of the copyright holders nor the names of its
21# contributors may be used to endorse or promote products derived from
22# this software without specific prior written permission.
23#
24# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35#
36# Authors: Gabe Black
37
38microcode = '''
39def macroop OR_R_R
40{
41    or reg, reg, regm, flags=(OF,SF,ZF,PF,CF)
42};
43
44def macroop OR_M_I
45{
46    limm t2, imm
47    ldst t1, seg, sib, disp
48    or t1, t1, t2, flags=(OF,SF,ZF,PF,CF)
49    st t1, seg, sib, disp
50};
51
52def macroop OR_P_I
53{
54    limm t2, imm
55    rdip t7
56    ldst t1, seg, riprel, disp
57    or t1, t1, t2, flags=(OF,SF,ZF,PF,CF)
58    st t1, seg, riprel, disp
59};
60
61def macroop OR_LOCKED_M_I
62{
63    limm t2, imm
64    mfence
65    ldstl t1, seg, sib, disp
66    or t1, t1, t2, flags=(OF,SF,ZF,PF,CF)
67    stul t1, seg, sib, disp
68    mfence
69};
70
71def macroop OR_LOCKED_P_I
72{
73    limm t2, imm
74    rdip t7
75    mfence
76    ldstl t1, seg, riprel, disp
77    or t1, t1, t2, flags=(OF,SF,ZF,PF,CF)
78    stul t1, seg, riprel, disp
79    mfence
80};
81
82def macroop OR_M_R
83{
84    ldst t1, seg, sib, disp
85    or t1, t1, reg, flags=(OF,SF,ZF,PF,CF)
86    st t1, seg, sib, disp
87};
88
89def macroop OR_P_R
90{
91    rdip t7
92    ldst t1, seg, riprel, disp
93    or t1, t1, reg, flags=(OF,SF,ZF,PF,CF)
94    st t1, seg, riprel, disp
95};
96
97def macroop OR_LOCKED_M_R
98{
99    mfence
100    ldstl t1, seg, sib, disp
101    or t1, t1, reg, flags=(OF,SF,ZF,PF,CF)
102    stul t1, seg, sib, disp
103    mfence
104};
105
106def macroop OR_LOCKED_P_R
107{
108    rdip t7
109    mfence
110    ldstl t1, seg, riprel, disp
111    or t1, t1, reg, flags=(OF,SF,ZF,PF,CF)
112    stul t1, seg, riprel, disp
113    mfence
114};
115
116def macroop OR_R_M
117{
118    ld t1, seg, sib, disp
119    or reg, reg, t1, flags=(OF,SF,ZF,PF,CF)
120};
121
122def macroop OR_R_P
123{
124    rdip t7
125    ld t1, seg, riprel, disp
126    or reg, reg, t1, flags=(OF,SF,ZF,PF,CF)
127};
128
129def macroop OR_R_I
130{
131    limm t1, imm
132    or reg, reg, t1, flags=(OF,SF,ZF,PF,CF)
133};
134
135def macroop XOR_R_R
136{
137    xor reg, reg, regm, flags=(OF,SF,ZF,PF,CF)
138};
139
140def macroop XOR_R_I
141{
142    limm t1, imm
143    xor reg, reg, t1, flags=(OF,SF,ZF,PF,CF)
144};
145
146def macroop XOR_M_I
147{
148    limm t2, imm
149    ldst t1, seg, sib, disp
150    xor t1, t1, t2, flags=(OF,SF,ZF,PF,CF)
151    st t1, seg, sib, disp
152};
153
154def macroop XOR_P_I
155{
156    limm t2, imm
157    rdip t7
158    ldst t1, seg, riprel, disp
159    xor t1, t1, t2, flags=(OF,SF,ZF,PF,CF)
160    st t1, seg, riprel, disp
161};
162
163def macroop XOR_LOCKED_M_I
164{
165    limm t2, imm
166    mfence
167    ldstl t1, seg, sib, disp
168    xor t1, t1, t2, flags=(OF,SF,ZF,PF,CF)
169    stul t1, seg, sib, disp
170    mfence
171};
172
173def macroop XOR_LOCKED_P_I
174{
175    limm t2, imm
176    rdip t7
177    mfence
178    ldstl t1, seg, riprel, disp
179    xor t1, t1, t2, flags=(OF,SF,ZF,PF,CF)
180    stul t1, seg, riprel, disp
181    mfence
182};
183
184def macroop XOR_M_R
185{
186    ldst t1, seg, sib, disp
187    xor t1, t1, reg, flags=(OF,SF,ZF,PF,CF)
188    st t1, seg, sib, disp
189};
190
191def macroop XOR_P_R
192{
193    rdip t7
194    ldst t1, seg, riprel, disp
195    xor t1, t1, reg, flags=(OF,SF,ZF,PF,CF)
196    st t1, seg, riprel, disp
197};
198
199def macroop XOR_LOCKED_M_R
200{
201    mfence
202    ldstl t1, seg, sib, disp
203    xor t1, t1, reg, flags=(OF,SF,ZF,PF,CF)
204    stul t1, seg, sib, disp
205    mfence
206};
207
208def macroop XOR_LOCKED_P_R
209{
210    rdip t7
211    mfence
212    ldstl t1, seg, riprel, disp
213    xor t1, t1, reg, flags=(OF,SF,ZF,PF,CF)
214    stul t1, seg, riprel, disp
215    mfence
216};
217
218def macroop XOR_R_M
219{
220    ld t1, seg, sib, disp
221    xor reg, reg, t1, flags=(OF,SF,ZF,PF,CF)
222};
223
224def macroop XOR_R_P
225{
226    rdip t7
227    ld t1, seg, riprel, disp
228    xor reg, reg, t1, flags=(OF,SF,ZF,PF,CF)
229};
230
231def macroop AND_R_R
232{
233    and reg, reg, regm, flags=(OF,SF,ZF,PF,CF)
234};
235
236def macroop AND_R_M
237{
238    ld t1, seg, sib, disp
239    and reg, reg, t1, flags=(OF,SF,ZF,PF,CF)
240};
241
242def macroop AND_R_P
243{
244    rdip t7
245    ld t1, seg, riprel, disp
246    and reg, reg, t1, flags=(OF,SF,ZF,PF,CF)
247};
248
249def macroop AND_R_I
250{
251    limm t1, imm
252    and reg, reg, t1, flags=(OF,SF,ZF,PF,CF)
253};
254
255def macroop AND_M_I
256{
257    ldst t2, seg, sib, disp
258    limm t1, imm
259    and t2, t2, t1, flags=(OF,SF,ZF,PF,CF)
260    st t2, seg, sib, disp
261};
262
263def macroop AND_P_I
264{
265    rdip t7
266    ldst t2, seg, riprel, disp
267    limm t1, imm
268    and t2, t2, t1, flags=(OF,SF,ZF,PF,CF)
269    st t2, seg, riprel, disp
270};
271
272def macroop AND_LOCKED_M_I
273{
274    mfence
275    ldstl t2, seg, sib, disp
276    limm t1, imm
277    and t2, t2, t1, flags=(OF,SF,ZF,PF,CF)
278    stul t2, seg, sib, disp
279    mfence
280};
281
282def macroop AND_LOCKED_P_I
283{
284    rdip t7
285    mfence
286    ldstl t2, seg, riprel, disp
287    limm t1, imm
288    and t2, t2, t1, flags=(OF,SF,ZF,PF,CF)
289    stul t2, seg, riprel, disp
290    mfence
291};
292
293def macroop AND_M_R
294{
295    ldst t1, seg, sib, disp
296    and t1, t1, reg, flags=(OF,SF,ZF,PF,CF)
297    st t1, seg, sib, disp
298};
299
300def macroop AND_P_R
301{
302    rdip t7
303    ldst t1, seg, riprel, disp
304    and t1, t1, reg, flags=(OF,SF,ZF,PF,CF)
305    st t1, seg, riprel, disp
306};
307
308def macroop AND_LOCKED_M_R
309{
310    mfence
311    ldstl t1, seg, sib, disp
312    and t1, t1, reg, flags=(OF,SF,ZF,PF,CF)
313    stul t1, seg, sib, disp
314    mfence
315};
316
317def macroop AND_LOCKED_P_R
318{
319    rdip t7
320    mfence
321    ldstl t1, seg, riprel, disp
322    and t1, t1, reg, flags=(OF,SF,ZF,PF,CF)
323    stul t1, seg, riprel, disp
324    mfence
325};
326
327def macroop NOT_R
328{
329    limm t1, -1
330    xor reg, reg, t1
331};
332
333def macroop NOT_M
334{
335    limm t1, -1
336    ldst t2, seg, sib, disp
337    xor t2, t2, t1
338    st t2, seg, sib, disp
339};
340
341def macroop NOT_P
342{
343    limm t1, -1
344    rdip t7
345    ldst t2, seg, riprel, disp
346    xor t2, t2, t1
347    st t2, seg, riprel, disp
348};
349
350def macroop NOT_LOCKED_M
351{
352    limm t1, -1
353    mfence
354    ldstl t2, seg, sib, disp
355    xor t2, t2, t1
356    stul t2, seg, sib, disp
357    mfence
358};
359
360def macroop NOT_LOCKED_P
361{
362    limm t1, -1
363    rdip t7
364    mfence
365    ldstl t2, seg, riprel, disp
366    xor t2, t2, t1
367    stul t2, seg, riprel, disp
368    mfence
369};
370'''
371