Skip to content

Commit

Permalink
feat: Signed integer comparisons
Browse files Browse the repository at this point in the history
  • Loading branch information
sirasistant committed Mar 19, 2024
1 parent 5cd6cf3 commit 10f7934
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -1306,7 +1306,14 @@ impl<'block> BrilligBlock<'block> {
BinaryOp::Sub => BrilligBinaryOp::Sub,
BinaryOp::Mul => BrilligBinaryOp::Mul,
BinaryOp::Eq => BrilligBinaryOp::Equals,
BinaryOp::Lt => BrilligBinaryOp::LessThan,
BinaryOp::Lt => {
if is_signed {
self.convert_signed_less_than(left, right, result_variable);
return;
} else {
BrilligBinaryOp::LessThan
}
}
BinaryOp::And => BrilligBinaryOp::And,
BinaryOp::Or => BrilligBinaryOp::Or,
BinaryOp::Xor => BrilligBinaryOp::Xor,
Expand Down Expand Up @@ -1434,6 +1441,36 @@ impl<'block> BrilligBlock<'block> {
self.brillig_context.deallocate_single_addr(scratch_var_j);
}

fn convert_signed_less_than(
&mut self,
left: SingleAddrVariable,
right: SingleAddrVariable,
result: SingleAddrVariable,
) {
let biased_left =
SingleAddrVariable::new(self.brillig_context.allocate_register(), left.bit_size);
let biased_right =
SingleAddrVariable::new(self.brillig_context.allocate_register(), right.bit_size);

let bias = self
.brillig_context
.make_constant_instruction((1_u128 << (left.bit_size - 1)).into(), left.bit_size);

self.brillig_context.binary_instruction(left, bias, biased_left, BrilligBinaryOp::Add);
self.brillig_context.binary_instruction(right, bias, biased_right, BrilligBinaryOp::Add);

self.brillig_context.binary_instruction(
biased_left,
biased_right,
result,
BrilligBinaryOp::LessThan,
);

self.brillig_context.deallocate_single_addr(biased_left);
self.brillig_context.deallocate_single_addr(biased_right);
self.brillig_context.deallocate_single_addr(bias);
}

fn add_overflow_check(
&mut self,
binary_operation: BrilligBinaryOp,
Expand Down
6 changes: 6 additions & 0 deletions test_programs/execution_success/brillig_signed_cmp/Nargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
[package]
name = "brillig_signed_cmp"
type = "bin"
authors = [""]

[dependencies]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
minus_one = 255
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
unconstrained fn main(minus_one: i8) {
assert(minus_one < 0);
assert(0 < minus_one as u8);
assert(0 > minus_one);
let most_negative_number = minus_one * 127 - 1;
assert(most_negative_number < 0);
assert(127 > most_negative_number);
}

0 comments on commit 10f7934

Please sign in to comment.