Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/lib/crypto/powerpc/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 19 kB image not shown  

Quelle  poly1305-p10le_64.S

  Sprache: Sparc
 

/* SPDX-License-Identifier: GPL-2.0-or-later */
#
# Accelerated poly1305 implementation for ppc64le.
#
# Copyright 2023- IBM Corp. All rights reserved
#
#===================================================================================
# Written by Danny Tsen <dtsen@us.ibm.com>
#
# Poly1305 - this version mainly using vector/VSX/Scalar
#  - 26 bits limbs
#  - Handle multiple 64 byte blcok.
#
# Block size 16 bytes
# key = (r, s)
# clamp r &= 0x0FFFFFFC0FFFFFFC 0x0FFFFFFC0FFFFFFF
# p = 2^130 - 5
# a += m
# a = (r + a) % p
# a += s
#
# Improve performance by breaking down polynominal to the sum of products with
#     h4 = m1 * r⁴ + m2 * r³ + m3 * r² + m4 * r
#
#  07/22/21 - this revison based on the above sum of products.  Setup r^4, r^3, r^2, r and s3, s2, s1, s0
#             to 9 vectors for multiplications.
#
# setup r^4, r^3, r^2, r vectors
#    vs    [r^1, r^3, r^2, r^4]
#    vs0 = [r0,.....]
#    vs1 = [r1,.....]
#    vs2 = [r2,.....]
#    vs3 = [r3,.....]
#    vs4 = [r4,.....]
#    vs5 = [r1*5,...]
#    vs6 = [r2*5,...]
#    vs7 = [r2*5,...]
#    vs8 = [r4*5,...]
#
#  Each word in a vector consists a member of a "r/s" in [a * r/s].
#
# r0, r4*5, r3*5, r2*5, r1*5;
# r1, r0,   r4*5, r3*5, r2*5;
# r2, r1,   r0,   r4*5, r3*5;
# r3, r2,   r1,   r0,   r4*5;
# r4, r3,   r2,   r1,   r0  ;
#
#
# poly1305_p10le_4blocks( uint8_t *k, uint32_t mlen, uint8_t *m)
#  k = 32 bytes key
#  r3 = k (r, s)
#  r4 = mlen
#  r5 = m
#
#include <asm/ppc_asm.h>
#include <asm/asm-offsets.h>
#include <asm/asm-compat.h>
#include <linux/linkage.h>

.machine "any"

.text

.macro SAVE_GPR GPR OFFSET FRAME
 std \GPR,\OFFSET(\FRAME)
.endm

.macro SAVE_VRS VRS OFFSET FRAME
 li 16, \OFFSET
 stvx \VRS, 16, \FRAME
.endm

.macro SAVE_VSX VSX OFFSET FRAME
 li 16, \OFFSET
 stxvx \VSX, 16, \FRAME
.endm

.macro RESTORE_GPR GPR OFFSET FRAME
 ld \GPR,\OFFSET(\FRAME)
.endm

.macro RESTORE_VRS VRS OFFSET FRAME
 li 16, \OFFSET
 lvx \VRS, 16, \FRAME
.endm

.macro RESTORE_VSX VSX OFFSET FRAME
 li 16, \OFFSET
 lxvx \VSX, 16, \FRAME
.endm

.macro SAVE_REGS
 mflr 0
 std 016(1)
 stdu 1,-752(1)

 SAVE_GPR 141121
 SAVE_GPR 151201
 SAVE_GPR 161281
 SAVE_GPR 171361
 SAVE_GPR 181441
 SAVE_GPR 191521
 SAVE_GPR 201601
 SAVE_GPR 211681
 SAVE_GPR 221761
 SAVE_GPR 231841
 SAVE_GPR 241921
 SAVE_GPR 252001
 SAVE_GPR 262081
 SAVE_GPR 272161
 SAVE_GPR 282241
 SAVE_GPR 292321
 SAVE_GPR 302401
 SAVE_GPR 312481

 addi 91256
 SAVE_VRS 2009
 SAVE_VRS 21169
 SAVE_VRS 22329
 SAVE_VRS 23489
 SAVE_VRS 24649
 SAVE_VRS 25809
 SAVE_VRS 26969
 SAVE_VRS 271129
 SAVE_VRS 281289
 SAVE_VRS 291449
 SAVE_VRS 301609
 SAVE_VRS 311769

 SAVE_VSX 141929
 SAVE_VSX 152089
 SAVE_VSX 162249
 SAVE_VSX 172409
 SAVE_VSX 182569
 SAVE_VSX 192729
 SAVE_VSX 202889
 SAVE_VSX 213049
 SAVE_VSX 223209
 SAVE_VSX 233369
 SAVE_VSX 243529
 SAVE_VSX 253689
 SAVE_VSX 263849
 SAVE_VSX 274009
 SAVE_VSX 284169
 SAVE_VSX 294329
 SAVE_VSX 304489
 SAVE_VSX 314649
.endm # SAVE_REGS

.macro RESTORE_REGS
 addi 91256
 RESTORE_VRS 2009
 RESTORE_VRS 21169
 RESTORE_VRS 22329
 RESTORE_VRS 23489
 RESTORE_VRS 24649
 RESTORE_VRS 25809
 RESTORE_VRS 26969
 RESTORE_VRS 271129
 RESTORE_VRS 281289
 RESTORE_VRS 291449
 RESTORE_VRS 301609
 RESTORE_VRS 311769

 RESTORE_VSX 141929
 RESTORE_VSX 152089
 RESTORE_VSX 162249
 RESTORE_VSX 172409
 RESTORE_VSX 182569
 RESTORE_VSX 192729
 RESTORE_VSX 202889
 RESTORE_VSX 213049
 RESTORE_VSX 223209
 RESTORE_VSX 233369
 RESTORE_VSX 243529
 RESTORE_VSX 253689
 RESTORE_VSX 263849
 RESTORE_VSX 274009
 RESTORE_VSX 284169
 RESTORE_VSX 294329
 RESTORE_VSX 304489
 RESTORE_VSX 314649

 RESTORE_GPR 141121
 RESTORE_GPR 151201
 RESTORE_GPR 161281
 RESTORE_GPR 171361
 RESTORE_GPR 181441
 RESTORE_GPR 191521
 RESTORE_GPR 201601
 RESTORE_GPR 211681
 RESTORE_GPR 221761
 RESTORE_GPR 231841
 RESTORE_GPR 241921
 RESTORE_GPR 252001
 RESTORE_GPR 262081
 RESTORE_GPR 272161
 RESTORE_GPR 282241
 RESTORE_GPR 292321
 RESTORE_GPR 302401
 RESTORE_GPR 312481

 addi    11752
 ld 016(1)
 mtlr 0
.endm # RESTORE_REGS

#
# p[0] = a0*r0 + a1*r4*5 + a2*r3*5 + a3*r2*5 + a4*r1*5;
# p[1] = a0*r1 + a1*r0   + a2*r4*5 + a3*r3*5 + a4*r2*5;
# p[2] = a0*r2 + a1*r1   + a2*r0   + a3*r4*5 + a4*r3*5;
# p[3] = a0*r3 + a1*r2   + a2*r1   + a3*r0   + a4*r4*5;
# p[4] = a0*r4 + a1*r3   + a2*r2   + a3*r1   + a4*r0  ;
#
#    [r^2, r^3, r^1, r^4]
#    [m3,  m2,  m4,  m1]
#
# multiply odd and even words
.macro mul_odd
 vmulouw 14426
 vmulouw 1053
 vmulouw 1162
 vmulouw 1271
 vmulouw 1380
 vmulouw 15427
 vaddudm 141410
 vaddudm 141411
 vmulouw 10526
 vmulouw 1163
 vaddudm 141412
 vaddudm 141413 # x0
 vaddudm 151510
 vaddudm 151511
 vmulouw 1272
 vmulouw 1381
 vaddudm 151512
 vaddudm 151513 # x1
 vmulouw 16428
 vmulouw 10527
 vmulouw 11626
 vaddudm 161610
 vaddudm 161611
 vmulouw 1273
 vmulouw 1382
 vaddudm 161612
 vaddudm 161613 # x2
 vmulouw 17429
 vmulouw 10528
 vmulouw 11627
 vaddudm 171710
 vaddudm 171711
 vmulouw 12726
 vmulouw 1383
 vaddudm 171712
 vaddudm 171713 # x3
 vmulouw 18430
 vmulouw 10529
 vmulouw 11628
 vaddudm 181810
 vaddudm 181811
 vmulouw 12727
 vmulouw 13826
 vaddudm 181812
 vaddudm 181813 # x4
.endm

.macro mul_even
 vmuleuw 9426
 vmuleuw 1053
 vmuleuw 1162
 vmuleuw 1271
 vmuleuw 1380
 vaddudm 14149
 vaddudm 141410
 vaddudm 141411
 vaddudm 141412
 vaddudm 141413 # x0

 vmuleuw 9427
 vmuleuw 10526
 vmuleuw 1163
 vmuleuw 1272
 vmuleuw 1381
 vaddudm 15159
 vaddudm 151510
 vaddudm 151511
 vaddudm 151512
 vaddudm 151513 # x1

 vmuleuw 9428
 vmuleuw 10527
 vmuleuw 11626
 vmuleuw 1273
 vmuleuw 1382
 vaddudm 16169
 vaddudm 161610
 vaddudm 161611
 vaddudm 161612
 vaddudm 161613 # x2

 vmuleuw 9429
 vmuleuw 10528
 vmuleuw 11627
 vmuleuw 12726
 vmuleuw 1383
 vaddudm 17179
 vaddudm 171710
 vaddudm 171711
 vaddudm 171712
 vaddudm 171713 # x3

 vmuleuw 9430
 vmuleuw 10529
 vmuleuw 11628
 vmuleuw 12727
 vmuleuw 13826
 vaddudm 18189
 vaddudm 181810
 vaddudm 181811
 vaddudm 181812
 vaddudm 181813 # x4
.endm

#
# poly1305_setup_r
#
# setup r^4, r^3, r^2, r vectors
#    [r, r^3, r^2, r^4]
#    vs0 = [r0,...]
#    vs1 = [r1,...]
#    vs2 = [r2,...]
#    vs3 = [r3,...]
#    vs4 = [r4,...]
#    vs5 = [r4*5,...]
#    vs6 = [r3*5,...]
#    vs7 = [r2*5,...]
#    vs8 = [r1*5,...]
#
# r0, r4*5, r3*5, r2*5, r1*5;
# r1, r0,   r4*5, r3*5, r2*5;
# r2, r1,   r0,   r4*5, r3*5;
# r3, r2,   r1,   r0,   r4*5;
# r4, r3,   r2,   r1,   r0  ;
#
.macro poly1305_setup_r

 # save r
 xxlor 265858
 xxlor 275959
 xxlor 286060
 xxlor 296161
 xxlor 306262

 xxlxor 313131

#    [r, r^3, r^2, r^4]
 # compute r^2
 vmr 426
 vmr 527
 vmr 628
 vmr 729
 vmr 830
 bl do_mul  # r^2 r^1
 xxpermdi 5858360x3  # r0
 xxpermdi 5959370x3  # r1
 xxpermdi 6060380x3  # r2
 xxpermdi 6161390x3  # r3
 xxpermdi 6262400x3  # r4
 xxpermdi 3636360x3
 xxpermdi 3737370x3
 xxpermdi 3838380x3
 xxpermdi 3939390x3
 xxpermdi 4040400x3
 vspltisb 132
 vsld 92713
 vsld 102813
 vsld 112913
 vsld 123013
 vaddudm 0927
 vaddudm 11028
 vaddudm 21129
 vaddudm 31230

 bl do_mul  # r^4 r^3
 vmrgow 26264
 vmrgow 27275
 vmrgow 28286
 vmrgow 29297
 vmrgow 30308
 vspltisb 132
 vsld 92713
 vsld 102813
 vsld 112913
 vsld 123013
 vaddudm 0927
 vaddudm 11028
 vaddudm 21129
 vaddudm 31230

 # r^2 r^4
 xxlor 05858
 xxlor 15959
 xxlor 26060
 xxlor 36161
 xxlor 46262
 xxlor 53232
 xxlor 63333
 xxlor 73434
 xxlor 83535

 vspltw 9263
 vspltw 10262
 vmrgow 26109
 vspltw 9273
 vspltw 10272
 vmrgow 27109
 vspltw 9283
 vspltw 10282
 vmrgow 28109
 vspltw 9293
 vspltw 10292
 vmrgow 29109
 vspltw 9303
 vspltw 10302
 vmrgow 30109

 vsld 92713
 vsld 102813
 vsld 112913
 vsld 123013
 vaddudm 0927
 vaddudm 11028
 vaddudm 21129
 vaddudm 31230
.endm

SYM_FUNC_START_LOCAL(do_mul)
 mul_odd

 # do reduction ( h %= p )
 # carry reduction
 vspltisb 92
 vsrd 101431
 vsrd 111731
 vand 71725
 vand 41425
 vaddudm 181811
 vsrd 121831
 vaddudm 151510

 vsrd 111531
 vand 81825
 vand 51525
 vaddudm 4412
 vsld 10129
 vaddudm 61611

 vsrd 13631
 vand 6625
 vaddudm 4410
 vsrd 10431
 vaddudm 7713

 vsrd 11731
 vand 7725
 vand 4425
 vaddudm 5510
 vaddudm 8811
 blr
SYM_FUNC_END(do_mul)

#
# init key
#
.macro do_poly1305_init
 addis 102, rmask@toc@ha
 addi 1010, rmask@toc@l

 ld 110(10)
 ld 128(10)

 li 1416
 li 1532
 addis 102, cnum@toc@ha
 addi 1010, cnum@toc@l
 lvx 25010 # v25 - mask
 lvx 311410 # v31 = 1a
 lvx 191510 # v19 = 1 << 24
 lxv 2448(10) # vs24
 lxv 2564(10) # vs25

 # initialize
 # load key from r3 to vectors
 ld 924(3)
 ld 1032(3)
 and. 9911
 and. 101012

 # break 26 bits
 extrdi 1492638
 extrdi 1592612
 extrdi 169120
 mtvsrdd 58014
 insrdi 16101438
 mtvsrdd 59015
 extrdi 17102624
 mtvsrdd 60016
 extrdi 1810240
 mtvsrdd 61017
 mtvsrdd 62018

 # r1 = r1 * 5, r2 = r2 * 5, r3 = r3 * 5, r4 = r4 * 5
 li 95
 mtvsrdd 3609
 vmulouw 0274  # v0 = rr0
 vmulouw 1284  # v1 = rr1
 vmulouw 2294  # v2 = rr2
 vmulouw 3304  # v3 = rr3
.endm

#
# poly1305_p10le_4blocks( uint8_t *k, uint32_t mlen, uint8_t *m)
#  k = 32 bytes key
#  r3 = k (r, s)
#  r4 = mlen
#  r5 = m
#
SYM_FUNC_START(poly1305_p10le_4blocks)
.align 5
 cmpdi 564
 blt Out_no_poly1305

 SAVE_REGS

 do_poly1305_init

 li 210 # counter to message

 poly1305_setup_r

 # load previous H state
 # break/convert r6 to 26 bits
 ld 90(3)
 ld 108(3)
 ld 1916(3)
 sldi 191924
 mtvsrdd 41019
 extrdi 1492638
 extrdi 1592612
 extrdi 169120
 mtvsrdd 36014
 insrdi 16101438
 mtvsrdd 37015
 extrdi 17102624
 mtvsrdd 38016
 extrdi 1810240
 mtvsrdd 39017
 mtvsrdd 40018
 vor 889

 # input m1 m2
 add 20421
 xxlor 492424
 xxlor 502525
 lxvw4x 43020
 addi 172016
 lxvw4x 44017
 vperm 14111217
 vperm 15111218
 vand 91425 # a0
 vsrd 101431 # >> 26
 vsrd 111031 # 12 bits left
 vand 101025 # a1
 vspltisb 1312
 vand 161525
 vsld 121613
 vor 111112
 vand 111125 # a2
 vspltisb 1314
 vsrd 121513 # >> 14
 vsrd 131231 # >> 26, a4
 vand 121225 # a3

 vaddudm 2049
 vaddudm 21510
 vaddudm 22611
 vaddudm 23712
 vaddudm 24813

 # m3 m4
 addi 171716
 lxvw4x 43017
 addi 171716
 lxvw4x 44017
 vperm 14111217
 vperm 15111218
 vand 91425 # a0
 vsrd 101431 # >> 26
 vsrd 111031 # 12 bits left
 vand 101025 # a1
 vspltisb 1312
 vand 161525
 vsld 121613
 vspltisb 1314
 vor 111112
 vand 111125 # a2
 vsrd 121513 # >> 14
 vsrd 131231 # >> 26, a4
 vand 121225 # a3

 # Smash 4 message blocks into 5 vectors of [m4,  m2,  m3,  m1]
 vmrgow 4920
 vmrgow 51021
 vmrgow 61122
 vmrgow 71223
 vmrgow 81324
 vaddudm 8819

 addi 55, -64 # len -= 64
 addi 212164 # offset += 64

 li      964
 divdu   3159

 cmpdi 310
 ble Skip_block_loop

 mtctr 31

# h4 =   m1 * r⁴ + m2 * r³ + m3 * r² + m4 * r
# Rewrite the polynominal sum of product as follows,
# h1 = (h0 + m1) * r^2, h2 = (h0 + m2) * r^2
# h3 = (h1 + m3) * r^2, h4 = (h2 + m4) * r^2  --> (h0 + m1) r*4 + (h3 + m3) r^2, (h0 + m2) r^4 + (h0 + m4) r^2
#  .... Repeat
# h5 = (h3 + m5) * r^2, h6 = (h4 + m6) * r^2  -->
# h7 = (h5 + m7) * r^2, h8 = (h6 + m8) * r^1  --> m5 * r^4 + m6 * r^3 + m7 * r^2 + m8 * r
#
loop_4blocks:

 # Multiply odd words and even words
 mul_odd
 mul_even
 # carry reduction
 vspltisb 92
 vsrd 101431
 vsrd 111731
 vand 71725
 vand 41425
 vaddudm 181811
 vsrd 121831
 vaddudm 151510

 vsrd 111531
 vand 81825
 vand 51525
 vaddudm 4412
 vsld 10129
 vaddudm 61611

 vsrd 13631
 vand 6625
 vaddudm 4410
 vsrd 10431
 vaddudm 7713

 vsrd 11731
 vand 7725
 vand 4425
 vaddudm 5510
 vaddudm 8811

 # input m1  m2  m3  m4
 add 20421
 xxlor 492424
 xxlor 502525
 lxvw4x 43020
 addi 172016
 lxvw4x 44017
 vperm 14111217
 vperm 15111218
 addi 171716
 lxvw4x 43017
 addi 171716
 lxvw4x 44017
 vperm 17111217
 vperm 18111218

 vand 201425 # a0
 vand 91725 # a0
 vsrd 211431 # >> 26
 vsrd 222131 # 12 bits left
 vsrd 101731 # >> 26
 vsrd 111031 # 12 bits left

 vand 212125 # a1
 vand 101025 # a1

 vspltisb 1312
 vand 161525
 vsld 231613
 vor 222223
 vand 222225 # a2
 vand 161825
 vsld 121613
 vor 111112
 vand 111125 # a2
 vspltisb 1314
 vsrd 231513 # >> 14
 vsrd 242331 # >> 26, a4
 vand 232325 # a3
 vsrd 121813 # >> 14
 vsrd 131231 # >> 26, a4
 vand 121225 # a3

 vaddudm 4420
 vaddudm 5521
 vaddudm 6622
 vaddudm 7723
 vaddudm 8824

 # Smash 4 message blocks into 5 vectors of [m4,  m2,  m3,  m1]
 vmrgow 494
 vmrgow 5105
 vmrgow 6116
 vmrgow 7127
 vmrgow 8138
 vaddudm 8819

 addi 55, -64 # len -= 64
 addi 212164 # offset += 64

 bdnz loop_4blocks

Skip_block_loop:
 xxlor 5800
 xxlor 5911
 xxlor 6022
 xxlor 6133
 xxlor 6244
 xxlor 3255
 xxlor 3366
 xxlor 3477
 xxlor 3588

 # Multiply odd words and even words
 mul_odd
 mul_even

 # Sum the products.
 xxpermdi 4131460
 xxpermdi 4231470
 vaddudm 4149
 xxpermdi 3631363
 vaddudm 51510
 xxpermdi 3731373
 xxpermdi 4331480
 vaddudm 61611
 xxpermdi 3831383
 xxpermdi 4431490
 vaddudm 71712
 xxpermdi 3931393
 xxpermdi 4531500
 vaddudm 81813
 xxpermdi 4031403

 # carry reduction
 vspltisb 92
 vsrd 10431
 vsrd 11731
 vand 7725
 vand 4425
 vaddudm 8811
 vsrd 12831
 vaddudm 5510

 vsrd 11531
 vand 8825
 vand 5525
 vaddudm 4412
 vsld 10129
 vaddudm 6611

 vsrd 13631
 vand 6625
 vaddudm 4410
 vsrd 10431
 vaddudm 7713

 vsrd 11731
 vand 7725
 vand 4425
 vaddudm 5510
 vsrd 10531
 vand 5525
 vaddudm 6610
 vaddudm 8811

 b do_final_update

do_final_update:
 # combine 26 bit limbs
 # v4, v5, v6, v7 and v8 are 26 bit vectors
 vsld 5531
 vor 2045
 vspltisb 1112
 vsrd 12611
 vsld 6631
 vsld 6631
 vor 20206
 vspltisb 1114
 vsld 7711
 vor 21712
 mfvsrld 1640  # save last 2 bytes
 vsld 8811
 vsld 8831
 vor 21218
 mfvsrld 1752
 mfvsrld 1953
 srdi 161624

 std 170(3)
 std 198(3)
 stw 1616(3)

Out_loop:
 li 30

 RESTORE_REGS

 blr

Out_no_poly1305:
 li 30
 blr
SYM_FUNC_END(poly1305_p10le_4blocks)

#
# =======================================================================
# The following functions implement 64 x 64 bits multiplication poly1305.
#
SYM_FUNC_START_LOCAL(Poly1305_init_64)
 #  mask 0x0FFFFFFC0FFFFFFC
 #  mask 0x0FFFFFFC0FFFFFFF
 addis 102, rmask@toc@ha
 addi 1010, rmask@toc@l
 ld 110(10)
 ld 128(10)

 # initialize
 # load key from r3
 ld 924(3)
 ld 1032(3)
 and. 9911 # cramp mask r0
 and. 101012 # cramp mask r1

        srdi    21102
        add     192110      # s1: r19 - (r1 >> 2) *5

        # setup r and s
        li      250
 mtvsrdd 32+0919 # r0, s1
 mtvsrdd 32+1109 # r1, r0
 mtvsrdd 32+21925 # s1
 mtvsrdd 32+3925 # r0

 blr
SYM_FUNC_END(Poly1305_init_64)

# Poly1305_mult
# v6 = (h0, h1), v8 = h2
# v0 = (r0, s1), v1 = (r1, r0), v2 = s1, v3 = r0
#
# Output: v7, v10, v11
#
SYM_FUNC_START_LOCAL(Poly1305_mult)
 #
 # d0 = h0 * r0 + h1 * s1
 vmsumudm 7609  # h0 * r0, h1 * s1

 # d1 = h0 * r1 + h1 * r0 + h2 * s1
 vmsumudm 11619  # h0 * r1, h1 * r0
 vmsumudm 108211  # d1 += h2 * s1

 #       d2 = r0
 vmsumudm 11839  # d2 = h2 * r0
 blr
SYM_FUNC_END(Poly1305_mult)

#
# carry reduction
# h %=p
#
# Input: v7, v10, v11
# Output: r27, r28, r29
#
SYM_FUNC_START_LOCAL(Carry_reduction)
 mfvsrld 2732+7
 mfvsrld 2832+10
 mfvsrld 2932+11
 mfvsrd 2032+7 # h0.h
 mfvsrd 2132+10 # h1.h

 addc 282820
 adde 292921
 srdi 22290x2
 sldi 23220x2
 add 232322 # (h2 & 3) * 5
 addc 272723 # h0
 addze 2828  # h1
 andi. 29290x3 # h2
 blr
SYM_FUNC_END(Carry_reduction)

#
# poly1305 multiplication
# h *= r, h %= p
# d0 = h0 * r0 + h1 * s1
# d1 = h0 * r1 + h1 * r0 + h2 * s1
#       d2 = h0 * r0
#
#
# unsigned int poly1305_test_64s(unisgned char *state, const byte *src, size_t len, highbit)
#   - no highbit if final leftover block (highbit = 0)
#
SYM_FUNC_START(poly1305_64s)
 cmpdi 50
 ble Out_no_poly1305_64

 mflr 0
 std 016(1)
 stdu 1,-400(1)

 SAVE_GPR 141121
 SAVE_GPR 151201
 SAVE_GPR 161281
 SAVE_GPR 171361
 SAVE_GPR 181441
 SAVE_GPR 191521
 SAVE_GPR 201601
 SAVE_GPR 211681
 SAVE_GPR 221761
 SAVE_GPR 231841
 SAVE_GPR 241921
 SAVE_GPR 252001
 SAVE_GPR 262081
 SAVE_GPR 272161
 SAVE_GPR 282241
 SAVE_GPR 292321
 SAVE_GPR 302401
 SAVE_GPR 312481

 # Init poly1305
 bl Poly1305_init_64

 li 250   # offset to inp and outp

 add 11254

 # load h
 # h0, h1, h2?
        ld 270(3)
        ld 288(3)
        lwz 2916(3)

        li      3016
        divdu   31530

        mtctr   31

        mr      246  # highbit

Loop_block_64:
 vxor 999

 ld 200(11)
 ld 218(11)
 addi 111116

 addc 272720
 adde 282821
 adde 292924

 li 220
 mtvsrdd 32+62728 # h0, h1
 mtvsrdd 32+82922 # h2

 bl Poly1305_mult

 bl Carry_reduction

 bdnz Loop_block_64

 std 270(3)
 std 288(3)
 stw 2916(3)

 li 30

 RESTORE_GPR 141121
 RESTORE_GPR 151201
 RESTORE_GPR 161281
 RESTORE_GPR 171361
 RESTORE_GPR 181441
 RESTORE_GPR 191521
 RESTORE_GPR 201601
 RESTORE_GPR 211681
 RESTORE_GPR 221761
 RESTORE_GPR 231841
 RESTORE_GPR 241921
 RESTORE_GPR 252001
 RESTORE_GPR 262081
 RESTORE_GPR 272161
 RESTORE_GPR 282241
 RESTORE_GPR 292321
 RESTORE_GPR 302401
 RESTORE_GPR 312481

 addi    11400
 ld 016(1)
 mtlr 0

 blr

Out_no_poly1305_64:
 li 30
 blr
SYM_FUNC_END(poly1305_64s)

#
# Input: r3 = h, r4 = s, r5 = mac
# mac = h + s
#
SYM_FUNC_START(poly1305_emit_64)
 ld 100(3)
 ld 118(3)
 ld 1216(3)

 # compare modulus
 # h + 5 + (-p)
 mr 610
 mr 711
 mr 812
 addic. 665
 addze 77
 addze 88
 srdi 982  # overflow?
 cmpdi 90
 beq Skip_h64
 mr 106
 mr 117
 mr 128

Skip_h64:
 ld 60(4)
 ld 78(4)
 addc 10106
 adde 11117
 addze 1212

 std 100(5)
 std 118(5)
 blr
SYM_FUNC_END(poly1305_emit_64)

SYM_DATA_START_LOCAL(RMASK)
.align 5
rmask:
.byte 0xff, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x0f
cnum:
.long 0x03ffffff, 0x00000000, 0x03ffffff, 0x00000000
.long 0x1a, 0x00, 0x1a, 0x00
.long 0x01000000, 0x01000000, 0x01000000, 0x01000000
.long 0x00010203, 0x04050607, 0x10111213, 0x14151617
.long 0x08090a0b, 0x0c0d0e0f, 0x18191a1b, 0x1c1d1e1f
SYM_DATA_END(RMASK)

Messung V0.5 in Prozent
C=95 H=94 G=94

¤ Dauer der Verarbeitung: 0.16 Sekunden  (vorverarbeitet am  2026-06-07) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.