mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[WebAssembly] Skeleton FastISel support
llvm-svn: 245860
This commit is contained in:
parent
f5801bed38
commit
8b7eda5ae3
@ -419,8 +419,14 @@ protected:
|
||||
const TargetRegisterClass *RC, unsigned Op0,
|
||||
bool Op0IsKill, uint64_t Imm1, uint64_t Imm2);
|
||||
|
||||
/// \brief Emit a MachineInstr with two register operands and a result
|
||||
/// \brief Emit a MachineInstr with a floating point immediate, and a result
|
||||
/// register in the given register class.
|
||||
unsigned fastEmitInst_f(unsigned MachineInstOpcode,
|
||||
const TargetRegisterClass *RC,
|
||||
const ConstantFP *FPImm);
|
||||
|
||||
/// \brief Emit a MachineInstr with one register operand, a floating point
|
||||
/// immediate, and a result register in the given register class.
|
||||
unsigned fastEmitInst_rf(unsigned MachineInstOpcode,
|
||||
const TargetRegisterClass *RC, unsigned Op0,
|
||||
bool Op0IsKill, const ConstantFP *FPImm);
|
||||
|
@ -1867,6 +1867,25 @@ unsigned FastISel::fastEmitInst_rii(unsigned MachineInstOpcode,
|
||||
return ResultReg;
|
||||
}
|
||||
|
||||
unsigned FastISel::fastEmitInst_f(unsigned MachineInstOpcode,
|
||||
const TargetRegisterClass *RC,
|
||||
const ConstantFP *FPImm) {
|
||||
const MCInstrDesc &II = TII.get(MachineInstOpcode);
|
||||
|
||||
unsigned ResultReg = createResultReg(RC);
|
||||
|
||||
if (II.getNumDefs() >= 1)
|
||||
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II, ResultReg)
|
||||
.addFPImm(FPImm);
|
||||
else {
|
||||
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, II)
|
||||
.addFPImm(FPImm);
|
||||
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc,
|
||||
TII.get(TargetOpcode::COPY), ResultReg).addReg(II.ImplicitDefs[0]);
|
||||
}
|
||||
return ResultReg;
|
||||
}
|
||||
|
||||
unsigned FastISel::fastEmitInst_rf(unsigned MachineInstOpcode,
|
||||
const TargetRegisterClass *RC, unsigned Op0,
|
||||
bool Op0IsKill, const ConstantFP *FPImm) {
|
||||
|
@ -2,6 +2,7 @@ set(LLVM_TARGET_DEFINITIONS WebAssembly.td)
|
||||
|
||||
tablegen(LLVM WebAssemblyGenAsmWriter.inc -gen-asm-writer)
|
||||
tablegen(LLVM WebAssemblyGenDAGISel.inc -gen-dag-isel)
|
||||
tablegen(LLVM WebAssemblyGenFastISel.inc -gen-fast-isel)
|
||||
tablegen(LLVM WebAssemblyGenInstrInfo.inc -gen-instr-info)
|
||||
tablegen(LLVM WebAssemblyGenMCCodeEmitter.inc -gen-emitter)
|
||||
tablegen(LLVM WebAssemblyGenRegisterInfo.inc -gen-register-info)
|
||||
@ -11,6 +12,7 @@ add_public_tablegen_target(WebAssemblyCommonTableGen)
|
||||
add_llvm_target(WebAssemblyCodeGen
|
||||
Relooper.cpp
|
||||
WebAssemblyAsmPrinter.cpp
|
||||
WebAssemblyFastISel.cpp
|
||||
WebAssemblyFrameLowering.cpp
|
||||
WebAssemblyISelDAGToDAG.cpp
|
||||
WebAssemblyISelLowering.cpp
|
||||
|
@ -15,6 +15,7 @@ TARGET = WebAssembly
|
||||
BUILT_SOURCES = \
|
||||
WebAssemblyGenAsmWriter.inc \
|
||||
WebAssemblyGenDAGISel.inc \
|
||||
WebAssemblyGenFastISel.inc \
|
||||
WebAssemblyGenInstrInfo.inc \
|
||||
WebAssemblyGenMCCodeEmitter.inc \
|
||||
WebAssemblyGenRegisterInfo.inc \
|
||||
|
81
lib/Target/WebAssembly/WebAssemblyFastISel.cpp
Normal file
81
lib/Target/WebAssembly/WebAssemblyFastISel.cpp
Normal file
@ -0,0 +1,81 @@
|
||||
//===-- WebAssemblyFastISel.cpp - WebAssembly FastISel implementation -----===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
///
|
||||
/// \file
|
||||
/// \brief This file defines the WebAssembly-specific support for the FastISel
|
||||
/// class. Some of the target-specific code is generated by tablegen in the file
|
||||
/// WebAssemblyGenFastISel.inc, which is #included here.
|
||||
///
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "WebAssembly.h"
|
||||
#include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
|
||||
#include "WebAssemblySubtarget.h"
|
||||
#include "WebAssemblyTargetMachine.h"
|
||||
#include "llvm/Analysis/BranchProbabilityInfo.h"
|
||||
#include "llvm/CodeGen/FastISel.h"
|
||||
#include "llvm/CodeGen/FunctionLoweringInfo.h"
|
||||
#include "llvm/CodeGen/MachineConstantPool.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/IR/DerivedTypes.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/GetElementPtrTypeIterator.h"
|
||||
#include "llvm/IR/GlobalAlias.h"
|
||||
#include "llvm/IR/GlobalVariable.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/IntrinsicInst.h"
|
||||
#include "llvm/IR/Operator.h"
|
||||
using namespace llvm;
|
||||
|
||||
#define DEBUG_TYPE "wasm-fastisel"
|
||||
|
||||
namespace {
|
||||
|
||||
class WebAssemblyFastISel final : public FastISel {
|
||||
/// Keep a pointer to the WebAssemblySubtarget around so that we can make the
|
||||
/// right decision when generating code for different targets.
|
||||
const WebAssemblySubtarget *Subtarget;
|
||||
LLVMContext *Context;
|
||||
|
||||
// Call handling routines.
|
||||
private:
|
||||
public:
|
||||
// Backend specific FastISel code.
|
||||
WebAssemblyFastISel(FunctionLoweringInfo &FuncInfo,
|
||||
const TargetLibraryInfo *LibInfo)
|
||||
: FastISel(FuncInfo, LibInfo, /*SkipTargetIndependentISel=*/true) {
|
||||
Subtarget = &FuncInfo.MF->getSubtarget<WebAssemblySubtarget>();
|
||||
Context = &FuncInfo.Fn->getContext();
|
||||
}
|
||||
|
||||
bool fastSelectInstruction(const Instruction *I) override;
|
||||
|
||||
#include "WebAssemblyGenFastISel.inc"
|
||||
};
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
bool WebAssemblyFastISel::fastSelectInstruction(const Instruction *I) {
|
||||
switch (I->getOpcode()) {
|
||||
default:
|
||||
break;
|
||||
// TODO: add fast-isel selection cases here...
|
||||
}
|
||||
|
||||
// Fall back to target-independent instruction selection.
|
||||
return selectOperator(I, I->getOpcode());
|
||||
}
|
||||
|
||||
FastISel *WebAssembly::createFastISel(FunctionLoweringInfo &FuncInfo,
|
||||
const TargetLibraryInfo *LibInfo) {
|
||||
return new WebAssemblyFastISel(FuncInfo, LibInfo);
|
||||
}
|
@ -151,6 +151,11 @@ WebAssemblyTargetLowering::WebAssemblyTargetLowering(
|
||||
setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i32, Expand);
|
||||
}
|
||||
|
||||
FastISel *WebAssemblyTargetLowering::createFastISel(
|
||||
FunctionLoweringInfo &FuncInfo, const TargetLibraryInfo *LibInfo) const {
|
||||
return WebAssembly::createFastISel(FuncInfo, LibInfo);
|
||||
}
|
||||
|
||||
MVT WebAssemblyTargetLowering::getScalarShiftAmountTy(const DataLayout &DL,
|
||||
EVT VT) const {
|
||||
return VT.getSimpleVT();
|
||||
|
@ -45,6 +45,9 @@ private:
|
||||
/// right decision when generating code for different targets.
|
||||
const WebAssemblySubtarget *Subtarget;
|
||||
|
||||
FastISel *createFastISel(FunctionLoweringInfo &FuncInfo,
|
||||
const TargetLibraryInfo *LibInfo) const override;
|
||||
|
||||
MVT getScalarShiftAmountTy(const DataLayout &DL, EVT) const override;
|
||||
|
||||
const char *getTargetNodeName(unsigned Opcode) const override;
|
||||
@ -66,6 +69,11 @@ private:
|
||||
SmallVectorImpl<SDValue> &InVals) const override;
|
||||
};
|
||||
|
||||
namespace WebAssembly {
|
||||
FastISel *createFastISel(FunctionLoweringInfo &funcInfo,
|
||||
const TargetLibraryInfo *libInfo);
|
||||
} // end namespace WebAssembly
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
||||
|
20
test/CodeGen/WebAssembly/fast-isel.ll
Normal file
20
test/CodeGen/WebAssembly/fast-isel.ll
Normal file
@ -0,0 +1,20 @@
|
||||
; RUN: llc < %s -asm-verbose=false \
|
||||
; RUN: -fast-isel -fast-isel-abort=1 -verify-machineinstrs \
|
||||
; RUN: | FileCheck %s
|
||||
|
||||
target datalayout = "e-p:32:32-i64:64-n32:64-S128"
|
||||
target triple = "wasm32-unknown-unknown"
|
||||
|
||||
; This tests very minimal fast-isel functionality.
|
||||
|
||||
; CHECK-LABEL: immediate_f32
|
||||
; CHECK: (immediate 0x1.4p1)
|
||||
define float @immediate_f32() {
|
||||
ret float 2.5
|
||||
}
|
||||
|
||||
; CHECK-LABEL: immediate_f64
|
||||
; CHECK: (immediate 0x1.4p1)
|
||||
define double @immediate_f64() {
|
||||
ret double 2.5
|
||||
}
|
Loading…
Reference in New Issue
Block a user