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