Add a register bank for floating point values and select simple instructions using them (add, copies from GPR). This assumes that the hardware can cope with a single precision add (VADDS) instruction, so the legalizer will treat G_FADD as legal and the instruction selector will refuse to select if the hardware doesn't support it. In the future we'll want to be more careful about this, and legalize to libcalls if we have to use soft float. llvm-svn: 294442
57 lines
1.6 KiB
C++
57 lines
1.6 KiB
C++
//===- ARMLegalizerInfo.cpp --------------------------------------*- C++ -*-==//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
/// \file
|
|
/// This file implements the targeting of the Machinelegalizer class for ARM.
|
|
/// \todo This should be generated by TableGen.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "ARMLegalizerInfo.h"
|
|
#include "llvm/CodeGen/ValueTypes.h"
|
|
#include "llvm/IR/DerivedTypes.h"
|
|
#include "llvm/IR/Type.h"
|
|
#include "llvm/Target/TargetOpcodes.h"
|
|
|
|
using namespace llvm;
|
|
|
|
#ifndef LLVM_BUILD_GLOBAL_ISEL
|
|
#error "You shouldn't build this"
|
|
#endif
|
|
|
|
ARMLegalizerInfo::ARMLegalizerInfo() {
|
|
using namespace TargetOpcode;
|
|
|
|
const LLT p0 = LLT::pointer(0, 32);
|
|
|
|
const LLT s1 = LLT::scalar(1);
|
|
const LLT s8 = LLT::scalar(8);
|
|
const LLT s16 = LLT::scalar(16);
|
|
const LLT s32 = LLT::scalar(32);
|
|
|
|
setAction({G_FRAME_INDEX, p0}, Legal);
|
|
|
|
for (auto Ty : {s1, s8, s16, s32, p0})
|
|
setAction({G_LOAD, Ty}, Legal);
|
|
setAction({G_LOAD, 1, p0}, Legal);
|
|
|
|
for (auto Ty : {s1, s8, s16, s32})
|
|
setAction({G_ADD, Ty}, Legal);
|
|
|
|
for (unsigned Op : {G_SEXT, G_ZEXT}) {
|
|
setAction({Op, s32}, Legal);
|
|
for (auto Ty : {s1, s8, s16})
|
|
setAction({Op, 1, Ty}, Legal);
|
|
}
|
|
|
|
// FIXME: This is a bit sloppy, but for now we'll just rely on the instruction
|
|
// selector to complain if it doesn't support floating point.
|
|
setAction({G_FADD, s32}, Legal);
|
|
|
|
computeTables();
|
|
}
|