Linux GNU 11.4.0 Code Coverage Report


Directory: ./
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 0.0% 0 / 0 / 46
Functions: 0.0% 0 / 0 / 16
Branches: 0.0% 0 / 0 / 16

OMCompiler/SimulationRuntime/cpp/Core/Utils/extension/measure_time_rdtsc.cpp
Line Branch Exec Source
1 /*
2 * This file belongs to the OpenModelica Run-Time System
3 *
4 * Copyright (c) 1998-2026, Open Source Modelica Consortium (OSMC), c/o Linköpings
5 * universitet, Department of Computer and Information Science, SE-58183 Linköping, Sweden. All rights
6 * reserved.
7 *
8 * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF THE BSD NEW LICENSE OR THE
9 * AGPL VERSION 3 LICENSE OR THE OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8. ANY
10 * USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES RECIPIENT'S
11 * ACCEPTANCE OF THE BSD NEW LICENSE OR THE OSMC PUBLIC LICENSE OR THE AGPL
12 * VERSION 3, ACCORDING TO RECIPIENTS CHOICE.
13 *
14 * The OpenModelica software and the OSMC (Open Source Modelica Consortium) Public License
15 * (OSMC-PL) are obtained from OSMC, either from the above address, from the URLs:
16 * http://www.openmodelica.org or https://github.com/OpenModelica/ or
17 * http://www.ida.liu.se/projects/OpenModelica, and in the OpenModelica distribution. GNU
18 * AGPL version 3 is obtained from: https://www.gnu.org/licenses/licenses.html#GPL. The BSD NEW
19 * License is obtained from: http://www.opensource.org/licenses/BSD-3-Clause.
20 *
21 * This program is distributed WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY
23 * SET FORTH IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF
24 * OSMC-PL.
25 *
26 */
27
28 #include <Core/ModelicaDefine.h>
29 #include <Core/Modelica.h>
30 #include <Core/Utils/extension/measure_time_rdtsc.hpp>
31
32 ✗ MeasureTimeValuesRDTSC::MeasureTimeValuesRDTSC(unsigned long long time) : MeasureTimeValues(), _time(time), _maxTime(time) {}
33
34 ✗ MeasureTimeValuesRDTSC::MeasureTimeValuesRDTSC(const MeasureTimeValuesRDTSC &timeValues) : MeasureTimeValues(timeValues), _time(timeValues._time), _maxTime(timeValues._maxTime) {}
35
36 ✗ MeasureTimeValuesRDTSC::~MeasureTimeValuesRDTSC() {}
37
38 ✗ std::string MeasureTimeValuesRDTSC::serializeToJson() const
39 {
40 ✗ std::stringstream ss;
41 ✗ ss << "\"ncall\":" << _numCalcs << ",\"time\":" << _time << ",\"maxTime\":" << _maxTime << ",\"meanTime\":" << (_numCalcs == 0 ? 0 : _time/_numCalcs);
42 ✗ return ss.str();
43 ✗ }
44
45 ✗ void MeasureTimeValuesRDTSC::add(MeasureTimeValues *values)
46 {
47 MeasureTimeValuesRDTSC *val = static_cast<MeasureTimeValuesRDTSC*>(values);
48 ✗ _time += val->_time;
49
50 ✗ if( val->_time > _maxTime )
51 ✗ _maxTime = val->_time;
52 ✗ }
53
54 ✗ void MeasureTimeValuesRDTSC::sub(MeasureTimeValues *values)
55 {
56 MeasureTimeValuesRDTSC *val = static_cast<MeasureTimeValuesRDTSC*>(values);
57 ✗ if(_time > val->_time)
58 ✗ _time -= val->_time;
59 else
60 ✗ _time = 0ull;
61 ✗ }
62
63 ✗ void MeasureTimeValuesRDTSC::div(int counter)
64 {
65 ✗ _time = _time / counter;
66 ✗ }
67
68 ✗ MeasureTimeValuesRDTSC* MeasureTimeValuesRDTSC::clone() const
69 {
70 ✗ return new MeasureTimeValuesRDTSC(*this);
71 }
72
73 ✗ void MeasureTimeValuesRDTSC::reset()
74 {
75 ✗ MeasureTimeValues::reset();
76 ✗ _time = 0;
77 ✗ _maxTime = 0;
78 ✗ }
79
80 ✗ MeasureTimeRDTSC::MeasureTimeRDTSC() : MeasureTime()
81 {
82 ✗ }
83
84 ✗ MeasureTimeRDTSC::~MeasureTimeRDTSC()
85 {
86 ✗ }
87
88 ✗ void MeasureTimeRDTSC::initializeThread(unsigned long int threadNumber)
89 {
90
91 ✗ }
92
93 ✗ void MeasureTimeRDTSC::deinitializeThread()
94 {
95
96 ✗ }
97
98 ✗ void MeasureTimeRDTSC::getTimeValuesStartP(MeasureTimeValues *res) const
99 {
100 MeasureTimeValuesRDTSC *val = static_cast<MeasureTimeValuesRDTSC*>(res);
101 unsigned long long time = RDTSC();
102 ✗ val->_time = time;
103 ✗ }
104
105 ✗ void MeasureTimeRDTSC::getTimeValuesEndP(MeasureTimeValues *res) const
106 {
107 unsigned long long time = RDTSC();
108 MeasureTimeValuesRDTSC *val = static_cast<MeasureTimeValuesRDTSC*>(res);
109 ✗ val->_time = time;
110 ✗ }
111
112 ✗ MeasureTimeValues* MeasureTimeRDTSC::getZeroValuesP() const
113 {
114 ✗ return new MeasureTimeValuesRDTSC(0ull);
115 }
116
117 #if defined(_MSC_VER)
118
119 #if defined(__i386__) || defined(__x86_64__)
120 unsigned long long MeasureTimeRDTSC::RDTSC()
121 {
122 return _rdtsc();
123 }
124 #else
125 unsigned long long MeasureTimeRDTSC::RDTSC()
126 {
127 throw ModelicaSimulationError(UTILITY,"No time measurement for this processor arch.");
128 return 0;
129 }
130 #endif // defined(__i386__) || defined(__x86_64__)
131 #else
132 #if defined(__x86_64__)
133 unsigned long long MeasureTimeRDTSC::RDTSC()
134 {
135 unsigned hi, lo;
136 ✗ __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
137 ✗ return ((unsigned long long) lo) | (((unsigned long long) hi) << 32);
138 }
139 #elif defined(__i386__)
140 unsigned long long MeasureTimeRDTSC::RDTSC()
141 {
142 unsigned long long res;
143 asm volatile (".byte 0x0f, 0x31" : "=A" (res));
144 return res;
145 }
146 #else
147 unsigned long long MeasureTimeRDTSC::RDTSC()
148 {
149 throw ModelicaSimulationError(UTILITY,"No time measurement for this processor arch.");
150 return 0;
151 }
152
153 #endif //defined(__i386__)
154
155 #endif //defined(_MSC_VER)
156