Skip to content

Commit

Permalink
feat: prefer AcirContext-native methods for performing logic operat…
Browse files Browse the repository at this point in the history
…ions (#3898)

# Description

## Problem\*

Resolves <!-- Link to GitHub Issue -->

## Summary\*

This PR remove some duplicate implementations or too-low-level calls to
logic operations in `AcirContext`.

## Additional Context



## Documentation\*

Check one:
- [x] No documentation needed.
- [ ] Documentation included in this PR.
- [ ] **[Exceptional Case]** Documentation to be submitted in a separate
PR.

# PR Checklist\*

- [x] I have tested the changes locally.
- [x] I have formatted the changes with [Prettier](https://prettier.io/)
and/or `cargo fmt` on default settings.
  • Loading branch information
TomAFrench committed Dec 21, 2023
1 parent 926460a commit 0ec39b8
Showing 1 changed file with 16 additions and 9 deletions.
25 changes: 16 additions & 9 deletions compiler/noirc_evaluator/src/ssa/acir_gen/acir_ir/acir_variable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -383,9 +383,19 @@ impl AcirContext {
return Ok(lhs);
}

let inputs = vec![AcirValue::Var(lhs, typ.clone()), AcirValue::Var(rhs, typ)];
let outputs = self.black_box_function(BlackBoxFunc::XOR, inputs, 1)?;
Ok(outputs[0])
let bit_size = typ.bit_size();
if bit_size == 1 {
// Operands are booleans.
//
// a ^ b == a + b - 2*a*b
let sum = self.add_var(lhs, rhs)?;
let prod = self.mul_var(lhs, rhs)?;
self.add_mul_var(sum, -FieldElement::from(2_i128), prod)
} else {
let inputs = vec![AcirValue::Var(lhs, typ.clone()), AcirValue::Var(rhs, typ)];
let outputs = self.black_box_function(BlackBoxFunc::XOR, inputs, 1)?;
Ok(outputs[0])
}
}

/// Returns an `AcirVar` that is the AND result of `lhs` & `rhs`.
Expand Down Expand Up @@ -450,9 +460,8 @@ impl AcirContext {
let max = self.add_constant((1_u128 << bit_size) - 1);
let a = self.sub_var(max, lhs)?;
let b = self.sub_var(max, rhs)?;
let inputs = vec![AcirValue::Var(a, typ.clone()), AcirValue::Var(b, typ)];
let outputs = self.black_box_function(BlackBoxFunc::AND, inputs, 1)?;
self.sub_var(max, outputs[0])
let a_and_b = self.and_var(a, b, typ)?;
self.sub_var(max, a_and_b)
}
}

Expand Down Expand Up @@ -889,9 +898,7 @@ impl AcirContext {

// Unsigned to signed: derive q and r from q1,r1 and the signs of lhs and rhs
// Quotient sign is lhs sign * rhs sign, whose resulting sign bit is the XOR of the sign bits
let sign_sum = self.add_var(lhs_leading, rhs_leading)?;
let sign_prod = self.mul_var(lhs_leading, rhs_leading)?;
let q_sign = self.add_mul_var(sign_sum, -FieldElement::from(2_i128), sign_prod)?;
let q_sign = self.xor_var(lhs_leading, rhs_leading, AcirType::unsigned(1))?;

let quotient = self.two_complement(q1, q_sign, bit_size)?;
let remainder = self.two_complement(r1, lhs_leading, bit_size)?;
Expand Down

0 comments on commit 0ec39b8

Please sign in to comment.