diff options
| author | Brian Gaeke <gaeke@uiuc.edu> | 2003-07-07 18:34:20 +0000 | 
|---|---|---|
| committer | Brian Gaeke <gaeke@uiuc.edu> | 2003-07-07 18:34:20 +0000 | 
| commit | c48e3fdffd5ac07e734faec2294d174d0e3898c0 (patch) | |
| tree | f47a31f3a9549e1205db0618085a2420013a0f6d /llvm | |
| parent | c1db0fdd7eee23d0675ebac10055022181091ad9 (diff) | |
| download | bcm5719-llvm-c48e3fdffd5ac07e734faec2294d174d0e3898c0.tar.gz bcm5719-llvm-c48e3fdffd5ac07e734faec2294d174d0e3898c0.zip | |
Insert workaround for GAS bug in assembling FLD/FSTP XWORD PTR [...]
instructions, by outputting them as bytes.
llvm-svn: 7115
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/X86/Printer.cpp | 33 | 
1 files changed, 31 insertions, 2 deletions
| diff --git a/llvm/lib/Target/X86/Printer.cpp b/llvm/lib/Target/X86/Printer.cpp index bddedc23eae..74820c8690d 100644 --- a/llvm/lib/Target/X86/Printer.cpp +++ b/llvm/lib/Target/X86/Printer.cpp @@ -1,7 +1,7 @@  //===-- X86/Printer.cpp - Convert X86 code to human readable rep. ---------===//  //  // This file contains a printer that converts from our internal representation -// of LLVM code to a nice human readable form that is suitable for debuggging. +// of LLVM code to a nice human readable form that is suitable for debugging.  //  //===----------------------------------------------------------------------===// @@ -819,7 +819,36 @@ void Printer::printMachineInstruction(const MachineInstr *MI, std::ostream &O,             isMem(MI, 0) && "Bad MRMSxM format!");      assert((MI->getNumOperands() != 5 || MI->getOperand(4).isImmediate()) &&             "Bad MRMSxM format!"); - +    // Work around GNU assembler bugs in FSTP and FLD. +    if (MI->getOpCode() == X86::FSTPr80) { +      if ((MI->getOperand(0).getReg() == X86::ESP) +	  && (MI->getOperand(1).getImmedValue() == 1)) { +	int DispVal = MI->getOperand(3).getImmedValue(); +	if ((DispVal < -128) || (DispVal > 127)) { // 4 byte disp. +          unsigned int val = (unsigned int) DispVal; +          O << ".byte 0xdb, 0xbc, 0x24\n\t"; +          O << ".long 0x" << std::hex << (unsigned) val << std::dec << "\t# "; +	} else { // 1 byte disp. +          unsigned char val = (unsigned char) DispVal; +          O << ".byte 0xdb, 0x7c, 0x24, 0x" << std::hex << (unsigned) val +            << std::dec << "\t# "; +	} +      } +    } else if (MI->getOpCode() == X86::FLDr80) { +      if ((MI->getOperand(0).getReg() == X86::ESP) +          && (MI->getOperand(1).getImmedValue() == 1)) { +	int DispVal = MI->getOperand(3).getImmedValue(); +	if ((DispVal < -128) || (DispVal > 127)) { // 4 byte disp. +          unsigned int val = (unsigned int) DispVal; +          O << ".byte 0xdb, 0xac, 0x24\n\t"; +          O << ".long 0x" << std::hex << (unsigned) val << std::dec << "\t# "; +	} else { // 1 byte disp. +          unsigned char val = (unsigned char) DispVal; +          O << ".byte 0xdb, 0x6c, 0x24, 0x" << std::hex << (unsigned) val +            << std::dec << "\t# "; +	} +      } +    }      O << TII.getName(MI->getOpCode()) << " ";      O << sizePtr(Desc) << " ";      printMemReference(O, MI, 0, RI); | 

