github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/runtime/time_windows_arm64.s (about) 1 // Copyright 2018 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 11 TEXT time·now(SB),NOSPLIT,$0-24 12 MOVB runtime·useQPCTime(SB), R0 13 CMP $0, R0 14 BNE useQPC 15 16 MOVD $_INTERRUPT_TIME, R3 17 MOVD time_lo(R3), R0 18 MOVD $100, R1 19 MUL R1, R0 20 MOVD R0, mono+16(FP) 21 22 MOVD $_SYSTEM_TIME, R3 23 MOVD time_lo(R3), R0 24 // convert to Unix epoch (but still 100ns units) 25 #define delta 116444736000000000 26 SUB $delta, R0 27 // Convert to nSec 28 MOVD $100, R1 29 MUL R1, R0 30 31 // Code stolen from compiler output for: 32 // 33 // var x uint64 34 // func f() (sec uint64, nsec uint32) { return x / 1000000000, uint32(x % 1000000000) } 35 // 36 LSR $1, R0, R1 37 MOVD $-8543223759426509416, R2 38 UMULH R1, R2, R1 39 LSR $28, R1, R1 40 MOVD R1, sec+0(FP) 41 MOVD $1000000000, R2 42 MSUB R1, R0, R2, R0 43 MOVW R0, nsec+8(FP) 44 RET 45 useQPC: 46 RET runtime·nowQPC(SB) // tail call 47