| /* Copyright lowRISC contributors. */ | 
 | /* Licensed under the Apache License, Version 2.0, see LICENSE for details. */ | 
 | /* SPDX-License-Identifier: Apache-2.0 */ | 
 | /* | 
 |  *   Standalone test for P-384 point addition in projective space | 
 |  * | 
 |  *   Performs addition of two valid P-384 points in projective space. | 
 |  *   Constant coordinates for the two points contained in the .data section. | 
 |  * | 
 |  *   See comment at the end of the file for expected values of coordinates | 
 |  *   of resulting point. | 
 |  */ | 
 |  | 
 | .section .text.start | 
 |  | 
 | p384_proj_add_test: | 
 |  | 
 |   /* set dmem pointer to domain parameter b */ | 
 |   la       x28, p384_b | 
 |  | 
 |   /* set dmem pointer to point 1 */ | 
 |   la       x26, p1_x | 
 |  | 
 |   /* set dmem pointer to point 2 */ | 
 |   la       x27, p2_x | 
 |  | 
 |   /* load domain parameter p (modulus) | 
 |      [w13, w12] = p */ | 
 |   li       x2, 12 | 
 |   la       x3, p384_p | 
 |   bn.lid   x2++, 0(x3) | 
 |   bn.lid   x2++, 32(x3) | 
 |  | 
 |   /* load Barrett constant u for modulus p | 
 |      [w15, w14] = u_p */ | 
 |   li       x2, 14 | 
 |   la       x3, p384_u_p | 
 |   bn.lid   x2++, 0(x3) | 
 |   bn.lid   x2++, 32(x3) | 
 |  | 
 |   /* init all-zero reg */ | 
 |   bn.xor   w31, w31, w31 | 
 |  | 
 |   /* set reg file pointers */ | 
 |   li x22,  10 | 
 |   li x23,  11 | 
 |   li x24,  16 | 
 |   li x25,  17 | 
 |  | 
 |   jal      x1, proj_add_p384 | 
 |  | 
 |   ecall | 
 |  | 
 | .section .data | 
 |  | 
 | /* point 1 x-cooridante p1_x */ | 
 | p1_x: | 
 |   .word 0x1a11808b | 
 |   .word 0x02e3d5a9 | 
 |   .word 0x440d8db6 | 
 |   .word 0x5ef02be3 | 
 |   .word 0x2a35de10 | 
 |   .word 0xdbdb132e | 
 |   .word 0xf84e7899 | 
 |   .word 0x7dff4c2b | 
 |   .word 0x24705317 | 
 |   .word 0x30eda4ab | 
 |   .word 0xb44ba799 | 
 |   .word 0x3af8f1c5 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |  | 
 | /* point 2 y-cooridante p1_y */ | 
 | p1_y: | 
 |   .word 0xa9f8b96e | 
 |   .word 0x82f268be | 
 |   .word 0x8e51c662 | 
 |   .word 0x92b9c4bb | 
 |   .word 0x757d4493 | 
 |   .word 0x26b4d3c6 | 
 |   .word 0xf491007e | 
 |   .word 0x92a5c72a | 
 |   .word 0x8d8d8641 | 
 |   .word 0x87498a20 | 
 |   .word 0x0fe7dbde | 
 |   .word 0x841e4949 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |  | 
 | /* point 1 z-cooridante p1_z */ | 
 | p1_z: | 
 |   .word 0x00000001 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |  | 
 | /* point 2 x-cooridante p2_x */ | 
 | p2_x: | 
 |   .word 0xa24055fe | 
 |   .word 0x44e0b41c | 
 |   .word 0xb747a4ee | 
 |   .word 0xd5597d02 | 
 |   .word 0x56cd166d | 
 |   .word 0xd147078b | 
 |   .word 0x57f91304 | 
 |   .word 0x255b83b1 | 
 |   .word 0x33eabb2d | 
 |   .word 0xf83f0a61 | 
 |   .word 0x3ff2df87 | 
 |   .word 0x77da1284 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |  | 
 | /* point 2 y-cooridante p2_y */ | 
 | p2_y: | 
 |   .word 0x8d803d57 | 
 |   .word 0x9ea243f3 | 
 |   .word 0xde9000a7 | 
 |   .word 0x35f5b65f | 
 |   .word 0x417d5e7c | 
 |   .word 0x21a9269f | 
 |   .word 0x98a79201 | 
 |   .word 0xa9311cb0 | 
 |   .word 0x8047b439 | 
 |   .word 0xb7494b0d | 
 |   .word 0x63d2f480 | 
 |   .word 0x699a7b9a | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |  | 
 | /* point 2 z-cooridante p2_z */ | 
 | p2_z: | 
 |   .word 0x00000001 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |   .word 0x00000000 | 
 |  | 
 | /* Expected values wide register file (x-, y-, z-coordinates of result): | 
 |  w25 = 0xb89ab3a5653144bbde19809f8c041d592417c47c798a1333a3dbd2e105e101e2 | 
 |  w26 = 0x00000000000000000000000000000000103520c6699791fc8442cbea85ed03b4 | 
 |  w27 = 0x4a2f5605fb42124188b528e5597a081a811cb37702220144ab04587d6f9c1521 | 
 |  w28 = 0x00000000000000000000000000000000b29ca8ba3f6c2b82859bcf8046c5769b | 
 |  w29 = 0x2f9731e1883f5baa7d3d7cae88ff2d29d5ca5d208c94d4207bf986ff256d1217 | 
 |  w30 = 0x000000000000000000000000000000005ffbcc52aae3707a63c630115c735f94 | 
 |  */ |