31.4.2.2 Available Instructions
The available ALU instructions are listed in
Table 31.1 ALU Instructions on page 1031
, data transfer instructions are listed in
31.2 Transfer Instructions on page 1032
, conditional instructions are listed in
Table 31.3 Conditional Instructions on page 1033
special instructions are listed in
Table 31.4 Special Instructions on page 1033
. The tables explains the side-effects of the instructions
and shows which registers are affected. For instructions involving BUFC, the BUFC Buffers are defined by READBUFSEL and WRITE-
BUFSEL in CRYPTO_CTRL for BUFC reads and writes respectively. V0 and V1 in the instructions descriptions can be any of the DDA-
TAx registers and a selection of the DATAx registers. They can be selected using the SELDDATAxDDATAy, SELDATAxDDATAy, SELD-
DATAxDATAy and SELDATAxDATAy instructions. The first register in the instruction will be selected for V0, and the second for V1. This
configuration stays even when the sequence is complete, and can also be set up front. The currently selected V0 and V1 can be read
V0 and V1 in CRYPTO_CSTATUS.
Table 31.1. ALU Instructions
Instruction
Description
Constraints/Notes
ADD
DDATA0 = V0 + V1
If V0 != DDATA0, then V1 != DDATA0
ADDO
DDATA0 = V0 + V1
Carry is only set, not cleared.
If V0 != DDATA0, then V1 != DDATA0
ADDC
DDATA0 = V0 + V1 + carry
If V0 != DDATA0, then V1 != DDATA0
ADDIC
DDATA0 = V0 + V1 + carry << 128
If V0 != DDATA0, then V1 != DDATA0.
If resultwidth is 128b, then carry is undefined
MADD
DDATA0 = (V0 + V1) mod P
If V0 != DDATA0, then V1 != DDATA0
MADD32
DDATA0[i] = V0[i] + V1[i].
Word-wise addition
carry is not modified.
If V0 != DDATA0, then V1 != DDATA0
SUB
DDATA0 = V0 - V1
V1 != DDATA0.
If V1 is 128b and resultwidth > 128b,
then upper 128b are unknown
SUBC
DDATA0 = V0 - V1 - carry
V1 != DDATA0.
If V1 is 128b and resultwidth > 128b,
then upper 128b are unknown
MSUB
DDATA0 = (V0 - V1) mod P
V1 != DDATA0.
If V1 is 128b and resultwidth > 128b,
then upper 128b are unknown
MUL
DDATA0 = DDATA1 * V1.
See
V1 != DDATA0,DDATA1
MULC
DDATA0 = DDATA1 * V1 + (DDATA0 << MULWIDTH).
See
V1 != DDATA0,DDATA1
MMUL
DDATA0 = (DDATA1 * V1) mod P
V1 != DDATA0,DDATA1
MULO
DDATA0 = DDATA1 * V1.
See
V1 != DDATA0,DDATA1. Carry is only set, not cleared
SHL
DDATA0 = V0 << 1
If V0 is 128b and resultwidth is 260b, then upper 4b are un-
known
SHLC
DDATA0 = V0 << 1 | carry
If V0 is 128b and resultwidth is 260b, then upper 4b are un-
known
SHLB
DDATA0 = V0 << 1 | V0[resultwidth-1]
If V0 is 128b and resultwidth is 260b, then upper 4b are un-
known
SHL1
DDATA0 = V0 << 1 | 1
If V0 is 128b and resultwidth is 260b, then upper 4b are un-
known
SHR
DDATA0 = V0 >> 1
SHRC
DDATA0 = V0 >> 1 | carry << resultwidth-1
Reference Manual
CRYPTO - Crypto Accelerator
silabs.com
| Building a more connected world.
Rev. 1.1 | 1031