1 # Copyright (c) 2007-2008 The Hewlett-Packard Development Company
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.
13 # Copyright (c) 2008 The Regents of The University of Michigan
14 # All rights reserved.
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.
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.
41 # Determine if the input was zero, and also move it to a temp reg.
42 mov t1, t1, t0, dataSize=8
43 and t1, regm, regm, flags=(ZF,)
44 br label("end"), flags=(CZF,)
46 # Zero out the result register
50 srli t3, t1, 32, dataSize=8, flags=(EZF,)
52 mov reg, reg, t4, flags=(nCEZF,)
53 mov t1, t1, t3, flags=(nCEZF,)
56 srli t3, t1, 16, dataSize=8, flags=(EZF,)
58 mov reg, reg, t4, flags=(nCEZF,)
59 mov t1, t1, t3, flags=(nCEZF,)
62 srli t3, t1, 8, dataSize=8, flags=(EZF,)
64 mov reg, reg, t4, flags=(nCEZF,)
65 mov t1, t1, t3, flags=(nCEZF,)
68 srli t3, t1, 4, dataSize=8, flags=(EZF,)
70 mov reg, reg, t4, flags=(nCEZF,)
71 mov t1, t1, t3, flags=(nCEZF,)
74 srli t3, t1, 2, dataSize=8, flags=(EZF,)
76 mov reg, reg, t4, flags=(nCEZF,)
77 mov t1, t1, t3, flags=(nCEZF,)
80 srli t3, t1, 1, dataSize=8, flags=(EZF,)
82 mov reg, reg, t4, flags=(nCEZF,)
90 mov t1, t1, t0, dataSize=8
93 # Determine if the input was zero, and also move it to a temp reg.
94 and t1, t1, t1, flags=(ZF,)
95 br label("end"), flags=(CZF,)
97 # Zero out the result register
101 srli t3, t1, 32, dataSize=8, flags=(EZF,)
103 mov reg, reg, t4, flags=(nCEZF,)
104 mov t1, t1, t3, flags=(nCEZF,)
107 srli t3, t1, 16, dataSize=8, flags=(EZF,)
109 mov reg, reg, t4, flags=(nCEZF,)
110 mov t1, t1, t3, flags=(nCEZF,)
113 srli t3, t1, 8, dataSize=8, flags=(EZF,)
115 mov reg, reg, t4, flags=(nCEZF,)
116 mov t1, t1, t3, flags=(nCEZF,)
119 srli t3, t1, 4, dataSize=8, flags=(EZF,)
121 mov reg, reg, t4, flags=(nCEZF,)
122 mov t1, t1, t3, flags=(nCEZF,)
125 srli t3, t1, 2, dataSize=8, flags=(EZF,)
127 mov reg, reg, t4, flags=(nCEZF,)
128 mov t1, t1, t3, flags=(nCEZF,)
131 srli t3, t1, 1, dataSize=8, flags=(EZF,)
133 mov reg, reg, t4, flags=(nCEZF,)
139 def macroop BSR_R_P {
142 mov t1, t1, t0, dataSize=8
143 ld t1, seg, riprel, disp
145 # Determine if the input was zero, and also move it to a temp reg.
146 and t1, t1, t1, flags=(ZF,)
147 br label("end"), flags=(CZF,)
149 # Zero out the result register
153 srli t3, t1, 32, dataSize=8, flags=(EZF,)
155 mov reg, reg, t4, flags=(nCEZF,)
156 mov t1, t1, t3, flags=(nCEZF,)
159 srli t3, t1, 16, dataSize=8, flags=(EZF,)
161 mov reg, reg, t4, flags=(nCEZF,)
162 mov t1, t1, t3, flags=(nCEZF,)
165 srli t3, t1, 8, dataSize=8, flags=(EZF,)
167 mov reg, reg, t4, flags=(nCEZF,)
168 mov t1, t1, t3, flags=(nCEZF,)
171 srli t3, t1, 4, dataSize=8, flags=(EZF,)
173 mov reg, reg, t4, flags=(nCEZF,)
174 mov t1, t1, t3, flags=(nCEZF,)
177 srli t3, t1, 2, dataSize=8, flags=(EZF,)
179 mov reg, reg, t4, flags=(nCEZF,)
180 mov t1, t1, t3, flags=(nCEZF,)
183 srli t3, t1, 1, dataSize=8, flags=(EZF,)
185 mov reg, reg, t4, flags=(nCEZF,)
191 def macroop BSF_R_R {
192 # Determine if the input was zero, and also move it to a temp reg.
193 mov t1, t1, t0, dataSize=8
194 and t1, regm, regm, flags=(ZF,)
195 br label("end"), flags=(CZF,)
197 # Zero out the result register
205 srli t3, t1, 32, dataSize=8, flags=(EZF,)
207 mov reg, reg, t4, flags=(nCEZF,)
208 mov t1, t1, t3, flags=(nCEZF,)
211 srli t3, t1, 16, dataSize=8, flags=(EZF,)
213 mov reg, reg, t4, flags=(nCEZF,)
214 mov t1, t1, t3, flags=(nCEZF,)
217 srli t3, t1, 8, dataSize=8, flags=(EZF,)
219 mov reg, reg, t4, flags=(nCEZF,)
220 mov t1, t1, t3, flags=(nCEZF,)
223 srli t3, t1, 4, dataSize=8, flags=(EZF,)
225 mov reg, reg, t4, flags=(nCEZF,)
226 mov t1, t1, t3, flags=(nCEZF,)
229 srli t3, t1, 2, dataSize=8, flags=(EZF,)
231 mov reg, reg, t4, flags=(nCEZF,)
232 mov t1, t1, t3, flags=(nCEZF,)
235 srli t3, t1, 1, dataSize=8, flags=(EZF,)
237 mov reg, reg, t4, flags=(nCEZF,)
243 def macroop BSF_R_M {
245 mov t1, t1, t0, dataSize=8
246 ld t1, seg, sib, disp
248 # Determine if the input was zero, and also move it to a temp reg.
249 and t1, t1, t1, flags=(ZF,)
250 br label("end"), flags=(CZF,)
252 # Zero out the result register
259 srli t3, t1, 32, dataSize=8, flags=(EZF,)
261 mov reg, reg, t4, flags=(nCEZF,)
262 mov t1, t1, t3, flags=(nCEZF,)
265 srli t3, t1, 16, dataSize=8, flags=(EZF,)
267 mov reg, reg, t4, flags=(nCEZF,)
268 mov t1, t1, t3, flags=(nCEZF,)
271 srli t3, t1, 8, dataSize=8, flags=(EZF,)
273 mov reg, reg, t4, flags=(nCEZF,)
274 mov t1, t1, t3, flags=(nCEZF,)
277 srli t3, t1, 4, dataSize=8, flags=(EZF,)
279 mov reg, reg, t4, flags=(nCEZF,)
280 mov t1, t1, t3, flags=(nCEZF,)
283 srli t3, t1, 2, dataSize=8, flags=(EZF,)
285 mov reg, reg, t4, flags=(nCEZF,)
286 mov t1, t1, t3, flags=(nCEZF,)
289 srli t3, t1, 1, dataSize=8, flags=(EZF,)
291 mov reg, reg, t4, flags=(nCEZF,)
292 mov t1, t1, t3, flags=(nCEZF,)
298 def macroop BSF_R_P {
301 mov t1, t1, t0, dataSize=8
302 ld t1, seg, riprel, disp
304 # Determine if the input was zero, and also move it to a temp reg.
305 and t1, t1, t1, flags=(ZF,)
306 br label("end"), flags=(CZF,)
308 # Zero out the result register
315 srli t3, t1, 32, dataSize=8, flags=(EZF,)
317 mov reg, reg, t4, flags=(nCEZF,)
318 mov t1, t1, t3, flags=(nCEZF,)
321 srli t3, t1, 16, dataSize=8, flags=(EZF,)
323 mov reg, reg, t4, flags=(nCEZF,)
324 mov t1, t1, t3, flags=(nCEZF,)
327 srli t3, t1, 8, dataSize=8, flags=(EZF,)
329 mov reg, reg, t4, flags=(nCEZF,)
330 mov t1, t1, t3, flags=(nCEZF,)
333 srli t3, t1, 4, dataSize=8, flags=(EZF,)
335 mov reg, reg, t4, flags=(nCEZF,)
336 mov t1, t1, t3, flags=(nCEZF,)
339 srli t3, t1, 2, dataSize=8, flags=(EZF,)
341 mov reg, reg, t4, flags=(nCEZF,)
342 mov t1, t1, t3, flags=(nCEZF,)
345 srli t3, t1, 1, dataSize=8, flags=(EZF,)
347 mov reg, reg, t4, flags=(nCEZF,)
348 mov t1, t1, t3, flags=(nCEZF,)
354 def macroop POPCNT_R_R {
355 popcnt reg, regm, reg, dataSize=8
358 def macroop POPCNT_R_M {
359 ld t1, seg, sib, disp
360 popcnt reg, t1, reg, dataSize=8
363 def macroop POPCNT_R_P {
365 ld t1, seg, riprel, disp
366 popcnt reg, t1, reg, dataSize=8