author | Matthew Gaudet <mgaudet@mozilla.com> |
Wed, 31 Jan 2018 09:47:22 -0500 | |
changeset 463852 | f7e2429e6d59df10ceea38018267a5bebf2d9a56 |
parent 463851 | c8359f8f6142fe0378df4e510f60438cbfe3b1aa |
child 463853 | cc976c990dc8d9c7ab5cb22a82fdc4a11a751bcf |
push id | 9165 |
push user | asasaki@mozilla.com |
push date | Thu, 26 Apr 2018 21:04:54 +0000 |
treeherder | mozilla-beta@064c3804de2e [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | tcampbell |
bugs | 1434717 |
milestone | 61.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/js/src/jit/CacheIR.h +++ b/js/src/jit/CacheIR.h @@ -176,16 +176,17 @@ extern const char* CacheKindNames[]; #define CACHE_IR_OPS(_) \ _(GuardIsObject) \ _(GuardIsObjectOrNull) \ _(GuardIsNullOrUndefined) \ _(GuardIsString) \ _(GuardIsSymbol) \ _(GuardIsNumber) \ + _(GuardIsInt32) \ _(GuardIsInt32Index) \ _(GuardType) \ _(GuardShape) \ _(GuardGroup) \ _(GuardProto) \ _(GuardClass) /* Guard an object class, per GuardClassKind */ \ _(GuardAnyClass) /* Guard an arbitrary class for an object */ \ _(GuardCompartment) \ @@ -530,16 +531,22 @@ class MOZ_RAII CacheIRWriter : public JS StringOperandId guardIsString(ValOperandId val) { writeOpWithOperandId(CacheOp::GuardIsString, val); return StringOperandId(val.id()); } SymbolOperandId guardIsSymbol(ValOperandId val) { writeOpWithOperandId(CacheOp::GuardIsSymbol, val); return SymbolOperandId(val.id()); } + Int32OperandId guardIsInt32(ValOperandId val) { + Int32OperandId res(nextOperandId_++); + writeOpWithOperandId(CacheOp::GuardIsInt32, val); + writeOperandId(res); + return res; + } Int32OperandId guardIsInt32Index(ValOperandId val) { Int32OperandId res(nextOperandId_++); writeOpWithOperandId(CacheOp::GuardIsInt32Index, val); writeOperandId(res); return res; } void guardIsNumber(ValOperandId val) { writeOpWithOperandId(CacheOp::GuardIsNumber, val);
--- a/js/src/jit/CacheIRCompiler.cpp +++ b/js/src/jit/CacheIRCompiler.cpp @@ -1305,16 +1305,39 @@ CacheIRCompiler::emitGuardIsSymbol() FailurePath* failure; if (!addFailurePath(&failure)) return false; masm.branchTestSymbol(Assembler::NotEqual, input, failure->label()); return true; } bool +CacheIRCompiler::emitGuardIsInt32() +{ + ValOperandId inputId = reader.valOperandId(); + Register output = allocator.defineRegister(masm, reader.int32OperandId()); + + if (allocator.knownType(inputId) == JSVAL_TYPE_INT32) { + Register input = allocator.useRegister(masm, Int32OperandId(inputId.id())); + masm.move32(input, output); + return true; + } + ValueOperand input = allocator.useValueRegister(masm, inputId); + + FailurePath* failure; + if (!addFailurePath(&failure)) + return false; + + Label notInt32, done; + masm.branchTestInt32(Assembler::NotEqual, input, failure->label()); + masm.unboxInt32(input, output); + return true; +} + +bool CacheIRCompiler::emitGuardIsInt32Index() { ValOperandId inputId = reader.valOperandId(); Register output = allocator.defineRegister(masm, reader.int32OperandId()); if (allocator.knownType(inputId) == JSVAL_TYPE_INT32) { Register input = allocator.useRegister(masm, Int32OperandId(inputId.id())); masm.move32(input, output);
--- a/js/src/jit/CacheIRCompiler.h +++ b/js/src/jit/CacheIRCompiler.h @@ -18,16 +18,17 @@ namespace jit { // BaselineCacheIRCompiler and IonCacheIRCompiler. #define CACHE_IR_SHARED_OPS(_) \ _(GuardIsObject) \ _(GuardIsNullOrUndefined) \ _(GuardIsObjectOrNull) \ _(GuardIsString) \ _(GuardIsSymbol) \ _(GuardIsNumber) \ + _(GuardIsInt32) \ _(GuardIsInt32Index) \ _(GuardType) \ _(GuardClass) \ _(GuardIsNativeFunction) \ _(GuardIsNativeObject) \ _(GuardIsProxy) \ _(GuardNotDOMProxy) \ _(GuardSpecificInt32Immediate) \