A few random genesis cleanups
[sbcl.git] / contrib / sb-rotate-byte / arm64-vm.lisp
blobd8f3187010e20ce4f8ccbc92926946423d98ffdc
1 (in-package "SB-ROTATE-BYTE")
3 ;;; 32-bit
5 (define-vop (%32bit-rotate-byte/c)
6 (:policy :fast-safe)
7 (:translate %unsigned-32-rotate-byte)
8 (:note "inline 32-bit constant rotation")
9 (:args (integer :scs (sb-vm::unsigned-reg) :target result))
10 (:info count)
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)
14 (:generator 5
15 (aver (not (= count 0)))
16 (inst ror (sb-vm::32-bit-reg result) (sb-vm::32-bit-reg integer)
17 (if (plusp count)
18 (- 32 count)
19 (abs count)))))
21 (define-vop (%32bit-rotate-byte)
22 (:policy :fast-safe)
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)
31 (:generator 10
32 (inst mov temp 32)
33 (inst cmp count 0)
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))))
39 ;;; 64-bit
40 (define-vop (%64bit-rotate-byte/c)
41 (:policy :fast-safe)
42 (:translate %unsigned-64-rotate-byte)
43 (:note "inline 64-bit constant rotation")
44 (:args (integer :scs (sb-vm::unsigned-reg) :target result))
45 (:info count)
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)
49 (:generator 5
50 (aver (not (= count 0)))
51 (inst ror result integer (if (plusp count)
52 (- 64 count)
53 (abs count)))))
55 (define-vop (%64bit-rotate-byte)
56 (:policy :fast-safe)
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)
65 (:generator 10
66 (inst mov temp 64)
67 (inst cmp count 0)
68 (inst csel temp sb-vm::zr-tn temp :le)
69 (inst sub temp temp count)
70 (inst ror res integer temp)))