1 /* vm/jit/x86_64/emitfuncs.c - x86_64 code emitter functions
3 Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4 R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5 C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6 Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25 Contact: cacao@complang.tuwien.ac.at
27 Authors: Christian Thalinger
29 $Id: emitfuncs.c 1735 2004-12-07 14:33:27Z twisti $
34 #include "vm/jit/jit.h"
35 #include "vm/jit/x86_64/codegen.h"
36 #include "vm/jit/x86_64/emitfuncs.h"
37 #include "vm/jit/x86_64/types.h"
40 /* code generation functions */
42 void x86_64_emit_ialu(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr)
44 s4 s1 = src->prev->regoff;
46 s4 d = iptr->dst->regoff;
48 if (iptr->dst->flags & INMEMORY) {
49 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
51 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
52 x86_64_alul_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
55 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
56 x86_64_alul_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
59 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
60 x86_64_alul_membase_reg(cd, alu_op, REG_SP, s2 * 8, REG_ITMP1);
61 x86_64_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
64 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
66 x86_64_alul_reg_membase(cd, alu_op, s1, REG_SP, d * 8);
69 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
70 x86_64_alul_reg_reg(cd, alu_op, s1, REG_ITMP1);
71 x86_64_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
74 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
76 x86_64_alul_reg_membase(cd, alu_op, s2, REG_SP, d * 8);
79 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
80 x86_64_alul_reg_reg(cd, alu_op, s2, REG_ITMP1);
81 x86_64_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
85 x86_64_movl_reg_membase(cd, s1, REG_SP, d * 8);
86 x86_64_alul_reg_membase(cd, alu_op, s2, REG_SP, d * 8);
90 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
91 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, d);
92 x86_64_alul_membase_reg(cd, alu_op, REG_SP, s2 * 8, d);
94 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
96 x86_64_alul_membase_reg(cd, alu_op, REG_SP, s2 * 8, d);
98 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
100 x86_64_alul_membase_reg(cd, alu_op, REG_SP, s1 * 8, d);
104 x86_64_alul_reg_reg(cd, alu_op, s1, d);
108 x86_64_alul_reg_reg(cd, alu_op, s2, d);
115 void x86_64_emit_lalu(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr)
117 s4 s1 = src->prev->regoff;
119 s4 d = iptr->dst->regoff;
121 if (iptr->dst->flags & INMEMORY) {
122 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
124 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
125 x86_64_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
127 } else if (s1 == d) {
128 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
129 x86_64_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
132 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
133 x86_64_alu_membase_reg(cd, alu_op, REG_SP, s2 * 8, REG_ITMP1);
134 x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
137 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
139 x86_64_alu_reg_membase(cd, alu_op, s1, REG_SP, d * 8);
142 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
143 x86_64_alu_reg_reg(cd, alu_op, s1, REG_ITMP1);
144 x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
147 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
149 x86_64_alu_reg_membase(cd, alu_op, s2, REG_SP, d * 8);
152 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
153 x86_64_alu_reg_reg(cd, alu_op, s2, REG_ITMP1);
154 x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
158 x86_64_mov_reg_membase(cd, s1, REG_SP, d * 8);
159 x86_64_alu_reg_membase(cd, alu_op, s2, REG_SP, d * 8);
163 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
164 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, d);
165 x86_64_alu_membase_reg(cd, alu_op, REG_SP, s2 * 8, d);
167 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
169 x86_64_alu_membase_reg(cd, alu_op, REG_SP, s2 * 8, d);
171 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
173 x86_64_alu_membase_reg(cd, alu_op, REG_SP, s1 * 8, d);
177 x86_64_alu_reg_reg(cd, alu_op, s1, d);
181 x86_64_alu_reg_reg(cd, alu_op, s2, d);
188 void x86_64_emit_ialuconst(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr)
191 s4 d = iptr->dst->regoff;
193 if (iptr->dst->flags & INMEMORY) {
194 if (src->flags & INMEMORY) {
196 x86_64_alul_imm_membase(cd, alu_op, iptr->val.i, REG_SP, d * 8);
199 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
200 x86_64_alul_imm_reg(cd, alu_op, iptr->val.i, REG_ITMP1);
201 x86_64_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
205 x86_64_movl_reg_membase(cd, s1, REG_SP, d * 8);
206 x86_64_alul_imm_membase(cd, alu_op, iptr->val.i, REG_SP, d * 8);
210 if (src->flags & INMEMORY) {
211 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, d);
212 x86_64_alul_imm_reg(cd, alu_op, iptr->val.i, d);
216 x86_64_alul_imm_reg(cd, alu_op, iptr->val.i, d);
222 void x86_64_emit_laluconst(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr)
225 s4 d = iptr->dst->regoff;
227 if (iptr->dst->flags & INMEMORY) {
228 if (src->flags & INMEMORY) {
230 if (x86_64_is_imm32(iptr->val.l)) {
231 x86_64_alu_imm_membase(cd, alu_op, iptr->val.l, REG_SP, d * 8);
234 x86_64_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
235 x86_64_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
239 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
241 if (x86_64_is_imm32(iptr->val.l)) {
242 x86_64_alu_imm_reg(cd, alu_op, iptr->val.l, REG_ITMP1);
245 x86_64_mov_imm_reg(cd, iptr->val.l, REG_ITMP2);
246 x86_64_alu_reg_reg(cd, alu_op, REG_ITMP2, REG_ITMP1);
248 x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
252 x86_64_mov_reg_membase(cd, s1, REG_SP, d * 8);
254 if (x86_64_is_imm32(iptr->val.l)) {
255 x86_64_alu_imm_membase(cd, alu_op, iptr->val.l, REG_SP, d * 8);
258 x86_64_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
259 x86_64_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
264 if (src->flags & INMEMORY) {
265 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, d);
271 if (x86_64_is_imm32(iptr->val.l)) {
272 x86_64_alu_imm_reg(cd, alu_op, iptr->val.l, d);
275 x86_64_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
276 x86_64_alu_reg_reg(cd, alu_op, REG_ITMP1, d);
282 void x86_64_emit_ishift(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr)
284 s4 s1 = src->prev->regoff;
286 s4 d = iptr->dst->regoff;
288 M_INTMOVE(RCX, REG_ITMP1); /* save RCX */
289 if (iptr->dst->flags & INMEMORY) {
290 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
292 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, RCX);
293 x86_64_shiftl_membase(cd, shift_op, REG_SP, d * 8);
296 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, RCX);
297 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP2);
298 x86_64_shiftl_reg(cd, shift_op, REG_ITMP2);
299 x86_64_movl_reg_membase(cd, REG_ITMP2, REG_SP, d * 8);
302 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
303 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, RCX);
304 x86_64_movl_reg_membase(cd, s1, REG_SP, d * 8);
305 x86_64_shiftl_membase(cd, shift_op, REG_SP, d * 8);
307 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
310 x86_64_shiftl_membase(cd, shift_op, REG_SP, d * 8);
314 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP2);
315 x86_64_shiftl_reg(cd, shift_op, REG_ITMP2);
316 x86_64_movl_reg_membase(cd, REG_ITMP2, REG_SP, d * 8);
321 x86_64_movl_reg_membase(cd, s1, REG_SP, d * 8);
322 x86_64_shiftl_membase(cd, shift_op, REG_SP, d * 8);
324 M_INTMOVE(REG_ITMP1, RCX); /* restore RCX */
331 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
332 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, RCX);
333 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, d);
334 x86_64_shiftl_reg(cd, shift_op, d);
336 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
337 M_INTMOVE(s1, d); /* maybe src is RCX */
338 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, RCX);
339 x86_64_shiftl_reg(cd, shift_op, d);
341 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
343 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, d);
344 x86_64_shiftl_reg(cd, shift_op, d);
355 x86_64_shiftl_reg(cd, shift_op, d);
359 M_INTMOVE(REG_ITMP3, RCX);
362 M_INTMOVE(REG_ITMP1, RCX); /* restore RCX */
368 void x86_64_emit_lshift(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr)
370 s4 s1 = src->prev->regoff;
372 s4 d = iptr->dst->regoff;
374 M_INTMOVE(RCX, REG_ITMP1); /* save RCX */
375 if (iptr->dst->flags & INMEMORY) {
376 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
378 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, RCX);
379 x86_64_shift_membase(cd, shift_op, REG_SP, d * 8);
382 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, RCX);
383 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP2);
384 x86_64_shift_reg(cd, shift_op, REG_ITMP2);
385 x86_64_mov_reg_membase(cd, REG_ITMP2, REG_SP, d * 8);
388 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
389 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, RCX);
390 x86_64_mov_reg_membase(cd, s1, REG_SP, d * 8);
391 x86_64_shift_membase(cd, shift_op, REG_SP, d * 8);
393 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
396 x86_64_shift_membase(cd, shift_op, REG_SP, d * 8);
400 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP2);
401 x86_64_shift_reg(cd, shift_op, REG_ITMP2);
402 x86_64_mov_reg_membase(cd, REG_ITMP2, REG_SP, d * 8);
407 x86_64_mov_reg_membase(cd, s1, REG_SP, d * 8);
408 x86_64_shift_membase(cd, shift_op, REG_SP, d * 8);
410 M_INTMOVE(REG_ITMP1, RCX); /* restore RCX */
417 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
418 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, RCX);
419 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, d);
420 x86_64_shift_reg(cd, shift_op, d);
422 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
423 M_INTMOVE(s1, d); /* maybe src is RCX */
424 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, RCX);
425 x86_64_shift_reg(cd, shift_op, d);
427 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
429 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, d);
430 x86_64_shift_reg(cd, shift_op, d);
440 x86_64_shift_reg(cd, shift_op, d);
444 M_INTMOVE(REG_ITMP3, RCX);
447 M_INTMOVE(REG_ITMP1, RCX); /* restore RCX */
453 void x86_64_emit_ishiftconst(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr)
456 s4 d = iptr->dst->regoff;
458 if ((src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) {
460 x86_64_shiftl_imm_membase(cd, shift_op, iptr->val.i, REG_SP, d * 8);
463 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
464 x86_64_shiftl_imm_reg(cd, shift_op, iptr->val.i, REG_ITMP1);
465 x86_64_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
468 } else if ((src->flags & INMEMORY) && !(iptr->dst->flags & INMEMORY)) {
469 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, d);
470 x86_64_shiftl_imm_reg(cd, shift_op, iptr->val.i, d);
472 } else if (!(src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) {
473 x86_64_movl_reg_membase(cd, s1, REG_SP, d * 8);
474 x86_64_shiftl_imm_membase(cd, shift_op, iptr->val.i, REG_SP, d * 8);
478 x86_64_shiftl_imm_reg(cd, shift_op, iptr->val.i, d);
483 void x86_64_emit_lshiftconst(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr)
486 s4 d = iptr->dst->regoff;
488 if ((src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) {
490 x86_64_shift_imm_membase(cd, shift_op, iptr->val.i, REG_SP, d * 8);
493 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
494 x86_64_shift_imm_reg(cd, shift_op, iptr->val.i, REG_ITMP1);
495 x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
498 } else if ((src->flags & INMEMORY) && !(iptr->dst->flags & INMEMORY)) {
499 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, d);
500 x86_64_shift_imm_reg(cd, shift_op, iptr->val.i, d);
502 } else if (!(src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) {
503 x86_64_mov_reg_membase(cd, s1, REG_SP, d * 8);
504 x86_64_shift_imm_membase(cd, shift_op, iptr->val.i, REG_SP, d * 8);
508 x86_64_shift_imm_reg(cd, shift_op, iptr->val.i, d);
513 void x86_64_emit_ifcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr)
515 if (src->flags & INMEMORY) {
516 x86_64_alul_imm_membase(cd, X86_64_CMP, iptr->val.i, REG_SP, src->regoff * 8);
519 if (iptr->val.i == 0) {
520 x86_64_testl_reg_reg(cd, src->regoff, src->regoff);
523 x86_64_alul_imm_reg(cd, X86_64_CMP, iptr->val.i, src->regoff);
526 x86_64_jcc(cd, if_op, 0);
527 codegen_addreference(cd, BlockPtrOfPC(iptr->op1), cd->mcodeptr);
531 void x86_64_emit_if_lcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr)
535 if (src->flags & INMEMORY) {
536 if (x86_64_is_imm32(iptr->val.l)) {
537 x86_64_alu_imm_membase(cd, X86_64_CMP, iptr->val.l, REG_SP, s1 * 8);
540 x86_64_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
541 x86_64_alu_reg_membase(cd, X86_64_CMP, REG_ITMP1, REG_SP, s1 * 8);
545 if (iptr->val.l == 0) {
546 x86_64_test_reg_reg(cd, s1, s1);
549 if (x86_64_is_imm32(iptr->val.l)) {
550 x86_64_alu_imm_reg(cd, X86_64_CMP, iptr->val.l, s1);
553 x86_64_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
554 x86_64_alu_reg_reg(cd, X86_64_CMP, REG_ITMP1, s1);
558 x86_64_jcc(cd, if_op, 0);
559 codegen_addreference(cd, BlockPtrOfPC(iptr->op1), cd->mcodeptr);
563 void x86_64_emit_if_icmpcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr)
565 s4 s1 = src->prev->regoff;
568 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
569 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
570 x86_64_alul_reg_membase(cd, X86_64_CMP, REG_ITMP1, REG_SP, s1 * 8);
572 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
573 x86_64_alul_membase_reg(cd, X86_64_CMP, REG_SP, s2 * 8, s1);
575 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
576 x86_64_alul_reg_membase(cd, X86_64_CMP, s2, REG_SP, s1 * 8);
579 x86_64_alul_reg_reg(cd, X86_64_CMP, s2, s1);
581 x86_64_jcc(cd, if_op, 0);
582 codegen_addreference(cd, BlockPtrOfPC(iptr->op1), cd->mcodeptr);
586 void x86_64_emit_if_lcmpcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr)
588 s4 s1 = src->prev->regoff;
591 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
592 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
593 x86_64_alu_reg_membase(cd, X86_64_CMP, REG_ITMP1, REG_SP, s1 * 8);
595 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
596 x86_64_alu_membase_reg(cd, X86_64_CMP, REG_SP, s2 * 8, s1);
598 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
599 x86_64_alu_reg_membase(cd, X86_64_CMP, s2, REG_SP, s1 * 8);
602 x86_64_alu_reg_reg(cd, X86_64_CMP, s2, s1);
604 x86_64_jcc(cd, if_op, 0);
605 codegen_addreference(cd, BlockPtrOfPC(iptr->op1), cd->mcodeptr);
612 void x86_64_mov_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
613 x86_64_emit_rex(1,(reg),0,(dreg));
614 *(cd->mcodeptr++) = 0x89;
615 x86_64_emit_reg((reg),(dreg));
619 void x86_64_mov_imm_reg(codegendata *cd, s8 imm, s8 reg) {
620 x86_64_emit_rex(1,0,0,(reg));
621 *(cd->mcodeptr++) = 0xb8 + ((reg) & 0x07);
622 x86_64_emit_imm64((imm));
626 void x86_64_movl_imm_reg(codegendata *cd, s8 imm, s8 reg) {
627 x86_64_emit_rex(0,0,0,(reg));
628 *(cd->mcodeptr++) = 0xb8 + ((reg) & 0x07);
629 x86_64_emit_imm32((imm));
633 void x86_64_mov_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
634 x86_64_emit_rex(1,(reg),0,(basereg));
635 *(cd->mcodeptr++) = 0x8b;
636 x86_64_emit_membase((basereg),(disp),(reg));
640 void x86_64_movl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
641 x86_64_emit_rex(0,(reg),0,(basereg));
642 *(cd->mcodeptr++) = 0x8b;
643 x86_64_emit_membase((basereg),(disp),(reg));
648 * this one is for INVOKEVIRTUAL/INVOKEINTERFACE to have a
649 * constant membase immediate length of 32bit
651 void x86_64_mov_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
652 x86_64_emit_rex(1,(reg),0,(basereg));
653 *(cd->mcodeptr++) = 0x8b;
654 x86_64_address_byte(2, (reg), (basereg));
655 x86_64_emit_imm32((disp));
659 void x86_64_mov_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
660 x86_64_emit_rex(1,(reg),0,(basereg));
661 *(cd->mcodeptr++) = 0x89;
662 x86_64_emit_membase((basereg),(disp),(reg));
666 void x86_64_movl_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
667 x86_64_emit_rex(0,(reg),0,(basereg));
668 *(cd->mcodeptr++) = 0x89;
669 x86_64_emit_membase((basereg),(disp),(reg));
673 void x86_64_mov_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
674 x86_64_emit_rex(1,(reg),(indexreg),(basereg));
675 *(cd->mcodeptr++) = 0x8b;
676 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
680 void x86_64_movl_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
681 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
682 *(cd->mcodeptr++) = 0x8b;
683 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
687 void x86_64_mov_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
688 x86_64_emit_rex(1,(reg),(indexreg),(basereg));
689 *(cd->mcodeptr++) = 0x89;
690 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
694 void x86_64_movl_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
695 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
696 *(cd->mcodeptr++) = 0x89;
697 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
701 void x86_64_movw_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
702 *(cd->mcodeptr++) = 0x66;
703 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
704 *(cd->mcodeptr++) = 0x89;
705 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
709 void x86_64_movb_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
710 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
711 *(cd->mcodeptr++) = 0x88;
712 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
716 void x86_64_mov_imm_membase(codegendata *cd, s8 imm, s8 basereg, s8 disp) {
717 x86_64_emit_rex(1,0,0,(basereg));
718 *(cd->mcodeptr++) = 0xc7;
719 x86_64_emit_membase((basereg),(disp),0);
720 x86_64_emit_imm32((imm));
724 void x86_64_movl_imm_membase(codegendata *cd, s8 imm, s8 basereg, s8 disp) {
725 x86_64_emit_rex(0,0,0,(basereg));
726 *(cd->mcodeptr++) = 0xc7;
727 x86_64_emit_membase((basereg),(disp),0);
728 x86_64_emit_imm32((imm));
732 void x86_64_movsbq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
733 x86_64_emit_rex(1,(dreg),0,(reg));
734 *(cd->mcodeptr++) = 0x0f;
735 *(cd->mcodeptr++) = 0xbe;
736 /* XXX: why do reg and dreg have to be exchanged */
737 x86_64_emit_reg((dreg),(reg));
741 void x86_64_movsbq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
742 x86_64_emit_rex(1,(dreg),0,(basereg));
743 *(cd->mcodeptr++) = 0x0f;
744 *(cd->mcodeptr++) = 0xbe;
745 x86_64_emit_membase((basereg),(disp),(dreg));
749 void x86_64_movswq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
750 x86_64_emit_rex(1,(dreg),0,(reg));
751 *(cd->mcodeptr++) = 0x0f;
752 *(cd->mcodeptr++) = 0xbf;
753 /* XXX: why do reg and dreg have to be exchanged */
754 x86_64_emit_reg((dreg),(reg));
758 void x86_64_movswq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
759 x86_64_emit_rex(1,(dreg),0,(basereg));
760 *(cd->mcodeptr++) = 0x0f;
761 *(cd->mcodeptr++) = 0xbf;
762 x86_64_emit_membase((basereg),(disp),(dreg));
766 void x86_64_movslq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
767 x86_64_emit_rex(1,(dreg),0,(reg));
768 *(cd->mcodeptr++) = 0x63;
769 /* XXX: why do reg and dreg have to be exchanged */
770 x86_64_emit_reg((dreg),(reg));
774 void x86_64_movslq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
775 x86_64_emit_rex(1,(dreg),0,(basereg));
776 *(cd->mcodeptr++) = 0x63;
777 x86_64_emit_membase((basereg),(disp),(dreg));
781 void x86_64_movzwq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
782 x86_64_emit_rex(1,(dreg),0,(reg));
783 *(cd->mcodeptr++) = 0x0f;
784 *(cd->mcodeptr++) = 0xb7;
785 /* XXX: why do reg and dreg have to be exchanged */
786 x86_64_emit_reg((dreg),(reg));
790 void x86_64_movzwq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
791 x86_64_emit_rex(1,(dreg),0,(basereg));
792 *(cd->mcodeptr++) = 0x0f;
793 *(cd->mcodeptr++) = 0xb7;
794 x86_64_emit_membase((basereg),(disp),(dreg));
798 void x86_64_movswq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
799 x86_64_emit_rex(1,(reg),(indexreg),(basereg));
800 *(cd->mcodeptr++) = 0x0f;
801 *(cd->mcodeptr++) = 0xbf;
802 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
806 void x86_64_movsbq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
807 x86_64_emit_rex(1,(reg),(indexreg),(basereg));
808 *(cd->mcodeptr++) = 0x0f;
809 *(cd->mcodeptr++) = 0xbe;
810 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
814 void x86_64_movzwq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
815 x86_64_emit_rex(1,(reg),(indexreg),(basereg));
816 *(cd->mcodeptr++) = 0x0f;
817 *(cd->mcodeptr++) = 0xb7;
818 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
822 void x86_64_mov_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
824 x86_64_emit_rex(1,0,(indexreg),(basereg));
825 *(cd->mcodeptr++) = 0xc7;
826 x86_64_emit_memindex(0,(disp),(basereg),(indexreg),(scale));
827 x86_64_emit_imm32((imm));
831 void x86_64_movl_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
833 x86_64_emit_rex(0,0,(indexreg),(basereg));
834 *(cd->mcodeptr++) = 0xc7;
835 x86_64_emit_memindex(0,(disp),(basereg),(indexreg),(scale));
836 x86_64_emit_imm32((imm));
840 void x86_64_movw_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
842 *(cd->mcodeptr++) = 0x66;
843 x86_64_emit_rex(0,0,(indexreg),(basereg));
844 *(cd->mcodeptr++) = 0xc7;
845 x86_64_emit_memindex(0,(disp),(basereg),(indexreg),(scale));
846 x86_64_emit_imm16((imm));
850 void x86_64_movb_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
852 x86_64_emit_rex(0,0,(indexreg),(basereg));
853 *(cd->mcodeptr++) = 0xc6;
854 x86_64_emit_memindex(0,(disp),(basereg),(indexreg),(scale));
855 x86_64_emit_imm8((imm));
862 void x86_64_alu_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg) {
863 x86_64_emit_rex(1,(reg),0,(dreg));
864 *(cd->mcodeptr++) = (((opc)) << 3) + 1;
865 x86_64_emit_reg((reg),(dreg));
869 void x86_64_alul_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg) {
870 x86_64_emit_rex(0,(reg),0,(dreg));
871 *(cd->mcodeptr++) = (((opc)) << 3) + 1;
872 x86_64_emit_reg((reg),(dreg));
876 void x86_64_alu_reg_membase(codegendata *cd, s8 opc, s8 reg, s8 basereg, s8 disp) {
877 x86_64_emit_rex(1,(reg),0,(basereg));
878 *(cd->mcodeptr++) = (((opc)) << 3) + 1;
879 x86_64_emit_membase((basereg),(disp),(reg));
883 void x86_64_alul_reg_membase(codegendata *cd, s8 opc, s8 reg, s8 basereg, s8 disp) {
884 x86_64_emit_rex(0,(reg),0,(basereg));
885 *(cd->mcodeptr++) = (((opc)) << 3) + 1;
886 x86_64_emit_membase((basereg),(disp),(reg));
890 void x86_64_alu_membase_reg(codegendata *cd, s8 opc, s8 basereg, s8 disp, s8 reg) {
891 x86_64_emit_rex(1,(reg),0,(basereg));
892 *(cd->mcodeptr++) = (((opc)) << 3) + 3;
893 x86_64_emit_membase((basereg),(disp),(reg));
897 void x86_64_alul_membase_reg(codegendata *cd, s8 opc, s8 basereg, s8 disp, s8 reg) {
898 x86_64_emit_rex(0,(reg),0,(basereg));
899 *(cd->mcodeptr++) = (((opc)) << 3) + 3;
900 x86_64_emit_membase((basereg),(disp),(reg));
904 void x86_64_alu_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg) {
905 if (x86_64_is_imm8(imm)) {
906 x86_64_emit_rex(1,0,0,(dreg));
907 *(cd->mcodeptr++) = 0x83;
908 x86_64_emit_reg((opc),(dreg));
909 x86_64_emit_imm8((imm));
911 x86_64_emit_rex(1,0,0,(dreg));
912 *(cd->mcodeptr++) = 0x81;
913 x86_64_emit_reg((opc),(dreg));
914 x86_64_emit_imm32((imm));
919 void x86_64_alul_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg) {
920 if (x86_64_is_imm8(imm)) {
921 x86_64_emit_rex(0,0,0,(dreg));
922 *(cd->mcodeptr++) = 0x83;
923 x86_64_emit_reg((opc),(dreg));
924 x86_64_emit_imm8((imm));
926 x86_64_emit_rex(0,0,0,(dreg));
927 *(cd->mcodeptr++) = 0x81;
928 x86_64_emit_reg((opc),(dreg));
929 x86_64_emit_imm32((imm));
934 void x86_64_alu_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp) {
935 if (x86_64_is_imm8(imm)) {
936 x86_64_emit_rex(1,(basereg),0,0);
937 *(cd->mcodeptr++) = 0x83;
938 x86_64_emit_membase((basereg),(disp),(opc));
939 x86_64_emit_imm8((imm));
941 x86_64_emit_rex(1,(basereg),0,0);
942 *(cd->mcodeptr++) = 0x81;
943 x86_64_emit_membase((basereg),(disp),(opc));
944 x86_64_emit_imm32((imm));
949 void x86_64_alul_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp) {
950 if (x86_64_is_imm8(imm)) {
951 x86_64_emit_rex(0,(basereg),0,0);
952 *(cd->mcodeptr++) = 0x83;
953 x86_64_emit_membase((basereg),(disp),(opc));
954 x86_64_emit_imm8((imm));
956 x86_64_emit_rex(0,(basereg),0,0);
957 *(cd->mcodeptr++) = 0x81;
958 x86_64_emit_membase((basereg),(disp),(opc));
959 x86_64_emit_imm32((imm));
964 void x86_64_test_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
965 x86_64_emit_rex(1,(reg),0,(dreg));
966 *(cd->mcodeptr++) = 0x85;
967 x86_64_emit_reg((reg),(dreg));
971 void x86_64_testl_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
972 x86_64_emit_rex(0,(reg),0,(dreg));
973 *(cd->mcodeptr++) = 0x85;
974 x86_64_emit_reg((reg),(dreg));
978 void x86_64_test_imm_reg(codegendata *cd, s8 imm, s8 reg) {
979 *(cd->mcodeptr++) = 0xf7;
980 x86_64_emit_reg(0,(reg));
981 x86_64_emit_imm32((imm));
985 void x86_64_testw_imm_reg(codegendata *cd, s8 imm, s8 reg) {
986 *(cd->mcodeptr++) = 0x66;
987 *(cd->mcodeptr++) = 0xf7;
988 x86_64_emit_reg(0,(reg));
989 x86_64_emit_imm16((imm));
993 void x86_64_testb_imm_reg(codegendata *cd, s8 imm, s8 reg) {
994 *(cd->mcodeptr++) = 0xf6;
995 x86_64_emit_reg(0,(reg));
996 x86_64_emit_imm8((imm));
1000 void x86_64_lea_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
1001 x86_64_emit_rex(1,(reg),0,(basereg));
1002 *(cd->mcodeptr++) = 0x8d;
1003 x86_64_emit_membase((basereg),(disp),(reg));
1007 void x86_64_leal_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
1008 x86_64_emit_rex(0,(reg),0,(basereg));
1009 *(cd->mcodeptr++) = 0x8d;
1010 x86_64_emit_membase((basereg),(disp),(reg));
1016 * inc, dec operations
1018 void x86_64_inc_reg(codegendata *cd, s8 reg) {
1019 x86_64_emit_rex(1,0,0,(reg));
1020 *(cd->mcodeptr++) = 0xff;
1021 x86_64_emit_reg(0,(reg));
1025 void x86_64_incl_reg(codegendata *cd, s8 reg) {
1026 x86_64_emit_rex(0,0,0,(reg));
1027 *(cd->mcodeptr++) = 0xff;
1028 x86_64_emit_reg(0,(reg));
1032 void x86_64_inc_membase(codegendata *cd, s8 basereg, s8 disp) {
1033 x86_64_emit_rex(1,(basereg),0,0);
1034 *(cd->mcodeptr++) = 0xff;
1035 x86_64_emit_membase((basereg),(disp),0);
1039 void x86_64_incl_membase(codegendata *cd, s8 basereg, s8 disp) {
1040 x86_64_emit_rex(0,(basereg),0,0);
1041 *(cd->mcodeptr++) = 0xff;
1042 x86_64_emit_membase((basereg),(disp),0);
1046 void x86_64_dec_reg(codegendata *cd, s8 reg) {
1047 x86_64_emit_rex(1,0,0,(reg));
1048 *(cd->mcodeptr++) = 0xff;
1049 x86_64_emit_reg(1,(reg));
1053 void x86_64_decl_reg(codegendata *cd, s8 reg) {
1054 x86_64_emit_rex(0,0,0,(reg));
1055 *(cd->mcodeptr++) = 0xff;
1056 x86_64_emit_reg(1,(reg));
1060 void x86_64_dec_membase(codegendata *cd, s8 basereg, s8 disp) {
1061 x86_64_emit_rex(1,(basereg),0,0);
1062 *(cd->mcodeptr++) = 0xff;
1063 x86_64_emit_membase((basereg),(disp),1);
1067 void x86_64_decl_membase(codegendata *cd, s8 basereg, s8 disp) {
1068 x86_64_emit_rex(0,(basereg),0,0);
1069 *(cd->mcodeptr++) = 0xff;
1070 x86_64_emit_membase((basereg),(disp),1);
1076 void x86_64_cltd(codegendata *cd) {
1077 *(cd->mcodeptr++) = 0x99;
1081 void x86_64_cqto(codegendata *cd) {
1082 x86_64_emit_rex(1,0,0,0);
1083 *(cd->mcodeptr++) = 0x99;
1088 void x86_64_imul_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1089 x86_64_emit_rex(1,(dreg),0,(reg));
1090 *(cd->mcodeptr++) = 0x0f;
1091 *(cd->mcodeptr++) = 0xaf;
1092 x86_64_emit_reg((dreg),(reg));
1096 void x86_64_imull_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1097 x86_64_emit_rex(0,(dreg),0,(reg));
1098 *(cd->mcodeptr++) = 0x0f;
1099 *(cd->mcodeptr++) = 0xaf;
1100 x86_64_emit_reg((dreg),(reg));
1104 void x86_64_imul_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1105 x86_64_emit_rex(1,(dreg),0,(basereg));
1106 *(cd->mcodeptr++) = 0x0f;
1107 *(cd->mcodeptr++) = 0xaf;
1108 x86_64_emit_membase((basereg),(disp),(dreg));
1112 void x86_64_imull_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1113 x86_64_emit_rex(0,(dreg),0,(basereg));
1114 *(cd->mcodeptr++) = 0x0f;
1115 *(cd->mcodeptr++) = 0xaf;
1116 x86_64_emit_membase((basereg),(disp),(dreg));
1120 void x86_64_imul_imm_reg(codegendata *cd, s8 imm, s8 dreg) {
1121 if (x86_64_is_imm8((imm))) {
1122 x86_64_emit_rex(1,0,0,(dreg));
1123 *(cd->mcodeptr++) = 0x6b;
1124 x86_64_emit_reg(0,(dreg));
1125 x86_64_emit_imm8((imm));
1127 x86_64_emit_rex(1,0,0,(dreg));
1128 *(cd->mcodeptr++) = 0x69;
1129 x86_64_emit_reg(0,(dreg));
1130 x86_64_emit_imm32((imm));
1135 void x86_64_imul_imm_reg_reg(codegendata *cd, s8 imm, s8 reg, s8 dreg) {
1136 if (x86_64_is_imm8((imm))) {
1137 x86_64_emit_rex(1,(dreg),0,(reg));
1138 *(cd->mcodeptr++) = 0x6b;
1139 x86_64_emit_reg((dreg),(reg));
1140 x86_64_emit_imm8((imm));
1142 x86_64_emit_rex(1,(dreg),0,(reg));
1143 *(cd->mcodeptr++) = 0x69;
1144 x86_64_emit_reg((dreg),(reg));
1145 x86_64_emit_imm32((imm));
1150 void x86_64_imull_imm_reg_reg(codegendata *cd, s8 imm, s8 reg, s8 dreg) {
1151 if (x86_64_is_imm8((imm))) {
1152 x86_64_emit_rex(0,(dreg),0,(reg));
1153 *(cd->mcodeptr++) = 0x6b;
1154 x86_64_emit_reg((dreg),(reg));
1155 x86_64_emit_imm8((imm));
1157 x86_64_emit_rex(0,(dreg),0,(reg));
1158 *(cd->mcodeptr++) = 0x69;
1159 x86_64_emit_reg((dreg),(reg));
1160 x86_64_emit_imm32((imm));
1165 void x86_64_imul_imm_membase_reg(codegendata *cd, s8 imm, s8 basereg, s8 disp, s8 dreg) {
1166 if (x86_64_is_imm8((imm))) {
1167 x86_64_emit_rex(1,(dreg),0,(basereg));
1168 *(cd->mcodeptr++) = 0x6b;
1169 x86_64_emit_membase((basereg),(disp),(dreg));
1170 x86_64_emit_imm8((imm));
1172 x86_64_emit_rex(1,(dreg),0,(basereg));
1173 *(cd->mcodeptr++) = 0x69;
1174 x86_64_emit_membase((basereg),(disp),(dreg));
1175 x86_64_emit_imm32((imm));
1180 void x86_64_imull_imm_membase_reg(codegendata *cd, s8 imm, s8 basereg, s8 disp, s8 dreg) {
1181 if (x86_64_is_imm8((imm))) {
1182 x86_64_emit_rex(0,(dreg),0,(basereg));
1183 *(cd->mcodeptr++) = 0x6b;
1184 x86_64_emit_membase((basereg),(disp),(dreg));
1185 x86_64_emit_imm8((imm));
1187 x86_64_emit_rex(0,(dreg),0,(basereg));
1188 *(cd->mcodeptr++) = 0x69;
1189 x86_64_emit_membase((basereg),(disp),(dreg));
1190 x86_64_emit_imm32((imm));
1195 void x86_64_idiv_reg(codegendata *cd, s8 reg) {
1196 x86_64_emit_rex(1,0,0,(reg));
1197 *(cd->mcodeptr++) = 0xf7;
1198 x86_64_emit_reg(7,(reg));
1202 void x86_64_idivl_reg(codegendata *cd, s8 reg) {
1203 x86_64_emit_rex(0,0,0,(reg));
1204 *(cd->mcodeptr++) = 0xf7;
1205 x86_64_emit_reg(7,(reg));
1210 void x86_64_ret(codegendata *cd) {
1211 *(cd->mcodeptr++) = 0xc3;
1219 void x86_64_shift_reg(codegendata *cd, s8 opc, s8 reg) {
1220 x86_64_emit_rex(1,0,0,(reg));
1221 *(cd->mcodeptr++) = 0xd3;
1222 x86_64_emit_reg((opc),(reg));
1226 void x86_64_shiftl_reg(codegendata *cd, s8 opc, s8 reg) {
1227 x86_64_emit_rex(0,0,0,(reg));
1228 *(cd->mcodeptr++) = 0xd3;
1229 x86_64_emit_reg((opc),(reg));
1233 void x86_64_shift_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp) {
1234 x86_64_emit_rex(1,0,0,(basereg));
1235 *(cd->mcodeptr++) = 0xd3;
1236 x86_64_emit_membase((basereg),(disp),(opc));
1240 void x86_64_shiftl_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp) {
1241 x86_64_emit_rex(0,0,0,(basereg));
1242 *(cd->mcodeptr++) = 0xd3;
1243 x86_64_emit_membase((basereg),(disp),(opc));
1247 void x86_64_shift_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg) {
1249 x86_64_emit_rex(1,0,0,(dreg));
1250 *(cd->mcodeptr++) = 0xd1;
1251 x86_64_emit_reg((opc),(dreg));
1253 x86_64_emit_rex(1,0,0,(dreg));
1254 *(cd->mcodeptr++) = 0xc1;
1255 x86_64_emit_reg((opc),(dreg));
1256 x86_64_emit_imm8((imm));
1261 void x86_64_shiftl_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg) {
1263 x86_64_emit_rex(0,0,0,(dreg));
1264 *(cd->mcodeptr++) = 0xd1;
1265 x86_64_emit_reg((opc),(dreg));
1267 x86_64_emit_rex(0,0,0,(dreg));
1268 *(cd->mcodeptr++) = 0xc1;
1269 x86_64_emit_reg((opc),(dreg));
1270 x86_64_emit_imm8((imm));
1275 void x86_64_shift_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp) {
1277 x86_64_emit_rex(1,0,0,(basereg));
1278 *(cd->mcodeptr++) = 0xd1;
1279 x86_64_emit_membase((basereg),(disp),(opc));
1281 x86_64_emit_rex(1,0,0,(basereg));
1282 *(cd->mcodeptr++) = 0xc1;
1283 x86_64_emit_membase((basereg),(disp),(opc));
1284 x86_64_emit_imm8((imm));
1289 void x86_64_shiftl_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp) {
1291 x86_64_emit_rex(0,0,0,(basereg));
1292 *(cd->mcodeptr++) = 0xd1;
1293 x86_64_emit_membase((basereg),(disp),(opc));
1295 x86_64_emit_rex(0,0,0,(basereg));
1296 *(cd->mcodeptr++) = 0xc1;
1297 x86_64_emit_membase((basereg),(disp),(opc));
1298 x86_64_emit_imm8((imm));
1307 void x86_64_jmp_imm(codegendata *cd, s8 imm) {
1308 *(cd->mcodeptr++) = 0xe9;
1309 x86_64_emit_imm32((imm));
1313 void x86_64_jmp_reg(codegendata *cd, s8 reg) {
1314 x86_64_emit_rex(0,0,0,(reg));
1315 *(cd->mcodeptr++) = 0xff;
1316 x86_64_emit_reg(4,(reg));
1320 void x86_64_jcc(codegendata *cd, s8 opc, s8 imm) {
1321 *(cd->mcodeptr++) = 0x0f;
1322 *(cd->mcodeptr++) = (0x80 + (opc));
1323 x86_64_emit_imm32((imm));
1329 * conditional set and move operations
1332 /* we need the rex byte to get all low bytes */
1333 void x86_64_setcc_reg(codegendata *cd, s8 opc, s8 reg) {
1334 *(cd->mcodeptr++) = (0x40 | (((reg) >> 3) & 0x01));
1335 *(cd->mcodeptr++) = 0x0f;
1336 *(cd->mcodeptr++) = (0x90 + (opc));
1337 x86_64_emit_reg(0,(reg));
1341 /* we need the rex byte to get all low bytes */
1342 void x86_64_setcc_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp) {
1343 *(cd->mcodeptr++) = (0x40 | (((basereg) >> 3) & 0x01));
1344 *(cd->mcodeptr++) = 0x0f;
1345 *(cd->mcodeptr++) = (0x90 + (opc));
1346 x86_64_emit_membase((basereg),(disp),0);
1350 void x86_64_cmovcc_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg) {
1351 x86_64_emit_rex(1,(dreg),0,(reg));
1352 *(cd->mcodeptr++) = 0x0f;
1353 *(cd->mcodeptr++) = (0x40 + (opc));
1354 x86_64_emit_reg((dreg),(reg));
1358 void x86_64_cmovccl_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg) {
1359 x86_64_emit_rex(0,(dreg),0,(reg));
1360 *(cd->mcodeptr++) = 0x0f;
1361 *(cd->mcodeptr++) = (0x40 + (opc));
1362 x86_64_emit_reg((dreg),(reg));
1367 void x86_64_neg_reg(codegendata *cd, s8 reg) {
1368 x86_64_emit_rex(1,0,0,(reg));
1369 *(cd->mcodeptr++) = 0xf7;
1370 x86_64_emit_reg(3,(reg));
1374 void x86_64_negl_reg(codegendata *cd, s8 reg) {
1375 x86_64_emit_rex(0,0,0,(reg));
1376 *(cd->mcodeptr++) = 0xf7;
1377 x86_64_emit_reg(3,(reg));
1381 void x86_64_neg_membase(codegendata *cd, s8 basereg, s8 disp) {
1382 x86_64_emit_rex(1,0,0,(basereg));
1383 *(cd->mcodeptr++) = 0xf7;
1384 x86_64_emit_membase((basereg),(disp),3);
1388 void x86_64_negl_membase(codegendata *cd, s8 basereg, s8 disp) {
1389 x86_64_emit_rex(0,0,0,(basereg));
1390 *(cd->mcodeptr++) = 0xf7;
1391 x86_64_emit_membase((basereg),(disp),3);
1395 void x86_64_push_reg(codegendata *cd, s8 reg) {
1396 x86_64_emit_rex(0,0,0,(reg));
1397 *(cd->mcodeptr++) = 0x50 + (0x07 & (reg));
1401 void x86_64_push_imm(codegendata *cd, s8 imm) {
1402 *(cd->mcodeptr++) = 0x68;
1403 x86_64_emit_imm32((imm));
1407 void x86_64_pop_reg(codegendata *cd, s8 reg) {
1408 x86_64_emit_rex(0,0,0,(reg));
1409 *(cd->mcodeptr++) = 0x58 + (0x07 & (reg));
1413 void x86_64_xchg_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1414 x86_64_emit_rex(1,(reg),0,(dreg));
1415 *(cd->mcodeptr++) = 0x87;
1416 x86_64_emit_reg((reg),(dreg));
1420 void x86_64_nop(codegendata *cd) {
1421 *(cd->mcodeptr++) = 0x90;
1429 void x86_64_call_reg(codegendata *cd, s8 reg) {
1430 x86_64_emit_rex(1,0,0,(reg));
1431 *(cd->mcodeptr++) = 0xff;
1432 x86_64_emit_reg(2,(reg));
1436 void x86_64_call_imm(codegendata *cd, s8 imm) {
1437 *(cd->mcodeptr++) = 0xe8;
1438 x86_64_emit_imm32((imm));
1442 void x86_64_call_mem(codegendata *cd, s8 mem) {
1443 *(cd->mcodeptr++) = 0xff;
1444 x86_64_emit_mem(2,(mem));
1450 * floating point instructions (SSE2)
1452 void x86_64_addsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1453 *(cd->mcodeptr++) = 0xf2;
1454 x86_64_emit_rex(0,(dreg),0,(reg));
1455 *(cd->mcodeptr++) = 0x0f;
1456 *(cd->mcodeptr++) = 0x58;
1457 x86_64_emit_reg((dreg),(reg));
1461 void x86_64_addss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1462 *(cd->mcodeptr++) = 0xf3;
1463 x86_64_emit_rex(0,(dreg),0,(reg));
1464 *(cd->mcodeptr++) = 0x0f;
1465 *(cd->mcodeptr++) = 0x58;
1466 x86_64_emit_reg((dreg),(reg));
1470 void x86_64_cvtsi2ssq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1471 *(cd->mcodeptr++) = 0xf3;
1472 x86_64_emit_rex(1,(dreg),0,(reg));
1473 *(cd->mcodeptr++) = 0x0f;
1474 *(cd->mcodeptr++) = 0x2a;
1475 x86_64_emit_reg((dreg),(reg));
1479 void x86_64_cvtsi2ss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1480 *(cd->mcodeptr++) = 0xf3;
1481 x86_64_emit_rex(0,(dreg),0,(reg));
1482 *(cd->mcodeptr++) = 0x0f;
1483 *(cd->mcodeptr++) = 0x2a;
1484 x86_64_emit_reg((dreg),(reg));
1488 void x86_64_cvtsi2sdq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1489 *(cd->mcodeptr++) = 0xf2;
1490 x86_64_emit_rex(1,(dreg),0,(reg));
1491 *(cd->mcodeptr++) = 0x0f;
1492 *(cd->mcodeptr++) = 0x2a;
1493 x86_64_emit_reg((dreg),(reg));
1497 void x86_64_cvtsi2sd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1498 *(cd->mcodeptr++) = 0xf2;
1499 x86_64_emit_rex(0,(dreg),0,(reg));
1500 *(cd->mcodeptr++) = 0x0f;
1501 *(cd->mcodeptr++) = 0x2a;
1502 x86_64_emit_reg((dreg),(reg));
1506 void x86_64_cvtss2sd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1507 *(cd->mcodeptr++) = 0xf3;
1508 x86_64_emit_rex(0,(dreg),0,(reg));
1509 *(cd->mcodeptr++) = 0x0f;
1510 *(cd->mcodeptr++) = 0x5a;
1511 x86_64_emit_reg((dreg),(reg));
1515 void x86_64_cvtsd2ss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1516 *(cd->mcodeptr++) = 0xf2;
1517 x86_64_emit_rex(0,(dreg),0,(reg));
1518 *(cd->mcodeptr++) = 0x0f;
1519 *(cd->mcodeptr++) = 0x5a;
1520 x86_64_emit_reg((dreg),(reg));
1524 void x86_64_cvttss2siq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1525 *(cd->mcodeptr++) = 0xf3;
1526 x86_64_emit_rex(1,(dreg),0,(reg));
1527 *(cd->mcodeptr++) = 0x0f;
1528 *(cd->mcodeptr++) = 0x2c;
1529 x86_64_emit_reg((dreg),(reg));
1533 void x86_64_cvttss2si_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1534 *(cd->mcodeptr++) = 0xf3;
1535 x86_64_emit_rex(0,(dreg),0,(reg));
1536 *(cd->mcodeptr++) = 0x0f;
1537 *(cd->mcodeptr++) = 0x2c;
1538 x86_64_emit_reg((dreg),(reg));
1542 void x86_64_cvttsd2siq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1543 *(cd->mcodeptr++) = 0xf2;
1544 x86_64_emit_rex(1,(dreg),0,(reg));
1545 *(cd->mcodeptr++) = 0x0f;
1546 *(cd->mcodeptr++) = 0x2c;
1547 x86_64_emit_reg((dreg),(reg));
1551 void x86_64_cvttsd2si_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1552 *(cd->mcodeptr++) = 0xf2;
1553 x86_64_emit_rex(0,(dreg),0,(reg));
1554 *(cd->mcodeptr++) = 0x0f;
1555 *(cd->mcodeptr++) = 0x2c;
1556 x86_64_emit_reg((dreg),(reg));
1560 void x86_64_divss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1561 *(cd->mcodeptr++) = 0xf3;
1562 x86_64_emit_rex(0,(dreg),0,(reg));
1563 *(cd->mcodeptr++) = 0x0f;
1564 *(cd->mcodeptr++) = 0x5e;
1565 x86_64_emit_reg((dreg),(reg));
1569 void x86_64_divsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1570 *(cd->mcodeptr++) = 0xf2;
1571 x86_64_emit_rex(0,(dreg),0,(reg));
1572 *(cd->mcodeptr++) = 0x0f;
1573 *(cd->mcodeptr++) = 0x5e;
1574 x86_64_emit_reg((dreg),(reg));
1578 void x86_64_movd_reg_freg(codegendata *cd, s8 reg, s8 freg) {
1579 *(cd->mcodeptr++) = 0x66;
1580 x86_64_emit_rex(1,(freg),0,(reg));
1581 *(cd->mcodeptr++) = 0x0f;
1582 *(cd->mcodeptr++) = 0x6e;
1583 x86_64_emit_reg((freg),(reg));
1587 void x86_64_movd_freg_reg(codegendata *cd, s8 freg, s8 reg) {
1588 *(cd->mcodeptr++) = 0x66;
1589 x86_64_emit_rex(1,(freg),0,(reg));
1590 *(cd->mcodeptr++) = 0x0f;
1591 *(cd->mcodeptr++) = 0x7e;
1592 x86_64_emit_reg((freg),(reg));
1596 void x86_64_movd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
1597 *(cd->mcodeptr++) = 0x66;
1598 x86_64_emit_rex(0,(reg),0,(basereg));
1599 *(cd->mcodeptr++) = 0x0f;
1600 *(cd->mcodeptr++) = 0x7e;
1601 x86_64_emit_membase((basereg),(disp),(reg));
1605 void x86_64_movd_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
1606 *(cd->mcodeptr++) = 0x66;
1607 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
1608 *(cd->mcodeptr++) = 0x0f;
1609 *(cd->mcodeptr++) = 0x7e;
1610 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
1614 void x86_64_movd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1615 *(cd->mcodeptr++) = 0x66;
1616 x86_64_emit_rex(1,(dreg),0,(basereg));
1617 *(cd->mcodeptr++) = 0x0f;
1618 *(cd->mcodeptr++) = 0x6e;
1619 x86_64_emit_membase((basereg),(disp),(dreg));
1623 void x86_64_movdl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1624 *(cd->mcodeptr++) = 0x66;
1625 x86_64_emit_rex(0,(dreg),0,(basereg));
1626 *(cd->mcodeptr++) = 0x0f;
1627 *(cd->mcodeptr++) = 0x6e;
1628 x86_64_emit_membase((basereg),(disp),(dreg));
1632 void x86_64_movd_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg) {
1633 *(cd->mcodeptr++) = 0x66;
1634 x86_64_emit_rex(0,(dreg),(indexreg),(basereg));
1635 *(cd->mcodeptr++) = 0x0f;
1636 *(cd->mcodeptr++) = 0x6e;
1637 x86_64_emit_memindex((dreg),(disp),(basereg),(indexreg),(scale));
1641 void x86_64_movq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1642 *(cd->mcodeptr++) = 0xf3;
1643 x86_64_emit_rex(0,(dreg),0,(reg));
1644 *(cd->mcodeptr++) = 0x0f;
1645 *(cd->mcodeptr++) = 0x7e;
1646 x86_64_emit_reg((dreg),(reg));
1650 void x86_64_movq_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
1651 *(cd->mcodeptr++) = 0x66;
1652 x86_64_emit_rex(0,(reg),0,(basereg));
1653 *(cd->mcodeptr++) = 0x0f;
1654 *(cd->mcodeptr++) = 0xd6;
1655 x86_64_emit_membase((basereg),(disp),(reg));
1659 void x86_64_movq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1660 *(cd->mcodeptr++) = 0xf3;
1661 x86_64_emit_rex(0,(dreg),0,(basereg));
1662 *(cd->mcodeptr++) = 0x0f;
1663 *(cd->mcodeptr++) = 0x7e;
1664 x86_64_emit_membase((basereg),(disp),(dreg));
1668 void x86_64_movss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1669 *(cd->mcodeptr++) = 0xf3;
1670 x86_64_emit_rex(0,(reg),0,(dreg));
1671 *(cd->mcodeptr++) = 0x0f;
1672 *(cd->mcodeptr++) = 0x10;
1673 x86_64_emit_reg((reg),(dreg));
1677 void x86_64_movsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1678 *(cd->mcodeptr++) = 0xf2;
1679 x86_64_emit_rex(0,(reg),0,(dreg));
1680 *(cd->mcodeptr++) = 0x0f;
1681 *(cd->mcodeptr++) = 0x10;
1682 x86_64_emit_reg((reg),(dreg));
1686 void x86_64_movss_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
1687 *(cd->mcodeptr++) = 0xf3;
1688 x86_64_emit_rex(0,(reg),0,(basereg));
1689 *(cd->mcodeptr++) = 0x0f;
1690 *(cd->mcodeptr++) = 0x11;
1691 x86_64_emit_membase((basereg),(disp),(reg));
1695 void x86_64_movsd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
1696 *(cd->mcodeptr++) = 0xf2;
1697 x86_64_emit_rex(0,(reg),0,(basereg));
1698 *(cd->mcodeptr++) = 0x0f;
1699 *(cd->mcodeptr++) = 0x11;
1700 x86_64_emit_membase((basereg),(disp),(reg));
1704 void x86_64_movss_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1705 *(cd->mcodeptr++) = 0xf3;
1706 x86_64_emit_rex(0,(dreg),0,(basereg));
1707 *(cd->mcodeptr++) = 0x0f;
1708 *(cd->mcodeptr++) = 0x10;
1709 x86_64_emit_membase((basereg),(disp),(dreg));
1713 void x86_64_movlps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1714 x86_64_emit_rex(0,(dreg),0,(basereg));
1715 *(cd->mcodeptr++) = 0x0f;
1716 *(cd->mcodeptr++) = 0x12;
1717 x86_64_emit_membase((basereg),(disp),(dreg));
1721 void x86_64_movsd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1722 *(cd->mcodeptr++) = 0xf2;
1723 x86_64_emit_rex(0,(dreg),0,(basereg));
1724 *(cd->mcodeptr++) = 0x0f;
1725 *(cd->mcodeptr++) = 0x10;
1726 x86_64_emit_membase((basereg),(disp),(dreg));
1730 void x86_64_movlpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1731 *(cd->mcodeptr++) = 0x66;
1732 x86_64_emit_rex(0,(dreg),0,(basereg));
1733 *(cd->mcodeptr++) = 0x0f;
1734 *(cd->mcodeptr++) = 0x12;
1735 x86_64_emit_membase((basereg),(disp),(dreg));
1739 void x86_64_movss_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
1740 *(cd->mcodeptr++) = 0xf3;
1741 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
1742 *(cd->mcodeptr++) = 0x0f;
1743 *(cd->mcodeptr++) = 0x11;
1744 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
1748 void x86_64_movsd_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
1749 *(cd->mcodeptr++) = 0xf2;
1750 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
1751 *(cd->mcodeptr++) = 0x0f;
1752 *(cd->mcodeptr++) = 0x11;
1753 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
1757 void x86_64_movss_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg) {
1758 *(cd->mcodeptr++) = 0xf3;
1759 x86_64_emit_rex(0,(dreg),(indexreg),(basereg));
1760 *(cd->mcodeptr++) = 0x0f;
1761 *(cd->mcodeptr++) = 0x10;
1762 x86_64_emit_memindex((dreg),(disp),(basereg),(indexreg),(scale));
1766 void x86_64_movsd_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg) {
1767 *(cd->mcodeptr++) = 0xf2;
1768 x86_64_emit_rex(0,(dreg),(indexreg),(basereg));
1769 *(cd->mcodeptr++) = 0x0f;
1770 *(cd->mcodeptr++) = 0x10;
1771 x86_64_emit_memindex((dreg),(disp),(basereg),(indexreg),(scale));
1775 void x86_64_mulss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1776 *(cd->mcodeptr++) = 0xf3;
1777 x86_64_emit_rex(0,(dreg),0,(reg));
1778 *(cd->mcodeptr++) = 0x0f;
1779 *(cd->mcodeptr++) = 0x59;
1780 x86_64_emit_reg((dreg),(reg));
1784 void x86_64_mulsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1785 *(cd->mcodeptr++) = 0xf2;
1786 x86_64_emit_rex(0,(dreg),0,(reg));
1787 *(cd->mcodeptr++) = 0x0f;
1788 *(cd->mcodeptr++) = 0x59;
1789 x86_64_emit_reg((dreg),(reg));
1793 void x86_64_subss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1794 *(cd->mcodeptr++) = 0xf3;
1795 x86_64_emit_rex(0,(dreg),0,(reg));
1796 *(cd->mcodeptr++) = 0x0f;
1797 *(cd->mcodeptr++) = 0x5c;
1798 x86_64_emit_reg((dreg),(reg));
1802 void x86_64_subsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1803 *(cd->mcodeptr++) = 0xf2;
1804 x86_64_emit_rex(0,(dreg),0,(reg));
1805 *(cd->mcodeptr++) = 0x0f;
1806 *(cd->mcodeptr++) = 0x5c;
1807 x86_64_emit_reg((dreg),(reg));
1811 void x86_64_ucomiss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1812 x86_64_emit_rex(0,(dreg),0,(reg));
1813 *(cd->mcodeptr++) = 0x0f;
1814 *(cd->mcodeptr++) = 0x2e;
1815 x86_64_emit_reg((dreg),(reg));
1819 void x86_64_ucomisd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1820 *(cd->mcodeptr++) = 0x66;
1821 x86_64_emit_rex(0,(dreg),0,(reg));
1822 *(cd->mcodeptr++) = 0x0f;
1823 *(cd->mcodeptr++) = 0x2e;
1824 x86_64_emit_reg((dreg),(reg));
1828 void x86_64_xorps_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1829 x86_64_emit_rex(0,(dreg),0,(reg));
1830 *(cd->mcodeptr++) = 0x0f;
1831 *(cd->mcodeptr++) = 0x57;
1832 x86_64_emit_reg((dreg),(reg));
1836 void x86_64_xorps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1837 x86_64_emit_rex(0,(dreg),0,(basereg));
1838 *(cd->mcodeptr++) = 0x0f;
1839 *(cd->mcodeptr++) = 0x57;
1840 x86_64_emit_membase((basereg),(disp),(dreg));
1844 void x86_64_xorpd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1845 *(cd->mcodeptr++) = 0x66;
1846 x86_64_emit_rex(0,(dreg),0,(reg));
1847 *(cd->mcodeptr++) = 0x0f;
1848 *(cd->mcodeptr++) = 0x57;
1849 x86_64_emit_reg((dreg),(reg));
1853 void x86_64_xorpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1854 *(cd->mcodeptr++) = 0x66;
1855 x86_64_emit_rex(0,(dreg),0,(basereg));
1856 *(cd->mcodeptr++) = 0x0f;
1857 *(cd->mcodeptr++) = 0x57;
1858 x86_64_emit_membase((basereg),(disp),(dreg));
1863 * These are local overrides for various environment variables in Emacs.
1864 * Please do not remove this and leave it at the end of the file, where
1865 * Emacs will automagically detect them.
1866 * ---------------------------------------------------------------------
1869 * indent-tabs-mode: t