mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-19 19:31:50 +00:00
[mips][mips64r6] Use JALR for indirect branches instead of JR (which is not available on MIPS32r6/MIPS64r6)
Summary: This completes the change to use JALR instead of JR on MIPS32r6/MIPS64r6. Reviewers: jkolek, vmedic, zoran.jovanovic, dsanders Reviewed By: dsanders Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D4269 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@212605 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7c2ef822f7
commit
f08bcb9b97
@ -1370,9 +1370,11 @@ def : Mips16Pat<(MipsJmpLink (i32 texternalsym:$dst)),
|
||||
(Jal16 texternalsym:$dst)>;
|
||||
|
||||
// Indirect branch
|
||||
def: Mips16Pat<
|
||||
(brind CPU16Regs:$rs),
|
||||
(JrcRx16 CPU16Regs:$rs)>;
|
||||
def: Mips16Pat<(brind CPU16Regs:$rs), (JrcRx16 CPU16Regs:$rs)> {
|
||||
// Ensure that the addition of MIPS32r6/MIPS64r6 support does not change
|
||||
// MIPS16's behaviour.
|
||||
let AddedComplexity = 1;
|
||||
}
|
||||
|
||||
// Jump and Link (Call)
|
||||
let isCall=1, hasDelaySlot=0 in
|
||||
|
@ -174,19 +174,20 @@ def SCD : SCBase<"scd", GPR64Opnd>, LW_FM<0x3c>, ISA_MIPS3_NOT_32R6_64R6;
|
||||
|
||||
/// Jump and Branch Instructions
|
||||
let isCodeGenOnly = 1 in {
|
||||
def JR64 : IndirectBranch<"jr", GPR64Opnd>, MTLO_FM<8>;
|
||||
def BEQ64 : CBranch<"beq", brtarget, seteq, GPR64Opnd>, BEQ_FM<4>;
|
||||
def BNE64 : CBranch<"bne", brtarget, setne, GPR64Opnd>, BEQ_FM<5>;
|
||||
def BGEZ64 : CBranchZero<"bgez", brtarget, setge, GPR64Opnd>, BGEZ_FM<1, 1>;
|
||||
def BGTZ64 : CBranchZero<"bgtz", brtarget, setgt, GPR64Opnd>, BGEZ_FM<7, 0>;
|
||||
def BLEZ64 : CBranchZero<"blez", brtarget, setle, GPR64Opnd>, BGEZ_FM<6, 0>;
|
||||
def BLTZ64 : CBranchZero<"bltz", brtarget, setlt, GPR64Opnd>, BGEZ_FM<1, 0>;
|
||||
def JALR64 : JumpLinkReg<"jalr", GPR64Opnd>, JALR_FM;
|
||||
def JALR64Pseudo : JumpLinkRegPseudo<GPR64Opnd, JALR, RA, GPR32Opnd>;
|
||||
def TAILCALL64_R : TailCallReg<GPR64Opnd, JR, GPR32Opnd>;
|
||||
def JR64 : IndirectBranch<"jr", GPR64Opnd>, MTLO_FM<8>;
|
||||
def BEQ64 : CBranch<"beq", brtarget, seteq, GPR64Opnd>, BEQ_FM<4>;
|
||||
def BNE64 : CBranch<"bne", brtarget, setne, GPR64Opnd>, BEQ_FM<5>;
|
||||
def BGEZ64 : CBranchZero<"bgez", brtarget, setge, GPR64Opnd>, BGEZ_FM<1, 1>;
|
||||
def BGTZ64 : CBranchZero<"bgtz", brtarget, setgt, GPR64Opnd>, BGEZ_FM<7, 0>;
|
||||
def BLEZ64 : CBranchZero<"blez", brtarget, setle, GPR64Opnd>, BGEZ_FM<6, 0>;
|
||||
def BLTZ64 : CBranchZero<"bltz", brtarget, setlt, GPR64Opnd>, BGEZ_FM<1, 0>;
|
||||
def JALR64 : JumpLinkReg<"jalr", GPR64Opnd>, JALR_FM;
|
||||
def JALR64Pseudo : JumpLinkRegPseudo<GPR64Opnd, JALR, RA, GPR32Opnd>;
|
||||
def TAILCALL64_R : TailCallReg<GPR64Opnd, JR, GPR32Opnd>;
|
||||
}
|
||||
|
||||
def PseudoReturn64 : PseudoReturnBase<GPR64Opnd>;
|
||||
def PseudoIndirectBranch64 : PseudoIndirectBranchBase<GPR64Opnd>;
|
||||
|
||||
/// Multiply and Divide Instructions.
|
||||
def DMULT : Mult<"dmult", II_DMULT, GPR64Opnd, [HI0_64, LO0_64]>,
|
||||
|
@ -91,10 +91,10 @@ bool MipsAsmPrinter::lowerOperand(const MachineOperand &MO, MCOperand &MCOp) {
|
||||
|
||||
#include "MipsGenMCPseudoLowering.inc"
|
||||
|
||||
void MipsAsmPrinter::emitPseudoReturn(MCStreamer &OutStreamer,
|
||||
const MachineInstr *MI) {
|
||||
// Lower PseudoReturn to JR, JR_MM, JALR, or JALR64 as appropriate for the
|
||||
// target
|
||||
// Lower PseudoReturn/PseudoIndirectBranch/PseudoIndirectBranch64 to JR, JR_MM,
|
||||
// JALR, or JALR64 as appropriate for the target
|
||||
void MipsAsmPrinter::emitPseudoIndirectBranch(MCStreamer &OutStreamer,
|
||||
const MachineInstr *MI) {
|
||||
bool HasLinkReg = false;
|
||||
MCInst TmpInst0;
|
||||
|
||||
@ -181,8 +181,10 @@ void MipsAsmPrinter::EmitInstruction(const MachineInstr *MI) {
|
||||
continue;
|
||||
|
||||
if (I->getOpcode() == Mips::PseudoReturn ||
|
||||
I->getOpcode() == Mips::PseudoReturn64) {
|
||||
emitPseudoReturn(OutStreamer, &*I);
|
||||
I->getOpcode() == Mips::PseudoReturn64 ||
|
||||
I->getOpcode() == Mips::PseudoIndirectBranch ||
|
||||
I->getOpcode() == Mips::PseudoIndirectBranch64) {
|
||||
emitPseudoIndirectBranch(OutStreamer, &*I);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -40,7 +40,11 @@ private:
|
||||
bool emitPseudoExpansionLowering(MCStreamer &OutStreamer,
|
||||
const MachineInstr *MI);
|
||||
|
||||
void emitPseudoReturn(MCStreamer &OutStreamer, const MachineInstr *MI);
|
||||
// Emit PseudoReturn, PseudoReturn64, PseudoIndirectBranch,
|
||||
// and PseudoIndirectBranch64 as a JR, JR_MM, JALR, or JALR64 as appropriate
|
||||
// for the target.
|
||||
void emitPseudoIndirectBranch(MCStreamer &OutStreamer,
|
||||
const MachineInstr *MI);
|
||||
|
||||
// lowerOperand - Convert a MachineOperand into the equivalent MCOperand.
|
||||
bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp);
|
||||
|
@ -743,8 +743,7 @@ class JumpFR<string opstr, RegisterOperand RO,
|
||||
FrmR, opstr>;
|
||||
|
||||
// Indirect branch
|
||||
class IndirectBranch<string opstr, RegisterOperand RO> :
|
||||
JumpFR<opstr, RO, brind> {
|
||||
class IndirectBranch<string opstr, RegisterOperand RO> : JumpFR<opstr, RO> {
|
||||
let isBranch = 1;
|
||||
let isIndirectBranch = 1;
|
||||
}
|
||||
@ -1221,9 +1220,23 @@ def BAL_BR : BAL_BR_Pseudo<BGEZAL>;
|
||||
def TAILCALL : TailCall<J>;
|
||||
def TAILCALL_R : TailCallReg<GPR32Opnd, JR>;
|
||||
|
||||
// Return instruction
|
||||
// RetRA is expanded into this after register allocation and then MipsAsmPrinter
|
||||
// expands this into JR, or JALR depending on the ISA.
|
||||
// Indirect branches are matched as PseudoIndirectBranch/PseudoIndirectBranch64
|
||||
// then are expanded to JR, JR64, JALR, or JALR64 depending on the ISA.
|
||||
class PseudoIndirectBranchBase<RegisterOperand RO> :
|
||||
MipsPseudo<(outs), (ins RO:$rs), [(brind RO:$rs)], IIBranch> {
|
||||
let isTerminator=1;
|
||||
let isBarrier=1;
|
||||
let hasDelaySlot = 1;
|
||||
let isBranch = 1;
|
||||
let isIndirectBranch = 1;
|
||||
}
|
||||
|
||||
def PseudoIndirectBranch : PseudoIndirectBranchBase<GPR32Opnd>;
|
||||
|
||||
// Return instructions are matched as a RetRA instruction, then ar expanded
|
||||
// into PseudoReturn/PseudoReturn64 after register allocation. Finally,
|
||||
// MipsAsmPrinter expands this into JR, JR64, JALR, or JALR64 depending on the
|
||||
// ISA.
|
||||
class PseudoReturnBase<RegisterOperand RO> : MipsPseudo<(outs), (ins RO:$rs),
|
||||
[], IIBranch> {
|
||||
let isTerminator = 1;
|
||||
|
@ -3,8 +3,11 @@
|
||||
; FIXME: We should remove the need for -enable-mips-tail-calls
|
||||
; RUN: llc -march=mips -mcpu=mips32 -enable-mips-tail-calls < %s | FileCheck %s -check-prefix=ALL -check-prefix=O32
|
||||
; RUN: llc -march=mips -mcpu=mips32r2 -enable-mips-tail-calls < %s | FileCheck %s -check-prefix=ALL -check-prefix=O32
|
||||
; RUN: llc -march=mips -mcpu=mips32r6 -enable-mips-tail-calls < %s | FileCheck %s -check-prefix=ALL -check-prefix=O32
|
||||
; RUN: llc -march=mips64 -mcpu=mips4 -enable-mips-tail-calls < %s | FileCheck %s -check-prefix=ALL -check-prefix=N64
|
||||
; RUN: llc -march=mips64 -mcpu=mips64 -enable-mips-tail-calls < %s | FileCheck %s -check-prefix=ALL -check-prefix=N64
|
||||
; RUN: llc -march=mips64 -mcpu=mips64r2 -enable-mips-tail-calls < %s | FileCheck %s -check-prefix=ALL -check-prefix=N64
|
||||
; RUN: llc -march=mips64 -mcpu=mips64r6 -enable-mips-tail-calls < %s | FileCheck %s -check-prefix=ALL -check-prefix=N64
|
||||
|
||||
declare void @extern_void_void()
|
||||
declare i32 @extern_i32_void()
|
||||
@ -63,7 +66,8 @@ define void @musttail_call_void_void() {
|
||||
|
||||
; N64: ld $[[TGT:[0-9]+]], %call16(extern_void_void)($gp)
|
||||
|
||||
; ALL: jr $[[TGT]]
|
||||
; NOT-R6: jr $[[TGT]]
|
||||
; R6: r6.jr $[[TGT]]
|
||||
|
||||
musttail call void @extern_void_void()
|
||||
ret void
|
||||
@ -76,7 +80,8 @@ define i32 @musttail_call_i32_void() {
|
||||
|
||||
; N64: ld $[[TGT:[0-9]+]], %call16(extern_i32_void)($gp)
|
||||
|
||||
; ALL: jr $[[TGT]]
|
||||
; NOT-R6: jr $[[TGT]]
|
||||
; R6: r6.jr $[[TGT]]
|
||||
|
||||
%1 = musttail call i32 @extern_i32_void()
|
||||
ret i32 %1
|
||||
@ -89,7 +94,8 @@ define float @musttail_call_float_void() {
|
||||
|
||||
; N64: ld $[[TGT:[0-9]+]], %call16(extern_float_void)($gp)
|
||||
|
||||
; ALL: jr $[[TGT]]
|
||||
; NOT-R6: jr $[[TGT]]
|
||||
; R6: r6.jr $[[TGT]]
|
||||
|
||||
%1 = musttail call float @extern_float_void()
|
||||
ret float %1
|
||||
|
@ -1,19 +1,26 @@
|
||||
; Test all important variants of the unconditional 'br' instruction.
|
||||
|
||||
; RUN: llc -march=mips -mcpu=mips32 < %s | FileCheck %s -check-prefix=ALL
|
||||
; RUN: llc -march=mips -mcpu=mips32r2 < %s | FileCheck %s -check-prefix=ALL
|
||||
; RUN: llc -march=mips64 -mcpu=mips4 < %s | FileCheck %s -check-prefix=ALL
|
||||
; RUN: llc -march=mips64 -mcpu=mips64 < %s | FileCheck %s -check-prefix=ALL
|
||||
; RUN: llc -march=mips64 -mcpu=mips64r2 < %s | FileCheck %s -check-prefix=ALL
|
||||
; RUN: llc -march=mips -mcpu=mips32 -asm-show-inst < %s | FileCheck %s -check-prefix=ALL -check-prefix=NOT-R6
|
||||
; RUN: llc -march=mips -mcpu=mips32r2 -asm-show-inst < %s | FileCheck %s -check-prefix=ALL -check-prefix=NOT-R6
|
||||
; RUN: llc -march=mips -mcpu=mips32r6 -asm-show-inst < %s | FileCheck %s -check-prefix=ALL -check-prefix=R6
|
||||
; RUN: llc -march=mips64 -mcpu=mips4 -asm-show-inst < %s | FileCheck %s -check-prefix=ALL -check-prefix=NOT-R6
|
||||
; RUN: llc -march=mips64 -mcpu=mips64 -asm-show-inst < %s | FileCheck %s -check-prefix=ALL -check-prefix=NOT-R6
|
||||
; RUN: llc -march=mips64 -mcpu=mips64r2 -asm-show-inst < %s | FileCheck %s -check-prefix=ALL -check-prefix=NOT-R6
|
||||
; RUN: llc -march=mips64 -mcpu=mips64r6 -asm-show-inst < %s | FileCheck %s -check-prefix=ALL -check-prefix=R6
|
||||
|
||||
define i32 @br(i8 *%addr) {
|
||||
; ALL-LABEL: br:
|
||||
; ALL: jr $4
|
||||
; NOT-R6: jr $4 # <MCInst #{{[0-9]+}} JR
|
||||
; R6: jr $4 # <MCInst #{{[0-9]+}} JALR
|
||||
|
||||
; ALL: $BB0_1: # %L1
|
||||
; ALL: jr $ra
|
||||
; NOT-R6: jr $ra # <MCInst #{{[0-9]+}} JR
|
||||
; R6: jr $ra # <MCInst #{{[0-9]+}} JALR
|
||||
; ALL: addiu $2, $zero, 0
|
||||
|
||||
; ALL: $BB0_2: # %L2
|
||||
; ALL: jr $ra
|
||||
; NOT-R6: jr $ra # <MCInst #{{[0-9]+}} JR
|
||||
; R6: jr $ra # <MCInst #{{[0-9]+}} JALR
|
||||
; ALL: addiu $2, $zero, 1
|
||||
|
||||
entry:
|
||||
|
Loading…
x
Reference in New Issue
Block a user