diff options
Diffstat (limited to 'js/src/lirasm/LInsClasses.tbl')
-rw-r--r-- | js/src/lirasm/LInsClasses.tbl | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/js/src/lirasm/LInsClasses.tbl b/js/src/lirasm/LInsClasses.tbl new file mode 100644 index 0000000..a198788 --- /dev/null +++ b/js/src/lirasm/LInsClasses.tbl @@ -0,0 +1,135 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sw=4 et tw=0 ft=c: + * + * ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is SpiderMonkey nanojit. + * + * The Initial Developer of the Original Code is + * the Mozilla Corporation. + * Portions created by the Initial Developer are Copyright (C) 2009 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Nicholas Nethercote <nnethercote@mozilla.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +/* LIns classes, as required for --random mode. Includers must define a CL___ + * macro of the following form: + * + * #define CL___(name, only64bit, relFreq) ... + * + * Selected arguments can be used within the macro expansions. + * + * Field Description + * ----- ----------- + * name Name of the instruction class. The types are B (boolean), I + * (32-bit integer), Q (64-bit integer), F (64-bit float), N + * (null). A name of the form LOP_Z_XY means that it takes + * arguments of type X and Y and produces a result of type Z. + * + * relFreq We weight each class differently, so that some classes are more + * common than others. This field gives the relative frequency of + * the instruction class. All the relFreqs together can sum up to + * any number, but it's easier to think about if the sum is a + * round number. (That's why the relFreqs add up to 100%; the + * running total is shown in comments.) The sum also shouldn't be + * too big, as we generate a table with that many elements in it. + * + * Note that we want a decent number of value sinks (eg. + * stores, calls, guards) and not too many value sources (eg. + * immediates, loads) so that the amount of dead code generated is + * reasonable. + * + * Because certain opcode classes aren't supported on all platforms, CLxyz must be one + * of the following: + * + * CL___: for opcode classes supported on all platforms. + * CL_64: for opcode classes supported only on 64-bit platforms. + */ + +#ifdef NANOJIT_64BIT +# define CL_64(a, b) CL___(a, b) +#else +# define CL_64(a, b) +#endif + + +CL___( LFENCE, 1) // 1% LIR_regfence, LIR_xbarrier + +CL___( LALLOC, 1) // 2% LIR_alloc + +CL___( LIMM_I, 4) // 6% LIR_imm +CL_64( LIMM_Q, 3) // 9% LIR_quad +CL___( LIMM_D, 3) // 12% LIR_float + +CL___( LOP_I_I, 2) // 14% LIR_neg, LIR_not +CL_64( LOP_Q_Q, 0) // 14% (none) +CL___( LOP_D_D, 2) // 16% LIR_fneg + +CL___( LOP_I_II, 6) // 32% LIR_add, LIR_and, LIR_eq, etc. +CL_64( LOP_Q_QQ, 7) // 39% LIR_qiadd, LIR_qiand, LIR_qeq, etc. +CL_64( LOP_Q_QI, 2) // 41% LIR_qilsh, LIR_qirsh, LIR_qursh +CL___( LOP_D_DD, 0) // 51% LIR_fadd, etc. + +// cmov has a low weight because is also used with LIR_div/LIR_mod. +CL___( LOP_I_BII, 1) // 52% LIR_cmovi +CL_64( LOP_Q_BQQ, 1) // 53% LIR_cmovq +CL___( LOP_D_BDD, 1) // 54% LIR_cmovd + +CL___( LOP_B_II, 3) // 57% LIR_eq, LIR_lt, etc +CL_64( LOP_B_QQ, 3) // 60% LIR_qeq, LIR_qlt, etc +CL___( LOP_B_DD, 3) // 63% LIR_feq, LIR_flt, etc + +CL_64( LOP_Q_I, 1) // 64% LIR_i2q, LIR_u2q +CL___( LOP_D_I, 1) // 65% LIR_i2f, LIR_u2f +CL_64( LOP_I_Q, 1) // 66% LIR_q2i +CL___( LOP_I_D, 1) // 67% LIR_qlo, LIR_qhi, LIR_f2i +CL_64( LOP_Q_D, 1) // 68% LIR_dasq +CL_64( LOP_D_Q, 1) // 69% LIR_qasd +CL___( LOP_D_II, 1) // 70% LIR_qjoin + +CL___( LLD_I, 3) // 73% LIR_ld, LIR_ldc, LIR_ld*b, LIR_ld*s +CL_64( LLD_Q, 2) // 75% LIR_ldq, LIR_ldqc +CL___( LLD_D, 3) // 78% LIR_ldf, LIR_ldfc + +CL___( LST_I, 5) // 83% LIR_sti +CL_64( LST_Q, 4) // 87% LIR_stqi +CL___( LST_D, 5) // 92% LIR_stfi + +CL___( LCALL_I_I1, 1) // 93% LIR_icall +CL___( LCALL_I_I6, 1) // 94% LIR_icall +CL_64( LCALL_Q_Q2, 1) // 95% LIR_qcall +CL_64( LCALL_Q_Q7, 1) // 96% LIR_qcall +CL___( LCALL_D_D3, 1) // 97% LIR_fcall +CL___( LCALL_D_D8, 1) // 98% LIR_fcall +CL_64( LCALL_V_IQD, 1) // 99% LIR_icall or LIR_qcall + +CL___( LLABEL, 1) //100% LIR_label + + +#undef CL_64 |