szktty #5284(2008/01/12 16:14 GMT) [ Other ] Rating0/0=0.00
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
Rating0/0=0.00-0+
[ reply ]
szktty
#5284()
[
Other
]
Rating0/0=0.00
Mac OS X (PowerPC 32bit) アセンブリで。
.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; blrRating0/0=0.00-0+
[ reply ]