Add a bunch of operations to lib
This commit is contained in:
parent
f0f828d1eb
commit
feac7163f2
@ -355,8 +355,17 @@ impl Builder {
|
||||
Instr::Param(_) => Ok(()),
|
||||
Instr::Constant(_) => Ok(()),
|
||||
Instr::Add(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()),
|
||||
Instr::FAdd(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()),
|
||||
Instr::Sub(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()),
|
||||
Instr::Mult(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()),
|
||||
Instr::FSub(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()),
|
||||
Instr::Mul(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()),
|
||||
Instr::FMul(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()),
|
||||
Instr::UDiv(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()),
|
||||
Instr::SDiv(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()),
|
||||
Instr::FDiv(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()),
|
||||
Instr::URem(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()),
|
||||
Instr::SRem(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()),
|
||||
Instr::FRem(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()),
|
||||
Instr::And(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()),
|
||||
Instr::ICmp(_, lhs, rhs) => {
|
||||
let t = match_types(&lhs, &rhs, self)?;
|
||||
|
@ -754,16 +754,62 @@ impl InstructionHolder {
|
||||
let rhs_val = module.values.get(&rhs).unwrap().value_ref;
|
||||
LLVMBuildAdd(module.builder_ref, lhs_val, rhs_val, name.as_ptr())
|
||||
}
|
||||
FAdd(lhs, rhs) => {
|
||||
let lhs_val = module.values.get(&lhs).unwrap().value_ref;
|
||||
let rhs_val = module.values.get(&rhs).unwrap().value_ref;
|
||||
LLVMBuildFAdd(module.builder_ref, lhs_val, rhs_val, name.as_ptr())
|
||||
}
|
||||
Sub(lhs, rhs) => {
|
||||
let lhs_val = module.values.get(&lhs).unwrap().value_ref;
|
||||
let rhs_val = module.values.get(&rhs).unwrap().value_ref;
|
||||
LLVMBuildSub(module.builder_ref, lhs_val, rhs_val, name.as_ptr())
|
||||
}
|
||||
Mult(lhs, rhs) => {
|
||||
FSub(lhs, rhs) => {
|
||||
let lhs_val = module.values.get(&lhs).unwrap().value_ref;
|
||||
let rhs_val = module.values.get(&rhs).unwrap().value_ref;
|
||||
LLVMBuildFSub(module.builder_ref, lhs_val, rhs_val, name.as_ptr())
|
||||
}
|
||||
Mul(lhs, rhs) => {
|
||||
let lhs_val = module.values.get(&lhs).unwrap().value_ref;
|
||||
let rhs_val = module.values.get(&rhs).unwrap().value_ref;
|
||||
LLVMBuildMul(module.builder_ref, lhs_val, rhs_val, name.as_ptr())
|
||||
}
|
||||
|
||||
FMul(lhs, rhs) => {
|
||||
let lhs_val = module.values.get(&lhs).unwrap().value_ref;
|
||||
let rhs_val = module.values.get(&rhs).unwrap().value_ref;
|
||||
LLVMBuildFMul(module.builder_ref, lhs_val, rhs_val, name.as_ptr())
|
||||
}
|
||||
UDiv(lhs, rhs) => {
|
||||
let lhs_val = module.values.get(&lhs).unwrap().value_ref;
|
||||
let rhs_val = module.values.get(&rhs).unwrap().value_ref;
|
||||
LLVMBuildUDiv(module.builder_ref, lhs_val, rhs_val, name.as_ptr())
|
||||
}
|
||||
SDiv(lhs, rhs) => {
|
||||
let lhs_val = module.values.get(&lhs).unwrap().value_ref;
|
||||
let rhs_val = module.values.get(&rhs).unwrap().value_ref;
|
||||
LLVMBuildSDiv(module.builder_ref, lhs_val, rhs_val, name.as_ptr())
|
||||
}
|
||||
FDiv(lhs, rhs) => {
|
||||
let lhs_val = module.values.get(&lhs).unwrap().value_ref;
|
||||
let rhs_val = module.values.get(&rhs).unwrap().value_ref;
|
||||
LLVMBuildFDiv(module.builder_ref, lhs_val, rhs_val, name.as_ptr())
|
||||
}
|
||||
URem(lhs, rhs) => {
|
||||
let lhs_val = module.values.get(&lhs).unwrap().value_ref;
|
||||
let rhs_val = module.values.get(&rhs).unwrap().value_ref;
|
||||
LLVMBuildURem(module.builder_ref, lhs_val, rhs_val, name.as_ptr())
|
||||
}
|
||||
SRem(lhs, rhs) => {
|
||||
let lhs_val = module.values.get(&lhs).unwrap().value_ref;
|
||||
let rhs_val = module.values.get(&rhs).unwrap().value_ref;
|
||||
LLVMBuildSRem(module.builder_ref, lhs_val, rhs_val, name.as_ptr())
|
||||
}
|
||||
FRem(lhs, rhs) => {
|
||||
let lhs_val = module.values.get(&lhs).unwrap().value_ref;
|
||||
let rhs_val = module.values.get(&rhs).unwrap().value_ref;
|
||||
LLVMBuildFRem(module.builder_ref, lhs_val, rhs_val, name.as_ptr())
|
||||
}
|
||||
And(lhs, rhs) => {
|
||||
let lhs_val = module.values.get(&lhs).unwrap().value_ref;
|
||||
let rhs_val = module.values.get(&rhs).unwrap().value_ref;
|
||||
|
@ -303,8 +303,17 @@ impl Debug for Instr {
|
||||
Instr::Param(nth) => fmt_call(f, &"Param", &nth),
|
||||
Instr::Constant(c) => c.fmt(f),
|
||||
Instr::Add(lhs, rhs) => fmt_binop(f, lhs, &"+", rhs),
|
||||
Instr::FAdd(lhs, rhs) => fmt_binop(f, lhs, &"+", rhs),
|
||||
Instr::Sub(lhs, rhs) => fmt_binop(f, lhs, &"-", rhs),
|
||||
Instr::Mult(lhs, rhs) => fmt_binop(f, lhs, &"*", rhs),
|
||||
Instr::FSub(lhs, rhs) => fmt_binop(f, lhs, &"-", rhs),
|
||||
Instr::Mul(lhs, rhs) => fmt_binop(f, lhs, &"*", rhs),
|
||||
Instr::FMul(lhs, rhs) => fmt_binop(f, lhs, &"*", rhs),
|
||||
Instr::UDiv(lhs, rhs) => fmt_binop(f, lhs, &"/", rhs),
|
||||
Instr::SDiv(lhs, rhs) => fmt_binop(f, lhs, &"/", rhs),
|
||||
Instr::FDiv(lhs, rhs) => fmt_binop(f, lhs, &"/", rhs),
|
||||
Instr::URem(lhs, rhs) => fmt_binop(f, lhs, &"%", rhs),
|
||||
Instr::SRem(lhs, rhs) => fmt_binop(f, lhs, &"%", rhs),
|
||||
Instr::FRem(lhs, rhs) => fmt_binop(f, lhs, &"%", rhs),
|
||||
Instr::And(lhs, rhs) => fmt_binop(f, lhs, &"&&", rhs),
|
||||
Instr::Phi(val) => fmt_call(f, &"Phi", &val),
|
||||
Instr::ICmp(cmp, lhs, rhs) => fmt_binop(f, lhs, cmp, rhs),
|
||||
|
@ -312,9 +312,30 @@ pub enum Instr {
|
||||
Param(usize),
|
||||
Constant(ConstValue),
|
||||
|
||||
/// Add two integers
|
||||
Add(InstructionValue, InstructionValue),
|
||||
/// Add two floats
|
||||
FAdd(InstructionValue, InstructionValue),
|
||||
/// Subtract two integers
|
||||
Sub(InstructionValue, InstructionValue),
|
||||
Mult(InstructionValue, InstructionValue),
|
||||
/// Subtract two floats
|
||||
FSub(InstructionValue, InstructionValue),
|
||||
/// Multiply two integers
|
||||
Mul(InstructionValue, InstructionValue),
|
||||
/// Multiply two floats
|
||||
FMul(InstructionValue, InstructionValue),
|
||||
/// Divide two unsigned integers
|
||||
UDiv(InstructionValue, InstructionValue),
|
||||
/// Divide two signed integers
|
||||
SDiv(InstructionValue, InstructionValue),
|
||||
/// Divide two floats
|
||||
FDiv(InstructionValue, InstructionValue),
|
||||
/// Get the remainder from two unsigned integers
|
||||
URem(InstructionValue, InstructionValue),
|
||||
/// Get the remainder from two signed integers
|
||||
SRem(InstructionValue, InstructionValue),
|
||||
/// Get the remainder from two floats
|
||||
FRem(InstructionValue, InstructionValue),
|
||||
And(InstructionValue, InstructionValue),
|
||||
Phi(Vec<InstructionValue>),
|
||||
|
||||
@ -416,8 +437,17 @@ impl InstructionValue {
|
||||
.ok_or(()),
|
||||
Constant(c) => Ok(c.get_type()),
|
||||
Add(lhs, rhs) => match_types(lhs, rhs, &builder),
|
||||
FAdd(lhs, rhs) => match_types(lhs, rhs, &builder),
|
||||
Sub(lhs, rhs) => match_types(lhs, rhs, &builder),
|
||||
Mult(lhs, rhs) => match_types(lhs, rhs, &builder),
|
||||
FSub(lhs, rhs) => match_types(lhs, rhs, &builder),
|
||||
Mul(lhs, rhs) => match_types(lhs, rhs, &builder),
|
||||
FMul(lhs, rhs) => match_types(lhs, rhs, &builder),
|
||||
UDiv(lhs, rhs) => match_types(lhs, rhs, &builder),
|
||||
SDiv(lhs, rhs) => match_types(lhs, rhs, &builder),
|
||||
FDiv(lhs, rhs) => match_types(lhs, rhs, &builder),
|
||||
URem(lhs, rhs) => match_types(lhs, rhs, &builder),
|
||||
SRem(lhs, rhs) => match_types(lhs, rhs, &builder),
|
||||
FRem(lhs, rhs) => match_types(lhs, rhs, &builder),
|
||||
And(lhs, rhs) => match_types(lhs, rhs, &builder),
|
||||
ICmp(_, _, _) => Ok(Type::Bool),
|
||||
FunctionCall(function_value, _) => Ok(builder.function_data(function_value).ret),
|
||||
|
@ -641,7 +641,7 @@ impl mir::Expression {
|
||||
scope.block.build("sub", Instr::Sub(lhs, rhs)).unwrap()
|
||||
}
|
||||
mir::BinaryOperator::Mult => {
|
||||
scope.block.build("mul", Instr::Mult(lhs, rhs)).unwrap()
|
||||
scope.block.build("mul", Instr::Mul(lhs, rhs)).unwrap()
|
||||
}
|
||||
mir::BinaryOperator::And => {
|
||||
scope.block.build("and", Instr::And(lhs, rhs)).unwrap()
|
||||
|
Loading…
Reference in New Issue
Block a user