mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
00c966f8e3
--HG-- extra : convert_revision : 186f3f376d662375ff9182cf0b470468335ef442
136 lines
5.6 KiB
C
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
|