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