From: Brian Gaeke Date: Mon, 7 Jul 2003 18:34:20 +0000 (+0000) Subject: Insert workaround for GAS bug in assembling FLD/FSTP XWORD PTR [...] X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=b44210d768fa677d63e5b1e098148bcddb2c92ff;p=oota-llvm.git Insert workaround for GAS bug in assembling FLD/FSTP XWORD PTR [...] instructions, by outputting them as bytes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7115 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/Printer.cpp b/lib/Target/X86/Printer.cpp index bddedc23eae..74820c8690d 100644 --- a/lib/Target/X86/Printer.cpp +++ b/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); diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp index bddedc23eae..74820c8690d 100644 --- a/lib/Target/X86/X86AsmPrinter.cpp +++ b/lib/Target/X86/X86AsmPrinter.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);