...

Text file src/runtime/time_windows_386.s

Documentation: runtime

     1// Copyright 2009 The Go Authors. All rights reserved.
     2// Use of this source code is governed by a BSD-style
     3// license that can be found in the LICENSE file.
     4
     5//go:build !faketime
     6
     7#include "go_asm.h"
     8#include "textflag.h"
     9#include "time_windows.h"
    10
    11TEXT time·now(SB),NOSPLIT,$0-20
    12loop:
    13	MOVL	(_INTERRUPT_TIME+time_hi1), AX
    14	MOVL	(_INTERRUPT_TIME+time_lo), CX
    15	MOVL	(_INTERRUPT_TIME+time_hi2), DI
    16	CMPL	AX, DI
    17	JNE	loop
    18
    19	// w = DI:CX
    20	// multiply by 100
    21	MOVL	$100, AX
    22	MULL	CX
    23	IMULL	$100, DI
    24	ADDL	DI, DX
    25	// w*100 = DX:AX
    26	MOVL	AX, mono+12(FP)
    27	MOVL	DX, mono+16(FP)
    28
    29wall:
    30	MOVL	(_SYSTEM_TIME+time_hi1), CX
    31	MOVL	(_SYSTEM_TIME+time_lo), AX
    32	MOVL	(_SYSTEM_TIME+time_hi2), DX
    33	CMPL	CX, DX
    34	JNE	wall
    35
    36	// w = DX:AX
    37	// convert to Unix epoch (but still 100ns units)
    38	#define delta 116444736000000000
    39	SUBL	$(delta & 0xFFFFFFFF), AX
    40	SBBL $(delta >> 32), DX
    41
    42	// nano/100 = DX:AX
    43	// split into two decimal halves by div 1e9.
    44	// (decimal point is two spots over from correct place,
    45	// but we avoid overflow in the high word.)
    46	MOVL	$1000000000, CX
    47	DIVL	CX
    48	MOVL	AX, DI
    49	MOVL	DX, SI
    50
    51	// DI = nano/100/1e9 = nano/1e11 = sec/100, DX = SI = nano/100%1e9
    52	// split DX into seconds and nanoseconds by div 1e7 magic multiply.
    53	MOVL	DX, AX
    54	MOVL	$1801439851, CX
    55	MULL	CX
    56	SHRL	$22, DX
    57	MOVL	DX, BX
    58	IMULL	$10000000, DX
    59	MOVL	SI, CX
    60	SUBL	DX, CX
    61
    62	// DI = sec/100 (still)
    63	// BX = (nano/100%1e9)/1e7 = (nano/1e9)%100 = sec%100
    64	// CX = (nano/100%1e9)%1e7 = (nano%1e9)/100 = nsec/100
    65	// store nsec for return
    66	IMULL	$100, CX
    67	MOVL	CX, nsec+8(FP)
    68
    69	// DI = sec/100 (still)
    70	// BX = sec%100
    71	// construct DX:AX = 64-bit sec and store for return
    72	MOVL	$0, DX
    73	MOVL	$100, AX
    74	MULL	DI
    75	ADDL	BX, AX
    76	ADCL	$0, DX
    77	MOVL	AX, sec+0(FP)
    78	MOVL	DX, sec+4(FP)
    79	RET

View as plain text