Check if unportable sample pack/unpack works and in that case use it.
authorMarcus Comstedt <marcus@mc.pp.se>
Sun, 4 Aug 2013 22:35:02 +0000 (00:35 +0200)
committerUwe Hermann <uwe@hermann-uwe.de>
Wed, 19 Feb 2014 15:35:06 +0000 (16:35 +0100)
CMake/memaccess.cmake [new file with mode: 0644]
CMakeLists.txt
config.h.in
pv/data/logicsnapshot.cpp

diff --git a/CMake/memaccess.cmake b/CMake/memaccess.cmake
new file mode 100644 (file)
index 0000000..86ceb0e
--- /dev/null
@@ -0,0 +1,36 @@
+##
+## This file is part of the PulseView project.
+##
+## Copyright (C) 2014 Marcus Comstedt <marcus@mc.pp.se>
+##
+## This program is free software: you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation, either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+##
+
+include(CheckCSourceRuns)
+
+function (memaccess_check_unaligned_le _var)
+CHECK_C_SOURCE_RUNS("
+#include <stdint.h>
+int main() {
+    int i;
+    union { uint64_t u64; uint8_t u8[16]; } d;
+    uint64_t v;
+    for (i=0; i<16; i++)
+       d.u8[i] = i;
+    v = *(uint64_t *)(d.u8+1);
+    if (v != 0x0807060504030201ULL)
+       return 1;
+    return 0;
+}" ${_var})
+endfunction()
index edac86111c77c4f256096afd98a694a55ea64450..d959a9f343cf8090c2291d1d1b95603e828c9ceb 100644 (file)
@@ -85,6 +85,13 @@ else()
        find_package(Boost 1.42 COMPONENTS system thread REQUIRED)
 endif()
 
+#===============================================================================
+#= System Introspection
+#-------------------------------------------------------------------------------
+
+include(memaccess)
+memaccess_check_unaligned_le(HAVE_UNALIGNED_LITTLE_ENDIAN_ACCESS)
+
 #===============================================================================
 #= Config Header
 #-------------------------------------------------------------------------------
index 6101749b30c2722b43e76c1cdb7978aeec826c86..aa6062df96f33deb226dd7e0536722e7bfb3e67d 100644 (file)
@@ -31,4 +31,7 @@
 #define PV_VERSION_MICRO @PV_VERSION_MICRO@
 #define PV_VERSION_STRING "@PV_VERSION_STRING@"
 
+/* Platform properties */
+#cmakedefine HAVE_UNALIGNED_LITTLE_ENDIAN_ACCESS
+
 #endif
index a1beafb9c4e4e3e3c50a111077e62fd3c2d261d5..444fa9ec4ceea93194dd02ce2f8aa8cfdb8a37a1 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <boost/foreach.hpp>
 
+#include "config.h"
 #include "logicsnapshot.h"
 
 using boost::lock_guard;
@@ -64,6 +65,9 @@ LogicSnapshot::~LogicSnapshot()
 
 uint64_t LogicSnapshot::unpack_sample(const uint8_t *ptr) const
 {
+#ifdef HAVE_UNALIGNED_LITTLE_ENDIAN_ACCESS
+       return *(uint64_t*)ptr;
+#else
        uint64_t value = 0;
        switch(_unit_size) {
        default:
@@ -94,10 +98,14 @@ uint64_t LogicSnapshot::unpack_sample(const uint8_t *ptr) const
                break;
        }
        return value;
+#endif
 }
 
 void LogicSnapshot::pack_sample(uint8_t *ptr, uint64_t value)
 {
+#ifdef HAVE_UNALIGNED_LITTLE_ENDIAN_ACCESS
+       *(uint64_t*)ptr = value;
+#else
        switch(_unit_size) {
        default:
                ptr[7] = value >> 56;
@@ -126,6 +134,7 @@ void LogicSnapshot::pack_sample(uint8_t *ptr, uint64_t value)
        case 0:
                break;
        }
+#endif
 }
 
 void LogicSnapshot::append_payload(