/*
* Copyright ( C ) 2014 The Android Open Source Project
*
* Licensed under the Apache License , Version 2 . 0 ( the " License " ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : / / www . apache . org / licenses / LICENSE - 2 . 0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an " AS IS " BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*/
#include "asm_support_x86.S"
#define MEMCMP __memcmp16
/* int32_t memcmp16_compare(const uint16_t* s0, const uint16_t* s1, size_t count); */
#ifndef L
# define L(label) .L##label
#endif
#define CFI_PUSH(REG) \
CFI_ADJUST_CFA_OFFSET(4 ); \
CFI_REL_OFFSET(REG, 0 )
#define CFI_POP(REG) \
CFI_ADJUST_CFA_OFFSET(-4 ); \
CFI_RESTORE(REG)
#define PUSH(REG) pushl REG; CFI_PUSH (REG)
#define POP(REG) popl REG; CFI_POP (REG)
#define PARMS 4
#define BLK1 PARMS
#define BLK2 BLK1+4
#define LEN BLK2+4
#define RETURN_END POP (%edi); POP (%esi); POP (%ebx); ret
MACRO0(RETURN)
RETURN_END
CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
END_MACRO
DEFINE_FUNCTION MEMCMP
movl LEN(%esp), %ecx
shl $1 , %ecx
jz L(zero)
movl BLK1(%esp), %eax
cmp $48 , %ecx
movl BLK2(%esp), %edx
jae L(48 bytesormore)
PUSH (%ebx)
add %ecx, %edx
add %ecx, %eax
jmp L(less48bytes)
CFI_POP (%ebx)
.p2align 4
L(zero):
xor %eax, %eax
ret
.p2align 4
L(48 bytesormore):
PUSH (%ebx)
PUSH (%esi)
PUSH (%edi)
CFI_REMEMBER_STATE
movdqu (%eax), %xmm3
movdqu (%edx), %xmm0
movl %eax, %edi
movl %edx, %esi
pcmpeqb %xmm0, %xmm3
pmovmskb %xmm3, %edx
lea 16 (%edi), %edi
sub $0 xffff, %edx
lea 16 (%esi), %esi
jnz L(less16bytes)
mov %edi, %edx
and $0 xf, %edx
xor %edx, %edi
sub %edx, %esi
add %edx, %ecx
mov %esi, %edx
and $0 xf, %edx
jz L(shr_0)
xor %edx, %esi
cmp $0 , %edx
je L(shr_0)
cmp $2 , %edx
je L(shr_2)
cmp $4 , %edx
je L(shr_4)
cmp $6 , %edx
je L(shr_6)
cmp $8 , %edx
je L(shr_8)
cmp $10 , %edx
je L(shr_10)
cmp $12 , %edx
je L(shr_12)
jmp L(shr_14)
.p2align 4
L(shr_0):
cmp $80 , %ecx
jae L(shr_0_gobble)
lea -48 (%ecx), %ecx
xor %eax, %eax
movaps (%esi), %xmm1
pcmpeqb (%edi), %xmm1
movaps 16 (%esi), %xmm2
pcmpeqb 16 (%edi), %xmm2
pand %xmm1, %xmm2
pmovmskb %xmm2, %edx
add $32 , %edi
add $32 , %esi
sub $0 xffff, %edx
jnz L(exit)
lea (%ecx, %edi,1 ), %eax
lea (%ecx, %esi,1 ), %edx
POP (%edi)
POP (%esi)
jmp L(less48bytes)
CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_0_gobble):
lea -48 (%ecx), %ecx
movdqa (%esi), %xmm0
xor %eax, %eax
pcmpeqb (%edi), %xmm0
sub $32 , %ecx
movdqa 16 (%esi), %xmm2
pcmpeqb 16 (%edi), %xmm2
L(shr_0_gobble_loop):
pand %xmm0, %xmm2
sub $32 , %ecx
pmovmskb %xmm2, %edx
movdqa %xmm0, %xmm1
movdqa 32 (%esi), %xmm0
movdqa 48 (%esi), %xmm2
sbb $0 xffff, %edx
pcmpeqb 32 (%edi), %xmm0
pcmpeqb 48 (%edi), %xmm2
lea 32 (%edi), %edi
lea 32 (%esi), %esi
jz L(shr_0_gobble_loop)
pand %xmm0, %xmm2
cmp $0 , %ecx
jge L(shr_0_gobble_loop_next)
inc %edx
add $32 , %ecx
L(shr_0_gobble_loop_next):
test %edx, %edx
jnz L(exit)
pmovmskb %xmm2, %edx
movdqa %xmm0, %xmm1
lea 32 (%edi), %edi
lea 32 (%esi), %esi
sub $0 xffff, %edx
jnz L(exit)
lea (%ecx, %edi,1 ), %eax
lea (%ecx, %esi,1 ), %edx
POP (%edi)
POP (%esi)
jmp L(less48bytes)
CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_2):
cmp $80 , %ecx
lea -48 (%ecx), %ecx
mov %edx, %eax
jae L(shr_2_gobble)
movdqa 16 (%esi), %xmm1
movdqa %xmm1, %xmm2
palignr $2 ,(%esi), %xmm1
pcmpeqb (%edi), %xmm1
movdqa 32 (%esi), %xmm3
palignr $2 ,%xmm2, %xmm3
pcmpeqb 16 (%edi), %xmm3
pand %xmm1, %xmm3
pmovmskb %xmm3, %edx
lea 32 (%edi), %edi
lea 32 (%esi), %esi
sub $0 xffff, %edx
jnz L(exit)
lea (%ecx, %edi,1 ), %eax
lea 2 (%ecx, %esi,1 ), %edx
POP (%edi)
POP (%esi)
jmp L(less48bytes)
CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_2_gobble):
sub $32 , %ecx
movdqa 16 (%esi), %xmm0
palignr $2 ,(%esi), %xmm0
pcmpeqb (%edi), %xmm0
movdqa 32 (%esi), %xmm3
palignr $2 ,16 (%esi), %xmm3
pcmpeqb 16 (%edi), %xmm3
L(shr_2_gobble_loop):
pand %xmm0, %xmm3
sub $32 , %ecx
pmovmskb %xmm3, %edx
movdqa %xmm0, %xmm1
movdqa 64 (%esi), %xmm3
palignr $2 ,48 (%esi), %xmm3
sbb $0 xffff, %edx
movdqa 48 (%esi), %xmm0
palignr $2 ,32 (%esi), %xmm0
pcmpeqb 32 (%edi), %xmm0
lea 32 (%esi), %esi
pcmpeqb 48 (%edi), %xmm3
lea 32 (%edi), %edi
jz L(shr_2_gobble_loop)
pand %xmm0, %xmm3
cmp $0 , %ecx
jge L(shr_2_gobble_next)
inc %edx
add $32 , %ecx
L(shr_2_gobble_next):
test %edx, %edx
jnz L(exit)
pmovmskb %xmm3, %edx
movdqa %xmm0, %xmm1
lea 32 (%edi), %edi
lea 32 (%esi), %esi
sub $0 xffff, %edx
jnz L(exit)
lea (%ecx, %edi,1 ), %eax
lea 2 (%ecx, %esi,1 ), %edx
POP (%edi)
POP (%esi)
jmp L(less48bytes)
CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_4):
cmp $80 , %ecx
lea -48 (%ecx), %ecx
mov %edx, %eax
jae L(shr_4_gobble)
movdqa 16 (%esi), %xmm1
movdqa %xmm1, %xmm2
palignr $4 ,(%esi), %xmm1
pcmpeqb (%edi), %xmm1
movdqa 32 (%esi), %xmm3
palignr $4 ,%xmm2, %xmm3
pcmpeqb 16 (%edi), %xmm3
pand %xmm1, %xmm3
pmovmskb %xmm3, %edx
lea 32 (%edi), %edi
lea 32 (%esi), %esi
sub $0 xffff, %edx
jnz L(exit)
lea (%ecx, %edi,1 ), %eax
lea 4 (%ecx, %esi,1 ), %edx
POP (%edi)
POP (%esi)
jmp L(less48bytes)
CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_4_gobble):
sub $32 , %ecx
movdqa 16 (%esi), %xmm0
palignr $4 ,(%esi), %xmm0
pcmpeqb (%edi), %xmm0
movdqa 32 (%esi), %xmm3
palignr $4 ,16 (%esi), %xmm3
pcmpeqb 16 (%edi), %xmm3
L(shr_4_gobble_loop):
pand %xmm0, %xmm3
sub $32 , %ecx
pmovmskb %xmm3, %edx
movdqa %xmm0, %xmm1
movdqa 64 (%esi), %xmm3
palignr $4 ,48 (%esi), %xmm3
sbb $0 xffff, %edx
movdqa 48 (%esi), %xmm0
palignr $4 ,32 (%esi), %xmm0
pcmpeqb 32 (%edi), %xmm0
lea 32 (%esi), %esi
pcmpeqb 48 (%edi), %xmm3
lea 32 (%edi), %edi
jz L(shr_4_gobble_loop)
pand %xmm0, %xmm3
cmp $0 , %ecx
jge L(shr_4_gobble_next)
inc %edx
add $32 , %ecx
L(shr_4_gobble_next):
test %edx, %edx
jnz L(exit)
pmovmskb %xmm3, %edx
movdqa %xmm0, %xmm1
lea 32 (%edi), %edi
lea 32 (%esi), %esi
sub $0 xffff, %edx
jnz L(exit)
lea (%ecx, %edi,1 ), %eax
lea 4 (%ecx, %esi,1 ), %edx
POP (%edi)
POP (%esi)
jmp L(less48bytes)
CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_6):
cmp $80 , %ecx
lea -48 (%ecx), %ecx
mov %edx, %eax
jae L(shr_6_gobble)
movdqa 16 (%esi), %xmm1
movdqa %xmm1, %xmm2
palignr $6 ,(%esi), %xmm1
pcmpeqb (%edi), %xmm1
movdqa 32 (%esi), %xmm3
palignr $6 ,%xmm2, %xmm3
pcmpeqb 16 (%edi), %xmm3
pand %xmm1, %xmm3
pmovmskb %xmm3, %edx
lea 32 (%edi), %edi
lea 32 (%esi), %esi
sub $0 xffff, %edx
jnz L(exit)
lea (%ecx, %edi,1 ), %eax
lea 6 (%ecx, %esi,1 ), %edx
POP (%edi)
POP (%esi)
jmp L(less48bytes)
CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_6_gobble):
sub $32 , %ecx
movdqa 16 (%esi), %xmm0
palignr $6 ,(%esi), %xmm0
pcmpeqb (%edi), %xmm0
movdqa 32 (%esi), %xmm3
palignr $6 ,16 (%esi), %xmm3
pcmpeqb 16 (%edi), %xmm3
L(shr_6_gobble_loop):
pand %xmm0, %xmm3
sub $32 , %ecx
pmovmskb %xmm3, %edx
movdqa %xmm0, %xmm1
movdqa 64 (%esi), %xmm3
palignr $6 ,48 (%esi), %xmm3
sbb $0 xffff, %edx
movdqa 48 (%esi), %xmm0
palignr $6 ,32 (%esi), %xmm0
pcmpeqb 32 (%edi), %xmm0
lea 32 (%esi), %esi
pcmpeqb 48 (%edi), %xmm3
lea 32 (%edi), %edi
jz L(shr_6_gobble_loop)
pand %xmm0, %xmm3
cmp $0 , %ecx
jge L(shr_6_gobble_next)
inc %edx
add $32 , %ecx
L(shr_6_gobble_next):
test %edx, %edx
jnz L(exit)
pmovmskb %xmm3, %edx
movdqa %xmm0, %xmm1
lea 32 (%edi), %edi
lea 32 (%esi), %esi
sub $0 xffff, %edx
jnz L(exit)
lea (%ecx, %edi,1 ), %eax
lea 6 (%ecx, %esi,1 ), %edx
POP (%edi)
POP (%esi)
jmp L(less48bytes)
CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_8):
cmp $80 , %ecx
lea -48 (%ecx), %ecx
mov %edx, %eax
jae L(shr_8_gobble)
movdqa 16 (%esi), %xmm1
movdqa %xmm1, %xmm2
palignr $8 ,(%esi), %xmm1
pcmpeqb (%edi), %xmm1
movdqa 32 (%esi), %xmm3
palignr $8 ,%xmm2, %xmm3
pcmpeqb 16 (%edi), %xmm3
pand %xmm1, %xmm3
pmovmskb %xmm3, %edx
lea 32 (%edi), %edi
lea 32 (%esi), %esi
sub $0 xffff, %edx
jnz L(exit)
lea (%ecx, %edi,1 ), %eax
lea 8 (%ecx, %esi,1 ), %edx
POP (%edi)
POP (%esi)
jmp L(less48bytes)
CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_8_gobble):
sub $32 , %ecx
movdqa 16 (%esi), %xmm0
palignr $8 ,(%esi), %xmm0
pcmpeqb (%edi), %xmm0
movdqa 32 (%esi), %xmm3
palignr $8 ,16 (%esi), %xmm3
pcmpeqb 16 (%edi), %xmm3
L(shr_8_gobble_loop):
pand %xmm0, %xmm3
sub $32 , %ecx
pmovmskb %xmm3, %edx
movdqa %xmm0, %xmm1
movdqa 64 (%esi), %xmm3
palignr $8 ,48 (%esi), %xmm3
sbb $0 xffff, %edx
movdqa 48 (%esi), %xmm0
palignr $8 ,32 (%esi), %xmm0
pcmpeqb 32 (%edi), %xmm0
lea 32 (%esi), %esi
pcmpeqb 48 (%edi), %xmm3
lea 32 (%edi), %edi
jz L(shr_8_gobble_loop)
pand %xmm0, %xmm3
cmp $0 , %ecx
jge L(shr_8_gobble_next)
inc %edx
add $32 , %ecx
L(shr_8_gobble_next):
test %edx, %edx
jnz L(exit)
pmovmskb %xmm3, %edx
movdqa %xmm0, %xmm1
lea 32 (%edi), %edi
lea 32 (%esi), %esi
sub $0 xffff, %edx
jnz L(exit)
lea (%ecx, %edi,1 ), %eax
lea 8 (%ecx, %esi,1 ), %edx
POP (%edi)
POP (%esi)
jmp L(less48bytes)
CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_10):
cmp $80 , %ecx
lea -48 (%ecx), %ecx
mov %edx, %eax
jae L(shr_10_gobble)
movdqa 16 (%esi), %xmm1
movdqa %xmm1, %xmm2
palignr $10 , (%esi), %xmm1
pcmpeqb (%edi), %xmm1
movdqa 32 (%esi), %xmm3
palignr $10 ,%xmm2, %xmm3
pcmpeqb 16 (%edi), %xmm3
pand %xmm1, %xmm3
pmovmskb %xmm3, %edx
lea 32 (%edi), %edi
lea 32 (%esi), %esi
sub $0 xffff, %edx
jnz L(exit)
lea (%ecx, %edi,1 ), %eax
lea 10 (%ecx, %esi,1 ), %edx
POP (%edi)
POP (%esi)
jmp L(less48bytes)
CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_10_gobble):
sub $32 , %ecx
movdqa 16 (%esi), %xmm0
palignr $10 , (%esi), %xmm0
pcmpeqb (%edi), %xmm0
movdqa 32 (%esi), %xmm3
palignr $10 , 16 (%esi), %xmm3
pcmpeqb 16 (%edi), %xmm3
L(shr_10_gobble_loop):
pand %xmm0, %xmm3
sub $32 , %ecx
pmovmskb %xmm3, %edx
movdqa %xmm0, %xmm1
movdqa 64 (%esi), %xmm3
palignr $10 ,48 (%esi), %xmm3
sbb $0 xffff, %edx
movdqa 48 (%esi), %xmm0
palignr $10 ,32 (%esi), %xmm0
pcmpeqb 32 (%edi), %xmm0
lea 32 (%esi), %esi
pcmpeqb 48 (%edi), %xmm3
lea 32 (%edi), %edi
jz L(shr_10_gobble_loop)
pand %xmm0, %xmm3
cmp $0 , %ecx
jge L(shr_10_gobble_next)
inc %edx
add $32 , %ecx
L(shr_10_gobble_next):
test %edx, %edx
jnz L(exit)
pmovmskb %xmm3, %edx
movdqa %xmm0, %xmm1
lea 32 (%edi), %edi
lea 32 (%esi), %esi
sub $0 xffff, %edx
jnz L(exit)
lea (%ecx, %edi,1 ), %eax
lea 10 (%ecx, %esi,1 ), %edx
POP (%edi)
POP (%esi)
jmp L(less48bytes)
CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_12):
cmp $80 , %ecx
lea -48 (%ecx), %ecx
mov %edx, %eax
jae L(shr_12_gobble)
movdqa 16 (%esi), %xmm1
movdqa %xmm1, %xmm2
palignr $12 , (%esi), %xmm1
pcmpeqb (%edi), %xmm1
movdqa 32 (%esi), %xmm3
palignr $12 , %xmm2, %xmm3
pcmpeqb 16 (%edi), %xmm3
pand %xmm1, %xmm3
pmovmskb %xmm3, %edx
lea 32 (%edi), %edi
lea 32 (%esi), %esi
sub $0 xffff, %edx
jnz L(exit)
lea (%ecx, %edi,1 ), %eax
lea 12 (%ecx, %esi,1 ), %edx
POP (%edi)
POP (%esi)
jmp L(less48bytes)
CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_12_gobble):
sub $32 , %ecx
movdqa 16 (%esi), %xmm0
palignr $12 , (%esi), %xmm0
pcmpeqb (%edi), %xmm0
movdqa 32 (%esi), %xmm3
palignr $12 , 16 (%esi), %xmm3
pcmpeqb 16 (%edi), %xmm3
L(shr_12_gobble_loop):
pand %xmm0, %xmm3
sub $32 , %ecx
pmovmskb %xmm3, %edx
movdqa %xmm0, %xmm1
movdqa 64 (%esi), %xmm3
palignr $12 ,48 (%esi), %xmm3
sbb $0 xffff, %edx
movdqa 48 (%esi), %xmm0
palignr $12 ,32 (%esi), %xmm0
pcmpeqb 32 (%edi), %xmm0
lea 32 (%esi), %esi
pcmpeqb 48 (%edi), %xmm3
lea 32 (%edi), %edi
jz L(shr_12_gobble_loop)
pand %xmm0, %xmm3
cmp $0 , %ecx
jge L(shr_12_gobble_next)
inc %edx
add $32 , %ecx
L(shr_12_gobble_next):
test %edx, %edx
jnz L(exit)
pmovmskb %xmm3, %edx
movdqa %xmm0, %xmm1
lea 32 (%edi), %edi
lea 32 (%esi), %esi
sub $0 xffff, %edx
jnz L(exit)
lea (%ecx, %edi,1 ), %eax
lea 12 (%ecx, %esi,1 ), %edx
POP (%edi)
POP (%esi)
jmp L(less48bytes)
CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_14):
cmp $80 , %ecx
lea -48 (%ecx), %ecx
mov %edx, %eax
jae L(shr_14_gobble)
movdqa 16 (%esi), %xmm1
movdqa %xmm1, %xmm2
palignr $14 , (%esi), %xmm1
pcmpeqb (%edi), %xmm1
movdqa 32 (%esi), %xmm3
palignr $14 , %xmm2, %xmm3
pcmpeqb 16 (%edi), %xmm3
pand %xmm1, %xmm3
pmovmskb %xmm3, %edx
lea 32 (%edi), %edi
lea 32 (%esi), %esi
sub $0 xffff, %edx
jnz L(exit)
lea (%ecx, %edi,1 ), %eax
lea 14 (%ecx, %esi,1 ), %edx
POP (%edi)
POP (%esi)
jmp L(less48bytes)
CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_14_gobble):
sub $32 , %ecx
movdqa 16 (%esi), %xmm0
palignr $14 , (%esi), %xmm0
pcmpeqb (%edi), %xmm0
movdqa 32 (%esi), %xmm3
palignr $14 , 16 (%esi), %xmm3
pcmpeqb 16 (%edi), %xmm3
L(shr_14_gobble_loop):
pand %xmm0, %xmm3
sub $32 , %ecx
pmovmskb %xmm3, %edx
movdqa %xmm0, %xmm1
movdqa 64 (%esi), %xmm3
palignr $14 ,48 (%esi), %xmm3
sbb $0 xffff, %edx
movdqa 48 (%esi), %xmm0
palignr $14 ,32 (%esi), %xmm0
pcmpeqb 32 (%edi), %xmm0
lea 32 (%esi), %esi
pcmpeqb 48 (%edi), %xmm3
lea 32 (%edi), %edi
jz L(shr_14_gobble_loop)
pand %xmm0, %xmm3
cmp $0 , %ecx
jge L(shr_14_gobble_next)
inc %edx
add $32 , %ecx
L(shr_14_gobble_next):
test %edx, %edx
jnz L(exit)
pmovmskb %xmm3, %edx
movdqa %xmm0, %xmm1
lea 32 (%edi), %edi
lea 32 (%esi), %esi
sub $0 xffff, %edx
jnz L(exit)
lea (%ecx, %edi,1 ), %eax
lea 14 (%ecx, %esi,1 ), %edx
POP (%edi)
POP (%esi)
jmp L(less48bytes)
CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(exit):
pmovmskb %xmm1, %ebx
sub $0 xffff, %ebx
jz L(first16bytes)
lea -16 (%esi), %esi
lea -16 (%edi), %edi
mov %ebx, %edx
L(first16bytes):
add %eax, %esi
L(less16bytes):
test %dl, %dl
jz L(next_four_words)
test $15 , %dl
jz L(second_two_words)
test $3 , %dl
jz L(second_word)
movzwl -16 (%edi), %eax
movzwl -16 (%esi), %ebx
subl %ebx, %eax
RETURN
.p2align 4
L(second_word):
movzwl -14 (%edi), %eax
movzwl -14 (%esi), %ebx
subl %ebx, %eax
RETURN
.p2align 4
L(second_two_words):
test $63 , %dl
jz L(fourth_word)
movzwl -12 (%edi), %eax
movzwl -12 (%esi), %ebx
subl %ebx, %eax
RETURN
.p2align 4
L(fourth_word):
movzwl -10 (%edi), %eax
movzwl -10 (%esi), %ebx
subl %ebx, %eax
RETURN
.p2align 4
L(next_four_words):
test $15 , %dh
jz L(fourth_two_words)
test $3 , %dh
jz L(sixth_word)
movzwl -8 (%edi), %eax
movzwl -8 (%esi), %ebx
subl %ebx, %eax
RETURN
.p2align 4
L(sixth_word):
movzwl -6 (%edi), %eax
movzwl -6 (%esi), %ebx
subl %ebx, %eax
RETURN
.p2align 4
L(fourth_two_words):
test $63 , %dh
jz L(eighth_word)
movzwl -4 (%edi), %eax
movzwl -4 (%esi), %ebx
subl %ebx, %eax
RETURN
.p2align 4
L(eighth_word):
movzwl -2 (%edi), %eax
movzwl -2 (%esi), %ebx
subl %ebx, %eax
RETURN
# Unreachable, but needed for static analysis in the check_cfi.py script,
# since it does just single forward pass, but the code below is only
# reachable via a backward branch.
CFI_DEF_CFA (esp, 4 )
PUSH (%ebx)
.p2align 4
L(more8bytes):
cmp $16 , %ecx
jae L(more16bytes)
cmp $8 , %ecx
je L(8 bytes)
cmp $10 , %ecx
je L(10 bytes)
cmp $12 , %ecx
je L(12 bytes)
jmp L(14 bytes)
.p2align 4
L(more16bytes):
cmp $24 , %ecx
jae L(more24bytes)
cmp $16 , %ecx
je L(16 bytes)
cmp $18 , %ecx
je L(18 bytes)
cmp $20 , %ecx
je L(20 bytes)
jmp L(22 bytes)
.p2align 4
L(more24bytes):
cmp $32 , %ecx
jae L(more32bytes)
cmp $24 , %ecx
je L(24 bytes)
cmp $26 , %ecx
je L(26 bytes)
cmp $28 , %ecx
je L(28 bytes)
jmp L(30 bytes)
.p2align 4
L(more32bytes):
cmp $40 , %ecx
jae L(more40bytes)
cmp $32 , %ecx
je L(32 bytes)
cmp $34 , %ecx
je L(34 bytes)
cmp $36 , %ecx
je L(36 bytes)
jmp L(38 bytes)
.p2align 4
L(less48bytes):
cmp $8 , %ecx
jae L(more8bytes)
cmp $2 , %ecx
je L(2 bytes)
cmp $4 , %ecx
je L(4 bytes)
jmp L(6 bytes)
.p2align 4
L(more40bytes):
cmp $40 , %ecx
je L(40 bytes)
cmp $42 , %ecx
je L(42 bytes)
cmp $44 , %ecx
je L(44 bytes)
jmp L(46 bytes)
.p2align 4
L(46 bytes):
movzwl -46 (%eax), %ecx
movzwl -46 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(44 bytes):
movzwl -44 (%eax), %ecx
movzwl -44 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(42 bytes):
movzwl -42 (%eax), %ecx
movzwl -42 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(40 bytes):
movzwl -40 (%eax), %ecx
movzwl -40 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(38 bytes):
movzwl -38 (%eax), %ecx
movzwl -38 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(36 bytes):
movzwl -36 (%eax), %ecx
movzwl -36 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(34 bytes):
movzwl -34 (%eax), %ecx
movzwl -34 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(32 bytes):
movzwl -32 (%eax), %ecx
movzwl -32 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(30 bytes):
movzwl -30 (%eax), %ecx
movzwl -30 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(28 bytes):
movzwl -28 (%eax), %ecx
movzwl -28 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(26 bytes):
movzwl -26 (%eax), %ecx
movzwl -26 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(24 bytes):
movzwl -24 (%eax), %ecx
movzwl -24 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(22 bytes):
movzwl -22 (%eax), %ecx
movzwl -22 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(20 bytes):
movzwl -20 (%eax), %ecx
movzwl -20 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(18 bytes):
movzwl -18 (%eax), %ecx
movzwl -18 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(16 bytes):
movzwl -16 (%eax), %ecx
movzwl -16 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(14 bytes):
movzwl -14 (%eax), %ecx
movzwl -14 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(12 bytes):
movzwl -12 (%eax), %ecx
movzwl -12 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(10 bytes):
movzwl -10 (%eax), %ecx
movzwl -10 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(8 bytes):
movzwl -8 (%eax), %ecx
movzwl -8 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(6 bytes):
movzwl -6 (%eax), %ecx
movzwl -6 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(4 bytes):
movzwl -4 (%eax), %ecx
movzwl -4 (%edx), %ebx
subl %ebx, %ecx
jne L(memcmp16_exit)
L(2 bytes):
movzwl -2 (%eax), %eax
movzwl -2 (%edx), %ebx
subl %ebx, %eax
POP (%ebx)
ret
CFI_PUSH (%ebx)
.p2align 4
L(memcmp16_exit):
POP (%ebx)
mov %ecx, %eax
ret
END_FUNCTION MEMCMP
Messung V0.5 in Prozent C=93 H=95 G=93
¤ Dauer der Verarbeitung: 0.16 Sekunden
(vorverarbeitet am 2026-06-29)
¤
*© Formatika GbR, Deutschland