123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686 |
- // 16x Parallel implementation of SHA256 for AVX512
- //
- // Minio Cloud Storage, (C) 2017 Minio, Inc.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- //
- // This code is based on the Intel Multi-Buffer Crypto for IPSec library
- // and more specifically the following implementation:
- // https://github.com/intel/intel-ipsec-mb/blob/master/avx512/sha256_x16_avx512.asm
- //
- // For Golang it has been converted into Plan 9 assembly with the help of
- // github.com/minio/asm2plan9s to assemble the AVX512 instructions
- //
- // Copyright (c) 2017, Intel Corporation
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are met:
- //
- // * Redistributions of source code must retain the above copyright notice,
- // this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above copyright
- // notice, this list of conditions and the following disclaimer in the
- // documentation and/or other materials provided with the distribution.
- // * Neither the name of Intel Corporation nor the names of its contributors
- // may be used to endorse or promote products derived from this software
- // without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
- // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- #define SHA256_DIGEST_ROW_SIZE 64
- // arg1
- #define STATE rdi
- #define STATE_P9 DI
- // arg2
- #define INP_SIZE rsi
- #define INP_SIZE_P9 SI
- #define IDX rcx
- #define TBL rdx
- #define TBL_P9 DX
- #define INPUT rax
- #define INPUT_P9 AX
- #define inp0 r9
- #define SCRATCH_P9 R12
- #define SCRATCH r12
- #define maskp r13
- #define MASKP_P9 R13
- #define mask r14
- #define MASK_P9 R14
- #define A zmm0
- #define B zmm1
- #define C zmm2
- #define D zmm3
- #define E zmm4
- #define F zmm5
- #define G zmm6
- #define H zmm7
- #define T1 zmm8
- #define TMP0 zmm9
- #define TMP1 zmm10
- #define TMP2 zmm11
- #define TMP3 zmm12
- #define TMP4 zmm13
- #define TMP5 zmm14
- #define TMP6 zmm15
- #define W0 zmm16
- #define W1 zmm17
- #define W2 zmm18
- #define W3 zmm19
- #define W4 zmm20
- #define W5 zmm21
- #define W6 zmm22
- #define W7 zmm23
- #define W8 zmm24
- #define W9 zmm25
- #define W10 zmm26
- #define W11 zmm27
- #define W12 zmm28
- #define W13 zmm29
- #define W14 zmm30
- #define W15 zmm31
- #define TRANSPOSE16(_r0, _r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8, _r9, _r10, _r11, _r12, _r13, _r14, _r15, _t0, _t1) \
- \
- \ // input r0 = {a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0}
- \ // r1 = {b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0}
- \ // r2 = {c15 c14 c13 c12 c11 c10 c9 c8 c7 c6 c5 c4 c3 c2 c1 c0}
- \ // r3 = {d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0}
- \ // r4 = {e15 e14 e13 e12 e11 e10 e9 e8 e7 e6 e5 e4 e3 e2 e1 e0}
- \ // r5 = {f15 f14 f13 f12 f11 f10 f9 f8 f7 f6 f5 f4 f3 f2 f1 f0}
- \ // r6 = {g15 g14 g13 g12 g11 g10 g9 g8 g7 g6 g5 g4 g3 g2 g1 g0}
- \ // r7 = {h15 h14 h13 h12 h11 h10 h9 h8 h7 h6 h5 h4 h3 h2 h1 h0}
- \ // r8 = {i15 i14 i13 i12 i11 i10 i9 i8 i7 i6 i5 i4 i3 i2 i1 i0}
- \ // r9 = {j15 j14 j13 j12 j11 j10 j9 j8 j7 j6 j5 j4 j3 j2 j1 j0}
- \ // r10 = {k15 k14 k13 k12 k11 k10 k9 k8 k7 k6 k5 k4 k3 k2 k1 k0}
- \ // r11 = {l15 l14 l13 l12 l11 l10 l9 l8 l7 l6 l5 l4 l3 l2 l1 l0}
- \ // r12 = {m15 m14 m13 m12 m11 m10 m9 m8 m7 m6 m5 m4 m3 m2 m1 m0}
- \ // r13 = {n15 n14 n13 n12 n11 n10 n9 n8 n7 n6 n5 n4 n3 n2 n1 n0}
- \ // r14 = {o15 o14 o13 o12 o11 o10 o9 o8 o7 o6 o5 o4 o3 o2 o1 o0}
- \ // r15 = {p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0}
- \
- \ // output r0 = { p0 o0 n0 m0 l0 k0 j0 i0 h0 g0 f0 e0 d0 c0 b0 a0}
- \ // r1 = { p1 o1 n1 m1 l1 k1 j1 i1 h1 g1 f1 e1 d1 c1 b1 a1}
- \ // r2 = { p2 o2 n2 m2 l2 k2 j2 i2 h2 g2 f2 e2 d2 c2 b2 a2}
- \ // r3 = { p3 o3 n3 m3 l3 k3 j3 i3 h3 g3 f3 e3 d3 c3 b3 a3}
- \ // r4 = { p4 o4 n4 m4 l4 k4 j4 i4 h4 g4 f4 e4 d4 c4 b4 a4}
- \ // r5 = { p5 o5 n5 m5 l5 k5 j5 i5 h5 g5 f5 e5 d5 c5 b5 a5}
- \ // r6 = { p6 o6 n6 m6 l6 k6 j6 i6 h6 g6 f6 e6 d6 c6 b6 a6}
- \ // r7 = { p7 o7 n7 m7 l7 k7 j7 i7 h7 g7 f7 e7 d7 c7 b7 a7}
- \ // r8 = { p8 o8 n8 m8 l8 k8 j8 i8 h8 g8 f8 e8 d8 c8 b8 a8}
- \ // r9 = { p9 o9 n9 m9 l9 k9 j9 i9 h9 g9 f9 e9 d9 c9 b9 a9}
- \ // r10 = {p10 o10 n10 m10 l10 k10 j10 i10 h10 g10 f10 e10 d10 c10 b10 a10}
- \ // r11 = {p11 o11 n11 m11 l11 k11 j11 i11 h11 g11 f11 e11 d11 c11 b11 a11}
- \ // r12 = {p12 o12 n12 m12 l12 k12 j12 i12 h12 g12 f12 e12 d12 c12 b12 a12}
- \ // r13 = {p13 o13 n13 m13 l13 k13 j13 i13 h13 g13 f13 e13 d13 c13 b13 a13}
- \ // r14 = {p14 o14 n14 m14 l14 k14 j14 i14 h14 g14 f14 e14 d14 c14 b14 a14}
- \ // r15 = {p15 o15 n15 m15 l15 k15 j15 i15 h15 g15 f15 e15 d15 c15 b15 a15}
- \
- \ // process top half
- vshufps _t0, _r0, _r1, 0x44 \ // t0 = {b13 b12 a13 a12 b9 b8 a9 a8 b5 b4 a5 a4 b1 b0 a1 a0}
- vshufps _r0, _r0, _r1, 0xEE \ // r0 = {b15 b14 a15 a14 b11 b10 a11 a10 b7 b6 a7 a6 b3 b2 a3 a2}
- vshufps _t1, _r2, _r3, 0x44 \ // t1 = {d13 d12 c13 c12 d9 d8 c9 c8 d5 d4 c5 c4 d1 d0 c1 c0}
- vshufps _r2, _r2, _r3, 0xEE \ // r2 = {d15 d14 c15 c14 d11 d10 c11 c10 d7 d6 c7 c6 d3 d2 c3 c2}
- \
- vshufps _r3, _t0, _t1, 0xDD \ // r3 = {d13 c13 b13 a13 d9 c9 b9 a9 d5 c5 b5 a5 d1 c1 b1 a1}
- vshufps _r1, _r0, _r2, 0x88 \ // r1 = {d14 c14 b14 a14 d10 c10 b10 a10 d6 c6 b6 a6 d2 c2 b2 a2}
- vshufps _r0, _r0, _r2, 0xDD \ // r0 = {d15 c15 b15 a15 d11 c11 b11 a11 d7 c7 b7 a7 d3 c3 b3 a3}
- vshufps _t0, _t0, _t1, 0x88 \ // t0 = {d12 c12 b12 a12 d8 c8 b8 a8 d4 c4 b4 a4 d0 c0 b0 a0}
- \
- \ // use r2 in place of t0
- vshufps _r2, _r4, _r5, 0x44 \ // r2 = {f13 f12 e13 e12 f9 f8 e9 e8 f5 f4 e5 e4 f1 f0 e1 e0}
- vshufps _r4, _r4, _r5, 0xEE \ // r4 = {f15 f14 e15 e14 f11 f10 e11 e10 f7 f6 e7 e6 f3 f2 e3 e2}
- vshufps _t1, _r6, _r7, 0x44 \ // t1 = {h13 h12 g13 g12 h9 h8 g9 g8 h5 h4 g5 g4 h1 h0 g1 g0}
- vshufps _r6, _r6, _r7, 0xEE \ // r6 = {h15 h14 g15 g14 h11 h10 g11 g10 h7 h6 g7 g6 h3 h2 g3 g2}
- \
- vshufps _r7, _r2, _t1, 0xDD \ // r7 = {h13 g13 f13 e13 h9 g9 f9 e9 h5 g5 f5 e5 h1 g1 f1 e1}
- vshufps _r5, _r4, _r6, 0x88 \ // r5 = {h14 g14 f14 e14 h10 g10 f10 e10 h6 g6 f6 e6 h2 g2 f2 e2}
- vshufps _r4, _r4, _r6, 0xDD \ // r4 = {h15 g15 f15 e15 h11 g11 f11 e11 h7 g7 f7 e7 h3 g3 f3 e3}
- vshufps _r2, _r2, _t1, 0x88 \ // r2 = {h12 g12 f12 e12 h8 g8 f8 e8 h4 g4 f4 e4 h0 g0 f0 e0}
- \
- \ // use r6 in place of t0
- vshufps _r6, _r8, _r9, 0x44 \ // r6 = {j13 j12 i13 i12 j9 j8 i9 i8 j5 j4 i5 i4 j1 j0 i1 i0}
- vshufps _r8, _r8, _r9, 0xEE \ // r8 = {j15 j14 i15 i14 j11 j10 i11 i10 j7 j6 i7 i6 j3 j2 i3 i2}
- vshufps _t1, _r10, _r11, 0x44 \ // t1 = {l13 l12 k13 k12 l9 l8 k9 k8 l5 l4 k5 k4 l1 l0 k1 k0}
- vshufps _r10, _r10, _r11, 0xEE \ // r10 = {l15 l14 k15 k14 l11 l10 k11 k10 l7 l6 k7 k6 l3 l2 k3 k2}
- \
- vshufps _r11, _r6, _t1, 0xDD \ // r11 = {l13 k13 j13 113 l9 k9 j9 i9 l5 k5 j5 i5 l1 k1 j1 i1}
- vshufps _r9, _r8, _r10, 0x88 \ // r9 = {l14 k14 j14 114 l10 k10 j10 i10 l6 k6 j6 i6 l2 k2 j2 i2}
- vshufps _r8, _r8, _r10, 0xDD \ // r8 = {l15 k15 j15 115 l11 k11 j11 i11 l7 k7 j7 i7 l3 k3 j3 i3}
- vshufps _r6, _r6, _t1, 0x88 \ // r6 = {l12 k12 j12 112 l8 k8 j8 i8 l4 k4 j4 i4 l0 k0 j0 i0}
- \
- \ // use r10 in place of t0
- vshufps _r10, _r12, _r13, 0x44 \ // r10 = {n13 n12 m13 m12 n9 n8 m9 m8 n5 n4 m5 m4 n1 n0 a1 m0}
- vshufps _r12, _r12, _r13, 0xEE \ // r12 = {n15 n14 m15 m14 n11 n10 m11 m10 n7 n6 m7 m6 n3 n2 a3 m2}
- vshufps _t1, _r14, _r15, 0x44 \ // t1 = {p13 p12 013 012 p9 p8 09 08 p5 p4 05 04 p1 p0 01 00}
- vshufps _r14, _r14, _r15, 0xEE \ // r14 = {p15 p14 015 014 p11 p10 011 010 p7 p6 07 06 p3 p2 03 02}
- \
- vshufps _r15, _r10, _t1, 0xDD \ // r15 = {p13 013 n13 m13 p9 09 n9 m9 p5 05 n5 m5 p1 01 n1 m1}
- vshufps _r13, _r12, _r14, 0x88 \ // r13 = {p14 014 n14 m14 p10 010 n10 m10 p6 06 n6 m6 p2 02 n2 m2}
- vshufps _r12, _r12, _r14, 0xDD \ // r12 = {p15 015 n15 m15 p11 011 n11 m11 p7 07 n7 m7 p3 03 n3 m3}
- vshufps _r10, _r10, _t1, 0x88 \ // r10 = {p12 012 n12 m12 p8 08 n8 m8 p4 04 n4 m4 p0 00 n0 m0}
- \
- \ // At this point, the registers that contain interesting data are:
- \ // t0, r3, r1, r0, r2, r7, r5, r4, r6, r11, r9, r8, r10, r15, r13, r12
- \ // Can use t1 and r14 as scratch registers
- LEAQ PSHUFFLE_TRANSPOSE16_MASK1<>(SB), BX \
- LEAQ PSHUFFLE_TRANSPOSE16_MASK2<>(SB), R8 \
- \
- vmovdqu32 _r14, [rbx] \
- vpermi2q _r14, _t0, _r2 \ // r14 = {h8 g8 f8 e8 d8 c8 b8 a8 h0 g0 f0 e0 d0 c0 b0 a0}
- vmovdqu32 _t1, [r8] \
- vpermi2q _t1, _t0, _r2 \ // t1 = {h12 g12 f12 e12 d12 c12 b12 a12 h4 g4 f4 e4 d4 c4 b4 a4}
- \
- vmovdqu32 _r2, [rbx] \
- vpermi2q _r2, _r3, _r7 \ // r2 = {h9 g9 f9 e9 d9 c9 b9 a9 h1 g1 f1 e1 d1 c1 b1 a1}
- vmovdqu32 _t0, [r8] \
- vpermi2q _t0, _r3, _r7 \ // t0 = {h13 g13 f13 e13 d13 c13 b13 a13 h5 g5 f5 e5 d5 c5 b5 a5}
- \
- vmovdqu32 _r3, [rbx] \
- vpermi2q _r3, _r1, _r5 \ // r3 = {h10 g10 f10 e10 d10 c10 b10 a10 h2 g2 f2 e2 d2 c2 b2 a2}
- vmovdqu32 _r7, [r8] \
- vpermi2q _r7, _r1, _r5 \ // r7 = {h14 g14 f14 e14 d14 c14 b14 a14 h6 g6 f6 e6 d6 c6 b6 a6}
- \
- vmovdqu32 _r1, [rbx] \
- vpermi2q _r1, _r0, _r4 \ // r1 = {h11 g11 f11 e11 d11 c11 b11 a11 h3 g3 f3 e3 d3 c3 b3 a3}
- vmovdqu32 _r5, [r8] \
- vpermi2q _r5, _r0, _r4 \ // r5 = {h15 g15 f15 e15 d15 c15 b15 a15 h7 g7 f7 e7 d7 c7 b7 a7}
- \
- vmovdqu32 _r0, [rbx] \
- vpermi2q _r0, _r6, _r10 \ // r0 = {p8 o8 n8 m8 l8 k8 j8 i8 p0 o0 n0 m0 l0 k0 j0 i0}
- vmovdqu32 _r4, [r8] \
- vpermi2q _r4, _r6, _r10 \ // r4 = {p12 o12 n12 m12 l12 k12 j12 i12 p4 o4 n4 m4 l4 k4 j4 i4}
- \
- vmovdqu32 _r6, [rbx] \
- vpermi2q _r6, _r11, _r15 \ // r6 = {p9 o9 n9 m9 l9 k9 j9 i9 p1 o1 n1 m1 l1 k1 j1 i1}
- vmovdqu32 _r10, [r8] \
- vpermi2q _r10, _r11, _r15 \ // r10 = {p13 o13 n13 m13 l13 k13 j13 i13 p5 o5 n5 m5 l5 k5 j5 i5}
- \
- vmovdqu32 _r11, [rbx] \
- vpermi2q _r11, _r9, _r13 \ // r11 = {p10 o10 n10 m10 l10 k10 j10 i10 p2 o2 n2 m2 l2 k2 j2 i2}
- vmovdqu32 _r15, [r8] \
- vpermi2q _r15, _r9, _r13 \ // r15 = {p14 o14 n14 m14 l14 k14 j14 i14 p6 o6 n6 m6 l6 k6 j6 i6}
- \
- vmovdqu32 _r9, [rbx] \
- vpermi2q _r9, _r8, _r12 \ // r9 = {p11 o11 n11 m11 l11 k11 j11 i11 p3 o3 n3 m3 l3 k3 j3 i3}
- vmovdqu32 _r13, [r8] \
- vpermi2q _r13, _r8, _r12 \ // r13 = {p15 o15 n15 m15 l15 k15 j15 i15 p7 o7 n7 m7 l7 k7 j7 i7}
- \
- \ // At this point r8 and r12 can be used as scratch registers
- vshuff64x2 _r8, _r14, _r0, 0xEE \ // r8 = {p8 o8 n8 m8 l8 k8 j8 i8 h8 g8 f8 e8 d8 c8 b8 a8}
- vshuff64x2 _r0, _r14, _r0, 0x44 \ // r0 = {p0 o0 n0 m0 l0 k0 j0 i0 h0 g0 f0 e0 d0 c0 b0 a0}
- \
- vshuff64x2 _r12, _t1, _r4, 0xEE \ // r12 = {p12 o12 n12 m12 l12 k12 j12 i12 h12 g12 f12 e12 d12 c12 b12 a12}
- vshuff64x2 _r4, _t1, _r4, 0x44 \ // r4 = {p4 o4 n4 m4 l4 k4 j4 i4 h4 g4 f4 e4 d4 c4 b4 a4}
- \
- vshuff64x2 _r14, _r7, _r15, 0xEE \ // r14 = {p14 o14 n14 m14 l14 k14 j14 i14 h14 g14 f14 e14 d14 c14 b14 a14}
- vshuff64x2 _t1, _r7, _r15, 0x44 \ // t1 = {p6 o6 n6 m6 l6 k6 j6 i6 h6 g6 f6 e6 d6 c6 b6 a6}
- \
- vshuff64x2 _r15, _r5, _r13, 0xEE \ // r15 = {p15 o15 n15 m15 l15 k15 j15 i15 h15 g15 f15 e15 d15 c15 b15 a15}
- vshuff64x2 _r7, _r5, _r13, 0x44 \ // r7 = {p7 o7 n7 m7 l7 k7 j7 i7 h7 g7 f7 e7 d7 c7 b7 a7}
- \
- vshuff64x2 _r13, _t0, _r10, 0xEE \ // r13 = {p13 o13 n13 m13 l13 k13 j13 i13 h13 g13 f13 e13 d13 c13 b13 a13}
- vshuff64x2 _r5, _t0, _r10, 0x44 \ // r5 = {p5 o5 n5 m5 l5 k5 j5 i5 h5 g5 f5 e5 d5 c5 b5 a5}
- \
- vshuff64x2 _r10, _r3, _r11, 0xEE \ // r10 = {p10 o10 n10 m10 l10 k10 j10 i10 h10 g10 f10 e10 d10 c10 b10 a10}
- vshuff64x2 _t0, _r3, _r11, 0x44 \ // t0 = {p2 o2 n2 m2 l2 k2 j2 i2 h2 g2 f2 e2 d2 c2 b2 a2}
- \
- vshuff64x2 _r11, _r1, _r9, 0xEE \ // r11 = {p11 o11 n11 m11 l11 k11 j11 i11 h11 g11 f11 e11 d11 c11 b11 a11}
- vshuff64x2 _r3, _r1, _r9, 0x44 \ // r3 = {p3 o3 n3 m3 l3 k3 j3 i3 h3 g3 f3 e3 d3 c3 b3 a3}
- \
- vshuff64x2 _r9, _r2, _r6, 0xEE \ // r9 = {p9 o9 n9 m9 l9 k9 j9 i9 h9 g9 f9 e9 d9 c9 b9 a9}
- vshuff64x2 _r1, _r2, _r6, 0x44 \ // r1 = {p1 o1 n1 m1 l1 k1 j1 i1 h1 g1 f1 e1 d1 c1 b1 a1}
- \
- vmovdqu32 _r2, _t0 \ // r2 = {p2 o2 n2 m2 l2 k2 j2 i2 h2 g2 f2 e2 d2 c2 b2 a2}
- vmovdqu32 _r6, _t1 \ // r6 = {p6 o6 n6 m6 l6 k6 j6 i6 h6 g6 f6 e6 d6 c6 b6 a6}
- // CH(A, B, C) = (A&B) ^ (~A&C)
- // MAJ(E, F, G) = (E&F) ^ (E&G) ^ (F&G)
- // SIGMA0 = ROR_2 ^ ROR_13 ^ ROR_22
- // SIGMA1 = ROR_6 ^ ROR_11 ^ ROR_25
- // sigma0 = ROR_7 ^ ROR_18 ^ SHR_3
- // sigma1 = ROR_17 ^ ROR_19 ^ SHR_10
- // Main processing loop per round
- #define PROCESS_LOOP(_WT, _ROUND, _A, _B, _C, _D, _E, _F, _G, _H) \
- \ // T1 = H + SIGMA1(E) + CH(E, F, G) + Kt + Wt
- \ // T2 = SIGMA0(A) + MAJ(A, B, C)
- \ // H=G, G=F, F=E, E=D+T1, D=C, C=B, B=A, A=T1+T2
- \
- \ // H becomes T2, then add T1 for A
- \ // D becomes D + T1 for E
- \
- vpaddd T1, _H, TMP3 \ // T1 = H + Kt
- vmovdqu32 TMP0, _E \
- vprord TMP1, _E, 6 \ // ROR_6(E)
- vprord TMP2, _E, 11 \ // ROR_11(E)
- vprord TMP3, _E, 25 \ // ROR_25(E)
- vpternlogd TMP0, _F, _G, 0xCA \ // TMP0 = CH(E,F,G)
- vpaddd T1, T1, _WT \ // T1 = T1 + Wt
- vpternlogd TMP1, TMP2, TMP3, 0x96 \ // TMP1 = SIGMA1(E)
- vpaddd T1, T1, TMP0 \ // T1 = T1 + CH(E,F,G)
- vpaddd T1, T1, TMP1 \ // T1 = T1 + SIGMA1(E)
- vpaddd _D, _D, T1 \ // D = D + T1
- \
- vprord _H, _A, 2 \ // ROR_2(A)
- vprord TMP2, _A, 13 \ // ROR_13(A)
- vprord TMP3, _A, 22 \ // ROR_22(A)
- vmovdqu32 TMP0, _A \
- vpternlogd TMP0, _B, _C, 0xE8 \ // TMP0 = MAJ(A,B,C)
- vpternlogd _H, TMP2, TMP3, 0x96 \ // H(T2) = SIGMA0(A)
- vpaddd _H, _H, TMP0 \ // H(T2) = SIGMA0(A) + MAJ(A,B,C)
- vpaddd _H, _H, T1 \ // H(A) = H(T2) + T1
- \
- vmovdqu32 TMP3, [TBL + ((_ROUND+1)*64)] \ // Next Kt
- #define MSG_SCHED_ROUND_16_63(_WT, _WTp1, _WTp9, _WTp14) \
- vprord TMP4, _WTp14, 17 \ // ROR_17(Wt-2)
- vprord TMP5, _WTp14, 19 \ // ROR_19(Wt-2)
- vpsrld TMP6, _WTp14, 10 \ // SHR_10(Wt-2)
- vpternlogd TMP4, TMP5, TMP6, 0x96 \ // TMP4 = sigma1(Wt-2)
- \
- vpaddd _WT, _WT, TMP4 \ // Wt = Wt-16 + sigma1(Wt-2)
- vpaddd _WT, _WT, _WTp9 \ // Wt = Wt-16 + sigma1(Wt-2) + Wt-7
- \
- vprord TMP4, _WTp1, 7 \ // ROR_7(Wt-15)
- vprord TMP5, _WTp1, 18 \ // ROR_18(Wt-15)
- vpsrld TMP6, _WTp1, 3 \ // SHR_3(Wt-15)
- vpternlogd TMP4, TMP5, TMP6, 0x96 \ // TMP4 = sigma0(Wt-15)
- \
- vpaddd _WT, _WT, TMP4 \ // Wt = Wt-16 + sigma1(Wt-2) +
- \ // Wt-7 + sigma0(Wt-15) +
- // Note this is reading in a block of data for one lane
- // When all 16 are read, the data must be transposed to build msg schedule
- #define MSG_SCHED_ROUND_00_15(_WT, OFFSET, LABEL) \
- TESTQ $(1<<OFFSET), MASK_P9 \
- JE LABEL \
- MOVQ OFFSET*24(INPUT_P9), R9 \
- vmovups _WT, [inp0+IDX] \
- LABEL: \
- #define MASKED_LOAD(_WT, OFFSET, LABEL) \
- TESTQ $(1<<OFFSET), MASK_P9 \
- JE LABEL \
- MOVQ OFFSET*24(INPUT_P9), R9 \
- vmovups _WT,[inp0+IDX] \
- LABEL: \
- TEXT ·sha256_x16_avx512(SB), 7, $0
- MOVQ digests+0(FP), STATE_P9 //
- MOVQ scratch+8(FP), SCRATCH_P9
- MOVQ mask_len+32(FP), INP_SIZE_P9 // number of blocks to process
- MOVQ mask+24(FP), MASKP_P9
- MOVQ (MASKP_P9), MASK_P9
- kmovq k1, mask
- LEAQ inputs+48(FP), INPUT_P9
- // Initialize digests
- vmovdqu32 A, [STATE + 0*SHA256_DIGEST_ROW_SIZE]
- vmovdqu32 B, [STATE + 1*SHA256_DIGEST_ROW_SIZE]
- vmovdqu32 C, [STATE + 2*SHA256_DIGEST_ROW_SIZE]
- vmovdqu32 D, [STATE + 3*SHA256_DIGEST_ROW_SIZE]
- vmovdqu32 E, [STATE + 4*SHA256_DIGEST_ROW_SIZE]
- vmovdqu32 F, [STATE + 5*SHA256_DIGEST_ROW_SIZE]
- vmovdqu32 G, [STATE + 6*SHA256_DIGEST_ROW_SIZE]
- vmovdqu32 H, [STATE + 7*SHA256_DIGEST_ROW_SIZE]
- MOVQ table+16(FP), TBL_P9
- xor IDX, IDX
- // Read in first block of input data
- MASKED_LOAD( W0, 0, skipInput0)
- MASKED_LOAD( W1, 1, skipInput1)
- MASKED_LOAD( W2, 2, skipInput2)
- MASKED_LOAD( W3, 3, skipInput3)
- MASKED_LOAD( W4, 4, skipInput4)
- MASKED_LOAD( W5, 5, skipInput5)
- MASKED_LOAD( W6, 6, skipInput6)
- MASKED_LOAD( W7, 7, skipInput7)
- MASKED_LOAD( W8, 8, skipInput8)
- MASKED_LOAD( W9, 9, skipInput9)
- MASKED_LOAD(W10, 10, skipInput10)
- MASKED_LOAD(W11, 11, skipInput11)
- MASKED_LOAD(W12, 12, skipInput12)
- MASKED_LOAD(W13, 13, skipInput13)
- MASKED_LOAD(W14, 14, skipInput14)
- MASKED_LOAD(W15, 15, skipInput15)
- lloop:
- LEAQ PSHUFFLE_BYTE_FLIP_MASK<>(SB), TBL_P9
- vmovdqu32 TMP2, [TBL]
- // Get first K from table
- MOVQ table+16(FP), TBL_P9
- vmovdqu32 TMP3, [TBL]
- // Save digests for later addition
- vmovdqu32 [SCRATCH + 64*0], A
- vmovdqu32 [SCRATCH + 64*1], B
- vmovdqu32 [SCRATCH + 64*2], C
- vmovdqu32 [SCRATCH + 64*3], D
- vmovdqu32 [SCRATCH + 64*4], E
- vmovdqu32 [SCRATCH + 64*5], F
- vmovdqu32 [SCRATCH + 64*6], G
- vmovdqu32 [SCRATCH + 64*7], H
- add IDX, 64
- // Transpose input data
- TRANSPOSE16(W0, W1, W2, W3, W4, W5, W6, W7, W8, W9, W10, W11, W12, W13, W14, W15, TMP0, TMP1)
- vpshufb W0, W0, TMP2
- vpshufb W1, W1, TMP2
- vpshufb W2, W2, TMP2
- vpshufb W3, W3, TMP2
- vpshufb W4, W4, TMP2
- vpshufb W5, W5, TMP2
- vpshufb W6, W6, TMP2
- vpshufb W7, W7, TMP2
- vpshufb W8, W8, TMP2
- vpshufb W9, W9, TMP2
- vpshufb W10, W10, TMP2
- vpshufb W11, W11, TMP2
- vpshufb W12, W12, TMP2
- vpshufb W13, W13, TMP2
- vpshufb W14, W14, TMP2
- vpshufb W15, W15, TMP2
- // MSG Schedule for W0-W15 is now complete in registers
- // Process first 48 rounds
- // Calculate next Wt+16 after processing is complete and Wt is unneeded
- PROCESS_LOOP( W0, 0, A, B, C, D, E, F, G, H)
- MSG_SCHED_ROUND_16_63( W0, W1, W9, W14)
- PROCESS_LOOP( W1, 1, H, A, B, C, D, E, F, G)
- MSG_SCHED_ROUND_16_63( W1, W2, W10, W15)
- PROCESS_LOOP( W2, 2, G, H, A, B, C, D, E, F)
- MSG_SCHED_ROUND_16_63( W2, W3, W11, W0)
- PROCESS_LOOP( W3, 3, F, G, H, A, B, C, D, E)
- MSG_SCHED_ROUND_16_63( W3, W4, W12, W1)
- PROCESS_LOOP( W4, 4, E, F, G, H, A, B, C, D)
- MSG_SCHED_ROUND_16_63( W4, W5, W13, W2)
- PROCESS_LOOP( W5, 5, D, E, F, G, H, A, B, C)
- MSG_SCHED_ROUND_16_63( W5, W6, W14, W3)
- PROCESS_LOOP( W6, 6, C, D, E, F, G, H, A, B)
- MSG_SCHED_ROUND_16_63( W6, W7, W15, W4)
- PROCESS_LOOP( W7, 7, B, C, D, E, F, G, H, A)
- MSG_SCHED_ROUND_16_63( W7, W8, W0, W5)
- PROCESS_LOOP( W8, 8, A, B, C, D, E, F, G, H)
- MSG_SCHED_ROUND_16_63( W8, W9, W1, W6)
- PROCESS_LOOP( W9, 9, H, A, B, C, D, E, F, G)
- MSG_SCHED_ROUND_16_63( W9, W10, W2, W7)
- PROCESS_LOOP(W10, 10, G, H, A, B, C, D, E, F)
- MSG_SCHED_ROUND_16_63(W10, W11, W3, W8)
- PROCESS_LOOP(W11, 11, F, G, H, A, B, C, D, E)
- MSG_SCHED_ROUND_16_63(W11, W12, W4, W9)
- PROCESS_LOOP(W12, 12, E, F, G, H, A, B, C, D)
- MSG_SCHED_ROUND_16_63(W12, W13, W5, W10)
- PROCESS_LOOP(W13, 13, D, E, F, G, H, A, B, C)
- MSG_SCHED_ROUND_16_63(W13, W14, W6, W11)
- PROCESS_LOOP(W14, 14, C, D, E, F, G, H, A, B)
- MSG_SCHED_ROUND_16_63(W14, W15, W7, W12)
- PROCESS_LOOP(W15, 15, B, C, D, E, F, G, H, A)
- MSG_SCHED_ROUND_16_63(W15, W0, W8, W13)
- PROCESS_LOOP( W0, 16, A, B, C, D, E, F, G, H)
- MSG_SCHED_ROUND_16_63( W0, W1, W9, W14)
- PROCESS_LOOP( W1, 17, H, A, B, C, D, E, F, G)
- MSG_SCHED_ROUND_16_63( W1, W2, W10, W15)
- PROCESS_LOOP( W2, 18, G, H, A, B, C, D, E, F)
- MSG_SCHED_ROUND_16_63( W2, W3, W11, W0)
- PROCESS_LOOP( W3, 19, F, G, H, A, B, C, D, E)
- MSG_SCHED_ROUND_16_63( W3, W4, W12, W1)
- PROCESS_LOOP( W4, 20, E, F, G, H, A, B, C, D)
- MSG_SCHED_ROUND_16_63( W4, W5, W13, W2)
- PROCESS_LOOP( W5, 21, D, E, F, G, H, A, B, C)
- MSG_SCHED_ROUND_16_63( W5, W6, W14, W3)
- PROCESS_LOOP( W6, 22, C, D, E, F, G, H, A, B)
- MSG_SCHED_ROUND_16_63( W6, W7, W15, W4)
- PROCESS_LOOP( W7, 23, B, C, D, E, F, G, H, A)
- MSG_SCHED_ROUND_16_63( W7, W8, W0, W5)
- PROCESS_LOOP( W8, 24, A, B, C, D, E, F, G, H)
- MSG_SCHED_ROUND_16_63( W8, W9, W1, W6)
- PROCESS_LOOP( W9, 25, H, A, B, C, D, E, F, G)
- MSG_SCHED_ROUND_16_63( W9, W10, W2, W7)
- PROCESS_LOOP(W10, 26, G, H, A, B, C, D, E, F)
- MSG_SCHED_ROUND_16_63(W10, W11, W3, W8)
- PROCESS_LOOP(W11, 27, F, G, H, A, B, C, D, E)
- MSG_SCHED_ROUND_16_63(W11, W12, W4, W9)
- PROCESS_LOOP(W12, 28, E, F, G, H, A, B, C, D)
- MSG_SCHED_ROUND_16_63(W12, W13, W5, W10)
- PROCESS_LOOP(W13, 29, D, E, F, G, H, A, B, C)
- MSG_SCHED_ROUND_16_63(W13, W14, W6, W11)
- PROCESS_LOOP(W14, 30, C, D, E, F, G, H, A, B)
- MSG_SCHED_ROUND_16_63(W14, W15, W7, W12)
- PROCESS_LOOP(W15, 31, B, C, D, E, F, G, H, A)
- MSG_SCHED_ROUND_16_63(W15, W0, W8, W13)
- PROCESS_LOOP( W0, 32, A, B, C, D, E, F, G, H)
- MSG_SCHED_ROUND_16_63( W0, W1, W9, W14)
- PROCESS_LOOP( W1, 33, H, A, B, C, D, E, F, G)
- MSG_SCHED_ROUND_16_63( W1, W2, W10, W15)
- PROCESS_LOOP( W2, 34, G, H, A, B, C, D, E, F)
- MSG_SCHED_ROUND_16_63( W2, W3, W11, W0)
- PROCESS_LOOP( W3, 35, F, G, H, A, B, C, D, E)
- MSG_SCHED_ROUND_16_63( W3, W4, W12, W1)
- PROCESS_LOOP( W4, 36, E, F, G, H, A, B, C, D)
- MSG_SCHED_ROUND_16_63( W4, W5, W13, W2)
- PROCESS_LOOP( W5, 37, D, E, F, G, H, A, B, C)
- MSG_SCHED_ROUND_16_63( W5, W6, W14, W3)
- PROCESS_LOOP( W6, 38, C, D, E, F, G, H, A, B)
- MSG_SCHED_ROUND_16_63( W6, W7, W15, W4)
- PROCESS_LOOP( W7, 39, B, C, D, E, F, G, H, A)
- MSG_SCHED_ROUND_16_63( W7, W8, W0, W5)
- PROCESS_LOOP( W8, 40, A, B, C, D, E, F, G, H)
- MSG_SCHED_ROUND_16_63( W8, W9, W1, W6)
- PROCESS_LOOP( W9, 41, H, A, B, C, D, E, F, G)
- MSG_SCHED_ROUND_16_63( W9, W10, W2, W7)
- PROCESS_LOOP(W10, 42, G, H, A, B, C, D, E, F)
- MSG_SCHED_ROUND_16_63(W10, W11, W3, W8)
- PROCESS_LOOP(W11, 43, F, G, H, A, B, C, D, E)
- MSG_SCHED_ROUND_16_63(W11, W12, W4, W9)
- PROCESS_LOOP(W12, 44, E, F, G, H, A, B, C, D)
- MSG_SCHED_ROUND_16_63(W12, W13, W5, W10)
- PROCESS_LOOP(W13, 45, D, E, F, G, H, A, B, C)
- MSG_SCHED_ROUND_16_63(W13, W14, W6, W11)
- PROCESS_LOOP(W14, 46, C, D, E, F, G, H, A, B)
- MSG_SCHED_ROUND_16_63(W14, W15, W7, W12)
- PROCESS_LOOP(W15, 47, B, C, D, E, F, G, H, A)
- MSG_SCHED_ROUND_16_63(W15, W0, W8, W13)
- // Check if this is the last block
- sub INP_SIZE, 1
- JE lastLoop
- // Load next mask for inputs
- ADDQ $8, MASKP_P9
- MOVQ (MASKP_P9), MASK_P9
- // Process last 16 rounds
- // Read in next block msg data for use in first 16 words of msg sched
- PROCESS_LOOP( W0, 48, A, B, C, D, E, F, G, H)
- MSG_SCHED_ROUND_00_15( W0, 0, skipNext0)
- PROCESS_LOOP( W1, 49, H, A, B, C, D, E, F, G)
- MSG_SCHED_ROUND_00_15( W1, 1, skipNext1)
- PROCESS_LOOP( W2, 50, G, H, A, B, C, D, E, F)
- MSG_SCHED_ROUND_00_15( W2, 2, skipNext2)
- PROCESS_LOOP( W3, 51, F, G, H, A, B, C, D, E)
- MSG_SCHED_ROUND_00_15( W3, 3, skipNext3)
- PROCESS_LOOP( W4, 52, E, F, G, H, A, B, C, D)
- MSG_SCHED_ROUND_00_15( W4, 4, skipNext4)
- PROCESS_LOOP( W5, 53, D, E, F, G, H, A, B, C)
- MSG_SCHED_ROUND_00_15( W5, 5, skipNext5)
- PROCESS_LOOP( W6, 54, C, D, E, F, G, H, A, B)
- MSG_SCHED_ROUND_00_15( W6, 6, skipNext6)
- PROCESS_LOOP( W7, 55, B, C, D, E, F, G, H, A)
- MSG_SCHED_ROUND_00_15( W7, 7, skipNext7)
- PROCESS_LOOP( W8, 56, A, B, C, D, E, F, G, H)
- MSG_SCHED_ROUND_00_15( W8, 8, skipNext8)
- PROCESS_LOOP( W9, 57, H, A, B, C, D, E, F, G)
- MSG_SCHED_ROUND_00_15( W9, 9, skipNext9)
- PROCESS_LOOP(W10, 58, G, H, A, B, C, D, E, F)
- MSG_SCHED_ROUND_00_15(W10, 10, skipNext10)
- PROCESS_LOOP(W11, 59, F, G, H, A, B, C, D, E)
- MSG_SCHED_ROUND_00_15(W11, 11, skipNext11)
- PROCESS_LOOP(W12, 60, E, F, G, H, A, B, C, D)
- MSG_SCHED_ROUND_00_15(W12, 12, skipNext12)
- PROCESS_LOOP(W13, 61, D, E, F, G, H, A, B, C)
- MSG_SCHED_ROUND_00_15(W13, 13, skipNext13)
- PROCESS_LOOP(W14, 62, C, D, E, F, G, H, A, B)
- MSG_SCHED_ROUND_00_15(W14, 14, skipNext14)
- PROCESS_LOOP(W15, 63, B, C, D, E, F, G, H, A)
- MSG_SCHED_ROUND_00_15(W15, 15, skipNext15)
- // Add old digest
- vmovdqu32 TMP2, A
- vmovdqu32 A, [SCRATCH + 64*0]
- vpaddd A{k1}, A, TMP2
- vmovdqu32 TMP2, B
- vmovdqu32 B, [SCRATCH + 64*1]
- vpaddd B{k1}, B, TMP2
- vmovdqu32 TMP2, C
- vmovdqu32 C, [SCRATCH + 64*2]
- vpaddd C{k1}, C, TMP2
- vmovdqu32 TMP2, D
- vmovdqu32 D, [SCRATCH + 64*3]
- vpaddd D{k1}, D, TMP2
- vmovdqu32 TMP2, E
- vmovdqu32 E, [SCRATCH + 64*4]
- vpaddd E{k1}, E, TMP2
- vmovdqu32 TMP2, F
- vmovdqu32 F, [SCRATCH + 64*5]
- vpaddd F{k1}, F, TMP2
- vmovdqu32 TMP2, G
- vmovdqu32 G, [SCRATCH + 64*6]
- vpaddd G{k1}, G, TMP2
- vmovdqu32 TMP2, H
- vmovdqu32 H, [SCRATCH + 64*7]
- vpaddd H{k1}, H, TMP2
- kmovq k1, mask
- JMP lloop
- lastLoop:
- // Process last 16 rounds
- PROCESS_LOOP( W0, 48, A, B, C, D, E, F, G, H)
- PROCESS_LOOP( W1, 49, H, A, B, C, D, E, F, G)
- PROCESS_LOOP( W2, 50, G, H, A, B, C, D, E, F)
- PROCESS_LOOP( W3, 51, F, G, H, A, B, C, D, E)
- PROCESS_LOOP( W4, 52, E, F, G, H, A, B, C, D)
- PROCESS_LOOP( W5, 53, D, E, F, G, H, A, B, C)
- PROCESS_LOOP( W6, 54, C, D, E, F, G, H, A, B)
- PROCESS_LOOP( W7, 55, B, C, D, E, F, G, H, A)
- PROCESS_LOOP( W8, 56, A, B, C, D, E, F, G, H)
- PROCESS_LOOP( W9, 57, H, A, B, C, D, E, F, G)
- PROCESS_LOOP(W10, 58, G, H, A, B, C, D, E, F)
- PROCESS_LOOP(W11, 59, F, G, H, A, B, C, D, E)
- PROCESS_LOOP(W12, 60, E, F, G, H, A, B, C, D)
- PROCESS_LOOP(W13, 61, D, E, F, G, H, A, B, C)
- PROCESS_LOOP(W14, 62, C, D, E, F, G, H, A, B)
- PROCESS_LOOP(W15, 63, B, C, D, E, F, G, H, A)
- // Add old digest
- vmovdqu32 TMP2, A
- vmovdqu32 A, [SCRATCH + 64*0]
- vpaddd A{k1}, A, TMP2
- vmovdqu32 TMP2, B
- vmovdqu32 B, [SCRATCH + 64*1]
- vpaddd B{k1}, B, TMP2
- vmovdqu32 TMP2, C
- vmovdqu32 C, [SCRATCH + 64*2]
- vpaddd C{k1}, C, TMP2
- vmovdqu32 TMP2, D
- vmovdqu32 D, [SCRATCH + 64*3]
- vpaddd D{k1}, D, TMP2
- vmovdqu32 TMP2, E
- vmovdqu32 E, [SCRATCH + 64*4]
- vpaddd E{k1}, E, TMP2
- vmovdqu32 TMP2, F
- vmovdqu32 F, [SCRATCH + 64*5]
- vpaddd F{k1}, F, TMP2
- vmovdqu32 TMP2, G
- vmovdqu32 G, [SCRATCH + 64*6]
- vpaddd G{k1}, G, TMP2
- vmovdqu32 TMP2, H
- vmovdqu32 H, [SCRATCH + 64*7]
- vpaddd H{k1}, H, TMP2
- // Write out digest
- vmovdqu32 [STATE + 0*SHA256_DIGEST_ROW_SIZE], A
- vmovdqu32 [STATE + 1*SHA256_DIGEST_ROW_SIZE], B
- vmovdqu32 [STATE + 2*SHA256_DIGEST_ROW_SIZE], C
- vmovdqu32 [STATE + 3*SHA256_DIGEST_ROW_SIZE], D
- vmovdqu32 [STATE + 4*SHA256_DIGEST_ROW_SIZE], E
- vmovdqu32 [STATE + 5*SHA256_DIGEST_ROW_SIZE], F
- vmovdqu32 [STATE + 6*SHA256_DIGEST_ROW_SIZE], G
- vmovdqu32 [STATE + 7*SHA256_DIGEST_ROW_SIZE], H
- VZEROUPPER
- RET
- //
- // Tables
- //
- DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x000(SB)/8, $0x0405060700010203
- DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x008(SB)/8, $0x0c0d0e0f08090a0b
- DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x010(SB)/8, $0x0405060700010203
- DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x018(SB)/8, $0x0c0d0e0f08090a0b
- DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x020(SB)/8, $0x0405060700010203
- DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x028(SB)/8, $0x0c0d0e0f08090a0b
- DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x030(SB)/8, $0x0405060700010203
- DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x038(SB)/8, $0x0c0d0e0f08090a0b
- GLOBL PSHUFFLE_BYTE_FLIP_MASK<>(SB), 8, $64
- DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x000(SB)/8, $0x0000000000000000
- DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x008(SB)/8, $0x0000000000000001
- DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x010(SB)/8, $0x0000000000000008
- DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x018(SB)/8, $0x0000000000000009
- DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x020(SB)/8, $0x0000000000000004
- DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x028(SB)/8, $0x0000000000000005
- DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x030(SB)/8, $0x000000000000000C
- DATA PSHUFFLE_TRANSPOSE16_MASK1<>+0x038(SB)/8, $0x000000000000000D
- GLOBL PSHUFFLE_TRANSPOSE16_MASK1<>(SB), 8, $64
- DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x000(SB)/8, $0x0000000000000002
- DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x008(SB)/8, $0x0000000000000003
- DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x010(SB)/8, $0x000000000000000A
- DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x018(SB)/8, $0x000000000000000B
- DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x020(SB)/8, $0x0000000000000006
- DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x028(SB)/8, $0x0000000000000007
- DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x030(SB)/8, $0x000000000000000E
- DATA PSHUFFLE_TRANSPOSE16_MASK2<>+0x038(SB)/8, $0x000000000000000F
- GLOBL PSHUFFLE_TRANSPOSE16_MASK2<>(SB), 8, $64
|