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