blob: cf1b006eee78e2fc0da0d0abd089649de0a58249 [file] [log] [blame]
sewardja3e98302005-02-01 15:55:05 +00001
2/*---------------------------------------------------------------*/
3/*--- ---*/
4/*--- This file (host-amd64/hdefs.h) is ---*/
5/*--- Copyright (c) 2005 OpenWorks LLP. All rights reserved. ---*/
6/*--- ---*/
7/*---------------------------------------------------------------*/
8
9/*
10 This file is part of LibVEX, a library for dynamic binary
11 instrumentation and translation.
12
13 Copyright (C) 2004-2005 OpenWorks, LLP.
14
15 This program is free software; you can redistribute it and/or modify
16 it under the terms of the GNU General Public License as published by
17 the Free Software Foundation; Version 2 dated June 1991 of the
18 license.
19
20 This program is distributed in the hope that it will be useful,
21 but WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or liability
23 for damages. See the GNU General Public License for more details.
24
25 Neither the names of the U.S. Department of Energy nor the
26 University of California nor the names of its contributors may be
27 used to endorse or promote products derived from this software
28 without prior written permission.
29
30 You should have received a copy of the GNU General Public License
31 along with this program; if not, write to the Free Software
32 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
33 USA.
34*/
35
36#ifndef __LIBVEX_HOST_AMD64_HDEFS_H
37#define __LIBVEX_HOST_AMD64_HDEFS_H
38
sewardjc33671d2005-02-01 20:30:00 +000039
40/* --------- Registers. --------- */
41
42/* The usual HReg abstraction. There are 16 real int regs, 6 real
43 float regs, and 16 real vector regs.
44*/
45
46extern void ppHRegAMD64 ( HReg );
47
48extern HReg hregAMD64_RAX ( void );
49extern HReg hregAMD64_RBX ( void );
50extern HReg hregAMD64_RCX ( void );
51extern HReg hregAMD64_RDX ( void );
52extern HReg hregAMD64_RSP ( void );
53extern HReg hregAMD64_RBP ( void );
54extern HReg hregAMD64_RSI ( void );
55extern HReg hregAMD64_RDI ( void );
56extern HReg hregAMD64_R8 ( void );
57extern HReg hregAMD64_R9 ( void );
58extern HReg hregAMD64_R10 ( void );
59extern HReg hregAMD64_R11 ( void );
60extern HReg hregAMD64_R12 ( void );
61extern HReg hregAMD64_R13 ( void );
62extern HReg hregAMD64_R14 ( void );
63extern HReg hregAMD64_R15 ( void );
64
65extern HReg hregAMD64_FAKE0 ( void );
66extern HReg hregAMD64_FAKE1 ( void );
67extern HReg hregAMD64_FAKE2 ( void );
68extern HReg hregAMD64_FAKE3 ( void );
69extern HReg hregAMD64_FAKE4 ( void );
70extern HReg hregAMD64_FAKE5 ( void );
71
72extern HReg hregAMD64_XMM0 ( void );
73extern HReg hregAMD64_XMM1 ( void );
sewardj53df0612005-02-04 21:15:39 +000074extern HReg hregAMD64_XMM2 ( void );
sewardjc33671d2005-02-01 20:30:00 +000075extern HReg hregAMD64_XMM3 ( void );
76extern HReg hregAMD64_XMM4 ( void );
77extern HReg hregAMD64_XMM5 ( void );
78extern HReg hregAMD64_XMM6 ( void );
79extern HReg hregAMD64_XMM7 ( void );
80extern HReg hregAMD64_XMM8 ( void );
81extern HReg hregAMD64_XMM9 ( void );
82extern HReg hregAMD64_XMM10 ( void );
83extern HReg hregAMD64_XMM11 ( void );
84extern HReg hregAMD64_XMM12 ( void );
85extern HReg hregAMD64_XMM13 ( void );
86extern HReg hregAMD64_XMM14 ( void );
87extern HReg hregAMD64_XMM15 ( void );
88
89
90/* --------- Condition codes, AMD encoding. --------- */
91
92typedef
93 enum {
94 Acc_O = 0, /* overflow */
95 Acc_NO = 1, /* no overflow */
96
97 Acc_B = 2, /* below */
98 Acc_NB = 3, /* not below */
99
100 Acc_Z = 4, /* zero */
101 Acc_NZ = 5, /* not zero */
102
103 Acc_BE = 6, /* below or equal */
104 Acc_NBE = 7, /* not below or equal */
105
106 Acc_S = 8, /* negative */
107 Acc_NS = 9, /* not negative */
108
109 Acc_P = 10, /* parity even */
110 Acc_NP = 11, /* not parity even */
111
112 Acc_L = 12, /* jump less */
113 Acc_NL = 13, /* not less */
114
115 Acc_LE = 14, /* less or equal */
116 Acc_NLE = 15, /* not less or equal */
117
118 Acc_ALWAYS = 16 /* the usual hack */
119 }
120 AMD64CondCode;
121
122extern HChar* showAMD64CondCode ( AMD64CondCode );
123
124
125/* --------- Memory address expressions (amodes). --------- */
126
127typedef
128 enum {
129 Aam_IR, /* Immediate + Reg */
130 Aam_IRRS /* Immediate + Reg1 + (Reg2 << Shift) */
131 }
132 AMD64AModeTag;
133
134typedef
135 struct {
136 AMD64AModeTag tag;
137 union {
138 struct {
139 UInt imm;
140 HReg reg;
141 } IR;
142 struct {
143 UInt imm;
144 HReg base;
145 HReg index;
146 Int shift; /* 0, 1, 2 or 3 only */
147 } IRRS;
148 } Aam;
149 }
150 AMD64AMode;
151
152extern AMD64AMode* AMD64AMode_IR ( UInt, HReg );
153extern AMD64AMode* AMD64AMode_IRRS ( UInt, HReg, HReg, Int );
154
155extern AMD64AMode* dopyAMD64AMode ( AMD64AMode* );
156
157extern void ppAMD64AMode ( AMD64AMode* );
158
159
160/* --------- Operand, which can be reg, immediate or memory. --------- */
161
162typedef
163 enum {
164 Armi_Imm,
165 Armi_Reg,
166 Armi_Mem
167 }
168 AMD64RMITag;
169
170typedef
171 struct {
172 AMD64RMITag tag;
173 union {
174 struct {
175 UInt imm32;
176 } Imm;
177 struct {
178 HReg reg;
179 } Reg;
180 struct {
181 AMD64AMode* am;
182 } Mem;
183 }
184 Armi;
185 }
186 AMD64RMI;
187
188extern AMD64RMI* AMD64RMI_Imm ( UInt );
189extern AMD64RMI* AMD64RMI_Reg ( HReg );
190extern AMD64RMI* AMD64RMI_Mem ( AMD64AMode* );
191
192extern void ppAMD64RMI ( AMD64RMI* );
193
194
195/* --------- Operand, which can be reg or immediate only. --------- */
196
197typedef
198 enum {
199 Ari_Imm,
200 Ari_Reg
201 }
202 AMD64RITag;
203
204typedef
205 struct {
206 AMD64RITag tag;
207 union {
208 struct {
209 UInt imm32;
210 } Imm;
211 struct {
212 HReg reg;
213 } Reg;
214 }
215 Ari;
216 }
217 AMD64RI;
218
219extern AMD64RI* AMD64RI_Imm ( UInt );
220extern AMD64RI* AMD64RI_Reg ( HReg );
221
222extern void ppAMD64RI ( AMD64RI* );
223
224
225/* --------- Operand, which can be reg or memory only. --------- */
226
227typedef
228 enum {
229 Arm_Reg,
230 Arm_Mem
231 }
232 AMD64RMTag;
233
234typedef
235 struct {
236 AMD64RMTag tag;
237 union {
238 struct {
239 HReg reg;
240 } Reg;
241 struct {
242 AMD64AMode* am;
243 } Mem;
244 }
245 Arm;
246 }
247 AMD64RM;
248
249extern AMD64RM* AMD64RM_Reg ( HReg );
250extern AMD64RM* AMD64RM_Mem ( AMD64AMode* );
251
252extern void ppAMD64RM ( AMD64RM* );
253
254
sewardjd0a12df2005-02-10 02:07:43 +0000255/* --------- Instructions. --------- */
256
257/* --------- */
258typedef
259 enum {
260 Aun_NEG,
261 Aun_NOT
262 }
263 AMD64UnaryOp;
264
265extern HChar* showAMD64UnaryOp ( AMD64UnaryOp );
sewardj614b3fb2005-02-02 02:16:03 +0000266
267
268/* --------- */
269typedef
270 enum {
271 Aalu_INVALID,
272 Aalu_MOV,
273 Aalu_CMP,
274 Aalu_ADD, Aalu_SUB, Aalu_ADC, Aalu_SBB,
275 Aalu_AND, Aalu_OR, Aalu_XOR,
276 Aalu_MUL
277 }
278 AMD64AluOp;
279
280extern HChar* showAMD64AluOp ( AMD64AluOp );
281
282
sewardj8258a8c2005-02-02 03:11:24 +0000283/* --------- */
284typedef
285 enum {
286 Ash_INVALID,
287 Ash_SHL, Ash_SHR, Ash_SAR
288 }
289 AMD64ShiftOp;
290
291extern HChar* showAMD64ShiftOp ( AMD64ShiftOp );
292
293
sewardja3e98302005-02-01 15:55:05 +0000294//.. /* --------- */
295//.. typedef
296//.. enum {
297//.. Xfp_INVALID,
298//.. /* Binary */
299//.. Xfp_ADD, Xfp_SUB, Xfp_MUL, Xfp_DIV,
300//.. Xfp_SCALE, Xfp_ATAN, Xfp_YL2X, Xfp_YL2XP1, Xfp_PREM, Xfp_PREM1,
301//.. /* Unary */
302//.. Xfp_SQRT, Xfp_ABS, Xfp_NEG, Xfp_MOV, Xfp_SIN, Xfp_COS, Xfp_TAN,
303//.. Xfp_ROUND, Xfp_2XM1
304//.. }
305//.. X86FpOp;
306//..
307//.. extern HChar* showX86FpOp ( X86FpOp );
sewardj1001dc42005-02-21 08:25:55 +0000308
309
310/* --------- */
311typedef
312 enum {
313 Asse_INVALID,
314 /* mov */
315 Asse_MOV,
316 /* Floating point binary */
317 Asse_ADDF, Asse_SUBF, Asse_MULF, Asse_DIVF,
sewardj1a01e652005-02-23 11:39:21 +0000318 Asse_MAXF, Asse_MINF,
sewardj8d965312005-02-25 02:48:47 +0000319 Asse_CMPEQF, Asse_CMPLTF, Asse_CMPLEF, Asse_CMPUNF,
sewardj1001dc42005-02-21 08:25:55 +0000320 /* Floating point unary */
321 Asse_RCPF, Asse_RSQRTF, Asse_SQRTF,
322 /* Bitwise */
323 Asse_AND, Asse_OR, Asse_XOR, Asse_ANDN,
sewardja3e98302005-02-01 15:55:05 +0000324//.. /* Integer binary */
325//.. Xsse_ADD8, Xsse_ADD16, Xsse_ADD32, Xsse_ADD64,
326//.. Xsse_QADD8U, Xsse_QADD16U,
327//.. Xsse_QADD8S, Xsse_QADD16S,
328//.. Xsse_SUB8, Xsse_SUB16, Xsse_SUB32, Xsse_SUB64,
329//.. Xsse_QSUB8U, Xsse_QSUB16U,
330//.. Xsse_QSUB8S, Xsse_QSUB16S,
331//.. Xsse_MUL16,
332//.. Xsse_MULHI16U,
333//.. Xsse_MULHI16S,
334//.. Xsse_AVG8U, Xsse_AVG16U,
335//.. Xsse_MAX16S,
336//.. Xsse_MAX8U,
337//.. Xsse_MIN16S,
338//.. Xsse_MIN8U,
339//.. Xsse_CMPEQ8, Xsse_CMPEQ16, Xsse_CMPEQ32,
340//.. Xsse_CMPGT8S, Xsse_CMPGT16S, Xsse_CMPGT32S,
341//.. Xsse_SHL16, Xsse_SHL32, Xsse_SHL64,
342//.. Xsse_SHR16, Xsse_SHR32, Xsse_SHR64,
343//.. Xsse_SAR16, Xsse_SAR32,
344//.. Xsse_PACKSSD, Xsse_PACKSSW, Xsse_PACKUSW,
345//.. Xsse_UNPCKHB, Xsse_UNPCKHW, Xsse_UNPCKHD, Xsse_UNPCKHQ,
346//.. Xsse_UNPCKLB, Xsse_UNPCKLW, Xsse_UNPCKLD, Xsse_UNPCKLQ
sewardj1001dc42005-02-21 08:25:55 +0000347 }
348 AMD64SseOp;
349
350extern HChar* showAMD64SseOp ( AMD64SseOp );
sewardjc33671d2005-02-01 20:30:00 +0000351
352
353/* --------- */
354typedef
355 enum {
sewardj53df0612005-02-04 21:15:39 +0000356 Ain_Imm64, /* Generate 64-bit literal to register */
sewardjc33671d2005-02-01 20:30:00 +0000357 Ain_Alu64R, /* 64-bit mov/arith/logical, dst=REG */
358 Ain_Alu64M, /* 64-bit mov/arith/logical, dst=MEM */
sewardj8258a8c2005-02-02 03:11:24 +0000359 Ain_Sh64, /* 64-bit shift/rotate, dst=REG or MEM */
sewardj05b3b6a2005-02-04 01:44:33 +0000360 Ain_Test64, /* 64-bit test (AND, set flags, discard result) */
sewardjd0a12df2005-02-10 02:07:43 +0000361 Ain_Unary64, /* 64-bit not and neg */
sewardj9b967672005-02-08 11:13:09 +0000362 Ain_MulL, /* widening multiply */
sewardj7de0d3c2005-02-13 02:26:41 +0000363 Ain_Div, /* div and mod */
sewardja3e98302005-02-01 15:55:05 +0000364//.. Xin_Sh3232, /* shldl or shrdl */
sewardj1001dc42005-02-21 08:25:55 +0000365 Ain_Push, /* push 64-bit value on stack */
sewardj05b3b6a2005-02-04 01:44:33 +0000366 Ain_Call, /* call to address in register */
sewardjf67eadf2005-02-03 03:53:52 +0000367 Ain_Goto, /* conditional/unconditional jmp to dst */
sewardj05b3b6a2005-02-04 01:44:33 +0000368 Ain_CMov64, /* conditional move */
sewardjf67eadf2005-02-03 03:53:52 +0000369 Ain_MovZLQ, /* reg-reg move, zeroing out top half */
sewardj8258a8c2005-02-02 03:11:24 +0000370 Ain_LoadEX, /* mov{s,z}{b,w,l}q from mem to reg */
sewardjf67eadf2005-02-03 03:53:52 +0000371 Ain_Store, /* store 32/16/8 bit value in memory */
sewardja3e98302005-02-01 15:55:05 +0000372//.. Xin_Set32, /* convert condition code to 32-bit value */
373//.. Xin_Bsfr32, /* 32-bit bsf/bsr */
sewardjd0a12df2005-02-10 02:07:43 +0000374 Ain_MFence, /* mem fence */
sewardja3e98302005-02-01 15:55:05 +0000375//..
376//.. Xin_FpUnary, /* FP fake unary op */
377//.. Xin_FpBinary, /* FP fake binary op */
378//.. Xin_FpLdSt, /* FP fake load/store */
379//.. Xin_FpLdStI, /* FP fake load/store, converting to/from Int */
380//.. Xin_Fp64to32, /* FP round IEEE754 double to IEEE754 single */
381//.. Xin_FpCMov, /* FP fake floating point conditional move */
sewardj1a01e652005-02-23 11:39:21 +0000382 Ain_LdMXCSR, /* load %mxcsr */
sewardja3e98302005-02-01 15:55:05 +0000383//.. Xin_FpStSW_AX, /* fstsw %ax */
sewardj18303862005-02-21 12:36:54 +0000384 Ain_SseUComIS, /* ucomisd/ucomiss, then get %rflags into int
385 register */
sewardj1a01e652005-02-23 11:39:21 +0000386 Ain_SseSI2SF, /* scalar 32/64 int to 32/64 float conversion */
387 Ain_SseSF2SI, /* scalar 32/64 float to 32/64 int conversion */
sewardj8d965312005-02-25 02:48:47 +0000388 Ain_SseSDSS, /* scalar float32 to/from float64 */
sewardja3e98302005-02-01 15:55:05 +0000389//..
390//.. Xin_SseConst, /* Generate restricted SSE literal */
sewardj18303862005-02-21 12:36:54 +0000391 Ain_SseLdSt, /* SSE load/store 32/64/128 bits, no alignment
392 constraints, upper 96/64/0 bits arbitrary */
sewardj1001dc42005-02-21 08:25:55 +0000393 Ain_SseLdzLO, /* SSE load low 32/64 bits, zero remainder of reg */
sewardj8d965312005-02-25 02:48:47 +0000394 Ain_Sse32Fx4, /* SSE binary, 32Fx4 */
395 Ain_Sse32FLo, /* SSE binary, 32F in lowest lane only */
sewardja3e98302005-02-01 15:55:05 +0000396//.. Xin_Sse64Fx2, /* SSE binary, 64Fx2 */
sewardj1001dc42005-02-21 08:25:55 +0000397 Ain_Sse64FLo, /* SSE binary, 64F in lowest lane only */
398 Ain_SseReRg, /* SSE binary general reg-reg, Re, Rg */
sewardj8d965312005-02-25 02:48:47 +0000399 Ain_SseCMov, /* SSE conditional move */
sewardja3e98302005-02-01 15:55:05 +0000400//.. Xin_SseShuf /* SSE2 shuffle (pshufd) */
sewardjc33671d2005-02-01 20:30:00 +0000401 }
402 AMD64InstrTag;
403
404/* Destinations are on the RIGHT (second operand) */
405
406typedef
407 struct {
408 AMD64InstrTag tag;
sewardj614b3fb2005-02-02 02:16:03 +0000409 union {
410 struct {
sewardj53df0612005-02-04 21:15:39 +0000411 ULong imm64;
412 HReg dst;
413 } Imm64;
414 struct {
sewardj614b3fb2005-02-02 02:16:03 +0000415 AMD64AluOp op;
416 AMD64RMI* src;
417 HReg dst;
418 } Alu64R;
419 struct {
420 AMD64AluOp op;
421 AMD64RI* src;
422 AMD64AMode* dst;
423 } Alu64M;
sewardj8258a8c2005-02-02 03:11:24 +0000424 struct {
425 AMD64ShiftOp op;
426 UInt src; /* shift amount, or 0 means %cl */
427 AMD64RM* dst;
428 } Sh64;
sewardj05b3b6a2005-02-04 01:44:33 +0000429 struct {
430 AMD64RI* src;
431 AMD64RM* dst;
432 } Test64;
sewardjd0a12df2005-02-10 02:07:43 +0000433 /* Not and Neg */
434 struct {
435 AMD64UnaryOp op;
436 AMD64RM* dst;
437 } Unary64;
sewardj9b967672005-02-08 11:13:09 +0000438 /* DX:AX = AX *s/u r/m16, or EDX:EAX = EAX *s/u r/m32,
439 or RDX:RAX = RAX *s/u r/m64 */
440 struct {
441 Bool syned;
442 Int sz; /* 2, 4 or 8 only */
443 AMD64RM* src;
444 } MulL;
sewardj7de0d3c2005-02-13 02:26:41 +0000445 /* amd64 div/idiv instruction. Modifies RDX and RAX and
446 reads src. */
447 struct {
448 Bool syned;
449 Int sz; /* 4 or 8 only */
450 AMD64RM* src;
451 } Div;
sewardja3e98302005-02-01 15:55:05 +0000452//.. /* shld/shrd. op may only be Xsh_SHL or Xsh_SHR */
453//.. struct {
454//.. X86ShiftOp op;
455//.. UInt amt; /* shift amount, or 0 means %cl */
456//.. HReg src;
457//.. HReg dst;
458//.. } Sh3232;
sewardj1001dc42005-02-21 08:25:55 +0000459 struct {
460 AMD64RMI* src;
461 } Push;
sewardj05b3b6a2005-02-04 01:44:33 +0000462 /* Pseudo-insn. Call target (an absolute address), on given
463 condition (which could be Xcc_ALWAYS). */
464 struct {
465 AMD64CondCode cond;
466 Addr64 target;
467 Int regparms; /* 0 .. 6 */
468 } Call;
sewardjf67eadf2005-02-03 03:53:52 +0000469 /* Pseudo-insn. Goto dst, on given condition (which could be
470 Acc_ALWAYS). */
471 struct {
472 IRJumpKind jk;
473 AMD64CondCode cond;
474 AMD64RI* dst;
475 } Goto;
sewardj05b3b6a2005-02-04 01:44:33 +0000476 /* Mov src to dst on the given condition, which may not
477 be the bogus Acc_ALWAYS. */
478 struct {
479 AMD64CondCode cond;
480 AMD64RM* src;
481 HReg dst;
482 } CMov64;
sewardjf67eadf2005-02-03 03:53:52 +0000483 /* reg-reg move, zeroing out top half */
484 struct {
485 HReg src;
486 HReg dst;
487 } MovZLQ;
sewardj8258a8c2005-02-02 03:11:24 +0000488 /* Sign/Zero extending loads. Dst size is always 64 bits. */
489 struct {
sewardj18303862005-02-21 12:36:54 +0000490 UChar szSmall; /* only 1, 2 or 4 */
sewardj8258a8c2005-02-02 03:11:24 +0000491 Bool syned;
492 AMD64AMode* src;
493 HReg dst;
494 } LoadEX;
sewardjf67eadf2005-02-03 03:53:52 +0000495 /* 32/16/8 bit stores. */
496 struct {
497 UChar sz; /* only 1, 2 or 4 */
498 HReg src;
499 AMD64AMode* dst;
500 } Store;
sewardja3e98302005-02-01 15:55:05 +0000501//.. /* Convert a x86 condition code to a 32-bit value (0 or 1). */
502//.. struct {
503//.. X86CondCode cond;
504//.. HReg dst;
505//.. } Set32;
506//.. /* 32-bit bsf or bsr. */
507//.. struct {
508//.. Bool isFwds;
509//.. HReg src;
510//.. HReg dst;
511//.. } Bsfr32;
sewardjd0a12df2005-02-10 02:07:43 +0000512 /* Mem fence. In short, an insn which flushes all preceding
513 loads and stores as much as possible before continuing.
514 On AMD64 we emit a real "mfence". */
515 struct {
516 } MFence;
517
sewardja3e98302005-02-01 15:55:05 +0000518//.. /* X86 Floating point (fake 3-operand, "flat reg file" insns) */
519//.. struct {
520//.. X86FpOp op;
521//.. HReg src;
522//.. HReg dst;
523//.. } FpUnary;
524//.. struct {
525//.. X86FpOp op;
526//.. HReg srcL;
527//.. HReg srcR;
528//.. HReg dst;
529//.. } FpBinary;
530//.. struct {
531//.. Bool isLoad;
532//.. UChar sz; /* only 4 (IEEE single) or 8 (IEEE double) */
533//.. HReg reg;
534//.. X86AMode* addr;
535//.. } FpLdSt;
536//.. /* Move 64-bit float to/from memory, converting to/from
537//.. signed int on the way. Note the conversions will observe
538//.. the host FPU rounding mode currently in force. */
539//.. struct {
540//.. Bool isLoad;
541//.. UChar sz; /* only 2, 4 or 8 */
542//.. HReg reg;
543//.. X86AMode* addr;
544//.. } FpLdStI;
545//.. /* By observing the current FPU rounding mode, round (etc)
546//.. src into dst given that dst should be interpreted as an
547//.. IEEE754 32-bit (float) type. */
548//.. struct {
549//.. HReg src;
550//.. HReg dst;
551//.. } Fp64to32;
552//.. /* Mov src to dst on the given condition, which may not
553//.. be the bogus Xcc_ALWAYS. */
554//.. struct {
555//.. X86CondCode cond;
556//.. HReg src;
557//.. HReg dst;
558//.. } FpCMov;
sewardj1a01e652005-02-23 11:39:21 +0000559 /* Load 32 bits into %mxcsr. */
560 struct {
561 AMD64AMode* addr;
562 }
563 LdMXCSR;
sewardja3e98302005-02-01 15:55:05 +0000564//.. /* fstsw %ax */
565//.. struct {
566//.. /* no fields */
567//.. }
568//.. FpStSW_AX;
sewardj18303862005-02-21 12:36:54 +0000569 /* ucomisd/ucomiss, then get %rflags into int register */
570 struct {
571 UChar sz; /* 4 or 8 only */
572 HReg srcL; /* xmm */
573 HReg srcR; /* xmm */
574 HReg dst; /* int */
575 } SseUComIS;
sewardj1a01e652005-02-23 11:39:21 +0000576 /* scalar 32/64 int to 32/64 float conversion */
577 struct {
578 UChar szS; /* 4 or 8 */
579 UChar szD; /* 4 or 8 */
580 HReg src; /* i class */
581 HReg dst; /* v class */
582 } SseSI2SF;
583 /* scalar 32/64 float to 32/64 int conversion */
584 struct {
585 UChar szS; /* 4 or 8 */
586 UChar szD; /* 4 or 8 */
587 HReg src; /* v class */
588 HReg dst; /* i class */
589 } SseSF2SI;
sewardj8d965312005-02-25 02:48:47 +0000590 /* scalar float32 to/from float64 */
591 struct {
592 Bool from64; /* True: 64->32; False: 32->64 */
593 HReg src;
594 HReg dst;
595 } SseSDSS;
sewardja3e98302005-02-01 15:55:05 +0000596//..
597//.. /* Simplistic SSE[123] */
598//.. struct {
599//.. UShort con;
600//.. HReg dst;
601//.. } SseConst;
sewardj1001dc42005-02-21 08:25:55 +0000602 struct {
603 Bool isLoad;
sewardj18303862005-02-21 12:36:54 +0000604 UChar sz; /* 4, 8 or 16 only */
sewardj1001dc42005-02-21 08:25:55 +0000605 HReg reg;
606 AMD64AMode* addr;
607 } SseLdSt;
608 struct {
609 Int sz; /* 4 or 8 only */
610 HReg reg;
611 AMD64AMode* addr;
612 } SseLdzLO;
sewardj8d965312005-02-25 02:48:47 +0000613 struct {
614 AMD64SseOp op;
615 HReg src;
616 HReg dst;
617 } Sse32Fx4;
618 struct {
619 AMD64SseOp op;
620 HReg src;
621 HReg dst;
622 } Sse32FLo;
sewardja3e98302005-02-01 15:55:05 +0000623//.. struct {
624//.. X86SseOp op;
625//.. HReg src;
626//.. HReg dst;
627//.. } Sse64Fx2;
sewardj1001dc42005-02-21 08:25:55 +0000628 struct {
629 AMD64SseOp op;
630 HReg src;
631 HReg dst;
632 } Sse64FLo;
633 struct {
634 AMD64SseOp op;
635 HReg src;
636 HReg dst;
637 } SseReRg;
sewardj8d965312005-02-25 02:48:47 +0000638 /* Mov src to dst on the given condition, which may not
639 be the bogus Xcc_ALWAYS. */
640 struct {
641 AMD64CondCode cond;
642 HReg src;
643 HReg dst;
644 } SseCMov;
sewardja3e98302005-02-01 15:55:05 +0000645//.. struct {
646//.. Int order; /* 0 <= order <= 0xFF */
647//.. HReg src;
648//.. HReg dst;
649//.. } SseShuf;
sewardj614b3fb2005-02-02 02:16:03 +0000650
651 } Ain;
sewardjc33671d2005-02-01 20:30:00 +0000652 }
653 AMD64Instr;
654
sewardj53df0612005-02-04 21:15:39 +0000655extern AMD64Instr* AMD64Instr_Imm64 ( ULong imm64, HReg dst );
sewardj614b3fb2005-02-02 02:16:03 +0000656extern AMD64Instr* AMD64Instr_Alu64R ( AMD64AluOp, AMD64RMI*, HReg );
sewardjf67eadf2005-02-03 03:53:52 +0000657extern AMD64Instr* AMD64Instr_Alu64M ( AMD64AluOp, AMD64RI*, AMD64AMode* );
sewardjd0a12df2005-02-10 02:07:43 +0000658extern AMD64Instr* AMD64Instr_Unary64 ( AMD64UnaryOp op, AMD64RM* dst );
sewardj8258a8c2005-02-02 03:11:24 +0000659extern AMD64Instr* AMD64Instr_Sh64 ( AMD64ShiftOp, UInt, AMD64RM* );
sewardj05b3b6a2005-02-04 01:44:33 +0000660extern AMD64Instr* AMD64Instr_Test64 ( AMD64RI* src, AMD64RM* dst );
sewardj9b967672005-02-08 11:13:09 +0000661extern AMD64Instr* AMD64Instr_MulL ( Bool syned, Int sz, AMD64RM* );
sewardj7de0d3c2005-02-13 02:26:41 +0000662extern AMD64Instr* AMD64Instr_Div ( Bool syned, Int sz, AMD64RM* );
sewardj614b3fb2005-02-02 02:16:03 +0000663//.. extern AMD64Instr* AMD64Instr_Sh3232 ( AMD64ShiftOp, UInt amt, HReg src, HReg dst );
sewardj1001dc42005-02-21 08:25:55 +0000664extern AMD64Instr* AMD64Instr_Push ( AMD64RMI* );
sewardj05b3b6a2005-02-04 01:44:33 +0000665extern AMD64Instr* AMD64Instr_Call ( AMD64CondCode, Addr64, Int );
sewardjf67eadf2005-02-03 03:53:52 +0000666extern AMD64Instr* AMD64Instr_Goto ( IRJumpKind, AMD64CondCode cond, AMD64RI* dst );
sewardj05b3b6a2005-02-04 01:44:33 +0000667extern AMD64Instr* AMD64Instr_CMov64 ( AMD64CondCode, AMD64RM* src, HReg dst );
sewardjf67eadf2005-02-03 03:53:52 +0000668extern AMD64Instr* AMD64Instr_MovZLQ ( HReg src, HReg dst );
sewardj8258a8c2005-02-02 03:11:24 +0000669extern AMD64Instr* AMD64Instr_LoadEX ( UChar szSmall, Bool syned,
670 AMD64AMode* src, HReg dst );
sewardjf67eadf2005-02-03 03:53:52 +0000671extern AMD64Instr* AMD64Instr_Store ( UChar sz, HReg src, AMD64AMode* dst );
sewardj614b3fb2005-02-02 02:16:03 +0000672//.. extern AMD64Instr* AMD64Instr_Set32 ( AMD64CondCode cond, HReg dst );
673//.. extern AMD64Instr* AMD64Instr_Bsfr32 ( Bool isFwds, HReg src, HReg dst );
sewardjd0a12df2005-02-10 02:07:43 +0000674extern AMD64Instr* AMD64Instr_MFence ( void );
sewardja3e98302005-02-01 15:55:05 +0000675//..
sewardj614b3fb2005-02-02 02:16:03 +0000676//.. extern AMD64Instr* AMD64Instr_FpUnary ( AMD64FpOp op, HReg src, HReg dst );
677//.. extern AMD64Instr* AMD64Instr_FpBinary ( AMD64FpOp op, HReg srcL, HReg srcR, HReg dst );
678//.. extern AMD64Instr* AMD64Instr_FpLdSt ( Bool isLoad, UChar sz, HReg reg, AMD64AMode* );
679//.. extern AMD64Instr* AMD64Instr_FpLdStI ( Bool isLoad, UChar sz, HReg reg, AMD64AMode* );
680//.. extern AMD64Instr* AMD64Instr_Fp64to32 ( HReg src, HReg dst );
681//.. extern AMD64Instr* AMD64Instr_FpCMov ( AMD64CondCode, HReg src, HReg dst );
sewardj1a01e652005-02-23 11:39:21 +0000682extern AMD64Instr* AMD64Instr_LdMXCSR ( AMD64AMode* );
sewardj614b3fb2005-02-02 02:16:03 +0000683//.. extern AMD64Instr* AMD64Instr_FpStSW_AX ( void );
sewardj18303862005-02-21 12:36:54 +0000684extern AMD64Instr* AMD64Instr_SseUComIS ( Int sz, HReg srcL, HReg srcR, HReg dst );
sewardj1a01e652005-02-23 11:39:21 +0000685extern AMD64Instr* AMD64Instr_SseSI2SF ( Int szS, Int szD, HReg src, HReg dst );
686extern AMD64Instr* AMD64Instr_SseSF2SI ( Int szS, Int szD, HReg src, HReg dst );
sewardj8d965312005-02-25 02:48:47 +0000687extern AMD64Instr* AMD64Instr_SseSDSS ( Bool from64, HReg src, HReg dst );
sewardja3e98302005-02-01 15:55:05 +0000688//..
sewardj614b3fb2005-02-02 02:16:03 +0000689//.. extern AMD64Instr* AMD64Instr_SseConst ( UShort con, HReg dst );
sewardj18303862005-02-21 12:36:54 +0000690extern AMD64Instr* AMD64Instr_SseLdSt ( Bool isLoad, Int sz, HReg, AMD64AMode* );
sewardj1001dc42005-02-21 08:25:55 +0000691extern AMD64Instr* AMD64Instr_SseLdzLO ( Int sz, HReg, AMD64AMode* );
sewardj8d965312005-02-25 02:48:47 +0000692extern AMD64Instr* AMD64Instr_Sse32Fx4 ( AMD64SseOp, HReg, HReg );
693extern AMD64Instr* AMD64Instr_Sse32FLo ( AMD64SseOp, HReg, HReg );
sewardj614b3fb2005-02-02 02:16:03 +0000694//.. extern AMD64Instr* AMD64Instr_Sse64Fx2 ( AMD64SseOp, HReg, HReg );
sewardj1001dc42005-02-21 08:25:55 +0000695extern AMD64Instr* AMD64Instr_Sse64FLo ( AMD64SseOp, HReg, HReg );
696extern AMD64Instr* AMD64Instr_SseReRg ( AMD64SseOp, HReg, HReg );
sewardj8d965312005-02-25 02:48:47 +0000697extern AMD64Instr* AMD64Instr_SseCMov ( AMD64CondCode, HReg src, HReg dst );
sewardj614b3fb2005-02-02 02:16:03 +0000698//.. extern AMD64Instr* AMD64Instr_SseShuf ( Int order, HReg src, HReg dst );
sewardjc33671d2005-02-01 20:30:00 +0000699
700
701extern void ppAMD64Instr ( AMD64Instr* );
702
703/* Some functions that insulate the register allocator from details
704 of the underlying instruction set. */
705extern void getRegUsage_AMD64Instr ( HRegUsage*, AMD64Instr* );
706extern void mapRegs_AMD64Instr ( HRegRemap*, AMD64Instr* );
707extern Bool isMove_AMD64Instr ( AMD64Instr*, HReg*, HReg* );
708extern Int emit_AMD64Instr ( UChar* buf, Int nbuf, AMD64Instr* );
709extern AMD64Instr* genSpill_AMD64 ( HReg rreg, Int offset );
710extern AMD64Instr* genReload_AMD64 ( HReg rreg, Int offset );
711extern void getAllocableRegs_AMD64 ( Int*, HReg** );
712extern HInstrArray* iselBB_AMD64 ( IRBB*, VexSubArch );
sewardja3e98302005-02-01 15:55:05 +0000713
714#endif /* ndef __LIBVEX_HOST_AMD64_HDEFS_H */
715
716/*---------------------------------------------------------------*/
717/*--- end host-amd64/hdefs.h ---*/
718/*---------------------------------------------------------------*/