Bug 1165053 - Part 0.3: Inline ArrayBufferByteLength self-hosting intrinsic. r=jwalden

This commit is contained in:
Tooru Fujisawa 2016-03-05 18:56:37 +09:00
parent 863f2c7e9c
commit cb9286f0aa
5 changed files with 45 additions and 1 deletions

View File

@ -0,0 +1,20 @@
var ArrayBufferByteLength = getSelfHostedValue("ArrayBufferByteLength");
setJitCompilerOption("ion.warmup.trigger", 50);
function testBasic() {
var arr = [1, 2, 3];
var tarr = new Int32Array(arr);
var abuf = tarr.buffer;
var arrLength = arr.length;
var bytesPerElement = Int32Array.BYTES_PER_ELEMENT;
var f = function() {
assertEq(ArrayBufferByteLength(abuf), arrLength * bytesPerElement);
};
do {
f();
} while (!inIon());
}
testBasic();

View File

@ -111,6 +111,7 @@
\
_(IntrinsicGetNextMapEntryForIterator) \
\
_(IntrinsicArrayBufferByteLength) \
_(IntrinsicPossiblyWrappedArrayBufferByteLength) \
\
_(IntrinsicIsTypedArray) \

View File

@ -847,6 +847,7 @@ class IonBuilder
InliningStatus inlineGetNextMapEntryForIterator(CallInfo& callInfo);
// ArrayBuffer intrinsics.
InliningStatus inlineArrayBufferByteLength(CallInfo& callInfo);
InliningStatus inlinePossiblyWrappedArrayBufferByteLength(CallInfo& callInfo);
// TypedArray intrinsics.

View File

@ -265,6 +265,8 @@ IonBuilder::inlineNativeCall(CallInfo& callInfo, JSFunction* target)
return inlineGetNextMapEntryForIterator(callInfo);
// ArrayBuffer intrinsics.
case InlinableNative::IntrinsicArrayBufferByteLength:
return inlineArrayBufferByteLength(callInfo);
case InlinableNative::IntrinsicPossiblyWrappedArrayBufferByteLength:
return inlinePossiblyWrappedArrayBufferByteLength(callInfo);
@ -2250,6 +2252,25 @@ IsArrayBufferObject(CompilerConstraintList* constraints, MDefinition* def)
return types->getKnownClass(constraints) == &ArrayBufferObject::class_;
}
IonBuilder::InliningStatus
IonBuilder::inlineArrayBufferByteLength(CallInfo& callInfo)
{
MOZ_ASSERT(!callInfo.constructing());
MOZ_ASSERT(callInfo.argc() == 1);
MDefinition* objArg = callInfo.getArg(0);
if (objArg->type() != MIRType_Object)
return InliningStatus_NotInlined;
if (getInlineReturnType() != MIRType_Int32)
return InliningStatus_NotInlined;
MInstruction* ins = addArrayBufferByteLength(objArg);
current->push(ins);
callInfo.setImplicitlyUsedUnchecked();
return InliningStatus_Inlined;
}
IonBuilder::InliningStatus
IonBuilder::inlinePossiblyWrappedArrayBufferByteLength(CallInfo& callInfo)
{

View File

@ -2168,7 +2168,8 @@ static const JSFunctionSpec intrinsic_functions[] = {
JS_FN("IsSharedArrayBuffer",
intrinsic_IsInstanceOfBuiltin<SharedArrayBufferObject>, 1,0),
JS_FN("ArrayBufferByteLength", intrinsic_ArrayBufferByteLength, 1,0),
JS_INLINABLE_FN("ArrayBufferByteLength", intrinsic_ArrayBufferByteLength, 1,0,
IntrinsicArrayBufferByteLength),
JS_INLINABLE_FN("PossiblyWrappedArrayBufferByteLength", intrinsic_PossiblyWrappedArrayBufferByteLength, 1,0,
IntrinsicPossiblyWrappedArrayBufferByteLength),
JS_FN("ArrayBufferCopyData", intrinsic_ArrayBufferCopyData, 4,0),