155714Skris#!/usr/local/bin/perl 255714Skris# 355714Skris# The inner loop instruction sequence and the IP/FP modifications are from 455714Skris# Svend Olaf Mikkelsen <svolaf@inet.uni-c.dk> 555714Skris# 655714Skris 7238405Sjkim$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; 8238405Sjkimpush(@INC,"${dir}","${dir}../../perlasm"); 955714Skrisrequire "x86asm.pl"; 1055714Skrisrequire "cbc.pl"; 1155714Skrisrequire "desboth.pl"; 1255714Skris 1355714Skris# base code is in microsft 1455714Skris# op dest, source 1555714Skris# format. 1655714Skris# 1755714Skris 1855714Skris&asm_init($ARGV[0],"des-586.pl"); 1955714Skris 2055714Skris$L="edi"; 2155714Skris$R="esi"; 22238405Sjkim$trans="ebp"; 23238405Sjkim$small_footprint=1 if (grep(/\-DOPENSSL_SMALL_FOOTPRINT/,@ARGV)); 24238405Sjkim# one can discuss setting this variable to 1 unconditionally, as 25238405Sjkim# the folded loop is only 3% slower than unrolled, but >7 times smaller 2655714Skris 27238405Sjkim&public_label("DES_SPtrans"); 28238405Sjkim 29238405Sjkim&DES_encrypt_internal(); 30238405Sjkim&DES_decrypt_internal(); 31109998Smarkm&DES_encrypt("DES_encrypt1",1); 32109998Smarkm&DES_encrypt("DES_encrypt2",0); 33109998Smarkm&DES_encrypt3("DES_encrypt3",1); 34109998Smarkm&DES_encrypt3("DES_decrypt3",0); 35109998Smarkm&cbc("DES_ncbc_encrypt","DES_encrypt1","DES_encrypt1",0,4,5,3,5,-1); 36109998Smarkm&cbc("DES_ede3_cbc_encrypt","DES_encrypt3","DES_decrypt3",0,6,7,3,4,5); 37238405Sjkim&DES_SPtrans(); 3855714Skris 3955714Skris&asm_finish(); 4055714Skris 41238405Sjkimsub DES_encrypt_internal() 42238405Sjkim { 43238405Sjkim &function_begin_B("_x86_DES_encrypt"); 44238405Sjkim 45238405Sjkim if ($small_footprint) 46238405Sjkim { 47238405Sjkim &lea("edx",&DWP(128,"ecx")); 48238405Sjkim &push("edx"); 49238405Sjkim &push("ecx"); 50238405Sjkim &set_label("eloop"); 51238405Sjkim &D_ENCRYPT(0,$L,$R,0,$trans,"eax","ebx","ecx","edx",&swtmp(0)); 52238405Sjkim &comment(""); 53238405Sjkim &D_ENCRYPT(1,$R,$L,2,$trans,"eax","ebx","ecx","edx",&swtmp(0)); 54238405Sjkim &comment(""); 55238405Sjkim &add("ecx",16); 56238405Sjkim &cmp("ecx",&swtmp(1)); 57238405Sjkim &mov(&swtmp(0),"ecx"); 58238405Sjkim &jb(&label("eloop")); 59238405Sjkim &add("esp",8); 60238405Sjkim } 61238405Sjkim else 62238405Sjkim { 63238405Sjkim &push("ecx"); 64238405Sjkim for ($i=0; $i<16; $i+=2) 65238405Sjkim { 66238405Sjkim &comment("Round $i"); 67238405Sjkim &D_ENCRYPT($i,$L,$R,$i*2,$trans,"eax","ebx","ecx","edx",&swtmp(0)); 68238405Sjkim &comment("Round ".sprintf("%d",$i+1)); 69238405Sjkim &D_ENCRYPT($i+1,$R,$L,($i+1)*2,$trans,"eax","ebx","ecx","edx",&swtmp(0)); 70238405Sjkim } 71238405Sjkim &add("esp",4); 72238405Sjkim } 73238405Sjkim &ret(); 74238405Sjkim 75238405Sjkim &function_end_B("_x86_DES_encrypt"); 76238405Sjkim } 77238405Sjkim 78238405Sjkimsub DES_decrypt_internal() 79238405Sjkim { 80238405Sjkim &function_begin_B("_x86_DES_decrypt"); 81238405Sjkim 82238405Sjkim if ($small_footprint) 83238405Sjkim { 84238405Sjkim &push("ecx"); 85238405Sjkim &lea("ecx",&DWP(128,"ecx")); 86238405Sjkim &push("ecx"); 87238405Sjkim &set_label("dloop"); 88238405Sjkim &D_ENCRYPT(0,$L,$R,-2,$trans,"eax","ebx","ecx","edx",&swtmp(0)); 89238405Sjkim &comment(""); 90238405Sjkim &D_ENCRYPT(1,$R,$L,-4,$trans,"eax","ebx","ecx","edx",&swtmp(0)); 91238405Sjkim &comment(""); 92238405Sjkim &sub("ecx",16); 93238405Sjkim &cmp("ecx",&swtmp(1)); 94238405Sjkim &mov(&swtmp(0),"ecx"); 95238405Sjkim &ja(&label("dloop")); 96238405Sjkim &add("esp",8); 97238405Sjkim } 98238405Sjkim else 99238405Sjkim { 100238405Sjkim &push("ecx"); 101238405Sjkim for ($i=15; $i>0; $i-=2) 102238405Sjkim { 103238405Sjkim &comment("Round $i"); 104238405Sjkim &D_ENCRYPT(15-$i,$L,$R,$i*2,$trans,"eax","ebx","ecx","edx",&swtmp(0)); 105238405Sjkim &comment("Round ".sprintf("%d",$i-1)); 106238405Sjkim &D_ENCRYPT(15-$i+1,$R,$L,($i-1)*2,$trans,"eax","ebx","ecx","edx",&swtmp(0)); 107238405Sjkim } 108238405Sjkim &add("esp",4); 109238405Sjkim } 110238405Sjkim &ret(); 111238405Sjkim 112238405Sjkim &function_end_B("_x86_DES_decrypt"); 113238405Sjkim } 114238405Sjkim 115109998Smarkmsub DES_encrypt 11655714Skris { 11755714Skris local($name,$do_ip)=@_; 11855714Skris 119238405Sjkim &function_begin_B($name); 12055714Skris 12155714Skris &push("esi"); 12255714Skris &push("edi"); 12355714Skris 12455714Skris &comment(""); 12555714Skris &comment("Load the 2 words"); 12655714Skris 12755714Skris if ($do_ip) 12855714Skris { 12955714Skris &mov($R,&wparam(0)); 13055714Skris &xor( "ecx", "ecx" ); 13155714Skris 13255714Skris &push("ebx"); 13355714Skris &push("ebp"); 13455714Skris 13555714Skris &mov("eax",&DWP(0,$R,"",0)); 13655714Skris &mov("ebx",&wparam(2)); # get encrypt flag 13755714Skris &mov($L,&DWP(4,$R,"",0)); 13855714Skris &comment(""); 13955714Skris &comment("IP"); 14055714Skris &IP_new("eax",$L,$R,3); 14155714Skris } 14255714Skris else 14355714Skris { 14455714Skris &mov("eax",&wparam(0)); 14555714Skris &xor( "ecx", "ecx" ); 14655714Skris 14755714Skris &push("ebx"); 14855714Skris &push("ebp"); 14955714Skris 15055714Skris &mov($R,&DWP(0,"eax","",0)); 15155714Skris &mov("ebx",&wparam(2)); # get encrypt flag 15255714Skris &rotl($R,3); 15355714Skris &mov($L,&DWP(4,"eax","",0)); 15455714Skris &rotl($L,3); 15555714Skris } 15655714Skris 157109998Smarkm # PIC-ification:-) 158238405Sjkim &call (&label("pic_point")); 159238405Sjkim &set_label("pic_point"); 160238405Sjkim &blindpop($trans); 161238405Sjkim &lea ($trans,&DWP(&label("DES_SPtrans")."-".&label("pic_point"),$trans)); 162109998Smarkm 163109998Smarkm &mov( "ecx", &wparam(1) ); 164238405Sjkim 16555714Skris &cmp("ebx","0"); 166238405Sjkim &je(&label("decrypt")); 167238405Sjkim &call("_x86_DES_encrypt"); 168238405Sjkim &jmp(&label("done")); 169238405Sjkim &set_label("decrypt"); 170238405Sjkim &call("_x86_DES_decrypt"); 171238405Sjkim &set_label("done"); 17255714Skris 17355714Skris if ($do_ip) 17455714Skris { 17555714Skris &comment(""); 17655714Skris &comment("FP"); 17755714Skris &mov("edx",&wparam(0)); 17855714Skris &FP_new($L,$R,"eax",3); 17955714Skris 18055714Skris &mov(&DWP(0,"edx","",0),"eax"); 18155714Skris &mov(&DWP(4,"edx","",0),$R); 18255714Skris } 18355714Skris else 18455714Skris { 18555714Skris &comment(""); 18655714Skris &comment("Fixup"); 18755714Skris &rotr($L,3); # r 18855714Skris &mov("eax",&wparam(0)); 18955714Skris &rotr($R,3); # l 19055714Skris &mov(&DWP(0,"eax","",0),$L); 19155714Skris &mov(&DWP(4,"eax","",0),$R); 19255714Skris } 19355714Skris 19455714Skris &pop("ebp"); 19555714Skris &pop("ebx"); 19655714Skris &pop("edi"); 19755714Skris &pop("esi"); 19855714Skris &ret(); 19955714Skris 20055714Skris &function_end_B($name); 20155714Skris } 20255714Skris 20355714Skrissub D_ENCRYPT 20455714Skris { 205238405Sjkim local($r,$L,$R,$S,$trans,$u,$tmp1,$tmp2,$t,$wp1)=@_; 20655714Skris 207109998Smarkm &mov( $u, &DWP(&n2a($S*4),$tmp2,"",0)); 20855714Skris &xor( $tmp1, $tmp1); 209109998Smarkm &mov( $t, &DWP(&n2a(($S+1)*4),$tmp2,"",0)); 21055714Skris &xor( $u, $R); 211109998Smarkm &xor( $tmp2, $tmp2); 21255714Skris &xor( $t, $R); 21355714Skris &and( $u, "0xfcfcfcfc" ); 21455714Skris &and( $t, "0xcfcfcfcf" ); 21555714Skris &movb( &LB($tmp1), &LB($u) ); 21655714Skris &movb( &LB($tmp2), &HB($u) ); 21755714Skris &rotr( $t, 4 ); 218109998Smarkm &xor( $L, &DWP(" ",$trans,$tmp1,0)); 21955714Skris &movb( &LB($tmp1), &LB($t) ); 220109998Smarkm &xor( $L, &DWP("0x200",$trans,$tmp2,0)); 22155714Skris &movb( &LB($tmp2), &HB($t) ); 22255714Skris &shr( $u, 16); 223109998Smarkm &xor( $L, &DWP("0x100",$trans,$tmp1,0)); 22455714Skris &movb( &LB($tmp1), &HB($u) ); 22555714Skris &shr( $t, 16); 226109998Smarkm &xor( $L, &DWP("0x300",$trans,$tmp2,0)); 22755714Skris &movb( &LB($tmp2), &HB($t) ); 22855714Skris &and( $u, "0xff" ); 22955714Skris &and( $t, "0xff" ); 230109998Smarkm &xor( $L, &DWP("0x600",$trans,$tmp1,0)); 231109998Smarkm &xor( $L, &DWP("0x700",$trans,$tmp2,0)); 232238405Sjkim &mov( $tmp2, $wp1 ); 233109998Smarkm &xor( $L, &DWP("0x400",$trans,$u,0)); 234109998Smarkm &xor( $L, &DWP("0x500",$trans,$t,0)); 23555714Skris } 23655714Skris 23755714Skrissub n2a 23855714Skris { 23955714Skris sprintf("%d",$_[0]); 24055714Skris } 24155714Skris 24255714Skris# now has a side affect of rotating $a by $shift 24355714Skrissub R_PERM_OP 24455714Skris { 24555714Skris local($a,$b,$tt,$shift,$mask,$last)=@_; 24655714Skris 24755714Skris &rotl( $a, $shift ) if ($shift != 0); 24855714Skris &mov( $tt, $a ); 24955714Skris &xor( $a, $b ); 25055714Skris &and( $a, $mask ); 25155714Skris # This can never succeed, and besides it is difficult to see what the 25255714Skris # idea was - Ben 13 Feb 99 25355714Skris if (!$last eq $b) 25455714Skris { 25555714Skris &xor( $b, $a ); 25655714Skris &xor( $tt, $a ); 25755714Skris } 25855714Skris else 25955714Skris { 26055714Skris &xor( $tt, $a ); 26155714Skris &xor( $b, $a ); 26255714Skris } 26355714Skris &comment(""); 26455714Skris } 26555714Skris 26655714Skrissub IP_new 26755714Skris { 26855714Skris local($l,$r,$tt,$lr)=@_; 26955714Skris 27055714Skris &R_PERM_OP($l,$r,$tt, 4,"0xf0f0f0f0",$l); 27155714Skris &R_PERM_OP($r,$tt,$l,20,"0xfff0000f",$l); 27255714Skris &R_PERM_OP($l,$tt,$r,14,"0x33333333",$r); 27355714Skris &R_PERM_OP($tt,$r,$l,22,"0x03fc03fc",$r); 27455714Skris &R_PERM_OP($l,$r,$tt, 9,"0xaaaaaaaa",$r); 27555714Skris 27655714Skris if ($lr != 3) 27755714Skris { 27855714Skris if (($lr-3) < 0) 27955714Skris { &rotr($tt, 3-$lr); } 28055714Skris else { &rotl($tt, $lr-3); } 28155714Skris } 28255714Skris if ($lr != 2) 28355714Skris { 28455714Skris if (($lr-2) < 0) 28555714Skris { &rotr($r, 2-$lr); } 28655714Skris else { &rotl($r, $lr-2); } 28755714Skris } 28855714Skris } 28955714Skris 29055714Skrissub FP_new 29155714Skris { 29255714Skris local($l,$r,$tt,$lr)=@_; 29355714Skris 29455714Skris if ($lr != 2) 29555714Skris { 29655714Skris if (($lr-2) < 0) 29755714Skris { &rotl($r, 2-$lr); } 29855714Skris else { &rotr($r, $lr-2); } 29955714Skris } 30055714Skris if ($lr != 3) 30155714Skris { 30255714Skris if (($lr-3) < 0) 30355714Skris { &rotl($l, 3-$lr); } 30455714Skris else { &rotr($l, $lr-3); } 30555714Skris } 30655714Skris 30755714Skris &R_PERM_OP($l,$r,$tt, 0,"0xaaaaaaaa",$r); 30855714Skris &R_PERM_OP($tt,$r,$l,23,"0x03fc03fc",$r); 30955714Skris &R_PERM_OP($l,$r,$tt,10,"0x33333333",$l); 31055714Skris &R_PERM_OP($r,$tt,$l,18,"0xfff0000f",$l); 31155714Skris &R_PERM_OP($l,$tt,$r,12,"0xf0f0f0f0",$r); 31255714Skris &rotr($tt , 4); 31355714Skris } 31455714Skris 315238405Sjkimsub DES_SPtrans 316238405Sjkim { 317238405Sjkim &set_label("DES_SPtrans",64); 318238405Sjkim &data_word(0x02080800, 0x00080000, 0x02000002, 0x02080802); 319238405Sjkim &data_word(0x02000000, 0x00080802, 0x00080002, 0x02000002); 320238405Sjkim &data_word(0x00080802, 0x02080800, 0x02080000, 0x00000802); 321238405Sjkim &data_word(0x02000802, 0x02000000, 0x00000000, 0x00080002); 322238405Sjkim &data_word(0x00080000, 0x00000002, 0x02000800, 0x00080800); 323238405Sjkim &data_word(0x02080802, 0x02080000, 0x00000802, 0x02000800); 324238405Sjkim &data_word(0x00000002, 0x00000800, 0x00080800, 0x02080002); 325238405Sjkim &data_word(0x00000800, 0x02000802, 0x02080002, 0x00000000); 326238405Sjkim &data_word(0x00000000, 0x02080802, 0x02000800, 0x00080002); 327238405Sjkim &data_word(0x02080800, 0x00080000, 0x00000802, 0x02000800); 328238405Sjkim &data_word(0x02080002, 0x00000800, 0x00080800, 0x02000002); 329238405Sjkim &data_word(0x00080802, 0x00000002, 0x02000002, 0x02080000); 330238405Sjkim &data_word(0x02080802, 0x00080800, 0x02080000, 0x02000802); 331238405Sjkim &data_word(0x02000000, 0x00000802, 0x00080002, 0x00000000); 332238405Sjkim &data_word(0x00080000, 0x02000000, 0x02000802, 0x02080800); 333238405Sjkim &data_word(0x00000002, 0x02080002, 0x00000800, 0x00080802); 334238405Sjkim # nibble 1 335238405Sjkim &data_word(0x40108010, 0x00000000, 0x00108000, 0x40100000); 336238405Sjkim &data_word(0x40000010, 0x00008010, 0x40008000, 0x00108000); 337238405Sjkim &data_word(0x00008000, 0x40100010, 0x00000010, 0x40008000); 338238405Sjkim &data_word(0x00100010, 0x40108000, 0x40100000, 0x00000010); 339238405Sjkim &data_word(0x00100000, 0x40008010, 0x40100010, 0x00008000); 340238405Sjkim &data_word(0x00108010, 0x40000000, 0x00000000, 0x00100010); 341238405Sjkim &data_word(0x40008010, 0x00108010, 0x40108000, 0x40000010); 342238405Sjkim &data_word(0x40000000, 0x00100000, 0x00008010, 0x40108010); 343238405Sjkim &data_word(0x00100010, 0x40108000, 0x40008000, 0x00108010); 344238405Sjkim &data_word(0x40108010, 0x00100010, 0x40000010, 0x00000000); 345238405Sjkim &data_word(0x40000000, 0x00008010, 0x00100000, 0x40100010); 346238405Sjkim &data_word(0x00008000, 0x40000000, 0x00108010, 0x40008010); 347238405Sjkim &data_word(0x40108000, 0x00008000, 0x00000000, 0x40000010); 348238405Sjkim &data_word(0x00000010, 0x40108010, 0x00108000, 0x40100000); 349238405Sjkim &data_word(0x40100010, 0x00100000, 0x00008010, 0x40008000); 350238405Sjkim &data_word(0x40008010, 0x00000010, 0x40100000, 0x00108000); 351238405Sjkim # nibble 2 352238405Sjkim &data_word(0x04000001, 0x04040100, 0x00000100, 0x04000101); 353238405Sjkim &data_word(0x00040001, 0x04000000, 0x04000101, 0x00040100); 354238405Sjkim &data_word(0x04000100, 0x00040000, 0x04040000, 0x00000001); 355238405Sjkim &data_word(0x04040101, 0x00000101, 0x00000001, 0x04040001); 356238405Sjkim &data_word(0x00000000, 0x00040001, 0x04040100, 0x00000100); 357238405Sjkim &data_word(0x00000101, 0x04040101, 0x00040000, 0x04000001); 358238405Sjkim &data_word(0x04040001, 0x04000100, 0x00040101, 0x04040000); 359238405Sjkim &data_word(0x00040100, 0x00000000, 0x04000000, 0x00040101); 360238405Sjkim &data_word(0x04040100, 0x00000100, 0x00000001, 0x00040000); 361238405Sjkim &data_word(0x00000101, 0x00040001, 0x04040000, 0x04000101); 362238405Sjkim &data_word(0x00000000, 0x04040100, 0x00040100, 0x04040001); 363238405Sjkim &data_word(0x00040001, 0x04000000, 0x04040101, 0x00000001); 364238405Sjkim &data_word(0x00040101, 0x04000001, 0x04000000, 0x04040101); 365238405Sjkim &data_word(0x00040000, 0x04000100, 0x04000101, 0x00040100); 366238405Sjkim &data_word(0x04000100, 0x00000000, 0x04040001, 0x00000101); 367238405Sjkim &data_word(0x04000001, 0x00040101, 0x00000100, 0x04040000); 368238405Sjkim # nibble 3 369238405Sjkim &data_word(0x00401008, 0x10001000, 0x00000008, 0x10401008); 370238405Sjkim &data_word(0x00000000, 0x10400000, 0x10001008, 0x00400008); 371238405Sjkim &data_word(0x10401000, 0x10000008, 0x10000000, 0x00001008); 372238405Sjkim &data_word(0x10000008, 0x00401008, 0x00400000, 0x10000000); 373238405Sjkim &data_word(0x10400008, 0x00401000, 0x00001000, 0x00000008); 374238405Sjkim &data_word(0x00401000, 0x10001008, 0x10400000, 0x00001000); 375238405Sjkim &data_word(0x00001008, 0x00000000, 0x00400008, 0x10401000); 376238405Sjkim &data_word(0x10001000, 0x10400008, 0x10401008, 0x00400000); 377238405Sjkim &data_word(0x10400008, 0x00001008, 0x00400000, 0x10000008); 378238405Sjkim &data_word(0x00401000, 0x10001000, 0x00000008, 0x10400000); 379238405Sjkim &data_word(0x10001008, 0x00000000, 0x00001000, 0x00400008); 380238405Sjkim &data_word(0x00000000, 0x10400008, 0x10401000, 0x00001000); 381238405Sjkim &data_word(0x10000000, 0x10401008, 0x00401008, 0x00400000); 382238405Sjkim &data_word(0x10401008, 0x00000008, 0x10001000, 0x00401008); 383238405Sjkim &data_word(0x00400008, 0x00401000, 0x10400000, 0x10001008); 384238405Sjkim &data_word(0x00001008, 0x10000000, 0x10000008, 0x10401000); 385238405Sjkim # nibble 4 386238405Sjkim &data_word(0x08000000, 0x00010000, 0x00000400, 0x08010420); 387238405Sjkim &data_word(0x08010020, 0x08000400, 0x00010420, 0x08010000); 388238405Sjkim &data_word(0x00010000, 0x00000020, 0x08000020, 0x00010400); 389238405Sjkim &data_word(0x08000420, 0x08010020, 0x08010400, 0x00000000); 390238405Sjkim &data_word(0x00010400, 0x08000000, 0x00010020, 0x00000420); 391238405Sjkim &data_word(0x08000400, 0x00010420, 0x00000000, 0x08000020); 392238405Sjkim &data_word(0x00000020, 0x08000420, 0x08010420, 0x00010020); 393238405Sjkim &data_word(0x08010000, 0x00000400, 0x00000420, 0x08010400); 394238405Sjkim &data_word(0x08010400, 0x08000420, 0x00010020, 0x08010000); 395238405Sjkim &data_word(0x00010000, 0x00000020, 0x08000020, 0x08000400); 396238405Sjkim &data_word(0x08000000, 0x00010400, 0x08010420, 0x00000000); 397238405Sjkim &data_word(0x00010420, 0x08000000, 0x00000400, 0x00010020); 398238405Sjkim &data_word(0x08000420, 0x00000400, 0x00000000, 0x08010420); 399238405Sjkim &data_word(0x08010020, 0x08010400, 0x00000420, 0x00010000); 400238405Sjkim &data_word(0x00010400, 0x08010020, 0x08000400, 0x00000420); 401238405Sjkim &data_word(0x00000020, 0x00010420, 0x08010000, 0x08000020); 402238405Sjkim # nibble 5 403238405Sjkim &data_word(0x80000040, 0x00200040, 0x00000000, 0x80202000); 404238405Sjkim &data_word(0x00200040, 0x00002000, 0x80002040, 0x00200000); 405238405Sjkim &data_word(0x00002040, 0x80202040, 0x00202000, 0x80000000); 406238405Sjkim &data_word(0x80002000, 0x80000040, 0x80200000, 0x00202040); 407238405Sjkim &data_word(0x00200000, 0x80002040, 0x80200040, 0x00000000); 408238405Sjkim &data_word(0x00002000, 0x00000040, 0x80202000, 0x80200040); 409238405Sjkim &data_word(0x80202040, 0x80200000, 0x80000000, 0x00002040); 410238405Sjkim &data_word(0x00000040, 0x00202000, 0x00202040, 0x80002000); 411238405Sjkim &data_word(0x00002040, 0x80000000, 0x80002000, 0x00202040); 412238405Sjkim &data_word(0x80202000, 0x00200040, 0x00000000, 0x80002000); 413238405Sjkim &data_word(0x80000000, 0x00002000, 0x80200040, 0x00200000); 414238405Sjkim &data_word(0x00200040, 0x80202040, 0x00202000, 0x00000040); 415238405Sjkim &data_word(0x80202040, 0x00202000, 0x00200000, 0x80002040); 416238405Sjkim &data_word(0x80000040, 0x80200000, 0x00202040, 0x00000000); 417238405Sjkim &data_word(0x00002000, 0x80000040, 0x80002040, 0x80202000); 418238405Sjkim &data_word(0x80200000, 0x00002040, 0x00000040, 0x80200040); 419238405Sjkim # nibble 6 420238405Sjkim &data_word(0x00004000, 0x00000200, 0x01000200, 0x01000004); 421238405Sjkim &data_word(0x01004204, 0x00004004, 0x00004200, 0x00000000); 422238405Sjkim &data_word(0x01000000, 0x01000204, 0x00000204, 0x01004000); 423238405Sjkim &data_word(0x00000004, 0x01004200, 0x01004000, 0x00000204); 424238405Sjkim &data_word(0x01000204, 0x00004000, 0x00004004, 0x01004204); 425238405Sjkim &data_word(0x00000000, 0x01000200, 0x01000004, 0x00004200); 426238405Sjkim &data_word(0x01004004, 0x00004204, 0x01004200, 0x00000004); 427238405Sjkim &data_word(0x00004204, 0x01004004, 0x00000200, 0x01000000); 428238405Sjkim &data_word(0x00004204, 0x01004000, 0x01004004, 0x00000204); 429238405Sjkim &data_word(0x00004000, 0x00000200, 0x01000000, 0x01004004); 430238405Sjkim &data_word(0x01000204, 0x00004204, 0x00004200, 0x00000000); 431238405Sjkim &data_word(0x00000200, 0x01000004, 0x00000004, 0x01000200); 432238405Sjkim &data_word(0x00000000, 0x01000204, 0x01000200, 0x00004200); 433238405Sjkim &data_word(0x00000204, 0x00004000, 0x01004204, 0x01000000); 434238405Sjkim &data_word(0x01004200, 0x00000004, 0x00004004, 0x01004204); 435238405Sjkim &data_word(0x01000004, 0x01004200, 0x01004000, 0x00004004); 436238405Sjkim # nibble 7 437238405Sjkim &data_word(0x20800080, 0x20820000, 0x00020080, 0x00000000); 438238405Sjkim &data_word(0x20020000, 0x00800080, 0x20800000, 0x20820080); 439238405Sjkim &data_word(0x00000080, 0x20000000, 0x00820000, 0x00020080); 440238405Sjkim &data_word(0x00820080, 0x20020080, 0x20000080, 0x20800000); 441238405Sjkim &data_word(0x00020000, 0x00820080, 0x00800080, 0x20020000); 442238405Sjkim &data_word(0x20820080, 0x20000080, 0x00000000, 0x00820000); 443238405Sjkim &data_word(0x20000000, 0x00800000, 0x20020080, 0x20800080); 444238405Sjkim &data_word(0x00800000, 0x00020000, 0x20820000, 0x00000080); 445238405Sjkim &data_word(0x00800000, 0x00020000, 0x20000080, 0x20820080); 446238405Sjkim &data_word(0x00020080, 0x20000000, 0x00000000, 0x00820000); 447238405Sjkim &data_word(0x20800080, 0x20020080, 0x20020000, 0x00800080); 448238405Sjkim &data_word(0x20820000, 0x00000080, 0x00800080, 0x20020000); 449238405Sjkim &data_word(0x20820080, 0x00800000, 0x20800000, 0x20000080); 450238405Sjkim &data_word(0x00820000, 0x00020080, 0x20020080, 0x20800000); 451238405Sjkim &data_word(0x00000080, 0x20820000, 0x00820080, 0x00000000); 452238405Sjkim &data_word(0x20000000, 0x20800080, 0x00020000, 0x00820080); 453238405Sjkim } 454