Mercurial > hg > Members > kono > compiler-examples
diff s-code-intel64-mac.c @ 12:c5c4771a6be2
working on intel64 (Lion)
author | kono |
---|---|
date | Fri, 28 Oct 2011 15:41:27 +0900 |
parents | |
children | e5c8532ab38d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/s-code-intel64-mac.c Fri Oct 28 15:41:27 2011 +0900 @@ -0,0 +1,240 @@ +/* + Very Simple Code Generator for Intel x86 + $Id$ + */ + + #include "s-compile.h" + +int label = 0; +char *comments = "#####"; +static +char *intro[] = { + " .cstring\n", + "LC0:\n", + " .ascii \"%d\\n\\0\"\n" + " .text\n", + ".globl _print\n", + "_print:\n", + "LFB2:\n", + " pushq %rbp\n", + "LCFI0:\n", + " movq %rsp, %rbp\n", + "LCFI1:\n", + " subq $16, %rsp\n", + "LCFI2:\n", + " movl %edi, -4(%rbp)\n", + " movl -4(%rbp), %esi\n", + " leaq LC0(%rip), %rdi\n", + " movl $0, %eax\n", + " call _printf\n", + " leave\n", + " ret\n", + "LFE2:\n", + ".globl _main\n", + "_main:\n", + "LFB3:\n", + " pushq %rbp\n", + "LCFI3:\n", + " movq %rsp, %rbp\n", + "LCFI4:\n", + " subq $16, %rsp\n", + "LCFI5:\n", + "\n", + "\n", + NULL +}; + +static +char *ending[] = { + " movq %rax, %rdi\n", + " call _print\n", + " leave\n", + " ret\n", + "LFE3:\n", + ".comm _v,96,5\n", + " .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support\n", + "EH_frame1:\n", + " .set L$set$0,LECIE1-LSCIE1\n", + " .long L$set$0\n", + "LSCIE1:\n", + " .long 0x0\n", + " .byte 0x1\n", + " .ascii \"zR\\0\"\n", + " .byte 0x1\n", + " .byte 0x78\n", + " .byte 0x10\n", + " .byte 0x1\n", + " .byte 0x10\n", + " .byte 0xc\n", + " .byte 0x7\n", + " .byte 0x8\n", + " .byte 0x90\n", + " .byte 0x1\n", + " .align 3\n", + "LECIE1:\n", + " .globl _print.eh\n", + "_print.eh:\n", + "LSFDE1:\n", + " .set L$set$1,LEFDE1-LASFDE1\n", + " .long L$set$1\n", + "LASFDE1:\n", + " .long LASFDE1-EH_frame1\n", + " .quad LFB2-.\n", + " .set L$set$2,LFE2-LFB2\n", + " .quad L$set$2\n", + " .byte 0x0\n", + " .byte 0x4\n", + " .set L$set$3,LCFI0-LFB2\n", + " .long L$set$3\n", + " .byte 0xe\n", + " .byte 0x10\n", + " .byte 0x86\n", + " .byte 0x2\n", + " .byte 0x4\n", + " .set L$set$4,LCFI1-LCFI0\n", + " .long L$set$4\n", + " .byte 0xd\n", + " .byte 0x6\n", + " .align 3\n", + "LEFDE1:\n", + " .globl _main.eh\n", + "_main.eh:\n", + "LSFDE3:\n", + " .set L$set$5,LEFDE3-LASFDE3\n", + " .long L$set$5\n", + "LASFDE3:\n", + " .long LASFDE3-EH_frame1\n", + " .quad LFB3-.\n", + " .set L$set$6,LFE3-LFB3\n", + " .quad L$set$6\n", + " .byte 0x0\n", + " .byte 0x4\n", + " .set L$set$7,LCFI3-LFB3\n", + " .long L$set$7\n", + " .byte 0xe\n", + " .byte 0x10\n", + " .byte 0x86\n", + " .byte 0x2\n", + " .byte 0x4\n", + " .set L$set$8,LCFI4-LCFI3\n", + " .long L$set$8\n", + " .byte 0xd\n", + " .byte 0x6\n", + " .align 3\n", + "LEFDE3:\n", + " .subsections_via_symbols\n", + NULL +}; + +void +emit_push() +{ + printf("\tpushq %%rax\n"); +} + +void +emit_compare() +{ + printf("\tcmpq %%rax,(%%rsp)\n"); + printf("\t%s %%al\n","setg"); + printf("\tmovzbq %%al,%%rax\n"); + printf("\taddq $8,%%rsp\n"); +} + +void +emit_store( int d ) +{ + printf("\tmovq _v@GOTPCREL(%%rip), %%rcx\n"); + printf("\tmovq %%rax, %d(%%rcx)\n" ,d*8); +} + +void +emit_load(int d) +{ + printf("\tmovq _v@GOTPCREL(%%rip), %%rcx\n"); + printf("\tmovq %d(%%rcx),%%rax\n" ,d*8); +} + + +static +char *opcode[] = { + "", + "subq", + "addq", + "imulq", + "idivq", + "", + "", + "", + "", + "subq", + "idivq", +}; + +void +emit_calc(enum opcode op) +{ + if(op==O_DIV) { + printf("\tmovq %%rax,%%rbx\n"); + printf("\tpopq %%rax\n"); + printf("\tcltd\n"); + printf("\tidivq %%rbx\n"); + } else if(op==O_SUB) { + printf("\tpopq %%rbx\n"); + printf("\t%s %%rbx,%%rax\n",opcode[op]); + printf("\tnegq %%rax\n"); + } else { + printf("\tpopq %%rbx\n"); + printf("\t%s %%rbx,%%rax\n",opcode[op]); + } +} + +void +emit_value(d) +int d; +{ + printf("\tmovq $%d,%%rax\n",d); +} + +void +emit_comment() +{ + if (before < ptr) { + putchar('#'); putchar('#'); putchar(' '); + while (before < ptr) { + if(*before && *before!='\n') { + putchar(*before); + } + before++; + } + putchar('\n'); + } +} + +void +emit_print() +{ + printf("\tmovq %%rax, %%rdi\n"); + printf("\tcall _print\n"); +} + + +void +emit_intro() +{ + char **iptr; + for(iptr=intro;*iptr;iptr++) { + printf("%s",*iptr); + } +} + +void +emit_ending() +{ + char **iptr; + for(iptr=ending;*iptr;iptr++) { + printf("%s",*iptr); + } +} + +/* end */