FK20 CUDA
fr_neg.cu
Go to the documentation of this file.
1 // bls12_381: Arithmetic for BLS12-381
2 // Copyright 2022-2023 Dag Arne Osvik
3 // Copyright 2022-2023 Luan Cardoso dos Santos
4 
5 #include "fr.cuh"
6 
15 __device__ void fr_neg(fr_t &z) {
16  uint64_t
17  z0 = z[0],
18  z1 = z[1],
19  z2 = z[2],
20  z3 = z[3];
21 
22  asm volatile (
23  "\n\t{"
24  "\n\t.reg .u32 cf;"
25  "\n\t.reg .pred bp;"
26 
27  // z = rmmu0 - z
28 
29  "\n\tsub.u64.cc %0, 0xFFFFFFFE00000002U, %0;"
30  "\n\tsubc.u64.cc %1, 0xA77B4805FFFCB7FDU, %1;"
31  "\n\tsubc.u64.cc %2, 0x6673B0101343B00AU, %2;"
32  "\n\tsubc.u64.cc %3, 0xE7DB4EA6533AFA90U, %3;"
33  "\n\tsubc.u32 cf, 0, 0;" // store carry flag in u32
34  "\n\tsetp.hi.u32 bp, cf, 0;" // store carry flag in borrow predicate
35 
36  // if borrow then z += r
37 
38  "\n@bp\tadd.u64.cc %0, %0, 0xFFFFFFFF00000001U;"
39  "\n@bp\taddc.u64.cc %1, %1, 0x53BDA402FFFE5BFEU;"
40  "\n@bp\taddc.u64.cc %2, %2, 0x3339D80809A1D805U;"
41  "\n@bp\taddc.u64 %3, %3, 0x73EDA753299D7D48U;"
42 
43  "\n\t}"
44  :
45  "+l"(z0), "+l"(z1), "+l"(z2), "+l"(z3)
46  );
47 
48  z[0] = z0, z[1] = z1, z[2] = z2, z[3] = z3;
49 }
50 
51 // vim: ts=4 et sw=4 si
uint64_t fr_t[4]
Subgroup element stored as a 256-bit array (a 4-element little-endian array of uint64_t)....
Definition: fr.cuh:24
__device__ void fr_neg(fr_t &z)
Compute an additive inverse of a residue x modulo r. Stores in x. Subtracts x from the highest multip...
Definition: fr_neg.cu:15