36 lines
562 B
ArmAsm
36 lines
562 B
ArmAsm
// +build !appengine
|
|
// +build gc
|
|
// +build !noasm
|
|
|
|
#include "textflag.h"
|
|
#include "funcdata.h"
|
|
#include "go_asm.h"
|
|
|
|
TEXT ·x86extensions(SB), NOSPLIT, $0
|
|
// 1. determine max EAX value
|
|
XORQ AX, AX
|
|
CPUID
|
|
|
|
CMPQ AX, $7
|
|
JB unsupported
|
|
|
|
// 2. EAX = 7, ECX = 0 --- see Table 3-8 "Information Returned by CPUID Instruction"
|
|
MOVQ $7, AX
|
|
MOVQ $0, CX
|
|
CPUID
|
|
|
|
BTQ $3, BX // bit 3 = BMI1
|
|
SETCS AL
|
|
|
|
BTQ $8, BX // bit 8 = BMI2
|
|
SETCS AH
|
|
|
|
MOVB AL, bmi1+0(FP)
|
|
MOVB AH, bmi2+1(FP)
|
|
RET
|
|
|
|
unsupported:
|
|
XORQ AX, AX
|
|
MOVB AL, bmi1+0(FP)
|
|
MOVB AL, bmi2+1(FP)
|
|
RET
|