133 lines
2.1 KiB
ArmAsm
133 lines
2.1 KiB
ArmAsm
// Code generated by command: go run valid_asm.go -pkg ascii -out ../ascii/valid_amd64.s -stubs ../ascii/valid_amd64.go. DO NOT EDIT.
|
||
|
||
//go:build !purego
|
||
// +build !purego
|
||
|
||
#include "textflag.h"
|
||
|
||
// func ValidString(s string) bool
|
||
// Requires: AVX, AVX2, SSE4.1
|
||
TEXT ·ValidString(SB), NOSPLIT, $0-17
|
||
MOVQ s_base+0(FP), AX
|
||
MOVQ s_len+8(FP), CX
|
||
MOVQ $0x8080808080808080, DX
|
||
CMPQ CX, $0x10
|
||
JB cmp8
|
||
BTL $0x08, github·com∕segmentio∕asm∕cpu·X86+0(SB)
|
||
JCS init_avx
|
||
|
||
cmp8:
|
||
CMPQ CX, $0x08
|
||
JB cmp4
|
||
TESTQ DX, (AX)
|
||
JNZ invalid
|
||
ADDQ $0x08, AX
|
||
SUBQ $0x08, CX
|
||
JMP cmp8
|
||
|
||
cmp4:
|
||
CMPQ CX, $0x04
|
||
JB cmp3
|
||
TESTL $0x80808080, (AX)
|
||
JNZ invalid
|
||
ADDQ $0x04, AX
|
||
SUBQ $0x04, CX
|
||
|
||
cmp3:
|
||
CMPQ CX, $0x03
|
||
JB cmp2
|
||
MOVWLZX (AX), CX
|
||
MOVBLZX 2(AX), AX
|
||
SHLL $0x10, AX
|
||
ORL CX, AX
|
||
TESTL $0x80808080, AX
|
||
JMP done
|
||
|
||
cmp2:
|
||
CMPQ CX, $0x02
|
||
JB cmp1
|
||
TESTW $0x8080, (AX)
|
||
JMP done
|
||
|
||
cmp1:
|
||
CMPQ CX, $0x00
|
||
JE done
|
||
TESTB $0x80, (AX)
|
||
|
||
done:
|
||
SETEQ ret+16(FP)
|
||
RET
|
||
|
||
invalid:
|
||
MOVB $0x00, ret+16(FP)
|
||
RET
|
||
|
||
init_avx:
|
||
PINSRQ $0x00, DX, X4
|
||
VPBROADCASTQ X4, Y4
|
||
|
||
cmp256:
|
||
CMPQ CX, $0x00000100
|
||
JB cmp128
|
||
VMOVDQU (AX), Y0
|
||
VPOR 32(AX), Y0, Y0
|
||
VMOVDQU 64(AX), Y1
|
||
VPOR 96(AX), Y1, Y1
|
||
VMOVDQU 128(AX), Y2
|
||
VPOR 160(AX), Y2, Y2
|
||
VMOVDQU 192(AX), Y3
|
||
VPOR 224(AX), Y3, Y3
|
||
VPOR Y1, Y0, Y0
|
||
VPOR Y3, Y2, Y2
|
||
VPOR Y2, Y0, Y0
|
||
VPTEST Y0, Y4
|
||
JNZ invalid
|
||
ADDQ $0x00000100, AX
|
||
SUBQ $0x00000100, CX
|
||
JMP cmp256
|
||
|
||
cmp128:
|
||
CMPQ CX, $0x80
|
||
JB cmp64
|
||
VMOVDQU (AX), Y0
|
||
VPOR 32(AX), Y0, Y0
|
||
VMOVDQU 64(AX), Y1
|
||
VPOR 96(AX), Y1, Y1
|
||
VPOR Y1, Y0, Y0
|
||
VPTEST Y0, Y4
|
||
JNZ invalid
|
||
ADDQ $0x80, AX
|
||
SUBQ $0x80, CX
|
||
|
||
cmp64:
|
||
CMPQ CX, $0x40
|
||
JB cmp32
|
||
VMOVDQU (AX), Y0
|
||
VPOR 32(AX), Y0, Y0
|
||
VPTEST Y0, Y4
|
||
JNZ invalid
|
||
ADDQ $0x40, AX
|
||
SUBQ $0x40, CX
|
||
|
||
cmp32:
|
||
CMPQ CX, $0x20
|
||
JB cmp16
|
||
VPTEST (AX), Y4
|
||
JNZ invalid
|
||
ADDQ $0x20, AX
|
||
SUBQ $0x20, CX
|
||
|
||
cmp16:
|
||
CMPQ CX, $0x10
|
||
JLE cmp_tail
|
||
VPTEST (AX), X4
|
||
JNZ invalid
|
||
ADDQ $0x10, AX
|
||
SUBQ $0x10, CX
|
||
|
||
cmp_tail:
|
||
SUBQ $0x10, CX
|
||
ADDQ CX, AX
|
||
VPTEST (AX), X4
|
||
JMP done
|