gecko/js/src/lirasm/LInsClasses.tbl
Andreas Gal 00c966f8e3 Bug 580534 - implement LIR_cmovd. r=nnethercote.
--HG--
extra : convert_revision : 186f3f376d662375ff9182cf0b470468335ef442
2010-08-03 20:39:21 -07:00

136 lines
5.6 KiB
C

/* -*- 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