mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-05 13:26:55 +00:00
Recognize inline asm 'rev /bin/bash, ' as a bswap intrinsic call.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@123048 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -2071,7 +2071,6 @@ ARMBaseInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
|
||||
if (!ItinData || ItinData->isEmpty())
|
||||
return DefTID.mayLoad() ? 3 : 1;
|
||||
|
||||
|
||||
const TargetInstrDesc &UseTID = UseMI->getDesc();
|
||||
const MachineOperand &DefMO = DefMI->getOperand(DefIdx);
|
||||
if (DefMO.getReg() == ARM::CPSR) {
|
||||
|
@@ -33,6 +33,7 @@
|
||||
#include "llvm/Intrinsics.h"
|
||||
#include "llvm/Type.h"
|
||||
#include "llvm/CodeGen/CallingConvLower.h"
|
||||
#include "llvm/CodeGen/IntrinsicLowering.h"
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
@@ -43,6 +44,7 @@
|
||||
#include "llvm/MC/MCSectionMachO.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
#include "llvm/ADT/VectorExtras.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
@@ -6092,6 +6094,37 @@ void ARMTargetLowering::computeMaskedBitsForTargetNode(const SDValue Op,
|
||||
// ARM Inline Assembly Support
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
bool ARMTargetLowering::ExpandInlineAsm(CallInst *CI) const {
|
||||
// Looking for "rev" which is V6+.
|
||||
if (!Subtarget->hasV6Ops())
|
||||
return false;
|
||||
|
||||
InlineAsm *IA = cast<InlineAsm>(CI->getCalledValue());
|
||||
std::string AsmStr = IA->getAsmString();
|
||||
SmallVector<StringRef, 4> AsmPieces;
|
||||
SplitString(AsmStr, AsmPieces, ";\n");
|
||||
|
||||
switch (AsmPieces.size()) {
|
||||
default: return false;
|
||||
case 1:
|
||||
AsmStr = AsmPieces[0];
|
||||
AsmPieces.clear();
|
||||
SplitString(AsmStr, AsmPieces, " \t,");
|
||||
|
||||
// rev $0, $1
|
||||
if (AsmPieces.size() == 3 &&
|
||||
AsmPieces[0] == "rev" && AsmPieces[1] == "$0" && AsmPieces[2] == "$1" &&
|
||||
IA->getConstraintString().compare(0, 4, "=l,l") == 0) {
|
||||
const IntegerType *Ty = dyn_cast<IntegerType>(CI->getType());
|
||||
if (Ty && Ty->getBitWidth() == 32)
|
||||
return IntrinsicLowering::LowerToByteSwap(CI);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// getConstraintType - Given a constraint letter, return the type of
|
||||
/// constraint it is for this target.
|
||||
ARMTargetLowering::ConstraintType
|
||||
|
@@ -257,6 +257,8 @@ namespace llvm {
|
||||
unsigned Depth) const;
|
||||
|
||||
|
||||
virtual bool ExpandInlineAsm(CallInst *CI) const;
|
||||
|
||||
ConstraintType getConstraintType(const std::string &Constraint) const;
|
||||
|
||||
/// Examine constraint string and operand type and determine a weight value.
|
||||
|
Reference in New Issue
Block a user