1 (in-package "SB-ROTATE-BYTE")
5 (define-vop (%
32bit-rotate-byte
/c
)
7 (:translate %unsigned-32-rotate-byte
)
8 (:note
"inline 32-bit constant rotation")
9 (:args
(integer :scs
(sb-vm::unsigned-reg
) :target result
))
11 (:arg-types
(:constant
(integer -
31 31)) sb-vm
::unsigned-num
)
12 (:results
(result :scs
(sb-vm::unsigned-reg
)))
13 (:result-types sb-vm
::unsigned-num
)
15 (aver (not (= count
0)))
16 (inst ror
(sb-vm::32-bit-reg result
) (sb-vm::32-bit-reg integer
)
21 (define-vop (%
32bit-rotate-byte
)
23 (:translate %unsigned-32-rotate-byte
)
24 (:note
"inline 32-bit rotation")
25 (:args
(count :scs
(sb-vm::signed-reg
))
26 (integer :scs
(sb-vm::unsigned-reg
)))
27 (:arg-types sb-vm
::tagged-num sb-vm
::unsigned-num
)
28 (:temporary
(:sc sb-vm
::signed-reg
) temp
)
29 (:results
(res :scs
(sb-vm::unsigned-reg
)))
30 (:result-types sb-vm
::unsigned-num
)
34 (inst csel temp sb-vm
::zr-tn temp
:le
)
35 (inst sub temp temp count
)
36 (inst ror
(sb-vm::32-bit-reg res
)
37 (sb-vm::32-bit-reg integer
) (sb-vm::32-bit-reg temp
))))
40 (define-vop (%
64bit-rotate-byte
/c
)
42 (:translate %unsigned-64-rotate-byte
)
43 (:note
"inline 64-bit constant rotation")
44 (:args
(integer :scs
(sb-vm::unsigned-reg
) :target result
))
46 (:arg-types
(:constant
(integer -
63 63)) sb-vm
::unsigned-num
)
47 (:results
(result :scs
(sb-vm::unsigned-reg
)))
48 (:result-types sb-vm
::unsigned-num
)
50 (aver (not (= count
0)))
51 (inst ror result integer
(if (plusp count
)
55 (define-vop (%
64bit-rotate-byte
)
57 (:translate %unsigned-64-rotate-byte
)
58 (:note
"inline 64-bit rotation")
59 (:args
(count :scs
(sb-vm::signed-reg
))
60 (integer :scs
(sb-vm::unsigned-reg
)))
61 (:arg-types sb-vm
::tagged-num sb-vm
::unsigned-num
)
62 (:temporary
(:sc sb-vm
::signed-reg
) temp
)
63 (:results
(res :scs
(sb-vm::unsigned-reg
)))
64 (:result-types sb-vm
::unsigned-num
)
68 (inst csel temp sb-vm
::zr-tn temp
:le
)
69 (inst sub temp temp count
)
70 (inst ror res integer temp
)))