Skip to content

Commit 1c15647

Browse files
committed
Only require the elements actually needed
1 parent 4c5e3fd commit 1c15647

File tree

1 file changed

+19
-22
lines changed

1 file changed

+19
-22
lines changed

std/machines/hash/keccakf32_memory.asm

+19-22
Original file line numberDiff line numberDiff line change
@@ -592,22 +592,19 @@ machine Keccakf32Memory(mem: Memory) with
592592
// }
593593
// }
594594

595-
let query_c: int, int, int, fe[] -> int = query |x, limb, bit_in_limb, a|
596-
utils::fold(
597-
5,
598-
|y| (int(a[y * 10 + x * 2 + limb]) >> bit_in_limb) & 0x1,
599-
0,
600-
|acc, e| acc ^ e
601-
);
602-
603595
query |row| {
604596
let _ = array::map_enumerated(c, |i, c_i| {
605597
let x = i / 64;
606598
let z = i % 64;
607599
let limb = z / 32;
608600
let bit_in_limb = z % 32;
609601

610-
compute_from(c_i, row, a, |a| fe(query_c(x, limb, bit_in_limb, a)))
602+
let a_elems = array::new(5, |y| a[y * 10 + x * 2 + limb]);
603+
604+
compute_from(
605+
c_i, row, a_elems,
606+
|a_elems_fe| fe(utils::fold(
607+
5, |y| (int(a_elems_fe[y]) >> bit_in_limb) & 0x1, 0, |acc, e| acc ^ e)))
611608
});
612609
};
613610

@@ -622,17 +619,18 @@ machine Keccakf32Memory(mem: Memory) with
622619
// }
623620
// }
624621

625-
let query_c_prime: int, int, fe[] -> int = query |x, z, c|
626-
int(c[x * 64 + z]) ^
627-
int(c[((x + 4) % 5) * 64 + z]) ^
628-
int(c[((x + 1) % 5) * 64 + (z + 63) % 64]);
629-
630622
query |row| {
631623
let _ = array::map_enumerated(c_prime, |i, c_i| {
632624
let x = i / 64;
633625
let z = i % 64;
634626

635-
compute_from(c_i, row, c, |c| fe(query_c_prime(x, z, c)));
627+
let c_elems = [
628+
c[x * 64 + z],
629+
c[((x + 4) % 5) * 64 + z],
630+
c[((x + 1) % 5) * 64 + (z + 63) % 64]
631+
];
632+
633+
compute_from(c_i, row, c_elems, |c_elems_fe| fe(int(c_elems_fe[0]) ^ int(c_elems_fe[1]) ^ int(c_elems_fe[2])));
636634
});
637635
};
638636

@@ -717,6 +715,7 @@ machine Keccakf32Memory(mem: Memory) with
717715
let x = (i / 2) % 5;
718716
let limb = i % 2;
719717

718+
// Seems to be faster to require all 5 * 5 * 64 elements of a_prime
720719
compute_from(a_i, row, a_prime, |a_prime| fe(query_a_prime_prime(x, y, limb, a_prime)));
721720
});
722721
};
@@ -759,18 +758,16 @@ machine Keccakf32Memory(mem: Memory) with
759758
// F::from_canonical_u16(row.a_prime_prime[0][0][limb].as_canonical_u64() as u16 ^ rc_lo);
760759
// }
761760

762-
let query_a_prime_prime_prime_0_0_limbs: int, int, fe[] -> int = query |round, limb, a_prime_prime|
763-
int(a_prime_prime[limb]) ^
764-
((RC[round] >> (limb * 32)) & 0xffffffff);
765-
766761
query |row| {
767762
let _ = array::new(2, |limb| {
763+
let a_prime_prime_elem = a_prime_prime[limb];
764+
768765
compute_from(
769766
a_prime_prime_prime_0_0_limbs[limb],
770767
row,
771-
a_prime_prime,
772-
|a_prime_prime| fe(query_a_prime_prime_prime_0_0_limbs(row % NUM_ROUNDS, limb, a_prime_prime)
773-
));
768+
[a_prime_prime_elem],
769+
|inputs| fe(int(inputs[0]) ^ ((RC[row % NUM_ROUNDS] >> (limb * 32)) & 0xffffffff))
770+
);
774771
});
775772
};
776773
}

0 commit comments

Comments
 (0)