arch-power.h

Go to the documentation of this file.
00001 /*
00002  * See the dyninst/COPYRIGHT file for copyright information.
00003  * 
00004  * We provide the Paradyn Tools (below described as "Paradyn")
00005  * on an AS IS basis, and do not warrant its validity or performance.
00006  * We reserve the right to update, modify, or discontinue this
00007  * software at any time.  We shall have no obligation to supply such
00008  * updates or modifications or any other form of support to you.
00009  * 
00010  * By your use of Paradyn, you understand and agree that we (or any
00011  * other person or entity with proprietary rights in Paradyn) are
00012  * under no obligation to provide either maintenance services,
00013  * update services, notices of latent defects, or correction of
00014  * defects for Paradyn.
00015  * 
00016  * This library is free software; you can redistribute it and/or
00017  * modify it under the terms of the GNU Lesser General Public
00018  * License as published by the Free Software Foundation; either
00019  * version 2.1 of the License, or (at your option) any later version.
00020  * 
00021  * This library is distributed in the hope that it will be useful,
00022  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00023  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00024  * Lesser General Public License for more details.
00025  * 
00026  * You should have received a copy of the GNU Lesser General Public
00027  * License along with this library; if not, write to the Free Software
00028  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
00029  */
00030 
00031 // $Id: arch-power.h,v 1.45 2008/03/25 19:24:23 bernat Exp $
00032 
00033 #ifndef _ARCH_POWER_H
00034 #define _ARCH_POWER_H
00035 
00036 // Code generation
00037 
00038 #include "common/h/Types.h"
00039 #include "common/h/Vector.h"
00040 class AddressSpace;
00041 
00042 namespace NS_power {
00043 
00044 /*
00045  * Define power instruction information.
00046  *
00047  */
00048 
00049 //struct genericform {
00050 //  unsigned op : 6;
00051 //  unsigned XX : 26;
00052 //};
00053 #define GENERIC_OP(x) ((unsigned int) (((x).asInt() & 0xfc000000) >> 26 ))
00054 #define GENERIC_XX(x) ((unsigned int) (((x).asInt() & 0x03ffffff)       ))
00055 
00056 #define GENERIC_OP_SET(x, y) ((x).setBits(26,  6, (y)))
00057 #define GENERIC_XX_SET(x, y) ((x).setBits( 0, 26, (y)))
00058 
00059 //struct iform {            // unconditional branch + 
00060 //  unsigned op : 6;
00061 //  signed   li : 24;
00062 //  unsigned aa : 1;
00063 //  unsigned lk : 1;
00064 //};
00065 #define IFORM_OP(x) ((unsigned int) (((x).asInt() & 0xfc000000) >> 26 ))
00066 #define IFORM_LI(x) (instruction::signExtend( \
00067                                     (((x).asInt() & 0x03fffffc) >>  2 ), 24))
00068 #define IFORM_AA(x) ((unsigned int) (((x).asInt() & 0x00000002) >>  1 ))
00069 #define IFORM_LK(x) ((unsigned int) (((x).asInt() & 0x00000001)       ))
00070 
00071 #define IFORM_OP_SET(x, y) ((x).setBits(26,  6, (y)))
00072 #define IFORM_LI_SET(x, y) ((x).setBits( 2, 24, (y)))
00073 #define IFORM_AA_SET(x, y) ((x).setBits( 1,  1, (y)))
00074 #define IFORM_LK_SET(x, y) ((x).setBits( 0,  1, (y)))
00075 
00076 //struct bform {            // conditional branch +
00077 //  unsigned op : 6;
00078 //  unsigned bo : 5;
00079 //  unsigned bi : 5;
00080 //  signed   bd : 14;
00081 //  unsigned aa : 1;
00082 //  unsigned lk : 1;
00083 //};
00084 #define BFORM_OP(x) ((unsigned int) (((x).asInt() & 0xfc000000) >> 26 ))
00085 #define BFORM_BO(x) ((unsigned int) (((x).asInt() & 0x03e00000) >> 21 ))
00086 #define BFORM_BI(x) ((unsigned int) (((x).asInt() & 0x001f0000) >> 16 ))
00087 #define BFORM_BD(x) (instruction::signExtend( \
00088                                     (((x).asInt() & 0x0000fffc) >>  2 ), 14))
00089 #define BFORM_AA(x) ((unsigned int) (((x).asInt() & 0x00000002) >>  1 ))
00090 #define BFORM_LK(x) ((unsigned int) (((x).asInt() & 0x00000001)       ))
00091 
00092 #define BFORM_OP_SET(x, y) ((x).setBits(26,  6, (y)))
00093 #define BFORM_BO_SET(x, y) ((x).setBits(21,  5, (y)))
00094 #define BFORM_BI_SET(x, y) ((x).setBits(16,  5, (y)))
00095 #define BFORM_BD_SET(x, y) ((x).setBits( 2, 14, (y)))
00096 #define BFORM_AA_SET(x, y) ((x).setBits( 1,  1, (y)))
00097 #define BFORM_LK_SET(x, y) ((x).setBits( 0,  1, (y)))
00098 
00099 //struct dform {
00100 //    unsigned op : 6;
00101 //    unsigned rt : 5;        // rt, rs, frt, frs, to, bf_l
00102 //    unsigned ra : 5;
00103 //    signed   d_or_si : 16;  // d, si, ui
00104 //};
00105 #define DFORM_OP(x) ((unsigned int) (((x).asInt() & 0xfc000000) >> 26 ))
00106 #define DFORM_RT(x) ((unsigned int) (((x).asInt() & 0x03e00000) >> 21 ))
00107 #define DFORM_RA(x) ((unsigned int) (((x).asInt() & 0x001f0000) >> 16 ))
00108 #define DFORM_D(x)  (instruction::signExtend( \
00109                                     (((x).asInt() & 0x0000ffff)       ), 16))
00110 #define DFORM_SI(x) (instruction::signExtend( \
00111                                     (((x).asInt() & 0x0000ffff)       ), 16))
00112 
00113 #define DFORM_OP_SET(x, y) ((x).setBits(26,  6, (y)))
00114 #define DFORM_RT_SET(x, y) ((x).setBits(21,  5, (y)))
00115 #define DFORM_RA_SET(x, y) ((x).setBits(16,  5, (y)))
00116 #define DFORM_D_SET(x, y)  ((x).setBits( 0, 16, (y)))
00117 #define DFORM_SI_SET(x, y) ((x).setBits( 0, 16, (y)))
00118 
00119 //struct dsform {
00120 //    unsigned op : 6;
00121 //    unsigned rt : 5;        // rt, rs
00122 //    unsigned ra : 5;
00123 //    signed   ds : 14;
00124 //    unsigned xo : 2;
00125 //};
00126 #define DSFORM_OP(x) ((unsigned int) (((x).asInt() & 0xfc000000) >> 26 ))
00127 #define DSFORM_RT(x) ((unsigned int) (((x).asInt() & 0x03e00000) >> 21 ))
00128 #define DSFORM_RA(x) ((unsigned int) (((x).asInt() & 0x001f0000) >> 16 ))
00129 #define DSFORM_DS(x) (instruction::signExtend( \
00130                                      (((x).asInt() & 0x0000fffc) >>  2 ), 14))
00131 #define DSFORM_XO(x) ((unsigned int) (((x).asInt() & 0x00000003)       ))
00132 
00133 #define DSFORM_OP_SET(x, y) ((x).setBits(26,  6, (y)))
00134 #define DSFORM_RT_SET(x, y) ((x).setBits(21,  5, (y)))
00135 #define DSFORM_RA_SET(x, y) ((x).setBits(16,  5, (y)))
00136 #define DSFORM_DS_SET(x, y) ((x).setBits( 2, 14, (y)))
00137 #define DSFORM_XO_SET(x, y) ((x).setBits( 0,  2, (y)))
00138 
00139 //struct xform {
00140 //    unsigned op : 6;
00141 //    unsigned rt : 5;   // rt, frt, bf_l, rs, frs, to, bt
00142 //    unsigned ra : 5;   // ra, fra, bfa_, sr, spr
00143 //    unsigned rb : 5;   // rb, frb, sh, nb, u_
00144 //    unsigned xo : 10;  // xo, eo
00145 //    unsigned rc : 1;
00146 //};
00147 #define XFORM_OP(x) ((unsigned int) (((x).asInt() & 0xfc000000) >> 26 ))
00148 #define XFORM_RT(x) ((unsigned int) (((x).asInt() & 0x03e00000) >> 21 ))
00149 #define XFORM_RA(x) ((unsigned int) (((x).asInt() & 0x001f0000) >> 16 ))
00150 #define XFORM_RB(x) ((unsigned int) (((x).asInt() & 0x0000f800) >> 11 ))
00151 #define XFORM_XO(x) ((unsigned int) (((x).asInt() & 0x000007fe) >>  1 ))
00152 #define XFORM_RC(x) ((unsigned int) (((x).asInt() & 0x00000001)       ))
00153 
00154 #define XFORM_OP_SET(x, y) ((x).setBits(26,  6, (y)))
00155 #define XFORM_RT_SET(x, y) ((x).setBits(21,  5, (y)))
00156 #define XFORM_RA_SET(x, y) ((x).setBits(16,  5, (y)))
00157 #define XFORM_RB_SET(x, y) ((x).setBits(11,  5, (y)))
00158 #define XFORM_XO_SET(x, y) ((x).setBits( 1, 10, (y)))
00159 #define XFORM_RC_SET(x, y) ((x).setBits( 0,  1, (y)))
00160 
00161 //struct xlform {
00162 //  unsigned op : 6;
00163 //  unsigned bt : 5;   // rt, bo, bf_
00164 //  unsigned ba : 5;   // ba, bi, bfa_
00165 //  unsigned bb : 5; 
00166 //  unsigned xo : 10;  // xo, eo
00167 //  unsigned lk : 1;
00168 //};
00169 #define XLFORM_OP(x) ((unsigned int) (((x).asInt() & 0xfc000000) >> 26 ))
00170 #define XLFORM_BT(x) ((unsigned int) (((x).asInt() & 0x03e00000) >> 21 ))
00171 #define XLFORM_BA(x) ((unsigned int) (((x).asInt() & 0x001f0000) >> 16 ))
00172 #define XLFORM_BB(x) ((unsigned int) (((x).asInt() & 0x0000f800) >> 11 ))
00173 #define XLFORM_XO(x) ((unsigned int) (((x).asInt() & 0x000007fe) >>  1 ))
00174 #define XLFORM_LK(x) ((unsigned int) (((x).asInt() & 0x00000001)       ))
00175 
00176 #define XLFORM_OP_SET(x, y) ((x).setBits(26,  6, (y)))
00177 #define XLFORM_BT_SET(x, y) ((x).setBits(21,  5, (y)))
00178 #define XLFORM_BA_SET(x, y) ((x).setBits(16,  5, (y)))
00179 #define XLFORM_BB_SET(x, y) ((x).setBits(11,  5, (y)))
00180 #define XLFORM_XO_SET(x, y) ((x).setBits( 1, 10, (y)))
00181 #define XLFORM_LK_SET(x, y) ((x).setBits( 0,  1, (y)))
00182 
00183 //struct xfxform {
00184 //  unsigned op : 6;
00185 //  unsigned rt : 5;   // rs
00186 //  unsigned spr: 10;  // spr, tbr, fxm
00187 //  unsigned xo : 10;
00188 //  unsigned rc : 1;
00189 //};
00190 #define XFXFORM_OP(x)  ((unsigned int) (((x).asInt() & 0xfc000000) >> 26 ))
00191 #define XFXFORM_RT(x)  ((unsigned int) (((x).asInt() & 0x03e00000) >> 21 ))
00192 #define XFXFORM_SPR(x) ((unsigned int) (((x).asInt() & 0x001ff800) >> 11 ))
00193 #define XFXFORM_XO(x)  ((unsigned int) (((x).asInt() & 0x000007fe) >>  1 ))
00194 #define XFXFORM_RC(x)  ((unsigned int) (((x).asInt() & 0x00000001)       ))
00195 
00196 #define XFXFORM_OP_SET(x, y)  ((x).setBits(26,  6, (y)))
00197 #define XFXFORM_RT_SET(x, y)  ((x).setBits(21,  5, (y)))
00198 #define XFXFORM_SPR_SET(x, y) ((x).setBits(11, 10, (y)))
00199 #define XFXFORM_XO_SET(x, y)  ((x).setBits( 1, 10, (y)))
00200 #define XFXFORM_RC_SET(x, y)  ((x).setBits( 0,  1, (y)))
00201 
00202 //struct xflform {
00203 //  unsigned op : 6;
00204 //  unsigned u1 : 1;
00205 //  unsigned flm: 8;
00206 //  unsigned u2 : 1;
00207 //  unsigned frb: 5;
00208 //  unsigned xo : 10;
00209 //  unsigned rc : 1;
00210 //};
00211 #define XFLFORM_OP(x)  ((unsigned int) (((x).asInt() & 0xfc000000) >> 26 ))
00212 #define XFLFORM_U1(x)  ((unsigned int) (((x).asInt() & 0x02000000) >> 25 ))
00213 #define XFLFORM_FLM(x) ((unsigned int) (((x).asInt() & 0x01fe0000) >> 17 ))
00214 #define XFLFORM_U2(x)  ((unsigned int) (((x).asInt() & 0x00010000) >> 16 ))
00215 #define XFLFORM_FRB(x) ((unsigned int) (((x).asInt() & 0x0000f800) >> 11 ))
00216 #define XFLFORM_XO(x)  ((unsigned int) (((x).asInt() & 0x000007fe) >>  1 ))
00217 #define XFLFORM_RC(x)  ((unsigned int) (((x).asInt() & 0x00000001)       ))
00218 
00219 #define XFLFORM_OP_SET(x, y)  ((x).setBits(26,  6, (y)))
00220 #define XFLFORM_U1_SET(x, y)  ((x).setBits(25,  1, (y)))
00221 #define XFLFORM_FLM_SET(x, y) ((x).setBits(17,  8, (y)))
00222 #define XFLFORM_U2_SET(x, y)  ((x).setBits(16,  1, (y)))
00223 #define XFLFORM_FRB_SET(x, y) ((x).setBits(11,  5, (y)))
00224 #define XFLFORM_XO_SET(x, y)  ((x).setBits( 1, 10, (y)))
00225 #define XFLFORM_RC_SET(x, y)  ((x).setBits( 0,  1, (y)))
00226 
00227 //struct xoform {
00228 //    unsigned op : 6;
00229 //    unsigned rt : 5;
00230 //    unsigned ra : 5;
00231 //    unsigned rb : 5;
00232 //    unsigned oe : 1;
00233 //    unsigned xo : 9; // xo, eo'
00234 //    unsigned rc : 1;
00235 //};
00236 #define XOFORM_OP(x) ((unsigned int) (((x).asInt() & 0xfc000000) >> 26 ))
00237 #define XOFORM_RT(x) ((unsigned int) (((x).asInt() & 0x03e00000) >> 21 ))
00238 #define XOFORM_RA(x) ((unsigned int) (((x).asInt() & 0x001f0000) >> 16 ))
00239 #define XOFORM_RB(x) ((unsigned int) (((x).asInt() & 0x0000f800) >> 11 ))
00240 #define XOFORM_OE(x) ((unsigned int) (((x).asInt() & 0x00000400) >> 10 ))
00241 #define XOFORM_XO(x) ((unsigned int) (((x).asInt() & 0x000003fe) >>  1 ))
00242 #define XOFORM_RC(x) ((unsigned int) (((x).asInt() & 0x00000001)       ))
00243 
00244 #define XOFORM_OP_SET(x, y) ((x).setBits(26,  6, (y)))
00245 #define XOFORM_RT_SET(x, y) ((x).setBits(21,  5, (y)))
00246 #define XOFORM_RA_SET(x, y) ((x).setBits(16,  5, (y)))
00247 #define XOFORM_RB_SET(x, y) ((x).setBits(11,  5, (y)))
00248 #define XOFORM_OE_SET(x, y) ((x).setBits(10,  1, (y)))
00249 #define XOFORM_XO_SET(x, y) ((x).setBits( 1,  9, (y)))
00250 #define XOFORM_RC_SET(x, y) ((x).setBits( 0,  1, (y)))
00251 
00252 //struct mform {
00253 //    unsigned op : 6;
00254 //    unsigned rs : 5;
00255 //    unsigned ra : 5;
00256 //    unsigned sh : 5;
00257 //    unsigned mb : 5; // mb, sh
00258 //    unsigned me : 5;
00259 //    unsigned rc : 1;
00260 //};
00261 #define MFORM_OP(x) ((unsigned int) (((x).asInt() & 0xfc000000) >> 26 ))
00262 #define MFORM_RS(x) ((unsigned int) (((x).asInt() & 0x03e00000) >> 21 ))
00263 #define MFORM_RA(x) ((unsigned int) (((x).asInt() & 0x001f0000) >> 16 ))
00264 #define MFORM_SH(x) ((unsigned int) (((x).asInt() & 0x0000f800) >> 11 ))
00265 #define MFORM_MB(x) ((unsigned int) (((x).asInt() & 0x000007c0) >>  6 ))
00266 #define MFORM_ME(x) ((unsigned int) (((x).asInt() & 0x0000003e) >>  1 ))
00267 #define MFORM_RC(x) ((unsigned int) (((x).asInt() & 0x00000001)       ))
00268 
00269 #define MFORM_OP_SET(x, y) ((x).setBits(26,  6, (y)))
00270 #define MFORM_RS_SET(x, y) ((x).setBits(21,  5, (y)))
00271 #define MFORM_RA_SET(x, y) ((x).setBits(16,  5, (y)))
00272 #define MFORM_SH_SET(x, y) ((x).setBits(11,  5, (y)))
00273 #define MFORM_MB_SET(x, y) ((x).setBits( 6,  5, (y)))
00274 #define MFORM_ME_SET(x, y) ((x).setBits( 1,  5, (y)))
00275 #define MFORM_RC_SET(x, y) ((x).setBits( 0,  1, (y)))
00276 
00277 //struct mdform {
00278 //    unsigned op : 6;
00279 //    unsigned rs : 5;
00280 //    unsigned ra : 5;
00281 //    unsigned sh : 5;
00282 //    unsigned mb : 5; // me
00283 //    unsigned mb2 : 1;
00284 //    unsigned xo : 3;
00285 //    unsigned sh2 : 1;
00286 //    unsigned rc : 1;
00287 //};
00288 #define MDFORM_OP(x)  ((unsigned int) (((x).asInt() & 0xfc000000) >> 26 ))
00289 #define MDFORM_RS(x)  ((unsigned int) (((x).asInt() & 0x03e00000) >> 21 ))
00290 #define MDFORM_RA(x)  ((unsigned int) (((x).asInt() & 0x001f0000) >> 16 ))
00291 #define MDFORM_SH(x)  ((unsigned int) (((x).asInt() & 0x0000f800) >> 11 ))
00292 #define MDFORM_MB(x)  ((unsigned int) (((x).asInt() & 0x000007c0) >>  6 ))
00293 #define MDFORM_MB2(x) ((unsigned int) (((x).asInt() & 0x00000020) >>  5 ))
00294 #define MDFORM_XO(x)  ((unsigned int) (((x).asInt() & 0x0000001c) >>  2 ))
00295 #define MDFORM_SH2(x) ((unsigned int) (((x).asInt() & 0x00000002) >>  1 ))
00296 #define MDFORM_RC(x)  ((unsigned int) (((x).asInt() & 0x00000001)       ))
00297 
00298 #define MDFORM_OP_SET(x, y)  ((x).setBits(26,  6, (y)))
00299 #define MDFORM_RS_SET(x, y)  ((x).setBits(21,  5, (y)))
00300 #define MDFORM_RA_SET(x, y)  ((x).setBits(16,  5, (y)))
00301 #define MDFORM_SH_SET(x, y)  ((x).setBits(11,  5, (y)))
00302 #define MDFORM_MB_SET(x, y)  ((x).setBits( 6,  5, (y)))
00303 #define MDFORM_MB2_SET(x, y) ((x).setBits( 5,  1, (y)))
00304 #define MDFORM_XO_SET(x, y)  ((x).setBits( 2,  3, (y)))
00305 #define MDFORM_SH2_SET(x, y) ((x).setBits( 1,  1, (y)))
00306 #define MDFORM_RC_SET(x, y)  ((x).setBits( 0,  1, (y)))
00307 
00308 //struct aform {
00309 //  unsigned op: 6;
00310 //  unsigned frt: 5;
00311 //  unsigned fra: 5;
00312 //  unsigned frb: 5;
00313 //  unsigned frc: 5;
00314 //  unsigned xo:  5;
00315 //  unsigned rc:  1;
00316 //};
00317 #define AFORM_OP(x)  ((unsigned int) (((x).asInt() & 0xfc000000) >> 26 ))
00318 #define AFORM_FRT(x) ((unsigned int) (((x).asInt() & 0x03e00000) >> 21 ))
00319 #define AFORM_FRA(x) ((unsigned int) (((x).asInt() & 0x001f0000) >> 16 ))
00320 #define AFORM_FRB(x) ((unsigned int) (((x).asInt() & 0x0000f800) >> 11 ))
00321 #define AFORM_FRC(x) ((unsigned int) (((x).asInt() & 0x000007c0) >>  6 ))
00322 #define AFORM_XO(x)  ((unsigned int) (((x).asInt() & 0x0000003e) >>  1 ))
00323 #define AFORM_RC(x)  ((unsigned int) (((x).asInt() & 0x00000001)       ))
00324 
00325 #define AFORM_OP_SET(x, y)  ((x).setBits(26,  6, (y)))
00326 #define AFORM_FRT_SET(x, y) ((x).setBits(21,  5, (y)))
00327 #define AFORM_FRA_SET(x, y) ((x).setBits(16,  5, (y)))
00328 #define AFORM_FRB_SET(x, y) ((x).setBits(11,  5, (y)))
00329 #define AFORM_FRC_SET(x, y) ((x).setBits( 6,  5, (y)))
00330 #define AFORM_XO_SET(x, y)  ((x).setBits( 1,  5, (y)))
00331 #define AFORM_RC_SET(x, y)  ((x).setBits( 0,  1, (y)))
00332 
00333 typedef union {
00334 //  struct iform  iform;  // branch;
00335 //  struct bform  bform;  // cbranch;
00336 //  struct dform  dform;
00337 //  struct dsform dsform;
00338 //  struct xform  xform;
00339 //  struct xoform xoform;
00340 //  struct xlform xlform;
00341 //  struct xfxform xfxform;
00342 //  struct xflform xflform;
00343 //  struct mform  mform;
00344 //  struct mdform  mdform;
00345 //  struct aform  aform;
00346     unsigned char byte[4];
00347     unsigned int  raw;
00348 } instructUnion;
00349 
00350 // instruction is now a class for platform-indep.
00351 
00352 // Mmmm alignment
00353 typedef instructUnion codeBuf_t;
00354 typedef unsigned codeBufIndex_t;
00355 
00356 #define SPR_XER 1
00357 #define SPR_LR  8
00358 #define SPR_CTR 9
00359 #define SPR_MQ 0
00360 
00361 /*
00362  * Register saving constants
00363  */
00364 #define maxFPR 32           /* Save FPRs 0-13 */
00365 #define maxGPR 32           /* More space than is needed */
00366 #define FPRspaceUsed (8*16) /* Aligned space for FPRs */
00367 #define GPRoffset(reg) (-1* (FPRspaceUsed + 4*(maxGPR-reg)))
00368 #define GPRspaceUsed (20*4) /* Aligned space for GPRs */
00369 
00370 #define stackFrameSize (FPRspaceUsed+GPRspaceUsed+128)
00371 
00372 /*
00373  * Define the operation codes
00374  */
00375 
00376 #define X_EXTENDEDop     31
00377 #define XO_EXTENDEDop    31
00378 #define X_FP_EXTENDEDop  63
00379 #define A_FP_EXTENDEDop1  59   
00380 #define A_FP_EXTENDEDop2  63
00381 
00382 // ------------- Op Codes, instruction form I  ------------------
00383 #define Bop     18  /* (unconditional) branch */
00384 
00385 // ------------- Op Codes, instruction form D  ------------------
00386 #define TIop             3      /* trap immediate */
00387 #define MULIop           7      /* multiply immediate */
00388 #define SFIop            8      /* subtract from immediate */
00389 #define DOZIop           9
00390 #define CMPLIop         10
00391 #define CMPIop      11  /* compare immediate */
00392 #define SIop            12      /* subtract immediate */
00393 #define AIDOTop         13
00394 #define CALop       14  /* compute address lower -- ADDIop */
00395 #define CAUop       15  /* compute address upper -- ADDISop*/
00396 #define ORILop      24  /* (logical) or immediate lower -- ORIop*/
00397 #define ORIUop          25
00398 #define XORILop         26
00399 #define XORIUop         27 
00400 #define ANDILop         28      /* and immediate lower -- ANDIop*/
00401 #define ANDIUop         29
00402 #define RLDop       30  /* RLD* family -- rotate left doubleword */
00403 #define Lop     32  /* load (word) (aka lwz op in PowerPC) */
00404 #define LUop        33
00405 #define LBZop       34
00406 #define LBZUop      35
00407 #define STop        36  /* store (word) -- STWop */
00408 #define STUop       37  /* store (word) with update -- STWUop */
00409 #define STBop       38
00410 #define STBUop      39
00411 #define LHZop       40
00412 #define LHZUop      41
00413 #define LHAop       42
00414 #define LHAUop      43
00415 #define STHop       44
00416 #define STHUop      45
00417 #define LMop        46
00418 #define STMop       47
00419 #define LFSop       48
00420 #define LFSUop      49
00421 #define LFDop           50      /* load floating-point double */
00422 #define LFDUop      51
00423 #define STFSop      52
00424 #define STFSUop     53
00425 #define STFDop          54      /* store floating-point double */
00426 #define STFDUop     55
00427 
00428 // ------------- Op Codes, instruction form DS  ------------------
00429 #define LDop        58  // LWA and LDU have the same op, xop differs
00430 #define LDxop       0
00431 #define LDUxop      1
00432 #define LWAxop      2
00433 #define STDop       62  // ditto
00434 #define STDxop      0
00435 #define STDUxop     1
00436 
00437 // ------------- Op Codes, instruction form B  ------------------
00438 #define BCop        16  /* branch conditional */
00439 
00440 // ------------- Op Codes, instruction form MD ------------------
00441 #define RLDop          30      /* RLD* family -- rotate left doubleword */
00442 #define ICLxop          0      // Immediate and Clear Left
00443 #define ICRxop          1      // Immediate and Clear Right
00444 
00445 // ------------- Op Codes, instruction form X  ------------------
00446 /* #define XFPop        31      -- extendened fixed point ops */
00447 // -- X-from Loads
00448 #define LXop        31  // VG: all X-from loads have op 31, only xop differs
00449 #define LWARXxop    20
00450 #define LDXxop      21
00451 #define LXxop       23
00452 #define LDUXxop     53
00453 #define LUXxop      55
00454 #define LDARXxop    84
00455 #define LBZXxop     87
00456 #define LBZUXxop    119
00457 #define LHZXxop     279
00458 #define LHZUXxop    311
00459 #define MFSPRop         31
00460 #define MFSPRxop    339
00461 #define LHAXxop     343
00462 #define LWAXxop     341
00463 #define LWAUXxop    373
00464 #define LHAUXxop    375
00465 #define LSXxop      533
00466 #define LWBRXxop    534
00467 #define LFSXxop     535
00468 #define LFSUXxop    567 // I guess it must be so ;)
00469 #define LSIxop      597
00470 #define LFDXxop     599
00471 #define LFDUXxop    631
00472 #define LHBRXxop    790
00473 // -- X-from stores
00474 #define STXop       31  // VG: X-form stores, same story
00475 #define STDXxop     149
00476 #define STWCXxop    150
00477 #define STXxop      151
00478 #define STDUXxop    181
00479 #define STUXxop     183
00480 #define STDCXxop    214
00481 #define STBXxop     215
00482 #define STBUXxop    247
00483 #define STHXxop     407
00484 #define STHUXxop    439
00485 #define STSXxop     661
00486 #define STBRXxop    662
00487 #define STFSXxop    663
00488 #define STFSUXxop   695
00489 #define STSIxop     725
00490 #define STFDXxop    727
00491 #define STFDUXxop   759
00492 #define STHBRXxop   918
00493 #define STFIWXxop   983
00494 // -- other X-forms
00495 #define CMPop           31      /* compare -- XFPop*/
00496 #define CMPxop      0       /* compare */
00497 #define ANDop           31      /* and */
00498 #define ANDxop          28      /* and */
00499 #define ORop            31      /* or */
00500 #define ORxop           444     /* or */
00501 
00502 // -- Other extended op codes for X, XFX, & XO when op is 31
00503 #define EXTop           31
00504 #define Txop             4
00505 #define Axop            10
00506 #define MULHWUxop       11
00507 #define MFCRxop         19
00508 #define SLxop           24
00509 #define CNTLZxop        26
00510 #define SLDxop          27
00511 #define MASKGxop        29
00512 #define CMPLxop         32
00513 #define SUBFxop         40
00514 #define DCBSxop         54
00515 #define ANDCxop         60
00516 #define MULHWxop        75
00517 #define MFMSRxop        83
00518 #define DCBFxop         86
00519 #define LBZXxop         87
00520 #define NEGxop         104
00521 #define MULxop         107
00522 #define CLFxop         118
00523 #define NORxop         124
00524 #define SFExop         136
00525 #define AExop          138
00526 #define MTCRFxop       144
00527 #define MTMSRxop       146
00528 #define SLQxop         152
00529 #define SLExop         153
00530 #define SLIQxop        184
00531 #define SFZExop        200
00532 #define AZExop         202
00533 #define MTSRxop        210
00534 #define SLLQxop        216
00535 #define SLEQxop        217
00536 #define SFMExop        232
00537 #define AMExop         234
00538 #define MTSRIxop       242
00539 #define DCBTSTxop      246
00540 #define SLLIQxop       248
00541 #define DOZxop         264
00542 #define LSCBXxop       277
00543 #define DCBTxop        278
00544 #define EQVxop         284
00545 #define TLBIxop        306
00546 #define XORxop         316
00547 #define DIVxop         331
00548 #define ABSxop         360
00549 #define ORCxop         412
00550 #define DIVWUxop       459
00551 #define MTSPRop         31
00552 #define MTSPRxop       467
00553 #define DCBIxop        470
00554 #define NANDxop        476
00555 #define NABSxop        488
00556 #define DIVWxop        491
00557 #define CLIxop         502
00558 #define CLCSxop        531
00559 #define SRxop          536
00560 #define RRIBxop        537
00561 #define SRDxop         539
00562 #define MASKIRxop      541
00563 #define LFSUXxop       567
00564 #define MFSRxop        595
00565 #define MFSRIxop       627
00566 #define DCLSTxop       630
00567 #define MFSRINxop      659
00568 #define SRQxop         664
00569 #define SRExop         665
00570 #define SRIQxop        696
00571 #define SRLQxop        728
00572 #define SREQxop        729
00573 #define SRLIQxop       760
00574 #define SRAxop         792
00575 #define RACxop         818
00576 #define SRAIxop        824
00577 #define EIEIOxop       854
00578 #define SRAQxop        920
00579 #define SREAxop        921
00580 #define EXTSxop        922
00581 #define SRAIQxop       952
00582 #define EXTSBxop       954
00583 #define ICBIxop        982
00584 #define DCLZxop       1014
00585 
00586 
00587 // ------------- Op Codes, instruction form XL  -----------------
00588 #define BCLRop      19  /* branch conditional link register */
00589 #define BCLRxop     16  /* branch conditional link register */
00590 #define BCCTRop         19      /* branch conditional count register */
00591 #define BCCTRxop        528     /* branch conditional count register */
00592 
00593 
00594 // ------------- Op Codes, instruction form XO  -----------------
00595 /* #define XFPop        31      -- extendened fixed point ops */
00596 #define SFop        31      /* subtract from -- XFPop */
00597 #define SFxop       8       /* subtract from -- SUBFxop */
00598 #define MULSop          31      /* multiply short -- XFPop */
00599 #define MULSxop         235     /* multiply short -- MULLWxop */
00600 #define CAXop       31      /* compute address -- XFPop */
00601 #define CAXxop      266     /* compute address -- ADDxop */
00602 #define DIVSop          31      /* divide short -- XFPop */
00603 #define DIVSxop         363     /* divide short -- replacing DIVWxop */
00604 
00605 // ------------- Extended Floating PointOp Codes, instruction form A ---
00606 // Op code - 59
00607 #define FDIVSxop        18
00608 #define FSUBSxop        20
00609 #define FADDSxop        21
00610 #define FMULSxop        25
00611 #define FMSUBSxop       28
00612 #define FMADDSxop       29
00613 #define FNMSUBSxop      30
00614 #define FNMADDSxop      31
00615 
00616 // Op code - 63
00617 #define FDxop           18
00618 #define FSxop           20
00619 #define FAxop           21
00620 #define FSQRTxop        22
00621 #define FMxop           25
00622 #define FMSxop          28
00623 #define FMAxop          29
00624 #define FNMSxop         30
00625 #define FNMAxop         31
00626 
00627 // ------------- Extended Floating Point Op Codes, instruction form X---
00628 // Op Code - 63
00629 #define FCMPUxop         0
00630 #define FRSPxop         12
00631 #define FCIRxop         14
00632 #define FCIRZxop        15
00633 #define FCMPOxop        32
00634 #define FNEGxop         40
00635 #define FMRxop          72
00636 #define FNABSxop       136
00637 #define FABSxop        264
00638 #define MFFSxop        583
00639 #define MTFSFxop       711
00640 
00641 // ------------- Op Codes, instruction form SC  -----------------
00642 #define SVCop       17  /* supervisor call -- used to be SCop */
00643 
00644 // ------------- Op Codes, instruction form M  -----------------
00645 
00646 #define RLIMIop         20      /* rotate left immediate then mask insert */
00647 #define RLINMxop        21      /* rotate left immediate then AND with mask
00648                                  * -- RLWINMxop */
00649 #define RLMIop          22
00650 #define RLNMop          23
00651 
00652 #define RLDICLop        30      /* Rotate Left Doubleword Imm and Clear Left */
00653 
00654 // -------------------------- Raw instructions ------------------
00655 /* a few full instructions that are in forms we don't break down by field */
00656 // xlform
00657 #define MTLR0raw       0x7c0803a6      /* move from link reg -- mtlw r0 */
00658 #define MFLR0raw       0x7c0802a6      /* move from link reg -- mflr r0 */
00659 #define MTLR2raw       0x7c4803a6   /* move from link reg -- mtlr r2 */
00660 #define MFLR2raw       0x7c4802a6   /* move from link reg -- mflr r2 */
00661 #define BCTRraw        0x4e800420      /* bctr instrunction */
00662 #define BCTRLraw       0x4e800421      /* bctrl instrunction */
00663 #define BRraw          0x4e800020      /* br instruction */
00664 #define BRLraw         0x4e800021      /* branch and link to link reg */
00665 #define NOOPraw        0x60000000      /* noop, d form ORIL 0, 0, 0 */
00666 
00667 // -------------------------- Branch fields ------------------------------
00668 // BO field of branch conditional
00669 #define Bcondmask       0x1e
00670 #define BALWAYSmask     0x14
00671 
00672 #define BPREDICTbit     1   // Set means reverse branch prediction
00673 #define BifCTRzerobit       2   // Set means branch if CTR = 0
00674 #define BnoDecCTRbit        4   // Set means decrement CTR and branch
00675 #define BifTRUEbit      8   // Set means branch if condition true
00676 #define BnoCondbit      16  // Set means ignore condition (use CTR)
00677 
00678 #define BFALSEcond              4
00679 #define BTRUEcond               12
00680 #define BALWAYScond     20
00681 
00682 /* BI field for branch conditional (really bits of the CR Field to use) */
00683 #define LTcond          0       /* negative */
00684 #define GTcond          1       /* positive */
00685 #define EQcond          2       /* zero */
00686 #define SOcond          3       /* summary overflow */
00687 
00688 // -------------------------- Load/Store fields ---------------------------
00689 #define RTmask      0x03e00000      // bits  6-10
00690 #define RAmask      0x001f0000      // bits 11-15
00691 #define RBmask      0x0000f800      // bits 16-20
00692 #define DinDmask    0x0000ffff      // bits 16-31
00693 #define DinDSmask   0x0000fffc      // bits 16-29
00694 
00695 #define getRT(x) (((x) & RTmask) >> 21)
00696 #define getRAByMask(x) (((x) & RAmask) >> 16)
00697 #define getRB(x) (((x) & RBmask) >> 11)
00698 #define getDinD(x) ((x) & DinDmask)
00699 #define getDinDS(x) ((x) & DinDSmask)
00700 
00701 // -------------------------------------------------------------------
00702 
00703 /* mask bits for various parts of the more common instruction format */
00704 #define OPmask      0xfc000000              /* most sig. 6 bits */
00705 #define AAmask      0x00000002      /* absolutate address */
00706 #define LLmask      0x00000001      /* set linkage register */
00707 #define AALKmask    AAmask|LLmask       /* AA | LK bits */
00708 #define FULLmask    0xffffffff
00709 
00710 #define Bmask       OPmask | AAmask
00711 #define Bmatch      0x48000000 /* pc relative unconditional branch */
00712 #define BCmatch     0x40000000 /* pc relative conditional branch */
00713 #define BAAmatch        0x48000002 /* pc relative unconditional branch */
00714 #define BCAAmatch       0x40000002 /* pc relative conditional branch */
00715 
00716 
00717 
00718 #define BREAK_POINT_INSN 0x7d821008  /* trap */
00719 // #define BREAK_POINT_INSN 0x7fe00008  -- this form should also work and
00720 // follows the recommended form outlined in the AIX manual
00721 
00722 #define SPIN_WAIT_INSN 0x48000000 /* VxWorks Trap - Can't perform a trap there. */
00723 
00724 /* high and low half words.  Useful to load addresses as two parts */
00725 #define LOW(x)  ((x) & 0xffff)
00726 #define HIGH(x) (((x) >> 16) & 0xffff)
00727 // HA: adjusted hi value compensating for LOW(x) being sign extended
00728 #define HA(x)   ((((x) >> 16) + (((x) & 0x8000) ? 1 : 0)) & 0xffff)
00729 
00730 /* high and low half words for top and bottom words.  Useful to load
00731  * addresses in four parts.
00732  */
00733 #define TOP_HI(x) (((x) >> 48))          // Can't think of a way to do this on
00734 #define TOP_LO(x) (((x) >> 32) & 0xFFFF) // 32-bit compilers without warnings.
00735 #define BOT_HI(x) (((x) >> 16) & 0xFFFF)
00736 #define BOT_LO(x) (((x)      ) & 0xFFFF)
00737 
00738 #define ABS(x)      ((x) > 0 ? x : -x)
00739 //#define MAX_BRANCH    0x1<<23
00740 #define MAX_BRANCH      0x01fffffc
00741 #define MAX_CBRANCH 0x1<<13
00742 
00743 #define MAX_IMM     0x1<<15     /* 15 plus sign == 16 bits */
00744 
00745 // Delcared some other functions in inst-power.C
00746 // bool isCallInsn(const instruction);
00747 // bool isReturnInsn(const image *, Address, bool&);
00748 
00749 // Define bounds for immediate offsets.
00750 // Use strange definitions to avoid compiler warnings.
00751 #define MAX_IMM16      32767
00752 #define MIN_IMM16      -32768
00753 
00754 #define MAX_IMM32      2147483647
00755 #define MIN_IMM32      (-2147483647 - 1)    // In C90, there are no negative
00756                                             // constants. Only negated positive
00757                                             // constants. Hopefully, compiler
00758                                             // will optimize this away.
00759 
00760 #define MAX_IMM48      ((long)(-1 >> 17))   // To avoid warnings on 32-bit
00761 #define MIN_IMM48      ((long)(~MAX_IMM48)) // compilers.
00762 
00763 // Helps to mitigate host/target endian mismatches
00764 unsigned int swapBytesIfNeeded(unsigned int i);
00765 
00766 ///////////////////////////////////////////////////////
00767 // Bum bum bum.....
00768 ///////////////////////////////////////////////////////
00769 
00770 class instruction {
00771  private:
00772     instructUnion insn_;
00773 
00774  public:
00775     instruction() { insn_.raw = 0; }
00776     instruction(unsigned int raw) {
00777         // Don't flip bits here.  Input is already in host byte order.
00778         insn_.raw = raw;
00779     }
00780     // Pointer creation method
00781     instruction(const void *ptr) {
00782       insn_ = *((instructUnion *)ptr);
00783     }
00784 
00785     instruction(const instruction &insn) :        insn_(insn.insn_) {};
00786     instruction(instructUnion &insn) :
00787         insn_(insn) {};
00788 
00789     instruction *copy() const;
00790 
00791     void clear() { insn_.raw = 0; }
00792     void setInstruction(codeBuf_t *ptr, Address = 0);
00793     void setBits(unsigned int pos, unsigned int len, unsigned int value) {
00794         unsigned int mask;
00795 
00796         mask = ~(~0 << len);
00797         value = value & mask;
00798 
00799         mask = ~(mask << pos);
00800         value = value << pos;
00801 
00802         insn_.raw = insn_.raw & mask;
00803         insn_.raw = insn_.raw | value;
00804     }
00805     unsigned int asInt() const { return insn_.raw; }
00806     void setInstruction(unsigned char *ptr, Address = 0);
00807     
00808 
00809     // To solve host/target endian mismatches
00810     static int signExtend(unsigned int i, unsigned int pos);
00811     static instructUnion &swapBytes(instructUnion &i);
00812 
00813     // We need instruction::size() all _over_ the place.
00814     static unsigned size() { return sizeof(instructUnion); } 
00815 
00816     Address getBranchOffset() const;
00817     void setBranchOffset(Address newOffset);
00818 
00819     // And tell us how much space we'll need...
00820     // Returns -1 if we can't do a branch due to architecture limitations
00821     static unsigned jumpSize(Address from, Address to, unsigned addr_width);
00822     static unsigned jumpSize(Address disp, unsigned addr_width);
00823     static unsigned maxJumpSize(unsigned addr_width);
00824 
00825     static unsigned maxInterFunctionJumpSize(unsigned addr_width);
00826 
00827     // return the type of the instruction
00828     unsigned type() const;
00829     
00830     // return a pointer to the instruction
00831     const unsigned char *ptr() const { return (const unsigned char *)&insn_; }
00832 
00833     // For external modification
00834     // Don't allow external modification anymore.  Host byte order may differ
00835     // from target byte order.
00836     //instructUnion &operator* () { return insn_; }
00837     //const instructUnion &operator* () const { return insn_; }
00838     //const unsigned int &raw() const { return insn_.raw; }
00839 
00840     unsigned opcode() const;
00841     
00842     // Local version
00843     bool isInsnType(const unsigned mask, const unsigned match) const { 
00844         return ((insn_.raw & mask) == match);
00845     }
00846     
00847     Address getTarget(Address insnAddr) const;
00848     
00849     unsigned spaceToRelocate() const;
00850     bool getUsedRegs(pdvector<int> &regs);
00851     
00852     
00853     /* -- CHECK !!!!!
00854      * catch small ints that are invalid instructions
00855      * opcode 0 is really reserved, not illegal (with the exception of all 0's).
00856      *
00857      * opcodes 1, 4-6, 56-57, 60-61 are illegal.
00858      *
00859      * opcodes 2, 30, 58, 62 are illegal in 32 bit implementations, but are
00860      *    defined in 64 bit implementations.
00861      *
00862      * opcodes 19, 30, 31, 59, 62, 63 contain extended op codes that are unused.
00863      */
00864     
00865     bool valid() const { return IFORM_OP(*this) > 0; }
00866     
00867     bool isCall() const;
00868     
00869     static bool isAligned(Address addr) {
00870         return !(addr & 0x3);
00871     }
00872     
00873     bool isCondBranch() const;
00874     bool isUncondBranch() const;
00875     bool isThunk() const;
00876 
00877 
00878   bool isCleaningRet() const {return false; }
00879 
00880 };
00881 
00882 } // arch_power namespace
00883 #endif
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

Generated on 12 Jul 2013 for SymtabAPI by  doxygen 1.6.1