From: Marcus Comstedt Date: Sun, 4 Aug 2013 22:35:02 +0000 (+0200) Subject: Check if unportable sample pack/unpack works and in that case use it. X-Git-Tag: pulseview-0.2.0~66 X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=commitdiff_plain;h=9df8453f6809f2ce038717111979474a60d5746a Check if unportable sample pack/unpack works and in that case use it. --- diff --git a/CMake/memaccess.cmake b/CMake/memaccess.cmake new file mode 100644 index 00000000..86ceb0e2 --- /dev/null +++ b/CMake/memaccess.cmake @@ -0,0 +1,36 @@ +## +## This file is part of the PulseView project. +## +## Copyright (C) 2014 Marcus Comstedt +## +## 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 . +## + +include(CheckCSourceRuns) + +function (memaccess_check_unaligned_le _var) +CHECK_C_SOURCE_RUNS(" +#include +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() diff --git a/CMakeLists.txt b/CMakeLists.txt index edac8611..d959a9f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 #------------------------------------------------------------------------------- diff --git a/config.h.in b/config.h.in index 6101749b..aa6062df 100644 --- a/config.h.in +++ b/config.h.in @@ -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 diff --git a/pv/data/logicsnapshot.cpp b/pv/data/logicsnapshot.cpp index a1beafb9..444fa9ec 100644 --- a/pv/data/logicsnapshot.cpp +++ b/pv/data/logicsnapshot.cpp @@ -27,6 +27,7 @@ #include +#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(