Add tags

Add tags to the following comment

Mac OS X (PowerPC 32bit) アセンブリで。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
        .machine ppc
        .globl _reverse_bits

;; void reverse_bits(unsigned int *result, unsigned int n);

MASK1 = 0xaaaaaaaa
MASK2 = 0x55555555
MASK3 = 0xcccccccc
MASK4 = 0x33333333
MASK5 = 0xf0f0f0f0
MASK6 = 0x0f0f0f0f
MASK7 = 0xff00ff00
MASK8 = 0x00ff00ff

;; r3: ビットを逆転した数値を入れる配列
;; r4: 32以下の正の整数 n
;; r5: n の二乗
;; r6: カウント
;; r7: ビットを逆転させる数
;; r8-10: ビット演算の作業用
;; r11-: ビットマスク
_reverse_bits:
        mullw   r5, r4, r4      ; n2 = n * n;
        li      r6, 0           ; i = 0;
        lis     r11, hi16(MASK1)
        addi    r11, r11, lo16(MASK1)
        lis     r12, hi16(MASK2)
        addi    r12, r12, lo16(MASK2)
        lis     r13, hi16(MASK3)
        addi    r13, r13, lo16(MASK3)
        lis     r14, hi16(MASK4)
        addi    r14, r14, lo16(MASK4)
        lis     r15, hi16(MASK5)
        addi    r15, r15, lo16(MASK5)
        lis     r16, hi16(MASK6)
        addi    r16, r16, lo16(MASK6)
        lis     r17, hi16(MASK7)
        addi    r17, r17, lo16(MASK7)
        lis     r18, hi16(MASK8)
        addi    r18, r18, lo16(MASK8)

        
loop:
        mr      r7, r6          ; x = i;

        ;; x = (x & 0xaaaaaaaa) >> 1 | (x & 0x55555555) << 1;
        and     r8, r7, r11
        srwi    r8, r8, 1
        and     r9, r7, r12
        slwi    r9, r9, 1
        or      r10, r8, r9

        ;; x = (x & 0xcccccccc) >> 2 | (x & 0x33333333) << 2;
        and     r8, r10, r13
        srwi    r8, r8, 2
        and     r9, r10, r14
        slwi    r9, r9, 2
        or      r10, r8, r9

        ;; x = (x & 0xf0f0f0f0) >> 4 | (x & 0x0f0f0f0f) << 4;
        and     r8, r10, r15
        srwi    r8, r8, 4
        and     r9, r10, r16
        slwi    r9, r9, 4
        or      r10, r8, r9

        ;; x = (x & 0xff00ff00) >> 8 | (x & 0x00ff00ff) << 8;
        and     r8, r10, r17
        srwi    r8, r8, 8
        and     r9, r10, r18
        slwi    r9, r9, 8
        or      r10, r8, r9

        ;; x = x >> 16 | x << 16;
        srwi    r8, r10, 16
        slwi    r9, r10, 16
        or      r10, r8, r9

        ;; x = x >> (32 - n)
        li      r8, 32
        sub     r9, r8, r4
        srw     r10, r10, r9
        
        ;; 結果を代入
        stw     r10, 0(r3)      ; *result = x;
        addi    r3, r3, 4       ; result++;
        
        ;; 繰り返し
        addi    r6, r6, 1       ; i++;
        cmpl    cr7, r5, r6     ; n2 > i
        bgt     cr7, loop

        ;; 終了
        li      r3, 0           ; return 0;
        blr

Add tags

The input will be splited to tags with space.

Index

Feed

Other

Link

Pathtraq

loading...