mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-22 07:32:48 +00:00
614051a1c5
Mips1 does not support double precision loads or stores, therefore two single precision loads or stores must be used in place of these instructions. This patch treats double precision loads and stores as if they are legal instructions until MCInstLowering, instead of generating the single precision instructions during instruction selection or Prolog/Epilog code insertion. Without the changes made in this patch, llc produces code that has the same problem described in r137484 or bails out when MipsInstrInfo::storeRegToStackSlot or loadRegFromStackSlot is called before register allocation. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@137711 91177308-0d34-0410-b5e6-96231b3b80d8
49 lines
1.5 KiB
C++
49 lines
1.5 KiB
C++
//===-- MipsMCInstLower.h - Lower MachineInstr to MCInst -------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef MIPSMCINSTLOWER_H
|
|
#define MIPSMCINSTLOWER_H
|
|
#include "llvm/ADT/SmallVector.h"
|
|
#include "llvm/CodeGen/MachineOperand.h"
|
|
#include "llvm/Support/Compiler.h"
|
|
|
|
namespace llvm {
|
|
class MCAsmInfo;
|
|
class MCContext;
|
|
class MCInst;
|
|
class MCOperand;
|
|
class MCSymbol;
|
|
class MachineInstr;
|
|
class MachineFunction;
|
|
class Mangler;
|
|
class MipsAsmPrinter;
|
|
|
|
/// MipsMCInstLower - This class is used to lower an MachineInstr into an
|
|
// MCInst.
|
|
class LLVM_LIBRARY_VISIBILITY MipsMCInstLower {
|
|
typedef MachineOperand::MachineOperandType MachineOperandType;
|
|
MCContext &Ctx;
|
|
Mangler *Mang;
|
|
MipsAsmPrinter &AsmPrinter;
|
|
public:
|
|
MipsMCInstLower(Mangler *mang, const MachineFunction &MF,
|
|
MipsAsmPrinter &asmprinter);
|
|
void Lower(const MachineInstr *MI, MCInst &OutMI) const;
|
|
void LowerMips1F64LoadStore(const MachineInstr *MI, unsigned Opc,
|
|
SmallVector<MCInst, 4>& MCInsts,
|
|
bool isLittle, const unsigned *SubReg) const;
|
|
private:
|
|
MCOperand LowerSymbolOperand(const MachineOperand &MO,
|
|
MachineOperandType MOTy, unsigned Offset) const;
|
|
MCOperand LowerOperand(const MachineOperand& MO) const;
|
|
};
|
|
}
|
|
|
|
#endif
|