modified: src/ch2/linkedlist.rs
This commit is contained in:
parent
e394b1a3de
commit
e20c34d2e9
|
@ -1,7 +1,9 @@
|
||||||
pub mod tests {
|
pub mod tests {
|
||||||
use compiler::backend::{AddInst, Block, BranchInst, BranchOp, CallInst, Inst, JmpInst, LdInst, MvInst, REG_A0, REG_A1, REG_A2, REG_RA, REG_S0, REG_S1, REG_S2, REG_SP, REG_ZERO, SdInst};
|
|
||||||
use compiler::backend::Inst::{Call, Jmp};
|
use compiler::backend::Inst::{Call, Jmp};
|
||||||
use compiler::frontend::Decl::Func;
|
use compiler::backend::{
|
||||||
|
AddInst, Block, BranchInst, BranchOp, CallInst, Func, Inst, JmpInst, LdInst, MvInst,
|
||||||
|
SdInst, REG_A0, REG_A1, REG_A2, REG_A3, REG_RA, REG_S0, REG_S1, REG_S2, REG_SP, REG_ZERO,
|
||||||
|
};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
pub fn linked() {
|
pub fn linked() {
|
||||||
|
@ -12,14 +14,37 @@ pub mod tests {
|
||||||
let sdra8sp = Inst::Sd(SdInst::new(REG_RA.into(), (8).into(), REG_SP.into()));
|
let sdra8sp = Inst::Sd(SdInst::new(REG_RA.into(), (8).into(), REG_SP.into()));
|
||||||
let sds00sp = Inst::Sd(SdInst::new(REG_S0.into(), (0).into(), REG_SP.into()));
|
let sds00sp = Inst::Sd(SdInst::new(REG_S0.into(), (0).into(), REG_SP.into()));
|
||||||
let callmalloc1 = Inst::Call(CallInst::new("malloc@plt".into()));
|
let callmalloc1 = Inst::Call(CallInst::new("malloc@plt".into()));
|
||||||
let beqa0zerol2 = Inst::Branch(BranchInst::new(BranchOp::Beq, REG_A0.into(), REG_ZERO.into(), "L2".into()));
|
let beqa0zerol2 = Inst::Branch(BranchInst::new(
|
||||||
|
BranchOp::Beq,
|
||||||
|
REG_A0.into(),
|
||||||
|
REG_ZERO.into(),
|
||||||
|
"L2".into(),
|
||||||
|
));
|
||||||
let mvs0a0 = Inst::Mv(MvInst::new(REG_S0.into(), REG_A0.into()));
|
let mvs0a0 = Inst::Mv(MvInst::new(REG_S0.into(), REG_A0.into()));
|
||||||
let lia016 = Inst::Add(AddInst::new(REG_A0.into(), REG_ZERO.into(), (16).into()));
|
let lia016 = Inst::Add(AddInst::new(REG_A0.into(), REG_ZERO.into(), (16).into()));
|
||||||
let callmalloc2 = Inst::Call(CallInst::new("malloc@plt".into()));
|
let callmalloc2 = Inst::Call(CallInst::new("malloc@plt".into()));
|
||||||
let sda00s0 = Inst::Sd(SdInst::new(REG_A0.into(), (0).into(), REG_S0.into()));
|
let sda00s0 = Inst::Sd(SdInst::new(REG_A0.into(), (0).into(), REG_S0.into()));
|
||||||
let beqa0zerol3 = Inst::Branch(BranchInst::new(BranchOp::Beq, REG_A0.into(), REG_ZERO.into(), "L3".into()));
|
let beqa0zerol3 = Inst::Branch(BranchInst::new(
|
||||||
|
BranchOp::Beq,
|
||||||
|
REG_A0.into(),
|
||||||
|
REG_ZERO.into(),
|
||||||
|
"L3".into(),
|
||||||
|
));
|
||||||
let sdzero8a0 = Inst::Sd(SdInst::new(REG_ZERO.into(), (8).into(), REG_A0.into()));
|
let sdzero8a0 = Inst::Sd(SdInst::new(REG_ZERO.into(), (8).into(), REG_A0.into()));
|
||||||
entry.extend_insts(vec![addispsp_16, lia08, sdra8sp, sds00sp, callmalloc1, beqa0zerol2, mvs0a0, lia016, callmalloc2, sda00s0, beqa0zerol3, sdzero8a0]);
|
entry.extend_insts(vec![
|
||||||
|
addispsp_16,
|
||||||
|
lia08,
|
||||||
|
sdra8sp,
|
||||||
|
sds00sp,
|
||||||
|
callmalloc1,
|
||||||
|
beqa0zerol2,
|
||||||
|
mvs0a0,
|
||||||
|
lia016,
|
||||||
|
callmalloc2,
|
||||||
|
sda00s0,
|
||||||
|
beqa0zerol3,
|
||||||
|
sdzero8a0,
|
||||||
|
]);
|
||||||
// L1
|
// L1
|
||||||
let mut l1 = Block::new("L1".into());
|
let mut l1 = Block::new("L1".into());
|
||||||
let ldra8sp = Inst::Ld(LdInst::new(REG_RA.into(), (8).into(), REG_SP.into()));
|
let ldra8sp = Inst::Ld(LdInst::new(REG_RA.into(), (8).into(), REG_SP.into()));
|
||||||
|
@ -37,9 +62,57 @@ pub mod tests {
|
||||||
let jl1 = Inst::Jmp(JmpInst::new("L1".into()));
|
let jl1 = Inst::Jmp(JmpInst::new("L1".into()));
|
||||||
l2.extend_insts(vec![lis00, jl1]);
|
l2.extend_insts(vec![lis00, jl1]);
|
||||||
|
|
||||||
let createLinkedList = Func::new("createLinkedList".into(), Vec::new(), entry);
|
let mut createLinkedList = Func::new("createLinkedList".into(), Vec::new(), entry);
|
||||||
createLinkedList.push_bb(l1);
|
createLinkedList.push_bb(l1);
|
||||||
createLinkedList.push_bb(l2);
|
createLinkedList.push_bb(l2);
|
||||||
createLinkedList.push_bb(l3);
|
createLinkedList.push_bb(l3);
|
||||||
|
|
||||||
|
let mut entry = Block::new("entry".into());
|
||||||
|
let addispsp_32 = Inst::Add(AddInst::new(REG_SP.into(), REG_SP.into(), (-32).into()));
|
||||||
|
let sds016sp = Inst::Sd(SdInst::new(REG_S0.into(), (16).into(), REG_SP.into()));
|
||||||
|
let lds00a0 = Inst::Ld(LdInst::new(REG_SP.into(), (0).into(), REG_A0.into()));
|
||||||
|
let sds18sp = Inst::Sd(SdInst::new(REG_S1.into(), (8).into(), REG_SP.into()));
|
||||||
|
let sdra24sp = Inst::Sd(SdInst::new(REG_RA.into(), (24).into(), REG_SP.into()));
|
||||||
|
let mvs1a0 = Inst::Mv(MvInst::new(REG_S1.into(), REG_A0.into()));
|
||||||
|
let beqs0zerol31 = Inst::Branch(BranchInst::new(
|
||||||
|
BranchOp::Beq,
|
||||||
|
REG_S0.into(),
|
||||||
|
REG_ZERO.into(),
|
||||||
|
"L31".into(),
|
||||||
|
));
|
||||||
|
entry.extend_insts(vec![
|
||||||
|
addispsp_32,
|
||||||
|
sds016sp,
|
||||||
|
lds00a0,
|
||||||
|
sds18sp,
|
||||||
|
sdra24sp,
|
||||||
|
mvs1a0,
|
||||||
|
beqs0zerol31,
|
||||||
|
]);
|
||||||
|
|
||||||
|
let mut l32 = Block::new("L32".into());
|
||||||
|
let mva0s0 = Inst::Mv(MvInst::new(REG_A0.into(), REG_S0.into()));
|
||||||
|
let lds08s0 = Inst::Ld(LdInst::new(REG_S0.into(), (8).into(), REG_S0.into()));
|
||||||
|
let callfree = Inst::Call(CallInst::new("free@plt".into()));
|
||||||
|
let bnes0zerol32 = Inst::Branch(BranchInst::new(
|
||||||
|
BranchOp::Bne,
|
||||||
|
REG_S0.into(),
|
||||||
|
REG_ZERO.into(),
|
||||||
|
"L32".into(),
|
||||||
|
));
|
||||||
|
l32.extend_insts(vec![mva0s0, lds08s0, callfree, bnes0zerol32]);
|
||||||
|
|
||||||
|
let mut l31 = Block::new("L32".into());
|
||||||
|
let lds016sp = Inst::Ld(LdInst::new(REG_S0.into(), (16).into(), REG_SP.into()));
|
||||||
|
let ldra24sp = Inst::Ld(LdInst::new(REG_RA.into(), (24).into(), REG_SP.into()));
|
||||||
|
let mva0s1 = Inst::Mv(MvInst::new(REG_A0.into(), REG_S1.into()));
|
||||||
|
let lds18sp = Inst::Ld(LdInst::new(REG_S1.into(), (8).into(), REG_SP.into()));
|
||||||
|
let addispsp32 = Inst::Add(AddInst::new(REG_SP.into(), REG_SP.into(), (32).into()));
|
||||||
|
//let tailfree = Inst::
|
||||||
|
l31.extend_insts(vec![lds016sp, ldra24sp, mva0s1, lds18sp, addispsp32]);
|
||||||
|
|
||||||
|
let mut destroyLinkedList = Func::new("destroyLinkedList".into(), Vec::new(), entry);
|
||||||
|
destroyLinkedList.push_bb(l32);
|
||||||
|
destroyLinkedList.push_bb(l31);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue