mirror of
https://github.com/boostorg/endian.git
synced 2025-07-31 13:07:24 +02:00
Work-in-progress, including various bug fixes and doc updates.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# Build endian/test/speed_test.cpp
|
||||
# Build and install benchmark programs
|
||||
|
||||
# Copyright Beman Dawes 2013
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
@@ -7,16 +7,19 @@
|
||||
project
|
||||
: source-location ../test : requirements
|
||||
<toolset>msvc:<asynch-exceptions>on
|
||||
<library>/boost/timer//boost_timer
|
||||
;
|
||||
|
||||
SOURCES = speed_test speed_test_functions ;
|
||||
|
||||
exe "speed_test"
|
||||
: $(SOURCES).cpp ../../timer/build//boost_timer
|
||||
: $(SOURCES).cpp
|
||||
: <toolset>gcc:<cxxflags>-march=native
|
||||
;
|
||||
|
||||
exe "loop_time_test"
|
||||
: loop_time_test.cpp ../../timer/build//boost_timer
|
||||
exe "loop_time_test"
|
||||
: loop_time_test.cpp
|
||||
: <toolset>gcc:<cxxflags>-march=native
|
||||
;
|
||||
|
||||
install bin : speed_test loop_time_test ;
|
||||
|
8
benchmark/test.bat
Normal file
8
benchmark/test.bat
Normal file
@@ -0,0 +1,8 @@
|
||||
b2 -a toolset=msvc-14.0 variant=release link=static address-model=64
|
||||
bin\loop_time_test 1000 >msvc-loop-time.html
|
||||
msvc-loop-time.html
|
||||
|
||||
echo The GCC build does not work, probably because of a bjam/b2 bug
|
||||
b2 -a toolset=gcc-c++11 variant=release link=static address-model=64
|
||||
bin\loop_time_test 1000 >gcc-loop-time.html
|
||||
gcc-loop-time.html
|
@@ -296,13 +296,60 @@ conversion from native to the desired output endianness.</p>
|
||||
typically used regardless of record content or other circumstances</p>
|
||||
|
||||
<h4><a name="Convert-generally-as-needed-locally-in-anticipation">Convert
|
||||
generally only as needed, but locally in anticipation of need</a></h4>
|
||||
only as needed, except locally in anticipation of need</a></h4>
|
||||
|
||||
<p>This pattern in general defers conversion but for specific local needs does
|
||||
anticipatory conversion.</p>
|
||||
anticipatory conversion. Although particularly appropriate when coupled with the endian buffer
|
||||
or arithmetic types, it also works well with the conversion functions.</p>
|
||||
|
||||
<p>This pattern is particularly appropriate when coupled with the endian buffer
|
||||
or arithmetic types.</p>
|
||||
<p>Example:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>struct data_t
|
||||
{
|
||||
big_int32_t v1;
|
||||
big_int32_t v2;
|
||||
big_int32_t v3;
|
||||
};
|
||||
|
||||
data_t data;
|
||||
|
||||
read(data);
|
||||
|
||||
...
|
||||
++v1;
|
||||
...
|
||||
|
||||
int32_t v3_temp = data.v3; // hoist conversion out of loop
|
||||
|
||||
for (int32_t i = 0; i < <i><b>large-number</b></i>; ++i)
|
||||
{
|
||||
... <i><b>lengthy computation that accesses </b></i>v3_temp<i><b> many times</b></i> ...
|
||||
}
|
||||
data.v3 = v3_temp;
|
||||
|
||||
write(data);
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p dir="ltr">In general the above pseudo-code leaves conversion up to the endian
|
||||
arithmetic type <code>big_int32_t</code>. But to avoid conversion inside the
|
||||
loop, a temporary is created before the loop is entered, and then used to set
|
||||
the new value of <code>data.v3</code> after the loop is complete.</p>
|
||||
|
||||
<blockquote>
|
||||
|
||||
<p dir="ltr">Question: Won't the compiler's optimizer hoist the conversion out
|
||||
of the loop anyhow?</p>
|
||||
|
||||
<p dir="ltr">Answer: VC++ 2015 Preview, and probably others, does not, even for
|
||||
a toy test program. Although the savings is small (two register <code>
|
||||
<span style="font-size: 85%">bswap</span></code> instructions), the cost might
|
||||
be significant if the loop is repeated enough times. On the other hand, the
|
||||
program may be so dominated by I/O time that even a lengthy loop will be
|
||||
immaterial.</p>
|
||||
|
||||
</blockquote>
|
||||
|
||||
<h3><a name="Use-cases">Use case examples</a></h3>
|
||||
|
||||
@@ -363,7 +410,7 @@ arithmetic approach</a>.</p>
|
||||
|
||||
<hr>
|
||||
<p>Last revised:
|
||||
<!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->04 January, 2015<!--webbot bot="Timestamp" endspan i-checksum="38892" --></p>
|
||||
<!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->08 January, 2015<!--webbot bot="Timestamp" endspan i-checksum="38900" --></p>
|
||||
<p>© Copyright Beman Dawes, 2011, 2013, 2014</p>
|
||||
<p>Distributed under the Boost Software License, Version 1.0. See
|
||||
<a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/ LICENSE_1_0.txt</a></p>
|
||||
|
@@ -200,6 +200,9 @@ intrinsics as a source of performance issues.</p>
|
||||
|
||||
<p>Consider this problem:</p>
|
||||
|
||||
<div align="center">
|
||||
<center>
|
||||
|
||||
<table border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
@@ -240,15 +243,20 @@ native_to_big_inplace(x);
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</center>
|
||||
</div>
|
||||
|
||||
<p><b>There will be no performance difference between the two approaches in
|
||||
release builds,
|
||||
regardless of the native endianness of the machine.</b> That's because optimizing compilers will likely
|
||||
generate exactly the same code for each. That conclusion was confirmed by
|
||||
regardless of the native endianness of the machine.</b> That's because optimizing compilers will generate exactly the same code for each. That conclusion was confirmed by
|
||||
studying the generated assembly code for GCC and Visual C++. Furthermore, time
|
||||
spent doing I/O will determine the speed of this application.</p>
|
||||
|
||||
<p>Now consider a slightly different problem: </p>
|
||||
|
||||
<div align="center">
|
||||
<center>
|
||||
|
||||
<table border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
@@ -292,6 +300,9 @@ native_to_big_inplace(x);
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</center>
|
||||
</div>
|
||||
|
||||
<p>With the Endian arithmetic approach, on little endian platforms an implicit conversion from and then back to
|
||||
big endian is done inside the loop. With the Endian conversion function
|
||||
approach, the user has ensured the conversions are done outside the loop, so the
|
||||
@@ -305,11 +316,12 @@ CPU @ 3.40GHz under Windows 7.</p>
|
||||
<p><b>Caveat emptor: The Windows CPU timer has very high granularity. Repeated
|
||||
runs of the same tests often yield considerably different results.</b></p>
|
||||
|
||||
<p>See <a href="../test/loop_time_test.cpp">loop_time_test.cpp</a> and
|
||||
<a href="../build/Jamfile.v2">Jamfile.v2</a> for the actual code and build
|
||||
setup.
|
||||
(For GCC 4.7, there are no 16-bit intrinsics, so they are emulated by using
|
||||
32-bit intrinsics.)</p>
|
||||
<p>See <a href="../test/loop_time_test.cpp">loop_time_test.cpp</a> and
|
||||
<a href="../benchmark/Jamfile.v2">Jamfile.v2</a> for the actual code and build
|
||||
setup.</p>
|
||||
|
||||
<div align="center">
|
||||
<center>
|
||||
|
||||
<table border="1" cellpadding="5" cellspacing="0"style="border-collapse: collapse" bordercolor="#111111">
|
||||
<tr><td colspan="6" align="center"><b><font size="2">GNU C++ version 4.7.0</font></b></td></tr>
|
||||
@@ -399,10 +411,16 @@ setup.
|
||||
|
||||
</table>
|
||||
|
||||
</center>
|
||||
</div>
|
||||
|
||||
<p><b>Comment:</b> Note that the <b><font size="2">32-bit aligned big endian </font></b>
|
||||
timings are the same with or without intrinsics turned on. Presumably the
|
||||
optimizer is recognizing the byte swapping and applying the intrinsics itself.</p>
|
||||
|
||||
<div align="center">
|
||||
<center>
|
||||
|
||||
<table border="1" cellpadding="5" cellspacing="0"style="border-collapse: collapse" bordercolor="#111111">
|
||||
<tr><td colspan="6" align="center"><b><font size="2">Microsoft Visual C++ version 11.0</font></b></td></tr>
|
||||
<tr><td colspan="6" align="center"><b> <font size="2">Iterations: 1000000000, Intrinsics: cstdlib _byteswap_ushort, etc.</font></b></td></tr>
|
||||
@@ -492,6 +510,10 @@ optimizer is recognizing the byte swapping and applying the intrinsics itself.</
|
||||
</table>
|
||||
|
||||
|
||||
</center>
|
||||
</div>
|
||||
|
||||
|
||||
<h3><a name="Conclusions">Conclusions</a></h3>
|
||||
|
||||
<p>When program logic dictates many more conversions for the Endian arithmetic
|
||||
@@ -654,7 +676,7 @@ Blechmann, Tim Moore, tymofey, Tomas Puverle, Vincente Botet, Yuval Ronen and
|
||||
Vitaly Budovsk. Apologies if anyone has been missed.</p>
|
||||
<hr>
|
||||
<p>Last revised:
|
||||
<!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->06 January, 2015<!--webbot bot="Timestamp" endspan i-checksum="38896" --></p>
|
||||
<!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->12 January, 2015<!--webbot bot="Timestamp" endspan i-checksum="38889" --></p>
|
||||
<p>© Copyright Beman Dawes, 2011, 2013</p>
|
||||
<p>Distributed under the Boost Software License, Version 1.0. See
|
||||
<a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/ LICENSE_1_0.txt</a></p>
|
||||
|
@@ -3,6 +3,7 @@ body
|
||||
{
|
||||
font-family: sans-serif;
|
||||
max-width: 6.5in;
|
||||
margin: 0px auto;
|
||||
font-size: 85%;
|
||||
}
|
||||
ins {background-color: #CCFFCC;}
|
||||
@@ -12,7 +13,7 @@ body
|
||||
table{font-size: 100%;}
|
||||
|
||||
/*
|
||||
© Copyright Beman Dawes, 2014
|
||||
<EFBFBD> Copyright Beman Dawes, 2014
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
See www.boost.org/LICENSE_1_0.txt
|
||||
*/
|
||||
|
@@ -16,8 +16,10 @@
|
||||
#include <boost/endian/arithmetic.hpp>
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/timer/timer.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include <string>
|
||||
#include <boost/detail/lightweight_main.hpp>
|
||||
|
||||
using namespace boost;
|
||||
@@ -47,7 +49,7 @@ namespace
|
||||
|
||||
if (argc >=2)
|
||||
#ifndef _MSC_VER
|
||||
n = std::atoll(argv[1]);
|
||||
n = atoll(argv[1]);
|
||||
#else
|
||||
n = _atoi64(argv[1]);
|
||||
#endif
|
||||
@@ -77,6 +79,20 @@ namespace
|
||||
}
|
||||
}
|
||||
|
||||
std::string with_digit_separator(int64_t x)
|
||||
{
|
||||
std::string s = boost::lexical_cast<std::string>(x);
|
||||
std::string s2;
|
||||
|
||||
for (std::string::size_type i = 0; i < s.size(); ++i)
|
||||
{
|
||||
if (i && ((s.size()-i) % 3) == 0)
|
||||
s2 += '\'';
|
||||
s2 += s[i];
|
||||
}
|
||||
return s2;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------//
|
||||
|
||||
template <class T, class EndianT>
|
||||
@@ -208,36 +224,37 @@ int cpp_main(int argc, char* argv[])
|
||||
|
||||
cout
|
||||
<< "<html>\n<head>\n<title>Endian Loop Time Test</title>\n</head>\n<body>\n"
|
||||
<< "<div align=\"center\"> <center>\n"
|
||||
<< "<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\""
|
||||
<< "style=\"border-collapse: collapse\" bordercolor=\"#111111\">\n"
|
||||
<< "<tr><td colspan=\"6\" align=\"center\"><b>"
|
||||
<< BOOST_COMPILER << "</b></td></tr>\n"
|
||||
<< "<tr><td colspan=\"6\" align=\"center\"><b>"
|
||||
<< " Iterations: " << n
|
||||
<< " Iterations: " << with_digit_separator(n)
|
||||
<< ", Intrinsics: " BOOST_ENDIAN_INTRINSIC_MSG
|
||||
<< "</b></td></tr>\n"
|
||||
<< "<tr><td><b>Test Case</b></td>\n"
|
||||
"<td align=\"center\"><b>Endian<br>type</b></td>\n"
|
||||
"<td align=\"center\"><b>Endian<br>arithmetic<br>type</b></td>\n"
|
||||
"<td align=\"center\"><b>Endian<br>conversion<br>function</b></td>\n"
|
||||
"</tr>\n"
|
||||
;
|
||||
|
||||
test_big_align_int16();
|
||||
test_little_align_int16();
|
||||
test_big_int16();
|
||||
test_little_int16();
|
||||
|
||||
test_big_align_int32();
|
||||
test_little_align_int32();
|
||||
test_big_int32();
|
||||
test_little_int32();
|
||||
|
||||
test_big_align_int64();
|
||||
test_little_align_int64();
|
||||
|
||||
test_big_int16();
|
||||
test_little_int16();
|
||||
test_big_int32();
|
||||
test_little_int32();
|
||||
test_big_int64();
|
||||
test_little_int64();
|
||||
|
||||
cout << "\n</table>\n</body>\n</html>\n";
|
||||
cout << "\n</div> </center>\n"
|
||||
<< "\n</table>\n</body>\n</html>\n";
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -25,12 +25,12 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "loop_time_test", "loop_time
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "buffer_test", "buffer_test\buffer_test.vcxproj", "{BFB68CF4-EB92-4E5C-9694-A939496C5CDE}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uses_cases", "uses_cases\uses_cases.vcxproj", "{36BF451A-EAEF-4140-92E4-6EA461A26107}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "conversion_use_case", "conversion_use_case\conversion_use_case.vcxproj", "{1139E765-DE0F-497A-A7D9-EB2683521DF1}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "associated-files", "associated-files\associated-files.vcxproj", "{D9C80FE0-20A6-4711-A3F4-676019BD5A06}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "experiment", "experiment\experiment.vcxproj", "{CE9D8719-6E86-41D0-97CA-5BE5272594E9}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
@@ -123,11 +123,6 @@ Global
|
||||
{BFB68CF4-EB92-4E5C-9694-A939496C5CDE}.Release|Win32.Build.0 = Release|Win32
|
||||
{BFB68CF4-EB92-4E5C-9694-A939496C5CDE}.Release|x64.ActiveCfg = Release|x64
|
||||
{BFB68CF4-EB92-4E5C-9694-A939496C5CDE}.Release|x64.Build.0 = Release|x64
|
||||
{36BF451A-EAEF-4140-92E4-6EA461A26107}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{36BF451A-EAEF-4140-92E4-6EA461A26107}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{36BF451A-EAEF-4140-92E4-6EA461A26107}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{36BF451A-EAEF-4140-92E4-6EA461A26107}.Release|Win32.Build.0 = Release|Win32
|
||||
{36BF451A-EAEF-4140-92E4-6EA461A26107}.Release|x64.ActiveCfg = Release|Win32
|
||||
{1139E765-DE0F-497A-A7D9-EB2683521DF1}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{1139E765-DE0F-497A-A7D9-EB2683521DF1}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{1139E765-DE0F-497A-A7D9-EB2683521DF1}.Debug|x64.ActiveCfg = Debug|x64
|
||||
@@ -144,6 +139,12 @@ Global
|
||||
{D9C80FE0-20A6-4711-A3F4-676019BD5A06}.Release|Win32.Build.0 = Release|Win32
|
||||
{D9C80FE0-20A6-4711-A3F4-676019BD5A06}.Release|x64.ActiveCfg = Release|x64
|
||||
{D9C80FE0-20A6-4711-A3F4-676019BD5A06}.Release|x64.Build.0 = Release|x64
|
||||
{CE9D8719-6E86-41D0-97CA-5BE5272594E9}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{CE9D8719-6E86-41D0-97CA-5BE5272594E9}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{CE9D8719-6E86-41D0-97CA-5BE5272594E9}.Debug|x64.ActiveCfg = Debug|Win32
|
||||
{CE9D8719-6E86-41D0-97CA-5BE5272594E9}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{CE9D8719-6E86-41D0-97CA-5BE5272594E9}.Release|Win32.Build.0 = Release|Win32
|
||||
{CE9D8719-6E86-41D0-97CA-5BE5272594E9}.Release|x64.ActiveCfg = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
@@ -97,7 +97,7 @@
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
<PostBuildEvent>
|
||||
<Command>"$(TargetDir)\$(TargetName).exe" 1</Command>
|
||||
<Command>"$(TargetDir)\$(TargetName).exe" 1234</Command>
|
||||
</PostBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
@@ -133,7 +133,7 @@
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
<PostBuildEvent>
|
||||
<Command>"$(TargetDir)\$(TargetName).exe" 1000000000</Command>
|
||||
<Command>"$(TargetDir)\$(TargetName).exe" 100000000</Command>
|
||||
</PostBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
|
@@ -48,7 +48,7 @@ namespace
|
||||
|
||||
if (argc >=2)
|
||||
#ifndef _MSC_VER
|
||||
n = std::atoll(argv[1]);
|
||||
n = atoll(argv[1]);
|
||||
#else
|
||||
n = _atoi64(argv[1]);
|
||||
#endif
|
||||
@@ -97,60 +97,60 @@ namespace
|
||||
void test_big_int16()
|
||||
{
|
||||
cout << "<tr><td>16-bit aligned big endian</td>";
|
||||
time<int16_t, big_int16_ut>(user::return_x_big_int16);
|
||||
time<int16_t, big_int16_ut>(user::return_x_value_big_int16);
|
||||
time<int16_t, big_int16_ut>(user::return_x_inplace_big_int16);
|
||||
time<int16_t, big_int16_ut>(user::return_x_big_int16);
|
||||
time<int16_t, big_int16_t>(user::return_x_big_int16);
|
||||
time<int16_t, big_int16_t>(user::return_x_value_big_int16);
|
||||
time<int16_t, big_int16_t>(user::return_x_inplace_big_int16);
|
||||
time<int16_t, big_int16_t>(user::return_y_big_int16);
|
||||
cout << "</tr>\n";
|
||||
}
|
||||
|
||||
void test_little_int16()
|
||||
{
|
||||
cout << "<tr><td>16-bit aligned little endian</td>";
|
||||
time<int16_t, little_int16_ut>(user::return_x_little_int16);
|
||||
time<int16_t, little_int16_ut>(user::return_x_value_little_int16);
|
||||
time<int16_t, little_int16_ut>(user::return_x_inplace_little_int16);
|
||||
time<int16_t, little_int16_ut>(user::return_x_little_int16);
|
||||
time<int16_t, little_int16_t>(user::return_x_little_int16);
|
||||
time<int16_t, little_int16_t>(user::return_x_value_little_int16);
|
||||
time<int16_t, little_int16_t>(user::return_x_inplace_little_int16);
|
||||
time<int16_t, little_int16_t>(user::return_y_little_int16);
|
||||
cout << "</tr>\n";
|
||||
}
|
||||
|
||||
void test_big_int32()
|
||||
{
|
||||
cout << "<tr><td>32-bit aligned big endian</td>";
|
||||
time<int32_t, big_int32_ut>(user::return_x_big_int32);
|
||||
time<int32_t, big_int32_ut>(user::return_x_value_big_int32);
|
||||
time<int32_t, big_int32_ut>(user::return_x_inplace_big_int32);
|
||||
time<int32_t, big_int32_ut>(user::return_x_big_int32);
|
||||
time<int32_t, big_int32_t>(user::return_x_big_int32);
|
||||
time<int32_t, big_int32_t>(user::return_x_value_big_int32);
|
||||
time<int32_t, big_int32_t>(user::return_x_inplace_big_int32);
|
||||
time<int32_t, big_int32_t>(user::return_y_big_int32);
|
||||
cout << "</tr>\n";
|
||||
}
|
||||
|
||||
void test_little_int32()
|
||||
{
|
||||
cout << "<tr><td>32-bit aligned little endian</td>";
|
||||
time<int32_t, little_int32_ut>(user::return_x_little_int32);
|
||||
time<int32_t, little_int32_ut>(user::return_x_value_little_int32);
|
||||
time<int32_t, little_int32_ut>(user::return_x_inplace_little_int32);
|
||||
time<int32_t, little_int32_ut>(user::return_x_little_int32);
|
||||
time<int32_t, little_int32_t>(user::return_x_little_int32);
|
||||
time<int32_t, little_int32_t>(user::return_x_value_little_int32);
|
||||
time<int32_t, little_int32_t>(user::return_x_inplace_little_int32);
|
||||
time<int32_t, little_int32_t>(user::return_y_little_int32);
|
||||
cout << "</tr>\n";
|
||||
}
|
||||
|
||||
void test_big_int64()
|
||||
{
|
||||
cout << "<tr><td>64-bit aligned big endian</td>";
|
||||
time<int64_t, big_int64_ut>(user::return_x_big_int64);
|
||||
time<int64_t, big_int64_ut>(user::return_x_value_big_int64);
|
||||
time<int64_t, big_int64_ut>(user::return_x_inplace_big_int64);
|
||||
time<int64_t, big_int64_ut>(user::return_x_big_int64);
|
||||
time<int64_t, big_int64_t>(user::return_x_big_int64);
|
||||
time<int64_t, big_int64_t>(user::return_x_value_big_int64);
|
||||
time<int64_t, big_int64_t>(user::return_x_inplace_big_int64);
|
||||
time<int64_t, big_int64_t>(user::return_y_big_int64);
|
||||
cout << "</tr>\n";
|
||||
}
|
||||
|
||||
void test_little_int64()
|
||||
{
|
||||
cout << "<tr><td>64-bit aligned little endian</td>";
|
||||
time<int64_t, little_int64_ut>(user::return_x_little_int64);
|
||||
time<int64_t, little_int64_ut>(user::return_x_value_little_int64);
|
||||
time<int64_t, little_int64_ut>(user::return_x_inplace_little_int64);
|
||||
time<int64_t, little_int64_ut>(user::return_x_little_int64);
|
||||
time<int64_t, little_int64_t>(user::return_x_little_int64);
|
||||
time<int64_t, little_int64_t>(user::return_x_value_little_int64);
|
||||
time<int64_t, little_int64_t>(user::return_x_inplace_little_int64);
|
||||
time<int64_t, little_int64_t>(user::return_y_little_int64);
|
||||
cout << "</tr>\n";
|
||||
}
|
||||
|
||||
|
@@ -26,67 +26,71 @@
|
||||
namespace user
|
||||
{
|
||||
|
||||
int16_t return_x_big_int16(int16_t x, big_int16_ut) BOOST_NOEXCEPT { return x; }
|
||||
int16_t return_x_little_int16(int16_t x, little_int16_ut) BOOST_NOEXCEPT { return x; }
|
||||
int16_t return_x_value_big_int16(int16_t x, big_int16_ut) BOOST_NOEXCEPT
|
||||
int16_t return_x_big_int16(int16_t x, big_int16_t) BOOST_NOEXCEPT { return x; }
|
||||
int16_t return_x_little_int16(int16_t x, little_int16_t) BOOST_NOEXCEPT { return x; }
|
||||
int16_t return_x_value_big_int16(int16_t x, big_int16_t) BOOST_NOEXCEPT
|
||||
{
|
||||
return conditional_reverse<order::native, order::big>(x);
|
||||
}
|
||||
int16_t return_x_value_little_int16(int16_t x, little_int16_ut) BOOST_NOEXCEPT
|
||||
int16_t return_x_value_little_int16(int16_t x, little_int16_t) BOOST_NOEXCEPT
|
||||
{
|
||||
return conditional_reverse<order::native, order::little>(x);
|
||||
}
|
||||
int16_t return_x_inplace_big_int16(int16_t x, big_int16_ut) BOOST_NOEXCEPT
|
||||
int16_t return_x_inplace_big_int16(int16_t x, big_int16_t) BOOST_NOEXCEPT
|
||||
{
|
||||
conditional_reverse_inplace<order::native, order::big>(x); return x;
|
||||
}
|
||||
int16_t return_x_inplace_little_int16(int16_t x, little_int16_ut) BOOST_NOEXCEPT
|
||||
int16_t return_x_inplace_little_int16(int16_t x, little_int16_t) BOOST_NOEXCEPT
|
||||
{
|
||||
conditional_reverse_inplace<order::native, order::little>(x); return x;
|
||||
}
|
||||
int16_t return_y_big_int16(int16_t x, big_int16_ut y) BOOST_NOEXCEPT { return y; }
|
||||
int16_t return_y_little_int16(int16_t x, little_int16_ut y) BOOST_NOEXCEPT { return y; }
|
||||
int16_t return_y_big_int16(int16_t x, big_int16_t y) BOOST_NOEXCEPT { return y; }
|
||||
int16_t return_y_little_int16(int16_t x, little_int16_t y) BOOST_NOEXCEPT { return y; }
|
||||
|
||||
int32_t return_x_big_int32(int32_t x, big_int32_ut) BOOST_NOEXCEPT { return x; }
|
||||
int32_t return_x_little_int32(int32_t x, little_int32_ut) BOOST_NOEXCEPT { return x; }
|
||||
int32_t return_x_value_big_int32(int32_t x, big_int32_ut) BOOST_NOEXCEPT
|
||||
{
|
||||
return conditional_reverse<order::native, order::big>(x);
|
||||
}
|
||||
int32_t return_x_value_little_int32(int32_t x, little_int32_ut) BOOST_NOEXCEPT
|
||||
{
|
||||
return conditional_reverse<order::native, order::little>(x);
|
||||
}
|
||||
int32_t return_x_inplace_big_int32(int32_t x, big_int32_ut) BOOST_NOEXCEPT
|
||||
{
|
||||
conditional_reverse_inplace<order::native, order::big>(x); return x;
|
||||
}
|
||||
int32_t return_x_inplace_little_int32(int32_t x, little_int32_ut) BOOST_NOEXCEPT
|
||||
{
|
||||
conditional_reverse_inplace<order::native, order::little>(x); return x;
|
||||
}
|
||||
int32_t return_y_big_int32(int32_t x, big_int32_ut y) BOOST_NOEXCEPT { return y; }
|
||||
int32_t return_y_little_int32(int32_t x, little_int32_ut y) BOOST_NOEXCEPT { return y; }
|
||||
//------------------------------------------------------------------------------------//
|
||||
|
||||
int64_t return_x_big_int64(int64_t x, big_int64_ut) BOOST_NOEXCEPT { return x; }
|
||||
int64_t return_x_little_int64(int64_t x, little_int64_ut) BOOST_NOEXCEPT { return x; }
|
||||
int64_t return_x_value_big_int64(int64_t x, big_int64_ut) BOOST_NOEXCEPT
|
||||
int32_t return_x_big_int32(int32_t x, big_int32_t) BOOST_NOEXCEPT { return x; }
|
||||
int32_t return_x_little_int32(int32_t x, little_int32_t) BOOST_NOEXCEPT { return x; }
|
||||
int32_t return_x_value_big_int32(int32_t x, big_int32_t) BOOST_NOEXCEPT
|
||||
{
|
||||
return conditional_reverse<order::native, order::big>(x);
|
||||
}
|
||||
int64_t return_x_value_little_int64(int64_t x, little_int64_ut) BOOST_NOEXCEPT
|
||||
int32_t return_x_value_little_int32(int32_t x, little_int32_t) BOOST_NOEXCEPT
|
||||
{
|
||||
return conditional_reverse<order::native, order::little>(x);
|
||||
}
|
||||
int64_t return_x_inplace_big_int64(int64_t x, big_int64_ut) BOOST_NOEXCEPT
|
||||
int32_t return_x_inplace_big_int32(int32_t x, big_int32_t) BOOST_NOEXCEPT
|
||||
{
|
||||
conditional_reverse_inplace<order::native, order::big>(x); return x;
|
||||
}
|
||||
int64_t return_x_inplace_little_int64(int64_t x, little_int64_ut) BOOST_NOEXCEPT
|
||||
int32_t return_x_inplace_little_int32(int32_t x, little_int32_t) BOOST_NOEXCEPT
|
||||
{
|
||||
conditional_reverse_inplace<order::native, order::little>(x); return x;
|
||||
}
|
||||
int64_t return_y_big_int64(int64_t x, big_int64_ut y) BOOST_NOEXCEPT { return y; }
|
||||
int64_t return_y_little_int64(int64_t x, little_int64_ut y) BOOST_NOEXCEPT { return y; }
|
||||
int32_t return_y_big_int32(int32_t x, big_int32_t y) BOOST_NOEXCEPT { return y; }
|
||||
int32_t return_y_little_int32(int32_t x, little_int32_t y) BOOST_NOEXCEPT { return y; }
|
||||
|
||||
//------------------------------------------------------------------------------------//
|
||||
|
||||
int64_t return_x_big_int64(int64_t x, big_int64_t) BOOST_NOEXCEPT { return x; }
|
||||
int64_t return_x_little_int64(int64_t x, little_int64_t) BOOST_NOEXCEPT { return x; }
|
||||
int64_t return_x_value_big_int64(int64_t x, big_int64_t) BOOST_NOEXCEPT
|
||||
{
|
||||
return conditional_reverse<order::native, order::big>(x);
|
||||
}
|
||||
int64_t return_x_value_little_int64(int64_t x, little_int64_t) BOOST_NOEXCEPT
|
||||
{
|
||||
return conditional_reverse<order::native, order::little>(x);
|
||||
}
|
||||
int64_t return_x_inplace_big_int64(int64_t x, big_int64_t) BOOST_NOEXCEPT
|
||||
{
|
||||
conditional_reverse_inplace<order::native, order::big>(x); return x;
|
||||
}
|
||||
int64_t return_x_inplace_little_int64(int64_t x, little_int64_t) BOOST_NOEXCEPT
|
||||
{
|
||||
conditional_reverse_inplace<order::native, order::little>(x); return x;
|
||||
}
|
||||
int64_t return_y_big_int64(int64_t x, big_int64_t y) BOOST_NOEXCEPT { return y; }
|
||||
int64_t return_y_little_int64(int64_t x, little_int64_t y) BOOST_NOEXCEPT { return y; }
|
||||
|
||||
}
|
||||
|
@@ -24,32 +24,32 @@ namespace user
|
||||
using namespace boost;
|
||||
using namespace boost::endian;
|
||||
|
||||
int16_t return_x_big_int16(int16_t x, big_int16_ut y) BOOST_NOEXCEPT;
|
||||
int16_t return_x_little_int16(int16_t x, little_int16_ut y) BOOST_NOEXCEPT;
|
||||
int16_t return_x_value_big_int16(int16_t x, big_int16_ut) BOOST_NOEXCEPT;
|
||||
int16_t return_x_value_little_int16(int16_t x, little_int16_ut y) BOOST_NOEXCEPT;
|
||||
int16_t return_x_inplace_big_int16(int16_t x, big_int16_ut y) BOOST_NOEXCEPT;
|
||||
int16_t return_x_inplace_little_int16(int16_t x, little_int16_ut y) BOOST_NOEXCEPT;
|
||||
int16_t return_y_big_int16(int16_t x, big_int16_ut y) BOOST_NOEXCEPT;
|
||||
int16_t return_y_little_int16(int16_t x, little_int16_ut y) BOOST_NOEXCEPT;
|
||||
int16_t return_x_big_int16(int16_t x, big_int16_t y) BOOST_NOEXCEPT;
|
||||
int16_t return_x_little_int16(int16_t x, little_int16_t y) BOOST_NOEXCEPT;
|
||||
int16_t return_x_value_big_int16(int16_t x, big_int16_t) BOOST_NOEXCEPT;
|
||||
int16_t return_x_value_little_int16(int16_t x, little_int16_t y) BOOST_NOEXCEPT;
|
||||
int16_t return_x_inplace_big_int16(int16_t x, big_int16_t y) BOOST_NOEXCEPT;
|
||||
int16_t return_x_inplace_little_int16(int16_t x, little_int16_t y) BOOST_NOEXCEPT;
|
||||
int16_t return_y_big_int16(int16_t x, big_int16_t y) BOOST_NOEXCEPT;
|
||||
int16_t return_y_little_int16(int16_t x, little_int16_t y) BOOST_NOEXCEPT;
|
||||
|
||||
int32_t return_x_big_int32(int32_t x, big_int32_ut y) BOOST_NOEXCEPT;
|
||||
int32_t return_x_little_int32(int32_t x, little_int32_ut y) BOOST_NOEXCEPT;
|
||||
int32_t return_x_value_big_int32(int32_t x, big_int32_ut) BOOST_NOEXCEPT;
|
||||
int32_t return_x_value_little_int32(int32_t x, little_int32_ut y) BOOST_NOEXCEPT;
|
||||
int32_t return_x_inplace_big_int32(int32_t x, big_int32_ut y) BOOST_NOEXCEPT;
|
||||
int32_t return_x_inplace_little_int32(int32_t x, little_int32_ut y) BOOST_NOEXCEPT;
|
||||
int32_t return_y_big_int32(int32_t x, big_int32_ut y) BOOST_NOEXCEPT;
|
||||
int32_t return_y_little_int32(int32_t x, little_int32_ut y) BOOST_NOEXCEPT;
|
||||
int32_t return_x_big_int32(int32_t x, big_int32_t y) BOOST_NOEXCEPT;
|
||||
int32_t return_x_little_int32(int32_t x, little_int32_t y) BOOST_NOEXCEPT;
|
||||
int32_t return_x_value_big_int32(int32_t x, big_int32_t) BOOST_NOEXCEPT;
|
||||
int32_t return_x_value_little_int32(int32_t x, little_int32_t y) BOOST_NOEXCEPT;
|
||||
int32_t return_x_inplace_big_int32(int32_t x, big_int32_t y) BOOST_NOEXCEPT;
|
||||
int32_t return_x_inplace_little_int32(int32_t x, little_int32_t y) BOOST_NOEXCEPT;
|
||||
int32_t return_y_big_int32(int32_t x, big_int32_t y) BOOST_NOEXCEPT;
|
||||
int32_t return_y_little_int32(int32_t x, little_int32_t y) BOOST_NOEXCEPT;
|
||||
|
||||
int64_t return_x_big_int64(int64_t x, big_int64_ut y) BOOST_NOEXCEPT;
|
||||
int64_t return_x_little_int64(int64_t x, little_int64_ut y) BOOST_NOEXCEPT;
|
||||
int64_t return_x_value_big_int64(int64_t x, big_int64_ut) BOOST_NOEXCEPT;
|
||||
int64_t return_x_value_little_int64(int64_t x, little_int64_ut y) BOOST_NOEXCEPT;
|
||||
int64_t return_x_inplace_big_int64(int64_t x, big_int64_ut y) BOOST_NOEXCEPT;
|
||||
int64_t return_x_inplace_little_int64(int64_t x, little_int64_ut y) BOOST_NOEXCEPT;
|
||||
int64_t return_y_big_int64(int64_t x, big_int64_ut y) BOOST_NOEXCEPT;
|
||||
int64_t return_y_little_int64(int64_t x, little_int64_ut y) BOOST_NOEXCEPT;
|
||||
int64_t return_x_big_int64(int64_t x, big_int64_t y) BOOST_NOEXCEPT;
|
||||
int64_t return_x_little_int64(int64_t x, little_int64_t y) BOOST_NOEXCEPT;
|
||||
int64_t return_x_value_big_int64(int64_t x, big_int64_t) BOOST_NOEXCEPT;
|
||||
int64_t return_x_value_little_int64(int64_t x, little_int64_t y) BOOST_NOEXCEPT;
|
||||
int64_t return_x_inplace_big_int64(int64_t x, big_int64_t y) BOOST_NOEXCEPT;
|
||||
int64_t return_x_inplace_little_int64(int64_t x, little_int64_t y) BOOST_NOEXCEPT;
|
||||
int64_t return_y_big_int64(int64_t x, big_int64_t y) BOOST_NOEXCEPT;
|
||||
int64_t return_y_little_int64(int64_t x, little_int64_t y) BOOST_NOEXCEPT;
|
||||
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user