ecp: use loops in mbedtls_ecp_mod_p{192,256,384}_raw()

On principle:
- If the code is written with a loop, the compiler can easily unroll the
  loop at high optimisation levels; if we unroll the loop in the source,
  the compiler is unlikely to roll it up at -Os/-Oz. So loops are more
  adaptable.
- All the other functions are using loops, and there's nothing special
  about those functions that would justify a different treatement.

Signed-off-by: Manuel Pégourié-Gonnard <manuel.pegourie-gonnard@arm.com>
This commit is contained in:
Manuel Pégourié-Gonnard 2026-04-17 08:53:37 +02:00
parent 48e255f31b
commit 42eac21181

View File

@ -4960,23 +4960,15 @@ int mbedtls_ecp_mod_p192_raw(mbedtls_mpi_uint *Np, size_t Nn)
ADD(3); ADD(4); ADD(5); NEXT; // A1 += A3 + A4 + A5
ADD(4); ADD(5); // A2 += A4 + A5
RESET;
/* Use the reduction for the carry as well:
* 2^192 * last_carry = 2^64 * last_carry + last_carry mod P192
* It can generate a carry. */
ADD_LAST; NEXT; // A0 += last_carry
ADD_LAST; NEXT; // A1 += last_carry
// A2 += carry
* 2^192 * last_carry = 2^64 * last_carry + last_carry mod P192 */
for (size_t round = 0; round < 2; ++round) {
RESET;
RESET;
/* Use the reduction for the carry as well:
* 2^192 * last_carry = 2^64 * last_carry + last_carry mod P192
*/
ADD_LAST; NEXT; // A0 += last_carry
ADD_LAST; NEXT; // A1 += last_carry
// A2 += carry
ADD_LAST; NEXT; // A0 += last_carry
ADD_LAST; NEXT; // A1 += last_carry
// A2 += carry
}
LAST;
@ -5190,31 +5182,21 @@ int mbedtls_ecp_mod_p256_raw(mbedtls_mpi_uint *X, size_t X_limbs)
ADD(15); ADD(15); ADD(15); ADD(8);
SUB(10); SUB(11); SUB(12); SUB(13); // A7
RESET;
/* Use 2^224 * (2^32 - 1) + 2^192 + 2^96 - 1
* to modulo reduce the final carry. */
ADD_LAST; NEXT; // A0
; NEXT; // A1
; NEXT; // A2
SUB_LAST; NEXT; // A3
; NEXT; // A4
; NEXT; // A5
SUB_LAST; NEXT; // A6
ADD_LAST; // A7
for (size_t round = 0; round < 2; ++round) {
RESET;
RESET;
/* Use 2^224 * (2^32 - 1) + 2^192 + 2^96 - 1
* to modulo reduce the carry generated by the previous reduction. */
ADD_LAST; NEXT; // A0
; NEXT; // A1
; NEXT; // A2
SUB_LAST; NEXT; // A3
; NEXT; // A4
; NEXT; // A5
SUB_LAST; NEXT; // A6
ADD_LAST; // A7
/* Use 2^224 * (2^32 - 1) + 2^192 + 2^96 - 1
* to modulo reduce the final carry. */
ADD_LAST; NEXT; // A0
; NEXT; // A1
; NEXT; // A2
SUB_LAST; NEXT; // A3
; NEXT; // A4
; NEXT; // A5
SUB_LAST; NEXT; // A6
ADD_LAST; // A7
}
LAST;
@ -5282,36 +5264,23 @@ int mbedtls_ecp_mod_p384_raw(mbedtls_mpi_uint *X, size_t X_limbs)
ADD(23); ADD(20); ADD(19);
SUB(22); // A11
RESET;
for (size_t round = 0; round < 2; ++round) {
RESET;
/* Use 2^384 = P + 2^128 + 2^96 - 2^32 + 1 to modulo reduce the final carry */
ADD_LAST; NEXT; // A0
SUB_LAST; NEXT; // A1
; NEXT; // A2
ADD_LAST; NEXT; // A3
ADD_LAST; NEXT; // A4
; NEXT; // A5
; NEXT; // A6
; NEXT; // A7
; NEXT; // A8
; NEXT; // A9
; NEXT; // A10
// A11
RESET;
ADD_LAST; NEXT; // A0
SUB_LAST; NEXT; // A1
; NEXT; // A2
ADD_LAST; NEXT; // A3
ADD_LAST; NEXT; // A4
; NEXT; // A5
; NEXT; // A6
; NEXT; // A7
; NEXT; // A8
; NEXT; // A9
; NEXT; // A10
/* Use 2^384 = P + 2^128 + 2^96 - 2^32 + 1 to modulo reduce the final carry */
ADD_LAST; NEXT; // A0
SUB_LAST; NEXT; // A1
; NEXT; // A2
ADD_LAST; NEXT; // A3
ADD_LAST; NEXT; // A4
; NEXT; // A5
; NEXT; // A6
; NEXT; // A7
; NEXT; // A8
; NEXT; // A9
; NEXT; // A10
// A11
}
LAST;