From 19d18b6e4e0709f48b6b840dbc2092f8716f828f Mon Sep 17 00:00:00 2001 From: Vsevolod Livinskiy Date: Fri, 27 Feb 2015 16:02:55 +0300 Subject: [PATCH] Some changes was made to support older llvm versions. --- cbackend.cpp | 115 +++++++++++++++++-------------- examples/intrinsics/generic-16.h | 19 +++++ examples/intrinsics/sse4.h | 20 ++++++ 3 files changed, 103 insertions(+), 51 deletions(-) diff --git a/cbackend.cpp b/cbackend.cpp index 9e5110cd..cc93502d 100644 --- a/cbackend.cpp +++ b/cbackend.cpp @@ -2753,57 +2753,70 @@ void CWriter::printModuleTypes() { Out << " double Double;\n"; Out << "} llvmBitCastUnion;\n"; - Out << "\n/* It is special class, designed for operations with long int.*/ \n"; - Out << "template \n"; - Out << "struct iN { \n"; - Out << " int num[num_bits / (sizeof (int) * 8)]; \n"; - Out << " \n"; - Out << " iN () {} \n"; - Out << " \n"; - Out << " iN (const char *val) { \n"; - Out << " if (val == NULL) \n"; - Out << " return; \n"; - Out << " int length = num_bits / (sizeof (int) * 8); \n"; - Out << " int val_len = 0; \n"; - Out << " for (val_len = 0; val[val_len]; (val_len)++); \n"; - Out << " for (int i = 0; (i < val_len && i < num_bits); i++) \n"; - Out << " num[i / (sizeof (int) * 8)] = (num[i / (sizeof (int) * 8)] << 1) | (val[i] - '0'); \n"; - Out << " } \n"; - Out << " \n"; - Out << " ~iN () {} \n"; - Out << " \n"; - Out << " iN operator >> (const iN rhs) { \n"; - Out << " iN res; \n"; - Out << " int length = num_bits / (sizeof (int) * 8); \n"; - Out << " int cells_shift = rhs.num[0] / (sizeof(int) * 8); \n"; - Out << " int small_shift = rhs.num[0] % (sizeof(int) * 8); \n"; - Out << " for (int i = 0; i < (length - cells_shift); i++) \n"; - Out << " res.num[i] = this->num[cells_shift + i]; \n"; - Out << " for (int i = 0; i < length - 1; i++) { \n"; - Out << " res.num[i] = this->num[i] >> small_shift; \n"; - Out << " res.num[i] = ((this->num[i + 1] << ((sizeof(int) * 8) - small_shift))) | res.num[i];\n"; - Out << " } \n"; - Out << " res.num[length - 1] = res.num[length - 1] >> small_shift; \n"; - Out << " return res; \n"; - Out << " } \n"; - Out << " \n"; - Out << " iN operator & (iN rhs) { \n"; - Out << " iN res; \n"; - Out << " int length = num_bits / (sizeof (int) * 8); \n"; - Out << " for (int i = 0; i < length; i++) \n"; - Out << " res.num[i] = (this->num[i]) & (rhs.num[i]); \n"; - Out << " return res; \n"; - Out << " } \n"; - Out << " \n"; - Out << " operator uint32_t() { return this->num[0]; } \n"; - Out << "}; \n"; - Out << " \n"; - Out << "template \n"; - Out << "T __cast_bits (T to, __vec" << vectorWidth << "_i32 from) { \n"; - Out << " for (int i = 0; i < 16; i++) \n"; - Out << " to.num[i] = ((uint32_t*)(&from))[i]; \n"; - Out << " return to; \n"; - Out << "} \n"; + Out << "\n/* This is special class, designed for operations with long int.*/ \n"; + Out << "template \n"; + Out << "struct iN { \n"; + Out << " int num[num_bits / (sizeof (int) * 8)]; \n"; + Out << " \n"; + Out << " iN () {} \n"; + Out << " \n"; + Out << " iN (const char *val) { \n"; + Out << " if (val == NULL) \n"; + Out << " return; \n"; + Out << " int length = num_bits / (sizeof (int) * 8); \n"; + Out << " int val_len = 0; \n"; + Out << " for (val_len = 0; val[val_len]; (val_len)++); \n"; + Out << " for (int i = 0; (i < val_len && i < num_bits); i++) \n"; + Out << " num[i / (sizeof (int) * 8)] = (num[i / (sizeof (int) * 8)] << 1) | (val[i] - '0'); \n"; + Out << " } \n"; + Out << " \n"; + Out << " ~iN () {} \n"; + Out << " \n"; + Out << " iN operator >> (const iN rhs) { \n"; + Out << " iN res; \n"; + Out << " int length = num_bits / (sizeof (int) * 8); \n"; + Out << " int cells_shift = rhs.num[0] / (sizeof(int) * 8); \n"; + Out << " int small_shift = rhs.num[0] % (sizeof(int) * 8); \n"; + Out << " for (int i = 0; i < (length - cells_shift); i++) \n"; + Out << " res.num[i] = this->num[cells_shift + i]; \n"; + Out << " for (int i = 0; i < length - 1; i++) { \n"; + Out << " res.num[i] = this->num[i] >> small_shift; \n"; + Out << " res.num[i] = ((this->num[i + 1] << ((sizeof(int) * 8) - small_shift))) | res.num[i];\n"; + Out << " } \n"; + Out << " res.num[length - 1] = res.num[length - 1] >> small_shift; \n"; + Out << " return res; \n"; + Out << " } \n"; + Out << " \n"; + Out << " iN operator & (iN rhs) { \n"; + Out << " iN res; \n"; + Out << " int length = num_bits / (sizeof (int) * 8); \n"; + Out << " for (int i = 0; i < length; i++) \n"; + Out << " res.num[i] = (this->num[i]) & (rhs.num[i]); \n"; + Out << " return res; \n"; + Out << " } \n"; + Out << " \n"; + Out << " operator uint32_t() { return this->num[0]; } \n"; + Out << " \n"; + Out << " template \n"; + Out << " friend iN __cast_bits(iN to, T from) { \n"; + Out << " for (int i = 0; i <" << vectorWidth << "; i++) \n"; + Out << " to.num[i] = ((int*)(&from))[i]; \n"; + Out << " return to; \n"; + Out << " } \n"; + Out << " \n"; + Out << " template \n"; + Out << " friend T __cast_bits(T to, iN from) { \n"; + Out << " for (int i = 0; i <" << vectorWidth << "; i++) \n"; + Out << " ((int*)(&to))[i] = from.num[i]; \n"; + Out << " return to; \n"; + Out << " } \n"; + Out << " \n"; + Out << " template \n"; + Out << " friend void __store(T *p, iN val) { \n"; + Out << " for (int i = 0; i <" << vectorWidth << "; i++) \n"; + Out << " ((int*)p)[i] = val.num[i]; \n"; + Out << " } \n"; + Out << "}; \n"; Out << "\n"; // Get all of the struct types used in the module. diff --git a/examples/intrinsics/generic-16.h b/examples/intrinsics/generic-16.h index f44c581e..5a338e54 100644 --- a/examples/intrinsics/generic-16.h +++ b/examples/intrinsics/generic-16.h @@ -977,6 +977,25 @@ CAST_BITS_SCALAR(int64_t, double) CAST_BITS_SCALAR(double, uint64_t) CAST_BITS_SCALAR(double, int64_t) +#define CAST_BITS_TRIVIAL(TYPE) \ +static FORCEINLINE TYPE __cast_bits(TYPE, TYPE v) { return v; } + +CAST_BITS_TRIVIAL(float) +CAST_BITS_TRIVIAL(double) +CAST_BITS_TRIVIAL(int8_t) +CAST_BITS_TRIVIAL(uint8_t) +CAST_BITS_TRIVIAL(int16_t) +CAST_BITS_TRIVIAL(uint16_t) +CAST_BITS_TRIVIAL(int32_t) +CAST_BITS_TRIVIAL(uint32_t) +CAST_BITS_TRIVIAL(int64_t) +CAST_BITS_TRIVIAL(uint64_t) +CAST_BITS_TRIVIAL(__vec16_f) +CAST_BITS_TRIVIAL(__vec16_d) +CAST_BITS_TRIVIAL(__vec16_i8) +CAST_BITS_TRIVIAL(__vec16_i16) +CAST_BITS_TRIVIAL(__vec16_i32) +CAST_BITS_TRIVIAL(__vec16_i64) /////////////////////////////////////////////////////////////////////////// // various math functions diff --git a/examples/intrinsics/sse4.h b/examples/intrinsics/sse4.h index 765a931f..c15eb621 100644 --- a/examples/intrinsics/sse4.h +++ b/examples/intrinsics/sse4.h @@ -295,6 +295,26 @@ CAST_BITS_SCALAR(int64_t, double) CAST_BITS_SCALAR(double, uint64_t) CAST_BITS_SCALAR(double, int64_t) +#define CAST_BITS_TRIVIAL(TYPE) \ +static FORCEINLINE TYPE __cast_bits(TYPE, TYPE v) { return v; } + +CAST_BITS_TRIVIAL(float) +CAST_BITS_TRIVIAL(double) +CAST_BITS_TRIVIAL(int8_t) +CAST_BITS_TRIVIAL(uint8_t) +CAST_BITS_TRIVIAL(int16_t) +CAST_BITS_TRIVIAL(uint16_t) +CAST_BITS_TRIVIAL(int32_t) +CAST_BITS_TRIVIAL(uint32_t) +CAST_BITS_TRIVIAL(int64_t) +CAST_BITS_TRIVIAL(uint64_t) +CAST_BITS_TRIVIAL(__vec4_f) +CAST_BITS_TRIVIAL(__vec4_d) +CAST_BITS_TRIVIAL(__vec4_i8) +CAST_BITS_TRIVIAL(__vec4_i16) +CAST_BITS_TRIVIAL(__vec4_i32) +CAST_BITS_TRIVIAL(__vec4_i64) + #define CMP_AND_MASK_ONE(FUNC, TYPE) \ static FORCEINLINE __vec4_i1 FUNC##_and_mask(TYPE a, TYPE b, __vec4_i1 m) { \ return __and(FUNC(a, b), m); \