18f5e8c1cd69fa77bea20140a7132ee2dea166c6dJia Liu//===-- MipsAnalyzeImmediate.h - Analyze Immediates ------------*- C++ -*--===// 2dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka// 3dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka// The LLVM Compiler Infrastructure 4dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka// 5dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka// This file is distributed under the University of Illinois Open Source 6dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka// License. See LICENSE.TXT for details. 7dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka// 8dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka//===----------------------------------------------------------------------===// 9dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka#ifndef MIPS_ANALYZE_IMMEDIATE_H 10dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka#define MIPS_ANALYZE_IMMEDIATE_H 11dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka 12dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka#include "llvm/ADT/SmallVector.h" 1350da3cb0f895c7fdf958c9fb86f6b8f9b9d4321fNAKAMURA Takumi#include "llvm/Support/DataTypes.h" 14dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka 15dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanakanamespace llvm { 16dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka 17dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka class MipsAnalyzeImmediate { 18dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka public: 19dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka struct Inst { 20dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka unsigned Opc, ImmOpnd; 21dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka Inst(unsigned Opc, unsigned ImmOpnd); 22dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka }; 23dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka typedef SmallVector<Inst, 7 > InstSeq; 24dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka 253f4f420ab7acb10221ba971543a7eed5489fb626Robert Wilhelm /// Analyze - Get an instruction sequence to load immediate Imm. The last 26dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka /// instruction in the sequence must be an ADDiu if LastInstrIsADDiu is 27dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka /// true; 28e38ec24758bf88f68159ced232c371ffe031de00Ahmed Charles const InstSeq &Analyze(uint64_t Imm, unsigned Size, bool LastInstrIsADDiu); 29dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka private: 30dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka typedef SmallVector<InstSeq, 5> InstSeqLs; 31dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka 32dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka /// AddInstr - Add I to all instruction sequences in SeqLs. 33dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka void AddInstr(InstSeqLs &SeqLs, const Inst &I); 34dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka 353f4f420ab7acb10221ba971543a7eed5489fb626Robert Wilhelm /// GetInstSeqLsADDiu - Get instruction sequences which end with an ADDiu to 36dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka /// load immediate Imm 37e38ec24758bf88f68159ced232c371ffe031de00Ahmed Charles void GetInstSeqLsADDiu(uint64_t Imm, unsigned RemSize, InstSeqLs &SeqLs); 38dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka 393f4f420ab7acb10221ba971543a7eed5489fb626Robert Wilhelm /// GetInstSeqLsORi - Get instrutcion sequences which end with an ORi to 40dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka /// load immediate Imm 41e38ec24758bf88f68159ced232c371ffe031de00Ahmed Charles void GetInstSeqLsORi(uint64_t Imm, unsigned RemSize, InstSeqLs &SeqLs); 42dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka 433f4f420ab7acb10221ba971543a7eed5489fb626Robert Wilhelm /// GetInstSeqLsSLL - Get instruction sequences which end with a SLL to 44dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka /// load immediate Imm 45e38ec24758bf88f68159ced232c371ffe031de00Ahmed Charles void GetInstSeqLsSLL(uint64_t Imm, unsigned RemSize, InstSeqLs &SeqLs); 46dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka 473f4f420ab7acb10221ba971543a7eed5489fb626Robert Wilhelm /// GetInstSeqLs - Get instruction sequences to load immediate Imm. 48e38ec24758bf88f68159ced232c371ffe031de00Ahmed Charles void GetInstSeqLs(uint64_t Imm, unsigned RemSize, InstSeqLs &SeqLs); 49dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka 50dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka /// ReplaceADDiuSLLWithLUi - Replace an ADDiu & SLL pair with a LUi. 51dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka void ReplaceADDiuSLLWithLUi(InstSeq &Seq); 52dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka 53dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka /// GetShortestSeq - Find the shortest instruction sequence in SeqLs and 54bb481f882093fb738d2bb15610c79364bada5496Jia Liu /// return it in Insts. 55dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka void GetShortestSeq(InstSeqLs &SeqLs, InstSeq &Insts); 56dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka 57dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka unsigned Size; 58dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka unsigned ADDiu, ORi, SLL, LUi; 59dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka InstSeq Insts; 60dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka }; 61dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka} 62dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka 63dc81eae9d276b83b5d5e2f9b53ddbd5267cfcb8eAkira Hatanaka#endif 64