1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#!/usr/local/bin/perl 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# The inner loop instruction sequence and the IP/FP modifications are from 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Svend Olaf Mikkelsen <svolaf@inet.uni-c.dk> 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# I've added the stuff needed for crypt() but I've not worried about making 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# things perfect. 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 9221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; 10221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrompush(@INC,"${dir}","${dir}../../perlasm"); 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectrequire "x86asm.pl"; 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&asm_init($ARGV[0],"crypt586.pl"); 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$L="edi"; 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$R="esi"; 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&external_label("DES_SPtrans"); 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&fcrypt_body("fcrypt_body"); 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project&asm_finish(); 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub fcrypt_body 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project local($name,$do_ip)=@_; 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 26221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &function_begin($name); 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment(""); 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment("Load the 2 words"); 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $trans="ebp"; 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $L, $L); 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $R, $R); 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # PIC-ification:-) 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &picmeup("edx","DES_SPtrans"); 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project #if ($cpp) { &picmeup("edx","DES_SPtrans"); } 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project #else { &lea("edx",&DWP("DES_SPtrans")); } 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &push("edx"); # becomes &swtmp(1) 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov($trans,&wparam(1)); # reloaded with DES_SPtrans in D_ENCRYPT 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &push(&DWC(25)); # add a variable 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &set_label("start"); 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for ($i=0; $i<16; $i+=2) 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment(""); 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment("Round $i"); 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &D_ENCRYPT($i,$L,$R,$i*2,$trans,"eax","ebx","ecx","edx"); 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment(""); 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment("Round ".sprintf("%d",$i+1)); 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &D_ENCRYPT($i+1,$R,$L,($i+1)*2,$trans,"eax","ebx","ecx","edx"); 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov("ebx", &swtmp(0)); 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov("eax", $L); 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &dec("ebx"); 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov($L, $R); 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov($R, "eax"); 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov(&swtmp(0), "ebx"); 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &jnz(&label("start")); 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment(""); 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment("FP"); 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov("edx",&wparam(0)); 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &FP_new($R,$L,"eax",3); 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov(&DWP(0,"edx","",0),"eax"); 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov(&DWP(4,"edx","",0),$L); 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &add("esp",8); # remove variables 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &function_end($name); 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub D_ENCRYPT 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project local($r,$L,$R,$S,$trans,$u,$tmp1,$tmp2,$t)=@_; 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov( $u, &wparam(2)); # 2 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov( $t, $R); 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &shr( $t, 16); # 1 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov( $tmp2, &wparam(3)); # 2 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $t, $R); # 1 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &and( $u, $t); # 2 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &and( $t, $tmp2); # 2 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov( $tmp1, $u); 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &shl( $tmp1, 16); # 1 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov( $tmp2, $t); 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &shl( $tmp2, 16); # 1 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $u, $tmp1); # 2 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $t, $tmp2); # 2 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov( $tmp1, &DWP(&n2a($S*4),$trans,"",0)); # 2 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $u, $tmp1); 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov( $tmp2, &DWP(&n2a(($S+1)*4),$trans,"",0)); # 2 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $u, $R); 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $t, $R); 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $t, $tmp2); 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &and( $u, "0xfcfcfcfc" ); # 2 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $tmp1, $tmp1); # 1 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &and( $t, "0xcfcfcfcf" ); # 2 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $tmp2, $tmp2); 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &movb( &LB($tmp1), &LB($u) ); 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &movb( &LB($tmp2), &HB($u) ); 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &rotr( $t, 4 ); 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov( $trans, &swtmp(1)); 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $L, &DWP(" ",$trans,$tmp1,0)); 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &movb( &LB($tmp1), &LB($t) ); 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $L, &DWP("0x200",$trans,$tmp2,0)); 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &movb( &LB($tmp2), &HB($t) ); 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &shr( $u, 16); 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $L, &DWP("0x100",$trans,$tmp1,0)); 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &movb( &LB($tmp1), &HB($u) ); 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &shr( $t, 16); 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $L, &DWP("0x300",$trans,$tmp2,0)); 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &movb( &LB($tmp2), &HB($t) ); 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &and( $u, "0xff" ); 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &and( $t, "0xff" ); 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov( $tmp1, &DWP("0x600",$trans,$tmp1,0)); 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $L, $tmp1); 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov( $tmp1, &DWP("0x700",$trans,$tmp2,0)); 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $L, $tmp1); 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov( $tmp1, &DWP("0x400",$trans,$u,0)); 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $L, $tmp1); 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov( $tmp1, &DWP("0x500",$trans,$t,0)); 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $L, $tmp1); 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov( $trans, &wparam(1)); 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub n2a 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sprintf("%d",$_[0]); 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# now has a side affect of rotating $a by $shift 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub R_PERM_OP 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project local($a,$b,$tt,$shift,$mask,$last)=@_; 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &rotl( $a, $shift ) if ($shift != 0); 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &mov( $tt, $a ); 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $a, $b ); 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &and( $a, $mask ); 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($notlast eq $b) 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $b, $a ); 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $tt, $a ); 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $tt, $a ); 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &xor( $b, $a ); 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &comment(""); 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub IP_new 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project local($l,$r,$tt,$lr)=@_; 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &R_PERM_OP($l,$r,$tt, 4,"0xf0f0f0f0",$l); 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &R_PERM_OP($r,$tt,$l,20,"0xfff0000f",$l); 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &R_PERM_OP($l,$tt,$r,14,"0x33333333",$r); 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &R_PERM_OP($tt,$r,$l,22,"0x03fc03fc",$r); 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &R_PERM_OP($l,$r,$tt, 9,"0xaaaaaaaa",$r); 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($lr != 3) 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (($lr-3) < 0) 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { &rotr($tt, 3-$lr); } 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else { &rotl($tt, $lr-3); } 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($lr != 2) 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (($lr-2) < 0) 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { &rotr($r, 2-$lr); } 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else { &rotl($r, $lr-2); } 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub FP_new 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project local($l,$r,$tt,$lr)=@_; 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($lr != 2) 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (($lr-2) < 0) 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { &rotl($r, 2-$lr); } 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else { &rotr($r, $lr-2); } 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($lr != 3) 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (($lr-3) < 0) 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { &rotl($l, 3-$lr); } 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else { &rotr($l, $lr-3); } 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &R_PERM_OP($l,$r,$tt, 0,"0xaaaaaaaa",$r); 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &R_PERM_OP($tt,$r,$l,23,"0x03fc03fc",$r); 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &R_PERM_OP($l,$r,$tt,10,"0x33333333",$l); 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &R_PERM_OP($r,$tt,$l,18,"0xfff0000f",$l); 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &R_PERM_OP($l,$tt,$r,12,"0xf0f0f0f0",$r); 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &rotr($tt , 4); 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 210