Constructor from string and operator&

This commit is contained in:
Vsevolod Livinskiy
2015-02-20 13:08:03 +03:00
parent 5302cfe062
commit a3bf0b2406
2 changed files with 73 additions and 6 deletions

View File

@@ -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<llvm::Value>(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";

View File

@@ -32,6 +32,7 @@
*/
#include <limits.h> // INT_MIN
#include <cstring>
#include <stdint.h>
#include <stdlib.h>
#include <math.h>
@@ -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 <class T>