00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef _ARCH_POWER_H
00034 #define _ARCH_POWER_H
00035
00036
00037
00038 #include "common/h/Types.h"
00039 #include "common/h/Vector.h"
00040 class AddressSpace;
00041
00042 namespace NS_power {
00043
00044
00045
00046
00047
00048
00049
00050
00051
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
00060
00061
00062
00063
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
00077
00078
00079
00080
00081
00082
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
00100
00101
00102
00103
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
00120
00121
00122
00123
00124
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
00140
00141
00142
00143
00144
00145
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
00162
00163
00164
00165
00166
00167
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
00184
00185
00186
00187
00188
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
00203
00204
00205
00206
00207
00208
00209
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
00228
00229
00230
00231
00232
00233
00234
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
00253
00254
00255
00256
00257
00258
00259
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
00278
00279
00280
00281
00282
00283
00284
00285
00286
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
00309
00310
00311
00312
00313
00314
00315
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
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346 unsigned char byte[4];
00347 unsigned int raw;
00348 } instructUnion;
00349
00350
00351
00352
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
00363
00364 #define maxFPR 32
00365 #define maxGPR 32
00366 #define FPRspaceUsed (8*16)
00367 #define GPRoffset(reg) (-1* (FPRspaceUsed + 4*(maxGPR-reg)))
00368 #define GPRspaceUsed (20*4)
00369
00370 #define stackFrameSize (FPRspaceUsed+GPRspaceUsed+128)
00371
00372
00373
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
00383 #define Bop 18
00384
00385
00386 #define TIop 3
00387 #define MULIop 7
00388 #define SFIop 8
00389 #define DOZIop 9
00390 #define CMPLIop 10
00391 #define CMPIop 11
00392 #define SIop 12
00393 #define AIDOTop 13
00394 #define CALop 14
00395 #define CAUop 15
00396 #define ORILop 24
00397 #define ORIUop 25
00398 #define XORILop 26
00399 #define XORIUop 27
00400 #define ANDILop 28
00401 #define ANDIUop 29
00402 #define RLDop 30
00403 #define Lop 32
00404 #define LUop 33
00405 #define LBZop 34
00406 #define LBZUop 35
00407 #define STop 36
00408 #define STUop 37
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
00422 #define LFDUop 51
00423 #define STFSop 52
00424 #define STFSUop 53
00425 #define STFDop 54
00426 #define STFDUop 55
00427
00428
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
00438 #define BCop 16
00439
00440
00441 #define RLDop 30
00442 #define ICLxop 0 // Immediate and Clear Left
00443 #define ICRxop 1 // Immediate and Clear Right
00444
00445
00446
00447
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
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
00495 #define CMPop 31
00496 #define CMPxop 0
00497 #define ANDop 31
00498 #define ANDxop 28
00499 #define ORop 31
00500 #define ORxop 444
00501
00502
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
00588 #define BCLRop 19
00589 #define BCLRxop 16
00590 #define BCCTRop 19
00591 #define BCCTRxop 528
00592
00593
00594
00595
00596 #define SFop 31
00597 #define SFxop 8
00598 #define MULSop 31
00599 #define MULSxop 235
00600 #define CAXop 31
00601 #define CAXxop 266
00602 #define DIVSop 31
00603 #define DIVSxop 363
00604
00605
00606
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
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
00628
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
00642 #define SVCop 17
00643
00644
00645
00646 #define RLIMIop 20
00647 #define RLINMxop 21
00648
00649 #define RLMIop 22
00650 #define RLNMop 23
00651
00652 #define RLDICLop 30
00653
00654
00655
00656
00657 #define MTLR0raw 0x7c0803a6
00658 #define MFLR0raw 0x7c0802a6
00659 #define MTLR2raw 0x7c4803a6
00660 #define MFLR2raw 0x7c4802a6
00661 #define BCTRraw 0x4e800420
00662 #define BCTRLraw 0x4e800421
00663 #define BRraw 0x4e800020
00664 #define BRLraw 0x4e800021
00665 #define NOOPraw 0x60000000
00666
00667
00668
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
00683 #define LTcond 0
00684 #define GTcond 1
00685 #define EQcond 2
00686 #define SOcond 3
00687
00688
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
00704 #define OPmask 0xfc000000
00705 #define AAmask 0x00000002
00706 #define LLmask 0x00000001
00707 #define AALKmask AAmask|LLmask
00708 #define FULLmask 0xffffffff
00709
00710 #define Bmask OPmask | AAmask
00711 #define Bmatch 0x48000000
00712 #define BCmatch 0x40000000
00713 #define BAAmatch 0x48000002
00714 #define BCAAmatch 0x40000002
00715
00716
00717
00718 #define BREAK_POINT_INSN 0x7d821008
00719
00720
00721
00722 #define SPIN_WAIT_INSN 0x48000000
00723
00724
00725 #define LOW(x) ((x) & 0xffff)
00726 #define HIGH(x) (((x) >> 16) & 0xffff)
00727
00728 #define HA(x) ((((x) >> 16) + (((x) & 0x8000) ? 1 : 0)) & 0xffff)
00729
00730
00731
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
00740 #define MAX_BRANCH 0x01fffffc
00741 #define MAX_CBRANCH 0x1<<13
00742
00743 #define MAX_IMM 0x1<<15
00744
00745
00746
00747
00748
00749
00750
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
00757
00758
00759
00760 #define MAX_IMM48 ((long)(-1 >> 17)) // To avoid warnings on 32-bit
00761 #define MIN_IMM48 ((long)(~MAX_IMM48)) // compilers.
00762
00763
00764 unsigned int swapBytesIfNeeded(unsigned int i);
00765
00766
00767
00768
00769
00770 class instruction {
00771 private:
00772 instructUnion insn_;
00773
00774 public:
00775 instruction() { insn_.raw = 0; }
00776 instruction(unsigned int raw) {
00777
00778 insn_.raw = raw;
00779 }
00780
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
00810 static int signExtend(unsigned int i, unsigned int pos);
00811 static instructUnion &swapBytes(instructUnion &i);
00812
00813
00814 static unsigned size() { return sizeof(instructUnion); }
00815
00816 Address getBranchOffset() const;
00817 void setBranchOffset(Address newOffset);
00818
00819
00820
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
00828 unsigned type() const;
00829
00830
00831 const unsigned char *ptr() const { return (const unsigned char *)&insn_; }
00832
00833
00834
00835
00836
00837
00838
00839
00840 unsigned opcode() const;
00841
00842
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> ®s);
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
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 }
00883 #endif