Commit 87442324 authored by qinsoon's avatar qinsoon

select inst for floating point values, other fixes

parent ace11dec
Pipeline #464 failed with stages
in 84 minutes and 26 seconds
......@@ -322,25 +322,26 @@ impl <'a> InstructionSelection {
let ref true_val = ops[true_val];
let ref false_val = ops[false_val];
// generate compare
let cmpop = if self.match_cmp_res(cond) {
self.emit_cmp_res(cond, f_content, f_context, vm)
} else if self.match_ireg(cond) {
let tmp_cond = self.emit_ireg(cond, f_content, f_context, vm);
// emit: cmp cond_reg 1
self.backend.emit_cmp_imm_r(1, &tmp_cond);
EQ
} else {
panic!("expected cond to be ireg, found {}", cond)
};
if self.match_ireg(true_val) {
// moving integers/pointers
let tmp_res = self.get_result_value(node);
// generate compare
let cmpop = if self.match_cmp_res(cond) {
self.emit_cmp_res(cond, f_content, f_context, vm)
} else if self.match_ireg(cond) {
let tmp_cond = self.emit_ireg(cond, f_content, f_context, vm);
// emit: cmp cond_reg 1
self.backend.emit_cmp_imm_r(1, &tmp_cond);
EQ
} else {
panic!("expected ireg, found {}", cond)
};
// use cmov for 16/32/64bit integer
// use jcc for 8 bit
// FIXME: could use 32bit register to implement 8bit select
match tmp_res.ty.get_int_length() {
// cmov
Some(len) if len > 8 => {
......@@ -374,9 +375,9 @@ impl <'a> InstructionSelection {
}
// jcc
_ => {
let blk_true = format!("{}_select_true", node.id());
let blk_false = format!("{}_select_false", node.id());
let blk_end = format!("{}_select_end", node.id());
let blk_true = format!("{}_{}_select_true", self.current_fv_id, node.id());
let blk_false = format!("{}_{}_select_false", self.current_fv_id, node.id());
let blk_end = format!("{}_{}_select_end", self.current_fv_id, node.id());
// jump to blk_true if true
match cmpop {
......@@ -432,8 +433,66 @@ impl <'a> InstructionSelection {
self.current_block = Some(blk_end.clone());
}
}
} else if self.match_fpreg(true_val) {
let tmp_res = self.get_result_value(node);
let blk_true = format!("{}_{}_select_true", self.current_fv_id, node.id());
let blk_false = format!("{}_{}_select_false", self.current_fv_id, node.id());
let blk_end = format!("{}_{}_select_end", self.current_fv_id, node.id());
// jump to blk_true if true
match cmpop {
EQ => self.backend.emit_je (blk_true.clone()),
NE => self.backend.emit_jne(blk_true.clone()),
SGE => self.backend.emit_jge(blk_true.clone()),
SGT => self.backend.emit_jg (blk_true.clone()),
SLE => self.backend.emit_jle(blk_true.clone()),
SLT => self.backend.emit_jl (blk_true.clone()),
UGE => self.backend.emit_jae(blk_true.clone()),
UGT => self.backend.emit_ja (blk_true.clone()),
ULE => self.backend.emit_jbe(blk_true.clone()),
ULT => self.backend.emit_jb (blk_true.clone()),
FOEQ | FUEQ => self.backend.emit_je (blk_true.clone()),
FONE | FUNE => self.backend.emit_jne(blk_true.clone()),
FOGT | FUGT => self.backend.emit_ja (blk_true.clone()),
FOGE | FUGE => self.backend.emit_jae(blk_true.clone()),
FOLT | FULT => self.backend.emit_jb (blk_true.clone()),
FOLE | FULE => self.backend.emit_jbe(blk_true.clone()),
_ => unimplemented!()
}
// finishing current block
let cur_block = self.current_block.as_ref().unwrap().clone();
self.backend.end_block(cur_block.clone());
// blk_false:
self.current_block = Some(blk_false.clone());
self.backend.start_block(blk_false.clone());
// mov false result here
self.emit_move_node_to_value(&tmp_res, &false_val, f_content, f_context, vm);
// jmp to end
self.backend.emit_jmp(blk_end.clone());
// finishing current block
let cur_block = self.current_block.as_ref().unwrap().clone();
self.backend.end_block(cur_block.clone());
// blk_true:
self.current_block = Some(blk_true.clone());
self.backend.start_block(blk_true.clone());
// mov true value -> result
self.emit_move_node_to_value(&tmp_res, &true_val, f_content, f_context, vm);
self.backend.end_block(blk_true.clone());
// blk_end:
self.backend.start_block(blk_end.clone());
self.current_block = Some(blk_end.clone());
} else {
// moving vectors, floatingpoints
unimplemented!()
}
},
......@@ -4620,10 +4679,7 @@ impl <'a> InstructionSelection {
#[cfg(feature = "aot")]
fn get_mem_for_funcref(&mut self, func_id: MuID, vm: &VM) -> P<Value> {
// use compiler::backend::x86_64::asm_backend;
//
let func_name = vm.name_of(func_id);
// let label = asm_backend::symbol(func_name);
let func_name = vm.get_func_name(func_id);
P(Value {
hdr: MuEntityHeader::unnamed(vm.next_id()),
......
......@@ -591,11 +591,15 @@ impl <'a> VM {
None => panic!("cannot find id for name: {}", name)
}
}
/// should only used by client
/// 'name' used internally may be slightly different to remove some special symbols
pub fn id_of(&self, name: &str) -> MuID {
self.id_of_by_refstring(&name.to_string())
}
/// should only used by client
/// 'name' used internally may be slightly different to remove some special symbols
pub fn name_of(&self, id: MuID) -> MuName {
let map = self.id_name_map.read().unwrap();
map.get(&id).unwrap().clone()
......@@ -765,6 +769,15 @@ impl <'a> VM {
info!("declare func #{} = {}", id, func);
funcs.insert(id, RwLock::new(func));
}
/// this is different than vm.name_of()
pub fn get_func_name(&self, id: MuID) -> MuName {
let funcs_lock = self.funcs.read().unwrap();
match funcs_lock.get(&id) {
Some(func) => func.read().unwrap().name().unwrap(),
None => panic!("cannot find name for Mu function #{}")
}
}
/// The IR builder needs to look-up the function signature from the existing function ID.
pub fn get_func_sig_for_func(&self, id: MuID) -> P<MuFuncSig> {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment