CACAO
emit.cpp
Go to the documentation of this file.
1 /* src/vm/jit/x86_64/emit.cpp - x86_64 code emitter functions
2 
3  Copyright (C) 1996-2014
4  CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
5 
6  This file is part of CACAO.
7 
8  This program is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License as
10  published by the Free Software Foundation; either version 2, or (at
11  your option) any later version.
12 
13  This program is distributed in the hope that it will be useful, but
14  WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21  02110-1301, USA.
22 
23 */
24 
25 #include "config.h"
26 
27 #include <cassert>
28 
29 #include "vm/types.hpp"
30 #include "vm/os.hpp"
31 
32 #include "md-abi.hpp"
33 
35 #include "vm/jit/x86_64/emit.hpp"
36 
37 #include "mm/memory.hpp"
38 
39 #include "threads/lock.hpp"
40 
41 #include "vm/descriptor.hpp" // for typedesc, methoddesc, etc
42 #include "vm/options.hpp"
43 
44 #include "vm/jit/abi.hpp"
45 #include "vm/jit/abi-asm.hpp"
46 #include "vm/jit/asmpart.hpp"
47 #include "vm/jit/builtin.hpp"
48 #include "vm/jit/code.hpp"
50 #include "vm/jit/dseg.hpp"
51 #include "vm/jit/emit-common.hpp"
52 #include "vm/jit/jit.hpp"
54 #include "vm/jit/replace.hpp"
55 #include "vm/jit/trace.hpp"
56 #include "vm/jit/trap.hpp"
57 
59 
60 
61 /* emit_load *******************************************************************
62 
63  Emits a possible load of an operand.
64 
65 *******************************************************************************/
66 
67 s4 emit_load(jitdata *jd, instruction *iptr, varinfo *src, s4 tempreg)
68 {
69  codegendata *cd;
70  s4 disp;
71  s4 reg;
72 
73  /* get required compiler data */
74 
75  cd = jd->cd;
76 
77  if (IS_INMEMORY(src->flags)) {
79 
80  disp = src->vv.regoff;
81 
82  switch (src->type) {
83  case TYPE_INT:
84  M_ILD(tempreg, REG_SP, disp);
85  break;
86  case TYPE_LNG:
87  case TYPE_ADR:
88  M_LLD(tempreg, REG_SP, disp);
89  break;
90  case TYPE_FLT:
91  M_FLD(tempreg, REG_SP, disp);
92  break;
93  case TYPE_DBL:
94  M_DLD(tempreg, REG_SP, disp);
95  break;
96  default:
97  vm_abort("emit_load: unknown type %d", src->type);
98  break;
99  }
100 
101  reg = tempreg;
102  }
103  else
104  reg = src->vv.regoff;
105 
106  return reg;
107 }
108 
109 
110 /* emit_store ******************************************************************
111 
112  This function generates the code to store the result of an
113  operation back into a spilled pseudo-variable. If the
114  pseudo-variable has not been spilled in the first place, this
115  function will generate nothing.
116 
117 *******************************************************************************/
118 
119 void emit_store(jitdata *jd, instruction *iptr, varinfo *dst, s4 d)
120 {
121  codegendata *cd;
122  s4 disp;
123 
124  /* get required compiler data */
125 
126  cd = jd->cd;
127 
128  if (IS_INMEMORY(dst->flags)) {
129  COUNT_SPILLS;
130 
131  disp = dst->vv.regoff;
132 
133  switch (dst->type) {
134  case TYPE_INT:
135  case TYPE_LNG:
136  case TYPE_ADR:
137  M_LST(d, REG_SP, disp);
138  break;
139  case TYPE_FLT:
140  M_FST(d, REG_SP, disp);
141  break;
142  case TYPE_DBL:
143  M_DST(d, REG_SP, disp);
144  break;
145  default:
146  vm_abort("emit_store: unknown type %d", dst->type);
147  break;
148  }
149  }
150 }
151 
152 
153 /* emit_copy *******************************************************************
154 
155  Generates a register/memory to register/memory copy.
156 
157 *******************************************************************************/
158 
159 void emit_copy(jitdata *jd, instruction *iptr)
160 {
161  codegendata *cd;
162  varinfo *src;
163  varinfo *dst;
164  s4 s1, d;
165 
166  /* get required compiler data */
167 
168  cd = jd->cd;
169 
170  /* get source and destination variables */
171 
172  src = VAROP(iptr->s1);
173  dst = VAROP(iptr->dst);
174 
175  if ((src->vv.regoff != dst->vv.regoff) ||
176  ((src->flags ^ dst->flags) & INMEMORY)) {
177 
178  if ((src->type == TYPE_RET) || (dst->type == TYPE_RET)) {
179  /* emit nothing, as the value won't be used anyway */
180  return;
181  }
182 
183  /* If one of the variables resides in memory, we can eliminate
184  the register move from/to the temporary register with the
185  order of getting the destination register and the load. */
186 
187  if (IS_INMEMORY(src->flags)) {
188  d = codegen_reg_of_var(iptr->opc, dst, REG_IFTMP);
189  s1 = emit_load(jd, iptr, src, d);
190  }
191  else {
192  s1 = emit_load(jd, iptr, src, REG_IFTMP);
193  d = codegen_reg_of_var(iptr->opc, dst, s1);
194  }
195 
196  if (s1 != d) {
197  switch (src->type) {
198  case TYPE_INT:
199  case TYPE_LNG:
200  case TYPE_ADR:
201  M_MOV(s1, d);
202  break;
203  case TYPE_FLT:
204  case TYPE_DBL:
205  M_FMOV(s1, d);
206  break;
207  default:
208  vm_abort("emit_copy: unknown type %d", src->type);
209  break;
210  }
211  }
212 
213  emit_store(jd, iptr, dst, d);
214  }
215 }
216 
217 
218 void emit_cmovxx(codegendata *cd, instruction *iptr, s4 s, s4 d)
219 {
220 #if 0
221  switch (iptr->flags.fields.condition) {
222  case ICMD_IFEQ:
223  M_CMOVEQ(s, d);
224  break;
225  case ICMD_IFNE:
226  M_CMOVNE(s, d);
227  break;
228  case ICMD_IFLT:
229  M_CMOVLT(s, d);
230  break;
231  case ICMD_IFGE:
232  M_CMOVGE(s, d);
233  break;
234  case ICMD_IFGT:
235  M_CMOVGT(s, d);
236  break;
237  case ICMD_IFLE:
238  M_CMOVLE(s, d);
239  break;
240  }
241 #endif
242 }
243 
244 
245 /**
246  * Emits code updating the condition register by comparing one integer
247  * register to an immediate integer value.
248  */
249 void emit_icmp_imm(codegendata* cd, int reg, int32_t value)
250 {
251  M_ICMP_IMM(value, reg);
252 }
253 
254 
255 /* emit_branch *****************************************************************
256 
257  Emits the code for conditional and unconditional branchs.
258 
259 *******************************************************************************/
260 
261 void emit_branch(codegendata *cd, s4 disp, s4 condition, s4 reg, u4 options)
262 {
263  s4 branchdisp;
264 
265  /* NOTE: A displacement overflow cannot happen. */
266 
267  /* check which branch to generate */
268 
269  if (condition == BRANCH_UNCONDITIONAL) {
270 
271  /* calculate the different displacements */
272 
273  branchdisp = disp - BRANCH_UNCONDITIONAL_SIZE;
274 
275  M_JMP_IMM(branchdisp);
276  }
277  else {
278  /* calculate the different displacements */
279 
280  branchdisp = disp - BRANCH_CONDITIONAL_SIZE;
281 
282  switch (condition) {
283  case BRANCH_EQ:
284  M_BEQ(branchdisp);
285  break;
286  case BRANCH_NE:
287  M_BNE(branchdisp);
288  break;
289  case BRANCH_LT:
290  M_BLT(branchdisp);
291  break;
292  case BRANCH_GE:
293  M_BGE(branchdisp);
294  break;
295  case BRANCH_GT:
296  M_BGT(branchdisp);
297  break;
298  case BRANCH_LE:
299  M_BLE(branchdisp);
300  break;
301  case BRANCH_ULT:
302  M_BULT(branchdisp);
303  break;
304  case BRANCH_ULE:
305  M_BULE(branchdisp);
306  break;
307  case BRANCH_UGE:
308  M_BUGE(branchdisp);
309  break;
310  case BRANCH_UGT:
311  M_BUGT(branchdisp);
312  break;
313  default:
314  vm_abort("emit_branch: unknown condition %d", condition);
315  break;
316  }
317  }
318 }
319 
320 
321 /* emit_arithmetic_check *******************************************************
322 
323  Emit an ArithmeticException check.
324 
325 *******************************************************************************/
326 
328 {
329  if (INSTRUCTION_MUST_CHECK(iptr)) {
330  M_TEST(reg);
331  M_BNE(8);
333  }
334 }
335 
336 
337 /* emit_arrayindexoutofbounds_check ********************************************
338 
339  Emit a ArrayIndexOutOfBoundsException check.
340 
341 *******************************************************************************/
342 
344 {
345  if (checkbounds && INSTRUCTION_MUST_CHECK(iptr)) {
347  M_ICMP(REG_ITMP3, s2);
348  M_BULT(8);
350  }
351 }
352 
353 
354 /* emit_arraystore_check *******************************************************
355 
356  Emit an ArrayStoreException check.
357 
358 *******************************************************************************/
359 
361 {
362  if (INSTRUCTION_MUST_CHECK(iptr)) {
364  M_BNE(8);
366  }
367 }
368 
369 
370 /* emit_classcast_check ********************************************************
371 
372  Emit a ClassCastException check.
373 
374 *******************************************************************************/
375 
376 void emit_classcast_check(codegendata *cd, instruction *iptr, s4 condition, s4 reg, s4 s1)
377 {
378  if (INSTRUCTION_MUST_CHECK(iptr)) {
379  switch (condition) {
380  case BRANCH_LE:
381  M_BGT(8);
382  break;
383  case BRANCH_GE:
384  M_BLT(8);
385  break;
386  case BRANCH_EQ:
387  M_BNE(8);
388  break;
389  case BRANCH_NE:
390  M_BEQ(8);
391  break;
392  case BRANCH_UGT:
393  M_BULE(8);
394  break;
395  default:
396  vm_abort("emit_classcast_check: unknown condition %d", condition);
397  break;
398  }
400  }
401 }
402 
403 
404 /* emit_nullpointer_check ******************************************************
405 
406  Emit a NullPointerException check.
407 
408 *******************************************************************************/
409 
411 {
412  if (INSTRUCTION_MUST_CHECK(iptr)) {
413  M_TEST(reg);
414  M_BNE(8);
416  }
417 }
418 
419 
420 /* emit_exception_check ********************************************************
421 
422  Emit an Exception check.
423 
424 *******************************************************************************/
425 
427 {
428  if (INSTRUCTION_MUST_CHECK(iptr)) {
430  M_BNE(8);
432  }
433 }
434 
435 
436 /* emit_trap_compiler **********************************************************
437 
438  Emit a trap instruction which calls the JIT compiler.
439 
440 *******************************************************************************/
441 
443 {
445 }
446 
448 {
450 }
451 
452 
453 /* emit_patcher_alignment ******************************************************
454 
455  Emit NOP to ensure placement at an even address.
456 
457 *******************************************************************************/
458 
460 {
461  if ((uintptr_t) cd->mcodeptr & 1)
462  M_NOP;
463 }
464 
465 
466 /* emit_trap *******************************************************************
467 
468  Emit a trap instruction and return the original machine code.
469 
470 *******************************************************************************/
471 
472 uint32_t emit_trap(codegendata *cd)
473 {
474  uint16_t mcode;
475 
476  /* Get machine code which is patched back in later. The trap is 2
477  bytes long. */
478 
479  mcode = *((uint16_t *) cd->mcodeptr);
480 
481  /* XXX This needs to be change to INT3 when the debugging problems
482  with gdb are resolved. */
483 
484  M_UD2;
485 
486  return mcode;
487 }
488 
489 
490 /**
491  * Generates fast-path code for the below builtin.
492  * Function: LOCK_monitor_enter
493  * Signature: (Ljava/lang/Object;)V
494  * Slow-path: bool lock_monitor_enter(java_handle_t*);
495  */
497 {
498  // Get required compiler data.
499  codegendata* cd = jd->cd;
500 
501  // XXX Currently the fast-path always fails. Implement me!
502  M_CLR(d);
503 }
504 
505 
506 /**
507  * Generates fast-path code for the below builtin.
508  * Function: LOCK_monitor_exit
509  * Signature: (Ljava/lang/Object;)V
510  * Slow-path: bool lock_monitor_exit(java_handle_t*);
511  */
513 {
514  // Get required compiler data.
515  codegendata* cd = jd->cd;
516 
517  // XXX Currently the fast-path always fails. Implement me!
518  M_CLR(d);
519 }
520 
521 
522 /**
523  * Generates synchronization code to enter a monitor.
524  */
525 void emit_monitor_enter(jitdata* jd, int32_t syncslot_offset)
526 {
527  // Get required compiler data.
528  methodinfo* m = jd->m;
529  codegendata* cd = jd->cd;
530 
531 #ifndef NDEBUG
534 
535  for (int32_t p = 0; p < INT_ARG_CNT; p++)
537 
538  for (int32_t p = 0; p < FLT_ARG_CNT; p++)
539  M_DST(abi_registers_float_argument[p], REG_SP, (INT_ARG_CNT + p) * 8);
540 
541  syncslot_offset += (INT_ARG_CNT + FLT_ARG_CNT) * 8;
542  }
543 #endif
544 
545  /* decide which monitor enter function to call */
546 
547  if (m->flags & ACC_STATIC) {
549  }
550  else {
551  M_TEST(REG_A0);
552  M_BNE(8);
554  }
555 
556  M_AST(REG_A0, REG_SP, syncslot_offset);
558  M_CALL(REG_ITMP1);
559 
560 #ifndef NDEBUG
562 
563  for (int32_t p = 0; p < INT_ARG_CNT; p++)
565 
566  for (int32_t p = 0; p < FLT_ARG_CNT; p++)
567  M_DLD(abi_registers_float_argument[p], REG_SP, (INT_ARG_CNT + p) * 8);
568 
569  M_LADD_IMM((INT_ARG_CNT + FLT_ARG_CNT) * 8, REG_SP);
570  }
571 #endif
572 }
573 
574 
575 /**
576  * Generates synchronization code to leave a monitor.
577  */
578 void emit_monitor_exit(jitdata* jd, int32_t syncslot_offset)
579 {
580  // Get required compiler data.
581  methodinfo* m = jd->m;
582  codegendata* cd = jd->cd;
583 
584  M_ALD(REG_A0, REG_SP, syncslot_offset);
585 
586  /* we need to save the proper return value */
587 
588  methoddesc* md = m->parseddesc;
589 
590  switch (md->returntype.type) {
591  case TYPE_INT:
592  case TYPE_ADR:
593  case TYPE_LNG:
594  M_LST(REG_RESULT, REG_SP, syncslot_offset);
595  break;
596  case TYPE_FLT:
597  case TYPE_DBL:
598  M_DST(REG_FRESULT, REG_SP, syncslot_offset);
599  break;
600  case TYPE_VOID:
601  break;
602  default:
603  assert(false);
604  break;
605  }
606 
608  M_CALL(REG_ITMP1);
609 
610  /* and now restore the proper return value */
611 
612  switch (md->returntype.type) {
613  case TYPE_INT:
614  case TYPE_ADR:
615  case TYPE_LNG:
616  M_LLD(REG_RESULT, REG_SP, syncslot_offset);
617  break;
618  case TYPE_FLT:
619  case TYPE_DBL:
620  M_DLD(REG_FRESULT, REG_SP, syncslot_offset);
621  break;
622  case TYPE_VOID:
623  break;
624  default:
625  assert(false);
626  break;
627  }
628 }
629 
630 
631 /**
632  * Emit profiling code for method frequency counting.
633  */
634 #if defined(ENABLE_PROFILING)
635 void emit_profile_method(codegendata* cd, codeinfo* code)
636 {
637  M_MOV_IMM(code, REG_ITMP3);
638  M_IINC_MEMBASE(REG_ITMP3, OFFSET(codeinfo, frequency));
639 }
640 #endif
641 
642 
643 /**
644  * Emit profiling code for basicblock frequency counting.
645  */
646 #if defined(ENABLE_PROFILING)
647 void emit_profile_basicblock(codegendata* cd, codeinfo* code, basicblock* bptr)
648 {
649  M_MOV_IMM(code->bbfrequency, REG_ITMP3);
650  M_IINC_MEMBASE(REG_ITMP3, bptr->nr * 4);
651 }
652 #endif
653 
654 
655 /**
656  * Emit profiling code to start CPU cycle counting.
657  */
658 #if defined(ENABLE_PROFILING)
659 void emit_profile_cycle_start(codegendata* cd, codeinfo* code)
660 {
661  M_PUSH(RAX);
662  M_PUSH(RDX);
663 
664  M_MOV_IMM(code, REG_ITMP3);
665  M_RDTSC;
667  M_ISBB_MEMBASE(RDX, REG_ITMP3, OFFSET(codeinfo, cycles) + 4);
668 
669  M_POP(RDX);
670  M_POP(RAX);
671 }
672 #endif
673 
674 
675 /**
676  * Emit profiling code to stop CPU cycle counting.
677  */
678 #if defined(ENABLE_PROFILING)
679 void emit_profile_cycle_stop(codegendata* cd, codeinfo* code)
680 {
681  M_PUSH(RAX);
682  M_PUSH(RDX);
683 
684  M_MOV_IMM(code, REG_ITMP3);
685  M_RDTSC;
687  M_IADC_MEMBASE(RDX, REG_ITMP3, OFFSET(codeinfo, cycles) + 4);
688 
689  M_POP(RDX);
690  M_POP(RAX);
691 }
692 #endif
693 
694 
695 /* emit_verbosecall_enter ******************************************************
696 
697  Generates the code for the call trace.
698 
699 *******************************************************************************/
700 
701 #if !defined(NDEBUG)
703 {
704  methodinfo *m;
705  codeinfo *code;
706  codegendata *cd;
707  registerdata *rd;
708  methoddesc *md;
709  s4 stackframesize;
710  s4 i, s;
711 
712  /* get required compiler data */
713 
714  m = jd->m;
715  code = jd->code;
716  cd = jd->cd;
717  rd = jd->rd;
718 
719  md = m->parseddesc;
720 
721  /* mark trace code */
722 
723  M_NOP;
724 
725  /* keep 16-byte stack alignment */
726 
727  stackframesize = md->paramcount + ARG_CNT + TMP_CNT;
728  ALIGN_2(stackframesize);
729 
730  M_LSUB_IMM(stackframesize * 8, REG_SP);
731 
732  /* save argument registers */
733 
734  for (i = 0; i < md->paramcount; i++) {
735  if (!md->params[i].inmemory) {
736  s = md->params[i].regoff;
737 
738  switch (md->paramtypes[i].type) {
739  case TYPE_ADR:
740  case TYPE_INT:
741  case TYPE_LNG:
742  M_LST(s, REG_SP, i * 8);
743  break;
744  case TYPE_FLT:
745  case TYPE_DBL:
746  M_DST(s, REG_SP, i * 8);
747  break;
748  default:
749  assert(false);
750  break;
751  }
752  }
753  }
754 
755  /* save all argument and temporary registers for leaf methods */
756 
757  if (code_is_leafmethod(code)) {
758  for (i = 0; i < INT_ARG_CNT; i++)
760 
761  for (i = 0; i < FLT_ARG_CNT; i++)
762  M_DST(abi_registers_float_argument[i], REG_SP, (md->paramcount + INT_ARG_CNT + i) * 8);
763 
764  for (i = 0; i < INT_TMP_CNT; i++)
765  M_LST(rd->tmpintregs[i], REG_SP, (md->paramcount + ARG_CNT + i) * 8);
766 
767  for (i = 0; i < FLT_TMP_CNT; i++)
768  M_DST(rd->tmpfltregs[i], REG_SP, (md->paramcount + ARG_CNT + INT_TMP_CNT + i) * 8);
769  }
770 
771  M_MOV_IMM(m, REG_A0);
772  M_MOV(REG_SP, REG_A1);
773  M_MOV(REG_SP, REG_A2);
774  M_AADD_IMM((stackframesize + cd->stackframesize + 1) * 8, REG_A2);
776  M_CALL(REG_ITMP1);
777 
778  /* restore argument registers */
779 
780  for (i = 0; i < md->paramcount; i++) {
781  if (!md->params[i].inmemory) {
782  s = md->params[i].regoff;
783 
784  switch (md->paramtypes[i].type) {
785  case TYPE_ADR:
786  case TYPE_INT:
787  case TYPE_LNG:
788  M_LLD(s, REG_SP, i * 8);
789  break;
790  case TYPE_FLT:
791  case TYPE_DBL:
792  M_DLD(s, REG_SP, i * 8);
793  break;
794  default:
795  assert(false);
796  break;
797  }
798  }
799  }
800 
801 
802  /* restore all argument and temporary registers for leaf methods */
803 
804  if (code_is_leafmethod(code)) {
805  for (i = 0; i < INT_ARG_CNT; i++)
807 
808  for (i = 0; i < FLT_ARG_CNT; i++)
809  M_DLD(abi_registers_float_argument[i], REG_SP, (md->paramcount + INT_ARG_CNT + i) * 8);
810 
811  for (i = 0; i < INT_TMP_CNT; i++)
812  M_LLD(rd->tmpintregs[i], REG_SP, (md->paramcount + ARG_CNT + i) * 8);
813 
814  for (i = 0; i < FLT_TMP_CNT; i++)
815  M_DLD(rd->tmpfltregs[i], REG_SP, (md->paramcount + ARG_CNT + INT_TMP_CNT + i) * 8);
816  }
817 
818  M_LADD_IMM(stackframesize * 8, REG_SP);
819 
820  /* mark trace code */
821 
822  M_NOP;
823 }
824 #endif /* !defined(NDEBUG) */
825 
826 
827 /* emit_verbosecall_exit *******************************************************
828 
829  Generates the code for the call trace.
830 
831 *******************************************************************************/
832 
833 #if !defined(NDEBUG)
835 {
836  methodinfo *m;
837  codegendata *cd;
838  //registerdata *rd;
839  methoddesc *md;
840 
841  /* get required compiler data */
842 
843  m = jd->m;
844  cd = jd->cd;
845  //rd = jd->rd;
846 
847  md = m->parseddesc;
848 
849  /* mark trace code */
850 
851  M_NOP;
852 
853  /* keep 16-byte stack alignment */
854 
855  M_ASUB_IMM(2 * 8, REG_SP);
856 
857  /* save return value */
858 
859  switch (md->returntype.type) {
860  case TYPE_ADR:
861  case TYPE_INT:
862  case TYPE_LNG:
863  M_LST(REG_RESULT, REG_SP, 0 * 8);
864  break;
865  case TYPE_FLT:
866  case TYPE_DBL:
867  M_DST(REG_FRESULT, REG_SP, 0 * 8);
868  break;
869  case TYPE_VOID:
870  break;
871  default:
872  assert(false);
873  break;
874  }
875 
876  M_MOV_IMM(m, REG_A0);
877  M_MOV(REG_SP, REG_A1);
878 
880  M_CALL(REG_ITMP1);
881 
882  /* restore return value */
883 
884  switch (md->returntype.type) {
885  case TYPE_ADR:
886  case TYPE_INT:
887  case TYPE_LNG:
888  M_LLD(REG_RESULT, REG_SP, 0 * 8);
889  break;
890  case TYPE_FLT:
891  case TYPE_DBL:
892  M_DLD(REG_FRESULT, REG_SP, 0 * 8);
893  break;
894  case TYPE_VOID:
895  break;
896  default:
897  assert(false);
898  break;
899  }
900 
901  M_AADD_IMM(2 * 8, REG_SP);
902 
903  /* mark trace code */
904 
905  M_NOP;
906 }
907 #endif /* !defined(NDEBUG) */
908 
909 
910 /* code generation functions **************************************************/
911 
912 static void emit_membase(codegendata *cd, s4 basereg, s4 disp, s4 dreg)
913 {
914  if ((basereg == REG_SP) || (basereg == R12)) {
915  if (disp == 0) {
916  emit_address_byte(0, dreg, REG_SP);
918 
919  } else if (IS_IMM8(disp)) {
920  emit_address_byte(1, dreg, REG_SP);
922  emit_imm8(disp);
923 
924  } else {
925  emit_address_byte(2, dreg, REG_SP);
927  emit_imm32(disp);
928  }
929 
930  } else if ((disp) == 0 && (basereg) != RBP && (basereg) != R13) {
931  emit_address_byte(0,(dreg),(basereg));
932 
933  } else if ((basereg) == RIP) {
934  emit_address_byte(0, dreg, RBP);
935  emit_imm32(disp);
936 
937  } else {
938  if (IS_IMM8(disp)) {
939  emit_address_byte(1, dreg, basereg);
940  emit_imm8(disp);
941 
942  } else {
943  emit_address_byte(2, dreg, basereg);
944  emit_imm32(disp);
945  }
946  }
947 }
948 
949 
950 static void emit_membase32(codegendata *cd, s4 basereg, s4 disp, s4 dreg)
951 {
952  if ((basereg == REG_SP) || (basereg == R12)) {
953  emit_address_byte(2, dreg, REG_SP);
955  emit_imm32(disp);
956  }
957  else {
958  emit_address_byte(2, dreg, basereg);
959  emit_imm32(disp);
960  }
961 }
962 
963 
964 static void emit_memindex(codegendata *cd, s4 reg, s4 disp, s4 basereg, s4 indexreg, s4 scale)
965 {
966  if (basereg == -1) {
967  emit_address_byte(0, reg, 4);
968  emit_address_byte(scale, indexreg, 5);
969  emit_imm32(disp);
970  }
971  else if ((disp == 0) && (basereg != RBP) && (basereg != R13)) {
972  emit_address_byte(0, reg, 4);
973  emit_address_byte(scale, indexreg, basereg);
974  }
975  else if (IS_IMM8(disp)) {
976  emit_address_byte(1, reg, 4);
977  emit_address_byte(scale, indexreg, basereg);
978  emit_imm8(disp);
979  }
980  else {
981  emit_address_byte(2, reg, 4);
982  emit_address_byte(scale, indexreg, basereg);
983  emit_imm32(disp);
984  }
985 }
986 
987 
988 void emit_ishift(jitdata *jd, s4 shift_op, instruction *iptr)
989 {
990  s4 s1, s2, d, d_old;
991  varinfo *v_s1,*v_s2,*v_dst;
992  codegendata *cd;
993 
994  /* get required compiler data */
995 
996  cd = jd->cd;
997 
998  v_s1 = VAROP(iptr->s1);
999  v_s2 = VAROP(iptr->sx.s23.s2);
1000  v_dst = VAROP(iptr->dst);
1001 
1002  s1 = v_s1->vv.regoff;
1003  s2 = v_s2->vv.regoff;
1004  d = v_dst->vv.regoff;
1005 
1006  M_INTMOVE(RCX, REG_ITMP1); /* save RCX */
1007 
1008  if (IS_INMEMORY(v_dst->flags)) {
1009  if (IS_INMEMORY(v_s2->flags) && IS_INMEMORY(v_s1->flags)) {
1010  if (s1 == d) {
1011  M_ILD(RCX, REG_SP, s2);
1012  emit_shiftl_membase(cd, shift_op, REG_SP, d);
1013 
1014  } else {
1015  M_ILD(RCX, REG_SP, s2);
1016  M_ILD(REG_ITMP2, REG_SP, s1);
1017  emit_shiftl_reg(cd, shift_op, REG_ITMP2);
1018  M_IST(REG_ITMP2, REG_SP, d);
1019  }
1020 
1021  } else if (IS_INMEMORY(v_s2->flags) && !IS_INMEMORY(v_s1->flags)) {
1022  /* s1 may be equal to RCX */
1023  if (s1 == RCX) {
1024  if (s2 == d) {
1025  M_ILD(REG_ITMP1, REG_SP, s2);
1026  M_IST(s1, REG_SP, d);
1028 
1029  } else {
1030  M_IST(s1, REG_SP, d);
1031  M_ILD(RCX, REG_SP, s2);
1032  }
1033 
1034  } else {
1035  M_ILD(RCX, REG_SP, s2);
1036  M_IST(s1, REG_SP, d);
1037  }
1038 
1039  emit_shiftl_membase(cd, shift_op, REG_SP, d);
1040 
1041  } else if (!IS_INMEMORY(v_s2->flags) && IS_INMEMORY(v_s1->flags)) {
1042  if (s1 == d) {
1043  M_INTMOVE(s2, RCX);
1044  emit_shiftl_membase(cd, shift_op, REG_SP, d);
1045 
1046  } else {
1047  M_INTMOVE(s2, RCX);
1048  M_ILD(REG_ITMP2, REG_SP, s1);
1049  emit_shiftl_reg(cd, shift_op, REG_ITMP2);
1050  M_IST(REG_ITMP2, REG_SP, d);
1051  }
1052 
1053  } else {
1054  /* s1 may be equal to RCX */
1055  M_IST(s1, REG_SP, d);
1056  M_INTMOVE(s2, RCX);
1057  emit_shiftl_membase(cd, shift_op, REG_SP, d);
1058  }
1059 
1060  M_INTMOVE(REG_ITMP1, RCX); /* restore RCX */
1061 
1062  } else {
1063  d_old = d;
1064  if (d == RCX) {
1065  d = REG_ITMP3;
1066  }
1067 
1068  if (IS_INMEMORY(v_s2->flags) && IS_INMEMORY(v_s1->flags)) {
1069  M_ILD(RCX, REG_SP, s2);
1070  M_ILD(d, REG_SP, s1);
1071  emit_shiftl_reg(cd, shift_op, d);
1072 
1073  } else if (IS_INMEMORY(v_s2->flags) && !IS_INMEMORY(v_s1->flags)) {
1074  /* s1 may be equal to RCX */
1075  M_INTMOVE(s1, d);
1076  M_ILD(RCX, REG_SP, s2);
1077  emit_shiftl_reg(cd, shift_op, d);
1078 
1079  } else if (!IS_INMEMORY(v_s2->flags) && IS_INMEMORY(v_s1->flags)) {
1080  M_INTMOVE(s2, RCX);
1081  M_ILD(d, REG_SP, s1);
1082  emit_shiftl_reg(cd, shift_op, d);
1083 
1084  } else {
1085  /* s1 may be equal to RCX */
1086  if (s1 == RCX) {
1087  if (s2 == d) {
1088  /* d cannot be used to backup s1 since this would
1089  overwrite s2. */
1090  M_INTMOVE(s1, REG_ITMP3);
1091  M_INTMOVE(s2, RCX);
1092  M_INTMOVE(REG_ITMP3, d);
1093 
1094  } else {
1095  M_INTMOVE(s1, d);
1096  M_INTMOVE(s2, RCX);
1097  }
1098 
1099  } else {
1100  /* d may be equal to s2 */
1101  M_INTMOVE(s2, RCX);
1102  M_INTMOVE(s1, d);
1103  }
1104  emit_shiftl_reg(cd, shift_op, d);
1105  }
1106 
1107  if (d_old == RCX)
1109  else
1110  M_INTMOVE(REG_ITMP1, RCX); /* restore RCX */
1111  }
1112 }
1113 
1114 
1115 void emit_lshift(jitdata *jd, s4 shift_op, instruction *iptr)
1116 {
1117  s4 s1, s2, d, d_old;
1118  varinfo *v_s1,*v_s2,*v_dst;
1119  codegendata *cd;
1120 
1121  /* get required compiler data */
1122 
1123  cd = jd->cd;
1124 
1125  v_s1 = VAROP(iptr->s1);
1126  v_s2 = VAROP(iptr->sx.s23.s2);
1127  v_dst = VAROP(iptr->dst);
1128 
1129  s1 = v_s1->vv.regoff;
1130  s2 = v_s2->vv.regoff;
1131  d = v_dst->vv.regoff;
1132 
1133  M_INTMOVE(RCX, REG_ITMP1); /* save RCX */
1134 
1135  if (IS_INMEMORY(v_dst->flags)) {
1136  if (IS_INMEMORY(v_s2->flags) && IS_INMEMORY(v_s1->flags)) {
1137  if (s1 == d) {
1138  M_ILD(RCX, REG_SP, s2);
1139  emit_shift_membase(cd, shift_op, REG_SP, d);
1140 
1141  } else {
1142  M_ILD(RCX, REG_SP, s2);
1143  M_LLD(REG_ITMP2, REG_SP, s1);
1144  emit_shift_reg(cd, shift_op, REG_ITMP2);
1145  M_LST(REG_ITMP2, REG_SP, d);
1146  }
1147 
1148  } else if (IS_INMEMORY(v_s2->flags) && !IS_INMEMORY(v_s1->flags)) {
1149  /* s1 may be equal to RCX */
1150  if (s1 == RCX) {
1151  if (s2 == d) {
1152  M_ILD(REG_ITMP1, REG_SP, s2);
1153  M_LST(s1, REG_SP, d);
1155 
1156  } else {
1157  M_LST(s1, REG_SP, d);
1158  M_ILD(RCX, REG_SP, s2);
1159  }
1160 
1161  } else {
1162  M_ILD(RCX, REG_SP, s2);
1163  M_LST(s1, REG_SP, d);
1164  }
1165 
1166  emit_shift_membase(cd, shift_op, REG_SP, d);
1167 
1168  } else if (!IS_INMEMORY(v_s2->flags) && IS_INMEMORY(v_s1->flags)) {
1169  if (s1 == d) {
1170  M_INTMOVE(s2, RCX);
1171  emit_shift_membase(cd, shift_op, REG_SP, d);
1172 
1173  } else {
1174  M_INTMOVE(s2, RCX);
1175  M_LLD(REG_ITMP2, REG_SP, s1);
1176  emit_shift_reg(cd, shift_op, REG_ITMP2);
1177  M_LST(REG_ITMP2, REG_SP, d);
1178  }
1179 
1180  } else {
1181  /* s1 may be equal to RCX */
1182  M_LST(s1, REG_SP, d);
1183  M_INTMOVE(s2, RCX);
1184  emit_shift_membase(cd, shift_op, REG_SP, d);
1185  }
1186 
1187  M_INTMOVE(REG_ITMP1, RCX); /* restore RCX */
1188 
1189  } else {
1190  d_old = d;
1191  if (d == RCX) {
1192  d = REG_ITMP3;
1193  }
1194 
1195  if (IS_INMEMORY(v_s2->flags) && IS_INMEMORY(v_s1->flags)) {
1196  M_ILD(RCX, REG_SP, s2);
1197  M_LLD(d, REG_SP, s1);
1198  emit_shift_reg(cd, shift_op, d);
1199 
1200  } else if (IS_INMEMORY(v_s2->flags) && !IS_INMEMORY(v_s1->flags)) {
1201  /* s1 may be equal to RCX */
1202  M_INTMOVE(s1, d);
1203  M_ILD(RCX, REG_SP, s2);
1204  emit_shift_reg(cd, shift_op, d);
1205 
1206  } else if (!IS_INMEMORY(v_s2->flags) && IS_INMEMORY(v_s1->flags)) {
1207  M_INTMOVE(s2, RCX);
1208  M_LLD(d, REG_SP, s1);
1209  emit_shift_reg(cd, shift_op, d);
1210 
1211  } else {
1212  /* s1 may be equal to RCX */
1213  if (s1 == RCX) {
1214  if (s2 == d) {
1215  /* d cannot be used to backup s1 since this would
1216  overwrite s2. */
1217  M_INTMOVE(s1, REG_ITMP3);
1218  M_INTMOVE(s2, RCX);
1219  M_INTMOVE(REG_ITMP3, d);
1220 
1221  } else {
1222  M_INTMOVE(s1, d);
1223  M_INTMOVE(s2, RCX);
1224  }
1225 
1226  } else {
1227  /* d may be equal to s2 */
1228  M_INTMOVE(s2, RCX);
1229  M_INTMOVE(s1, d);
1230  }
1231  emit_shift_reg(cd, shift_op, d);
1232  }
1233 
1234  if (d_old == RCX)
1236  else
1237  M_INTMOVE(REG_ITMP1, RCX); /* restore RCX */
1238  }
1239 }
1240 
1241 
1242 /* low-level code emitter functions *******************************************/
1243 
1245 {
1246  assert(length >= 1 && length <= 9);
1247  switch (length) {
1248  case 1:
1249  *(cd->mcodeptr++) = 0x90;
1250  break;
1251  case 2:
1252  *(cd->mcodeptr++) = 0x66;
1253  *(cd->mcodeptr++) = 0x90;
1254  break;
1255  case 3:
1256  *(cd->mcodeptr++) = 0x0f;
1257  *(cd->mcodeptr++) = 0x1f;
1258  *(cd->mcodeptr++) = 0x00;
1259  break;
1260  case 4:
1261  *(cd->mcodeptr++) = 0x0f;
1262  *(cd->mcodeptr++) = 0x1f;
1263  *(cd->mcodeptr++) = 0x40;
1264  *(cd->mcodeptr++) = 0x00;
1265  break;
1266  case 5:
1267  *(cd->mcodeptr++) = 0x0f;
1268  *(cd->mcodeptr++) = 0x1f;
1269  *(cd->mcodeptr++) = 0x44;
1270  *(cd->mcodeptr++) = 0x00;
1271  *(cd->mcodeptr++) = 0x00;
1272  break;
1273  case 6:
1274  *(cd->mcodeptr++) = 0x66;
1275  *(cd->mcodeptr++) = 0x0f;
1276  *(cd->mcodeptr++) = 0x1f;
1277  *(cd->mcodeptr++) = 0x44;
1278  *(cd->mcodeptr++) = 0x00;
1279  *(cd->mcodeptr++) = 0x00;
1280  break;
1281  case 7:
1282  *(cd->mcodeptr++) = 0x0f;
1283  *(cd->mcodeptr++) = 0x1f;
1284  *(cd->mcodeptr++) = 0x80;
1285  *(cd->mcodeptr++) = 0x00;
1286  *(cd->mcodeptr++) = 0x00;
1287  *(cd->mcodeptr++) = 0x00;
1288  *(cd->mcodeptr++) = 0x00;
1289  break;
1290  case 8:
1291  *(cd->mcodeptr++) = 0x0f;
1292  *(cd->mcodeptr++) = 0x1f;
1293  *(cd->mcodeptr++) = 0x84;
1294  *(cd->mcodeptr++) = 0x00;
1295  *(cd->mcodeptr++) = 0x00;
1296  *(cd->mcodeptr++) = 0x00;
1297  *(cd->mcodeptr++) = 0x00;
1298  *(cd->mcodeptr++) = 0x00;
1299  break;
1300  case 9:
1301  *(cd->mcodeptr++) = 0x66;
1302  *(cd->mcodeptr++) = 0x0f;
1303  *(cd->mcodeptr++) = 0x1f;
1304  *(cd->mcodeptr++) = 0x84;
1305  *(cd->mcodeptr++) = 0x00;
1306  *(cd->mcodeptr++) = 0x00;
1307  *(cd->mcodeptr++) = 0x00;
1308  *(cd->mcodeptr++) = 0x00;
1309  *(cd->mcodeptr++) = 0x00;
1310  break;
1311  }
1312 }
1313 
1314 void emit_arbitrary_nop(codegendata *cd, int disp)
1315 {
1316  while (disp) {
1317  int x = disp < 9 ? disp : 9;
1318  emit_nop(cd, x);
1319  disp -= x;
1320  }
1321 }
1322 
1323 void emit_mov_reg_reg(codegendata *cd, s8 reg, s8 dreg)
1324 {
1325  emit_rex(1,(reg),0,(dreg));
1326  *(cd->mcodeptr++) = 0x89;
1327  emit_reg((reg),(dreg));
1328 }
1329 
1330 
1331 void emit_mov_imm_reg(codegendata *cd, s8 imm, s8 reg)
1332 {
1333  emit_rex(1,0,0,(reg));
1334  *(cd->mcodeptr++) = 0xb8 + ((reg) & 0x07);
1335  emit_imm64((imm));
1336 }
1337 
1338 
1339 void emit_movl_reg_reg(codegendata *cd, s8 reg, s8 dreg)
1340 {
1341  emit_rex(0,(reg),0,(dreg));
1342  *(cd->mcodeptr++) = 0x89;
1343  emit_reg((reg),(dreg));
1344 }
1345 
1346 
1347 void emit_movl_imm_reg(codegendata *cd, s8 imm, s8 reg) {
1348  emit_rex(0,0,0,(reg));
1349  *(cd->mcodeptr++) = 0xb8 + ((reg) & 0x07);
1350  emit_imm32((imm));
1351 }
1352 
1353 
1354 void emit_mov_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
1355  emit_rex(1,(reg),0,(basereg));
1356  *(cd->mcodeptr++) = 0x8b;
1357  emit_membase(cd, (basereg),(disp),(reg));
1358 }
1359 
1360 
1361 /*
1362  * this one is for INVOKEVIRTUAL/INVOKEINTERFACE to have a
1363  * constant membase immediate length of 32bit
1364  */
1365 void emit_mov_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
1366  emit_rex(1,(reg),0,(basereg));
1367  *(cd->mcodeptr++) = 0x8b;
1368  emit_membase32(cd, (basereg),(disp),(reg));
1369 }
1370 
1371 
1372 void emit_movl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg)
1373 {
1374  emit_rex(0,(reg),0,(basereg));
1375  *(cd->mcodeptr++) = 0x8b;
1376  emit_membase(cd, (basereg),(disp),(reg));
1377 }
1378 
1379 
1380 /* ATTENTION: Always emit a REX byte, because the instruction size can
1381  be smaller when all register indexes are smaller than 7. */
1382 void emit_movl_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg)
1383 {
1384  emit_byte_rex((reg),0,(basereg));
1385  *(cd->mcodeptr++) = 0x8b;
1386  emit_membase32(cd, (basereg),(disp),(reg));
1387 }
1388 
1389 
1390 void emit_mov_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
1391  emit_rex(1,(reg),0,(basereg));
1392  *(cd->mcodeptr++) = 0x89;
1393  emit_membase(cd, (basereg),(disp),(reg));
1394 }
1395 
1396 
1397 void emit_mov_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
1398  emit_rex(1,(reg),0,(basereg));
1399  *(cd->mcodeptr++) = 0x89;
1400  emit_membase32(cd, (basereg),(disp),(reg));
1401 }
1402 
1403 
1404 void emit_movl_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
1405  emit_rex(0,(reg),0,(basereg));
1406  *(cd->mcodeptr++) = 0x89;
1407  emit_membase(cd, (basereg),(disp),(reg));
1408 }
1409 
1410 
1411 /* Always emit a REX byte, because the instruction size can be smaller when */
1412 /* all register indexes are smaller than 7. */
1413 void emit_movl_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
1414  emit_byte_rex((reg),0,(basereg));
1415  *(cd->mcodeptr++) = 0x89;
1416  emit_membase32(cd, (basereg),(disp),(reg));
1417 }
1418 
1419 
1420 void emit_mov_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
1421  emit_rex(1,(reg),(indexreg),(basereg));
1422  *(cd->mcodeptr++) = 0x8b;
1423  emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1424 }
1425 
1426 
1427 void emit_movl_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
1428  emit_rex(0,(reg),(indexreg),(basereg));
1429  *(cd->mcodeptr++) = 0x8b;
1430  emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1431 }
1432 
1433 
1434 void emit_mov_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
1435  emit_rex(1,(reg),(indexreg),(basereg));
1436  *(cd->mcodeptr++) = 0x89;
1437  emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1438 }
1439 
1440 
1441 void emit_movl_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
1442  emit_rex(0,(reg),(indexreg),(basereg));
1443  *(cd->mcodeptr++) = 0x89;
1444  emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1445 }
1446 
1447 
1448 void emit_movw_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
1449  *(cd->mcodeptr++) = 0x66;
1450  emit_rex(0,(reg),(indexreg),(basereg));
1451  *(cd->mcodeptr++) = 0x89;
1452  emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1453 }
1454 
1455 
1456 void emit_movb_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
1457  emit_byte_rex((reg),(indexreg),(basereg));
1458  *(cd->mcodeptr++) = 0x88;
1459  emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1460 }
1461 
1462 
1463 void emit_mov_imm_membase(codegendata *cd, s8 imm, s8 basereg, s8 disp) {
1464  emit_rex(1,0,0,(basereg));
1465  *(cd->mcodeptr++) = 0xc7;
1466  emit_membase(cd, (basereg),(disp),0);
1467  emit_imm32((imm));
1468 }
1469 
1470 
1471 void emit_mov_imm_membase32(codegendata *cd, s8 imm, s8 basereg, s8 disp) {
1472  emit_rex(1,0,0,(basereg));
1473  *(cd->mcodeptr++) = 0xc7;
1474  emit_membase32(cd, (basereg),(disp),0);
1475  emit_imm32((imm));
1476 }
1477 
1478 
1479 void emit_movl_imm_membase(codegendata *cd, s8 imm, s8 basereg, s8 disp) {
1480  emit_rex(0,0,0,(basereg));
1481  *(cd->mcodeptr++) = 0xc7;
1482  emit_membase(cd, (basereg),(disp),0);
1483  emit_imm32((imm));
1484 }
1485 
1486 
1487 /* Always emit a REX byte, because the instruction size can be smaller when */
1488 /* all register indexes are smaller than 7. */
1489 void emit_movl_imm_membase32(codegendata *cd, s8 imm, s8 basereg, s8 disp) {
1490  emit_byte_rex(0,0,(basereg));
1491  *(cd->mcodeptr++) = 0xc7;
1492  emit_membase32(cd, (basereg),(disp),0);
1493  emit_imm32((imm));
1494 }
1495 
1496 
1497 void emit_movsbq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
1498 {
1499  emit_rex(1,(dreg),0,(reg));
1500  *(cd->mcodeptr++) = 0x0f;
1501  *(cd->mcodeptr++) = 0xbe;
1502  /* XXX: why do reg and dreg have to be exchanged */
1503  emit_reg((dreg),(reg));
1504 }
1505 
1506 
1507 void emit_movswq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
1508 {
1509  emit_rex(1,(dreg),0,(reg));
1510  *(cd->mcodeptr++) = 0x0f;
1511  *(cd->mcodeptr++) = 0xbf;
1512  /* XXX: why do reg and dreg have to be exchanged */
1513  emit_reg((dreg),(reg));
1514 }
1515 
1516 
1517 void emit_movslq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
1518 {
1519  emit_rex(1,(dreg),0,(reg));
1520  *(cd->mcodeptr++) = 0x63;
1521  /* XXX: why do reg and dreg have to be exchanged */
1522  emit_reg((dreg),(reg));
1523 }
1524 
1525 
1526 void emit_movzbq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
1527 {
1528  emit_rex(1,(dreg),0,(reg));
1529  *(cd->mcodeptr++) = 0x0f;
1530  *(cd->mcodeptr++) = 0xb6;
1531  /* XXX: why do reg and dreg have to be exchanged */
1532  emit_reg((dreg),(reg));
1533 }
1534 
1535 
1536 void emit_movzwq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
1537 {
1538  emit_rex(1,(dreg),0,(reg));
1539  *(cd->mcodeptr++) = 0x0f;
1540  *(cd->mcodeptr++) = 0xb7;
1541  /* XXX: why do reg and dreg have to be exchanged */
1542  emit_reg((dreg),(reg));
1543 }
1544 
1545 
1546 void emit_movswq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
1547  emit_rex(1,(reg),(indexreg),(basereg));
1548  *(cd->mcodeptr++) = 0x0f;
1549  *(cd->mcodeptr++) = 0xbf;
1550  emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1551 }
1552 
1553 
1554 void emit_movsbq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
1555  emit_rex(1,(reg),(indexreg),(basereg));
1556  *(cd->mcodeptr++) = 0x0f;
1557  *(cd->mcodeptr++) = 0xbe;
1558  emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1559 }
1560 
1561 
1562 void emit_movzwq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
1563  emit_rex(1,(reg),(indexreg),(basereg));
1564  *(cd->mcodeptr++) = 0x0f;
1565  *(cd->mcodeptr++) = 0xb7;
1566  emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1567 }
1568 
1569 
1570 void emit_mov_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
1571 {
1572  emit_rex(1,0,(indexreg),(basereg));
1573  *(cd->mcodeptr++) = 0xc7;
1574  emit_memindex(cd, 0,(disp),(basereg),(indexreg),(scale));
1575  emit_imm32((imm));
1576 }
1577 
1578 
1579 void emit_movl_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
1580 {
1581  emit_rex(0,0,(indexreg),(basereg));
1582  *(cd->mcodeptr++) = 0xc7;
1583  emit_memindex(cd, 0,(disp),(basereg),(indexreg),(scale));
1584  emit_imm32((imm));
1585 }
1586 
1587 
1588 void emit_movw_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
1589 {
1590  *(cd->mcodeptr++) = 0x66;
1591  emit_rex(0,0,(indexreg),(basereg));
1592  *(cd->mcodeptr++) = 0xc7;
1593  emit_memindex(cd, 0,(disp),(basereg),(indexreg),(scale));
1594  emit_imm16((imm));
1595 }
1596 
1597 
1598 void emit_movb_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
1599 {
1600  emit_rex(0,0,(indexreg),(basereg));
1601  *(cd->mcodeptr++) = 0xc6;
1602  emit_memindex(cd, 0,(disp),(basereg),(indexreg),(scale));
1603  emit_imm8((imm));
1604 }
1605 
1606 
1607 void emit_mov_mem_reg(codegendata *cd, s4 disp, s4 dreg)
1608 {
1609  emit_rex(1, dreg, 0, 0);
1610  *(cd->mcodeptr++) = 0x8b;
1611  emit_address_byte(0, dreg, 4);
1612  emit_mem(4, disp);
1613 }
1614 
1615 
1616 /*
1617  * alu operations
1618  */
1619 void emit_alu_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg)
1620 {
1621  emit_rex(1,(reg),0,(dreg));
1622  *(cd->mcodeptr++) = (((opc)) << 3) + 1;
1623  emit_reg((reg),(dreg));
1624 }
1625 
1626 
1627 void emit_alul_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg)
1628 {
1629  emit_rex(0,(reg),0,(dreg));
1630  *(cd->mcodeptr++) = (((opc)) << 3) + 1;
1631  emit_reg((reg),(dreg));
1632 }
1633 
1634 
1635 void emit_alu_reg_membase(codegendata *cd, s8 opc, s8 reg, s8 basereg, s8 disp)
1636 {
1637  emit_rex(1,(reg),0,(basereg));
1638  *(cd->mcodeptr++) = (((opc)) << 3) + 1;
1639  emit_membase(cd, (basereg),(disp),(reg));
1640 }
1641 
1642 
1643 void emit_alul_reg_membase(codegendata *cd, s8 opc, s8 reg, s8 basereg, s8 disp)
1644 {
1645  emit_rex(0,(reg),0,(basereg));
1646  *(cd->mcodeptr++) = (((opc)) << 3) + 1;
1647  emit_membase(cd, (basereg),(disp),(reg));
1648 }
1649 
1650 
1651 void emit_alu_membase_reg(codegendata *cd, s8 opc, s8 basereg, s8 disp, s8 reg)
1652 {
1653  emit_rex(1,(reg),0,(basereg));
1654  *(cd->mcodeptr++) = (((opc)) << 3) + 3;
1655  emit_membase(cd, (basereg),(disp),(reg));
1656 }
1657 
1658 
1659 void emit_alul_membase_reg(codegendata *cd, s8 opc, s8 basereg, s8 disp, s8 reg)
1660 {
1661  emit_rex(0,(reg),0,(basereg));
1662  *(cd->mcodeptr++) = (((opc)) << 3) + 3;
1663  emit_membase(cd, (basereg),(disp),(reg));
1664 }
1665 
1666 
1667 void emit_alu_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg) {
1668  if (IS_IMM8(imm)) {
1669  emit_rex(1,0,0,(dreg));
1670  *(cd->mcodeptr++) = 0x83;
1671  emit_reg((opc),(dreg));
1672  emit_imm8((imm));
1673  } else {
1674  emit_rex(1,0,0,(dreg));
1675  *(cd->mcodeptr++) = 0x81;
1676  emit_reg((opc),(dreg));
1677  emit_imm32((imm));
1678  }
1679 }
1680 
1681 
1682 void emit_alu_imm32_reg(codegendata *cd, s4 opc, s4 imm, s4 dreg)
1683 {
1684  emit_rex(1,0,0,(dreg));
1685  *(cd->mcodeptr++) = 0x81;
1686  emit_reg((opc),(dreg));
1687  emit_imm32((imm));
1688 }
1689 
1690 
1691 void emit_alul_imm32_reg(codegendata *cd, s4 opc, s4 imm, s4 dreg)
1692 {
1693  emit_rex(0,0,0,(dreg));
1694  *(cd->mcodeptr++) = 0x81;
1695  emit_reg((opc),(dreg));
1696  emit_imm32((imm));
1697 }
1698 
1699 
1700 void emit_alul_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg) {
1701  if (IS_IMM8(imm)) {
1702  emit_rex(0,0,0,(dreg));
1703  *(cd->mcodeptr++) = 0x83;
1704  emit_reg((opc),(dreg));
1705  emit_imm8((imm));
1706  } else {
1707  emit_rex(0,0,0,(dreg));
1708  *(cd->mcodeptr++) = 0x81;
1709  emit_reg((opc),(dreg));
1710  emit_imm32((imm));
1711  }
1712 }
1713 
1714 
1715 void emit_alu_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp) {
1716  if (IS_IMM8(imm)) {
1717  emit_rex(1,0,0,(basereg));
1718  *(cd->mcodeptr++) = 0x83;
1719  emit_membase(cd, (basereg),(disp),(opc));
1720  emit_imm8((imm));
1721  } else {
1722  emit_rex(1,0,0,(basereg));
1723  *(cd->mcodeptr++) = 0x81;
1724  emit_membase(cd, (basereg),(disp),(opc));
1725  emit_imm32((imm));
1726  }
1727 }
1728 
1729 
1730 void emit_alul_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp) {
1731  if (IS_IMM8(imm)) {
1732  emit_rex(0,0,0,(basereg));
1733  *(cd->mcodeptr++) = 0x83;
1734  emit_membase(cd, (basereg),(disp),(opc));
1735  emit_imm8((imm));
1736  } else {
1737  emit_rex(0,0,0,(basereg));
1738  *(cd->mcodeptr++) = 0x81;
1739  emit_membase(cd, (basereg),(disp),(opc));
1740  emit_imm32((imm));
1741  }
1742 }
1743 
1744 void emit_alu_memindex_reg(codegendata *cd, s8 opc, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg)
1745 {
1746  emit_rex(1,(reg),(indexreg),(basereg));
1747  *(cd->mcodeptr++) = (((opc)) << 3) + 3;
1748  emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1749 }
1750 
1751 void emit_alul_memindex_reg(codegendata *cd, s8 opc, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg)
1752 {
1753  emit_rex(0,(reg),(indexreg),(basereg));
1754  *(cd->mcodeptr++) = (((opc)) << 3) + 3;
1755  emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1756 }
1757 
1758 void emit_test_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1759  emit_rex(1,(reg),0,(dreg));
1760  *(cd->mcodeptr++) = 0x85;
1761  emit_reg((reg),(dreg));
1762 }
1763 
1764 
1765 void emit_testl_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1766  emit_rex(0,(reg),0,(dreg));
1767  *(cd->mcodeptr++) = 0x85;
1768  emit_reg((reg),(dreg));
1769 }
1770 
1771 
1772 void emit_test_imm_reg(codegendata *cd, s8 imm, s8 reg) {
1773  *(cd->mcodeptr++) = 0xf7;
1774  emit_reg(0,(reg));
1775  emit_imm32((imm));
1776 }
1777 
1778 
1779 void emit_testw_imm_reg(codegendata *cd, s8 imm, s8 reg) {
1780  *(cd->mcodeptr++) = 0x66;
1781  *(cd->mcodeptr++) = 0xf7;
1782  emit_reg(0,(reg));
1783  emit_imm16((imm));
1784 }
1785 
1786 
1787 void emit_testb_imm_reg(codegendata *cd, s8 imm, s8 reg) {
1788  *(cd->mcodeptr++) = 0xf6;
1789  emit_reg(0,(reg));
1790  emit_imm8((imm));
1791 }
1792 
1793 
1794 void emit_lea_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
1795  emit_rex(1,(reg),0,(basereg));
1796  *(cd->mcodeptr++) = 0x8d;
1797  emit_membase(cd, (basereg),(disp),(reg));
1798 }
1799 
1800 
1801 void emit_leal_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
1802  emit_rex(0,(reg),0,(basereg));
1803  *(cd->mcodeptr++) = 0x8d;
1804  emit_membase(cd, (basereg),(disp),(reg));
1805 }
1806 
1807 
1809 {
1810  *(cd->mcodeptr++) = 0xff;
1811  emit_reg(0,(reg));
1812 }
1813 
1815 {
1816  emit_rex(1,0,0,(reg));
1817  *(cd->mcodeptr++) = 0xff;
1818  emit_reg(0,(reg));
1819 }
1820 
1821 void emit_incl_membase(codegendata *cd, s8 basereg, s8 disp)
1822 {
1823  emit_rex(0,0,0,(basereg));
1824  *(cd->mcodeptr++) = 0xff;
1825  emit_membase(cd, (basereg),(disp),0);
1826 }
1827 
1828 void emit_incq_membase(codegendata *cd, s8 basereg, s8 disp)
1829 {
1830  emit_rex(1,0,0,(basereg));
1831  *(cd->mcodeptr++) = 0xff;
1832  emit_membase(cd, (basereg),(disp),0);
1833 }
1834 
1835 
1836 
1838  *(cd->mcodeptr++) = 0x99;
1839 }
1840 
1841 
1843  emit_rex(1,0,0,0);
1844  *(cd->mcodeptr++) = 0x99;
1845 }
1846 
1847 
1848 
1849 void emit_imul_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1850  emit_rex(1,(dreg),0,(reg));
1851  *(cd->mcodeptr++) = 0x0f;
1852  *(cd->mcodeptr++) = 0xaf;
1853  emit_reg((dreg),(reg));
1854 }
1855 
1856 
1857 void emit_imull_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1858  emit_rex(0,(dreg),0,(reg));
1859  *(cd->mcodeptr++) = 0x0f;
1860  *(cd->mcodeptr++) = 0xaf;
1861  emit_reg((dreg),(reg));
1862 }
1863 
1864 
1865 void emit_imul_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1866  emit_rex(1,(dreg),0,(basereg));
1867  *(cd->mcodeptr++) = 0x0f;
1868  *(cd->mcodeptr++) = 0xaf;
1869  emit_membase(cd, (basereg),(disp),(dreg));
1870 }
1871 
1872 
1873 void emit_imull_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1874  emit_rex(0,(dreg),0,(basereg));
1875  *(cd->mcodeptr++) = 0x0f;
1876  *(cd->mcodeptr++) = 0xaf;
1877  emit_membase(cd, (basereg),(disp),(dreg));
1878 }
1879 
1880 
1881 void emit_imul_imm_reg(codegendata *cd, s8 imm, s8 dreg) {
1882  if (IS_IMM8((imm))) {
1883  emit_rex(1,0,0,(dreg));
1884  *(cd->mcodeptr++) = 0x6b;
1885  emit_reg(0,(dreg));
1886  emit_imm8((imm));
1887  } else {
1888  emit_rex(1,0,0,(dreg));
1889  *(cd->mcodeptr++) = 0x69;
1890  emit_reg(0,(dreg));
1891  emit_imm32((imm));
1892  }
1893 }
1894 
1895 
1896 void emit_imul_imm_reg_reg(codegendata *cd, s8 imm, s8 reg, s8 dreg) {
1897  if (IS_IMM8((imm))) {
1898  emit_rex(1,(dreg),0,(reg));
1899  *(cd->mcodeptr++) = 0x6b;
1900  emit_reg((dreg),(reg));
1901  emit_imm8((imm));
1902  } else {
1903  emit_rex(1,(dreg),0,(reg));
1904  *(cd->mcodeptr++) = 0x69;
1905  emit_reg((dreg),(reg));
1906  emit_imm32((imm));
1907  }
1908 }
1909 
1910 
1911 void emit_imull_imm_reg_reg(codegendata *cd, s8 imm, s8 reg, s8 dreg) {
1912  if (IS_IMM8((imm))) {
1913  emit_rex(0,(dreg),0,(reg));
1914  *(cd->mcodeptr++) = 0x6b;
1915  emit_reg((dreg),(reg));
1916  emit_imm8((imm));
1917  } else {
1918  emit_rex(0,(dreg),0,(reg));
1919  *(cd->mcodeptr++) = 0x69;
1920  emit_reg((dreg),(reg));
1921  emit_imm32((imm));
1922  }
1923 }
1924 
1925 
1926 void emit_imul_imm_membase_reg(codegendata *cd, s8 imm, s8 basereg, s8 disp, s8 dreg) {
1927  if (IS_IMM8((imm))) {
1928  emit_rex(1,(dreg),0,(basereg));
1929  *(cd->mcodeptr++) = 0x6b;
1930  emit_membase(cd, (basereg),(disp),(dreg));
1931  emit_imm8((imm));
1932  } else {
1933  emit_rex(1,(dreg),0,(basereg));
1934  *(cd->mcodeptr++) = 0x69;
1935  emit_membase(cd, (basereg),(disp),(dreg));
1936  emit_imm32((imm));
1937  }
1938 }
1939 
1940 
1941 void emit_imull_imm_membase_reg(codegendata *cd, s8 imm, s8 basereg, s8 disp, s8 dreg) {
1942  if (IS_IMM8((imm))) {
1943  emit_rex(0,(dreg),0,(basereg));
1944  *(cd->mcodeptr++) = 0x6b;
1945  emit_membase(cd, (basereg),(disp),(dreg));
1946  emit_imm8((imm));
1947  } else {
1948  emit_rex(0,(dreg),0,(basereg));
1949  *(cd->mcodeptr++) = 0x69;
1950  emit_membase(cd, (basereg),(disp),(dreg));
1951  emit_imm32((imm));
1952  }
1953 }
1954 
1955 
1956 void emit_idiv_reg(codegendata *cd, s8 reg) {
1957  emit_rex(1,0,0,(reg));
1958  *(cd->mcodeptr++) = 0xf7;
1959  emit_reg(7,(reg));
1960 }
1961 
1962 
1964  emit_rex(0,0,0,(reg));
1965  *(cd->mcodeptr++) = 0xf7;
1966  emit_reg(7,(reg));
1967 }
1968 
1969 
1970 
1971 /*
1972  * shift ops
1973  */
1974 void emit_shift_reg(codegendata *cd, s8 opc, s8 reg) {
1975  emit_rex(1,0,0,(reg));
1976  *(cd->mcodeptr++) = 0xd3;
1977  emit_reg((opc),(reg));
1978 }
1979 
1980 
1981 void emit_shiftl_reg(codegendata *cd, s8 opc, s8 reg) {
1982  emit_rex(0,0,0,(reg));
1983  *(cd->mcodeptr++) = 0xd3;
1984  emit_reg((opc),(reg));
1985 }
1986 
1987 
1988 void emit_shift_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp) {
1989  emit_rex(1,0,0,(basereg));
1990  *(cd->mcodeptr++) = 0xd3;
1991  emit_membase(cd, (basereg),(disp),(opc));
1992 }
1993 
1994 
1995 void emit_shiftl_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp) {
1996  emit_rex(0,0,0,(basereg));
1997  *(cd->mcodeptr++) = 0xd3;
1998  emit_membase(cd, (basereg),(disp),(opc));
1999 }
2000 
2001 
2002 void emit_shift_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg) {
2003  if ((imm) == 1) {
2004  emit_rex(1,0,0,(dreg));
2005  *(cd->mcodeptr++) = 0xd1;
2006  emit_reg((opc),(dreg));
2007  } else {
2008  emit_rex(1,0,0,(dreg));
2009  *(cd->mcodeptr++) = 0xc1;
2010  emit_reg((opc),(dreg));
2011  emit_imm8((imm));
2012  }
2013 }
2014 
2015 
2016 void emit_shiftl_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg) {
2017  if ((imm) == 1) {
2018  emit_rex(0,0,0,(dreg));
2019  *(cd->mcodeptr++) = 0xd1;
2020  emit_reg((opc),(dreg));
2021  } else {
2022  emit_rex(0,0,0,(dreg));
2023  *(cd->mcodeptr++) = 0xc1;
2024  emit_reg((opc),(dreg));
2025  emit_imm8((imm));
2026  }
2027 }
2028 
2029 
2030 void emit_shift_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp) {
2031  if ((imm) == 1) {
2032  emit_rex(1,0,0,(basereg));
2033  *(cd->mcodeptr++) = 0xd1;
2034  emit_membase(cd, (basereg),(disp),(opc));
2035  } else {
2036  emit_rex(1,0,0,(basereg));
2037  *(cd->mcodeptr++) = 0xc1;
2038  emit_membase(cd, (basereg),(disp),(opc));
2039  emit_imm8((imm));
2040  }
2041 }
2042 
2043 
2044 void emit_shiftl_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp) {
2045  if ((imm) == 1) {
2046  emit_rex(0,0,0,(basereg));
2047  *(cd->mcodeptr++) = 0xd1;
2048  emit_membase(cd, (basereg),(disp),(opc));
2049  } else {
2050  emit_rex(0,0,0,(basereg));
2051  *(cd->mcodeptr++) = 0xc1;
2052  emit_membase(cd, (basereg),(disp),(opc));
2053  emit_imm8((imm));
2054  }
2055 }
2056 
2057 
2058 
2059 /*
2060  * jump operations
2061  */
2062 void emit_jmp_imm(codegendata *cd, s8 imm) {
2063  *(cd->mcodeptr++) = 0xe9;
2064  emit_imm32((imm));
2065 }
2066 
2067 /* like emit_jmp_imm but allows 8 bit optimization */
2068 void emit_jmp_imm2(codegendata *cd, s8 imm) {
2069  if (IS_IMM8(imm)) {
2070  *(cd->mcodeptr++) = 0xeb;
2071  emit_imm8((imm));
2072  }
2073  else {
2074  *(cd->mcodeptr++) = 0xe9;
2075  emit_imm32((imm));
2076  }
2077 }
2078 
2079 
2080 void emit_jmp_reg(codegendata *cd, s8 reg) {
2081  emit_rex(0,0,0,(reg));
2082  *(cd->mcodeptr++) = 0xff;
2083  emit_reg(4,(reg));
2084 }
2085 
2086 
2087 void emit_jcc(codegendata *cd, s8 opc, s8 imm) {
2088  *(cd->mcodeptr++) = 0x0f;
2089  *(cd->mcodeptr++) = (0x80 + (opc));
2090  emit_imm32((imm));
2091 }
2092 
2093 
2094 
2095 /*
2096  * conditional set and move operations
2097  */
2098 
2099 /* we need the rex byte to get all low bytes */
2100 void emit_setcc_reg(codegendata *cd, s4 opc, s4 reg)
2101 {
2102  *(cd->mcodeptr++) = (0x40 | (((reg) >> 3) & 0x01));
2103  *(cd->mcodeptr++) = 0x0f;
2104  *(cd->mcodeptr++) = (0x90 + (opc));
2105  emit_reg(0,(reg));
2106 }
2107 
2108 
2109 /* we need the rex byte to get all low bytes */
2110 void emit_setcc_membase(codegendata *cd, s4 opc, s4 basereg, s4 disp)
2111 {
2112  *(cd->mcodeptr++) = (0x40 | (((basereg) >> 3) & 0x01));
2113  *(cd->mcodeptr++) = 0x0f;
2114  *(cd->mcodeptr++) = (0x90 + (opc));
2115  emit_membase(cd, (basereg),(disp),0);
2116 }
2117 
2118 
2119 void emit_cmovcc_reg_reg(codegendata *cd, s4 opc, s4 reg, s4 dreg)
2120 {
2121  emit_rex(1,(dreg),0,(reg));
2122  *(cd->mcodeptr++) = 0x0f;
2123  *(cd->mcodeptr++) = (0x40 + (opc));
2124  emit_reg((dreg),(reg));
2125 }
2126 
2127 
2128 void emit_cmovccl_reg_reg(codegendata *cd, s4 opc, s4 reg, s4 dreg)
2129 {
2130  emit_rex(0,(dreg),0,(reg));
2131  *(cd->mcodeptr++) = 0x0f;
2132  *(cd->mcodeptr++) = (0x40 + (opc));
2133  emit_reg((dreg),(reg));
2134 }
2135 
2136 
2138 {
2139  emit_rex(1,0,0,(reg));
2140  *(cd->mcodeptr++) = 0xf7;
2141  emit_reg(3,(reg));
2142 }
2143 
2144 
2146 {
2147  emit_rex(0,0,0,(reg));
2148  *(cd->mcodeptr++) = 0xf7;
2149  emit_reg(3,(reg));
2150 }
2151 
2152 
2153 void emit_push_reg(codegendata *cd, s8 reg) {
2154  emit_rex(0,0,0,(reg));
2155  *(cd->mcodeptr++) = 0x50 + (0x07 & (reg));
2156 }
2157 
2158 
2159 void emit_push_imm(codegendata *cd, s8 imm) {
2160  *(cd->mcodeptr++) = 0x68;
2161  emit_imm32((imm));
2162 }
2163 
2164 
2165 void emit_pop_reg(codegendata *cd, s8 reg) {
2166  emit_rex(0,0,0,(reg));
2167  *(cd->mcodeptr++) = 0x58 + (0x07 & (reg));
2168 }
2169 
2170 
2171 void emit_xchg_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2172  emit_rex(1,(reg),0,(dreg));
2173  *(cd->mcodeptr++) = 0x87;
2174  emit_reg((reg),(dreg));
2175 }
2176 
2177 
2178 
2179 /*
2180  * call instructions
2181  */
2183 {
2184  emit_rex(0,0,0,(reg));
2185  *(cd->mcodeptr++) = 0xff;
2186  emit_reg(2,(reg));
2187 }
2188 
2189 
2191 {
2192  *(cd->mcodeptr++) = 0xe8;
2193  emit_imm32((imm));
2194 }
2195 
2196 
2198 {
2199  *(cd->mcodeptr++) = 0xff;
2200  emit_mem(2,(mem));
2201 }
2202 
2203 
2204 
2205 /*
2206  * floating point instructions (SSE2)
2207  */
2208 void emit_addsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2209  *(cd->mcodeptr++) = 0xf2;
2210  emit_rex(0,(dreg),0,(reg));
2211  *(cd->mcodeptr++) = 0x0f;
2212  *(cd->mcodeptr++) = 0x58;
2213  emit_reg((dreg),(reg));
2214 }
2215 
2216 
2217 void emit_addss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2218  *(cd->mcodeptr++) = 0xf3;
2219  emit_rex(0,(dreg),0,(reg));
2220  *(cd->mcodeptr++) = 0x0f;
2221  *(cd->mcodeptr++) = 0x58;
2222  emit_reg((dreg),(reg));
2223 }
2224 
2225 
2226 void emit_cvtsi2ssq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2227  *(cd->mcodeptr++) = 0xf3;
2228  emit_rex(1,(dreg),0,(reg));
2229  *(cd->mcodeptr++) = 0x0f;
2230  *(cd->mcodeptr++) = 0x2a;
2231  emit_reg((dreg),(reg));
2232 }
2233 
2234 
2235 void emit_cvtsi2ss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2236  *(cd->mcodeptr++) = 0xf3;
2237  emit_rex(0,(dreg),0,(reg));
2238  *(cd->mcodeptr++) = 0x0f;
2239  *(cd->mcodeptr++) = 0x2a;
2240  emit_reg((dreg),(reg));
2241 }
2242 
2243 
2244 void emit_cvtsi2sdq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2245  *(cd->mcodeptr++) = 0xf2;
2246  emit_rex(1,(dreg),0,(reg));
2247  *(cd->mcodeptr++) = 0x0f;
2248  *(cd->mcodeptr++) = 0x2a;
2249  emit_reg((dreg),(reg));
2250 }
2251 
2252 
2253 void emit_cvtsi2sd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2254  *(cd->mcodeptr++) = 0xf2;
2255  emit_rex(0,(dreg),0,(reg));
2256  *(cd->mcodeptr++) = 0x0f;
2257  *(cd->mcodeptr++) = 0x2a;
2258  emit_reg((dreg),(reg));
2259 }
2260 
2261 
2262 void emit_cvtss2sd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2263  *(cd->mcodeptr++) = 0xf3;
2264  emit_rex(0,(dreg),0,(reg));
2265  *(cd->mcodeptr++) = 0x0f;
2266  *(cd->mcodeptr++) = 0x5a;
2267  emit_reg((dreg),(reg));
2268 }
2269 
2270 
2271 void emit_cvtsd2ss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2272  *(cd->mcodeptr++) = 0xf2;
2273  emit_rex(0,(dreg),0,(reg));
2274  *(cd->mcodeptr++) = 0x0f;
2275  *(cd->mcodeptr++) = 0x5a;
2276  emit_reg((dreg),(reg));
2277 }
2278 
2279 
2281  *(cd->mcodeptr++) = 0xf3;
2282  emit_rex(1,(dreg),0,(reg));
2283  *(cd->mcodeptr++) = 0x0f;
2284  *(cd->mcodeptr++) = 0x2c;
2285  emit_reg((dreg),(reg));
2286 }
2287 
2288 
2289 void emit_cvttss2si_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2290  *(cd->mcodeptr++) = 0xf3;
2291  emit_rex(0,(dreg),0,(reg));
2292  *(cd->mcodeptr++) = 0x0f;
2293  *(cd->mcodeptr++) = 0x2c;
2294  emit_reg((dreg),(reg));
2295 }
2296 
2297 
2299  *(cd->mcodeptr++) = 0xf2;
2300  emit_rex(1,(dreg),0,(reg));
2301  *(cd->mcodeptr++) = 0x0f;
2302  *(cd->mcodeptr++) = 0x2c;
2303  emit_reg((dreg),(reg));
2304 }
2305 
2306 
2307 void emit_cvttsd2si_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2308  *(cd->mcodeptr++) = 0xf2;
2309  emit_rex(0,(dreg),0,(reg));
2310  *(cd->mcodeptr++) = 0x0f;
2311  *(cd->mcodeptr++) = 0x2c;
2312  emit_reg((dreg),(reg));
2313 }
2314 
2315 
2316 void emit_divss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2317  *(cd->mcodeptr++) = 0xf3;
2318  emit_rex(0,(dreg),0,(reg));
2319  *(cd->mcodeptr++) = 0x0f;
2320  *(cd->mcodeptr++) = 0x5e;
2321  emit_reg((dreg),(reg));
2322 }
2323 
2324 
2325 void emit_divsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2326  *(cd->mcodeptr++) = 0xf2;
2327  emit_rex(0,(dreg),0,(reg));
2328  *(cd->mcodeptr++) = 0x0f;
2329  *(cd->mcodeptr++) = 0x5e;
2330  emit_reg((dreg),(reg));
2331 }
2332 
2333 
2334 void emit_movd_reg_freg(codegendata *cd, s8 reg, s8 freg) {
2335  *(cd->mcodeptr++) = 0x66;
2336  emit_rex(1,(freg),0,(reg));
2337  *(cd->mcodeptr++) = 0x0f;
2338  *(cd->mcodeptr++) = 0x6e;
2339  emit_reg((freg),(reg));
2340 }
2341 
2342 
2343 void emit_movd_freg_reg(codegendata *cd, s8 freg, s8 reg) {
2344  *(cd->mcodeptr++) = 0x66;
2345  emit_rex(1,(freg),0,(reg));
2346  *(cd->mcodeptr++) = 0x0f;
2347  *(cd->mcodeptr++) = 0x7e;
2348  emit_reg((freg),(reg));
2349 }
2350 
2351 
2352 void emit_movd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
2353  *(cd->mcodeptr++) = 0x66;
2354  emit_rex(0,(reg),0,(basereg));
2355  *(cd->mcodeptr++) = 0x0f;
2356  *(cd->mcodeptr++) = 0x7e;
2357  emit_membase(cd, (basereg),(disp),(reg));
2358 }
2359 
2360 
2361 void emit_movd_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
2362  *(cd->mcodeptr++) = 0x66;
2363  emit_rex(0,(reg),(indexreg),(basereg));
2364  *(cd->mcodeptr++) = 0x0f;
2365  *(cd->mcodeptr++) = 0x7e;
2366  emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
2367 }
2368 
2369 
2370 void emit_movd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
2371  *(cd->mcodeptr++) = 0x66;
2372  emit_rex(1,(dreg),0,(basereg));
2373  *(cd->mcodeptr++) = 0x0f;
2374  *(cd->mcodeptr++) = 0x6e;
2375  emit_membase(cd, (basereg),(disp),(dreg));
2376 }
2377 
2378 
2379 void emit_movdl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
2380  *(cd->mcodeptr++) = 0x66;
2381  emit_rex(0,(dreg),0,(basereg));
2382  *(cd->mcodeptr++) = 0x0f;
2383  *(cd->mcodeptr++) = 0x6e;
2384  emit_membase(cd, (basereg),(disp),(dreg));
2385 }
2386 
2387 
2388 void emit_movd_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg) {
2389  *(cd->mcodeptr++) = 0x66;
2390  emit_rex(0,(dreg),(indexreg),(basereg));
2391  *(cd->mcodeptr++) = 0x0f;
2392  *(cd->mcodeptr++) = 0x6e;
2393  emit_memindex(cd, (dreg),(disp),(basereg),(indexreg),(scale));
2394 }
2395 
2396 
2397 void emit_movq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2398  *(cd->mcodeptr++) = 0xf3;
2399  emit_rex(0,(dreg),0,(reg));
2400  *(cd->mcodeptr++) = 0x0f;
2401  *(cd->mcodeptr++) = 0x7e;
2402  emit_reg((dreg),(reg));
2403 }
2404 
2405 
2406 void emit_movq_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
2407  *(cd->mcodeptr++) = 0x66;
2408  emit_rex(0,(reg),0,(basereg));
2409  *(cd->mcodeptr++) = 0x0f;
2410  *(cd->mcodeptr++) = 0xd6;
2411  emit_membase(cd, (basereg),(disp),(reg));
2412 }
2413 
2414 
2415 void emit_movq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
2416  *(cd->mcodeptr++) = 0xf3;
2417  emit_rex(0,(dreg),0,(basereg));
2418  *(cd->mcodeptr++) = 0x0f;
2419  *(cd->mcodeptr++) = 0x7e;
2420  emit_membase(cd, (basereg),(disp),(dreg));
2421 }
2422 
2423 
2424 void emit_movss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2425  *(cd->mcodeptr++) = 0xf3;
2426  emit_rex(0,(reg),0,(dreg));
2427  *(cd->mcodeptr++) = 0x0f;
2428  *(cd->mcodeptr++) = 0x10;
2429  emit_reg((reg),(dreg));
2430 }
2431 
2432 
2433 void emit_movsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2434  *(cd->mcodeptr++) = 0xf2;
2435  emit_rex(0,(reg),0,(dreg));
2436  *(cd->mcodeptr++) = 0x0f;
2437  *(cd->mcodeptr++) = 0x10;
2438  emit_reg((reg),(dreg));
2439 }
2440 
2441 
2442 void emit_movss_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
2443  *(cd->mcodeptr++) = 0xf3;
2444  emit_rex(0,(reg),0,(basereg));
2445  *(cd->mcodeptr++) = 0x0f;
2446  *(cd->mcodeptr++) = 0x11;
2447  emit_membase(cd, (basereg),(disp),(reg));
2448 }
2449 
2450 
2451 /* Always emit a REX byte, because the instruction size can be smaller when */
2452 /* all register indexes are smaller than 7. */
2453 void emit_movss_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
2454  *(cd->mcodeptr++) = 0xf3;
2455  emit_byte_rex((reg),0,(basereg));
2456  *(cd->mcodeptr++) = 0x0f;
2457  *(cd->mcodeptr++) = 0x11;
2458  emit_membase32(cd, (basereg),(disp),(reg));
2459 }
2460 
2461 
2462 void emit_movsd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
2463  *(cd->mcodeptr++) = 0xf2;
2464  emit_rex(0,(reg),0,(basereg));
2465  *(cd->mcodeptr++) = 0x0f;
2466  *(cd->mcodeptr++) = 0x11;
2467  emit_membase(cd, (basereg),(disp),(reg));
2468 }
2469 
2470 
2471 /* Always emit a REX byte, because the instruction size can be smaller when */
2472 /* all register indexes are smaller than 7. */
2473 void emit_movsd_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
2474  *(cd->mcodeptr++) = 0xf2;
2475  emit_byte_rex((reg),0,(basereg));
2476  *(cd->mcodeptr++) = 0x0f;
2477  *(cd->mcodeptr++) = 0x11;
2478  emit_membase32(cd, (basereg),(disp),(reg));
2479 }
2480 
2481 
2482 void emit_movss_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
2483  *(cd->mcodeptr++) = 0xf3;
2484  emit_rex(0,(dreg),0,(basereg));
2485  *(cd->mcodeptr++) = 0x0f;
2486  *(cd->mcodeptr++) = 0x10;
2487  emit_membase(cd, (basereg),(disp),(dreg));
2488 }
2489 
2490 
2491 /* Always emit a REX byte, because the instruction size can be smaller when */
2492 /* all register indexes are smaller than 7. */
2493 void emit_movss_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
2494  *(cd->mcodeptr++) = 0xf3;
2495  emit_byte_rex((dreg),0,(basereg));
2496  *(cd->mcodeptr++) = 0x0f;
2497  *(cd->mcodeptr++) = 0x10;
2498  emit_membase32(cd, (basereg),(disp),(dreg));
2499 }
2500 
2501 
2502 void emit_movlps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
2503 {
2504  emit_rex(0,(dreg),0,(basereg));
2505  *(cd->mcodeptr++) = 0x0f;
2506  *(cd->mcodeptr++) = 0x12;
2507  emit_membase(cd, (basereg),(disp),(dreg));
2508 }
2509 
2510 
2511 void emit_movlps_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp)
2512 {
2513  emit_rex(0,(reg),0,(basereg));
2514  *(cd->mcodeptr++) = 0x0f;
2515  *(cd->mcodeptr++) = 0x13;
2516  emit_membase(cd, (basereg),(disp),(reg));
2517 }
2518 
2519 
2520 void emit_movsd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
2521  *(cd->mcodeptr++) = 0xf2;
2522  emit_rex(0,(dreg),0,(basereg));
2523  *(cd->mcodeptr++) = 0x0f;
2524  *(cd->mcodeptr++) = 0x10;
2525  emit_membase(cd, (basereg),(disp),(dreg));
2526 }
2527 
2528 
2529 /* Always emit a REX byte, because the instruction size can be smaller when */
2530 /* all register indexes are smaller than 7. */
2531 void emit_movsd_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
2532  *(cd->mcodeptr++) = 0xf2;
2533  emit_byte_rex((dreg),0,(basereg));
2534  *(cd->mcodeptr++) = 0x0f;
2535  *(cd->mcodeptr++) = 0x10;
2536  emit_membase32(cd, (basereg),(disp),(dreg));
2537 }
2538 
2539 
2540 void emit_movlpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
2541 {
2542  *(cd->mcodeptr++) = 0x66;
2543  emit_rex(0,(dreg),0,(basereg));
2544  *(cd->mcodeptr++) = 0x0f;
2545  *(cd->mcodeptr++) = 0x12;
2546  emit_membase(cd, (basereg),(disp),(dreg));
2547 }
2548 
2549 
2550 void emit_movlpd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp)
2551 {
2552  *(cd->mcodeptr++) = 0x66;
2553  emit_rex(0,(reg),0,(basereg));
2554  *(cd->mcodeptr++) = 0x0f;
2555  *(cd->mcodeptr++) = 0x13;
2556  emit_membase(cd, (basereg),(disp),(reg));
2557 }
2558 
2559 
2560 void emit_movss_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
2561  *(cd->mcodeptr++) = 0xf3;
2562  emit_rex(0,(reg),(indexreg),(basereg));
2563  *(cd->mcodeptr++) = 0x0f;
2564  *(cd->mcodeptr++) = 0x11;
2565  emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
2566 }
2567 
2568 
2569 void emit_movsd_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
2570  *(cd->mcodeptr++) = 0xf2;
2571  emit_rex(0,(reg),(indexreg),(basereg));
2572  *(cd->mcodeptr++) = 0x0f;
2573  *(cd->mcodeptr++) = 0x11;
2574  emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
2575 }
2576 
2577 
2578 void emit_movss_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg) {
2579  *(cd->mcodeptr++) = 0xf3;
2580  emit_rex(0,(dreg),(indexreg),(basereg));
2581  *(cd->mcodeptr++) = 0x0f;
2582  *(cd->mcodeptr++) = 0x10;
2583  emit_memindex(cd, (dreg),(disp),(basereg),(indexreg),(scale));
2584 }
2585 
2586 
2587 void emit_movsd_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg) {
2588  *(cd->mcodeptr++) = 0xf2;
2589  emit_rex(0,(dreg),(indexreg),(basereg));
2590  *(cd->mcodeptr++) = 0x0f;
2591  *(cd->mcodeptr++) = 0x10;
2592  emit_memindex(cd, (dreg),(disp),(basereg),(indexreg),(scale));
2593 }
2594 
2595 
2596 void emit_mulss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2597  *(cd->mcodeptr++) = 0xf3;
2598  emit_rex(0,(dreg),0,(reg));
2599  *(cd->mcodeptr++) = 0x0f;
2600  *(cd->mcodeptr++) = 0x59;
2601  emit_reg((dreg),(reg));
2602 }
2603 
2604 
2605 void emit_mulsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2606  *(cd->mcodeptr++) = 0xf2;
2607  emit_rex(0,(dreg),0,(reg));
2608  *(cd->mcodeptr++) = 0x0f;
2609  *(cd->mcodeptr++) = 0x59;
2610  emit_reg((dreg),(reg));
2611 }
2612 
2613 
2614 void emit_subss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2615  *(cd->mcodeptr++) = 0xf3;
2616  emit_rex(0,(dreg),0,(reg));
2617  *(cd->mcodeptr++) = 0x0f;
2618  *(cd->mcodeptr++) = 0x5c;
2619  emit_reg((dreg),(reg));
2620 }
2621 
2622 
2623 void emit_subsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2624  *(cd->mcodeptr++) = 0xf2;
2625  emit_rex(0,(dreg),0,(reg));
2626  *(cd->mcodeptr++) = 0x0f;
2627  *(cd->mcodeptr++) = 0x5c;
2628  emit_reg((dreg),(reg));
2629 }
2630 
2631 
2632 void emit_ucomiss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2633  emit_rex(0,(dreg),0,(reg));
2634  *(cd->mcodeptr++) = 0x0f;
2635  *(cd->mcodeptr++) = 0x2e;
2636  emit_reg((dreg),(reg));
2637 }
2638 
2639 
2640 void emit_ucomisd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2641  *(cd->mcodeptr++) = 0x66;
2642  emit_rex(0,(dreg),0,(reg));
2643  *(cd->mcodeptr++) = 0x0f;
2644  *(cd->mcodeptr++) = 0x2e;
2645  emit_reg((dreg),(reg));
2646 }
2647 
2648 
2649 void emit_xorps_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2650  emit_rex(0,(dreg),0,(reg));
2651  *(cd->mcodeptr++) = 0x0f;
2652  *(cd->mcodeptr++) = 0x57;
2653  emit_reg((dreg),(reg));
2654 }
2655 
2656 
2657 void emit_xorps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
2658  emit_rex(0,(dreg),0,(basereg));
2659  *(cd->mcodeptr++) = 0x0f;
2660  *(cd->mcodeptr++) = 0x57;
2661  emit_membase(cd, (basereg),(disp),(dreg));
2662 }
2663 
2664 
2665 void emit_xorpd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
2666  *(cd->mcodeptr++) = 0x66;
2667  emit_rex(0,(dreg),0,(reg));
2668  *(cd->mcodeptr++) = 0x0f;
2669  *(cd->mcodeptr++) = 0x57;
2670  emit_reg((dreg),(reg));
2671 }
2672 
2673 
2674 void emit_xorpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
2675  *(cd->mcodeptr++) = 0x66;
2676  emit_rex(0,(dreg),0,(basereg));
2677  *(cd->mcodeptr++) = 0x0f;
2678  *(cd->mcodeptr++) = 0x57;
2679  emit_membase(cd, (basereg),(disp),(dreg));
2680 }
2681 
2682 
2683 /* system instructions ********************************************************/
2684 
2686 {
2687  *(cd->mcodeptr++) = 0x0f;
2688  *(cd->mcodeptr++) = 0x31;
2689 }
2690 
2692 {
2693  *(cd->mcodeptr++) = 0x0f;
2694  *(cd->mcodeptr++) = 0xae;
2695  *(cd->mcodeptr++) = 0xf0;
2696 }
2697 
2698 
2699 /*
2700  * These are local overrides for various environment variables in Emacs.
2701  * Please do not remove this and leave it at the end of the file, where
2702  * Emacs will automagically detect them.
2703  * ---------------------------------------------------------------------
2704  * Local variables:
2705  * mode: c++
2706  * indent-tabs-mode: t
2707  * c-basic-offset: 4
2708  * tab-width: 4
2709  * End:
2710  * vim:noexpandtab:sw=4:ts=4:
2711  */
#define emit_imm32(imm)
Definition: emit.hpp:123
const s4 abi_registers_float_argument[]
Definition: md-abi.cpp:107
void emit_incq_reg(codegendata *cd, s8 reg)
Definition: emit.cpp:1814
void emit_ucomisd_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2640
#define REG_SP
Definition: md-abi.hpp:53
void emit_imul_membase_reg(codegendata *cd, s4 basereg, s4 disp, s4 dreg)
Definition: emit.cpp:1355
void emit_jmp_imm2(codegendata *cd, s8 imm)
Definition: emit.cpp:2068
#define emit_mem(r, mem)
Definition: emit.hpp:134
void emit_test_reg_reg(codegendata *cd, s4 reg, s4 dreg)
Definition: emit.cpp:1315
java_object_t header
Definition: class.hpp:73
void emit_mfence(codegendata *cd)
Definition: emit.cpp:2691
void emit_imull_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:1857
union varinfo::@19 vv
void emit_movsd_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2433
dummy_java_lang_Class object
Definition: class.hpp:88
void emit_imul_imm_membase_reg(codegendata *cd, s4 imm, s4 basereg, s4 disp, s4 dreg)
Definition: emit.cpp:1391
void emit_neg_reg(codegendata *cd, s4 reg)
Definition: emit.cpp:1555
void emit_setcc_reg(codegendata *cd, s4 opc, s4 reg)
Definition: emit.cpp:1530
void emit_mov_reg_memindex(codegendata *cd, s4 reg, s4 disp, s4 basereg, s4 indexreg, s4 scale)
Definition: emit.cpp:1077
#define M_CMOVGE(a, b, c)
Definition: codegen.hpp:505
#define M_ALD(a, b, disp)
Definition: codegen.hpp:345
void emit_shiftl_reg(codegendata *cd, s8 opc, s8 reg)
Definition: emit.cpp:1981
#define ALIGN_2(a)
Definition: global.hpp:72
#define REG_A1
Definition: md-abi.hpp:36
Definition: jit.hpp:126
void emit_mov_membase_reg(codegendata *cd, s4 basereg, s4 disp, s4 reg)
Definition: emit.cpp:1033
void emit_monitor_exit(jitdata *jd, int32_t syncslot_offset)
Generates synchronization code to leave a monitor.
Definition: emit.cpp:565
#define M_LST(a, b, disp)
Definition: codegen.hpp:349
#define REG_A0
Definition: md-abi.hpp:35
void emit_push_reg(codegendata *cd, s4 reg)
Definition: emit.cpp:1576
paramdesc * params
Definition: descriptor.hpp:164
void emit_movw_reg_memindex(codegendata *cd, s4 reg, s4 disp, s4 basereg, s4 indexreg, s4 scale)
Definition: emit.cpp:1085
#define BRANCH_LE
void emit_mov_membase32_reg(codegendata *cd, s4 basereg, s4 disp, s4 reg)
Definition: emit.cpp:1045
#define JITDATA_HAS_FLAG_VERBOSECALL(jd)
Definition: jit.hpp:227
void emit_alul_membase_reg(codegendata *cd, s8 opc, s8 basereg, s8 disp, s8 reg)
Definition: emit.cpp:1659
void emit_movlps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
Definition: emit.cpp:2502
void emit_ucomiss_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2632
#define M_BEQ(off)
Definition: codegen.hpp:482
#define M_ILD(a, b, disp)
Definition: codegen.hpp:347
void emit_alu_membase_reg(codegendata *cd, s4 opc, s4 basereg, s4 disp, s4 reg)
Definition: emit.cpp:1253
void emit_ishift(jitdata *jd, s4 shift_op, instruction *iptr)
Definition: emit.cpp:988
#define M_JMP_IMM(a)
Definition: codegen.hpp:316
void emit_movzbq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:1526
#define BRANCH_NE
void emit_alul_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg)
Definition: emit.cpp:1700
void emit_cvtsd2ss_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2271
void emit_addsd_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2208
#define M_IST(a, b, disp)
Definition: codegen.hpp:351
void emit_mov_mem_reg(codegendata *cd, s4 mem, s4 dreg)
Definition: emit.cpp:1110
void emit_push_imm(codegendata *cd, s4 imm)
Definition: emit.cpp:1563
void emit_imull_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
Definition: emit.cpp:1873
#define M_BNE(off)
Definition: codegen.hpp:483
static void emit_memindex(codegendata *cd, s4 reg, s4 disp, s4 basereg, s4 indexreg, s4 scale)
Definition: emit.cpp:964
#define BRANCH_GT
void emit_monitor_enter(jitdata *jd, int32_t syncslot_offset)
Generates synchronization code to enter a monitor.
Definition: emit.cpp:507
void emit_testb_imm_reg(codegendata *cd, s8 imm, s8 reg)
Definition: emit.cpp:1787
static void emit_membase(codegendata *cd, s4 basereg, s4 disp, s4 dreg)
Definition: emit.cpp:912
#define BRANCH_EQ
const s4 abi_registers_integer_argument[]
Definition: md-abi.cpp:64
void emit_negl_reg(codegendata *cd, s8 reg)
Definition: emit.cpp:2145
#define M_AADD_IMM(a, b, c)
Definition: codegen.hpp:277
void emit_shiftl_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp)
Definition: emit.cpp:1995
void emit_movlps_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp)
Definition: emit.cpp:2511
codeinfo * code
Definition: jit.hpp:128
#define REG_FRESULT
Definition: md-abi.hpp:59
s4 codegen_reg_of_var(u2 opcode, varinfo *v, s4 tempregnum)
#define M_POP(a)
Definition: codegen.hpp:250
void emit_xchg_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2171
void emit_mov_reg_membase32(codegendata *cd, s4 reg, s4 basereg, s4 disp)
Definition: emit.cpp:1061
void emit_mov_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
Definition: emit.cpp:1211
#define BRANCH_UNCONDITIONAL
void emit_movb_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
Definition: emit.cpp:1228
void emit_alu_reg_reg(codegendata *cd, s4 opc, s4 reg, s4 dreg)
Definition: emit.cpp:1239
void emit_movl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg)
Definition: emit.cpp:1372
void emit_cvttsd2si_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2307
#define M_PUSH(a)
Definition: codegen.hpp:248
codegendata * cd
Definition: jit.hpp:129
void emit_movl_imm_membase32(codegendata *cd, s8 imm, s8 basereg, s8 disp)
Definition: emit.cpp:1489
void emit_movsd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
Definition: emit.cpp:2520
void emit_alul_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg)
Definition: emit.cpp:1627
void emit_movd_reg_freg(codegendata *cd, s8 reg, s8 freg)
Definition: emit.cpp:2334
#define REG_A2
Definition: md-abi.hpp:37
#define emit_byte_rex(reg, index, rm)
Definition: emit.hpp:118
int * tmpfltregs
Definition: reg.hpp:72
void emit_arraystore_check(codegendata *cd, instruction *iptr)
Definition: emit.cpp:380
#define BRANCH_UNCONDITIONAL_SIZE
Definition: codegen.hpp:105
#define M_FST(a, b, disp)
Definition: codegen.hpp:357
#define RAX
Definition: md-abi.hpp:32
void emit_arbitrary_nop(codegendata *cd, int disp)
Definition: emit.cpp:1314
#define M_FLD(a, b, disp)
Definition: codegen.hpp:354
#define COUNT_SPILLS
Definition: jit.hpp:108
void emit_movl_imm_reg(codegendata *cd, s8 imm, s8 reg)
Definition: emit.cpp:1347
#define M_IADD_MEMBASE(a, b, c)
Definition: codegen.hpp:352
void trace_java_call_exit(methodinfo *m, uint64_t *return_regs)
Definition: trace.cpp:240
Type type
Definition: reg.hpp:44
void emit_movsbq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:1497
void emit_shift_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp)
Definition: emit.cpp:2030
void emit_jmp_reg(codegendata *cd, s4 reg)
Definition: emit.cpp:1511
#define M_TEST(a)
Definition: codegen.hpp:359
void emit_xorps_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2649
void emit_idivl_reg(codegendata *cd, s8 reg)
Definition: emit.cpp:1963
int64_t s8
Definition: types.hpp:48
void emit_alu_imm_membase(codegendata *cd, s4 opc, s4 imm, s4 basereg, s4 disp)
Definition: emit.cpp:1282
void emit_call_imm(codegendata *cd, s4 imm)
Definition: emit.cpp:1598
void emit_movsd_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
Definition: emit.cpp:2531
JNIEnv jthread jobject jclass jlong size
Definition: jvmti.h:387
#define M_IADC_MEMBASE(a, b, c)
Definition: codegen.hpp:353
Definition: reg.hpp:43
void emit_abstractmethoderror_trap(codegendata *cd)
Definition: emit.cpp:468
void emit_testl_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:1765
void emit_movlpd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp)
Definition: emit.cpp:2550
#define RDX
Definition: md-abi.hpp:34
void emit_cvtsi2ss_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2235
void emit_shiftl_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp)
Definition: emit.cpp:2044
static int code_is_leafmethod(codeinfo *code)
Definition: code.hpp:151
#define M_FMOV(b, c)
Definition: codegen.hpp:341
#define REG_IFTMP
Definition: md-abi.hpp:69
void emit_movl_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale)
Definition: emit.cpp:1441
void emit_setcc_membase(codegendata *cd, s4 opc, s4 basereg, s4 disp)
Definition: emit.cpp:1539
void emit_movsd_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg)
Definition: emit.cpp:2587
void emit_cmovccl_reg_reg(codegendata *cd, s4 opc, s4 reg, s4 dreg)
Definition: emit.cpp:2128
#define M_CMOVLE(a, b, c)
Definition: codegen.hpp:506
void vm_abort(const char *text,...)
Definition: vm.cpp:2586
void emit_fastpath_monitor_enter(jitdata *jd, instruction *iptr, int d)
Generates fast-path code for the below builtin.
Definition: emit.cpp:496
s4 regoff
Definition: reg.hpp:47
void emit_imul_imm_reg(codegendata *cd, s4 imm, s4 dreg)
Definition: emit.cpp:1363
#define R12
Definition: md-abi.hpp:43
void emit_verbosecall_enter(jitdata *jd)
Definition: emit.cpp:625
typedesc paramtypes[1]
Definition: descriptor.hpp:167
void emit_movq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
Definition: emit.cpp:2415
void emit_exception_check(codegendata *cd, instruction *iptr)
Definition: emit.cpp:447
#define M_CMOVNE(a, b, c)
Definition: codegen.hpp:503
#define emit_reg(reg, rm)
Definition: emit.hpp:143
#define M_MOV_IMM(d, i)
Definition: codegen.hpp:448
#define M_BULE(disp)
Definition: codegen.hpp:524
void emit_test_imm_reg(codegendata *cd, s4 imm, s4 reg)
Definition: emit.cpp:1322
void trace_java_call_enter(methodinfo *m, uint64_t *arg_regs, uint64_t *stack)
Definition: trace.cpp:149
void emit_subss_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2614
void emit_call_reg(codegendata *cd, s4 reg)
Definition: emit.cpp:1591
void emit_alul_imm32_reg(codegendata *cd, s4 opc, s4 imm, s4 dreg)
Definition: emit.cpp:1691
void emit_movsd_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale)
Definition: emit.cpp:2569
#define FLT_TMP_CNT
Definition: md-abi.hpp:82
void emit_movb_reg_memindex(codegendata *cd, s4 reg, s4 disp, s4 basereg, s4 indexreg, s4 scale)
Definition: emit.cpp:1094
void emit_imul_reg_reg(codegendata *cd, s4 reg, s4 dreg)
Definition: emit.cpp:1347
void emit_cvtsi2sdq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2244
#define M_IINC_MEMBASE(a, b)
Definition: codegen.hpp:347
#define M_BULT(disp)
Definition: codegen.hpp:526
void emit_movss_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2424
void emit_incq_membase(codegendata *cd, s8 basereg, s8 disp)
Definition: emit.cpp:1828
dst_operand_t dst
flags_operand_t flags
void emit_movl_imm_membase(codegendata *cd, s8 imm, s8 basereg, s8 disp)
Definition: emit.cpp:1479
#define RIP
Definition: md-abi.hpp:31
void emit_movss_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale)
Definition: emit.cpp:2560
bool checkbounds
Definition: options.cpp:89
#define LOCK_monitor_enter
Definition: builtin.hpp:124
#define M_BUGT(disp)
Definition: codegen.hpp:525
classinfo * clazz
Definition: method.hpp:80
void emit_alul_reg_membase(codegendata *cd, s8 opc, s8 reg, s8 basereg, s8 disp)
Definition: emit.cpp:1643
void emit_alul_memindex_reg(codegendata *cd, s8 opc, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg)
Definition: emit.cpp:1751
void emit_mov_imm_membase32(codegendata *cd, s4 imm, s4 basereg, s4 disp)
Definition: emit.cpp:1134
#define ARG_CNT
Definition: abi-asm.hpp:41
void emit_cqto(codegendata *cd)
Definition: emit.cpp:1842
#define M_CMOVLT(a, b, c)
Definition: codegen.hpp:504
#define BRANCH_GE
void emit_shift_reg(codegendata *cd, s4 opc, s4 reg)
Definition: emit.cpp:1430
void emit_cvtsi2ssq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2226
#define INT_ARG_CNT
Definition: md-abi.hpp:74
void emit_trap_compiler(codegendata *cd)
Definition: emit.cpp:463
#define M_ICMP_IMM(a, b)
Definition: codegen.hpp:297
void emit_imul_imm_reg_reg(codegendata *cd, s4 imm, s4 reg, s4 dreg)
Definition: emit.cpp:1377
void emit_incl_membase(codegendata *cd, s8 basereg, s8 disp)
Definition: emit.cpp:1821
#define BRANCH_UGE
#define M_ASUB_IMM(a, b, c)
Definition: codegen.hpp:278
void emit_trap(codegendata *cd, u1 Xd, int type)
Definition: emit-asm.hpp:563
void emit_xorpd_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2665
MIIterator i
void emit_movsbq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg)
Definition: emit.cpp:1554
s4 emit_load(jitdata *jd, instruction *iptr, varinfo *src, s4 tempreg)
Definition: emit.cpp:66
#define BRANCH_UGT
typedesc returntype
Definition: descriptor.hpp:166
void emit_mulss_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2596
#define M_BGE(off)
Definition: codegen.hpp:484
void emit_movlpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
Definition: emit.cpp:2540
void emit_cvttsd2siq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2298
int32_t s4
Definition: types.hpp:45
void emit_store(jitdata *jd, instruction *iptr, varinfo *dst, s4 d)
Definition: emit.cpp:113
void emit_movd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp)
Definition: emit.cpp:2352
#define M_BUGE(disp)
Definition: codegen.hpp:273
#define M_ISBB_MEMBASE(a, b, c)
Definition: codegen.hpp:355
registerdata * rd
Definition: jit.hpp:130
#define M_AST(a, b, disp)
Definition: codegen.hpp:350
void emit_cltd(codegendata *cd)
Definition: emit.cpp:1837
union instruction::@12 sx
void emit_mov_imm_reg(codegendata *cd, s4 imm, s4 reg)
Definition: emit.cpp:1009
void emit_fastpath_monitor_exit(jitdata *jd, instruction *iptr, int d)
Generates fast-path code for the below builtin.
Definition: emit.cpp:512
void emit_arithmetic_check(codegendata *cd, instruction *iptr, s4 reg)
Definition: emit.cpp:346
void emit_mov_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg)
Definition: emit.cpp:1069
void emit_testw_imm_reg(codegendata *cd, s8 imm, s8 reg)
Definition: emit.cpp:1779
void emit_alu_reg_membase(codegendata *cd, s4 opc, s4 reg, s4 basereg, s4 disp)
Definition: emit.cpp:1246
#define IS_IMM8(c)
Definition: emit-common.hpp:63
#define LOCK_monitor_exit
Definition: builtin.hpp:132
void emit_movl_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg)
Definition: emit.cpp:1427
void emit_mov_reg_reg(codegendata *cd, s4 reg, s4 dreg)
Definition: emit.cpp:1001
#define M_LSUB_IMM(a, b, c)
Definition: codegen.hpp:273
#define M_MOV(a, b)
Definition: codegen.hpp:340
bool inmemory
Definition: descriptor.hpp:151
#define REG_ITMP2
Definition: md-abi.hpp:47
void emit_icmp_imm(codegendata *cd, int reg, int32_t value)
Emits code comparing a single register.
Definition: emit.cpp:243
void emit_copy(jitdata *jd, instruction *iptr)
Definition: emit.cpp:153
#define M_LADD_IMM(a, b, c)
Definition: codegen.hpp:271
s1_operand_t s1
#define TMP_CNT
Definition: abi-asm.hpp:42
uint32_t u4
Definition: types.hpp:46
void emit_alu_imm_reg(codegendata *cd, s4 opc, s4 imm, s4 dreg)
Definition: emit.cpp:1260
#define BRANCH_LT
#define INT_TMP_CNT
Definition: md-abi.hpp:75
void emit_movss_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg)
Definition: emit.cpp:2578
void emit_cvtss2sd_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2262
#define M_ICMP(a, b)
Definition: codegen.hpp:361
void emit_movd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
Definition: emit.cpp:2370
#define M_BGT(off)
Definition: codegen.hpp:485
#define RCX
Definition: md-abi.hpp:33
void emit_alu_memindex_reg(codegendata *cd, s4 opc, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg)
Definition: emit.cpp:1309
methoddesc * parseddesc
Definition: method.hpp:78
#define VAROP(v)
Definition: jit.hpp:251
#define M_RDTSC
Definition: codegen.hpp:345
void emit_leal_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg)
Definition: emit.cpp:1801
void emit_movq_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp)
Definition: emit.cpp:2406
void emit_movq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2397
int * tmpintregs
Definition: reg.hpp:70
void emit_movsd_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp)
Definition: emit.cpp:2473
void emit_alul_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp)
Definition: emit.cpp:1730
void emit_nop(codegendata *cd)
Definition: emit-asm.hpp:584
methodinfo * m
Definition: jit.hpp:127
static bool IS_INMEMORY(s4 flags)
Definition: stack.hpp:51
void emit_jcc(codegendata *cd, s4 opc, s4 imm)
Definition: emit.cpp:1518
void emit_addss_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2217
#define emit_imm64(imm)
Definition: emit.hpp:157
void emit_cvttss2siq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2280
void emit_movzwq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:1536
void emit_patcher_alignment(codegendata *cd)
Definition: emit.cpp:578
void emit_xorps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
Definition: emit.cpp:2657
void emit_pop_reg(codegendata *cd, s4 reg)
Definition: emit.cpp:1570
static void emit_membase32(codegendata *cd, s4 basereg, s4 disp, s4 dreg)
Definition: emit.cpp:950
#define FLT_ARG_CNT
Definition: md-abi.hpp:81
void emit_movw_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
Definition: emit.cpp:1219
void emit_movd_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale)
Definition: emit.cpp:2361
void emit_movl_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:1339
void emit_divsd_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2325
void emit_mulsd_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2605
void emit_call_mem(codegendata *cd, s4 mem)
#define emit_rex(size, reg, index, rm)
Definition: emit.hpp:111
void emit_mov_imm_membase(codegendata *cd, s4 imm, s4 basereg, s4 disp)
Definition: emit.cpp:1126
s4 flags
Definition: reg.hpp:45
#define M_BLT(off)
Definition: codegen.hpp:486
void emit_classcast_check(codegendata *cd, instruction *iptr, s4 condition, s4 reg, s4 s1)
Definition: emit.cpp:396
#define REG_METHODPTR
Definition: md-abi.hpp:43
void emit_imull_imm_membase_reg(codegendata *cd, s8 imm, s8 basereg, s8 disp, s8 dreg)
Definition: emit.cpp:1941
void emit_xorpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
Definition: emit.cpp:2674
void emit_branch(codegendata *cd, s4 disp, s4 condition, s4 reg, u4 opt)
Definition: emit.cpp:263
s4 nr
Definition: jit.hpp:312
int8_t s1
Definition: types.hpp:39
void emit_mov_reg_membase(codegendata *cd, s4 reg, s4 basereg, s4 disp)
Definition: emit.cpp:1053
void emit_jmp_imm(codegendata *cd, s4 imm)
Definition: emit.cpp:1504
void emit_incl_reg(codegendata *cd, s8 reg)
Definition: emit.cpp:1808
void emit_movl_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg)
Definition: emit.cpp:1382
void emit_cmovcc_reg_reg(codegendata *cd, s4 opc, s4 reg, s4 dreg)
Definition: emit.cpp:2119
void emit_cvtsi2sd_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2253
int16_t s2
Definition: types.hpp:42
void emit_cvttss2si_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2289
#define M_DST(a, b, disp)
Definition: codegen.hpp:356
struct instruction::@12::@13 s23
void emit_movslq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:1517
void emit_rdtsc(codegendata *cd)
Definition: emit.cpp:2685
void emit_shift_imm_reg(codegendata *cd, s4 opc, s4 imm, s4 dreg)
Definition: emit.cpp:1437
#define BRANCH_ULE
void emit_movss_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
Definition: emit.cpp:2493
void emit_alu_imm32_reg(codegendata *cd, s4 opc, s4 imm, s4 dreg)
Definition: emit.cpp:1274
void emit_movzwq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg)
Definition: emit.cpp:1562
void emit_movl_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp)
Definition: emit.cpp:1413
#define M_LLD(a, b, disp)
Definition: codegen.hpp:344
#define BRANCH_ULT
#define M_ISUB_MEMBASE(a, b, c)
Definition: codegen.hpp:354
#define REG_ITMP3
Definition: md-abi.hpp:48
#define M_BLE(off)
Definition: codegen.hpp:487
#define R13
Definition: md-abi.hpp:44
void emit_movd_freg_reg(codegendata *cd, s8 freg, s8 reg)
Definition: emit.cpp:2343
#define M_CLR(c)
Definition: codegen.hpp:303
s4 flags
Definition: method.hpp:70
#define M_ALD_MEM(a, disp)
Definition: codegen.hpp:152
uintptr_t ptrint
Definition: types.hpp:54
#define M_NOP
Definition: codegen.hpp:338
#define emit_address_byte(mod, reg, rm)
Definition: emit.hpp:102
void emit_shiftl_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg)
Definition: emit.cpp:2016
void emit_movss_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp)
Definition: emit.cpp:2442
void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1, s4 s2)
Definition: emit.cpp:362
#define M_UD2
Definition: codegen.hpp:319
void emit_lshift(jitdata *jd, s4 shift_op, instruction *iptr)
Definition: emit.cpp:1115
#define M_DLD(a, b, disp)
Definition: codegen.hpp:353
void emit_shift_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp)
Definition: emit.cpp:1988
void emit_idiv_reg(codegendata *cd, s4 reg)
Definition: emit.cpp:1419
#define M_CALL(a)
Definition: codegen.hpp:290
void emit_verbosecall_exit(jitdata *jd)
Definition: emit.cpp:766
uint32_t regoff
Definition: descriptor.hpp:153
void emit_movswq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:1507
void emit_movl_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
Definition: emit.cpp:1579
const char const void jint length
Definition: jvmti.h:352
#define M_CMOVEQ(a, b, c)
Definition: codegen.hpp:502
#define OFFSET(s, el)
Definition: memory.hpp:90
void emit_movss_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
Definition: emit.cpp:2482
#define emit_imm8(imm)
Definition: emit.hpp:108
#define INSTRUCTION_MUST_CHECK(iptr)
void emit_lea_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg)
Definition: emit.cpp:1794
#define M_CMOVGT(a, b, c)
Definition: codegen.hpp:507
#define REG_RESULT
Definition: md-abi.hpp:33
void emit_cmovxx(codegendata *cd, instruction *iptr, s4 s, s4 d)
Definition: emit.cpp:218
void emit_movss_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp)
Definition: emit.cpp:2453
void emit_movd_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg)
Definition: emit.cpp:2388
void emit_movsd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp)
Definition: emit.cpp:2462
#define M_INTMOVE(a, b)
#define BRANCH_CONDITIONAL_SIZE
Definition: codegen.hpp:106
void emit_movdl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
Definition: emit.cpp:2379
void emit_nullpointer_check(codegendata *cd, instruction *iptr, s4 reg)
Definition: emit.cpp:431
void emit_divss_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2316
#define emit_imm16(imm)
Definition: emit.hpp:114
#define REG_ITMP1
Definition: md-abi.hpp:46
void emit_movswq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg)
Definition: emit.cpp:1546
void emit_imull_imm_reg_reg(codegendata *cd, s8 imm, s8 reg, s8 dreg)
Definition: emit.cpp:1911
void emit_movl_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp)
Definition: emit.cpp:1404
#define RBP
Definition: md-abi.hpp:37
void emit_subsd_reg_reg(codegendata *cd, s8 reg, s8 dreg)
Definition: emit.cpp:2623