1 <!-- This defines instructions described in PowerISA Version 3.0 B Book 1 -->
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 -->
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. -->
11 <!-- Section 3.3.14.1 Fixed-Point Rotate Instructions pages 101 - 106 -->
13 # Rotate Left Word Immediate then AND with Mask
17 * rlwinm RA,RS,SH,MB,ME (Rc=0)
18 * rlwinm. RA,RS,SH,MB,ME (Rc=1)
23 r <- ROTL32((RS)[XLEN/2:XLEN-1], n)
27 Special Registers Altered:
31 # Rotate Left Word then AND with Mask
35 * rlwnm RA,RS,RB,MB,ME (Rc=0)
36 * rlwnm. RA,RS,RB,MB,ME (Rc=1)
40 n <- (RB)[XLEN-5:XLEN-1]
41 r <- ROTL32((RS)[XLEN-32:XLEN-1], n)
45 Special Registers Altered:
49 # Rotate Left Word Immediate then Mask Insert
53 * rlwimi RA,RS,SH,MB,ME (Rc=0)
54 * rlwimi. RA,RS,SH,MB,ME (Rc=1)
59 r <- ROTL32((RS)[XLEN/2:XLEN-1], n)
63 Special Registers Altered:
67 # Rotate Left Doubleword Immediate then Clear Left
71 * rldicl RA,RS,sh,mb (Rc=0)
72 * rldicl. RA,RS,sh,mb (Rc=1)
79 m <- MASK(b, (XLEN-1))
82 Special Registers Altered:
86 # Rotate Left Doubleword Immediate then Clear Right
90 * rldicr RA,RS,sh,me (Rc=0)
91 * rldicr. RA,RS,sh,me (Rc=1)
101 Special Registers Altered:
105 # Rotate Left Doubleword Immediate then Clear
109 * rldic RA,RS,sh,mb (Rc=0)
110 * rldic. RA,RS,sh,mb (Rc=1)
116 b <- mb[5] || mb[0:4]
120 Special Registers Altered:
124 # Rotate Left Doubleword then Clear Left
128 * rldcl RA,RS,RB,mb (Rc=0)
129 * rldcl. RA,RS,RB,mb (Rc=1)
133 n <- (RB)[XLEN-5:XLEN-1]
135 b <- mb[5] || mb[0:4]
136 m <- MASK(b, (XLEN-1))
139 Special Registers Altered:
143 # Rotate Left Doubleword then Clear Right
147 * rldcr RA,RS,RB,me (Rc=0)
148 * rldcr. RA,RS,RB,me (Rc=1)
152 n <- (RB)[XLEN-5:XLEN-1]
154 e <- me[5] || me[0:4]
158 Special Registers Altered:
162 # Rotate Left Doubleword Immediate then Mask Insert
166 * rldimi RA,RS,sh,mb (Rc=0)
167 * rldimi. RA,RS,sh,mb (Rc=1)
173 b <- mb[5] || mb[0:4]
177 Special Registers Altered:
182 <!-- Section 3.3.14.2 Fixed-Point Shift Instructions pages 107 - 110 -->
188 * slw RA,RS,RB (Rc=0)
189 * slw. RA,RS,RB (Rc=1)
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))
200 Special Registers Altered:
208 * srw RA,RS,RB (Rc=0)
209 * srw. RA,RS,RB (Rc=1)
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))
220 Special Registers Altered:
224 # Shift Right Algebraic Word Immediate
228 * srawi RA,RS,SH (Rc=0)
229 * srawi. RA,RS,SH (Rc=1)
234 r <- ROTL32((RS)[XLEN/2:XLEN-1], 64-n)
235 m <- MASK32(n, ((XLEN/2)-1))
237 RA <- r&m | ([s]*XLEN)& ¬m
238 carry <- s & ((r&¬m)[XLEN/2:XLEN-1] != 0)
242 Special Registers Altered:
247 # Shift Right Algebraic Word
251 * sraw RA,RS,RB (Rc=0)
252 * sraw. RA,RS,RB (Rc=1)
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))
262 RA <- r&m | ([s]*XLEN)& ¬m
263 carry <- s & ((r&¬m)[XLEN/2:XLEN-1] != 0)
267 Special Registers Altered:
272 # Shift Left Doubleword
276 * sld RA,RS,RB (Rc=0)
277 * sld. RA,RS,RB (Rc=1)
281 n <- (RB)[XLEN-6:XLEN-1]
283 if (RB)[XLEN-7] = 0 then
284 m <- MASK(0, XLEN-1-n)
288 Special Registers Altered:
292 # Shift Right Doubleword
296 * srd RA,RS,RB (Rc=0)
297 * srd. RA,RS,RB (Rc=1)
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))
308 Special Registers Altered:
312 # Shift Right Algebraic Doubleword Immediate
316 * sradi RA,RS,sh (Rc=0)
317 * sradi. RA,RS,sh (Rc=1)
322 r <- ROTL64((RS), XLEN-n)
323 m <- MASK(n, (XLEN-1))
325 RA <- r&m | ([s]*XLEN)& ¬m
326 carry <- s & ((r& ¬m) != 0)
330 Special Registers Altered:
335 # Shift Right Algebraic Doubleword
339 * srad RA,RS,RB (Rc=0)
340 * srad. RA,RS,RB (Rc=1)
344 n <- (RB)[XLEN-6:XLEN-1]
345 r <- ROTL64((RS), XLEN-n)
346 if (RB)[XLEN-7] = 0 then
347 m <- MASK(n, (XLEN-1))
350 RA <- r&m | ([s]*XLEN)& ¬m
351 carry <- s & ((r&¬m) != 0)
355 Special Registers Altered:
360 # Extend-Sign Word and Shift Left Immediate
364 * extswsli RA,RS,sh (Rc=0)
365 * extswsli. RA,RS,sh (Rc=1)
370 r <- ROTL64(EXTS64(RS[XLEN/2:XLEN-1]), n)
371 m <- MASK(0, XLEN-1-n)
374 Special Registers Altered:
378 <!-- Checked March 2021 -->