Commit cbcec49c authored by whesse@chromium.org's avatar whesse@chromium.org

Make sure that type info of results is correctly recorded when results are...

Make sure that type info of results is correctly recorded when results are moved to registers by generated code.
Review URL: http://codereview.chromium.org/1905002

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4589 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 5ce05f66
...@@ -1426,6 +1426,9 @@ Result CodeGenerator::LikelySmiBinaryOperation(BinaryOperation* expr, ...@@ -1426,6 +1426,9 @@ Result CodeGenerator::LikelySmiBinaryOperation(BinaryOperation* expr,
Result* left, Result* left,
Result* right, Result* right,
OverwriteMode overwrite_mode) { OverwriteMode overwrite_mode) {
// Copy the type info because left and right may be overwritten.
TypeInfo left_type_info = left->type_info();
TypeInfo right_type_info = right->type_info();
Token::Value op = expr->op(); Token::Value op = expr->op();
Result answer; Result answer;
// Special handling of div and mod because they use fixed registers. // Special handling of div and mod because they use fixed registers.
...@@ -1501,8 +1504,8 @@ Result CodeGenerator::LikelySmiBinaryOperation(BinaryOperation* expr, ...@@ -1501,8 +1504,8 @@ Result CodeGenerator::LikelySmiBinaryOperation(BinaryOperation* expr,
(op == Token::DIV) ? eax : edx, (op == Token::DIV) ? eax : edx,
left->reg(), left->reg(),
right->reg(), right->reg(),
left->type_info(), left_type_info,
right->type_info(), right_type_info,
overwrite_mode); overwrite_mode);
if (left->reg().is(right->reg())) { if (left->reg().is(right->reg())) {
__ test(left->reg(), Immediate(kSmiTagMask)); __ test(left->reg(), Immediate(kSmiTagMask));
...@@ -1605,18 +1608,18 @@ Result CodeGenerator::LikelySmiBinaryOperation(BinaryOperation* expr, ...@@ -1605,18 +1608,18 @@ Result CodeGenerator::LikelySmiBinaryOperation(BinaryOperation* expr,
answer.reg(), answer.reg(),
left->reg(), left->reg(),
ecx, ecx,
left->type_info(), left_type_info,
right->type_info(), right_type_info,
overwrite_mode); overwrite_mode);
Label do_op, left_nonsmi; Label do_op, left_nonsmi;
// If right is a smi we make a fast case if left is either a smi // If right is a smi we make a fast case if left is either a smi
// or a heapnumber. // or a heapnumber.
if (CpuFeatures::IsSupported(SSE2) && right->type_info().IsSmi()) { if (CpuFeatures::IsSupported(SSE2) && right_type_info.IsSmi()) {
CpuFeatures::Scope use_sse2(SSE2); CpuFeatures::Scope use_sse2(SSE2);
__ mov(answer.reg(), left->reg()); __ mov(answer.reg(), left->reg());
// Fast case - both are actually smis. // Fast case - both are actually smis.
if (!left->type_info().IsSmi()) { if (!left_type_info.IsSmi()) {
__ test(answer.reg(), Immediate(kSmiTagMask)); __ test(answer.reg(), Immediate(kSmiTagMask));
__ j(not_zero, &left_nonsmi); __ j(not_zero, &left_nonsmi);
} else { } else {
...@@ -1640,7 +1643,7 @@ Result CodeGenerator::LikelySmiBinaryOperation(BinaryOperation* expr, ...@@ -1640,7 +1643,7 @@ Result CodeGenerator::LikelySmiBinaryOperation(BinaryOperation* expr,
deferred->Branch(negative); deferred->Branch(negative);
} else { } else {
CheckTwoForSminess(masm_, left->reg(), right->reg(), answer.reg(), CheckTwoForSminess(masm_, left->reg(), right->reg(), answer.reg(),
left->type_info(), right->type_info(), deferred); left_type_info, right_type_info, deferred);
// Untag both operands. // Untag both operands.
__ mov(answer.reg(), left->reg()); __ mov(answer.reg(), left->reg());
...@@ -1713,11 +1716,11 @@ Result CodeGenerator::LikelySmiBinaryOperation(BinaryOperation* expr, ...@@ -1713,11 +1716,11 @@ Result CodeGenerator::LikelySmiBinaryOperation(BinaryOperation* expr,
answer.reg(), answer.reg(),
left->reg(), left->reg(),
right->reg(), right->reg(),
left->type_info(), left_type_info,
right->type_info(), right_type_info,
overwrite_mode); overwrite_mode);
CheckTwoForSminess(masm_, left->reg(), right->reg(), answer.reg(), CheckTwoForSminess(masm_, left->reg(), right->reg(), answer.reg(),
left->type_info(), right->type_info(), deferred); left_type_info, right_type_info, deferred);
__ mov(answer.reg(), left->reg()); __ mov(answer.reg(), left->reg());
switch (op) { switch (op) {
...@@ -1988,18 +1991,13 @@ void DeferredInlineSmiSub::Generate() { ...@@ -1988,18 +1991,13 @@ void DeferredInlineSmiSub::Generate() {
} }
Result CodeGenerator::ConstantSmiBinaryOperation( Result CodeGenerator::ConstantSmiBinaryOperation(BinaryOperation* expr,
BinaryOperation* expr,
Result* operand, Result* operand,
Handle<Object> value, Handle<Object> value,
bool reversed, bool reversed,
OverwriteMode overwrite_mode) { OverwriteMode overwrite_mode) {
// NOTE: This is an attempt to inline (a bit) more of the code for // Generate inline code for a binary operation when one of the
// some possible smi operations (like + and -) when (at least) one // operands is a constant smi. Consumes the argument "operand".
// of the operands is a constant smi.
// Consumes the argument "operand".
// TODO(199): Optimize some special cases of operations involving a
// smi literal (multiply by 2, shift by 0, etc.).
if (IsUnsafeSmi(value)) { if (IsUnsafeSmi(value)) {
Result unsafe_operand(value); Result unsafe_operand(value);
if (reversed) { if (reversed) {
......
...@@ -6404,10 +6404,8 @@ Result CodeGenerator::ConstantSmiBinaryOperation(BinaryOperation* expr, ...@@ -6404,10 +6404,8 @@ Result CodeGenerator::ConstantSmiBinaryOperation(BinaryOperation* expr,
Handle<Object> value, Handle<Object> value,
bool reversed, bool reversed,
OverwriteMode overwrite_mode) { OverwriteMode overwrite_mode) {
// NOTE: This is an attempt to inline (a bit) more of the code for // Generate inline code for a binary operation when one of the
// some possible smi operations (like + and -) when (at least) one // operands is a constant smi. Consumes the argument "operand".
// of the operands is a constant smi.
// Consumes the argument "operand".
if (IsUnsafeSmi(value)) { if (IsUnsafeSmi(value)) {
Result unsafe_operand(value); Result unsafe_operand(value);
if (reversed) { if (reversed) {
...@@ -6685,10 +6683,19 @@ Result CodeGenerator::ConstantSmiBinaryOperation(BinaryOperation* expr, ...@@ -6685,10 +6683,19 @@ Result CodeGenerator::ConstantSmiBinaryOperation(BinaryOperation* expr,
return answer; return answer;
} }
// Implements a binary operation using a deferred code object and some
// inline code to operate on smis quickly.
Result CodeGenerator::LikelySmiBinaryOperation(BinaryOperation* expr, Result CodeGenerator::LikelySmiBinaryOperation(BinaryOperation* expr,
Result* left, Result* left,
Result* right, Result* right,
OverwriteMode overwrite_mode) { OverwriteMode overwrite_mode) {
// Copy the type info because left and right may be overwritten.
TypeInfo left_type_info = left->type_info();
TypeInfo right_type_info = right->type_info();
USE(left_type_info);
USE(right_type_info);
// TODO(X64): Use type information in calculations.
Token::Value op = expr->op(); Token::Value op = expr->op();
Result answer; Result answer;
// Special handling of div and mod because they use fixed registers. // Special handling of div and mod because they use fixed registers.
...@@ -6813,9 +6820,7 @@ Result CodeGenerator::LikelySmiBinaryOperation(BinaryOperation* expr, ...@@ -6813,9 +6820,7 @@ Result CodeGenerator::LikelySmiBinaryOperation(BinaryOperation* expr,
left->reg(), left->reg(),
rcx, rcx,
overwrite_mode); overwrite_mode);
__ movq(answer.reg(), left->reg()); __ JumpIfNotBothSmi(left->reg(), rcx, deferred->entry_label());
__ or_(answer.reg(), rcx);
__ JumpIfNotSmi(answer.reg(), deferred->entry_label());
// Perform the operation. // Perform the operation.
switch (op) { switch (op) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment