Eliminate Smi check when changing from Smi to Integer32
BUG= R=verwaest@chromium.org Review URL: https://chromiumcodereview.appspot.com/22824003 Patch from Weiliang Lin <weiliang.lin2@gmail.com>. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16362 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
788811244e
commit
6479ea3379
@ -1925,11 +1925,12 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) {
|
|||||||
ASSERT(to.IsInteger32());
|
ASSERT(to.IsInteger32());
|
||||||
LOperand* value = NULL;
|
LOperand* value = NULL;
|
||||||
LInstruction* res = NULL;
|
LInstruction* res = NULL;
|
||||||
if (instr->value()->type().IsSmi()) {
|
HValue* val = instr->value();
|
||||||
value = UseRegisterAtStart(instr->value());
|
if (val->type().IsSmi() || val->representation().IsSmi()) {
|
||||||
|
value = UseRegisterAtStart(val);
|
||||||
res = DefineAsRegister(new(zone()) LSmiUntag(value, false));
|
res = DefineAsRegister(new(zone()) LSmiUntag(value, false));
|
||||||
} else {
|
} else {
|
||||||
value = UseRegister(instr->value());
|
value = UseRegister(val);
|
||||||
LOperand* temp1 = TempRegister();
|
LOperand* temp1 = TempRegister();
|
||||||
LOperand* temp2 = FixedTemp(d11);
|
LOperand* temp2 = FixedTemp(d11);
|
||||||
res = DefineSameAsFirst(new(zone()) LTaggedToI(value,
|
res = DefineSameAsFirst(new(zone()) LTaggedToI(value,
|
||||||
|
@ -1945,13 +1945,14 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) {
|
|||||||
return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value)));
|
return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value)));
|
||||||
} else {
|
} else {
|
||||||
ASSERT(to.IsInteger32());
|
ASSERT(to.IsInteger32());
|
||||||
if (instr->value()->type().IsSmi()) {
|
HValue* val = instr->value();
|
||||||
LOperand* value = UseRegister(instr->value());
|
if (val->type().IsSmi() || val->representation().IsSmi()) {
|
||||||
|
LOperand* value = UseRegister(val);
|
||||||
return DefineSameAsFirst(new(zone()) LSmiUntag(value, false));
|
return DefineSameAsFirst(new(zone()) LSmiUntag(value, false));
|
||||||
} else {
|
} else {
|
||||||
bool truncating = instr->CanTruncateToInt32();
|
bool truncating = instr->CanTruncateToInt32();
|
||||||
if (CpuFeatures::IsSafeForSnapshot(SSE2)) {
|
if (CpuFeatures::IsSafeForSnapshot(SSE2)) {
|
||||||
LOperand* value = UseRegister(instr->value());
|
LOperand* value = UseRegister(val);
|
||||||
LOperand* xmm_temp =
|
LOperand* xmm_temp =
|
||||||
(truncating && CpuFeatures::IsSupported(SSE3))
|
(truncating && CpuFeatures::IsSupported(SSE3))
|
||||||
? NULL
|
? NULL
|
||||||
@ -1959,7 +1960,7 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) {
|
|||||||
LTaggedToI* res = new(zone()) LTaggedToI(value, xmm_temp);
|
LTaggedToI* res = new(zone()) LTaggedToI(value, xmm_temp);
|
||||||
return AssignEnvironment(DefineSameAsFirst(res));
|
return AssignEnvironment(DefineSameAsFirst(res));
|
||||||
} else {
|
} else {
|
||||||
LOperand* value = UseFixed(instr->value(), ecx);
|
LOperand* value = UseFixed(val, ecx);
|
||||||
LTaggedToINoSSE2* res =
|
LTaggedToINoSSE2* res =
|
||||||
new(zone()) LTaggedToINoSSE2(value, TempRegister(),
|
new(zone()) LTaggedToINoSSE2(value, TempRegister(),
|
||||||
TempRegister(), TempRegister());
|
TempRegister(), TempRegister());
|
||||||
|
@ -1843,8 +1843,9 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) {
|
|||||||
return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value)));
|
return AssignEnvironment(DefineSameAsFirst(new(zone()) LCheckSmi(value)));
|
||||||
} else {
|
} else {
|
||||||
ASSERT(to.IsInteger32());
|
ASSERT(to.IsInteger32());
|
||||||
LOperand* value = UseRegister(instr->value());
|
HValue* val = instr->value();
|
||||||
if (instr->value()->type().IsSmi()) {
|
LOperand* value = UseRegister(val);
|
||||||
|
if (val->type().IsSmi() || val->representation().IsSmi()) {
|
||||||
return DefineSameAsFirst(new(zone()) LSmiUntag(value, false));
|
return DefineSameAsFirst(new(zone()) LSmiUntag(value, false));
|
||||||
} else {
|
} else {
|
||||||
bool truncating = instr->CanTruncateToInt32();
|
bool truncating = instr->CanTruncateToInt32();
|
||||||
|
Loading…
Reference in New Issue
Block a user