Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * des3_ede-asm_64.S  -  x86-64 assembly implementation of 3DES cipher
0004  *
0005  * Copyright © 2014 Jussi Kivilinna <jussi.kivilinna@iki.fi>
0006  */
0007 
0008 #include <linux/linkage.h>
0009 
0010 .file "des3_ede-asm_64.S"
0011 .text
0012 
0013 #define s1 .L_s1
0014 #define s2 ((s1) + (64*8))
0015 #define s3 ((s2) + (64*8))
0016 #define s4 ((s3) + (64*8))
0017 #define s5 ((s4) + (64*8))
0018 #define s6 ((s5) + (64*8))
0019 #define s7 ((s6) + (64*8))
0020 #define s8 ((s7) + (64*8))
0021 
0022 /* register macros */
0023 #define CTX %rdi
0024 
0025 #define RL0 %r8
0026 #define RL1 %r9
0027 #define RL2 %r10
0028 
0029 #define RL0d %r8d
0030 #define RL1d %r9d
0031 #define RL2d %r10d
0032 
0033 #define RR0 %r11
0034 #define RR1 %r12
0035 #define RR2 %r13
0036 
0037 #define RR0d %r11d
0038 #define RR1d %r12d
0039 #define RR2d %r13d
0040 
0041 #define RW0 %rax
0042 #define RW1 %rbx
0043 #define RW2 %rcx
0044 
0045 #define RW0d %eax
0046 #define RW1d %ebx
0047 #define RW2d %ecx
0048 
0049 #define RW0bl %al
0050 #define RW1bl %bl
0051 #define RW2bl %cl
0052 
0053 #define RW0bh %ah
0054 #define RW1bh %bh
0055 #define RW2bh %ch
0056 
0057 #define RT0 %r15
0058 #define RT1 %rsi
0059 #define RT2 %r14
0060 #define RT3 %rdx
0061 
0062 #define RT0d %r15d
0063 #define RT1d %esi
0064 #define RT2d %r14d
0065 #define RT3d %edx
0066 
0067 /***********************************************************************
0068  * 1-way 3DES
0069  ***********************************************************************/
0070 #define do_permutation(a, b, offset, mask) \
0071     movl a, RT0d; \
0072     shrl $(offset), RT0d; \
0073     xorl b, RT0d; \
0074     andl $(mask), RT0d; \
0075     xorl RT0d, b; \
0076     shll $(offset), RT0d; \
0077     xorl RT0d, a;
0078 
0079 #define expand_to_64bits(val, mask) \
0080     movl val##d, RT0d; \
0081     rorl $4, RT0d; \
0082     shlq $32, RT0; \
0083     orq RT0, val; \
0084     andq mask, val;
0085 
0086 #define compress_to_64bits(val) \
0087     movq val, RT0; \
0088     shrq $32, RT0; \
0089     roll $4, RT0d; \
0090     orl RT0d, val##d;
0091 
0092 #define initial_permutation(left, right) \
0093     do_permutation(left##d, right##d,  4, 0x0f0f0f0f); \
0094     do_permutation(left##d, right##d, 16, 0x0000ffff); \
0095     do_permutation(right##d, left##d,  2, 0x33333333); \
0096     do_permutation(right##d, left##d,  8, 0x00ff00ff); \
0097     movabs $0x3f3f3f3f3f3f3f3f, RT3; \
0098     movl left##d, RW0d; \
0099     roll $1, right##d; \
0100     xorl right##d, RW0d; \
0101     andl $0xaaaaaaaa, RW0d; \
0102     xorl RW0d, left##d; \
0103     xorl RW0d, right##d; \
0104     roll $1, left##d; \
0105     expand_to_64bits(right, RT3); \
0106     expand_to_64bits(left, RT3);
0107 
0108 #define final_permutation(left, right) \
0109     compress_to_64bits(right); \
0110     compress_to_64bits(left); \
0111     movl right##d, RW0d; \
0112     rorl $1, left##d; \
0113     xorl left##d, RW0d; \
0114     andl $0xaaaaaaaa, RW0d; \
0115     xorl RW0d, right##d; \
0116     xorl RW0d, left##d; \
0117     rorl $1, right##d; \
0118     do_permutation(right##d, left##d,  8, 0x00ff00ff); \
0119     do_permutation(right##d, left##d,  2, 0x33333333); \
0120     do_permutation(left##d, right##d, 16, 0x0000ffff); \
0121     do_permutation(left##d, right##d,  4, 0x0f0f0f0f);
0122 
0123 #define round1(n, from, to, load_next_key) \
0124     xorq from, RW0; \
0125     \
0126     movzbl RW0bl, RT0d; \
0127     movzbl RW0bh, RT1d; \
0128     shrq $16, RW0; \
0129     movzbl RW0bl, RT2d; \
0130     movzbl RW0bh, RT3d; \
0131     shrq $16, RW0; \
0132     movq s8(, RT0, 8), RT0; \
0133     xorq s6(, RT1, 8), to; \
0134     movzbl RW0bl, RL1d; \
0135     movzbl RW0bh, RT1d; \
0136     shrl $16, RW0d; \
0137     xorq s4(, RT2, 8), RT0; \
0138     xorq s2(, RT3, 8), to; \
0139     movzbl RW0bl, RT2d; \
0140     movzbl RW0bh, RT3d; \
0141     xorq s7(, RL1, 8), RT0; \
0142     xorq s5(, RT1, 8), to; \
0143     xorq s3(, RT2, 8), RT0; \
0144     load_next_key(n, RW0); \
0145     xorq RT0, to; \
0146     xorq s1(, RT3, 8), to; \
0147 
0148 #define load_next_key(n, RWx) \
0149     movq (((n) + 1) * 8)(CTX), RWx;
0150 
0151 #define dummy2(a, b) /*_*/
0152 
0153 #define read_block(io, left, right) \
0154     movl    (io), left##d; \
0155     movl   4(io), right##d; \
0156     bswapl left##d; \
0157     bswapl right##d;
0158 
0159 #define write_block(io, left, right) \
0160     bswapl left##d; \
0161     bswapl right##d; \
0162     movl   left##d,   (io); \
0163     movl   right##d, 4(io);
0164 
0165 SYM_FUNC_START(des3_ede_x86_64_crypt_blk)
0166     /* input:
0167      *  %rdi: round keys, CTX
0168      *  %rsi: dst
0169      *  %rdx: src
0170      */
0171     pushq %rbx;
0172     pushq %r12;
0173     pushq %r13;
0174     pushq %r14;
0175     pushq %r15;
0176 
0177     pushq %rsi; /* dst */
0178 
0179     read_block(%rdx, RL0, RR0);
0180     initial_permutation(RL0, RR0);
0181 
0182     movq (CTX), RW0;
0183 
0184     round1(0, RR0, RL0, load_next_key);
0185     round1(1, RL0, RR0, load_next_key);
0186     round1(2, RR0, RL0, load_next_key);
0187     round1(3, RL0, RR0, load_next_key);
0188     round1(4, RR0, RL0, load_next_key);
0189     round1(5, RL0, RR0, load_next_key);
0190     round1(6, RR0, RL0, load_next_key);
0191     round1(7, RL0, RR0, load_next_key);
0192     round1(8, RR0, RL0, load_next_key);
0193     round1(9, RL0, RR0, load_next_key);
0194     round1(10, RR0, RL0, load_next_key);
0195     round1(11, RL0, RR0, load_next_key);
0196     round1(12, RR0, RL0, load_next_key);
0197     round1(13, RL0, RR0, load_next_key);
0198     round1(14, RR0, RL0, load_next_key);
0199     round1(15, RL0, RR0, load_next_key);
0200 
0201     round1(16+0, RL0, RR0, load_next_key);
0202     round1(16+1, RR0, RL0, load_next_key);
0203     round1(16+2, RL0, RR0, load_next_key);
0204     round1(16+3, RR0, RL0, load_next_key);
0205     round1(16+4, RL0, RR0, load_next_key);
0206     round1(16+5, RR0, RL0, load_next_key);
0207     round1(16+6, RL0, RR0, load_next_key);
0208     round1(16+7, RR0, RL0, load_next_key);
0209     round1(16+8, RL0, RR0, load_next_key);
0210     round1(16+9, RR0, RL0, load_next_key);
0211     round1(16+10, RL0, RR0, load_next_key);
0212     round1(16+11, RR0, RL0, load_next_key);
0213     round1(16+12, RL0, RR0, load_next_key);
0214     round1(16+13, RR0, RL0, load_next_key);
0215     round1(16+14, RL0, RR0, load_next_key);
0216     round1(16+15, RR0, RL0, load_next_key);
0217 
0218     round1(32+0, RR0, RL0, load_next_key);
0219     round1(32+1, RL0, RR0, load_next_key);
0220     round1(32+2, RR0, RL0, load_next_key);
0221     round1(32+3, RL0, RR0, load_next_key);
0222     round1(32+4, RR0, RL0, load_next_key);
0223     round1(32+5, RL0, RR0, load_next_key);
0224     round1(32+6, RR0, RL0, load_next_key);
0225     round1(32+7, RL0, RR0, load_next_key);
0226     round1(32+8, RR0, RL0, load_next_key);
0227     round1(32+9, RL0, RR0, load_next_key);
0228     round1(32+10, RR0, RL0, load_next_key);
0229     round1(32+11, RL0, RR0, load_next_key);
0230     round1(32+12, RR0, RL0, load_next_key);
0231     round1(32+13, RL0, RR0, load_next_key);
0232     round1(32+14, RR0, RL0, load_next_key);
0233     round1(32+15, RL0, RR0, dummy2);
0234 
0235     final_permutation(RR0, RL0);
0236 
0237     popq %rsi /* dst */
0238     write_block(%rsi, RR0, RL0);
0239 
0240     popq %r15;
0241     popq %r14;
0242     popq %r13;
0243     popq %r12;
0244     popq %rbx;
0245 
0246     RET;
0247 SYM_FUNC_END(des3_ede_x86_64_crypt_blk)
0248 
0249 /***********************************************************************
0250  * 3-way 3DES
0251  ***********************************************************************/
0252 #define expand_to_64bits(val, mask) \
0253     movl val##d, RT0d; \
0254     rorl $4, RT0d; \
0255     shlq $32, RT0; \
0256     orq RT0, val; \
0257     andq mask, val;
0258 
0259 #define compress_to_64bits(val) \
0260     movq val, RT0; \
0261     shrq $32, RT0; \
0262     roll $4, RT0d; \
0263     orl RT0d, val##d;
0264 
0265 #define initial_permutation3(left, right) \
0266     do_permutation(left##0d, right##0d,  4, 0x0f0f0f0f); \
0267     do_permutation(left##0d, right##0d, 16, 0x0000ffff); \
0268       do_permutation(left##1d, right##1d,  4, 0x0f0f0f0f); \
0269       do_permutation(left##1d, right##1d, 16, 0x0000ffff); \
0270         do_permutation(left##2d, right##2d,  4, 0x0f0f0f0f); \
0271         do_permutation(left##2d, right##2d, 16, 0x0000ffff); \
0272         \
0273     do_permutation(right##0d, left##0d,  2, 0x33333333); \
0274     do_permutation(right##0d, left##0d,  8, 0x00ff00ff); \
0275       do_permutation(right##1d, left##1d,  2, 0x33333333); \
0276       do_permutation(right##1d, left##1d,  8, 0x00ff00ff); \
0277         do_permutation(right##2d, left##2d,  2, 0x33333333); \
0278         do_permutation(right##2d, left##2d,  8, 0x00ff00ff); \
0279         \
0280     movabs $0x3f3f3f3f3f3f3f3f, RT3; \
0281         \
0282     movl left##0d, RW0d; \
0283     roll $1, right##0d; \
0284     xorl right##0d, RW0d; \
0285     andl $0xaaaaaaaa, RW0d; \
0286     xorl RW0d, left##0d; \
0287     xorl RW0d, right##0d; \
0288     roll $1, left##0d; \
0289     expand_to_64bits(right##0, RT3); \
0290     expand_to_64bits(left##0, RT3); \
0291       movl left##1d, RW1d; \
0292       roll $1, right##1d; \
0293       xorl right##1d, RW1d; \
0294       andl $0xaaaaaaaa, RW1d; \
0295       xorl RW1d, left##1d; \
0296       xorl RW1d, right##1d; \
0297       roll $1, left##1d; \
0298       expand_to_64bits(right##1, RT3); \
0299       expand_to_64bits(left##1, RT3); \
0300         movl left##2d, RW2d; \
0301         roll $1, right##2d; \
0302         xorl right##2d, RW2d; \
0303         andl $0xaaaaaaaa, RW2d; \
0304         xorl RW2d, left##2d; \
0305         xorl RW2d, right##2d; \
0306         roll $1, left##2d; \
0307         expand_to_64bits(right##2, RT3); \
0308         expand_to_64bits(left##2, RT3);
0309 
0310 #define final_permutation3(left, right) \
0311     compress_to_64bits(right##0); \
0312     compress_to_64bits(left##0); \
0313     movl right##0d, RW0d; \
0314     rorl $1, left##0d; \
0315     xorl left##0d, RW0d; \
0316     andl $0xaaaaaaaa, RW0d; \
0317     xorl RW0d, right##0d; \
0318     xorl RW0d, left##0d; \
0319     rorl $1, right##0d; \
0320       compress_to_64bits(right##1); \
0321       compress_to_64bits(left##1); \
0322       movl right##1d, RW1d; \
0323       rorl $1, left##1d; \
0324       xorl left##1d, RW1d; \
0325       andl $0xaaaaaaaa, RW1d; \
0326       xorl RW1d, right##1d; \
0327       xorl RW1d, left##1d; \
0328       rorl $1, right##1d; \
0329         compress_to_64bits(right##2); \
0330         compress_to_64bits(left##2); \
0331         movl right##2d, RW2d; \
0332         rorl $1, left##2d; \
0333         xorl left##2d, RW2d; \
0334         andl $0xaaaaaaaa, RW2d; \
0335         xorl RW2d, right##2d; \
0336         xorl RW2d, left##2d; \
0337         rorl $1, right##2d; \
0338         \
0339     do_permutation(right##0d, left##0d,  8, 0x00ff00ff); \
0340     do_permutation(right##0d, left##0d,  2, 0x33333333); \
0341       do_permutation(right##1d, left##1d,  8, 0x00ff00ff); \
0342       do_permutation(right##1d, left##1d,  2, 0x33333333); \
0343         do_permutation(right##2d, left##2d,  8, 0x00ff00ff); \
0344         do_permutation(right##2d, left##2d,  2, 0x33333333); \
0345         \
0346     do_permutation(left##0d, right##0d, 16, 0x0000ffff); \
0347     do_permutation(left##0d, right##0d,  4, 0x0f0f0f0f); \
0348       do_permutation(left##1d, right##1d, 16, 0x0000ffff); \
0349       do_permutation(left##1d, right##1d,  4, 0x0f0f0f0f); \
0350         do_permutation(left##2d, right##2d, 16, 0x0000ffff); \
0351         do_permutation(left##2d, right##2d,  4, 0x0f0f0f0f);
0352 
0353 #define round3(n, from, to, load_next_key, do_movq) \
0354     xorq from##0, RW0; \
0355     movzbl RW0bl, RT3d; \
0356     movzbl RW0bh, RT1d; \
0357     shrq $16, RW0; \
0358     xorq s8(, RT3, 8), to##0; \
0359     xorq s6(, RT1, 8), to##0; \
0360     movzbl RW0bl, RT3d; \
0361     movzbl RW0bh, RT1d; \
0362     shrq $16, RW0; \
0363     xorq s4(, RT3, 8), to##0; \
0364     xorq s2(, RT1, 8), to##0; \
0365     movzbl RW0bl, RT3d; \
0366     movzbl RW0bh, RT1d; \
0367     shrl $16, RW0d; \
0368     xorq s7(, RT3, 8), to##0; \
0369     xorq s5(, RT1, 8), to##0; \
0370     movzbl RW0bl, RT3d; \
0371     movzbl RW0bh, RT1d; \
0372     load_next_key(n, RW0); \
0373     xorq s3(, RT3, 8), to##0; \
0374     xorq s1(, RT1, 8), to##0; \
0375         xorq from##1, RW1; \
0376         movzbl RW1bl, RT3d; \
0377         movzbl RW1bh, RT1d; \
0378         shrq $16, RW1; \
0379         xorq s8(, RT3, 8), to##1; \
0380         xorq s6(, RT1, 8), to##1; \
0381         movzbl RW1bl, RT3d; \
0382         movzbl RW1bh, RT1d; \
0383         shrq $16, RW1; \
0384         xorq s4(, RT3, 8), to##1; \
0385         xorq s2(, RT1, 8), to##1; \
0386         movzbl RW1bl, RT3d; \
0387         movzbl RW1bh, RT1d; \
0388         shrl $16, RW1d; \
0389         xorq s7(, RT3, 8), to##1; \
0390         xorq s5(, RT1, 8), to##1; \
0391         movzbl RW1bl, RT3d; \
0392         movzbl RW1bh, RT1d; \
0393         do_movq(RW0, RW1); \
0394         xorq s3(, RT3, 8), to##1; \
0395         xorq s1(, RT1, 8), to##1; \
0396             xorq from##2, RW2; \
0397             movzbl RW2bl, RT3d; \
0398             movzbl RW2bh, RT1d; \
0399             shrq $16, RW2; \
0400             xorq s8(, RT3, 8), to##2; \
0401             xorq s6(, RT1, 8), to##2; \
0402             movzbl RW2bl, RT3d; \
0403             movzbl RW2bh, RT1d; \
0404             shrq $16, RW2; \
0405             xorq s4(, RT3, 8), to##2; \
0406             xorq s2(, RT1, 8), to##2; \
0407             movzbl RW2bl, RT3d; \
0408             movzbl RW2bh, RT1d; \
0409             shrl $16, RW2d; \
0410             xorq s7(, RT3, 8), to##2; \
0411             xorq s5(, RT1, 8), to##2; \
0412             movzbl RW2bl, RT3d; \
0413             movzbl RW2bh, RT1d; \
0414             do_movq(RW0, RW2); \
0415             xorq s3(, RT3, 8), to##2; \
0416             xorq s1(, RT1, 8), to##2;
0417 
0418 #define __movq(src, dst) \
0419     movq src, dst;
0420 
0421 SYM_FUNC_START(des3_ede_x86_64_crypt_blk_3way)
0422     /* input:
0423      *  %rdi: ctx, round keys
0424      *  %rsi: dst (3 blocks)
0425      *  %rdx: src (3 blocks)
0426      */
0427 
0428     pushq %rbx;
0429     pushq %r12;
0430     pushq %r13;
0431     pushq %r14;
0432     pushq %r15;
0433 
0434     pushq %rsi /* dst */
0435 
0436     /* load input */
0437     movl 0 * 4(%rdx), RL0d;
0438     movl 1 * 4(%rdx), RR0d;
0439     movl 2 * 4(%rdx), RL1d;
0440     movl 3 * 4(%rdx), RR1d;
0441     movl 4 * 4(%rdx), RL2d;
0442     movl 5 * 4(%rdx), RR2d;
0443 
0444     bswapl RL0d;
0445     bswapl RR0d;
0446     bswapl RL1d;
0447     bswapl RR1d;
0448     bswapl RL2d;
0449     bswapl RR2d;
0450 
0451     initial_permutation3(RL, RR);
0452 
0453     movq 0(CTX), RW0;
0454     movq RW0, RW1;
0455     movq RW0, RW2;
0456 
0457     round3(0, RR, RL, load_next_key, __movq);
0458     round3(1, RL, RR, load_next_key, __movq);
0459     round3(2, RR, RL, load_next_key, __movq);
0460     round3(3, RL, RR, load_next_key, __movq);
0461     round3(4, RR, RL, load_next_key, __movq);
0462     round3(5, RL, RR, load_next_key, __movq);
0463     round3(6, RR, RL, load_next_key, __movq);
0464     round3(7, RL, RR, load_next_key, __movq);
0465     round3(8, RR, RL, load_next_key, __movq);
0466     round3(9, RL, RR, load_next_key, __movq);
0467     round3(10, RR, RL, load_next_key, __movq);
0468     round3(11, RL, RR, load_next_key, __movq);
0469     round3(12, RR, RL, load_next_key, __movq);
0470     round3(13, RL, RR, load_next_key, __movq);
0471     round3(14, RR, RL, load_next_key, __movq);
0472     round3(15, RL, RR, load_next_key, __movq);
0473 
0474     round3(16+0, RL, RR, load_next_key, __movq);
0475     round3(16+1, RR, RL, load_next_key, __movq);
0476     round3(16+2, RL, RR, load_next_key, __movq);
0477     round3(16+3, RR, RL, load_next_key, __movq);
0478     round3(16+4, RL, RR, load_next_key, __movq);
0479     round3(16+5, RR, RL, load_next_key, __movq);
0480     round3(16+6, RL, RR, load_next_key, __movq);
0481     round3(16+7, RR, RL, load_next_key, __movq);
0482     round3(16+8, RL, RR, load_next_key, __movq);
0483     round3(16+9, RR, RL, load_next_key, __movq);
0484     round3(16+10, RL, RR, load_next_key, __movq);
0485     round3(16+11, RR, RL, load_next_key, __movq);
0486     round3(16+12, RL, RR, load_next_key, __movq);
0487     round3(16+13, RR, RL, load_next_key, __movq);
0488     round3(16+14, RL, RR, load_next_key, __movq);
0489     round3(16+15, RR, RL, load_next_key, __movq);
0490 
0491     round3(32+0, RR, RL, load_next_key, __movq);
0492     round3(32+1, RL, RR, load_next_key, __movq);
0493     round3(32+2, RR, RL, load_next_key, __movq);
0494     round3(32+3, RL, RR, load_next_key, __movq);
0495     round3(32+4, RR, RL, load_next_key, __movq);
0496     round3(32+5, RL, RR, load_next_key, __movq);
0497     round3(32+6, RR, RL, load_next_key, __movq);
0498     round3(32+7, RL, RR, load_next_key, __movq);
0499     round3(32+8, RR, RL, load_next_key, __movq);
0500     round3(32+9, RL, RR, load_next_key, __movq);
0501     round3(32+10, RR, RL, load_next_key, __movq);
0502     round3(32+11, RL, RR, load_next_key, __movq);
0503     round3(32+12, RR, RL, load_next_key, __movq);
0504     round3(32+13, RL, RR, load_next_key, __movq);
0505     round3(32+14, RR, RL, load_next_key, __movq);
0506     round3(32+15, RL, RR, dummy2, dummy2);
0507 
0508     final_permutation3(RR, RL);
0509 
0510     bswapl RR0d;
0511     bswapl RL0d;
0512     bswapl RR1d;
0513     bswapl RL1d;
0514     bswapl RR2d;
0515     bswapl RL2d;
0516 
0517     popq %rsi /* dst */
0518     movl RR0d, 0 * 4(%rsi);
0519     movl RL0d, 1 * 4(%rsi);
0520     movl RR1d, 2 * 4(%rsi);
0521     movl RL1d, 3 * 4(%rsi);
0522     movl RR2d, 4 * 4(%rsi);
0523     movl RL2d, 5 * 4(%rsi);
0524 
0525     popq %r15;
0526     popq %r14;
0527     popq %r13;
0528     popq %r12;
0529     popq %rbx;
0530 
0531     RET;
0532 SYM_FUNC_END(des3_ede_x86_64_crypt_blk_3way)
0533 
0534 .section    .rodata, "a", @progbits
0535 .align 16
0536 .L_s1:
0537     .quad 0x0010100001010400, 0x0000000000000000
0538     .quad 0x0000100000010000, 0x0010100001010404
0539     .quad 0x0010100001010004, 0x0000100000010404
0540     .quad 0x0000000000000004, 0x0000100000010000
0541     .quad 0x0000000000000400, 0x0010100001010400
0542     .quad 0x0010100001010404, 0x0000000000000400
0543     .quad 0x0010000001000404, 0x0010100001010004
0544     .quad 0x0010000001000000, 0x0000000000000004
0545     .quad 0x0000000000000404, 0x0010000001000400
0546     .quad 0x0010000001000400, 0x0000100000010400
0547     .quad 0x0000100000010400, 0x0010100001010000
0548     .quad 0x0010100001010000, 0x0010000001000404
0549     .quad 0x0000100000010004, 0x0010000001000004
0550     .quad 0x0010000001000004, 0x0000100000010004
0551     .quad 0x0000000000000000, 0x0000000000000404
0552     .quad 0x0000100000010404, 0x0010000001000000
0553     .quad 0x0000100000010000, 0x0010100001010404
0554     .quad 0x0000000000000004, 0x0010100001010000
0555     .quad 0x0010100001010400, 0x0010000001000000
0556     .quad 0x0010000001000000, 0x0000000000000400
0557     .quad 0x0010100001010004, 0x0000100000010000
0558     .quad 0x0000100000010400, 0x0010000001000004
0559     .quad 0x0000000000000400, 0x0000000000000004
0560     .quad 0x0010000001000404, 0x0000100000010404
0561     .quad 0x0010100001010404, 0x0000100000010004
0562     .quad 0x0010100001010000, 0x0010000001000404
0563     .quad 0x0010000001000004, 0x0000000000000404
0564     .quad 0x0000100000010404, 0x0010100001010400
0565     .quad 0x0000000000000404, 0x0010000001000400
0566     .quad 0x0010000001000400, 0x0000000000000000
0567     .quad 0x0000100000010004, 0x0000100000010400
0568     .quad 0x0000000000000000, 0x0010100001010004
0569 .L_s2:
0570     .quad 0x0801080200100020, 0x0800080000000000
0571     .quad 0x0000080000000000, 0x0001080200100020
0572     .quad 0x0001000000100000, 0x0000000200000020
0573     .quad 0x0801000200100020, 0x0800080200000020
0574     .quad 0x0800000200000020, 0x0801080200100020
0575     .quad 0x0801080000100000, 0x0800000000000000
0576     .quad 0x0800080000000000, 0x0001000000100000
0577     .quad 0x0000000200000020, 0x0801000200100020
0578     .quad 0x0001080000100000, 0x0001000200100020
0579     .quad 0x0800080200000020, 0x0000000000000000
0580     .quad 0x0800000000000000, 0x0000080000000000
0581     .quad 0x0001080200100020, 0x0801000000100000
0582     .quad 0x0001000200100020, 0x0800000200000020
0583     .quad 0x0000000000000000, 0x0001080000100000
0584     .quad 0x0000080200000020, 0x0801080000100000
0585     .quad 0x0801000000100000, 0x0000080200000020
0586     .quad 0x0000000000000000, 0x0001080200100020
0587     .quad 0x0801000200100020, 0x0001000000100000
0588     .quad 0x0800080200000020, 0x0801000000100000
0589     .quad 0x0801080000100000, 0x0000080000000000
0590     .quad 0x0801000000100000, 0x0800080000000000
0591     .quad 0x0000000200000020, 0x0801080200100020
0592     .quad 0x0001080200100020, 0x0000000200000020
0593     .quad 0x0000080000000000, 0x0800000000000000
0594     .quad 0x0000080200000020, 0x0801080000100000
0595     .quad 0x0001000000100000, 0x0800000200000020
0596     .quad 0x0001000200100020, 0x0800080200000020
0597     .quad 0x0800000200000020, 0x0001000200100020
0598     .quad 0x0001080000100000, 0x0000000000000000
0599     .quad 0x0800080000000000, 0x0000080200000020
0600     .quad 0x0800000000000000, 0x0801000200100020
0601     .quad 0x0801080200100020, 0x0001080000100000
0602 .L_s3:
0603     .quad 0x0000002000000208, 0x0000202008020200
0604     .quad 0x0000000000000000, 0x0000200008020008
0605     .quad 0x0000002008000200, 0x0000000000000000
0606     .quad 0x0000202000020208, 0x0000002008000200
0607     .quad 0x0000200000020008, 0x0000000008000008
0608     .quad 0x0000000008000008, 0x0000200000020000
0609     .quad 0x0000202008020208, 0x0000200000020008
0610     .quad 0x0000200008020000, 0x0000002000000208
0611     .quad 0x0000000008000000, 0x0000000000000008
0612     .quad 0x0000202008020200, 0x0000002000000200
0613     .quad 0x0000202000020200, 0x0000200008020000
0614     .quad 0x0000200008020008, 0x0000202000020208
0615     .quad 0x0000002008000208, 0x0000202000020200
0616     .quad 0x0000200000020000, 0x0000002008000208
0617     .quad 0x0000000000000008, 0x0000202008020208
0618     .quad 0x0000002000000200, 0x0000000008000000
0619     .quad 0x0000202008020200, 0x0000000008000000
0620     .quad 0x0000200000020008, 0x0000002000000208
0621     .quad 0x0000200000020000, 0x0000202008020200
0622     .quad 0x0000002008000200, 0x0000000000000000
0623     .quad 0x0000002000000200, 0x0000200000020008
0624     .quad 0x0000202008020208, 0x0000002008000200
0625     .quad 0x0000000008000008, 0x0000002000000200
0626     .quad 0x0000000000000000, 0x0000200008020008
0627     .quad 0x0000002008000208, 0x0000200000020000
0628     .quad 0x0000000008000000, 0x0000202008020208
0629     .quad 0x0000000000000008, 0x0000202000020208
0630     .quad 0x0000202000020200, 0x0000000008000008
0631     .quad 0x0000200008020000, 0x0000002008000208
0632     .quad 0x0000002000000208, 0x0000200008020000
0633     .quad 0x0000202000020208, 0x0000000000000008
0634     .quad 0x0000200008020008, 0x0000202000020200
0635 .L_s4:
0636     .quad 0x1008020000002001, 0x1000020800002001
0637     .quad 0x1000020800002001, 0x0000000800000000
0638     .quad 0x0008020800002000, 0x1008000800000001
0639     .quad 0x1008000000000001, 0x1000020000002001
0640     .quad 0x0000000000000000, 0x0008020000002000
0641     .quad 0x0008020000002000, 0x1008020800002001
0642     .quad 0x1000000800000001, 0x0000000000000000
0643     .quad 0x0008000800000000, 0x1008000000000001
0644     .quad 0x1000000000000001, 0x0000020000002000
0645     .quad 0x0008000000000000, 0x1008020000002001
0646     .quad 0x0000000800000000, 0x0008000000000000
0647     .quad 0x1000020000002001, 0x0000020800002000
0648     .quad 0x1008000800000001, 0x1000000000000001
0649     .quad 0x0000020800002000, 0x0008000800000000
0650     .quad 0x0000020000002000, 0x0008020800002000
0651     .quad 0x1008020800002001, 0x1000000800000001
0652     .quad 0x0008000800000000, 0x1008000000000001
0653     .quad 0x0008020000002000, 0x1008020800002001
0654     .quad 0x1000000800000001, 0x0000000000000000
0655     .quad 0x0000000000000000, 0x0008020000002000
0656     .quad 0x0000020800002000, 0x0008000800000000
0657     .quad 0x1008000800000001, 0x1000000000000001
0658     .quad 0x1008020000002001, 0x1000020800002001
0659     .quad 0x1000020800002001, 0x0000000800000000
0660     .quad 0x1008020800002001, 0x1000000800000001
0661     .quad 0x1000000000000001, 0x0000020000002000
0662     .quad 0x1008000000000001, 0x1000020000002001
0663     .quad 0x0008020800002000, 0x1008000800000001
0664     .quad 0x1000020000002001, 0x0000020800002000
0665     .quad 0x0008000000000000, 0x1008020000002001
0666     .quad 0x0000000800000000, 0x0008000000000000
0667     .quad 0x0000020000002000, 0x0008020800002000
0668 .L_s5:
0669     .quad 0x0000001000000100, 0x0020001002080100
0670     .quad 0x0020000002080000, 0x0420001002000100
0671     .quad 0x0000000000080000, 0x0000001000000100
0672     .quad 0x0400000000000000, 0x0020000002080000
0673     .quad 0x0400001000080100, 0x0000000000080000
0674     .quad 0x0020001002000100, 0x0400001000080100
0675     .quad 0x0420001002000100, 0x0420000002080000
0676     .quad 0x0000001000080100, 0x0400000000000000
0677     .quad 0x0020000002000000, 0x0400000000080000
0678     .quad 0x0400000000080000, 0x0000000000000000
0679     .quad 0x0400001000000100, 0x0420001002080100
0680     .quad 0x0420001002080100, 0x0020001002000100
0681     .quad 0x0420000002080000, 0x0400001000000100
0682     .quad 0x0000000000000000, 0x0420000002000000
0683     .quad 0x0020001002080100, 0x0020000002000000
0684     .quad 0x0420000002000000, 0x0000001000080100
0685     .quad 0x0000000000080000, 0x0420001002000100
0686     .quad 0x0000001000000100, 0x0020000002000000
0687     .quad 0x0400000000000000, 0x0020000002080000
0688     .quad 0x0420001002000100, 0x0400001000080100
0689     .quad 0x0020001002000100, 0x0400000000000000
0690     .quad 0x0420000002080000, 0x0020001002080100
0691     .quad 0x0400001000080100, 0x0000001000000100
0692     .quad 0x0020000002000000, 0x0420000002080000
0693     .quad 0x0420001002080100, 0x0000001000080100
0694     .quad 0x0420000002000000, 0x0420001002080100
0695     .quad 0x0020000002080000, 0x0000000000000000
0696     .quad 0x0400000000080000, 0x0420000002000000
0697     .quad 0x0000001000080100, 0x0020001002000100
0698     .quad 0x0400001000000100, 0x0000000000080000
0699     .quad 0x0000000000000000, 0x0400000000080000
0700     .quad 0x0020001002080100, 0x0400001000000100
0701 .L_s6:
0702     .quad 0x0200000120000010, 0x0204000020000000
0703     .quad 0x0000040000000000, 0x0204040120000010
0704     .quad 0x0204000020000000, 0x0000000100000010
0705     .quad 0x0204040120000010, 0x0004000000000000
0706     .quad 0x0200040020000000, 0x0004040100000010
0707     .quad 0x0004000000000000, 0x0200000120000010
0708     .quad 0x0004000100000010, 0x0200040020000000
0709     .quad 0x0200000020000000, 0x0000040100000010
0710     .quad 0x0000000000000000, 0x0004000100000010
0711     .quad 0x0200040120000010, 0x0000040000000000
0712     .quad 0x0004040000000000, 0x0200040120000010
0713     .quad 0x0000000100000010, 0x0204000120000010
0714     .quad 0x0204000120000010, 0x0000000000000000
0715     .quad 0x0004040100000010, 0x0204040020000000
0716     .quad 0x0000040100000010, 0x0004040000000000
0717     .quad 0x0204040020000000, 0x0200000020000000
0718     .quad 0x0200040020000000, 0x0000000100000010
0719     .quad 0x0204000120000010, 0x0004040000000000
0720     .quad 0x0204040120000010, 0x0004000000000000
0721     .quad 0x0000040100000010, 0x0200000120000010
0722     .quad 0x0004000000000000, 0x0200040020000000
0723     .quad 0x0200000020000000, 0x0000040100000010
0724     .quad 0x0200000120000010, 0x0204040120000010
0725     .quad 0x0004040000000000, 0x0204000020000000
0726     .quad 0x0004040100000010, 0x0204040020000000
0727     .quad 0x0000000000000000, 0x0204000120000010
0728     .quad 0x0000000100000010, 0x0000040000000000
0729     .quad 0x0204000020000000, 0x0004040100000010
0730     .quad 0x0000040000000000, 0x0004000100000010
0731     .quad 0x0200040120000010, 0x0000000000000000
0732     .quad 0x0204040020000000, 0x0200000020000000
0733     .quad 0x0004000100000010, 0x0200040120000010
0734 .L_s7:
0735     .quad 0x0002000000200000, 0x2002000004200002
0736     .quad 0x2000000004000802, 0x0000000000000000
0737     .quad 0x0000000000000800, 0x2000000004000802
0738     .quad 0x2002000000200802, 0x0002000004200800
0739     .quad 0x2002000004200802, 0x0002000000200000
0740     .quad 0x0000000000000000, 0x2000000004000002
0741     .quad 0x2000000000000002, 0x0000000004000000
0742     .quad 0x2002000004200002, 0x2000000000000802
0743     .quad 0x0000000004000800, 0x2002000000200802
0744     .quad 0x2002000000200002, 0x0000000004000800
0745     .quad 0x2000000004000002, 0x0002000004200000
0746     .quad 0x0002000004200800, 0x2002000000200002
0747     .quad 0x0002000004200000, 0x0000000000000800
0748     .quad 0x2000000000000802, 0x2002000004200802
0749     .quad 0x0002000000200800, 0x2000000000000002
0750     .quad 0x0000000004000000, 0x0002000000200800
0751     .quad 0x0000000004000000, 0x0002000000200800
0752     .quad 0x0002000000200000, 0x2000000004000802
0753     .quad 0x2000000004000802, 0x2002000004200002
0754     .quad 0x2002000004200002, 0x2000000000000002
0755     .quad 0x2002000000200002, 0x0000000004000000
0756     .quad 0x0000000004000800, 0x0002000000200000
0757     .quad 0x0002000004200800, 0x2000000000000802
0758     .quad 0x2002000000200802, 0x0002000004200800
0759     .quad 0x2000000000000802, 0x2000000004000002
0760     .quad 0x2002000004200802, 0x0002000004200000
0761     .quad 0x0002000000200800, 0x0000000000000000
0762     .quad 0x2000000000000002, 0x2002000004200802
0763     .quad 0x0000000000000000, 0x2002000000200802
0764     .quad 0x0002000004200000, 0x0000000000000800
0765     .quad 0x2000000004000002, 0x0000000004000800
0766     .quad 0x0000000000000800, 0x2002000000200002
0767 .L_s8:
0768     .quad 0x0100010410001000, 0x0000010000001000
0769     .quad 0x0000000000040000, 0x0100010410041000
0770     .quad 0x0100000010000000, 0x0100010410001000
0771     .quad 0x0000000400000000, 0x0100000010000000
0772     .quad 0x0000000400040000, 0x0100000010040000
0773     .quad 0x0100010410041000, 0x0000010000041000
0774     .quad 0x0100010010041000, 0x0000010400041000
0775     .quad 0x0000010000001000, 0x0000000400000000
0776     .quad 0x0100000010040000, 0x0100000410000000
0777     .quad 0x0100010010001000, 0x0000010400001000
0778     .quad 0x0000010000041000, 0x0000000400040000
0779     .quad 0x0100000410040000, 0x0100010010041000
0780     .quad 0x0000010400001000, 0x0000000000000000
0781     .quad 0x0000000000000000, 0x0100000410040000
0782     .quad 0x0100000410000000, 0x0100010010001000
0783     .quad 0x0000010400041000, 0x0000000000040000
0784     .quad 0x0000010400041000, 0x0000000000040000
0785     .quad 0x0100010010041000, 0x0000010000001000
0786     .quad 0x0000000400000000, 0x0100000410040000
0787     .quad 0x0000010000001000, 0x0000010400041000
0788     .quad 0x0100010010001000, 0x0000000400000000
0789     .quad 0x0100000410000000, 0x0100000010040000
0790     .quad 0x0100000410040000, 0x0100000010000000
0791     .quad 0x0000000000040000, 0x0100010410001000
0792     .quad 0x0000000000000000, 0x0100010410041000
0793     .quad 0x0000000400040000, 0x0100000410000000
0794     .quad 0x0100000010040000, 0x0100010010001000
0795     .quad 0x0100010410001000, 0x0000000000000000
0796     .quad 0x0100010410041000, 0x0000010000041000
0797     .quad 0x0000010000041000, 0x0000010400001000
0798     .quad 0x0000010400001000, 0x0000000400040000
0799     .quad 0x0100000010000000, 0x0100010010041000