| // Generated from Bedrock code in Fiat Cryptography. Avoid editing directly. |
| |
| static inline br_word_t shrd(br_word_t lo, br_word_t hi, br_word_t n) { |
| br_word_t res; |
| res = lo>>(n&(sizeof(br_word_t)*8-1)); |
| if (n) { |
| res = (hi<<((((((0u-(br_word_t)1)>>27)&63)+1)-n)&(sizeof(br_word_t)*8-1)))|res; |
| } else { |
| /*skip*/ |
| } |
| return res; |
| } |
| |
| static inline void p256_coord_add(br_word_t p_out, br_word_t p_x, br_word_t p_y) { |
| br_word_t r4, carry, t0, t1, t2, borrow, t3, r0, r1, r2, r3; |
| carry = br_full_add(_br_load(p_x), _br_load(p_y), (br_word_t)0, &t0); |
| carry = br_full_add(_br_load(p_x+8), _br_load(p_y+8), carry, &t1); |
| carry = br_full_add(_br_load((p_x+8)+8), _br_load((p_y+8)+8), carry, &t2); |
| carry = br_full_add(_br_load(((p_x+8)+8)+8), _br_load(((p_y+8)+8)+8), carry, &t3); |
| borrow = br_full_sub(t0, (br_word_t)0xffffffffffffffff, (br_word_t)0, &r0); |
| borrow = br_full_sub(t1, (br_word_t)0xffffffff, borrow, &r1); |
| borrow = br_full_sub(t2, (br_word_t)0, borrow, &r2); |
| borrow = br_full_sub(t3, (br_word_t)0xffffffff00000001, borrow, &r3); |
| borrow = br_full_sub(carry, (br_word_t)0, borrow, &r4); |
| r0 = br_cmov(borrow, t0, r0); |
| r1 = br_cmov(borrow, t1, r1); |
| r2 = br_cmov(borrow, t2, r2); |
| r3 = br_cmov(borrow, t3, r3); |
| _br_store(p_out, r0); |
| _br_store(p_out+8, r1); |
| _br_store((p_out+8)+8, r2); |
| _br_store(((p_out+8)+8)+8, r3); |
| } |
| |
| static inline void p256_coord_sub(br_word_t out, br_word_t x, br_word_t y) { |
| br_word_t borrow, t0, t1, t2, t3, mask, carry, r0, r1, r2, r3; |
| borrow = br_full_sub(_br_load(x), _br_load(y), (br_word_t)0, &t0); |
| borrow = br_full_sub(_br_load(x+8), _br_load(y+8), borrow, &t1); |
| borrow = br_full_sub(_br_load((x+8)+8), _br_load((y+8)+8), borrow, &t2); |
| borrow = br_full_sub(_br_load(((x+8)+8)+8), _br_load(((y+8)+8)+8), borrow, &t3); |
| mask = br_value_barrier(0u-borrow); |
| carry = br_full_add(t0, mask, (br_word_t)0, &r0); |
| carry = br_full_add(t1, mask&0xffffffff, carry, &r1); |
| carry = br_full_add(t2, (br_word_t)0, carry, &r2); |
| carry = br_full_add(t3, mask&0xffffffff00000001, carry, &r3); |
| _br_store(out, r0); |
| _br_store(out+8, r1); |
| _br_store((out+8)+8, r2); |
| _br_store(((out+8)+8)+8, r3); |
| } |
| |
| static inline br_word_t p256_coord_nonzero(br_word_t p_x) { |
| br_word_t nz; |
| nz = br_broadcast_nonzero((((_br_load(p_x))|(_br_load(p_x+8)))|(_br_load((p_x+8)+8)))|(_br_load(((p_x+8)+8)+8))); |
| return nz; |
| } |
| |
| static inline void u256_shr(br_word_t p_out, br_word_t p_x, br_word_t n) { |
| br_word_t x0, x1, x2, x3, y0, y1, y2, y3; |
| x0 = _br_load(p_x); |
| x1 = _br_load(p_x+8); |
| x2 = _br_load((p_x+8)+8); |
| x3 = _br_load(((p_x+8)+8)+8); |
| y0 = shrd(x0, x1, n); |
| y1 = shrd(x1, x2, n); |
| y2 = shrd(x2, x3, n); |
| y3 = x3>>(n&(sizeof(br_word_t)*8-1)); |
| _br_store(p_out, y0); |
| _br_store(p_out+8, y1); |
| _br_store((p_out+8)+8, y2); |
| _br_store(((p_out+8)+8)+8, y3); |
| } |
| |
| static inline void u256_set_p256_minushalf_conditional(br_word_t p_out, br_word_t mask) { |
| br_word_t mh0, mh1, mh2, mh3; |
| mh0 = 0u-(br_word_t)1; |
| mh1 = mh0>>((br_word_t)33&(sizeof(br_word_t)*8-1)); |
| mh2 = mh0<<((br_word_t)63&(sizeof(br_word_t)*8-1)); |
| mh3 = (mh0<<((br_word_t)32&(sizeof(br_word_t)*8-1)))>>1; |
| _br_store(p_out, mask&mh0); |
| _br_store(p_out+8, mask&mh1); |
| _br_store((p_out+8)+8, mask&mh2); |
| _br_store(((p_out+8)+8)+8, mask&mh3); |
| } |