@@ -26,6 +26,32 @@ TEXT runtime·rt0_go(SB),NOSPLIT,$0
26
26
MOVL SP, (g_stack+stack_hi)(BP)
27
27
28
28
// find out information about the processor we're on
29
+ #ifdef GOOS_nacl // NaCl doesn't like PUSHFL/POPFL
30
+ JMP has_cpuid
31
+ #else
32
+ // first see if CPUID instruction is supported.
33
+ PUSHFL
34
+ PUSHFL
35
+ XORL $(1 <<21 ), 0 (SP) // flip ID bit
36
+ POPFL
37
+ PUSHFL
38
+ POPL AX
39
+ XORL 0 (SP), AX
40
+ POPFL // restore EFLAGS
41
+ TESTL $(1 <<21 ), AX
42
+ JNE has_cpuid
43
+ #endif
44
+
45
+ bad_proc: // show that the program requires MMX.
46
+ MOVL $2 , 0 (SP)
47
+ MOVL $bad_proc_msg<>(SB), 4 (SP)
48
+ MOVL $0x3d , 8 (SP)
49
+ CALL runtime·write(SB)
50
+ MOVL $1 , 0 (SP)
51
+ CALL runtime·exit(SB)
52
+ INT $3
53
+
54
+ has_cpuid:
29
55
MOVL $0 , AX
30
56
CPUID
31
57
CMPL AX, $0
@@ -48,6 +74,11 @@ notintel:
48
74
MOVL CX, AX // Move to global variable clobbers CX when generating PIC
49
75
MOVL AX, runtime·cpuid_ecx(SB)
50
76
MOVL DX, runtime·cpuid_edx(SB)
77
+
78
+ // Check for MMX support
79
+ TESTL $(1 <<23 ), DX // MMX
80
+ JZ bad_proc
81
+
51
82
nocpuinfo:
52
83
53
84
// if there is an _cgo_init, call it to let it
129
160
INT $3
130
161
RET
131
162
163
+ DATA bad_proc_msg<>+0x00 (SB)/8 , $"This pro"
164
+ DATA bad_proc_msg<>+0x08 (SB)/8 , $"gram can"
165
+ DATA bad_proc_msg<>+0x10 (SB)/8 , $" only be"
166
+ DATA bad_proc_msg<>+0x18 (SB)/8 , $" run on "
167
+ DATA bad_proc_msg<>+0x20 (SB)/8 , $"processe"
168
+ DATA bad_proc_msg<>+0x28 (SB)/8 , $"rs with "
169
+ DATA bad_proc_msg<>+0x30 (SB)/8 , $"MMX supp"
170
+ DATA bad_proc_msg<>+0x38 (SB)/4 , $"ort."
171
+ DATA bad_proc_msg<>+0x3c (SB)/1 , $0xa
172
+ GLOBL bad_proc_msg<>(SB), RODATA, $0x3d
173
+
132
174
DATA runtime·mainPC+0 (SB)/4 ,$runtime·main(SB)
133
175
GLOBL runtime·mainPC(SB),RODATA,$4
134
176
0 commit comments