1 /* jit/x86_64/emitfuncs.c - x86_64 code emitter functions
3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
4 Institut f. Computersprachen, TU Wien
5 R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, M. Probst,
6 S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich,
9 This file is part of CACAO.
11 This program is free software; you can redistribute it and/or
12 modify it under the terms of the GNU General Public License as
13 published by the Free Software Foundation; either version 2, or (at
14 your option) any later version.
16 This program is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 Contact: cacao@complang.tuwien.ac.at
28 Authors: Christian Thalinger
30 $Id: emitfuncs.c 1353 2004-07-26 22:31:24Z twisti $
36 #include "jit/x86_64/emitfuncs.h"
37 #include "jit/x86_64/codegen.h"
38 #include "jit/x86_64/types.h"
41 /* code generation functions */
43 void x86_64_emit_ialu(methodinfo *m, s4 alu_op, stackptr src, instruction *iptr)
46 s4 s1 = src->prev->regoff;
48 s4 d = iptr->dst->regoff;
52 if (iptr->dst->flags & INMEMORY) {
53 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
55 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
56 x86_64_alul_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
59 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
60 x86_64_alul_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
63 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
64 x86_64_alul_membase_reg(cd, alu_op, REG_SP, s2 * 8, REG_ITMP1);
65 x86_64_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
68 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
70 x86_64_alul_reg_membase(cd, alu_op, s1, REG_SP, d * 8);
73 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
74 x86_64_alul_reg_reg(cd, alu_op, s1, REG_ITMP1);
75 x86_64_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
78 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
80 x86_64_alul_reg_membase(cd, alu_op, s2, REG_SP, d * 8);
83 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
84 x86_64_alul_reg_reg(cd, alu_op, s2, REG_ITMP1);
85 x86_64_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
89 x86_64_movl_reg_membase(cd, s1, REG_SP, d * 8);
90 x86_64_alul_reg_membase(cd, alu_op, s2, REG_SP, d * 8);
94 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
95 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, d);
96 x86_64_alul_membase_reg(cd, alu_op, REG_SP, s2 * 8, d);
98 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
100 x86_64_alul_membase_reg(cd, alu_op, REG_SP, s2 * 8, d);
102 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
104 x86_64_alul_membase_reg(cd, alu_op, REG_SP, s1 * 8, d);
108 x86_64_alul_reg_reg(cd, alu_op, s1, d);
112 x86_64_alul_reg_reg(cd, alu_op, s2, d);
120 void x86_64_emit_lalu(methodinfo *m, s4 alu_op, stackptr src, instruction *iptr)
123 s4 s1 = src->prev->regoff;
125 s4 d = iptr->dst->regoff;
129 if (iptr->dst->flags & INMEMORY) {
130 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
132 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
133 x86_64_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
135 } else if (s1 == d) {
136 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
137 x86_64_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
140 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
141 x86_64_alu_membase_reg(cd, alu_op, REG_SP, s2 * 8, REG_ITMP1);
142 x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
145 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
147 x86_64_alu_reg_membase(cd, alu_op, s1, REG_SP, d * 8);
150 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
151 x86_64_alu_reg_reg(cd, alu_op, s1, REG_ITMP1);
152 x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
155 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
157 x86_64_alu_reg_membase(cd, alu_op, s2, REG_SP, d * 8);
160 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
161 x86_64_alu_reg_reg(cd, alu_op, s2, REG_ITMP1);
162 x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
166 x86_64_mov_reg_membase(cd, s1, REG_SP, d * 8);
167 x86_64_alu_reg_membase(cd, alu_op, s2, REG_SP, d * 8);
171 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
172 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, d);
173 x86_64_alu_membase_reg(cd, alu_op, REG_SP, s2 * 8, d);
175 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
177 x86_64_alu_membase_reg(cd, alu_op, REG_SP, s2 * 8, d);
179 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
181 x86_64_alu_membase_reg(cd, alu_op, REG_SP, s1 * 8, d);
185 x86_64_alu_reg_reg(cd, alu_op, s1, d);
189 x86_64_alu_reg_reg(cd, alu_op, s2, d);
197 void x86_64_emit_ialuconst(methodinfo *m, s4 alu_op, stackptr src, instruction *iptr)
201 s4 d = iptr->dst->regoff;
205 if (iptr->dst->flags & INMEMORY) {
206 if (src->flags & INMEMORY) {
208 x86_64_alul_imm_membase(cd, alu_op, iptr->val.i, REG_SP, d * 8);
211 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
212 x86_64_alul_imm_reg(cd, alu_op, iptr->val.i, REG_ITMP1);
213 x86_64_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
217 x86_64_movl_reg_membase(cd, s1, REG_SP, d * 8);
218 x86_64_alul_imm_membase(cd, alu_op, iptr->val.i, REG_SP, d * 8);
222 if (src->flags & INMEMORY) {
223 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, d);
224 x86_64_alul_imm_reg(cd, alu_op, iptr->val.i, d);
228 x86_64_alul_imm_reg(cd, alu_op, iptr->val.i, d);
235 void x86_64_emit_laluconst(methodinfo *m, s4 alu_op, stackptr src, instruction *iptr)
239 s4 d = iptr->dst->regoff;
243 if (iptr->dst->flags & INMEMORY) {
244 if (src->flags & INMEMORY) {
246 if (x86_64_is_imm32(iptr->val.l)) {
247 x86_64_alu_imm_membase(cd, alu_op, iptr->val.l, REG_SP, d * 8);
250 x86_64_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
251 x86_64_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
255 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
257 if (x86_64_is_imm32(iptr->val.l)) {
258 x86_64_alu_imm_reg(cd, alu_op, iptr->val.l, REG_ITMP1);
261 x86_64_mov_imm_reg(cd, iptr->val.l, REG_ITMP2);
262 x86_64_alu_reg_reg(cd, alu_op, REG_ITMP2, REG_ITMP1);
264 x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
268 x86_64_mov_reg_membase(cd, s1, REG_SP, d * 8);
270 if (x86_64_is_imm32(iptr->val.l)) {
271 x86_64_alu_imm_membase(cd, alu_op, iptr->val.l, REG_SP, d * 8);
274 x86_64_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
275 x86_64_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
280 if (src->flags & INMEMORY) {
281 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, d);
287 if (x86_64_is_imm32(iptr->val.l)) {
288 x86_64_alu_imm_reg(cd, alu_op, iptr->val.l, d);
291 x86_64_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
292 x86_64_alu_reg_reg(cd, alu_op, REG_ITMP1, d);
299 void x86_64_emit_ishift(methodinfo *m, s4 shift_op, stackptr src, instruction *iptr)
302 s4 s1 = src->prev->regoff;
304 s4 d = iptr->dst->regoff;
308 M_INTMOVE(RCX, REG_ITMP1); /* save RCX */
309 if (iptr->dst->flags & INMEMORY) {
310 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
312 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, RCX);
313 x86_64_shiftl_membase(cd, shift_op, REG_SP, d * 8);
316 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, RCX);
317 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP2);
318 x86_64_shiftl_reg(cd, shift_op, REG_ITMP2);
319 x86_64_movl_reg_membase(cd, REG_ITMP2, REG_SP, d * 8);
322 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
323 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, RCX);
324 x86_64_movl_reg_membase(cd, s1, REG_SP, d * 8);
325 x86_64_shiftl_membase(cd, shift_op, REG_SP, d * 8);
327 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
330 x86_64_shiftl_membase(cd, shift_op, REG_SP, d * 8);
334 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP2);
335 x86_64_shiftl_reg(cd, shift_op, REG_ITMP2);
336 x86_64_movl_reg_membase(cd, REG_ITMP2, REG_SP, d * 8);
341 x86_64_movl_reg_membase(cd, s1, REG_SP, d * 8);
342 x86_64_shiftl_membase(cd, shift_op, REG_SP, d * 8);
344 M_INTMOVE(REG_ITMP1, RCX); /* restore RCX */
351 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
352 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, RCX);
353 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, d);
354 x86_64_shiftl_reg(cd, shift_op, d);
356 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
357 M_INTMOVE(s1, d); /* maybe src is RCX */
358 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, RCX);
359 x86_64_shiftl_reg(cd, shift_op, d);
361 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
363 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, d);
364 x86_64_shiftl_reg(cd, shift_op, d);
375 x86_64_shiftl_reg(cd, shift_op, d);
379 M_INTMOVE(REG_ITMP3, RCX);
382 M_INTMOVE(REG_ITMP1, RCX); /* restore RCX */
389 void x86_64_emit_lshift(methodinfo *m, s4 shift_op, stackptr src, instruction *iptr)
392 s4 s1 = src->prev->regoff;
394 s4 d = iptr->dst->regoff;
398 M_INTMOVE(RCX, REG_ITMP1); /* save RCX */
399 if (iptr->dst->flags & INMEMORY) {
400 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
402 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, RCX);
403 x86_64_shift_membase(cd, shift_op, REG_SP, d * 8);
406 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, RCX);
407 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP2);
408 x86_64_shift_reg(cd, shift_op, REG_ITMP2);
409 x86_64_mov_reg_membase(cd, REG_ITMP2, REG_SP, d * 8);
412 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
413 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, RCX);
414 x86_64_mov_reg_membase(cd, s1, REG_SP, d * 8);
415 x86_64_shift_membase(cd, shift_op, REG_SP, d * 8);
417 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
420 x86_64_shift_membase(cd, shift_op, REG_SP, d * 8);
424 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP2);
425 x86_64_shift_reg(cd, shift_op, REG_ITMP2);
426 x86_64_mov_reg_membase(cd, REG_ITMP2, REG_SP, d * 8);
431 x86_64_mov_reg_membase(cd, s1, REG_SP, d * 8);
432 x86_64_shift_membase(cd, shift_op, REG_SP, d * 8);
434 M_INTMOVE(REG_ITMP1, RCX); /* restore RCX */
441 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
442 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, RCX);
443 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, d);
444 x86_64_shift_reg(cd, shift_op, d);
446 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
447 M_INTMOVE(s1, d); /* maybe src is RCX */
448 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, RCX);
449 x86_64_shift_reg(cd, shift_op, d);
451 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
453 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, d);
454 x86_64_shift_reg(cd, shift_op, d);
464 x86_64_shift_reg(cd, shift_op, d);
468 M_INTMOVE(REG_ITMP3, RCX);
471 M_INTMOVE(REG_ITMP1, RCX); /* restore RCX */
478 void x86_64_emit_ishiftconst(methodinfo *m, s4 shift_op, stackptr src, instruction *iptr)
482 s4 d = iptr->dst->regoff;
486 if ((src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) {
488 x86_64_shiftl_imm_membase(cd, shift_op, iptr->val.i, REG_SP, d * 8);
491 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
492 x86_64_shiftl_imm_reg(cd, shift_op, iptr->val.i, REG_ITMP1);
493 x86_64_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
496 } else if ((src->flags & INMEMORY) && !(iptr->dst->flags & INMEMORY)) {
497 x86_64_movl_membase_reg(cd, REG_SP, s1 * 8, d);
498 x86_64_shiftl_imm_reg(cd, shift_op, iptr->val.i, d);
500 } else if (!(src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) {
501 x86_64_movl_reg_membase(cd, s1, REG_SP, d * 8);
502 x86_64_shiftl_imm_membase(cd, shift_op, iptr->val.i, REG_SP, d * 8);
506 x86_64_shiftl_imm_reg(cd, shift_op, iptr->val.i, d);
512 void x86_64_emit_lshiftconst(methodinfo *m, s4 shift_op, stackptr src, instruction *iptr)
516 s4 d = iptr->dst->regoff;
520 if ((src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) {
522 x86_64_shift_imm_membase(cd, shift_op, iptr->val.i, REG_SP, d * 8);
525 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
526 x86_64_shift_imm_reg(cd, shift_op, iptr->val.i, REG_ITMP1);
527 x86_64_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
530 } else if ((src->flags & INMEMORY) && !(iptr->dst->flags & INMEMORY)) {
531 x86_64_mov_membase_reg(cd, REG_SP, s1 * 8, d);
532 x86_64_shift_imm_reg(cd, shift_op, iptr->val.i, d);
534 } else if (!(src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) {
535 x86_64_mov_reg_membase(cd, s1, REG_SP, d * 8);
536 x86_64_shift_imm_membase(cd, shift_op, iptr->val.i, REG_SP, d * 8);
540 x86_64_shift_imm_reg(cd, shift_op, iptr->val.i, d);
546 void x86_64_emit_ifcc(methodinfo *m, s4 if_op, stackptr src, instruction *iptr)
552 if (src->flags & INMEMORY) {
553 x86_64_alul_imm_membase(cd, X86_64_CMP, iptr->val.i, REG_SP, src->regoff * 8);
556 x86_64_alul_imm_reg(cd, X86_64_CMP, iptr->val.i, src->regoff);
558 x86_64_jcc(cd, if_op, 0);
559 codegen_addreference(m, BlockPtrOfPC(iptr->op1), cd->mcodeptr);
564 void x86_64_emit_if_lcc(methodinfo *m, s4 if_op, stackptr src, instruction *iptr)
571 if (src->flags & INMEMORY) {
572 if (x86_64_is_imm32(iptr->val.l)) {
573 x86_64_alu_imm_membase(cd, X86_64_CMP, iptr->val.l, REG_SP, s1 * 8);
576 x86_64_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
577 x86_64_alu_reg_membase(cd, X86_64_CMP, REG_ITMP1, REG_SP, s1 * 8);
581 if (x86_64_is_imm32(iptr->val.l)) {
582 x86_64_alu_imm_reg(cd, X86_64_CMP, iptr->val.l, s1);
585 x86_64_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
586 x86_64_alu_reg_reg(cd, X86_64_CMP, REG_ITMP1, s1);
589 x86_64_jcc(cd, if_op, 0);
590 codegen_addreference(m, BlockPtrOfPC(iptr->op1), cd->mcodeptr);
595 void x86_64_emit_if_icmpcc(methodinfo *m, s4 if_op, stackptr src, instruction *iptr)
598 s4 s1 = src->prev->regoff;
603 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
604 x86_64_movl_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
605 x86_64_alul_reg_membase(cd, X86_64_CMP, REG_ITMP1, REG_SP, s1 * 8);
607 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
608 x86_64_alul_membase_reg(cd, X86_64_CMP, REG_SP, s2 * 8, s1);
610 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
611 x86_64_alul_reg_membase(cd, X86_64_CMP, s2, REG_SP, s1 * 8);
614 x86_64_alul_reg_reg(cd, X86_64_CMP, s2, s1);
616 x86_64_jcc(cd, if_op, 0);
617 codegen_addreference(m, BlockPtrOfPC(iptr->op1), cd->mcodeptr);
622 void x86_64_emit_if_lcmpcc(methodinfo *m, s4 if_op, stackptr src, instruction *iptr)
625 s4 s1 = src->prev->regoff;
630 if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
631 x86_64_mov_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
632 x86_64_alu_reg_membase(cd, X86_64_CMP, REG_ITMP1, REG_SP, s1 * 8);
634 } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
635 x86_64_alu_membase_reg(cd, X86_64_CMP, REG_SP, s2 * 8, s1);
637 } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
638 x86_64_alu_reg_membase(cd, X86_64_CMP, s2, REG_SP, s1 * 8);
641 x86_64_alu_reg_reg(cd, X86_64_CMP, s2, s1);
643 x86_64_jcc(cd, if_op, 0);
644 codegen_addreference(m, BlockPtrOfPC(iptr->op1), cd->mcodeptr);
651 void x86_64_mov_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
652 x86_64_emit_rex(1,(reg),0,(dreg));
653 *(cd->mcodeptr++) = 0x89;
654 x86_64_emit_reg((reg),(dreg));
658 void x86_64_mov_imm_reg(codegendata *cd, s8 imm, s8 reg) {
659 x86_64_emit_rex(1,0,0,(reg));
660 *(cd->mcodeptr++) = 0xb8 + ((reg) & 0x07);
661 x86_64_emit_imm64((imm));
665 void x86_64_movl_imm_reg(codegendata *cd, s8 imm, s8 reg) {
666 x86_64_emit_rex(0,0,0,(reg));
667 *(cd->mcodeptr++) = 0xb8 + ((reg) & 0x07);
668 x86_64_emit_imm32((imm));
672 void x86_64_mov_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
673 x86_64_emit_rex(1,(reg),0,(basereg));
674 *(cd->mcodeptr++) = 0x8b;
675 x86_64_emit_membase((basereg),(disp),(reg));
679 void x86_64_movl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
680 x86_64_emit_rex(0,(reg),0,(basereg));
681 *(cd->mcodeptr++) = 0x8b;
682 x86_64_emit_membase((basereg),(disp),(reg));
687 * this one is for INVOKEVIRTUAL/INVOKEINTERFACE to have a
688 * constant membase immediate length of 32bit
690 void x86_64_mov_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
691 x86_64_emit_rex(1,(reg),0,(basereg));
692 *(cd->mcodeptr++) = 0x8b;
693 x86_64_address_byte(2, (reg), (basereg));
694 x86_64_emit_imm32((disp));
698 void x86_64_mov_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
699 x86_64_emit_rex(1,(reg),0,(basereg));
700 *(cd->mcodeptr++) = 0x89;
701 x86_64_emit_membase((basereg),(disp),(reg));
705 void x86_64_movl_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
706 x86_64_emit_rex(0,(reg),0,(basereg));
707 *(cd->mcodeptr++) = 0x89;
708 x86_64_emit_membase((basereg),(disp),(reg));
712 void x86_64_mov_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
713 x86_64_emit_rex(1,(reg),(indexreg),(basereg));
714 *(cd->mcodeptr++) = 0x8b;
715 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
719 void x86_64_movl_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
720 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
721 *(cd->mcodeptr++) = 0x8b;
722 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
726 void x86_64_mov_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
727 x86_64_emit_rex(1,(reg),(indexreg),(basereg));
728 *(cd->mcodeptr++) = 0x89;
729 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
733 void x86_64_movl_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
734 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
735 *(cd->mcodeptr++) = 0x89;
736 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
740 void x86_64_movw_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
741 *(cd->mcodeptr++) = 0x66;
742 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
743 *(cd->mcodeptr++) = 0x89;
744 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
748 void x86_64_movb_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
749 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
750 *(cd->mcodeptr++) = 0x88;
751 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
755 void x86_64_mov_imm_membase(codegendata *cd, s8 imm, s8 basereg, s8 disp) {
756 x86_64_emit_rex(1,0,0,(basereg));
757 *(cd->mcodeptr++) = 0xc7;
758 x86_64_emit_membase((basereg),(disp),0);
759 x86_64_emit_imm32((imm));
763 void x86_64_movl_imm_membase(codegendata *cd, s8 imm, s8 basereg, s8 disp) {
764 x86_64_emit_rex(0,0,0,(basereg));
765 *(cd->mcodeptr++) = 0xc7;
766 x86_64_emit_membase((basereg),(disp),0);
767 x86_64_emit_imm32((imm));
771 void x86_64_movsbq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
772 x86_64_emit_rex(1,(dreg),0,(reg));
773 *(cd->mcodeptr++) = 0x0f;
774 *(cd->mcodeptr++) = 0xbe;
775 /* XXX: why do reg and dreg have to be exchanged */
776 x86_64_emit_reg((dreg),(reg));
780 void x86_64_movsbq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
781 x86_64_emit_rex(1,(dreg),0,(basereg));
782 *(cd->mcodeptr++) = 0x0f;
783 *(cd->mcodeptr++) = 0xbe;
784 x86_64_emit_membase((basereg),(disp),(dreg));
788 void x86_64_movswq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
789 x86_64_emit_rex(1,(dreg),0,(reg));
790 *(cd->mcodeptr++) = 0x0f;
791 *(cd->mcodeptr++) = 0xbf;
792 /* XXX: why do reg and dreg have to be exchanged */
793 x86_64_emit_reg((dreg),(reg));
797 void x86_64_movswq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
798 x86_64_emit_rex(1,(dreg),0,(basereg));
799 *(cd->mcodeptr++) = 0x0f;
800 *(cd->mcodeptr++) = 0xbf;
801 x86_64_emit_membase((basereg),(disp),(dreg));
805 void x86_64_movslq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
806 x86_64_emit_rex(1,(dreg),0,(reg));
807 *(cd->mcodeptr++) = 0x63;
808 /* XXX: why do reg and dreg have to be exchanged */
809 x86_64_emit_reg((dreg),(reg));
813 void x86_64_movslq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
814 x86_64_emit_rex(1,(dreg),0,(basereg));
815 *(cd->mcodeptr++) = 0x63;
816 x86_64_emit_membase((basereg),(disp),(dreg));
820 void x86_64_movzwq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
821 x86_64_emit_rex(1,(dreg),0,(reg));
822 *(cd->mcodeptr++) = 0x0f;
823 *(cd->mcodeptr++) = 0xb7;
824 /* XXX: why do reg and dreg have to be exchanged */
825 x86_64_emit_reg((dreg),(reg));
829 void x86_64_movzwq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
830 x86_64_emit_rex(1,(dreg),0,(basereg));
831 *(cd->mcodeptr++) = 0x0f;
832 *(cd->mcodeptr++) = 0xb7;
833 x86_64_emit_membase((basereg),(disp),(dreg));
837 void x86_64_movswq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
838 x86_64_emit_rex(1,(reg),(indexreg),(basereg));
839 *(cd->mcodeptr++) = 0x0f;
840 *(cd->mcodeptr++) = 0xbf;
841 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
845 void x86_64_movsbq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
846 x86_64_emit_rex(1,(reg),(indexreg),(basereg));
847 *(cd->mcodeptr++) = 0x0f;
848 *(cd->mcodeptr++) = 0xbe;
849 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
853 void x86_64_movzwq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
854 x86_64_emit_rex(1,(reg),(indexreg),(basereg));
855 *(cd->mcodeptr++) = 0x0f;
856 *(cd->mcodeptr++) = 0xb7;
857 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
865 void x86_64_alu_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg) {
866 x86_64_emit_rex(1,(reg),0,(dreg));
867 *(cd->mcodeptr++) = (((opc)) << 3) + 1;
868 x86_64_emit_reg((reg),(dreg));
872 void x86_64_alul_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg) {
873 x86_64_emit_rex(0,(reg),0,(dreg));
874 *(cd->mcodeptr++) = (((opc)) << 3) + 1;
875 x86_64_emit_reg((reg),(dreg));
879 void x86_64_alu_reg_membase(codegendata *cd, s8 opc, s8 reg, s8 basereg, s8 disp) {
880 x86_64_emit_rex(1,(reg),0,(basereg));
881 *(cd->mcodeptr++) = (((opc)) << 3) + 1;
882 x86_64_emit_membase((basereg),(disp),(reg));
886 void x86_64_alul_reg_membase(codegendata *cd, s8 opc, s8 reg, s8 basereg, s8 disp) {
887 x86_64_emit_rex(0,(reg),0,(basereg));
888 *(cd->mcodeptr++) = (((opc)) << 3) + 1;
889 x86_64_emit_membase((basereg),(disp),(reg));
893 void x86_64_alu_membase_reg(codegendata *cd, s8 opc, s8 basereg, s8 disp, s8 reg) {
894 x86_64_emit_rex(1,(reg),0,(basereg));
895 *(cd->mcodeptr++) = (((opc)) << 3) + 3;
896 x86_64_emit_membase((basereg),(disp),(reg));
900 void x86_64_alul_membase_reg(codegendata *cd, s8 opc, s8 basereg, s8 disp, s8 reg) {
901 x86_64_emit_rex(0,(reg),0,(basereg));
902 *(cd->mcodeptr++) = (((opc)) << 3) + 3;
903 x86_64_emit_membase((basereg),(disp),(reg));
907 void x86_64_alu_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg) {
908 if (x86_64_is_imm8(imm)) {
909 x86_64_emit_rex(1,0,0,(dreg));
910 *(cd->mcodeptr++) = 0x83;
911 x86_64_emit_reg((opc),(dreg));
912 x86_64_emit_imm8((imm));
914 x86_64_emit_rex(1,0,0,(dreg));
915 *(cd->mcodeptr++) = 0x81;
916 x86_64_emit_reg((opc),(dreg));
917 x86_64_emit_imm32((imm));
922 void x86_64_alul_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg) {
923 if (x86_64_is_imm8(imm)) {
924 x86_64_emit_rex(0,0,0,(dreg));
925 *(cd->mcodeptr++) = 0x83;
926 x86_64_emit_reg((opc),(dreg));
927 x86_64_emit_imm8((imm));
929 x86_64_emit_rex(0,0,0,(dreg));
930 *(cd->mcodeptr++) = 0x81;
931 x86_64_emit_reg((opc),(dreg));
932 x86_64_emit_imm32((imm));
937 void x86_64_alu_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp) {
938 if (x86_64_is_imm8(imm)) {
939 x86_64_emit_rex(1,(basereg),0,0);
940 *(cd->mcodeptr++) = 0x83;
941 x86_64_emit_membase((basereg),(disp),(opc));
942 x86_64_emit_imm8((imm));
944 x86_64_emit_rex(1,(basereg),0,0);
945 *(cd->mcodeptr++) = 0x81;
946 x86_64_emit_membase((basereg),(disp),(opc));
947 x86_64_emit_imm32((imm));
952 void x86_64_alul_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp) {
953 if (x86_64_is_imm8(imm)) {
954 x86_64_emit_rex(0,(basereg),0,0);
955 *(cd->mcodeptr++) = 0x83;
956 x86_64_emit_membase((basereg),(disp),(opc));
957 x86_64_emit_imm8((imm));
959 x86_64_emit_rex(0,(basereg),0,0);
960 *(cd->mcodeptr++) = 0x81;
961 x86_64_emit_membase((basereg),(disp),(opc));
962 x86_64_emit_imm32((imm));
967 void x86_64_test_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
968 x86_64_emit_rex(1,(reg),0,(dreg));
969 *(cd->mcodeptr++) = 0x85;
970 x86_64_emit_reg((reg),(dreg));
974 void x86_64_testl_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
975 x86_64_emit_rex(0,(reg),0,(dreg));
976 *(cd->mcodeptr++) = 0x85;
977 x86_64_emit_reg((reg),(dreg));
981 void x86_64_test_imm_reg(codegendata *cd, s8 imm, s8 reg) {
982 *(cd->mcodeptr++) = 0xf7;
983 x86_64_emit_reg(0,(reg));
984 x86_64_emit_imm32((imm));
988 void x86_64_testw_imm_reg(codegendata *cd, s8 imm, s8 reg) {
989 *(cd->mcodeptr++) = 0x66;
990 *(cd->mcodeptr++) = 0xf7;
991 x86_64_emit_reg(0,(reg));
992 x86_64_emit_imm16((imm));
996 void x86_64_testb_imm_reg(codegendata *cd, s8 imm, s8 reg) {
997 *(cd->mcodeptr++) = 0xf6;
998 x86_64_emit_reg(0,(reg));
999 x86_64_emit_imm8((imm));
1003 void x86_64_lea_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
1004 x86_64_emit_rex(1,(reg),0,(basereg));
1005 *(cd->mcodeptr++) = 0x8d;
1006 x86_64_emit_membase((basereg),(disp),(reg));
1010 void x86_64_leal_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
1011 x86_64_emit_rex(0,(reg),0,(basereg));
1012 *(cd->mcodeptr++) = 0x8d;
1013 x86_64_emit_membase((basereg),(disp),(reg));
1019 * inc, dec operations
1021 void x86_64_inc_reg(codegendata *cd, s8 reg) {
1022 x86_64_emit_rex(1,0,0,(reg));
1023 *(cd->mcodeptr++) = 0xff;
1024 x86_64_emit_reg(0,(reg));
1028 void x86_64_incl_reg(codegendata *cd, s8 reg) {
1029 x86_64_emit_rex(0,0,0,(reg));
1030 *(cd->mcodeptr++) = 0xff;
1031 x86_64_emit_reg(0,(reg));
1035 void x86_64_inc_membase(codegendata *cd, s8 basereg, s8 disp) {
1036 x86_64_emit_rex(1,(basereg),0,0);
1037 *(cd->mcodeptr++) = 0xff;
1038 x86_64_emit_membase((basereg),(disp),0);
1042 void x86_64_incl_membase(codegendata *cd, s8 basereg, s8 disp) {
1043 x86_64_emit_rex(0,(basereg),0,0);
1044 *(cd->mcodeptr++) = 0xff;
1045 x86_64_emit_membase((basereg),(disp),0);
1049 void x86_64_dec_reg(codegendata *cd, s8 reg) {
1050 x86_64_emit_rex(1,0,0,(reg));
1051 *(cd->mcodeptr++) = 0xff;
1052 x86_64_emit_reg(1,(reg));
1056 void x86_64_decl_reg(codegendata *cd, s8 reg) {
1057 x86_64_emit_rex(0,0,0,(reg));
1058 *(cd->mcodeptr++) = 0xff;
1059 x86_64_emit_reg(1,(reg));
1063 void x86_64_dec_membase(codegendata *cd, s8 basereg, s8 disp) {
1064 x86_64_emit_rex(1,(basereg),0,0);
1065 *(cd->mcodeptr++) = 0xff;
1066 x86_64_emit_membase((basereg),(disp),1);
1070 void x86_64_decl_membase(codegendata *cd, s8 basereg, s8 disp) {
1071 x86_64_emit_rex(0,(basereg),0,0);
1072 *(cd->mcodeptr++) = 0xff;
1073 x86_64_emit_membase((basereg),(disp),1);
1079 void x86_64_cltd(codegendata *cd) {
1080 *(cd->mcodeptr++) = 0x99;
1084 void x86_64_cqto(codegendata *cd) {
1085 x86_64_emit_rex(1,0,0,0);
1086 *(cd->mcodeptr++) = 0x99;
1091 void x86_64_imul_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1092 x86_64_emit_rex(1,(dreg),0,(reg));
1093 *(cd->mcodeptr++) = 0x0f;
1094 *(cd->mcodeptr++) = 0xaf;
1095 x86_64_emit_reg((dreg),(reg));
1099 void x86_64_imull_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1100 x86_64_emit_rex(0,(dreg),0,(reg));
1101 *(cd->mcodeptr++) = 0x0f;
1102 *(cd->mcodeptr++) = 0xaf;
1103 x86_64_emit_reg((dreg),(reg));
1107 void x86_64_imul_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1108 x86_64_emit_rex(1,(dreg),0,(basereg));
1109 *(cd->mcodeptr++) = 0x0f;
1110 *(cd->mcodeptr++) = 0xaf;
1111 x86_64_emit_membase((basereg),(disp),(dreg));
1115 void x86_64_imull_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1116 x86_64_emit_rex(0,(dreg),0,(basereg));
1117 *(cd->mcodeptr++) = 0x0f;
1118 *(cd->mcodeptr++) = 0xaf;
1119 x86_64_emit_membase((basereg),(disp),(dreg));
1123 void x86_64_imul_imm_reg(codegendata *cd, s8 imm, s8 dreg) {
1124 if (x86_64_is_imm8((imm))) {
1125 x86_64_emit_rex(1,0,0,(dreg));
1126 *(cd->mcodeptr++) = 0x6b;
1127 x86_64_emit_reg(0,(dreg));
1128 x86_64_emit_imm8((imm));
1130 x86_64_emit_rex(1,0,0,(dreg));
1131 *(cd->mcodeptr++) = 0x69;
1132 x86_64_emit_reg(0,(dreg));
1133 x86_64_emit_imm32((imm));
1138 void x86_64_imul_imm_reg_reg(codegendata *cd, s8 imm, s8 reg, s8 dreg) {
1139 if (x86_64_is_imm8((imm))) {
1140 x86_64_emit_rex(1,(dreg),0,(reg));
1141 *(cd->mcodeptr++) = 0x6b;
1142 x86_64_emit_reg((dreg),(reg));
1143 x86_64_emit_imm8((imm));
1145 x86_64_emit_rex(1,(dreg),0,(reg));
1146 *(cd->mcodeptr++) = 0x69;
1147 x86_64_emit_reg((dreg),(reg));
1148 x86_64_emit_imm32((imm));
1153 void x86_64_imull_imm_reg_reg(codegendata *cd, s8 imm, s8 reg, s8 dreg) {
1154 if (x86_64_is_imm8((imm))) {
1155 x86_64_emit_rex(0,(dreg),0,(reg));
1156 *(cd->mcodeptr++) = 0x6b;
1157 x86_64_emit_reg((dreg),(reg));
1158 x86_64_emit_imm8((imm));
1160 x86_64_emit_rex(0,(dreg),0,(reg));
1161 *(cd->mcodeptr++) = 0x69;
1162 x86_64_emit_reg((dreg),(reg));
1163 x86_64_emit_imm32((imm));
1168 void x86_64_imul_imm_membase_reg(codegendata *cd, s8 imm, s8 basereg, s8 disp, s8 dreg) {
1169 if (x86_64_is_imm8((imm))) {
1170 x86_64_emit_rex(1,(dreg),0,(basereg));
1171 *(cd->mcodeptr++) = 0x6b;
1172 x86_64_emit_membase((basereg),(disp),(dreg));
1173 x86_64_emit_imm8((imm));
1175 x86_64_emit_rex(1,(dreg),0,(basereg));
1176 *(cd->mcodeptr++) = 0x69;
1177 x86_64_emit_membase((basereg),(disp),(dreg));
1178 x86_64_emit_imm32((imm));
1183 void x86_64_imull_imm_membase_reg(codegendata *cd, s8 imm, s8 basereg, s8 disp, s8 dreg) {
1184 if (x86_64_is_imm8((imm))) {
1185 x86_64_emit_rex(0,(dreg),0,(basereg));
1186 *(cd->mcodeptr++) = 0x6b;
1187 x86_64_emit_membase((basereg),(disp),(dreg));
1188 x86_64_emit_imm8((imm));
1190 x86_64_emit_rex(0,(dreg),0,(basereg));
1191 *(cd->mcodeptr++) = 0x69;
1192 x86_64_emit_membase((basereg),(disp),(dreg));
1193 x86_64_emit_imm32((imm));
1198 void x86_64_idiv_reg(codegendata *cd, s8 reg) {
1199 x86_64_emit_rex(1,0,0,(reg));
1200 *(cd->mcodeptr++) = 0xf7;
1201 x86_64_emit_reg(7,(reg));
1205 void x86_64_idivl_reg(codegendata *cd, s8 reg) {
1206 x86_64_emit_rex(0,0,0,(reg));
1207 *(cd->mcodeptr++) = 0xf7;
1208 x86_64_emit_reg(7,(reg));
1213 void x86_64_ret(codegendata *cd) {
1214 *(cd->mcodeptr++) = 0xc3;
1222 void x86_64_shift_reg(codegendata *cd, s8 opc, s8 reg) {
1223 x86_64_emit_rex(1,0,0,(reg));
1224 *(cd->mcodeptr++) = 0xd3;
1225 x86_64_emit_reg((opc),(reg));
1229 void x86_64_shiftl_reg(codegendata *cd, s8 opc, s8 reg) {
1230 x86_64_emit_rex(0,0,0,(reg));
1231 *(cd->mcodeptr++) = 0xd3;
1232 x86_64_emit_reg((opc),(reg));
1236 void x86_64_shift_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp) {
1237 x86_64_emit_rex(1,0,0,(basereg));
1238 *(cd->mcodeptr++) = 0xd3;
1239 x86_64_emit_membase((basereg),(disp),(opc));
1243 void x86_64_shiftl_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp) {
1244 x86_64_emit_rex(0,0,0,(basereg));
1245 *(cd->mcodeptr++) = 0xd3;
1246 x86_64_emit_membase((basereg),(disp),(opc));
1250 void x86_64_shift_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg) {
1252 x86_64_emit_rex(1,0,0,(dreg));
1253 *(cd->mcodeptr++) = 0xd1;
1254 x86_64_emit_reg((opc),(dreg));
1256 x86_64_emit_rex(1,0,0,(dreg));
1257 *(cd->mcodeptr++) = 0xc1;
1258 x86_64_emit_reg((opc),(dreg));
1259 x86_64_emit_imm8((imm));
1264 void x86_64_shiftl_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg) {
1266 x86_64_emit_rex(0,0,0,(dreg));
1267 *(cd->mcodeptr++) = 0xd1;
1268 x86_64_emit_reg((opc),(dreg));
1270 x86_64_emit_rex(0,0,0,(dreg));
1271 *(cd->mcodeptr++) = 0xc1;
1272 x86_64_emit_reg((opc),(dreg));
1273 x86_64_emit_imm8((imm));
1278 void x86_64_shift_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp) {
1280 x86_64_emit_rex(1,0,0,(basereg));
1281 *(cd->mcodeptr++) = 0xd1;
1282 x86_64_emit_membase((basereg),(disp),(opc));
1284 x86_64_emit_rex(1,0,0,(basereg));
1285 *(cd->mcodeptr++) = 0xc1;
1286 x86_64_emit_membase((basereg),(disp),(opc));
1287 x86_64_emit_imm8((imm));
1292 void x86_64_shiftl_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp) {
1294 x86_64_emit_rex(0,0,0,(basereg));
1295 *(cd->mcodeptr++) = 0xd1;
1296 x86_64_emit_membase((basereg),(disp),(opc));
1298 x86_64_emit_rex(0,0,0,(basereg));
1299 *(cd->mcodeptr++) = 0xc1;
1300 x86_64_emit_membase((basereg),(disp),(opc));
1301 x86_64_emit_imm8((imm));
1310 void x86_64_jmp_imm(codegendata *cd, s8 imm) {
1311 *(cd->mcodeptr++) = 0xe9;
1312 x86_64_emit_imm32((imm));
1316 void x86_64_jmp_reg(codegendata *cd, s8 reg) {
1317 x86_64_emit_rex(0,0,0,(reg));
1318 *(cd->mcodeptr++) = 0xff;
1319 x86_64_emit_reg(4,(reg));
1323 void x86_64_jcc(codegendata *cd, s8 opc, s8 imm) {
1324 *(cd->mcodeptr++) = 0x0f;
1325 *(cd->mcodeptr++) = (0x80 + (opc));
1326 x86_64_emit_imm32((imm));
1332 * conditional set and move operations
1335 /* we need the rex byte to get all low bytes */
1336 void x86_64_setcc_reg(codegendata *cd, s8 opc, s8 reg) {
1337 *(cd->mcodeptr++) = (0x40 | (((reg) >> 3) & 0x01));
1338 *(cd->mcodeptr++) = 0x0f;
1339 *(cd->mcodeptr++) = (0x90 + (opc));
1340 x86_64_emit_reg(0,(reg));
1344 /* we need the rex byte to get all low bytes */
1345 void x86_64_setcc_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp) {
1346 *(cd->mcodeptr++) = (0x40 | (((basereg) >> 3) & 0x01));
1347 *(cd->mcodeptr++) = 0x0f;
1348 *(cd->mcodeptr++) = (0x90 + (opc));
1349 x86_64_emit_membase((basereg),(disp),0);
1353 void x86_64_cmovcc_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg) {
1354 x86_64_emit_rex(1,(dreg),0,(reg));
1355 *(cd->mcodeptr++) = 0x0f;
1356 *(cd->mcodeptr++) = (0x40 + (opc));
1357 x86_64_emit_reg((dreg),(reg));
1361 void x86_64_cmovccl_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg) {
1362 x86_64_emit_rex(0,(dreg),0,(reg));
1363 *(cd->mcodeptr++) = 0x0f;
1364 *(cd->mcodeptr++) = (0x40 + (opc));
1365 x86_64_emit_reg((dreg),(reg));
1370 void x86_64_neg_reg(codegendata *cd, s8 reg) {
1371 x86_64_emit_rex(1,0,0,(reg));
1372 *(cd->mcodeptr++) = 0xf7;
1373 x86_64_emit_reg(3,(reg));
1377 void x86_64_negl_reg(codegendata *cd, s8 reg) {
1378 x86_64_emit_rex(0,0,0,(reg));
1379 *(cd->mcodeptr++) = 0xf7;
1380 x86_64_emit_reg(3,(reg));
1384 void x86_64_neg_membase(codegendata *cd, s8 basereg, s8 disp) {
1385 x86_64_emit_rex(1,0,0,(basereg));
1386 *(cd->mcodeptr++) = 0xf7;
1387 x86_64_emit_membase((basereg),(disp),3);
1391 void x86_64_negl_membase(codegendata *cd, s8 basereg, s8 disp) {
1392 x86_64_emit_rex(0,0,0,(basereg));
1393 *(cd->mcodeptr++) = 0xf7;
1394 x86_64_emit_membase((basereg),(disp),3);
1398 void x86_64_push_reg(codegendata *cd, s8 reg) {
1399 x86_64_emit_rex(0,0,0,(reg));
1400 *(cd->mcodeptr++) = 0x50 + (0x07 & (reg));
1404 void x86_64_push_imm(codegendata *cd, s8 imm) {
1405 *(cd->mcodeptr++) = 0x68;
1406 x86_64_emit_imm32((imm));
1410 void x86_64_pop_reg(codegendata *cd, s8 reg) {
1411 x86_64_emit_rex(0,0,0,(reg));
1412 *(cd->mcodeptr++) = 0x58 + (0x07 & (reg));
1416 void x86_64_xchg_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1417 x86_64_emit_rex(1,(reg),0,(dreg));
1418 *(cd->mcodeptr++) = 0x87;
1419 x86_64_emit_reg((reg),(dreg));
1423 void x86_64_nop(codegendata *cd) {
1424 *(cd->mcodeptr++) = 0x90;
1432 void x86_64_call_reg(codegendata *cd, s8 reg) {
1433 x86_64_emit_rex(1,0,0,(reg));
1434 *(cd->mcodeptr++) = 0xff;
1435 x86_64_emit_reg(2,(reg));
1439 void x86_64_call_imm(codegendata *cd, s8 imm) {
1440 *(cd->mcodeptr++) = 0xe8;
1441 x86_64_emit_imm32((imm));
1445 void x86_64_call_mem(codegendata *cd, s8 mem) {
1446 *(cd->mcodeptr++) = 0xff;
1447 x86_64_emit_mem(2,(mem));
1453 * floating point instructions (SSE2)
1455 void x86_64_addsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1456 *(cd->mcodeptr++) = 0xf2;
1457 x86_64_emit_rex(0,(dreg),0,(reg));
1458 *(cd->mcodeptr++) = 0x0f;
1459 *(cd->mcodeptr++) = 0x58;
1460 x86_64_emit_reg((dreg),(reg));
1464 void x86_64_addss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1465 *(cd->mcodeptr++) = 0xf3;
1466 x86_64_emit_rex(0,(dreg),0,(reg));
1467 *(cd->mcodeptr++) = 0x0f;
1468 *(cd->mcodeptr++) = 0x58;
1469 x86_64_emit_reg((dreg),(reg));
1473 void x86_64_cvtsi2ssq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1474 *(cd->mcodeptr++) = 0xf3;
1475 x86_64_emit_rex(1,(dreg),0,(reg));
1476 *(cd->mcodeptr++) = 0x0f;
1477 *(cd->mcodeptr++) = 0x2a;
1478 x86_64_emit_reg((dreg),(reg));
1482 void x86_64_cvtsi2ss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1483 *(cd->mcodeptr++) = 0xf3;
1484 x86_64_emit_rex(0,(dreg),0,(reg));
1485 *(cd->mcodeptr++) = 0x0f;
1486 *(cd->mcodeptr++) = 0x2a;
1487 x86_64_emit_reg((dreg),(reg));
1491 void x86_64_cvtsi2sdq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1492 *(cd->mcodeptr++) = 0xf2;
1493 x86_64_emit_rex(1,(dreg),0,(reg));
1494 *(cd->mcodeptr++) = 0x0f;
1495 *(cd->mcodeptr++) = 0x2a;
1496 x86_64_emit_reg((dreg),(reg));
1500 void x86_64_cvtsi2sd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1501 *(cd->mcodeptr++) = 0xf2;
1502 x86_64_emit_rex(0,(dreg),0,(reg));
1503 *(cd->mcodeptr++) = 0x0f;
1504 *(cd->mcodeptr++) = 0x2a;
1505 x86_64_emit_reg((dreg),(reg));
1509 void x86_64_cvtss2sd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1510 *(cd->mcodeptr++) = 0xf3;
1511 x86_64_emit_rex(0,(dreg),0,(reg));
1512 *(cd->mcodeptr++) = 0x0f;
1513 *(cd->mcodeptr++) = 0x5a;
1514 x86_64_emit_reg((dreg),(reg));
1518 void x86_64_cvtsd2ss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1519 *(cd->mcodeptr++) = 0xf2;
1520 x86_64_emit_rex(0,(dreg),0,(reg));
1521 *(cd->mcodeptr++) = 0x0f;
1522 *(cd->mcodeptr++) = 0x5a;
1523 x86_64_emit_reg((dreg),(reg));
1527 void x86_64_cvttss2siq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1528 *(cd->mcodeptr++) = 0xf3;
1529 x86_64_emit_rex(1,(dreg),0,(reg));
1530 *(cd->mcodeptr++) = 0x0f;
1531 *(cd->mcodeptr++) = 0x2c;
1532 x86_64_emit_reg((dreg),(reg));
1536 void x86_64_cvttss2si_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1537 *(cd->mcodeptr++) = 0xf3;
1538 x86_64_emit_rex(0,(dreg),0,(reg));
1539 *(cd->mcodeptr++) = 0x0f;
1540 *(cd->mcodeptr++) = 0x2c;
1541 x86_64_emit_reg((dreg),(reg));
1545 void x86_64_cvttsd2siq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1546 *(cd->mcodeptr++) = 0xf2;
1547 x86_64_emit_rex(1,(dreg),0,(reg));
1548 *(cd->mcodeptr++) = 0x0f;
1549 *(cd->mcodeptr++) = 0x2c;
1550 x86_64_emit_reg((dreg),(reg));
1554 void x86_64_cvttsd2si_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1555 *(cd->mcodeptr++) = 0xf2;
1556 x86_64_emit_rex(0,(dreg),0,(reg));
1557 *(cd->mcodeptr++) = 0x0f;
1558 *(cd->mcodeptr++) = 0x2c;
1559 x86_64_emit_reg((dreg),(reg));
1563 void x86_64_divss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1564 *(cd->mcodeptr++) = 0xf3;
1565 x86_64_emit_rex(0,(dreg),0,(reg));
1566 *(cd->mcodeptr++) = 0x0f;
1567 *(cd->mcodeptr++) = 0x5e;
1568 x86_64_emit_reg((dreg),(reg));
1572 void x86_64_divsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1573 *(cd->mcodeptr++) = 0xf2;
1574 x86_64_emit_rex(0,(dreg),0,(reg));
1575 *(cd->mcodeptr++) = 0x0f;
1576 *(cd->mcodeptr++) = 0x5e;
1577 x86_64_emit_reg((dreg),(reg));
1581 void x86_64_movd_reg_freg(codegendata *cd, s8 reg, s8 freg) {
1582 *(cd->mcodeptr++) = 0x66;
1583 x86_64_emit_rex(1,(freg),0,(reg));
1584 *(cd->mcodeptr++) = 0x0f;
1585 *(cd->mcodeptr++) = 0x6e;
1586 x86_64_emit_reg((freg),(reg));
1590 void x86_64_movd_freg_reg(codegendata *cd, s8 freg, s8 reg) {
1591 *(cd->mcodeptr++) = 0x66;
1592 x86_64_emit_rex(1,(freg),0,(reg));
1593 *(cd->mcodeptr++) = 0x0f;
1594 *(cd->mcodeptr++) = 0x7e;
1595 x86_64_emit_reg((freg),(reg));
1599 void x86_64_movd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
1600 *(cd->mcodeptr++) = 0x66;
1601 x86_64_emit_rex(0,(reg),0,(basereg));
1602 *(cd->mcodeptr++) = 0x0f;
1603 *(cd->mcodeptr++) = 0x7e;
1604 x86_64_emit_membase((basereg),(disp),(reg));
1608 void x86_64_movd_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
1609 *(cd->mcodeptr++) = 0x66;
1610 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
1611 *(cd->mcodeptr++) = 0x0f;
1612 *(cd->mcodeptr++) = 0x7e;
1613 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
1617 void x86_64_movd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1618 *(cd->mcodeptr++) = 0x66;
1619 x86_64_emit_rex(1,(dreg),0,(basereg));
1620 *(cd->mcodeptr++) = 0x0f;
1621 *(cd->mcodeptr++) = 0x6e;
1622 x86_64_emit_membase((basereg),(disp),(dreg));
1626 void x86_64_movdl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1627 *(cd->mcodeptr++) = 0x66;
1628 x86_64_emit_rex(0,(dreg),0,(basereg));
1629 *(cd->mcodeptr++) = 0x0f;
1630 *(cd->mcodeptr++) = 0x6e;
1631 x86_64_emit_membase((basereg),(disp),(dreg));
1635 void x86_64_movd_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg) {
1636 *(cd->mcodeptr++) = 0x66;
1637 x86_64_emit_rex(0,(dreg),(indexreg),(basereg));
1638 *(cd->mcodeptr++) = 0x0f;
1639 *(cd->mcodeptr++) = 0x6e;
1640 x86_64_emit_memindex((dreg),(disp),(basereg),(indexreg),(scale));
1644 void x86_64_movq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1645 *(cd->mcodeptr++) = 0xf3;
1646 x86_64_emit_rex(0,(dreg),0,(reg));
1647 *(cd->mcodeptr++) = 0x0f;
1648 *(cd->mcodeptr++) = 0x7e;
1649 x86_64_emit_reg((dreg),(reg));
1653 void x86_64_movq_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
1654 *(cd->mcodeptr++) = 0x66;
1655 x86_64_emit_rex(0,(reg),0,(basereg));
1656 *(cd->mcodeptr++) = 0x0f;
1657 *(cd->mcodeptr++) = 0xd6;
1658 x86_64_emit_membase((basereg),(disp),(reg));
1662 void x86_64_movq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1663 *(cd->mcodeptr++) = 0xf3;
1664 x86_64_emit_rex(0,(dreg),0,(basereg));
1665 *(cd->mcodeptr++) = 0x0f;
1666 *(cd->mcodeptr++) = 0x7e;
1667 x86_64_emit_membase((basereg),(disp),(dreg));
1671 void x86_64_movss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1672 *(cd->mcodeptr++) = 0xf3;
1673 x86_64_emit_rex(0,(reg),0,(dreg));
1674 *(cd->mcodeptr++) = 0x0f;
1675 *(cd->mcodeptr++) = 0x10;
1676 x86_64_emit_reg((reg),(dreg));
1680 void x86_64_movsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1681 *(cd->mcodeptr++) = 0xf2;
1682 x86_64_emit_rex(0,(reg),0,(dreg));
1683 *(cd->mcodeptr++) = 0x0f;
1684 *(cd->mcodeptr++) = 0x10;
1685 x86_64_emit_reg((reg),(dreg));
1689 void x86_64_movss_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
1690 *(cd->mcodeptr++) = 0xf3;
1691 x86_64_emit_rex(0,(reg),0,(basereg));
1692 *(cd->mcodeptr++) = 0x0f;
1693 *(cd->mcodeptr++) = 0x11;
1694 x86_64_emit_membase((basereg),(disp),(reg));
1698 void x86_64_movsd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
1699 *(cd->mcodeptr++) = 0xf2;
1700 x86_64_emit_rex(0,(reg),0,(basereg));
1701 *(cd->mcodeptr++) = 0x0f;
1702 *(cd->mcodeptr++) = 0x11;
1703 x86_64_emit_membase((basereg),(disp),(reg));
1707 void x86_64_movss_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1708 *(cd->mcodeptr++) = 0xf3;
1709 x86_64_emit_rex(0,(dreg),0,(basereg));
1710 *(cd->mcodeptr++) = 0x0f;
1711 *(cd->mcodeptr++) = 0x10;
1712 x86_64_emit_membase((basereg),(disp),(dreg));
1716 void x86_64_movlps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1717 x86_64_emit_rex(0,(dreg),0,(basereg));
1718 *(cd->mcodeptr++) = 0x0f;
1719 *(cd->mcodeptr++) = 0x12;
1720 x86_64_emit_membase((basereg),(disp),(dreg));
1724 void x86_64_movsd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1725 *(cd->mcodeptr++) = 0xf2;
1726 x86_64_emit_rex(0,(dreg),0,(basereg));
1727 *(cd->mcodeptr++) = 0x0f;
1728 *(cd->mcodeptr++) = 0x10;
1729 x86_64_emit_membase((basereg),(disp),(dreg));
1733 void x86_64_movlpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1734 *(cd->mcodeptr++) = 0x66;
1735 x86_64_emit_rex(0,(dreg),0,(basereg));
1736 *(cd->mcodeptr++) = 0x0f;
1737 *(cd->mcodeptr++) = 0x12;
1738 x86_64_emit_membase((basereg),(disp),(dreg));
1742 void x86_64_movss_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
1743 *(cd->mcodeptr++) = 0xf3;
1744 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
1745 *(cd->mcodeptr++) = 0x0f;
1746 *(cd->mcodeptr++) = 0x11;
1747 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
1751 void x86_64_movsd_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale) {
1752 *(cd->mcodeptr++) = 0xf2;
1753 x86_64_emit_rex(0,(reg),(indexreg),(basereg));
1754 *(cd->mcodeptr++) = 0x0f;
1755 *(cd->mcodeptr++) = 0x11;
1756 x86_64_emit_memindex((reg),(disp),(basereg),(indexreg),(scale));
1760 void x86_64_movss_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg) {
1761 *(cd->mcodeptr++) = 0xf3;
1762 x86_64_emit_rex(0,(dreg),(indexreg),(basereg));
1763 *(cd->mcodeptr++) = 0x0f;
1764 *(cd->mcodeptr++) = 0x10;
1765 x86_64_emit_memindex((dreg),(disp),(basereg),(indexreg),(scale));
1769 void x86_64_movsd_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg) {
1770 *(cd->mcodeptr++) = 0xf2;
1771 x86_64_emit_rex(0,(dreg),(indexreg),(basereg));
1772 *(cd->mcodeptr++) = 0x0f;
1773 *(cd->mcodeptr++) = 0x10;
1774 x86_64_emit_memindex((dreg),(disp),(basereg),(indexreg),(scale));
1778 void x86_64_mulss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1779 *(cd->mcodeptr++) = 0xf3;
1780 x86_64_emit_rex(0,(dreg),0,(reg));
1781 *(cd->mcodeptr++) = 0x0f;
1782 *(cd->mcodeptr++) = 0x59;
1783 x86_64_emit_reg((dreg),(reg));
1787 void x86_64_mulsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1788 *(cd->mcodeptr++) = 0xf2;
1789 x86_64_emit_rex(0,(dreg),0,(reg));
1790 *(cd->mcodeptr++) = 0x0f;
1791 *(cd->mcodeptr++) = 0x59;
1792 x86_64_emit_reg((dreg),(reg));
1796 void x86_64_subss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1797 *(cd->mcodeptr++) = 0xf3;
1798 x86_64_emit_rex(0,(dreg),0,(reg));
1799 *(cd->mcodeptr++) = 0x0f;
1800 *(cd->mcodeptr++) = 0x5c;
1801 x86_64_emit_reg((dreg),(reg));
1805 void x86_64_subsd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1806 *(cd->mcodeptr++) = 0xf2;
1807 x86_64_emit_rex(0,(dreg),0,(reg));
1808 *(cd->mcodeptr++) = 0x0f;
1809 *(cd->mcodeptr++) = 0x5c;
1810 x86_64_emit_reg((dreg),(reg));
1814 void x86_64_ucomiss_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1815 x86_64_emit_rex(0,(dreg),0,(reg));
1816 *(cd->mcodeptr++) = 0x0f;
1817 *(cd->mcodeptr++) = 0x2e;
1818 x86_64_emit_reg((dreg),(reg));
1822 void x86_64_ucomisd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1823 *(cd->mcodeptr++) = 0x66;
1824 x86_64_emit_rex(0,(dreg),0,(reg));
1825 *(cd->mcodeptr++) = 0x0f;
1826 *(cd->mcodeptr++) = 0x2e;
1827 x86_64_emit_reg((dreg),(reg));
1831 void x86_64_xorps_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1832 x86_64_emit_rex(0,(dreg),0,(reg));
1833 *(cd->mcodeptr++) = 0x0f;
1834 *(cd->mcodeptr++) = 0x57;
1835 x86_64_emit_reg((dreg),(reg));
1839 void x86_64_xorps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1840 x86_64_emit_rex(0,(dreg),0,(basereg));
1841 *(cd->mcodeptr++) = 0x0f;
1842 *(cd->mcodeptr++) = 0x57;
1843 x86_64_emit_membase((basereg),(disp),(dreg));
1847 void x86_64_xorpd_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
1848 *(cd->mcodeptr++) = 0x66;
1849 x86_64_emit_rex(0,(dreg),0,(reg));
1850 *(cd->mcodeptr++) = 0x0f;
1851 *(cd->mcodeptr++) = 0x57;
1852 x86_64_emit_reg((dreg),(reg));
1856 void x86_64_xorpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
1857 *(cd->mcodeptr++) = 0x66;
1858 x86_64_emit_rex(0,(dreg),0,(basereg));
1859 *(cd->mcodeptr++) = 0x0f;
1860 *(cd->mcodeptr++) = 0x57;
1861 x86_64_emit_membase((basereg),(disp),(dreg));
1866 * These are local overrides for various environment variables in Emacs.
1867 * Please do not remove this and leave it at the end of the file, where
1868 * Emacs will automagically detect them.
1869 * ---------------------------------------------------------------------
1872 * indent-tabs-mode: t