bit_scan.py (5661:443e6f925027) bit_scan.py (6344:b7104eda0795)
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 BSR_R_R {
86 # Determine if the input was zero, and also move it to a temp reg.
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 BSR_R_R {
86 # Determine if the input was zero, and also move it to a temp reg.
87 movi t1, t1, t0, dataSize=8
87 mov t1, t1, t0, dataSize=8
88 and t1, regm, regm, flags=(ZF,)
89 br label("end"), flags=(CZF,)
90
91 # Zero out the result register
92 movi reg, reg, 0x0
93
94 # Bit 6
95 srli t3, t1, 32, dataSize=8, flags=(EZF,)
96 ori t4, reg, 0x20
97 mov reg, reg, t4, flags=(nCEZF,)
98 mov t1, t1, t3, flags=(nCEZF,)
99
100 # Bit 5
101 srli t3, t1, 16, dataSize=8, flags=(EZF,)
102 ori t4, reg, 0x10
103 mov reg, reg, t4, flags=(nCEZF,)
104 mov t1, t1, t3, flags=(nCEZF,)
105
106 # Bit 4
107 srli t3, t1, 8, dataSize=8, flags=(EZF,)
108 ori t4, reg, 0x8
109 mov reg, reg, t4, flags=(nCEZF,)
110 mov t1, t1, t3, flags=(nCEZF,)
111
112 # Bit 3
113 srli t3, t1, 4, dataSize=8, flags=(EZF,)
114 ori t4, reg, 0x4
115 mov reg, reg, t4, flags=(nCEZF,)
116 mov t1, t1, t3, flags=(nCEZF,)
117
118 # Bit 2
119 srli t3, t1, 2, dataSize=8, flags=(EZF,)
120 ori t4, reg, 0x2
121 mov reg, reg, t4, flags=(nCEZF,)
122 mov t1, t1, t3, flags=(nCEZF,)
123
124 # Bit 1
125 srli t3, t1, 1, dataSize=8, flags=(EZF,)
126 ori t4, reg, 0x1
127 mov reg, reg, t4, flags=(nCEZF,)
128
129end:
130 fault "NoFault"
131};
132
133def macroop BSR_R_M {
134
88 and t1, regm, regm, flags=(ZF,)
89 br label("end"), flags=(CZF,)
90
91 # Zero out the result register
92 movi reg, reg, 0x0
93
94 # Bit 6
95 srli t3, t1, 32, dataSize=8, flags=(EZF,)
96 ori t4, reg, 0x20
97 mov reg, reg, t4, flags=(nCEZF,)
98 mov t1, t1, t3, flags=(nCEZF,)
99
100 # Bit 5
101 srli t3, t1, 16, dataSize=8, flags=(EZF,)
102 ori t4, reg, 0x10
103 mov reg, reg, t4, flags=(nCEZF,)
104 mov t1, t1, t3, flags=(nCEZF,)
105
106 # Bit 4
107 srli t3, t1, 8, dataSize=8, flags=(EZF,)
108 ori t4, reg, 0x8
109 mov reg, reg, t4, flags=(nCEZF,)
110 mov t1, t1, t3, flags=(nCEZF,)
111
112 # Bit 3
113 srli t3, t1, 4, dataSize=8, flags=(EZF,)
114 ori t4, reg, 0x4
115 mov reg, reg, t4, flags=(nCEZF,)
116 mov t1, t1, t3, flags=(nCEZF,)
117
118 # Bit 2
119 srli t3, t1, 2, dataSize=8, flags=(EZF,)
120 ori t4, reg, 0x2
121 mov reg, reg, t4, flags=(nCEZF,)
122 mov t1, t1, t3, flags=(nCEZF,)
123
124 # Bit 1
125 srli t3, t1, 1, dataSize=8, flags=(EZF,)
126 ori t4, reg, 0x1
127 mov reg, reg, t4, flags=(nCEZF,)
128
129end:
130 fault "NoFault"
131};
132
133def macroop BSR_R_M {
134
135 movi t1, t1, t0, dataSize=8
135 mov t1, t1, t0, dataSize=8
136 ld t1, seg, sib, disp
137
138 # Determine if the input was zero, and also move it to a temp reg.
139 and t1, t1, t1, flags=(ZF,)
140 br label("end"), flags=(CZF,)
141
142 # Zero out the result register
143 movi reg, reg, 0x0
144
145 # Bit 6
146 srli t3, t1, 32, dataSize=8, flags=(EZF,)
147 ori t4, reg, 0x20
148 mov reg, reg, t4, flags=(nCEZF,)
149 mov t1, t1, t3, flags=(nCEZF,)
150
151 # Bit 5
152 srli t3, t1, 16, dataSize=8, flags=(EZF,)
153 ori t4, reg, 0x10
154 mov reg, reg, t4, flags=(nCEZF,)
155 mov t1, t1, t3, flags=(nCEZF,)
156
157 # Bit 4
158 srli t3, t1, 8, dataSize=8, flags=(EZF,)
159 ori t4, reg, 0x8
160 mov reg, reg, t4, flags=(nCEZF,)
161 mov t1, t1, t3, flags=(nCEZF,)
162
163 # Bit 3
164 srli t3, t1, 4, dataSize=8, flags=(EZF,)
165 ori t4, reg, 0x4
166 mov reg, reg, t4, flags=(nCEZF,)
167 mov t1, t1, t3, flags=(nCEZF,)
168
169 # Bit 2
170 srli t3, t1, 2, dataSize=8, flags=(EZF,)
171 ori t4, reg, 0x2
172 mov reg, reg, t4, flags=(nCEZF,)
173 mov t1, t1, t3, flags=(nCEZF,)
174
175 # Bit 1
176 srli t3, t1, 1, dataSize=8, flags=(EZF,)
177 ori t4, reg, 0x1
178 mov reg, reg, t4, flags=(nCEZF,)
179
180end:
181 fault "NoFault"
182};
183
184def macroop BSR_R_P {
185
186 rdip t7
136 ld t1, seg, sib, disp
137
138 # Determine if the input was zero, and also move it to a temp reg.
139 and t1, t1, t1, flags=(ZF,)
140 br label("end"), flags=(CZF,)
141
142 # Zero out the result register
143 movi reg, reg, 0x0
144
145 # Bit 6
146 srli t3, t1, 32, dataSize=8, flags=(EZF,)
147 ori t4, reg, 0x20
148 mov reg, reg, t4, flags=(nCEZF,)
149 mov t1, t1, t3, flags=(nCEZF,)
150
151 # Bit 5
152 srli t3, t1, 16, dataSize=8, flags=(EZF,)
153 ori t4, reg, 0x10
154 mov reg, reg, t4, flags=(nCEZF,)
155 mov t1, t1, t3, flags=(nCEZF,)
156
157 # Bit 4
158 srli t3, t1, 8, dataSize=8, flags=(EZF,)
159 ori t4, reg, 0x8
160 mov reg, reg, t4, flags=(nCEZF,)
161 mov t1, t1, t3, flags=(nCEZF,)
162
163 # Bit 3
164 srli t3, t1, 4, dataSize=8, flags=(EZF,)
165 ori t4, reg, 0x4
166 mov reg, reg, t4, flags=(nCEZF,)
167 mov t1, t1, t3, flags=(nCEZF,)
168
169 # Bit 2
170 srli t3, t1, 2, dataSize=8, flags=(EZF,)
171 ori t4, reg, 0x2
172 mov reg, reg, t4, flags=(nCEZF,)
173 mov t1, t1, t3, flags=(nCEZF,)
174
175 # Bit 1
176 srli t3, t1, 1, dataSize=8, flags=(EZF,)
177 ori t4, reg, 0x1
178 mov reg, reg, t4, flags=(nCEZF,)
179
180end:
181 fault "NoFault"
182};
183
184def macroop BSR_R_P {
185
186 rdip t7
187 movi t1, t1, t0, dataSize=8
187 mov t1, t1, t0, dataSize=8
188 ld t1, seg, riprel, disp
189
190 # Determine if the input was zero, and also move it to a temp reg.
191 and t1, t1, t1, flags=(ZF,)
192 br label("end"), flags=(CZF,)
193
194 # Zero out the result register
195 movi reg, reg, 0x0
196
197 # Bit 6
198 srli t3, t1, 32, dataSize=8, flags=(EZF,)
199 ori t4, reg, 0x20
200 mov reg, reg, t4, flags=(nCEZF,)
201 mov t1, t1, t3, flags=(nCEZF,)
202
203 # Bit 5
204 srli t3, t1, 16, dataSize=8, flags=(EZF,)
205 ori t4, reg, 0x10
206 mov reg, reg, t4, flags=(nCEZF,)
207 mov t1, t1, t3, flags=(nCEZF,)
208
209 # Bit 4
210 srli t3, t1, 8, dataSize=8, flags=(EZF,)
211 ori t4, reg, 0x8
212 mov reg, reg, t4, flags=(nCEZF,)
213 mov t1, t1, t3, flags=(nCEZF,)
214
215 # Bit 3
216 srli t3, t1, 4, dataSize=8, flags=(EZF,)
217 ori t4, reg, 0x4
218 mov reg, reg, t4, flags=(nCEZF,)
219 mov t1, t1, t3, flags=(nCEZF,)
220
221 # Bit 2
222 srli t3, t1, 2, dataSize=8, flags=(EZF,)
223 ori t4, reg, 0x2
224 mov reg, reg, t4, flags=(nCEZF,)
225 mov t1, t1, t3, flags=(nCEZF,)
226
227 # Bit 1
228 srli t3, t1, 1, dataSize=8, flags=(EZF,)
229 ori t4, reg, 0x1
230 mov reg, reg, t4, flags=(nCEZF,)
231
232end:
233 fault "NoFault"
234};
235
236def macroop BSF_R_R {
237 # Determine if the input was zero, and also move it to a temp reg.
238 mov t1, t1, t0, dataSize=8
239 and t1, regm, regm, flags=(ZF,)
240 br label("end"), flags=(CZF,)
241
242 # Zero out the result register
243 movi reg, reg, 0
244
245 subi t2, t1, 1
246 xor t1, t2, t1
247
248
249 # Bit 6
250 srli t3, t1, 32, dataSize=8, flags=(EZF,)
251 ori t4, reg, 32
252 mov reg, reg, t4, flags=(nCEZF,)
253 mov t1, t1, t3, flags=(nCEZF,)
254
255 # Bit 5
256 srli t3, t1, 16, dataSize=8, flags=(EZF,)
257 ori t4, reg, 16
258 mov reg, reg, t4, flags=(nCEZF,)
259 mov t1, t1, t3, flags=(nCEZF,)
260
261 # Bit 4
262 srli t3, t1, 8, dataSize=8, flags=(EZF,)
263 ori t4, reg, 8
264 mov reg, reg, t4, flags=(nCEZF,)
265 mov t1, t1, t3, flags=(nCEZF,)
266
267 # Bit 3
268 srli t3, t1, 4, dataSize=8, flags=(EZF,)
269 ori t4, reg, 4
270 mov reg, reg, t4, flags=(nCEZF,)
271 mov t1, t1, t3, flags=(nCEZF,)
272
273 # Bit 2
274 srli t3, t1, 2, dataSize=8, flags=(EZF,)
275 ori t4, reg, 2
276 mov reg, reg, t4, flags=(nCEZF,)
277 mov t1, t1, t3, flags=(nCEZF,)
278
279 # Bit 1
280 srli t3, t1, 1, dataSize=8, flags=(EZF,)
281 ori t4, reg, 1
282 mov reg, reg, t4, flags=(nCEZF,)
283
284end:
285 fault "NoFault"
286};
287
288def macroop BSF_R_M {
289
290 mov t1, t1, t0, dataSize=8
291 ld t1, seg, sib, disp
292
293 # Determine if the input was zero, and also move it to a temp reg.
294 and t1, t1, t1, flags=(ZF,)
295 br label("end"), flags=(CZF,)
296
297 # Zero out the result register
298 mov reg, reg, t0
299
300 subi t2, t1, 1
301 xor t1, t2, t1
302
303 # Bit 6
304 srli t3, t1, 32, dataSize=8, flags=(EZF,)
305 ori t4, reg, 32
306 mov reg, reg, t4, flags=(nCEZF,)
307 mov t1, t1, t3, flags=(nCEZF,)
308
309 # Bit 5
310 srli t3, t1, 16, dataSize=8, flags=(EZF,)
311 ori t4, reg, 16
312 mov reg, reg, t4, flags=(nCEZF,)
313 mov t1, t1, t3, flags=(nCEZF,)
314
315 # Bit 4
316 srli t3, t1, 8, dataSize=8, flags=(EZF,)
317 ori t4, reg, 8
318 mov reg, reg, t4, flags=(nCEZF,)
319 mov t1, t1, t3, flags=(nCEZF,)
320
321 # Bit 3
322 srli t3, t1, 4, dataSize=8, flags=(EZF,)
323 ori t4, reg, 4
324 mov reg, reg, t4, flags=(nCEZF,)
325 mov t1, t1, t3, flags=(nCEZF,)
326
327 # Bit 2
328 srli t3, t1, 2, dataSize=8, flags=(EZF,)
329 ori t4, reg, 2
330 mov reg, reg, t4, flags=(nCEZF,)
331 mov t1, t1, t3, flags=(nCEZF,)
332
333 # Bit 1
334 srli t3, t1, 1, dataSize=8, flags=(EZF,)
335 ori t4, reg, 1
336 mov reg, reg, t4, flags=(nCEZF,)
337 mov t1, t1, t3, flags=(nCEZF,)
338
339end:
340 fault "NoFault"
341};
342
343def macroop BSF_R_P {
344
345 rdip t7
346 mov t1, t1, t0, dataSize=8
347 ld t1, seg, riprel, disp
348
349 # Determine if the input was zero, and also move it to a temp reg.
350 and t1, t1, t1, flags=(ZF,)
351 br label("end"), flags=(CZF,)
352
353 # Zero out the result register
354 mov reg, reg, t0
355
356 subi t2, t1, 1
357 xor t1, t2, t1
358
359 # Bit 6
360 srli t3, t1, 32, dataSize=8, flags=(EZF,)
361 ori t4, reg, 32
362 mov reg, reg, t4, flags=(nCEZF,)
363 mov t1, t1, t3, flags=(nCEZF,)
364
365 # Bit 5
366 srli t3, t1, 16, dataSize=8, flags=(EZF,)
367 ori t4, reg, 16
368 mov reg, reg, t4, flags=(nCEZF,)
369 mov t1, t1, t3, flags=(nCEZF,)
370
371 # Bit 4
372 srli t3, t1, 8, dataSize=8, flags=(EZF,)
373 ori t4, reg, 8
374 mov reg, reg, t4, flags=(nCEZF,)
375 mov t1, t1, t3, flags=(nCEZF,)
376
377 # Bit 3
378 srli t3, t1, 4, dataSize=8, flags=(EZF,)
379 ori t4, reg, 4
380 mov reg, reg, t4, flags=(nCEZF,)
381 mov t1, t1, t3, flags=(nCEZF,)
382
383 # Bit 2
384 srli t3, t1, 2, dataSize=8, flags=(EZF,)
385 ori t4, reg, 2
386 mov reg, reg, t4, flags=(nCEZF,)
387 mov t1, t1, t3, flags=(nCEZF,)
388
389 # Bit 1
390 srli t3, t1, 1, dataSize=8, flags=(EZF,)
391 ori t4, reg, 1
392 mov reg, reg, t4, flags=(nCEZF,)
393 mov t1, t1, t3, flags=(nCEZF,)
394
395end:
396 fault "NoFault"
397};
398'''
188 ld t1, seg, riprel, disp
189
190 # Determine if the input was zero, and also move it to a temp reg.
191 and t1, t1, t1, flags=(ZF,)
192 br label("end"), flags=(CZF,)
193
194 # Zero out the result register
195 movi reg, reg, 0x0
196
197 # Bit 6
198 srli t3, t1, 32, dataSize=8, flags=(EZF,)
199 ori t4, reg, 0x20
200 mov reg, reg, t4, flags=(nCEZF,)
201 mov t1, t1, t3, flags=(nCEZF,)
202
203 # Bit 5
204 srli t3, t1, 16, dataSize=8, flags=(EZF,)
205 ori t4, reg, 0x10
206 mov reg, reg, t4, flags=(nCEZF,)
207 mov t1, t1, t3, flags=(nCEZF,)
208
209 # Bit 4
210 srli t3, t1, 8, dataSize=8, flags=(EZF,)
211 ori t4, reg, 0x8
212 mov reg, reg, t4, flags=(nCEZF,)
213 mov t1, t1, t3, flags=(nCEZF,)
214
215 # Bit 3
216 srli t3, t1, 4, dataSize=8, flags=(EZF,)
217 ori t4, reg, 0x4
218 mov reg, reg, t4, flags=(nCEZF,)
219 mov t1, t1, t3, flags=(nCEZF,)
220
221 # Bit 2
222 srli t3, t1, 2, dataSize=8, flags=(EZF,)
223 ori t4, reg, 0x2
224 mov reg, reg, t4, flags=(nCEZF,)
225 mov t1, t1, t3, flags=(nCEZF,)
226
227 # Bit 1
228 srli t3, t1, 1, dataSize=8, flags=(EZF,)
229 ori t4, reg, 0x1
230 mov reg, reg, t4, flags=(nCEZF,)
231
232end:
233 fault "NoFault"
234};
235
236def macroop BSF_R_R {
237 # Determine if the input was zero, and also move it to a temp reg.
238 mov t1, t1, t0, dataSize=8
239 and t1, regm, regm, flags=(ZF,)
240 br label("end"), flags=(CZF,)
241
242 # Zero out the result register
243 movi reg, reg, 0
244
245 subi t2, t1, 1
246 xor t1, t2, t1
247
248
249 # Bit 6
250 srli t3, t1, 32, dataSize=8, flags=(EZF,)
251 ori t4, reg, 32
252 mov reg, reg, t4, flags=(nCEZF,)
253 mov t1, t1, t3, flags=(nCEZF,)
254
255 # Bit 5
256 srli t3, t1, 16, dataSize=8, flags=(EZF,)
257 ori t4, reg, 16
258 mov reg, reg, t4, flags=(nCEZF,)
259 mov t1, t1, t3, flags=(nCEZF,)
260
261 # Bit 4
262 srli t3, t1, 8, dataSize=8, flags=(EZF,)
263 ori t4, reg, 8
264 mov reg, reg, t4, flags=(nCEZF,)
265 mov t1, t1, t3, flags=(nCEZF,)
266
267 # Bit 3
268 srli t3, t1, 4, dataSize=8, flags=(EZF,)
269 ori t4, reg, 4
270 mov reg, reg, t4, flags=(nCEZF,)
271 mov t1, t1, t3, flags=(nCEZF,)
272
273 # Bit 2
274 srli t3, t1, 2, dataSize=8, flags=(EZF,)
275 ori t4, reg, 2
276 mov reg, reg, t4, flags=(nCEZF,)
277 mov t1, t1, t3, flags=(nCEZF,)
278
279 # Bit 1
280 srli t3, t1, 1, dataSize=8, flags=(EZF,)
281 ori t4, reg, 1
282 mov reg, reg, t4, flags=(nCEZF,)
283
284end:
285 fault "NoFault"
286};
287
288def macroop BSF_R_M {
289
290 mov t1, t1, t0, dataSize=8
291 ld t1, seg, sib, disp
292
293 # Determine if the input was zero, and also move it to a temp reg.
294 and t1, t1, t1, flags=(ZF,)
295 br label("end"), flags=(CZF,)
296
297 # Zero out the result register
298 mov reg, reg, t0
299
300 subi t2, t1, 1
301 xor t1, t2, t1
302
303 # Bit 6
304 srli t3, t1, 32, dataSize=8, flags=(EZF,)
305 ori t4, reg, 32
306 mov reg, reg, t4, flags=(nCEZF,)
307 mov t1, t1, t3, flags=(nCEZF,)
308
309 # Bit 5
310 srli t3, t1, 16, dataSize=8, flags=(EZF,)
311 ori t4, reg, 16
312 mov reg, reg, t4, flags=(nCEZF,)
313 mov t1, t1, t3, flags=(nCEZF,)
314
315 # Bit 4
316 srli t3, t1, 8, dataSize=8, flags=(EZF,)
317 ori t4, reg, 8
318 mov reg, reg, t4, flags=(nCEZF,)
319 mov t1, t1, t3, flags=(nCEZF,)
320
321 # Bit 3
322 srli t3, t1, 4, dataSize=8, flags=(EZF,)
323 ori t4, reg, 4
324 mov reg, reg, t4, flags=(nCEZF,)
325 mov t1, t1, t3, flags=(nCEZF,)
326
327 # Bit 2
328 srli t3, t1, 2, dataSize=8, flags=(EZF,)
329 ori t4, reg, 2
330 mov reg, reg, t4, flags=(nCEZF,)
331 mov t1, t1, t3, flags=(nCEZF,)
332
333 # Bit 1
334 srli t3, t1, 1, dataSize=8, flags=(EZF,)
335 ori t4, reg, 1
336 mov reg, reg, t4, flags=(nCEZF,)
337 mov t1, t1, t3, flags=(nCEZF,)
338
339end:
340 fault "NoFault"
341};
342
343def macroop BSF_R_P {
344
345 rdip t7
346 mov t1, t1, t0, dataSize=8
347 ld t1, seg, riprel, disp
348
349 # Determine if the input was zero, and also move it to a temp reg.
350 and t1, t1, t1, flags=(ZF,)
351 br label("end"), flags=(CZF,)
352
353 # Zero out the result register
354 mov reg, reg, t0
355
356 subi t2, t1, 1
357 xor t1, t2, t1
358
359 # Bit 6
360 srli t3, t1, 32, dataSize=8, flags=(EZF,)
361 ori t4, reg, 32
362 mov reg, reg, t4, flags=(nCEZF,)
363 mov t1, t1, t3, flags=(nCEZF,)
364
365 # Bit 5
366 srli t3, t1, 16, dataSize=8, flags=(EZF,)
367 ori t4, reg, 16
368 mov reg, reg, t4, flags=(nCEZF,)
369 mov t1, t1, t3, flags=(nCEZF,)
370
371 # Bit 4
372 srli t3, t1, 8, dataSize=8, flags=(EZF,)
373 ori t4, reg, 8
374 mov reg, reg, t4, flags=(nCEZF,)
375 mov t1, t1, t3, flags=(nCEZF,)
376
377 # Bit 3
378 srli t3, t1, 4, dataSize=8, flags=(EZF,)
379 ori t4, reg, 4
380 mov reg, reg, t4, flags=(nCEZF,)
381 mov t1, t1, t3, flags=(nCEZF,)
382
383 # Bit 2
384 srli t3, t1, 2, dataSize=8, flags=(EZF,)
385 ori t4, reg, 2
386 mov reg, reg, t4, flags=(nCEZF,)
387 mov t1, t1, t3, flags=(nCEZF,)
388
389 # Bit 1
390 srli t3, t1, 1, dataSize=8, flags=(EZF,)
391 ori t4, reg, 1
392 mov reg, reg, t4, flags=(nCEZF,)
393 mov t1, t1, t3, flags=(nCEZF,)
394
395end:
396 fault "NoFault"
397};
398'''