blob: 2ca7106e87f8dd547e87e1096326387eba93dd23 [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
sewardja26d8202008-02-11 11:35:40 +000013 Copyright (C) 2004-2008 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 */
sewardj4970e4e2008-10-11 10:07:55 +0000310 Afp_SCALE, Afp_ATAN, Afp_YL2X, Afp_YL2XP1, Afp_PREM, Afp_PREM1,
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 */
sewardje9d8a262009-07-01 08:06:34 +0000386 Ain_ACAS, /* 8/16/32/64-bit lock;cmpxchg */
387 Ain_DACAS, /* lock;cmpxchg8b/16b (doubleword ACAS, 2 x
388 32-bit or 2 x 64-bit only) */
389
sewardj25a85812005-05-08 23:03:48 +0000390 Ain_A87Free, /* free up x87 registers */
391 Ain_A87PushPop, /* x87 loads/stores */
392 Ain_A87FpOp, /* x87 operations */
393 Ain_A87LdCW, /* load x87 control word */
sewardjf4c803b2006-09-11 11:07:34 +0000394 Ain_A87StSW, /* store x87 status word */
sewardja3e98302005-02-01 15:55:05 +0000395//..
396//.. Xin_FpUnary, /* FP fake unary op */
397//.. Xin_FpBinary, /* FP fake binary op */
398//.. Xin_FpLdSt, /* FP fake load/store */
399//.. Xin_FpLdStI, /* FP fake load/store, converting to/from Int */
400//.. Xin_Fp64to32, /* FP round IEEE754 double to IEEE754 single */
401//.. Xin_FpCMov, /* FP fake floating point conditional move */
sewardj25a85812005-05-08 23:03:48 +0000402 Ain_LdMXCSR, /* load %mxcsr */
sewardja3e98302005-02-01 15:55:05 +0000403//.. Xin_FpStSW_AX, /* fstsw %ax */
sewardj25a85812005-05-08 23:03:48 +0000404 Ain_SseUComIS, /* ucomisd/ucomiss, then get %rflags into int
405 register */
406 Ain_SseSI2SF, /* scalar 32/64 int to 32/64 float conversion */
407 Ain_SseSF2SI, /* scalar 32/64 float to 32/64 int conversion */
408 Ain_SseSDSS, /* scalar float32 to/from float64 */
sewardja3e98302005-02-01 15:55:05 +0000409//..
410//.. Xin_SseConst, /* Generate restricted SSE literal */
sewardj25a85812005-05-08 23:03:48 +0000411 Ain_SseLdSt, /* SSE load/store 32/64/128 bits, no alignment
412 constraints, upper 96/64/0 bits arbitrary */
413 Ain_SseLdzLO, /* SSE load low 32/64 bits, zero remainder of reg */
414 Ain_Sse32Fx4, /* SSE binary, 32Fx4 */
415 Ain_Sse32FLo, /* SSE binary, 32F in lowest lane only */
416 Ain_Sse64Fx2, /* SSE binary, 64Fx2 */
417 Ain_Sse64FLo, /* SSE binary, 64F in lowest lane only */
418 Ain_SseReRg, /* SSE binary general reg-reg, Re, Rg */
419 Ain_SseCMov, /* SSE conditional move */
420 Ain_SseShuf /* SSE2 shuffle (pshufd) */
sewardjc33671d2005-02-01 20:30:00 +0000421 }
422 AMD64InstrTag;
423
424/* Destinations are on the RIGHT (second operand) */
425
426typedef
427 struct {
428 AMD64InstrTag tag;
sewardj614b3fb2005-02-02 02:16:03 +0000429 union {
430 struct {
sewardj53df0612005-02-04 21:15:39 +0000431 ULong imm64;
432 HReg dst;
433 } Imm64;
434 struct {
sewardj614b3fb2005-02-02 02:16:03 +0000435 AMD64AluOp op;
436 AMD64RMI* src;
437 HReg dst;
438 } Alu64R;
439 struct {
440 AMD64AluOp op;
441 AMD64RI* src;
442 AMD64AMode* dst;
443 } Alu64M;
sewardj8258a8c2005-02-02 03:11:24 +0000444 struct {
445 AMD64ShiftOp op;
446 UInt src; /* shift amount, or 0 means %cl */
sewardj501a3392005-05-11 15:37:50 +0000447 HReg dst;
sewardj8258a8c2005-02-02 03:11:24 +0000448 } Sh64;
sewardj05b3b6a2005-02-04 01:44:33 +0000449 struct {
sewardj501a3392005-05-11 15:37:50 +0000450 UInt imm32;
451 HReg dst;
sewardj05b3b6a2005-02-04 01:44:33 +0000452 } Test64;
sewardjd0a12df2005-02-10 02:07:43 +0000453 /* Not and Neg */
454 struct {
455 AMD64UnaryOp op;
sewardj501a3392005-05-11 15:37:50 +0000456 HReg dst;
sewardjd0a12df2005-02-10 02:07:43 +0000457 } Unary64;
sewardj6ce1a232007-03-31 19:12:38 +0000458 /* 64-bit compute EA into a reg */
459 struct {
460 AMD64AMode* am;
461 HReg dst;
462 } Lea64;
sewardj501a3392005-05-11 15:37:50 +0000463 /* 64 x 64 -> 128 bit widening multiply: RDX:RAX = RAX *s/u
464 r/m64 */
sewardj9b967672005-02-08 11:13:09 +0000465 struct {
466 Bool syned;
sewardj9b967672005-02-08 11:13:09 +0000467 AMD64RM* src;
468 } MulL;
sewardj7de0d3c2005-02-13 02:26:41 +0000469 /* amd64 div/idiv instruction. Modifies RDX and RAX and
470 reads src. */
471 struct {
472 Bool syned;
473 Int sz; /* 4 or 8 only */
474 AMD64RM* src;
475 } Div;
sewardja3e98302005-02-01 15:55:05 +0000476//.. /* shld/shrd. op may only be Xsh_SHL or Xsh_SHR */
477//.. struct {
478//.. X86ShiftOp op;
479//.. UInt amt; /* shift amount, or 0 means %cl */
480//.. HReg src;
481//.. HReg dst;
482//.. } Sh3232;
sewardj1001dc42005-02-21 08:25:55 +0000483 struct {
484 AMD64RMI* src;
485 } Push;
sewardj05b3b6a2005-02-04 01:44:33 +0000486 /* Pseudo-insn. Call target (an absolute address), on given
487 condition (which could be Xcc_ALWAYS). */
488 struct {
489 AMD64CondCode cond;
490 Addr64 target;
491 Int regparms; /* 0 .. 6 */
492 } Call;
sewardjf67eadf2005-02-03 03:53:52 +0000493 /* Pseudo-insn. Goto dst, on given condition (which could be
494 Acc_ALWAYS). */
495 struct {
496 IRJumpKind jk;
497 AMD64CondCode cond;
498 AMD64RI* dst;
499 } Goto;
sewardj05b3b6a2005-02-04 01:44:33 +0000500 /* Mov src to dst on the given condition, which may not
501 be the bogus Acc_ALWAYS. */
502 struct {
503 AMD64CondCode cond;
504 AMD64RM* src;
505 HReg dst;
506 } CMov64;
sewardjf67eadf2005-02-03 03:53:52 +0000507 /* reg-reg move, zeroing out top half */
508 struct {
509 HReg src;
510 HReg dst;
511 } MovZLQ;
sewardj8258a8c2005-02-02 03:11:24 +0000512 /* Sign/Zero extending loads. Dst size is always 64 bits. */
513 struct {
sewardj18303862005-02-21 12:36:54 +0000514 UChar szSmall; /* only 1, 2 or 4 */
sewardj8258a8c2005-02-02 03:11:24 +0000515 Bool syned;
516 AMD64AMode* src;
517 HReg dst;
518 } LoadEX;
sewardjf67eadf2005-02-03 03:53:52 +0000519 /* 32/16/8 bit stores. */
520 struct {
521 UChar sz; /* only 1, 2 or 4 */
522 HReg src;
523 AMD64AMode* dst;
524 } Store;
sewardja5bd0af2005-03-24 20:40:12 +0000525 /* Convert an amd64 condition code to a 64-bit value (0 or 1). */
526 struct {
527 AMD64CondCode cond;
528 HReg dst;
529 } Set64;
sewardjf53b7352005-04-06 20:01:56 +0000530 /* 64-bit bsf or bsr. */
531 struct {
532 Bool isFwds;
533 HReg src;
534 HReg dst;
535 } Bsfr64;
sewardjd0a12df2005-02-10 02:07:43 +0000536 /* Mem fence. In short, an insn which flushes all preceding
537 loads and stores as much as possible before continuing.
538 On AMD64 we emit a real "mfence". */
539 struct {
540 } MFence;
sewardje9d8a262009-07-01 08:06:34 +0000541 struct {
542 AMD64AMode* addr;
543 UChar sz; /* 1, 2, 4 or 8 */
544 } ACAS;
545 struct {
546 AMD64AMode* addr;
547 UChar sz; /* 4 or 8 only */
548 } DACAS;
sewardjd0a12df2005-02-10 02:07:43 +0000549
sewardj25a85812005-05-08 23:03:48 +0000550 /* --- X87 --- */
551
552 /* A very minimal set of x87 insns, that operate exactly in a
553 stack-like way so no need to think about x87 registers. */
554
555 /* Do 'ffree' on %st(7) .. %st(7-nregs) */
556 struct {
557 Int nregs; /* 1 <= nregs <= 7 */
558 } A87Free;
559
560 /* Push a 64-bit FP value from memory onto the stack, or move
561 a value from the stack to memory and remove it from the
562 stack. */
563 struct {
564 AMD64AMode* addr;
565 Bool isPush;
566 } A87PushPop;
567
568 /* Do an operation on the top-of-stack. This can be unary, in
569 which case it is %st0 = OP( %st0 ), or binary: %st0 = OP(
570 %st0, %st1 ). */
571 struct {
572 A87FpOp op;
573 } A87FpOp;
574
575 /* Load the FPU control word. */
576 struct {
577 AMD64AMode* addr;
578 } A87LdCW;
579
sewardjf4c803b2006-09-11 11:07:34 +0000580 /* Store the FPU status word (fstsw m16) */
581 struct {
582 AMD64AMode* addr;
583 } A87StSW;
584
sewardj25a85812005-05-08 23:03:48 +0000585 /* --- SSE --- */
586
sewardj1a01e652005-02-23 11:39:21 +0000587 /* Load 32 bits into %mxcsr. */
588 struct {
589 AMD64AMode* addr;
590 }
591 LdMXCSR;
sewardja3e98302005-02-01 15:55:05 +0000592//.. /* fstsw %ax */
593//.. struct {
594//.. /* no fields */
595//.. }
596//.. FpStSW_AX;
sewardj18303862005-02-21 12:36:54 +0000597 /* ucomisd/ucomiss, then get %rflags into int register */
598 struct {
599 UChar sz; /* 4 or 8 only */
600 HReg srcL; /* xmm */
601 HReg srcR; /* xmm */
602 HReg dst; /* int */
603 } SseUComIS;
sewardj1a01e652005-02-23 11:39:21 +0000604 /* scalar 32/64 int to 32/64 float conversion */
605 struct {
606 UChar szS; /* 4 or 8 */
607 UChar szD; /* 4 or 8 */
608 HReg src; /* i class */
609 HReg dst; /* v class */
610 } SseSI2SF;
611 /* scalar 32/64 float to 32/64 int conversion */
612 struct {
613 UChar szS; /* 4 or 8 */
614 UChar szD; /* 4 or 8 */
615 HReg src; /* v class */
616 HReg dst; /* i class */
617 } SseSF2SI;
sewardj8d965312005-02-25 02:48:47 +0000618 /* scalar float32 to/from float64 */
619 struct {
620 Bool from64; /* True: 64->32; False: 32->64 */
621 HReg src;
622 HReg dst;
623 } SseSDSS;
sewardja3e98302005-02-01 15:55:05 +0000624//..
625//.. /* Simplistic SSE[123] */
626//.. struct {
627//.. UShort con;
628//.. HReg dst;
629//.. } SseConst;
sewardj1001dc42005-02-21 08:25:55 +0000630 struct {
631 Bool isLoad;
sewardj18303862005-02-21 12:36:54 +0000632 UChar sz; /* 4, 8 or 16 only */
sewardj1001dc42005-02-21 08:25:55 +0000633 HReg reg;
634 AMD64AMode* addr;
635 } SseLdSt;
636 struct {
637 Int sz; /* 4 or 8 only */
638 HReg reg;
639 AMD64AMode* addr;
640 } SseLdzLO;
sewardj8d965312005-02-25 02:48:47 +0000641 struct {
642 AMD64SseOp op;
643 HReg src;
644 HReg dst;
645 } Sse32Fx4;
646 struct {
647 AMD64SseOp op;
648 HReg src;
649 HReg dst;
650 } Sse32FLo;
sewardj4c328cf2005-05-05 12:05:54 +0000651 struct {
652 AMD64SseOp op;
653 HReg src;
654 HReg dst;
655 } Sse64Fx2;
sewardj1001dc42005-02-21 08:25:55 +0000656 struct {
657 AMD64SseOp op;
658 HReg src;
659 HReg dst;
660 } Sse64FLo;
661 struct {
662 AMD64SseOp op;
663 HReg src;
664 HReg dst;
665 } SseReRg;
sewardj8d965312005-02-25 02:48:47 +0000666 /* Mov src to dst on the given condition, which may not
667 be the bogus Xcc_ALWAYS. */
668 struct {
669 AMD64CondCode cond;
670 HReg src;
671 HReg dst;
672 } SseCMov;
sewardj09717342005-05-05 21:34:02 +0000673 struct {
674 Int order; /* 0 <= order <= 0xFF */
675 HReg src;
676 HReg dst;
677 } SseShuf;
sewardj614b3fb2005-02-02 02:16:03 +0000678
679 } Ain;
sewardjc33671d2005-02-01 20:30:00 +0000680 }
681 AMD64Instr;
682
sewardj25a85812005-05-08 23:03:48 +0000683extern AMD64Instr* AMD64Instr_Imm64 ( ULong imm64, HReg dst );
684extern AMD64Instr* AMD64Instr_Alu64R ( AMD64AluOp, AMD64RMI*, HReg );
685extern AMD64Instr* AMD64Instr_Alu64M ( AMD64AluOp, AMD64RI*, AMD64AMode* );
sewardj501a3392005-05-11 15:37:50 +0000686extern AMD64Instr* AMD64Instr_Unary64 ( AMD64UnaryOp op, HReg dst );
sewardj6ce1a232007-03-31 19:12:38 +0000687extern AMD64Instr* AMD64Instr_Lea64 ( AMD64AMode* am, HReg dst );
sewardj501a3392005-05-11 15:37:50 +0000688extern AMD64Instr* AMD64Instr_Sh64 ( AMD64ShiftOp, UInt, HReg );
689extern AMD64Instr* AMD64Instr_Test64 ( UInt imm32, HReg dst );
690extern AMD64Instr* AMD64Instr_MulL ( Bool syned, AMD64RM* );
sewardj25a85812005-05-08 23:03:48 +0000691extern AMD64Instr* AMD64Instr_Div ( Bool syned, Int sz, AMD64RM* );
sewardj614b3fb2005-02-02 02:16:03 +0000692//.. extern AMD64Instr* AMD64Instr_Sh3232 ( AMD64ShiftOp, UInt amt, HReg src, HReg dst );
sewardj25a85812005-05-08 23:03:48 +0000693extern AMD64Instr* AMD64Instr_Push ( AMD64RMI* );
694extern AMD64Instr* AMD64Instr_Call ( AMD64CondCode, Addr64, Int );
695extern AMD64Instr* AMD64Instr_Goto ( IRJumpKind, AMD64CondCode cond, AMD64RI* dst );
696extern AMD64Instr* AMD64Instr_CMov64 ( AMD64CondCode, AMD64RM* src, HReg dst );
697extern AMD64Instr* AMD64Instr_MovZLQ ( HReg src, HReg dst );
698extern AMD64Instr* AMD64Instr_LoadEX ( UChar szSmall, Bool syned,
699 AMD64AMode* src, HReg dst );
700extern AMD64Instr* AMD64Instr_Store ( UChar sz, HReg src, AMD64AMode* dst );
701extern AMD64Instr* AMD64Instr_Set64 ( AMD64CondCode cond, HReg dst );
702extern AMD64Instr* AMD64Instr_Bsfr64 ( Bool isFwds, HReg src, HReg dst );
703extern AMD64Instr* AMD64Instr_MFence ( void );
sewardje9d8a262009-07-01 08:06:34 +0000704extern AMD64Instr* AMD64Instr_ACAS ( AMD64AMode* addr, UChar sz );
705extern AMD64Instr* AMD64Instr_DACAS ( AMD64AMode* addr, UChar sz );
706
sewardj25a85812005-05-08 23:03:48 +0000707extern AMD64Instr* AMD64Instr_A87Free ( Int nregs );
708extern AMD64Instr* AMD64Instr_A87PushPop ( AMD64AMode* addr, Bool isPush );
709extern AMD64Instr* AMD64Instr_A87FpOp ( A87FpOp op );
710extern AMD64Instr* AMD64Instr_A87LdCW ( AMD64AMode* addr );
sewardjf4c803b2006-09-11 11:07:34 +0000711extern AMD64Instr* AMD64Instr_A87StSW ( AMD64AMode* addr );
sewardja3e98302005-02-01 15:55:05 +0000712//..
sewardj614b3fb2005-02-02 02:16:03 +0000713//.. extern AMD64Instr* AMD64Instr_FpUnary ( AMD64FpOp op, HReg src, HReg dst );
714//.. extern AMD64Instr* AMD64Instr_FpBinary ( AMD64FpOp op, HReg srcL, HReg srcR, HReg dst );
715//.. extern AMD64Instr* AMD64Instr_FpLdSt ( Bool isLoad, UChar sz, HReg reg, AMD64AMode* );
716//.. extern AMD64Instr* AMD64Instr_FpLdStI ( Bool isLoad, UChar sz, HReg reg, AMD64AMode* );
717//.. extern AMD64Instr* AMD64Instr_Fp64to32 ( HReg src, HReg dst );
718//.. extern AMD64Instr* AMD64Instr_FpCMov ( AMD64CondCode, HReg src, HReg dst );
sewardj25a85812005-05-08 23:03:48 +0000719extern AMD64Instr* AMD64Instr_LdMXCSR ( AMD64AMode* );
sewardj614b3fb2005-02-02 02:16:03 +0000720//.. extern AMD64Instr* AMD64Instr_FpStSW_AX ( void );
sewardj25a85812005-05-08 23:03:48 +0000721extern AMD64Instr* AMD64Instr_SseUComIS ( Int sz, HReg srcL, HReg srcR, HReg dst );
722extern AMD64Instr* AMD64Instr_SseSI2SF ( Int szS, Int szD, HReg src, HReg dst );
723extern AMD64Instr* AMD64Instr_SseSF2SI ( Int szS, Int szD, HReg src, HReg dst );
724extern AMD64Instr* AMD64Instr_SseSDSS ( Bool from64, HReg src, HReg dst );
sewardja3e98302005-02-01 15:55:05 +0000725//..
sewardj614b3fb2005-02-02 02:16:03 +0000726//.. extern AMD64Instr* AMD64Instr_SseConst ( UShort con, HReg dst );
sewardj25a85812005-05-08 23:03:48 +0000727extern AMD64Instr* AMD64Instr_SseLdSt ( Bool isLoad, Int sz, HReg, AMD64AMode* );
728extern AMD64Instr* AMD64Instr_SseLdzLO ( Int sz, HReg, AMD64AMode* );
729extern AMD64Instr* AMD64Instr_Sse32Fx4 ( AMD64SseOp, HReg, HReg );
730extern AMD64Instr* AMD64Instr_Sse32FLo ( AMD64SseOp, HReg, HReg );
731extern AMD64Instr* AMD64Instr_Sse64Fx2 ( AMD64SseOp, HReg, HReg );
732extern AMD64Instr* AMD64Instr_Sse64FLo ( AMD64SseOp, HReg, HReg );
733extern AMD64Instr* AMD64Instr_SseReRg ( AMD64SseOp, HReg, HReg );
734extern AMD64Instr* AMD64Instr_SseCMov ( AMD64CondCode, HReg src, HReg dst );
735extern AMD64Instr* AMD64Instr_SseShuf ( Int order, HReg src, HReg dst );
sewardjc33671d2005-02-01 20:30:00 +0000736
737
cerion92b64362005-12-13 12:02:26 +0000738extern void ppAMD64Instr ( AMD64Instr*, Bool );
sewardjc33671d2005-02-01 20:30:00 +0000739
740/* Some functions that insulate the register allocator from details
741 of the underlying instruction set. */
cerion92b64362005-12-13 12:02:26 +0000742extern void getRegUsage_AMD64Instr ( HRegUsage*, AMD64Instr*, Bool );
743extern void mapRegs_AMD64Instr ( HRegRemap*, AMD64Instr*, Bool );
sewardjc33671d2005-02-01 20:30:00 +0000744extern Bool isMove_AMD64Instr ( AMD64Instr*, HReg*, HReg* );
sewardj0528bb52005-12-15 15:45:20 +0000745extern Int emit_AMD64Instr ( UChar* buf, Int nbuf, AMD64Instr*,
746 Bool, void* dispatch );
cerion92b64362005-12-13 12:02:26 +0000747extern AMD64Instr* genSpill_AMD64 ( HReg rreg, Int offset, Bool );
748extern AMD64Instr* genReload_AMD64 ( HReg rreg, Int offset, Bool );
sewardjc33671d2005-02-01 20:30:00 +0000749extern void getAllocableRegs_AMD64 ( Int*, HReg** );
sewardjdd40fdf2006-12-24 02:20:24 +0000750extern HInstrArray* iselSB_AMD64 ( IRSB*, VexArch,
sewardjaca070a2006-10-17 00:28:22 +0000751 VexArchInfo*,
sewardjdd40fdf2006-12-24 02:20:24 +0000752 VexAbiInfo* );
sewardja3e98302005-02-01 15:55:05 +0000753
754#endif /* ndef __LIBVEX_HOST_AMD64_HDEFS_H */
755
756/*---------------------------------------------------------------*/
757/*--- end host-amd64/hdefs.h ---*/
758/*---------------------------------------------------------------*/