Simplify UnaryOpStub a little bit.
Only a single constructor is really needed. Make UnaryOp_Patch's arguments simpler, avoiding encoding/decoding things in a cryptic way. Review URL: http://codereview.chromium.org/7248063 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8503 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
75bebf3db8
commit
e6ec7808db
@ -1731,22 +1731,14 @@ void UnaryOpStub::Generate(MacroAssembler* masm) {
|
||||
|
||||
|
||||
void UnaryOpStub::GenerateTypeTransition(MacroAssembler* masm) {
|
||||
// Prepare to push argument.
|
||||
__ mov(r3, Operand(r0));
|
||||
|
||||
// Push this stub's key. Although the operation and the type info are
|
||||
// encoded into the key, the encoding is opaque, so push them too.
|
||||
__ mov(r2, Operand(Smi::FromInt(MinorKey())));
|
||||
__ mov(r1, Operand(Smi::FromInt(op_)));
|
||||
__ mov(r3, Operand(r0)); // the operand
|
||||
__ mov(r2, Operand(Smi::FromInt(op_)));
|
||||
__ mov(r1, Operand(Smi::FromInt(mode_)));
|
||||
__ mov(r0, Operand(Smi::FromInt(operand_type_)));
|
||||
|
||||
__ Push(r3, r2, r1, r0);
|
||||
|
||||
__ TailCallExternalReference(
|
||||
ExternalReference(IC_Utility(IC::kUnaryOp_Patch),
|
||||
masm->isolate()),
|
||||
4,
|
||||
1);
|
||||
ExternalReference(IC_Utility(IC::kUnaryOp_Patch), masm->isolate()), 4, 1);
|
||||
}
|
||||
|
||||
|
||||
|
@ -60,18 +60,11 @@ class TranscendentalCacheStub: public CodeStub {
|
||||
|
||||
class UnaryOpStub: public CodeStub {
|
||||
public:
|
||||
UnaryOpStub(Token::Value op, UnaryOverwriteMode mode)
|
||||
UnaryOpStub(Token::Value op,
|
||||
UnaryOverwriteMode mode,
|
||||
UnaryOpIC::TypeInfo operand_type = UnaryOpIC::UNINITIALIZED)
|
||||
: op_(op),
|
||||
mode_(mode),
|
||||
operand_type_(UnaryOpIC::UNINITIALIZED),
|
||||
name_(NULL) {
|
||||
}
|
||||
|
||||
UnaryOpStub(
|
||||
int key,
|
||||
UnaryOpIC::TypeInfo operand_type)
|
||||
: op_(OpBits::decode(key)),
|
||||
mode_(ModeBits::decode(key)),
|
||||
operand_type_(operand_type),
|
||||
name_(NULL) {
|
||||
}
|
||||
@ -89,8 +82,7 @@ class UnaryOpStub: public CodeStub {
|
||||
|
||||
#ifdef DEBUG
|
||||
void Print() {
|
||||
PrintF("UnaryOpStub %d (op %s), "
|
||||
"(mode %d, runtime_type_info %s)\n",
|
||||
PrintF("UnaryOpStub %d (op %s), (mode %d, runtime_type_info %s)\n",
|
||||
MinorKey(),
|
||||
Token::String(op_),
|
||||
static_cast<int>(mode_),
|
||||
|
@ -554,12 +554,10 @@ void UnaryOpStub::Generate(MacroAssembler* masm) {
|
||||
|
||||
void UnaryOpStub::GenerateTypeTransition(MacroAssembler* masm) {
|
||||
__ pop(ecx); // Save return address.
|
||||
__ push(eax);
|
||||
// the argument is now on top.
|
||||
// Push this stub's key. Although the operation and the type info are
|
||||
// encoded into the key, the encoding is opaque, so push them too.
|
||||
__ push(Immediate(Smi::FromInt(MinorKey())));
|
||||
|
||||
__ push(eax); // the operand
|
||||
__ push(Immediate(Smi::FromInt(op_)));
|
||||
__ push(Immediate(Smi::FromInt(mode_)));
|
||||
__ push(Immediate(Smi::FromInt(operand_type_)));
|
||||
|
||||
__ push(ecx); // Push return address.
|
||||
@ -567,8 +565,7 @@ void UnaryOpStub::GenerateTypeTransition(MacroAssembler* masm) {
|
||||
// Patch the caller to an appropriate specialized stub and return the
|
||||
// operation result to the caller of the stub.
|
||||
__ TailCallExternalReference(
|
||||
ExternalReference(IC_Utility(IC::kUnaryOp_Patch),
|
||||
masm->isolate()), 4, 1);
|
||||
ExternalReference(IC_Utility(IC::kUnaryOp_Patch), masm->isolate()), 4, 1);
|
||||
}
|
||||
|
||||
|
||||
|
@ -62,16 +62,11 @@ class TranscendentalCacheStub: public CodeStub {
|
||||
|
||||
class UnaryOpStub: public CodeStub {
|
||||
public:
|
||||
UnaryOpStub(Token::Value op, UnaryOverwriteMode mode)
|
||||
UnaryOpStub(Token::Value op,
|
||||
UnaryOverwriteMode mode,
|
||||
UnaryOpIC::TypeInfo operand_type = UnaryOpIC::UNINITIALIZED)
|
||||
: op_(op),
|
||||
mode_(mode),
|
||||
operand_type_(UnaryOpIC::UNINITIALIZED),
|
||||
name_(NULL) {
|
||||
}
|
||||
|
||||
UnaryOpStub(int key, UnaryOpIC::TypeInfo operand_type)
|
||||
: op_(OpBits::decode(key)),
|
||||
mode_(ModeBits::decode(key)),
|
||||
operand_type_(operand_type),
|
||||
name_(NULL) {
|
||||
}
|
||||
@ -89,8 +84,7 @@ class UnaryOpStub: public CodeStub {
|
||||
|
||||
#ifdef DEBUG
|
||||
void Print() {
|
||||
PrintF("TypeRecordingUnaryOpStub %d (op %s), "
|
||||
"(mode %d, runtime_type_info %s)\n",
|
||||
PrintF("UnaryOpStub %d (op %s), (mode %d, runtime_type_info %s)\n",
|
||||
MinorKey(),
|
||||
Token::String(op_),
|
||||
static_cast<int>(mode_),
|
||||
|
@ -2332,15 +2332,15 @@ RUNTIME_FUNCTION(MaybeObject*, UnaryOp_Patch) {
|
||||
|
||||
HandleScope scope(isolate);
|
||||
Handle<Object> operand = args.at<Object>(0);
|
||||
int key = args.smi_at(1);
|
||||
Token::Value op = static_cast<Token::Value>(args.smi_at(2));
|
||||
Token::Value op = static_cast<Token::Value>(args.smi_at(1));
|
||||
UnaryOverwriteMode mode = static_cast<UnaryOverwriteMode>(args.smi_at(2));
|
||||
UnaryOpIC::TypeInfo previous_type =
|
||||
static_cast<UnaryOpIC::TypeInfo>(args.smi_at(3));
|
||||
|
||||
UnaryOpIC::TypeInfo type = UnaryOpIC::GetTypeInfo(operand);
|
||||
type = UnaryOpIC::ComputeNewType(type, previous_type);
|
||||
|
||||
UnaryOpStub stub(key, type);
|
||||
UnaryOpStub stub(op, mode, type);
|
||||
Handle<Code> code = stub.GetCode();
|
||||
if (!code.is_null()) {
|
||||
if (FLAG_trace_ic) {
|
||||
|
@ -1846,19 +1846,13 @@ void UnaryOpStub::Generate(MacroAssembler* masm) {
|
||||
|
||||
void UnaryOpStub::GenerateTypeTransition(MacroAssembler* masm) {
|
||||
// Argument is in a0 and v0 at this point, so we can overwrite a0.
|
||||
// Push this stub's key. Although the operation and the type info are
|
||||
// encoded into the key, the encoding is opaque, so push them too.
|
||||
__ li(a2, Operand(Smi::FromInt(MinorKey())));
|
||||
__ li(a1, Operand(Smi::FromInt(op_)));
|
||||
__ li(a2, Operand(Smi::FromInt(op_)));
|
||||
__ li(a1, Operand(Smi::FromInt(mode_)));
|
||||
__ li(a0, Operand(Smi::FromInt(operand_type_)));
|
||||
|
||||
__ Push(v0, a2, a1, a0);
|
||||
|
||||
__ TailCallExternalReference(
|
||||
ExternalReference(IC_Utility(IC::kUnaryOp_Patch),
|
||||
masm->isolate()),
|
||||
4,
|
||||
1);
|
||||
ExternalReference(IC_Utility(IC::kUnaryOp_Patch), masm->isolate()), 4, 1);
|
||||
}
|
||||
|
||||
|
||||
|
@ -61,18 +61,11 @@ class TranscendentalCacheStub: public CodeStub {
|
||||
|
||||
class UnaryOpStub: public CodeStub {
|
||||
public:
|
||||
UnaryOpStub(Token::Value op, UnaryOverwriteMode mode)
|
||||
UnaryOpStub(Token::Value op,
|
||||
UnaryOverwriteMode mode,
|
||||
UnaryOpIC::TypeInfo operand_type = UnaryOpIC::UNINITIALIZED)
|
||||
: op_(op),
|
||||
mode_(mode),
|
||||
operand_type_(UnaryOpIC::UNINITIALIZED),
|
||||
name_(NULL) {
|
||||
}
|
||||
|
||||
UnaryOpStub(
|
||||
int key,
|
||||
UnaryOpIC::TypeInfo operand_type)
|
||||
: op_(OpBits::decode(key)),
|
||||
mode_(ModeBits::decode(key)),
|
||||
operand_type_(operand_type),
|
||||
name_(NULL) {
|
||||
}
|
||||
@ -90,8 +83,7 @@ class UnaryOpStub: public CodeStub {
|
||||
|
||||
#ifdef DEBUG
|
||||
void Print() {
|
||||
PrintF("UnaryOpStub %d (op %s), "
|
||||
"(mode %d, runtime_type_info %s)\n",
|
||||
PrintF("UnaryOpStub %d (op %s), (mode %d, runtime_type_info %s)\n",
|
||||
MinorKey(),
|
||||
Token::String(op_),
|
||||
static_cast<int>(mode_),
|
||||
|
@ -424,12 +424,10 @@ void UnaryOpStub::Generate(MacroAssembler* masm) {
|
||||
|
||||
void UnaryOpStub::GenerateTypeTransition(MacroAssembler* masm) {
|
||||
__ pop(rcx); // Save return address.
|
||||
__ push(rax);
|
||||
// Left and right arguments are now on top.
|
||||
// Push this stub's key. Although the operation and the type info are
|
||||
// encoded into the key, the encoding is opaque, so push them too.
|
||||
__ Push(Smi::FromInt(MinorKey()));
|
||||
|
||||
__ push(rax); // the operand
|
||||
__ Push(Smi::FromInt(op_));
|
||||
__ Push(Smi::FromInt(mode_));
|
||||
__ Push(Smi::FromInt(operand_type_));
|
||||
|
||||
__ push(rcx); // Push return address.
|
||||
@ -437,10 +435,7 @@ void UnaryOpStub::GenerateTypeTransition(MacroAssembler* masm) {
|
||||
// Patch the caller to an appropriate specialized stub and return the
|
||||
// operation result to the caller of the stub.
|
||||
__ TailCallExternalReference(
|
||||
ExternalReference(IC_Utility(IC::kUnaryOp_Patch),
|
||||
masm->isolate()),
|
||||
4,
|
||||
1);
|
||||
ExternalReference(IC_Utility(IC::kUnaryOp_Patch), masm->isolate()), 4, 1);
|
||||
}
|
||||
|
||||
|
||||
|
@ -61,18 +61,11 @@ class TranscendentalCacheStub: public CodeStub {
|
||||
|
||||
class UnaryOpStub: public CodeStub {
|
||||
public:
|
||||
UnaryOpStub(Token::Value op, UnaryOverwriteMode mode)
|
||||
UnaryOpStub(Token::Value op,
|
||||
UnaryOverwriteMode mode,
|
||||
UnaryOpIC::TypeInfo operand_type = UnaryOpIC::UNINITIALIZED)
|
||||
: op_(op),
|
||||
mode_(mode),
|
||||
operand_type_(UnaryOpIC::UNINITIALIZED),
|
||||
name_(NULL) {
|
||||
}
|
||||
|
||||
UnaryOpStub(
|
||||
int key,
|
||||
UnaryOpIC::TypeInfo operand_type)
|
||||
: op_(OpBits::decode(key)),
|
||||
mode_(ModeBits::decode(key)),
|
||||
operand_type_(operand_type),
|
||||
name_(NULL) {
|
||||
}
|
||||
@ -90,8 +83,7 @@ class UnaryOpStub: public CodeStub {
|
||||
|
||||
#ifdef DEBUG
|
||||
void Print() {
|
||||
PrintF("UnaryOpStub %d (op %s), "
|
||||
"(mode %d, runtime_type_info %s)\n",
|
||||
PrintF("UnaryOpStub %d (op %s), (mode %d, runtime_type_info %s)\n",
|
||||
MinorKey(),
|
||||
Token::String(op_),
|
||||
static_cast<int>(mode_),
|
||||
|
Loading…
Reference in New Issue
Block a user