1/* des-amd64.S - AMD64 assembly implementation of 3DES cipher 2 * 3 * Copyright (C) 2014 Jussi Kivilinna <jussi.kivilinna@iki.fi> 4 * 5 * This file is part of Libgcrypt. 6 * 7 * Libgcrypt is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU Lesser General Public License as 9 * published by the Free Software Foundation; either version 2.1 of 10 * the License, or (at your option) any later version. 11 * 12 * Libgcrypt is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with this program; if not, see <http://www.gnu.org/licenses/>. 19 */ 20 21#ifdef __x86_64 22#include <config.h> 23#if defined(USE_DES) && (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ 24 defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) 25 26#include "asm-common-amd64.h" 27 28.text 29 30#define s1 0 31#define s2 ((s1) + (64*8)) 32#define s3 ((s2) + (64*8)) 33#define s4 ((s3) + (64*8)) 34#define s5 ((s4) + (64*8)) 35#define s6 ((s5) + (64*8)) 36#define s7 ((s6) + (64*8)) 37#define s8 ((s7) + (64*8)) 38 39/* register macros */ 40#define CTX %rdi 41#define SBOXES %rbp 42 43#define RL0 %r8 44#define RL1 %r9 45#define RL2 %r10 46 47#define RL0d %r8d 48#define RL1d %r9d 49#define RL2d %r10d 50 51#define RR0 %r11 52#define RR1 %r12 53#define RR2 %r13 54 55#define RR0d %r11d 56#define RR1d %r12d 57#define RR2d %r13d 58 59#define RW0 %rax 60#define RW1 %rbx 61#define RW2 %rcx 62 63#define RW0d %eax 64#define RW1d %ebx 65#define RW2d %ecx 66 67#define RW0bl %al 68#define RW1bl %bl 69#define RW2bl %cl 70 71#define RW0bh %ah 72#define RW1bh %bh 73#define RW2bh %ch 74 75#define RT0 %r15 76#define RT1 %rsi 77#define RT2 %r14 78#define RT3 %rdx 79 80#define RT0d %r15d 81#define RT1d %esi 82#define RT2d %r14d 83#define RT3d %edx 84 85/*********************************************************************** 86 * 1-way 3DES 87 ***********************************************************************/ 88#define do_permutation(a, b, offset, mask) \ 89 movl a, RT0d; \ 90 shrl $(offset), RT0d; \ 91 xorl b, RT0d; \ 92 andl $(mask), RT0d; \ 93 xorl RT0d, b; \ 94 shll $(offset), RT0d; \ 95 xorl RT0d, a; 96 97#define expand_to_64bits(val, mask) \ 98 movl val##d, RT0d; \ 99 rorl $4, RT0d; \ 100 shlq $32, RT0; \ 101 orq RT0, val; \ 102 andq mask, val; 103 104#define compress_to_64bits(val) \ 105 movq val, RT0; \ 106 shrq $32, RT0; \ 107 roll $4, RT0d; \ 108 orl RT0d, val##d; 109 110#define initial_permutation(left, right) \ 111 do_permutation(left##d, right##d, 4, 0x0f0f0f0f); \ 112 do_permutation(left##d, right##d, 16, 0x0000ffff); \ 113 do_permutation(right##d, left##d, 2, 0x33333333); \ 114 do_permutation(right##d, left##d, 8, 0x00ff00ff); \ 115 movabs $0x3f3f3f3f3f3f3f3f, RT3; \ 116 movl left##d, RW0d; \ 117 roll $1, right##d; \ 118 xorl right##d, RW0d; \ 119 andl $0xaaaaaaaa, RW0d; \ 120 xorl RW0d, left##d; \ 121 xorl RW0d, right##d; \ 122 roll $1, left##d; \ 123 expand_to_64bits(right, RT3); \ 124 expand_to_64bits(left, RT3); 125 126#define final_permutation(left, right) \ 127 compress_to_64bits(right); \ 128 compress_to_64bits(left); \ 129 movl right##d, RW0d; \ 130 rorl $1, left##d; \ 131 xorl left##d, RW0d; \ 132 andl $0xaaaaaaaa, RW0d; \ 133 xorl RW0d, right##d; \ 134 xorl RW0d, left##d; \ 135 rorl $1, right##d; \ 136 do_permutation(right##d, left##d, 8, 0x00ff00ff); \ 137 do_permutation(right##d, left##d, 2, 0x33333333); \ 138 do_permutation(left##d, right##d, 16, 0x0000ffff); \ 139 do_permutation(left##d, right##d, 4, 0x0f0f0f0f); 140 141#define round1(n, from, to, load_next_key) \ 142 xorq from, RW0; \ 143 \ 144 movzbl RW0bl, RT0d; \ 145 movzbl RW0bh, RT1d; \ 146 shrq $16, RW0; \ 147 movzbl RW0bl, RT2d; \ 148 movzbl RW0bh, RT3d; \ 149 shrq $16, RW0; \ 150 movq s8(SBOXES, RT0, 8), RT0; \ 151 xorq s6(SBOXES, RT1, 8), to; \ 152 movzbl RW0bl, RL1d; \ 153 movzbl RW0bh, RT1d; \ 154 shrl $16, RW0d; \ 155 xorq s4(SBOXES, RT2, 8), RT0; \ 156 xorq s2(SBOXES, RT3, 8), to; \ 157 movzbl RW0bl, RT2d; \ 158 movzbl RW0bh, RT3d; \ 159 xorq s7(SBOXES, RL1, 8), RT0; \ 160 xorq s5(SBOXES, RT1, 8), to; \ 161 xorq s3(SBOXES, RT2, 8), RT0; \ 162 load_next_key(n, RW0); \ 163 xorq RT0, to; \ 164 xorq s1(SBOXES, RT3, 8), to; \ 165 166#define load_next_key(n, RWx) \ 167 movq (((n) + 1) * 8)(CTX), RWx; 168 169#define dummy2(a, b) /*_*/ 170 171#define read_block(io, left, right) \ 172 movl (io), left##d; \ 173 movl 4(io), right##d; \ 174 bswapl left##d; \ 175 bswapl right##d; 176 177#define write_block(io, left, right) \ 178 bswapl left##d; \ 179 bswapl right##d; \ 180 movl left##d, (io); \ 181 movl right##d, 4(io); 182 183.align 8 184.globl _gcry_3des_amd64_crypt_block 185ELF(.type _gcry_3des_amd64_crypt_block,@function;) 186 187_gcry_3des_amd64_crypt_block: 188 /* input: 189 * %rdi: round keys, CTX 190 * %rsi: dst 191 * %rdx: src 192 */ 193 CFI_STARTPROC(); 194 ENTER_SYSV_FUNC_PARAMS_0_4 195 196 pushq %rbp; 197 CFI_PUSH(%rbp); 198 pushq %rbx; 199 CFI_PUSH(%rbx); 200 pushq %r12; 201 CFI_PUSH(%r12); 202 pushq %r13; 203 CFI_PUSH(%r13); 204 pushq %r14; 205 CFI_PUSH(%r14); 206 pushq %r15; 207 CFI_PUSH(%r15); 208 pushq %rsi; /*dst*/ 209 CFI_PUSH(%rsi); 210 211 leaq .L_s1 rRIP, SBOXES; 212 213 read_block(%rdx, RL0, RR0); 214 initial_permutation(RL0, RR0); 215 216 movq (CTX), RW0; 217 218 round1(0, RR0, RL0, load_next_key); 219 round1(1, RL0, RR0, load_next_key); 220 round1(2, RR0, RL0, load_next_key); 221 round1(3, RL0, RR0, load_next_key); 222 round1(4, RR0, RL0, load_next_key); 223 round1(5, RL0, RR0, load_next_key); 224 round1(6, RR0, RL0, load_next_key); 225 round1(7, RL0, RR0, load_next_key); 226 round1(8, RR0, RL0, load_next_key); 227 round1(9, RL0, RR0, load_next_key); 228 round1(10, RR0, RL0, load_next_key); 229 round1(11, RL0, RR0, load_next_key); 230 round1(12, RR0, RL0, load_next_key); 231 round1(13, RL0, RR0, load_next_key); 232 round1(14, RR0, RL0, load_next_key); 233 round1(15, RL0, RR0, load_next_key); 234 235 round1(16+0, RL0, RR0, load_next_key); 236 round1(16+1, RR0, RL0, load_next_key); 237 round1(16+2, RL0, RR0, load_next_key); 238 round1(16+3, RR0, RL0, load_next_key); 239 round1(16+4, RL0, RR0, load_next_key); 240 round1(16+5, RR0, RL0, load_next_key); 241 round1(16+6, RL0, RR0, load_next_key); 242 round1(16+7, RR0, RL0, load_next_key); 243 round1(16+8, RL0, RR0, load_next_key); 244 round1(16+9, RR0, RL0, load_next_key); 245 round1(16+10, RL0, RR0, load_next_key); 246 round1(16+11, RR0, RL0, load_next_key); 247 round1(16+12, RL0, RR0, load_next_key); 248 round1(16+13, RR0, RL0, load_next_key); 249 round1(16+14, RL0, RR0, load_next_key); 250 round1(16+15, RR0, RL0, load_next_key); 251 252 round1(32+0, RR0, RL0, load_next_key); 253 round1(32+1, RL0, RR0, load_next_key); 254 round1(32+2, RR0, RL0, load_next_key); 255 round1(32+3, RL0, RR0, load_next_key); 256 round1(32+4, RR0, RL0, load_next_key); 257 round1(32+5, RL0, RR0, load_next_key); 258 round1(32+6, RR0, RL0, load_next_key); 259 round1(32+7, RL0, RR0, load_next_key); 260 round1(32+8, RR0, RL0, load_next_key); 261 round1(32+9, RL0, RR0, load_next_key); 262 round1(32+10, RR0, RL0, load_next_key); 263 round1(32+11, RL0, RR0, load_next_key); 264 round1(32+12, RR0, RL0, load_next_key); 265 round1(32+13, RL0, RR0, load_next_key); 266 round1(32+14, RR0, RL0, load_next_key); 267 round1(32+15, RL0, RR0, dummy2); 268 269 popq RW2; /*dst*/ 270 CFI_POP_TMP_REG(); 271 final_permutation(RR0, RL0); 272 write_block(RW2, RR0, RL0); 273 274 popq %r15; 275 CFI_POP(%r15); 276 popq %r14; 277 CFI_POP(%r14); 278 popq %r13; 279 CFI_POP(%r13); 280 popq %r12; 281 CFI_POP(%r12); 282 popq %rbx; 283 CFI_POP(%rbx); 284 popq %rbp; 285 CFI_POP(%rbp); 286 287 EXIT_SYSV_FUNC 288 ret; 289 CFI_ENDPROC(); 290ELF(.size _gcry_3des_amd64_crypt_block,.-_gcry_3des_amd64_crypt_block;) 291 292/*********************************************************************** 293 * 3-way 3DES 294 ***********************************************************************/ 295#define expand_to_64bits(val, mask) \ 296 movl val##d, RT0d; \ 297 rorl $4, RT0d; \ 298 shlq $32, RT0; \ 299 orq RT0, val; \ 300 andq mask, val; 301 302#define compress_to_64bits(val) \ 303 movq val, RT0; \ 304 shrq $32, RT0; \ 305 roll $4, RT0d; \ 306 orl RT0d, val##d; 307 308#define initial_permutation3(left, right) \ 309 do_permutation(left##0d, right##0d, 4, 0x0f0f0f0f); \ 310 do_permutation(left##0d, right##0d, 16, 0x0000ffff); \ 311 do_permutation(left##1d, right##1d, 4, 0x0f0f0f0f); \ 312 do_permutation(left##1d, right##1d, 16, 0x0000ffff); \ 313 do_permutation(left##2d, right##2d, 4, 0x0f0f0f0f); \ 314 do_permutation(left##2d, right##2d, 16, 0x0000ffff); \ 315 \ 316 do_permutation(right##0d, left##0d, 2, 0x33333333); \ 317 do_permutation(right##0d, left##0d, 8, 0x00ff00ff); \ 318 do_permutation(right##1d, left##1d, 2, 0x33333333); \ 319 do_permutation(right##1d, left##1d, 8, 0x00ff00ff); \ 320 do_permutation(right##2d, left##2d, 2, 0x33333333); \ 321 do_permutation(right##2d, left##2d, 8, 0x00ff00ff); \ 322 \ 323 movabs $0x3f3f3f3f3f3f3f3f, RT3; \ 324 \ 325 movl left##0d, RW0d; \ 326 roll $1, right##0d; \ 327 xorl right##0d, RW0d; \ 328 andl $0xaaaaaaaa, RW0d; \ 329 xorl RW0d, left##0d; \ 330 xorl RW0d, right##0d; \ 331 roll $1, left##0d; \ 332 expand_to_64bits(right##0, RT3); \ 333 expand_to_64bits(left##0, RT3); \ 334 movl left##1d, RW1d; \ 335 roll $1, right##1d; \ 336 xorl right##1d, RW1d; \ 337 andl $0xaaaaaaaa, RW1d; \ 338 xorl RW1d, left##1d; \ 339 xorl RW1d, right##1d; \ 340 roll $1, left##1d; \ 341 expand_to_64bits(right##1, RT3); \ 342 expand_to_64bits(left##1, RT3); \ 343 movl left##2d, RW2d; \ 344 roll $1, right##2d; \ 345 xorl right##2d, RW2d; \ 346 andl $0xaaaaaaaa, RW2d; \ 347 xorl RW2d, left##2d; \ 348 xorl RW2d, right##2d; \ 349 roll $1, left##2d; \ 350 expand_to_64bits(right##2, RT3); \ 351 expand_to_64bits(left##2, RT3); 352 353#define final_permutation3(left, right) \ 354 compress_to_64bits(right##0); \ 355 compress_to_64bits(left##0); \ 356 movl right##0d, RW0d; \ 357 rorl $1, left##0d; \ 358 xorl left##0d, RW0d; \ 359 andl $0xaaaaaaaa, RW0d; \ 360 xorl RW0d, right##0d; \ 361 xorl RW0d, left##0d; \ 362 rorl $1, right##0d; \ 363 compress_to_64bits(right##1); \ 364 compress_to_64bits(left##1); \ 365 movl right##1d, RW1d; \ 366 rorl $1, left##1d; \ 367 xorl left##1d, RW1d; \ 368 andl $0xaaaaaaaa, RW1d; \ 369 xorl RW1d, right##1d; \ 370 xorl RW1d, left##1d; \ 371 rorl $1, right##1d; \ 372 compress_to_64bits(right##2); \ 373 compress_to_64bits(left##2); \ 374 movl right##2d, RW2d; \ 375 rorl $1, left##2d; \ 376 xorl left##2d, RW2d; \ 377 andl $0xaaaaaaaa, RW2d; \ 378 xorl RW2d, right##2d; \ 379 xorl RW2d, left##2d; \ 380 rorl $1, right##2d; \ 381 \ 382 do_permutation(right##0d, left##0d, 8, 0x00ff00ff); \ 383 do_permutation(right##0d, left##0d, 2, 0x33333333); \ 384 do_permutation(right##1d, left##1d, 8, 0x00ff00ff); \ 385 do_permutation(right##1d, left##1d, 2, 0x33333333); \ 386 do_permutation(right##2d, left##2d, 8, 0x00ff00ff); \ 387 do_permutation(right##2d, left##2d, 2, 0x33333333); \ 388 \ 389 do_permutation(left##0d, right##0d, 16, 0x0000ffff); \ 390 do_permutation(left##0d, right##0d, 4, 0x0f0f0f0f); \ 391 do_permutation(left##1d, right##1d, 16, 0x0000ffff); \ 392 do_permutation(left##1d, right##1d, 4, 0x0f0f0f0f); \ 393 do_permutation(left##2d, right##2d, 16, 0x0000ffff); \ 394 do_permutation(left##2d, right##2d, 4, 0x0f0f0f0f); 395 396#define round3(n, from, to, load_next_key, do_movq) \ 397 xorq from##0, RW0; \ 398 movzbl RW0bl, RT3d; \ 399 movzbl RW0bh, RT1d; \ 400 shrq $16, RW0; \ 401 xorq s8(SBOXES, RT3, 8), to##0; \ 402 xorq s6(SBOXES, RT1, 8), to##0; \ 403 movzbl RW0bl, RT3d; \ 404 movzbl RW0bh, RT1d; \ 405 shrq $16, RW0; \ 406 xorq s4(SBOXES, RT3, 8), to##0; \ 407 xorq s2(SBOXES, RT1, 8), to##0; \ 408 movzbl RW0bl, RT3d; \ 409 movzbl RW0bh, RT1d; \ 410 shrl $16, RW0d; \ 411 xorq s7(SBOXES, RT3, 8), to##0; \ 412 xorq s5(SBOXES, RT1, 8), to##0; \ 413 movzbl RW0bl, RT3d; \ 414 movzbl RW0bh, RT1d; \ 415 load_next_key(n, RW0); \ 416 xorq s3(SBOXES, RT3, 8), to##0; \ 417 xorq s1(SBOXES, RT1, 8), to##0; \ 418 xorq from##1, RW1; \ 419 movzbl RW1bl, RT3d; \ 420 movzbl RW1bh, RT1d; \ 421 shrq $16, RW1; \ 422 xorq s8(SBOXES, RT3, 8), to##1; \ 423 xorq s6(SBOXES, RT1, 8), to##1; \ 424 movzbl RW1bl, RT3d; \ 425 movzbl RW1bh, RT1d; \ 426 shrq $16, RW1; \ 427 xorq s4(SBOXES, RT3, 8), to##1; \ 428 xorq s2(SBOXES, RT1, 8), to##1; \ 429 movzbl RW1bl, RT3d; \ 430 movzbl RW1bh, RT1d; \ 431 shrl $16, RW1d; \ 432 xorq s7(SBOXES, RT3, 8), to##1; \ 433 xorq s5(SBOXES, RT1, 8), to##1; \ 434 movzbl RW1bl, RT3d; \ 435 movzbl RW1bh, RT1d; \ 436 do_movq(RW0, RW1); \ 437 xorq s3(SBOXES, RT3, 8), to##1; \ 438 xorq s1(SBOXES, RT1, 8), to##1; \ 439 xorq from##2, RW2; \ 440 movzbl RW2bl, RT3d; \ 441 movzbl RW2bh, RT1d; \ 442 shrq $16, RW2; \ 443 xorq s8(SBOXES, RT3, 8), to##2; \ 444 xorq s6(SBOXES, RT1, 8), to##2; \ 445 movzbl RW2bl, RT3d; \ 446 movzbl RW2bh, RT1d; \ 447 shrq $16, RW2; \ 448 xorq s4(SBOXES, RT3, 8), to##2; \ 449 xorq s2(SBOXES, RT1, 8), to##2; \ 450 movzbl RW2bl, RT3d; \ 451 movzbl RW2bh, RT1d; \ 452 shrl $16, RW2d; \ 453 xorq s7(SBOXES, RT3, 8), to##2; \ 454 xorq s5(SBOXES, RT1, 8), to##2; \ 455 movzbl RW2bl, RT3d; \ 456 movzbl RW2bh, RT1d; \ 457 do_movq(RW0, RW2); \ 458 xorq s3(SBOXES, RT3, 8), to##2; \ 459 xorq s1(SBOXES, RT1, 8), to##2; 460 461#define __movq(src, dst) \ 462 movq src, dst; 463 464#define read_block(io, left, right) \ 465 movl (io), left##d; \ 466 movl 4(io), right##d; \ 467 bswapl left##d; \ 468 bswapl right##d; 469 470#define write_block(io, left, right) \ 471 bswapl left##d; \ 472 bswapl right##d; \ 473 movl left##d, (io); \ 474 movl right##d, 4(io); 475 476.align 8 477ELF(.type _gcry_3des_amd64_crypt_blk3,@function;) 478_gcry_3des_amd64_crypt_blk3: 479 /* input: 480 * %rdi: round keys, CTX 481 * RL0d, RR0d, RL1d, RR1d, RL2d, RR2d: 3 input blocks 482 * RR0d, RL0d, RR1d, RL1d, RR2d, RL2d: 3 output blocks 483 */ 484 CFI_STARTPROC(); 485 486 leaq .L_s1 rRIP, SBOXES; 487 488 initial_permutation3(RL, RR); 489 490 movq 0(CTX), RW0; 491 movq RW0, RW1; 492 movq RW0, RW2; 493 494 round3(0, RR, RL, load_next_key, __movq); 495 round3(1, RL, RR, load_next_key, __movq); 496 round3(2, RR, RL, load_next_key, __movq); 497 round3(3, RL, RR, load_next_key, __movq); 498 round3(4, RR, RL, load_next_key, __movq); 499 round3(5, RL, RR, load_next_key, __movq); 500 round3(6, RR, RL, load_next_key, __movq); 501 round3(7, RL, RR, load_next_key, __movq); 502 round3(8, RR, RL, load_next_key, __movq); 503 round3(9, RL, RR, load_next_key, __movq); 504 round3(10, RR, RL, load_next_key, __movq); 505 round3(11, RL, RR, load_next_key, __movq); 506 round3(12, RR, RL, load_next_key, __movq); 507 round3(13, RL, RR, load_next_key, __movq); 508 round3(14, RR, RL, load_next_key, __movq); 509 round3(15, RL, RR, load_next_key, __movq); 510 511 round3(16+0, RL, RR, load_next_key, __movq); 512 round3(16+1, RR, RL, load_next_key, __movq); 513 round3(16+2, RL, RR, load_next_key, __movq); 514 round3(16+3, RR, RL, load_next_key, __movq); 515 round3(16+4, RL, RR, load_next_key, __movq); 516 round3(16+5, RR, RL, load_next_key, __movq); 517 round3(16+6, RL, RR, load_next_key, __movq); 518 round3(16+7, RR, RL, load_next_key, __movq); 519 round3(16+8, RL, RR, load_next_key, __movq); 520 round3(16+9, RR, RL, load_next_key, __movq); 521 round3(16+10, RL, RR, load_next_key, __movq); 522 round3(16+11, RR, RL, load_next_key, __movq); 523 round3(16+12, RL, RR, load_next_key, __movq); 524 round3(16+13, RR, RL, load_next_key, __movq); 525 round3(16+14, RL, RR, load_next_key, __movq); 526 round3(16+15, RR, RL, load_next_key, __movq); 527 528 round3(32+0, RR, RL, load_next_key, __movq); 529 round3(32+1, RL, RR, load_next_key, __movq); 530 round3(32+2, RR, RL, load_next_key, __movq); 531 round3(32+3, RL, RR, load_next_key, __movq); 532 round3(32+4, RR, RL, load_next_key, __movq); 533 round3(32+5, RL, RR, load_next_key, __movq); 534 round3(32+6, RR, RL, load_next_key, __movq); 535 round3(32+7, RL, RR, load_next_key, __movq); 536 round3(32+8, RR, RL, load_next_key, __movq); 537 round3(32+9, RL, RR, load_next_key, __movq); 538 round3(32+10, RR, RL, load_next_key, __movq); 539 round3(32+11, RL, RR, load_next_key, __movq); 540 round3(32+12, RR, RL, load_next_key, __movq); 541 round3(32+13, RL, RR, load_next_key, __movq); 542 round3(32+14, RR, RL, load_next_key, __movq); 543 round3(32+15, RL, RR, dummy2, dummy2); 544 545 final_permutation3(RR, RL); 546 547 ret; 548 CFI_ENDPROC(); 549ELF(.size _gcry_3des_amd64_crypt_blk3,.-_gcry_3des_amd64_crypt_blk3;) 550 551.align 8 552.globl _gcry_3des_amd64_cbc_dec 553ELF(.type _gcry_3des_amd64_cbc_dec,@function;) 554_gcry_3des_amd64_cbc_dec: 555 /* input: 556 * %rdi: ctx, CTX 557 * %rsi: dst (3 blocks) 558 * %rdx: src (3 blocks) 559 * %rcx: iv (64bit) 560 */ 561 CFI_STARTPROC(); 562 ENTER_SYSV_FUNC_PARAMS_0_4 563 564 pushq %rbp; 565 CFI_PUSH(%rbp); 566 pushq %rbx; 567 CFI_PUSH(%rbx); 568 pushq %r12; 569 CFI_PUSH(%r12); 570 pushq %r13; 571 CFI_PUSH(%r13); 572 pushq %r14; 573 CFI_PUSH(%r14); 574 pushq %r15; 575 CFI_PUSH(%r15); 576 577 pushq %rsi; /*dst*/ 578 CFI_PUSH(%rsi); 579 pushq %rdx; /*src*/ 580 CFI_PUSH(%rdx); 581 pushq %rcx; /*iv*/ 582 CFI_PUSH(%rcx); 583 584 /* load input */ 585 movl 0 * 4(%rdx), RL0d; 586 movl 1 * 4(%rdx), RR0d; 587 movl 2 * 4(%rdx), RL1d; 588 movl 3 * 4(%rdx), RR1d; 589 movl 4 * 4(%rdx), RL2d; 590 movl 5 * 4(%rdx), RR2d; 591 592 bswapl RL0d; 593 bswapl RR0d; 594 bswapl RL1d; 595 bswapl RR1d; 596 bswapl RL2d; 597 bswapl RR2d; 598 599 call _gcry_3des_amd64_crypt_blk3; 600 601 popq %rcx; /*iv*/ 602 CFI_POP_TMP_REG(); 603 popq %rdx; /*src*/ 604 CFI_POP_TMP_REG(); 605 popq %rsi; /*dst*/ 606 CFI_POP_TMP_REG(); 607 608 bswapl RR0d; 609 bswapl RL0d; 610 bswapl RR1d; 611 bswapl RL1d; 612 bswapl RR2d; 613 bswapl RL2d; 614 615 movq 2 * 8(%rdx), RT0; 616 xorl 0 * 4(%rcx), RR0d; 617 xorl 1 * 4(%rcx), RL0d; 618 xorl 0 * 4(%rdx), RR1d; 619 xorl 1 * 4(%rdx), RL1d; 620 xorl 2 * 4(%rdx), RR2d; 621 xorl 3 * 4(%rdx), RL2d; 622 movq RT0, (%rcx); /* store new IV */ 623 624 movl RR0d, 0 * 4(%rsi); 625 movl RL0d, 1 * 4(%rsi); 626 movl RR1d, 2 * 4(%rsi); 627 movl RL1d, 3 * 4(%rsi); 628 movl RR2d, 4 * 4(%rsi); 629 movl RL2d, 5 * 4(%rsi); 630 631 popq %r15; 632 CFI_POP(%r15); 633 popq %r14; 634 CFI_POP(%r14); 635 popq %r13; 636 CFI_POP(%r13); 637 popq %r12; 638 CFI_POP(%r12); 639 popq %rbx; 640 CFI_POP(%rbx); 641 popq %rbp; 642 CFI_POP(%rbp); 643 644 EXIT_SYSV_FUNC 645 ret; 646 CFI_ENDPROC(); 647ELF(.size _gcry_3des_amd64_cbc_dec,.-_gcry_3des_amd64_cbc_dec;) 648 649.align 8 650.globl _gcry_3des_amd64_ctr_enc 651ELF(.type _gcry_3des_amd64_ctr_enc,@function;) 652_gcry_3des_amd64_ctr_enc: 653 /* input: 654 * %rdi: ctx, CTX 655 * %rsi: dst (3 blocks) 656 * %rdx: src (3 blocks) 657 * %rcx: iv (64bit) 658 */ 659 CFI_STARTPROC(); 660 ENTER_SYSV_FUNC_PARAMS_0_4 661 662 pushq %rbp; 663 CFI_PUSH(%rbp); 664 pushq %rbx; 665 CFI_PUSH(%rbx); 666 pushq %r12; 667 CFI_PUSH(%r12); 668 pushq %r13; 669 CFI_PUSH(%r13); 670 pushq %r14; 671 CFI_PUSH(%r14); 672 pushq %r15; 673 CFI_PUSH(%r15); 674 675 pushq %rsi; /*dst*/ 676 CFI_PUSH(%rsi); 677 pushq %rdx; /*src*/ 678 CFI_PUSH(%rdx); 679 movq %rcx, RW2; 680 681 /* load IV and byteswap */ 682 movq (RW2), RT0; 683 bswapq RT0; 684 movq RT0, RR0; 685 686 /* construct IVs */ 687 leaq 1(RT0), RR1; 688 leaq 2(RT0), RR2; 689 leaq 3(RT0), RT0; 690 movq RR0, RL0; 691 movq RR1, RL1; 692 movq RR2, RL2; 693 bswapq RT0; 694 shrq $32, RL0; 695 shrq $32, RL1; 696 shrq $32, RL2; 697 698 /* store new IV */ 699 movq RT0, (RW2); 700 701 call _gcry_3des_amd64_crypt_blk3; 702 703 popq %rdx; /*src*/ 704 CFI_POP_TMP_REG(); 705 popq %rsi; /*dst*/ 706 CFI_POP_TMP_REG(); 707 708 bswapl RR0d; 709 bswapl RL0d; 710 bswapl RR1d; 711 bswapl RL1d; 712 bswapl RR2d; 713 bswapl RL2d; 714 715 xorl 0 * 4(%rdx), RR0d; 716 xorl 1 * 4(%rdx), RL0d; 717 xorl 2 * 4(%rdx), RR1d; 718 xorl 3 * 4(%rdx), RL1d; 719 xorl 4 * 4(%rdx), RR2d; 720 xorl 5 * 4(%rdx), RL2d; 721 722 movl RR0d, 0 * 4(%rsi); 723 movl RL0d, 1 * 4(%rsi); 724 movl RR1d, 2 * 4(%rsi); 725 movl RL1d, 3 * 4(%rsi); 726 movl RR2d, 4 * 4(%rsi); 727 movl RL2d, 5 * 4(%rsi); 728 729 popq %r15; 730 CFI_POP(%r15); 731 popq %r14; 732 CFI_POP(%r14); 733 popq %r13; 734 CFI_POP(%r13); 735 popq %r12; 736 CFI_POP(%r12); 737 popq %rbx; 738 CFI_POP(%rbx); 739 popq %rbp; 740 CFI_POP(%rbp); 741 742 EXIT_SYSV_FUNC 743 ret; 744 CFI_ENDPROC(); 745ELF(.size _gcry_3des_amd64_cbc_dec,.-_gcry_3des_amd64_cbc_dec;) 746 747.align 8 748.globl _gcry_3des_amd64_cfb_dec 749ELF(.type _gcry_3des_amd64_cfb_dec,@function;) 750_gcry_3des_amd64_cfb_dec: 751 /* input: 752 * %rdi: ctx, CTX 753 * %rsi: dst (3 blocks) 754 * %rdx: src (3 blocks) 755 * %rcx: iv (64bit) 756 */ 757 CFI_STARTPROC(); 758 ENTER_SYSV_FUNC_PARAMS_0_4 759 760 pushq %rbp; 761 CFI_PUSH(%rbp); 762 pushq %rbx; 763 CFI_PUSH(%rbx); 764 pushq %r12; 765 CFI_PUSH(%r12); 766 pushq %r13; 767 CFI_PUSH(%r13); 768 pushq %r14; 769 CFI_PUSH(%r14); 770 pushq %r15; 771 CFI_PUSH(%r15); 772 773 pushq %rsi; /*dst*/ 774 CFI_PUSH(%rsi); 775 pushq %rdx; /*src*/ 776 CFI_PUSH(%rdx); 777 movq %rcx, RW2; 778 779 /* Load input */ 780 movl 0 * 4(RW2), RL0d; 781 movl 1 * 4(RW2), RR0d; 782 movl 0 * 4(%rdx), RL1d; 783 movl 1 * 4(%rdx), RR1d; 784 movl 2 * 4(%rdx), RL2d; 785 movl 3 * 4(%rdx), RR2d; 786 787 bswapl RL0d; 788 bswapl RR0d; 789 bswapl RL1d; 790 bswapl RR1d; 791 bswapl RL2d; 792 bswapl RR2d; 793 794 /* Update IV */ 795 movq 4 * 4(%rdx), RW0; 796 movq RW0, (RW2); 797 798 call _gcry_3des_amd64_crypt_blk3; 799 800 popq %rdx; /*src*/ 801 CFI_POP_TMP_REG(); 802 popq %rsi; /*dst*/ 803 CFI_POP_TMP_REG(); 804 805 bswapl RR0d; 806 bswapl RL0d; 807 bswapl RR1d; 808 bswapl RL1d; 809 bswapl RR2d; 810 bswapl RL2d; 811 812 xorl 0 * 4(%rdx), RR0d; 813 xorl 1 * 4(%rdx), RL0d; 814 xorl 2 * 4(%rdx), RR1d; 815 xorl 3 * 4(%rdx), RL1d; 816 xorl 4 * 4(%rdx), RR2d; 817 xorl 5 * 4(%rdx), RL2d; 818 819 movl RR0d, 0 * 4(%rsi); 820 movl RL0d, 1 * 4(%rsi); 821 movl RR1d, 2 * 4(%rsi); 822 movl RL1d, 3 * 4(%rsi); 823 movl RR2d, 4 * 4(%rsi); 824 movl RL2d, 5 * 4(%rsi); 825 826 popq %r15; 827 CFI_POP(%r15); 828 popq %r14; 829 CFI_POP(%r14); 830 popq %r13; 831 CFI_POP(%r13); 832 popq %r12; 833 CFI_POP(%r12); 834 popq %rbx; 835 CFI_POP(%rbx); 836 popq %rbp; 837 CFI_POP(%rbp); 838 839 EXIT_SYSV_FUNC 840 ret; 841 CFI_ENDPROC(); 842ELF(.size _gcry_3des_amd64_cfb_dec,.-_gcry_3des_amd64_cfb_dec;) 843 844.align 16 845.L_s1: 846 .quad 0x0010100001010400, 0x0000000000000000 847 .quad 0x0000100000010000, 0x0010100001010404 848 .quad 0x0010100001010004, 0x0000100000010404 849 .quad 0x0000000000000004, 0x0000100000010000 850 .quad 0x0000000000000400, 0x0010100001010400 851 .quad 0x0010100001010404, 0x0000000000000400 852 .quad 0x0010000001000404, 0x0010100001010004 853 .quad 0x0010000001000000, 0x0000000000000004 854 .quad 0x0000000000000404, 0x0010000001000400 855 .quad 0x0010000001000400, 0x0000100000010400 856 .quad 0x0000100000010400, 0x0010100001010000 857 .quad 0x0010100001010000, 0x0010000001000404 858 .quad 0x0000100000010004, 0x0010000001000004 859 .quad 0x0010000001000004, 0x0000100000010004 860 .quad 0x0000000000000000, 0x0000000000000404 861 .quad 0x0000100000010404, 0x0010000001000000 862 .quad 0x0000100000010000, 0x0010100001010404 863 .quad 0x0000000000000004, 0x0010100001010000 864 .quad 0x0010100001010400, 0x0010000001000000 865 .quad 0x0010000001000000, 0x0000000000000400 866 .quad 0x0010100001010004, 0x0000100000010000 867 .quad 0x0000100000010400, 0x0010000001000004 868 .quad 0x0000000000000400, 0x0000000000000004 869 .quad 0x0010000001000404, 0x0000100000010404 870 .quad 0x0010100001010404, 0x0000100000010004 871 .quad 0x0010100001010000, 0x0010000001000404 872 .quad 0x0010000001000004, 0x0000000000000404 873 .quad 0x0000100000010404, 0x0010100001010400 874 .quad 0x0000000000000404, 0x0010000001000400 875 .quad 0x0010000001000400, 0x0000000000000000 876 .quad 0x0000100000010004, 0x0000100000010400 877 .quad 0x0000000000000000, 0x0010100001010004 878.L_s2: 879 .quad 0x0801080200100020, 0x0800080000000000 880 .quad 0x0000080000000000, 0x0001080200100020 881 .quad 0x0001000000100000, 0x0000000200000020 882 .quad 0x0801000200100020, 0x0800080200000020 883 .quad 0x0800000200000020, 0x0801080200100020 884 .quad 0x0801080000100000, 0x0800000000000000 885 .quad 0x0800080000000000, 0x0001000000100000 886 .quad 0x0000000200000020, 0x0801000200100020 887 .quad 0x0001080000100000, 0x0001000200100020 888 .quad 0x0800080200000020, 0x0000000000000000 889 .quad 0x0800000000000000, 0x0000080000000000 890 .quad 0x0001080200100020, 0x0801000000100000 891 .quad 0x0001000200100020, 0x0800000200000020 892 .quad 0x0000000000000000, 0x0001080000100000 893 .quad 0x0000080200000020, 0x0801080000100000 894 .quad 0x0801000000100000, 0x0000080200000020 895 .quad 0x0000000000000000, 0x0001080200100020 896 .quad 0x0801000200100020, 0x0001000000100000 897 .quad 0x0800080200000020, 0x0801000000100000 898 .quad 0x0801080000100000, 0x0000080000000000 899 .quad 0x0801000000100000, 0x0800080000000000 900 .quad 0x0000000200000020, 0x0801080200100020 901 .quad 0x0001080200100020, 0x0000000200000020 902 .quad 0x0000080000000000, 0x0800000000000000 903 .quad 0x0000080200000020, 0x0801080000100000 904 .quad 0x0001000000100000, 0x0800000200000020 905 .quad 0x0001000200100020, 0x0800080200000020 906 .quad 0x0800000200000020, 0x0001000200100020 907 .quad 0x0001080000100000, 0x0000000000000000 908 .quad 0x0800080000000000, 0x0000080200000020 909 .quad 0x0800000000000000, 0x0801000200100020 910 .quad 0x0801080200100020, 0x0001080000100000 911.L_s3: 912 .quad 0x0000002000000208, 0x0000202008020200 913 .quad 0x0000000000000000, 0x0000200008020008 914 .quad 0x0000002008000200, 0x0000000000000000 915 .quad 0x0000202000020208, 0x0000002008000200 916 .quad 0x0000200000020008, 0x0000000008000008 917 .quad 0x0000000008000008, 0x0000200000020000 918 .quad 0x0000202008020208, 0x0000200000020008 919 .quad 0x0000200008020000, 0x0000002000000208 920 .quad 0x0000000008000000, 0x0000000000000008 921 .quad 0x0000202008020200, 0x0000002000000200 922 .quad 0x0000202000020200, 0x0000200008020000 923 .quad 0x0000200008020008, 0x0000202000020208 924 .quad 0x0000002008000208, 0x0000202000020200 925 .quad 0x0000200000020000, 0x0000002008000208 926 .quad 0x0000000000000008, 0x0000202008020208 927 .quad 0x0000002000000200, 0x0000000008000000 928 .quad 0x0000202008020200, 0x0000000008000000 929 .quad 0x0000200000020008, 0x0000002000000208 930 .quad 0x0000200000020000, 0x0000202008020200 931 .quad 0x0000002008000200, 0x0000000000000000 932 .quad 0x0000002000000200, 0x0000200000020008 933 .quad 0x0000202008020208, 0x0000002008000200 934 .quad 0x0000000008000008, 0x0000002000000200 935 .quad 0x0000000000000000, 0x0000200008020008 936 .quad 0x0000002008000208, 0x0000200000020000 937 .quad 0x0000000008000000, 0x0000202008020208 938 .quad 0x0000000000000008, 0x0000202000020208 939 .quad 0x0000202000020200, 0x0000000008000008 940 .quad 0x0000200008020000, 0x0000002008000208 941 .quad 0x0000002000000208, 0x0000200008020000 942 .quad 0x0000202000020208, 0x0000000000000008 943 .quad 0x0000200008020008, 0x0000202000020200 944.L_s4: 945 .quad 0x1008020000002001, 0x1000020800002001 946 .quad 0x1000020800002001, 0x0000000800000000 947 .quad 0x0008020800002000, 0x1008000800000001 948 .quad 0x1008000000000001, 0x1000020000002001 949 .quad 0x0000000000000000, 0x0008020000002000 950 .quad 0x0008020000002000, 0x1008020800002001 951 .quad 0x1000000800000001, 0x0000000000000000 952 .quad 0x0008000800000000, 0x1008000000000001 953 .quad 0x1000000000000001, 0x0000020000002000 954 .quad 0x0008000000000000, 0x1008020000002001 955 .quad 0x0000000800000000, 0x0008000000000000 956 .quad 0x1000020000002001, 0x0000020800002000 957 .quad 0x1008000800000001, 0x1000000000000001 958 .quad 0x0000020800002000, 0x0008000800000000 959 .quad 0x0000020000002000, 0x0008020800002000 960 .quad 0x1008020800002001, 0x1000000800000001 961 .quad 0x0008000800000000, 0x1008000000000001 962 .quad 0x0008020000002000, 0x1008020800002001 963 .quad 0x1000000800000001, 0x0000000000000000 964 .quad 0x0000000000000000, 0x0008020000002000 965 .quad 0x0000020800002000, 0x0008000800000000 966 .quad 0x1008000800000001, 0x1000000000000001 967 .quad 0x1008020000002001, 0x1000020800002001 968 .quad 0x1000020800002001, 0x0000000800000000 969 .quad 0x1008020800002001, 0x1000000800000001 970 .quad 0x1000000000000001, 0x0000020000002000 971 .quad 0x1008000000000001, 0x1000020000002001 972 .quad 0x0008020800002000, 0x1008000800000001 973 .quad 0x1000020000002001, 0x0000020800002000 974 .quad 0x0008000000000000, 0x1008020000002001 975 .quad 0x0000000800000000, 0x0008000000000000 976 .quad 0x0000020000002000, 0x0008020800002000 977.L_s5: 978 .quad 0x0000001000000100, 0x0020001002080100 979 .quad 0x0020000002080000, 0x0420001002000100 980 .quad 0x0000000000080000, 0x0000001000000100 981 .quad 0x0400000000000000, 0x0020000002080000 982 .quad 0x0400001000080100, 0x0000000000080000 983 .quad 0x0020001002000100, 0x0400001000080100 984 .quad 0x0420001002000100, 0x0420000002080000 985 .quad 0x0000001000080100, 0x0400000000000000 986 .quad 0x0020000002000000, 0x0400000000080000 987 .quad 0x0400000000080000, 0x0000000000000000 988 .quad 0x0400001000000100, 0x0420001002080100 989 .quad 0x0420001002080100, 0x0020001002000100 990 .quad 0x0420000002080000, 0x0400001000000100 991 .quad 0x0000000000000000, 0x0420000002000000 992 .quad 0x0020001002080100, 0x0020000002000000 993 .quad 0x0420000002000000, 0x0000001000080100 994 .quad 0x0000000000080000, 0x0420001002000100 995 .quad 0x0000001000000100, 0x0020000002000000 996 .quad 0x0400000000000000, 0x0020000002080000 997 .quad 0x0420001002000100, 0x0400001000080100 998 .quad 0x0020001002000100, 0x0400000000000000 999 .quad 0x0420000002080000, 0x0020001002080100 1000 .quad 0x0400001000080100, 0x0000001000000100 1001 .quad 0x0020000002000000, 0x0420000002080000 1002 .quad 0x0420001002080100, 0x0000001000080100 1003 .quad 0x0420000002000000, 0x0420001002080100 1004 .quad 0x0020000002080000, 0x0000000000000000 1005 .quad 0x0400000000080000, 0x0420000002000000 1006 .quad 0x0000001000080100, 0x0020001002000100 1007 .quad 0x0400001000000100, 0x0000000000080000 1008 .quad 0x0000000000000000, 0x0400000000080000 1009 .quad 0x0020001002080100, 0x0400001000000100 1010.L_s6: 1011 .quad 0x0200000120000010, 0x0204000020000000 1012 .quad 0x0000040000000000, 0x0204040120000010 1013 .quad 0x0204000020000000, 0x0000000100000010 1014 .quad 0x0204040120000010, 0x0004000000000000 1015 .quad 0x0200040020000000, 0x0004040100000010 1016 .quad 0x0004000000000000, 0x0200000120000010 1017 .quad 0x0004000100000010, 0x0200040020000000 1018 .quad 0x0200000020000000, 0x0000040100000010 1019 .quad 0x0000000000000000, 0x0004000100000010 1020 .quad 0x0200040120000010, 0x0000040000000000 1021 .quad 0x0004040000000000, 0x0200040120000010 1022 .quad 0x0000000100000010, 0x0204000120000010 1023 .quad 0x0204000120000010, 0x0000000000000000 1024 .quad 0x0004040100000010, 0x0204040020000000 1025 .quad 0x0000040100000010, 0x0004040000000000 1026 .quad 0x0204040020000000, 0x0200000020000000 1027 .quad 0x0200040020000000, 0x0000000100000010 1028 .quad 0x0204000120000010, 0x0004040000000000 1029 .quad 0x0204040120000010, 0x0004000000000000 1030 .quad 0x0000040100000010, 0x0200000120000010 1031 .quad 0x0004000000000000, 0x0200040020000000 1032 .quad 0x0200000020000000, 0x0000040100000010 1033 .quad 0x0200000120000010, 0x0204040120000010 1034 .quad 0x0004040000000000, 0x0204000020000000 1035 .quad 0x0004040100000010, 0x0204040020000000 1036 .quad 0x0000000000000000, 0x0204000120000010 1037 .quad 0x0000000100000010, 0x0000040000000000 1038 .quad 0x0204000020000000, 0x0004040100000010 1039 .quad 0x0000040000000000, 0x0004000100000010 1040 .quad 0x0200040120000010, 0x0000000000000000 1041 .quad 0x0204040020000000, 0x0200000020000000 1042 .quad 0x0004000100000010, 0x0200040120000010 1043.L_s7: 1044 .quad 0x0002000000200000, 0x2002000004200002 1045 .quad 0x2000000004000802, 0x0000000000000000 1046 .quad 0x0000000000000800, 0x2000000004000802 1047 .quad 0x2002000000200802, 0x0002000004200800 1048 .quad 0x2002000004200802, 0x0002000000200000 1049 .quad 0x0000000000000000, 0x2000000004000002 1050 .quad 0x2000000000000002, 0x0000000004000000 1051 .quad 0x2002000004200002, 0x2000000000000802 1052 .quad 0x0000000004000800, 0x2002000000200802 1053 .quad 0x2002000000200002, 0x0000000004000800 1054 .quad 0x2000000004000002, 0x0002000004200000 1055 .quad 0x0002000004200800, 0x2002000000200002 1056 .quad 0x0002000004200000, 0x0000000000000800 1057 .quad 0x2000000000000802, 0x2002000004200802 1058 .quad 0x0002000000200800, 0x2000000000000002 1059 .quad 0x0000000004000000, 0x0002000000200800 1060 .quad 0x0000000004000000, 0x0002000000200800 1061 .quad 0x0002000000200000, 0x2000000004000802 1062 .quad 0x2000000004000802, 0x2002000004200002 1063 .quad 0x2002000004200002, 0x2000000000000002 1064 .quad 0x2002000000200002, 0x0000000004000000 1065 .quad 0x0000000004000800, 0x0002000000200000 1066 .quad 0x0002000004200800, 0x2000000000000802 1067 .quad 0x2002000000200802, 0x0002000004200800 1068 .quad 0x2000000000000802, 0x2000000004000002 1069 .quad 0x2002000004200802, 0x0002000004200000 1070 .quad 0x0002000000200800, 0x0000000000000000 1071 .quad 0x2000000000000002, 0x2002000004200802 1072 .quad 0x0000000000000000, 0x2002000000200802 1073 .quad 0x0002000004200000, 0x0000000000000800 1074 .quad 0x2000000004000002, 0x0000000004000800 1075 .quad 0x0000000000000800, 0x2002000000200002 1076.L_s8: 1077 .quad 0x0100010410001000, 0x0000010000001000 1078 .quad 0x0000000000040000, 0x0100010410041000 1079 .quad 0x0100000010000000, 0x0100010410001000 1080 .quad 0x0000000400000000, 0x0100000010000000 1081 .quad 0x0000000400040000, 0x0100000010040000 1082 .quad 0x0100010410041000, 0x0000010000041000 1083 .quad 0x0100010010041000, 0x0000010400041000 1084 .quad 0x0000010000001000, 0x0000000400000000 1085 .quad 0x0100000010040000, 0x0100000410000000 1086 .quad 0x0100010010001000, 0x0000010400001000 1087 .quad 0x0000010000041000, 0x0000000400040000 1088 .quad 0x0100000410040000, 0x0100010010041000 1089 .quad 0x0000010400001000, 0x0000000000000000 1090 .quad 0x0000000000000000, 0x0100000410040000 1091 .quad 0x0100000410000000, 0x0100010010001000 1092 .quad 0x0000010400041000, 0x0000000000040000 1093 .quad 0x0000010400041000, 0x0000000000040000 1094 .quad 0x0100010010041000, 0x0000010000001000 1095 .quad 0x0000000400000000, 0x0100000410040000 1096 .quad 0x0000010000001000, 0x0000010400041000 1097 .quad 0x0100010010001000, 0x0000000400000000 1098 .quad 0x0100000410000000, 0x0100000010040000 1099 .quad 0x0100000410040000, 0x0100000010000000 1100 .quad 0x0000000000040000, 0x0100010410001000 1101 .quad 0x0000000000000000, 0x0100010410041000 1102 .quad 0x0000000400040000, 0x0100000410000000 1103 .quad 0x0100000010040000, 0x0100010010001000 1104 .quad 0x0100010410001000, 0x0000000000000000 1105 .quad 0x0100010410041000, 0x0000010000041000 1106 .quad 0x0000010000041000, 0x0000010400001000 1107 .quad 0x0000010400001000, 0x0000000400040000 1108 .quad 0x0100000010000000, 0x0100010010041000 1109 1110#endif 1111#endif 1112