blob: 0fa339f084a7e8ec236b867cf090164f6325e76b [file] [log] [blame]
Nicolas Capens0bac2852016-05-07 06:09:58 -04001// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
John Bauman89401822014-05-06 15:04:28 -04002//
Nicolas Capens0bac2852016-05-07 06:09:58 -04003// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
John Bauman89401822014-05-06 15:04:28 -04006//
Nicolas Capens0bac2852016-05-07 06:09:58 -04007// http://www.apache.org/licenses/LICENSE-2.0
John Bauman89401822014-05-06 15:04:28 -04008//
Nicolas Capens0bac2852016-05-07 06:09:58 -04009// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
John Bauman89401822014-05-06 15:04:28 -040014
15#include "Timer.hpp"
16
Nicolas Capens47dc8672017-04-25 12:54:39 -040017#if !defined(__i386__) && defined(_M_IX86)
18 #define __i386__ 1
19#endif
20
21#if !defined(__x86_64__) && (defined(_M_AMD64) || defined (_M_X64))
22 #define __x86_64__ 1
23#endif
24
John Bauman66b8ab22014-05-06 15:57:45 -040025#if defined(_WIN32)
26 #ifndef WIN32_LEAN_AND_MEAN
27 #define WIN32_LEAN_AND_MEAN
28 #endif
29 #include <windows.h>
Alexis Hetu61e8bb12016-08-31 17:10:36 -040030 #include <intrin.h>
John Bauman66b8ab22014-05-06 15:57:45 -040031#else
32 #include <sys/time.h>
Nicolas Capens47dc8672017-04-25 12:54:39 -040033 #if defined(__i386__) || defined(__x86_64__)
34 #include <x86intrin.h>
35 #endif
John Bauman89401822014-05-06 15:04:28 -040036#endif
John Bauman89401822014-05-06 15:04:28 -040037
John Bauman89401822014-05-06 15:04:28 -040038namespace sw
39{
40 Timer::Timer()
41 {
42 }
43
44 Timer::~Timer()
45 {
46 }
47
48 double Timer::seconds()
49 {
John Bauman66b8ab22014-05-06 15:57:45 -040050 #if defined(_WIN32)
51 return (double)counter() / (double)frequency();
52 #else
53 timeval t;
54 gettimeofday(&t, 0);
55 return (double)t.tv_sec + (double)t.tv_usec * 1.0e-6;
56 #endif
John Bauman89401822014-05-06 15:04:28 -040057 }
58
59 int64_t Timer::ticks()
60 {
John Bauman66b8ab22014-05-06 15:57:45 -040061 #if defined(_WIN32)
Tom Tanf6d56f12019-01-02 22:01:55 -080062 #if defined(_M_ARM64)
63 return _ReadStatusReg(ARM64_PMCCNTR_EL0);
64 #else
65 return __rdtsc();
66 #endif
Nicolas Capens47dc8672017-04-25 12:54:39 -040067 #elif defined(__i386__) || defined(__x86_64__)
Jeff Muizelaar221a2742019-07-13 21:06:29 -040068 return __builtin_ia32_rdtsc();
Nicolas Capens47dc8672017-04-25 12:54:39 -040069 #else
70 return 0;
John Bauman66b8ab22014-05-06 15:57:45 -040071 #endif
John Bauman89401822014-05-06 15:04:28 -040072 }
73
74 int64_t Timer::counter()
75 {
John Bauman66b8ab22014-05-06 15:57:45 -040076 #if defined(_WIN32)
77 int64_t counter;
78 QueryPerformanceCounter((LARGE_INTEGER*)&counter);
79 return counter;
80 #else
81 timeval t;
82 gettimeofday(&t, 0);
83 return t.tv_sec * 1000000 + t.tv_usec;
84 #endif
John Bauman89401822014-05-06 15:04:28 -040085 }
86
87 int64_t Timer::frequency()
88 {
John Bauman66b8ab22014-05-06 15:57:45 -040089 #if defined(_WIN32)
90 int64_t frequency;
91 QueryPerformanceFrequency((LARGE_INTEGER*)&frequency);
92 return frequency;
93 #else
94 return 1000000; // gettimeofday uses microsecond resolution
95 #endif
John Bauman89401822014-05-06 15:04:28 -040096 }
97}