77 lines
1.3 KiB
ArmAsm
77 lines
1.3 KiB
ArmAsm
// System, string-primitive and x87 families: flag register moves, the
|
|
// serialising instructions, MOVS/STOS, the MXCSR pair, scalar float-to-int
|
|
// conversions and FMOVD. Every result is folded back so no instruction is
|
|
// dead.
|
|
|
|
#include "textflag.h"
|
|
|
|
// func system(x uint64) uint64
|
|
TEXT ·system(SB), NOSPLIT, $0-16
|
|
MOVQ x+0(FP), AX
|
|
PUSHFQ
|
|
POPFQ
|
|
CPUID
|
|
RDTSC
|
|
RDTSCP
|
|
SYSCALL
|
|
XGETBV
|
|
PAUSE
|
|
LFENCE
|
|
MFENCE
|
|
SFENCE
|
|
UNDEF
|
|
XORQ AX, BX
|
|
MOVQ BX, ret+8(FP)
|
|
RET
|
|
|
|
// func stringprim(p *byte, n int) uint64
|
|
TEXT ·stringprim(SB), NOSPLIT, $0-24
|
|
MOVQ p+0(FP), DI
|
|
MOVQ n+8(FP), CX
|
|
LEAQ buf<>(SB), AX
|
|
MOVQ AX, SI
|
|
CLD
|
|
MOVSB
|
|
MOVSW
|
|
MOVSL
|
|
MOVSQ
|
|
STOSB
|
|
STOSQ
|
|
STOSL
|
|
STOSW
|
|
MOVQ DI, ret+16(FP)
|
|
RET
|
|
|
|
DATA buf<>+0x00(SB)/8, $0
|
|
|
|
GLOBL buf<>(SB), NOPTR, $8
|
|
|
|
// func intgate(x uint64) uint64
|
|
TEXT ·intgate(SB), NOSPLIT, $0-16
|
|
MOVQ x+0(FP), AX
|
|
INT $3
|
|
MOVQ AX, ret+8(FP)
|
|
RET
|
|
|
|
// func fpmxcsr(x float64, csr *uint32) int64
|
|
TEXT ·fpmxcsr(SB), NOSPLIT, $0-24
|
|
MOVQ x+0(FP), X0
|
|
MOVQ csr+8(FP), AX
|
|
STMXCSR (AX)
|
|
LDMXCSR (AX)
|
|
CVTSD2SL X0, CX
|
|
CVTTSD2SQ X0, DX
|
|
MOVL (AX), SI
|
|
MOVQ SI, ret+8(FP)
|
|
RET
|
|
|
|
// func fmove(p *float64) float64
|
|
TEXT ·fmove(SB), NOSPLIT, $0-16
|
|
MOVQ p+0(FP), AX
|
|
FMOVD (AX), F0
|
|
FMOVD F0, F1
|
|
FMOVD F0, (AX)
|
|
MOVQ (AX), AX
|
|
MOVQ AX, ret+8(FP)
|
|
RET
|