jz L(finz)
cmpq $1, %rdx
jle L(finr1b)
- subq %rdi, %rsi
+ subq %rdi, %rsi
movq %rdx, %r10
cmpq $32, %r10
jge L(gt32)
movzbl (%rdi), %eax
movzbl (%rdi, %rsi), %edx
subq $1, %r10
- je L(finz1)
+ je L(finz1)
addq $1, %rdi
subl %edx, %eax
jnz L(exit)
movzwl (%rdi), %eax
movzwl (%rdi, %rsi), %edx
subq $2, %r10
- je L(fin2_7)
+ je L(fin2_7)
addq $2, %rdi
cmpl %edx, %eax
jnz L(fin2_7)
movl (%rdi), %eax
movl (%rdi, %rsi), %edx
subq $4, %r10
- je L(fin2_7)
+ je L(fin2_7)
addq $4, %rdi
cmpl %edx, %eax
jnz L(fin2_7)
movq (%rdi), %rax
movq (%rdi, %rsi), %rdx
subq $8, %r10
- je L(fin2_7)
+ je L(fin2_7)
addq $8, %rdi
cmpq %rdx, %rax
jnz L(fin2_7)
movdqu (%rdi, %rsi), %xmm0
pcmpeqb %xmm0, %xmm1
pmovmskb %xmm1, %edx
- xorl %eax, %eax
+ xorl %eax, %eax
subl $0xffff, %edx
jz L(finz)
- bsfl %edx, %ecx
- leaq (%rdi, %rcx), %rcx
+ bsfl %edx, %ecx
+ leaq (%rdi, %rcx), %rcx
movzbl (%rcx), %eax
movzbl (%rsi, %rcx), %edx
jmp L(finz1)
.p2align 4,, 4
L(finr1b):
movzbl (%rdi), %eax
- movzbl (%rsi), %edx
+ movzbl (%rsi), %edx
L(finz1):
subl %edx, %eax
L(exit):
L(fin2_7):
cmpq %rdx, %rax
jz L(finz)
- movq %rax, %r11
- subq %rdx, %r11
+ movq %rax, %r11
+ subq %rdx, %r11
bsfq %r11, %rcx
- sarq $3, %rcx
+ sarq $3, %rcx
salq $3, %rcx
- sarq %cl, %rax
+ sarq %cl, %rax
movzbl %al, %eax
- sarq %cl, %rdx
+ sarq %cl, %rdx
movzbl %dl, %edx
subl %edx, %eax
- ret
+ ret
.p2align 4,, 4
L(finz):
xorl %eax, %eax
ret
- /* For blocks bigger than 32 bytes
+ /* For blocks bigger than 32 bytes
1. Advance one of the addr pointer to be 16B aligned.
2. Treat the case of both addr pointers aligned to 16B
separately to avoid movdqu.
L(gt32):
movq %rdx, %r11
addq %rdi, %r11
- movq %rdi, %r8
+ movq %rdi, %r8
andq $15, %r8
- jz L(16am)
+ jz L(16am)
/* Both pointers may be misaligned. */
movdqu (%rdi), %xmm1
movdqu (%rdi, %rsi), %xmm0
L(A32):
movq %r11, %r10
andq $-32, %r10
- cmpq %r10, %rdi
- jge L(mt16)
+ cmpq %r10, %rdi
+ jge L(mt16)
/* Pre-unroll to be ready for unrolled 64B loop. */
testq $32, %rdi
jz L(A64)
subl $0xffff, %edx
jnz L(neq)
addq $16, %rdi
-
+
movdqu (%rdi,%rsi), %xmm0
pcmpeqb (%rdi), %xmm0
pmovmskb %xmm0, %edx
L(A64):
movq %r11, %r10
andq $-64, %r10
- cmpq %r10, %rdi
- jge L(mt32)
-
+ cmpq %r10, %rdi
+ jge L(mt32)
+
L(A64main):
movdqu (%rdi,%rsi), %xmm0
pcmpeqb (%rdi), %xmm0
subl $0xffff, %edx
jnz L(neq)
addq $16, %rdi
-
+
movdqu (%rdi,%rsi), %xmm0
pcmpeqb (%rdi), %xmm0
pmovmskb %xmm0, %edx
L(mt32):
movq %r11, %r10
andq $-32, %r10
- cmpq %r10, %rdi
- jge L(mt16)
+ cmpq %r10, %rdi
+ jge L(mt16)
L(A32main):
movdqu (%rdi,%rsi), %xmm0
subl $0xffff, %edx
jnz L(neq)
addq $16, %rdi
-
+
movdqu (%rdi,%rsi), %xmm0
pcmpeqb (%rdi), %xmm0
pmovmskb %xmm0, %edx
L(mt16):
subq %rdi, %r11
je L(finz)
- movq %r11, %r10
- jmp L(small)
+ movq %r11, %r10
+ jmp L(small)
.p2align 4,, 4
L(neq):
- bsfl %edx, %ecx
+ bsfl %edx, %ecx
movzbl (%rdi, %rcx), %eax
- addq %rdi, %rsi
+ addq %rdi, %rsi
movzbl (%rsi,%rcx), %edx
jmp L(finz1)
.p2align 4,, 4
L(ATR):
movq %r11, %r10
- andq $-32, %r10
- cmpq %r10, %rdi
- jge L(mt16)
+ andq $-32, %r10
+ cmpq %r10, %rdi
+ jge L(mt16)
testq $16, %rdi
jz L(ATR32)
L(ATR64):
cmpq %rdi, %r10
- je L(mt32)
+ je L(mt32)
L(ATR64main):
movdqa (%rdi,%rsi), %xmm0
jne L(ATR64main)
movq %r11, %r10
- andq $-32, %r10
- cmpq %r10, %rdi
- jge L(mt16)
+ andq $-32, %r10
+ cmpq %r10, %rdi
+ jge L(mt16)
L(ATR32res):
movdqa (%rdi,%rsi), %xmm0
jnz L(neq)
addq $16, %rdi
- cmpq %r10, %rdi
+ cmpq %r10, %rdi
jne L(ATR32res)
subq %rdi, %r11
je L(finz)
- movq %r11, %r10
- jmp L(small)
+ movq %r11, %r10
+ jmp L(small)
/* Align to 16byte to improve instruction fetch. */
.p2align 4,, 4
END(memcmp)