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 15 kB image not shown  

Quelle  chacha-p10le-8x.S

  Sprache: Sparc
 

/* SPDX-License-Identifier: GPL-2.0-or-later */
#
# Accelerated chacha20 implementation for ppc64le.
#
# Copyright 2023- IBM Corp. All rights reserved
#
#===================================================================================
# Written by Danny Tsen <dtsen@us.ibm.com>
#
# do rounds,  8 quarter rounds
1.  a += b; d ^= a; d <<<= 16;
2.  c += d; b ^= c; b <<<= 12;
3.  a += b; d ^= a; d <<<= 8;
4.  c += d; b ^= c; b <<<= 7
#
# row1 = (row1 + row2),  row4 = row1 xor row4,  row4 rotate each word by 16
# row3 = (row3 + row4),  row2 = row3 xor row2,  row2 rotate each word by 12
# row1 = (row1 + row2), row4 = row1 xor row4,  row4 rotate each word by 8
# row3 = (row3 + row4), row2 = row3 xor row2,  row2 rotate each word by 7
#
4 blocks (a b c d)
#
# a0 b0 c0 d0
# a1 b1 c1 d1
# ...
# a4 b4 c4 d4
# ...
# a8 b8 c8 d8
# ...
# a12 b12 c12 d12
# a13 ...
# a14 ...
# a15 b15 c15 d15
#
# Column round (v0, v4,  v8, v12, v1, v5,  v9, v13, v2, v6, v10, v14, v3, v7, v11, v15)
# Diagnal round (v0, v5, v10, v15, v1, v6, v11, v12, v2, v7,  v8, v13, v3, v4,  v9, v14)
#

#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

.macro QT_loop_8x
 # QR(v0, v4,  v8, v12, v1, v5,  v9, v13, v2, v6, v10, v14, v3, v7, v11, v15)
 xxlor 032+2532+25
 xxlor 32+252020
 vadduwm 004
 vadduwm 115
 vadduwm 226
 vadduwm 337
   vadduwm 161620
   vadduwm 171721
   vadduwm 181822
   vadduwm 191923

   vpermxor 1212025
   vpermxor 1313125
   vpermxor 1414225
   vpermxor 1515325
   vpermxor 28281625
   vpermxor 29291725
   vpermxor 30301825
   vpermxor 31311925
 xxlor 32+2500
 vadduwm 8812
 vadduwm 9913
 vadduwm 101014
 vadduwm 111115
   vadduwm 242428
   vadduwm 252529
   vadduwm 262630
   vadduwm 272731
 vxor 448
 vxor 559
 vxor 6610
 vxor 7711
   vxor 202024
   vxor 212125
   vxor 222226
   vxor 232327

 xxlor 032+2532+25
 xxlor 32+252121
 vrlw 4425  #
 vrlw 5525
 vrlw 6625
 vrlw 7725
   vrlw 202025  #
   vrlw 212125
   vrlw 222225
   vrlw 232325
 xxlor 32+2500
 vadduwm 004
 vadduwm 115
 vadduwm 226
 vadduwm 337
   vadduwm 161620
   vadduwm 171721
   vadduwm 181822
   vadduwm 191923

 xxlor 032+2532+25
 xxlor 32+252222
   vpermxor 1212025
   vpermxor 1313125
   vpermxor 1414225
   vpermxor 1515325
   vpermxor 28281625
   vpermxor 29291725
   vpermxor 30301825
   vpermxor 31311925
 xxlor 32+2500
 vadduwm 8812
 vadduwm 9913
 vadduwm 101014
 vadduwm 111115
   vadduwm 242428
   vadduwm 252529
   vadduwm 262630
   vadduwm 272731
 xxlor 032+2832+28
 xxlor 32+282323
 vxor 448
 vxor 559
 vxor 6610
 vxor 7711
   vxor 202024
   vxor 212125
   vxor 222226
   vxor 232327
 vrlw 4428  #
 vrlw 5528
 vrlw 6628
 vrlw 7728
   vrlw 202028  #
   vrlw 212128
   vrlw 222228
   vrlw 232328
 xxlor 32+2800

 # QR(v0, v5, v10, v15, v1, v6, v11, v12, v2, v7,  v8, v13, v3, v4,  v9, v14)
 xxlor 032+2532+25
 xxlor 32+252020
 vadduwm 005
 vadduwm 116
 vadduwm 227
 vadduwm 334
   vadduwm 161621
   vadduwm 171722
   vadduwm 181823
   vadduwm 191920

   vpermxor 1515025
   vpermxor 1212125
   vpermxor 1313225
   vpermxor 1414325
   vpermxor 31311625
   vpermxor 28281725
   vpermxor 29291825
   vpermxor 30301925

 xxlor 32+2500
 vadduwm 101015
 vadduwm 111112
 vadduwm 8813
 vadduwm 9914
   vadduwm 262631
   vadduwm 272728
   vadduwm 242429
   vadduwm 252530
 vxor 5510
 vxor 6611
 vxor 778
 vxor 449
   vxor 212126
   vxor 222227
   vxor 232324
   vxor 202025

 xxlor 032+2532+25
 xxlor 32+252121
 vrlw 5525
 vrlw 6625
 vrlw 7725
 vrlw 4425
   vrlw 212125
   vrlw 222225
   vrlw 232325
   vrlw 202025
 xxlor 32+2500

 vadduwm 005
 vadduwm 116
 vadduwm 227
 vadduwm 334
   vadduwm 161621
   vadduwm 171722
   vadduwm 181823
   vadduwm 191920

 xxlor 032+2532+25
 xxlor 32+252222
   vpermxor 1515025
   vpermxor 1212125
   vpermxor 1313225
   vpermxor 1414325
   vpermxor 31311625
   vpermxor 28281725
   vpermxor 29291825
   vpermxor 30301925
 xxlor 32+2500

 vadduwm 101015
 vadduwm 111112
 vadduwm 8813
 vadduwm 9914
   vadduwm 262631
   vadduwm 272728
   vadduwm 242429
   vadduwm 252530

 xxlor 032+2832+28
 xxlor 32+282323
 vxor 5510
 vxor 6611
 vxor 778
 vxor 449
   vxor 212126
   vxor 222227
   vxor 232324
   vxor 202025
 vrlw 5528
 vrlw 6628
 vrlw 7728
 vrlw 4428
   vrlw 212128
   vrlw 222228
   vrlw 232328
   vrlw 202028
 xxlor 32+2800
.endm

.macro QT_loop_4x
 # QR(v0, v4,  v8, v12, v1, v5,  v9, v13, v2, v6, v10, v14, v3, v7, v11, v15)
 vadduwm 004
 vadduwm 115
 vadduwm 226
 vadduwm 337
   vpermxor 1212020
   vpermxor 1313120
   vpermxor 1414220
   vpermxor 1515320
 vadduwm 8812
 vadduwm 9913
 vadduwm 101014
 vadduwm 111115
 vxor 448
 vxor 559
 vxor 6610
 vxor 7711
 vrlw 4421
 vrlw 5521
 vrlw 6621
 vrlw 7721
 vadduwm 004
 vadduwm 115
 vadduwm 226
 vadduwm 337
   vpermxor 1212022
   vpermxor 1313122
   vpermxor 1414222
   vpermxor 1515322
 vadduwm 8812
 vadduwm 9913
 vadduwm 101014
 vadduwm 111115
 vxor 448
 vxor 559
 vxor 6610
 vxor 7711
 vrlw 4423
 vrlw 5523
 vrlw 6623
 vrlw 7723

 # QR(v0, v5, v10, v15, v1, v6, v11, v12, v2, v7,  v8, v13, v3, v4,  v9, v14)
 vadduwm 005
 vadduwm 116
 vadduwm 227
 vadduwm 334
   vpermxor 1515020
   vpermxor 1212120
   vpermxor 1313220
   vpermxor 1414320
 vadduwm 101015
 vadduwm 111112
 vadduwm 8813
 vadduwm 9914
 vxor 5510
 vxor 6611
 vxor 778
 vxor 449
 vrlw 5521
 vrlw 6621
 vrlw 7721
 vrlw 4421
 vadduwm 005
 vadduwm 116
 vadduwm 227
 vadduwm 334
   vpermxor 1515022
   vpermxor 1212122
   vpermxor 1313222
   vpermxor 1414322
 vadduwm 101015
 vadduwm 111112
 vadduwm 8813
 vadduwm 9914
 vxor 5510
 vxor 6611
 vxor 778
 vxor 449
 vrlw 5523
 vrlw 6623
 vrlw 7723
 vrlw 4423
.endm

# Transpose
.macro TP_4x a0 a1 a2 a3
 xxmrghw  1032+\a0, 32+\a1 # a0, a1, b0, b1
 xxmrghw  1132+\a2, 32+\a3 # a2, a3, b2, b3
 xxmrglw  1232+\a0, 32+\a1 # c0, c1, d0, d1
 xxmrglw  1332+\a2, 32+\a3 # c2, c3, d2, d3
 xxpermdi 32+\a0, 10110 # a0, a1, a2, a3
 xxpermdi 32+\a1, 10113 # b0, b1, b2, b3
 xxpermdi 32+\a2, 12130 # c0, c1, c2, c3
 xxpermdi 32+\a3, 12133 # d0, d1, d2, d3
.endm

# key stream = working state + state
.macro Add_state S
 vadduwm \S+0, \S+016-\S
 vadduwm \S+4, \S+417-\S
 vadduwm \S+8, \S+818-\S
 vadduwm \S+12, \S+1219-\S

 vadduwm \S+1, \S+116-\S
 vadduwm \S+5, \S+517-\S
 vadduwm \S+9, \S+918-\S
 vadduwm \S+13, \S+1319-\S

 vadduwm \S+2, \S+216-\S
 vadduwm \S+6, \S+617-\S
 vadduwm \S+10, \S+1018-\S
 vadduwm \S+14, \S+1419-\S

 vadduwm \S+3, \S+316-\S
 vadduwm \S+7, \S+717-\S
 vadduwm \S+11, \S+1118-\S
 vadduwm \S+15, \S+1519-\S
.endm

#
# write 256 bytes
#
.macro Write_256 S
 add 9145
 add 16144
 lxvw4x 009
 lxvw4x 1179
 lxvw4x 2189
 lxvw4x 3199
 lxvw4x 4209
 lxvw4x 5219
 lxvw4x 6229
 lxvw4x 7239
 lxvw4x 8249
 lxvw4x 9259
 lxvw4x 10269
 lxvw4x 11279
 lxvw4x 12289
 lxvw4x 13299
 lxvw4x 14309
 lxvw4x 15319

 xxlxor \S+32, \S+320
 xxlxor \S+36, \S+361
 xxlxor \S+40, \S+402
 xxlxor \S+44, \S+443
 xxlxor \S+33, \S+334
 xxlxor \S+37, \S+375
 xxlxor \S+41, \S+416
 xxlxor \S+45, \S+457
 xxlxor \S+34, \S+348
 xxlxor \S+38, \S+389
 xxlxor \S+42, \S+4210
 xxlxor \S+46, \S+4611
 xxlxor \S+35, \S+3512
 xxlxor \S+39, \S+3913
 xxlxor \S+43, \S+4314
 xxlxor \S+47, \S+4715

 stxvw4x \S+32016
 stxvw4x \S+361716
 stxvw4x \S+401816
 stxvw4x \S+441916

 stxvw4x \S+332016
 stxvw4x \S+372116
 stxvw4x \S+412216
 stxvw4x \S+452316

 stxvw4x \S+342416
 stxvw4x \S+382516
 stxvw4x \S+422616
 stxvw4x \S+462716

 stxvw4x \S+352816
 stxvw4x \S+392916
 stxvw4x \S+433016
 stxvw4x \S+473116

.endm

#
# void chacha_p10le_8x(const struct chacha_state *state, u8 *dst, const u8 *src,
#         unsigned int len, int nrounds);
#
SYM_FUNC_START(chacha_p10le_8x)
.align 5
 cmpdi 60
 ble Out_no_chacha

 SAVE_REGS

 # r17 - r31 mainly for Write_256 macro.
 li 1716
 li 1832
 li 1948
 li 2064
 li 2180
 li 2296
 li 23112
 li 24128
 li 25144
 li 26160
 li 27176
 li 28192
 li 29208
 li 30224
 li 31240

 mr 156   # len
 li 140   # offset to inp and outp

        lxvw4x 4803  #  vr16, constants
 lxvw4x 49173  #  vr17, key 1
 lxvw4x 50183  #  vr18, key 2
 lxvw4x 51193  #  vr19, counter, nonce

 # create (0123) counters
 vspltisw 00
 vspltisw 11
 vspltisw 22
 vspltisw 33
 vmrghw 401
 vmrglw 523
 vsldoi 30458  # vr30 counter, 4 (0123)

 vspltisw 2112
 vspltisw 237

 addis 112, permx@toc@ha
 addi 1111, permx@toc@l
 lxvw4x 32+20011
 lxvw4x 32+221711

 sradi 871

 mtctr 8

 # save constants to vsx
 xxlor 164848
 xxlor 174949
 xxlor 185050
 xxlor 195151

 vspltisw 254
 vspltisw 268

 xxlor 2532+2632+26
 xxlor 2432+2532+25

 vadduwm 313025  # counter = (0123) + (4444)
 xxlor 3032+3032+30
 xxlor 3132+3132+31

 xxlor 2032+2032+20
 xxlor 2132+2132+21
 xxlor 2232+2232+22
 xxlor 2332+2332+23

 cmpdi 6512
 blt Loop_last

Loop_8x:
 xxspltw  32+0160
 xxspltw  32+1161
 xxspltw  32+2162
 xxspltw  32+3163

 xxspltw  32+4170
 xxspltw  32+5171
 xxspltw  32+6172
 xxspltw  32+7173
 xxspltw  32+8180
 xxspltw  32+9181
 xxspltw  32+10182
 xxspltw  32+11183
 xxspltw  32+12190
 xxspltw  32+13191
 xxspltw  32+14192
 xxspltw  32+15193
 vadduwm 121230 # increase counter

 xxspltw  32+16160
 xxspltw  32+17161
 xxspltw  32+18162
 xxspltw  32+19163

 xxspltw  32+20170
 xxspltw  32+21171
 xxspltw  32+22172
 xxspltw  32+23173
 xxspltw  32+24180
 xxspltw  32+25181
 xxspltw  32+26182
 xxspltw  32+27183
 xxspltw  32+28190
 xxspltw  32+29191
 vadduwm 282831 # increase counter
 xxspltw  32+30192
 xxspltw  32+31193

.align 5
quarter_loop_8x:
 QT_loop_8x

 bdnz quarter_loop_8x

 xxlor 032+3032+30
 xxlor 32+303030
 vadduwm 121230
 xxlor 32+3000
 TP_4x 0123
 TP_4x 4567
 TP_4x 891011
 TP_4x 12131415

 xxlor 04848
 xxlor 14949
 xxlor 25050
 xxlor 35151
 xxlor 481616
 xxlor 491717
 xxlor 501818
 xxlor 511919
 Add_state 0
 xxlor 4800
 xxlor 4911
 xxlor 5022
 xxlor 5133
 Write_256 0
 addi 1414256 # offset +=256
 addi 1515, -256 # len -=256

 xxlor 532+3132+31
 xxlor 32+313131
 vadduwm 282831
 xxlor 32+3155
 TP_4x 16+016+116+216+3
 TP_4x 16+416+516+616+7
 TP_4x 16+816+916+1016+11
 TP_4x 16+1216+1316+1416+15

 xxlor 321616
 xxlor 331717
 xxlor 341818
 xxlor 351919
 Add_state 16
 Write_256 16
 addi 1414256 # offset +=256
 addi 1515, -256 # len +=256

 xxlor 32+242424
 xxlor 32+252525
 xxlor 32+303030
 vadduwm 303025
 vadduwm 313024
 xxlor 3032+3032+30
 xxlor 3132+3132+31

 cmpdi 150
 beq Out_loop

 cmpdi 15512
 blt Loop_last

 mtctr 8
 b Loop_8x

Loop_last:
        lxvw4x 4803  #  vr16, constants
 lxvw4x 49173  #  vr17, key 1
 lxvw4x 50183  #  vr18, key 2
 lxvw4x 51193  #  vr19, counter, nonce

 vspltisw 2112
 vspltisw 237
 addis 112, permx@toc@ha
 addi 1111, permx@toc@l
 lxvw4x 32+20011
 lxvw4x 32+221711

 sradi 871
 mtctr 8

Loop_4x:
 vspltw  0160
 vspltw  1161
 vspltw  2162
 vspltw  3163

 vspltw  4170
 vspltw  5171
 vspltw  6172
 vspltw  7173
 vspltw  8180
 vspltw  9181
 vspltw  10182
 vspltw  11183
 vspltw  12190
 vadduwm 121230 # increase counter
 vspltw  13191
 vspltw  14192
 vspltw  15193

.align 5
quarter_loop:
 QT_loop_4x

 bdnz quarter_loop

 vadduwm 121230
 TP_4x 0123
 TP_4x 4567
 TP_4x 891011
 TP_4x 12131415

 Add_state 0
 Write_256 0
 addi 1414256 # offset += 256
 addi 1515, -256 # len += 256

 # Update state counter
 vspltisw 254
 vadduwm 303025

 cmpdi 150
 beq Out_loop
 cmpdi 15256
 blt Out_loop

 mtctr 8
 b Loop_4x

Out_loop:
 RESTORE_REGS
 blr

Out_no_chacha:
 li 30
 blr
SYM_FUNC_END(chacha_p10le_8x)

SYM_DATA_START_LOCAL(PERMX)
.align 5
permx:
.long 0x22330011, 0x66774455, 0xaabb8899, 0xeeffccdd
.long 0x11223300, 0x55667744, 0x99aabb88, 0xddeeffcc
SYM_DATA_END(PERMX)

Messung V0.5 in Prozent
C=97 H=96 G=96

¤ Dauer der Verarbeitung: 0.15 Sekunden  (vorverarbeitet am  2026-06-08) ¤

*© 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.