-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathfp_mul.ptxh
75 lines (72 loc) · 3.89 KB
/
fp_mul.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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// bls12_381: Arithmetic for BLS12-381
// Copyright 2022-2023 Dag Arne Osvik
// Copyright 2022-2023 Luan Cardoso dos Santos
#ifndef FP_MUL
/**
* @brief PTX macro for multiplication of two residues mod p. Z ← X*Y
* Z may NOT be the same as X or Y.
* X and Y may be the same.
*
* For inclusion directly into ptx code by the C preprocessor.
*/
#define FP_MUL(Z, X, Y) \
mul.lo.u64 Z##1, X##0, Y##1 ; mul.hi.u64 Z##2, X##0, Y##1 ; newline\
mul.lo.u64 Z##3, X##0, Y##3 ; mul.hi.u64 Z##4, X##0, Y##3 ; newline\
mul.lo.u64 Z##5, X##0, Y##5 ; mul.hi.u64 Z##6, X##0, Y##5 ; newline\
\
mul.lo.u64 Z##0, X##0, Y##0 ; mad.hi.u64.cc Z##1, X##0, Y##0, Z##1; newline\
madc.lo.u64.cc Z##2, X##0, Y##2, Z##2; madc.hi.u64.cc Z##3, X##0, Y##2, Z##3; newline\
madc.lo.u64.cc Z##4, X##0, Y##4, Z##4; madc.hi.u64.cc Z##5, X##0, Y##4, Z##5; newline\
addc.u64 Z##6, 0, Z##6; newline\
\
\
mad.lo.u64.cc Z##2, X##1, Y##1, Z##2; madc.hi.u64.cc Z##3, X##1, Y##1, Z##3; newline\
madc.lo.u64.cc Z##4, X##1, Y##3, Z##4; madc.hi.u64.cc Z##5, X##1, Y##3, Z##5; newline\
madc.lo.u64.cc Z##6, X##1, Y##5, Z##6; madc.hi.u64 Z##7, X##1, Y##5, 0; newline\
\
mad.lo.u64.cc Z##1, X##1, Y##0, Z##1; madc.hi.u64.cc Z##2, X##1, Y##0, Z##2; newline\
madc.lo.u64.cc Z##3, X##1, Y##2, Z##3; madc.hi.u64.cc Z##4, X##1, Y##2, Z##4; newline\
madc.lo.u64.cc Z##5, X##1, Y##4, Z##5; madc.hi.u64.cc Z##6, X##1, Y##4, Z##6; newline\
addc.u64 Z##7, 0, Z##7; newline\
\
\
mad.lo.u64.cc Z##3, X##2, Y##1, Z##3; madc.hi.u64.cc Z##4, X##2, Y##1, Z##4; newline\
madc.lo.u64.cc Z##5, X##2, Y##3, Z##5; madc.hi.u64.cc Z##6, X##2, Y##3, Z##6; newline\
madc.lo.u64.cc Z##7, X##2, Y##5, Z##7; madc.hi.u64 Z##8, X##2, Y##5, 0; newline\
\
mad.lo.u64.cc Z##2, X##2, Y##0, Z##2; madc.hi.u64.cc Z##3, X##2, Y##0, Z##3; newline\
madc.lo.u64.cc Z##4, X##2, Y##2, Z##4; madc.hi.u64.cc Z##5, X##2, Y##2, Z##5; newline\
madc.lo.u64.cc Z##6, X##2, Y##4, Z##6; madc.hi.u64.cc Z##7, X##2, Y##4, Z##7; newline\
addc.u64 Z##8, 0, Z##8; newline\
\
\
mad.lo.u64.cc Z##4, X##3, Y##1, Z##4; madc.hi.u64.cc Z##5, X##3, Y##1, Z##5; newline\
madc.lo.u64.cc Z##6, X##3, Y##3, Z##6; madc.hi.u64.cc Z##7, X##3, Y##3, Z##7; newline\
madc.lo.u64.cc Z##8, X##3, Y##5, Z##8; madc.hi.u64 Z##9, X##3, Y##5, 0; newline\
\
mad.lo.u64.cc Z##3, X##3, Y##0, Z##3; madc.hi.u64.cc Z##4, X##3, Y##0, Z##4; newline\
madc.lo.u64.cc Z##5, X##3, Y##2, Z##5; madc.hi.u64.cc Z##6, X##3, Y##2, Z##6; newline\
madc.lo.u64.cc Z##7, X##3, Y##4, Z##7; madc.hi.u64.cc Z##8, X##3, Y##4, Z##8; newline\
addc.u64 Z##9, 0, Z##9; newline\
\
\
mad.lo.u64.cc Z##5, X##4, Y##1, Z##5; madc.hi.u64.cc Z##6, X##4, Y##1, Z##6; newline\
madc.lo.u64.cc Z##7, X##4, Y##3, Z##7; madc.hi.u64.cc Z##8, X##4, Y##3, Z##8; newline\
madc.lo.u64.cc Z##9, X##4, Y##5, Z##9; madc.hi.u64 Z##a, X##4, Y##5, 0; newline\
\
mad.lo.u64.cc Z##4, X##4, Y##0, Z##4; madc.hi.u64.cc Z##5, X##4, Y##0, Z##5; newline\
madc.lo.u64.cc Z##6, X##4, Y##2, Z##6; madc.hi.u64.cc Z##7, X##4, Y##2, Z##7; newline\
madc.lo.u64.cc Z##8, X##4, Y##4, Z##8; madc.hi.u64.cc Z##9, X##4, Y##4, Z##9; newline\
addc.u64 Z##a, 0, Z##a; newline\
\
\
mad.lo.u64.cc Z##6, X##5, Y##1, Z##6; madc.hi.u64.cc Z##7, X##5, Y##1, Z##7; newline\
madc.lo.u64.cc Z##8, X##5, Y##3, Z##8; madc.hi.u64.cc Z##9, X##5, Y##3, Z##9; newline\
madc.lo.u64.cc Z##a, X##5, Y##5, Z##a; madc.hi.u64 Z##b, X##5, Y##5, 0; newline\
\
mad.lo.u64.cc Z##5, X##5, Y##0, Z##5; madc.hi.u64.cc Z##6, X##5, Y##0, Z##6; newline\
madc.lo.u64.cc Z##7, X##5, Y##2, Z##7; madc.hi.u64.cc Z##8, X##5, Y##2, Z##8; newline\
madc.lo.u64.cc Z##9, X##5, Y##4, Z##9; madc.hi.u64.cc Z##a, X##5, Y##4, Z##a; newline\
addc.u64 Z##b, 0, Z##b
#endif
// vim: ts=4 et sw=4 si