Home | History | Annotate | Line # | Download | only in riscv64
      1 #include <machine/asm.h>
      2 .text
      3 .p2align 3
      4 .globl rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt
      5 .type rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt,@function
      6 rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt:
      7         # Load number of rounds
      8     lwu t0, 240(a4)
      9     .word 3439489111
     10     .word 34074119
     11     .word 34041479
     12     .word 2815667831
     13     addi t0, t0, -1
     14     addi a4, a4, 16
     15 1:
     16     .word 34041479
     17     .word 2815503991
     18     addi t0, t0, -1
     19     addi a4, a4, 16
     20     bnez t0, 1b
     21     .word 34041479
     22     .word 2815536759
     23 
     24 
     25     # aes block size is 16
     26     andi a6, a2, 15
     27     mv t3, a2
     28     beqz a6, 1f
     29     sub a2, a2, a6
     30     addi t3, a2, -16
     31 1:
     32     # We make the `LENGTH` become e32 length here.
     33     srli t4, a2, 2
     34     srli t3, t3, 2
     35 
     36     # Load number of rounds
     37     lwu t0, 240(a3)
     38     li t1, 14
     39     li t2, 10
     40     beq t0, t1, aes_xts_enc_256
     41     beq t0, t2, aes_xts_enc_128
     42 .size rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt,.-rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt
     43 .p2align 3
     44 aes_xts_enc_128:
     45         # load input
     46     .word 221182167
     47     .word 33909767
     48 
     49     li t0, 5
     50     # We could simplify the initialization steps if we have `block<=1`.
     51     blt t4, t0, 1f
     52 
     53     # Note: We use `vgmul` for GF(2^128) multiplication. The `vgmul` uses
     54     # different order of coefficients. We should use`vbrev8` to reverse the
     55     # data when we use `vgmul`.
     56     .word 3439489111
     57     .word 1271144535
     58     .word 221179991
     59     .word 1577072727
     60     # v16: [r-IV0, r-IV0, ...]
     61     .word 2785257591
     62 
     63     # Prepare GF(2^128) multiplier [1, x, x^2, x^3, ...] in v8.
     64     slli t0, t4, 2
     65     .word 218296407
     66     # v2: [`1`, `1`, `1`, `1`, ...]
     67     .word 1577103703
     68     # v3: [`0`, `1`, `2`, `3`, ...]
     69     .word 1376297431
     70     .word 227733591
     71     # v4: [`1`, 0, `1`, 0, `1`, 0, `1`, 0, ...]
     72     .word 1243816535
     73     # v6: [`0`, 0, `1`, 0, `2`, 0, `3`, 0, ...]
     74     .word 1244865367
     75     slli t0, t4, 1
     76     .word 219344983
     77     # v8: [1<<0=1, 0, 0, 0, 1<<1=x, 0, 0, 0, 1<<2=x^2, 0, 0, 0, ...]
     78     .word 3594716247
     79 
     80     # Compute [r-IV0*1, r-IV0*x, r-IV0*x^2, r-IV0*x^3, ...] in v16
     81     .word 221179991
     82     .word 1250174039
     83     .word 2726865015
     84 
     85     # Compute [IV0*1, IV0*x, IV0*x^2, IV0*x^3, ...] in v28.
     86     # Reverse the bits order back.
     87     .word 1258565207
     88 
     89     # Prepare the x^n multiplier in v20. The `n` is the aes-xts block number
     90     # in a LMUL=4 register group.
     91     #   n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4))
     92     #     = (VLEN/32)
     93     # We could use vsetvli with `e32, m1` to compute the `n` number.
     94     .word 218133207
     95     li t1, 1
     96     sll t0, t1, t0
     97     .word 3447812183
     98     .word 1577070679
     99     .word 3380670551
    100     .word 1577238615
    101     .word 3447812183
    102     .word 1241784407
    103     .word 221179991
    104     .word 1577073239
    105     .word 2785258103
    106 
    107     j 2f
    108 1:
    109     .word 3439489111
    110     .word 1271146583
    111 2:
    112 
    113         .word 3439489111
    114     .word 34005127
    115     addi a3, a3, 16
    116     .word 34005255
    117     addi a3, a3, 16
    118     .word 34005383
    119     addi a3, a3, 16
    120     .word 34005511
    121     addi a3, a3, 16
    122     .word 34005639
    123     addi a3, a3, 16
    124     .word 34005767
    125     addi a3, a3, 16
    126     .word 34005895
    127     addi a3, a3, 16
    128     .word 34006023
    129     addi a3, a3, 16
    130     .word 34006151
    131     addi a3, a3, 16
    132     .word 34006279
    133     addi a3, a3, 16
    134     .word 34006407
    135 
    136 
    137     .word 221182167
    138     j 1f
    139 
    140 .Lenc_blocks_128:
    141     .word 221182167
    142     # load plaintext into v24
    143     .word 33909767
    144     # update iv
    145     .word 2739447927
    146     # reverse the iv's bits order back
    147     .word 1258565207
    148 1:
    149     .word 797838423
    150     slli t0, a7, 2
    151     sub t4, t4, a7
    152     add a0, a0, t0
    153         .word 2786307191
    154     .word 2787191927
    155     .word 2788240503
    156     .word 2789289079
    157     .word 2790337655
    158     .word 2791386231
    159     .word 2792434807
    160     .word 2793483383
    161     .word 2794531959
    162     .word 2795580535
    163     .word 2796661879
    164 
    165     .word 797838423
    166 
    167     # store ciphertext
    168     .word 221147223
    169     .word 33942567
    170     add a1, a1, t0
    171     sub t3, t3, a7
    172 
    173     bnez t4, .Lenc_blocks_128
    174 
    175         bnez a6, 1f
    176     ret
    177 1:
    178     # slidedown second to last block
    179     addi a7, a7, -4
    180     .word 3441586263
    181     # ciphertext
    182     .word 1065929815
    183     # multiplier
    184     .word 1057540183
    185 
    186     .word 3439489111
    187     .word 1577848023
    188 
    189     # load last block into v24
    190     # note: We should load the last block before store the second to last block
    191     #       for in-place operation.
    192     .word 134770775
    193     .word 33885191
    194 
    195     # setup `x` multiplier with byte-reversed order
    196     # 0b00000010 => 0b01000000 (0x40)
    197     li t0, 0x40
    198     .word 3439489111
    199     .word 1577074263
    200     .word 3355504727
    201     .word 1577242199
    202 
    203     # compute IV for last block
    204     .word 3439489111
    205     .word 2747836535
    206     .word 1258565207
    207 
    208     # store second to last block
    209     .word 201879639
    210     .word 33918119
    211 
    212 
    213     # xts last block
    214     .word 3439489111
    215     .word 797838423
    216         .word 2786307191
    217     .word 2787191927
    218     .word 2788240503
    219     .word 2789289079
    220     .word 2790337655
    221     .word 2791386231
    222     .word 2792434807
    223     .word 2793483383
    224     .word 2794531959
    225     .word 2795580535
    226     .word 2796661879
    227 
    228     .word 797838423
    229 
    230     # store last block ciphertext
    231     addi a1, a1, -16
    232     .word 33942567
    233 
    234     ret
    235 .size aes_xts_enc_128,.-aes_xts_enc_128
    236 .p2align 3
    237 aes_xts_enc_256:
    238         # load input
    239     .word 221182167
    240     .word 33909767
    241 
    242     li t0, 5
    243     # We could simplify the initialization steps if we have `block<=1`.
    244     blt t4, t0, 1f
    245 
    246     # Note: We use `vgmul` for GF(2^128) multiplication. The `vgmul` uses
    247     # different order of coefficients. We should use`vbrev8` to reverse the
    248     # data when we use `vgmul`.
    249     .word 3439489111
    250     .word 1271144535
    251     .word 221179991
    252     .word 1577072727
    253     # v16: [r-IV0, r-IV0, ...]
    254     .word 2785257591
    255 
    256     # Prepare GF(2^128) multiplier [1, x, x^2, x^3, ...] in v8.
    257     slli t0, t4, 2
    258     .word 218296407
    259     # v2: [`1`, `1`, `1`, `1`, ...]
    260     .word 1577103703
    261     # v3: [`0`, `1`, `2`, `3`, ...]
    262     .word 1376297431
    263     .word 227733591
    264     # v4: [`1`, 0, `1`, 0, `1`, 0, `1`, 0, ...]
    265     .word 1243816535
    266     # v6: [`0`, 0, `1`, 0, `2`, 0, `3`, 0, ...]
    267     .word 1244865367
    268     slli t0, t4, 1
    269     .word 219344983
    270     # v8: [1<<0=1, 0, 0, 0, 1<<1=x, 0, 0, 0, 1<<2=x^2, 0, 0, 0, ...]
    271     .word 3594716247
    272 
    273     # Compute [r-IV0*1, r-IV0*x, r-IV0*x^2, r-IV0*x^3, ...] in v16
    274     .word 221179991
    275     .word 1250174039
    276     .word 2726865015
    277 
    278     # Compute [IV0*1, IV0*x, IV0*x^2, IV0*x^3, ...] in v28.
    279     # Reverse the bits order back.
    280     .word 1258565207
    281 
    282     # Prepare the x^n multiplier in v20. The `n` is the aes-xts block number
    283     # in a LMUL=4 register group.
    284     #   n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4))
    285     #     = (VLEN/32)
    286     # We could use vsetvli with `e32, m1` to compute the `n` number.
    287     .word 218133207
    288     li t1, 1
    289     sll t0, t1, t0
    290     .word 3447812183
    291     .word 1577070679
    292     .word 3380670551
    293     .word 1577238615
    294     .word 3447812183
    295     .word 1241784407
    296     .word 221179991
    297     .word 1577073239
    298     .word 2785258103
    299 
    300     j 2f
    301 1:
    302     .word 3439489111
    303     .word 1271146583
    304 2:
    305 
    306         .word 3439489111
    307     .word 34005127
    308     addi a3, a3, 16
    309     .word 34005255
    310     addi a3, a3, 16
    311     .word 34005383
    312     addi a3, a3, 16
    313     .word 34005511
    314     addi a3, a3, 16
    315     .word 34005639
    316     addi a3, a3, 16
    317     .word 34005767
    318     addi a3, a3, 16
    319     .word 34005895
    320     addi a3, a3, 16
    321     .word 34006023
    322     addi a3, a3, 16
    323     .word 34006151
    324     addi a3, a3, 16
    325     .word 34006279
    326     addi a3, a3, 16
    327     .word 34006407
    328     addi a3, a3, 16
    329     .word 34006535
    330     addi a3, a3, 16
    331     .word 34006663
    332     addi a3, a3, 16
    333     .word 34006791
    334     addi a3, a3, 16
    335     .word 34006919
    336 
    337 
    338     .word 221182167
    339     j 1f
    340 
    341 .Lenc_blocks_256:
    342     .word 221182167
    343     # load plaintext into v24
    344     .word 33909767
    345     # update iv
    346     .word 2739447927
    347     # reverse the iv's bits order back
    348     .word 1258565207
    349 1:
    350     .word 797838423
    351     slli t0, a7, 2
    352     sub t4, t4, a7
    353     add a0, a0, t0
    354         .word 2786307191
    355     .word 2787191927
    356     .word 2788240503
    357     .word 2789289079
    358     .word 2790337655
    359     .word 2791386231
    360     .word 2792434807
    361     .word 2793483383
    362     .word 2794531959
    363     .word 2795580535
    364     .word 2796629111
    365     .word 2797677687
    366     .word 2798726263
    367     .word 2799774839
    368     .word 2800856183
    369 
    370     .word 797838423
    371 
    372     # store ciphertext
    373     .word 221147223
    374     .word 33942567
    375     add a1, a1, t0
    376     sub t3, t3, a7
    377 
    378     bnez t4, .Lenc_blocks_256
    379 
    380         bnez a6, 1f
    381     ret
    382 1:
    383     # slidedown second to last block
    384     addi a7, a7, -4
    385     .word 3441586263
    386     # ciphertext
    387     .word 1065929815
    388     # multiplier
    389     .word 1057540183
    390 
    391     .word 3439489111
    392     .word 1577848023
    393 
    394     # load last block into v24
    395     # note: We should load the last block before store the second to last block
    396     #       for in-place operation.
    397     .word 134770775
    398     .word 33885191
    399 
    400     # setup `x` multiplier with byte-reversed order
    401     # 0b00000010 => 0b01000000 (0x40)
    402     li t0, 0x40
    403     .word 3439489111
    404     .word 1577074263
    405     .word 3355504727
    406     .word 1577242199
    407 
    408     # compute IV for last block
    409     .word 3439489111
    410     .word 2747836535
    411     .word 1258565207
    412 
    413     # store second to last block
    414     .word 201879639
    415     .word 33918119
    416 
    417 
    418     # xts last block
    419     .word 3439489111
    420     .word 797838423
    421         .word 2786307191
    422     .word 2787191927
    423     .word 2788240503
    424     .word 2789289079
    425     .word 2790337655
    426     .word 2791386231
    427     .word 2792434807
    428     .word 2793483383
    429     .word 2794531959
    430     .word 2795580535
    431     .word 2796629111
    432     .word 2797677687
    433     .word 2798726263
    434     .word 2799774839
    435     .word 2800856183
    436 
    437     .word 797838423
    438 
    439     # store last block ciphertext
    440     addi a1, a1, -16
    441     .word 33942567
    442 
    443     ret
    444 .size aes_xts_enc_256,.-aes_xts_enc_256
    445 .p2align 3
    446 .globl rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt
    447 .type rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt,@function
    448 rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt:
    449         # Load number of rounds
    450     lwu t0, 240(a4)
    451     .word 3439489111
    452     .word 34074119
    453     .word 34041479
    454     .word 2815667831
    455     addi t0, t0, -1
    456     addi a4, a4, 16
    457 1:
    458     .word 34041479
    459     .word 2815503991
    460     addi t0, t0, -1
    461     addi a4, a4, 16
    462     bnez t0, 1b
    463     .word 34041479
    464     .word 2815536759
    465 
    466 
    467     # aes block size is 16
    468     andi a6, a2, 15
    469     beqz a6, 1f
    470     sub a2, a2, a6
    471     addi a2, a2, -16
    472 1:
    473     # We make the `LENGTH` become e32 length here.
    474     srli t4, a2, 2
    475 
    476     # Load number of rounds
    477     lwu t0, 240(a3)
    478     li t1, 14
    479     li t2, 10
    480     beq t0, t1, aes_xts_dec_256
    481     beq t0, t2, aes_xts_dec_128
    482 .size rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt,.-rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt
    483 .p2align 3
    484 aes_xts_dec_128:
    485         # load input
    486     .word 221182167
    487     .word 33909767
    488 
    489     li t0, 5
    490     # We could simplify the initialization steps if we have `block<=1`.
    491     blt t4, t0, 1f
    492 
    493     # Note: We use `vgmul` for GF(2^128) multiplication. The `vgmul` uses
    494     # different order of coefficients. We should use`vbrev8` to reverse the
    495     # data when we use `vgmul`.
    496     .word 3439489111
    497     .word 1271144535
    498     .word 221179991
    499     .word 1577072727
    500     # v16: [r-IV0, r-IV0, ...]
    501     .word 2785257591
    502 
    503     # Prepare GF(2^128) multiplier [1, x, x^2, x^3, ...] in v8.
    504     slli t0, t4, 2
    505     .word 218296407
    506     # v2: [`1`, `1`, `1`, `1`, ...]
    507     .word 1577103703
    508     # v3: [`0`, `1`, `2`, `3`, ...]
    509     .word 1376297431
    510     .word 227733591
    511     # v4: [`1`, 0, `1`, 0, `1`, 0, `1`, 0, ...]
    512     .word 1243816535
    513     # v6: [`0`, 0, `1`, 0, `2`, 0, `3`, 0, ...]
    514     .word 1244865367
    515     slli t0, t4, 1
    516     .word 219344983
    517     # v8: [1<<0=1, 0, 0, 0, 1<<1=x, 0, 0, 0, 1<<2=x^2, 0, 0, 0, ...]
    518     .word 3594716247
    519 
    520     # Compute [r-IV0*1, r-IV0*x, r-IV0*x^2, r-IV0*x^3, ...] in v16
    521     .word 221179991
    522     .word 1250174039
    523     .word 2726865015
    524 
    525     # Compute [IV0*1, IV0*x, IV0*x^2, IV0*x^3, ...] in v28.
    526     # Reverse the bits order back.
    527     .word 1258565207
    528 
    529     # Prepare the x^n multiplier in v20. The `n` is the aes-xts block number
    530     # in a LMUL=4 register group.
    531     #   n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4))
    532     #     = (VLEN/32)
    533     # We could use vsetvli with `e32, m1` to compute the `n` number.
    534     .word 218133207
    535     li t1, 1
    536     sll t0, t1, t0
    537     .word 3447812183
    538     .word 1577070679
    539     .word 3380670551
    540     .word 1577238615
    541     .word 3447812183
    542     .word 1241784407
    543     .word 221179991
    544     .word 1577073239
    545     .word 2785258103
    546 
    547     j 2f
    548 1:
    549     .word 3439489111
    550     .word 1271146583
    551 2:
    552 
    553         .word 3439489111
    554     .word 34005127
    555     addi a3, a3, 16
    556     .word 34005255
    557     addi a3, a3, 16
    558     .word 34005383
    559     addi a3, a3, 16
    560     .word 34005511
    561     addi a3, a3, 16
    562     .word 34005639
    563     addi a3, a3, 16
    564     .word 34005767
    565     addi a3, a3, 16
    566     .word 34005895
    567     addi a3, a3, 16
    568     .word 34006023
    569     addi a3, a3, 16
    570     .word 34006151
    571     addi a3, a3, 16
    572     .word 34006279
    573     addi a3, a3, 16
    574     .word 34006407
    575 
    576 
    577     beqz t4, 2f
    578 
    579     .word 221182167
    580     j 1f
    581 
    582 .Ldec_blocks_128:
    583     .word 221182167
    584     # load ciphertext into v24
    585     .word 33909767
    586     # update iv
    587     .word 2739447927
    588     # reverse the iv's bits order back
    589     .word 1258565207
    590 1:
    591     .word 797838423
    592     slli t0, a7, 2
    593     sub t4, t4, a7
    594     add a0, a0, t0
    595         .word 2796792951
    596     .word 2795514999
    597     .word 2794466423
    598     .word 2793417847
    599     .word 2792369271
    600     .word 2791320695
    601     .word 2790272119
    602     .word 2789223543
    603     .word 2788174967
    604     .word 2787126391
    605     .word 2786110583
    606 
    607     .word 797838423
    608 
    609     # store plaintext
    610     .word 33942567
    611     add a1, a1, t0
    612 
    613     bnez t4, .Ldec_blocks_128
    614 
    615 2:
    616         bnez a6, 1f
    617     ret
    618 1:
    619     # load second to last block's ciphertext
    620     .word 3439489111
    621     .word 33909767
    622     addi a0, a0, 16
    623 
    624     # setup `x` multiplier with byte-reversed order
    625     # 0b00000010 => 0b01000000 (0x40)
    626     li t0, 0x40
    627     .word 3439489111
    628     .word 1577073239
    629     .word 3355504727
    630     .word 1577241175
    631 
    632     beqz a2, 1f
    633     # slidedown third to last block
    634     addi a7, a7, -4
    635     .word 3441586263
    636     # multiplier
    637     .word 1057540183
    638 
    639     # compute IV for last block
    640     .word 3439489111
    641     .word 2739447927
    642     .word 1258565207
    643 
    644     # compute IV for second to last block
    645     .word 2739447927
    646     .word 1258565335
    647     j 2f
    648 1:
    649     # compute IV for second to last block
    650     .word 3439489111
    651     .word 2739447927
    652     .word 1258565335
    653 2:
    654 
    655 
    656     ## xts second to last block
    657     .word 3439489111
    658     .word 797871191
    659         .word 2796792951
    660     .word 2795514999
    661     .word 2794466423
    662     .word 2793417847
    663     .word 2792369271
    664     .word 2791320695
    665     .word 2790272119
    666     .word 2789223543
    667     .word 2788174967
    668     .word 2787126391
    669     .word 2786110583
    670 
    671     .word 797871191
    672     .word 1577848023
    673 
    674     # load last block ciphertext
    675     .word 134770775
    676     .word 33885191
    677 
    678     # store second to last block plaintext
    679     addi t0, a1, 16
    680     .word 33721511
    681 
    682     ## xts last block
    683     .word 3439489111
    684     .word 797838423
    685         .word 2796792951
    686     .word 2795514999
    687     .word 2794466423
    688     .word 2793417847
    689     .word 2792369271
    690     .word 2791320695
    691     .word 2790272119
    692     .word 2789223543
    693     .word 2788174967
    694     .word 2787126391
    695     .word 2786110583
    696 
    697     .word 797838423
    698 
    699     # store second to last block plaintext
    700     .word 33942567
    701 
    702     ret
    703 .size aes_xts_dec_128,.-aes_xts_dec_128
    704 .p2align 3
    705 aes_xts_dec_256:
    706         # load input
    707     .word 221182167
    708     .word 33909767
    709 
    710     li t0, 5
    711     # We could simplify the initialization steps if we have `block<=1`.
    712     blt t4, t0, 1f
    713 
    714     # Note: We use `vgmul` for GF(2^128) multiplication. The `vgmul` uses
    715     # different order of coefficients. We should use`vbrev8` to reverse the
    716     # data when we use `vgmul`.
    717     .word 3439489111
    718     .word 1271144535
    719     .word 221179991
    720     .word 1577072727
    721     # v16: [r-IV0, r-IV0, ...]
    722     .word 2785257591
    723 
    724     # Prepare GF(2^128) multiplier [1, x, x^2, x^3, ...] in v8.
    725     slli t0, t4, 2
    726     .word 218296407
    727     # v2: [`1`, `1`, `1`, `1`, ...]
    728     .word 1577103703
    729     # v3: [`0`, `1`, `2`, `3`, ...]
    730     .word 1376297431
    731     .word 227733591
    732     # v4: [`1`, 0, `1`, 0, `1`, 0, `1`, 0, ...]
    733     .word 1243816535
    734     # v6: [`0`, 0, `1`, 0, `2`, 0, `3`, 0, ...]
    735     .word 1244865367
    736     slli t0, t4, 1
    737     .word 219344983
    738     # v8: [1<<0=1, 0, 0, 0, 1<<1=x, 0, 0, 0, 1<<2=x^2, 0, 0, 0, ...]
    739     .word 3594716247
    740 
    741     # Compute [r-IV0*1, r-IV0*x, r-IV0*x^2, r-IV0*x^3, ...] in v16
    742     .word 221179991
    743     .word 1250174039
    744     .word 2726865015
    745 
    746     # Compute [IV0*1, IV0*x, IV0*x^2, IV0*x^3, ...] in v28.
    747     # Reverse the bits order back.
    748     .word 1258565207
    749 
    750     # Prepare the x^n multiplier in v20. The `n` is the aes-xts block number
    751     # in a LMUL=4 register group.
    752     #   n = ((VLEN*LMUL)/(32*4)) = ((VLEN*4)/(32*4))
    753     #     = (VLEN/32)
    754     # We could use vsetvli with `e32, m1` to compute the `n` number.
    755     .word 218133207
    756     li t1, 1
    757     sll t0, t1, t0
    758     .word 3447812183
    759     .word 1577070679
    760     .word 3380670551
    761     .word 1577238615
    762     .word 3447812183
    763     .word 1241784407
    764     .word 221179991
    765     .word 1577073239
    766     .word 2785258103
    767 
    768     j 2f
    769 1:
    770     .word 3439489111
    771     .word 1271146583
    772 2:
    773 
    774         .word 3439489111
    775     .word 34005127
    776     addi a3, a3, 16
    777     .word 34005255
    778     addi a3, a3, 16
    779     .word 34005383
    780     addi a3, a3, 16
    781     .word 34005511
    782     addi a3, a3, 16
    783     .word 34005639
    784     addi a3, a3, 16
    785     .word 34005767
    786     addi a3, a3, 16
    787     .word 34005895
    788     addi a3, a3, 16
    789     .word 34006023
    790     addi a3, a3, 16
    791     .word 34006151
    792     addi a3, a3, 16
    793     .word 34006279
    794     addi a3, a3, 16
    795     .word 34006407
    796     addi a3, a3, 16
    797     .word 34006535
    798     addi a3, a3, 16
    799     .word 34006663
    800     addi a3, a3, 16
    801     .word 34006791
    802     addi a3, a3, 16
    803     .word 34006919
    804 
    805 
    806     beqz t4, 2f
    807 
    808     .word 221182167
    809     j 1f
    810 
    811 .Ldec_blocks_256:
    812     .word 221182167
    813     # load ciphertext into v24
    814     .word 33909767
    815     # update iv
    816     .word 2739447927
    817     # reverse the iv's bits order back
    818     .word 1258565207
    819 1:
    820     .word 797838423
    821     slli t0, a7, 2
    822     sub t4, t4, a7
    823     add a0, a0, t0
    824         .word 2800987255
    825     .word 2799709303
    826     .word 2798660727
    827     .word 2797612151
    828     .word 2796563575
    829     .word 2795514999
    830     .word 2794466423
    831     .word 2793417847
    832     .word 2792369271
    833     .word 2791320695
    834     .word 2790272119
    835     .word 2789223543
    836     .word 2788174967
    837     .word 2787126391
    838     .word 2786110583
    839 
    840     .word 797838423
    841 
    842     # store plaintext
    843     .word 33942567
    844     add a1, a1, t0
    845 
    846     bnez t4, .Ldec_blocks_256
    847 
    848 2:
    849         bnez a6, 1f
    850     ret
    851 1:
    852     # load second to last block's ciphertext
    853     .word 3439489111
    854     .word 33909767
    855     addi a0, a0, 16
    856 
    857     # setup `x` multiplier with byte-reversed order
    858     # 0b00000010 => 0b01000000 (0x40)
    859     li t0, 0x40
    860     .word 3439489111
    861     .word 1577073239
    862     .word 3355504727
    863     .word 1577241175
    864 
    865     beqz a2, 1f
    866     # slidedown third to last block
    867     addi a7, a7, -4
    868     .word 3441586263
    869     # multiplier
    870     .word 1057540183
    871 
    872     # compute IV for last block
    873     .word 3439489111
    874     .word 2739447927
    875     .word 1258565207
    876 
    877     # compute IV for second to last block
    878     .word 2739447927
    879     .word 1258565335
    880     j 2f
    881 1:
    882     # compute IV for second to last block
    883     .word 3439489111
    884     .word 2739447927
    885     .word 1258565335
    886 2:
    887 
    888 
    889     ## xts second to last block
    890     .word 3439489111
    891     .word 797871191
    892         .word 2800987255
    893     .word 2799709303
    894     .word 2798660727
    895     .word 2797612151
    896     .word 2796563575
    897     .word 2795514999
    898     .word 2794466423
    899     .word 2793417847
    900     .word 2792369271
    901     .word 2791320695
    902     .word 2790272119
    903     .word 2789223543
    904     .word 2788174967
    905     .word 2787126391
    906     .word 2786110583
    907 
    908     .word 797871191
    909     .word 1577848023
    910 
    911     # load last block ciphertext
    912     .word 134770775
    913     .word 33885191
    914 
    915     # store second to last block plaintext
    916     addi t0, a1, 16
    917     .word 33721511
    918 
    919     ## xts last block
    920     .word 3439489111
    921     .word 797838423
    922         .word 2800987255
    923     .word 2799709303
    924     .word 2798660727
    925     .word 2797612151
    926     .word 2796563575
    927     .word 2795514999
    928     .word 2794466423
    929     .word 2793417847
    930     .word 2792369271
    931     .word 2791320695
    932     .word 2790272119
    933     .word 2789223543
    934     .word 2788174967
    935     .word 2787126391
    936     .word 2786110583
    937 
    938     .word 797838423
    939 
    940     # store second to last block plaintext
    941     .word 33942567
    942 
    943     ret
    944 .size aes_xts_dec_256,.-aes_xts_dec_256
    945