40 lines
817 B
ArmAsm
40 lines
817 B
ArmAsm
// Mixed-width sign- and zero-extending moves plus PMOVMSKB, the spellings
|
|
// GOROOT's runtime and bytealg kernels use. Every result is folded back so
|
|
// no instruction is dead.
|
|
|
|
#include "textflag.h"
|
|
|
|
// func widen(p *byte) uint64
|
|
TEXT ·widen(SB), NOSPLIT, $0-16
|
|
MOVBQZX 0(DI), AX
|
|
MOVWQZX 2(DI), CX
|
|
ADDQ CX, AX
|
|
MOVLQZX 4(DI), DX
|
|
ADDQ DX, AX
|
|
MOVBQSX 8(DI), R8
|
|
ADDQ R8, AX
|
|
MOVWQSX 12(DI), R9
|
|
ADDQ R9, AX
|
|
MOVBLSX 16(DI), R10
|
|
ADDL R10, AX
|
|
MOVLQSX 20(DI), R11
|
|
ADDQ R11, AX
|
|
MOVQ AX, ret+8(FP)
|
|
RET
|
|
|
|
// func widenw(p *byte) int32
|
|
TEXT ·widenw(SB), NOSPLIT, $0-16
|
|
MOVBWZX 0(DI), AX
|
|
MOVBWSX 1(DI), CX
|
|
ADDL CX, AX
|
|
MOVLQZX AX, DX
|
|
MOVL DX, ret+8(FP)
|
|
RET
|
|
|
|
// func mask(x *XMM) int
|
|
TEXT ·mask(SB), NOSPLIT, $0-16
|
|
MOVOU 0(DI), X1
|
|
PMOVMSKB X1, AX
|
|
MOVQ AX, ret+8(FP)
|
|
RET
|