This commit is contained in:
Nicholas Nethercote 2010-04-05 22:17:33 -07:00
Родитель 5ed0da137c 0e37be29f3
Коммит 7cc178a639
1 изменённых файлов: 24 добавлений и 23 удалений

Просмотреть файл

@ -1624,46 +1624,47 @@ foprnd2(LIns* i)
} }
static LIns* static LIns*
demote(LirWriter *out, LIns* i) demote(LirWriter *out, LIns* ins)
{ {
if (i->isCall()) JS_ASSERT(ins->isF64());
return i->callArgN(0); if (ins->isCall())
if (isfop(i, LIR_i2f) || isfop(i, LIR_u2f)) return ins->callArgN(0);
return foprnd1(i); if (isfop(ins, LIR_i2f) || isfop(ins, LIR_u2f))
if (i->isconst()) return foprnd1(ins);
return i; JS_ASSERT(ins->isconstf());
JS_ASSERT(i->isconstf()); double cf = ins->imm64f();
double cf = i->imm64f();
int32_t ci = cf > 0x7fffffff ? uint32_t(cf) : int32_t(cf); int32_t ci = cf > 0x7fffffff ? uint32_t(cf) : int32_t(cf);
return out->insImm(ci); return out->insImm(ci);
} }
static bool static bool
isPromoteInt(LIns* i) isPromoteInt(LIns* ins)
{ {
if (isfop(i, LIR_i2f) || i->isconst()) if (isfop(ins, LIR_i2f))
return true; return true;
if (!i->isconstf()) if (ins->isconstf()) {
return false; jsdouble d = ins->imm64f();
jsdouble d = i->imm64f(); return d == jsdouble(jsint(d)) && !JSDOUBLE_IS_NEGZERO(d);
return d == jsdouble(jsint(d)) && !JSDOUBLE_IS_NEGZERO(d); }
return false;
} }
static bool static bool
isPromoteUint(LIns* i) isPromoteUint(LIns* ins)
{ {
if (isfop(i, LIR_u2f) || i->isconst()) if (isfop(ins, LIR_u2f))
return true; return true;
if (!i->isconstf()) if (ins->isconstf()) {
return false; jsdouble d = ins->imm64f();
jsdouble d = i->imm64f(); return d == jsdouble(jsuint(d)) && !JSDOUBLE_IS_NEGZERO(d);
return d == jsdouble(jsuint(d)) && !JSDOUBLE_IS_NEGZERO(d); }
return false;
} }
static bool static bool
isPromote(LIns* i) isPromote(LIns* ins)
{ {
return isPromoteInt(i) || isPromoteUint(i); return isPromoteInt(ins) || isPromoteUint(ins);
} }
/* /*