Some changes was made to support older llvm versions.
This commit is contained in:
115
cbackend.cpp
115
cbackend.cpp
@@ -2753,57 +2753,70 @@ void CWriter::printModuleTypes() {
|
|||||||
Out << " double Double;\n";
|
Out << " double Double;\n";
|
||||||
Out << "} llvmBitCastUnion;\n";
|
Out << "} llvmBitCastUnion;\n";
|
||||||
|
|
||||||
Out << "\n/* It is special class, designed for operations with long int.*/ \n";
|
Out << "\n/* This is special class, designed for operations with long int.*/ \n";
|
||||||
Out << "template <int num_bits> \n";
|
Out << "template <int num_bits> \n";
|
||||||
Out << "struct iN { \n";
|
Out << "struct iN { \n";
|
||||||
Out << " int num[num_bits / (sizeof (int) * 8)]; \n";
|
Out << " int num[num_bits / (sizeof (int) * 8)]; \n";
|
||||||
Out << " \n";
|
Out << " \n";
|
||||||
Out << " iN () {} \n";
|
Out << " iN () {} \n";
|
||||||
Out << " \n";
|
Out << " \n";
|
||||||
Out << " iN (const char *val) { \n";
|
Out << " iN (const char *val) { \n";
|
||||||
Out << " if (val == NULL) \n";
|
Out << " if (val == NULL) \n";
|
||||||
Out << " return; \n";
|
Out << " return; \n";
|
||||||
Out << " int length = num_bits / (sizeof (int) * 8); \n";
|
Out << " int length = num_bits / (sizeof (int) * 8); \n";
|
||||||
Out << " int val_len = 0; \n";
|
Out << " int val_len = 0; \n";
|
||||||
Out << " for (val_len = 0; val[val_len]; (val_len)++); \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 << " 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 << " num[i / (sizeof (int) * 8)] = (num[i / (sizeof (int) * 8)] << 1) | (val[i] - '0'); \n";
|
||||||
Out << " } \n";
|
Out << " } \n";
|
||||||
Out << " \n";
|
Out << " \n";
|
||||||
Out << " ~iN () {} \n";
|
Out << " ~iN () {} \n";
|
||||||
Out << " \n";
|
Out << " \n";
|
||||||
Out << " iN operator >> (const iN rhs) { \n";
|
Out << " iN operator >> (const iN rhs) { \n";
|
||||||
Out << " iN res; \n";
|
Out << " iN res; \n";
|
||||||
Out << " int length = num_bits / (sizeof (int) * 8); \n";
|
Out << " int length = num_bits / (sizeof (int) * 8); \n";
|
||||||
Out << " int cells_shift = rhs.num[0] / (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 << " int small_shift = rhs.num[0] % (sizeof(int) * 8); \n";
|
||||||
Out << " for (int i = 0; i < (length - cells_shift); i++) \n";
|
Out << " for (int i = 0; i < (length - cells_shift); i++) \n";
|
||||||
Out << " res.num[i] = this->num[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 << " 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] >> small_shift; \n";
|
||||||
Out << " res.num[i] = ((this->num[i + 1] << ((sizeof(int) * 8) - small_shift))) | res.num[i];\n";
|
Out << " res.num[i] = ((this->num[i + 1] << ((sizeof(int) * 8) - small_shift))) | res.num[i];\n";
|
||||||
Out << " } \n";
|
Out << " } \n";
|
||||||
Out << " res.num[length - 1] = res.num[length - 1] >> small_shift; \n";
|
Out << " res.num[length - 1] = res.num[length - 1] >> small_shift; \n";
|
||||||
Out << " return res; \n";
|
Out << " return res; \n";
|
||||||
Out << " } \n";
|
Out << " } \n";
|
||||||
Out << " \n";
|
Out << " \n";
|
||||||
Out << " iN operator & (iN rhs) { \n";
|
Out << " iN operator & (iN rhs) { \n";
|
||||||
Out << " iN res; \n";
|
Out << " iN res; \n";
|
||||||
Out << " int length = num_bits / (sizeof (int) * 8); \n";
|
Out << " int length = num_bits / (sizeof (int) * 8); \n";
|
||||||
Out << " for (int i = 0; i < length; i++) \n";
|
Out << " for (int i = 0; i < length; i++) \n";
|
||||||
Out << " res.num[i] = (this->num[i]) & (rhs.num[i]); \n";
|
Out << " res.num[i] = (this->num[i]) & (rhs.num[i]); \n";
|
||||||
Out << " return res; \n";
|
Out << " return res; \n";
|
||||||
Out << " } \n";
|
Out << " } \n";
|
||||||
Out << " \n";
|
Out << " \n";
|
||||||
Out << " operator uint32_t() { return this->num[0]; } \n";
|
Out << " operator uint32_t() { return this->num[0]; } \n";
|
||||||
Out << "}; \n";
|
Out << " \n";
|
||||||
Out << " \n";
|
Out << " template <class T> \n";
|
||||||
Out << "template <class T> \n";
|
Out << " friend iN<num_bits> __cast_bits(iN<num_bits> to, T from) { \n";
|
||||||
Out << "T __cast_bits (T to, __vec" << vectorWidth << "_i32 from) { \n";
|
Out << " for (int i = 0; i <" << vectorWidth << "; i++) \n";
|
||||||
Out << " for (int i = 0; i < 16; i++) \n";
|
Out << " to.num[i] = ((int*)(&from))[i]; \n";
|
||||||
Out << " to.num[i] = ((uint32_t*)(&from))[i]; \n";
|
Out << " return to; \n";
|
||||||
Out << " return to; \n";
|
Out << " } \n";
|
||||||
Out << "} \n";
|
Out << " \n";
|
||||||
|
Out << " template <class T> \n";
|
||||||
|
Out << " friend T __cast_bits(T to, iN<num_bits> 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 <int ALIGN, class T> \n";
|
||||||
|
Out << " friend void __store(T *p, iN<num_bits> 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";
|
Out << "\n";
|
||||||
|
|
||||||
// Get all of the struct types used in the module.
|
// Get all of the struct types used in the module.
|
||||||
|
|||||||
@@ -977,6 +977,25 @@ CAST_BITS_SCALAR(int64_t, double)
|
|||||||
CAST_BITS_SCALAR(double, uint64_t)
|
CAST_BITS_SCALAR(double, uint64_t)
|
||||||
CAST_BITS_SCALAR(double, int64_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
|
// various math functions
|
||||||
|
|
||||||
|
|||||||
@@ -295,6 +295,26 @@ CAST_BITS_SCALAR(int64_t, double)
|
|||||||
CAST_BITS_SCALAR(double, uint64_t)
|
CAST_BITS_SCALAR(double, uint64_t)
|
||||||
CAST_BITS_SCALAR(double, int64_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) \
|
#define CMP_AND_MASK_ONE(FUNC, TYPE) \
|
||||||
static FORCEINLINE __vec4_i1 FUNC##_and_mask(TYPE a, TYPE b, __vec4_i1 m) { \
|
static FORCEINLINE __vec4_i1 FUNC##_and_mask(TYPE a, TYPE b, __vec4_i1 m) { \
|
||||||
return __and(FUNC(a, b), m); \
|
return __and(FUNC(a, b), m); \
|
||||||
|
|||||||
Reference in New Issue
Block a user