1 /* jit/x86_64/emitfuncs.c - x86_64 code emitter functions
3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
4 Institut f. Computersprachen, TU Wien
5 R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, M. Probst,
6 S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich,
9 This file is part of CACAO.
11 This program is free software; you can redistribute it and/or
12 modify it under the terms of the GNU General Public License as
13 published by the Free Software Foundation; either version 2, or (at
14 your option) any later version.
16 This program is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 Contact: cacao@complang.tuwien.ac.at
28 Authors: Christian Thalinger
30 $Id: emitfuncs.c 1526 2004-11-17 15:50:27Z twisti $
36 #include "jit/x86_64/arch.h"
37 #include "jit/x86_64/emitfuncs.h"
38 #include "jit/x86_64/codegen.h"
39 #include "jit/x86_64/types.h"
42 /* code generation functions */
44 void x86_64_emit_ialu(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr)
46 s4 s1 = src->prev->regoff;
48 s4 d = iptr->dst->regoff;
50 if (iptr->dst->flags & INMEMORY) {
51 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
53 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
54 x86_64_alul_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
57 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
58 x86_64_alul_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
61 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
62 x86_64_alul_membase_reg(cd, alu_op, REG_SP, s2 * 8, REG_ITMP1);
63 x86_64_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
66 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
68 x86_64_alul_reg_membase(cd, alu_op, s1, REG_SP, d * 8);
71 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
72 x86_64_alul_reg_reg(cd, alu_op, s1, REG_ITMP1);
73 x86_64_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
76 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
78 x86_64_alul_reg_membase(cd, alu_op, s2, REG_SP, d * 8);
81 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
82 x86_64_alul_reg_reg(cd, alu_op, s2, REG_ITMP1);
83 x86_64_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
87 x86_64_movl_reg_membase(cd, s1, REG_SP, d * 8);
88 x86_64_alul_reg_membase(cd, alu_op, s2, REG_SP, d * 8);
92 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
93 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, d);
94 x86_64_alul_membase_reg(cd, alu_op, REG_SP, s2 * 8, d);
96 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
98 x86_64_alul_membase_reg(cd, alu_op, REG_SP, s2 * 8, d);
100 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
102 x86_64_alul_membase_reg(cd, alu_op, REG_SP, s1 * 8, d);
106 x86_64_alul_reg_reg(cd, alu_op, s1, d);
110 x86_64_alul_reg_reg(cd, alu_op, s2, d);
117 void x86_64_emit_lalu(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr)
119 s4 s1 = src->prev->regoff;
121 s4 d = iptr->dst->regoff;
123 if (iptr->dst->flags & INMEMORY) {
124 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
126 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
127 x86_64_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
129 } else if (s1 == d) {
130 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
131 x86_64_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
134 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
135 x86_64_alu_membase_reg(cd, alu_op, REG_SP, s2 * 8, REG_ITMP1);
136 x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
139 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
141 x86_64_alu_reg_membase(cd, alu_op, s1, REG_SP, d * 8);
144 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
145 x86_64_alu_reg_reg(cd, alu_op, s1, REG_ITMP1);
146 x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
149 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
151 x86_64_alu_reg_membase(cd, alu_op, s2, REG_SP, d * 8);
154 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
155 x86_64_alu_reg_reg(cd, alu_op, s2, REG_ITMP1);
156 x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
160 x86_64_mov_reg_membase(cd, s1, REG_SP, d * 8);
161 x86_64_alu_reg_membase(cd, alu_op, s2, REG_SP, d * 8);
165 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
166 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, d);
167 x86_64_alu_membase_reg(cd, alu_op, REG_SP, s2 * 8, d);
169 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
171 x86_64_alu_membase_reg(cd, alu_op, REG_SP, s2 * 8, d);
173 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
175 x86_64_alu_membase_reg(cd, alu_op, REG_SP, s1 * 8, d);
179 x86_64_alu_reg_reg(cd, alu_op, s1, d);
183 x86_64_alu_reg_reg(cd, alu_op, s2, d);
190 void x86_64_emit_ialuconst(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr)
193 s4 d = iptr->dst->regoff;
195 if (iptr->dst->flags & INMEMORY) {
196 if (src->flags & INMEMORY) {
198 x86_64_alul_imm_membase(cd, alu_op, iptr->val.i, REG_SP, d * 8);
201 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
202 x86_64_alul_imm_reg(cd, alu_op, iptr->val.i, REG_ITMP1);
203 x86_64_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
207 x86_64_movl_reg_membase(cd, s1, REG_SP, d * 8);
208 x86_64_alul_imm_membase(cd, alu_op, iptr->val.i, REG_SP, d * 8);
212 if (src->flags & INMEMORY) {
213 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, d);
214 x86_64_alul_imm_reg(cd, alu_op, iptr->val.i, d);
218 x86_64_alul_imm_reg(cd, alu_op, iptr->val.i, d);
224 void x86_64_emit_laluconst(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr)
227 s4 d = iptr->dst->regoff;
229 if (iptr->dst->flags & INMEMORY) {
230 if (src->flags & INMEMORY) {
232 if (x86_64_is_imm32(iptr->val.l)) {
233 x86_64_alu_imm_membase(cd, alu_op, iptr->val.l, REG_SP, d * 8);
236 x86_64_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
237 x86_64_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
241 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
243 if (x86_64_is_imm32(iptr->val.l)) {
244 x86_64_alu_imm_reg(cd, alu_op, iptr->val.l, REG_ITMP1);
247 x86_64_mov_imm_reg(cd, iptr->val.l, REG_ITMP2);
248 x86_64_alu_reg_reg(cd, alu_op, REG_ITMP2, REG_ITMP1);
250 x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
254 x86_64_mov_reg_membase(cd, s1, REG_SP, d * 8);
256 if (x86_64_is_imm32(iptr->val.l)) {
257 x86_64_alu_imm_membase(cd, alu_op, iptr->val.l, REG_SP, d * 8);
260 x86_64_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
261 x86_64_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
266 if (src->flags & INMEMORY) {
267 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, d);
273 if (x86_64_is_imm32(iptr->val.l)) {
274 x86_64_alu_imm_reg(cd, alu_op, iptr->val.l, d);
277 x86_64_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
278 x86_64_alu_reg_reg(cd, alu_op, REG_ITMP1, d);
284 void x86_64_emit_ishift(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr)
286 s4 s1 = src->prev->regoff;
288 s4 d = iptr->dst->regoff;
290 M_INTMOVE(RCX, REG_ITMP1); /* save RCX */
291 if (iptr->dst->flags & INMEMORY) {
292 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
294 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, RCX);
295 x86_64_shiftl_membase(cd, shift_op, REG_SP, d * 8);
298 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, RCX);
299 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP2);
300 x86_64_shiftl_reg(cd, shift_op, REG_ITMP2);
301 x86_64_movl_reg_membase(cd, REG_ITMP2, REG_SP, d * 8);
304 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
305 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, RCX);
306 x86_64_movl_reg_membase(cd, s1, REG_SP, d * 8);
307 x86_64_shiftl_membase(cd, shift_op, REG_SP, d * 8);
309 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
312 x86_64_shiftl_membase(cd, shift_op, REG_SP, d * 8);
316 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP2);
317 x86_64_shiftl_reg(cd, shift_op, REG_ITMP2);
318 x86_64_movl_reg_membase(cd, REG_ITMP2, REG_SP, d * 8);
323 x86_64_movl_reg_membase(cd, s1, REG_SP, d * 8);
324 x86_64_shiftl_membase(cd, shift_op, REG_SP, d * 8);
326 M_INTMOVE(REG_ITMP1, RCX); /* restore RCX */
333 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
334 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, RCX);
335 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, d);
336 x86_64_shiftl_reg(cd, shift_op, d);
338 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
339 M_INTMOVE(s1, d); /* maybe src is RCX */
340 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, RCX);
341 x86_64_shiftl_reg(cd, shift_op, d);
343 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
345 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, d);
346 x86_64_shiftl_reg(cd, shift_op, d);
357 x86_64_shiftl_reg(cd, shift_op, d);
361 M_INTMOVE(REG_ITMP3, RCX);
364 M_INTMOVE(REG_ITMP1, RCX); /* restore RCX */
370 void x86_64_emit_lshift(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr)
372 s4 s1 = src->prev->regoff;
374 s4 d = iptr->dst->regoff;
376 M_INTMOVE(RCX, REG_ITMP1); /* save RCX */
377 if (iptr->dst->flags & INMEMORY) {
378 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
380 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, RCX);
381 x86_64_shift_membase(cd, shift_op, REG_SP, d * 8);
384 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, RCX);
385 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP2);
386 x86_64_shift_reg(cd, shift_op, REG_ITMP2);
387 x86_64_mov_reg_membase(cd, REG_ITMP2, REG_SP, d * 8);
390 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
391 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, RCX);
392 x86_64_mov_reg_membase(cd, s1, REG_SP, d * 8);
393 x86_64_shift_membase(cd, shift_op, REG_SP, d * 8);
395 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
398 x86_64_shift_membase(cd, shift_op, REG_SP, d * 8);
402 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP2);
403 x86_64_shift_reg(cd, shift_op, REG_ITMP2);
404 x86_64_mov_reg_membase(cd, REG_ITMP2, REG_SP, d * 8);
409 x86_64_mov_reg_membase(cd, s1, REG_SP, d * 8);
410 x86_64_shift_membase(cd, shift_op, REG_SP, d * 8);
412 M_INTMOVE(REG_ITMP1, RCX); /* restore RCX */
419 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
420 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, RCX);
421 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, d);
422 x86_64_shift_reg(cd, shift_op, d);
424 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
425 M_INTMOVE(s1, d); /* maybe src is RCX */
426 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, RCX);
427 x86_64_shift_reg(cd, shift_op, d);
429 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
431 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, d);
432 x86_64_shift_reg(cd, shift_op, d);
442 x86_64_shift_reg(cd, shift_op, d);
446 M_INTMOVE(REG_ITMP3, RCX);
449 M_INTMOVE(REG_ITMP1, RCX); /* restore RCX */
455 void x86_64_emit_ishiftconst(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr)
458 s4 d = iptr->dst->regoff;
460 if ((src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) {
462 x86_64_shiftl_imm_membase(cd, shift_op, iptr->val.i, REG_SP, d * 8);
465 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
466 x86_64_shiftl_imm_reg(cd, shift_op, iptr->val.i, REG_ITMP1);
467 x86_64_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
470 } else if ((src->flags & INMEMORY) && !(iptr->dst->flags & INMEMORY)) {
471 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, d);
472 x86_64_shiftl_imm_reg(cd, shift_op, iptr->val.i, d);
474 } else if (!(src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) {
475 x86_64_movl_reg_membase(cd, s1, REG_SP, d * 8);
476 x86_64_shiftl_imm_membase(cd, shift_op, iptr->val.i, REG_SP, d * 8);
480 x86_64_shiftl_imm_reg(cd, shift_op, iptr->val.i, d);
485 void x86_64_emit_lshiftconst(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr)
488 s4 d = iptr->dst->regoff;
490 if ((src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) {
492 x86_64_shift_imm_membase(cd, shift_op, iptr->val.i, REG_SP, d * 8);
495 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
496 x86_64_shift_imm_reg(cd, shift_op, iptr->val.i, REG_ITMP1);
497 x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
500 } else if ((src->flags & INMEMORY) && !(iptr->dst->flags & INMEMORY)) {
501 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, d);
502 x86_64_shift_imm_reg(cd, shift_op, iptr->val.i, d);
504 } else if (!(src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) {
505 x86_64_mov_reg_membase(cd, s1, REG_SP, d * 8);
506 x86_64_shift_imm_membase(cd, shift_op, iptr->val.i, REG_SP, d * 8);
510 x86_64_shift_imm_reg(cd, shift_op, iptr->val.i, d);
515 void x86_64_emit_ifcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr)
517 if (src->flags & INMEMORY) {
518 x86_64_alul_imm_membase(cd, X86_64_CMP, iptr->val.i, REG_SP, src->regoff * 8);
521 if (iptr->val.i == 0) {
522 x86_64_testl_reg_reg(cd, src->regoff, src->regoff);
525 x86_64_alul_imm_reg(cd, X86_64_CMP, iptr->val.i, src->regoff);
528 x86_64_jcc(cd, if_op, 0);
529 codegen_addreference(cd, BlockPtrOfPC(iptr->op1), cd->mcodeptr);
533 void x86_64_emit_if_lcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr)
537 if (src->flags & INMEMORY) {
538 if (x86_64_is_imm32(iptr->val.l)) {
539 x86_64_alu_imm_membase(cd, X86_64_CMP, iptr->val.l, REG_SP, s1 * 8);
542 x86_64_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
543 x86_64_alu_reg_membase(cd, X86_64_CMP, REG_ITMP1, REG_SP, s1 * 8);
547 if (iptr->val.l == 0) {
548 x86_64_test_reg_reg(cd, s1, s1);
551 if (x86_64_is_imm32(iptr->val.l)) {
552 x86_64_alu_imm_reg(cd, X86_64_CMP, iptr->val.l, s1);
555 x86_64_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
556 x86_64_alu_reg_reg(cd, X86_64_CMP, REG_ITMP1, s1);
560 x86_64_jcc(cd, if_op, 0);
561 codegen_addreference(cd, BlockPtrOfPC(iptr->op1), cd->mcodeptr);
565 void x86_64_emit_if_icmpcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr)
567 s4 s1 = src->prev->regoff;
570 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
571 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
572 x86_64_alul_reg_membase(cd, X86_64_CMP, REG_ITMP1, REG_SP, s1 * 8);
574 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
575 x86_64_alul_membase_reg(cd, X86_64_CMP, REG_SP, s2 * 8, s1);
577 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
578 x86_64_alul_reg_membase(cd, X86_64_CMP, s2, REG_SP, s1 * 8);
581 x86_64_alul_reg_reg(cd, X86_64_CMP, s2, s1);
583 x86_64_jcc(cd, if_op, 0);
584 codegen_addreference(cd, BlockPtrOfPC(iptr->op1), cd->mcodeptr);
588 void x86_64_emit_if_lcmpcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr)
590 s4 s1 = src->prev->regoff;
593 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
594 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
595 x86_64_alu_reg_membase(cd, X86_64_CMP, REG_ITMP1, REG_SP, s1 * 8);
597 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
598 x86_64_alu_membase_reg(cd, X86_64_CMP, REG_SP, s2 * 8, s1);
600 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
601 x86_64_alu_reg_membase(cd, X86_64_CMP, s2, REG_SP, s1 * 8);
604 x86_64_alu_reg_reg(cd, X86_64_CMP, s2, s1);
606 x86_64_jcc(cd, if_op, 0);
607 codegen_addreference(cd, BlockPtrOfPC(iptr->op1), cd->mcodeptr);
614 void x86_64_mov_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
615 x86_64_emit_rex(1,(reg),0,(dreg));
616 *(cd->mcodeptr++) = 0x89;
617 x86_64_emit_reg((reg),(dreg));
621 void x86_64_mov_imm_reg(codegendata *cd, s8 imm, s8 reg) {
622 x86_64_emit_rex(1,0,0,(reg));
623 *(cd->mcodeptr++) = 0xb8 + ((reg) & 0x07);
624 x86_64_emit_imm64((imm));
628 void x86_64_movl_imm_reg(codegendata *cd, s8 imm, s8 reg) {
629 x86_64_emit_rex(0,0,0,(reg));
630 *(cd->mcodeptr++) = 0xb8 + ((reg) & 0x07);
631 x86_64_emit_imm32((imm));
635 void x86_64_mov_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
636 x86_64_emit_rex(1,(reg),0,(basereg));
637 *(cd->mcodeptr++) = 0x8b;
638 x86_64_emit_membase((basereg),(disp),(reg));
642 void x86_64_movl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
643 x86_64_emit_rex(0,(reg),0,(basereg));
644 *(cd->mcodeptr++) = 0x8b;
645 x86_64_emit_membase((basereg),(disp),(reg));
650 * this one is for INVOKEVIRTUAL/INVOKEINTERFACE to have a
651 * constant membase immediate length of 32bit
653 void x86_64_mov_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
654 x86_64_emit_rex(1,(reg),0,(basereg));
655 *(cd->mcodeptr++) = 0x8b;
656 x86_64_address_byte(2, (reg), (basereg));
657 x86_64_emit_imm32((disp));
661 void x86_64_mov_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
662 x86_64_emit_rex(1,(reg),0,(basereg));
663 *(cd->mcodeptr++) = 0x89;
664 x86_64_emit_membase((basereg),(disp),(reg));
668 void x86_64_movl_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
669 x86_64_emit_rex(0,(reg),0,(basereg));
670 *(cd->mcodeptr++) = 0x89;
671 x86_64_emit_membase((basereg),(disp),(reg));
675 void x86_64_mov_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
676 x86_64_emit_rex(1,(reg),(indexreg),(basereg));
677 *(cd->mcodeptr++) = 0x8b;
678 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
682 void x86_64_movl_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
683 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
684 *(cd->mcodeptr++) = 0x8b;
685 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
689 void x86_64_mov_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
690 x86_64_emit_rex(1,(reg),(indexreg),(basereg));
691 *(cd->mcodeptr++) = 0x89;
692 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
696 void x86_64_movl_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
697 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
698 *(cd->mcodeptr++) = 0x89;
699 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
703 void x86_64_movw_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
704 *(cd->mcodeptr++) = 0x66;
705 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
706 *(cd->mcodeptr++) = 0x89;
707 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
711 void x86_64_movb_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
712 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
713 *(cd->mcodeptr++) = 0x88;
714 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
718 void x86_64_mov_imm_membase(codegendata *cd, s8 imm, s8 basereg, s8 disp) {
719 x86_64_emit_rex(1,0,0,(basereg));
720 *(cd->mcodeptr++) = 0xc7;
721 x86_64_emit_membase((basereg),(disp),0);
722 x86_64_emit_imm32((imm));
726 void x86_64_movl_imm_membase(codegendata *cd, s8 imm, s8 basereg, s8 disp) {
727 x86_64_emit_rex(0,0,0,(basereg));
728 *(cd->mcodeptr++) = 0xc7;
729 x86_64_emit_membase((basereg),(disp),0);
730 x86_64_emit_imm32((imm));
734 void x86_64_movsbq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
735 x86_64_emit_rex(1,(dreg),0,(reg));
736 *(cd->mcodeptr++) = 0x0f;
737 *(cd->mcodeptr++) = 0xbe;
738 /* XXX: why do reg and dreg have to be exchanged */
739 x86_64_emit_reg((dreg),(reg));
743 void x86_64_movsbq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
744 x86_64_emit_rex(1,(dreg),0,(basereg));
745 *(cd->mcodeptr++) = 0x0f;
746 *(cd->mcodeptr++) = 0xbe;
747 x86_64_emit_membase((basereg),(disp),(dreg));
751 void x86_64_movswq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
752 x86_64_emit_rex(1,(dreg),0,(reg));
753 *(cd->mcodeptr++) = 0x0f;
754 *(cd->mcodeptr++) = 0xbf;
755 /* XXX: why do reg and dreg have to be exchanged */
756 x86_64_emit_reg((dreg),(reg));
760 void x86_64_movswq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
761 x86_64_emit_rex(1,(dreg),0,(basereg));
762 *(cd->mcodeptr++) = 0x0f;
763 *(cd->mcodeptr++) = 0xbf;
764 x86_64_emit_membase((basereg),(disp),(dreg));
768 void x86_64_movslq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
769 x86_64_emit_rex(1,(dreg),0,(reg));
770 *(cd->mcodeptr++) = 0x63;
771 /* XXX: why do reg and dreg have to be exchanged */
772 x86_64_emit_reg((dreg),(reg));
776 void x86_64_movslq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
777 x86_64_emit_rex(1,(dreg),0,(basereg));
778 *(cd->mcodeptr++) = 0x63;
779 x86_64_emit_membase((basereg),(disp),(dreg));
783 void x86_64_movzwq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
784 x86_64_emit_rex(1,(dreg),0,(reg));
785 *(cd->mcodeptr++) = 0x0f;
786 *(cd->mcodeptr++) = 0xb7;
787 /* XXX: why do reg and dreg have to be exchanged */
788 x86_64_emit_reg((dreg),(reg));
792 void x86_64_movzwq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
793 x86_64_emit_rex(1,(dreg),0,(basereg));
794 *(cd->mcodeptr++) = 0x0f;
795 *(cd->mcodeptr++) = 0xb7;
796 x86_64_emit_membase((basereg),(disp),(dreg));
800 void x86_64_movswq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
801 x86_64_emit_rex(1,(reg),(indexreg),(basereg));
802 *(cd->mcodeptr++) = 0x0f;
803 *(cd->mcodeptr++) = 0xbf;
804 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
808 void x86_64_movsbq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
809 x86_64_emit_rex(1,(reg),(indexreg),(basereg));
810 *(cd->mcodeptr++) = 0x0f;
811 *(cd->mcodeptr++) = 0xbe;
812 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
816 void x86_64_movzwq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
817 x86_64_emit_rex(1,(reg),(indexreg),(basereg));
818 *(cd->mcodeptr++) = 0x0f;
819 *(cd->mcodeptr++) = 0xb7;
820 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
824 void x86_64_mov_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
826 x86_64_emit_rex(1,0,(indexreg),(basereg));
827 *(cd->mcodeptr++) = 0xc7;
828 x86_64_emit_memindex(0,(disp),(basereg),(indexreg),(scale));
829 x86_64_emit_imm32((imm));
833 void x86_64_movl_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
835 x86_64_emit_rex(0,0,(indexreg),(basereg));
836 *(cd->mcodeptr++) = 0xc7;
837 x86_64_emit_memindex(0,(disp),(basereg),(indexreg),(scale));
838 x86_64_emit_imm32((imm));
842 void x86_64_movw_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
844 *(cd->mcodeptr++) = 0x66;
845 x86_64_emit_rex(0,0,(indexreg),(basereg));
846 *(cd->mcodeptr++) = 0xc7;
847 x86_64_emit_memindex(0,(disp),(basereg),(indexreg),(scale));
848 x86_64_emit_imm16((imm));
852 void x86_64_movb_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
854 x86_64_emit_rex(0,0,(indexreg),(basereg));
855 *(cd->mcodeptr++) = 0xc6;
856 x86_64_emit_memindex(0,(disp),(basereg),(indexreg),(scale));
857 x86_64_emit_imm8((imm));
864 void x86_64_alu_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg) {
865 x86_64_emit_rex(1,(reg),0,(dreg));
866 *(cd->mcodeptr++) = (((opc)) << 3) + 1;
867 x86_64_emit_reg((reg),(dreg));
871 void x86_64_alul_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg) {
872 x86_64_emit_rex(0,(reg),0,(dreg));
873 *(cd->mcodeptr++) = (((opc)) << 3) + 1;
874 x86_64_emit_reg((reg),(dreg));
878 void x86_64_alu_reg_membase(codegendata *cd, s8 opc, s8 reg, s8 basereg, s8 disp) {
879 x86_64_emit_rex(1,(reg),0,(basereg));
880 *(cd->mcodeptr++) = (((opc)) << 3) + 1;
881 x86_64_emit_membase((basereg),(disp),(reg));
885 void x86_64_alul_reg_membase(codegendata *cd, s8 opc, s8 reg, s8 basereg, s8 disp) {
886 x86_64_emit_rex(0,(reg),0,(basereg));
887 *(cd->mcodeptr++) = (((opc)) << 3) + 1;
888 x86_64_emit_membase((basereg),(disp),(reg));
892 void x86_64_alu_membase_reg(codegendata *cd, s8 opc, s8 basereg, s8 disp, s8 reg) {
893 x86_64_emit_rex(1,(reg),0,(basereg));
894 *(cd->mcodeptr++) = (((opc)) << 3) + 3;
895 x86_64_emit_membase((basereg),(disp),(reg));
899 void x86_64_alul_membase_reg(codegendata *cd, s8 opc, s8 basereg, s8 disp, s8 reg) {
900 x86_64_emit_rex(0,(reg),0,(basereg));
901 *(cd->mcodeptr++) = (((opc)) << 3) + 3;
902 x86_64_emit_membase((basereg),(disp),(reg));
906 void x86_64_alu_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg) {
907 if (x86_64_is_imm8(imm)) {
908 x86_64_emit_rex(1,0,0,(dreg));
909 *(cd->mcodeptr++) = 0x83;
910 x86_64_emit_reg((opc),(dreg));
911 x86_64_emit_imm8((imm));
913 x86_64_emit_rex(1,0,0,(dreg));
914 *(cd->mcodeptr++) = 0x81;
915 x86_64_emit_reg((opc),(dreg));
916 x86_64_emit_imm32((imm));
921 void x86_64_alul_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg) {
922 if (x86_64_is_imm8(imm)) {
923 x86_64_emit_rex(0,0,0,(dreg));
924 *(cd->mcodeptr++) = 0x83;
925 x86_64_emit_reg((opc),(dreg));
926 x86_64_emit_imm8((imm));
928 x86_64_emit_rex(0,0,0,(dreg));
929 *(cd->mcodeptr++) = 0x81;
930 x86_64_emit_reg((opc),(dreg));
931 x86_64_emit_imm32((imm));
936 void x86_64_alu_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp) {
937 if (x86_64_is_imm8(imm)) {
938 x86_64_emit_rex(1,(basereg),0,0);
939 *(cd->mcodeptr++) = 0x83;
940 x86_64_emit_membase((basereg),(disp),(opc));
941 x86_64_emit_imm8((imm));
943 x86_64_emit_rex(1,(basereg),0,0);
944 *(cd->mcodeptr++) = 0x81;
945 x86_64_emit_membase((basereg),(disp),(opc));
946 x86_64_emit_imm32((imm));
951 void x86_64_alul_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp) {
952 if (x86_64_is_imm8(imm)) {
953 x86_64_emit_rex(0,(basereg),0,0);
954 *(cd->mcodeptr++) = 0x83;
955 x86_64_emit_membase((basereg),(disp),(opc));
956 x86_64_emit_imm8((imm));
958 x86_64_emit_rex(0,(basereg),0,0);
959 *(cd->mcodeptr++) = 0x81;
960 x86_64_emit_membase((basereg),(disp),(opc));
961 x86_64_emit_imm32((imm));
966 void x86_64_test_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
967 x86_64_emit_rex(1,(reg),0,(dreg));
968 *(cd->mcodeptr++) = 0x85;
969 x86_64_emit_reg((reg),(dreg));
973 void x86_64_testl_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
974 x86_64_emit_rex(0,(reg),0,(dreg));
975 *(cd->mcodeptr++) = 0x85;
976 x86_64_emit_reg((reg),(dreg));
980 void x86_64_test_imm_reg(codegendata *cd, s8 imm, s8 reg) {
981 *(cd->mcodeptr++) = 0xf7;
982 x86_64_emit_reg(0,(reg));
983 x86_64_emit_imm32((imm));
987 void x86_64_testw_imm_reg(codegendata *cd, s8 imm, s8 reg) {
988 *(cd->mcodeptr++) = 0x66;
989 *(cd->mcodeptr++) = 0xf7;
990 x86_64_emit_reg(0,(reg));
991 x86_64_emit_imm16((imm));
995 void x86_64_testb_imm_reg(codegendata *cd, s8 imm, s8 reg) {
996 *(cd->mcodeptr++) = 0xf6;
997 x86_64_emit_reg(0,(reg));
998 x86_64_emit_imm8((imm));
1002 void x86_64_lea_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
1003 x86_64_emit_rex(1,(reg),0,(basereg));
1004 *(cd->mcodeptr++) = 0x8d;
1005 x86_64_emit_membase((basereg),(disp),(reg));
1009 void x86_64_leal_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
1010 x86_64_emit_rex(0,(reg),0,(basereg));
1011 *(cd->mcodeptr++) = 0x8d;
1012 x86_64_emit_membase((basereg),(disp),(reg));
1018 * inc, dec operations
1020 void x86_64_inc_reg(codegendata *cd, s8 reg) {
1021 x86_64_emit_rex(1,0,0,(reg));
1022 *(cd->mcodeptr++) = 0xff;
1023 x86_64_emit_reg(0,(reg));
1027 void x86_64_incl_reg(codegendata *cd, s8 reg) {
1028 x86_64_emit_rex(0,0,0,(reg));
1029 *(cd->mcodeptr++) = 0xff;
1030 x86_64_emit_reg(0,(reg));
1034 void x86_64_inc_membase(codegendata *cd, s8 basereg, s8 disp) {
1035 x86_64_emit_rex(1,(basereg),0,0);
1036 *(cd->mcodeptr++) = 0xff;
1037 x86_64_emit_membase((basereg),(disp),0);
1041 void x86_64_incl_membase(codegendata *cd, s8 basereg, s8 disp) {
1042 x86_64_emit_rex(0,(basereg),0,0);
1043 *(cd->mcodeptr++) = 0xff;
1044 x86_64_emit_membase((basereg),(disp),0);
1048 void x86_64_dec_reg(codegendata *cd, s8 reg) {
1049 x86_64_emit_rex(1,0,0,(reg));
1050 *(cd->mcodeptr++) = 0xff;
1051 x86_64_emit_reg(1,(reg));
1055 void x86_64_decl_reg(codegendata *cd, s8 reg) {
1056 x86_64_emit_rex(0,0,0,(reg));
1057 *(cd->mcodeptr++) = 0xff;
1058 x86_64_emit_reg(1,(reg));
1062 void x86_64_dec_membase(codegendata *cd, s8 basereg, s8 disp) {
1063 x86_64_emit_rex(1,(basereg),0,0);
1064 *(cd->mcodeptr++) = 0xff;
1065 x86_64_emit_membase((basereg),(disp),1);
1069 void x86_64_decl_membase(codegendata *cd, s8 basereg, s8 disp) {
1070 x86_64_emit_rex(0,(basereg),0,0);
1071 *(cd->mcodeptr++) = 0xff;
1072 x86_64_emit_membase((basereg),(disp),1);
1078 void x86_64_cltd(codegendata *cd) {
1079 *(cd->mcodeptr++) = 0x99;
1083 void x86_64_cqto(codegendata *cd) {
1084 x86_64_emit_rex(1,0,0,0);
1085 *(cd->mcodeptr++) = 0x99;
1090 void x86_64_imul_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1091 x86_64_emit_rex(1,(dreg),0,(reg));
1092 *(cd->mcodeptr++) = 0x0f;
1093 *(cd->mcodeptr++) = 0xaf;
1094 x86_64_emit_reg((dreg),(reg));
1098 void x86_64_imull_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1099 x86_64_emit_rex(0,(dreg),0,(reg));
1100 *(cd->mcodeptr++) = 0x0f;
1101 *(cd->mcodeptr++) = 0xaf;
1102 x86_64_emit_reg((dreg),(reg));
1106 void x86_64_imul_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1107 x86_64_emit_rex(1,(dreg),0,(basereg));
1108 *(cd->mcodeptr++) = 0x0f;
1109 *(cd->mcodeptr++) = 0xaf;
1110 x86_64_emit_membase((basereg),(disp),(dreg));
1114 void x86_64_imull_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1115 x86_64_emit_rex(0,(dreg),0,(basereg));
1116 *(cd->mcodeptr++) = 0x0f;
1117 *(cd->mcodeptr++) = 0xaf;
1118 x86_64_emit_membase((basereg),(disp),(dreg));
1122 void x86_64_imul_imm_reg(codegendata *cd, s8 imm, s8 dreg) {
1123 if (x86_64_is_imm8((imm))) {
1124 x86_64_emit_rex(1,0,0,(dreg));
1125 *(cd->mcodeptr++) = 0x6b;
1126 x86_64_emit_reg(0,(dreg));
1127 x86_64_emit_imm8((imm));
1129 x86_64_emit_rex(1,0,0,(dreg));
1130 *(cd->mcodeptr++) = 0x69;
1131 x86_64_emit_reg(0,(dreg));
1132 x86_64_emit_imm32((imm));
1137 void x86_64_imul_imm_reg_reg(codegendata *cd, s8 imm, s8 reg, s8 dreg) {
1138 if (x86_64_is_imm8((imm))) {
1139 x86_64_emit_rex(1,(dreg),0,(reg));
1140 *(cd->mcodeptr++) = 0x6b;
1141 x86_64_emit_reg((dreg),(reg));
1142 x86_64_emit_imm8((imm));
1144 x86_64_emit_rex(1,(dreg),0,(reg));
1145 *(cd->mcodeptr++) = 0x69;
1146 x86_64_emit_reg((dreg),(reg));
1147 x86_64_emit_imm32((imm));
1152 void x86_64_imull_imm_reg_reg(codegendata *cd, s8 imm, s8 reg, s8 dreg) {
1153 if (x86_64_is_imm8((imm))) {
1154 x86_64_emit_rex(0,(dreg),0,(reg));
1155 *(cd->mcodeptr++) = 0x6b;
1156 x86_64_emit_reg((dreg),(reg));
1157 x86_64_emit_imm8((imm));
1159 x86_64_emit_rex(0,(dreg),0,(reg));
1160 *(cd->mcodeptr++) = 0x69;
1161 x86_64_emit_reg((dreg),(reg));
1162 x86_64_emit_imm32((imm));
1167 void x86_64_imul_imm_membase_reg(codegendata *cd, s8 imm, s8 basereg, s8 disp, s8 dreg) {
1168 if (x86_64_is_imm8((imm))) {
1169 x86_64_emit_rex(1,(dreg),0,(basereg));
1170 *(cd->mcodeptr++) = 0x6b;
1171 x86_64_emit_membase((basereg),(disp),(dreg));
1172 x86_64_emit_imm8((imm));
1174 x86_64_emit_rex(1,(dreg),0,(basereg));
1175 *(cd->mcodeptr++) = 0x69;
1176 x86_64_emit_membase((basereg),(disp),(dreg));
1177 x86_64_emit_imm32((imm));
1182 void x86_64_imull_imm_membase_reg(codegendata *cd, s8 imm, s8 basereg, s8 disp, s8 dreg) {
1183 if (x86_64_is_imm8((imm))) {
1184 x86_64_emit_rex(0,(dreg),0,(basereg));
1185 *(cd->mcodeptr++) = 0x6b;
1186 x86_64_emit_membase((basereg),(disp),(dreg));
1187 x86_64_emit_imm8((imm));
1189 x86_64_emit_rex(0,(dreg),0,(basereg));
1190 *(cd->mcodeptr++) = 0x69;
1191 x86_64_emit_membase((basereg),(disp),(dreg));
1192 x86_64_emit_imm32((imm));
1197 void x86_64_idiv_reg(codegendata *cd, s8 reg) {
1198 x86_64_emit_rex(1,0,0,(reg));
1199 *(cd->mcodeptr++) = 0xf7;
1200 x86_64_emit_reg(7,(reg));
1204 void x86_64_idivl_reg(codegendata *cd, s8 reg) {
1205 x86_64_emit_rex(0,0,0,(reg));
1206 *(cd->mcodeptr++) = 0xf7;
1207 x86_64_emit_reg(7,(reg));
1212 void x86_64_ret(codegendata *cd) {
1213 *(cd->mcodeptr++) = 0xc3;
1221 void x86_64_shift_reg(codegendata *cd, s8 opc, s8 reg) {
1222 x86_64_emit_rex(1,0,0,(reg));
1223 *(cd->mcodeptr++) = 0xd3;
1224 x86_64_emit_reg((opc),(reg));
1228 void x86_64_shiftl_reg(codegendata *cd, s8 opc, s8 reg) {
1229 x86_64_emit_rex(0,0,0,(reg));
1230 *(cd->mcodeptr++) = 0xd3;
1231 x86_64_emit_reg((opc),(reg));
1235 void x86_64_shift_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp) {
1236 x86_64_emit_rex(1,0,0,(basereg));
1237 *(cd->mcodeptr++) = 0xd3;
1238 x86_64_emit_membase((basereg),(disp),(opc));
1242 void x86_64_shiftl_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp) {
1243 x86_64_emit_rex(0,0,0,(basereg));
1244 *(cd->mcodeptr++) = 0xd3;
1245 x86_64_emit_membase((basereg),(disp),(opc));
1249 void x86_64_shift_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg) {
1251 x86_64_emit_rex(1,0,0,(dreg));
1252 *(cd->mcodeptr++) = 0xd1;
1253 x86_64_emit_reg((opc),(dreg));
1255 x86_64_emit_rex(1,0,0,(dreg));
1256 *(cd->mcodeptr++) = 0xc1;
1257 x86_64_emit_reg((opc),(dreg));
1258 x86_64_emit_imm8((imm));
1263 void x86_64_shiftl_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg) {
1265 x86_64_emit_rex(0,0,0,(dreg));
1266 *(cd->mcodeptr++) = 0xd1;
1267 x86_64_emit_reg((opc),(dreg));
1269 x86_64_emit_rex(0,0,0,(dreg));
1270 *(cd->mcodeptr++) = 0xc1;
1271 x86_64_emit_reg((opc),(dreg));
1272 x86_64_emit_imm8((imm));
1277 void x86_64_shift_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp) {
1279 x86_64_emit_rex(1,0,0,(basereg));
1280 *(cd->mcodeptr++) = 0xd1;
1281 x86_64_emit_membase((basereg),(disp),(opc));
1283 x86_64_emit_rex(1,0,0,(basereg));
1284 *(cd->mcodeptr++) = 0xc1;
1285 x86_64_emit_membase((basereg),(disp),(opc));
1286 x86_64_emit_imm8((imm));
1291 void x86_64_shiftl_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp) {
1293 x86_64_emit_rex(0,0,0,(basereg));
1294 *(cd->mcodeptr++) = 0xd1;
1295 x86_64_emit_membase((basereg),(disp),(opc));
1297 x86_64_emit_rex(0,0,0,(basereg));
1298 *(cd->mcodeptr++) = 0xc1;
1299 x86_64_emit_membase((basereg),(disp),(opc));
1300 x86_64_emit_imm8((imm));
1309 void x86_64_jmp_imm(codegendata *cd, s8 imm) {
1310 *(cd->mcodeptr++) = 0xe9;
1311 x86_64_emit_imm32((imm));
1315 void x86_64_jmp_reg(codegendata *cd, s8 reg) {
1316 x86_64_emit_rex(0,0,0,(reg));
1317 *(cd->mcodeptr++) = 0xff;
1318 x86_64_emit_reg(4,(reg));
1322 void x86_64_jcc(codegendata *cd, s8 opc, s8 imm) {
1323 *(cd->mcodeptr++) = 0x0f;
1324 *(cd->mcodeptr++) = (0x80 + (opc));
1325 x86_64_emit_imm32((imm));
1331 * conditional set and move operations
1334 /* we need the rex byte to get all low bytes */
1335 void x86_64_setcc_reg(codegendata *cd, s8 opc, s8 reg) {
1336 *(cd->mcodeptr++) = (0x40 | (((reg) >> 3) & 0x01));
1337 *(cd->mcodeptr++) = 0x0f;
1338 *(cd->mcodeptr++) = (0x90 + (opc));
1339 x86_64_emit_reg(0,(reg));
1343 /* we need the rex byte to get all low bytes */
1344 void x86_64_setcc_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp) {
1345 *(cd->mcodeptr++) = (0x40 | (((basereg) >> 3) & 0x01));
1346 *(cd->mcodeptr++) = 0x0f;
1347 *(cd->mcodeptr++) = (0x90 + (opc));
1348 x86_64_emit_membase((basereg),(disp),0);
1352 void x86_64_cmovcc_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg) {
1353 x86_64_emit_rex(1,(dreg),0,(reg));
1354 *(cd->mcodeptr++) = 0x0f;
1355 *(cd->mcodeptr++) = (0x40 + (opc));
1356 x86_64_emit_reg((dreg),(reg));
1360 void x86_64_cmovccl_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg) {
1361 x86_64_emit_rex(0,(dreg),0,(reg));
1362 *(cd->mcodeptr++) = 0x0f;
1363 *(cd->mcodeptr++) = (0x40 + (opc));
1364 x86_64_emit_reg((dreg),(reg));
1369 void x86_64_neg_reg(codegendata *cd, s8 reg) {
1370 x86_64_emit_rex(1,0,0,(reg));
1371 *(cd->mcodeptr++) = 0xf7;
1372 x86_64_emit_reg(3,(reg));
1376 void x86_64_negl_reg(codegendata *cd, s8 reg) {
1377 x86_64_emit_rex(0,0,0,(reg));
1378 *(cd->mcodeptr++) = 0xf7;
1379 x86_64_emit_reg(3,(reg));
1383 void x86_64_neg_membase(codegendata *cd, s8 basereg, s8 disp) {
1384 x86_64_emit_rex(1,0,0,(basereg));
1385 *(cd->mcodeptr++) = 0xf7;
1386 x86_64_emit_membase((basereg),(disp),3);
1390 void x86_64_negl_membase(codegendata *cd, s8 basereg, s8 disp) {
1391 x86_64_emit_rex(0,0,0,(basereg));
1392 *(cd->mcodeptr++) = 0xf7;
1393 x86_64_emit_membase((basereg),(disp),3);
1397 void x86_64_push_reg(codegendata *cd, s8 reg) {
1398 x86_64_emit_rex(0,0,0,(reg));
1399 *(cd->mcodeptr++) = 0x50 + (0x07 & (reg));
1403 void x86_64_push_imm(codegendata *cd, s8 imm) {
1404 *(cd->mcodeptr++) = 0x68;
1405 x86_64_emit_imm32((imm));
1409 void x86_64_pop_reg(codegendata *cd, s8 reg) {
1410 x86_64_emit_rex(0,0,0,(reg));
1411 *(cd->mcodeptr++) = 0x58 + (0x07 & (reg));
1415 void x86_64_xchg_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1416 x86_64_emit_rex(1,(reg),0,(dreg));
1417 *(cd->mcodeptr++) = 0x87;
1418 x86_64_emit_reg((reg),(dreg));
1422 void x86_64_nop(codegendata *cd) {
1423 *(cd->mcodeptr++) = 0x90;
1431 void x86_64_call_reg(codegendata *cd, s8 reg) {
1432 x86_64_emit_rex(1,0,0,(reg));
1433 *(cd->mcodeptr++) = 0xff;
1434 x86_64_emit_reg(2,(reg));
1438 void x86_64_call_imm(codegendata *cd, s8 imm) {
1439 *(cd->mcodeptr++) = 0xe8;
1440 x86_64_emit_imm32((imm));
1444 void x86_64_call_mem(codegendata *cd, s8 mem) {
1445 *(cd->mcodeptr++) = 0xff;
1446 x86_64_emit_mem(2,(mem));
1452 * floating point instructions (SSE2)
1454 void x86_64_addsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1455 *(cd->mcodeptr++) = 0xf2;
1456 x86_64_emit_rex(0,(dreg),0,(reg));
1457 *(cd->mcodeptr++) = 0x0f;
1458 *(cd->mcodeptr++) = 0x58;
1459 x86_64_emit_reg((dreg),(reg));
1463 void x86_64_addss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1464 *(cd->mcodeptr++) = 0xf3;
1465 x86_64_emit_rex(0,(dreg),0,(reg));
1466 *(cd->mcodeptr++) = 0x0f;
1467 *(cd->mcodeptr++) = 0x58;
1468 x86_64_emit_reg((dreg),(reg));
1472 void x86_64_cvtsi2ssq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1473 *(cd->mcodeptr++) = 0xf3;
1474 x86_64_emit_rex(1,(dreg),0,(reg));
1475 *(cd->mcodeptr++) = 0x0f;
1476 *(cd->mcodeptr++) = 0x2a;
1477 x86_64_emit_reg((dreg),(reg));
1481 void x86_64_cvtsi2ss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1482 *(cd->mcodeptr++) = 0xf3;
1483 x86_64_emit_rex(0,(dreg),0,(reg));
1484 *(cd->mcodeptr++) = 0x0f;
1485 *(cd->mcodeptr++) = 0x2a;
1486 x86_64_emit_reg((dreg),(reg));
1490 void x86_64_cvtsi2sdq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1491 *(cd->mcodeptr++) = 0xf2;
1492 x86_64_emit_rex(1,(dreg),0,(reg));
1493 *(cd->mcodeptr++) = 0x0f;
1494 *(cd->mcodeptr++) = 0x2a;
1495 x86_64_emit_reg((dreg),(reg));
1499 void x86_64_cvtsi2sd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1500 *(cd->mcodeptr++) = 0xf2;
1501 x86_64_emit_rex(0,(dreg),0,(reg));
1502 *(cd->mcodeptr++) = 0x0f;
1503 *(cd->mcodeptr++) = 0x2a;
1504 x86_64_emit_reg((dreg),(reg));
1508 void x86_64_cvtss2sd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1509 *(cd->mcodeptr++) = 0xf3;
1510 x86_64_emit_rex(0,(dreg),0,(reg));
1511 *(cd->mcodeptr++) = 0x0f;
1512 *(cd->mcodeptr++) = 0x5a;
1513 x86_64_emit_reg((dreg),(reg));
1517 void x86_64_cvtsd2ss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1518 *(cd->mcodeptr++) = 0xf2;
1519 x86_64_emit_rex(0,(dreg),0,(reg));
1520 *(cd->mcodeptr++) = 0x0f;
1521 *(cd->mcodeptr++) = 0x5a;
1522 x86_64_emit_reg((dreg),(reg));
1526 void x86_64_cvttss2siq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1527 *(cd->mcodeptr++) = 0xf3;
1528 x86_64_emit_rex(1,(dreg),0,(reg));
1529 *(cd->mcodeptr++) = 0x0f;
1530 *(cd->mcodeptr++) = 0x2c;
1531 x86_64_emit_reg((dreg),(reg));
1535 void x86_64_cvttss2si_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1536 *(cd->mcodeptr++) = 0xf3;
1537 x86_64_emit_rex(0,(dreg),0,(reg));
1538 *(cd->mcodeptr++) = 0x0f;
1539 *(cd->mcodeptr++) = 0x2c;
1540 x86_64_emit_reg((dreg),(reg));
1544 void x86_64_cvttsd2siq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1545 *(cd->mcodeptr++) = 0xf2;
1546 x86_64_emit_rex(1,(dreg),0,(reg));
1547 *(cd->mcodeptr++) = 0x0f;
1548 *(cd->mcodeptr++) = 0x2c;
1549 x86_64_emit_reg((dreg),(reg));
1553 void x86_64_cvttsd2si_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1554 *(cd->mcodeptr++) = 0xf2;
1555 x86_64_emit_rex(0,(dreg),0,(reg));
1556 *(cd->mcodeptr++) = 0x0f;
1557 *(cd->mcodeptr++) = 0x2c;
1558 x86_64_emit_reg((dreg),(reg));
1562 void x86_64_divss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1563 *(cd->mcodeptr++) = 0xf3;
1564 x86_64_emit_rex(0,(dreg),0,(reg));
1565 *(cd->mcodeptr++) = 0x0f;
1566 *(cd->mcodeptr++) = 0x5e;
1567 x86_64_emit_reg((dreg),(reg));
1571 void x86_64_divsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1572 *(cd->mcodeptr++) = 0xf2;
1573 x86_64_emit_rex(0,(dreg),0,(reg));
1574 *(cd->mcodeptr++) = 0x0f;
1575 *(cd->mcodeptr++) = 0x5e;
1576 x86_64_emit_reg((dreg),(reg));
1580 void x86_64_movd_reg_freg(codegendata *cd, s8 reg, s8 freg) {
1581 *(cd->mcodeptr++) = 0x66;
1582 x86_64_emit_rex(1,(freg),0,(reg));
1583 *(cd->mcodeptr++) = 0x0f;
1584 *(cd->mcodeptr++) = 0x6e;
1585 x86_64_emit_reg((freg),(reg));
1589 void x86_64_movd_freg_reg(codegendata *cd, s8 freg, s8 reg) {
1590 *(cd->mcodeptr++) = 0x66;
1591 x86_64_emit_rex(1,(freg),0,(reg));
1592 *(cd->mcodeptr++) = 0x0f;
1593 *(cd->mcodeptr++) = 0x7e;
1594 x86_64_emit_reg((freg),(reg));
1598 void x86_64_movd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
1599 *(cd->mcodeptr++) = 0x66;
1600 x86_64_emit_rex(0,(reg),0,(basereg));
1601 *(cd->mcodeptr++) = 0x0f;
1602 *(cd->mcodeptr++) = 0x7e;
1603 x86_64_emit_membase((basereg),(disp),(reg));
1607 void x86_64_movd_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
1608 *(cd->mcodeptr++) = 0x66;
1609 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
1610 *(cd->mcodeptr++) = 0x0f;
1611 *(cd->mcodeptr++) = 0x7e;
1612 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
1616 void x86_64_movd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1617 *(cd->mcodeptr++) = 0x66;
1618 x86_64_emit_rex(1,(dreg),0,(basereg));
1619 *(cd->mcodeptr++) = 0x0f;
1620 *(cd->mcodeptr++) = 0x6e;
1621 x86_64_emit_membase((basereg),(disp),(dreg));
1625 void x86_64_movdl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1626 *(cd->mcodeptr++) = 0x66;
1627 x86_64_emit_rex(0,(dreg),0,(basereg));
1628 *(cd->mcodeptr++) = 0x0f;
1629 *(cd->mcodeptr++) = 0x6e;
1630 x86_64_emit_membase((basereg),(disp),(dreg));
1634 void x86_64_movd_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg) {
1635 *(cd->mcodeptr++) = 0x66;
1636 x86_64_emit_rex(0,(dreg),(indexreg),(basereg));
1637 *(cd->mcodeptr++) = 0x0f;
1638 *(cd->mcodeptr++) = 0x6e;
1639 x86_64_emit_memindex((dreg),(disp),(basereg),(indexreg),(scale));
1643 void x86_64_movq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1644 *(cd->mcodeptr++) = 0xf3;
1645 x86_64_emit_rex(0,(dreg),0,(reg));
1646 *(cd->mcodeptr++) = 0x0f;
1647 *(cd->mcodeptr++) = 0x7e;
1648 x86_64_emit_reg((dreg),(reg));
1652 void x86_64_movq_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
1653 *(cd->mcodeptr++) = 0x66;
1654 x86_64_emit_rex(0,(reg),0,(basereg));
1655 *(cd->mcodeptr++) = 0x0f;
1656 *(cd->mcodeptr++) = 0xd6;
1657 x86_64_emit_membase((basereg),(disp),(reg));
1661 void x86_64_movq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1662 *(cd->mcodeptr++) = 0xf3;
1663 x86_64_emit_rex(0,(dreg),0,(basereg));
1664 *(cd->mcodeptr++) = 0x0f;
1665 *(cd->mcodeptr++) = 0x7e;
1666 x86_64_emit_membase((basereg),(disp),(dreg));
1670 void x86_64_movss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1671 *(cd->mcodeptr++) = 0xf3;
1672 x86_64_emit_rex(0,(reg),0,(dreg));
1673 *(cd->mcodeptr++) = 0x0f;
1674 *(cd->mcodeptr++) = 0x10;
1675 x86_64_emit_reg((reg),(dreg));
1679 void x86_64_movsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1680 *(cd->mcodeptr++) = 0xf2;
1681 x86_64_emit_rex(0,(reg),0,(dreg));
1682 *(cd->mcodeptr++) = 0x0f;
1683 *(cd->mcodeptr++) = 0x10;
1684 x86_64_emit_reg((reg),(dreg));
1688 void x86_64_movss_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
1689 *(cd->mcodeptr++) = 0xf3;
1690 x86_64_emit_rex(0,(reg),0,(basereg));
1691 *(cd->mcodeptr++) = 0x0f;
1692 *(cd->mcodeptr++) = 0x11;
1693 x86_64_emit_membase((basereg),(disp),(reg));
1697 void x86_64_movsd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
1698 *(cd->mcodeptr++) = 0xf2;
1699 x86_64_emit_rex(0,(reg),0,(basereg));
1700 *(cd->mcodeptr++) = 0x0f;
1701 *(cd->mcodeptr++) = 0x11;
1702 x86_64_emit_membase((basereg),(disp),(reg));
1706 void x86_64_movss_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1707 *(cd->mcodeptr++) = 0xf3;
1708 x86_64_emit_rex(0,(dreg),0,(basereg));
1709 *(cd->mcodeptr++) = 0x0f;
1710 *(cd->mcodeptr++) = 0x10;
1711 x86_64_emit_membase((basereg),(disp),(dreg));
1715 void x86_64_movlps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1716 x86_64_emit_rex(0,(dreg),0,(basereg));
1717 *(cd->mcodeptr++) = 0x0f;
1718 *(cd->mcodeptr++) = 0x12;
1719 x86_64_emit_membase((basereg),(disp),(dreg));
1723 void x86_64_movsd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1724 *(cd->mcodeptr++) = 0xf2;
1725 x86_64_emit_rex(0,(dreg),0,(basereg));
1726 *(cd->mcodeptr++) = 0x0f;
1727 *(cd->mcodeptr++) = 0x10;
1728 x86_64_emit_membase((basereg),(disp),(dreg));
1732 void x86_64_movlpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1733 *(cd->mcodeptr++) = 0x66;
1734 x86_64_emit_rex(0,(dreg),0,(basereg));
1735 *(cd->mcodeptr++) = 0x0f;
1736 *(cd->mcodeptr++) = 0x12;
1737 x86_64_emit_membase((basereg),(disp),(dreg));
1741 void x86_64_movss_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
1742 *(cd->mcodeptr++) = 0xf3;
1743 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
1744 *(cd->mcodeptr++) = 0x0f;
1745 *(cd->mcodeptr++) = 0x11;
1746 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
1750 void x86_64_movsd_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
1751 *(cd->mcodeptr++) = 0xf2;
1752 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
1753 *(cd->mcodeptr++) = 0x0f;
1754 *(cd->mcodeptr++) = 0x11;
1755 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
1759 void x86_64_movss_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg) {
1760 *(cd->mcodeptr++) = 0xf3;
1761 x86_64_emit_rex(0,(dreg),(indexreg),(basereg));
1762 *(cd->mcodeptr++) = 0x0f;
1763 *(cd->mcodeptr++) = 0x10;
1764 x86_64_emit_memindex((dreg),(disp),(basereg),(indexreg),(scale));
1768 void x86_64_movsd_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg) {
1769 *(cd->mcodeptr++) = 0xf2;
1770 x86_64_emit_rex(0,(dreg),(indexreg),(basereg));
1771 *(cd->mcodeptr++) = 0x0f;
1772 *(cd->mcodeptr++) = 0x10;
1773 x86_64_emit_memindex((dreg),(disp),(basereg),(indexreg),(scale));
1777 void x86_64_mulss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1778 *(cd->mcodeptr++) = 0xf3;
1779 x86_64_emit_rex(0,(dreg),0,(reg));
1780 *(cd->mcodeptr++) = 0x0f;
1781 *(cd->mcodeptr++) = 0x59;
1782 x86_64_emit_reg((dreg),(reg));
1786 void x86_64_mulsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1787 *(cd->mcodeptr++) = 0xf2;
1788 x86_64_emit_rex(0,(dreg),0,(reg));
1789 *(cd->mcodeptr++) = 0x0f;
1790 *(cd->mcodeptr++) = 0x59;
1791 x86_64_emit_reg((dreg),(reg));
1795 void x86_64_subss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1796 *(cd->mcodeptr++) = 0xf3;
1797 x86_64_emit_rex(0,(dreg),0,(reg));
1798 *(cd->mcodeptr++) = 0x0f;
1799 *(cd->mcodeptr++) = 0x5c;
1800 x86_64_emit_reg((dreg),(reg));
1804 void x86_64_subsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1805 *(cd->mcodeptr++) = 0xf2;
1806 x86_64_emit_rex(0,(dreg),0,(reg));
1807 *(cd->mcodeptr++) = 0x0f;
1808 *(cd->mcodeptr++) = 0x5c;
1809 x86_64_emit_reg((dreg),(reg));
1813 void x86_64_ucomiss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1814 x86_64_emit_rex(0,(dreg),0,(reg));
1815 *(cd->mcodeptr++) = 0x0f;
1816 *(cd->mcodeptr++) = 0x2e;
1817 x86_64_emit_reg((dreg),(reg));
1821 void x86_64_ucomisd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1822 *(cd->mcodeptr++) = 0x66;
1823 x86_64_emit_rex(0,(dreg),0,(reg));
1824 *(cd->mcodeptr++) = 0x0f;
1825 *(cd->mcodeptr++) = 0x2e;
1826 x86_64_emit_reg((dreg),(reg));
1830 void x86_64_xorps_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1831 x86_64_emit_rex(0,(dreg),0,(reg));
1832 *(cd->mcodeptr++) = 0x0f;
1833 *(cd->mcodeptr++) = 0x57;
1834 x86_64_emit_reg((dreg),(reg));
1838 void x86_64_xorps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1839 x86_64_emit_rex(0,(dreg),0,(basereg));
1840 *(cd->mcodeptr++) = 0x0f;
1841 *(cd->mcodeptr++) = 0x57;
1842 x86_64_emit_membase((basereg),(disp),(dreg));
1846 void x86_64_xorpd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1847 *(cd->mcodeptr++) = 0x66;
1848 x86_64_emit_rex(0,(dreg),0,(reg));
1849 *(cd->mcodeptr++) = 0x0f;
1850 *(cd->mcodeptr++) = 0x57;
1851 x86_64_emit_reg((dreg),(reg));
1855 void x86_64_xorpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1856 *(cd->mcodeptr++) = 0x66;
1857 x86_64_emit_rex(0,(dreg),0,(basereg));
1858 *(cd->mcodeptr++) = 0x0f;
1859 *(cd->mcodeptr++) = 0x57;
1860 x86_64_emit_membase((basereg),(disp),(dreg));
1865 * These are local overrides for various environment variables in Emacs.
1866 * Please do not remove this and leave it at the end of the file, where
1867 * Emacs will automagically detect them.
1868 * ---------------------------------------------------------------------
1871 * indent-tabs-mode: t