12
12
#define SYS_clock_gettime 228
13
13
14
14
// func time.now() (sec int64, nsec int32, mono int64)
15
- TEXT time·now(SB),NOSPLIT,$16 -24
15
+ TEXT time·now<ABIInternal> (SB),NOSPLIT,$16 -24
16
16
MOVQ SP, R12 // Save old SP; R12 unchanged by C code.
17
17
18
18
MOVQ g_m(R14), BX // BX unchanged by C code.
19
19
20
- // Store CLOCK_REALTIME results directly to return space.
21
- LEAQ sec+0 (FP), SI
22
-
23
20
// Set vdsoPC and vdsoSP for SIGPROF traceback.
24
21
// Save the old values on stack and restore them on exit,
25
22
// so this function is reentrant.
@@ -28,9 +25,10 @@ TEXT time·now(SB),NOSPLIT,$16-24
28
25
MOVQ CX, 0 (SP)
29
26
MOVQ DX, 8 (SP)
30
27
31
- MOVQ -8 (SI), CX // Sets CX to function return address.
28
+ LEAQ sec+0 (FP), DX
29
+ MOVQ -8 (DX), CX // Sets CX to function return address.
32
30
MOVQ CX, m_vdsoPC(BX)
33
- MOVQ SI , m_vdsoSP(BX)
31
+ MOVQ DX , m_vdsoSP(BX)
34
32
35
33
CMPQ R14, m_curg(BX) // Only switch if on curg.
36
34
JNE noswitch
@@ -39,10 +37,11 @@ TEXT time·now(SB),NOSPLIT,$16-24
39
37
MOVQ (g_sched+gobuf_sp)(DX), SP // Set SP to g0 stack
40
38
41
39
noswitch:
42
- SUBQ $16 , SP // Space for monotonic time results
40
+ SUBQ $32 , SP // Space for two time results
43
41
ANDQ $~15 , SP // Align for C code
44
42
45
43
MOVL $0 , DI // CLOCK_REALTIME
44
+ LEAQ 16 (SP), SI
46
45
MOVQ runtime·vdsoClockgettimeSym(SB), AX
47
46
CMPQ AX, $0
48
47
JEQ fallback
@@ -54,25 +53,27 @@ noswitch:
54
53
CALL AX
55
54
56
55
ret:
57
- MOVQ 0 (SP), AX // sec
58
- MOVQ 8 (SP), DX // nsec
56
+ MOVQ 16 (SP), AX // realtime sec
57
+ MOVQ 24 (SP), DI // realtime nsec (moved to BX below)
58
+ MOVQ 0 (SP), CX // monotonic sec
59
+ IMULQ $1000000000 , CX
60
+ MOVQ 8 (SP), DX // monotonic nsec
59
61
60
62
MOVQ R12, SP // Restore real SP
63
+
61
64
// Restore vdsoPC, vdsoSP
62
65
// We don't worry about being signaled between the two stores.
63
66
// If we are not in a signal handler, we'll restore vdsoSP to 0,
64
67
// and no one will care about vdsoPC. If we are in a signal handler,
65
68
// we cannot receive another signal.
66
- MOVQ 8 (SP), CX
67
- MOVQ CX , m_vdsoSP(BX)
68
- MOVQ 0 (SP), CX
69
- MOVQ CX , m_vdsoPC(BX)
69
+ MOVQ 8 (SP), SI
70
+ MOVQ SI , m_vdsoSP(BX)
71
+ MOVQ 0 (SP), SI
72
+ MOVQ SI , m_vdsoPC(BX)
70
73
71
- // sec is in AX, nsec in DX
72
- // return nsec in AX
73
- IMULQ $1000000000 , AX
74
- ADDQ DX, AX
75
- MOVQ AX, mono+16 (FP)
74
+ // set result registers; AX is already correct
75
+ MOVQ DI, BX
76
+ ADDQ DX, CX
76
77
RET
77
78
78
79
fallback:
0 commit comments