FK20 CUDA
All Data Structures Namespaces Files Functions Variables Typedefs Macros
fp_x12.cuh
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 #ifndef FP_X12
10 #define FP_X12(Z, X) \
11  /* t = x + x */ \
12  \
13  "\n\tadd.u64.cc t0, "#X"0, "#X"0;" \
14  "\n\taddc.u64.cc t1, "#X"1, "#X"1;" \
15  "\n\taddc.u64.cc t2, "#X"2, "#X"2;" \
16  "\n\taddc.u64.cc t3, "#X"3, "#X"3;" \
17  "\n\taddc.u64.cc t4, "#X"4, "#X"4;" \
18  "\n\taddc.u64.cc t5, "#X"5, "#X"5;" \
19  "\n\taddc.u32 z6, 0, 0;" \
20  \
21  /* z = x + t */ \
22  \
23  "\n\tadd.u64.cc "#Z"0, "#X"0, t0;" \
24  "\n\taddc.u64.cc "#Z"1, "#X"1, t1;" \
25  "\n\taddc.u64.cc "#Z"2, "#X"2, t2;" \
26  "\n\taddc.u64.cc "#Z"3, "#X"3, t3;" \
27  "\n\taddc.u64.cc "#Z"4, "#X"4, t4;" \
28  "\n\taddc.u64.cc "#Z"5, "#X"5, t5;" \
29  "\n\taddc.u32 z6, 0, z6;" \
30  \
31  /* z = z + z */ \
32  \
33  "\n\tadd.u64.cc "#Z"0, "#Z"0, "#Z"0;" \
34  "\n\taddc.u64.cc "#Z"1, "#Z"1, "#Z"1;" \
35  "\n\taddc.u64.cc "#Z"2, "#Z"2, "#Z"2;" \
36  "\n\taddc.u64.cc "#Z"3, "#Z"3, "#Z"3;" \
37  "\n\taddc.u64.cc "#Z"4, "#Z"4, "#Z"4;" \
38  "\n\taddc.u64.cc "#Z"5, "#Z"5, "#Z"5;" \
39  "\n\taddc.u32 z6, z6, z6;" \
40  \
41  /* z = z + z */ \
42  \
43  "\n\tadd.u64.cc "#Z"0, "#Z"0, "#Z"0;" \
44  "\n\taddc.u64.cc "#Z"1, "#Z"1, "#Z"1;" \
45  "\n\taddc.u64.cc "#Z"2, "#Z"2, "#Z"2;" \
46  "\n\taddc.u64.cc "#Z"3, "#Z"3, "#Z"3;" \
47  "\n\taddc.u64.cc "#Z"4, "#Z"4, "#Z"4;" \
48  "\n\taddc.u64.cc "#Z"5, "#Z"5, "#Z"5;" \
49  "\n\taddc.u32 z6, z6, z6;" \
50  \
51  /* if z >= 2^387 then z -= 78m */ \
52  \
53  "\n\tsetp.gt.u32 gt, z6, 7;" \
54  "\n@gt\tsub.u64.cc "#Z"0, "#Z"0, 0xABB1FFFFFFE6001AU;" \
55  "\n@gt\tsubc.u64.cc "#Z"1, "#Z"1, 0x5867FF9A0797FFEAU;" \
56  "\n@gt\tsubc.u64.cc "#Z"2, "#Z"2, 0x70E02D0B29EAFF01U;" \
57  "\n@gt\tsubc.u64.cc "#Z"3, "#Z"3, 0x9C590282328BB651U;" \
58  "\n@gt\tsubc.u64.cc "#Z"4, "#Z"4, 0xE26D1988810EA9A0U;" \
59  "\n@gt\tsubc.u64.cc "#Z"5, "#Z"5, 0xEC53755D84F84302U;" \
60  "\n@gt\tsubc.u32 z6, z6, 7;" \
61  \
62  /* if z >= 2^386 then z -= 39m */ \
63  \
64  "\n\tsetp.gt.u32 gt, z6, 3;" \
65  "\n@gt\tsub.u64.cc "#Z"0, "#Z"0, 0x55D8FFFFFFF3000DU;" \
66  "\n@gt\tsubc.u64.cc "#Z"1, "#Z"1, 0xAC33FFCD03CBFFF5U;" \
67  "\n@gt\tsubc.u64.cc "#Z"2, "#Z"2, 0xB870168594F57F80U;" \
68  "\n@gt\tsubc.u64.cc "#Z"3, "#Z"3, 0x4E2C81411945DB28U;" \
69  "\n@gt\tsubc.u64.cc "#Z"4, "#Z"4, 0x71368CC4408754D0U;" \
70  "\n@gt\tsubc.u64.cc "#Z"5, "#Z"5, 0xF629BAAEC27C2181U;" \
71  "\n@gt\tsubc.u32 z6, z6, 3;" \
72  \
73  /* if z >= 2^385 then z -= 19m */ \
74  \
75  "\n\tsetp.gt.u32 gt, z6, 1;" \
76  "\n@gt\tsub.u64.cc "#Z"0, "#Z"0, 0xCDECFFFFFFF9AAB1U;" \
77  "\n@gt\tsubc.u64.cc "#Z"1, "#Z"1, 0x46C3FFE7293BFFFAU;" \
78  "\n@gt\tsubc.u64.cc "#Z"2, "#Z"2, 0xA89FA1F24F2244AEU;" \
79  "\n@gt\tsubc.u64.cc "#Z"3, "#Z"3, 0x74DA9ADE12E06434U;" \
80  "\n@gt\tsubc.u64.cc "#Z"4, "#Z"4, 0x930D7286FE9DD3FCU;" \
81  "\n@gt\tsubc.u64.cc "#Z"5, "#Z"5, 0xEE145462447E1D73U;" \
82  "\n@gt\tsubc.u32 z6, z6, 1;" \
83  \
84  /* if z >= 2^384 then z -= 9m */ \
85  \
86  "\n\tsetp.gt.u32 gt, z6, 0;" \
87  "\n@gt\tsub.u64.cc "#Z"0, "#Z"0, 0x89F6FFFFFFFD0003U;" \
88  "\n@gt\tsubc.u64.cc "#Z"1, "#Z"1, 0x140BFFF43BF3FFFDU;" \
89  "\n@gt\tsubc.u64.cc "#Z"2, "#Z"2, 0xA0B767A8AC38A745U;" \
90  "\n@gt\tsubc.u64.cc "#Z"3, "#Z"3, 0x8831A7AC8FADA8BAU;" \
91  "\n@gt\tsubc.u64.cc "#Z"4, "#Z"4, 0xA3F8E5685DA91392U;" \
92  "\n@gt\tsubc.u64.cc "#Z"5, "#Z"5, 0xEA09A13C057F1B6CU;" \
93  "\n@gt\tsubc.u32 z6, z6, 0;" \
94  \
95  /* if z >= 2^384 then z -= 9m */ \
96  \
97  "\n\tsetp.gt.u32 gt, z6, 0;" \
98  "\n@gt\tsub.u64.cc "#Z"0, "#Z"0, 0x89F6FFFFFFFD0003U;" \
99  "\n@gt\tsubc.u64.cc "#Z"1, "#Z"1, 0x140BFFF43BF3FFFDU;" \
100  "\n@gt\tsubc.u64.cc "#Z"2, "#Z"2, 0xA0B767A8AC38A745U;" \
101  "\n@gt\tsubc.u64.cc "#Z"3, "#Z"3, 0x8831A7AC8FADA8BAU;" \
102  "\n@gt\tsubc.u64.cc "#Z"4, "#Z"4, 0xA3F8E5685DA91392U;" \
103  "\n@gt\tsubc.u64.cc "#Z"5, "#Z"5, 0xEA09A13C057F1B6CU;"
104 
105 #endif