From b482f72bf4c7cfb50b2b433fbd64d943d070cba5 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Tue, 25 May 2010 18:21:10 -0700 Subject: [PATCH] [JAEGER] Added JSOP_GOTO support. --- js/src/imacros.c.out | 1026 ++++++++++++++++++++++++++++++- js/src/methodjit/Compiler.cpp | 41 +- js/src/methodjit/Compiler.h | 14 + js/src/methodjit/FrameEntry.h | 1 + js/src/methodjit/FrameState.cpp | 21 + js/src/methodjit/FrameState.h | 11 + 6 files changed, 1108 insertions(+), 6 deletions(-) diff --git a/js/src/imacros.c.out b/js/src/imacros.c.out index 66007b98d8c..3bf4b3f9ee0 100644 --- a/js/src/imacros.c.out +++ b/js/src/imacros.c.out @@ -1,6 +1,1022 @@ /* GENERATED BY imacro_asm.js -- DO NOT EDIT!!! */ -Error: # -*- indent-tabs-mode: nil; -*- -Error("# -*- indent-tabs-mode: nil; -*-")@:0 -assemble("../imacros.jsasm")@imacro_asm.js:373 -@imacro_asm.js:560 - +static struct { + jsbytecode any_obj[36]; + jsbytecode obj_any[38]; +} equality_imacros = { + { +/* 0*/ JSOP_DUP, +/* 1*/ JSOP_DUP, +/* 2*/ JSOP_GETPROP, 0, COMMON_ATOM_INDEX(valueOf), +/* 5*/ JSOP_IFPRIMTOP, 0, 18, +/* 8*/ JSOP_SWAP, +/* 9*/ JSOP_STRING, 0, COMMON_TYPE_ATOM_INDEX(JSTYPE_VOID), +/*12*/ JSOP_CALL, 0, 1, +/*15*/ JSOP_IFPRIMTOP, 0, 17, +/*18*/ JSOP_POP, +/*19*/ JSOP_DUP, +/*20*/ JSOP_GOTO, 0, 4, +/*23*/ JSOP_POP, +/*24*/ JSOP_CALLPROP, 0, COMMON_ATOM_INDEX(toString), +/*27*/ JSOP_CALL, 0, 0, +/*30*/ JSOP_PRIMTOP, (JSTYPE_NUMBER), +/*32*/ JSOP_SWAP, +/*33*/ JSOP_POP, +/*34*/ JSOP_IMACOP, +/*35*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_SWAP, +/* 1*/ JSOP_DUP, +/* 2*/ JSOP_DUP, +/* 3*/ JSOP_GETPROP, 0, COMMON_ATOM_INDEX(valueOf), +/* 6*/ JSOP_IFPRIMTOP, 0, 18, +/* 9*/ JSOP_SWAP, +/*10*/ JSOP_STRING, 0, COMMON_TYPE_ATOM_INDEX(JSTYPE_VOID), +/*13*/ JSOP_CALL, 0, 1, +/*16*/ JSOP_IFPRIMTOP, 0, 17, +/*19*/ JSOP_POP, +/*20*/ JSOP_DUP, +/*21*/ JSOP_GOTO, 0, 4, +/*24*/ JSOP_POP, +/*25*/ JSOP_CALLPROP, 0, COMMON_ATOM_INDEX(toString), +/*28*/ JSOP_CALL, 0, 0, +/*31*/ JSOP_PRIMTOP, (JSTYPE_NUMBER), +/*33*/ JSOP_SWAP, +/*34*/ JSOP_POP, +/*35*/ JSOP_SWAP, +/*36*/ JSOP_IMACOP, +/*37*/ JSOP_STOP, + }, +}; +static struct { + jsbytecode any_obj[36]; + jsbytecode obj_any[38]; + jsbytecode obj_obj[72]; +} binary_imacros = { + { +/* 0*/ JSOP_DUP, +/* 1*/ JSOP_DUP, +/* 2*/ JSOP_GETPROP, 0, COMMON_ATOM_INDEX(valueOf), +/* 5*/ JSOP_IFPRIMTOP, 0, 18, +/* 8*/ JSOP_SWAP, +/* 9*/ JSOP_STRING, 0, COMMON_TYPE_ATOM_INDEX(JSTYPE_NUMBER), +/*12*/ JSOP_CALL, 0, 1, +/*15*/ JSOP_IFPRIMTOP, 0, 17, +/*18*/ JSOP_POP, +/*19*/ JSOP_DUP, +/*20*/ JSOP_GOTO, 0, 4, +/*23*/ JSOP_POP, +/*24*/ JSOP_CALLPROP, 0, COMMON_ATOM_INDEX(toString), +/*27*/ JSOP_CALL, 0, 0, +/*30*/ JSOP_PRIMTOP, (JSTYPE_NUMBER), +/*32*/ JSOP_SWAP, +/*33*/ JSOP_POP, +/*34*/ JSOP_IMACOP, +/*35*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_SWAP, +/* 1*/ JSOP_DUP, +/* 2*/ JSOP_DUP, +/* 3*/ JSOP_GETPROP, 0, COMMON_ATOM_INDEX(valueOf), +/* 6*/ JSOP_IFPRIMTOP, 0, 18, +/* 9*/ JSOP_SWAP, +/*10*/ JSOP_STRING, 0, COMMON_TYPE_ATOM_INDEX(JSTYPE_NUMBER), +/*13*/ JSOP_CALL, 0, 1, +/*16*/ JSOP_IFPRIMTOP, 0, 17, +/*19*/ JSOP_POP, +/*20*/ JSOP_DUP, +/*21*/ JSOP_GOTO, 0, 4, +/*24*/ JSOP_POP, +/*25*/ JSOP_CALLPROP, 0, COMMON_ATOM_INDEX(toString), +/*28*/ JSOP_CALL, 0, 0, +/*31*/ JSOP_PRIMTOP, (JSTYPE_NUMBER), +/*33*/ JSOP_SWAP, +/*34*/ JSOP_POP, +/*35*/ JSOP_SWAP, +/*36*/ JSOP_IMACOP, +/*37*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_SWAP, +/* 1*/ JSOP_DUP, +/* 2*/ JSOP_DUP, +/* 3*/ JSOP_GETPROP, 0, COMMON_ATOM_INDEX(valueOf), +/* 6*/ JSOP_IFPRIMTOP, 0, 18, +/* 9*/ JSOP_SWAP, +/*10*/ JSOP_STRING, 0, COMMON_TYPE_ATOM_INDEX(JSTYPE_NUMBER), +/*13*/ JSOP_CALL, 0, 1, +/*16*/ JSOP_IFPRIMTOP, 0, 17, +/*19*/ JSOP_POP, +/*20*/ JSOP_DUP, +/*21*/ JSOP_GOTO, 0, 4, +/*24*/ JSOP_POP, +/*25*/ JSOP_CALLPROP, 0, COMMON_ATOM_INDEX(toString), +/*28*/ JSOP_CALL, 0, 0, +/*31*/ JSOP_PRIMTOP, (JSTYPE_NUMBER), +/*33*/ JSOP_SWAP, +/*34*/ JSOP_POP, +/*35*/ JSOP_SWAP, +/*36*/ JSOP_DUP, +/*37*/ JSOP_DUP, +/*38*/ JSOP_GETPROP, 0, COMMON_ATOM_INDEX(valueOf), +/*41*/ JSOP_IFPRIMTOP, 0, 18, +/*44*/ JSOP_SWAP, +/*45*/ JSOP_STRING, 0, COMMON_TYPE_ATOM_INDEX(JSTYPE_NUMBER), +/*48*/ JSOP_CALL, 0, 1, +/*51*/ JSOP_IFPRIMTOP, 0, 17, +/*54*/ JSOP_POP, +/*55*/ JSOP_DUP, +/*56*/ JSOP_GOTO, 0, 4, +/*59*/ JSOP_POP, +/*60*/ JSOP_CALLPROP, 0, COMMON_ATOM_INDEX(toString), +/*63*/ JSOP_CALL, 0, 0, +/*66*/ JSOP_PRIMTOP, (JSTYPE_NUMBER), +/*68*/ JSOP_SWAP, +/*69*/ JSOP_POP, +/*70*/ JSOP_IMACOP, +/*71*/ JSOP_STOP, + }, +}; +static struct { + jsbytecode any_obj[36]; + jsbytecode obj_any[38]; + jsbytecode obj_obj[72]; +} add_imacros = { + { +/* 0*/ JSOP_DUP, +/* 1*/ JSOP_DUP, +/* 2*/ JSOP_GETPROP, 0, COMMON_ATOM_INDEX(valueOf), +/* 5*/ JSOP_IFPRIMTOP, 0, 18, +/* 8*/ JSOP_SWAP, +/* 9*/ JSOP_STRING, 0, COMMON_TYPE_ATOM_INDEX(JSTYPE_VOID), +/*12*/ JSOP_CALL, 0, 1, +/*15*/ JSOP_IFPRIMTOP, 0, 17, +/*18*/ JSOP_POP, +/*19*/ JSOP_DUP, +/*20*/ JSOP_GOTO, 0, 4, +/*23*/ JSOP_POP, +/*24*/ JSOP_CALLPROP, 0, COMMON_ATOM_INDEX(toString), +/*27*/ JSOP_CALL, 0, 0, +/*30*/ JSOP_PRIMTOP, (JSTYPE_VOID), +/*32*/ JSOP_SWAP, +/*33*/ JSOP_POP, +/*34*/ JSOP_ADD, +/*35*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_SWAP, +/* 1*/ JSOP_DUP, +/* 2*/ JSOP_DUP, +/* 3*/ JSOP_GETPROP, 0, COMMON_ATOM_INDEX(valueOf), +/* 6*/ JSOP_IFPRIMTOP, 0, 18, +/* 9*/ JSOP_SWAP, +/*10*/ JSOP_STRING, 0, COMMON_TYPE_ATOM_INDEX(JSTYPE_VOID), +/*13*/ JSOP_CALL, 0, 1, +/*16*/ JSOP_IFPRIMTOP, 0, 17, +/*19*/ JSOP_POP, +/*20*/ JSOP_DUP, +/*21*/ JSOP_GOTO, 0, 4, +/*24*/ JSOP_POP, +/*25*/ JSOP_CALLPROP, 0, COMMON_ATOM_INDEX(toString), +/*28*/ JSOP_CALL, 0, 0, +/*31*/ JSOP_PRIMTOP, (JSTYPE_VOID), +/*33*/ JSOP_SWAP, +/*34*/ JSOP_POP, +/*35*/ JSOP_SWAP, +/*36*/ JSOP_ADD, +/*37*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_SWAP, +/* 1*/ JSOP_DUP, +/* 2*/ JSOP_DUP, +/* 3*/ JSOP_GETPROP, 0, COMMON_ATOM_INDEX(valueOf), +/* 6*/ JSOP_IFPRIMTOP, 0, 18, +/* 9*/ JSOP_SWAP, +/*10*/ JSOP_STRING, 0, COMMON_TYPE_ATOM_INDEX(JSTYPE_VOID), +/*13*/ JSOP_CALL, 0, 1, +/*16*/ JSOP_IFPRIMTOP, 0, 17, +/*19*/ JSOP_POP, +/*20*/ JSOP_DUP, +/*21*/ JSOP_GOTO, 0, 4, +/*24*/ JSOP_POP, +/*25*/ JSOP_CALLPROP, 0, COMMON_ATOM_INDEX(toString), +/*28*/ JSOP_CALL, 0, 0, +/*31*/ JSOP_PRIMTOP, (JSTYPE_VOID), +/*33*/ JSOP_SWAP, +/*34*/ JSOP_POP, +/*35*/ JSOP_SWAP, +/*36*/ JSOP_DUP, +/*37*/ JSOP_DUP, +/*38*/ JSOP_GETPROP, 0, COMMON_ATOM_INDEX(valueOf), +/*41*/ JSOP_IFPRIMTOP, 0, 18, +/*44*/ JSOP_SWAP, +/*45*/ JSOP_STRING, 0, COMMON_TYPE_ATOM_INDEX(JSTYPE_VOID), +/*48*/ JSOP_CALL, 0, 1, +/*51*/ JSOP_IFPRIMTOP, 0, 17, +/*54*/ JSOP_POP, +/*55*/ JSOP_DUP, +/*56*/ JSOP_GOTO, 0, 4, +/*59*/ JSOP_POP, +/*60*/ JSOP_CALLPROP, 0, COMMON_ATOM_INDEX(toString), +/*63*/ JSOP_CALL, 0, 0, +/*66*/ JSOP_PRIMTOP, (JSTYPE_VOID), +/*68*/ JSOP_SWAP, +/*69*/ JSOP_POP, +/*70*/ JSOP_ADD, +/*71*/ JSOP_STOP, + }, +}; +static struct { + jsbytecode sign[41]; +} unary_imacros = { + { +/* 0*/ JSOP_DUP, +/* 1*/ JSOP_DUP, +/* 2*/ JSOP_GETPROP, 0, COMMON_ATOM_INDEX(valueOf), +/* 5*/ JSOP_IFPRIMTOP, 0, 23, +/* 8*/ JSOP_SWAP, +/* 9*/ JSOP_STRING, 0, COMMON_TYPE_ATOM_INDEX(JSTYPE_NUMBER), +/*12*/ JSOP_CALL, 0, 1, +/*15*/ JSOP_IFPRIMTOP, 0, 8, +/*18*/ JSOP_POP, +/*19*/ JSOP_DUP, +/*20*/ JSOP_GOTO, 0, 9, +/*23*/ JSOP_SWAP, +/*24*/ JSOP_POP, +/*25*/ JSOP_GOTO, 0, 14, +/*28*/ JSOP_POP, +/*29*/ JSOP_CALLPROP, 0, COMMON_ATOM_INDEX(toString), +/*32*/ JSOP_CALL, 0, 0, +/*35*/ JSOP_PRIMTOP, (JSTYPE_NUMBER), +/*37*/ JSOP_SWAP, +/*38*/ JSOP_POP, +/*39*/ JSOP_IMACOP, +/*40*/ JSOP_STOP, + }, +}; +static struct { + jsbytecode incelem[7]; + jsbytecode eleminc[15]; +} incelem_imacros = { + { +/* 0*/ JSOP_DUP2, +/* 1*/ JSOP_GETELEM, +/* 2*/ JSOP_POS, +/* 3*/ JSOP_ONE, +/* 4*/ JSOP_ADD, +/* 5*/ JSOP_SETELEM, +/* 6*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_DUP2, +/* 1*/ JSOP_GETELEM, +/* 2*/ JSOP_POS, +/* 3*/ JSOP_DUP, +/* 4*/ JSOP_ONE, +/* 5*/ JSOP_ADD, +/* 6*/ JSOP_PICK, 3, +/* 8*/ JSOP_PICK, 3, +/*10*/ JSOP_PICK, 2, +/*12*/ JSOP_SETELEM, +/*13*/ JSOP_POP, +/*14*/ JSOP_STOP, + }, +}; +static struct { + jsbytecode decelem[7]; + jsbytecode elemdec[15]; +} decelem_imacros = { + { +/* 0*/ JSOP_DUP2, +/* 1*/ JSOP_GETELEM, +/* 2*/ JSOP_POS, +/* 3*/ JSOP_ONE, +/* 4*/ JSOP_SUB, +/* 5*/ JSOP_SETELEM, +/* 6*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_DUP2, +/* 1*/ JSOP_GETELEM, +/* 2*/ JSOP_POS, +/* 3*/ JSOP_DUP, +/* 4*/ JSOP_ONE, +/* 5*/ JSOP_SUB, +/* 6*/ JSOP_PICK, 3, +/* 8*/ JSOP_PICK, 3, +/*10*/ JSOP_PICK, 2, +/*12*/ JSOP_SETELEM, +/*13*/ JSOP_POP, +/*14*/ JSOP_STOP, + }, +}; +static struct { + jsbytecode String[38]; +} call_imacros = { + { +/* 0*/ JSOP_DUP, +/* 1*/ JSOP_DUP, +/* 2*/ JSOP_GETPROP, 0, COMMON_ATOM_INDEX(toString), +/* 5*/ JSOP_IFPRIMTOP, 0, 15, +/* 8*/ JSOP_SWAP, +/* 9*/ JSOP_CALL, 0, 0, +/*12*/ JSOP_IFPRIMTOP, 0, 20, +/*15*/ JSOP_POP, +/*16*/ JSOP_DUP, +/*17*/ JSOP_GOTO, 0, 4, +/*20*/ JSOP_POP, +/*21*/ JSOP_CALLPROP, 0, COMMON_ATOM_INDEX(valueOf), +/*24*/ JSOP_STRING, 0, COMMON_TYPE_ATOM_INDEX(JSTYPE_STRING), +/*27*/ JSOP_CALL, 0, 1, +/*30*/ JSOP_PRIMTOP, (JSTYPE_STRING), +/*32*/ JSOP_SWAP, +/*33*/ JSOP_POP, +/*34*/ JSOP_CALL, 0, 1, +/*37*/ JSOP_STOP, + }, +}; +static struct { + jsbytecode String[38]; +} new_imacros = { + { +/* 0*/ JSOP_DUP, +/* 1*/ JSOP_DUP, +/* 2*/ JSOP_GETPROP, 0, COMMON_ATOM_INDEX(toString), +/* 5*/ JSOP_IFPRIMTOP, 0, 15, +/* 8*/ JSOP_SWAP, +/* 9*/ JSOP_CALL, 0, 0, +/*12*/ JSOP_IFPRIMTOP, 0, 20, +/*15*/ JSOP_POP, +/*16*/ JSOP_DUP, +/*17*/ JSOP_GOTO, 0, 4, +/*20*/ JSOP_POP, +/*21*/ JSOP_CALLPROP, 0, COMMON_ATOM_INDEX(valueOf), +/*24*/ JSOP_STRING, 0, COMMON_TYPE_ATOM_INDEX(JSTYPE_STRING), +/*27*/ JSOP_CALL, 0, 1, +/*30*/ JSOP_PRIMTOP, (JSTYPE_STRING), +/*32*/ JSOP_SWAP, +/*33*/ JSOP_POP, +/*34*/ JSOP_NEW, 0, 1, +/*37*/ JSOP_STOP, + }, +}; +static struct { + jsbytecode apply0[8]; + jsbytecode apply1[12]; + jsbytecode apply2[16]; + jsbytecode apply3[21]; + jsbytecode apply4[26]; + jsbytecode apply5[31]; + jsbytecode apply6[36]; + jsbytecode apply7[41]; + jsbytecode apply8[46]; + jsbytecode call0[7]; + jsbytecode call1[7]; + jsbytecode call2[7]; + jsbytecode call3[7]; + jsbytecode call4[7]; + jsbytecode call5[7]; + jsbytecode call6[7]; + jsbytecode call7[7]; + jsbytecode call8[7]; +} apply_imacros = { + { +/* 0*/ JSOP_PICK, 3, +/* 2*/ JSOP_POP, +/* 3*/ JSOP_POP, +/* 4*/ JSOP_CALL, 0, 0, +/* 7*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_PICK, 3, +/* 2*/ JSOP_POP, +/* 3*/ JSOP_DUP, +/* 4*/ JSOP_ZERO, +/* 5*/ JSOP_GETELEM, +/* 6*/ JSOP_SWAP, +/* 7*/ JSOP_POP, +/* 8*/ JSOP_CALL, 0, 1, +/*11*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_PICK, 3, +/* 2*/ JSOP_POP, +/* 3*/ JSOP_DUP, +/* 4*/ JSOP_ZERO, +/* 5*/ JSOP_GETELEM, +/* 6*/ JSOP_SWAP, +/* 7*/ JSOP_DUP, +/* 8*/ JSOP_ONE, +/* 9*/ JSOP_GETELEM, +/*10*/ JSOP_SWAP, +/*11*/ JSOP_POP, +/*12*/ JSOP_CALL, 0, 2, +/*15*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_PICK, 3, +/* 2*/ JSOP_POP, +/* 3*/ JSOP_DUP, +/* 4*/ JSOP_ZERO, +/* 5*/ JSOP_GETELEM, +/* 6*/ JSOP_SWAP, +/* 7*/ JSOP_DUP, +/* 8*/ JSOP_ONE, +/* 9*/ JSOP_GETELEM, +/*10*/ JSOP_SWAP, +/*11*/ JSOP_DUP, +/*12*/ JSOP_INT8, 2, +/*14*/ JSOP_GETELEM, +/*15*/ JSOP_SWAP, +/*16*/ JSOP_POP, +/*17*/ JSOP_CALL, 0, 3, +/*20*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_PICK, 3, +/* 2*/ JSOP_POP, +/* 3*/ JSOP_DUP, +/* 4*/ JSOP_ZERO, +/* 5*/ JSOP_GETELEM, +/* 6*/ JSOP_SWAP, +/* 7*/ JSOP_DUP, +/* 8*/ JSOP_ONE, +/* 9*/ JSOP_GETELEM, +/*10*/ JSOP_SWAP, +/*11*/ JSOP_DUP, +/*12*/ JSOP_INT8, 2, +/*14*/ JSOP_GETELEM, +/*15*/ JSOP_SWAP, +/*16*/ JSOP_DUP, +/*17*/ JSOP_INT8, 3, +/*19*/ JSOP_GETELEM, +/*20*/ JSOP_SWAP, +/*21*/ JSOP_POP, +/*22*/ JSOP_CALL, 0, 4, +/*25*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_PICK, 3, +/* 2*/ JSOP_POP, +/* 3*/ JSOP_DUP, +/* 4*/ JSOP_ZERO, +/* 5*/ JSOP_GETELEM, +/* 6*/ JSOP_SWAP, +/* 7*/ JSOP_DUP, +/* 8*/ JSOP_ONE, +/* 9*/ JSOP_GETELEM, +/*10*/ JSOP_SWAP, +/*11*/ JSOP_DUP, +/*12*/ JSOP_INT8, 2, +/*14*/ JSOP_GETELEM, +/*15*/ JSOP_SWAP, +/*16*/ JSOP_DUP, +/*17*/ JSOP_INT8, 3, +/*19*/ JSOP_GETELEM, +/*20*/ JSOP_SWAP, +/*21*/ JSOP_DUP, +/*22*/ JSOP_INT8, 4, +/*24*/ JSOP_GETELEM, +/*25*/ JSOP_SWAP, +/*26*/ JSOP_POP, +/*27*/ JSOP_CALL, 0, 5, +/*30*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_PICK, 3, +/* 2*/ JSOP_POP, +/* 3*/ JSOP_DUP, +/* 4*/ JSOP_ZERO, +/* 5*/ JSOP_GETELEM, +/* 6*/ JSOP_SWAP, +/* 7*/ JSOP_DUP, +/* 8*/ JSOP_ONE, +/* 9*/ JSOP_GETELEM, +/*10*/ JSOP_SWAP, +/*11*/ JSOP_DUP, +/*12*/ JSOP_INT8, 2, +/*14*/ JSOP_GETELEM, +/*15*/ JSOP_SWAP, +/*16*/ JSOP_DUP, +/*17*/ JSOP_INT8, 3, +/*19*/ JSOP_GETELEM, +/*20*/ JSOP_SWAP, +/*21*/ JSOP_DUP, +/*22*/ JSOP_INT8, 4, +/*24*/ JSOP_GETELEM, +/*25*/ JSOP_SWAP, +/*26*/ JSOP_DUP, +/*27*/ JSOP_INT8, 5, +/*29*/ JSOP_GETELEM, +/*30*/ JSOP_SWAP, +/*31*/ JSOP_POP, +/*32*/ JSOP_CALL, 0, 6, +/*35*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_PICK, 3, +/* 2*/ JSOP_POP, +/* 3*/ JSOP_DUP, +/* 4*/ JSOP_ZERO, +/* 5*/ JSOP_GETELEM, +/* 6*/ JSOP_SWAP, +/* 7*/ JSOP_DUP, +/* 8*/ JSOP_ONE, +/* 9*/ JSOP_GETELEM, +/*10*/ JSOP_SWAP, +/*11*/ JSOP_DUP, +/*12*/ JSOP_INT8, 2, +/*14*/ JSOP_GETELEM, +/*15*/ JSOP_SWAP, +/*16*/ JSOP_DUP, +/*17*/ JSOP_INT8, 3, +/*19*/ JSOP_GETELEM, +/*20*/ JSOP_SWAP, +/*21*/ JSOP_DUP, +/*22*/ JSOP_INT8, 4, +/*24*/ JSOP_GETELEM, +/*25*/ JSOP_SWAP, +/*26*/ JSOP_DUP, +/*27*/ JSOP_INT8, 5, +/*29*/ JSOP_GETELEM, +/*30*/ JSOP_SWAP, +/*31*/ JSOP_DUP, +/*32*/ JSOP_INT8, 6, +/*34*/ JSOP_GETELEM, +/*35*/ JSOP_SWAP, +/*36*/ JSOP_POP, +/*37*/ JSOP_CALL, 0, 7, +/*40*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_PICK, 3, +/* 2*/ JSOP_POP, +/* 3*/ JSOP_DUP, +/* 4*/ JSOP_ZERO, +/* 5*/ JSOP_GETELEM, +/* 6*/ JSOP_SWAP, +/* 7*/ JSOP_DUP, +/* 8*/ JSOP_ONE, +/* 9*/ JSOP_GETELEM, +/*10*/ JSOP_SWAP, +/*11*/ JSOP_DUP, +/*12*/ JSOP_INT8, 2, +/*14*/ JSOP_GETELEM, +/*15*/ JSOP_SWAP, +/*16*/ JSOP_DUP, +/*17*/ JSOP_INT8, 3, +/*19*/ JSOP_GETELEM, +/*20*/ JSOP_SWAP, +/*21*/ JSOP_DUP, +/*22*/ JSOP_INT8, 4, +/*24*/ JSOP_GETELEM, +/*25*/ JSOP_SWAP, +/*26*/ JSOP_DUP, +/*27*/ JSOP_INT8, 5, +/*29*/ JSOP_GETELEM, +/*30*/ JSOP_SWAP, +/*31*/ JSOP_DUP, +/*32*/ JSOP_INT8, 6, +/*34*/ JSOP_GETELEM, +/*35*/ JSOP_SWAP, +/*36*/ JSOP_DUP, +/*37*/ JSOP_INT8, 7, +/*39*/ JSOP_GETELEM, +/*40*/ JSOP_SWAP, +/*41*/ JSOP_POP, +/*42*/ JSOP_CALL, 0, 8, +/*45*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_SWAP, +/* 1*/ JSOP_POP, +/* 2*/ JSOP_NULL, +/* 3*/ JSOP_CALL, 0, 0, +/* 6*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_PICK, 2, +/* 2*/ JSOP_POP, +/* 3*/ JSOP_CALL, 0, 0, +/* 6*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_PICK, 3, +/* 2*/ JSOP_POP, +/* 3*/ JSOP_CALL, 0, 1, +/* 6*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_PICK, 4, +/* 2*/ JSOP_POP, +/* 3*/ JSOP_CALL, 0, 2, +/* 6*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_PICK, 5, +/* 2*/ JSOP_POP, +/* 3*/ JSOP_CALL, 0, 3, +/* 6*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_PICK, 6, +/* 2*/ JSOP_POP, +/* 3*/ JSOP_CALL, 0, 4, +/* 6*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_PICK, 7, +/* 2*/ JSOP_POP, +/* 3*/ JSOP_CALL, 0, 5, +/* 6*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_PICK, 8, +/* 2*/ JSOP_POP, +/* 3*/ JSOP_CALL, 0, 6, +/* 6*/ JSOP_STOP, + }, + { +/* 0*/ JSOP_PICK, 9, +/* 2*/ JSOP_POP, +/* 3*/ JSOP_CALL, 0, 7, +/* 6*/ JSOP_STOP, + }, +}; +static struct { + jsbytecode toString[35]; +} objtostr_imacros = { + { +/* 0*/ JSOP_DUP, +/* 1*/ JSOP_DUP, +/* 2*/ JSOP_GETPROP, 0, COMMON_ATOM_INDEX(valueOf), +/* 5*/ JSOP_IFPRIMTOP, 0, 18, +/* 8*/ JSOP_SWAP, +/* 9*/ JSOP_STRING, 0, COMMON_TYPE_ATOM_INDEX(JSTYPE_VOID), +/*12*/ JSOP_CALL, 0, 1, +/*15*/ JSOP_IFPRIMTOP, 0, 17, +/*18*/ JSOP_POP, +/*19*/ JSOP_DUP, +/*20*/ JSOP_GOTO, 0, 4, +/*23*/ JSOP_POP, +/*24*/ JSOP_CALLPROP, 0, COMMON_ATOM_INDEX(toString), +/*27*/ JSOP_CALL, 0, 0, +/*30*/ JSOP_PRIMTOP, (JSTYPE_VOID), +/*32*/ JSOP_SWAP, +/*33*/ JSOP_POP, +/*34*/ JSOP_STOP, + }, +}; +static struct { + jsbytecode scriptgetter[4]; +} getprop_imacros = { + { +/* 0*/ JSOP_CALL, 0, 0, +/* 3*/ JSOP_STOP, + }, +}; +static struct { + jsbytecode scriptgetter[5]; +} callprop_imacros = { + { +/* 0*/ JSOP_CALL, 0, 0, +/* 3*/ JSOP_SWAP, +/* 4*/ JSOP_STOP, + }, +}; +static struct { + jsbytecode scriptgetter[4]; +} getthisprop_imacros = { + { +/* 0*/ JSOP_CALL, 0, 0, +/* 3*/ JSOP_STOP, + }, +}; +uint8 js_opcode2extra[JSOP_LIMIT] = { + 0, /* JSOP_NOP */ + 0, /* JSOP_PUSH */ + 0, /* JSOP_POPV */ + 0, /* JSOP_ENTERWITH */ + 0, /* JSOP_LEAVEWITH */ + 0, /* JSOP_RETURN */ + 0, /* JSOP_GOTO */ + 0, /* JSOP_IFEQ */ + 0, /* JSOP_IFNE */ + 0, /* JSOP_ARGUMENTS */ + 0, /* JSOP_FORARG */ + 0, /* JSOP_FORLOCAL */ + 0, /* JSOP_DUP */ + 0, /* JSOP_DUP2 */ + 0, /* JSOP_SETCONST */ + 3, /* JSOP_BITOR */ + 3, /* JSOP_BITXOR */ + 3, /* JSOP_BITAND */ + 3, /* JSOP_EQ */ + 3, /* JSOP_NE */ + 3, /* JSOP_LT */ + 3, /* JSOP_LE */ + 3, /* JSOP_GT */ + 3, /* JSOP_GE */ + 3, /* JSOP_LSH */ + 3, /* JSOP_RSH */ + 3, /* JSOP_URSH */ + 3, /* JSOP_ADD */ + 3, /* JSOP_SUB */ + 3, /* JSOP_MUL */ + 3, /* JSOP_DIV */ + 3, /* JSOP_MOD */ + 0, /* JSOP_NOT */ + 0, /* JSOP_BITNOT */ + 3, /* JSOP_NEG */ + 3, /* JSOP_POS */ + 0, /* JSOP_DELNAME */ + 0, /* JSOP_DELPROP */ + 0, /* JSOP_DELELEM */ + 0, /* JSOP_TYPEOF */ + 0, /* JSOP_VOID */ + 0, /* JSOP_INCNAME */ + 0, /* JSOP_INCPROP */ + 3, /* JSOP_INCELEM */ + 0, /* JSOP_DECNAME */ + 0, /* JSOP_DECPROP */ + 3, /* JSOP_DECELEM */ + 0, /* JSOP_NAMEINC */ + 0, /* JSOP_PROPINC */ + 3, /* JSOP_ELEMINC */ + 0, /* JSOP_NAMEDEC */ + 0, /* JSOP_PROPDEC */ + 3, /* JSOP_ELEMDEC */ + 1, /* JSOP_GETPROP */ + 0, /* JSOP_SETPROP */ + 0, /* JSOP_GETELEM */ + 0, /* JSOP_SETELEM */ + 0, /* JSOP_CALLNAME */ + 3, /* JSOP_CALL */ + 0, /* JSOP_NAME */ + 0, /* JSOP_DOUBLE */ + 0, /* JSOP_STRING */ + 0, /* JSOP_ZERO */ + 0, /* JSOP_ONE */ + 0, /* JSOP_NULL */ + 0, /* JSOP_THIS */ + 0, /* JSOP_FALSE */ + 0, /* JSOP_TRUE */ + 0, /* JSOP_OR */ + 0, /* JSOP_AND */ + 0, /* JSOP_TABLESWITCH */ + 0, /* JSOP_LOOKUPSWITCH */ + 0, /* JSOP_STRICTEQ */ + 0, /* JSOP_STRICTNE */ + 0, /* JSOP_SETCALL */ + 0, /* JSOP_ITER */ + 0, /* JSOP_MOREITER */ + 0, /* JSOP_ENDITER */ + 8, /* JSOP_APPLY */ + 0, /* JSOP_SWAP */ + 0, /* JSOP_OBJECT */ + 0, /* JSOP_POP */ + 3, /* JSOP_NEW */ + 0, /* JSOP_TRAP */ + 0, /* JSOP_GETARG */ + 0, /* JSOP_SETARG */ + 0, /* JSOP_GETLOCAL */ + 0, /* JSOP_SETLOCAL */ + 0, /* JSOP_UINT16 */ + 0, /* JSOP_NEWINIT */ + 0, /* JSOP_ENDINIT */ + 0, /* JSOP_INITPROP */ + 0, /* JSOP_INITELEM */ + 0, /* JSOP_DEFSHARP */ + 0, /* JSOP_USESHARP */ + 0, /* JSOP_INCARG */ + 0, /* JSOP_DECARG */ + 0, /* JSOP_ARGINC */ + 0, /* JSOP_ARGDEC */ + 0, /* JSOP_INCLOCAL */ + 0, /* JSOP_DECLOCAL */ + 0, /* JSOP_LOCALINC */ + 0, /* JSOP_LOCALDEC */ + 0, /* JSOP_IMACOP */ + 0, /* JSOP_FORNAME */ + 0, /* JSOP_FORPROP */ + 0, /* JSOP_FORELEM */ + 0, /* JSOP_POPN */ + 0, /* JSOP_BINDNAME */ + 0, /* JSOP_SETNAME */ + 0, /* JSOP_THROW */ + 0, /* JSOP_IN */ + 0, /* JSOP_INSTANCEOF */ + 0, /* JSOP_DEBUGGER */ + 0, /* JSOP_GOSUB */ + 0, /* JSOP_RETSUB */ + 0, /* JSOP_EXCEPTION */ + 0, /* JSOP_LINENO */ + 0, /* JSOP_CONDSWITCH */ + 0, /* JSOP_CASE */ + 0, /* JSOP_DEFAULT */ + 0, /* JSOP_EVAL */ + 0, /* JSOP_ENUMELEM */ + 0, /* JSOP_GETTER */ + 0, /* JSOP_SETTER */ + 0, /* JSOP_DEFFUN */ + 0, /* JSOP_DEFCONST */ + 0, /* JSOP_DEFVAR */ + 0, /* JSOP_LAMBDA */ + 0, /* JSOP_CALLEE */ + 0, /* JSOP_SETLOCALPOP */ + 0, /* JSOP_PICK */ + 0, /* JSOP_TRY */ + 0, /* JSOP_FINALLY */ + 0, /* JSOP_GETDSLOT */ + 0, /* JSOP_CALLDSLOT */ + 0, /* JSOP_ARGSUB */ + 0, /* JSOP_ARGCNT */ + 0, /* JSOP_DEFLOCALFUN */ + 0, /* JSOP_GOTOX */ + 0, /* JSOP_IFEQX */ + 0, /* JSOP_IFNEX */ + 0, /* JSOP_ORX */ + 0, /* JSOP_ANDX */ + 0, /* JSOP_GOSUBX */ + 0, /* JSOP_CASEX */ + 0, /* JSOP_DEFAULTX */ + 0, /* JSOP_TABLESWITCHX */ + 0, /* JSOP_LOOKUPSWITCHX */ + 0, /* JSOP_BACKPATCH */ + 0, /* JSOP_BACKPATCH_POP */ + 0, /* JSOP_THROWING */ + 0, /* JSOP_SETRVAL */ + 0, /* JSOP_RETRVAL */ + 0, /* JSOP_GETGVAR */ + 0, /* JSOP_SETGVAR */ + 0, /* JSOP_INCGVAR */ + 0, /* JSOP_DECGVAR */ + 0, /* JSOP_GVARINC */ + 0, /* JSOP_GVARDEC */ + 0, /* JSOP_REGEXP */ + 0, /* JSOP_DEFXMLNS */ + 0, /* JSOP_ANYNAME */ + 0, /* JSOP_QNAMEPART */ + 0, /* JSOP_QNAMECONST */ + 0, /* JSOP_QNAME */ + 0, /* JSOP_TOATTRNAME */ + 0, /* JSOP_TOATTRVAL */ + 0, /* JSOP_ADDATTRNAME */ + 0, /* JSOP_ADDATTRVAL */ + 0, /* JSOP_BINDXMLNAME */ + 0, /* JSOP_SETXMLNAME */ + 0, /* JSOP_XMLNAME */ + 0, /* JSOP_DESCENDANTS */ + 0, /* JSOP_FILTER */ + 0, /* JSOP_ENDFILTER */ + 0, /* JSOP_TOXML */ + 0, /* JSOP_TOXMLLIST */ + 0, /* JSOP_XMLTAGEXPR */ + 0, /* JSOP_XMLELTEXPR */ + 0, /* JSOP_XMLOBJECT */ + 0, /* JSOP_XMLCDATA */ + 0, /* JSOP_XMLCOMMENT */ + 0, /* JSOP_XMLPI */ + 2, /* JSOP_CALLPROP */ + 0, /* JSOP_GETUPVAR */ + 0, /* JSOP_CALLUPVAR */ + 0, /* JSOP_DELDESC */ + 0, /* JSOP_UINT24 */ + 0, /* JSOP_INDEXBASE */ + 0, /* JSOP_RESETBASE */ + 0, /* JSOP_RESETBASE0 */ + 0, /* JSOP_STARTXML */ + 0, /* JSOP_STARTXMLEXPR */ + 0, /* JSOP_CALLELEM */ + 0, /* JSOP_STOP */ + 0, /* JSOP_GETXPROP */ + 0, /* JSOP_CALLXMLNAME */ + 0, /* JSOP_TYPEOFEXPR */ + 0, /* JSOP_ENTERBLOCK */ + 0, /* JSOP_LEAVEBLOCK */ + 0, /* JSOP_IFPRIMTOP */ + 0, /* JSOP_PRIMTOP */ + 0, /* JSOP_GENERATOR */ + 0, /* JSOP_YIELD */ + 0, /* JSOP_ARRAYPUSH */ + 0, /* JSOP_GETFUNNS */ + 0, /* JSOP_ENUMCONSTELEM */ + 0, /* JSOP_LEAVEBLOCKEXPR */ + 2, /* JSOP_GETTHISPROP */ + 2, /* JSOP_GETARGPROP */ + 2, /* JSOP_GETLOCALPROP */ + 0, /* JSOP_INDEXBASE1 */ + 0, /* JSOP_INDEXBASE2 */ + 0, /* JSOP_INDEXBASE3 */ + 0, /* JSOP_CALLGVAR */ + 0, /* JSOP_CALLLOCAL */ + 0, /* JSOP_CALLARG */ + 0, /* JSOP_UNUSED218 */ + 0, /* JSOP_INT8 */ + 0, /* JSOP_INT32 */ + 0, /* JSOP_LENGTH */ + 0, /* JSOP_NEWARRAY */ + 0, /* JSOP_HOLE */ + 0, /* JSOP_DEFFUN_FC */ + 0, /* JSOP_DEFLOCALFUN_FC */ + 0, /* JSOP_LAMBDA_FC */ + 0, /* JSOP_OBJTOP */ + 0, /* JSOP_TRACE */ + 0, /* JSOP_GETUPVAR_DBG */ + 0, /* JSOP_CALLUPVAR_DBG */ + 0, /* JSOP_DEFFUN_DBGFC */ + 0, /* JSOP_DEFLOCALFUN_DBGFC */ + 0, /* JSOP_LAMBDA_DBGFC */ + 0, /* JSOP_CONCATN */ + 0, /* JSOP_SETMETHOD */ + 0, /* JSOP_INITMETHOD */ + 0, /* JSOP_UNBRAND */ + 0, /* JSOP_UNBRANDTHIS */ + 0, /* JSOP_SHARPINIT */ + 3, /* JSOP_OBJTOSTR */ + 0, /* JSOP_GETGLOBAL */ + 0, /* JSOP_SETGLOBAL */ + 0, /* JSOP_INCGLOBAL */ + 0, /* JSOP_DECGLOBAL */ + 0, /* JSOP_GLOBALINC */ + 0, /* JSOP_GLOBALDEC */ + 0, /* JSOP_CALLGLOBAL */ + 0, /* JSOP_FORGLOBAL */ +}; +#define JSOP_IS_IMACOP(x) (0 \ + || x == JSOP_BITOR \ + || x == JSOP_BITXOR \ + || x == JSOP_BITAND \ + || x == JSOP_EQ \ + || x == JSOP_NE \ + || x == JSOP_LT \ + || x == JSOP_LE \ + || x == JSOP_GT \ + || x == JSOP_GE \ + || x == JSOP_LSH \ + || x == JSOP_RSH \ + || x == JSOP_URSH \ + || x == JSOP_ADD \ + || x == JSOP_SUB \ + || x == JSOP_MUL \ + || x == JSOP_DIV \ + || x == JSOP_MOD \ + || x == JSOP_NEG \ + || x == JSOP_POS \ + || x == JSOP_INCELEM \ + || x == JSOP_DECELEM \ + || x == JSOP_ELEMINC \ + || x == JSOP_ELEMDEC \ + || x == JSOP_GETPROP \ + || x == JSOP_CALL \ + || x == JSOP_APPLY \ + || x == JSOP_NEW \ + || x == JSOP_CALLPROP \ + || x == JSOP_GETTHISPROP \ + || x == JSOP_GETARGPROP \ + || x == JSOP_GETLOCALPROP \ + || x == JSOP_OBJTOSTR \ +) +jsbytecode* +js_GetImacroStart(jsbytecode* pc) { + if (size_t(pc - equality_imacros.any_obj) < 36) return equality_imacros.any_obj; + if (size_t(pc - equality_imacros.obj_any) < 38) return equality_imacros.obj_any; + if (size_t(pc - binary_imacros.any_obj) < 36) return binary_imacros.any_obj; + if (size_t(pc - binary_imacros.obj_any) < 38) return binary_imacros.obj_any; + if (size_t(pc - binary_imacros.obj_obj) < 72) return binary_imacros.obj_obj; + if (size_t(pc - add_imacros.any_obj) < 36) return add_imacros.any_obj; + if (size_t(pc - add_imacros.obj_any) < 38) return add_imacros.obj_any; + if (size_t(pc - add_imacros.obj_obj) < 72) return add_imacros.obj_obj; + if (size_t(pc - unary_imacros.sign) < 41) return unary_imacros.sign; + if (size_t(pc - incelem_imacros.incelem) < 7) return incelem_imacros.incelem; + if (size_t(pc - incelem_imacros.eleminc) < 15) return incelem_imacros.eleminc; + if (size_t(pc - decelem_imacros.decelem) < 7) return decelem_imacros.decelem; + if (size_t(pc - decelem_imacros.elemdec) < 15) return decelem_imacros.elemdec; + if (size_t(pc - call_imacros.String) < 38) return call_imacros.String; + if (size_t(pc - new_imacros.String) < 38) return new_imacros.String; + if (size_t(pc - apply_imacros.apply0) < 8) return apply_imacros.apply0; + if (size_t(pc - apply_imacros.apply1) < 12) return apply_imacros.apply1; + if (size_t(pc - apply_imacros.apply2) < 16) return apply_imacros.apply2; + if (size_t(pc - apply_imacros.apply3) < 21) return apply_imacros.apply3; + if (size_t(pc - apply_imacros.apply4) < 26) return apply_imacros.apply4; + if (size_t(pc - apply_imacros.apply5) < 31) return apply_imacros.apply5; + if (size_t(pc - apply_imacros.apply6) < 36) return apply_imacros.apply6; + if (size_t(pc - apply_imacros.apply7) < 41) return apply_imacros.apply7; + if (size_t(pc - apply_imacros.apply8) < 46) return apply_imacros.apply8; + if (size_t(pc - apply_imacros.call0) < 7) return apply_imacros.call0; + if (size_t(pc - apply_imacros.call1) < 7) return apply_imacros.call1; + if (size_t(pc - apply_imacros.call2) < 7) return apply_imacros.call2; + if (size_t(pc - apply_imacros.call3) < 7) return apply_imacros.call3; + if (size_t(pc - apply_imacros.call4) < 7) return apply_imacros.call4; + if (size_t(pc - apply_imacros.call5) < 7) return apply_imacros.call5; + if (size_t(pc - apply_imacros.call6) < 7) return apply_imacros.call6; + if (size_t(pc - apply_imacros.call7) < 7) return apply_imacros.call7; + if (size_t(pc - apply_imacros.call8) < 7) return apply_imacros.call8; + if (size_t(pc - objtostr_imacros.toString) < 35) return objtostr_imacros.toString; + if (size_t(pc - getprop_imacros.scriptgetter) < 4) return getprop_imacros.scriptgetter; + if (size_t(pc - callprop_imacros.scriptgetter) < 5) return callprop_imacros.scriptgetter; + if (size_t(pc - getthisprop_imacros.scriptgetter) < 4) return getthisprop_imacros.scriptgetter; + return NULL; +} diff --git a/js/src/methodjit/Compiler.cpp b/js/src/methodjit/Compiler.cpp index 835a72b1358..5346234028a 100644 --- a/js/src/methodjit/Compiler.cpp +++ b/js/src/methodjit/Compiler.cpp @@ -63,7 +63,7 @@ NotCheckedSSE2; mjit::Compiler::Compiler(JSContext *cx, JSScript *script, JSFunction *fun, JSObject *scopeChain) : CompilerBase(cx), cx(cx), script(script), scopeChain(scopeChain), globalObj(scopeChain->getGlobal()), fun(fun), analysis(cx, script), jumpMap(NULL), - frame(cx, script, masm), cg(masm, frame) + frame(cx, script, masm), cg(masm, frame), branchPatches(ContextAllocPolicy(cx)) { } @@ -175,6 +175,9 @@ mjit::Compiler::generateMethod() OpcodeStatus &opinfo = analysis[PC]; if (opinfo.nincoming) { opinfo.safePoint = true; + frame.flush(); + frame.forceStackDepth(opinfo.stackDepth); + jumpMap[uint32(PC - script->code)] = masm.label(); } if (!opinfo.visited) { @@ -195,11 +198,21 @@ mjit::Compiler::generateMethod() } #endif + JS_ASSERT(frame.stackDepth() == opinfo.stackDepth); + /********************** * BEGIN COMPILER OPS * **********************/ switch (op) { + BEGIN_CASE(JSOP_GOTO) + { + frame.flush(); + Jump j = masm.jump(); + jumpInScript(j, PC + GET_JUMP_OFFSET(PC)); + } + END_CASE(JSOP_GOTO) + BEGIN_CASE(JSOP_TRACE) END_CASE(JSOP_TRACE) @@ -274,6 +287,14 @@ mjit::Compiler::generateMethod() #undef END_CASE #undef BEGIN_CASE +const JSC::MacroAssembler::Label & +mjit::Compiler::labelOf(jsbytecode *pc) +{ + uint32 offs = uint32(pc - script->code); + JS_ASSERT(jumpMap[offs].isValid()); + return jumpMap[offs]; +} + uint32 mjit::Compiler::fullAtomIndex(jsbytecode *pc) { @@ -285,6 +306,19 @@ mjit::Compiler::fullAtomIndex(jsbytecode *pc) #endif } +void +mjit::Compiler::jumpInScript(Jump j, jsbytecode *pc) +{ + JS_ASSERT(pc >= script->code && uint32(pc - script->code) < script->length); + + /* :TODO: OOM failure possible here. */ + + if (pc < PC) + j.linkTo(jumpMap[uint32(pc - script->code)], &masm); + else + branchPatches.append(BranchPatch(j, pc)); +} + CompileStatus mjit::Compiler::generateEpilogue() { @@ -294,6 +328,11 @@ mjit::Compiler::generateEpilogue() CompileStatus mjit::Compiler::finishThisUp() { + for (size_t i = 0; i < branchPatches.length(); i++) { + Label label = labelOf(branchPatches[i].pc); + branchPatches[i].jump.linkTo(label, &masm); + } + JSC::ExecutablePool *execPool = getExecPool(masm.size()); if (!execPool) return Compile_Abort; diff --git a/js/src/methodjit/Compiler.h b/js/src/methodjit/Compiler.h index 5cf2f1e4148..633a0b55e4e 100644 --- a/js/src/methodjit/Compiler.h +++ b/js/src/methodjit/Compiler.h @@ -58,8 +58,18 @@ class Compiler : public CompilerBase typedef JSC::MacroAssembler::ImmPtr ImmPtr; typedef JSC::MacroAssembler::RegisterID RegisterID; typedef JSC::MacroAssembler::Address Address; + typedef JSC::MacroAssembler::Jump Jump; typedef JSC::MacroAssembler MacroAssembler; + struct BranchPatch { + BranchPatch(const Jump &j, jsbytecode *pc) + : jump(j), pc(pc) + { } + + Jump jump; + jsbytecode *pc; + }; + JSContext *cx; JSScript *script; JSObject *scopeChain; @@ -71,6 +81,8 @@ class Compiler : public CompilerBase MacroAssembler masm; FrameState frame; CodeGenerator cg; + js::Vector branchPatches; + public: // Special atom index used to indicate that the atom is 'length'. This // follows interpreter usage in JSOP_LENGTH. @@ -88,7 +100,9 @@ class Compiler : public CompilerBase CompileStatus finishThisUp(); /* Non-emitting helpers. */ + const Label &labelOf(jsbytecode *pc); uint32 fullAtomIndex(jsbytecode *pc); + void jumpInScript(Jump j, jsbytecode *pc); /* Opcode handlers. */ void jsop_bindname(uint32 index); diff --git a/js/src/methodjit/FrameEntry.h b/js/src/methodjit/FrameEntry.h index ab69e026356..cd6a32c0935 100644 --- a/js/src/methodjit/FrameEntry.h +++ b/js/src/methodjit/FrameEntry.h @@ -81,6 +81,7 @@ struct RematInfo { synced_ = true; location_ = PhysLoc_Memory; } + bool synced() { return synced_; } RegisterID reg_; PhysLoc location_; diff --git a/js/src/methodjit/FrameState.cpp b/js/src/methodjit/FrameState.cpp index 8d5fc2d9a97..16aa5c2cc4c 100644 --- a/js/src/methodjit/FrameState.cpp +++ b/js/src/methodjit/FrameState.cpp @@ -96,3 +96,24 @@ FrameState::assertValidRegisterState() JS_ASSERT(temp == regalloc); } +void +FrameState::invalidate(FrameEntry *fe) +{ + if (!fe->type.synced()) { + JS_NOT_REACHED("wat"); + } + if (!fe->data.synced()) { + JS_NOT_REACHED("wat2"); + } + fe->type.setMemory(); + fe->data.setMemory(); + fe->copies = 0; +} + +void +FrameState::flush() +{ + for (FrameEntry *fe = base; fe < sp; fe++) + invalidate(fe); +} + diff --git a/js/src/methodjit/FrameState.h b/js/src/methodjit/FrameState.h index 2acdfc8ec28..445197332e7 100644 --- a/js/src/methodjit/FrameState.h +++ b/js/src/methodjit/FrameState.h @@ -164,10 +164,21 @@ class FrameState return Address(FpReg, 0); } + void forceStackDepth(uint32 newDepth) { + uint32 oldDepth = stackDepth(); + FrameEntry *spBase = locals + script->nfixed; + sp = spBase + newDepth; + if (oldDepth <= newDepth) + return; + memset(spBase, 0, sizeof(FrameEntry) * (newDepth - oldDepth)); + } + + void flush(); void assertValidRegisterState(); private: void evictSomething(); + void invalidate(FrameEntry *fe); RegisterID getDataReg(FrameEntry *vi, FrameEntry *backing); private: