blob: d146ac246af0298d230d9082b74b2c2b159a3cf4 [file] [log] [blame]
sewardja3e98302005-02-01 15:55:05 +00001
2/*---------------------------------------------------------------*/
3/*--- ---*/
4/*--- This file (host-amd64/hdefs.h) is ---*/
sewardjdbcfae72005-08-02 11:14:04 +00005/*--- Copyright (C) OpenWorks LLP. All rights reserved. ---*/
sewardja3e98302005-02-01 15:55:05 +00006/*--- ---*/
7/*---------------------------------------------------------------*/
8
9/*
10 This file is part of LibVEX, a library for dynamic binary
11 instrumentation and translation.
12
sewardje7441532007-01-08 05:51:05 +000013 Copyright (C) 2004-2007 OpenWorks LLP. All rights reserved.
sewardja3e98302005-02-01 15:55:05 +000014
sewardj7bd6ffe2005-08-03 16:07:36 +000015 This library is made available under a dual licensing scheme.
sewardja3e98302005-02-01 15:55:05 +000016
sewardj7bd6ffe2005-08-03 16:07:36 +000017 If you link LibVEX against other code all of which is itself
18 licensed under the GNU General Public License, version 2 dated June
19 1991 ("GPL v2"), then you may use LibVEX under the terms of the GPL
20 v2, as appearing in the file LICENSE.GPL. If the file LICENSE.GPL
21 is missing, you can obtain a copy of the GPL v2 from the Free
22 Software Foundation Inc., 51 Franklin St, Fifth Floor, Boston, MA
23 02110-1301, USA.
24
25 For any other uses of LibVEX, you must first obtain a commercial
26 license from OpenWorks LLP. Please contact info@open-works.co.uk
27 for information about commercial licensing.
28
29 This software is provided by OpenWorks LLP "as is" and any express
30 or implied warranties, including, but not limited to, the implied
31 warranties of merchantability and fitness for a particular purpose
32 are disclaimed. In no event shall OpenWorks LLP be liable for any
33 direct, indirect, incidental, special, exemplary, or consequential
34 damages (including, but not limited to, procurement of substitute
35 goods or services; loss of use, data, or profits; or business
36 interruption) however caused and on any theory of liability,
37 whether in contract, strict liability, or tort (including
38 negligence or otherwise) arising in any way out of the use of this
39 software, even if advised of the possibility of such damage.
sewardja3e98302005-02-01 15:55:05 +000040
41 Neither the names of the U.S. Department of Energy nor the
42 University of California nor the names of its contributors may be
43 used to endorse or promote products derived from this software
44 without prior written permission.
sewardja3e98302005-02-01 15:55:05 +000045*/
46
47#ifndef __LIBVEX_HOST_AMD64_HDEFS_H
48#define __LIBVEX_HOST_AMD64_HDEFS_H
49
sewardjc33671d2005-02-01 20:30:00 +000050
51/* --------- Registers. --------- */
52
53/* The usual HReg abstraction. There are 16 real int regs, 6 real
54 float regs, and 16 real vector regs.
55*/
56
57extern void ppHRegAMD64 ( HReg );
58
59extern HReg hregAMD64_RAX ( void );
60extern HReg hregAMD64_RBX ( void );
61extern HReg hregAMD64_RCX ( void );
62extern HReg hregAMD64_RDX ( void );
63extern HReg hregAMD64_RSP ( void );
64extern HReg hregAMD64_RBP ( void );
65extern HReg hregAMD64_RSI ( void );
66extern HReg hregAMD64_RDI ( void );
67extern HReg hregAMD64_R8 ( void );
68extern HReg hregAMD64_R9 ( void );
69extern HReg hregAMD64_R10 ( void );
70extern HReg hregAMD64_R11 ( void );
71extern HReg hregAMD64_R12 ( void );
72extern HReg hregAMD64_R13 ( void );
73extern HReg hregAMD64_R14 ( void );
74extern HReg hregAMD64_R15 ( void );
75
76extern HReg hregAMD64_FAKE0 ( void );
77extern HReg hregAMD64_FAKE1 ( void );
78extern HReg hregAMD64_FAKE2 ( void );
79extern HReg hregAMD64_FAKE3 ( void );
80extern HReg hregAMD64_FAKE4 ( void );
81extern HReg hregAMD64_FAKE5 ( void );
82
83extern HReg hregAMD64_XMM0 ( void );
84extern HReg hregAMD64_XMM1 ( void );
sewardj53df0612005-02-04 21:15:39 +000085extern HReg hregAMD64_XMM2 ( void );
sewardjc33671d2005-02-01 20:30:00 +000086extern HReg hregAMD64_XMM3 ( void );
87extern HReg hregAMD64_XMM4 ( void );
88extern HReg hregAMD64_XMM5 ( void );
89extern HReg hregAMD64_XMM6 ( void );
90extern HReg hregAMD64_XMM7 ( void );
91extern HReg hregAMD64_XMM8 ( void );
92extern HReg hregAMD64_XMM9 ( void );
93extern HReg hregAMD64_XMM10 ( void );
94extern HReg hregAMD64_XMM11 ( void );
95extern HReg hregAMD64_XMM12 ( void );
96extern HReg hregAMD64_XMM13 ( void );
97extern HReg hregAMD64_XMM14 ( void );
98extern HReg hregAMD64_XMM15 ( void );
99
100
101/* --------- Condition codes, AMD encoding. --------- */
102
103typedef
104 enum {
105 Acc_O = 0, /* overflow */
106 Acc_NO = 1, /* no overflow */
107
108 Acc_B = 2, /* below */
109 Acc_NB = 3, /* not below */
110
111 Acc_Z = 4, /* zero */
112 Acc_NZ = 5, /* not zero */
113
114 Acc_BE = 6, /* below or equal */
115 Acc_NBE = 7, /* not below or equal */
116
117 Acc_S = 8, /* negative */
118 Acc_NS = 9, /* not negative */
119
120 Acc_P = 10, /* parity even */
121 Acc_NP = 11, /* not parity even */
122
123 Acc_L = 12, /* jump less */
124 Acc_NL = 13, /* not less */
125
126 Acc_LE = 14, /* less or equal */
127 Acc_NLE = 15, /* not less or equal */
128
129 Acc_ALWAYS = 16 /* the usual hack */
130 }
131 AMD64CondCode;
132
133extern HChar* showAMD64CondCode ( AMD64CondCode );
134
135
136/* --------- Memory address expressions (amodes). --------- */
137
138typedef
139 enum {
140 Aam_IR, /* Immediate + Reg */
141 Aam_IRRS /* Immediate + Reg1 + (Reg2 << Shift) */
142 }
143 AMD64AModeTag;
144
145typedef
146 struct {
147 AMD64AModeTag tag;
148 union {
149 struct {
150 UInt imm;
151 HReg reg;
152 } IR;
153 struct {
154 UInt imm;
155 HReg base;
156 HReg index;
157 Int shift; /* 0, 1, 2 or 3 only */
158 } IRRS;
159 } Aam;
160 }
161 AMD64AMode;
162
163extern AMD64AMode* AMD64AMode_IR ( UInt, HReg );
164extern AMD64AMode* AMD64AMode_IRRS ( UInt, HReg, HReg, Int );
165
166extern AMD64AMode* dopyAMD64AMode ( AMD64AMode* );
167
168extern void ppAMD64AMode ( AMD64AMode* );
169
170
171/* --------- Operand, which can be reg, immediate or memory. --------- */
172
173typedef
174 enum {
175 Armi_Imm,
176 Armi_Reg,
177 Armi_Mem
178 }
179 AMD64RMITag;
180
181typedef
182 struct {
183 AMD64RMITag tag;
184 union {
185 struct {
186 UInt imm32;
187 } Imm;
188 struct {
189 HReg reg;
190 } Reg;
191 struct {
192 AMD64AMode* am;
193 } Mem;
194 }
195 Armi;
196 }
197 AMD64RMI;
198
199extern AMD64RMI* AMD64RMI_Imm ( UInt );
200extern AMD64RMI* AMD64RMI_Reg ( HReg );
201extern AMD64RMI* AMD64RMI_Mem ( AMD64AMode* );
202
203extern void ppAMD64RMI ( AMD64RMI* );
204
205
206/* --------- Operand, which can be reg or immediate only. --------- */
207
208typedef
209 enum {
210 Ari_Imm,
211 Ari_Reg
212 }
213 AMD64RITag;
214
215typedef
216 struct {
217 AMD64RITag tag;
218 union {
219 struct {
220 UInt imm32;
221 } Imm;
222 struct {
223 HReg reg;
224 } Reg;
225 }
226 Ari;
227 }
228 AMD64RI;
229
230extern AMD64RI* AMD64RI_Imm ( UInt );
231extern AMD64RI* AMD64RI_Reg ( HReg );
232
233extern void ppAMD64RI ( AMD64RI* );
234
235
236/* --------- Operand, which can be reg or memory only. --------- */
237
238typedef
239 enum {
240 Arm_Reg,
241 Arm_Mem
242 }
243 AMD64RMTag;
244
245typedef
246 struct {
247 AMD64RMTag tag;
248 union {
249 struct {
250 HReg reg;
251 } Reg;
252 struct {
253 AMD64AMode* am;
254 } Mem;
255 }
256 Arm;
257 }
258 AMD64RM;
259
260extern AMD64RM* AMD64RM_Reg ( HReg );
261extern AMD64RM* AMD64RM_Mem ( AMD64AMode* );
262
263extern void ppAMD64RM ( AMD64RM* );
264
265
sewardjd0a12df2005-02-10 02:07:43 +0000266/* --------- Instructions. --------- */
267
268/* --------- */
269typedef
270 enum {
271 Aun_NEG,
272 Aun_NOT
273 }
274 AMD64UnaryOp;
275
276extern HChar* showAMD64UnaryOp ( AMD64UnaryOp );
sewardj614b3fb2005-02-02 02:16:03 +0000277
278
279/* --------- */
280typedef
281 enum {
282 Aalu_INVALID,
283 Aalu_MOV,
284 Aalu_CMP,
285 Aalu_ADD, Aalu_SUB, Aalu_ADC, Aalu_SBB,
286 Aalu_AND, Aalu_OR, Aalu_XOR,
287 Aalu_MUL
288 }
289 AMD64AluOp;
290
291extern HChar* showAMD64AluOp ( AMD64AluOp );
292
293
sewardj8258a8c2005-02-02 03:11:24 +0000294/* --------- */
295typedef
296 enum {
297 Ash_INVALID,
298 Ash_SHL, Ash_SHR, Ash_SAR
299 }
300 AMD64ShiftOp;
301
302extern HChar* showAMD64ShiftOp ( AMD64ShiftOp );
303
304
sewardj25a85812005-05-08 23:03:48 +0000305/* --------- */
306typedef
307 enum {
308 Afp_INVALID,
309 /* Binary */
sewardjf4c803b2006-09-11 11:07:34 +0000310 Afp_SCALE, Afp_ATAN, Afp_YL2X, Afp_YL2XP1, Afp_PREM,
sewardj25a85812005-05-08 23:03:48 +0000311 /* Unary */
sewardj4796d662006-02-05 16:06:26 +0000312 Afp_SQRT,
sewardj5e205372005-05-09 02:57:08 +0000313 Afp_SIN, Afp_COS, Afp_TAN,
sewardj25a85812005-05-08 23:03:48 +0000314 Afp_ROUND, Afp_2XM1
315 }
316 A87FpOp;
317
318extern HChar* showA87FpOp ( A87FpOp );
sewardj1001dc42005-02-21 08:25:55 +0000319
320
321/* --------- */
322typedef
323 enum {
324 Asse_INVALID,
325 /* mov */
326 Asse_MOV,
327 /* Floating point binary */
328 Asse_ADDF, Asse_SUBF, Asse_MULF, Asse_DIVF,
sewardj1a01e652005-02-23 11:39:21 +0000329 Asse_MAXF, Asse_MINF,
sewardj8d965312005-02-25 02:48:47 +0000330 Asse_CMPEQF, Asse_CMPLTF, Asse_CMPLEF, Asse_CMPUNF,
sewardj1001dc42005-02-21 08:25:55 +0000331 /* Floating point unary */
332 Asse_RCPF, Asse_RSQRTF, Asse_SQRTF,
333 /* Bitwise */
334 Asse_AND, Asse_OR, Asse_XOR, Asse_ANDN,
sewardj97628592005-05-10 22:42:54 +0000335 Asse_ADD8, Asse_ADD16, Asse_ADD32, Asse_ADD64,
sewardj5992bd02005-05-11 02:13:42 +0000336 Asse_QADD8U, Asse_QADD16U,
337 Asse_QADD8S, Asse_QADD16S,
sewardj97628592005-05-10 22:42:54 +0000338 Asse_SUB8, Asse_SUB16, Asse_SUB32, Asse_SUB64,
339 Asse_QSUB8U, Asse_QSUB16U,
340 Asse_QSUB8S, Asse_QSUB16S,
sewardjadffcef2005-05-11 00:03:06 +0000341 Asse_MUL16,
342 Asse_MULHI16U,
343 Asse_MULHI16S,
sewardj5992bd02005-05-11 02:13:42 +0000344 Asse_AVG8U, Asse_AVG16U,
sewardjadffcef2005-05-11 00:03:06 +0000345 Asse_MAX16S,
346 Asse_MAX8U,
347 Asse_MIN16S,
348 Asse_MIN8U,
sewardj5992bd02005-05-11 02:13:42 +0000349 Asse_CMPEQ8, Asse_CMPEQ16, Asse_CMPEQ32,
350 Asse_CMPGT8S, Asse_CMPGT16S, Asse_CMPGT32S,
sewardjadffcef2005-05-11 00:03:06 +0000351 Asse_SHL16, Asse_SHL32, Asse_SHL64,
352 Asse_SHR16, Asse_SHR32, Asse_SHR64,
353 Asse_SAR16, Asse_SAR32,
sewardj97628592005-05-10 22:42:54 +0000354 Asse_PACKSSD, Asse_PACKSSW, Asse_PACKUSW,
355 Asse_UNPCKHB, Asse_UNPCKHW, Asse_UNPCKHD, Asse_UNPCKHQ,
356 Asse_UNPCKLB, Asse_UNPCKLW, Asse_UNPCKLD, Asse_UNPCKLQ
sewardj1001dc42005-02-21 08:25:55 +0000357 }
358 AMD64SseOp;
359
360extern HChar* showAMD64SseOp ( AMD64SseOp );
sewardjc33671d2005-02-01 20:30:00 +0000361
362
363/* --------- */
364typedef
365 enum {
sewardj25a85812005-05-08 23:03:48 +0000366 Ain_Imm64, /* Generate 64-bit literal to register */
367 Ain_Alu64R, /* 64-bit mov/arith/logical, dst=REG */
368 Ain_Alu64M, /* 64-bit mov/arith/logical, dst=MEM */
369 Ain_Sh64, /* 64-bit shift/rotate, dst=REG or MEM */
370 Ain_Test64, /* 64-bit test (AND, set flags, discard result) */
371 Ain_Unary64, /* 64-bit not and neg */
sewardj6ce1a232007-03-31 19:12:38 +0000372 Ain_Lea64, /* 64-bit compute EA into a reg */
sewardj25a85812005-05-08 23:03:48 +0000373 Ain_MulL, /* widening multiply */
374 Ain_Div, /* div and mod */
sewardja3e98302005-02-01 15:55:05 +0000375//.. Xin_Sh3232, /* shldl or shrdl */
sewardj25a85812005-05-08 23:03:48 +0000376 Ain_Push, /* push 64-bit value on stack */
377 Ain_Call, /* call to address in register */
378 Ain_Goto, /* conditional/unconditional jmp to dst */
379 Ain_CMov64, /* conditional move */
380 Ain_MovZLQ, /* reg-reg move, zeroing out top half */
381 Ain_LoadEX, /* mov{s,z}{b,w,l}q from mem to reg */
382 Ain_Store, /* store 32/16/8 bit value in memory */
383 Ain_Set64, /* convert condition code to 64-bit value */
384 Ain_Bsfr64, /* 64-bit bsf/bsr */
385 Ain_MFence, /* mem fence */
386 Ain_A87Free, /* free up x87 registers */
387 Ain_A87PushPop, /* x87 loads/stores */
388 Ain_A87FpOp, /* x87 operations */
389 Ain_A87LdCW, /* load x87 control word */
sewardjf4c803b2006-09-11 11:07:34 +0000390 Ain_A87StSW, /* store x87 status word */
sewardja3e98302005-02-01 15:55:05 +0000391//..
392//.. Xin_FpUnary, /* FP fake unary op */
393//.. Xin_FpBinary, /* FP fake binary op */
394//.. Xin_FpLdSt, /* FP fake load/store */
395//.. Xin_FpLdStI, /* FP fake load/store, converting to/from Int */
396//.. Xin_Fp64to32, /* FP round IEEE754 double to IEEE754 single */
397//.. Xin_FpCMov, /* FP fake floating point conditional move */
sewardj25a85812005-05-08 23:03:48 +0000398 Ain_LdMXCSR, /* load %mxcsr */
sewardja3e98302005-02-01 15:55:05 +0000399//.. Xin_FpStSW_AX, /* fstsw %ax */
sewardj25a85812005-05-08 23:03:48 +0000400 Ain_SseUComIS, /* ucomisd/ucomiss, then get %rflags into int
401 register */
402 Ain_SseSI2SF, /* scalar 32/64 int to 32/64 float conversion */
403 Ain_SseSF2SI, /* scalar 32/64 float to 32/64 int conversion */
404 Ain_SseSDSS, /* scalar float32 to/from float64 */
sewardja3e98302005-02-01 15:55:05 +0000405//..
406//.. Xin_SseConst, /* Generate restricted SSE literal */
sewardj25a85812005-05-08 23:03:48 +0000407 Ain_SseLdSt, /* SSE load/store 32/64/128 bits, no alignment
408 constraints, upper 96/64/0 bits arbitrary */
409 Ain_SseLdzLO, /* SSE load low 32/64 bits, zero remainder of reg */
410 Ain_Sse32Fx4, /* SSE binary, 32Fx4 */
411 Ain_Sse32FLo, /* SSE binary, 32F in lowest lane only */
412 Ain_Sse64Fx2, /* SSE binary, 64Fx2 */
413 Ain_Sse64FLo, /* SSE binary, 64F in lowest lane only */
414 Ain_SseReRg, /* SSE binary general reg-reg, Re, Rg */
415 Ain_SseCMov, /* SSE conditional move */
416 Ain_SseShuf /* SSE2 shuffle (pshufd) */
sewardjc33671d2005-02-01 20:30:00 +0000417 }
418 AMD64InstrTag;
419
420/* Destinations are on the RIGHT (second operand) */
421
422typedef
423 struct {
424 AMD64InstrTag tag;
sewardj614b3fb2005-02-02 02:16:03 +0000425 union {
426 struct {
sewardj53df0612005-02-04 21:15:39 +0000427 ULong imm64;
428 HReg dst;
429 } Imm64;
430 struct {
sewardj614b3fb2005-02-02 02:16:03 +0000431 AMD64AluOp op;
432 AMD64RMI* src;
433 HReg dst;
434 } Alu64R;
435 struct {
436 AMD64AluOp op;
437 AMD64RI* src;
438 AMD64AMode* dst;
439 } Alu64M;
sewardj8258a8c2005-02-02 03:11:24 +0000440 struct {
441 AMD64ShiftOp op;
442 UInt src; /* shift amount, or 0 means %cl */
sewardj501a3392005-05-11 15:37:50 +0000443 HReg dst;
sewardj8258a8c2005-02-02 03:11:24 +0000444 } Sh64;
sewardj05b3b6a2005-02-04 01:44:33 +0000445 struct {
sewardj501a3392005-05-11 15:37:50 +0000446 UInt imm32;
447 HReg dst;
sewardj05b3b6a2005-02-04 01:44:33 +0000448 } Test64;
sewardjd0a12df2005-02-10 02:07:43 +0000449 /* Not and Neg */
450 struct {
451 AMD64UnaryOp op;
sewardj501a3392005-05-11 15:37:50 +0000452 HReg dst;
sewardjd0a12df2005-02-10 02:07:43 +0000453 } Unary64;
sewardj6ce1a232007-03-31 19:12:38 +0000454 /* 64-bit compute EA into a reg */
455 struct {
456 AMD64AMode* am;
457 HReg dst;
458 } Lea64;
sewardj501a3392005-05-11 15:37:50 +0000459 /* 64 x 64 -> 128 bit widening multiply: RDX:RAX = RAX *s/u
460 r/m64 */
sewardj9b967672005-02-08 11:13:09 +0000461 struct {
462 Bool syned;
sewardj9b967672005-02-08 11:13:09 +0000463 AMD64RM* src;
464 } MulL;
sewardj7de0d3c2005-02-13 02:26:41 +0000465 /* amd64 div/idiv instruction. Modifies RDX and RAX and
466 reads src. */
467 struct {
468 Bool syned;
469 Int sz; /* 4 or 8 only */
470 AMD64RM* src;
471 } Div;
sewardja3e98302005-02-01 15:55:05 +0000472//.. /* shld/shrd. op may only be Xsh_SHL or Xsh_SHR */
473//.. struct {
474//.. X86ShiftOp op;
475//.. UInt amt; /* shift amount, or 0 means %cl */
476//.. HReg src;
477//.. HReg dst;
478//.. } Sh3232;
sewardj1001dc42005-02-21 08:25:55 +0000479 struct {
480 AMD64RMI* src;
481 } Push;
sewardj05b3b6a2005-02-04 01:44:33 +0000482 /* Pseudo-insn. Call target (an absolute address), on given
483 condition (which could be Xcc_ALWAYS). */
484 struct {
485 AMD64CondCode cond;
486 Addr64 target;
487 Int regparms; /* 0 .. 6 */
488 } Call;
sewardjf67eadf2005-02-03 03:53:52 +0000489 /* Pseudo-insn. Goto dst, on given condition (which could be
490 Acc_ALWAYS). */
491 struct {
492 IRJumpKind jk;
493 AMD64CondCode cond;
494 AMD64RI* dst;
495 } Goto;
sewardj05b3b6a2005-02-04 01:44:33 +0000496 /* Mov src to dst on the given condition, which may not
497 be the bogus Acc_ALWAYS. */
498 struct {
499 AMD64CondCode cond;
500 AMD64RM* src;
501 HReg dst;
502 } CMov64;
sewardjf67eadf2005-02-03 03:53:52 +0000503 /* reg-reg move, zeroing out top half */
504 struct {
505 HReg src;
506 HReg dst;
507 } MovZLQ;
sewardj8258a8c2005-02-02 03:11:24 +0000508 /* Sign/Zero extending loads. Dst size is always 64 bits. */
509 struct {
sewardj18303862005-02-21 12:36:54 +0000510 UChar szSmall; /* only 1, 2 or 4 */
sewardj8258a8c2005-02-02 03:11:24 +0000511 Bool syned;
512 AMD64AMode* src;
513 HReg dst;
514 } LoadEX;
sewardjf67eadf2005-02-03 03:53:52 +0000515 /* 32/16/8 bit stores. */
516 struct {
517 UChar sz; /* only 1, 2 or 4 */
518 HReg src;
519 AMD64AMode* dst;
520 } Store;
sewardja5bd0af2005-03-24 20:40:12 +0000521 /* Convert an amd64 condition code to a 64-bit value (0 or 1). */
522 struct {
523 AMD64CondCode cond;
524 HReg dst;
525 } Set64;
sewardjf53b7352005-04-06 20:01:56 +0000526 /* 64-bit bsf or bsr. */
527 struct {
528 Bool isFwds;
529 HReg src;
530 HReg dst;
531 } Bsfr64;
sewardjd0a12df2005-02-10 02:07:43 +0000532 /* Mem fence. In short, an insn which flushes all preceding
533 loads and stores as much as possible before continuing.
534 On AMD64 we emit a real "mfence". */
535 struct {
536 } MFence;
537
sewardj25a85812005-05-08 23:03:48 +0000538 /* --- X87 --- */
539
540 /* A very minimal set of x87 insns, that operate exactly in a
541 stack-like way so no need to think about x87 registers. */
542
543 /* Do 'ffree' on %st(7) .. %st(7-nregs) */
544 struct {
545 Int nregs; /* 1 <= nregs <= 7 */
546 } A87Free;
547
548 /* Push a 64-bit FP value from memory onto the stack, or move
549 a value from the stack to memory and remove it from the
550 stack. */
551 struct {
552 AMD64AMode* addr;
553 Bool isPush;
554 } A87PushPop;
555
556 /* Do an operation on the top-of-stack. This can be unary, in
557 which case it is %st0 = OP( %st0 ), or binary: %st0 = OP(
558 %st0, %st1 ). */
559 struct {
560 A87FpOp op;
561 } A87FpOp;
562
563 /* Load the FPU control word. */
564 struct {
565 AMD64AMode* addr;
566 } A87LdCW;
567
sewardjf4c803b2006-09-11 11:07:34 +0000568 /* Store the FPU status word (fstsw m16) */
569 struct {
570 AMD64AMode* addr;
571 } A87StSW;
572
sewardj25a85812005-05-08 23:03:48 +0000573 /* --- SSE --- */
574
sewardj1a01e652005-02-23 11:39:21 +0000575 /* Load 32 bits into %mxcsr. */
576 struct {
577 AMD64AMode* addr;
578 }
579 LdMXCSR;
sewardja3e98302005-02-01 15:55:05 +0000580//.. /* fstsw %ax */
581//.. struct {
582//.. /* no fields */
583//.. }
584//.. FpStSW_AX;
sewardj18303862005-02-21 12:36:54 +0000585 /* ucomisd/ucomiss, then get %rflags into int register */
586 struct {
587 UChar sz; /* 4 or 8 only */
588 HReg srcL; /* xmm */
589 HReg srcR; /* xmm */
590 HReg dst; /* int */
591 } SseUComIS;
sewardj1a01e652005-02-23 11:39:21 +0000592 /* scalar 32/64 int to 32/64 float conversion */
593 struct {
594 UChar szS; /* 4 or 8 */
595 UChar szD; /* 4 or 8 */
596 HReg src; /* i class */
597 HReg dst; /* v class */
598 } SseSI2SF;
599 /* scalar 32/64 float to 32/64 int conversion */
600 struct {
601 UChar szS; /* 4 or 8 */
602 UChar szD; /* 4 or 8 */
603 HReg src; /* v class */
604 HReg dst; /* i class */
605 } SseSF2SI;
sewardj8d965312005-02-25 02:48:47 +0000606 /* scalar float32 to/from float64 */
607 struct {
608 Bool from64; /* True: 64->32; False: 32->64 */
609 HReg src;
610 HReg dst;
611 } SseSDSS;
sewardja3e98302005-02-01 15:55:05 +0000612//..
613//.. /* Simplistic SSE[123] */
614//.. struct {
615//.. UShort con;
616//.. HReg dst;
617//.. } SseConst;
sewardj1001dc42005-02-21 08:25:55 +0000618 struct {
619 Bool isLoad;
sewardj18303862005-02-21 12:36:54 +0000620 UChar sz; /* 4, 8 or 16 only */
sewardj1001dc42005-02-21 08:25:55 +0000621 HReg reg;
622 AMD64AMode* addr;
623 } SseLdSt;
624 struct {
625 Int sz; /* 4 or 8 only */
626 HReg reg;
627 AMD64AMode* addr;
628 } SseLdzLO;
sewardj8d965312005-02-25 02:48:47 +0000629 struct {
630 AMD64SseOp op;
631 HReg src;
632 HReg dst;
633 } Sse32Fx4;
634 struct {
635 AMD64SseOp op;
636 HReg src;
637 HReg dst;
638 } Sse32FLo;
sewardj4c328cf2005-05-05 12:05:54 +0000639 struct {
640 AMD64SseOp op;
641 HReg src;
642 HReg dst;
643 } Sse64Fx2;
sewardj1001dc42005-02-21 08:25:55 +0000644 struct {
645 AMD64SseOp op;
646 HReg src;
647 HReg dst;
648 } Sse64FLo;
649 struct {
650 AMD64SseOp op;
651 HReg src;
652 HReg dst;
653 } SseReRg;
sewardj8d965312005-02-25 02:48:47 +0000654 /* Mov src to dst on the given condition, which may not
655 be the bogus Xcc_ALWAYS. */
656 struct {
657 AMD64CondCode cond;
658 HReg src;
659 HReg dst;
660 } SseCMov;
sewardj09717342005-05-05 21:34:02 +0000661 struct {
662 Int order; /* 0 <= order <= 0xFF */
663 HReg src;
664 HReg dst;
665 } SseShuf;
sewardj614b3fb2005-02-02 02:16:03 +0000666
667 } Ain;
sewardjc33671d2005-02-01 20:30:00 +0000668 }
669 AMD64Instr;
670
sewardj25a85812005-05-08 23:03:48 +0000671extern AMD64Instr* AMD64Instr_Imm64 ( ULong imm64, HReg dst );
672extern AMD64Instr* AMD64Instr_Alu64R ( AMD64AluOp, AMD64RMI*, HReg );
673extern AMD64Instr* AMD64Instr_Alu64M ( AMD64AluOp, AMD64RI*, AMD64AMode* );
sewardj501a3392005-05-11 15:37:50 +0000674extern AMD64Instr* AMD64Instr_Unary64 ( AMD64UnaryOp op, HReg dst );
sewardj6ce1a232007-03-31 19:12:38 +0000675extern AMD64Instr* AMD64Instr_Lea64 ( AMD64AMode* am, HReg dst );
sewardj501a3392005-05-11 15:37:50 +0000676extern AMD64Instr* AMD64Instr_Sh64 ( AMD64ShiftOp, UInt, HReg );
677extern AMD64Instr* AMD64Instr_Test64 ( UInt imm32, HReg dst );
678extern AMD64Instr* AMD64Instr_MulL ( Bool syned, AMD64RM* );
sewardj25a85812005-05-08 23:03:48 +0000679extern AMD64Instr* AMD64Instr_Div ( Bool syned, Int sz, AMD64RM* );
sewardj614b3fb2005-02-02 02:16:03 +0000680//.. extern AMD64Instr* AMD64Instr_Sh3232 ( AMD64ShiftOp, UInt amt, HReg src, HReg dst );
sewardj25a85812005-05-08 23:03:48 +0000681extern AMD64Instr* AMD64Instr_Push ( AMD64RMI* );
682extern AMD64Instr* AMD64Instr_Call ( AMD64CondCode, Addr64, Int );
683extern AMD64Instr* AMD64Instr_Goto ( IRJumpKind, AMD64CondCode cond, AMD64RI* dst );
684extern AMD64Instr* AMD64Instr_CMov64 ( AMD64CondCode, AMD64RM* src, HReg dst );
685extern AMD64Instr* AMD64Instr_MovZLQ ( HReg src, HReg dst );
686extern AMD64Instr* AMD64Instr_LoadEX ( UChar szSmall, Bool syned,
687 AMD64AMode* src, HReg dst );
688extern AMD64Instr* AMD64Instr_Store ( UChar sz, HReg src, AMD64AMode* dst );
689extern AMD64Instr* AMD64Instr_Set64 ( AMD64CondCode cond, HReg dst );
690extern AMD64Instr* AMD64Instr_Bsfr64 ( Bool isFwds, HReg src, HReg dst );
691extern AMD64Instr* AMD64Instr_MFence ( void );
692extern AMD64Instr* AMD64Instr_A87Free ( Int nregs );
693extern AMD64Instr* AMD64Instr_A87PushPop ( AMD64AMode* addr, Bool isPush );
694extern AMD64Instr* AMD64Instr_A87FpOp ( A87FpOp op );
695extern AMD64Instr* AMD64Instr_A87LdCW ( AMD64AMode* addr );
sewardjf4c803b2006-09-11 11:07:34 +0000696extern AMD64Instr* AMD64Instr_A87StSW ( AMD64AMode* addr );
sewardja3e98302005-02-01 15:55:05 +0000697//..
sewardj614b3fb2005-02-02 02:16:03 +0000698//.. extern AMD64Instr* AMD64Instr_FpUnary ( AMD64FpOp op, HReg src, HReg dst );
699//.. extern AMD64Instr* AMD64Instr_FpBinary ( AMD64FpOp op, HReg srcL, HReg srcR, HReg dst );
700//.. extern AMD64Instr* AMD64Instr_FpLdSt ( Bool isLoad, UChar sz, HReg reg, AMD64AMode* );
701//.. extern AMD64Instr* AMD64Instr_FpLdStI ( Bool isLoad, UChar sz, HReg reg, AMD64AMode* );
702//.. extern AMD64Instr* AMD64Instr_Fp64to32 ( HReg src, HReg dst );
703//.. extern AMD64Instr* AMD64Instr_FpCMov ( AMD64CondCode, HReg src, HReg dst );
sewardj25a85812005-05-08 23:03:48 +0000704extern AMD64Instr* AMD64Instr_LdMXCSR ( AMD64AMode* );
sewardj614b3fb2005-02-02 02:16:03 +0000705//.. extern AMD64Instr* AMD64Instr_FpStSW_AX ( void );
sewardj25a85812005-05-08 23:03:48 +0000706extern AMD64Instr* AMD64Instr_SseUComIS ( Int sz, HReg srcL, HReg srcR, HReg dst );
707extern AMD64Instr* AMD64Instr_SseSI2SF ( Int szS, Int szD, HReg src, HReg dst );
708extern AMD64Instr* AMD64Instr_SseSF2SI ( Int szS, Int szD, HReg src, HReg dst );
709extern AMD64Instr* AMD64Instr_SseSDSS ( Bool from64, HReg src, HReg dst );
sewardja3e98302005-02-01 15:55:05 +0000710//..
sewardj614b3fb2005-02-02 02:16:03 +0000711//.. extern AMD64Instr* AMD64Instr_SseConst ( UShort con, HReg dst );
sewardj25a85812005-05-08 23:03:48 +0000712extern AMD64Instr* AMD64Instr_SseLdSt ( Bool isLoad, Int sz, HReg, AMD64AMode* );
713extern AMD64Instr* AMD64Instr_SseLdzLO ( Int sz, HReg, AMD64AMode* );
714extern AMD64Instr* AMD64Instr_Sse32Fx4 ( AMD64SseOp, HReg, HReg );
715extern AMD64Instr* AMD64Instr_Sse32FLo ( AMD64SseOp, HReg, HReg );
716extern AMD64Instr* AMD64Instr_Sse64Fx2 ( AMD64SseOp, HReg, HReg );
717extern AMD64Instr* AMD64Instr_Sse64FLo ( AMD64SseOp, HReg, HReg );
718extern AMD64Instr* AMD64Instr_SseReRg ( AMD64SseOp, HReg, HReg );
719extern AMD64Instr* AMD64Instr_SseCMov ( AMD64CondCode, HReg src, HReg dst );
720extern AMD64Instr* AMD64Instr_SseShuf ( Int order, HReg src, HReg dst );
sewardjc33671d2005-02-01 20:30:00 +0000721
722
cerion92b64362005-12-13 12:02:26 +0000723extern void ppAMD64Instr ( AMD64Instr*, Bool );
sewardjc33671d2005-02-01 20:30:00 +0000724
725/* Some functions that insulate the register allocator from details
726 of the underlying instruction set. */
cerion92b64362005-12-13 12:02:26 +0000727extern void getRegUsage_AMD64Instr ( HRegUsage*, AMD64Instr*, Bool );
728extern void mapRegs_AMD64Instr ( HRegRemap*, AMD64Instr*, Bool );
sewardjc33671d2005-02-01 20:30:00 +0000729extern Bool isMove_AMD64Instr ( AMD64Instr*, HReg*, HReg* );
sewardj0528bb52005-12-15 15:45:20 +0000730extern Int emit_AMD64Instr ( UChar* buf, Int nbuf, AMD64Instr*,
731 Bool, void* dispatch );
cerion92b64362005-12-13 12:02:26 +0000732extern AMD64Instr* genSpill_AMD64 ( HReg rreg, Int offset, Bool );
733extern AMD64Instr* genReload_AMD64 ( HReg rreg, Int offset, Bool );
sewardjc33671d2005-02-01 20:30:00 +0000734extern void getAllocableRegs_AMD64 ( Int*, HReg** );
sewardjdd40fdf2006-12-24 02:20:24 +0000735extern HInstrArray* iselSB_AMD64 ( IRSB*, VexArch,
sewardjaca070a2006-10-17 00:28:22 +0000736 VexArchInfo*,
sewardjdd40fdf2006-12-24 02:20:24 +0000737 VexAbiInfo* );
sewardja3e98302005-02-01 15:55:05 +0000738
739#endif /* ndef __LIBVEX_HOST_AMD64_HDEFS_H */
740
741/*---------------------------------------------------------------*/
742/*--- end host-amd64/hdefs.h ---*/
743/*---------------------------------------------------------------*/