96d781b1192504ba180af13efed6e388edb971f3
[openpower-isa.git] / openpower / isa / fixedshift.mdwn
1 <!-- This defines instructions described in PowerISA Version 3.0 B Book 1 -->
2
3 <!-- Section 3.3.14 Fixed-Point Rotate and Shift Instructions pages 101 - 110 -->
4 <!-- Section 3.3.14.1 Fixed-Point Rotate Instructions pages 101 - 106 -->
5 <!-- Section 3.3.14.2 Fixed-Point Shift Instructions pages 107 - 110 -->
6
7 <!-- The Fixed-Point Facility performs rotation operations on data from a GPR and -->
8 <!-- returns the result, or a portion of the result, to a GPR. -->
9
10
11 <!-- Section 3.3.14.1 Fixed-Point Rotate Instructions pages 101 - 106 -->
12
13 # Rotate Left Word Immediate then AND with Mask
14
15 M-Form
16
17 * rlwinm RA,RS,SH,MB,ME (Rc=0)
18 * rlwinm. RA,RS,SH,MB,ME (Rc=1)
19
20 Pseudo-code:
21
22 n <- SH
23 r <- ROTL32((RS)[XLEN/2:XLEN-1], n)
24 m <- MASK32(MB, ME)
25 RA <- r & m
26
27 Special Registers Altered:
28
29 CR0 (if Rc=1)
30
31 # Rotate Left Word then AND with Mask
32
33 M-Form
34
35 * rlwnm RA,RS,RB,MB,ME (Rc=0)
36 * rlwnm. RA,RS,RB,MB,ME (Rc=1)
37
38 Pseudo-code:
39
40 n <- (RB)[XLEN-5:XLEN-1]
41 r <- ROTL32((RS)[32:63], n)
42 m <- MASK32(MB, ME)
43 RA <- r & m
44
45 Special Registers Altered:
46
47 CR0 (if Rc=1)
48
49 # Rotate Left Word Immediate then Mask Insert
50
51 M-Form
52
53 * rlwimi RA,RS,SH,MB,ME (Rc=0)
54 * rlwimi. RA,RS,SH,MB,ME (Rc=1)
55
56 Pseudo-code:
57
58 n <- SH
59 r <- ROTL32((RS)[XLEN/2:XLEN-1], n)
60 m <- MASK32(MB, ME)
61 RA <- r&m | (RA) & ¬m
62
63 Special Registers Altered:
64
65 CR0 (if Rc=1)
66
67 # Rotate Left Doubleword Immediate then Clear Left
68
69 MD-Form
70
71 * rldicl RA,RS,SH,MB (Rc=0)
72 * rldicl. RA,RS,SH,MB (Rc=1)
73
74 Pseudo-code:
75
76 n <- sh
77 r <- ROTL64((RS), n)
78 b <- mb[5] || mb[0:4]
79 m <- MASK(b, (XLEN-1))
80 RA <- r & m
81
82 Special Registers Altered:
83
84 CR0 (if Rc=1)
85
86 # Rotate Left Doubleword Immediate then Clear Right
87
88 MD-Form
89
90 * rldicr RA,RS,SH,ME (Rc=0)
91 * rldicr. RA,RS,SH,ME (Rc=1)
92
93 Pseudo-code:
94
95 n <- sh
96 r <- ROTL64((RS), n)
97 e <- me[5] || me[0:4]
98 m <- MASK(0, e)
99 RA <- r & m
100
101 Special Registers Altered:
102
103 CR0 (if Rc=1)
104
105 # Rotate Left Doubleword Immediate then Clear
106
107 MD-Form
108
109 * rldic RA,RS,SH,MB (Rc=0)
110 * rldic. RA,RS,SH,MB (Rc=1)
111
112 Pseudo-code:
113
114 n <- sh
115 r <- ROTL64((RS), n)
116 b <- mb[5] || mb[0:4]
117 m <- MASK(b, ¬n)
118 RA <- r & m
119
120 Special Registers Altered:
121
122 CR0 (if Rc=1)
123
124 # Rotate Left Doubleword then Clear Left
125
126 MDS-Form
127
128 * rldcl RA,RS,RB,MB (Rc=0)
129 * rldcl. RA,RS,RB,MB (Rc=1)
130
131 Pseudo-code:
132
133 n <- (RB)[XLEN-5:XLEN-1]
134 r <- ROTL64((RS), n)
135 b <- mb[5] || mb[0:4]
136 m <- MASK(b, (XLEN-1))
137 RA <- r & m
138
139 Special Registers Altered:
140
141 CR0 (if Rc=1)
142
143 # Rotate Left Doubleword then Clear Right
144
145 MDS-Form
146
147 * rldcr RA,RS,RB,ME (Rc=0)
148 * rldcr. RA,RS,RB,ME (Rc=1)
149
150 Pseudo-code:
151
152 n <- (RB)[XLEN-5:XLEN-1]
153 r <- ROTL64((RS), n)
154 e <- me[5] || me[0:4]
155 m <- MASK(0, e)
156 RA <- r & m
157
158 Special Registers Altered:
159
160 CR0 (if Rc=1)
161
162 # Rotate Left Doubleword Immediate then Mask Insert
163
164 MD-Form
165
166 * rldimi RA,RS,SH,MB (Rc=0)
167 * rldimi. RA,RS,SH,MB (Rc=1)
168
169 Pseudo-code:
170
171 n <- sh
172 r <- ROTL64((RS), n)
173 b <- mb[5] || mb[0:4]
174 m <- MASK(b, ¬n)
175 RA <- r&m | (RA)& ¬m
176
177 Special Registers Altered:
178
179 CR0 (if Rc=1)
180
181
182 <!-- Section 3.3.14.2 Fixed-Point Shift Instructions pages 107 - 110 -->
183
184 # Shift Left Word
185
186 X-Form
187
188 * slw RA,RS,RB (Rc=0)
189 * slw. RA,RS,RB (Rc=1)
190
191 Pseudo-code:
192
193 n <- (RB)[XLEN-5:XLEN-1]
194 r <- ROTL32((RS)[XLEN/2:XLEN-1], n)
195 if (RB)[XLEN-6] = 0 then
196 m <- MASK32(0, ((XLEN/2)-1-n))
197 else m <- [0]*XLEN
198 RA <- r & m
199
200 Special Registers Altered:
201
202 CR0 (if Rc=1)
203
204 # Shift Right Word
205
206 X-Form
207
208 * srw RA,RS,RB (Rc=0)
209 * srw. RA,RS,RB (Rc=1)
210
211 Pseudo-code:
212
213 n <- (RB)[XLEN-5:XLEN-1]
214 r <- ROTL32((RS)[XLEN/2:XLEN-1], XLEN-n)
215 if (RB)[XLEN-6] = 0 then
216 m <- MASK32(n, ((XLEN/2)-1))
217 else m <- [0]*XLEN
218 RA <- r & m
219
220 Special Registers Altered:
221
222 CR0 (if Rc=1)
223
224 # Shift Right Algebraic Word Immediate
225
226 X-Form
227
228 * srawi RA,RS,SH (Rc=0)
229 * srawi. RA,RS,SH (Rc=1)
230
231 Pseudo-code:
232
233 n <- SH
234 r <- ROTL32((RS)[XLEN/2:XLEN-1], 64-n)
235 m <- MASK32(n, ((XLEN/2)-1))
236 s <- (RS)[XLEN/2]
237 RA <- r&m | ([s]*XLEN)& ¬m
238 carry <- s & ((r&¬m)[XLEN/2:XLEN-1] != 0)
239 CA <- carry
240 CA32 <- carry
241
242 Special Registers Altered:
243
244 CA CA32
245 CR0 (if Rc=1)
246
247 # Shift Right Algebraic Word
248
249 X-Form
250
251 * sraw RA,RS,RB (Rc=0)
252 * sraw. RA,RS,RB (Rc=1)
253
254 Pseudo-code:
255
256 n <- (RB)[XLEN-5:XLEN-1]
257 r <- ROTL32((RS)[XLEN/2:XLEN-1], XLEN-n)
258 if (RB)[XLEN-6] = 0 then
259 m <- MASK32(n, ((XLEN/2)-1))
260 else m <- [0]*XLEN
261 s <- (RS)[XLEN/2]
262 RA <- r&m | ([s]*XLEN)& ¬m
263 carry <- s & ((r&¬m)[XLEN/2:XLEN-1] != 0)
264 CA <- carry
265 CA32 <- carry
266
267 Special Registers Altered:
268
269 CA CA32
270 CR0 (if Rc=1)
271
272 # Shift Left Doubleword
273
274 X-Form
275
276 * sld RA,RS,RB (Rc=0)
277 * sld. RA,RS,RB (Rc=1)
278
279 Pseudo-code:
280
281 n <- (RB)[XLEN-6:XLEN-1]
282 r <- ROTL64((RS), n)
283 if (RB)[XLEN-7] = 0 then
284 m <- MASK(0, XLEN-1-n)
285 else m <- [0]*XLEN
286 RA <- r & m
287
288 Special Registers Altered:
289
290 CR0 (if Rc=1)
291
292 # Shift Right Doubleword
293
294 X-Form
295
296 * srd RA,RS,RB (Rc=0)
297 * srd. RA,RS,RB (Rc=1)
298
299 Pseudo-code:
300
301 n <- (RB)[XLEN-6:XLEN-1]
302 r <- ROTL64((RS), XLEN-n)
303 if (RB)[XLEN-7] = 0 then
304 m <- MASK(n, (XLEN-1))
305 else m <- [0]*XLEN
306 RA <- r & m
307
308 Special Registers Altered:
309
310 CR0 (if Rc=1)
311
312 # Shift Right Algebraic Doubleword Immediate
313
314 XS-Form
315
316 * sradi RA,RS,SH (Rc=0)
317 * sradi. RA,RS,SH (Rc=1)
318
319 Pseudo-code:
320
321 n <- sh
322 r <- ROTL64((RS), XLEN-n)
323 m <- MASK(n, (XLEN-1))
324 s <- (RS)[0]
325 RA <- r&m | ([s]*XLEN)& ¬m
326 carry <- s & ((r& ¬m) != 0)
327 CA <- carry
328 CA32 <- carry
329
330 Special Registers Altered:
331
332 CA CA32
333 CR0 (if Rc=1)
334
335 # Shift Right Algebraic Doubleword
336
337 X-Form
338
339 * srad RA,RS,RB (Rc=0)
340 * srad. RA,RS,RB (Rc=1)
341
342 Pseudo-code:
343
344 n <- (RB)[58:63]
345 r <- ROTL64((RS), 64-n)
346 if (RB)[57] = 0 then
347 m <- MASK(n, 63)
348 else m <- [0]*64
349 s <- (RS)[0]
350 RA <- r&m | ([s]*64)& ¬m
351 carry <- s & ((r&¬m) != 0)
352 CA <- carry
353 CA32 <- carry
354
355 Special Registers Altered:
356
357 CA CA32
358 CR0 (if Rc=1)
359
360 # Extend-Sign Word and Shift Left Immediate
361
362 XS-Form
363
364 * extswsli RA,RS,SH (Rc=0)
365 * extswsli. RA,RS,SH (Rc=1)
366
367 Pseudo-code:
368
369 n <- sh
370 r <- ROTL64(EXTS64(RS[XLEN/2:XLEN-1]), n)
371 m <- MASK(0, XLEN-1-n)
372 RA <- r & m
373
374 Special Registers Altered:
375
376 CR0 (if Rc=1)
377
378 <!-- Checked March 2021 -->