Logic to load 32-bit and 64-bit immediates is currently present in RISCVAsmParser::emitLoadImm in order to support the li pseudoinstruction. With the introduction of RV64 codegen, there is a greater benefit of sharing immediate materialisation logic between the MC layer and codegen. The generateInstSeq helper allows this by producing a vector of simple structs representing the chosen instructions. This can then be consumed in the MC layer to produce MCInsts or at instruction selection time to produce appropriate SelectionDAG node. Sharing this logic means that both the li pseudoinstruction and codegen can benefit from future optimisations, and that this logic can be used for materialising constants during RV64 codegen. This patch does contain a behaviour change: addi will now be produced on RV64 when no lui is necessary to materialise the constant. In that case addiw takes x0 as the source register, so is semantically identical to addi. Differential Revision: https://reviews.llvm.org/D52961 llvm-svn: 346937
37 lines
1.1 KiB
C++
37 lines
1.1 KiB
C++
//===- RISCVMatInt.h - Immediate materialisation ---------------*- C++ -*--===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_RISCV_MATINT_H
|
|
#define LLVM_LIB_TARGET_RISCV_MATINT_H
|
|
|
|
#include "llvm/ADT/SmallVector.h"
|
|
#include "llvm/Support/MachineValueType.h"
|
|
#include <cstdint>
|
|
|
|
namespace llvm {
|
|
|
|
namespace RISCVMatInt {
|
|
struct Inst {
|
|
unsigned Opc;
|
|
int64_t Imm;
|
|
|
|
Inst(unsigned Opc, int64_t Imm) : Opc(Opc), Imm(Imm) {}
|
|
};
|
|
using InstSeq = SmallVector<Inst, 8>;
|
|
|
|
// Helper to generate an instruction sequence that will materialise the given
|
|
// immediate value into a register. A sequence of instructions represented by
|
|
// a simple struct produced rather than directly emitting the instructions in
|
|
// order to allow this helper to be used from both the MC layer and during
|
|
// instruction selection.
|
|
void generateInstSeq(int64_t Val, bool IsRV64, InstSeq &Res);
|
|
} // namespace RISCVMatInt
|
|
} // namespace llvm
|
|
#endif
|