-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathfp_sqr.ptxh
55 lines (52 loc) · 2.71 KB
/
fp_sqr.ptxh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// bls12_381: Arithmetic for BLS12-381
// Copyright 2022-2023 Dag Arne Osvik
// Copyright 2022-2023 Luan Cardoso dos Santos
#ifndef FP_SQR
/**
* @brief PTX macro for computing the square of the residue x modulo p. Z ← X*X
* Z and X may NOT be the same.
*
* For inclusion directly into ptx code by the C preprocessor.
*/
#define FP_SQR(Z, X) \
\
mul.lo.u64 Z##5, X##0, X##5 ; mul.hi.u64 Z##6, X##0, X##5 ; newline\
\
mul.lo.u64 Z##4, X##0, X##4 ; mad.hi.u64.cc Z##5, X##0, X##4, Z##5; newline\
madc.lo.u64.cc Z##6, X##1, X##5, Z##6; madc.hi.u64 Z##7, X##1, X##5, 0; newline\
\
mul.lo.u64 Z##3, X##0, X##3 ; mad.hi.u64.cc Z##4, X##0, X##3, Z##4; newline\
madc.lo.u64.cc Z##5, X##1, X##4, Z##5; madc.hi.u64.cc Z##6, X##1, X##4, Z##6; newline\
madc.lo.u64.cc Z##7, X##2, X##5, Z##7; madc.hi.u64 Z##8, X##2, X##5, 0; newline\
\
mul.lo.u64 Z##2, X##0, X##2 ; mad.hi.u64.cc Z##3, X##0, X##2, Z##3; newline\
madc.lo.u64.cc Z##4, X##1, X##3, Z##4; madc.hi.u64.cc Z##5, X##1, X##3, Z##5; newline\
madc.lo.u64.cc Z##6, X##2, X##4, Z##6; madc.hi.u64.cc Z##7, X##2, X##4, Z##7; newline\
madc.lo.u64.cc Z##8, X##3, X##5, Z##8; madc.hi.u64 Z##9, X##3, X##5, 0; newline\
\
mul.lo.u64 Z##1, X##0, X##1 ; mad.hi.u64.cc Z##2, X##0, X##1, Z##2; newline\
madc.lo.u64.cc Z##3, X##1, X##2, Z##3; madc.hi.u64.cc Z##4, X##1, X##2, Z##4; newline\
madc.lo.u64.cc Z##5, X##2, X##3, Z##5; madc.hi.u64.cc Z##6, X##2, X##3, Z##6; newline\
madc.lo.u64.cc Z##7, X##3, X##4, Z##7; madc.hi.u64.cc Z##8, X##3, X##4, Z##8; newline\
madc.lo.u64.cc Z##9, X##4, X##5, Z##9; madc.hi.u64 Z##a, X##4, X##5, 0; newline\
\
add.u64.cc Z##1, Z##1, Z##1; newline\
addc.u64.cc Z##2, Z##2, Z##2; newline\
addc.u64.cc Z##3, Z##3, Z##3; newline\
addc.u64.cc Z##4, Z##4, Z##4; newline\
addc.u64.cc Z##5, Z##5, Z##5; newline\
addc.u64.cc Z##6, Z##6, Z##6; newline\
addc.u64.cc Z##7, Z##7, Z##7; newline\
addc.u64.cc Z##8, Z##8, Z##8; newline\
addc.u64.cc Z##9, Z##9, Z##9; newline\
addc.u64.cc Z##a, Z##a, Z##a; newline\
addc.u64 Z##b, 0, 0; newline\
\
mul.lo.u64 Z##0, X##0, X##0 ; mad.hi.u64.cc Z##1, X##0, X##0, Z##1; newline\
madc.lo.u64.cc Z##2, X##1, X##1, Z##2; madc.hi.u64.cc Z##3, X##1, X##1, Z##3; newline\
madc.lo.u64.cc Z##4, X##2, X##2, Z##4; madc.hi.u64.cc Z##5, X##2, X##2, Z##5; newline\
madc.lo.u64.cc Z##6, X##3, X##3, Z##6; madc.hi.u64.cc Z##7, X##3, X##3, Z##7; newline\
madc.lo.u64.cc Z##8, X##4, X##4, Z##8; madc.hi.u64.cc Z##9, X##4, X##4, Z##9; newline\
madc.lo.u64.cc Z##a, X##5, X##5, Z##a; madc.hi.u64 Z##b, X##5, X##5, Z##b
#endif
// vim: ts=4 et sw=4 si