GitLab will be upgraded to the 12.10.14-ce.0 on 28 Sept 2020 at 2.00pm (AEDT) to 2.30pm (AEDT). During the update, GitLab and Mattermost services will not be available. If you have any concerns with this, please talk to us at N110 (b) CSIT building.

codegen.rs 2.61 KB
Newer Older
1 2
use ast::ptr::P;
use ast::ir::*;
qinsoon's avatar
qinsoon committed
3
use runtime::ValueLocation;
4

qinsoon's avatar
qinsoon committed
5
use compiler::machine_code::MachineCode;
6

7
pub trait CodeGenerator {
qinsoon's avatar
qinsoon committed
8
    fn start_code(&mut self, func_name: MuName) -> ValueLocation;
9
    fn finish_code(&mut self, func_name: MuName) -> (Box<MachineCode + Sync + Send>, ValueLocation);
10 11 12
    
    fn print_cur_code(&self);
    
qinsoon's avatar
qinsoon committed
13 14 15 16
    fn start_block(&mut self, block_name: MuName);
    fn set_block_livein(&mut self, block_name: MuName, live_in: &Vec<P<Value>>);
    fn set_block_liveout(&mut self, block_name: MuName, live_out: &Vec<P<Value>>);
    fn end_block(&mut self, block_name: MuName);
17
    
18
    fn emit_cmp_r64_r64(&mut self, op1: &P<Value>, op2: &P<Value>);
19
    fn emit_cmp_r64_imm32(&mut self, op1: &P<Value>, op2: i32);
20 21
    fn emit_cmp_r64_mem64(&mut self, op1: &P<Value>, op2: &P<Value>);
    
22
    fn emit_mov_r64_imm32(&mut self, dest: &P<Value>, src: i32);
23
    fn emit_mov_r64_mem64(&mut self, dest: &P<Value>, src: &P<Value>); // load
qinsoon's avatar
qinsoon committed
24
    fn emit_mov_r64_r64(&mut self, dest: &P<Value>, src: &P<Value>);
25
    fn emit_mov_mem64_r64(&mut self, dest: &P<Value>, src: &P<Value>); // store
26
    fn emit_mov_mem64_imm32(&mut self, dest: &P<Value>, src: i32);
qinsoon's avatar
qinsoon committed
27
    
28 29
    fn emit_lea_r64(&mut self, dest: &P<Value>, src: &P<Value>);
    
30
    fn emit_and_r64_imm32(&mut self, dest: &P<Value>, src: i32);
31 32
    fn emit_and_r64_r64(&mut self, dest: &P<Value>, src: &P<Value>);
    
qinsoon's avatar
qinsoon committed
33 34
    fn emit_add_r64_r64(&mut self, dest: &P<Value>, src: &P<Value>);
    fn emit_add_r64_mem64(&mut self, dest: &P<Value>, src: &P<Value>);
35
    fn emit_add_r64_imm32(&mut self, dest: &P<Value>, src: i32);
qinsoon's avatar
qinsoon committed
36 37 38
    
    fn emit_sub_r64_r64(&mut self, dest: &P<Value>, src: &P<Value>);
    fn emit_sub_r64_mem64(&mut self, dest: &P<Value>, src: &P<Value>);
39
    fn emit_sub_r64_imm32(&mut self, dest: &P<Value>, src: i32);
qinsoon's avatar
qinsoon committed
40
    
41 42 43
    fn emit_mul_r64(&mut self, src: &P<Value>);
    fn emit_mul_mem64(&mut self, src: &P<Value>);
    
44 45 46 47 48 49 50 51 52 53 54
    fn emit_jmp(&mut self, dest: MuName);
    fn emit_je(&mut self, dest: MuName);
    fn emit_jne(&mut self, dest: MuName);
    fn emit_ja(&mut self, dest: MuName);
    fn emit_jae(&mut self, dest: MuName);
    fn emit_jb(&mut self, dest: MuName);
    fn emit_jbe(&mut self, dest: MuName);
    fn emit_jg(&mut self, dest: MuName);
    fn emit_jge(&mut self, dest: MuName);
    fn emit_jl(&mut self, dest: MuName);
    fn emit_jle(&mut self, dest: MuName);
qinsoon's avatar
qinsoon committed
55
    
qinsoon's avatar
qinsoon committed
56
    fn emit_call_near_rel32(&mut self, func: MuName);
57 58 59
    fn emit_call_near_r64(&mut self, func: &P<Value>);
    fn emit_call_near_mem64(&mut self, func: &P<Value>);
    
qinsoon's avatar
qinsoon committed
60
    fn emit_ret(&mut self);
61
    
62 63
    fn emit_push_r64(&mut self, src: &P<Value>);
    fn emit_pop_r64(&mut self, dest: &P<Value>);
64
}