X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fdriver%2Fghc-asm.lprl;h=06a641615d9fe762908900816f0f8d7529e8831a;hb=80d19100a3aabd62ece8582332d6b5ea6f66bdf5;hp=6fb55f42147b0daefad12ace7807a12ee2c95574;hpb=2a3a552c0aa2302deaf6fadd5badbbb0d193b3b1;p=ghc-hetmet.git diff --git a/ghc/driver/ghc-asm.lprl b/ghc/driver/ghc-asm.lprl index 6fb55f4..06a6416 100644 --- a/ghc/driver/ghc-asm.lprl +++ b/ghc/driver/ghc-asm.lprl @@ -483,7 +483,13 @@ sub mangle_asm { $chk[++$i] = $_; $chkcat[$i] = 'toc'; $chksymb[$i] = $1; - + + } elsif ( $TargetPlatform =~ /^powerpc-|^rs6000-/ && /^CC_.*$/ ) { + # all CC_ symbols go in the data section... + $chk[++$i] = $_; + $chkcat[$i] = 'data'; + $chksymb[$i] = ''; + } elsif ( /^($TUS[@]?(ret_|djn_)[A-Za-z0-9_]+)/o ) { $chk[++$i] = $_; $chkcat[$i] = 'misc'; @@ -512,10 +518,6 @@ sub mangle_asm { # I guess this is never entered, since all _upds are # either vtbl_'s or ret_'s, caught above. - andre $chksymb[$i] = ''; -# if ($TargetPlatform =~ /^powerpc-/) -# { $chksymb[$i] = $symbtmp;} -# else { $chksymb[$i] = ''; }; - } elsif ( $TargetPlatform =~ /^i386-.*-solaris2/ && /^(_uname|uname|stat|fstat):/ ) { @@ -577,7 +579,6 @@ sub mangle_asm { # HPPAs, MIPSen: also start medding at chunk 1 -# AIX hack for the moment, to join up multiple identical tocs if ($TargetPlatform =~ /^powerpc|^rs6000/) { print OUTASM $T_HDR_toc; # yes, we have to put a .toc # in the beginning of every file! @@ -587,7 +588,9 @@ sub mangle_asm { $chk[$i] =~ s/\[RW\]//g; $chk[$i] =~ s/\[DS\]//g; $chk[$i] =~ s/^\.csect .*\[DS\]$//g; + if ( $chkcat[$i] eq 'toc' && $chk[$i] !~ /\.byte/ ) +#ToDo: instead of all these changes, just fix mangle_powerpc_tailjump and delete/ignore these tocs? { $chk[$i] =~ s/$T_MOVE_DIRVS//g; $chk[$i] =~ s/\t\.tc (\S+)\[TC\],(\S+_fast\d+)/\t\.tc \1\[TC\],\.\2/; $chk[$i] =~ s/\t\.tc (\S+)\[TC\],(\S+_entry)\n/\t\.tc \1\[TC\],\.\2\n/; @@ -597,6 +600,12 @@ sub mangle_asm { $chk[$i] =~ s/\t\.tc (\S+)\[TC\],ErrorIO_innards/\t\.tc \1\[TC\],\.ErrorIO_innards/; $chk[$i] =~ s/\t\.tc (\S+)\[TC\],startStgWorld/\t\.tc \1\[TC\],\.startStgWorld/; $chk[$i] =~ s/\.tc UpdatePAP\[TC\],UpdatePAP/\.tc UpdatePAP\[TC\],\.UpdatePAP/; + $chk[$i] =~ s/\.tc _regMain\[TC\],_regMain/\.tc _regMain\[TC\],\._regMain/; #PROF + $chk[$i] =~ s/\.tc resumeThread\[TC\],resumeThread/\.tc resumeThread\[TC\],\.resumeThread/; #CONC + $chk[$i] =~ s/\.tc EnterNodeCode\[TC\],EnterNodeCode/\.tc EnterNodeCode\[TC\],\.EnterNodeCode/; #CONC + $chk[$i] =~ s/\.tc StackUnderflowEnterNode\[TC\],StackUnderflowEnterNode/\.tc StackUnderflowEnterNode\[TC\],\.StackUnderflowEnterNode/; #CONC + $chk[$i] =~ s/\.tc stopThreadDirectReturn\[TC\],stopThreadDirectReturn/\.tc stopThreadDirectReturn\[TC\],\.stopThreadDirectReturn/; #CONC + $chk[$i] =~ s/\.tc CommonUnderflow\[TC\],CommonUnderflow/\.tc CommonUnderflow\[TC\],\.CommonUnderflow/; #PAR $chk[$i] =~ s/\.tc IndUpdRetDir\[TC\],IndUpdRetDir/\.tc IndUpdRetDir\[TC\],\.IndUpdRetDir/; $chk[$i] =~ s/\t\.tc (_PRStart_\S+)\[TC\],_PRStart_\S+/\t\.tc \1\[TC\],\.\1/; @@ -657,10 +666,12 @@ sub mangle_asm { } elsif ($TargetPlatform =~ /^powerpc-|^rs6000/) { $p =~ s/^\tmflr 0\n//; $p =~ s/^\tstm \d+,-\d+\(1\)\n//; - $p =~ s/^\tstw? 0,\d+\(1\)\n//; + $p =~ s/^\tstw? 0,\d+\(1\)\n//g; + $p =~ s/^\tstw? 1,\d+\(1\)\n//g; #mc + $p =~ s/^\tlw?z 0,0\(1\)\n//g; #mc $p =~ s/^\tstw?u 1,-\d+\(1\)\n//; $p =~ s/^\tstw? \d+,-\d+\(1\)\n//g; - $p =~ s/^\tstfd \d+,-\d+\(1\)\n//; + $p =~ s/^\tstfd \d+,-\d+\(1\)\n//g; } else { print STDERR "$Pgm: unknown prologue mangling? $TargetPlatform\n"; } @@ -848,7 +859,8 @@ sub mangle_asm { #new if ($chksymb[$i] =~ /ret.*upd/ || $KNOWN_FUNNY_THING{$chksymb[$i]} #new || $chksymb[$i] =~ /^$.{T_US}_(PRIn|PRStart).*${T_POST_LBL}$/o ) #new { print OUTASM "\t\.globl $chksymb[$i]\n"; } - if ($chksymb[$i] ne '') +# if ($chksymb[$i] ne '' && $chksymb[$i] !~ /ret_[a-z]/ && $chksymb[$i] !~ /djn_[a-z]/) + if ($chksymb[$i] ne '') { print OUTASM "\t\.globl \.$chksymb[$i]\n"; }; if ($chk[$i] =~ /TOC\[tc0\], 0\n/) { ($p, $r) = split(/TOC\[tc0\], 0\n/, $chk[$i]); $printDS = 1;} @@ -857,8 +869,10 @@ sub mangle_asm { }; &print_doctored($chk[$i], 0); if ($TargetPlatform =~ /^powerpc-|^rs6000-/ && $printDS) { - print OUTASM "\.csect ${chksymb[$i]}[DS]\n"; - print OUTASM "${p}TOC[tc0], 0\n"; +#ok if ($chksymb[$i] !~ /\_regMain/) { + print OUTASM "\.csect ${chksymb[$i]}[DS]\n"; + print OUTASM "${p}TOC[tc0], 0\n"; +#ok } } } @@ -912,6 +926,11 @@ sub mangle_asm { print OUTASM $T_HDR_info; if ($TargetPlatform =~ /^powerpc-|^rs6000-/) { + if ( !defined($slowchk{$symb}) && defined($fastchk{$symb}) ) { + $fastname = $chk[$fastchk{$symb}]; + $fastname =~ s/([_A-Za-z]*_fast\d+):.*(.*\n)*/\1/; + $chk[$infochk{$symb}] =~ s/\.long StdErrorCode/\.long $fastname/; + } $chk[$infochk{$symb}] =~ s/\.long ([_A-Za-z]\S+_entry)/\.long \.\1/; $chk[$infochk{$symb}] =~ s/\.long ([A-Za-z]\S+_upd)/\.long \.\1/; $chk[$infochk{$symb}] =~ s/\.long (IndUpdRet\S+)/\.long \.\1/; @@ -1005,7 +1024,7 @@ sub mangle_asm { if ( $fullname =~ /^[A-Z]/) { print OUTASM "\t\.globl \.${fullname}\n"; } else { - print OUTASM "\t\.lglobl \.${fullname}\n"; #todo: rm - andre +# print OUTASM "\t\.lglobl \.${fullname}\n"; #todo: rm - andre }; $c =~ s/((.*\n)*)\t.long \S+, TOC\[tc0\], 0\n\.csect \.text\[PR\]\n((.*\n)*)/\1\3/; $c = &mangle_powerpc_tailjump($c); @@ -1064,7 +1083,11 @@ sub mangle_asm { print OUTASM $T_HDR_toc; local($j) = $i; while ($chkcat[$j] eq 'toc') - { print OUTASM $chk[$j]; + { if ( $chk[$j] !~ /\.tc UpdatePAP\[TC\]/ # not needed: always turned into a jump. + ) + { + print OUTASM $chk[$j]; + } $chkcat[$j] = 'DONE ALREADY'; $j++; } @@ -1126,6 +1149,8 @@ sub print_doctored { local($exit_patch) = ''; local($call_entry_patch)= ''; local($call_exit_patch) = ''; + local($gc_call_entry_patch)= ''; # Patches before and after calls to Perform_GC_wrapper + local($gc_call_exit_patch) = ''; #OLD: # first, convert calls to *very magic form*: (ToDo: document # for real!) from @@ -1215,16 +1240,26 @@ sub print_doctored { # OK, now we can decide what our patch-up code is going to # be: + + # Note funky ".=" stuff; we're *adding* to these _patch guys if ( $StolenX86Regs <= 2 && ( /32\(\%ebx\)/ || /\%esi/ || /^\tcmps/ ) ) { # R1 (esi) $entry_patch .= "\tmovl \%esi,32(\%ebx)\n"; $exit_patch .= "\tmovl 32(\%ebx),\%esi\n"; + + $gc_call_entry_patch .= "\tmovl \%esi,32(\%ebx)\n"; + $gc_call_exit_patch .= "\tmovl 32(\%ebx),\%esi\n"; + # nothing for call_{entry,exit} because %esi is callee-save } if ( $StolenX86Regs <= 3 && ( /64\(\%ebx\)/ || /\%edi/ || /^\t(scas|cmps)/ ) ) { # SpA (edi) $entry_patch .= "\tmovl \%edi,64(\%ebx)\n"; $exit_patch .= "\tmovl 64(\%ebx),\%edi\n"; + + $gc_call_entry_patch .= "\tmovl \%edi,64(\%ebx)\n"; + $gc_call_exit_patch .= "\tmovl 64(\%ebx),\%edi\n"; + # nothing for call_{entry,exit} because %edi is callee-save } #= if ( $StolenX86Regs <= 4 @@ -1242,7 +1277,14 @@ sub print_doctored { # next, here we go with non-%esp patching! # s/^(\t[a-z])/$entry_patch$1/; # before first instruction - s/^(\tcall .*\n(\taddl \$\d+,\%esp\n)?)/$call_exit_patch$1$call_entry_patch/g; # _all_ calls + +# Actually, call_entry_patch and call_exit_patch never get set, +# so let's nuke this one +# s/^(\tcall .*\n(\taddl \$\d+,\%esp\n)?)/$call_exit_patch$1$call_entry_patch/g; # _all_ calls + +# Before calling GC we must set up the exit condition before the call +# and entry condition when we come back + s/^(\tcall ${T_DO_GC}\n(\taddl \$\d+,\%esp\n)?)/$gc_call_exit_patch$1$gc_call_entry_patch/g; # _all_ calls # fix _all_ non-local jumps: @@ -1525,6 +1567,8 @@ sub mini_mangle_asm_powerpc { s/long _PRMarking_MarkNextCAF\[DS\]/long ._PRMarking_MarkNextCAF/; s/long _PRMarking_MarkNextAStack\[DS\]/long ._PRMarking_MarkNextAStack/; s/long _PRMarking_MarkNextBStack\[DS\]/long ._PRMarking_MarkNextBStack/; + s/\.tc EnterNodeCode\[TC]\,EnterNodeCode\[DS\]/\.tc EnterNodeCode\[TC]\,.EnterNodeCode/; # CONC + s/\.tc CheckHeapCode\[TC]\,CheckHeapCode\[DS\]/\.tc CheckHeapCode\[TC]\,.CheckHeapCode/; # CONC print OUTASM; }