mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-03 14:21:30 +00:00 
			
		
		
		
	Using AA during CodeGen is very useful for in-order cores. It is less useful for ooo cores. Also I find enabling useAA for Cortex-A57 may generate worse code for some test cases. If useAA in codegen is improved and benefical for ooo cores, we can enable it again. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222333 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			151 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//===--- AArch64Subtarget.h - Define Subtarget for the AArch64 -*- C++ -*--===//
 | 
						|
//
 | 
						|
//                     The LLVM Compiler Infrastructure
 | 
						|
//
 | 
						|
// This file is distributed under the University of Illinois Open Source
 | 
						|
// License. See LICENSE.TXT for details.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
//
 | 
						|
// This file declares the AArch64 specific subclass of TargetSubtarget.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#ifndef LLVM_LIB_TARGET_AARCH64_AARCH64SUBTARGET_H
 | 
						|
#define LLVM_LIB_TARGET_AARCH64_AARCH64SUBTARGET_H
 | 
						|
 | 
						|
#include "AArch64FrameLowering.h"
 | 
						|
#include "AArch64ISelLowering.h"
 | 
						|
#include "AArch64InstrInfo.h"
 | 
						|
#include "AArch64RegisterInfo.h"
 | 
						|
#include "AArch64SelectionDAGInfo.h"
 | 
						|
#include "llvm/IR/DataLayout.h"
 | 
						|
#include "llvm/Target/TargetSubtargetInfo.h"
 | 
						|
#include <string>
 | 
						|
 | 
						|
#define GET_SUBTARGETINFO_HEADER
 | 
						|
#include "AArch64GenSubtargetInfo.inc"
 | 
						|
 | 
						|
namespace llvm {
 | 
						|
class GlobalValue;
 | 
						|
class StringRef;
 | 
						|
 | 
						|
class AArch64Subtarget : public AArch64GenSubtargetInfo {
 | 
						|
protected:
 | 
						|
  enum ARMProcFamilyEnum {Others, CortexA53, CortexA57, Cyclone};
 | 
						|
 | 
						|
  /// ARMProcFamily - ARM processor family: Cortex-A53, Cortex-A57, and others.
 | 
						|
  ARMProcFamilyEnum ARMProcFamily;
 | 
						|
 | 
						|
  bool HasFPARMv8;
 | 
						|
  bool HasNEON;
 | 
						|
  bool HasCrypto;
 | 
						|
  bool HasCRC;
 | 
						|
 | 
						|
  // HasZeroCycleRegMove - Has zero-cycle register mov instructions.
 | 
						|
  bool HasZeroCycleRegMove;
 | 
						|
 | 
						|
  // HasZeroCycleZeroing - Has zero-cycle zeroing instructions.
 | 
						|
  bool HasZeroCycleZeroing;
 | 
						|
 | 
						|
  /// CPUString - String name of used CPU.
 | 
						|
  std::string CPUString;
 | 
						|
 | 
						|
  /// TargetTriple - What processor and OS we're targeting.
 | 
						|
  Triple TargetTriple;
 | 
						|
 | 
						|
  const DataLayout DL;
 | 
						|
  AArch64FrameLowering FrameLowering;
 | 
						|
  AArch64InstrInfo InstrInfo;
 | 
						|
  AArch64SelectionDAGInfo TSInfo;
 | 
						|
  AArch64TargetLowering TLInfo;
 | 
						|
private:
 | 
						|
  /// initializeSubtargetDependencies - Initializes using CPUString and the
 | 
						|
  /// passed in feature string so that we can use initializer lists for
 | 
						|
  /// subtarget initialization.
 | 
						|
  AArch64Subtarget &initializeSubtargetDependencies(StringRef FS);
 | 
						|
 | 
						|
public:
 | 
						|
  /// This constructor initializes the data members to match that
 | 
						|
  /// of the specified triple.
 | 
						|
  AArch64Subtarget(const std::string &TT, const std::string &CPU,
 | 
						|
                   const std::string &FS, const TargetMachine &TM,
 | 
						|
                   bool LittleEndian);
 | 
						|
 | 
						|
  const AArch64SelectionDAGInfo *getSelectionDAGInfo() const override {
 | 
						|
    return &TSInfo;
 | 
						|
  }
 | 
						|
  const AArch64FrameLowering *getFrameLowering() const override {
 | 
						|
    return &FrameLowering;
 | 
						|
  }
 | 
						|
  const AArch64TargetLowering *getTargetLowering() const override {
 | 
						|
    return &TLInfo;
 | 
						|
  }
 | 
						|
  const AArch64InstrInfo *getInstrInfo() const override { return &InstrInfo; }
 | 
						|
  const DataLayout *getDataLayout() const override { return &DL; }
 | 
						|
  const AArch64RegisterInfo *getRegisterInfo() const override {
 | 
						|
    return &getInstrInfo()->getRegisterInfo();
 | 
						|
  }
 | 
						|
  bool enableMachineScheduler() const override { return true; }
 | 
						|
  bool enablePostMachineScheduler() const override {
 | 
						|
    return isCortexA53() || isCortexA57();
 | 
						|
  }
 | 
						|
 | 
						|
  bool hasZeroCycleRegMove() const { return HasZeroCycleRegMove; }
 | 
						|
 | 
						|
  bool hasZeroCycleZeroing() const { return HasZeroCycleZeroing; }
 | 
						|
 | 
						|
  bool hasFPARMv8() const { return HasFPARMv8; }
 | 
						|
  bool hasNEON() const { return HasNEON; }
 | 
						|
  bool hasCrypto() const { return HasCrypto; }
 | 
						|
  bool hasCRC() const { return HasCRC; }
 | 
						|
 | 
						|
  bool isLittleEndian() const { return DL.isLittleEndian(); }
 | 
						|
 | 
						|
  bool isTargetDarwin() const { return TargetTriple.isOSDarwin(); }
 | 
						|
  bool isTargetIOS() const { return TargetTriple.isiOS(); }
 | 
						|
  bool isTargetLinux() const { return TargetTriple.isOSLinux(); }
 | 
						|
  bool isTargetWindows() const { return TargetTriple.isOSWindows(); }
 | 
						|
 | 
						|
  bool isTargetCOFF() const { return TargetTriple.isOSBinFormatCOFF(); }
 | 
						|
  bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); }
 | 
						|
  bool isTargetMachO() const { return TargetTriple.isOSBinFormatMachO(); }
 | 
						|
 | 
						|
  bool isCyclone() const { return CPUString == "cyclone"; }
 | 
						|
  bool isCortexA57() const { return CPUString == "cortex-a57"; }
 | 
						|
  bool isCortexA53() const { return CPUString == "cortex-a53"; }
 | 
						|
 | 
						|
  bool useAA() const override { return isCortexA53(); }
 | 
						|
 | 
						|
  /// getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size
 | 
						|
  /// that still makes it profitable to inline the call.
 | 
						|
  unsigned getMaxInlineSizeThreshold() const { return 64; }
 | 
						|
 | 
						|
  /// ParseSubtargetFeatures - Parses features string setting specified
 | 
						|
  /// subtarget options.  Definition of function is auto generated by tblgen.
 | 
						|
  void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
 | 
						|
 | 
						|
  /// ClassifyGlobalReference - Find the target operand flags that describe
 | 
						|
  /// how a global value should be referenced for the current subtarget.
 | 
						|
  unsigned char ClassifyGlobalReference(const GlobalValue *GV,
 | 
						|
                                        const TargetMachine &TM) const;
 | 
						|
 | 
						|
  /// This function returns the name of a function which has an interface
 | 
						|
  /// like the non-standard bzero function, if such a function exists on
 | 
						|
  /// the current subtarget and it is considered prefereable over
 | 
						|
  /// memset with zero passed as the second argument. Otherwise it
 | 
						|
  /// returns null.
 | 
						|
  const char *getBZeroEntry() const;
 | 
						|
 | 
						|
  void overrideSchedPolicy(MachineSchedPolicy &Policy, MachineInstr *begin,
 | 
						|
                           MachineInstr *end,
 | 
						|
                           unsigned NumRegionInstrs) const override;
 | 
						|
 | 
						|
  bool enableEarlyIfConversion() const override;
 | 
						|
 | 
						|
  std::unique_ptr<PBQPRAConstraint> getCustomPBQPConstraints() const override;
 | 
						|
};
 | 
						|
} // End llvm namespace
 | 
						|
 | 
						|
#endif
 |