Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1272)

Unified Diff: src/x64/macro-assembler-x64.cc

Issue 6682026: Fix SmiCompare on 64 bit to distinguish between comparisons where... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/x64/macro-assembler-x64.cc
===================================================================
--- src/x64/macro-assembler-x64.cc (revision 7153)
+++ src/x64/macro-assembler-x64.cc (working copy)
@@ -124,7 +124,7 @@
ASSERT(!object.is(rsi) && !value.is(rsi) && !index.is(rsi));
// First, check if a write barrier is even needed. The tests below
- // catch stores of Smis and stores into young gen.
+ // catch stores of smis and stores into young gen.
Lasse Reichstein 2011/03/15 09:07:01 gen -> generation.
Erik Corry 2011/03/15 10:00:50 Done.
Label done;
JumpIfSmi(value, &done);
@@ -153,7 +153,7 @@
ASSERT(!object.is(rsi) && !value.is(rsi) && !address.is(rsi));
// First, check if a write barrier is even needed. The tests below
- // catch stores of Smis and stores into young gen.
+ // catch stores of smis and stores into young gen.
Lasse Reichstein 2011/03/15 09:07:01 ditto.
Erik Corry 2011/03/15 10:00:50 Done.
Label done;
JumpIfSmi(value, &done);
@@ -837,12 +837,26 @@
}
-void MacroAssembler::SmiCompare(Register dst, Register src) {
- cmpq(dst, src);
+void MacroAssembler::SmiCompare(Register smi1, Register smi2) {
+ if (FLAG_debug_code) {
+ AbortIfNotSmi(smi1);
+ AbortIfNotSmi(smi2);
Lasse Reichstein 2011/03/15 09:07:01 Good stuff!
Erik Corry 2011/03/15 10:00:50 yup
+ }
+ cmpq(smi1, smi2);
}
void MacroAssembler::SmiCompare(Register dst, Smi* src) {
+ if (FLAG_debug_code) {
+ AbortIfNotSmi(dst);
+ }
+ // Actually, knowing the register is a smi doesn't enable any optimizations
+ // with the current tagging scheme.
+ Cmp(dst, src);
Lasse Reichstein 2011/03/15 09:07:01 ... apart from the optimizations that Cmp also doe
Erik Corry 2011/03/15 10:00:50 Comment deleted.
+}
+
+
+void MacroAssembler::Cmp(Register dst, Smi* src) {
ASSERT(!dst.is(kScratchRegister));
if (src->value() == 0) {
testq(dst, dst);
@@ -854,20 +868,41 @@
void MacroAssembler::SmiCompare(Register dst, const Operand& src) {
+ if (FLAG_debug_code) {
+ AbortIfNotSmi(dst);
+ AbortIfNotSmi(src);
+ }
cmpq(dst, src);
}
void MacroAssembler::SmiCompare(const Operand& dst, Register src) {
+ if (FLAG_debug_code) {
+ AbortIfNotSmi(dst);
+ AbortIfNotSmi(src);
+ }
cmpq(dst, src);
}
void MacroAssembler::SmiCompare(const Operand& dst, Smi* src) {
+ if (FLAG_debug_code) {
+ AbortIfNotSmi(dst);
+ }
cmpl(Operand(dst, kSmiShift / kBitsPerByte), Immediate(src->value()));
}
+void MacroAssembler::Cmp(const Operand& dst, Smi* src) {
+ // The Operand cannot use the smi register, since we may use the scratch
Lasse Reichstein 2011/03/15 09:07:01 Notice that smi_reg is either kScratchRegister or
Erik Corry 2011/03/15 10:00:50 Comment updated.
+ // register to get around the lack of 64 bit immediates in the instruction
+ // set.
+ Register smi_reg = GetSmiConstant(src);
+ ASSERT(!dst.AddressUsesRegister(smi_reg));
+ cmpq(dst, smi_reg);
+}
+
+
void MacroAssembler::SmiCompareInteger32(const Operand& dst, Register src) {
cmpl(Operand(dst, kSmiShift / kBitsPerByte), src);
}
@@ -1352,7 +1387,7 @@
void MacroAssembler::Cmp(Register dst, Handle<Object> source) {
if (source->IsSmi()) {
- SmiCompare(dst, Smi::cast(*source));
+ Cmp(dst, Smi::cast(*source));
} else {
Move(kScratchRegister, source);
cmpq(dst, kScratchRegister);
@@ -1362,7 +1397,7 @@
void MacroAssembler::Cmp(const Operand& dst, Handle<Object> source) {
if (source->IsSmi()) {
- SmiCompare(dst, Smi::cast(*source));
+ Cmp(dst, Smi::cast(*source));
} else {
ASSERT(source->IsHeapObject());
movq(kScratchRegister, source, RelocInfo::EMBEDDED_OBJECT);
@@ -1753,12 +1788,17 @@
void MacroAssembler::AbortIfNotSmi(Register object) {
- NearLabel ok;
Condition is_smi = CheckSmi(object);
Assert(is_smi, "Operand is not a smi");
}
+void MacroAssembler::AbortIfNotSmi(const Operand& object) {
+ Condition is_smi = CheckSmi(object);
Lasse Reichstein 2011/03/15 09:07:01 Negate condition?
Lasse Reichstein 2011/03/15 09:08:19 Ignore me, this is correct.
Erik Corry 2011/03/15 10:00:50 Done.
Erik Corry 2011/03/15 10:00:50 Not done.
+ Assert(is_smi, "Operand is not a smi");
+}
+
+
void MacroAssembler::AbortIfNotString(Register object) {
testb(object, Immediate(kSmiTagMask));
Assert(not_equal, "Operand is not a string");

Powered by Google App Engine
This is Rietveld 408576698