view s-code-m68k.c @ 27:c4e2ca100ab9 default tip

llvm worked
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 25 Oct 2024 17:10:11 +0900
parents 6bf66c125dbc
children
line wrap: on
line source

/*
    Simple Code Generator for Motolora MC-68000
	$Id$
 */

#include "s-compile.h"

char *comments = "####";

static
char *intro[] = {
    "#APP\n",    /* To process comments by GNU as */
    "\t.file   \"output.s\"\n",
    ".text\n",
    "\t.align 1\n",
    ".globl _main\n_main:\n",
    "\tlink a6,#0\n",
    NULL
};

static
char *ending[] = {
    "\tunlk a6\n",
    "\trts\n",
    "_print:\n",
    "\tlink a6,#0\n",
    "\tmovel d0,sp@-\n",
    "\tmovel d0,sp@-\n",
    "\tpea _format\n",
    "\tjbsr _printf\n",
    "\taddqw #8,sp\n",
    "\tunlk a6\n",
    "\trts\n",
    "_format:\n",
    "\t.ascii \" = %08x %d\\12\\0\"\n",
    "\t.align 2\n",
    ".comm _variable,192\n",
    NULL
};

static
char *opcode[] = {
    "",
    "subl",
    "addl",
    "mulsl",
    "divsl",
    "andl",
    "orl",
    "eorl",
    "subl",
    "divsl",
/*
    "asll",
    "asrl",
    "subl",
    "divsl",
    "slt",
    "sgt",
    "seq",
    "sne",
 */
};

void
emit_push()
{
    printf("\tmovel d0,sp@-\n");
}

void
emit_not() 
{
    printf("\ttstl d0\n");
    printf("\tsne d0\n");
    printf("\textbl d0\n");
}

void
emit_compare() 
{
    printf("\tmovel sp@,d1\n");
    printf("\taddql #4,sp\n");
    printf("\tcmpl d1,d0\n");
    printf("\tsetg d0\n");
    printf("\textbl d0\n");
    printf("\tnegl d0\n");
}

void
emit_store(assign)
int assign;
{
    printf("\tmovel d0,_variable+%d\n",assign*4);
}


void
emit_calc(enum opcode op)
{
    if(op==O_DIV) {
	printf("\tmovel d0,d1\n");
	printf("\tmovel sp@,d0\n");
	printf("\taddql #4,sp\n");
	printf("\tdivsl d1,d0\n");
    } else if(op==O_MOD) {
	printf("\tmovel d0,d2\n");
	printf("\tmovel sp@,d0\n");
	printf("\taddql #4,sp\n");
	printf("\tdivsll d2,d0:d1\n");
    } else if(op==O_ADD||op==O_MUL||op==O_AND||op==O_OR
	    ||op==O_XOR) {
	/* commutable operator */
	printf("\tmovel sp@,d1\n");
	printf("\taddql #4,sp\n");
	printf("\t%s d1,d0\n",opcode[op]);
    } else if(op==O_SUB_R||op==O_DIV_R) {
	printf("\tmovel sp@,d1\n");
	printf("\taddql #4,sp\n");
	printf("\t%s d0,d1\n",opcode[op]);
	printf("\tmovel d1,d0\n");
    } else {
	printf("\tmovel d0,d1\n");
	printf("\tmovel sp@,d0\n");
	printf("\taddql #4,sp\n");
	printf("\t%s d1,d0\n",opcode[op]);
    }
}

void
emit_neg()
{
	printf("\tnegl d0\n");
}

void
emit_value(d) 
int d;
{
    if(-127<=d && d<=127) {
	printf("\tmoveq #%d,d0\n",d);
    } else {
	printf("\tmovel #%d,d0\n",d);
    }
}

void
emit_load(d)
int d;
{
    printf("\tmovel _variable+%d,d0\n",d*4);
}

void
emit_cond(lbl) 
{
    printf("\ttstl d0\n");
    printf("\tjeq L%d\n",lbl);
}

void
emit_jump(lbl)
{
    printf("\tjra L%d\n",lbl);
}

void
emit_label(lbl)
{
    printf("L%d:\n",lbl);
}

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("\tjbsr _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 */