diff --git a/js/src/Makefile.in b/js/src/Makefile.in index 282fcdf24259..7da1bcaca58e 100644 --- a/js/src/Makefile.in +++ b/js/src/Makefile.in @@ -214,7 +214,6 @@ ifdef ENABLE_JIT VPATH += $(srcdir)/nanojit INSTALLED_HEADERS += \ - builtins.tbl \ jsbuiltins.h \ Assembler.h \ LIR.h \ diff --git a/js/src/Makefile.ref b/js/src/Makefile.ref index 022b6f17a8b7..e5ff80fb4b1e 100644 --- a/js/src/Makefile.ref +++ b/js/src/Makefile.ref @@ -252,10 +252,6 @@ OTHER_HFILES = \ jskeyword.tbl \ $(NULL) -ifdef ENABLE_JIT -OTHER_HFILES += builtins.tbl -endif - ifndef PREBUILT_CPUCFG OTHER_HFILES += $(OBJDIR)/jsautocfg.h endif diff --git a/js/src/jsarray.cpp b/js/src/jsarray.cpp index 5a34475fceee..89dd72a7f8bd 100644 --- a/js/src/jsarray.cpp +++ b/js/src/jsarray.cpp @@ -930,6 +930,7 @@ js_Array_dense_setelem(JSContext* cx, JSObject* obj, jsint i, jsval v) obj->dslots[u] = v; return JS_TRUE; } +JS_DEFINE_CALLINFO_4(extern, BOOL, js_Array_dense_setelem, CONTEXT, OBJECT, INT32, JSVAL, 0, 0) #endif static JSBool @@ -2314,6 +2315,7 @@ js_ArrayCompPush(JSContext *cx, JSObject *obj, jsval v) obj->dslots[length] = v; return JS_TRUE; } +JS_DEFINE_CALLINFO_3(extern, BOOL, js_ArrayCompPush, CONTEXT, OBJECT, JSVAL, 0, 0) #ifdef JS_TRACER static jsval FASTCALL @@ -3271,6 +3273,7 @@ js_NewEmptyArray(JSContext* cx, JSObject* proto) obj->dslots = NULL; return obj; } +JS_DEFINE_CALLINFO_2(extern, OBJECT, js_NewEmptyArray, CONTEXT, OBJECT, 0, 0) JSObject* FASTCALL js_NewUninitializedArray(JSContext* cx, JSObject* proto, uint32 len) @@ -3284,6 +3287,7 @@ js_NewUninitializedArray(JSContext* cx, JSObject* proto, uint32 len) return NULL; return obj; } +JS_DEFINE_CALLINFO_3(extern, OBJECT, js_NewUninitializedArray, CONTEXT, OBJECT, UINT32, 0, 0) #endif /* JS_TRACER */ @@ -3561,7 +3565,3 @@ js_ArrayToJSDoubleBuffer(JSContext *cx, JSObject *obj, jsuint offset, jsuint cou return JS_TRUE; } -JS_DEFINE_CALLINFO_4(extern, BOOL, js_Array_dense_setelem, CONTEXT, OBJECT, INT32, JSVAL, 0, 0) -JS_DEFINE_CALLINFO_2(extern, OBJECT, js_NewEmptyArray, CONTEXT, OBJECT, 0, 0) -JS_DEFINE_CALLINFO_3(extern, OBJECT, js_NewUninitializedArray, CONTEXT, OBJECT, UINT32, 0, 0) -JS_DEFINE_CALLINFO_3(extern, BOOL, js_ArrayCompPush, CONTEXT, OBJECT, JSVAL, 0, 0) diff --git a/js/src/jsbuiltins.cpp b/js/src/jsbuiltins.cpp index 57323bfda839..aa4362ae8e7b 100644 --- a/js/src/jsbuiltins.cpp +++ b/js/src/jsbuiltins.cpp @@ -93,6 +93,7 @@ js_dmod(jsdouble a, jsdouble b) r = fmod(a, b); return r; } +JS_DEFINE_CALLINFO_2(extern, DOUBLE, js_dmod, DOUBLE, DOUBLE, 1, 1) int32 FASTCALL js_imod(int32 a, int32 b) @@ -102,6 +103,7 @@ js_imod(int32 a, int32 b) int r = a % b; return r; } +JS_DEFINE_CALLINFO_2(extern, INT32, js_imod, INT32, INT32, 1, 1) /* The following boxing/unboxing primitives we can't emit inline because they either interact with the GC and depend on Spidermonkey's 32-bit @@ -119,6 +121,7 @@ js_BoxDouble(JSContext* cx, jsdouble d) return JSVAL_ERROR_COOKIE; return v; } +JS_DEFINE_CALLINFO_2(extern, JSVAL, js_BoxDouble, CONTEXT, DOUBLE, 1, 1) jsval FASTCALL js_BoxInt32(JSContext* cx, int32 i) @@ -132,6 +135,7 @@ js_BoxInt32(JSContext* cx, int32 i) return JSVAL_ERROR_COOKIE; return v; } +JS_DEFINE_CALLINFO_2(extern, JSVAL, js_BoxInt32, CONTEXT, INT32, 1, 1) jsdouble FASTCALL js_UnboxDouble(jsval v) @@ -140,6 +144,7 @@ js_UnboxDouble(jsval v) return (jsdouble)JSVAL_TO_INT(v); return *JSVAL_TO_DOUBLE(v); } +JS_DEFINE_CALLINFO_1(extern, DOUBLE, js_UnboxDouble, JSVAL, 1, 1) int32 FASTCALL js_UnboxInt32(jsval v) @@ -148,18 +153,21 @@ js_UnboxInt32(jsval v) return JSVAL_TO_INT(v); return js_DoubleToECMAInt32(*JSVAL_TO_DOUBLE(v)); } +JS_DEFINE_CALLINFO_1(extern, INT32, js_UnboxInt32, JSVAL, 1, 1) int32 FASTCALL js_DoubleToInt32(jsdouble d) { return js_DoubleToECMAInt32(d); } +JS_DEFINE_CALLINFO_1(extern, INT32, js_DoubleToInt32, DOUBLE, 1, 1) uint32 FASTCALL js_DoubleToUint32(jsdouble d) { return js_DoubleToECMAUint32(d); } +JS_DEFINE_CALLINFO_1(extern, UINT32, js_DoubleToUint32, DOUBLE, 1, 1) jsdouble FASTCALL js_StringToNumber(JSContext* cx, JSString* str) @@ -178,6 +186,7 @@ js_StringToNumber(JSContext* cx, JSString* str) } return d; } +JS_DEFINE_CALLINFO_2(extern, DOUBLE, js_StringToNumber, CONTEXT, STRING, 1, 1) int32 FASTCALL js_StringToInt32(JSContext* cx, JSString* str) @@ -192,6 +201,7 @@ js_StringToInt32(JSContext* cx, JSString* str) return 0; return js_DoubleToECMAInt32(d); } +JS_DEFINE_CALLINFO_2(extern, INT32, js_StringToInt32, CONTEXT, STRING, 1, 1) SideExit* FASTCALL js_CallTree(InterpState* state, Fragment* f) @@ -227,6 +237,7 @@ js_CallTree(InterpState* state, Fragment* f) return lr; } +JS_DEFINE_CALLINFO_2(extern, SIDEEXIT, js_CallTree, INTERPSTATE, FRAGMENT, 0, 0) JSBool FASTCALL js_AddProperty(JSContext* cx, JSObject* obj, JSScopeProperty* sprop) @@ -286,6 +297,7 @@ js_AddProperty(JSContext* cx, JSObject* obj, JSScopeProperty* sprop) JS_UNLOCK_SCOPE(cx, scope); return JS_FALSE; } +JS_DEFINE_CALLINFO_3(extern, BOOL, js_AddProperty, CONTEXT, OBJECT, SCOPEPROP, 0, 0) static JSBool HasProperty(JSContext* cx, JSObject* obj, jsid id) @@ -317,6 +329,7 @@ js_HasNamedProperty(JSContext* cx, JSObject* obj, JSString* idstr) return HasProperty(cx, obj, id); } +JS_DEFINE_CALLINFO_3(extern, BOOL, js_HasNamedProperty, CONTEXT, OBJECT, STRING, 0, 0) JSBool FASTCALL js_HasNamedPropertyInt32(JSContext* cx, JSObject* obj, int32 index) @@ -327,6 +340,7 @@ js_HasNamedPropertyInt32(JSContext* cx, JSObject* obj, int32 index) return HasProperty(cx, obj, id); } +JS_DEFINE_CALLINFO_3(extern, BOOL, js_HasNamedPropertyInt32, CONTEXT, OBJECT, INT32, 0, 0) jsval FASTCALL js_CallGetter(JSContext* cx, JSObject* obj, JSScopeProperty* sprop) @@ -337,6 +351,7 @@ js_CallGetter(JSContext* cx, JSObject* obj, JSScopeProperty* sprop) return JSVAL_ERROR_COOKIE; return v; } +JS_DEFINE_CALLINFO_3(extern, JSVAL, js_CallGetter, CONTEXT, OBJECT, SCOPEPROP, 0, 0) JSString* FASTCALL js_TypeOfObject(JSContext* cx, JSObject* obj) @@ -344,6 +359,7 @@ js_TypeOfObject(JSContext* cx, JSObject* obj) JSType type = JS_TypeOfValue(cx, OBJECT_TO_JSVAL(obj)); return ATOM_TO_STRING(cx->runtime->atomState.typeAtoms[type]); } +JS_DEFINE_CALLINFO_2(extern, STRING, js_TypeOfObject, CONTEXT, OBJECT, 1, 1) JSString* FASTCALL js_TypeOfBoolean(JSContext* cx, int32 unboxed) @@ -354,6 +370,7 @@ js_TypeOfBoolean(JSContext* cx, int32 unboxed) JSType type = JS_TypeOfValue(cx, boxed); return ATOM_TO_STRING(cx->runtime->atomState.typeAtoms[type]); } +JS_DEFINE_CALLINFO_2(extern, STRING, js_TypeOfBoolean, CONTEXT, INT32, 1, 1) jsdouble FASTCALL js_BooleanOrUndefinedToNumber(JSContext* cx, int32 unboxed) @@ -363,6 +380,7 @@ js_BooleanOrUndefinedToNumber(JSContext* cx, int32 unboxed) JS_ASSERT(unboxed == JS_TRUE || unboxed == JS_FALSE); return unboxed; } +JS_DEFINE_CALLINFO_2(extern, DOUBLE, js_BooleanOrUndefinedToNumber, CONTEXT, INT32, 1, 1) JSString* FASTCALL js_BooleanOrUndefinedToString(JSContext *cx, int32 unboxed) @@ -370,12 +388,14 @@ js_BooleanOrUndefinedToString(JSContext *cx, int32 unboxed) JS_ASSERT(uint32(unboxed) <= 2); return ATOM_TO_STRING(cx->runtime->atomState.booleanAtoms[unboxed]); } +JS_DEFINE_CALLINFO_2(extern, STRING, js_BooleanOrUndefinedToString, CONTEXT, INT32, 1, 1) JSObject* FASTCALL js_Arguments(JSContext* cx) { return NULL; } +JS_DEFINE_CALLINFO_1(extern, OBJECT, js_Arguments, CONTEXT, 0, 0) JSObject* FASTCALL js_NewNullClosure(JSContext* cx, JSObject* funobj, JSObject* proto, JSObject *parent) @@ -401,10 +421,5 @@ js_NewNullClosure(JSContext* cx, JSObject* funobj, JSObject* proto, JSObject *pa closure->dslots = NULL; return closure; } +JS_DEFINE_CALLINFO_4(extern, OBJECT, js_NewNullClosure, CONTEXT, OBJECT, OBJECT, OBJECT, 0, 0) -#define BUILTIN1 JS_DEFINE_CALLINFO_1 -#define BUILTIN2 JS_DEFINE_CALLINFO_2 -#define BUILTIN3 JS_DEFINE_CALLINFO_3 -#define BUILTIN4 JS_DEFINE_CALLINFO_4 -#define BUILTIN5 JS_DEFINE_CALLINFO_5 -#include "builtins.tbl" diff --git a/js/src/jsbuiltins.h b/js/src/jsbuiltins.h index aee8401ddc97..1d99add625f7 100644 --- a/js/src/jsbuiltins.h +++ b/js/src/jsbuiltins.h @@ -251,10 +251,33 @@ struct JSTraceableNative { #endif /* - * Declare a C function named and a CallInfo struct named _callinfo so the - * tracer can call it. |linkage| controls the visibility of both the function - * and the CallInfo global. It can be extern, static, or FRIEND, which - * specifies JS_FRIEND_API linkage for the function. + * This macro is used for builtin functions that can be called from JITted + * code. It declares a C function named and a CallInfo struct named + * _ci so the tracer can call it. The in JS_DEFINE_CALLINFO_ is + * the number of arguments the builtin takes. Builtins with no arguments + * are not supported. Using a macro is clunky but ensures that the types + * for each C function matches those for the corresponding CallInfo struct; + * mismatched types can cause subtle problems. + * + * The macro arguments are: + * + * - The linkage for the function and the associated CallInfo global. It + * can be extern, static, or FRIEND, which specifies JS_FRIEND_API linkage + * for the function. + * + * - The return type. This identifier must name one of the _JS_TYPEINFO_* + * macros defined in jsbuiltins.h. + * + * - The builtin name. + * + * - The parameter types. + * + * - The cse flag. 1 if the builtin call can be optimized away by common + * subexpression elimination; otherwise 0. This should be 1 only if the + * function is idempotent and the return value is determined solely by the + * arguments. + * + * - The fold flag. Reserved. The same as cse for now. */ #define JS_DEFINE_CALLINFO_1(linkage, rt, op, at0, cse, fold) \ _JS_DEFINE_CALLINFO(linkage, op, _JS_CTYPE_TYPE(rt), (_JS_CTYPE_TYPE(at0)), \ @@ -442,17 +465,28 @@ JS_DECLARE_CALLINFO(js_String_p_charCodeAt0_int) JS_DECLARE_CALLINFO(js_String_p_charCodeAt_int) /* Defined in jsbuiltins.cpp. */ -#define BUILTIN1(linkage, rt, op, at0, cse, fold) JS_DECLARE_CALLINFO(op) -#define BUILTIN2(linkage, rt, op, at0, at1, cse, fold) JS_DECLARE_CALLINFO(op) -#define BUILTIN3(linkage, rt, op, at0, at1, at2, cse, fold) JS_DECLARE_CALLINFO(op) -#define BUILTIN4(linkage, rt, op, at0, at1, at2, at3, cse, fold) JS_DECLARE_CALLINFO(op) -#define BUILTIN5(linkage, rt, op, at0, at1, at2, at3, at4, cse, fold) JS_DECLARE_CALLINFO(op) -#include "builtins.tbl" -#undef BUILTIN -#undef BUILTIN1 -#undef BUILTIN2 -#undef BUILTIN3 -#undef BUILTIN4 -#undef BUILTIN5 +JS_DECLARE_CALLINFO(js_BoxDouble) +JS_DECLARE_CALLINFO(js_BoxInt32) +JS_DECLARE_CALLINFO(js_UnboxDouble) +JS_DECLARE_CALLINFO(js_UnboxInt32) +JS_DECLARE_CALLINFO(js_dmod) +JS_DECLARE_CALLINFO(js_imod) +JS_DECLARE_CALLINFO(js_DoubleToInt32) +JS_DECLARE_CALLINFO(js_DoubleToUint32) + +JS_DECLARE_CALLINFO(js_StringToNumber) +JS_DECLARE_CALLINFO(js_StringToInt32) +JS_DECLARE_CALLINFO(js_CloseIterator) +JS_DECLARE_CALLINFO(js_CallTree) +JS_DECLARE_CALLINFO(js_AddProperty) +JS_DECLARE_CALLINFO(js_HasNamedProperty) +JS_DECLARE_CALLINFO(js_HasNamedPropertyInt32) +JS_DECLARE_CALLINFO(js_CallGetter) +JS_DECLARE_CALLINFO(js_TypeOfObject) +JS_DECLARE_CALLINFO(js_TypeOfBoolean) +JS_DECLARE_CALLINFO(js_BooleanOrUndefinedToNumber) +JS_DECLARE_CALLINFO(js_BooleanOrUndefinedToString) +JS_DECLARE_CALLINFO(js_Arguments) +JS_DECLARE_CALLINFO(js_NewNullClosure) #endif /* jsbuiltins_h___ */ diff --git a/js/src/jsiter.cpp b/js/src/jsiter.cpp index c042d4e9899f..fc423aefb024 100644 --- a/js/src/jsiter.cpp +++ b/js/src/jsiter.cpp @@ -443,6 +443,7 @@ js_CloseIterator(JSContext *cx, jsval v) #endif return JS_TRUE; } +JS_DEFINE_CALLINFO_2(FRIEND, BOOL, js_CloseIterator, CONTEXT, JSVAL, 0, 0) static JSBool CallEnumeratorNext(JSContext *cx, JSObject *iterobj, uintN flags, jsval *rval) diff --git a/js/src/jsstr.cpp b/js/src/jsstr.cpp index 2ef226679982..b5a9f65fd500 100644 --- a/js/src/jsstr.cpp +++ b/js/src/jsstr.cpp @@ -1012,6 +1012,7 @@ js_String_p_charCodeAt_int(JSString* str, jsint i) return 0; return JSSTRING_CHARS(str)[i]; } +JS_DEFINE_CALLINFO_2(extern, INT32, js_String_p_charCodeAt_int, STRING, INT32, 1, 1) jsdouble FASTCALL js_String_p_charCodeAt0(JSString* str) @@ -1021,6 +1022,10 @@ js_String_p_charCodeAt0(JSString* str) return jsdouble(JSSTRING_CHARS(str)[0]); } +/* + * The FuncFilter replaces the generic double version of charCodeAt with the + * integer fast path if appropriate. + */ int32 FASTCALL js_String_p_charCodeAt0_int(JSString* str) { @@ -1028,13 +1033,7 @@ js_String_p_charCodeAt0_int(JSString* str) return 0; return JSSTRING_CHARS(str)[0]; } - -/* - * The FuncFilter replaces the generic double version of charCodeAt with the - * integer fast path if appropriate. - */ JS_DEFINE_CALLINFO_1(extern, INT32, js_String_p_charCodeAt0_int, STRING, 1, 1) -JS_DEFINE_CALLINFO_2(extern, INT32, js_String_p_charCodeAt_int, STRING, INT32, 1, 1) #endif jsint @@ -2383,9 +2382,6 @@ js_String_getelem(JSContext* cx, JSString* str, int32 i) } #endif -JS_DEFINE_CALLINFO_2(extern, BOOL, js_EqualStrings, STRING, STRING, 1, 1) -JS_DEFINE_CALLINFO_2(extern, INT32, js_CompareStrings, STRING, STRING, 1, 1) - JS_DEFINE_TRCINFO_1(str_toString, (2, (extern, STRING_RETRY, String_p_toString, CONTEXT, THIS, 1, 1))) JS_DEFINE_TRCINFO_1(str_charAt, @@ -2491,7 +2487,6 @@ js_String_tn(JSContext* cx, JSObject* proto, JSString* str) obj->fslots[JSSLOT_PRIVATE] = STRING_TO_JSVAL(str); return obj; } - JS_DEFINE_CALLINFO_3(extern, OBJECT, js_String_tn, CONTEXT, CALLEE_PROTOTYPE, STRING, 0, 0) #endif /* !JS_TRACER */ @@ -3061,6 +3056,7 @@ js_EqualStrings(JSString *str1, JSString *str2) return JS_TRUE; } +JS_DEFINE_CALLINFO_2(extern, BOOL, js_EqualStrings, STRING, STRING, 1, 1) int32 JS_FASTCALL js_CompareStrings(JSString *str1, JSString *str2) @@ -3086,6 +3082,7 @@ js_CompareStrings(JSString *str1, JSString *str2) } return (intN)(l1 - l2); } +JS_DEFINE_CALLINFO_2(extern, INT32, js_CompareStrings, STRING, STRING, 1, 1) size_t js_strlen(const jschar *s) diff --git a/js/src/jstracer.cpp b/js/src/jstracer.cpp index f92acc65fbe1..d6126155e1b8 100644 --- a/js/src/jstracer.cpp +++ b/js/src/jstracer.cpp @@ -623,8 +623,9 @@ js_AttemptCompilation(JSTraceMonitor* tm, JSObject* globalObj, jsbytecode* pc) } } -JS_DEFINE_CALLINFO_1(static, DOUBLE, i2f, INT32, 1, 1) -JS_DEFINE_CALLINFO_1(static, DOUBLE, u2f, UINT32, 1, 1) +// Forward declarations. +JS_DEFINE_CALLINFO_1(static, DOUBLE, i2f, INT32, 1, 1) +JS_DEFINE_CALLINFO_1(static, DOUBLE, u2f, UINT32, 1, 1) static bool isi2f(LInsp i) { @@ -727,88 +728,87 @@ static bool overflowSafe(LIns* i) /* soft float support */ -JS_DEFINE_CALLINFO_1(static, DOUBLE, fneg, DOUBLE, 1, 1) -JS_DEFINE_CALLINFO_2(static, INT32, fcmpeq, DOUBLE, DOUBLE, 1, 1) -JS_DEFINE_CALLINFO_2(static, INT32, fcmplt, DOUBLE, DOUBLE, 1, 1) -JS_DEFINE_CALLINFO_2(static, INT32, fcmple, DOUBLE, DOUBLE, 1, 1) -JS_DEFINE_CALLINFO_2(static, INT32, fcmpgt, DOUBLE, DOUBLE, 1, 1) -JS_DEFINE_CALLINFO_2(static, INT32, fcmpge, DOUBLE, DOUBLE, 1, 1) -JS_DEFINE_CALLINFO_2(static, DOUBLE, fmul, DOUBLE, DOUBLE, 1, 1) -JS_DEFINE_CALLINFO_2(static, DOUBLE, fadd, DOUBLE, DOUBLE, 1, 1) -JS_DEFINE_CALLINFO_2(static, DOUBLE, fdiv, DOUBLE, DOUBLE, 1, 1) -JS_DEFINE_CALLINFO_2(static, DOUBLE, fsub, DOUBLE, DOUBLE, 1, 1) - -jsdouble FASTCALL +static jsdouble FASTCALL fneg(jsdouble x) { return -x; } +JS_DEFINE_CALLINFO_1(static, DOUBLE, fneg, DOUBLE, 1, 1) -jsdouble FASTCALL +static jsdouble FASTCALL i2f(int32 i) { return i; } -jsdouble FASTCALL +static jsdouble FASTCALL u2f(jsuint u) { return u; } -int32 FASTCALL +static int32 FASTCALL fcmpeq(jsdouble x, jsdouble y) { return x==y; } +JS_DEFINE_CALLINFO_2(static, INT32, fcmpeq, DOUBLE, DOUBLE, 1, 1) -int32 FASTCALL +static int32 FASTCALL fcmplt(jsdouble x, jsdouble y) { return x < y; } +JS_DEFINE_CALLINFO_2(static, INT32, fcmplt, DOUBLE, DOUBLE, 1, 1) -int32 FASTCALL +static int32 FASTCALL fcmple(jsdouble x, jsdouble y) { return x <= y; } +JS_DEFINE_CALLINFO_2(static, INT32, fcmple, DOUBLE, DOUBLE, 1, 1) -int32 FASTCALL +static int32 FASTCALL fcmpgt(jsdouble x, jsdouble y) { return x > y; } +JS_DEFINE_CALLINFO_2(static, INT32, fcmpgt, DOUBLE, DOUBLE, 1, 1) -int32 FASTCALL +static int32 FASTCALL fcmpge(jsdouble x, jsdouble y) { return x >= y; } +JS_DEFINE_CALLINFO_2(static, INT32, fcmpge, DOUBLE, DOUBLE, 1, 1) -jsdouble FASTCALL +static jsdouble FASTCALL fmul(jsdouble x, jsdouble y) { return x * y; } +JS_DEFINE_CALLINFO_2(static, DOUBLE, fmul, DOUBLE, DOUBLE, 1, 1) -jsdouble FASTCALL +static jsdouble FASTCALL fadd(jsdouble x, jsdouble y) { return x + y; } +JS_DEFINE_CALLINFO_2(static, DOUBLE, fadd, DOUBLE, DOUBLE, 1, 1) -jsdouble FASTCALL +static jsdouble FASTCALL fdiv(jsdouble x, jsdouble y) { return x / y; } +JS_DEFINE_CALLINFO_2(static, DOUBLE, fdiv, DOUBLE, DOUBLE, 1, 1) -jsdouble FASTCALL +static jsdouble FASTCALL fsub(jsdouble x, jsdouble y) { return x - y; } +JS_DEFINE_CALLINFO_2(static, DOUBLE, fsub, DOUBLE, DOUBLE, 1, 1) class SoftFloatFilter: public LirWriter {