libFirm
gen_ia32_emitter.c
1 
9 #include "gen_ia32_emitter.h"
10 
11 #include "beemithlp.h"
12 #include "gen_ia32_new_nodes.h"
13 #include "ia32_emitter.h"
14 
15 static void emit_ia32_Adc(ir_node const *const node)
16 {
17  ia32_emitf(node, "adc%M %B");
18 }
19 
20 static void enc_ia32_Adc(ir_node const *const node)
21 {
22  (void)node; /* avoid potential warning */
23  ia32_enc_binop(node, 2);
24 }
25 
26 static void emit_ia32_Add(ir_node const *const node)
27 {
28  ia32_emitf(node, "add%M %B");
29 }
30 
31 static void enc_ia32_Add(ir_node const *const node)
32 {
33  (void)node; /* avoid potential warning */
34  ia32_enc_binop(node, 0);
35 }
36 
37 static void emit_ia32_AddMem(ir_node const *const node)
38 {
39  ia32_emitf(node, "add%M %S3, %AM");
40 }
41 
42 static void enc_ia32_AddMem(ir_node const *const node)
43 {
44  (void)node; /* avoid potential warning */
45  ia32_enc_binop_mem(node, 0);
46 }
47 
48 static void emit_ia32_AddSP(ir_node const *const node)
49 {
50  ia32_emitf(node, "addl %B");
51 }
52 
53 static void emit_ia32_Adds(ir_node const *const node)
54 {
55  ia32_emitf(node, "adds%FX %B");
56 }
57 
58 static void emit_ia32_And(ir_node const *const node)
59 {
60  ia32_emitf(node, "and%M %B");
61 }
62 
63 static void enc_ia32_And(ir_node const *const node)
64 {
65  (void)node; /* avoid potential warning */
66  ia32_enc_binop(node, 4);
67 }
68 
69 static void emit_ia32_AndMem(ir_node const *const node)
70 {
71  ia32_emitf(node, "and%M %S3, %AM");
72 }
73 
74 static void enc_ia32_AndMem(ir_node const *const node)
75 {
76  (void)node; /* avoid potential warning */
77  ia32_enc_binop_mem(node, 4);
78 }
79 
80 static void emit_ia32_Andnp(ir_node const *const node)
81 {
82  ia32_emitf(node, "andnp%FX %B");
83 }
84 
85 static void emit_ia32_Andp(ir_node const *const node)
86 {
87  ia32_emitf(node, "andp%FX %B");
88 }
89 
90 static void emit_ia32_Breakpoint(ir_node const *const node)
91 {
92  ia32_emitf(node, "int3");
93 }
94 
95 static void enc_ia32_Breakpoint(ir_node const *const node)
96 {
97  (void)node; /* avoid potential warning */
98  ia32_enc_simple(0xCC);
99 }
100 
101 static void emit_ia32_Bsf(ir_node const *const node)
102 {
103  ia32_emitf(node, "bsf%M %AS3, %D0");
104 }
105 
106 static void enc_ia32_Bsf(ir_node const *const node)
107 {
108  (void)node; /* avoid potential warning */
109  ia32_enc_0f_unop_reg(node, 0xBC, n_ia32_Bsf_operand);
110 }
111 
112 static void emit_ia32_Bsr(ir_node const *const node)
113 {
114  ia32_emitf(node, "bsr%M %AS3, %D0");
115 }
116 
117 static void enc_ia32_Bsr(ir_node const *const node)
118 {
119  (void)node; /* avoid potential warning */
120  ia32_enc_0f_unop_reg(node, 0xBD, n_ia32_Bsr_operand);
121 }
122 
123 static void emit_ia32_Bswap(ir_node const *const node)
124 {
125  ia32_emitf(node, "bswap%M %D0");
126 }
127 
128 static void emit_ia32_Bswap16(ir_node const *const node)
129 {
130  ia32_emitf(node, "xchg %<D0, %>D0");
131 }
132 
133 static void emit_ia32_Bt(ir_node const *const node)
134 {
135  ia32_emitf(node, "bt%M %S1, %S0");
136 }
137 
138 static void emit_ia32_CMovcc(ir_node const *const node)
139 {
140  ia32_emitf(node, "cmov%P5 %B");
141 }
142 
143 static void emit_ia32_Call(ir_node const *const node)
144 {
145  ia32_emitf(node, "call %*AS3");
146 }
147 
148 static void emit_ia32_Cltd(ir_node const *const node)
149 {
150  ia32_emitf(node, "cltd");
151 }
152 
153 static void enc_ia32_Cltd(ir_node const *const node)
154 {
155  (void)node; /* avoid potential warning */
156  ia32_enc_simple(0x99);
157 }
158 
159 static void emit_ia32_Cmc(ir_node const *const node)
160 {
161  ia32_emitf(node, "cmc");
162 }
163 
164 static void enc_ia32_Cmc(ir_node const *const node)
165 {
166  (void)node; /* avoid potential warning */
167  ia32_enc_simple(0xF5);
168 }
169 
170 static void emit_ia32_Cmp(ir_node const *const node)
171 {
172  ia32_emitf(node, "cmp%M %B");
173 }
174 
175 static void enc_ia32_Cmp(ir_node const *const node)
176 {
177  (void)node; /* avoid potential warning */
178  ia32_enc_binop(node, 7);
179 }
180 
181 static void emit_ia32_CmpXChgMem(ir_node const *const node)
182 {
183  ia32_emitf(node, "lock cmpxchg%M %S4, %AM");
184 }
185 
186 static void emit_ia32_Const(ir_node const *const node)
187 {
188  ia32_emitf(node, "movl %I, %D0");
189 }
190 
191 static void emit_ia32_Conv_I2I(ir_node const *const node)
192 {
193  ia32_emitf(node, "mov%#Ml %AS3, %#D0");
194 }
195 
196 static void emit_ia32_CopyEbpEsp(ir_node const *const node)
197 {
198  ia32_emitf(node, "movl %S0, %D0");
199 }
200 
201 static void emit_ia32_CvtSI2SD(ir_node const *const node)
202 {
203  ia32_emitf(node, "cvtsi2sd %AS3, %D0");
204 }
205 
206 static void emit_ia32_CvtSI2SS(ir_node const *const node)
207 {
208  ia32_emitf(node, "cvtsi2ss %AS3, %D0");
209 }
210 
211 static void emit_ia32_Cwtl(ir_node const *const node)
212 {
213  ia32_emitf(node, "cwtl");
214 }
215 
216 static void enc_ia32_Cwtl(ir_node const *const node)
217 {
218  (void)node; /* avoid potential warning */
219  ia32_enc_simple(0x98);
220 }
221 
222 static void emit_ia32_Dec(ir_node const *const node)
223 {
224  ia32_emitf(node, "dec%M %D0");
225 }
226 
227 static void emit_ia32_DecMem(ir_node const *const node)
228 {
229  ia32_emitf(node, "dec%M %AM");
230 }
231 
232 static void enc_ia32_DecMem(ir_node const *const node)
233 {
234  (void)node; /* avoid potential warning */
235  ia32_enc_unop_mem(node, 0xFE, 1);
236 }
237 
238 static void emit_ia32_Div(ir_node const *const node)
239 {
240  ia32_emitf(node, "div%M %AS3");
241 }
242 
243 static void enc_ia32_Div(ir_node const *const node)
244 {
245  (void)node; /* avoid potential warning */
246  ia32_enc_unop(node, 0xF7, 6, n_ia32_Div_divisor);
247 }
248 
249 static void emit_ia32_Divs(ir_node const *const node)
250 {
251  ia32_emitf(node, "divs%FX %B");
252 }
253 
254 static void emit_ia32_Enter(ir_node const *const node)
255 {
256  ia32_emitf(node, "enter");
257 }
258 
259 static void emit_ia32_FldCW(ir_node const *const node)
260 {
261  ia32_emitf(node, "fldcw %AM");
262 }
263 
264 static void emit_ia32_FnstCW(ir_node const *const node)
265 {
266  ia32_emitf(node, "fnstcw %AM");
267 }
268 
269 static void emit_ia32_FtstFnstsw(ir_node const *const node)
270 {
271  ia32_emitf(node, "ftst\nfnstsw %%ax");
272 }
273 
274 static void emit_ia32_FucomFnstsw(ir_node const *const node)
275 {
276  ia32_emitf(node, "fucom%FP %F0\nfnstsw %%ax");
277 }
278 
279 static void emit_ia32_Fucomi(ir_node const *const node)
280 {
281  ia32_emitf(node, "fucom%FPi %F0");
282 }
283 
284 static void emit_ia32_FucomppFnstsw(ir_node const *const node)
285 {
286  ia32_emitf(node, "fucompp\nfnstsw %%ax");
287 }
288 
289 static void emit_ia32_IDiv(ir_node const *const node)
290 {
291  ia32_emitf(node, "idiv%M %AS3");
292 }
293 
294 static void enc_ia32_IDiv(ir_node const *const node)
295 {
296  (void)node; /* avoid potential warning */
297  ia32_enc_unop(node, 0xF7, 7, n_ia32_IDiv_divisor);
298 }
299 
300 static void emit_ia32_IJmp(ir_node const *const node)
301 {
302  ia32_emitf(node, "jmp %*AS3");
303 }
304 
305 static void enc_ia32_IJmp(ir_node const *const node)
306 {
307  (void)node; /* avoid potential warning */
308  ia32_enc_unop(node, 0xFF, 4, n_ia32_IJmp_target);
309 }
310 
311 static void emit_ia32_IMul(ir_node const *const node)
312 {
313  ia32_emitf(node, "imul%M %B");
314 }
315 
316 static void enc_ia32_IMul(ir_node const *const node)
317 {
318  (void)node; /* avoid potential warning */
319  ia32_enc_0f_unop_reg(node, 0xAF, n_ia32_IMul_right);
320 }
321 
322 static void emit_ia32_IMul1OP(ir_node const *const node)
323 {
324  ia32_emitf(node, "imul%M %AS4");
325 }
326 
327 static void enc_ia32_IMul1OP(ir_node const *const node)
328 {
329  (void)node; /* avoid potential warning */
330  ia32_enc_unop(node, 0xF7, 5, n_ia32_IMul1OP_right);
331 }
332 
333 static void emit_ia32_IMulImm(ir_node const *const node)
334 {
335  ia32_emitf(node, "imul%M %S4, %AS3, %D0");
336 }
337 
338 static void emit_ia32_Inc(ir_node const *const node)
339 {
340  ia32_emitf(node, "inc%M %D0");
341 }
342 
343 static void emit_ia32_IncMem(ir_node const *const node)
344 {
345  ia32_emitf(node, "inc%M %AM");
346 }
347 
348 static void enc_ia32_IncMem(ir_node const *const node)
349 {
350  (void)node; /* avoid potential warning */
351  ia32_enc_unop_mem(node, 0xFE, 0);
352 }
353 
354 static void emit_ia32_Inport(ir_node const *const node)
355 {
356  ia32_emitf(node, "in%M %^S0, %D0");
357 }
358 
359 static void emit_ia32_LdTls(ir_node const *const node)
360 {
361  ia32_emitf(node, "movl %%gs:0, %D0");
362 }
363 
364 static void emit_ia32_Lea(ir_node const *const node)
365 {
366  ia32_emitf(node, "leal %AM, %D0");
367 }
368 
369 static void emit_ia32_Leave(ir_node const *const node)
370 {
371  ia32_emitf(node, "leave");
372 }
373 
374 static void enc_ia32_Leave(ir_node const *const node)
375 {
376  (void)node; /* avoid potential warning */
377  ia32_enc_simple(0xC9);
378 }
379 
380 static void emit_ia32_Load(ir_node const *const node)
381 {
382  ia32_emitf(node, "mov%#Ml %AM, %#D0");
383 }
384 
385 static void emit_ia32_Maxs(ir_node const *const node)
386 {
387  ia32_emitf(node, "maxs%FX %B");
388 }
389 
390 static void emit_ia32_Mins(ir_node const *const node)
391 {
392  ia32_emitf(node, "mins%FX %B");
393 }
394 
395 static void emit_ia32_Movd(ir_node const *const node)
396 {
397  ia32_emitf(node, "movd %S0, %D0");
398 }
399 
400 static void emit_ia32_Mul(ir_node const *const node)
401 {
402  ia32_emitf(node, "mul%M %AS4");
403 }
404 
405 static void enc_ia32_Mul(ir_node const *const node)
406 {
407  (void)node; /* avoid potential warning */
408  ia32_enc_unop(node, 0xF7, 4, n_ia32_Mul_right);
409 }
410 
411 static void emit_ia32_Muls(ir_node const *const node)
412 {
413  ia32_emitf(node, "muls%FX %B");
414 }
415 
416 static void emit_ia32_Neg(ir_node const *const node)
417 {
418  ia32_emitf(node, "neg%M %D0");
419 }
420 
421 static void enc_ia32_Neg(ir_node const *const node)
422 {
423  (void)node; /* avoid potential warning */
424  ia32_enc_unop(node, 0xF7, 3, n_ia32_Neg_val);
425 }
426 
427 static void emit_ia32_NegMem(ir_node const *const node)
428 {
429  ia32_emitf(node, "neg%M %AM");
430 }
431 
432 static void enc_ia32_NegMem(ir_node const *const node)
433 {
434  (void)node; /* avoid potential warning */
435  ia32_enc_unop_mem(node, 0xF6, 3);
436 }
437 
438 static void emit_ia32_Not(ir_node const *const node)
439 {
440  ia32_emitf(node, "not%M %D0");
441 }
442 
443 static void enc_ia32_Not(ir_node const *const node)
444 {
445  (void)node; /* avoid potential warning */
446  ia32_enc_unop(node, 0xF7, 2, n_ia32_Not_val);
447 }
448 
449 static void emit_ia32_NotMem(ir_node const *const node)
450 {
451  ia32_emitf(node, "not%M %AM");
452 }
453 
454 static void enc_ia32_NotMem(ir_node const *const node)
455 {
456  (void)node; /* avoid potential warning */
457  ia32_enc_unop_mem(node, 0xF6, 2);
458 }
459 
460 static void emit_ia32_Or(ir_node const *const node)
461 {
462  ia32_emitf(node, "or%M %B");
463 }
464 
465 static void enc_ia32_Or(ir_node const *const node)
466 {
467  (void)node; /* avoid potential warning */
468  ia32_enc_binop(node, 1);
469 }
470 
471 static void emit_ia32_OrMem(ir_node const *const node)
472 {
473  ia32_emitf(node, "or%M %S3, %AM");
474 }
475 
476 static void enc_ia32_OrMem(ir_node const *const node)
477 {
478  (void)node; /* avoid potential warning */
479  ia32_enc_binop_mem(node, 1);
480 }
481 
482 static void emit_ia32_Orp(ir_node const *const node)
483 {
484  ia32_emitf(node, "orp%FX %B");
485 }
486 
487 static void emit_ia32_Outport(ir_node const *const node)
488 {
489  ia32_emitf(node, "out%M %S1, %^S0");
490 }
491 
492 static void emit_ia32_Pop(ir_node const *const node)
493 {
494  ia32_emitf(node, "pop%M %D0");
495 }
496 
497 static void emit_ia32_PopMem(ir_node const *const node)
498 {
499  ia32_emitf(node, "pop%M %AM");
500 }
501 
502 static void emit_ia32_Popcnt(ir_node const *const node)
503 {
504  ia32_emitf(node, "popcnt%M %AS3, %D0");
505 }
506 
507 static void emit_ia32_Prefetch(ir_node const *const node)
508 {
509  ia32_emitf(node, "prefetch %AM");
510 }
511 
512 static void emit_ia32_PrefetchNTA(ir_node const *const node)
513 {
514  ia32_emitf(node, "prefetchnta %AM");
515 }
516 
517 static void emit_ia32_PrefetchT0(ir_node const *const node)
518 {
519  ia32_emitf(node, "prefetcht0 %AM");
520 }
521 
522 static void emit_ia32_PrefetchT1(ir_node const *const node)
523 {
524  ia32_emitf(node, "prefetcht1 %AM");
525 }
526 
527 static void emit_ia32_PrefetchT2(ir_node const *const node)
528 {
529  ia32_emitf(node, "prefetcht2 %AM");
530 }
531 
532 static void emit_ia32_PrefetchW(ir_node const *const node)
533 {
534  ia32_emitf(node, "prefetchw %AM");
535 }
536 
537 static void emit_ia32_Pslld(ir_node const *const node)
538 {
539  ia32_emitf(node, "pslld %S1, %D0");
540 }
541 
542 static void emit_ia32_Psllq(ir_node const *const node)
543 {
544  ia32_emitf(node, "psllq %S1, %D0");
545 }
546 
547 static void emit_ia32_Psrld(ir_node const *const node)
548 {
549  ia32_emitf(node, "psrld %S1, %D0");
550 }
551 
552 static void emit_ia32_Push(ir_node const *const node)
553 {
554  ia32_emitf(node, "push%M %AS3");
555 }
556 
557 static void emit_ia32_PushEax(ir_node const *const node)
558 {
559  ia32_emitf(node, "pushl %%eax");
560 }
561 
562 static void emit_ia32_Rol(ir_node const *const node)
563 {
564  ia32_emitf(node, "rol%M %<,S1 %D0");
565 }
566 
567 static void enc_ia32_Rol(ir_node const *const node)
568 {
569  (void)node; /* avoid potential warning */
570  ia32_enc_shiftop(node, 0);
571 }
572 
573 static void emit_ia32_RolMem(ir_node const *const node)
574 {
575  ia32_emitf(node, "rol%M %<,S3 %AM");
576 }
577 
578 static void enc_ia32_RolMem(ir_node const *const node)
579 {
580  (void)node; /* avoid potential warning */
581  ia32_enc_shiftop_mem(node, 0);
582 }
583 
584 static void emit_ia32_Ror(ir_node const *const node)
585 {
586  ia32_emitf(node, "ror%M %<,S1 %D0");
587 }
588 
589 static void enc_ia32_Ror(ir_node const *const node)
590 {
591  (void)node; /* avoid potential warning */
592  ia32_enc_shiftop(node, 1);
593 }
594 
595 static void emit_ia32_RorMem(ir_node const *const node)
596 {
597  ia32_emitf(node, "ror%M %<,S3 %AM");
598 }
599 
600 static void enc_ia32_RorMem(ir_node const *const node)
601 {
602  (void)node; /* avoid potential warning */
603  ia32_enc_shiftop_mem(node, 1);
604 }
605 
606 static void emit_ia32_Sahf(ir_node const *const node)
607 {
608  ia32_emitf(node, "sahf");
609 }
610 
611 static void enc_ia32_Sahf(ir_node const *const node)
612 {
613  (void)node; /* avoid potential warning */
614  ia32_enc_simple(0x9E);
615 }
616 
617 static void emit_ia32_Sar(ir_node const *const node)
618 {
619  ia32_emitf(node, "sar%M %<,S1 %D0");
620 }
621 
622 static void enc_ia32_Sar(ir_node const *const node)
623 {
624  (void)node; /* avoid potential warning */
625  ia32_enc_shiftop(node, 7);
626 }
627 
628 static void emit_ia32_SarMem(ir_node const *const node)
629 {
630  ia32_emitf(node, "sar%M %<,S3 %AM");
631 }
632 
633 static void enc_ia32_SarMem(ir_node const *const node)
634 {
635  (void)node; /* avoid potential warning */
636  ia32_enc_shiftop_mem(node, 7);
637 }
638 
639 static void emit_ia32_Sbb(ir_node const *const node)
640 {
641  ia32_emitf(node, "sbb%M %B");
642 }
643 
644 static void enc_ia32_Sbb(ir_node const *const node)
645 {
646  (void)node; /* avoid potential warning */
647  ia32_enc_binop(node, 3);
648 }
649 
650 static void emit_ia32_Sbb0(ir_node const *const node)
651 {
652  ia32_emitf(node, "sbb%M %D0, %D0");
653 }
654 
655 static void emit_ia32_SetccMem(ir_node const *const node)
656 {
657  ia32_emitf(node, "set%P3 %AM");
658 }
659 
660 static void emit_ia32_Shl(ir_node const *const node)
661 {
662  ia32_emitf(node, "shl%M %<,S1 %D0");
663 }
664 
665 static void enc_ia32_Shl(ir_node const *const node)
666 {
667  (void)node; /* avoid potential warning */
668  ia32_enc_shiftop(node, 4);
669 }
670 
671 static void emit_ia32_ShlD(ir_node const *const node)
672 {
673  ia32_emitf(node, "shld%M %<S2, %S1, %D0");
674 }
675 
676 static void emit_ia32_ShlMem(ir_node const *const node)
677 {
678  ia32_emitf(node, "shl%M %<,S3 %AM");
679 }
680 
681 static void enc_ia32_ShlMem(ir_node const *const node)
682 {
683  (void)node; /* avoid potential warning */
684  ia32_enc_shiftop_mem(node, 4);
685 }
686 
687 static void emit_ia32_Shr(ir_node const *const node)
688 {
689  ia32_emitf(node, "shr%M %<,S1 %D0");
690 }
691 
692 static void enc_ia32_Shr(ir_node const *const node)
693 {
694  (void)node; /* avoid potential warning */
695  ia32_enc_shiftop(node, 5);
696 }
697 
698 static void emit_ia32_ShrD(ir_node const *const node)
699 {
700  ia32_emitf(node, "shrd%M %<S2, %S1, %D0");
701 }
702 
703 static void emit_ia32_ShrMem(ir_node const *const node)
704 {
705  ia32_emitf(node, "shr%M %<,S3 %AM");
706 }
707 
708 static void enc_ia32_ShrMem(ir_node const *const node)
709 {
710  (void)node; /* avoid potential warning */
711  ia32_enc_shiftop_mem(node, 5);
712 }
713 
714 static void emit_ia32_Stc(ir_node const *const node)
715 {
716  ia32_emitf(node, "stc");
717 }
718 
719 static void enc_ia32_Stc(ir_node const *const node)
720 {
721  (void)node; /* avoid potential warning */
722  ia32_enc_simple(0xF9);
723 }
724 
725 static void emit_ia32_Store(ir_node const *const node)
726 {
727  ia32_emitf(node, "mov%M %S3, %AM");
728 }
729 
730 static void emit_ia32_Sub(ir_node const *const node)
731 {
732  ia32_emitf(node, "sub%M %B");
733 }
734 
735 static void enc_ia32_Sub(ir_node const *const node)
736 {
737  (void)node; /* avoid potential warning */
738  ia32_enc_binop(node, 5);
739 }
740 
741 static void emit_ia32_SubMem(ir_node const *const node)
742 {
743  ia32_emitf(node, "sub%M %S3, %AM");
744 }
745 
746 static void enc_ia32_SubMem(ir_node const *const node)
747 {
748  (void)node; /* avoid potential warning */
749  ia32_enc_binop_mem(node, 5);
750 }
751 
752 static void emit_ia32_SubSP(ir_node const *const node)
753 {
754  ia32_emitf(node, "subl %B\nmovl %%esp, %D1");
755 }
756 
757 static void emit_ia32_Subs(ir_node const *const node)
758 {
759  ia32_emitf(node, "subs%FX %B");
760 }
761 
762 static void emit_ia32_Test(ir_node const *const node)
763 {
764  ia32_emitf(node, "test%M %B");
765 }
766 
767 static void emit_ia32_UD2(ir_node const *const node)
768 {
769  ia32_emitf(node, "ud2");
770 }
771 
772 static void emit_ia32_Ucomis(ir_node const *const node)
773 {
774  ia32_emitf(node, "ucomis%FX %B");
775 }
776 
777 static void emit_ia32_Xor(ir_node const *const node)
778 {
779  ia32_emitf(node, "xor%M %B");
780 }
781 
782 static void enc_ia32_Xor(ir_node const *const node)
783 {
784  (void)node; /* avoid potential warning */
785  ia32_enc_binop(node, 6);
786 }
787 
788 static void emit_ia32_Xor0(ir_node const *const node)
789 {
790  ia32_emitf(node, "xor%M %D0, %D0");
791 }
792 
793 static void emit_ia32_XorHighLow(ir_node const *const node)
794 {
795  ia32_emitf(node, "xorb %>D0, %<D0");
796 }
797 
798 static void emit_ia32_XorMem(ir_node const *const node)
799 {
800  ia32_emitf(node, "xor%M %S3, %AM");
801 }
802 
803 static void enc_ia32_XorMem(ir_node const *const node)
804 {
805  (void)node; /* avoid potential warning */
806  ia32_enc_binop_mem(node, 6);
807 }
808 
809 static void emit_ia32_Xorp(ir_node const *const node)
810 {
811  ia32_emitf(node, "xorp%FX %B");
812 }
813 
814 static void emit_ia32_emms(ir_node const *const node)
815 {
816  ia32_emitf(node, "emms");
817 }
818 
819 static void emit_ia32_fabs(ir_node const *const node)
820 {
821  ia32_emitf(node, "fabs");
822 }
823 
824 static void enc_ia32_fabs(ir_node const *const node)
825 {
826  (void)node; /* avoid potential warning */
827  ia32_enc_fsimple(0xE1);
828 }
829 
830 static void emit_ia32_fadd(ir_node const *const node)
831 {
832  ia32_emitf(node, "fadd%FP%FM %AF");
833 }
834 
835 static void enc_ia32_fadd(ir_node const *const node)
836 {
837  (void)node; /* avoid potential warning */
838  ia32_enc_fbinop(node, 0, 0);
839 }
840 
841 static void emit_ia32_fchs(ir_node const *const node)
842 {
843  ia32_emitf(node, "fchs");
844 }
845 
846 static void enc_ia32_fchs(ir_node const *const node)
847 {
848  (void)node; /* avoid potential warning */
849  ia32_enc_fsimple(0xE0);
850 }
851 
852 static void emit_ia32_fdiv(ir_node const *const node)
853 {
854  ia32_emitf(node, "fdiv%FR%FP%FM %AF");
855 }
856 
857 static void enc_ia32_fdiv(ir_node const *const node)
858 {
859  (void)node; /* avoid potential warning */
860  ia32_enc_fbinop(node, 6, 7);
861 }
862 
863 static void emit_ia32_fdup(ir_node const *const node)
864 {
865  ia32_emitf(node, "fld %F0");
866 }
867 
868 static void enc_ia32_fdup(ir_node const *const node)
869 {
870  (void)node; /* avoid potential warning */
871  ia32_enc_fop_reg(node, 0xD9, 0xC0);
872 }
873 
874 static void emit_ia32_femms(ir_node const *const node)
875 {
876  ia32_emitf(node, "femms");
877 }
878 
879 static void emit_ia32_ffreep(ir_node const *const node)
880 {
881  ia32_emitf(node, "ffreep %F0");
882 }
883 
884 static void enc_ia32_ffreep(ir_node const *const node)
885 {
886  (void)node; /* avoid potential warning */
887  ia32_enc_fop_reg(node, 0xDF, 0xC0);
888 }
889 
890 static void emit_ia32_fild(ir_node const *const node)
891 {
892  ia32_emitf(node, "fild%FI %AM");
893 }
894 
895 static void emit_ia32_fist(ir_node const *const node)
896 {
897  ia32_emitf(node, "fist%FP%FI %AM");
898 }
899 
900 static void emit_ia32_fistp(ir_node const *const node)
901 {
902  ia32_emitf(node, "fistp%FI %AM");
903 }
904 
905 static void emit_ia32_fisttp(ir_node const *const node)
906 {
907  ia32_emitf(node, "fisttp%FI %AM");
908 }
909 
910 static void emit_ia32_fld(ir_node const *const node)
911 {
912  ia32_emitf(node, "fld%FM %AM");
913 }
914 
915 static void emit_ia32_fld1(ir_node const *const node)
916 {
917  ia32_emitf(node, "fld1");
918 }
919 
920 static void enc_ia32_fld1(ir_node const *const node)
921 {
922  (void)node; /* avoid potential warning */
923  ia32_enc_fsimple(0xE8);
924 }
925 
926 static void emit_ia32_fldl2e(ir_node const *const node)
927 {
928  ia32_emitf(node, "fldl2e");
929 }
930 
931 static void emit_ia32_fldl2t(ir_node const *const node)
932 {
933  ia32_emitf(node, "fldl2t");
934 }
935 
936 static void emit_ia32_fldlg2(ir_node const *const node)
937 {
938  ia32_emitf(node, "fldlg2");
939 }
940 
941 static void emit_ia32_fldln2(ir_node const *const node)
942 {
943  ia32_emitf(node, "fldln2");
944 }
945 
946 static void emit_ia32_fldpi(ir_node const *const node)
947 {
948  ia32_emitf(node, "fldpi");
949 }
950 
951 static void emit_ia32_fldz(ir_node const *const node)
952 {
953  ia32_emitf(node, "fldz");
954 }
955 
956 static void enc_ia32_fldz(ir_node const *const node)
957 {
958  (void)node; /* avoid potential warning */
959  ia32_enc_fsimple(0xEE);
960 }
961 
962 static void emit_ia32_fmul(ir_node const *const node)
963 {
964  ia32_emitf(node, "fmul%FP%FM %AF");
965 }
966 
967 static void enc_ia32_fmul(ir_node const *const node)
968 {
969  (void)node; /* avoid potential warning */
970  ia32_enc_fbinop(node, 1, 1);
971 }
972 
973 static void emit_ia32_fpop(ir_node const *const node)
974 {
975  ia32_emitf(node, "fstp %F0");
976 }
977 
978 static void enc_ia32_fpop(ir_node const *const node)
979 {
980  (void)node; /* avoid potential warning */
981  ia32_enc_fop_reg(node, 0xDD, 0xD8);
982 }
983 
984 static void emit_ia32_fst(ir_node const *const node)
985 {
986  ia32_emitf(node, "fst%FP%FM %AM");
987 }
988 
989 static void emit_ia32_fstp(ir_node const *const node)
990 {
991  ia32_emitf(node, "fstp%FM %AM");
992 }
993 
994 static void emit_ia32_fsub(ir_node const *const node)
995 {
996  ia32_emitf(node, "fsub%FR%FP%FM %AF");
997 }
998 
999 static void enc_ia32_fsub(ir_node const *const node)
1000 {
1001  (void)node; /* avoid potential warning */
1002  ia32_enc_fbinop(node, 4, 5);
1003 }
1004 
1005 static void emit_ia32_fxch(ir_node const *const node)
1006 {
1007  ia32_emitf(node, "fxch %F0");
1008 }
1009 
1010 static void enc_ia32_fxch(ir_node const *const node)
1011 {
1012  (void)node; /* avoid potential warning */
1013  ia32_enc_fop_reg(node, 0xD9, 0xC8);
1014 }
1015 
1016 static void emit_ia32_xAllOnes(ir_node const *const node)
1017 {
1018  ia32_emitf(node, "pcmpeqb %D0, %D0");
1019 }
1020 
1021 static void emit_ia32_xLoad(ir_node const *const node)
1022 {
1023  ia32_emitf(node, "movs%FX %AM, %D0");
1024 }
1025 
1026 static void emit_ia32_xPzero(ir_node const *const node)
1027 {
1028  ia32_emitf(node, "pxor %D0, %D0");
1029 }
1030 
1031 static void emit_ia32_xStore(ir_node const *const node)
1032 {
1033  ia32_emitf(node, "movs%FX %S3, %AM");
1034 }
1035 
1036 static void emit_ia32_xZero(ir_node const *const node)
1037 {
1038  ia32_emitf(node, "xorp%FX %D0, %D0");
1039 }
1040 
1041 static void emit_ia32_xxLoad(ir_node const *const node)
1042 {
1043  ia32_emitf(node, "movdqu %D0, %AM");
1044 }
1045 
1046 static void emit_ia32_xxStore(ir_node const *const node)
1047 {
1048  ia32_emitf(node, "movdqu %S3, %AM");
1049 }
1050 
1051 
1052 
1053 void ia32_register_spec_emitters(void)
1054 {
1055  be_set_emitter(op_ia32_Adc, emit_ia32_Adc);
1056  be_set_emitter(op_ia32_Add, emit_ia32_Add);
1057  be_set_emitter(op_ia32_AddMem, emit_ia32_AddMem);
1058  be_set_emitter(op_ia32_AddSP, emit_ia32_AddSP);
1059  be_set_emitter(op_ia32_Adds, emit_ia32_Adds);
1060  be_set_emitter(op_ia32_And, emit_ia32_And);
1061  be_set_emitter(op_ia32_AndMem, emit_ia32_AndMem);
1062  be_set_emitter(op_ia32_Andnp, emit_ia32_Andnp);
1063  be_set_emitter(op_ia32_Andp, emit_ia32_Andp);
1064  be_set_emitter(op_ia32_Breakpoint, emit_ia32_Breakpoint);
1065  be_set_emitter(op_ia32_Bsf, emit_ia32_Bsf);
1066  be_set_emitter(op_ia32_Bsr, emit_ia32_Bsr);
1067  be_set_emitter(op_ia32_Bswap, emit_ia32_Bswap);
1068  be_set_emitter(op_ia32_Bswap16, emit_ia32_Bswap16);
1069  be_set_emitter(op_ia32_Bt, emit_ia32_Bt);
1070  be_set_emitter(op_ia32_CMovcc, emit_ia32_CMovcc);
1071  be_set_emitter(op_ia32_Call, emit_ia32_Call);
1072  be_set_emitter(op_ia32_Cltd, emit_ia32_Cltd);
1073  be_set_emitter(op_ia32_Cmc, emit_ia32_Cmc);
1074  be_set_emitter(op_ia32_Cmp, emit_ia32_Cmp);
1075  be_set_emitter(op_ia32_CmpXChgMem, emit_ia32_CmpXChgMem);
1076  be_set_emitter(op_ia32_Const, emit_ia32_Const);
1077  be_set_emitter(op_ia32_Conv_I2I, emit_ia32_Conv_I2I);
1078  be_set_emitter(op_ia32_CopyEbpEsp, emit_ia32_CopyEbpEsp);
1079  be_set_emitter(op_ia32_CvtSI2SD, emit_ia32_CvtSI2SD);
1080  be_set_emitter(op_ia32_CvtSI2SS, emit_ia32_CvtSI2SS);
1081  be_set_emitter(op_ia32_Cwtl, emit_ia32_Cwtl);
1082  be_set_emitter(op_ia32_Dec, emit_ia32_Dec);
1083  be_set_emitter(op_ia32_DecMem, emit_ia32_DecMem);
1084  be_set_emitter(op_ia32_Div, emit_ia32_Div);
1085  be_set_emitter(op_ia32_Divs, emit_ia32_Divs);
1086  be_set_emitter(op_ia32_Enter, emit_ia32_Enter);
1087  be_set_emitter(op_ia32_FldCW, emit_ia32_FldCW);
1088  be_set_emitter(op_ia32_FnstCW, emit_ia32_FnstCW);
1089  be_set_emitter(op_ia32_FnstCWNOP, be_emit_nothing);
1090  be_set_emitter(op_ia32_FtstFnstsw, emit_ia32_FtstFnstsw);
1091  be_set_emitter(op_ia32_FucomFnstsw, emit_ia32_FucomFnstsw);
1092  be_set_emitter(op_ia32_Fucomi, emit_ia32_Fucomi);
1093  be_set_emitter(op_ia32_FucomppFnstsw, emit_ia32_FucomppFnstsw);
1094  be_set_emitter(op_ia32_IDiv, emit_ia32_IDiv);
1095  be_set_emitter(op_ia32_IJmp, emit_ia32_IJmp);
1096  be_set_emitter(op_ia32_IMul, emit_ia32_IMul);
1097  be_set_emitter(op_ia32_IMul1OP, emit_ia32_IMul1OP);
1098  be_set_emitter(op_ia32_IMulImm, emit_ia32_IMulImm);
1099  be_set_emitter(op_ia32_Inc, emit_ia32_Inc);
1100  be_set_emitter(op_ia32_IncMem, emit_ia32_IncMem);
1101  be_set_emitter(op_ia32_Inport, emit_ia32_Inport);
1102  be_set_emitter(op_ia32_LdTls, emit_ia32_LdTls);
1103  be_set_emitter(op_ia32_Lea, emit_ia32_Lea);
1104  be_set_emitter(op_ia32_Leave, emit_ia32_Leave);
1105  be_set_emitter(op_ia32_Load, emit_ia32_Load);
1106  be_set_emitter(op_ia32_Maxs, emit_ia32_Maxs);
1107  be_set_emitter(op_ia32_Mins, emit_ia32_Mins);
1108  be_set_emitter(op_ia32_Movd, emit_ia32_Movd);
1109  be_set_emitter(op_ia32_Mul, emit_ia32_Mul);
1110  be_set_emitter(op_ia32_Muls, emit_ia32_Muls);
1111  be_set_emitter(op_ia32_Neg, emit_ia32_Neg);
1112  be_set_emitter(op_ia32_NegMem, emit_ia32_NegMem);
1113  be_set_emitter(op_ia32_Not, emit_ia32_Not);
1114  be_set_emitter(op_ia32_NotMem, emit_ia32_NotMem);
1115  be_set_emitter(op_ia32_Or, emit_ia32_Or);
1116  be_set_emitter(op_ia32_OrMem, emit_ia32_OrMem);
1117  be_set_emitter(op_ia32_Orp, emit_ia32_Orp);
1118  be_set_emitter(op_ia32_Outport, emit_ia32_Outport);
1119  be_set_emitter(op_ia32_Pop, emit_ia32_Pop);
1120  be_set_emitter(op_ia32_PopMem, emit_ia32_PopMem);
1121  be_set_emitter(op_ia32_Popcnt, emit_ia32_Popcnt);
1122  be_set_emitter(op_ia32_Prefetch, emit_ia32_Prefetch);
1123  be_set_emitter(op_ia32_PrefetchNTA, emit_ia32_PrefetchNTA);
1124  be_set_emitter(op_ia32_PrefetchT0, emit_ia32_PrefetchT0);
1125  be_set_emitter(op_ia32_PrefetchT1, emit_ia32_PrefetchT1);
1126  be_set_emitter(op_ia32_PrefetchT2, emit_ia32_PrefetchT2);
1127  be_set_emitter(op_ia32_PrefetchW, emit_ia32_PrefetchW);
1128  be_set_emitter(op_ia32_Pslld, emit_ia32_Pslld);
1129  be_set_emitter(op_ia32_Psllq, emit_ia32_Psllq);
1130  be_set_emitter(op_ia32_Psrld, emit_ia32_Psrld);
1131  be_set_emitter(op_ia32_Push, emit_ia32_Push);
1132  be_set_emitter(op_ia32_PushEax, emit_ia32_PushEax);
1133  be_set_emitter(op_ia32_Rol, emit_ia32_Rol);
1134  be_set_emitter(op_ia32_RolMem, emit_ia32_RolMem);
1135  be_set_emitter(op_ia32_Ror, emit_ia32_Ror);
1136  be_set_emitter(op_ia32_RorMem, emit_ia32_RorMem);
1137  be_set_emitter(op_ia32_Sahf, emit_ia32_Sahf);
1138  be_set_emitter(op_ia32_Sar, emit_ia32_Sar);
1139  be_set_emitter(op_ia32_SarMem, emit_ia32_SarMem);
1140  be_set_emitter(op_ia32_Sbb, emit_ia32_Sbb);
1141  be_set_emitter(op_ia32_Sbb0, emit_ia32_Sbb0);
1142  be_set_emitter(op_ia32_SetccMem, emit_ia32_SetccMem);
1143  be_set_emitter(op_ia32_Shl, emit_ia32_Shl);
1144  be_set_emitter(op_ia32_ShlD, emit_ia32_ShlD);
1145  be_set_emitter(op_ia32_ShlMem, emit_ia32_ShlMem);
1146  be_set_emitter(op_ia32_Shr, emit_ia32_Shr);
1147  be_set_emitter(op_ia32_ShrD, emit_ia32_ShrD);
1148  be_set_emitter(op_ia32_ShrMem, emit_ia32_ShrMem);
1149  be_set_emitter(op_ia32_Stc, emit_ia32_Stc);
1150  be_set_emitter(op_ia32_Store, emit_ia32_Store);
1151  be_set_emitter(op_ia32_Sub, emit_ia32_Sub);
1152  be_set_emitter(op_ia32_SubMem, emit_ia32_SubMem);
1153  be_set_emitter(op_ia32_SubSP, emit_ia32_SubSP);
1154  be_set_emitter(op_ia32_Subs, emit_ia32_Subs);
1155  be_set_emitter(op_ia32_Test, emit_ia32_Test);
1156  be_set_emitter(op_ia32_UD2, emit_ia32_UD2);
1157  be_set_emitter(op_ia32_Ucomis, emit_ia32_Ucomis);
1158  be_set_emitter(op_ia32_Xor, emit_ia32_Xor);
1159  be_set_emitter(op_ia32_Xor0, emit_ia32_Xor0);
1160  be_set_emitter(op_ia32_XorHighLow, emit_ia32_XorHighLow);
1161  be_set_emitter(op_ia32_XorMem, emit_ia32_XorMem);
1162  be_set_emitter(op_ia32_Xorp, emit_ia32_Xorp);
1163  be_set_emitter(op_ia32_emms, emit_ia32_emms);
1164  be_set_emitter(op_ia32_fabs, emit_ia32_fabs);
1165  be_set_emitter(op_ia32_fadd, emit_ia32_fadd);
1166  be_set_emitter(op_ia32_fchs, emit_ia32_fchs);
1167  be_set_emitter(op_ia32_fdiv, emit_ia32_fdiv);
1168  be_set_emitter(op_ia32_fdup, emit_ia32_fdup);
1169  be_set_emitter(op_ia32_femms, emit_ia32_femms);
1170  be_set_emitter(op_ia32_ffreep, emit_ia32_ffreep);
1171  be_set_emitter(op_ia32_fild, emit_ia32_fild);
1172  be_set_emitter(op_ia32_fist, emit_ia32_fist);
1173  be_set_emitter(op_ia32_fistp, emit_ia32_fistp);
1174  be_set_emitter(op_ia32_fisttp, emit_ia32_fisttp);
1175  be_set_emitter(op_ia32_fld, emit_ia32_fld);
1176  be_set_emitter(op_ia32_fld1, emit_ia32_fld1);
1177  be_set_emitter(op_ia32_fldl2e, emit_ia32_fldl2e);
1178  be_set_emitter(op_ia32_fldl2t, emit_ia32_fldl2t);
1179  be_set_emitter(op_ia32_fldlg2, emit_ia32_fldlg2);
1180  be_set_emitter(op_ia32_fldln2, emit_ia32_fldln2);
1181  be_set_emitter(op_ia32_fldpi, emit_ia32_fldpi);
1182  be_set_emitter(op_ia32_fldz, emit_ia32_fldz);
1183  be_set_emitter(op_ia32_fmul, emit_ia32_fmul);
1184  be_set_emitter(op_ia32_fpop, emit_ia32_fpop);
1185  be_set_emitter(op_ia32_fst, emit_ia32_fst);
1186  be_set_emitter(op_ia32_fstp, emit_ia32_fstp);
1187  be_set_emitter(op_ia32_fsub, emit_ia32_fsub);
1188  be_set_emitter(op_ia32_fxch, emit_ia32_fxch);
1189  be_set_emitter(op_ia32_xAllOnes, emit_ia32_xAllOnes);
1190  be_set_emitter(op_ia32_xLoad, emit_ia32_xLoad);
1191  be_set_emitter(op_ia32_xPzero, emit_ia32_xPzero);
1192  be_set_emitter(op_ia32_xStore, emit_ia32_xStore);
1193  be_set_emitter(op_ia32_xZero, emit_ia32_xZero);
1194  be_set_emitter(op_ia32_xxLoad, emit_ia32_xxLoad);
1195  be_set_emitter(op_ia32_xxStore, emit_ia32_xxStore);
1196 
1197 }
1198 
1199 void ia32_register_spec_binary_emitters(void)
1200 {
1201  be_set_emitter(op_ia32_Adc, enc_ia32_Adc);
1202  be_set_emitter(op_ia32_Add, enc_ia32_Add);
1203  be_set_emitter(op_ia32_AddMem, enc_ia32_AddMem);
1204  be_set_emitter(op_ia32_And, enc_ia32_And);
1205  be_set_emitter(op_ia32_AndMem, enc_ia32_AndMem);
1206  be_set_emitter(op_ia32_Breakpoint, enc_ia32_Breakpoint);
1207  be_set_emitter(op_ia32_Bsf, enc_ia32_Bsf);
1208  be_set_emitter(op_ia32_Bsr, enc_ia32_Bsr);
1209  be_set_emitter(op_ia32_Cltd, enc_ia32_Cltd);
1210  be_set_emitter(op_ia32_Cmc, enc_ia32_Cmc);
1211  be_set_emitter(op_ia32_Cmp, enc_ia32_Cmp);
1212  be_set_emitter(op_ia32_Cwtl, enc_ia32_Cwtl);
1213  be_set_emitter(op_ia32_DecMem, enc_ia32_DecMem);
1214  be_set_emitter(op_ia32_Div, enc_ia32_Div);
1215  be_set_emitter(op_ia32_IDiv, enc_ia32_IDiv);
1216  be_set_emitter(op_ia32_IJmp, enc_ia32_IJmp);
1217  be_set_emitter(op_ia32_IMul, enc_ia32_IMul);
1218  be_set_emitter(op_ia32_IMul1OP, enc_ia32_IMul1OP);
1219  be_set_emitter(op_ia32_IncMem, enc_ia32_IncMem);
1220  be_set_emitter(op_ia32_Leave, enc_ia32_Leave);
1221  be_set_emitter(op_ia32_Mul, enc_ia32_Mul);
1222  be_set_emitter(op_ia32_Neg, enc_ia32_Neg);
1223  be_set_emitter(op_ia32_NegMem, enc_ia32_NegMem);
1224  be_set_emitter(op_ia32_Not, enc_ia32_Not);
1225  be_set_emitter(op_ia32_NotMem, enc_ia32_NotMem);
1226  be_set_emitter(op_ia32_Or, enc_ia32_Or);
1227  be_set_emitter(op_ia32_OrMem, enc_ia32_OrMem);
1228  be_set_emitter(op_ia32_Rol, enc_ia32_Rol);
1229  be_set_emitter(op_ia32_RolMem, enc_ia32_RolMem);
1230  be_set_emitter(op_ia32_Ror, enc_ia32_Ror);
1231  be_set_emitter(op_ia32_RorMem, enc_ia32_RorMem);
1232  be_set_emitter(op_ia32_Sahf, enc_ia32_Sahf);
1233  be_set_emitter(op_ia32_Sar, enc_ia32_Sar);
1234  be_set_emitter(op_ia32_SarMem, enc_ia32_SarMem);
1235  be_set_emitter(op_ia32_Sbb, enc_ia32_Sbb);
1236  be_set_emitter(op_ia32_Shl, enc_ia32_Shl);
1237  be_set_emitter(op_ia32_ShlMem, enc_ia32_ShlMem);
1238  be_set_emitter(op_ia32_Shr, enc_ia32_Shr);
1239  be_set_emitter(op_ia32_ShrMem, enc_ia32_ShrMem);
1240  be_set_emitter(op_ia32_Stc, enc_ia32_Stc);
1241  be_set_emitter(op_ia32_Sub, enc_ia32_Sub);
1242  be_set_emitter(op_ia32_SubMem, enc_ia32_SubMem);
1243  be_set_emitter(op_ia32_Xor, enc_ia32_Xor);
1244  be_set_emitter(op_ia32_XorMem, enc_ia32_XorMem);
1245  be_set_emitter(op_ia32_fabs, enc_ia32_fabs);
1246  be_set_emitter(op_ia32_fadd, enc_ia32_fadd);
1247  be_set_emitter(op_ia32_fchs, enc_ia32_fchs);
1248  be_set_emitter(op_ia32_fdiv, enc_ia32_fdiv);
1249  be_set_emitter(op_ia32_fdup, enc_ia32_fdup);
1250  be_set_emitter(op_ia32_ffreep, enc_ia32_ffreep);
1251  be_set_emitter(op_ia32_fld1, enc_ia32_fld1);
1252  be_set_emitter(op_ia32_fldz, enc_ia32_fldz);
1253  be_set_emitter(op_ia32_fmul, enc_ia32_fmul);
1254  be_set_emitter(op_ia32_fpop, enc_ia32_fpop);
1255  be_set_emitter(op_ia32_fsub, enc_ia32_fsub);
1256  be_set_emitter(op_ia32_fxch, enc_ia32_fxch);
1257 
1258 }
struct ir_node ir_node
Procedure Graph Node.
Definition: firm_types.h:53