Constructor from string and operator&
This commit is contained in:
@@ -1486,8 +1486,11 @@ void CWriter::printConstant(llvm::Constant *CPV, bool Static) {
|
|||||||
Out << CI->getZExtValue() << 'u';
|
Out << CI->getZExtValue() << 'u';
|
||||||
else if (Ty == llvm::Type::getInt64Ty(CPV->getContext()))
|
else if (Ty == llvm::Type::getInt64Ty(CPV->getContext()))
|
||||||
Out << CI->getZExtValue() << "ull";
|
Out << CI->getZExtValue() << "ull";
|
||||||
else if (Ty->getPrimitiveSizeInBits() > 64)
|
else if (Ty->getPrimitiveSizeInBits() > 64) {
|
||||||
|
Out << "\"";
|
||||||
llvm::dyn_cast<llvm::Value>(CPV)->printAsOperand(Out, false);
|
llvm::dyn_cast<llvm::Value>(CPV)->printAsOperand(Out, false);
|
||||||
|
Out << "\"";
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
Out << "((";
|
Out << "((";
|
||||||
printSimpleType(Out, Ty, false) << ')';
|
printSimpleType(Out, Ty, false) << ')';
|
||||||
@@ -2343,8 +2346,8 @@ bool CWriter::doInitialization(llvm::Module &M) {
|
|||||||
Out << "unsigned int putchar(unsigned int);\n";
|
Out << "unsigned int putchar(unsigned int);\n";
|
||||||
Out << "int fflush(void *);\n";
|
Out << "int fflush(void *);\n";
|
||||||
Out << "int printf(const unsigned char *, ...);\n";
|
Out << "int printf(const unsigned char *, ...);\n";
|
||||||
Out << "uint8_t *memcpy(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 << "uint8_t *memset(uint8_t *, uint8_t, uint64_t );\n";
|
||||||
Out << "void memset_pattern16(void *, const void *, uint64_t );\n";
|
Out << "void memset_pattern16(void *, const void *, uint64_t );\n";
|
||||||
Out << "}\n\n";
|
Out << "}\n\n";
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <limits.h> // INT_MIN
|
#include <limits.h> // INT_MIN
|
||||||
|
#include <cstring>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
@@ -81,9 +82,9 @@ extern "C" {
|
|||||||
int puts(unsigned char *);
|
int puts(unsigned char *);
|
||||||
unsigned int putchar(unsigned int);
|
unsigned int putchar(unsigned int);
|
||||||
int fflush(void *);
|
int fflush(void *);
|
||||||
uint8_t *memcpy(uint8_t *, uint8_t *, uint64_t);
|
// uint8_t *memcpy(uint8_t *, uint8_t *, uint64_t);
|
||||||
uint8_t *memset(uint8_t *, uint8_t, uint64_t);
|
// uint8_t *memset(uint8_t *, uint8_t, uint64_t);
|
||||||
void memset_pattern16(void *, const void *, uint64_t);
|
// void memset_pattern16(void *, const void *, uint64_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef float __vec1_f;
|
typedef float __vec1_f;
|
||||||
@@ -111,6 +112,36 @@ struct iN {
|
|||||||
num [0] = val;
|
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 () { length = 0; free(num); num = NULL;}
|
||||||
/*
|
/*
|
||||||
iN operator >> (const int rhs) {
|
iN operator >> (const int rhs) {
|
||||||
@@ -128,6 +159,15 @@ struct iN {
|
|||||||
res.num[i] = this->num[cells + i];
|
res.num[i] = this->num[cells + i];
|
||||||
return res;
|
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& operator= (iN rhs) {
|
||||||
iN swap;
|
iN swap;
|
||||||
@@ -140,6 +180,30 @@ struct iN {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
operator uint32_t() { return this->num[0]; }
|
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>
|
template <class T>
|
||||||
|
|||||||
Reference in New Issue
Block a user