123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490 |
- #include "textflag.h"
- TEXT ·decode(SB), NOSPLIT, $48-56
-
- MOVQ dst_base+0(FP), R8
- MOVQ dst_len+8(FP), R9
- MOVQ R8, DI
- MOVQ R8, R10
- ADDQ R9, R10
- MOVQ src_base+24(FP), R11
- MOVQ src_len+32(FP), R12
- MOVQ R11, SI
- MOVQ R11, R13
- ADDQ R12, R13
- loop:
-
- CMPQ SI, R13
- JEQ end
-
-
-
- MOVBLZX (SI), CX
- MOVL CX, BX
- ANDL $3, BX
- CMPL BX, $1
- JAE tagCopy
-
-
-
-
-
- SHRL $2, CX
- CMPL CX, $60
- JAE tagLit60Plus
-
-
- INCQ SI
- doLit:
-
-
-
-
-
-
-
-
- INCQ CX
-
-
-
-
-
- MOVQ R10, AX
- SUBQ DI, AX
- MOVQ R13, BX
- SUBQ SI, BX
-
-
-
-
-
-
-
-
-
-
-
- CMPQ CX, $16
- JGT callMemmove
- CMPQ AX, $16
- JLT callMemmove
- CMPQ BX, $16
- JLT callMemmove
-
-
-
-
-
-
-
-
-
-
-
- MOVOU 0(SI), X0
- MOVOU X0, 0(DI)
-
-
- ADDQ CX, DI
- ADDQ CX, SI
- JMP loop
- callMemmove:
-
- CMPQ CX, AX
- JGT errCorrupt
- CMPQ CX, BX
- JGT errCorrupt
-
-
-
-
-
- MOVQ DI, 0(SP)
- MOVQ SI, 8(SP)
- MOVQ CX, 16(SP)
- MOVQ DI, 24(SP)
- MOVQ SI, 32(SP)
- MOVQ CX, 40(SP)
- CALL runtime·memmove(SB)
-
-
- MOVQ 24(SP), DI
- MOVQ 32(SP), SI
- MOVQ 40(SP), CX
- MOVQ dst_base+0(FP), R8
- MOVQ dst_len+8(FP), R9
- MOVQ R8, R10
- ADDQ R9, R10
- MOVQ src_base+24(FP), R11
- MOVQ src_len+32(FP), R12
- MOVQ R11, R13
- ADDQ R12, R13
-
-
- ADDQ CX, DI
- ADDQ CX, SI
- JMP loop
- tagLit60Plus:
-
-
-
-
-
- ADDQ CX, SI
- SUBQ $58, SI
- MOVQ SI, BX
- SUBQ R11, BX
- CMPQ BX, R12
- JA errCorrupt
-
- CMPL CX, $61
- JEQ tagLit61
- JA tagLit62Plus
-
- MOVBLZX -1(SI), CX
- JMP doLit
- tagLit61:
-
-
- MOVWLZX -2(SI), CX
- JMP doLit
- tagLit62Plus:
- CMPL CX, $62
- JA tagLit63
-
-
- MOVWLZX -3(SI), CX
- MOVBLZX -1(SI), BX
- SHLL $16, BX
- ORL BX, CX
- JMP doLit
- tagLit63:
-
-
- MOVL -4(SI), CX
- JMP doLit
- tagCopy4:
-
-
- ADDQ $5, SI
-
- MOVQ SI, BX
- SUBQ R11, BX
- CMPQ BX, R12
- JA errCorrupt
-
- SHRQ $2, CX
- INCQ CX
-
- MOVLQZX -4(SI), DX
- JMP doCopy
- tagCopy2:
-
-
- ADDQ $3, SI
-
- MOVQ SI, BX
- SUBQ R11, BX
- CMPQ BX, R12
- JA errCorrupt
-
- SHRQ $2, CX
- INCQ CX
-
- MOVWQZX -2(SI), DX
- JMP doCopy
- tagCopy:
-
-
-
- CMPQ BX, $2
- JEQ tagCopy2
- JA tagCopy4
-
-
- ADDQ $2, SI
-
- MOVQ SI, BX
- SUBQ R11, BX
- CMPQ BX, R12
- JA errCorrupt
-
- MOVQ CX, DX
- ANDQ $0xe0, DX
- SHLQ $3, DX
- MOVBQZX -1(SI), BX
- ORQ BX, DX
-
- SHRQ $2, CX
- ANDQ $7, CX
- ADDQ $4, CX
- doCopy:
-
-
-
-
-
-
- CMPQ DX, $0
- JLE errCorrupt
-
- MOVQ DI, BX
- SUBQ R8, BX
- CMPQ BX, DX
- JLT errCorrupt
-
- MOVQ R10, BX
- SUBQ DI, BX
- CMPQ CX, BX
- JGT errCorrupt
-
-
-
-
-
- MOVQ R10, R14
- SUBQ DI, R14
- MOVQ DI, R15
- SUBQ DX, R15
-
-
-
-
-
-
-
-
-
-
-
-
-
- CMPQ CX, $16
- JGT slowForwardCopy
- CMPQ DX, $8
- JLT slowForwardCopy
- CMPQ R14, $16
- JLT slowForwardCopy
- MOVQ 0(R15), AX
- MOVQ AX, 0(DI)
- MOVQ 8(R15), BX
- MOVQ BX, 8(DI)
- ADDQ CX, DI
- JMP loop
- slowForwardCopy:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- SUBQ $10, R14
- CMPQ CX, R14
- JGT verySlowForwardCopy
- makeOffsetAtLeast8:
-
-
-
-
-
-
-
-
-
-
-
- CMPQ DX, $8
- JGE fixUpSlowForwardCopy
- MOVQ (R15), BX
- MOVQ BX, (DI)
- SUBQ DX, CX
- ADDQ DX, DI
- ADDQ DX, DX
- JMP makeOffsetAtLeast8
- fixUpSlowForwardCopy:
-
-
-
-
-
- MOVQ DI, AX
- ADDQ CX, DI
- finishSlowForwardCopy:
-
-
-
- CMPQ CX, $0
- JLE loop
- MOVQ (R15), BX
- MOVQ BX, (AX)
- ADDQ $8, R15
- ADDQ $8, AX
- SUBQ $8, CX
- JMP finishSlowForwardCopy
- verySlowForwardCopy:
-
-
-
-
-
-
-
-
-
-
-
-
- MOVB (R15), BX
- MOVB BX, (DI)
- INCQ R15
- INCQ DI
- DECQ CX
- JNZ verySlowForwardCopy
- JMP loop
- end:
-
-
-
- CMPQ DI, R10
- JNE errCorrupt
-
- MOVQ $0, ret+48(FP)
- RET
- errCorrupt:
-
- MOVQ $1, ret+48(FP)
- RET
|