From df98a7a34dde36bda1c82fa924be52c7becbcdb2 Mon Sep 17 00:00:00 2001 From: Akira Hatanaka Date: Thu, 24 May 2012 18:32:33 +0000 Subject: [PATCH] Enable Mips16 compiler to compile a null program. First code from the Mips16 compiler. Includes trivial test program. Patch by Reed Kotler. llvm-svn: 157408 --- llvm/lib/Target/Mips/Mips16InstrFormats.td | 4 ++-- llvm/lib/Target/Mips/Mips16InstrInfo.td | 18 ++++++++++++++++++ llvm/lib/Target/Mips/MipsInstrInfo.td | 11 +++++++---- llvm/lib/Target/Mips/MipsRegisterInfo.td | 2 ++ llvm/test/CodeGen/Mips/null.ll | 10 ++++++++++ 5 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 llvm/lib/Target/Mips/Mips16InstrInfo.td create mode 100644 llvm/test/CodeGen/Mips/null.ll diff --git a/llvm/lib/Target/Mips/Mips16InstrFormats.td b/llvm/lib/Target/Mips/Mips16InstrFormats.td index 4fec546..3672ea8 100644 --- a/llvm/lib/Target/Mips/Mips16InstrFormats.td +++ b/llvm/lib/Target/Mips/Mips16InstrFormats.td @@ -173,7 +173,7 @@ class FRI16 op, dag outs, dag ins, string asmstr, // Format RR instruction class in Mips : <|opcode|rx|ry|funct|> //===----------------------------------------------------------------------===// -class FRR16 op, bits<5> _funct, dag outs, dag ins, string asmstr, +class FRR16 _funct, dag outs, dag ins, string asmstr, list pattern, InstrItinClass itin>: MipsInst16 { @@ -181,7 +181,7 @@ class FRR16 op, bits<5> _funct, dag outs, dag ins, string asmstr, bits<3> ry; bits<5> funct; - let Opcode = op; + let Opcode = 0b11101; let funct = _funct; let Inst{10-8} = rx; diff --git a/llvm/lib/Target/Mips/Mips16InstrInfo.td b/llvm/lib/Target/Mips/Mips16InstrInfo.td new file mode 100644 index 0000000..7cbf2d4 --- /dev/null +++ b/llvm/lib/Target/Mips/Mips16InstrInfo.td @@ -0,0 +1,18 @@ +//===- Mips16InstrInfo.td - Target Description for Mips16 -*- tablegen -*-=// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file describes Mips16 instructions. +// +//===----------------------------------------------------------------------===// + +let isReturn=1, isTerminator=1, hasDelaySlot=1, isCodeGenOnly=1, + isBarrier=1, hasCtrlDep=1, rx=0b000, ry=0b001 in +def RET16 : FRR16 <0, (outs), (ins CPURAReg:$target), + "jr\t$target", [(MipsRet CPURAReg:$target)], IIBranch>, + Requires<[InMips16Mode]>; diff --git a/llvm/lib/Target/Mips/MipsInstrInfo.td b/llvm/lib/Target/Mips/MipsInstrInfo.td index 6050d9a..d2a4387 100644 --- a/llvm/lib/Target/Mips/MipsInstrInfo.td +++ b/llvm/lib/Target/Mips/MipsInstrInfo.td @@ -140,6 +140,8 @@ def IsN64 : Predicate<"Subtarget.isABI_N64()">, AssemblerPredicate<"FeatureN64">; def NotN64 : Predicate<"!Subtarget.isABI_N64()">, AssemblerPredicate<"!FeatureN64">; +def InMips16Mode : Predicate<"Subtarget.inMips16Mode()">, + AssemblerPredicate<"FeatureMips16">; def RelocStatic : Predicate<"TM.getRelocationModel() == Reloc::Static">, AssemblerPredicate<"FeatureMips32">; def RelocPIC : Predicate<"TM.getRelocationModel() == Reloc::PIC_">, @@ -147,8 +149,8 @@ def RelocPIC : Predicate<"TM.getRelocationModel() == Reloc::PIC_">, def NoNaNsFPMath : Predicate<"TM.Options.NoNaNsFPMath">, AssemblerPredicate<"FeatureMips32">; def HasStandardEncoding: - Predicate<"Subtarget.hasStandardEncoding()">, - AssemblerPredicate<"FeatureMips32,FeatureMips32r2,FeatureMips64"> ; + Predicate<"Subtarget.hasStandardEncoding()">, + AssemblerPredicate<"FeatureMips32,FeatureMips32r2,FeatureMips64"> ; //===----------------------------------------------------------------------===// // Instruction format superclass @@ -256,7 +258,8 @@ def immZExt5 : ImmLeaf; // Mips Address Mode! SDNode frameindex could possibily be a match // since load and store instructions from stack used it. -def addr : ComplexPattern; +def addr : + ComplexPattern; //===----------------------------------------------------------------------===// // Pattern fragment for load/store @@ -1211,4 +1214,4 @@ include "MipsCondMov.td" // Mips16 include "Mips16InstrFormats.td" - +include "Mips16InstrInfo.td" diff --git a/llvm/lib/Target/Mips/MipsRegisterInfo.td b/llvm/lib/Target/Mips/MipsRegisterInfo.td index 8a13bd1..fb2f9c0 100644 --- a/llvm/lib/Target/Mips/MipsRegisterInfo.td +++ b/llvm/lib/Target/Mips/MipsRegisterInfo.td @@ -271,6 +271,8 @@ def CPU16Regs : RegisterClass<"Mips", [i32], 32, (add // Callee save S0, S1)>; +def CPURAReg : RegisterClass<"Mips", [i32], 32, (add RA)>; + // 64bit fp: // * FGR64 - 32 64-bit registers diff --git a/llvm/test/CodeGen/Mips/null.ll b/llvm/test/CodeGen/Mips/null.ll new file mode 100644 index 0000000..a5e2c06 --- /dev/null +++ b/llvm/test/CodeGen/Mips/null.ll @@ -0,0 +1,10 @@ +; RUN: llc -march=mipsel -mcpu=mips16 < %s | FileCheck %s -check-prefix=16 + + +define i32 @main() nounwind { +entry: + ret i32 0 + +; 16: jr $ra + +} -- 2.7.4