#include .section .data .align 2 .global ascon_round_constants .type ascon_round_constants,@object ascon_round_constants: .byte 0xc, 0xc .byte 0x9, 0xc .byte 0xc, 0x9 .byte 0x9, 0x9 .byte 0x6, 0xc .byte 0x3, 0xc .byte 0x6, 0x9 .byte 0x3, 0x9 .byte 0xc, 0x6 .byte 0x9, 0x6 .byte 0xc, 0x3 .byte 0x9, 0x3 #define x0e a4 #define x0o a5 #define x1e a6 #define x1o a7 #define x2e a8 #define x2o a9 #define x3e a10 #define x3o a11 #define x4e a12 #define x4o a13 #define t0e a14 #define t0o a15 #define tmp a14 #define neg a15 .section .text .align 4 .global P .type P,@function P: abi_entry 4 l32i x0e, a2, 0 l32i x0o, a2, 4 l32i x1e, a2, 8 l32i x1o, a2, 12 l32i x2e, a2, 16 l32i x2o, a2, 20 l32i x3e, a2, 24 l32i x3o, a2, 28 l32i x4e, a2, 32 l32i x4o, a2, 36 s32i a2, a1, 0 movi a2, ascon_round_constants addx2 a2, a3, a2 .Lround_start: /* round constant */ l8ui t0e, a2, 0 xor x2e, x2e, a14 l8ui t0o, a2, 1 xor x2o, x2o, a15 /* s-box layer */ /* even */ xor x0e, x0e, x4e xor x4e, x4e, x3e xor x2e, x2e, x1e movi neg, -1 xor neg, neg, x4e and tmp, neg, x0e movi neg, -1 xor neg, neg, x1e and neg, neg, x2e xor x0e, x0e, neg movi neg, -1 xor neg, neg, x3e and neg, neg, x4e xor x2e, x2e, neg movi neg, -1 xor neg, neg, x0e and neg, neg, x1e xor x4e, x4e, neg movi neg, -1 xor neg, neg, x2e and neg, neg, x3e xor x1e, x1e, neg xor x3e, x3e, tmp xor x1e, x1e, x0e xor x3e, x3e, x2e xor x0e, x0e, x4e /* odd */ xor x0o, x0o, x4o xor x4o, x4o, x3o xor x2o, x2o, x1o movi neg, -1 xor neg, neg, x4o and tmp, neg, x0o movi neg, -1 xor neg, neg, x1o and neg, neg, x2o xor x0o, x0o, neg movi neg, -1 xor neg, neg, x3o and neg, neg, x4o xor x2o, x2o, neg movi neg, -1 xor neg, neg, x0o and neg, neg, x1o xor x4o, x4o, neg movi neg, -1 xor neg, neg, x2o and neg, neg, x3o xor x1o, x1o, neg xor x3o, x3o, tmp xor x1o, x1o, x0o xor x3o, x3o, x2o xor x0o, x0o, x4o /* linear layer */ ssai 4 src t0e, x0o, x0o xor t0e, t0e, x0e ssai 5 src t0o, x0e, x0e xor t0o, t0o, x0o ssai 9 src t0o, t0o, t0o xor x0e, x0e, t0o ssai 10 src t0e, t0e, t0e xor x0o, x0o, t0e ssai 11 src t0e, x1e, x1e xor t0e, t0e, x1e src t0o, x1o, x1o xor t0o, t0o, x1o ssai 19 src t0o, t0o, t0o xor x1e, x1e, t0o ssai 20 src t0e, t0e, t0e xor x1o, x1o, t0e ssai 2 src t0e, x2o, x2o xor t0e, t0e, x2e ssai 3 src t0o, x2e, x2e xor t0o, t0o, x2o xor x2e, x2e, t0o ssai 1 src t0e, t0e, t0e xor x2o, x2o, t0e ssai 3 src t0e, x3o, x3o xor t0e, t0e, x3e ssai 4 src t0o, x3e, x3e xor t0o, t0o, x3o ssai 5 src t0e, t0e, t0e xor x3e, x3e, t0e src t0o, t0o, t0o xor x3o, x3o, t0o ssai 17 src t0e, x4e, x4e xor t0e, t0e, x4e src t0o, x4o, x4o xor t0o, t0o, x4o ssai 3 src t0o, t0o, t0o xor x4e, x4e, t0o ssai 4 src t0e, t0e, t0e xor x4o, x4o, t0e movi neg, -1 xor x2e, x2e, neg xor x2o, x2o, neg /* loop */ addi a2, a2, 2 addi a3, a3, 1 bltui a3, 12, .Lround_start .Lend: l32i a2, a1, 0 s32i x0e, a2, 0 s32i x0o, a2, 4 s32i x1e, a2, 8 s32i x1o, a2, 12 s32i x2e, a2, 16 s32i x2o, a2, 20 s32i x3e, a2, 24 s32i x3o, a2, 28 s32i x4e, a2, 32 s32i x4o, a2, 36 abi_return