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