GLOBL shifts<>(SB),RODATA,$256
+TEXT ·checkASM(SB),NOSPLIT,$0-1
+ // check that masks<>(SB) and shifts<>(SB) are aligned to 16-byte
+ MOVL $masks<>(SB), AX
+ MOVL $shifts<>(SB), BX
+ ORL BX, AX
+ TESTL $15, AX
+ SETEQ ret+0(FP)
+ RET
+
TEXT runtime·memeq(SB),NOSPLIT,$0-13
MOVL a+0(FP), SI
MOVL b+4(FP), DI
DATA masks<>+0xf8(SB)/8, $0x00ffffffffffffff
GLOBL masks<>(SB),RODATA,$256
+TEXT ·checkASM(SB),NOSPLIT,$0-1
+ // check that masks<>(SB) and shifts<>(SB) are aligned to 16-byte
+ MOVQ $masks<>(SB), AX
+ MOVQ $shifts<>(SB), BX
+ ORQ BX, AX
+ TESTQ $15, AX
+ SETEQ ret+0(FP)
+ RET
+
// these are arguments to pshufb. They move data down from
// the high bytes of the register to the low bytes of the register.
// index is how many bytes to move.
MOVL addr+0(FP), AX
PREFETCHNTA (AX)
RET
+
+TEXT ·checkASM(SB),NOSPLIT,$0-1
+ MOVB $1, ret+0(FP)
+ RET
MOVW saver9-4(SP), R9
RET
#endif
+
+TEXT ·checkASM(SB),NOSPLIT,$0-1
+ MOVW $1, R3
+ MOVB R3, ret+0(FP)
+ RET
MOVD R0, runtime·lastmoduledatap(SB)
MOVD 8(RSP), R27
ADD $0x10, RSP
+
+TEXT ·checkASM(SB),NOSPLIT,$0-1
+ MOVW $1, R3
+ MOVB R3, ret+0(FP)
RET
TEXT runtime·prefetchnta(SB),NOSPLIT,$0-8
RET
+
+TEXT ·checkASM(SB),NOSPLIT,$0-1
+ MOVW $1, R1
+ MOVB R1, ret+0(FP)
+ RET
MOVD R3, runtime·lastmoduledatap(SB)
MOVD 0(R1), R31
ADD $8, R1
+
+TEXT ·checkASM(SB),NOSPLIT,$0-1
+ MOVW $1, R3
+ MOVB R3, ret+0(FP)
RET
if _FixedStack != round2(_FixedStack) {
throw("FixedStack is not power-of-2")
}
+
+ if !checkASM() {
+ throw("assembly checks failed")
+ }
}
type dbgVar struct {
func round(n, a uintptr) uintptr {
return (n + a - 1) &^ (a - 1)
}
+
+// checkASM returns whether assembly runtime checks have passed.
+func checkASM() bool