use codegen_lang::{Op, compile};
use ir_lang::{BinOp, Builder, Type};
fn main() {
let mut b = Builder::new("quadratic", &[Type::Int], Type::Int);
let x = b.block_params(b.entry())[0];
let sq = b.bin(BinOp::Mul, x, x);
let plus_x = b.bin(BinOp::Add, sq, x);
b.ret(Some(plus_x));
let program = compile(&b.finish()).expect("quadratic is well-formed");
println!("function : {}", program.name());
println!("params : {}", program.params().len());
println!("registers: {}", program.register_count());
println!("ops : {}", program.len());
let mut arithmetic = 0;
let mut control = 0;
for op in program.ops() {
match op {
Op::Const { .. } | Op::Bin { .. } | Op::Un { .. } | Op::Move { .. } => arithmetic += 1,
Op::Jump { .. } | Op::JumpUnless { .. } | Op::Return { .. } => control += 1,
}
}
println!(" {arithmetic} arithmetic op(s), {control} control-flow op(s)");
let broken = Builder::new("broken", &[], Type::Int).finish();
match compile(&broken) {
Ok(_) => println!("broken : unexpectedly compiled"),
Err(err) => println!("broken : rejected — {err}"),
}
}