Revision: 5734
Author: [email protected]
Date: Thu Oct 28 23:15:34 2010
Log: Landing for Justin Schuh.
This switches out the existing constant splitting with masking that works
like this:
1. Generate a random 32-bit value at compilation time.
2. XOR the 32-bit constant with the random value.
3. Emit the resulting immediate value along with the XOR operation to
generate the original value.
BUG=http://code.google.com/p/v8/issues/detail?id=908
http://code.google.com/p/v8/source/detail?r=5734
Modified:
/branches/bleeding_edge/src/flag-definitions.h
/branches/bleeding_edge/src/ia32/codegen-ia32.cc
/branches/bleeding_edge/src/ia32/codegen-ia32.h
=======================================
--- /branches/bleeding_edge/src/flag-definitions.h Tue Oct 19 09:45:11 2010
+++ /branches/bleeding_edge/src/flag-definitions.h Thu Oct 28 23:15:34 2010
@@ -140,6 +140,9 @@
// codegen-ia32.cc / codegen-arm.cc
DEFINE_bool(trace, false, "trace function calls")
DEFINE_bool(defer_negation, true, "defer negation operation")
+DEFINE_bool(mask_constants_with_cookie,
+ true,
+ "use random jit cookie to mask large constants")
// codegen.cc
DEFINE_bool(lazy, true, "use lazy compilation")
=======================================
--- /branches/bleeding_edge/src/ia32/codegen-ia32.cc Wed Oct 27 04:37:59
2010
+++ /branches/bleeding_edge/src/ia32/codegen-ia32.cc Thu Oct 28 23:15:34
2010
@@ -153,7 +153,8 @@
in_safe_int32_mode_(false),
safe_int32_mode_enabled_(true),
function_return_is_shadowed_(false),
- in_spilled_code_(false) {
+ in_spilled_code_(false),
+ jit_cookie_((FLAG_mask_constants_with_cookie) ? V8::Random() : 0) {
}
@@ -5363,16 +5364,16 @@
void CodeGenerator::PushUnsafeSmi(Handle<Object> value) {
ASSERT(value->IsSmi());
int bits = reinterpret_cast<int>(*value);
- __ push(Immediate(bits & 0x0000FFFF));
- __ or_(Operand(esp, 0), Immediate(bits & 0xFFFF0000));
+ __ push(Immediate(bits ^ jit_cookie_));
+ __ xor_(Operand(esp, 0), Immediate(jit_cookie_));
}
void CodeGenerator::StoreUnsafeSmiToLocal(int offset, Handle<Object>
value) {
ASSERT(value->IsSmi());
int bits = reinterpret_cast<int>(*value);
- __ mov(Operand(ebp, offset), Immediate(bits & 0x0000FFFF));
- __ or_(Operand(ebp, offset), Immediate(bits & 0xFFFF0000));
+ __ mov(Operand(ebp, offset), Immediate(bits ^ jit_cookie_));
+ __ xor_(Operand(ebp, offset), Immediate(jit_cookie_));
}
@@ -5380,8 +5381,8 @@
ASSERT(target.is_valid());
ASSERT(value->IsSmi());
int bits = reinterpret_cast<int>(*value);
- __ Set(target, Immediate(bits & 0x0000FFFF));
- __ or_(target, bits & 0xFFFF0000);
+ __ Set(target, Immediate(bits ^ jit_cookie_));
+ __ xor_(target, jit_cookie_);
}
=======================================
--- /branches/bleeding_edge/src/ia32/codegen-ia32.h Mon Oct 18 03:23:45 2010
+++ /branches/bleeding_edge/src/ia32/codegen-ia32.h Thu Oct 28 23:15:34 2010
@@ -785,6 +785,11 @@
// in a spilled state.
bool in_spilled_code_;
+ // A cookie that is used for JIT IMM32 Encoding. Initialized to a
+ // random number when the command-line
+ // FLAG_mask_constants_with_cookie is true, zero otherwise.
+ int jit_cookie_;
+
friend class VirtualFrame;
friend class JumpTarget;
friend class Reference;
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev