aboutsummaryrefslogtreecommitdiff
path: root/library/include/mipi_syst/compiler.h
diff options
context:
space:
mode:
Diffstat (limited to 'library/include/mipi_syst/compiler.h')
-rw-r--r--library/include/mipi_syst/compiler.h193
1 files changed, 193 insertions, 0 deletions
diff --git a/library/include/mipi_syst/compiler.h b/library/include/mipi_syst/compiler.h
new file mode 100644
index 0000000..822642e
--- /dev/null
+++ b/library/include/mipi_syst/compiler.h
@@ -0,0 +1,193 @@
+/*
+Copyright (c) 2018, MIPI Alliance, Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ * Contributors:
+ * Norbert Schulz (Intel Corporation) - Initial API and implementation
+ */
+
+/* Compiler specific defines */
+
+#ifndef MIPI_SYST_COMPILER_INCLUDED
+#define MIPI_SYST_COMPILER_INCLUDED
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#if defined(_WIN32) /* MSVC Compiler section */
+
+/* basic integer types
+ */
+typedef __int8 mipi_syst_s8;
+typedef __int16 mipi_syst_s16;
+typedef __int32 mipi_syst_s32;
+typedef __int64 mipi_syst_s64;
+
+typedef unsigned __int8 mipi_syst_u8;
+typedef unsigned __int16 mipi_syst_u16;
+typedef unsigned __int32 mipi_syst_u32;
+typedef unsigned __int64 mipi_syst_u64;
+
+/* shared library import/export
+ */
+#if defined(MIPI_SYST_STATIC)
+#define MIPI_SYST_EXPORT
+#define MIPI_SYST_EXPORT
+#else
+#if defined(MIPI_SYST_EXPORTS)
+#define MIPI_SYST_EXPORT __declspec(dllexport)
+#else
+#define MIPI_SYST_EXPORT __declspec(dllimport)
+#endif
+#endif
+
+#define MIPI_SYST_CALLCONV __stdcall
+
+/* Caution: Windows doesn't support attribute based shared library
+ * life time functions. Add these calls into a dllmain routine
+ * instead.
+ */
+#define MIPI_SYST_SHAREDLIB_CONSTRUCTOR
+#define MIPI_SYST_SHAREDLIB_DESTRUCTOR
+
+#define MIPI_SYST_FUNCTION_NAME __FUNCTION__
+#define MIPI_SYST_LINE __LINE__
+#define MIPI_SYST_FILE __FILE__
+
+#if defined(NDEBUG)
+#define _MIPI_SYST_OPTIMIZER_ON
+#endif
+
+#define MIPI_SYST_CC_INLINE __inline
+
+/* Macros for byte swapping to little endian
+ *
+ * Assume this compiler is always little endian
+ */
+#define MIPI_SYST_HTOLE16(v) (v)
+#define MIPI_SYST_HTOLE32(v) (v)
+#define MIPI_SYST_HTOLE64(v) (v)
+
+/* HW CRC32C support ? */
+#if defined(MIPI_SYST_CRC_INTRINSIC_ON)
+#define MIPI_SYST_CRC_INTRINSIC
+
+#include <intrin.h>
+#define _MIPI_SYST_CPU_CRC8(crc, v) _mm_crc32_u8((crc), (v))
+#define _MIPI_SYST_CPU_CRC16(crc, v) _mm_crc32_u16((crc), (v))
+#define _MIPI_SYST_CPU_CRC32(crc, v) _mm_crc32_u32((crc), (v))
+#if defined(_WIN64)
+#define _MIPI_SYST_CPU_CRC64(crc, v) (mipi_syst_u32)_mm_crc32_u64((crc), (v))
+#else
+#define _MIPI_SYST_CPU_CRC64(crc, v) \
+ _mm_crc32_u32(\
+ _mm_crc32_u32((crc), (mipi_syst_u32)(v)), \
+ ((mipi_syst_u32)((v)>> 32))\
+ )
+#endif
+#endif
+
+#elif defined(__GNUC__) /* GNU-C Compiler section */
+
+/* basic integer types
+ */
+typedef char mipi_syst_s8;
+typedef short mipi_syst_s16;
+typedef int mipi_syst_s32;
+typedef long long mipi_syst_s64;
+
+typedef unsigned char mipi_syst_u8;
+typedef unsigned short mipi_syst_u16;
+typedef unsigned int mipi_syst_u32;
+typedef unsigned long long mipi_syst_u64;
+
+/* shared library related settings
+ */
+#define MIPI_SYST_EXPORT
+#define MIPI_SYST_CALLCONV
+
+#define MIPI_SYST_SHAREDLIB_CONSTRUCTOR __attribute__((constructor))
+#define MIPI_SYST_SHAREDLIB_DESTRUCTOR __attribute__((destructor))
+
+#define MIPI_SYST_FUNCTION_NAME __PRETTY_FUNCTION__
+#define MIPI_SYST_LINE __LINE__
+#define MIPI_SYST_FILE __FILE__
+#define MIPI_SYST_CC_INLINE inline
+
+/* Macros for byte swapping to little endian
+ */
+#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+#define MIPI_SYST_BIG_ENDIAN
+
+#define MIPI_SYST_HTOLE16(v) \
+ ((((mipi_syst_u16)(v))>>8)|((((mipi_syst_u16)(v))&0xFF)<<8))
+#define MIPI_SYST_HTOLE32(v) \
+ ((mipi_syst_u32)__builtin_bswap32((mipi_syst_u32)(v)))
+#define MIPI_SYST_HTOLE64(v) \
+ ((mipi_syst_u64)__builtin_bswap64((mipi_syst_u64)(v)))
+#else
+#define MIPI_SYST_HTOLE16(v) (v)
+#define MIPI_SYST_HTOLE32(v) (v)
+#define MIPI_SYST_HTOLE64(v) (v)
+#endif
+
+#if defined(__OPTIMIZE__)
+#define _MIPI_SYST_OPTIMIZER_ON
+#endif
+
+/* HW CRC32C support ? */
+#if defined(MIPI_SYST_CRC_INTRINSIC_ON)
+#define MIPI_SYST_CRC_INTRINSIC
+
+#define _MIPI_SYST_CPU_CRC8(crc, v) __builtin_ia32_crc32qi((crc), (v))
+#define _MIPI_SYST_CPU_CRC16(crc, v) __builtin_ia32_crc32hi((crc), (v))
+#define _MIPI_SYST_CPU_CRC32(crc, v) __builtin_ia32_crc32si((crc), (v))
+#if defined(_WIN64) || defined(__x86_64__) || defined (__LP64__)
+#define _MIPI_SYST_CPU_CRC64(crc, v) (mipi_syst_u32)__builtin_ia32_crc32di((crc), (v))
+#else
+#define _MIPI_SYST_CPU_CRC64(crc, v) \
+ __builtin_ia32_crc32si (\
+ __builtin_ia32_crc32si((crc), (mipi_syst_u32)(v)), \
+ ((mipi_syst_u32)((v)>> 32))\
+ )
+#endif
+#endif
+#else
+#error unknown compiler, copy and adapt one of the sections above
+#endif
+
+#ifdef __cplusplus
+} /* extern C */
+#endif
+#endif