Open64 (mfef90, whirl2f, and IR tools)  TAG: version-openad; SVN changeset: 916
itanium_si.cxx
Go to the documentation of this file.
00001 /*
00002 
00003   Copyright (C) 2000, 2001 Silicon Graphics, Inc.  All Rights Reserved.
00004 
00005   This program is free software; you can redistribute it and/or modify it
00006   under the terms of version 2 of the GNU General Public License as
00007   published by the Free Software Foundation.
00008 
00009   This program is distributed in the hope that it would be useful, but
00010   WITHOUT ANY WARRANTY; without even the implied warranty of
00011   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
00012 
00013   Further, this software is distributed without any warranty that it is
00014   free of the rightful claim of any third person regarding infringement 
00015   or the like.  Any license provided herein, whether implied or 
00016   otherwise, applies only to this software file.  Patent licenses, if 
00017   any, provided herein do not apply to combinations of this program with 
00018   other software, or any other product whatsoever.  
00019 
00020   You should have received a copy of the GNU General Public License along
00021   with this program; if not, write the Free Software Foundation, Inc., 59
00022   Temple Place - Suite 330, Boston MA 02111-1307, USA.
00023 
00024   Contact information:  Silicon Graphics, Inc., 1600 Amphitheatre Pky,
00025   Mountain View, CA 94043, or:
00026 
00027   http://www.sgi.com
00028 
00029   For further information regarding this notice, see:
00030 
00031   http://oss.sgi.com/projects/GenInfo/NoticeExplan
00032 
00033 */
00034 
00035 
00036 //  Intel Itanium (tm) processor scheduling information
00038 //  
00039 //  Description:
00040 //
00041 //  Generate a scheduling description of a Intel Itanium (tm) processor
00042 //  via the si_gen interface.
00043 //
00045 
00046 
00047 
00048 
00049 #include "si_gen.h"
00050 #include "targ_isa_subset.h"
00051 #include "topcode.h"
00052 
00053 static RESOURCE res_issue,
00054                 res_sem,        // for non-pipelinable semaphore insts
00055                 res_memory,     // Memory unit 
00056                 res_M0,         // M0 Memory unit
00057                 res_float,      // Float unit
00058                 res_F0,         // F0 Float unit
00059                 res_integer,    // Integer unit
00060                 res_I0,         // I0 unit
00061                 res_int_or_mem, // to simulate A-type insts which can execute
00062                                 // in either I or M unit
00063                 res_branch,     // Branch unit
00064                 res_B0_or_B1,   // B0 or B1 unit
00065                 res_B0_or_B2,   // B0 or B2 unit
00066                 res_B2;         // B2 unit
00067 
00068 int
00069 main (int argc, char *argv[])
00070 {
00071   Machine("itanium", ISA_SUBSET_intel1, argc, argv);
00072 
00073   res_issue = RESOURCE_Create("issue", 6);
00074   res_sem = RESOURCE_Create("sem", 1);
00075   res_int_or_mem = RESOURCE_Create("integer_or_memory", 4);
00076   res_memory = RESOURCE_Create("memory", 2);
00077   res_M0 = RESOURCE_Create("memory0", 1);
00078   res_float = RESOURCE_Create("floating-point", 2);
00079   res_F0 = RESOURCE_Create("floating-point0", 1);
00080   res_integer = RESOURCE_Create("integer", 2);
00081   res_I0 = RESOURCE_Create("integer0", 1);
00082   res_branch = RESOURCE_Create("branch", 3);
00083   res_B0_or_B1 = RESOURCE_Create("B0_or_B1", 2);
00084   res_B0_or_B2 = RESOURCE_Create("B0_or_B2", 2);
00085   res_B2 = RESOURCE_Create("B2", 1);
00086 
00088   //
00089   // Instructions belonging to the BR functional unit class:
00090   // B-type instructions which can execute in any B unit.
00091   //
00093   Instruction_Group("BR",
00094                     TOP_br_call,
00095                     TOP_br_r_call,
00096                     TOP_brl_call,
00097                     TOP_br_cond,
00098                     TOP_br_r_cond,
00099                     TOP_brl_cond,
00100                     TOP_br_ia,
00101                     TOP_br_ret,
00102                     TOP_br,             // pseudo of br_cond
00103                     TOP_br_r,           // pseudo of br_r_cond
00104                     TOP_brl,            // pseudo of brl_cond
00105                     TOP_UNDEFINED);
00106   Any_Operand_Access_Time(0);
00107   Any_Result_Available_Time(1);         // ??? not sure
00108   Resource_Requirement(res_issue, 0);
00109   Resource_Requirement(res_branch, 0);
00110 
00112   //
00113   // Instructions belonging to the BR_B2 functional unit class:
00114   // B-type instructions which can execute in any B unit.
00115   //
00117   Instruction_Group("BR_B2",
00118                     TOP_br_cexit,
00119                     TOP_br_cloop,
00120                     TOP_br_ctop,
00121                     TOP_br_wexit,       // ??? correct functional unit?
00122                     TOP_br_wtop,
00123                     TOP_UNDEFINED);
00124   Any_Operand_Access_Time(0);
00125   Any_Result_Available_Time(1);         // ??? not sure
00126   Resource_Requirement(res_issue, 0);
00127   Resource_Requirement(res_branch, 0);
00128   Resource_Requirement(res_B2, 0);
00129 
00131   //
00132   // Instructions belonging to the BRP functional unit class:
00133   // B-type instructions which can exeucte in any B unit, but
00134   // if sent to B1 will be ignored.
00135   //
00137   Instruction_Group("BRP",
00138                     TOP_brp,
00139                     TOP_brp_r,
00140                     TOP_brp_ret,
00141                     TOP_UNDEFINED);
00142   Any_Operand_Access_Time(0);
00143   Resource_Requirement(res_issue, 0);
00144   Resource_Requirement(res_branch, 0);
00145 
00147   //
00148   // Instructions belonging to the CHK_ALAT functional unit class:
00149   // M-type instructions which can execute in any M unit.
00150   //
00152   Instruction_Group("CHK_ALAT",
00153                     TOP_chk_a,
00154                     TOP_chk_f_a,
00155                     TOP_UNDEFINED);
00156   Any_Operand_Access_Time(0);
00157   Resource_Requirement(res_issue, 0);
00158   Resource_Requirement(res_int_or_mem, 0);
00159   Resource_Requirement(res_memory, 0);
00160 
00162   //
00163   // Instructions belonging to the CHK_I functional unit class:
00164   // I-type instructions which can execute in any I Unit.
00165   //
00167   Instruction_Group("CHK_I",
00168                     TOP_chk_s_i,
00169                     TOP_UNDEFINED);
00170   Any_Operand_Access_Time(0);
00171   Resource_Requirement(res_issue, 0);
00172   Resource_Requirement(res_int_or_mem, 0);
00173   Resource_Requirement(res_integer, 0);
00174 
00176   //
00177   // Instructions belonging to the CHK_M functional unit class:
00178   // M-type instructions which can execute in any M unit.
00179   //
00181   Instruction_Group("CHK_M",
00182                     TOP_chk_f_s,
00183                     TOP_chk_s_m,
00184                     TOP_UNDEFINED);
00185   Any_Operand_Access_Time(0);
00186   Resource_Requirement(res_issue, 0);
00187   Resource_Requirement(res_int_or_mem, 0);
00188   Resource_Requirement(res_memory, 0);
00189 
00191   //
00192   // Instructions belonging to the CLD functional unit class:
00193   // M-type instructions which can execute in any M unit.
00194   //
00196   Instruction_Group("CLD",
00197                     // ??? ld.c
00198                     TOP_UNDEFINED);
00199   Any_Operand_Access_Time(0);
00200   Any_Result_Available_Time(0);
00201   Resource_Requirement(res_issue, 0);
00202   Resource_Requirement(res_int_or_mem, 0);
00203   Resource_Requirement(res_memory, 0);
00204   Load_Access_Time(2);
00205 
00207   //
00208   // Instructions belonging to the FCLD functional unit class:
00209   // M-type instructions which can execute in any M unit.
00210   //
00212   Instruction_Group("FCLD",
00213                     // ??? ldf8.c
00214                     // ??? ldfd.c
00215                     // ??? ldfe.c
00216                     // ??? ldfp8.c
00217                     // ??? ldfpd.c
00218                     // ??? ldfps.c
00219                     // ??? ldfs.c
00220                     TOP_UNDEFINED);
00221   Any_Operand_Access_Time(0);
00222   Any_Result_Available_Time(0);
00223   Resource_Requirement(res_issue, 0);
00224   Resource_Requirement(res_int_or_mem, 0);
00225   Resource_Requirement(res_memory, 0);
00226   Load_Access_Time(2);
00227 
00229   //
00230   // Instructions belonging to the FCMP functional unit class:
00231   // F-type instructions which can only execute in F0.
00232   //
00234   Instruction_Group("FCMP",
00235                     TOP_fclass_nm,
00236                     TOP_fclass_nm_unc,
00237                     TOP_fclass_m,
00238                     TOP_fclass_m_unc,
00239                     TOP_fcmp_eq,
00240                     TOP_fcmp_lt,
00241                     TOP_fcmp_le,
00242                     TOP_fcmp_unord,
00243                     TOP_fcmp_eq_unc,
00244                     TOP_fcmp_lt_unc,
00245                     TOP_fcmp_le_unc,
00246                     TOP_fcmp_unord_unc,
00247                     TOP_fcmp_gt,
00248                     TOP_fcmp_gt_unc,
00249                     TOP_fcmp_ge,
00250                     TOP_fcmp_ge_unc,
00251                     TOP_fcmp_neq,
00252                     TOP_fcmp_neq_unc,
00253                     TOP_fcmp_nlt,
00254                     TOP_fcmp_nlt_unc,
00255                     TOP_fcmp_nle,
00256                     TOP_fcmp_nle_unc,
00257                     TOP_fcmp_ngt,
00258                     TOP_fcmp_ngt_unc,
00259                     TOP_fcmp_nge,
00260                     TOP_fcmp_nge_unc,
00261                     TOP_fcmp_ord,
00262                     TOP_fcmp_ord_unc,
00263                     TOP_UNDEFINED);
00264   Any_Operand_Access_Time(0);
00265   Any_Result_Available_Time(2);         // +2 to dependent SFxxx
00266   Resource_Requirement(res_issue, 0);
00267   Resource_Requirement(res_float, 0);
00268   Resource_Requirement(res_F0, 0);      // can only execute in F0
00269 
00271   //
00272   // Instructions belonging to the FCVTFX functional unit class:
00273   // F-type instructions which can execute in any F unit.
00274   //
00276   Instruction_Group("FCVTFX",
00277                     TOP_fcvt_fx,
00278                     TOP_fcvt_fx_trunc,
00279                     TOP_fcvt_fxu,
00280                     TOP_fcvt_fxu_trunc,
00281                     TOP_fcvt_xf,
00282                     TOP_UNDEFINED);
00283   Any_Operand_Access_Time(0);
00284   Any_Result_Available_Time(7);         // +2 to dependent SFxxx
00285   Resource_Requirement(res_issue, 0);
00286   Resource_Requirement(res_float, 0);
00287 
00289   //
00290   // Instructions belonging to the FLD functional unit class:
00291   // M-type instructions which can execute in any M unit.
00292   //
00294   Instruction_Group("FLD",
00295                     TOP_ldf8,
00296                     TOP_ldf8_r,
00297                     TOP_ldf8_i,
00298                     TOP_ldfd,
00299                     TOP_ldfd_r,
00300                     TOP_ldfd_i,
00301                     TOP_ldfe,
00302                     TOP_ldfe_r,
00303                     TOP_ldfe_i,
00304                     TOP_ldf_fill,
00305                     TOP_ldf_r_fill,
00306                     TOP_ldf_i_fill,
00307                     TOP_ldfs,
00308                     TOP_ldfs_r,
00309                     TOP_ldfs_i,
00310                     TOP_UNDEFINED);
00311   Any_Operand_Access_Time(0);
00312   Any_Result_Available_Time(9);         // +2 to dependent SFxxx
00313   Resource_Requirement(res_issue, 0);
00314   Resource_Requirement(res_int_or_mem, 0);
00315   Resource_Requirement(res_memory, 0);
00316   Load_Access_Time(9);
00317 
00319   //
00320   // Instructions belonging to the FLDP functional unit class:
00321   // M-type instructions which can execute in any M unit.
00322   //
00324   Instruction_Group("FLDP",
00325                     TOP_ldfp8,
00326                     TOP_ldfp8_i,
00327                     TOP_ldfpd,
00328                     TOP_ldfpd_i,
00329                     TOP_ldfps,
00330                     TOP_ldfps_i,
00331                     TOP_UNDEFINED);
00332   Any_Operand_Access_Time(0);
00333   Any_Result_Available_Time(9);         // +2 to dependent SFxxx
00334   Resource_Requirement(res_issue, 0);
00335   Resource_Requirement(res_int_or_mem, 0);
00336   Resource_Requirement(res_memory, 0);
00337   Load_Access_Time(9);
00338 
00340   //
00341   // Instructions belonging to the FMAC functional unit class:
00342   // F-type instructions which can execute in any F unit.
00343   //
00345   Instruction_Group("FMAC",
00346                     TOP_fma,
00347                     TOP_fma_s,
00348                     TOP_fma_d,
00349                     TOP_fms,
00350                     TOP_fms_s,
00351                     TOP_fms_d,
00352                     TOP_fnma,
00353                     TOP_fnma_s,
00354                     TOP_fnma_d,
00355                     TOP_fcvt_xuf,       // pseudo of fma
00356                     TOP_fcvt_xuf_d,     // pseudo of fma_d
00357                     TOP_fcvt_xuf_s,     // pseudo of fma_s
00358                     TOP_fadd,           // pseudo of fma
00359                     TOP_fadd_d,         // pseudo of fma_d
00360                     TOP_fadd_s,         // pseudo of fma_s
00361                     TOP_fmpy,           // pseudo of fma
00362                     TOP_fmpy_d,         // pseudo of fma_d
00363                     TOP_fmpy_s,         // pseudo of fma_s
00364                     TOP_fnmpy,          // pseudo of fnma
00365                     TOP_fnmpy_d,        // pseudo of fnma_d
00366                     TOP_fnmpy_s,        // pseudo of fnma_s
00367                     TOP_fnorm,          // pseudo of fma
00368                     TOP_fnorm_d,        // pseudo of fma_d
00369                     TOP_fnorm_s,        // pseudo of fma_s
00370                     TOP_fsub,           // pseudo of fms
00371                     TOP_fsub_d,         // pseudo of fms_d
00372                     TOP_fsub_s,         // pseudo of fms_s
00373                     TOP_UNDEFINED);
00374   Any_Operand_Access_Time(0);
00375   Any_Result_Available_Time(5);         // +2 to dependent FMISC, FCVTFX, XMA
00376                                         // +2 to dependent SFxxx
00377   Resource_Requirement(res_issue, 0);
00378   Resource_Requirement(res_float, 0);
00379 
00381   //
00382   // Instructions belonging to the FMISC functional unit class:
00383   // F-type instructions which can only execute in F0.
00384   //
00386   Instruction_Group("FMISC",
00387                     TOP_famax,
00388                     TOP_famin,
00389                     TOP_fand,
00390                     TOP_fandcm,
00391                     TOP_fmax,
00392                     TOP_fmerge_ns,
00393                     TOP_fmerge_s,
00394                     TOP_fmerge_se,
00395                     TOP_fmin,
00396                     TOP_fmix_l,
00397                     TOP_fmix_lr,
00398                     TOP_fmix_r,
00399                     TOP_for,
00400                     TOP_fpack,
00401                     TOP_frcpa,
00402                     TOP_frsqrta,
00403                     TOP_fselect,
00404                     TOP_fswap,
00405                     TOP_fswap_nl,
00406                     TOP_fswap_nr,
00407                     TOP_fsxt_l,
00408                     TOP_fsxt_r,
00409                     TOP_fxor,
00410                     TOP_fabs,           // pseudo of fmerge_s
00411                     TOP_fnegabs,        // pseudo of fmerge_ns
00412                     TOP_fneg,           // pseudo of fmerge_ns
00413                     TOP_mov_f,          // pseudo of fmerge_s
00414                     TOP_UNDEFINED);
00415   Any_Operand_Access_Time(0);
00416   Any_Result_Available_Time(5);         // +2 to dependent SFxxx
00417   Resource_Requirement(res_issue, 0);
00418   Resource_Requirement(res_float, 0);
00419   Resource_Requirement(res_F0, 0);      // can only execute in F0
00420 
00422   //
00423   // Instructions belonging to the FOTHER functional unit class:
00424   // F-type instructions which can execute in any F unit.
00425   //
00427   Instruction_Group("FOTHER",
00428                     TOP_fchkf,
00429                     TOP_fclrf,
00430                     TOP_fsetc,
00431                     TOP_UNDEFINED);
00432   Any_Operand_Access_Time(0);
00433   Resource_Requirement(res_issue, 0);
00434   Resource_Requirement(res_float, 0);
00435 
00437   //
00438   // Instructions belonging to the FRAR_I functional unit class:
00439   // I-type instructions which can only execute in I0.
00440   //
00442   Instruction_Group("FRAR_I",
00443                     TOP_mov_f_ar_i,
00444                     TOP_UNDEFINED);
00445   Any_Operand_Access_Time(0);
00446   Any_Result_Available_Time(1);         // depends on src register
00447                                         // +1 to dependent MMMUL, MMSHF, MMALU
00448   Resource_Requirement(res_issue, 0);
00449   Resource_Requirement(res_int_or_mem, 0);
00450   Resource_Requirement(res_integer, 0);
00451   Resource_Requirement(res_I0, 0);      // can only execute in I0
00452 
00454   //
00455   // Instructions belonging to the FRAR_M functional unit class:
00456   // M-type instructions which can only execute in M0.
00457   //
00459   Instruction_Group("FRAR_M",
00460                     TOP_mov_f_ar_m,
00461                     TOP_UNDEFINED);
00462   Any_Operand_Access_Time(0);
00463   Any_Result_Available_Time(1);         // depends on src register
00464                                         // +1 to dependent MMMUL, MMSHF, MMALU
00465   Resource_Requirement(res_issue, 0);
00466   Resource_Requirement(res_int_or_mem, 0);
00467   Resource_Requirement(res_memory, 0);
00468   Resource_Requirement(res_M0, 0);
00469 
00471   //
00472   // Instructions belonging to the FRBR functional unit class:
00473   // I-type instructions which can only execute in I0.
00474   //
00476   Instruction_Group("FRBR",
00477                     TOP_mov_f_br,
00478                     TOP_UNDEFINED);
00479   Any_Operand_Access_Time(0);
00480   Any_Result_Available_Time(2);         // +1 to dependent MMMUL, MMSHF, MMALU
00481   Resource_Requirement(res_issue, 0);
00482   Resource_Requirement(res_int_or_mem, 0);
00483   Resource_Requirement(res_integer, 0);
00484   Resource_Requirement(res_I0, 0);      // can only execute in I0
00485 
00487   //
00488   // Instructions belonging to the FRCR functional unit class:
00489   // M-type instructions which can only execute in M0.
00490   //
00492   Instruction_Group("FRCR",
00493                     TOP_mov_f_cr,
00494                     TOP_UNDEFINED);
00495   Any_Operand_Access_Time(0);
00496   Any_Result_Available_Time(1);         // depends on src register
00497                                         // +1 to dependent MMMUL, MMSHF, MMALU
00498   Resource_Requirement(res_issue, 0);
00499   Resource_Requirement(res_int_or_mem, 0);
00500   Resource_Requirement(res_memory, 0);
00501   Resource_Requirement(res_M0, 0);      // can only execute in M0
00502 
00504   //
00505   // Instructions belonging to the FRFR functional unit class:
00506   // M-type instructions which can execute in any M unit.
00507   //
00509   Instruction_Group("FRFR",
00510                     TOP_getf_sig,
00511                     TOP_getf_exp,
00512                     TOP_getf_s,
00513                     TOP_getf_d,
00514                     TOP_UNDEFINED);
00515   Any_Operand_Access_Time(0);
00516   Any_Result_Available_Time(2);
00517   Resource_Requirement(res_issue, 0);
00518   Resource_Requirement(res_int_or_mem, 0);
00519   Resource_Requirement(res_memory, 0);
00520 
00522   //
00523   // Instructions belonging to the FRIP functional unit class:
00524   // I-type instructions which can only execute in I0.
00525   //
00527   Instruction_Group("FRIP",
00528                     TOP_mov_f_ip,
00529                     TOP_UNDEFINED);
00530   Any_Operand_Access_Time(0);
00531   Any_Result_Available_Time(2);         // +1 to dependent MMMUL, MMSHF, MMALU
00532   Resource_Requirement(res_issue, 0);
00533   Resource_Requirement(res_int_or_mem, 0);
00534   Resource_Requirement(res_integer, 0);
00535   Resource_Requirement(res_I0, 0);      // can only execute in I0
00536 
00538   //
00539   // Instructions belonging to the FRPR functional unit class:
00540   // I-type instructions which can only execute in I0.
00541   //
00543   Instruction_Group("FRPR",
00544                     TOP_mov_f_pr,
00545                     TOP_UNDEFINED);
00546   Any_Operand_Access_Time(0);
00547   Any_Result_Available_Time(2);
00548   Resource_Requirement(res_issue, 0);
00549   Resource_Requirement(res_int_or_mem, 0);
00550   Resource_Requirement(res_integer, 0);
00551   Resource_Requirement(res_I0, 0);      // can only execute in I0
00552 
00554   //
00555   // Instructions belonging to the IALU functional unit class:
00556   // A-type instructions which can execute in any I or M unit.
00557   //
00559   Instruction_Group("IALU",
00560                     TOP_add,
00561                     TOP_add_1,
00562                     TOP_addl,
00563                     TOP_adds,
00564                     TOP_shladd,
00565                     TOP_sub,
00566                     TOP_sub_i,
00567                     TOP_sub_1,
00568                     TOP_mov_i,          // pseudo of addl
00569                     TOP_mov,            // pseudo of adds
00570                     TOP_UNDEFINED);
00571   Any_Operand_Access_Time(0);
00572   Any_Result_Available_Time(1);         // +1 to dependent LD/ST base reg
00573                                         // (I-slot insts only)
00574                                         // +2 to dependent MMMUL, MMSHF, MMALU
00575   Resource_Requirement(res_issue, 0);
00576   Resource_Requirement(res_int_or_mem, 0);
00577 
00579   //
00580   // Instructions belonging to the ICMP functional unit class:
00581   // A-type instructions which can execute in any I or M unit.
00582   //
00584   Instruction_Group("ICMP",
00585                     TOP_cmp_eq,
00586                     TOP_cmp_eq_and,
00587                     TOP_cmp_eq_and_orcm,
00588                     TOP_cmp_eq_andcm,
00589                     TOP_cmp_eq_or,
00590                     TOP_cmp_eq_or_andcm,
00591                     TOP_cmp_eq_orcm,
00592                     TOP_cmp_eq_unc,
00593                     TOP_cmp_ge,
00594                     TOP_cmp_ge_and,
00595                     TOP_cmp_ge_and_orcm,
00596                     TOP_cmp_ge_andcm,
00597                     TOP_cmp_ge_or,
00598                     TOP_cmp_ge_or_andcm,
00599                     TOP_cmp_ge_orcm,
00600                     TOP_cmp_ge_unc,
00601                     TOP_cmp_geu,
00602                     TOP_cmp_geu_unc,
00603                     TOP_cmp_gt,
00604                     TOP_cmp_gt_and,
00605                     TOP_cmp_gt_and_orcm,
00606                     TOP_cmp_gt_andcm,
00607                     TOP_cmp_gt_or,
00608                     TOP_cmp_gt_or_andcm,
00609                     TOP_cmp_gt_orcm,
00610                     TOP_cmp_gt_unc,
00611                     TOP_cmp_gtu,
00612                     TOP_cmp_gtu_unc,
00613                     TOP_cmp_i_eq,
00614                     TOP_cmp_i_eq_and,
00615                     TOP_cmp_i_eq_and_orcm,
00616                     TOP_cmp_i_eq_andcm,
00617                     TOP_cmp_i_eq_or,
00618                     TOP_cmp_i_eq_or_andcm,
00619                     TOP_cmp_i_eq_orcm,
00620                     TOP_cmp_i_eq_unc,
00621                     TOP_cmp_i_ge,
00622                     TOP_cmp_i_ge_unc,
00623                     TOP_cmp_i_geu,
00624                     TOP_cmp_i_geu_unc,
00625                     TOP_cmp_i_gt,
00626                     TOP_cmp_i_gt_unc,
00627                     TOP_cmp_i_gtu,
00628                     TOP_cmp_i_gtu_unc,
00629                     TOP_cmp_i_le,
00630                     TOP_cmp_i_le_unc,
00631                     TOP_cmp_i_leu,
00632                     TOP_cmp_i_leu_unc,
00633                     TOP_cmp_i_lt,
00634                     TOP_cmp_i_lt_unc,
00635                     TOP_cmp_i_ltu,
00636                     TOP_cmp_i_ltu_unc,
00637                     TOP_cmp_i_ne,
00638                     TOP_cmp_i_ne_and,
00639                     TOP_cmp_i_ne_and_orcm,
00640                     TOP_cmp_i_ne_andcm,
00641                     TOP_cmp_i_ne_or,
00642                     TOP_cmp_i_ne_or_andcm,
00643                     TOP_cmp_i_ne_orcm,
00644                     TOP_cmp_i_ne_unc,
00645                     TOP_cmp_le,
00646                     TOP_cmp_le_and,
00647                     TOP_cmp_le_and_orcm,
00648                     TOP_cmp_le_andcm,
00649                     TOP_cmp_le_or,
00650                     TOP_cmp_le_or_andcm,
00651                     TOP_cmp_le_orcm,
00652                     TOP_cmp_le_unc,
00653                     TOP_cmp_leu,
00654                     TOP_cmp_leu_unc,
00655                     TOP_cmp_lt,
00656                     TOP_cmp_lt_and,
00657                     TOP_cmp_lt_and_orcm,
00658                     TOP_cmp_lt_andcm,
00659                     TOP_cmp_lt_or,
00660                     TOP_cmp_lt_or_andcm,
00661                     TOP_cmp_lt_orcm,
00662                     TOP_cmp_lt_unc,
00663                     TOP_cmp_ltu,
00664                     TOP_cmp_ltu_unc,
00665                     TOP_cmp_ne,
00666                     TOP_cmp_ne_and,
00667                     TOP_cmp_ne_and_orcm,
00668                     TOP_cmp_ne_andcm,
00669                     TOP_cmp_ne_or,
00670                     TOP_cmp_ne_or_andcm,
00671                     TOP_cmp_ne_orcm,
00672                     TOP_cmp_ne_unc,
00673                     TOP_cmp_z1_ge_and,
00674                     TOP_cmp_z1_ge_and_orcm,
00675                     TOP_cmp_z1_ge_andcm,
00676                     TOP_cmp_z1_ge_or,
00677                     TOP_cmp_z1_ge_or_andcm,
00678                     TOP_cmp_z1_ge_orcm,
00679                     TOP_cmp_z1_gt_and,
00680                     TOP_cmp_z1_gt_and_orcm,
00681                     TOP_cmp_z1_gt_andcm,
00682                     TOP_cmp_z1_gt_or,
00683                     TOP_cmp_z1_gt_or_andcm,
00684                     TOP_cmp_z1_gt_orcm,
00685                     TOP_cmp_z1_le_and,
00686                     TOP_cmp_z1_le_and_orcm,
00687                     TOP_cmp_z1_le_andcm,
00688                     TOP_cmp_z1_le_or,
00689                     TOP_cmp_z1_le_or_andcm,
00690                     TOP_cmp_z1_le_orcm,
00691                     TOP_cmp_z1_lt_and,
00692                     TOP_cmp_z1_lt_and_orcm,
00693                     TOP_cmp_z1_lt_andcm,
00694                     TOP_cmp_z1_lt_or,
00695                     TOP_cmp_z1_lt_or_andcm,
00696                     TOP_cmp_z1_lt_orcm,
00697                     TOP_cmp_z2_ge_and,
00698                     TOP_cmp_z2_ge_and_orcm,
00699                     TOP_cmp_z2_ge_andcm,
00700                     TOP_cmp_z2_ge_or,
00701                     TOP_cmp_z2_ge_or_andcm,
00702                     TOP_cmp_z2_ge_orcm,
00703                     TOP_cmp_z2_gt_and,
00704                     TOP_cmp_z2_gt_and_orcm,
00705                     TOP_cmp_z2_gt_andcm,
00706                     TOP_cmp_z2_gt_or,
00707                     TOP_cmp_z2_gt_or_andcm,
00708                     TOP_cmp_z2_gt_orcm,
00709                     TOP_cmp_z2_le_and,
00710                     TOP_cmp_z2_le_and_orcm,
00711                     TOP_cmp_z2_le_andcm,
00712                     TOP_cmp_z2_le_or,
00713                     TOP_cmp_z2_le_or_andcm,
00714                     TOP_cmp_z2_le_orcm,
00715                     TOP_cmp_z2_lt_and,
00716                     TOP_cmp_z2_lt_and_orcm,
00717                     TOP_cmp_z2_lt_andcm,
00718                     TOP_cmp_z2_lt_or,
00719                     TOP_cmp_z2_lt_or_andcm,
00720                     TOP_cmp_z2_lt_orcm,
00721                     TOP_cmp4_eq,
00722                     TOP_cmp4_eq_and,
00723                     TOP_cmp4_eq_and_orcm,
00724                     TOP_cmp4_eq_andcm,
00725                     TOP_cmp4_eq_or,
00726                     TOP_cmp4_eq_or_andcm,
00727                     TOP_cmp4_eq_orcm,
00728                     TOP_cmp4_eq_unc,
00729                     TOP_cmp4_ge,
00730                     TOP_cmp4_ge_and,
00731                     TOP_cmp4_ge_and_orcm,
00732                     TOP_cmp4_ge_andcm,
00733                     TOP_cmp4_ge_or,
00734                     TOP_cmp4_ge_or_andcm,
00735                     TOP_cmp4_ge_orcm,
00736                     TOP_cmp4_ge_unc,
00737                     TOP_cmp4_geu,
00738                     TOP_cmp4_geu_unc,
00739                     TOP_cmp4_gt,
00740                     TOP_cmp4_gt_and,
00741                     TOP_cmp4_gt_and_orcm,
00742                     TOP_cmp4_gt_andcm,
00743                     TOP_cmp4_gt_or,
00744                     TOP_cmp4_gt_or_andcm,
00745                     TOP_cmp4_gt_orcm,
00746                     TOP_cmp4_gt_unc,
00747                     TOP_cmp4_gtu,
00748                     TOP_cmp4_gtu_unc,
00749                     TOP_cmp4_i_eq,
00750                     TOP_cmp4_i_eq_and,
00751                     TOP_cmp4_i_eq_and_orcm,
00752                     TOP_cmp4_i_eq_andcm,
00753                     TOP_cmp4_i_eq_or,
00754                     TOP_cmp4_i_eq_or_andcm,
00755                     TOP_cmp4_i_eq_orcm,
00756                     TOP_cmp4_i_eq_unc,
00757                     TOP_cmp4_i_ge,
00758                     TOP_cmp4_i_ge_unc,
00759                     TOP_cmp4_i_geu,
00760                     TOP_cmp4_i_geu_unc,
00761                     TOP_cmp4_i_gt,
00762                     TOP_cmp4_i_gt_unc,
00763                     TOP_cmp4_i_gtu,
00764                     TOP_cmp4_i_gtu_unc,
00765                     TOP_cmp4_i_le,
00766                     TOP_cmp4_i_le_unc,
00767                     TOP_cmp4_i_leu,
00768                     TOP_cmp4_i_leu_unc,
00769                     TOP_cmp4_i_lt,
00770                     TOP_cmp4_i_lt_unc,
00771                     TOP_cmp4_i_ltu,
00772                     TOP_cmp4_i_ltu_unc,
00773                     TOP_cmp4_i_ne,
00774                     TOP_cmp4_i_ne_and,
00775                     TOP_cmp4_i_ne_and_orcm,
00776                     TOP_cmp4_i_ne_andcm,
00777                     TOP_cmp4_i_ne_or,
00778                     TOP_cmp4_i_ne_or_andcm,
00779                     TOP_cmp4_i_ne_orcm,
00780                     TOP_cmp4_i_ne_unc,
00781                     TOP_cmp4_le,
00782                     TOP_cmp4_le_and,
00783                     TOP_cmp4_le_and_orcm,
00784                     TOP_cmp4_le_andcm,
00785                     TOP_cmp4_le_or,
00786                     TOP_cmp4_le_or_andcm,
00787                     TOP_cmp4_le_orcm,
00788                     TOP_cmp4_le_unc,
00789                     TOP_cmp4_leu,
00790                     TOP_cmp4_leu_unc,
00791                     TOP_cmp4_lt,
00792                     TOP_cmp4_lt_and,
00793                     TOP_cmp4_lt_and_orcm,
00794                     TOP_cmp4_lt_andcm,
00795                     TOP_cmp4_lt_or,
00796                     TOP_cmp4_lt_or_andcm,
00797                     TOP_cmp4_lt_orcm,
00798                     TOP_cmp4_lt_unc,
00799                     TOP_cmp4_ltu,
00800                     TOP_cmp4_ltu_unc,
00801                     TOP_cmp4_ne,
00802                     TOP_cmp4_ne_and,
00803                     TOP_cmp4_ne_and_orcm,
00804                     TOP_cmp4_ne_andcm,
00805                     TOP_cmp4_ne_or,
00806                     TOP_cmp4_ne_or_andcm,
00807                     TOP_cmp4_ne_orcm,
00808                     TOP_cmp4_ne_unc,
00809                     TOP_cmp4_z1_ge_and,
00810                     TOP_cmp4_z1_ge_and_orcm,
00811                     TOP_cmp4_z1_ge_andcm,
00812                     TOP_cmp4_z1_ge_or,
00813                     TOP_cmp4_z1_ge_or_andcm,
00814                     TOP_cmp4_z1_ge_orcm,
00815                     TOP_cmp4_z1_gt_and,
00816                     TOP_cmp4_z1_gt_and_orcm,
00817                     TOP_cmp4_z1_gt_andcm,
00818                     TOP_cmp4_z1_gt_or,
00819                     TOP_cmp4_z1_gt_or_andcm,
00820                     TOP_cmp4_z1_gt_orcm,
00821                     TOP_cmp4_z1_le_and,
00822                     TOP_cmp4_z1_le_and_orcm,
00823                     TOP_cmp4_z1_le_andcm,
00824                     TOP_cmp4_z1_le_or,
00825                     TOP_cmp4_z1_le_or_andcm,
00826                     TOP_cmp4_z1_le_orcm,
00827                     TOP_cmp4_z1_lt_and,
00828                     TOP_cmp4_z1_lt_and_orcm,
00829                     TOP_cmp4_z1_lt_andcm,
00830                     TOP_cmp4_z1_lt_or,
00831                     TOP_cmp4_z1_lt_or_andcm,
00832                     TOP_cmp4_z1_lt_orcm,
00833                     TOP_cmp4_z2_ge_and,
00834                     TOP_cmp4_z2_ge_and_orcm,
00835                     TOP_cmp4_z2_ge_andcm,
00836                     TOP_cmp4_z2_ge_or,
00837                     TOP_cmp4_z2_ge_or_andcm,
00838                     TOP_cmp4_z2_ge_orcm,
00839                     TOP_cmp4_z2_gt_and,
00840                     TOP_cmp4_z2_gt_and_orcm,
00841                     TOP_cmp4_z2_gt_andcm,
00842                     TOP_cmp4_z2_gt_or,
00843                     TOP_cmp4_z2_gt_or_andcm,
00844                     TOP_cmp4_z2_gt_orcm,
00845                     TOP_cmp4_z2_le_and,
00846                     TOP_cmp4_z2_le_and_orcm,
00847                     TOP_cmp4_z2_le_andcm,
00848                     TOP_cmp4_z2_le_or,
00849                     TOP_cmp4_z2_le_or_andcm,
00850                     TOP_cmp4_z2_le_orcm,
00851                     TOP_cmp4_z2_lt_and,
00852                     TOP_cmp4_z2_lt_and_orcm,
00853                     TOP_cmp4_z2_lt_andcm,
00854                     TOP_cmp4_z2_lt_or,
00855                     TOP_cmp4_z2_lt_or_andcm,
00856                     TOP_cmp4_z2_lt_orcm,
00857                     TOP_UNDEFINED);
00858   Any_Operand_Access_Time(0);
00859   Any_Result_Available_Time(1);         // 0 to dependent BR
00860   Resource_Requirement(res_issue, 0);
00861   Resource_Requirement(res_int_or_mem, 0);
00862 
00864   //
00865   // Instructions belonging to the ILOG functional unit class:
00866   // A-type instructions which can execute in any I or M unit.
00867   //
00869   Instruction_Group("ILOG",
00870                     TOP_and,
00871                     TOP_and_i,
00872                     TOP_andcm,
00873                     TOP_andcm_i,
00874                     TOP_or,
00875                     TOP_or_i,
00876                     TOP_xor,
00877                     TOP_xor_i,
00878                     TOP_UNDEFINED);
00879   Any_Operand_Access_Time(0);
00880   Any_Result_Available_Time(1);         // +1 to dependent LD/ST base reg
00881                                         // +2 to dependent MMMUL, MMSHF, MMALU
00882   Resource_Requirement(res_issue, 0);
00883   Resource_Requirement(res_int_or_mem, 0);
00884 
00886   //
00887   // Instructions belonging to the ISHF functional unit class:
00888   // I-type instructions which can only execute in I0.
00889   //
00891   Instruction_Group("ISHF",
00892                     TOP_dep,
00893                     TOP_dep_i,
00894                     TOP_dep_i_z,
00895                     TOP_dep_z,
00896                     TOP_extr,
00897                     TOP_extr_u,
00898                     TOP_shrp,
00899                     TOP_shl_i,          // pseudo of dep_z
00900                     TOP_shr_i,          // pseudo of extr
00901                     TOP_shr_i_u,        // pseudo of extr_u
00902                     TOP_UNDEFINED);
00903   Any_Operand_Access_Time(0);
00904   Any_Result_Available_Time(1);
00905   Resource_Requirement(res_issue, 0);
00906   Resource_Requirement(res_int_or_mem, 0);
00907   Resource_Requirement(res_integer, 0);
00908   Resource_Requirement(res_I0, 0);      // can only execute in I0
00909 
00911   //
00912   // Instructions belonging to the LD functional unit class:
00913   // M-type instructions which can execute in any M unit.
00914   //
00916   Instruction_Group("LD",
00917                     TOP_ld1,
00918                     TOP_ld1_i,
00919                     TOP_ld1_r,
00920                     TOP_ld2,
00921                     TOP_ld2_i,
00922                     TOP_ld2_r,
00923                     TOP_ld4,
00924                     TOP_ld4_i,
00925                     TOP_ld4_r,
00926                     TOP_ld8,
00927                     TOP_ld8_i,
00928                     TOP_ld8_r,
00929                     TOP_ld8_fill,
00930                     TOP_ld8_i_fill,
00931                     TOP_ld8_r_fill,
00932                     TOP_UNDEFINED);
00933   Any_Operand_Access_Time(0);
00934   Any_Result_Available_Time(2);         // +1 to dependent LD/ST base reg
00935                                         // +1 to dependent MM operation
00936   Resource_Requirement(res_issue, 0);
00937   Resource_Requirement(res_int_or_mem, 0);
00938   Resource_Requirement(res_memory, 0);
00939   Load_Access_Time(2);
00940 
00942   //
00943   // Instructions belonging to the LFETCH functional unit class:
00944   // M-type instructions which can execute in any M unit.
00945   //
00947   Instruction_Group("LFETCH",
00948                     TOP_lfetch,
00949                     TOP_lfetch_excl,
00950                     TOP_lfetch_fault,
00951                     TOP_lfetch_fault_excl,
00952                     TOP_lfetch_i,
00953                     TOP_lfetch_i_excl,
00954                     TOP_lfetch_i_fault,
00955                     TOP_lfetch_i_fault_excl,
00956                     TOP_lfetch_r,
00957                     TOP_lfetch_r_excl,
00958                     TOP_lfetch_r_fault,
00959                     TOP_lfetch_r_fault_excl,
00960                     TOP_UNDEFINED);
00961   Any_Operand_Access_Time(0);
00962   Resource_Requirement(res_issue, 0);
00963   Resource_Requirement(res_int_or_mem, 0);
00964   Resource_Requirement(res_memory, 0);
00965   Load_Access_Time(6);                  // assume L2 latency
00966 
00968   //
00969   // Instructions belonging to the LONG_I functional unit class:
00970   // L-type instructions which can execute in any I unit.
00971   //
00973   Instruction_Group("LONG_I",
00974                     TOP_movl,
00975                     TOP_UNDEFINED);
00976   Any_Operand_Access_Time(0);
00977   Any_Result_Available_Time(1);
00978   Resource_Requirement(res_issue, 0);
00979   Resource_Requirement(res_int_or_mem, 0);
00980   Resource_Requirement(res_integer, 0);
00981 
00983   //
00984   // Instructions belonging to the MMALU_A functional unit class:
00985   // A-type instructions which can execute in any I or M unit.
00986   //
00988   Instruction_Group("MMALU_A",
00989                     TOP_padd1,
00990                     TOP_padd2,
00991                     TOP_padd1_sss,
00992                     TOP_padd2_sss,
00993                     TOP_padd1_uuu,
00994                     TOP_padd2_uuu,
00995                     TOP_padd1_uus,
00996                     TOP_padd2_uus,
00997                     TOP_padd4,
00998                     TOP_pavg1,
00999                     TOP_pavg1_raz,
01000                     TOP_pavg2,
01001                     TOP_pavg2_raz,
01002                     TOP_pavgsub1,
01003                     TOP_pavgsub2,
01004                     TOP_pcmp1_eq,
01005                     TOP_pcmp2_eq,
01006                     TOP_pcmp4_eq,
01007                     TOP_pcmp1_gt,
01008                     TOP_pcmp2_gt,
01009                     TOP_pcmp4_gt,
01010                     TOP_pshladd2,
01011                     TOP_pshradd2,
01012                     TOP_psub1,
01013                     TOP_psub2,
01014                     TOP_psub1_sss,
01015                     TOP_psub2_sss,
01016                     TOP_psub1_uuu,
01017                     TOP_psub2_uuu,
01018                     TOP_psub1_uus,
01019                     TOP_psub2_uus,
01020                     TOP_psub4,
01021                     TOP_UNDEFINED);
01022   Any_Operand_Access_Time(0);
01023   Any_Result_Available_Time(2);         // +4 (or +10) to dependent IALU,
01024                                         // ILOG, ISHF, ST, LD
01025   Resource_Requirement(res_issue, 0);
01026   Resource_Requirement(res_int_or_mem, 0);
01027 
01029   //
01030   // Instructions belonging to the MMALU_I functional unit class:
01031   // I-type instructions which can execute in any I unit.
01032   //
01034   Instruction_Group("MMALU_I",
01035                     TOP_pmax1_u,
01036                     TOP_pmax2,
01037                     TOP_pmin1_u,
01038                     TOP_pmin2,
01039                     TOP_psad1,
01040                     TOP_UNDEFINED);
01041   Any_Operand_Access_Time(0);
01042   Any_Result_Available_Time(2);         // +4 (or +10) to dependent IALU,
01043                                         // ILOG, ISHF, ST, LD
01044   Resource_Requirement(res_issue, 0);
01045   Resource_Requirement(res_int_or_mem, 0);
01046   Resource_Requirement(res_integer, 0);
01047 
01049   //
01050   // Instructions belonging to the MMMUL functional unit class:
01051   // I-type instructions which can only execute in I0.
01052   //
01054   Instruction_Group("MMMUL",
01055                     TOP_pmpy2_l,
01056                     TOP_pmpy2_r,
01057                     TOP_pmpyshr2,
01058                     TOP_pmpyshr2_u,
01059                     TOP_popcnt,
01060                     TOP_UNDEFINED);
01061   Any_Operand_Access_Time(0);
01062   Any_Result_Available_Time(2);         // +4 (or +10) to dependent IALU,
01063                                         // ILOG, ISHF, ST, LD
01064   Resource_Requirement(res_issue, 0);
01065   Resource_Requirement(res_int_or_mem, 0);
01066   Resource_Requirement(res_integer, 0);
01067   Resource_Requirement(res_I0, 0);      // can only execute in I0
01068 
01070   //
01071   // Instructions belonging to the MMSHF functional unit class:
01072   // I-type instructions which can execute in any I unit.
01073   //
01075   Instruction_Group("MMSHF",
01076                     TOP_mix1_l,
01077                     TOP_mix1_r,
01078                     TOP_mix2_l,
01079                     TOP_mix2_r,
01080                     TOP_mix4_l,
01081                     TOP_mix4_r,
01082                     TOP_mux1,
01083                     TOP_mux2,
01084                     TOP_pack2_sss,
01085                     TOP_pack2_uss,
01086                     TOP_pack4_sss,
01087                     TOP_pshl2,
01088                     TOP_pshl2_i,
01089                     TOP_pshl4,
01090                     TOP_pshl4_i,
01091                     TOP_pshr2,
01092                     TOP_pshr2_u,
01093                     TOP_pshr2_i,
01094                     TOP_pshr2_i_u,
01095                     TOP_pshr4,
01096                     TOP_pshr4_u,
01097                     TOP_pshr4_i,
01098                     TOP_pshr4_i_u,
01099                     TOP_shl,
01100                     TOP_shr,
01101                     TOP_shr_u,
01102                     TOP_unpack1_h,
01103                     TOP_unpack1_l,
01104                     TOP_unpack2_h,
01105                     TOP_unpack2_l,
01106                     TOP_unpack4_h,
01107                     TOP_unpack4_l,
01108                     TOP_UNDEFINED);
01109   Any_Operand_Access_Time(0);
01110   Any_Result_Available_Time(2);         // +4 (or +10) to dependent IALU,
01111                                         // ILOG, ISHF, ST, LD
01112   Resource_Requirement(res_issue, 0);
01113   Resource_Requirement(res_int_or_mem, 0);
01114   Resource_Requirement(res_integer, 0);
01115 
01117   //
01118   // Instructions belonging to the NOP_B functional unit class:
01119   // B-type instructions which can execute in any B unit.
01120   //
01122   Instruction_Group("NOP_B",
01123                     TOP_break_b,
01124                     TOP_nop_b,
01125                     TOP_UNDEFINED);
01126   Resource_Requirement(res_issue, 0);
01127   Resource_Requirement(res_branch, 0);
01128 
01130   //
01131   // Instructions belonging to the NOP_I functional unit class:
01132   // I-type instructions which can execute in any I unit.
01133   //
01135   Instruction_Group("NOP_I",
01136                     TOP_break_i,
01137                     TOP_nop_i,
01138                     TOP_UNDEFINED);
01139   Resource_Requirement(res_issue, 0);
01140   Resource_Requirement(res_int_or_mem, 0);
01141   Resource_Requirement(res_integer, 0);
01142 
01144   //
01145   // Instructions belonging to the NOP_M functional unit class:
01146   // M-type instructions which can execute in any M unit.
01147   //
01149   Instruction_Group("NOP_M",
01150                     TOP_break_m,
01151                     TOP_nop_m,
01152                     TOP_UNDEFINED);
01153   Resource_Requirement(res_issue, 0);
01154   Resource_Requirement(res_int_or_mem, 0);
01155   Resource_Requirement(res_memory, 0);
01156 
01158   //
01159   // Instructions belonging to the NOP_F functional unit class:
01160   // F-type instructions which can execute in any F unit.
01161   //
01163   Instruction_Group("NOP_F",
01164                     TOP_break_f,
01165                     TOP_nop_f,
01166                     TOP_UNDEFINED);
01167   Resource_Requirement(res_issue, 0);
01168   Resource_Requirement(res_float, 0);
01169 
01171   //
01172   // Instructions belonging to the NOP_X functional unit class:
01173   // X-type instructions which can execute in any I unit.
01174   //
01176   Instruction_Group("NOP_X",
01177                     TOP_break_x,
01178                     TOP_nop_x,
01179                     TOP_UNDEFINED);
01180   Resource_Requirement(res_issue, 0);
01181   Resource_Requirement(res_int_or_mem, 0);
01182   Resource_Requirement(res_integer, 0);
01183 
01185   //
01186   // Instructions belonging to the PNT functional unit class:
01187   // A-type instructions which can execute in any I or M unit.
01188   //
01190   Instruction_Group("PNT",
01191                     TOP_addp4,
01192                     TOP_addp4_i,
01193                     TOP_shladdp4,
01194                     TOP_UNDEFINED);
01195   Any_Operand_Access_Time(0);
01196   Any_Result_Available_Time(1);
01197   Resource_Requirement(res_issue, 0);
01198   Resource_Requirement(res_int_or_mem, 0);
01199 
01201   //
01202   // Instructions belonging to the RSE_B functional unit class:
01203   // B-type instructions which can execute in any B unit.
01204   //
01206   Instruction_Group("RSE_B",
01207                     TOP_clrrrb,
01208                     TOP_clrrrb_pr,
01209                     TOP_cover,
01210                     TOP_UNDEFINED);
01211   Resource_Requirement(res_issue, 0);
01212   Resource_Requirement(res_branch, 0);
01213 
01215   //
01216   // Instructions belonging to the RSE_M functional unit class:
01217   // M-type instructions which can only execute in M0.
01218   //
01220   Instruction_Group("RSE_M",
01221                     TOP_flushrs,
01222                     TOP_loadrs,
01223                     TOP_UNDEFINED);
01224   Resource_Requirement(res_issue, 0);
01225   Resource_Requirement(res_int_or_mem, 0);
01226   Resource_Requirement(res_memory, 0);
01227   Resource_Requirement(res_M0, 0);      // can only execute in M0
01228 
01230   //
01231   // Instructions belonging to the SEM functional unit class:
01232   // M-type instructions which can only execute in M0.
01233   // These instructions are not pipelined and on Itanium (tm)
01234   // cause the pipeline to stall.
01235   //
01236   // NOTE: We don't model the pipeline stall here since that is
01237   // effectively handled by these being barriers. We do however
01238   // model that this inst is not pipelined.
01239   //
01240   // NOTE: The latency is spec-ed as the latency of L2, L3 or
01241   // memory + 5 clocks. We assume L2 latency here.
01242   //
01244   Instruction_Group("SEM",
01245                     TOP_cmpxchg1,
01246                     TOP_cmpxchg2,
01247                     TOP_cmpxchg4,
01248                     TOP_cmpxchg8,
01249                     TOP_fetchadd4,
01250                     TOP_fetchadd8,
01251                     TOP_xchg1,
01252                     TOP_xchg2,
01253                     TOP_xchg4,
01254                     TOP_xchg8,
01255                     TOP_UNDEFINED);
01256   {
01257     int i;
01258     const int L2 = 6;
01259     const int latency = L2 + 5;
01260     Any_Operand_Access_Time(0);
01261     Any_Result_Available_Time(latency);
01262     Resource_Requirement(res_issue, 0);
01263     Resource_Requirement(res_int_or_mem, 0);
01264     Resource_Requirement(res_memory, 0);
01265     Resource_Requirement(res_M0, 0);    // can only execute in M0
01266     for (i = 0; i < latency; ++i) Resource_Requirement(res_sem, i);
01267     Load_Access_Time(latency);
01268   }
01269 
01271   //
01272   // Instructions belonging to the SFCVTFX functional unit class:
01273   // F-type instructions which can execute in any F unit.
01274   //
01276   Instruction_Group("SFCVTFX",
01277                     TOP_fpcvt_fx,
01278                     TOP_fpcvt_fx_trunc,
01279                     TOP_fpcvt_fxu,
01280                     TOP_fpcvt_fxu_trunc,
01281                     TOP_UNDEFINED);
01282   Any_Operand_Access_Time(0);
01283   Any_Result_Available_Time(7);         // +2 to dependent Fxxx
01284   Resource_Requirement(res_issue, 0);
01285   Resource_Requirement(res_float, 0);
01286 
01288   //
01289   // Instructions belonging to the SFMAC functional unit class:
01290   // F-type instructions which can execute in any F unit.
01291   //
01293   Instruction_Group("SFMAC",
01294                     TOP_fpma,
01295                     TOP_fpms,
01296                     TOP_fpnma,
01297                     TOP_fpmpy,          // pseudo of fpma
01298                     TOP_fpnmpy,         // pseudo of fpnma
01299                     TOP_UNDEFINED);
01300   Any_Operand_Access_Time(0);
01301   Any_Result_Available_Time(5);         // +2 to dependent SFMISC
01302                                         // +2 to dependent Fxxx
01303   Resource_Requirement(res_issue, 0);
01304   Resource_Requirement(res_float, 0);
01305 
01307   //
01308   // Instructions belonging to the SFMERGESE functional unit class:
01309   // F-type instructions which can only execute in F0.
01310   //
01312   Instruction_Group("SFMERGESE",
01313                     TOP_fpmerge_se,
01314                     TOP_UNDEFINED);
01315   Any_Operand_Access_Time(0);
01316   Any_Result_Available_Time(7);         // +2 to dependent Fxxx
01317   Resource_Requirement(res_issue, 0);
01318   Resource_Requirement(res_float, 0);
01319   Resource_Requirement(res_F0, 0);      // can only execute in F0
01320 
01322   //
01323   // Instructions belonging to the SFMISC functional unit class:
01324   // F-type instructions which can only execute in F0.
01325   //
01327   Instruction_Group("SFMISC",
01328                     TOP_fpamax,
01329                     TOP_fpamin,
01330                     TOP_fpcmp_eq,
01331                     TOP_fpcmp_ge,
01332                     TOP_fpcmp_gt,
01333                     TOP_fpcmp_le,
01334                     TOP_fpcmp_lt,
01335                     TOP_fpcmp_neq,
01336                     TOP_fpcmp_nge,
01337                     TOP_fpcmp_ngt,
01338                     TOP_fpcmp_nle,
01339                     TOP_fpcmp_nlt,
01340                     TOP_fpcmp_ord,
01341                     TOP_fpcmp_unord,
01342                     TOP_fpmax,
01343                     TOP_fpmerge_ns,
01344                     TOP_fpmerge_s,
01345                     TOP_fpmin,
01346                     TOP_fprcpa,
01347                     TOP_fprsqrta,
01348                     TOP_fpneg,          // pseudo of fpmerge_ns
01349                     TOP_fpnegabs,       // pseudo of fpmrege_ns
01350                     TOP_fpabs,          // pseudo of fpmerge_s
01351                     TOP_UNDEFINED);
01352   Any_Operand_Access_Time(0);
01353   Any_Result_Available_Time(5);         // +2 to dependent Fxxx
01354   Resource_Requirement(res_issue, 0);
01355   Resource_Requirement(res_float, 0);
01356   Resource_Requirement(res_F0, 0);      // can only execute in F0
01357 
01359   //
01360   // Instructions belonging to the STF functional unit class:
01361   // M-type instructions which can execute any M unit.
01362   //
01364   Instruction_Group("STF",
01365                     TOP_stf8,
01366                     TOP_stf8_i,
01367                     TOP_stfd,
01368                     TOP_stfd_i,
01369                     TOP_stfe,
01370                     TOP_stfe_i,
01371                     TOP_stfs,
01372                     TOP_stfs_i,
01373                     TOP_stf_spill,
01374                     TOP_stf_i_spill,
01375                     TOP_UNDEFINED);
01376   Any_Operand_Access_Time(0);
01377   Resource_Requirement(res_issue, 0);
01378   Resource_Requirement(res_int_or_mem, 0);
01379   Resource_Requirement(res_memory, 0);
01380   Store_Available_Time(9);              // ??? not sure
01381 
01383   //
01384   // Instructions belonging to the ST functional unit class:
01385   // M-type instructions which can execute any M unit.
01386   //
01388   Instruction_Group("ST",
01389                     TOP_st1,
01390                     TOP_st1_i,
01391                     TOP_st2,
01392                     TOP_st2_i,
01393                     TOP_st4,
01394                     TOP_st4_i,
01395                     TOP_st8,
01396                     TOP_st8_i,
01397                     TOP_st8_spill,
01398                     TOP_st8_i_spill,
01399                     TOP_UNDEFINED);
01400   Any_Operand_Access_Time(0);
01401   Resource_Requirement(res_issue, 0);
01402   Resource_Requirement(res_int_or_mem, 0);
01403   Resource_Requirement(res_memory, 0);
01404   Store_Available_Time(2);              // ??? not sure
01405 
01407   //
01408   // Instructions belonging to the SYST_B2 functional unit class:
01409   // B-type instructions which can execute in B0 or B2.
01410   //
01412   Instruction_Group("SYST_B2",
01413                     TOP_bsw_0,
01414                     TOP_bsw_1,
01415                     TOP_rfi,
01416                     TOP_UNDEFINED);
01417   Resource_Requirement(res_issue, 0);
01418   Resource_Requirement(res_branch, 0);
01419   Resource_Requirement(res_B0_or_B2, 0); // can only execute in B0 or B2
01420 
01422   //
01423   // Instructions belonging to the SYST_B functional unit class:
01424   // B-type instructions which can execute in B0 or B1.
01425   //
01427   Instruction_Group("SYST_B",
01428                     TOP_epc,
01429                     TOP_UNDEFINED);
01430   Resource_Requirement(res_issue, 0);
01431   Resource_Requirement(res_branch, 0);
01432   Resource_Requirement(res_B0_or_B1, 0); // can only execute in B0 or B1
01433 
01435   //
01436   // Instructions belonging to the SYST_M0 functional unit class:
01437   // M-type instructions which can only execute in M0.
01438   //
01440   Instruction_Group("SYST_M0_0",
01441                     TOP_mf_a,
01442                     TOP_UNDEFINED);
01443   Any_Operand_Access_Time(0);
01444   Resource_Requirement(res_issue, 0);
01445   Resource_Requirement(res_int_or_mem, 0);
01446   Resource_Requirement(res_memory, 0);
01447   Resource_Requirement(res_M0, 0);      // can only execute in M0
01448 
01449   Instruction_Group("SYST_M0_1",
01450                     TOP_alloc,
01451                     TOP_alloc_3,
01452                     TOP_UNDEFINED);
01453   Any_Operand_Access_Time(0);
01454   Any_Result_Available_Time(1);
01455   Resource_Requirement(res_issue, 0);
01456   Resource_Requirement(res_int_or_mem, 0);
01457   Resource_Requirement(res_memory, 0);
01458   Resource_Requirement(res_M0, 0);      // can only execute in M0
01459 
01460   Instruction_Group("SYST_M0_2",
01461                     TOP_fc,
01462                     TOP_itc_d,
01463                     TOP_itc_i,
01464                     TOP_itr_d,
01465                     TOP_itr_i,
01466                     TOP_probe_i_r,
01467                     TOP_probe_i_w,
01468                     TOP_probe_r,
01469                     TOP_probe_r_fault,
01470                     TOP_probe_rw_fault,
01471                     TOP_probe_w,
01472                     TOP_probe_w_fault,
01473                     TOP_ptc_e,
01474                     TOP_ptc_g,
01475                     TOP_ptc_ga,
01476                     TOP_ptc_l,
01477                     TOP_ptr_d,
01478                     TOP_ptr_i,
01479                     TOP_UNDEFINED);
01480   Any_Operand_Access_Time(0);
01481   Any_Result_Available_Time(1);         // ??? really is 'variable'
01482   Resource_Requirement(res_issue, 0);
01483   Resource_Requirement(res_int_or_mem, 0);
01484   Resource_Requirement(res_memory, 0);
01485   Resource_Requirement(res_M0, 0);      // can only execute in M0
01486 
01487   Instruction_Group("SYST_M0_3",
01488                     TOP_rum,
01489                     TOP_sum,
01490                     TOP_mov_t_psrum,
01491                     TOP_UNDEFINED);
01492   Any_Operand_Access_Time(0);
01493   Any_Result_Available_Time(4);
01494   Resource_Requirement(res_issue, 0);
01495   Resource_Requirement(res_int_or_mem, 0);
01496   Resource_Requirement(res_memory, 0);
01497   Resource_Requirement(res_M0, 0);      // can only execute in M0
01498 
01499   Instruction_Group("SYST_M0_4",
01500                     TOP_rsm,
01501                     TOP_ssm,
01502                     TOP_mov_t_psr,
01503                     TOP_UNDEFINED);
01504   Any_Operand_Access_Time(0);
01505   Any_Result_Available_Time(5);
01506   Resource_Requirement(res_issue, 0);
01507   Resource_Requirement(res_int_or_mem, 0);
01508   Resource_Requirement(res_memory, 0);
01509   Resource_Requirement(res_M0, 0);      // can only execute in M0
01510 
01511   Instruction_Group("SYST_M0_5",
01512                     TOP_tak,
01513                     TOP_tpa,
01514                     TOP_UNDEFINED);
01515   Any_Operand_Access_Time(0);
01516   Any_Result_Available_Time(6);
01517   Resource_Requirement(res_issue, 0);
01518   Resource_Requirement(res_int_or_mem, 0);
01519   Resource_Requirement(res_memory, 0);
01520   Resource_Requirement(res_M0, 0);      // can only execute in M0
01521 
01522   Instruction_Group("SYST_M0_6",
01523                     TOP_mov_t_rr,
01524                     TOP_mov_t_pkr,
01525                     TOP_UNDEFINED);
01526   Any_Operand_Access_Time(0);
01527   Any_Result_Available_Time(10);
01528   Resource_Requirement(res_issue, 0);
01529   Resource_Requirement(res_int_or_mem, 0);
01530   Resource_Requirement(res_memory, 0);
01531   Resource_Requirement(res_M0, 0);      // can only execute in M0
01532 
01533   Instruction_Group("SYST_M0_7",
01534                     TOP_thash,
01535                     TOP_ttag,
01536                     TOP_mov_f_psrum,
01537                     TOP_mov_f_psr,
01538                     TOP_mov_f_rr,
01539                     TOP_mov_f_pkr,
01540                     TOP_UNDEFINED);
01541   Any_Operand_Access_Time(0);
01542   Any_Result_Available_Time(13);
01543   Resource_Requirement(res_issue, 0);
01544   Resource_Requirement(res_int_or_mem, 0);
01545   Resource_Requirement(res_memory, 0);
01546   Resource_Requirement(res_M0, 0);      // can only execute in M0
01547 
01548   Instruction_Group("SYST_M0_8",
01549                     TOP_mov_t_msr,
01550                     TOP_mov_t_pmd,
01551                     TOP_mov_t_pmc,
01552                     TOP_mov_t_ibr,
01553                     TOP_mov_t_dbr,
01554                     TOP_UNDEFINED);
01555   Any_Operand_Access_Time(0);
01556   Any_Result_Available_Time(35);
01557   Resource_Requirement(res_issue, 0);
01558   Resource_Requirement(res_int_or_mem, 0);
01559   Resource_Requirement(res_memory, 0);
01560   Resource_Requirement(res_M0, 0);      // can only execute in M0
01561 
01562   Instruction_Group("SYST_M0_9",
01563                     TOP_mov_f_msr,
01564                     TOP_mov_f_pmd,
01565                     TOP_mov_f_pmc,
01566                     TOP_mov_f_ibr,
01567                     TOP_mov_f_dbr,
01568                     TOP_mov_f_cpuid,
01569                     TOP_UNDEFINED);
01570   Any_Operand_Access_Time(0);
01571   Any_Result_Available_Time(38);
01572   Resource_Requirement(res_issue, 0);
01573   Resource_Requirement(res_int_or_mem, 0);
01574   Resource_Requirement(res_memory, 0);
01575   Resource_Requirement(res_M0, 0);      // can only execute in M0
01576 
01578   //
01579   // Instructions belonging to the SYST_M functional unit class:
01580   // M-type instructions which can execute in any M unit.
01581   //
01583   Instruction_Group("SYST_M",
01584                     TOP_fwb,
01585                     TOP_invala,
01586                     TOP_invala_e,
01587                     TOP_invala_f_e,
01588                     TOP_mf,
01589                     TOP_srlz_d,
01590                     TOP_srlz_i,
01591                     TOP_sync_i,
01592                     TOP_UNDEFINED);
01593   Any_Operand_Access_Time(0);
01594   Resource_Requirement(res_issue, 0);
01595   Resource_Requirement(res_int_or_mem, 0);
01596   Resource_Requirement(res_memory, 0);
01597 
01599   //
01600   // Instructions belonging to the TBIT functional unit class:
01601   // I-type instructions which can only execute in I0.
01602   //
01604   Instruction_Group("TBIT",
01605                     TOP_tbit_nz,
01606                     TOP_tbit_nz_and,
01607                     TOP_tbit_nz_or,
01608                     TOP_tbit_nz_or_andcm,
01609                     TOP_tbit_nz_unc,
01610                     TOP_tbit_z,
01611                     TOP_tbit_z_and,
01612                     TOP_tbit_z_or,
01613                     TOP_tbit_z_or_andcm,
01614                     TOP_tbit_z_unc,
01615                     TOP_UNDEFINED);
01616   Any_Operand_Access_Time(0);
01617   Any_Result_Available_Time(1);         // 0 to dependent BR
01618   Resource_Requirement(res_issue, 0);
01619   Resource_Requirement(res_int_or_mem, 0);
01620   Resource_Requirement(res_integer, 0);
01621   Resource_Requirement(res_I0, 0);      // can only execute in I0
01622 
01624   //
01625   // Instructions belonging to the TOAR_I functional unit class:
01626   // I-type instructions which can only execute in I0.
01627   //
01629   Instruction_Group("TOAR_I",
01630                     TOP_mov_t_ar_r_i,
01631                     TOP_mov_t_ar_i_i,
01632                     TOP_UNDEFINED);
01633   Any_Operand_Access_Time(0);
01634   Any_Result_Available_Time(1);         // depends on dest register
01635                                         // 0 to dependent BR (pfs only)
01636   Resource_Requirement(res_issue, 0);
01637   Resource_Requirement(res_int_or_mem, 0);
01638   Resource_Requirement(res_integer, 0);
01639   Resource_Requirement(res_I0, 0);      // can only execute in I0
01640 
01642   //
01643   // Instructions belonging to the TOAR_M functional unit class:
01644   // M-type instructions which can only execute in M0.
01645   //
01647   Instruction_Group("TOAR_M",
01648                     TOP_mov_t_ar_r_m,
01649                     TOP_mov_t_ar_i_m,
01650                     TOP_UNDEFINED);
01651   Any_Operand_Access_Time(0);
01652   Any_Result_Available_Time(1);         // depends on dest register
01653                                         // 0 to dependent BR (pfs only)
01654   Resource_Requirement(res_issue, 0);
01655   Resource_Requirement(res_int_or_mem, 0);
01656   Resource_Requirement(res_memory, 0);
01657   Resource_Requirement(res_M0, 0);      // can only execute in M0
01658 
01660   //
01661   // Instructions belonging to the TOBR functional unit class:
01662   // I-type instructions which can only execute in I0.
01663   //
01665   Instruction_Group("TOBR",
01666                     TOP_mov_t_br,
01667                     TOP_mov_t_br_i,
01668                     TOP_mov_t_br_ret,
01669                     TOP_UNDEFINED);
01670   Any_Operand_Access_Time(0);
01671   Any_Result_Available_Time(1);         // 0 to dependent BR
01672   Resource_Requirement(res_issue, 0);
01673   Resource_Requirement(res_int_or_mem, 0);
01674   Resource_Requirement(res_integer, 0);
01675   Resource_Requirement(res_I0, 0);      // can only execute in I0
01676 
01678   //
01679   // Instructions belonging to the TOCR functional unit class:
01680   // M-type instructions which can only execute in M0.
01681   //
01683   Instruction_Group("TOCR",
01684                     TOP_mov_t_cr,
01685                     TOP_UNDEFINED);
01686   Any_Operand_Access_Time(0);
01687   Any_Result_Available_Time(1);         // depends on dest register
01688   Resource_Requirement(res_issue, 0);
01689   Resource_Requirement(res_int_or_mem, 0);
01690   Resource_Requirement(res_memory, 0);
01691   Resource_Requirement(res_M0, 0);      // can only execute in M0
01692 
01694   //
01695   // Instructions belonging to the TOFR functional unit class:
01696   // M-type instructions which can execute in any M unit.
01697   //
01699   Instruction_Group("TOFR",
01700                     TOP_setf_exp,
01701                     TOP_setf_d,
01702                     TOP_setf_s,
01703                     TOP_setf_sig,
01704                     TOP_UNDEFINED);
01705   Any_Operand_Access_Time(0);
01706   Any_Result_Available_Time(9);
01707   Resource_Requirement(res_issue, 0);
01708   Resource_Requirement(res_int_or_mem, 0);
01709   Resource_Requirement(res_memory, 0);
01710 
01712   //
01713   // Instructions belonging to the TOPR functional unit class:
01714   // I-type instructions which can only execute in I0.
01715   //
01717   Instruction_Group("TOPR",
01718                     TOP_mov_t_pr,
01719                     TOP_mov_t_pr_i,
01720                     TOP_UNDEFINED);
01721   Any_Operand_Access_Time(0);
01722   Any_Result_Available_Time(1);         // 0 to dependent BR
01723   Resource_Requirement(res_issue, 0);
01724   Resource_Requirement(res_int_or_mem, 0);
01725   Resource_Requirement(res_integer, 0);
01726   Resource_Requirement(res_I0, 0);      // can only execute in I0
01727 
01729   //
01730   // Instructions belonging to the XMA functional unit class:
01731   // F-type instructions which can execute in any F unit.
01732   //
01734   Instruction_Group("XMA",
01735                     TOP_xma_h,
01736                     TOP_xma_hu,
01737                     TOP_xma_l,
01738                     TOP_xma_lu,         // pseudo of xma_l
01739                     TOP_xmpy_h,         // pseudo of xma_h
01740                     TOP_xmpy_hu,        // pseudo of xma_hu
01741                     TOP_xmpy_l,         // pseudo of xma_l
01742                     TOP_xmpy_lu,        // pseudo of xma_l
01743                     TOP_UNDEFINED);
01744   Any_Operand_Access_Time(0);
01745   Any_Result_Available_Time(7);
01746   Resource_Requirement(res_issue, 0);
01747   Resource_Requirement(res_float, 0);
01748 
01750   //
01751   // Instructions belonging to the XTD functional unit class:
01752   // I-type instructions which can execute in any I unit.
01753   //
01755   Instruction_Group("XTD",
01756                     TOP_czx1_l,
01757                     TOP_czx1_r,
01758                     TOP_czx2_l,
01759                     TOP_czx2_r,
01760                     TOP_sxt1,
01761                     TOP_sxt2,
01762                     TOP_sxt4,
01763                     TOP_zxt1,
01764                     TOP_zxt2,
01765                     TOP_zxt4,
01766                     TOP_UNDEFINED);
01767   Any_Operand_Access_Time(0);
01768   Any_Result_Available_Time(1);
01769   Resource_Requirement(res_issue, 0);
01770   Resource_Requirement(res_int_or_mem, 0);
01771   Resource_Requirement(res_integer, 0);
01772 
01774   //
01775   // UNKNOWN_1
01776   // I-type instructions which can...
01777   //
01779   Instruction_Group("UNKNOWN_1",
01780                     TOP_tnat_z,
01781                     TOP_tnat_z_unc,
01782                     TOP_tnat_z_and,
01783                     TOP_tnat_nz_and,
01784                     TOP_tnat_z_or,
01785                     TOP_tnat_nz_or,
01786                     TOP_tnat_z_or_andcm,
01787                     TOP_tnat_nz_or_andcm,
01788                     TOP_tnat_nz,
01789                     TOP_tnat_nz_unc,
01790                     TOP_UNDEFINED);
01791   Any_Operand_Access_Time(0);
01792   Any_Result_Available_Time(1);         // ??? not sure
01793   Resource_Requirement(res_issue, 0);
01794   Resource_Requirement(res_int_or_mem, 0);
01795   Resource_Requirement(res_integer, 0);
01796   Resource_Requirement(res_I0, 0);      // can only execute in I0
01797 
01799   //
01800   // UNKNOWN_2
01801   //
01803   Instruction_Group("dummy",
01804                     TOP_break,
01805                     TOP_nop,
01806                     TOP_mov_f_ar,
01807                     TOP_mov_t_ar_r,
01808                     TOP_mov_t_ar_i,
01809                     TOP_chk_s,
01810                     TOP_asm,
01811                     TOP_intrncall,
01812                     TOP_spadjust,
01813                     TOP_copy_br,
01814                     TOP_UNDEFINED);
01815   Any_Operand_Access_Time(0);
01816   Any_Result_Available_Time(1);
01817   Resource_Requirement(res_issue, 0);
01818 
01819   Machine_Done("itanium.c");
01820 }
01821 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines