3 # ====================================================================
4 # Copyright (c) 2008 Andy Polyakov <appro@openssl.org>
6 # This module may be used under the terms of either the GNU General
7 # Public License version 2 or later, the GNU Lesser General Public
8 # License version 2.1 or later, the Mozilla Public License version
9 # 1.1 or the BSD License. The exact terms of either license are
10 # distributed along with this module. For further details see
11 # http://www.openssl.org/~appro/camellia/.
12 # ====================================================================
14 # Performance in cycles per processed byte (less is better) in
15 # 'openssl speed ...' benchmark:
18 # -evp camellia-128-ecb 16.7 21.0 22.7
19 # + over gcc 3.4.6 +25% +5% 0%
21 # camellia-128-cbc 15.7 20.4 21.1
23 # 128-bit key setup 128 216 205 cycles/key
24 # + over gcc 3.4.6 +54% +39% +15%
26 # Numbers in "+" rows represent performance improvement over compiler
27 # generated code. Key setup timings are impressive on AMD and Core2
28 # thanks to 64-bit operations being covertly deployed. Improvement on
29 # EM64T, pre-Core2 Intel x86_64 CPU, is not as impressive, because it
30 # apparently emulates some of 64-bit operations in [32-bit] microcode.
34 if ($flavour =~ /\./) { $output = $flavour; undef $flavour; }
36 $win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/);
38 $0 =~ m/(.*[\/\\])[^\
/\\]+$/; $dir=$1;
39 ( $xlate="${dir}x86_64-xlate.pl" and -f
$xlate ) or
40 ( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f
$xlate) or
41 die "can't locate x86_64-xlate.pl";
43 open OUT
,"| \"$^X\" $xlate $flavour $output";
46 sub hi
() { my $r=shift; $r =~ s/%[er]([a-d])x/%\1h/; $r; }
47 sub lo
() { my $r=shift; $r =~ s/%[er]([a-d])x/%\1l/;
48 $r =~ s/%[er]([sd]i)/%\1l/;
49 $r =~ s/%(r[0-9]+)[d]?/%\1b/; $r; }
51 $t0="%eax";$t1="%ebx";$t2="%ecx";$t3="%edx";
52 @S=("%r8d","%r9d","%r10d","%r11d");
55 $Tbl="%rbp"; # size optimization
60 $arg0d=$win64?
"%ecx":"%edi";
62 # const unsigned int Camellia_SBOX[4][256];
63 # Well, sort of... Camellia_SBOX[0][] is interleaved with [1][],
64 # and [2][] - with [3][]. This is done to minimize code size.
65 $SBOX1_1110=0; # Camellia_SBOX[0]
66 $SBOX4_4404=4; # Camellia_SBOX[1]
67 $SBOX2_0222=2048; # Camellia_SBOX[2]
68 $SBOX3_3033=2052; # Camellia_SBOX[3]
70 sub Camellia_Feistel
{
72 my $seed=defined(@_[1])?
@_[1]:0;
73 my $scale=$seed<0?
-8:8;
75 my $s0=@S[($j)%4],$s1=@S[($j+1)%4],$s2=@S[($j+2)%4],$s3=@S[($j+3)%4];
78 xor $s0,$t0 # t0^=key[0]
79 xor $s1,$t1 # t1^=key[1]
80 movz
`&hi("$t0")`,$i0 # (t0>>8)&0xff
81 movz
`&lo("$t1")`,$i1 # (t1>>0)&0xff
82 mov
$SBOX3_3033($Tbl,$i0,8),$t3 # t3=SBOX3_3033[0]
83 mov
$SBOX1_1110($Tbl,$i1,8),$t2 # t2=SBOX1_1110[1]
84 movz
`&lo("$t0")`,$i0 # (t0>>0)&0xff
86 movz
`&hi("$t1")`,$i1 # (t1>>8)&0xff
87 xor $SBOX4_4404($Tbl,$i0,8),$t3 # t3^=SBOX4_4404[0]
89 xor $SBOX4_4404($Tbl,$i1,8),$t2 # t2^=SBOX4_4404[1]
90 movz
`&hi("$t0")`,$i0 # (t0>>24)&0xff
91 movz
`&lo("$t1")`,$i1 # (t1>>16)&0xff
92 xor $SBOX1_1110($Tbl,$i0,8),$t3 # t3^=SBOX1_1110[0]
93 xor $SBOX3_3033($Tbl,$i1,8),$t2 # t2^=SBOX3_3033[1]
94 movz
`&lo("$t0")`,$i0 # (t0>>16)&0xff
95 movz
`&hi("$t1")`,$i1 # (t1>>24)&0xff
96 xor $SBOX2_0222($Tbl,$i0,8),$t3 # t3^=SBOX2_0222[0]
97 xor $SBOX2_0222($Tbl,$i1,8),$t2 # t2^=SBOX2_0222[1]
98 mov
`$seed+($i+1)*$scale`($key),$t1 # prefetch key[i+1]
99 mov
`$seed+($i+1)*$scale+4`($key),$t0
101 ror \
$8,$t3 # t3=RightRotate(t3,8)
108 # void Camellia_EncryptBlock_Rounds(
110 # const Byte plaintext[],
111 # const KEY_TABLE_TYPE keyTable,
117 .globl Camellia_EncryptBlock
118 .type Camellia_EncryptBlock
,\
@abi-omnipotent
120 Camellia_EncryptBlock
:
124 adcl \
$0,$arg0d # keyBitLength==128?3:4
126 .size Camellia_EncryptBlock
,.-Camellia_EncryptBlock
128 .globl Camellia_EncryptBlock_Rounds
129 .type Camellia_EncryptBlock_Rounds
,\
@function,4
132 Camellia_EncryptBlock_Rounds
:
140 #mov %rsi,$inp # put away arguments
144 shl \
$6,%edi # process grandRounds
145 lea
.LCamellia_SBOX
(%rip),$Tbl
146 lea
($key,%rdi),$keyend
148 mov
0(%rsi),@S[0] # load plaintext
157 call _x86_64_Camellia_encrypt
176 .size Camellia_EncryptBlock_Rounds
,.-Camellia_EncryptBlock_Rounds
178 .type _x86_64_Camellia_encrypt
,\
@abi-omnipotent
180 _x86_64_Camellia_encrypt
:
182 xor 4($key),@S[0] # ^=key[0-3]
187 mov
16($key),$t1 # prefetch key[4-5]
191 for ($i=0;$i<6;$i++) { Camellia_Feistel
($i,16); }
195 mov
8($key),$t3 # prefetch key[2-3]
202 xor $t3,@S[2] # s2^=s3|key[3];
203 xor $t0,@S[1] # s1^=LeftRotate(s0&key[0],1);
207 xor $t1,@S[0] # s0^=s1|key[1];
208 xor $t2,@S[3] # s3^=LeftRotate(s2&key[2],1);
213 xor @S[2],$t0 # SwapHalf
223 .byte
0xf3,0xc3 # rep ret
224 .size _x86_64_Camellia_encrypt
,.-_x86_64_Camellia_encrypt
227 .globl Camellia_DecryptBlock
228 .type Camellia_DecryptBlock
,\
@abi-omnipotent
230 Camellia_DecryptBlock
:
234 adcl \
$0,$arg0d # keyBitLength==128?3:4
236 .size Camellia_DecryptBlock
,.-Camellia_DecryptBlock
238 .globl Camellia_DecryptBlock_Rounds
239 .type Camellia_DecryptBlock_Rounds
,\
@function,4
242 Camellia_DecryptBlock_Rounds
:
250 #mov %rsi,$inp # put away arguments
254 shl \
$6,%edi # process grandRounds
255 lea
.LCamellia_SBOX
(%rip),$Tbl
256 lea
($keyend,%rdi),$key
258 mov
0(%rsi),@S[0] # load plaintext
267 call _x86_64_Camellia_decrypt
286 .size Camellia_DecryptBlock_Rounds
,.-Camellia_DecryptBlock_Rounds
288 .type _x86_64_Camellia_decrypt
,\
@abi-omnipotent
290 _x86_64_Camellia_decrypt
:
292 xor 4($key),@S[0] # ^=key[0-3]
297 mov
-8($key),$t1 # prefetch key[4-5]
301 for ($i=0;$i<6;$i++) { Camellia_Feistel
($i,-8); }
305 mov
0($key),$t3 # prefetch key[2-3]
312 xor $t3,@S[2] # s2^=s3|key[3];
313 xor $t0,@S[1] # s1^=LeftRotate(s0&key[0],1);
317 xor $t1,@S[0] # s0^=s1|key[1];
318 xor $t2,@S[3] # s3^=LeftRotate(s2&key[2],1);
329 mov
$t2,@S[0] # SwapHalf
334 .byte
0xf3,0xc3 # rep ret
335 .size _x86_64_Camellia_decrypt
,.-_x86_64_Camellia_decrypt
339 my ($rnd,$key,@T)=@_;
340 my $bias=int(@T[0])?
shift(@T):0;
344 mov
@T[1],`$bias+$rnd*8+0`($key)
345 mov
@T[0],`$bias+$rnd*8+4`($key)
346 mov
@T[3],`$bias+$rnd*8+8`($key)
347 mov
@T[2],`$bias+$rnd*8+12`($key)
350 $code.=" mov @T[0],`$bias+$rnd*8+0`($key)\n";
351 $code.=" mov @T[1],`$bias+$rnd*8+8`($key)\n" if ($#T>=1);
356 my ($rnd,$key,@T)=@_;
357 my $bias=int(@T[0])?
shift(@T):0;
359 $code.=" mov `$bias+$rnd*8+0`($key),@T[0]\n";
360 $code.=" mov `$bias+$rnd*8+8`($key),@T[1]\n" if ($#T>=1);
363 # shld is very slow on Intel EM64T family. Even on AMD it limits
364 # instruction decode rate [because it's VectorPath] and consequently
367 my ($i0,$i1,$rot)=@_;
378 # ... Implementing 128-bit rotate without shld gives 80% better
379 # performance EM64T, +15% on AMD64 and only ~7% degradation on
380 # Core2. This is therefore preferred.
382 my ($i0,$i1,$rot)=@_;
401 .globl Camellia_Ekeygen
402 .type Camellia_Ekeygen
,\
@function,3
412 mov
%rdi,$keyend # put away arguments, keyBitLength
413 mov
%rdx,$out # keyTable
415 mov
0(%rsi),@S[0] # load 0-127 bits
425 &_saveround
(0,$out,@S); # KL<<<0
427 cmp \
$128,$keyend # check keyBitLength
430 mov
16(%rsi),@S[0] # load 128-191 bits
434 mov
24(%rsi),@S[2] # load 192-255 bits
448 &_saveround
(4,$out,@S); # temp storage for KR!
450 xor 0($out),@S[1] # KR^KL
456 lea
.LCamellia_SIGMA
(%rip),$key
457 lea
.LCamellia_SBOX
(%rip),$Tbl
462 &Camellia_Feistel
($step++);
463 &Camellia_Feistel
($step++);
465 xor 0($out),@S[1] # ^KL
470 &Camellia_Feistel
($step++);
471 &Camellia_Feistel
($step++);
476 lea
128($out),$out # size optimization
477 shl \
$32,%r8 # @S[0]||
478 shl \
$32,%r10 # @S[2]||
480 or %r11,%r10 # ||@S[3]
482 &_loadround
(0,$out,-128,"%rax","%rbx"); # KL
483 &_saveround
(2,$out,-128,"%r8","%r10"); # KA<<<0
484 &_rotl128
("%rax","%rbx",15);
485 &_saveround
(4,$out,-128,"%rax","%rbx"); # KL<<<15
486 &_rotl128
("%r8","%r10",15);
487 &_saveround
(6,$out,-128,"%r8","%r10"); # KA<<<15
488 &_rotl128
("%r8","%r10",15); # 15+15=30
489 &_saveround
(8,$out,-128,"%r8","%r10"); # KA<<<30
490 &_rotl128
("%rax","%rbx",30); # 15+30=45
491 &_saveround
(10,$out,-128,"%rax","%rbx"); # KL<<<45
492 &_rotl128
("%r8","%r10",15); # 30+15=45
493 &_saveround
(12,$out,-128,"%r8"); # KA<<<45
494 &_rotl128
("%rax","%rbx",15); # 45+15=60
495 &_saveround
(13,$out,-128,"%rbx"); # KL<<<60
496 &_rotl128
("%r8","%r10",15); # 45+15=60
497 &_saveround
(14,$out,-128,"%r8","%r10"); # KA<<<60
498 &_rotl128
("%rax","%rbx",17); # 60+17=77
499 &_saveround
(16,$out,-128,"%rax","%rbx"); # KL<<<77
500 &_rotl128
("%rax","%rbx",17); # 77+17=94
501 &_saveround
(18,$out,-128,"%rax","%rbx"); # KL<<<94
502 &_rotl128
("%r8","%r10",34); # 60+34=94
503 &_saveround
(20,$out,-128,"%r8","%r10"); # KA<<<94
504 &_rotl128
("%rax","%rbx",17); # 94+17=111
505 &_saveround
(22,$out,-128,"%rax","%rbx"); # KL<<<111
506 &_rotl128
("%r8","%r10",17); # 94+17=111
507 &_saveround
(24,$out,-128,"%r8","%r10"); # KA<<<111
514 &_saveround
(6,$out,@S); # temp storage for KA!
516 xor `4*8+0`($out),@S[1] # KA^KR
517 xor `4*8+4`($out),@S[0]
518 xor `5*8+0`($out),@S[3]
519 xor `5*8+4`($out),@S[2]
521 &Camellia_Feistel
($step++);
522 &Camellia_Feistel
($step++);
524 &_loadround
(0,$out,"%rax","%rbx"); # KL
525 &_loadround
(4,$out,"%rcx","%rdx"); # KR
526 &_loadround
(6,$out,"%r14","%r15"); # KA
528 lea
128($out),$out # size optimization
529 shl \
$32,%r8 # @S[0]||
530 shl \
$32,%r10 # @S[2]||
532 or %r11,%r10 # ||@S[3]
534 &_saveround
(2,$out,-128,"%r8","%r10"); # KB<<<0
535 &_rotl128
("%rcx","%rdx",15);
536 &_saveround
(4,$out,-128,"%rcx","%rdx"); # KR<<<15
537 &_rotl128
("%r14","%r15",15);
538 &_saveround
(6,$out,-128,"%r14","%r15"); # KA<<<15
539 &_rotl128
("%rcx","%rdx",15); # 15+15=30
540 &_saveround
(8,$out,-128,"%rcx","%rdx"); # KR<<<30
541 &_rotl128
("%r8","%r10",30);
542 &_saveround
(10,$out,-128,"%r8","%r10"); # KB<<<30
543 &_rotl128
("%rax","%rbx",45);
544 &_saveround
(12,$out,-128,"%rax","%rbx"); # KL<<<45
545 &_rotl128
("%r14","%r15",30); # 15+30=45
546 &_saveround
(14,$out,-128,"%r14","%r15"); # KA<<<45
547 &_rotl128
("%rax","%rbx",15); # 45+15=60
548 &_saveround
(16,$out,-128,"%rax","%rbx"); # KL<<<60
549 &_rotl128
("%rcx","%rdx",30); # 30+30=60
550 &_saveround
(18,$out,-128,"%rcx","%rdx"); # KR<<<60
551 &_rotl128
("%r8","%r10",30); # 30+30=60
552 &_saveround
(20,$out,-128,"%r8","%r10"); # KB<<<60
553 &_rotl128
("%rax","%rbx",17); # 60+17=77
554 &_saveround
(22,$out,-128,"%rax","%rbx"); # KL<<<77
555 &_rotl128
("%r14","%r15",32); # 45+32=77
556 &_saveround
(24,$out,-128,"%r14","%r15"); # KA<<<77
557 &_rotl128
("%rcx","%rdx",34); # 60+34=94
558 &_saveround
(26,$out,-128,"%rcx","%rdx"); # KR<<<94
559 &_rotl128
("%r14","%r15",17); # 77+17=94
560 &_saveround
(28,$out,-128,"%r14","%r15"); # KA<<<77
561 &_rotl128
("%rax","%rbx",34); # 77+34=111
562 &_saveround
(30,$out,-128,"%rax","%rbx"); # KL<<<111
563 &_rotl128
("%r8","%r10",51); # 60+51=111
564 &_saveround
(32,$out,-128,"%r8","%r10"); # KB<<<111
576 .size Camellia_Ekeygen
,.-Camellia_Ekeygen
581 112,130, 44,236,179, 39,192,229,228,133, 87, 53,234, 12,174, 65,
582 35,239,107,147, 69, 25,165, 33,237, 14, 79, 78, 29,101,146,189,
583 134,184,175,143,124,235, 31,206, 62, 48,220, 95, 94,197, 11, 26,
584 166,225, 57,202,213, 71, 93, 61,217, 1, 90,214, 81, 86,108, 77,
585 139, 13,154,102,251,204,176, 45,116, 18, 43, 32,240,177,132,153,
586 223, 76,203,194, 52,126,118, 5,109,183,169, 49,209, 23, 4,215,
587 20, 88, 58, 97,222, 27, 17, 28, 50, 15,156, 22, 83, 24,242, 34,
588 254, 68,207,178,195,181,122,145, 36, 8,232,168, 96,252,105, 80,
589 170,208,160,125,161,137, 98,151, 84, 91, 30,149,224,255,100,210,
590 16,196, 0, 72,163,247,117,219,138, 3,230,218, 9, 63,221,148,
591 135, 92,131, 2,205, 74,144, 51,115,103,246,243,157,127,191,226,
592 82,155,216, 38,200, 55,198, 59,129,150,111, 75, 19,190, 99, 46,
593 233,121,167,140,159,110,188,142, 41,245,249,182, 47,253,180, 89,
594 120,152, 6,106,231, 70,113,186,212, 37,171, 66,136,162,141,250,
595 114, 7,185, 85,248,238,172, 10, 54, 73, 42,104, 60, 56,241,164,
596 64, 40,211,123,187,201, 67,193, 21,227,173,244,119,199,128,158);
598 sub S1110
{ my $i=shift; $i=@SBOX[$i]; $i=$i<<24|$i<<16|$i<<8; sprintf("0x%08x",$i); }
599 sub S4404
{ my $i=shift; $i=($i<<1|$i>>7)&0xff; $i=@SBOX[$i]; $i=$i<<24|$i<<16|$i; sprintf("0x%08x",$i); }
600 sub S0222
{ my $i=shift; $i=@SBOX[$i]; $i=($i<<1|$i>>7)&0xff; $i=$i<<16|$i<<8|$i; sprintf("0x%08x",$i); }
601 sub S3033
{ my $i=shift; $i=@SBOX[$i]; $i=($i>>1|$i<<7)&0xff; $i=$i<<24|$i<<8|$i; sprintf("0x%08x",$i); }
606 .long
0x3bcc908b, 0xa09e667f, 0x4caa73b2, 0xb67ae858
607 .long
0xe94f82be, 0xc6ef372f, 0xf1d36f1c, 0x54ff53a5
608 .long
0xde682d1d, 0x10e527fa, 0xb3e6c1fd, 0xb05688c2
612 # tables are interleaved, remember?
613 sub data_word
{ $code.=".long\t".join(',',@_)."\n"; }
614 for ($i=0;$i<256;$i++) { &data_word
(&S1110
($i),&S4404
($i)); }
615 for ($i=0;$i<256;$i++) { &data_word
(&S0222
($i),&S3033
($i)); }
617 # void Camellia_cbc_encrypt (const void char *inp, unsigned char *out,
618 # size_t length, const CAMELLIA_KEY *key,
619 # unsigned char *ivp,const int enc);
622 $_end="8(%rsp)"; # inp+len&~15
623 $_res="16(%rsp)"; # len&15
629 .globl Camellia_cbc_encrypt
630 .type Camellia_cbc_encrypt
,\
@function,6
632 Camellia_cbc_encrypt
:
647 # place stack frame just "above mod 1024" the key schedule,
648 # this ensures that cache associativity suffices
649 lea
-64-63(%rcx),%r10
654 #add \$8,%rsp # 8 is reserved for callee's ra
656 mov
%rdi,$inp # inp argument
657 mov
%rsi,$out # out argument
658 mov
%r8,%rbx # ivp argument
659 mov
%rcx,$key # key argument
660 mov
272(%rcx),${keyend
}d
# grandRounds
666 lea
.LCamellia_SBOX
(%rip),$Tbl
676 loop .Lcbc_prefetch_sbox
679 mov
%rdx,%rcx # len argument
680 lea
($key,$keyend),$keyend
682 cmp \
$0,%r9d # enc argument
686 and \
$15,%rcx # length residue
693 mov
0(%rbx),@S[0] # load IV
711 call _x86_64_Camellia_encrypt
713 mov
$_key,$key # "rewind" the key
733 mov
@S[0],0($out) # write out IV residue
751 .long
0x9066A4F3 # rep movsb
758 jmp
.Lcbc_eloop
# one more time
764 and \
$15,%rcx # length residue
771 mov
(%rbx),%rax # load IV
782 mov
%rax,0+$ivec # save IV to temporary storage
787 call _x86_64_Camellia_decrypt
789 mov
$_key,$key # "rewind" the key
794 mov
($inp),%rax # load IV for next iteration
826 mov
%rax,(%rdx) # write out IV residue
841 .long
0x9066A4F3 # rep movsb
845 mov
%rax,(%rdx) # write out IV residue
861 .size Camellia_cbc_encrypt
,.-Camellia_cbc_encrypt
863 .asciz
"Camellia for x86_64 by <appro\@openssl.org>"
867 # EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame,
868 # CONTEXT *context,DISPATCHER_CONTEXT *disp)
876 .extern __imp_RtlVirtualUnwind
877 .type common_se_handler
,\
@abi-omnipotent
891 mov
120($context),%rax # pull context->Rax
892 mov
248($context),%rbx # pull context->Rip
894 mov
8($disp),%rsi # disp->ImageBase
895 mov
56($disp),%r11 # disp->HandlerData
897 mov
0(%r11),%r10d # HandlerData[0]
898 lea
(%rsi,%r10),%r10 # prologue label
899 cmp %r10,%rbx # context->Rip<prologue label
902 mov
152($context),%rax # pull context->Rsp
904 mov
4(%r11),%r10d # HandlerData[1]
905 lea
(%rsi,%r10),%r10 # epilogue label
906 cmp %r10,%rbx # context->Rip>=epilogue label
915 mov
%rbx,144($context) # restore context->Rbx
916 mov
%rbp,160($context) # restore context->Rbp
917 mov
%r13,224($context) # restore context->R13
918 mov
%r14,232($context) # restore context->R14
919 mov
%r15,240($context) # restore context->R15
924 mov
%rax,152($context) # restore context->Rsp
925 mov
%rsi,168($context) # restore context->Rsi
926 mov
%rdi,176($context) # restore context->Rdi
928 jmp
.Lcommon_seh_exit
929 .size common_se_handler
,.-common_se_handler
931 .type cbc_se_handler
,\
@abi-omnipotent
945 mov
120($context),%rax # pull context->Rax
946 mov
248($context),%rbx # pull context->Rip
948 lea
.Lcbc_prologue
(%rip),%r10
949 cmp %r10,%rbx # context->Rip<.Lcbc_prologue
952 lea
.Lcbc_body
(%rip),%r10
953 cmp %r10,%rbx # context->Rip<.Lcbc_body
954 jb
.Lin_cbc_frame_setup
956 mov
152($context),%rax # pull context->Rsp
958 lea
.Lcbc_abort
(%rip),%r10
959 cmp %r10,%rbx # context->Rip>=.Lcbc_abort
960 jae
.Lin_cbc_prologue
962 # handle pushf/popf in Camellia_cbc_encrypt
963 lea
.Lcbc_enc_pushf
(%rip),%r10
964 cmp %r10,%rbx # context->Rip<=.Lcbc_enc_pushf
967 lea
.Lcbc_enc_popf
(%rip),%r10
968 cmp %r10,%rbx # context->Rip<.Lcbc_enc_popf
971 lea
.Lcbc_dec_pushf
(%rip),%r10
972 cmp %r10,%rbx # context->Rip<=.Lcbc_dec_pushf
975 lea
.Lcbc_dec_popf
(%rip),%r10
976 cmp %r10,%rbx # context->Rip<.Lcbc_dec_popf
981 mov
48(%rax),%rax # $_rsp
984 .Lin_cbc_frame_setup
:
991 mov
%rbx,144($context) # restore context->Rbx
992 mov
%rbp,160($context) # restore context->Rbp
993 mov
%r12,216($context) # restore context->R12
994 mov
%r13,224($context) # restore context->R13
995 mov
%r14,232($context) # restore context->R14
996 mov
%r15,240($context) # restore context->R15
1001 mov
%rax,152($context) # restore context->Rsp
1002 mov
%rsi,168($context) # restore context->Rsi
1003 mov
%rdi,176($context) # restore context->Rdi
1008 mov
40($disp),%rdi # disp->ContextRecord
1009 mov
$context,%rsi # context
1010 mov \
$`1232/8`,%ecx # sizeof(CONTEXT)
1011 .long
0xa548f3fc # cld; rep movsq
1014 xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER
1015 mov
8(%rsi),%rdx # arg2, disp->ImageBase
1016 mov
0(%rsi),%r8 # arg3, disp->ControlPc
1017 mov
16(%rsi),%r9 # arg4, disp->FunctionEntry
1018 mov
40(%rsi),%r10 # disp->ContextRecord
1019 lea
56(%rsi),%r11 # &disp->HandlerData
1020 lea
24(%rsi),%r12 # &disp->EstablisherFrame
1021 mov
%r10,32(%rsp) # arg5
1022 mov
%r11,40(%rsp) # arg6
1023 mov
%r12,48(%rsp) # arg7
1024 mov
%rcx,56(%rsp) # arg8, (NULL)
1025 call
*__imp_RtlVirtualUnwind
(%rip)
1027 mov \
$1,%eax # ExceptionContinueSearch
1039 .size cbc_se_handler
,.-cbc_se_handler
1043 .rva
.LSEH_begin_Camellia_EncryptBlock_Rounds
1044 .rva
.LSEH_end_Camellia_EncryptBlock_Rounds
1045 .rva
.LSEH_info_Camellia_EncryptBlock_Rounds
1047 .rva
.LSEH_begin_Camellia_DecryptBlock_Rounds
1048 .rva
.LSEH_end_Camellia_DecryptBlock_Rounds
1049 .rva
.LSEH_info_Camellia_DecryptBlock_Rounds
1051 .rva
.LSEH_begin_Camellia_Ekeygen
1052 .rva
.LSEH_end_Camellia_Ekeygen
1053 .rva
.LSEH_info_Camellia_Ekeygen
1055 .rva
.LSEH_begin_Camellia_cbc_encrypt
1056 .rva
.LSEH_end_Camellia_cbc_encrypt
1057 .rva
.LSEH_info_Camellia_cbc_encrypt
1061 .LSEH_info_Camellia_EncryptBlock_Rounds
:
1063 .rva common_se_handler
1064 .rva
.Lenc_prologue
,.Lenc_epilogue
# HandlerData[]
1065 .LSEH_info_Camellia_DecryptBlock_Rounds
:
1067 .rva common_se_handler
1068 .rva
.Ldec_prologue
,.Ldec_epilogue
# HandlerData[]
1069 .LSEH_info_Camellia_Ekeygen
:
1071 .rva common_se_handler
1072 .rva
.Lkey_prologue
,.Lkey_epilogue
# HandlerData[]
1073 .LSEH_info_Camellia_cbc_encrypt
:
1079 $code =~ s/\`([^\`]*)\`/eval $1/gem;