Add tags for binary and unary operators

This commit is contained in:
Guojie Luo 2022-04-26 20:42:52 +08:00
parent 828260b9ef
commit ac58094568
2 changed files with 43 additions and 25 deletions

View File

@ -160,50 +160,57 @@ impl Expression {
let opd_l = operand_l.unwrap();
let opd_r = operand_r.unwrap();
let nez = |x: Value, builder: &mut UnitBuilder| -> Value {
let ty = &builder.unit().value_type(x);
let zero = builder.ins().const_zero(ty);
builder.ins().neq(x, zero)
};
let value = match json_children[1]["tag"].as_str() {
Some("+") => {
Some(Tag::ADD) => {
let value = builder.ins().add(opd_l, opd_r);
Some(value)
}
Some("-") => {
Some(Tag::SUB) => {
let value = builder.ins().sub(opd_l, opd_r);
Some(value)
}
Some("==") => {
let value = builder.ins().eq(opd_l, opd_r);
Some(value)
}
Some("&") => {
Some(Tag::BITWISE_AND) => {
let value = builder.ins().and(opd_l, opd_r);
Some(value)
}
Some("|") => {
Some(Tag::BITWISE_OR) => {
let value = builder.ins().or(opd_l, opd_r);
Some(value)
}
Some("&&") => {
let nez = |x: Value, builder: &mut UnitBuilder| -> Value {
let ty = &builder.unit().value_type(x);
let zero = builder.ins().const_zero(ty);
builder.ins().neq(x, zero)
};
Some(Tag::BITWISE_XOR) => {
let value = builder.ins().xor(opd_l, opd_r);
Some(value)
}
Some(Tag::LOGICAL_AND) => {
let nez_l = nez(opd_l, &mut builder);
let nez_r = nez(opd_r, &mut builder);
let value = builder.ins().and(nez_l, nez_r);
Some(value)
}
Some("^") => {
let value = builder.ins().xor(opd_l, opd_r);
Some(Tag::LOGICAL_OR) => {
let nez_l = nez(opd_l, &mut builder);
let nez_r = nez(opd_r, &mut builder);
let value = builder.ins().or(nez_l, nez_r);
Some(value)
}
Some(">=") => {
let value = builder.ins().sge(opd_l, opd_r);
Some(Tag::EQUAL) => {
let value = builder.ins().eq(opd_l, opd_r);
Some(value)
}
Some("<=") => {
Some(Tag::LESS_THAN_OR_EQUAL_TO) => {
let value = builder.ins().sle(opd_l, opd_r);
Some(value)
}
Some(Tag::GREATER_THAN_OR_EQUAL_TO) => {
let value = builder.ins().sge(opd_l, opd_r);
Some(value)
}
Some(tag) => {
error!("FIXME: case '{}' missing", tag);
None
@ -234,17 +241,17 @@ impl Expression {
builder.append_to(bb_head);
match json_children[0]["tag"].as_str() {
Some("!") => {
Some(Tag::LOGICAL_NOT) => {
let ty = &builder.unit().value_type(expr.unwrap());
let zero = builder.ins().const_zero(ty);
let value = builder.ins().neq(expr.unwrap(), zero);
Some(value)
}
Some("~") => {
Some(Tag::BITWISE_NOT) => {
let value = builder.ins().not(expr.unwrap());
Some(value)
}
Some("^") => {
Some(Tag::XOR_REDUCE) => {
let e = expr.unwrap();
let ty = &builder.unit().value_type(e);
let w = ty.unwrap_int();

View File

@ -105,7 +105,18 @@ impl Tag {
pub const WIRE: &'static str = "wire";
pub const PARAMETER: &'static str = "parameter";
pub const BINARY_ADD: &'static str = "&";
pub const BINARY_OR: &'static str = "|";
pub const UNARY_NOT: &'static str = "~";
pub const ADD: &'static str = "+";
pub const SUB: &'static str = "-";
pub const BITWISE_AND: &'static str = "&";
pub const BITWISE_OR: &'static str = "|";
pub const BITWISE_XOR: &'static str = "^";
pub const LOGICAL_AND: &'static str = "&&";
pub const LOGICAL_OR: &'static str = "||";
pub const EQUAL: &'static str = "==";
pub const LESS_THAN_OR_EQUAL_TO: &'static str = "<=";
pub const GREATER_THAN_OR_EQUAL_TO: &'static str = ">=";
pub const LOGICAL_NOT: &'static str = "!";
pub const BITWISE_NOT: &'static str = "~";
pub const XOR_REDUCE: &'static str = "^";
}