diff --git a/cbackend.cpp b/cbackend.cpp index a9c4c525..81a70217 100644 --- a/cbackend.cpp +++ b/cbackend.cpp @@ -2752,6 +2752,59 @@ 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"; + // Get all of the struct types used in the module. std::vector StructTypes; llvm::TypeFinder typeFinder; @@ -2801,6 +2854,7 @@ void CWriter::printModuleTypes() { continue; Out << "typedef struct __attribute__ ((packed, aligned(" << Alignment[i] << "))) {\n "; + IsVolatile[i] ? Out << " volatile " : Out << " "; printType(Out, IT, false, "data"); Out << ";\n"; Out << "} iN_" << IT->getIntegerBitWidth() << "_align_" << Alignment[i] << ";\n"; diff --git a/examples/intrinsics/generic-16.h b/examples/intrinsics/generic-16.h index f5bacbb2..f44c581e 100644 --- a/examples/intrinsics/generic-16.h +++ b/examples/intrinsics/generic-16.h @@ -159,51 +159,6 @@ PRE_ALIGN(128) struct __vec16_i64 : public vec16 { v8, v9, v10, v11, v12, v13, v14, v15) { } } POST_ALIGN(128); -template -struct iN { - int num[num_bits / (sizeof (int) * 8)]; - - iN () {} - - iN (const char *val) { - if (val == NULL) - return; - int length = num_bits / (sizeof (int) * 8); - int val_len = 0; - for (val_len = 0; val[val_len]; (val_len)++); - for (int i = 0; (i < val_len && i < num_bits); i++) - num[i / (sizeof (int) * 8)] = (num[i / (sizeof (int) * 8)] << 1) | (val[i] - '0'); - } - - ~iN () {} - - iN operator >> (const iN rhs) { - iN res; - int length = num_bits / (sizeof (int) * 8); - int cells = rhs.num[0] / (sizeof(int) * 8); - for (int i = 0; i < (length - cells); i++) - res.num[i] = this->num[cells + i]; - return res; - } - - iN operator & (iN rhs) { - iN res; - int length = num_bits / (sizeof (int) * 8); - for (int i = 0; i < length; i++) - res.num[i] = (this->num[i]) & (rhs.num[i]); - return res; - } - - operator uint32_t() { return this->num[0]; } -}; - -template -T __cast_bits (T to, __vec16_i32 from) { - for (int i = 0; i < 16; i++) - to.num[i] = ((uint32_t*)(&from))[i] ; - return to; -} - /////////////////////////////////////////////////////////////////////////// // macros... diff --git a/examples/intrinsics/knc.h b/examples/intrinsics/knc.h index 907d966d..a0d072fa 100644 --- a/examples/intrinsics/knc.h +++ b/examples/intrinsics/knc.h @@ -94,51 +94,6 @@ typedef int64_t __vec1_i64; struct __vec16_i32; -template -struct iN { - int num[num_bits / (sizeof (int) * 8)]; - - iN () {} - - iN (const char *val) { - if (val == NULL) - return; - int length = num_bits / (sizeof (int) * 8); - int val_len = 0; - for (val_len = 0; val[val_len]; (val_len)++); - for (int i = 0; (i < val_len && i < num_bits); i++) - num[i / (sizeof (int) * 8)] = (num[i / (sizeof (int) * 8)] << 1) | (val[i] - '0'); - } - - ~iN () {} - - iN operator >> (const iN rhs) { - iN res; - int length = num_bits / (sizeof (int) * 8); - int cells = rhs.num[0] / (sizeof(int) * 8); - for (int i = 0; i < (length - cells); i++) - res.num[i] = this->num[cells + i]; - return res; - } - - iN operator & (iN rhs) { - iN res; - int length = num_bits / (sizeof (int) * 8); - for (int i = 0; i < length; i++) - res.num[i] = (this->num[i]) & (rhs.num[i]); - return res; - } - - operator uint32_t() { return this->num[0]; } -}; - -template -T __cast_bits (T to, __vec16_i32 from) { - for (int i = 0; i < 16; i++) - to.num[i] = from[i] ; - return to; -} - #if 1 /* (iw) actually, this *SHOULD* be the right implementation for a vec16_i1: this one is a class that can have a constructor (which diff --git a/examples/intrinsics/sse4.h b/examples/intrinsics/sse4.h index 56483bf3..7ea94a1f 100644 --- a/examples/intrinsics/sse4.h +++ b/examples/intrinsics/sse4.h @@ -179,51 +179,6 @@ FORCEINLINE __vec4_i64::__vec4_i64(__vec4_d vd) { v[1] = _mm_castpd_si128(vd.v[1]); } -template -struct iN { - int num[num_bits / (sizeof (int) * 8)]; - - iN () {} - - iN (const char *val) { - if (val == NULL) - return; - int length = num_bits / (sizeof (int) * 8); - int val_len = 0; - for (val_len = 0; val[val_len]; (val_len)++); - for (int i = 0; (i < val_len && i < num_bits); i++) - num[i / (sizeof (int) * 8)] = (num[i / (sizeof (int) * 8)] << 1) | (val[i] - '0'); - } - - ~iN () {} - - iN operator >> (const iN rhs) { - iN res; - int length = num_bits / (sizeof (int) * 8); - int cells = rhs.num[0] / (sizeof(int) * 8); - for (int i = 0; i < (length - cells); i++) - res.num[i] = this->num[cells + i]; - return res; - } - - iN operator & (iN rhs) { - iN res; - int length = num_bits / (sizeof (int) * 8); - for (int i = 0; i < length; i++) - res.num[i] = (this->num[i]) & (rhs.num[i]); - return res; - } - - operator uint32_t() { return this->num[0]; } -}; - -template -T __cast_bits (T to, __vec4_i32 from) { - for (int i = 0; i < 16; i++) - to.num[i] = ((uint32_t*)(&from))[i] ; - return to; -} - /////////////////////////////////////////////////////////////////////////// // SSE helpers / utility functions