Commit 1656dd63 authored by ager@chromium.org's avatar ager@chromium.org

Fix regression caused by the generation of a shift stub during

snapshot creation in a better way.

Encode whether or not the stub should use sse3 instructions in the
minor key of the stub.  The stubs generated during snapshot creation
will have sse3 disabled, but they will not be found when sse3 is
enabled.  Therefore they will only affect the code generated as part
of the snapshot.
Review URL: http://codereview.chromium.org/172086

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2705 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent b3f8ce7c
...@@ -6752,11 +6752,10 @@ void GenericBinaryOpStub::Generate(MacroAssembler* masm) { ...@@ -6752,11 +6752,10 @@ void GenericBinaryOpStub::Generate(MacroAssembler* masm) {
// Reserve space for converted numbers. // Reserve space for converted numbers.
__ sub(Operand(esp), Immediate(2 * kPointerSize)); __ sub(Operand(esp), Immediate(2 * kPointerSize));
bool use_sse3 = CpuFeatures::IsSupported(CpuFeatures::SSE3); if (use_sse3_) {
if (use_sse3) {
// Truncate the operands to 32-bit integers and check for // Truncate the operands to 32-bit integers and check for
// exceptions in doing so. // exceptions in doing so.
CpuFeatures::Scope scope(CpuFeatures::SSE3); CpuFeatures::Scope scope(CpuFeatures::SSE3);
__ fisttp_s(Operand(esp, 0 * kPointerSize)); __ fisttp_s(Operand(esp, 0 * kPointerSize));
__ fisttp_s(Operand(esp, 1 * kPointerSize)); __ fisttp_s(Operand(esp, 1 * kPointerSize));
__ fnstsw_ax(); __ fnstsw_ax();
...@@ -6841,7 +6840,7 @@ void GenericBinaryOpStub::Generate(MacroAssembler* masm) { ...@@ -6841,7 +6840,7 @@ void GenericBinaryOpStub::Generate(MacroAssembler* masm) {
// the runtime system. // the runtime system.
__ bind(&operand_conversion_failure); __ bind(&operand_conversion_failure);
__ add(Operand(esp), Immediate(2 * kPointerSize)); __ add(Operand(esp), Immediate(2 * kPointerSize));
if (use_sse3) { if (use_sse3_) {
// If we've used the SSE3 instructions for truncating the // If we've used the SSE3 instructions for truncating the
// floating point values to integers and it failed, we have a // floating point values to integers and it failed, we have a
// pending #IA exception. Clear it. // pending #IA exception. Clear it.
......
...@@ -618,6 +618,7 @@ class GenericBinaryOpStub: public CodeStub { ...@@ -618,6 +618,7 @@ class GenericBinaryOpStub: public CodeStub {
OverwriteMode mode, OverwriteMode mode,
GenericBinaryFlags flags) GenericBinaryFlags flags)
: op_(op), mode_(mode), flags_(flags) { : op_(op), mode_(mode), flags_(flags) {
use_sse3_ = CpuFeatures::IsSupported(CpuFeatures::SSE3);
ASSERT(OpBits::is_valid(Token::NUM_TOKENS)); ASSERT(OpBits::is_valid(Token::NUM_TOKENS));
} }
...@@ -627,6 +628,7 @@ class GenericBinaryOpStub: public CodeStub { ...@@ -627,6 +628,7 @@ class GenericBinaryOpStub: public CodeStub {
Token::Value op_; Token::Value op_;
OverwriteMode mode_; OverwriteMode mode_;
GenericBinaryFlags flags_; GenericBinaryFlags flags_;
bool use_sse3_;
const char* GetName(); const char* GetName();
...@@ -639,9 +641,10 @@ class GenericBinaryOpStub: public CodeStub { ...@@ -639,9 +641,10 @@ class GenericBinaryOpStub: public CodeStub {
} }
#endif #endif
// Minor key encoding in 16 bits FOOOOOOOOOOOOOMM. // Minor key encoding in 16 bits FSOOOOOOOOOOOOMM.
class ModeBits: public BitField<OverwriteMode, 0, 2> {}; class ModeBits: public BitField<OverwriteMode, 0, 2> {};
class OpBits: public BitField<Token::Value, 2, 13> {}; class OpBits: public BitField<Token::Value, 2, 12> {};
class SSE3Bits: public BitField<bool, 14, 1> {};
class FlagBits: public BitField<GenericBinaryFlags, 15, 1> {}; class FlagBits: public BitField<GenericBinaryFlags, 15, 1> {};
Major MajorKey() { return GenericBinaryOp; } Major MajorKey() { return GenericBinaryOp; }
...@@ -649,7 +652,8 @@ class GenericBinaryOpStub: public CodeStub { ...@@ -649,7 +652,8 @@ class GenericBinaryOpStub: public CodeStub {
// Encode the parameters in a unique 16 bit value. // Encode the parameters in a unique 16 bit value.
return OpBits::encode(op_) return OpBits::encode(op_)
| ModeBits::encode(mode_) | ModeBits::encode(mode_)
| FlagBits::encode(flags_); | FlagBits::encode(flags_)
| SSE3Bits::encode(use_sse3_);
} }
void Generate(MacroAssembler* masm); void Generate(MacroAssembler* masm);
}; };
......
...@@ -47,7 +47,7 @@ const $isFinite = GlobalIsFinite; ...@@ -47,7 +47,7 @@ const $isFinite = GlobalIsFinite;
// Helper function used to install functions on objects. // Helper function used to install functions on objects.
function InstallFunctions(object, attributes, functions) { function InstallFunctions(object, attributes, functions) {
if (functions.length >= 8) { if (functions.length >= 8) {
%OptimizeObjectForAddingMultipleProperties(object, functions.length / 2); %OptimizeObjectForAddingMultipleProperties(object, functions.length >> 1);
} }
for (var i = 0; i < functions.length; i += 2) { for (var i = 0; i < functions.length; i += 2) {
var key = functions[i]; var key = functions[i];
......
...@@ -7529,11 +7529,10 @@ void GenericBinaryOpStub::Generate(MacroAssembler* masm) { ...@@ -7529,11 +7529,10 @@ void GenericBinaryOpStub::Generate(MacroAssembler* masm) {
// Reserve space for converted numbers. // Reserve space for converted numbers.
__ subq(rsp, Immediate(2 * kPointerSize)); __ subq(rsp, Immediate(2 * kPointerSize));
bool use_sse3 = CpuFeatures::IsSupported(CpuFeatures::SSE3); if (use_sse3_) {
if (use_sse3) {
// Truncate the operands to 32-bit integers and check for // Truncate the operands to 32-bit integers and check for
// exceptions in doing so. // exceptions in doing so.
CpuFeatures::Scope scope(CpuFeatures::SSE3); CpuFeatures::Scope scope(CpuFeatures::SSE3);
__ fisttp_s(Operand(rsp, 0 * kPointerSize)); __ fisttp_s(Operand(rsp, 0 * kPointerSize));
__ fisttp_s(Operand(rsp, 1 * kPointerSize)); __ fisttp_s(Operand(rsp, 1 * kPointerSize));
__ fnstsw_ax(); __ fnstsw_ax();
...@@ -7618,7 +7617,7 @@ void GenericBinaryOpStub::Generate(MacroAssembler* masm) { ...@@ -7618,7 +7617,7 @@ void GenericBinaryOpStub::Generate(MacroAssembler* masm) {
// the runtime system. // the runtime system.
__ bind(&operand_conversion_failure); __ bind(&operand_conversion_failure);
__ addq(rsp, Immediate(2 * kPointerSize)); __ addq(rsp, Immediate(2 * kPointerSize));
if (use_sse3) { if (use_sse3_) {
// If we've used the SSE3 instructions for truncating the // If we've used the SSE3 instructions for truncating the
// floating point values to integers and it failed, we have a // floating point values to integers and it failed, we have a
// pending #IA exception. Clear it. // pending #IA exception. Clear it.
......
...@@ -619,6 +619,7 @@ class GenericBinaryOpStub: public CodeStub { ...@@ -619,6 +619,7 @@ class GenericBinaryOpStub: public CodeStub {
OverwriteMode mode, OverwriteMode mode,
GenericBinaryFlags flags) GenericBinaryFlags flags)
: op_(op), mode_(mode), flags_(flags) { : op_(op), mode_(mode), flags_(flags) {
use_sse3_ = CpuFeatures::IsSupported(CpuFeatures::SSE3);
ASSERT(OpBits::is_valid(Token::NUM_TOKENS)); ASSERT(OpBits::is_valid(Token::NUM_TOKENS));
} }
...@@ -628,6 +629,7 @@ class GenericBinaryOpStub: public CodeStub { ...@@ -628,6 +629,7 @@ class GenericBinaryOpStub: public CodeStub {
Token::Value op_; Token::Value op_;
OverwriteMode mode_; OverwriteMode mode_;
GenericBinaryFlags flags_; GenericBinaryFlags flags_;
bool use_sse3_;
const char* GetName(); const char* GetName();
...@@ -640,17 +642,19 @@ class GenericBinaryOpStub: public CodeStub { ...@@ -640,17 +642,19 @@ class GenericBinaryOpStub: public CodeStub {
} }
#endif #endif
// Minor key encoding in 16 bits FOOOOOOOOOOOOOMM. // Minor key encoding in 16 bits FSOOOOOOOOOOOOMM.
class ModeBits: public BitField<OverwriteMode, 0, 2> {}; class ModeBits: public BitField<OverwriteMode, 0, 2> {};
class OpBits: public BitField<Token::Value, 2, 13> {}; class OpBits: public BitField<Token::Value, 2, 12> {};
class SSE3Bits: public BitField<bool, 14, 1> {};
class FlagBits: public BitField<GenericBinaryFlags, 15, 1> {}; class FlagBits: public BitField<GenericBinaryFlags, 15, 1> {};
Major MajorKey() { return GenericBinaryOp; } Major MajorKey() { return GenericBinaryOp; }
int MinorKey() { int MinorKey() {
// Encode the parameters in a unique 16 bit value. // Encode the parameters in a unique 16 bit value.
return OpBits::encode(op_) return OpBits::encode(op_)
| ModeBits::encode(mode_) | ModeBits::encode(mode_)
| FlagBits::encode(flags_); | FlagBits::encode(flags_)
| SSE3Bits::encode(use_sse3_);
} }
void Generate(MacroAssembler* masm); void Generate(MacroAssembler* masm);
}; };
......
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