blob: fb944bfa5ce21f53b2d96f4e0977dbfa94d85784 [file] [log] [blame]
/* Copyright lowRISC contributors. */
/* Licensed under the Apache License, Version 2.0, see LICENSE for details. */
/* SPDX-License-Identifier: Apache-2.0 */
/* 256-bit multiply example. Loads two 256-bit words from DMem into w1, w0.
Multiplies usings BN.MULQACC with the result placed into w3, w2 (upper half
in w3). */
.section .text.start
/* Initialise WDRs before using them */
bn.xor w2, w2, w2
bn.xor w3, w3, w3
/* Load operands into WDRs */
li x2, 0
la x3, operand1
bn.lid x2, 0(x3)
li x2, 1
la x3, operand2
bn.lid x2, 0(x3)
/* Perform the multiply, limbs are 64-bit. Each instance of `mulqacc` will
operate on two limbs as a 64-bit multiply produces a 128-bit result. */
/* limbs 0 & 1 */
bn.mulqacc.Z w0.0, w1.0, 0
/* limbs 1 & 2 */
bn.mulqacc w0.1, w1.0, 64
bn.mulqacc.so w2.L, w0.0, w1.1, 64
/* limbs 2 & 3 */
bn.mulqacc w0.2, w1.0, 0
bn.mulqacc w0.1, w1.1, 0
bn.mulqacc w0.0, w1.2, 0
/* limbs 3 & 4 */
bn.mulqacc w0.3, w1.0, 64
bn.mulqacc w0.2, w1.1, 64
bn.mulqacc w0.1, w1.2, 64
bn.mulqacc.so w2.U, w0.0, w1.3, 64
/* limbs 4 & 5 */
bn.mulqacc w0.3, w1.1, 0
bn.mulqacc w0.2, w1.2, 0
bn.mulqacc w0.1, w1.3, 0
/* limbs 5 & 6 */
bn.mulqacc w0.3, w1.2, 64
bn.mulqacc.so w3.L, w0.2, w1.3, 64
/* limbs 6 & 7 */
bn.mulqacc.so w3.U, w0.3, w1.3, 0
ecall
.section .data
/* 256-bit integer
fbc20c8e4ba684f2 f6835831c3623f41
49de6d75d0221f41 61a5a8d66985591e
(.quad below is in reverse order) */
operand1:
.quad 0x61a5a8d66985591e
.quad 0x49de6d75d0221f41
.quad 0xf6835831c3623f41
.quad 0xfbc20c8e4ba684f2
/* 256-bit integer
10ad673384d81d98 1a1c98e116948392
60f39da06db956ec 5de6ee4dbd0f089d
(.quad below is in reverse order) */
operand2:
.quad 0x5de6ee4dbd0f089d
.quad 0x60f39da06db956ec
.quad 0x1a1c98e116948392
.quad 0x10ad673384d81d98
/* Expected result is
w3 =
1066a8691e3ddfee a0a622d04cfd63b4
ea93fcc837b795eb 3f2b811bfa6dc7f2
w2 =
dad4a618536bfd33 565eff3285ab75a5
59b7199e0622d5ee ed40926c40529766 */