X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fdriver%2Fmangler%2Fghc-asm.lprl;fp=ghc%2Fdriver%2Fmangler%2Fghc-asm.lprl;h=3ba4e9b1d37648b7a232bf34130a362c4b9f8d02;hb=bc2d66a07265539460411d7ca8863b8fd9cda689;hp=f801846ca6c406fe79496b098cdbe1654d2d37a8;hpb=7d116768afbed23f0d1de1458a4cbbaad9c24446;p=ghc-hetmet.git diff --git a/ghc/driver/mangler/ghc-asm.lprl b/ghc/driver/mangler/ghc-asm.lprl index f801846..3ba4e9b 100644 --- a/ghc/driver/mangler/ghc-asm.lprl +++ b/ghc/driver/mangler/ghc-asm.lprl @@ -223,7 +223,10 @@ sub init_TARGET_STUFF { $T_DOT_WORD = '\.(quad|long|value|byte|zero)'; $T_DOT_GLOBAL = '\.global'; + + $T_HDR_literal16 = "\.section\t\.rodata.cst16\n\t.align 16\n"; $T_HDR_literal = "\.section\t\.rodata\n"; + $T_HDR_misc = "\.text\n\t\.align 8\n"; $T_HDR_data = "\.data\n\t\.align 8\n"; $T_HDR_rodata = "\.section\t\.rodata\n\t\.align 8\n"; @@ -1141,7 +1144,22 @@ sub mangle_asm { # print out all the literal strings next for ($i = 0; $i < $numchks; $i++) { if ( $chkcat[$i] eq 'literal' ) { - print OUTASM $T_HDR_literal, $chk[$i]; + + # HACK: try to detect 16-byte constants and align them + # on a 16-byte boundary. x86_64 sometimes needs 128-bit + # aligned constants. + if ( $TargetPlatform =~ /^x86_64/ ) { + $z = $chk[$i]; + if ($z =~ /(\.long.*\n.*\.long.*\n.*\.long.*\n.*\.long|\.quad.*\n.*\.quad)/) { + print OUTASM $T_HDR_literal16; + } else { + print OUTASM $T_HDR_literal; + } + } else { + print OUTASM $T_HDR_literal; + } + + print OUTASM $chk[$i]; print OUTASM "; end literal\n" if $TargetPlatform =~ /^hppa/; # for the splitter $chkcat[$i] = 'DONE ALREADY';