Merge "Make all labels local."
This commit is contained in:
commit
a3a619835d
@ -70,7 +70,7 @@
|
|||||||
|
|
||||||
.macro m_scan_byte
|
.macro m_scan_byte
|
||||||
ldrb r3, [r0]
|
ldrb r3, [r0]
|
||||||
cbz r3, strcat_r0_scan_done
|
cbz r3, .L_strcat_r0_scan_done
|
||||||
add r0, #1
|
add r0, #1
|
||||||
.endm // m_scan_byte
|
.endm // m_scan_byte
|
||||||
|
|
||||||
@ -84,10 +84,10 @@ ENTRY(strcat)
|
|||||||
// Quick check to see if src is empty.
|
// Quick check to see if src is empty.
|
||||||
ldrb r2, [r1]
|
ldrb r2, [r1]
|
||||||
pld [r1, #0]
|
pld [r1, #0]
|
||||||
cbnz r2, strcat_continue
|
cbnz r2, .L_strcat_continue
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
strcat_continue:
|
.L_strcat_continue:
|
||||||
// To speed up really small dst strings, unroll checking the first 4 bytes.
|
// To speed up really small dst strings, unroll checking the first 4 bytes.
|
||||||
m_push
|
m_push
|
||||||
m_scan_byte
|
m_scan_byte
|
||||||
@ -96,95 +96,95 @@ strcat_continue:
|
|||||||
m_scan_byte
|
m_scan_byte
|
||||||
|
|
||||||
ands r3, r0, #7
|
ands r3, r0, #7
|
||||||
beq strcat_mainloop
|
beq .L_strcat_mainloop
|
||||||
|
|
||||||
// Align to a double word (64 bits).
|
// Align to a double word (64 bits).
|
||||||
rsb r3, r3, #8
|
rsb r3, r3, #8
|
||||||
lsls ip, r3, #31
|
lsls ip, r3, #31
|
||||||
beq strcat_align_to_32
|
beq .L_strcat_align_to_32
|
||||||
|
|
||||||
ldrb r5, [r0]
|
ldrb r5, [r0]
|
||||||
cbz r5, strcat_r0_scan_done
|
cbz r5, .L_strcat_r0_scan_done
|
||||||
add r0, r0, #1
|
add r0, r0, #1
|
||||||
|
|
||||||
strcat_align_to_32:
|
.L_strcat_align_to_32:
|
||||||
bcc strcat_align_to_64
|
bcc .L_strcat_align_to_64
|
||||||
|
|
||||||
ldrb r2, [r0]
|
ldrb r2, [r0]
|
||||||
cbz r2, strcat_r0_scan_done
|
cbz r2, .L_strcat_r0_scan_done
|
||||||
add r0, r0, #1
|
add r0, r0, #1
|
||||||
ldrb r4, [r0]
|
ldrb r4, [r0]
|
||||||
cbz r4, strcat_r0_scan_done
|
cbz r4, .L_strcat_r0_scan_done
|
||||||
add r0, r0, #1
|
add r0, r0, #1
|
||||||
|
|
||||||
strcat_align_to_64:
|
.L_strcat_align_to_64:
|
||||||
tst r3, #4
|
tst r3, #4
|
||||||
beq strcat_mainloop
|
beq .L_strcat_mainloop
|
||||||
ldr r3, [r0], #4
|
ldr r3, [r0], #4
|
||||||
|
|
||||||
sub ip, r3, #0x01010101
|
sub ip, r3, #0x01010101
|
||||||
bic ip, ip, r3
|
bic ip, ip, r3
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne strcat_zero_in_second_register
|
bne .L_strcat_zero_in_second_register
|
||||||
b strcat_mainloop
|
b .L_strcat_mainloop
|
||||||
|
|
||||||
strcat_r0_scan_done:
|
.L_strcat_r0_scan_done:
|
||||||
// For short copies, hard-code checking the first 8 bytes since this
|
// For short copies, hard-code checking the first 8 bytes since this
|
||||||
// new code doesn't win until after about 8 bytes.
|
// new code doesn't win until after about 8 bytes.
|
||||||
m_copy_byte reg=r2, cmd=cbz, label=strcpy_finish
|
m_copy_byte reg=r2, cmd=cbz, label=.L_strcpy_finish
|
||||||
m_copy_byte reg=r3, cmd=cbz, label=strcpy_finish
|
m_copy_byte reg=r3, cmd=cbz, label=.L_strcpy_finish
|
||||||
m_copy_byte reg=r4, cmd=cbz, label=strcpy_finish
|
m_copy_byte reg=r4, cmd=cbz, label=.L_strcpy_finish
|
||||||
m_copy_byte reg=r5, cmd=cbz, label=strcpy_finish
|
m_copy_byte reg=r5, cmd=cbz, label=.L_strcpy_finish
|
||||||
m_copy_byte reg=r2, cmd=cbz, label=strcpy_finish
|
m_copy_byte reg=r2, cmd=cbz, label=.L_strcpy_finish
|
||||||
m_copy_byte reg=r3, cmd=cbz, label=strcpy_finish
|
m_copy_byte reg=r3, cmd=cbz, label=.L_strcpy_finish
|
||||||
m_copy_byte reg=r4, cmd=cbz, label=strcpy_finish
|
m_copy_byte reg=r4, cmd=cbz, label=.L_strcpy_finish
|
||||||
m_copy_byte reg=r5, cmd=cbnz, label=strcpy_continue
|
m_copy_byte reg=r5, cmd=cbnz, label=.L_strcpy_continue
|
||||||
|
|
||||||
strcpy_finish:
|
.L_strcpy_finish:
|
||||||
m_pop
|
m_pop
|
||||||
|
|
||||||
strcpy_continue:
|
.L_strcpy_continue:
|
||||||
ands r3, r0, #7
|
ands r3, r0, #7
|
||||||
beq strcpy_check_src_align
|
beq .L_strcpy_check_src_align
|
||||||
|
|
||||||
// Align to a double word (64 bits).
|
// Align to a double word (64 bits).
|
||||||
rsb r3, r3, #8
|
rsb r3, r3, #8
|
||||||
lsls ip, r3, #31
|
lsls ip, r3, #31
|
||||||
beq strcpy_align_to_32
|
beq .L_strcpy_align_to_32
|
||||||
|
|
||||||
ldrb r2, [r1], #1
|
ldrb r2, [r1], #1
|
||||||
strb r2, [r0], #1
|
strb r2, [r0], #1
|
||||||
cbz r2, strcpy_complete
|
cbz r2, .L_strcpy_complete
|
||||||
|
|
||||||
strcpy_align_to_32:
|
.L_strcpy_align_to_32:
|
||||||
bcc strcpy_align_to_64
|
bcc .L_strcpy_align_to_64
|
||||||
|
|
||||||
ldrb r2, [r1], #1
|
ldrb r2, [r1], #1
|
||||||
strb r2, [r0], #1
|
strb r2, [r0], #1
|
||||||
cbz r2, strcpy_complete
|
cbz r2, .L_strcpy_complete
|
||||||
ldrb r2, [r1], #1
|
ldrb r2, [r1], #1
|
||||||
strb r2, [r0], #1
|
strb r2, [r0], #1
|
||||||
cbz r2, strcpy_complete
|
cbz r2, .L_strcpy_complete
|
||||||
|
|
||||||
strcpy_align_to_64:
|
.L_strcpy_align_to_64:
|
||||||
tst r3, #4
|
tst r3, #4
|
||||||
beq strcpy_check_src_align
|
beq .L_strcpy_check_src_align
|
||||||
ldr r2, [r1], #4
|
ldr r2, [r1], #4
|
||||||
|
|
||||||
sub ip, r2, #0x01010101
|
sub ip, r2, #0x01010101
|
||||||
bic ip, ip, r2
|
bic ip, ip, r2
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne strcpy_zero_in_first_register
|
bne .L_strcpy_zero_in_first_register
|
||||||
str r2, [r0], #4
|
str r2, [r0], #4
|
||||||
|
|
||||||
strcpy_check_src_align:
|
.L_strcpy_check_src_align:
|
||||||
// At this point dst is aligned to a double word, check if src
|
// At this point dst is aligned to a double word, check if src
|
||||||
// is also aligned to a double word.
|
// is also aligned to a double word.
|
||||||
ands r3, r1, #7
|
ands r3, r1, #7
|
||||||
bne strcpy_unaligned_copy
|
bne .L_strcpy_unaligned_copy
|
||||||
|
|
||||||
.p2align 2
|
.p2align 2
|
||||||
strcpy_mainloop:
|
.L_strcpy_mainloop:
|
||||||
ldrd r2, r3, [r1], #8
|
ldrd r2, r3, [r1], #8
|
||||||
|
|
||||||
pld [r1, #64]
|
pld [r1, #64]
|
||||||
@ -192,128 +192,128 @@ strcpy_mainloop:
|
|||||||
sub ip, r2, #0x01010101
|
sub ip, r2, #0x01010101
|
||||||
bic ip, ip, r2
|
bic ip, ip, r2
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne strcpy_zero_in_first_register
|
bne .L_strcpy_zero_in_first_register
|
||||||
|
|
||||||
sub ip, r3, #0x01010101
|
sub ip, r3, #0x01010101
|
||||||
bic ip, ip, r3
|
bic ip, ip, r3
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne strcpy_zero_in_second_register
|
bne .L_strcpy_zero_in_second_register
|
||||||
|
|
||||||
strd r2, r3, [r0], #8
|
strd r2, r3, [r0], #8
|
||||||
b strcpy_mainloop
|
b .L_strcpy_mainloop
|
||||||
|
|
||||||
strcpy_complete:
|
.L_strcpy_complete:
|
||||||
m_pop
|
m_pop
|
||||||
|
|
||||||
strcpy_zero_in_first_register:
|
.L_strcpy_zero_in_first_register:
|
||||||
lsls lr, ip, #17
|
lsls lr, ip, #17
|
||||||
bne strcpy_copy1byte
|
bne .L_strcpy_copy1byte
|
||||||
bcs strcpy_copy2bytes
|
bcs .L_strcpy_copy2bytes
|
||||||
lsls ip, ip, #1
|
lsls ip, ip, #1
|
||||||
bne strcpy_copy3bytes
|
bne .L_strcpy_copy3bytes
|
||||||
|
|
||||||
strcpy_copy4bytes:
|
.L_strcpy_copy4bytes:
|
||||||
// Copy 4 bytes to the destiniation.
|
// Copy 4 bytes to the destiniation.
|
||||||
str r2, [r0]
|
str r2, [r0]
|
||||||
m_pop
|
m_pop
|
||||||
|
|
||||||
strcpy_copy1byte:
|
.L_strcpy_copy1byte:
|
||||||
strb r2, [r0]
|
strb r2, [r0]
|
||||||
m_pop
|
m_pop
|
||||||
|
|
||||||
strcpy_copy2bytes:
|
.L_strcpy_copy2bytes:
|
||||||
strh r2, [r0]
|
strh r2, [r0]
|
||||||
m_pop
|
m_pop
|
||||||
|
|
||||||
strcpy_copy3bytes:
|
.L_strcpy_copy3bytes:
|
||||||
strh r2, [r0], #2
|
strh r2, [r0], #2
|
||||||
lsr r2, #16
|
lsr r2, #16
|
||||||
strb r2, [r0]
|
strb r2, [r0]
|
||||||
m_pop
|
m_pop
|
||||||
|
|
||||||
strcpy_zero_in_second_register:
|
.L_strcpy_zero_in_second_register:
|
||||||
lsls lr, ip, #17
|
lsls lr, ip, #17
|
||||||
bne strcpy_copy5bytes
|
bne .L_strcpy_copy5bytes
|
||||||
bcs strcpy_copy6bytes
|
bcs .L_strcpy_copy6bytes
|
||||||
lsls ip, ip, #1
|
lsls ip, ip, #1
|
||||||
bne strcpy_copy7bytes
|
bne .L_strcpy_copy7bytes
|
||||||
|
|
||||||
// Copy 8 bytes to the destination.
|
// Copy 8 bytes to the destination.
|
||||||
strd r2, r3, [r0]
|
strd r2, r3, [r0]
|
||||||
m_pop
|
m_pop
|
||||||
|
|
||||||
strcpy_copy5bytes:
|
.L_strcpy_copy5bytes:
|
||||||
str r2, [r0], #4
|
str r2, [r0], #4
|
||||||
strb r3, [r0]
|
strb r3, [r0]
|
||||||
m_pop
|
m_pop
|
||||||
|
|
||||||
strcpy_copy6bytes:
|
.L_strcpy_copy6bytes:
|
||||||
str r2, [r0], #4
|
str r2, [r0], #4
|
||||||
strh r3, [r0]
|
strh r3, [r0]
|
||||||
m_pop
|
m_pop
|
||||||
|
|
||||||
strcpy_copy7bytes:
|
.L_strcpy_copy7bytes:
|
||||||
str r2, [r0], #4
|
str r2, [r0], #4
|
||||||
strh r3, [r0], #2
|
strh r3, [r0], #2
|
||||||
lsr r3, #16
|
lsr r3, #16
|
||||||
strb r3, [r0]
|
strb r3, [r0]
|
||||||
m_pop
|
m_pop
|
||||||
|
|
||||||
strcpy_unaligned_copy:
|
.L_strcpy_unaligned_copy:
|
||||||
// Dst is aligned to a double word, while src is at an unknown alignment.
|
// Dst is aligned to a double word, while src is at an unknown alignment.
|
||||||
// There are 7 different versions of the unaligned copy code
|
// There are 7 different versions of the unaligned copy code
|
||||||
// to prevent overreading the src. The mainloop of every single version
|
// to prevent overreading the src. The mainloop of every single version
|
||||||
// will store 64 bits per loop. The difference is how much of src can
|
// will store 64 bits per loop. The difference is how much of src can
|
||||||
// be read without potentially crossing a page boundary.
|
// be read without potentially crossing a page boundary.
|
||||||
tbb [pc, r3]
|
tbb [pc, r3]
|
||||||
strcpy_unaligned_branchtable:
|
.L_strcpy_unaligned_branchtable:
|
||||||
.byte 0
|
.byte 0
|
||||||
.byte ((strcpy_unalign7 - strcpy_unaligned_branchtable)/2)
|
.byte ((.L_strcpy_unalign7 - .L_strcpy_unaligned_branchtable)/2)
|
||||||
.byte ((strcpy_unalign6 - strcpy_unaligned_branchtable)/2)
|
.byte ((.L_strcpy_unalign6 - .L_strcpy_unaligned_branchtable)/2)
|
||||||
.byte ((strcpy_unalign5 - strcpy_unaligned_branchtable)/2)
|
.byte ((.L_strcpy_unalign5 - .L_strcpy_unaligned_branchtable)/2)
|
||||||
.byte ((strcpy_unalign4 - strcpy_unaligned_branchtable)/2)
|
.byte ((.L_strcpy_unalign4 - .L_strcpy_unaligned_branchtable)/2)
|
||||||
.byte ((strcpy_unalign3 - strcpy_unaligned_branchtable)/2)
|
.byte ((.L_strcpy_unalign3 - .L_strcpy_unaligned_branchtable)/2)
|
||||||
.byte ((strcpy_unalign2 - strcpy_unaligned_branchtable)/2)
|
.byte ((.L_strcpy_unalign2 - .L_strcpy_unaligned_branchtable)/2)
|
||||||
.byte ((strcpy_unalign1 - strcpy_unaligned_branchtable)/2)
|
.byte ((.L_strcpy_unalign1 - .L_strcpy_unaligned_branchtable)/2)
|
||||||
|
|
||||||
.p2align 2
|
.p2align 2
|
||||||
// Can read 7 bytes before possibly crossing a page.
|
// Can read 7 bytes before possibly crossing a page.
|
||||||
strcpy_unalign7:
|
.L_strcpy_unalign7:
|
||||||
ldr r2, [r1], #4
|
ldr r2, [r1], #4
|
||||||
|
|
||||||
sub ip, r2, #0x01010101
|
sub ip, r2, #0x01010101
|
||||||
bic ip, ip, r2
|
bic ip, ip, r2
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne strcpy_zero_in_first_register
|
bne .L_strcpy_zero_in_first_register
|
||||||
|
|
||||||
ldrb r3, [r1]
|
ldrb r3, [r1]
|
||||||
cbz r3, strcpy_unalign7_copy5bytes
|
cbz r3, .L_strcpy_unalign7_copy5bytes
|
||||||
ldrb r4, [r1, #1]
|
ldrb r4, [r1, #1]
|
||||||
cbz r4, strcpy_unalign7_copy6bytes
|
cbz r4, .L_strcpy_unalign7_copy6bytes
|
||||||
ldrb r5, [r1, #2]
|
ldrb r5, [r1, #2]
|
||||||
cbz r5, strcpy_unalign7_copy7bytes
|
cbz r5, .L_strcpy_unalign7_copy7bytes
|
||||||
|
|
||||||
ldr r3, [r1], #4
|
ldr r3, [r1], #4
|
||||||
pld [r1, #64]
|
pld [r1, #64]
|
||||||
|
|
||||||
lsrs ip, r3, #24
|
lsrs ip, r3, #24
|
||||||
strd r2, r3, [r0], #8
|
strd r2, r3, [r0], #8
|
||||||
beq strcpy_unalign_return
|
beq .L_strcpy_unalign_return
|
||||||
b strcpy_unalign7
|
b .L_strcpy_unalign7
|
||||||
|
|
||||||
strcpy_unalign7_copy5bytes:
|
.L_strcpy_unalign7_copy5bytes:
|
||||||
str r2, [r0], #4
|
str r2, [r0], #4
|
||||||
strb r3, [r0]
|
strb r3, [r0]
|
||||||
strcpy_unalign_return:
|
.L_strcpy_unalign_return:
|
||||||
m_pop
|
m_pop
|
||||||
|
|
||||||
strcpy_unalign7_copy6bytes:
|
.L_strcpy_unalign7_copy6bytes:
|
||||||
str r2, [r0], #4
|
str r2, [r0], #4
|
||||||
strb r3, [r0], #1
|
strb r3, [r0], #1
|
||||||
strb r4, [r0], #1
|
strb r4, [r0], #1
|
||||||
m_pop
|
m_pop
|
||||||
|
|
||||||
strcpy_unalign7_copy7bytes:
|
.L_strcpy_unalign7_copy7bytes:
|
||||||
str r2, [r0], #4
|
str r2, [r0], #4
|
||||||
strb r3, [r0], #1
|
strb r3, [r0], #1
|
||||||
strb r4, [r0], #1
|
strb r4, [r0], #1
|
||||||
@ -322,41 +322,41 @@ strcpy_unalign7_copy7bytes:
|
|||||||
|
|
||||||
.p2align 2
|
.p2align 2
|
||||||
// Can read 6 bytes before possibly crossing a page.
|
// Can read 6 bytes before possibly crossing a page.
|
||||||
strcpy_unalign6:
|
.L_strcpy_unalign6:
|
||||||
ldr r2, [r1], #4
|
ldr r2, [r1], #4
|
||||||
|
|
||||||
sub ip, r2, #0x01010101
|
sub ip, r2, #0x01010101
|
||||||
bic ip, ip, r2
|
bic ip, ip, r2
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne strcpy_zero_in_first_register
|
bne .L_strcpy_zero_in_first_register
|
||||||
|
|
||||||
ldrb r4, [r1]
|
ldrb r4, [r1]
|
||||||
cbz r4, strcpy_unalign_copy5bytes
|
cbz r4, .L_strcpy_unalign_copy5bytes
|
||||||
ldrb r5, [r1, #1]
|
ldrb r5, [r1, #1]
|
||||||
cbz r5, strcpy_unalign_copy6bytes
|
cbz r5, .L_strcpy_unalign_copy6bytes
|
||||||
|
|
||||||
ldr r3, [r1], #4
|
ldr r3, [r1], #4
|
||||||
pld [r1, #64]
|
pld [r1, #64]
|
||||||
|
|
||||||
tst r3, #0xff0000
|
tst r3, #0xff0000
|
||||||
beq strcpy_copy7bytes
|
beq .L_strcpy_copy7bytes
|
||||||
lsrs ip, r3, #24
|
lsrs ip, r3, #24
|
||||||
strd r2, r3, [r0], #8
|
strd r2, r3, [r0], #8
|
||||||
beq strcpy_unalign_return
|
beq .L_strcpy_unalign_return
|
||||||
b strcpy_unalign6
|
b .L_strcpy_unalign6
|
||||||
|
|
||||||
.p2align 2
|
.p2align 2
|
||||||
// Can read 5 bytes before possibly crossing a page.
|
// Can read 5 bytes before possibly crossing a page.
|
||||||
strcpy_unalign5:
|
.L_strcpy_unalign5:
|
||||||
ldr r2, [r1], #4
|
ldr r2, [r1], #4
|
||||||
|
|
||||||
sub ip, r2, #0x01010101
|
sub ip, r2, #0x01010101
|
||||||
bic ip, ip, r2
|
bic ip, ip, r2
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne strcpy_zero_in_first_register
|
bne .L_strcpy_zero_in_first_register
|
||||||
|
|
||||||
ldrb r4, [r1]
|
ldrb r4, [r1]
|
||||||
cbz r4, strcpy_unalign_copy5bytes
|
cbz r4, .L_strcpy_unalign_copy5bytes
|
||||||
|
|
||||||
ldr r3, [r1], #4
|
ldr r3, [r1], #4
|
||||||
|
|
||||||
@ -365,17 +365,17 @@ strcpy_unalign5:
|
|||||||
sub ip, r3, #0x01010101
|
sub ip, r3, #0x01010101
|
||||||
bic ip, ip, r3
|
bic ip, ip, r3
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne strcpy_zero_in_second_register
|
bne .L_strcpy_zero_in_second_register
|
||||||
|
|
||||||
strd r2, r3, [r0], #8
|
strd r2, r3, [r0], #8
|
||||||
b strcpy_unalign5
|
b .L_strcpy_unalign5
|
||||||
|
|
||||||
strcpy_unalign_copy5bytes:
|
.L_strcpy_unalign_copy5bytes:
|
||||||
str r2, [r0], #4
|
str r2, [r0], #4
|
||||||
strb r4, [r0]
|
strb r4, [r0]
|
||||||
m_pop
|
m_pop
|
||||||
|
|
||||||
strcpy_unalign_copy6bytes:
|
.L_strcpy_unalign_copy6bytes:
|
||||||
str r2, [r0], #4
|
str r2, [r0], #4
|
||||||
strb r4, [r0], #1
|
strb r4, [r0], #1
|
||||||
strb r5, [r0]
|
strb r5, [r0]
|
||||||
@ -383,13 +383,13 @@ strcpy_unalign_copy6bytes:
|
|||||||
|
|
||||||
.p2align 2
|
.p2align 2
|
||||||
// Can read 4 bytes before possibly crossing a page.
|
// Can read 4 bytes before possibly crossing a page.
|
||||||
strcpy_unalign4:
|
.L_strcpy_unalign4:
|
||||||
ldr r2, [r1], #4
|
ldr r2, [r1], #4
|
||||||
|
|
||||||
sub ip, r2, #0x01010101
|
sub ip, r2, #0x01010101
|
||||||
bic ip, ip, r2
|
bic ip, ip, r2
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne strcpy_zero_in_first_register
|
bne .L_strcpy_zero_in_first_register
|
||||||
|
|
||||||
ldr r3, [r1], #4
|
ldr r3, [r1], #4
|
||||||
pld [r1, #64]
|
pld [r1, #64]
|
||||||
@ -397,20 +397,20 @@ strcpy_unalign4:
|
|||||||
sub ip, r3, #0x01010101
|
sub ip, r3, #0x01010101
|
||||||
bic ip, ip, r3
|
bic ip, ip, r3
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne strcpy_zero_in_second_register
|
bne .L_strcpy_zero_in_second_register
|
||||||
|
|
||||||
strd r2, r3, [r0], #8
|
strd r2, r3, [r0], #8
|
||||||
b strcpy_unalign4
|
b .L_strcpy_unalign4
|
||||||
|
|
||||||
.p2align 2
|
.p2align 2
|
||||||
// Can read 3 bytes before possibly crossing a page.
|
// Can read 3 bytes before possibly crossing a page.
|
||||||
strcpy_unalign3:
|
.L_strcpy_unalign3:
|
||||||
ldrb r2, [r1]
|
ldrb r2, [r1]
|
||||||
cbz r2, strcpy_unalign3_copy1byte
|
cbz r2, .L_strcpy_unalign3_copy1byte
|
||||||
ldrb r3, [r1, #1]
|
ldrb r3, [r1, #1]
|
||||||
cbz r3, strcpy_unalign3_copy2bytes
|
cbz r3, .L_strcpy_unalign3_copy2bytes
|
||||||
ldrb r4, [r1, #2]
|
ldrb r4, [r1, #2]
|
||||||
cbz r4, strcpy_unalign3_copy3bytes
|
cbz r4, .L_strcpy_unalign3_copy3bytes
|
||||||
|
|
||||||
ldr r2, [r1], #4
|
ldr r2, [r1], #4
|
||||||
ldr r3, [r1], #4
|
ldr r3, [r1], #4
|
||||||
@ -418,26 +418,26 @@ strcpy_unalign3:
|
|||||||
pld [r1, #64]
|
pld [r1, #64]
|
||||||
|
|
||||||
lsrs lr, r2, #24
|
lsrs lr, r2, #24
|
||||||
beq strcpy_copy4bytes
|
beq .L_strcpy_copy4bytes
|
||||||
|
|
||||||
sub ip, r3, #0x01010101
|
sub ip, r3, #0x01010101
|
||||||
bic ip, ip, r3
|
bic ip, ip, r3
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne strcpy_zero_in_second_register
|
bne .L_strcpy_zero_in_second_register
|
||||||
|
|
||||||
strd r2, r3, [r0], #8
|
strd r2, r3, [r0], #8
|
||||||
b strcpy_unalign3
|
b .L_strcpy_unalign3
|
||||||
|
|
||||||
strcpy_unalign3_copy1byte:
|
.L_strcpy_unalign3_copy1byte:
|
||||||
strb r2, [r0]
|
strb r2, [r0]
|
||||||
m_pop
|
m_pop
|
||||||
|
|
||||||
strcpy_unalign3_copy2bytes:
|
.L_strcpy_unalign3_copy2bytes:
|
||||||
strb r2, [r0], #1
|
strb r2, [r0], #1
|
||||||
strb r3, [r0]
|
strb r3, [r0]
|
||||||
m_pop
|
m_pop
|
||||||
|
|
||||||
strcpy_unalign3_copy3bytes:
|
.L_strcpy_unalign3_copy3bytes:
|
||||||
strb r2, [r0], #1
|
strb r2, [r0], #1
|
||||||
strb r3, [r0], #1
|
strb r3, [r0], #1
|
||||||
strb r4, [r0]
|
strb r4, [r0]
|
||||||
@ -445,34 +445,34 @@ strcpy_unalign3_copy3bytes:
|
|||||||
|
|
||||||
.p2align 2
|
.p2align 2
|
||||||
// Can read 2 bytes before possibly crossing a page.
|
// Can read 2 bytes before possibly crossing a page.
|
||||||
strcpy_unalign2:
|
.L_strcpy_unalign2:
|
||||||
ldrb r2, [r1]
|
ldrb r2, [r1]
|
||||||
cbz r2, strcpy_unalign_copy1byte
|
cbz r2, .L_strcpy_unalign_copy1byte
|
||||||
ldrb r4, [r1, #1]
|
ldrb r4, [r1, #1]
|
||||||
cbz r4, strcpy_unalign_copy2bytes
|
cbz r4, .L_strcpy_unalign_copy2bytes
|
||||||
|
|
||||||
ldr r2, [r1], #4
|
ldr r2, [r1], #4
|
||||||
ldr r3, [r1], #4
|
ldr r3, [r1], #4
|
||||||
pld [r1, #64]
|
pld [r1, #64]
|
||||||
|
|
||||||
tst r2, #0xff0000
|
tst r2, #0xff0000
|
||||||
beq strcpy_copy3bytes
|
beq .L_strcpy_copy3bytes
|
||||||
lsrs ip, r2, #24
|
lsrs ip, r2, #24
|
||||||
beq strcpy_copy4bytes
|
beq .L_strcpy_copy4bytes
|
||||||
|
|
||||||
sub ip, r3, #0x01010101
|
sub ip, r3, #0x01010101
|
||||||
bic ip, ip, r3
|
bic ip, ip, r3
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne strcpy_zero_in_second_register
|
bne .L_strcpy_zero_in_second_register
|
||||||
|
|
||||||
strd r2, r3, [r0], #8
|
strd r2, r3, [r0], #8
|
||||||
b strcpy_unalign2
|
b .L_strcpy_unalign2
|
||||||
|
|
||||||
.p2align 2
|
.p2align 2
|
||||||
// Can read 1 byte before possibly crossing a page.
|
// Can read 1 byte before possibly crossing a page.
|
||||||
strcpy_unalign1:
|
.L_strcpy_unalign1:
|
||||||
ldrb r2, [r1]
|
ldrb r2, [r1]
|
||||||
cbz r2, strcpy_unalign_copy1byte
|
cbz r2, .L_strcpy_unalign_copy1byte
|
||||||
|
|
||||||
ldr r2, [r1], #4
|
ldr r2, [r1], #4
|
||||||
ldr r3, [r1], #4
|
ldr r3, [r1], #4
|
||||||
@ -482,27 +482,27 @@ strcpy_unalign1:
|
|||||||
sub ip, r2, #0x01010101
|
sub ip, r2, #0x01010101
|
||||||
bic ip, ip, r2
|
bic ip, ip, r2
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne strcpy_zero_in_first_register
|
bne .L_strcpy_zero_in_first_register
|
||||||
|
|
||||||
sub ip, r3, #0x01010101
|
sub ip, r3, #0x01010101
|
||||||
bic ip, ip, r3
|
bic ip, ip, r3
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne strcpy_zero_in_second_register
|
bne .L_strcpy_zero_in_second_register
|
||||||
|
|
||||||
strd r2, r3, [r0], #8
|
strd r2, r3, [r0], #8
|
||||||
b strcpy_unalign1
|
b .L_strcpy_unalign1
|
||||||
|
|
||||||
strcpy_unalign_copy1byte:
|
.L_strcpy_unalign_copy1byte:
|
||||||
strb r2, [r0]
|
strb r2, [r0]
|
||||||
m_pop
|
m_pop
|
||||||
|
|
||||||
strcpy_unalign_copy2bytes:
|
.L_strcpy_unalign_copy2bytes:
|
||||||
strb r2, [r0], #1
|
strb r2, [r0], #1
|
||||||
strb r4, [r0]
|
strb r4, [r0]
|
||||||
m_pop
|
m_pop
|
||||||
|
|
||||||
.p2align 2
|
.p2align 2
|
||||||
strcat_mainloop:
|
.L_strcat_mainloop:
|
||||||
ldrd r2, r3, [r0], #8
|
ldrd r2, r3, [r0], #8
|
||||||
|
|
||||||
pld [r0, #64]
|
pld [r0, #64]
|
||||||
@ -510,59 +510,59 @@ strcat_mainloop:
|
|||||||
sub ip, r2, #0x01010101
|
sub ip, r2, #0x01010101
|
||||||
bic ip, ip, r2
|
bic ip, ip, r2
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne strcat_zero_in_first_register
|
bne .L_strcat_zero_in_first_register
|
||||||
|
|
||||||
sub ip, r3, #0x01010101
|
sub ip, r3, #0x01010101
|
||||||
bic ip, ip, r3
|
bic ip, ip, r3
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne strcat_zero_in_second_register
|
bne .L_strcat_zero_in_second_register
|
||||||
b strcat_mainloop
|
b .L_strcat_mainloop
|
||||||
|
|
||||||
strcat_zero_in_first_register:
|
.L_strcat_zero_in_first_register:
|
||||||
// Prefetch the src now, it's going to be used soon.
|
// Prefetch the src now, it's going to be used soon.
|
||||||
pld [r1, #0]
|
pld [r1, #0]
|
||||||
lsls lr, ip, #17
|
lsls lr, ip, #17
|
||||||
bne strcat_sub8
|
bne .L_strcat_sub8
|
||||||
bcs strcat_sub7
|
bcs .L_strcat_sub7
|
||||||
lsls ip, ip, #1
|
lsls ip, ip, #1
|
||||||
bne strcat_sub6
|
bne .L_strcat_sub6
|
||||||
|
|
||||||
sub r0, r0, #5
|
sub r0, r0, #5
|
||||||
b strcat_r0_scan_done
|
b .L_strcat_r0_scan_done
|
||||||
|
|
||||||
strcat_sub8:
|
.L_strcat_sub8:
|
||||||
sub r0, r0, #8
|
sub r0, r0, #8
|
||||||
b strcat_r0_scan_done
|
b .L_strcat_r0_scan_done
|
||||||
|
|
||||||
strcat_sub7:
|
.L_strcat_sub7:
|
||||||
sub r0, r0, #7
|
sub r0, r0, #7
|
||||||
b strcat_r0_scan_done
|
b .L_strcat_r0_scan_done
|
||||||
|
|
||||||
strcat_sub6:
|
.L_strcat_sub6:
|
||||||
sub r0, r0, #6
|
sub r0, r0, #6
|
||||||
b strcat_r0_scan_done
|
b .L_strcat_r0_scan_done
|
||||||
|
|
||||||
strcat_zero_in_second_register:
|
.L_strcat_zero_in_second_register:
|
||||||
// Prefetch the src now, it's going to be used soon.
|
// Prefetch the src now, it's going to be used soon.
|
||||||
pld [r1, #0]
|
pld [r1, #0]
|
||||||
lsls lr, ip, #17
|
lsls lr, ip, #17
|
||||||
bne strcat_sub4
|
bne .L_strcat_sub4
|
||||||
bcs strcat_sub3
|
bcs .L_strcat_sub3
|
||||||
lsls ip, ip, #1
|
lsls ip, ip, #1
|
||||||
bne strcat_sub2
|
bne .L_strcat_sub2
|
||||||
|
|
||||||
sub r0, r0, #1
|
sub r0, r0, #1
|
||||||
b strcat_r0_scan_done
|
b .L_strcat_r0_scan_done
|
||||||
|
|
||||||
strcat_sub4:
|
.L_strcat_sub4:
|
||||||
sub r0, r0, #4
|
sub r0, r0, #4
|
||||||
b strcat_r0_scan_done
|
b .L_strcat_r0_scan_done
|
||||||
|
|
||||||
strcat_sub3:
|
.L_strcat_sub3:
|
||||||
sub r0, r0, #3
|
sub r0, r0, #3
|
||||||
b strcat_r0_scan_done
|
b .L_strcat_r0_scan_done
|
||||||
|
|
||||||
strcat_sub2:
|
.L_strcat_sub2:
|
||||||
sub r0, r0, #2
|
sub r0, r0, #2
|
||||||
b strcat_r0_scan_done
|
b .L_strcat_r0_scan_done
|
||||||
END(strcat)
|
END(strcat)
|
||||||
|
@ -65,38 +65,38 @@ ENTRY(strlen)
|
|||||||
mov r1, r0
|
mov r1, r0
|
||||||
|
|
||||||
ands r3, r0, #7
|
ands r3, r0, #7
|
||||||
beq mainloop
|
beq .L_mainloop
|
||||||
|
|
||||||
// Align to a double word (64 bits).
|
// Align to a double word (64 bits).
|
||||||
rsb r3, r3, #8
|
rsb r3, r3, #8
|
||||||
lsls ip, r3, #31
|
lsls ip, r3, #31
|
||||||
beq align_to_32
|
beq .L_align_to_32
|
||||||
|
|
||||||
ldrb r2, [r1], #1
|
ldrb r2, [r1], #1
|
||||||
cbz r2, update_count_and_return
|
cbz r2, .L_update_count_and_return
|
||||||
|
|
||||||
align_to_32:
|
.L_align_to_32:
|
||||||
bcc align_to_64
|
bcc .L_align_to_64
|
||||||
ands ip, r3, #2
|
ands ip, r3, #2
|
||||||
beq align_to_64
|
beq .L_align_to_64
|
||||||
|
|
||||||
ldrb r2, [r1], #1
|
ldrb r2, [r1], #1
|
||||||
cbz r2, update_count_and_return
|
cbz r2, .L_update_count_and_return
|
||||||
ldrb r2, [r1], #1
|
ldrb r2, [r1], #1
|
||||||
cbz r2, update_count_and_return
|
cbz r2, .L_update_count_and_return
|
||||||
|
|
||||||
align_to_64:
|
.L_align_to_64:
|
||||||
tst r3, #4
|
tst r3, #4
|
||||||
beq mainloop
|
beq .L_mainloop
|
||||||
ldr r3, [r1], #4
|
ldr r3, [r1], #4
|
||||||
|
|
||||||
sub ip, r3, #0x01010101
|
sub ip, r3, #0x01010101
|
||||||
bic ip, ip, r3
|
bic ip, ip, r3
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne zero_in_second_register
|
bne .L_zero_in_second_register
|
||||||
|
|
||||||
.p2align 2
|
.p2align 2
|
||||||
mainloop:
|
.L_mainloop:
|
||||||
ldrd r2, r3, [r1], #8
|
ldrd r2, r3, [r1], #8
|
||||||
|
|
||||||
pld [r1, #64]
|
pld [r1, #64]
|
||||||
@ -104,62 +104,62 @@ mainloop:
|
|||||||
sub ip, r2, #0x01010101
|
sub ip, r2, #0x01010101
|
||||||
bic ip, ip, r2
|
bic ip, ip, r2
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne zero_in_first_register
|
bne .L_zero_in_first_register
|
||||||
|
|
||||||
sub ip, r3, #0x01010101
|
sub ip, r3, #0x01010101
|
||||||
bic ip, ip, r3
|
bic ip, ip, r3
|
||||||
ands ip, ip, #0x80808080
|
ands ip, ip, #0x80808080
|
||||||
bne zero_in_second_register
|
bne .L_zero_in_second_register
|
||||||
b mainloop
|
b .L_mainloop
|
||||||
|
|
||||||
update_count_and_return:
|
.L_update_count_and_return:
|
||||||
sub r0, r1, r0
|
sub r0, r1, r0
|
||||||
sub r0, r0, #1
|
sub r0, r0, #1
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
zero_in_first_register:
|
.L_zero_in_first_register:
|
||||||
sub r0, r1, r0
|
sub r0, r1, r0
|
||||||
lsls r3, ip, #17
|
lsls r3, ip, #17
|
||||||
bne sub8_and_return
|
bne .L_sub8_and_return
|
||||||
bcs sub7_and_return
|
bcs .L_sub7_and_return
|
||||||
lsls ip, ip, #1
|
lsls ip, ip, #1
|
||||||
bne sub6_and_return
|
bne .L_sub6_and_return
|
||||||
|
|
||||||
sub r0, r0, #5
|
sub r0, r0, #5
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
sub8_and_return:
|
.L_sub8_and_return:
|
||||||
sub r0, r0, #8
|
sub r0, r0, #8
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
sub7_and_return:
|
.L_sub7_and_return:
|
||||||
sub r0, r0, #7
|
sub r0, r0, #7
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
sub6_and_return:
|
.L_sub6_and_return:
|
||||||
sub r0, r0, #6
|
sub r0, r0, #6
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
zero_in_second_register:
|
.L_zero_in_second_register:
|
||||||
sub r0, r1, r0
|
sub r0, r1, r0
|
||||||
lsls r3, ip, #17
|
lsls r3, ip, #17
|
||||||
bne sub4_and_return
|
bne .L_sub4_and_return
|
||||||
bcs sub3_and_return
|
bcs .L_sub3_and_return
|
||||||
lsls ip, ip, #1
|
lsls ip, ip, #1
|
||||||
bne sub2_and_return
|
bne .L_sub2_and_return
|
||||||
|
|
||||||
sub r0, r0, #1
|
sub r0, r0, #1
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
sub4_and_return:
|
.L_sub4_and_return:
|
||||||
sub r0, r0, #4
|
sub r0, r0, #4
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
sub3_and_return:
|
.L_sub3_and_return:
|
||||||
sub r0, r0, #3
|
sub r0, r0, #3
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
sub2_and_return:
|
.L_sub2_and_return:
|
||||||
sub r0, r0, #2
|
sub r0, r0, #2
|
||||||
bx lr
|
bx lr
|
||||||
END(strlen)
|
END(strlen)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user