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';
|
||||
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";
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user