From a3bf0b2406c021738f0218aab23f6a61a78535a5 Mon Sep 17 00:00:00 2001 From: Vsevolod Livinskiy Date: Fri, 20 Feb 2015 13:08:03 +0300 Subject: [PATCH] Constructor from string and operator& --- cbackend.cpp | 9 +++-- examples/intrinsics/knc.h | 70 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 73 insertions(+), 6 deletions(-) diff --git a/cbackend.cpp b/cbackend.cpp index 723469e8..aab29aa0 100644 --- a/cbackend.cpp +++ b/cbackend.cpp @@ -1486,8 +1486,11 @@ void CWriter::printConstant(llvm::Constant *CPV, bool Static) { Out << CI->getZExtValue() << 'u'; else if (Ty == llvm::Type::getInt64Ty(CPV->getContext())) Out << CI->getZExtValue() << "ull"; - else if (Ty->getPrimitiveSizeInBits() > 64) + else if (Ty->getPrimitiveSizeInBits() > 64) { + Out << "\""; llvm::dyn_cast(CPV)->printAsOperand(Out, false); + Out << "\""; + } else { Out << "(("; printSimpleType(Out, Ty, false) << ')'; @@ -2343,8 +2346,8 @@ bool CWriter::doInitialization(llvm::Module &M) { Out << "unsigned int putchar(unsigned int);\n"; Out << "int fflush(void *);\n"; Out << "int printf(const unsigned char *, ...);\n"; - Out << "uint8_t *memcpy(uint8_t *, uint8_t *, uint64_t );\n"; - Out << "uint8_t *memset(uint8_t *, uint8_t, uint64_t );\n"; +// Out << "uint8_t *memcpy(uint8_t *, uint8_t *, uint64_t );\n"; +// Out << "uint8_t *memset(uint8_t *, uint8_t, uint64_t );\n"; Out << "void memset_pattern16(void *, const void *, uint64_t );\n"; Out << "}\n\n"; diff --git a/examples/intrinsics/knc.h b/examples/intrinsics/knc.h index aeba353e..588d8509 100644 --- a/examples/intrinsics/knc.h +++ b/examples/intrinsics/knc.h @@ -32,6 +32,7 @@ */ #include // INT_MIN +#include #include #include #include @@ -81,9 +82,9 @@ extern "C" { int puts(unsigned char *); unsigned int putchar(unsigned int); int fflush(void *); - uint8_t *memcpy(uint8_t *, uint8_t *, uint64_t); - uint8_t *memset(uint8_t *, uint8_t, uint64_t); - void memset_pattern16(void *, const void *, uint64_t); +// uint8_t *memcpy(uint8_t *, uint8_t *, uint64_t); +// uint8_t *memset(uint8_t *, uint8_t, uint64_t); +// void memset_pattern16(void *, const void *, uint64_t); } typedef float __vec1_f; @@ -111,6 +112,36 @@ struct iN { num [0] = val; } + iN (const char *val) { + char in[strlen(val)]; + int n = strlen(val); + for (int i = 0; i < n; i++) + in[i] = val[i]; + + char out[num_bits]; + int m = 0; + do { + out[m++] = '0' + (in[n - 1] - '0')%2; + div_2(in, n); + } while (zero(in, n) == 0); + + for (int i = 0; i < m/2; ++i){ + char buf = out[i]; + out[i] = out[m - 1 - i]; + out[m - 1 - i] = buf; + } + out[m++] = '\0'; + + length = num_bits / (sizeof (int) * 8); + num = (int*) calloc (length, sizeof (int)); + + for (int i = 0; i < strlen(out); i++) + num[i / (sizeof (int) * 8)] = (num[i / (sizeof (int) * 8)] << 1) | (out[i] - '0'); + for (int i = strlen(out); i < num_bits; i++) + num[i / (sizeof (int) * 8)] = (num[i / (sizeof (int) * 8)] << 1); + } + + ~iN () { length = 0; free(num); num = NULL;} /* iN operator >> (const int rhs) { @@ -128,6 +159,15 @@ struct iN { res.num[i] = this->num[cells + i]; return res; } + + iN operator & (const iN rhs) { + iN res; + res.length = this->length; + for (int i = 0; i < this->length; i++) + res.num[i] = (this->num[i]) & (rhs.num[i]); + return res; + } + /* iN& operator= (iN rhs) { iN swap; @@ -140,6 +180,30 @@ struct iN { } */ operator uint32_t() { return this->num[0]; } + +private: +void div_2(char in[], int n){//деление числа на 2 + + int p = 0; + for (int i = 0; i < n; ++i){ + + int a = in[i] - '0' + p*10; + in[i] = a/2 + '0'; + p = a%2; + } +} + +int zero(char in[], int n){//проверка на ноль + + int rez = 1; + for (int i = 0; i < n; ++i) + if (in[i] != '0'){ + rez = 0; + break; + } + return rez; +} + }; template