if (IR::Const *c1 = left->asConst()) {
if (IR::Const *c2 = right->asConst()) {
if (c1->type == IR::NumberType && c2->type == IR::NumberType) {
- const IR::Type ty = IR::NumberType;
-
switch (op) {
- case IR::OpAdd: return _block->CONST(ty, c1->value + c2->value);
- case IR::OpAnd: return _block->CONST(ty, c1->value ? c2->value : 0);
- case IR::OpBitAnd: return _block->CONST(ty, int(c1->value) & int(c2->value));
- case IR::OpBitOr: return _block->CONST(ty, int(c1->value) | int(c2->value));
- case IR::OpBitXor: return _block->CONST(ty, int(c1->value) ^ int(c2->value));
- case IR::OpDiv: return _block->CONST(ty, c1->value / c2->value);
- case IR::OpEqual: return _block->CONST(ty, c1->value == c2->value);
- case IR::OpGe: return _block->CONST(ty, c1->value >= c2->value);
- case IR::OpGt: return _block->CONST(ty, c1->value > c2->value);
- case IR::OpLe: return _block->CONST(ty, c1->value <= c2->value);
- case IR::OpLShift: return _block->CONST(ty, int(c1->value) << int(c2->value));
- case IR::OpLt: return _block->CONST(ty, c1->value < c2->value);
- case IR::OpMod: return _block->CONST(ty, ::fmod(c1->value, c2->value));
- case IR::OpMul: return _block->CONST(ty, c1->value * c2->value);
- case IR::OpNotEqual: return _block->CONST(ty, c1->value != c2->value);
- case IR::OpOr: return _block->CONST(ty, c1->value ? c1->value : c2->value);
- case IR::OpRShift: return _block->CONST(ty, int(c1->value) >> int(c2->value));
- case IR::OpStrictEqual: return _block->CONST(ty, c1->value == c2->value);
- case IR::OpStrictNotEqual: return _block->CONST(ty, c1->value != c2->value);
- case IR::OpSub: return _block->CONST(ty, c1->value - c2->value);
- case IR::OpURShift: return _block->CONST(ty, unsigned(c1->value) >> int(c2->value));
+ case IR::OpAdd: return _block->CONST(IR::NumberType, c1->value + c2->value);
+ case IR::OpAnd: return _block->CONST(IR::BoolType, c1->value ? c2->value : 0);
+ case IR::OpBitAnd: return _block->CONST(IR::NumberType, int(c1->value) & int(c2->value));
+ case IR::OpBitOr: return _block->CONST(IR::NumberType, int(c1->value) | int(c2->value));
+ case IR::OpBitXor: return _block->CONST(IR::NumberType, int(c1->value) ^ int(c2->value));
+ case IR::OpDiv: return _block->CONST(IR::NumberType, c1->value / c2->value);
+ case IR::OpEqual: return _block->CONST(IR::BoolType, c1->value == c2->value);
+ case IR::OpNotEqual: return _block->CONST(IR::BoolType, c1->value != c2->value);
+ case IR::OpStrictEqual: return _block->CONST(IR::BoolType, c1->value == c2->value);
+ case IR::OpStrictNotEqual: return _block->CONST(IR::BoolType, c1->value != c2->value);
+ case IR::OpGe: return _block->CONST(IR::BoolType, c1->value >= c2->value);
+ case IR::OpGt: return _block->CONST(IR::BoolType, c1->value > c2->value);
+ case IR::OpLe: return _block->CONST(IR::BoolType, c1->value <= c2->value);
+ case IR::OpLt: return _block->CONST(IR::BoolType, c1->value < c2->value);
+ case IR::OpLShift: return _block->CONST(IR::NumberType, int(c1->value) << int(c2->value));
+ case IR::OpMod: return _block->CONST(IR::NumberType, ::fmod(c1->value, c2->value));
+ case IR::OpMul: return _block->CONST(IR::NumberType, c1->value * c2->value);
+ case IR::OpOr: return _block->CONST(IR::NumberType, c1->value ? c1->value : c2->value);
+ case IR::OpRShift: return _block->CONST(IR::NumberType, int(c1->value) >> int(c2->value));
+ case IR::OpSub: return _block->CONST(IR::NumberType, c1->value - c2->value);
+ case IR::OpURShift: return _block->CONST(IR::NumberType, unsigned(c1->value) >> int(c2->value));
case IR::OpInstanceof:
case IR::OpIn: