78 lines
1.5 KiB
ArmAsm
78 lines
1.5 KiB
ArmAsm
// The legacy SSE gap families: scalar compares and square roots, the Plan 9
|
|||
|
|
// packed spellings, shuffles, lane extracts and inserts, packed integer
|
||
|
|
// shifts and the octa moves. Every result is folded back so no instruction
|
||
|
|
// is dead.
|
||
|
|
|
||
|
|
#include "textflag.h"
|
||
|
|
|
||
|
|
// func cmporder(a, b *float64) int
|
||
|
|
TEXT ·cmporder(SB), NOSPLIT, $0-24
|
||
|
|
MOVQ a+0(FP), SI
|
||
|
|
MOVQ b+8(FP), DI
|
||
|
|
MOVSD (SI), X0
|
||
|
|
MOVSD (DI), X1
|
||
|
|
ANDNPD X0, X2
|
||
|
|
ANDNPS X0, X3
|
||
|
|
COMISD X0, X1
|
||
|
|
SQRTSD X0, X2
|
||
|
|
CMPSD X0, X1, $5
|
||
|
|
MOVL SI, CX
|
||
|
|
SETPL CL
|
||
|
|
MOVL CX, ret+16(FP)
|
||
|
|
RET
|
||
|
|
|
||
|
|
// func packed(w *uint64) uint64
|
||
|
|
TEXT ·packed(SB), NOSPLIT, $0-16
|
||
|
|
MOVQ w+0(FP), SI
|
||
|
|
MOVO (SI), X0
|
||
|
|
MOVOA (SI), X1
|
||
|
|
PADDL X0, X1
|
||
|
|
PSUBL X0, X1
|
||
|
|
PCMPEQL X0, X1
|
||
|
|
PUNPCKLBW X0, X1
|
||
|
|
PSHUFL $27, X0, X2
|
||
|
|
MOVOU X2, (SI)
|
||
|
|
MOVQ (SI), AX
|
||
|
|
MOVQ AX, ret+8(FP)
|
||
|
|
RET
|
||
|
|
|
||
|
|
// func lanes(p *byte, buf *byte)
|
||
|
|
TEXT ·lanes(SB), NOSPLIT, $0-16
|
||
|
|
MOVQ p+0(FP), SI
|
||
|
|
MOVQ buf+8(FP), DI
|
||
|
|
MOVO (SI), X0
|
||
|
|
MOVQ SI, AX
|
||
|
|
PINSRB $1, AX, X0
|
||
|
|
PINSRW $2, AX, X0
|
||
|
|
PINSRD $3, AX, X0
|
||
|
|
PINSRQ $1, AX, X0
|
||
|
|
PEXTRB $1, X0, AX
|
||
|
|
PEXTRW $2, X0, AX
|
||
|
|
PEXTRD $3, X0, AX
|
||
|
|
PEXTRQ $1, X0, CX
|
||
|
|
PCMPESTRI $4, X0, X0
|
||
|
|
MOVB AL, (DI)
|
||
|
|
MOVOU X0, (SI)
|
||
|
|
RET
|
||
|
|
|
||
|
|
// func shifts(p *uint64)
|
||
|
|
TEXT ·shifts(SB), NOSPLIT, $0-8
|
||
|
|
MOVQ p+0(FP), SI
|
||
|
|
MOVO (SI), X0
|
||
|
|
MOVO X0, X1
|
||
|
|
PSLLW $3, X0
|
||
|
|
PSRLW $1, X1
|
||
|
|
PSRAW $2, X0
|
||
|
|
PSLLL $4, X0
|
||
|
|
PSRLL $5, X1
|
||
|
|
PSRAL $1, X0
|
||
|
|
PSLLQ $7, X0
|
||
|
|
PSRLQ $9, X1
|
||
|
|
PSLLL X1, X0
|
||
|
|
PSRLQ X0, X1
|
||
|
|
PSLLDQ $2, X0
|
||
|
|
PSRLDQ $4, X1
|
||
|
|
MOVOU X0, (SI)
|
||
|
|
MOVOU X1, 16(SI)
|
||
|
|
RET
|