1 2 /*---------------------------------------------------------------*/ 3 /*--- begin host_tilegx_defs.h ---*/ 4 /*---------------------------------------------------------------*/ 5 6 /* 7 This file is part of Valgrind, a dynamic binary instrumentation 8 framework. 9 10 Copyright (C) 2010-2015 Tilera Corp. 11 12 This program is free software; you can redistribute it and/or 13 modify it under the terms of the GNU General Public License as 14 published by the Free Software Foundation; either version 2 of the 15 License, or (at your option) any later version. 16 17 This program is distributed in the hope that it will be useful, but 18 WITHOUT ANY WARRANTY; without even the implied warranty of 19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20 General Public License for more details. 21 22 You should have received a copy of the GNU General Public License 23 along with this program; if not, write to the Free Software 24 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 25 02111-1307, USA. 26 27 The GNU General Public License is contained in the file COPYING. 28 */ 29 30 /* Contributed by Zhi-Gang Liu <zliu at tilera dot com> */ 31 32 #ifndef __VEX_HOST_TILEGX_DEFS_H 33 #define __VEX_HOST_TILEGX_DEFS_H 34 35 #include "tilegx_disasm.h" 36 37 /* Num registers used for function calls */ 38 #define TILEGX_N_REGPARMS 10 39 40 /* --------- Registers. --------- */ 41 42 /* The usual HReg abstraction. 43 There are 56 general purpose regs. 44 */ 45 46 #define ST_IN static inline 47 48 ST_IN HReg hregTILEGX_R30 ( void ) { return mkHReg(False, HRcInt64, 30, 0); } 49 ST_IN HReg hregTILEGX_R31 ( void ) { return mkHReg(False, HRcInt64, 31, 1); } 50 ST_IN HReg hregTILEGX_R32 ( void ) { return mkHReg(False, HRcInt64, 32, 2); } 51 ST_IN HReg hregTILEGX_R33 ( void ) { return mkHReg(False, HRcInt64, 33, 3); } 52 ST_IN HReg hregTILEGX_R34 ( void ) { return mkHReg(False, HRcInt64, 34, 4); } 53 ST_IN HReg hregTILEGX_R35 ( void ) { return mkHReg(False, HRcInt64, 35, 5); } 54 ST_IN HReg hregTILEGX_R36 ( void ) { return mkHReg(False, HRcInt64, 36, 6); } 55 ST_IN HReg hregTILEGX_R37 ( void ) { return mkHReg(False, HRcInt64, 37, 7); } 56 ST_IN HReg hregTILEGX_R38 ( void ) { return mkHReg(False, HRcInt64, 38, 8); } 57 ST_IN HReg hregTILEGX_R39 ( void ) { return mkHReg(False, HRcInt64, 39, 9); } 58 59 ST_IN HReg hregTILEGX_R40 ( void ) { return mkHReg(False, HRcInt64, 40, 10); } 60 ST_IN HReg hregTILEGX_R41 ( void ) { return mkHReg(False, HRcInt64, 41, 11); } 61 ST_IN HReg hregTILEGX_R42 ( void ) { return mkHReg(False, HRcInt64, 42, 12); } 62 ST_IN HReg hregTILEGX_R43 ( void ) { return mkHReg(False, HRcInt64, 43, 13); } 63 ST_IN HReg hregTILEGX_R44 ( void ) { return mkHReg(False, HRcInt64, 44, 14); } 64 ST_IN HReg hregTILEGX_R45 ( void ) { return mkHReg(False, HRcInt64, 45, 15); } 65 ST_IN HReg hregTILEGX_R46 ( void ) { return mkHReg(False, HRcInt64, 46, 16); } 66 ST_IN HReg hregTILEGX_R47 ( void ) { return mkHReg(False, HRcInt64, 47, 17); } 67 ST_IN HReg hregTILEGX_R48 ( void ) { return mkHReg(False, HRcInt64, 48, 18); } 68 ST_IN HReg hregTILEGX_R49 ( void ) { return mkHReg(False, HRcInt64, 49, 19); } 69 70 ST_IN HReg hregTILEGX_R10 ( void ) { return mkHReg(False, HRcInt64, 10, 20); } 71 ST_IN HReg hregTILEGX_R13 ( void ) { return mkHReg(False, HRcInt64, 13, 21); } 72 ST_IN HReg hregTILEGX_R14 ( void ) { return mkHReg(False, HRcInt64, 14, 22); } 73 ST_IN HReg hregTILEGX_R15 ( void ) { return mkHReg(False, HRcInt64, 15, 23); } 74 ST_IN HReg hregTILEGX_R16 ( void ) { return mkHReg(False, HRcInt64, 16, 24); } 75 ST_IN HReg hregTILEGX_R17 ( void ) { return mkHReg(False, HRcInt64, 17, 25); } 76 ST_IN HReg hregTILEGX_R18 ( void ) { return mkHReg(False, HRcInt64, 18, 26); } 77 ST_IN HReg hregTILEGX_R19 ( void ) { return mkHReg(False, HRcInt64, 19, 27); } 78 ST_IN HReg hregTILEGX_R20 ( void ) { return mkHReg(False, HRcInt64, 20, 28); } 79 80 ST_IN HReg hregTILEGX_R21 ( void ) { return mkHReg(False, HRcInt64, 21, 29); } 81 ST_IN HReg hregTILEGX_R22 ( void ) { return mkHReg(False, HRcInt64, 22, 30); } 82 ST_IN HReg hregTILEGX_R23 ( void ) { return mkHReg(False, HRcInt64, 23, 31); } 83 ST_IN HReg hregTILEGX_R24 ( void ) { return mkHReg(False, HRcInt64, 24, 32); } 84 ST_IN HReg hregTILEGX_R25 ( void ) { return mkHReg(False, HRcInt64, 25, 33); } 85 ST_IN HReg hregTILEGX_R26 ( void ) { return mkHReg(False, HRcInt64, 26, 34); } 86 ST_IN HReg hregTILEGX_R27 ( void ) { return mkHReg(False, HRcInt64, 27, 35); } 87 ST_IN HReg hregTILEGX_R28 ( void ) { return mkHReg(False, HRcInt64, 28, 36); } 88 ST_IN HReg hregTILEGX_R29 ( void ) { return mkHReg(False, HRcInt64, 29, 37); } 89 90 ST_IN HReg hregTILEGX_R0 ( void ) { return mkHReg(False, HRcInt64, 0, 38); } 91 ST_IN HReg hregTILEGX_R1 ( void ) { return mkHReg(False, HRcInt64, 1, 39); } 92 ST_IN HReg hregTILEGX_R2 ( void ) { return mkHReg(False, HRcInt64, 2, 40); } 93 ST_IN HReg hregTILEGX_R3 ( void ) { return mkHReg(False, HRcInt64, 3, 41); } 94 ST_IN HReg hregTILEGX_R4 ( void ) { return mkHReg(False, HRcInt64, 4, 42); } 95 ST_IN HReg hregTILEGX_R5 ( void ) { return mkHReg(False, HRcInt64, 5, 43); } 96 ST_IN HReg hregTILEGX_R6 ( void ) { return mkHReg(False, HRcInt64, 6, 44); } 97 ST_IN HReg hregTILEGX_R7 ( void ) { return mkHReg(False, HRcInt64, 7, 45); } 98 ST_IN HReg hregTILEGX_R8 ( void ) { return mkHReg(False, HRcInt64, 8, 46); } 99 ST_IN HReg hregTILEGX_R9 ( void ) { return mkHReg(False, HRcInt64, 9, 47); } 100 101 ST_IN HReg hregTILEGX_R11 ( void ) { return mkHReg(False, HRcInt64, 11, 48); } 102 ST_IN HReg hregTILEGX_R12 ( void ) { return mkHReg(False, HRcInt64, 12, 49); } 103 ST_IN HReg hregTILEGX_R50 ( void ) { return mkHReg(False, HRcInt64, 50, 50); } 104 ST_IN HReg hregTILEGX_R51 ( void ) { return mkHReg(False, HRcInt64, 51, 51); } 105 ST_IN HReg hregTILEGX_R52 ( void ) { return mkHReg(False, HRcInt64, 52, 52); } 106 ST_IN HReg hregTILEGX_R53 ( void ) { return mkHReg(False, HRcInt64, 53, 53); } 107 ST_IN HReg hregTILEGX_R54 ( void ) { return mkHReg(False, HRcInt64, 54, 54); } 108 ST_IN HReg hregTILEGX_R55 ( void ) { return mkHReg(False, HRcInt64, 55, 55); } 109 ST_IN HReg hregTILEGX_R63 ( void ) { return mkHReg(False, HRcInt64, 63, 56); } 110 111 extern void ppHRegTILEGX ( HReg ); 112 113 #define TILEGXGuestStatePointer() hregTILEGX_R50() 114 #define TILEGXStackFramePointer() hregTILEGX_R52() 115 #define TILEGXLinkRegister() hregTILEGX_R55() 116 #define TILEGXStackPointer() hregTILEGX_R54() 117 118 /* r0, r1, r2, r3 ... r9 */ 119 #define TILEGX_N_ARGREGS 10 120 121 /* --------- Condition codes, Tilegx encoding. --------- */ 122 typedef enum { 123 TILEGXcc_EQ = 0, /* equal */ 124 TILEGXcc_NE = 1, /* not equal */ 125 TILEGXcc_HS = 2, /* >=u (higher or same) */ 126 TILEGXcc_LO = 3, /* <u (lower) */ 127 TILEGXcc_MI = 4, /* minus (negative) */ 128 TILEGXcc_PL = 5, /* plus (zero or +ve) */ 129 TILEGXcc_VS = 6, /* overflow */ 130 TILEGXcc_VC = 7, /* no overflow */ 131 TILEGXcc_HI = 8, /* >u (higher) */ 132 TILEGXcc_LS = 9, /* <=u (lower or same) */ 133 TILEGXcc_GE = 10, /* >=s (signed greater or equal) */ 134 TILEGXcc_LT = 11, /* <s (signed less than) */ 135 TILEGXcc_GT = 12, /* >s (signed greater) */ 136 TILEGXcc_LE = 13, /* <=s (signed less or equal) */ 137 TILEGXcc_AL = 14, /* always (unconditional) */ 138 TILEGXcc_NV = 15, /* never (unconditional): */ 139 TILEGXcc_EQ8x8 = 16,/* V1 equal */ 140 TILEGXcc_NE8x8 = 17,/* V1 not equal */ 141 TILEGXcc_EZ = 18, /* equal 0 */ 142 TILEGXcc_NZ = 19, /* not equal */ 143 144 } TILEGXCondCode; 145 146 /* --------- Memory address expressions (amodes). --------- */ 147 typedef enum { 148 GXam_IR, /* Immediate (signed 16-bit) + Reg */ 149 } TILEGXAModeTag; 150 151 typedef struct { 152 TILEGXAModeTag tag; 153 union { 154 struct { 155 HReg base; 156 Int index; 157 } IR; 158 struct { 159 HReg base; 160 HReg index; 161 } RR; 162 } GXam; 163 } TILEGXAMode; 164 165 extern TILEGXAMode *TILEGXAMode_IR ( Int, HReg ); 166 extern TILEGXAMode *TILEGXAMode_RR ( HReg, HReg ); 167 extern TILEGXAMode *dopyTILEGXAMode ( TILEGXAMode * ); 168 extern TILEGXAMode *nextTILEGXAModeFloat ( TILEGXAMode * ); 169 extern TILEGXAMode *nextTILEGXAModeInt ( TILEGXAMode * ); 170 extern void ppTILEGXAMode ( const TILEGXAMode * ); 171 172 /* --------- Operand, which can be a reg or a u16/s16. --------- */ 173 /* ("RH" == "Register or Halfword immediate") */ 174 typedef enum { 175 GXrh_Imm, 176 GXrh_Reg 177 } TILEGXRHTag; 178 179 typedef struct { 180 TILEGXRHTag tag; 181 union { 182 struct { 183 Bool syned; 184 UShort imm16; 185 } Imm; 186 struct { 187 HReg reg; 188 } Reg; 189 } GXrh; 190 } TILEGXRH; 191 192 extern void ppTILEGXRH ( const TILEGXRH * ); 193 extern TILEGXRH *TILEGXRH_Imm ( Bool, UShort ); 194 extern TILEGXRH *TILEGXRH_Reg ( HReg ); 195 196 /* --------- Reg or imm5 operands --------- */ 197 typedef enum { 198 TILEGXri5_I5 = 7, /* imm5, 1 .. 31 only (no zero!) */ 199 TILEGXri5_R /* reg */ 200 } TILEGXRI5Tag; 201 202 typedef struct { 203 TILEGXRI5Tag tag; 204 union { 205 struct { 206 UInt imm5; 207 } I5; 208 struct { 209 HReg reg; 210 } R; 211 } TILEGXri5; 212 } TILEGXRI5; 213 214 extern TILEGXRI5 *TILEGXRI5_I5 ( UInt imm5 ); 215 extern TILEGXRI5 *TILEGXRI5_R ( HReg ); 216 217 extern void ppTILEGXRI5 ( const TILEGXRI5 * ); 218 219 /* --------- Instructions. --------- */ 220 221 /*Tags for operations*/ 222 223 /* --------- */ 224 typedef enum { 225 GXun_CLZ, 226 GXun_CTZ, 227 GXun_NOP, 228 } TILEGXUnaryOp; 229 230 /* --------- */ 231 232 typedef enum { 233 GXalu_INVALID, 234 GXalu_ADD, 235 GXalu_SUB, 236 GXalu_AND, 237 GXalu_OR, 238 GXalu_NOR, 239 GXalu_XOR, 240 } TILEGXAluOp; 241 242 /* --------- */ 243 244 typedef enum { 245 GXshft_INVALID, 246 GXshft_SLL, 247 GXshft_SRL, 248 GXshft_SRA, 249 GXshft_SLL8x8, 250 GXshft_SRL8x8, 251 252 } TILEGXShftOp; 253 254 255 /* --------- */ 256 typedef enum { 257 GXbf_EXTS, 258 GXbf_EXTU, 259 GXbf_INS 260 } TILEGXBfOp; 261 262 /* --------- */ 263 264 265 /* --------- */ 266 typedef enum { 267 GXacas_CMPEXCH, 268 GXacas_EXCH, 269 GXacas_FetchAnd, 270 GXacas_FetchAdd, 271 GXacas_FetchAddgez, 272 GXacas_FetchOr, 273 } TILEGXAcasOp; 274 275 /* --------- */ 276 277 /* ----- Instruction tags ----- */ 278 typedef enum { 279 GXin_LI, /* load word (32/64-bit) immediate (fake insn) */ 280 GXin_Alu, /* word add/sub/and/or/xor/nor/others? */ 281 GXin_Shft, /* word sll/srl/sra */ 282 GXin_Unary, /* clo, clz, nop, neg */ 283 284 GXin_Cmp, /* word compare (fake insn) */ 285 GXin_CmpI, 286 287 GXin_Mul, /* widening/non-widening multiply */ 288 289 GXin_Call, /* call to address in register */ 290 291 GXin_XDirect, /* direct transfer to GA */ 292 GXin_XIndir, /* indirect transfer to GA */ 293 GXin_XAssisted, /* assisted transfer to GA */ 294 GXin_EvCheck, /* Event check */ 295 GXin_ProfInc, /* 64-bit profile counter increment */ 296 297 GXin_RdWrLR, /* Read/Write Link Register */ 298 299 GXin_Load, /* zero-extending load a 8|16|32|64 bit value from mem */ 300 GXin_Store, /* store a 8|16|32|64 bit value to mem */ 301 302 GXin_MovCond, 303 GXin_Bf, /* Bitfield operations */ 304 GXin_Acas, /* Atomic Campare and swap. */ 305 306 } TILEGXInstrTag; 307 308 /*--------- Structure for instructions ----------*/ 309 /* Destinations are on the LEFT (first operand) */ 310 311 typedef struct { 312 TILEGXInstrTag tag; 313 union { 314 /* Get a 32/64-bit literal into a register. 315 May turn into a number of real insns. */ 316 struct { 317 HReg dst; 318 ULong imm; 319 } LI; 320 /* Integer add/sub/and/or/xor. Limitations: 321 - For add, the immediate, if it exists, is a signed 16. 322 - For sub, the immediate, if it exists, is a signed 16 323 which may not be -32768, since no such instruction 324 exists, and so we have to emit addi with +32768, but 325 that is not possible. 326 - For and/or/xor, the immediate, if it exists, 327 is an unsigned 16. 328 */ 329 struct { 330 TILEGXAluOp op; 331 HReg dst; 332 HReg srcL; 333 TILEGXRH *srcR; 334 } Alu; 335 336 struct { 337 TILEGXBfOp op; 338 HReg dst; 339 HReg src; 340 UInt Start; 341 UInt End; 342 } Bf; 343 344 struct { 345 TILEGXAcasOp op; 346 HReg addr; 347 HReg exp; 348 HReg new; 349 HReg old; 350 UInt sz; 351 } Acas; 352 353 /* Integer shl/shr/sar. 354 Limitations: the immediate, if it exists, 355 is a signed 5-bit value between 1 and 31 inclusive. 356 */ 357 struct { 358 TILEGXShftOp op; 359 Bool sz32; 360 HReg dst; 361 HReg srcL; 362 TILEGXRH *srcR; 363 } Shft; 364 /* Clz, Ctz, Clo, nop */ 365 struct { 366 TILEGXUnaryOp op; 367 HReg dst; 368 HReg src; 369 } Unary; 370 /* Word compare. Fake instruction, used for basic block ending */ 371 struct { 372 Bool syned; 373 Bool sz32; 374 HReg dst; 375 HReg srcL; 376 HReg srcR; 377 TILEGXCondCode cond; 378 } Cmp; 379 struct { 380 Bool syned; 381 Bool sz32; 382 HReg dst; 383 HReg srcL; 384 TILEGXRH *srcR; 385 TILEGXCondCode cond; 386 } CmpI; 387 struct { 388 Bool widening; //True => widening, False => non-widening 389 Bool syned; //signed/unsigned - meaningless if widenind = False 390 Bool sz32; 391 HReg dst; 392 HReg srcL; 393 HReg srcR; 394 } Mul; 395 /* Pseudo-insn. Call target (an absolute address), on given 396 condition (which could be Mcc_ALWAYS). argiregs indicates 397 which of r0 .. r9 398 carries argument values for this call, 399 using a bit mask (1<<N is set if rN holds an arg, for N in 400 0 .. 9 inclusive). 401 If cond is != Mcc_ALWAYS, src is checked. 402 Otherwise, unconditional call */ 403 struct { 404 TILEGXCondCode cond; 405 Addr64 target; 406 ULong argiregs; 407 HReg src; 408 RetLoc rloc; /* where the return value saved. */ 409 } Call; 410 411 /* Update the guest IP value, then exit requesting to chain 412 to it. May be conditional. Urr, use of Addr32 implicitly 413 assumes that wordsize(guest) == wordsize(host). */ 414 struct { 415 Addr64 dstGA; /* next guest address */ 416 TILEGXAMode* amPC; /* amode in guest state for PC */ 417 TILEGXCondCode cond; /* can be TILEGXcc_AL */ 418 Bool toFastEP; /* chain to the slow or fast point? */ 419 } XDirect; 420 421 /* Boring transfer to a guest address not known at JIT time. 422 Not chainable. May be conditional. */ 423 struct { 424 HReg dstGA; 425 TILEGXAMode* amPC; 426 TILEGXCondCode cond; /* can be TILEGXcc_AL */ 427 } XIndir; 428 429 /* Assisted transfer to a guest address, most general case. 430 Not chainable. May be conditional. */ 431 struct { 432 HReg dstGA; 433 TILEGXAMode* amPC; 434 TILEGXCondCode cond; /* can be TILEGXcc_AL */ 435 IRJumpKind jk; 436 } XAssisted; 437 438 struct { 439 TILEGXAMode* amCounter; 440 TILEGXAMode* amFailAddr; 441 } EvCheck; 442 443 struct { 444 /* No fields. The address of the counter to inc is 445 installed later, post-translation, by patching it in, 446 as it is not known at translation time. */ 447 } ProfInc; 448 /* Zero extending loads. Dst size is host word size */ 449 struct { 450 UChar sz; /* 1|2|4|8 */ 451 HReg dst; 452 TILEGXAMode *src; 453 } Load; 454 /* 64/32/16/8 bit stores */ 455 struct { 456 UChar sz; /* 1|2|4|8 */ 457 TILEGXAMode *dst; 458 HReg src; 459 } Store; 460 /* Read/Write Link Register */ 461 struct { 462 Bool wrLR; 463 HReg gpr; 464 } RdWrLR; 465 struct { 466 HReg dst; 467 HReg srcL; 468 TILEGXRH *srcR; 469 HReg condR; 470 TILEGXCondCode cond; 471 } MovCond; 472 } GXin; 473 } TILEGXInstr; 474 extern TILEGXInstr *TILEGXInstr_LI ( HReg, ULong ); 475 extern TILEGXInstr *TILEGXInstr_Alu ( TILEGXAluOp, HReg, HReg, TILEGXRH * ); 476 extern TILEGXInstr *TILEGXInstr_Shft ( TILEGXShftOp, Bool sz32, HReg, HReg, 477 TILEGXRH * ); 478 extern TILEGXInstr *TILEGXInstr_Unary ( TILEGXUnaryOp op, HReg dst, HReg src ); 479 extern TILEGXInstr *TILEGXInstr_Cmp ( Bool, Bool, HReg, HReg, HReg, 480 TILEGXCondCode ); 481 extern TILEGXInstr *TILEGXInstr_CmpI ( Bool, Bool, HReg, HReg, TILEGXRH *, 482 TILEGXCondCode ); 483 extern TILEGXInstr *TILEGXInstr_Bf ( TILEGXBfOp op, HReg dst, HReg src, 484 UInt Start, UInt End ); 485 extern TILEGXInstr *TILEGXInstr_Acas ( TILEGXAcasOp op, HReg old, HReg addr, 486 HReg exp, HReg new, UInt sz ); 487 extern TILEGXInstr *TILEGXInstr_Mul ( Bool syned, Bool hi32, Bool sz32, HReg, 488 HReg, HReg ); 489 extern TILEGXInstr *TILEGXInstr_Div ( Bool syned, Bool sz32, HReg, HReg ); 490 extern TILEGXInstr *TILEGXInstr_Madd ( Bool, HReg, HReg ); 491 extern TILEGXInstr *TILEGXInstr_Msub ( Bool, HReg, HReg ); 492 493 extern TILEGXInstr *TILEGXInstr_Load ( UChar sz, HReg dst, TILEGXAMode * src ); 494 495 extern TILEGXInstr *TILEGXInstr_Store ( UChar sz, TILEGXAMode * dst, HReg src ); 496 497 extern TILEGXInstr *TILEGXInstr_LoadL ( UChar sz, HReg dst, TILEGXAMode * src ); 498 499 extern TILEGXInstr *TILEGXInstr_StoreC ( UChar sz, TILEGXAMode * dst, HReg src ); 500 501 extern TILEGXInstr *TILEGXInstr_Call ( TILEGXCondCode, Addr64, ULong, HReg ); 502 extern TILEGXInstr *TILEGXInstr_CallAlways ( TILEGXCondCode, Addr64, ULong ); 503 extern TILEGXInstr *TILEGXInstr_XDirect ( Addr64 dstGA, TILEGXAMode* amPC, 504 TILEGXCondCode cond, Bool toFastEP ); 505 extern TILEGXInstr *TILEGXInstr_XIndir ( HReg dstGA, TILEGXAMode* amPC, 506 TILEGXCondCode cond ); 507 extern TILEGXInstr *TILEGXInstr_XAssisted ( HReg dstGA, TILEGXAMode* amPC, 508 TILEGXCondCode cond, IRJumpKind jk ); 509 extern TILEGXInstr *TILEGXInstr_EvCheck ( TILEGXAMode* amCounter, 510 TILEGXAMode* amFailAddr ); 511 extern TILEGXInstr* TILEGXInstr_ProfInc (void); 512 513 extern TILEGXInstr *TILEGXInstr_Goto ( IRJumpKind, TILEGXCondCode, 514 TILEGXRH * dst, HReg ); 515 extern TILEGXInstr *TILEGXInstr_GotoAlways ( IRJumpKind, TILEGXRH * ); 516 extern TILEGXInstr *TILEGXInstr_RdWrLR ( Bool wrLR, HReg gpr ); 517 extern TILEGXInstr *TILEGXInstr_MovCond ( HReg dst, HReg srcL, TILEGXRH * src, 518 HReg condR, TILEGXCondCode cond ); 519 extern void ppTILEGXInstr ( const TILEGXInstr * ); 520 521 /* Some functions that insulate the register allocator from details 522 of the underlying instruction set. */ 523 extern void getRegUsage_TILEGXInstr ( HRegUsage *, TILEGXInstr *); 524 extern void mapRegs_TILEGXInstr ( HRegRemap *, TILEGXInstr *); 525 extern Bool isMove_TILEGXInstr ( TILEGXInstr *, HReg *, HReg * ); 526 extern Int emit_TILEGXInstr ( Bool*, UChar*, Int, TILEGXInstr*, Bool, VexEndness, 527 void*, void*, void*, void* ); 528 extern void genSpill_TILEGX ( /*OUT*/ HInstr ** i1, /*OUT*/ HInstr ** i2, 529 HReg rreg, Int offset ); 530 extern void genReload_TILEGX ( /*OUT*/ HInstr ** i1, /*OUT*/ HInstr ** i2, 531 HReg rreg, Int offset ); 532 533 extern const RRegUniverse* getRRegUniverse_TILEGX ( void ); 534 535 extern HInstrArray *iselSB_TILEGX ( const IRSB*, VexArch, 536 const VexArchInfo*, 537 const VexAbiInfo*, 538 Int, Int, Bool, Bool, Addr); 539 extern const HChar *showTILEGXCondCode ( TILEGXCondCode cond ); 540 extern Int evCheckSzB_TILEGX (void); 541 extern VexInvalRange chainXDirect_TILEGX ( VexEndness endness_host, 542 void* place_to_chain, 543 const void* disp_cp_chain_me_EXPECTED, 544 const void* place_to_jump_to, 545 Bool mode64 ); 546 extern VexInvalRange unchainXDirect_TILEGX ( VexEndness endness_host, 547 void* place_to_unchain, 548 const void* place_to_jump_to_EXPECTED, 549 const void* disp_cp_chain_me, 550 Bool mode64 ); 551 extern VexInvalRange patchProfInc_TILEGX ( VexEndness endness_host, 552 void* place_to_patch, 553 const ULong* location_of_counter, 554 Bool mode64 ); 555 556 extern Int decode_and_display ( tilegx_bundle_bits *p, Int count, ULong pc ); 557 558 #endif /* __LIBVEX_HOST_TILEGX_HDEFS_H */ 559 560 /*---------------------------------------------------------------*/ 561 /*--- end host-tilegx_defs.h ---*/ 562 /*---------------------------------------------------------------*/ 563