package crc32
+import "internal/cpu"
+
const (
vxMinLen = 64
vxAlignMask = 15 // align to 16 bytes
)
-// hasVectorFacility reports whether the machine has the z/Architecture
+// hasVX reports whether the machine has the z/Architecture
// vector facility installed and enabled.
-func hasVectorFacility() bool
-
-var hasVX = hasVectorFacility()
+var hasVX = cpu.S390X.HasVX
// vectorizedCastagnoli implements CRC32 using vector instructions.
// It is defined in crc32_s390x.s.
GLOBL ·crcclecons(SB),RODATA, $144
-// func hasVectorFacility() bool
-TEXT ·hasVectorFacility(SB),NOSPLIT,$24-1
- MOVD $x-24(SP), R1
- XC $24, 0(R1), 0(R1) // clear the storage
- MOVD $2, R0 // R0 is the number of double words stored -1
- WORD $0xB2B01000 // STFLE 0(R1)
- XOR R0, R0 // reset the value of R0
- MOVBZ z-8(SP), R1
- AND $0x40, R1
- BEQ novector
-vectorinstalled:
- // check if the vector instruction has been enabled
- VLEIB $0, $0xF, V16
- VLGVB $0, V16, R1
- CMPBNE R1, $0xF, novector
- MOVB $1, ret+0(FP) // have vx
- RET
-novector:
- MOVB $0, ret+0(FP) // no vx
- RET
-
-
// The CRC-32 function(s) use these calling conventions:
//
// Parameters: