# 2009/10/04 Hiroyuki Ogasawara # vim:ts=4 sw=4: # http://wlog.flatlib.jp/ sub getRReg() { my $reg= shift; if( $reg=~/^r(\d+)$/ ){ return $1; } printf( "ERROR: getRReg %s\n", $reg ); return 0; } sub getSReg() { my $reg= shift; if( $reg=~/^s(\d+)$/ ){ return $1; } printf( "ERROR: getSReg %s\n", $reg ); return 0; } sub getDReg() { my $reg= shift; if( $reg=~/^d(\d+)$/ ){ return $1; } printf( "ERROR: getDReg %s\n", $reg ); return 0; } while(<>){ $line= $_; if( /flds\s+(\w+)\s*,\s*(.*)$/ ){ printf( ";# %s", $line ); $arg2= $2; $id1= &getSReg( $1 ); if( $id1 * 2 >= 32 ){ printf( "\tvldr.32 s1, %s\n", $arg2 ); printf( "\tvdup.32 d%d, d0[1]\n", $id1 ); }else{ printf( "\tvldr.32 s%d, %s\n", $id1 * 2, $arg2 ); } }elsif( /fsitos\s+(\w+)\s*,\s*(.*)$/ ){ $id1= &getSReg( $1 ); $id2= &getSReg( $2 ); printf( ";# %s", $line ); printf( "\tvcvt.f32.s32 d%d, d%d\n", $id1, $id2 ); }elsif( /fcvtds\s+(\w+)\s*,\s*(.*)$/ ){ $id1= &getDReg( $1 ); $id2= &getSReg( $2 ); printf( ";# %s", $line ); if( $id2 * 2 >= 32 ){ if( $id1 < 16 ){ printf( "\tvdup.32 d%d, d%d[0]\n", $id1, $id2 ); printf( "\tvcvt.f64.f32 d%d, s%d\n", $id1, $id1*2 ); }else{ printf( "ERROR\n" ); } }else{ printf( "\tvcvt.f64.f32 d%d, s%d\n", $id1, $id2*2 ); } }elsif( /fadds\s+(\w+)\s*,\s*(\w+)\s*,\s*(.*)$/ ){ $id1= &getSReg( $1 ); $id2= &getSReg( $2 ); $id3= &getSReg( $3 ); printf( ";# %s", $line ); printf( "\tvadd.f32 d%d, d%d, d%d\n", $id1, $id2, $id3 ); }elsif( /fmuls\s+(\w+)\s*,\s*(\w+)\s*,\s*(.*)$/ ){ $id1= &getSReg( $1 ); $id2= &getSReg( $2 ); $id3= &getSReg( $3 ); printf( ";# %s", $line ); printf( "\tvmul.f32 d%d, d%d, d%d\n", $id1, $id2, $id3 ); }elsif( /famcs\s+(\w+)\s*,\s*(\w+)\s*,\s*(.*)$/ ){ $id1= &getSReg( $1 ); $id2= &getSReg( $2 ); $id3= &getSReg( $3 ); printf( ";# %s", $line ); printf( "\tvmla.f32 d%d, d%d, d%d\n", $id1, $id2, $id3 ); }elsif( /fnamcs\s+(\w+)\s*,\s*(\w+)\s*,\s*(.*)$/ ){ $id1= &getSReg( $1 ); $id2= &getSReg( $2 ); $id3= &getSReg( $3 ); printf( ";# %s", $line ); printf( "\tvmls.f32 d%d, d%d, d%d\n", $id1, $id2, $id3 ); }elsif( /fcpys\s+(\w+)\s*,\s*(.*)$/ ){ $id1= &getSReg( $1 ); $id2= &getSReg( $2 ); printf( ";# %s", $line ); printf( "\tvmov d%d, d%d\n", $id1, $id2 ); }elsif( /fmsr\s+(\w+)\s*,\s*(.*)$/ ){ $id1= &getSReg( $1 ); printf( ";# %s", $line ); printf( "\tvdup.32 d%d, %s\n", $id1, $2 ); }elsif( /fmrs\s+(\w+)\s*,\s*(.*)$/ ){ $id1= &getRReg( $1 ); $id2= &getSReg( $2 ); printf( ";# %s", $line ); printf( "\tvmov.32 r%d, d%d[0]\n", $id1, $id2 ); }elsif( /\.fpu\s+vfp\s*$/ ){ printf( ";# %s", $line ); printf( "\t.fpu neon\n" ); }else{ print $line; } }