Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ossl: Update the generated assembly files from OpenSSL 3.0. #56

Open
wants to merge 1 commit into
base: RELENG_2_7_2
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
732 changes: 724 additions & 8 deletions sys/crypto/openssl/aarch64/armv8-mont.S

Large diffs are not rendered by default.

1,553 changes: 805 additions & 748 deletions sys/crypto/openssl/aarch64/chacha-armv8.S

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions sys/crypto/openssl/aarch64/ecp_nistz256-armv8.S
Original file line number Diff line number Diff line change
Expand Up @@ -3823,7 +3823,7 @@ ecp_nistz256_ord_mul_mont:

////////////////////////////////////////////////////////////////////////
// void ecp_nistz256_ord_sqr_mont(uint64_t res[4], uint64_t a[4],
// int rep);
// uint64_t rep);
.globl ecp_nistz256_ord_sqr_mont
.type ecp_nistz256_ord_sqr_mont,%function
.align 4
Expand Down Expand Up @@ -4023,7 +4023,7 @@ ecp_nistz256_scatter_w5:

ldp x4,x5,[x1] // X
ldp x6,x7,[x1,#16]
str w4,[x0,#64*0-4]
stur w4,[x0,#64*0-4]
lsr x4,x4,#32
str w5,[x0,#64*1-4]
lsr x5,x5,#32
Expand All @@ -4039,7 +4039,7 @@ ecp_nistz256_scatter_w5:

ldp x4,x5,[x1,#32] // Y
ldp x6,x7,[x1,#48]
str w4,[x0,#64*0-4]
stur w4,[x0,#64*0-4]
lsr x4,x4,#32
str w5,[x0,#64*1-4]
lsr x5,x5,#32
Expand All @@ -4055,7 +4055,7 @@ ecp_nistz256_scatter_w5:

ldp x4,x5,[x1,#64] // Z
ldp x6,x7,[x1,#80]
str w4,[x0,#64*0-4]
stur w4,[x0,#64*0-4]
lsr x4,x4,#32
str w5,[x0,#64*1-4]
lsr x5,x5,#32
Expand Down
1 change: 1 addition & 0 deletions sys/crypto/openssl/aarch64/ghashv8-armx.S
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include "arm_arch.h"

#if __ARM_MAX_ARCH__>=7
.arch armv8-a+crypto
.text
.globl gcm_init_v8
.type gcm_init_v8,%function
Expand Down
190 changes: 52 additions & 138 deletions sys/crypto/openssl/aarch64/keccak1600-armv8.S
Original file line number Diff line number Diff line change
Expand Up @@ -574,22 +574,22 @@ SHA3_squeeze:
.type KeccakF1600_ce,%function
.align 5
KeccakF1600_ce:
mov x9,#12
mov x9,#24
adr x10,iotas
b .Loop_ce
.align 4
.Loop_ce:
////////////////////////////////////////////////// Theta
.inst 0xce052819 //eor3 v25.16b,v0.16b,v5.16b,v10.16b
.inst 0xce062c3a //eor3 v26.16b,v1.16b,v6.16b,v11.16b
.inst 0xce07305b //eor3 v27.16b,v2.16b,v7.16b,v12.16b
.inst 0xce08347c //eor3 v28.16b,v3.16b,v8.16b,v13.16b
.inst 0xce09389d //eor3 v29.16b,v4.16b,v9.16b,v14.16b
.inst 0xce0f5339 //eor3 v25.16b,v25.16b, v15.16b,v20.16b
.inst 0xce10575a //eor3 v26.16b,v26.16b, v16.16b,v21.16b
.inst 0xce115b7b //eor3 v27.16b,v27.16b, v17.16b,v22.16b
.inst 0xce125f9c //eor3 v28.16b,v28.16b, v18.16b,v23.16b
.inst 0xce1363bd //eor3 v29.16b,v29.16b, v19.16b,v24.16b
.inst 0xce0f2a99 //eor3 v25.16b,v20.16b,v15.16b,v10.16b
.inst 0xce102eba //eor3 v26.16b,v21.16b,v16.16b,v11.16b
.inst 0xce1132db //eor3 v27.16b,v22.16b,v17.16b,v12.16b
.inst 0xce1236fc //eor3 v28.16b,v23.16b,v18.16b,v13.16b
.inst 0xce133b1d //eor3 v29.16b,v24.16b,v19.16b,v14.16b
.inst 0xce050339 //eor3 v25.16b,v25.16b, v5.16b,v0.16b
.inst 0xce06075a //eor3 v26.16b,v26.16b, v6.16b,v1.16b
.inst 0xce070b7b //eor3 v27.16b,v27.16b, v7.16b,v2.16b
.inst 0xce080f9c //eor3 v28.16b,v28.16b, v8.16b,v3.16b
.inst 0xce0913bd //eor3 v29.16b,v29.16b, v9.16b,v4.16b

.inst 0xce7b8f3e //rax1 v30.16b,v25.16b,v27.16b // D[1]
.inst 0xce7c8f5f //rax1 v31.16b,v26.16b,v28.16b // D[2]
Expand All @@ -598,13 +598,15 @@ KeccakF1600_ce:
.inst 0xce7a8fbd //rax1 v29.16b,v29.16b,v26.16b // D[0]

////////////////////////////////////////////////// Theta+Rho+Pi
.inst 0xce9e50d9 //xar v25.16b, v6.16b,v30.16b,#64-44 // C[0]=A[0][1]
.inst 0xce9efc39 //xar v25.16b, v1.16b,v30.16b,#64-1 // C[0]=A[2][0]

.inst 0xce9e50c1 //xar v1.16b,v6.16b,v30.16b,#64-44
.inst 0xce9cb126 //xar v6.16b,v9.16b,v28.16b,#64-20
.inst 0xce9f0ec9 //xar v9.16b,v22.16b,v31.16b,#64-61
.inst 0xce9c65d6 //xar v22.16b,v14.16b,v28.16b,#64-39
.inst 0xce9dba8e //xar v14.16b,v20.16b,v29.16b,#64-18

.inst 0xce9f0854 //xar v20.16b,v2.16b,v31.16b,#64-62
.inst 0xce9f085a //xar v26.16b, v2.16b,v31.16b,#64-62 // C[1]=A[4][0]

.inst 0xce9f5582 //xar v2.16b,v12.16b,v31.16b,#64-43
.inst 0xce9b9dac //xar v12.16b,v13.16b,v27.16b,#64-25
Expand All @@ -614,145 +616,57 @@ KeccakF1600_ce:

.inst 0xce9c948f //xar v15.16b,v4.16b,v28.16b,#64-27

eor v0.16b,v0.16b,v29.16b
ldr x11,[x10],#8

.inst 0xce9bae5a //xar v26.16b, v18.16b,v27.16b,#64-21 // C[1]=A[0][3]
.inst 0xce9fc632 //xar v18.16b,v17.16b,v31.16b,#64-15
.inst 0xce9ed971 //xar v17.16b,v11.16b,v30.16b,#64-10
.inst 0xce9fe8eb //xar v11.16b,v7.16b,v31.16b,#64-6
.inst 0xce9df547 //xar v7.16b,v10.16b,v29.16b,#64-3

.inst 0xce9efc2a //xar v10.16b,v1.16b,v30.16b,#64-1 // *

.inst 0xce9ccb04 //xar v4.16b,v24.16b,v28.16b,#64-14
.inst 0xce9ccb1c //xar v28.16b, v24.16b,v28.16b,#64-14 // D[4]=A[0][4]
.inst 0xce9efab8 //xar v24.16b,v21.16b,v30.16b,#64-2
.inst 0xce9b2515 //xar v21.16b,v8.16b,v27.16b,#64-55
.inst 0xce9e4e08 //xar v8.16b,v16.16b,v30.16b,#64-45
.inst 0xce9b2508 //xar v8.16b,v8.16b,v27.16b,#64-55 // A[1][3]=A[4][1]
.inst 0xce9e4e04 //xar v4.16b,v16.16b,v30.16b,#64-45 // A[0][4]=A[1][3]
.inst 0xce9d70b0 //xar v16.16b,v5.16b,v29.16b,#64-36

.inst 0xce9b907b //xar v27.16b, v3.16b,v27.16b,#64-28 // C[2]=A[1][0]
.inst 0xce9b9065 //xar v5.16b,v3.16b,v27.16b,#64-28

////////////////////////////////////////////////// Chi+Iota
dup v31.2d,x11 // borrow C[6]
.inst 0xce22641c //bcax v28.16b, v0.16b,v2.16b,v25.16b // *
.inst 0xce3a0b21 //bcax v1.16b,v25.16b, v26.16b, v2.16b // *
.inst 0xce246842 //bcax v2.16b,v2.16b,v4.16b,v26.16b
.inst 0xce201343 //bcax v3.16b,v26.16b, v0.16b,v4.16b
.inst 0xce390084 //bcax v4.16b,v4.16b,v25.16b, v0.16b

.inst 0xce271b65 //bcax v5.16b,v27.16b, v7.16b,v6.16b // *
.inst 0xce281cd9 //bcax v25.16b, v6.16b,v8.16b,v7.16b // *
.inst 0xce2920e7 //bcax v7.16b,v7.16b,v9.16b,v8.16b
.inst 0xce3b2508 //bcax v8.16b,v8.16b,v27.16b, v9.16b
.inst 0xce266d29 //bcax v9.16b,v9.16b,v6.16b,v27.16b

eor v0.16b,v28.16b,v31.16b // Iota

.inst 0xce2c2d5a //bcax v26.16b, v10.16b,v12.16b,v11.16b // *
.inst 0xce2d317b //bcax v27.16b, v11.16b,v13.16b,v12.16b // *
.inst 0xce2e358c //bcax v12.16b,v12.16b,v14.16b,v13.16b
.inst 0xce2a39ad //bcax v13.16b,v13.16b,v10.16b,v14.16b
.inst 0xce2b29ce //bcax v14.16b,v14.16b,v11.16b,v10.16b
eor v0.16b,v0.16b,v29.16b

.inst 0xce3141fc //bcax v28.16b, v15.16b,v17.16b,v16.16b // *
.inst 0xce32461d //bcax v29.16b, v16.16b,v18.16b,v17.16b // *
.inst 0xce334a31 //bcax v17.16b,v17.16b,v19.16b,v18.16b
.inst 0xce2f4e52 //bcax v18.16b,v18.16b,v15.16b,v19.16b
.inst 0xce303e73 //bcax v19.16b,v19.16b,v16.16b,v15.16b
.inst 0xce9bae5b //xar v27.16b, v18.16b,v27.16b,#64-21 // D[3]=A[0][3]
.inst 0xce9fc623 //xar v3.16b,v17.16b,v31.16b,#64-15 // A[0][3]=A[3][3]
.inst 0xce9ed97e //xar v30.16b, v11.16b,v30.16b,#64-10 // D[1]=A[3][2]
.inst 0xce9fe8ff //xar v31.16b, v7.16b,v31.16b,#64-6 // D[2]=A[2][1]
.inst 0xce9df55d //xar v29.16b, v10.16b,v29.16b,#64-3 // D[0]=A[1][2]

.inst 0xce36569e //bcax v30.16b, v20.16b,v22.16b,v21.16b // *
.inst 0xce375abf //bcax v31.16b, v21.16b,v23.16b,v22.16b // *
////////////////////////////////////////////////// Chi+Iota
.inst 0xce362354 //bcax v20.16b,v26.16b, v22.16b,v8.16b // A[1][3]=A[4][1]
.inst 0xce375915 //bcax v21.16b,v8.16b,v23.16b,v22.16b // A[1][3]=A[4][1]
.inst 0xce385ed6 //bcax v22.16b,v22.16b,v24.16b,v23.16b
.inst 0xce3462f7 //bcax v23.16b,v23.16b,v20.16b,v24.16b
.inst 0xce355318 //bcax v24.16b,v24.16b,v21.16b,v20.16b
////////////////////////////////////////////////// Theta
.inst 0xce056806 //eor3 v6.16b,v0.16b,v5.16b,v26.16b
.inst 0xce196c2a //eor3 v10.16b,v1.16b,v25.16b,v27.16b
.inst 0xce07304b //eor3 v11.16b,v2.16b,v7.16b,v12.16b
.inst 0xce08346f //eor3 v15.16b,v3.16b,v8.16b,v13.16b
.inst 0xce093890 //eor3 v16.16b,v4.16b,v9.16b,v14.16b
.inst 0xce1c78c6 //eor3 v6.16b,v6.16b, v28.16b,v30.16b
.inst 0xce1d7d4a //eor3 v10.16b,v10.16b, v29.16b,v31.16b
.inst 0xce11596b //eor3 v11.16b,v11.16b, v17.16b,v22.16b
.inst 0xce125def //eor3 v15.16b,v15.16b, v18.16b,v23.16b
.inst 0xce136210 //eor3 v16.16b,v16.16b, v19.16b,v24.16b

.inst 0xce6b8cd4 //rax1 v20.16b,v6.16b,v11.16b // D[1]
.inst 0xce6f8d55 //rax1 v21.16b,v10.16b,v15.16b // D[2]
.inst 0xce708d6b //rax1 v11.16b,v11.16b,v16.16b // D[3]
.inst 0xce668def //rax1 v15.16b,v15.16b,v6.16b // D[4]
.inst 0xce6a8e10 //rax1 v16.16b,v16.16b,v10.16b // D[0]
.inst 0xce3a62f7 //bcax v23.16b,v23.16b,v26.16b, v24.16b
.inst 0xce286b18 //bcax v24.16b,v24.16b,v8.16b,v26.16b // A[1][3]=A[4][1]

////////////////////////////////////////////////// Theta+Rho+Pi
.inst 0xce945326 //xar v6.16b, v25.16b,v20.16b,#64-44 // C[0]=A[0][1]
.inst 0xce8fb139 //xar v25.16b,v9.16b,v15.16b,#64-20
.inst 0xce950ec9 //xar v9.16b,v22.16b,v21.16b,#64-61
.inst 0xce8f65d6 //xar v22.16b,v14.16b,v15.16b,#64-39
.inst 0xce90bbce //xar v14.16b,v30.16b,v16.16b,#64-18

.inst 0xce95085e //xar v30.16b,v2.16b,v21.16b,#64-62

.inst 0xce955582 //xar v2.16b,v12.16b,v21.16b,#64-43
.inst 0xce8b9dac //xar v12.16b,v13.16b,v11.16b,#64-25
.inst 0xce8fe26d //xar v13.16b,v19.16b,v15.16b,#64-8
.inst 0xce8b22f3 //xar v19.16b,v23.16b,v11.16b,#64-56
.inst 0xce905f97 //xar v23.16b,v28.16b,v16.16b,#64-41

.inst 0xce8f949c //xar v28.16b,v4.16b,v15.16b,#64-27

eor v0.16b,v0.16b,v16.16b
ldr x11,[x10],#8

.inst 0xce8bae4a //xar v10.16b, v18.16b,v11.16b,#64-21 // C[1]=A[0][3]
.inst 0xce95c632 //xar v18.16b,v17.16b,v21.16b,#64-15
.inst 0xce94db71 //xar v17.16b,v27.16b,v20.16b,#64-10
.inst 0xce95e8fb //xar v27.16b,v7.16b,v21.16b,#64-6
.inst 0xce90f747 //xar v7.16b,v26.16b,v16.16b,#64-3
ld1r {v26.2d},[x10],#8

.inst 0xce94fc3a //xar v26.16b,v1.16b,v20.16b,#64-1 // *
.inst 0xce330fd1 //bcax v17.16b,v30.16b, v19.16b,v3.16b // A[0][3]=A[3][3]
.inst 0xce2f4c72 //bcax v18.16b,v3.16b,v15.16b,v19.16b // A[0][3]=A[3][3]
.inst 0xce303e73 //bcax v19.16b,v19.16b,v16.16b,v15.16b
.inst 0xce3e41ef //bcax v15.16b,v15.16b,v30.16b, v16.16b
.inst 0xce237a10 //bcax v16.16b,v16.16b,v3.16b,v30.16b // A[0][3]=A[3][3]

.inst 0xce8fcb04 //xar v4.16b,v24.16b,v15.16b,#64-14
.inst 0xce94fbf8 //xar v24.16b,v31.16b,v20.16b,#64-2
.inst 0xce8b251f //xar v31.16b,v8.16b,v11.16b,#64-55
.inst 0xce944fa8 //xar v8.16b,v29.16b,v20.16b,#64-45
.inst 0xce9070bd //xar v29.16b,v5.16b,v16.16b,#64-36
.inst 0xce2c7f2a //bcax v10.16b,v25.16b, v12.16b,v31.16b
.inst 0xce2d33eb //bcax v11.16b,v31.16b, v13.16b,v12.16b
.inst 0xce2e358c //bcax v12.16b,v12.16b,v14.16b,v13.16b
.inst 0xce3939ad //bcax v13.16b,v13.16b,v25.16b, v14.16b
.inst 0xce3f65ce //bcax v14.16b,v14.16b,v31.16b, v25.16b

.inst 0xce8b906b //xar v11.16b, v3.16b,v11.16b,#64-28 // C[2]=A[1][0]
.inst 0xce2913a7 //bcax v7.16b,v29.16b, v9.16b,v4.16b // A[0][4]=A[1][3]
.inst 0xce252488 //bcax v8.16b,v4.16b,v5.16b,v9.16b // A[0][4]=A[1][3]
.inst 0xce261529 //bcax v9.16b,v9.16b,v6.16b,v5.16b
.inst 0xce3d18a5 //bcax v5.16b,v5.16b,v29.16b, v6.16b
.inst 0xce2474c6 //bcax v6.16b,v6.16b,v4.16b,v29.16b // A[0][4]=A[1][3]

////////////////////////////////////////////////// Chi+Iota
dup v21.2d,x11 // borrow C[6]
.inst 0xce22180f //bcax v15.16b, v0.16b,v2.16b,v6.16b // *
.inst 0xce2a08c1 //bcax v1.16b,v6.16b, v10.16b, v2.16b // *
.inst 0xce242842 //bcax v2.16b,v2.16b,v4.16b,v10.16b
.inst 0xce201143 //bcax v3.16b,v10.16b, v0.16b,v4.16b
.inst 0xce260084 //bcax v4.16b,v4.16b,v6.16b, v0.16b

.inst 0xce276565 //bcax v5.16b,v11.16b, v7.16b,v25.16b // *
.inst 0xce281f26 //bcax v6.16b, v25.16b,v8.16b,v7.16b // *
.inst 0xce2920e7 //bcax v7.16b,v7.16b,v9.16b,v8.16b
.inst 0xce2b2508 //bcax v8.16b,v8.16b,v11.16b, v9.16b
.inst 0xce392d29 //bcax v9.16b,v9.16b,v25.16b,v11.16b

eor v0.16b,v15.16b,v21.16b // Iota

.inst 0xce2c6f4a //bcax v10.16b, v26.16b,v12.16b,v27.16b // *
.inst 0xce2d336b //bcax v11.16b, v27.16b,v13.16b,v12.16b // *
.inst 0xce2e358c //bcax v12.16b,v12.16b,v14.16b,v13.16b
.inst 0xce3a39ad //bcax v13.16b,v13.16b,v26.16b,v14.16b
.inst 0xce3b69ce //bcax v14.16b,v14.16b,v27.16b,v26.16b
.inst 0xce207363 //bcax v3.16b,v27.16b, v0.16b,v28.16b
.inst 0xce210384 //bcax v4.16b,v28.16b, v1.16b,v0.16b
.inst 0xce220400 //bcax v0.16b,v0.16b,v2.16b,v1.16b
.inst 0xce3b0821 //bcax v1.16b,v1.16b,v27.16b, v2.16b
.inst 0xce3c6c42 //bcax v2.16b,v2.16b,v28.16b, v27.16b

.inst 0xce31778f //bcax v15.16b, v28.16b,v17.16b,v29.16b // *
.inst 0xce3247b0 //bcax v16.16b, v29.16b,v18.16b,v17.16b // *
.inst 0xce334a31 //bcax v17.16b,v17.16b,v19.16b,v18.16b
.inst 0xce3c4e52 //bcax v18.16b,v18.16b,v28.16b,v19.16b
.inst 0xce3d7273 //bcax v19.16b,v19.16b,v29.16b,v28.16b
eor v0.16b,v0.16b,v26.16b

.inst 0xce367fd4 //bcax v20.16b, v30.16b,v22.16b,v31.16b // *
.inst 0xce375bf5 //bcax v21.16b, v31.16b,v23.16b,v22.16b // *
.inst 0xce385ed6 //bcax v22.16b,v22.16b,v24.16b,v23.16b
.inst 0xce3e62f7 //bcax v23.16b,v23.16b,v30.16b,v24.16b
.inst 0xce3f7b18 //bcax v24.16b,v24.16b,v31.16b,v30.16b
subs x9,x9,#1
bne .Loop_ce

Expand Down
31 changes: 12 additions & 19 deletions sys/crypto/openssl/aarch64/poly1305-armv8.S
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,12 @@ poly1305_init:
csel x0,xzr,x0,eq
b.eq .Lno_key

#ifdef __ILP32__
ldrsw x11,.LOPENSSL_armcap_P
#else
ldr x11,.LOPENSSL_armcap_P
#endif
adr x10,.LOPENSSL_armcap_P
adrp x17,OPENSSL_armcap_P
ldr w17,[x17,#:lo12:OPENSSL_armcap_P]

ldp x7,x8,[x1] // load key
mov x9,#0xfffffffc0fffffff
movk x9,#0x0fff,lsl#48
ldr w17,[x10,x11]
#ifdef __ARMEB__
rev x7,x7 // flip bytes
rev x8,x8
Expand All @@ -45,10 +40,10 @@ poly1305_init:

tst w17,#ARMV7_NEON

adr x12,poly1305_blocks
adr x7,poly1305_blocks_neon
adr x13,poly1305_emit
adr x8,poly1305_emit_neon
adr x12,.Lpoly1305_blocks
adr x7,.Lpoly1305_blocks_neon
adr x13,.Lpoly1305_emit
adr x8,.Lpoly1305_emit_neon

csel x12,x12,x7,eq
csel x13,x13,x8,eq
Expand All @@ -67,6 +62,7 @@ poly1305_init:
.type poly1305_blocks,%function
.align 5
poly1305_blocks:
.Lpoly1305_blocks:
ands x2,x2,#-16
b.eq .Lno_data

Expand Down Expand Up @@ -131,6 +127,7 @@ poly1305_blocks:
.type poly1305_emit,%function
.align 5
poly1305_emit:
.Lpoly1305_emit:
ldp x4,x5,[x0] // load hash base 2^64
ldr x6,[x0,#16]
ldp x10,x11,[x2] // load nonce
Expand Down Expand Up @@ -225,10 +222,11 @@ poly1305_splat:
.type poly1305_blocks_neon,%function
.align 5
poly1305_blocks_neon:
.Lpoly1305_blocks_neon:
ldr x17,[x0,#24]
cmp x2,#128
b.hs .Lblocks_neon
cbz x17,poly1305_blocks
cbz x17,.Lpoly1305_blocks

.Lblocks_neon:
.inst 0xd503233f // paciasp
Expand Down Expand Up @@ -371,7 +369,7 @@ poly1305_blocks_neon:
csel x16,x17,x16,lo

mov x4,#1
str x4,[x0,#-24] // set is_base2_26
stur x4,[x0,#-24] // set is_base2_26
sub x0,x0,#48 // restore original x0
b .Ldo_neon

Expand Down Expand Up @@ -808,6 +806,7 @@ poly1305_blocks_neon:
.type poly1305_emit_neon,%function
.align 5
poly1305_emit_neon:
.Lpoly1305_emit_neon:
ldr x17,[x0,#24]
cbz x17,poly1305_emit

Expand Down Expand Up @@ -860,12 +859,6 @@ poly1305_emit_neon:
.align 5
.Lzeros:
.long 0,0,0,0,0,0,0,0
.LOPENSSL_armcap_P:
#ifdef __ILP32__
.long OPENSSL_armcap_P-.
#else
.quad OPENSSL_armcap_P-.
#endif
.byte 80,111,108,121,49,51,48,53,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
.align 2
.align 2
Loading