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 3.87 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 13

    // generate unnamed sequence of linear code (no branch)
    fn start_code_sequence(&mut self);
    fn finish_code_sequence(&mut self) -> Box<MachineCode + Sync + Send>;
14 15 16
    
    fn print_cur_code(&self);
    
qinsoon's avatar
qinsoon committed
17
    fn start_block(&mut self, block_name: MuName);
qinsoon's avatar
qinsoon committed
18
    fn start_exception_block(&mut self, block_name: MuName) -> ValueLocation;
qinsoon's avatar
qinsoon committed
19 20 21
    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);
22
    
23 24
    fn emit_nop(&mut self, bytes: usize);
    
25
    fn emit_cmp_r64_r64(&mut self, op1: &P<Value>, op2: &P<Value>);
26
    fn emit_cmp_r64_imm32(&mut self, op1: &P<Value>, op2: i32);
27 28
    fn emit_cmp_r64_mem64(&mut self, op1: &P<Value>, op2: &P<Value>);
    
qinsoon's avatar
qinsoon committed
29 30 31 32
    fn emit_mov_r64_imm32  (&mut self, dest: &P<Value>, src: i32);
    fn emit_mov_r64_mem64  (&mut self, dest: &P<Value>, src: &P<Value>); // load
    fn emit_mov_r64_r64    (&mut self, dest: &P<Value>, src: &P<Value>);
    fn emit_mov_mem64_r64  (&mut self, dest: &P<Value>, src: &P<Value>); // store
33
    fn emit_mov_mem64_imm32(&mut self, dest: &P<Value>, src: i32);
qinsoon's avatar
qinsoon committed
34 35 36 37

    fn emit_movsd_f64_f64  (&mut self, dest: &P<Value>, src: &P<Value>);
    fn emit_movsd_f64_mem64(&mut self, dest: &P<Value>, src: &P<Value>); // load
    fn emit_movsd_mem64_f64(&mut self, dest: &P<Value>, src: &P<Value>); // store
qinsoon's avatar
qinsoon committed
38
    
39 40
    fn emit_lea_r64(&mut self, dest: &P<Value>, src: &P<Value>);
    
41
    fn emit_and_r64_imm32(&mut self, dest: &P<Value>, src: i32);
qinsoon's avatar
qinsoon committed
42
    fn emit_and_r64_r64  (&mut self, dest: &P<Value>, src: &P<Value>);
43 44 45 46

    fn emit_xor_r64_r64  (&mut self, dest: &P<Value>, src: &P<Value>);
    fn emit_xor_r64_mem64(&mut self, dest: &P<Value>, src: &P<Value>);
    fn emit_xor_r64_imm32(&mut self, dest: &P<Value>, src: i32);
47
    
qinsoon's avatar
qinsoon committed
48
    fn emit_add_r64_r64  (&mut self, dest: &P<Value>, src: &P<Value>);
qinsoon's avatar
qinsoon committed
49
    fn emit_add_r64_mem64(&mut self, dest: &P<Value>, src: &P<Value>);
50
    fn emit_add_r64_imm32(&mut self, dest: &P<Value>, src: i32);
qinsoon's avatar
qinsoon committed
51 52 53

    fn emit_addsd_f64_f64  (&mut self, dest: &P<Value>, src: &P<Value>);
    fn emit_addsd_f64_mem64(&mut self, dest: &P<Value>, src: &P<Value>);
qinsoon's avatar
qinsoon committed
54 55 56
    
    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>);
57
    fn emit_sub_r64_imm32(&mut self, dest: &P<Value>, src: i32);
qinsoon's avatar
qinsoon committed
58
    
qinsoon's avatar
qinsoon committed
59
    fn emit_mul_r64  (&mut self, src: &P<Value>);
60
    fn emit_mul_mem64(&mut self, src: &P<Value>);
61

qinsoon's avatar
sdiv  
qinsoon committed
62 63 64 65 66 67
    fn emit_div_r64   (&mut self, src: &P<Value>);
    fn emit_div_mem64 (&mut self, src: &P<Value>);
    fn emit_idiv_r64  (&mut self, src: &P<Value>);
    fn emit_idiv_mem64(&mut self, src: &P<Value>);

    fn emit_cqo(&mut self);
68
    
69 70 71 72 73 74 75 76 77 78 79
    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
80
    
qinsoon's avatar
qinsoon committed
81 82 83
    fn emit_call_near_rel32(&mut self, callsite: String, func: MuName) -> ValueLocation;
    fn emit_call_near_r64(&mut self, callsite: String, func: &P<Value>) -> ValueLocation;
    fn emit_call_near_mem64(&mut self, callsite: String, func: &P<Value>) -> ValueLocation;
84
    
qinsoon's avatar
qinsoon committed
85
    fn emit_ret(&mut self);
qinsoon's avatar
qinsoon committed
86

87
    fn emit_push_r64(&mut self, src: &P<Value>);
88
    fn emit_push_imm32(&mut self, src: i32);
89
    fn emit_pop_r64(&mut self, dest: &P<Value>);
90
}