From 8fd97903e7f46decb89398cf57a6dabd55e4fecf Mon Sep 17 00:00:00 2001 From: Anjali Pal Date: Mon, 27 May 2024 14:42:15 -0700 Subject: [PATCH] add ops to brillvm --- bril-rs/brillvm/Cargo.toml | 3 +- bril-rs/brillvm/src/llvm.rs | 190 ++++++++++++++++++++++++++++++++++++ 2 files changed, 192 insertions(+), 1 deletion(-) diff --git a/bril-rs/brillvm/Cargo.toml b/bril-rs/brillvm/Cargo.toml index 9416b6919..115f911f0 100644 --- a/bril-rs/brillvm/Cargo.toml +++ b/bril-rs/brillvm/Cargo.toml @@ -21,7 +21,8 @@ inkwell = { git = "https://github.com/TheDan64/inkwell.git", features = [ "llvm18-0", ], rev = "6c0fb56b3554e939f9ca61b465043d6a84fb7b95" } -bril-rs = { git = "https://github.com/uwplse/bril", features = ["float", "ssa", "memory"] } +# TODO: Remove rev when https://github.com/uwplse/bril/pull/6 merges +bril-rs = { git = "https://github.com/uwplse/bril", rev="40ec0e5803c69bc2cde794785ba6b13a4fc401fe", features = ["float", "ssa", "memory"] } # Need to set a default `main` to build `rt` bin diff --git a/bril-rs/brillvm/src/llvm.rs b/bril-rs/brillvm/src/llvm.rs index 0f7dd96ab..6106a0ed8 100644 --- a/bril-rs/brillvm/src/llvm.rs +++ b/bril-rs/brillvm/src/llvm.rs @@ -659,6 +659,131 @@ fn build_instruction<'a, 'b>( ); } + Instruction::Value { + args, + dest, + funcs: _, + labels: _, + op: ValueOps::Smax, + op_type: _, + } => { + let cmp_name = fresh.fresh_var(); + let name = fresh.fresh_var(); + build_op( + context, + builder, + heap, + fresh, + |v| { + builder.build_select( + builder.build_int_compare::( + IntPredicate::SGT, + v[0].try_into().unwrap(), + v[1].try_into().unwrap(), + &cmp_name + ).unwrap(), + v[0], + v[1], + &name + ).unwrap() + }, + args, + dest + ); + } + + Instruction::Value { + args, + dest, + funcs: _, + labels: _, + op: ValueOps::Smin, + op_type: _, + } => { + let cmp_name = fresh.fresh_var(); + let name = fresh.fresh_var(); + build_op( + context, + builder, + heap, + fresh, + |v| { + builder.build_select( + builder.build_int_compare::( + IntPredicate::SLT, + v[0].try_into().unwrap(), + v[1].try_into().unwrap(), + &cmp_name + ).unwrap(), + v[0], + v[1], + &name + ).unwrap() + }, + args, + dest + ); + } + + Instruction::Value { + args, + dest, + funcs: _, + labels: _, + op: ValueOps::Shl, + op_type: _, + } => { + let ret_name = fresh.fresh_var(); + build_op( + context, + builder, + heap, + fresh, + |v| { + builder + .build_left_shift::( + v[0].try_into().unwrap(), + v[1].try_into().unwrap(), + &ret_name + ) + .unwrap() + .into() + }, + args, + dest, + ); + } + + Instruction::Value { + args, + dest, + funcs: _, + labels: _, + op: ValueOps::Shr, + op_type: _, + } => { + let ret_name = fresh.fresh_var(); + build_op( + context, + builder, + heap, + fresh, + |v| { + builder + .build_right_shift::( + v[0].try_into().unwrap(), + v[1].try_into().unwrap(), + false, // sign extend + &ret_name + ) + .unwrap() + .into() + }, + args, + dest, + ); + } + Instruction::Value { args, dest, @@ -916,6 +1041,71 @@ fn build_instruction<'a, 'b>( dest, ); } + Instruction::Value { + args, + dest, + funcs: _, + labels: _, + op: ValueOps::Fmax, + op_type: _, + } => { + let cmp_name = fresh.fresh_var(); + let name = fresh.fresh_var(); + build_op( + context, + builder, + heap, + fresh, + |v| { + builder.build_select( + builder.build_float_compare::( + FloatPredicate::OGT, + v[0].try_into().unwrap(), + v[1].try_into().unwrap(), + &cmp_name + ).unwrap(), + v[0], + v[1], + &name + ).unwrap() + }, + args, + dest + ); + } + Instruction::Value { + args, + dest, + funcs: _, + labels: _, + op: ValueOps::Fmin, + op_type: _, + } => { + let cmp_name = fresh.fresh_var(); + let name = fresh.fresh_var(); + build_op( + context, + builder, + heap, + fresh, + |v| { + builder.build_select( + builder.build_float_compare::( + FloatPredicate::OLT, + v[0].try_into().unwrap(), + v[1].try_into().unwrap(), + &cmp_name + ).unwrap(), + v[0], + v[1], + &name + ).unwrap() + }, + args, + dest + ); + } + Instruction::Effect { args, funcs: _,