Add tags for binary and unary operators
This commit is contained in:
parent
828260b9ef
commit
ac58094568
|
@ -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();
|
||||
|
|
|
@ -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 = "^";
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue