bit_test.py revision 6095:c36f932461d9
1# Copyright (c) 2008 The Regents of The University of Michigan
2# All rights reserved.
3#
4# Redistribution and use in source and binary forms, with or without
5# modification, are permitted provided that the following conditions are
6# met: redistributions of source code must retain the above copyright
7# notice, this list of conditions and the following disclaimer;
8# redistributions in binary form must reproduce the above copyright
9# notice, this list of conditions and the following disclaimer in the
10# documentation and/or other materials provided with the distribution;
11# neither the name of the copyright holders nor the names of its
12# contributors may be used to endorse or promote products derived from
13# this software without specific prior written permission.
14#
15# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26#
27# Authors: Gabe Black
28
29# Copyright (c) 2007-2008 The Hewlett-Packard Development Company
30# All rights reserved.
31#
32# Redistribution and use of this software in source and binary forms,
33# with or without modification, are permitted provided that the
34# following conditions are met:
35#
36# The software must be used only for Non-Commercial Use which means any
37# use which is NOT directed to receiving any direct monetary
38# compensation for, or commercial advantage from such use.  Illustrative
39# examples of non-commercial use are academic research, personal study,
40# teaching, education and corporate research & development.
41# Illustrative examples of commercial use are distributing products for
42# commercial advantage and providing services using the software for
43# commercial advantage.
44#
45# If you wish to use this software or functionality therein that may be
46# covered by patents for commercial use, please contact:
47#     Director of Intellectual Property Licensing
48#     Office of Strategy and Technology
49#     Hewlett-Packard Company
50#     1501 Page Mill Road
51#     Palo Alto, California  94304
52#
53# Redistributions of source code must retain the above copyright notice,
54# this list of conditions and the following disclaimer.  Redistributions
55# in binary form must reproduce the above copyright notice, this list of
56# conditions and the following disclaimer in the documentation and/or
57# other materials provided with the distribution.  Neither the name of
58# the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its
59# contributors may be used to endorse or promote products derived from
60# this software without specific prior written permission.  No right of
61# sublicense is granted herewith.  Derivatives of the software and
62# output created using the software may be prepared, but only for
63# Non-Commercial Uses.  Derivatives of the software may be shared with
64# others provided: (i) the others agree to abide by the list of
65# conditions herein which includes the Non-Commercial Use restrictions;
66# and (ii) such Derivatives of the software include the above copyright
67# notice to acknowledge the contribution from this software where
68# applicable, this list of conditions and the disclaimer below.
69#
70# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
71# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
72# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
73# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
74# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
75# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
76# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
77# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
78# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
79# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
80# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
81#
82# Authors: Gabe Black
83
84microcode = '''
85def macroop BT_R_I {
86    sexti t0, reg, imm, flags=(CF,)
87};
88
89def macroop BT_M_I {
90    limm t1, imm, dataSize=asz
91    # This fudges just a tiny bit, but it's reasonable to expect the
92    # microcode generation logic to have the log of the various sizes
93    # floating around as well.
94    ld t1, seg, sib, disp
95    sexti t0, t1, imm, flags=(CF,)
96};
97
98def macroop BT_P_I {
99    rdip t7
100    limm t1, imm, dataSize=asz
101    ld t1, seg, riprel, disp, dataSize=asz
102    sexti t0, t1, imm, flags=(CF,)
103};
104
105def macroop BT_R_R {
106    sext t0, reg, regm, flags=(CF,)
107};
108
109def macroop BT_M_R {
110    srai t2, reg, 3, dataSize=asz
111    srai t3, t2, ldsz, dataSize=asz
112    lea t3, flatseg, [dsz, t3, base], dataSize=asz
113    ld t1, seg, [scale, index, t3], disp
114    sext t0, t1, reg, flags=(CF,)
115};
116
117def macroop BT_P_R {
118    rdip t7
119    srai t2, reg, 3, dataSize=asz
120    srai t3, t2, ldsz, dataSize=asz
121    lea t3, flatseg, [ldsz, t3, base], dataSize=asz
122    ld t1, seg, [1, t3, t7], disp
123    sext t0, t1, reg, flags=(CF,)
124};
125
126def macroop BTC_R_I {
127    sexti t0, reg, imm, flags=(CF,)
128    limm t1, 1
129    roli t1, t1, imm
130    xor reg, reg, t1
131};
132
133def macroop BTC_M_I {
134    limm t1, imm, dataSize=asz
135    # This fudges just a tiny bit, but it's reasonable to expect the
136    # microcode generation logic to have the log of the various sizes
137    # floating around as well.
138    limm t4, 1
139    roli t4, t4, imm
140    ldst t1, seg, sib, disp
141    sexti t0, t1, imm, flags=(CF,)
142    xor t1, t1, t4
143    st t1, seg, sib, disp
144};
145
146def macroop BTC_P_I {
147    rdip t7, dataSize=asz
148    limm t1, imm, dataSize=asz
149    limm t4, 1
150    roli t4, t4, imm
151    ldst t1, seg, riprel, disp
152    sexti t0, t1, imm, flags=(CF,)
153    xor t1, t1, t4
154    st t1, seg, riprel, disp
155};
156
157def macroop BTC_R_R {
158    sext t0, reg, regm, flags=(CF,)
159    limm t1, 1
160    rol t1, t1, regm
161    xor reg, reg, t1
162};
163
164def macroop BTC_M_R {
165    srai t2, reg, 3, dataSize=asz
166    srai t3, t2, ldsz, dataSize=asz
167    lea t3, flatseg, [dsz, t3, base], dataSize=asz
168    limm t4, 1
169    rol t4, t4, reg
170    ldst t1, seg, [scale, index, t3], disp
171    sext t0, t1, reg, flags=(CF,)
172    xor t1, t1, t4
173    st t1, seg, [scale, index, t3], disp
174};
175
176def macroop BTC_P_R {
177    rdip t7, dataSize=asz
178    srai t2, reg, 3, dataSize=asz
179    srai t3, t2, ldsz, dataSize=asz
180    lea t3, flatseg, [dsz, t3, base], dataSize=asz
181    limm t4, 1
182    rol t4, t4, reg
183    ldst t1, seg, [1, t2, t7], disp
184    sext t0, t1, reg, flags=(CF,)
185    xor t1, t1, t4
186    st t1, seg, [1, t2, t7], disp
187};
188
189def macroop BTR_R_I {
190    sexti t0, reg, imm, flags=(CF,)
191    limm t1, "(uint64_t(-(2ULL)))"
192    roli t1, t1, imm
193    and reg, reg, t1
194};
195
196def macroop BTR_M_I {
197    limm t1, imm, dataSize=asz
198    limm t4, "(uint64_t(-(2ULL)))"
199    roli t4, t4, imm
200    ldst t1, seg, sib, disp
201    sexti t0, t1, imm, flags=(CF,)
202    and t1, t1, t4
203    st t1, seg, sib, disp
204};
205
206def macroop BTR_P_I {
207    rdip t7, dataSize=asz
208    limm t1, imm, dataSize=asz
209    limm t4, "(uint64_t(-(2ULL)))"
210    roli t4, t4, imm
211    ldst t1, seg, riprel, disp
212    sexti t0, t1, imm, flags=(CF,)
213    and t1, t1, t4
214    st t1, seg, riprel, disp
215};
216
217def macroop BTR_LOCKED_M_I {
218    limm t1, imm, dataSize=asz
219    limm t4, "(uint64_t(-(2ULL)))"
220    roli t4, t4, imm
221    ldstl t1, seg, sib, disp
222    sexti t0, t1, imm, flags=(CF,)
223    and t1, t1, t4
224    stul t1, seg, sib, disp
225};
226
227def macroop BTR_LOCKED_P_I {
228    rdip t7, dataSize=asz
229    limm t1, imm, dataSize=asz
230    limm t4, "(uint64_t(-(2ULL)))"
231    roli t4, t4, imm
232    ldstl t1, seg, riprel, disp
233    sexti t0, t1, imm, flags=(CF,)
234    and t1, t1, t4
235    stul t1, seg, riprel, disp
236};
237
238def macroop BTR_R_R {
239    sext t0, reg, regm, flags=(CF,)
240    limm t1, "(uint64_t(-(2ULL)))"
241    rol t1, t1, regm
242    and reg, reg, t1
243};
244
245def macroop BTR_M_R {
246    srai t2, reg, 3, dataSize=asz
247    srai t3, t2, ldsz, dataSize=asz
248    lea t3, flatseg, [dsz, t3, base], dataSize=asz
249    limm t4, "(uint64_t(-(2ULL)))"
250    rol t4, t4, reg
251    ldst t1, seg, [scale, index, t3], disp
252    sext t0, t1, reg, flags=(CF,)
253    and t1, t1, t4
254    st t1, seg, [scale, index, t3], disp
255};
256
257def macroop BTR_P_R {
258    rdip t7, dataSize=asz
259    srai t2, reg, 3, dataSize=asz
260    srai t3, t2, ldsz, dataSize=asz
261    lea t3, flatseg, [dsz, t3, base], dataSize=asz
262    limm t4, "(uint64_t(-(2ULL)))"
263    rol t4, t4, reg
264    ldst t1, seg, [1, t3, t7], disp
265    sext t0, t1, reg, flags=(CF,)
266    and t1, t1, t4
267    st t1, seg, [1, t3, t7], disp
268};
269
270def macroop BTR_LOCKED_M_R {
271    srai t2, reg, 3, dataSize=asz
272    srai t3, t2, ldsz, dataSize=asz
273    lea t3, flatseg, [dsz, t3, base], dataSize=asz
274    limm t4, "(uint64_t(-(2ULL)))"
275    rol t4, t4, reg
276    ldstl t1, seg, [scale, index, t3], disp
277    sext t0, t1, reg, flags=(CF,)
278    and t1, t1, t4
279    stul t1, seg, [scale, index, t3], disp
280};
281
282def macroop BTR_LOCKED_P_R {
283    rdip t7, dataSize=asz
284    srai t2, reg, 3, dataSize=asz
285    srai t3, t2, ldsz, dataSize=asz
286    lea t3, flatseg, [dsz, t3, base], dataSize=asz
287    limm t4, "(uint64_t(-(2ULL)))"
288    rol t4, t4, reg
289    ldstl t1, seg, [1, t3, t7], disp
290    sext t0, t1, reg, flags=(CF,)
291    and t1, t1, t4
292    stul t1, seg, [1, t3, t7], disp
293};
294
295def macroop BTS_R_I {
296    sexti t0, reg, imm, flags=(CF,)
297    limm t1, 1
298    roli t1, t1, imm
299    or reg, reg, t1
300};
301
302def macroop BTS_M_I {
303    limm t1, imm, dataSize=asz
304    limm t4, 1
305    roli t4, t4, imm
306    ldst t1, seg, sib, disp
307    sexti t0, t1, imm, flags=(CF,)
308    or t1, t1, t4
309    st t1, seg, sib, disp
310};
311
312def macroop BTS_P_I {
313    rdip t7, dataSize=asz
314    limm t1, imm, dataSize=asz
315    limm t4, 1
316    roli t4, t4, imm
317    ldst t1, seg, riprel, disp
318    sexti t0, t1, imm, flags=(CF,)
319    or t1, t1, t4
320    st t1, seg, riprel, disp
321};
322
323def macroop BTS_LOCKED_M_I {
324    limm t1, imm, dataSize=asz
325    limm t4, 1
326    roli t4, t4, imm
327    ldstl t1, seg, sib, disp
328    sexti t0, t1, imm, flags=(CF,)
329    or t1, t1, t4
330    stul t1, seg, sib, disp
331};
332
333def macroop BTS_LOCKED_P_I {
334    rdip t7, dataSize=asz
335    limm t1, imm, dataSize=asz
336    limm t4, 1
337    roli t4, t4, imm
338    ldstl t1, seg, riprel, disp
339    sexti t0, t1, imm, flags=(CF,)
340    or t1, t1, t4
341    stul t1, seg, riprel, disp
342};
343
344def macroop BTS_R_R {
345    sext t0, reg, regm, flags=(CF,)
346    limm t1, 1
347    rol t1, t1, regm
348    or reg, reg, t1
349};
350
351def macroop BTS_M_R {
352    srai t2, reg, 3, dataSize=asz
353    srai t3, t2, ldsz, dataSize=asz
354    lea t3, flatseg, [dsz, t3, base], dataSize=asz
355    limm t4, 1
356    rol t4, t4, reg
357    ldst t1, seg, [scale, index, t3], disp
358    sext t0, t1, reg, flags=(CF,)
359    or t1, t1, t4
360    st t1, seg, [scale, index, t3], disp
361};
362
363def macroop BTS_P_R {
364    rdip t7, dataSize=asz
365    srai t2, reg, 3, dataSize=asz
366    srai t3, t2, ldsz, dataSize=asz
367    lea t3, flatseg, [dsz, t3, base], dataSize=asz
368    limm t4, 1
369    rol t4, t4, reg
370    ldst t1, seg, [1, t3, t7], disp
371    sext t0, t1, reg, flags=(CF,)
372    or t1, t1, t4
373    st t1, seg, [1, t3, t7], disp
374};
375
376def macroop BTS_LOCKED_M_R {
377    srai t2, reg, 3, dataSize=asz
378    srai t3, t2, ldsz, dataSize=asz
379    lea t3, flatseg, [dsz, t3, base], dataSize=asz
380    limm t4, 1
381    rol t4, t4, reg
382    ldstl t1, seg, [scale, index, t3], disp
383    sext t0, t1, reg, flags=(CF,)
384    or t1, t1, t4
385    stul t1, seg, [scale, index, t3], disp
386};
387
388def macroop BTS_LOCKED_P_R {
389    rdip t7, dataSize=asz
390    srai t2, reg, 3, dataSize=asz
391    srai t3, t2, ldsz, dataSize=asz
392    lea t3, flatseg, [dsz, t3, base], dataSize=asz
393    limm t4, 1
394    rol t4, t4, reg
395    ldstl t1, seg, [1, t3, t7], disp
396    sext t0, t1, reg, flags=(CF,)
397    or t1, t1, t4
398    stul t1, seg, [1, t3, t7], disp
399};
400'''
401