次の命令があるとします。数値が正かどうか (負またはゼロ) をチェックし、正の場合はカウンターに 1 を追加します (数値が負かゼロかは気にしません)。これは、単純なループ展開で行うことができます。
Loop:
mrmovq (%rdi), %r10 # read val[0] from src
andq %r10, %r10 # val[0] <= 0?
jle Npos1 # if so, goto Npos:
iaddq $1, %rax # count++
Npos1:
mrmovq 8(%rdi), %r11 # read val[1] from src+8
andq %r11,%r11 # val <= 0?
jle Npos2 # if so, goto next npos:
iaddq $1, %rax
Npos2:
mrmovq 16(%rdi), %r11 # read val[2] from src+8
andq %r11,%r11 # val <= 0?
jle Npos3 # if so, goto next npos:
iaddq $1, %rax
私の質問は、ゼロまたは負であることも確認したい場合、どうすれば同じ効率的な構造を得ることができるかということです。この場合、私は 3 つのカウンターを持ちます (1 つは pos 用、もう 1 つは neg 用、もう 1 つは 0 用)。前の例と同じ構造を作ろうとしています (正の数を に%rax
、負の数を に%rbx
、ゼロをに格納しています%rcx
):
Loop: mrmovq (%rdi), %r10 # read val from src...
andq %r10, %r10 # val <= 0?
jle Npos # if so, goto Npos:
irmovq $1, %r11
addq %r11, %rax # Count positives in rax - count_pos++
jmp Rest
Npos: andq %r10, %r10 # Not positive
je Zero
irmovq $1, %r11
addq %r11, %rbx # Count negatives in rbx - count_neg++
jmp Rest
Zero: irmovq $1, %r11
addq %r11, %rcx # Count zeroes in rcx - count_zero++
Rest: irmovq $1, %r10
subq %r10, %rdx # len--
irmovq $8, %r10
addq %r10, %rdi # src++
addq %r10, %rsi # dst++
andq %rdx,%rdx # len > 0?
jg Loop # if so, goto Loop: