| // Copyright 2018 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| //go:build !faketime | |
| #include "go_asm.h" | |
| #include "textflag.h" | |
| #include "time_windows.h" | |
| TEXT time·now(SB),NOSPLIT,$0-24 | |
| MOVD $_INTERRUPT_TIME, R3 | |
| MOVD time_lo(R3), R0 | |
| MOVD $100, R1 | |
| MUL R1, R0 | |
| MOVD R0, mono+16(FP) | |
| MOVD $_SYSTEM_TIME, R3 | |
| MOVD time_lo(R3), R0 | |
| // convert to Unix epoch (but still 100ns units) | |
| #define delta 116444736000000000 | |
| SUB $delta, R0 | |
| // Convert to nSec | |
| MOVD $100, R1 | |
| MUL R1, R0 | |
| // Code stolen from compiler output for: | |
| // | |
| // var x uint64 | |
| // func f() (sec uint64, nsec uint32) { return x / 1000000000, uint32(x % 1000000000) } | |
| // | |
| LSR $1, R0, R1 | |
| MOVD $-8543223759426509416, R2 | |
| UMULH R1, R2, R1 | |
| LSR $28, R1, R1 | |
| MOVD R1, sec+0(FP) | |
| MOVD $1000000000, R2 | |
| MSUB R1, R0, R2, R0 | |
| MOVW R0, nsec+8(FP) | |
| RET | |