コード例 #1
0
ファイル: target.c プロジェクト: entslscheia/Compilers-lab4
void trans_arithmatic(InterCode* code){
	trans_op(code->u.binop.op1);
	fprintf(f2, "\tmove $t1, $t0\n");
	trans_op(code->u.binop.op2);
	switch(code->kind){
		case ADD:
			fprintf(f2, "\tadd $t0, $t0, $t1\n");
			break;
		case SUB:
			fprintf(f2, "\tsub $t0, $t1, $t0\n");
			break;
		case MUL:
			fprintf(f2, "\tmul $t0, $t0, $t1\n");
			break;
		case DIVIDE:
			fprintf(f2, "\tdiv $t1, $t0\n");
			fprintf(f2, "\tmflo $t0\n");
			break;
		default:
			fprintf(f2, "Error in trans_arithmatic()!!\n");
	}
	trans_left_op(code->u.binop.result);
}
コード例 #2
0
ファイル: conversion.cpp プロジェクト: Mailaender/springlobby
TransformedArrayString::TransformedArrayString( const wxArrayString& original, wxString trans_op (const wxString& ) )
{
    for ( size_t i = 0; i < original.Count(); i++ )
        Add( trans_op( original[i] ) );
}
コード例 #3
0
ファイル: target.c プロジェクト: entslscheia/Compilers-lab4
void trans(InterCodes* cur){
	InterCode* code = cur->code;
	switch(code->kind){
		case LABEL:
			fprintf(f2, "label%d:\n", code->u.label_no);
			break;
		case RET:
			fprintf(f2, "\tlw $v0, -%d($fp)\n", get_offset(code->u.return_temp_no, 0));
			fprintf(f2, "\tmove $sp, $fp\n");
			fprintf(f2, "\tjr $ra\n");
			arg_num = 0;
			break;
		case GOTO:
			fprintf(f2, "\tj label%d\n", code->u.goto_no);
			break;
		case READ:
			fprintf(f2, "\taddi $sp, $sp, -4\n");
			fprintf(f2, "\tsw $ra, 0($sp)\n");
			fprintf(f2, "\tjal read\n");
			fprintf(f2, "\tlw $ra, 0($sp)\n");
			fprintf(f2, "\taddi $sp, $sp, 4\n");
			fprintf(f2, "\tsw $v0, -%d($fp)\n", get_offset(code->u.read_no, 0));
			break;
		case WRITE:
			fprintf(f2, "\tlw $a0, -%d($fp)\n", get_offset(code->u.write_no, 0));
			fprintf(f2, "\taddi $sp, $sp, -4\n");
			fprintf(f2, "\tsw $ra, 0($sp)\n");
			fprintf(f2, "\tjal write\n");
			fprintf(f2, "\tlw $ra, 0($sp)\n");
			fprintf(f2, "\taddi $sp, $sp, 4\n");
			break;
		case ARG:
			if(arg_num < 4){
				printf("hahahaha\n");
				fprintf(f2, "\tlw $a%d, -%d($fp)\n", arg_num, get_offset(code->u.arg_var_no, 0));
				//printf("%d %d\n", code->u.arg_var_no, get_offset(code->u.arg_var_no, 1));
			}
			else{
				//参数大于4个的情况				
			}
			arg_num++;
			break;
		case FUNC:
			fprintf(f2, "%s:\n", code->u.func);
			fprintf(f2, "\tmove $fp, $sp\n");
			max_offset = 0;
			break;
		case PARA:
			if(arg_num < 4)
				fprintf(f2, "\tsw $a%d, -%d($fp)\n", arg_num, get_offset(code->u.para_var_no, 1));
			else{
				//参数大于4个
			}
			arg_num++;
			break;
		case CALL:
			fprintf(f2, "\tli $s1, %d\n", max_offset);
			fprintf(f2, "\taddi $sp, $sp, -8\n");
			fprintf(f2, "\tsw $fp, 8($sp)\n");
			fprintf(f2, "\tsw $s1, 4($sp)\n");
			fprintf(f2, "\tsw $ra, 0($sp)\n");
			fprintf(f2, "\tjal %s\n", code->u.assign.right->u.fun);
			fprintf(f2, "\tlw $ra, 0($sp)\n");
			fprintf(f2, "\tlw $s1, 4($sp)\n");
			fprintf(f2, "\tlw $fp, 8($sp)\n");
			break;
		case ASS:
			if(code->u.assign.right->kind == FUN){
				fprintf(f2, "\tli $s1, %d\n", max_offset);
				fprintf(f2, "\taddi $sp, $sp, -8\n");
				fprintf(f2, "\tsw $fp, 8($sp)\n");
				fprintf(f2, "\tsw $s1, 4($sp)\n");
				fprintf(f2, "\tsw $ra, 0($sp)\n");
				fprintf(f2, "\tjal %s\n", code->u.assign.right->u.fun);
				fprintf(f2, "\tlw $ra, 0($sp)\n");
				fprintf(f2, "\tlw $s1, 4($sp)\n");
				fprintf(f2, "\tlw $fp, 8($sp)\n");
				fprintf(f2, "\tsw $v0, -%d($fp)\n", get_offset(code->u.assign.left->u.temp_no, 0));
				fprintf(f2, "\taddi $sp, $sp, 8\n");
			}
			else{
				trans_op(code->u.assign.right);
				assert(code->u.assign.left->kind != ARRA);
				trans_left_op(code->u.assign.left);
			}
			break;
		case DEC:{
			int num = code->u.dec.var_no + temp_count - 1;
			assert(offset_record[num] == -1);
			int offset = offset_sum * 4;
			offset_record[num] = offset;
			offset_sum += (code->u.dec.size);
			if(offset_sum*4 > max_offset){
				fprintf(f2, "\taddi $sp, $sp, -%d\n", offset_sum*4 - max_offset);
				max_offset = offset_sum * 4;
			}
			break;
		}
		case ADD:
			trans_arithmatic(code);
			break;
		case SUB:
			trans_arithmatic(code);
			break;
		case MUL:
			trans_arithmatic(code);
			break;
		case DIVIDE:
			trans_arithmatic(code);
			break;
		case IF2:
			fprintf(f2, "\tlw $t0, -%d($fp)\n", get_offset(code->u.if2.temp_no1, 0));
			fprintf(f2, "\tlw $t1, -%d($fp)\n", get_offset(code->u.if2.temp_no2, 0));
			if(strcmp(code->u.if2.op, ">") == 0) 
				fprintf(f2, "\tbgt $t0, $t1, label%d\n", code->u.if2.label_no);
			else if(strcmp(code->u.if2.op, "<") == 0) 
				fprintf(f2, "\tblt $t0, $t1, label%d\n", code->u.if2.label_no);
			else if(strcmp(code->u.if2.op, ">=") == 0) 
				fprintf(f2, "\tbge $t0, $t1, label%d\n", code->u.if2.label_no);
			else if(strcmp(code->u.if2.op, "<=") == 0) 
				fprintf(f2, "\tble $t0, $t1, label%d\n", code->u.if2.label_no);
			else if(strcmp(code->u.if2.op, "==") == 0) 
				fprintf(f2, "\tbeq $t0, $t1, label%d\n", code->u.if2.label_no);
			else if(strcmp(code->u.if2.op, "!=") == 0) 
				fprintf(f2, "\tbne $t0, $t1, label%d\n", code->u.if2.label_no);
			
			break;
		//case IF1:

	}
}