[llvm-commits] [llvm] r119485 - in /llvm/trunk: lib/Object/ lib/Target/PTX/PTXAsmPrinter.cpp lib/Target/PTX/PTXInstrInfo.td test/CodeGen/PTX/add.ll test/CodeGen/PTX/exit.ll test/CodeGen/PTX/mov.ll test/CodeGen/PTX/ret.ll test/CodeGen/PTX/sub.ll
Che-Liang Chiou
clchiou at gmail.com
Wed Nov 17 00:08:49 PST 2010
Author: clchiou
Date: Wed Nov 17 02:08:49 2010
New Revision: 119485
URL: http://llvm.org/viewvc/llvm-project?rev=119485&view=rev
Log:
Add simple arithmetics and %type directive for PTX
Added:
llvm/trunk/test/CodeGen/PTX/add.ll
llvm/trunk/test/CodeGen/PTX/sub.ll
Modified:
llvm/trunk/lib/Object/ (props changed)
llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp
llvm/trunk/lib/Target/PTX/PTXInstrInfo.td
llvm/trunk/test/CodeGen/PTX/exit.ll
llvm/trunk/test/CodeGen/PTX/mov.ll
llvm/trunk/test/CodeGen/PTX/ret.ll
Propchange: llvm/trunk/lib/Object/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed Nov 17 02:08:49 2010
@@ -0,0 +1,9 @@
+Debug
+Debug+Checks
+Debug+Coverage
+Debug+Coverage-Asserts
+Release
+Release-Asserts
+Release+Coverage
+Debug+Asserts
+Release+Asserts
Modified: llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp?rev=119485&r1=119484&r2=119485&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp (original)
+++ llvm/trunk/lib/Target/PTX/PTXAsmPrinter.cpp Wed Nov 17 02:08:49 2010
@@ -64,14 +64,26 @@
static const char *getRegisterTypeName(unsigned RegNo){
#define TEST_REGCLS(cls, clsstr) \
if (PTX::cls ## RegisterClass->contains(RegNo)) return # clsstr;
- TEST_REGCLS(RRegs32, .s32);
- TEST_REGCLS(Preds, .pred);
+ TEST_REGCLS(RRegs32, s32);
+ TEST_REGCLS(Preds, pred);
#undef TEST_REGCLS
llvm_unreachable("Not in any register class!");
return NULL;
}
+static const char *getInstructionTypeName(const MachineInstr *MI)
+{
+ for (int i = 0, e = MI->getNumOperands(); i != e; ++i) {
+ const MachineOperand &MO = MI->getOperand(i);
+ if (MO.getType() == MachineOperand::MO_Register)
+ return getRegisterTypeName(MO.getReg());
+ }
+
+ llvm_unreachable("No reg operand found in instruction!");
+ return NULL;
+}
+
bool PTXAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
SetupMachineFunction(MF);
EmitFunctionDeclaration();
@@ -89,7 +101,7 @@
i = MFI->localVarRegBegin(), e = MFI->localVarRegEnd(); i != e; ++ i) {
unsigned reg = *i;
- std::string def = "\t.reg ";
+ std::string def = "\t.reg .";
def += getRegisterTypeName(reg);
def += ' ';
def += getRegisterName(reg);
@@ -99,11 +111,21 @@
}
void PTXAsmPrinter::EmitInstruction(const MachineInstr *MI) {
- SmallString<128> str;
- raw_svector_ostream OS(str);
+ SmallString<128> sstr;
+ raw_svector_ostream OS(sstr);
printInstruction(MI, OS);
OS << ';';
- OutStreamer.EmitRawText(OS.str());
+
+ // Replace "%type" if found
+ StringRef strref = OS.str();
+ size_t pos;
+ if ((pos = strref.find("%type")) == StringRef::npos) {
+ OutStreamer.EmitRawText(strref);
+ return;
+ }
+ std::string str = strref;
+ str.replace(pos, /*strlen("%type")==*/5, getInstructionTypeName(MI));
+ OutStreamer.EmitRawText(StringRef(str));
}
void PTXAsmPrinter::printOperand(const MachineInstr *MI, int opNum,
@@ -141,7 +163,7 @@
// Print return register
reg = MFI->retReg();
if (!isKernel && reg != PTX::NoRegister) {
- decl += " (.reg "; // FIXME: could it return in .param space?
+ decl += " (.reg ."; // FIXME: could it return in .param space?
decl += getRegisterTypeName(reg);
decl += " ";
decl += getRegisterName(reg);
@@ -170,7 +192,7 @@
assert(reg != PTX::NoRegister && "Not a valid register!");
if (i != b)
decl += ", ";
- decl += ".reg ";
+ decl += ".reg .";
decl += getRegisterTypeName(reg);
decl += " ";
decl += getRegisterName(reg);
Modified: llvm/trunk/lib/Target/PTX/PTXInstrInfo.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PTX/PTXInstrInfo.td?rev=119485&r1=119484&r2=119485&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PTX/PTXInstrInfo.td (original)
+++ llvm/trunk/lib/Target/PTX/PTXInstrInfo.td Wed Nov 17 02:08:49 2010
@@ -27,9 +27,29 @@
: SDNode<"PTXISD::RET", SDTNone, [SDNPHasChain]>;
//===----------------------------------------------------------------------===//
+// Instruction Class Templates
+//===----------------------------------------------------------------------===//
+
+multiclass INT3<string opcstr, SDNode opnode> {
+ def rr : InstPTX<(outs RRegs32:$d),
+ (ins RRegs32:$a, RRegs32:$b),
+ !strconcat(opcstr, ".%type\t$d, $a, $b"),
+ [(set RRegs32:$d, (opnode RRegs32:$a, RRegs32:$b))]>;
+ def ri : InstPTX<(outs RRegs32:$d),
+ (ins RRegs32:$a, i32imm:$b),
+ !strconcat(opcstr, ".%type\t$d, $a, $b"),
+ [(set RRegs32:$d, (opnode RRegs32:$a, imm:$b))]>;
+}
+
+//===----------------------------------------------------------------------===//
// Instructions
//===----------------------------------------------------------------------===//
+///===- Integer Arithmetic Instructions -----------------------------------===//
+
+defm ADD : INT3<"add", add>;
+defm SUB : INT3<"sub", sub>;
+
///===- Data Movement and Conversion Instructions -------------------------===//
let neverHasSideEffects = 1 in {
@@ -37,7 +57,7 @@
def MOVpp
: InstPTX<(outs Preds:$d), (ins Preds:$a), "mov.pred\t$d, $a", []>;
def MOVrr
- : InstPTX<(outs RRegs32:$d), (ins RRegs32:$a), "mov.s32\t$d, $a", []>;
+ : InstPTX<(outs RRegs32:$d), (ins RRegs32:$a), "mov.%type\t$d, $a", []>;
}
let isReMaterializable = 1, isAsCheapAsAMove = 1 in {
Added: llvm/trunk/test/CodeGen/PTX/add.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PTX/add.ll?rev=119485&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/PTX/add.ll (added)
+++ llvm/trunk/test/CodeGen/PTX/add.ll Wed Nov 17 02:08:49 2010
@@ -0,0 +1,15 @@
+; RUN: llc < %s -march=ptx | FileCheck %s
+
+define ptx_device i32 @t1(i32 %x, i32 %y) {
+; CHECK: add.s32 r0, r1, r2;
+ %z = add i32 %x, %y
+; CHECK: ret;
+ ret i32 %z
+}
+
+define ptx_device i32 @t2(i32 %x) {
+; CHECK: add.s32 r0, r1, 1;
+ %z = add i32 %x, 1
+; CHECK: ret;
+ ret i32 %z
+}
Modified: llvm/trunk/test/CodeGen/PTX/exit.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PTX/exit.ll?rev=119485&r1=119484&r2=119485&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/PTX/exit.ll (original)
+++ llvm/trunk/test/CodeGen/PTX/exit.ll Wed Nov 17 02:08:49 2010
@@ -1,6 +1,7 @@
; RUN: llc < %s -march=ptx | FileCheck %s
define ptx_kernel void @t1() {
-;CHECK: exit;
+; CHECK: exit;
+; CHECK-NOT: ret;
ret void
}
Modified: llvm/trunk/test/CodeGen/PTX/mov.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PTX/mov.ll?rev=119485&r1=119484&r2=119485&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/PTX/mov.ll (original)
+++ llvm/trunk/test/CodeGen/PTX/mov.ll Wed Nov 17 02:08:49 2010
@@ -1,13 +1,13 @@
; RUN: llc < %s -march=ptx | FileCheck %s
define ptx_device i32 @t1() {
-;CHECK: mov.s32 r0, 0;
-;CHECK: ret;
+; CHECK: mov.s32 r0, 0;
+; CHECK: ret;
ret i32 0
}
define ptx_device i32 @t2(i32 %x) {
-;CHECK: mov.s32 r0, r1;
-;CHECK: ret;
+; CHECK: mov.s32 r0, r1;
+; CHECK: ret;
ret i32 %x
}
Modified: llvm/trunk/test/CodeGen/PTX/ret.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PTX/ret.ll?rev=119485&r1=119484&r2=119485&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/PTX/ret.ll (original)
+++ llvm/trunk/test/CodeGen/PTX/ret.ll Wed Nov 17 02:08:49 2010
@@ -1,6 +1,7 @@
; RUN: llc < %s -march=ptx | FileCheck %s
define ptx_device void @t1() {
-;CHECK: ret;
+; CHECK: ret;
+; CHECK-NOT: exit;
ret void
}
Added: llvm/trunk/test/CodeGen/PTX/sub.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PTX/sub.ll?rev=119485&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/PTX/sub.ll (added)
+++ llvm/trunk/test/CodeGen/PTX/sub.ll Wed Nov 17 02:08:49 2010
@@ -0,0 +1,15 @@
+; RUN: llc < %s -march=ptx | FileCheck %s
+
+define ptx_device i32 @t1(i32 %x, i32 %y) {
+;CHECK: sub.s32 r0, r1, r2;
+ %z = sub i32 %x, %y
+;CHECK: ret;
+ ret i32 %z
+}
+
+define ptx_device i32 @t2(i32 %x) {
+;CHECK: add.s32 r0, r1, -1;
+ %z = sub i32 %x, 1
+;CHECK: ret;
+ ret i32 %z
+}
More information about the llvm-commits
mailing list