function Pos(constref Buf: AnsiChar; C: AnsiChar; Count: SizeUInt): SizeUInt;assembler;nostackframe;
asm
mov x8,x0
bic x3,x0,#15
sub x8,x8,#1
ld1 {v1.16b},[x3]
dup v0.16b,w1
cmeq v2.16b,v1.16b,v0.16b
lsl x6,x0,#2
.byte 67,132,12,15 //shrn v3.8b,v2.8h,#4
fmov x5,d3 //synd,dend
lsr x5,x5,x6 //synd, synd, shift
cbz x5,.LStartLoop
rbit x5,x5
clz x5,x5
cmp x2,x5,lsr #2
add x0,x0,x5,lsr #2
csel x0,x0,xzr,hi
b .LMatch
.LStartLoop:
sub x7,x3,x0 //tmp, src, srcin
add x7,x7,#17 //tmp, tmp, 17
subs x4,x2,x7 //cntrem, cntin, tmp
b.lo .Lnomatch
tbz x4,#4,.Lloop32_2 //cntrem, 4, L(loop32_2)
sub x3,x3,#16 //src, src, 16
.Lloop32:
ldr q1,[x3,#32]! //qdata, [src, 32]!
cmeq v2.16b,v1.16b,v0.16b //vhas_chr.16b, vdata.16b, vrepchr.16b
umaxp v3.16b,v2.16b,v2.16b //vend.16b, vhas_chr.16b, vhas_chr.16b
fmov x5,d3 //synd, dend
cbnz x5,.Lend
.Lloop32_2:
ldr q1,[x3,#16] //qdata, [src, 16]
cmeq v2.16b,v1.16b,v0.16b //vhas_chr.16b, vdata.16b, vrepchr.16b
subs x4,x4,#32
b.lo .Lend2
umaxp v3.16b,v2.16b,v2.16b //vend.16b, vhas_chr.16b, vhas_chr.16b
fmov x5,d3 //synd, dend
cbz x5,.Lloop32
.Lend2:
add x3,x3,#16 //src, src, 16
.Lend:
.byte 67,132,12,15 //shrn v3.8b,v2.8h,#4
sub x4,x3,x0 //cntrem, src, srcin
fmov x5,d3 //synd, dend
sub x4,x2,x4 //cntrem, cntin, cntrem
clz x5,x5 //synd, synd
cmp x4,x5,lsr #2 //cntrem, synd, lsr 2
add x0,x3,x5,lsr #2 //result, src, synd, lsr 2
csel x0,x0,xzr,hi //result, result, xzr, hi
b .LMatch
.Lnomatch:
mov Result,x8
.LMatch:
sub Result,Result,x8
end;