82 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- 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);
 | |
| }
 |