Skip to content

Commit

Permalink
refactor IntegerExp
Browse files Browse the repository at this point in the history
  • Loading branch information
WalterBright committed Apr 28, 2014
1 parent 9871b57 commit efd99ae
Show file tree
Hide file tree
Showing 9 changed files with 120 additions and 165 deletions.
78 changes: 28 additions & 50 deletions src/cast.c
Expand Up @@ -300,39 +300,16 @@ MATCH implicitConvTo(Expression *e, Type *t)
switch (ty)
{
case Tbool:
e->value &= 1;
ty = Tint32;
break;

case Tint8:
e->value = (signed char)e->value;
ty = Tint32;
break;

case Tchar:
case Tuns8:
e->value &= 0xFF;
ty = Tint32;
break;

case Tint16:
e->value = (short)e->value;
ty = Tint32;
break;

case Tuns16:
case Twchar:
e->value &= 0xFFFF;
ty = Tint32;
break;

case Tint32:
e->value = (int)e->value;
break;

case Tuns32:
case Tdchar:
e->value &= 0xFFFFFFFF;
ty = Tuns32;
break;

Expand All @@ -341,64 +318,65 @@ MATCH implicitConvTo(Expression *e, Type *t)
}

// Only allow conversion if no change in value
dinteger_t value = e->toInteger();
switch (toty)
{
case Tbool:
if ((e->value & 1) != e->value)
if ((value & 1) != value)
return;
break;

case Tint8:
if (ty == Tuns64 && e->value & ~0x7FUL)
if (ty == Tuns64 && value & ~0x7FUL)
return;
else if ((signed char)e->value != e->value)
else if ((signed char)value != value)
return;
break;

case Tchar:
if ((oldty == Twchar || oldty == Tdchar) && e->value > 0x7F)
if ((oldty == Twchar || oldty == Tdchar) && value > 0x7F)
return;
case Tuns8:
//printf("value = %llu %llu\n", (dinteger_t)(unsigned char)e->value, e->value);
if ((unsigned char)e->value != e->value)
//printf("value = %llu %llu\n", (dinteger_t)(unsigned char)value, value);
if ((unsigned char)value != value)
return;
break;

case Tint16:
if (ty == Tuns64 && e->value & ~0x7FFFUL)
if (ty == Tuns64 && value & ~0x7FFFUL)
return;
else if ((short)e->value != e->value)
else if ((short)value != value)
return;
break;

case Twchar:
if (oldty == Tdchar && e->value > 0xD7FF && e->value < 0xE000)
if (oldty == Tdchar && value > 0xD7FF && value < 0xE000)
return;
case Tuns16:
if ((unsigned short)e->value != e->value)
if ((unsigned short)value != value)
return;
break;

case Tint32:
if (ty == Tuns32)
{
}
else if (ty == Tuns64 && e->value & ~0x7FFFFFFFUL)
else if (ty == Tuns64 && value & ~0x7FFFFFFFUL)
return;
else if ((int)e->value != e->value)
else if ((int)value != value)
return;
break;

case Tuns32:
if (ty == Tint32)
{
}
else if ((unsigned)e->value != e->value)
else if ((unsigned)value != value)
return;
break;

case Tdchar:
if (e->value > 0x10FFFFUL)
if (value > 0x10FFFFUL)
return;
break;

Expand All @@ -407,14 +385,14 @@ MATCH implicitConvTo(Expression *e, Type *t)
volatile float f;
if (e->type->isunsigned())
{
f = (float)e->value;
if (f != e->value)
f = (float)value;
if (f != value)
return;
}
else
{
f = (float)(sinteger_t)e->value;
if (f != (sinteger_t)e->value)
f = (float)(sinteger_t)value;
if (f != (sinteger_t)value)
return;
}
break;
Expand All @@ -425,14 +403,14 @@ MATCH implicitConvTo(Expression *e, Type *t)
volatile double f;
if (e->type->isunsigned())
{
f = (double)e->value;
if (f != e->value)
f = (double)value;
if (f != value)
return;
}
else
{
f = (double)(sinteger_t)e->value;
if (f != (sinteger_t)e->value)
f = (double)(sinteger_t)value;
if (f != (sinteger_t)value)
return;
}
break;
Expand All @@ -443,14 +421,14 @@ MATCH implicitConvTo(Expression *e, Type *t)
volatile_longdouble f;
if (e->type->isunsigned())
{
f = ldouble(e->value);
if (f != e->value) // isn't this a noop, because the compiler prefers ld
f = ldouble(value);
if (f != value) // isn't this a noop, because the compiler prefers ld
return;
}
else
{
f = ldouble((sinteger_t)e->value);
if (f != (sinteger_t)e->value)
f = ldouble((sinteger_t)value);
if (f != (sinteger_t)value)
return;
}
break;
Expand Down Expand Up @@ -3237,7 +3215,7 @@ IntRange getIntRange(Expression *e)

void visit(IntegerExp *e)
{
range = IntRange(SignExtendedNumber(e->value)).cast(e->type);
range = IntRange(SignExtendedNumber(e->getInteger())).cast(e->type);
}

void visit(CastExp *e)
Expand Down
45 changes: 23 additions & 22 deletions src/ctfeexpr.c
Expand Up @@ -873,10 +873,10 @@ void intUnary(TOK op, IntegerExp *e)
switch (op)
{
case TOKneg:
e->value = -e->value;
e->setInteger(-e->getInteger());
break;
case TOKtilde:
e->value = ~e->value;
e->setInteger(~e->getInteger());
break;
default:
assert(0);
Expand All @@ -892,26 +892,27 @@ void intBinary(TOK op, IntegerExp *dest, Type *type, IntegerExp *e1, IntegerExp
switch (op)
{
case TOKand:
result = e1->value & e2->value;
result = e1->getInteger() & e2->getInteger();
break;
case TOKor:
result = e1->value | e2->value;
result = e1->getInteger() | e2->getInteger();
break;
case TOKxor:
result = e1->value ^ e2->value;
result = e1->getInteger() ^ e2->getInteger();
break;
case TOKadd:
result = e1->value + e2->value;
result = e1->getInteger() + e2->getInteger();
break;
case TOKmin:
result = e1->value - e2->value;
result = e1->getInteger() - e2->getInteger();
break;
case TOKmul:
result = e1->value * e2->value;
result = e1->getInteger() * e2->getInteger();
break;
case TOKdiv:
{ sinteger_t n1 = e1->value;
sinteger_t n2 = e2->value;
{
sinteger_t n1 = e1->getInteger();
sinteger_t n2 = e2->getInteger();

if (n2 == 0)
{ e2->error("divide by 0");
Expand All @@ -924,8 +925,8 @@ void intBinary(TOK op, IntegerExp *dest, Type *type, IntegerExp *e1, IntegerExp
}
break;
case TOKmod:
{ sinteger_t n1 = e1->value;
sinteger_t n2 = e2->value;
{ sinteger_t n1 = e1->getInteger();
sinteger_t n2 = e2->getInteger();

if (n2 == 0)
{ e2->error("divide by 0");
Expand All @@ -951,13 +952,13 @@ void intBinary(TOK op, IntegerExp *dest, Type *type, IntegerExp *e1, IntegerExp
}
break;
case TOKpow:
{ dinteger_t n = e2->value;
{ dinteger_t n = e2->getInteger();
if (!e2->type->isunsigned() && (sinteger_t)n < 0)
{
e2->error("integer ^^ -integer: total loss of precision");
n = 1;
}
uinteger_t r = e1->value;
uinteger_t r = e1->getInteger();
result = 1;
while (n != 0)
{
Expand All @@ -969,11 +970,11 @@ void intBinary(TOK op, IntegerExp *dest, Type *type, IntegerExp *e1, IntegerExp
}
break;
case TOKshl:
result = e1->value << e2->value;
result = e1->getInteger() << e2->getInteger();
break;
case TOKshr:
{ dinteger_t value = e1->value;
dinteger_t dcount = e2->value;
{ dinteger_t value = e1->getInteger();
dinteger_t dcount = e2->getInteger();
assert(dcount <= 0xFFFFFFFF);
unsigned count = (unsigned)dcount;
switch (e1->type->toBasetype()->ty)
Expand Down Expand Up @@ -1018,8 +1019,8 @@ void intBinary(TOK op, IntegerExp *dest, Type *type, IntegerExp *e1, IntegerExp
}
break;
case TOKushr:
{ dinteger_t value = e1->value;
dinteger_t dcount = e2->value;
{ dinteger_t value = e1->getInteger();
dinteger_t dcount = e2->getInteger();
assert(dcount <= 0xFFFFFFFF);
unsigned count = (unsigned)dcount;
switch (e1->type->toBasetype()->ty)
Expand Down Expand Up @@ -1056,16 +1057,16 @@ void intBinary(TOK op, IntegerExp *dest, Type *type, IntegerExp *e1, IntegerExp
break;
case TOKequal:
case TOKidentity:
result = (e1->value == e2->value);
result = (e1->getInteger() == e2->getInteger());
break;
case TOKnotequal:
case TOKnotidentity:
result = (e1->value != e2->value);
result = (e1->getInteger() != e2->getInteger());
break;
default:
assert(0);
}
dest->value = result;
dest->setInteger(result);
dest->type = type;
}

Expand Down
2 changes: 1 addition & 1 deletion src/e2ir.c
Expand Up @@ -1101,7 +1101,7 @@ elem *toElem(Expression *e, IRState *irs)

void visit(IntegerExp *ie)
{
elem *e = el_long(totym(ie->type), ie->value);
elem *e = el_long(totym(ie->type), ie->getInteger());
el_setLoc(e,ie->loc);
result = e;
}
Expand Down

0 comments on commit efd99ae

Please sign in to comment.