summaryrefslogtreecommitdiff
path: root/js/src/lirasm/LInsClasses.tbl
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/lirasm/LInsClasses.tbl')
-rw-r--r--js/src/lirasm/LInsClasses.tbl135
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