mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-29 14:40:39 +00:00
ptx: add shift instructions
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120982 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f8803fe417
commit
f964486771
@ -46,6 +46,11 @@ def MEMii : Operand<i32> {
|
||||
// PTX Specific Node Definitions
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// PTX allow generic 3-reg shifts like shl r0, r1, r2
|
||||
def PTXshl : SDNode<"ISD::SHL", SDTIntBinOp>;
|
||||
def PTXsrl : SDNode<"ISD::SRL", SDTIntBinOp>;
|
||||
def PTXsra : SDNode<"ISD::SRA", SDTIntBinOp>;
|
||||
|
||||
def PTXexit
|
||||
: SDNode<"PTXISD::EXIT", SDTNone, [SDNPHasChain]>;
|
||||
def PTXret
|
||||
@ -66,6 +71,22 @@ multiclass INT3<string opcstr, SDNode opnode> {
|
||||
[(set RRegs32:$d, (opnode RRegs32:$a, imm:$b))]>;
|
||||
}
|
||||
|
||||
// no %type directive, non-communtable
|
||||
multiclass INT3ntnc<string opcstr, SDNode opnode> {
|
||||
def rr : InstPTX<(outs RRegs32:$d),
|
||||
(ins RRegs32:$a, RRegs32:$b),
|
||||
!strconcat(opcstr, "\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, "\t$d, $a, $b"),
|
||||
[(set RRegs32:$d, (opnode RRegs32:$a, imm:$b))]>;
|
||||
def ir : InstPTX<(outs RRegs32:$d),
|
||||
(ins i32imm:$a, RRegs32:$b),
|
||||
!strconcat(opcstr, "\t$d, $a, $b"),
|
||||
[(set RRegs32:$d, (opnode imm:$a, RRegs32:$b))]>;
|
||||
}
|
||||
|
||||
multiclass PTX_LD<string opstr, RegisterClass RC, PatFrag pat_load> {
|
||||
def ri : InstPTX<(outs RC:$d),
|
||||
(ins MEMri:$a),
|
||||
@ -86,6 +107,12 @@ multiclass PTX_LD<string opstr, RegisterClass RC, PatFrag pat_load> {
|
||||
defm ADD : INT3<"add", add>;
|
||||
defm SUB : INT3<"sub", sub>;
|
||||
|
||||
///===- Logic and Shift Instructions --------------------------------------===//
|
||||
|
||||
defm SHL : INT3ntnc<"shl.b32", PTXshl>;
|
||||
defm SRL : INT3ntnc<"shr.u32", PTXsrl>;
|
||||
defm SRA : INT3ntnc<"shr.s32", PTXsra>;
|
||||
|
||||
///===- Data Movement and Conversion Instructions -------------------------===//
|
||||
|
||||
let neverHasSideEffects = 1 in {
|
||||
|
22
test/CodeGen/PTX/shl.ll
Normal file
22
test/CodeGen/PTX/shl.ll
Normal file
@ -0,0 +1,22 @@
|
||||
; RUN: llc < %s -march=ptx | FileCheck %s
|
||||
|
||||
define ptx_device i32 @t1(i32 %x, i32 %y) {
|
||||
; CHECK: shl.b32 r0, r1, r2
|
||||
%z = shl i32 %x, %y
|
||||
; CHECK: ret;
|
||||
ret i32 %z
|
||||
}
|
||||
|
||||
define ptx_device i32 @t2(i32 %x) {
|
||||
; CHECK: shl.b32 r0, r1, 3
|
||||
%z = shl i32 %x, 3
|
||||
; CHECK: ret;
|
||||
ret i32 %z
|
||||
}
|
||||
|
||||
define ptx_device i32 @t3(i32 %x) {
|
||||
; CHECK: shl.b32 r0, 3, r1
|
||||
%z = shl i32 3, %x
|
||||
; CHECK: ret;
|
||||
ret i32 %z
|
||||
}
|
43
test/CodeGen/PTX/shr.ll
Normal file
43
test/CodeGen/PTX/shr.ll
Normal file
@ -0,0 +1,43 @@
|
||||
; RUN: llc < %s -march=ptx | FileCheck %s
|
||||
|
||||
define ptx_device i32 @t1(i32 %x, i32 %y) {
|
||||
; CHECK: shr.u32 r0, r1, r2
|
||||
%z = lshr i32 %x, %y
|
||||
; CHECK: ret;
|
||||
ret i32 %z
|
||||
}
|
||||
|
||||
define ptx_device i32 @t2(i32 %x) {
|
||||
; CHECK: shr.u32 r0, r1, 3
|
||||
%z = lshr i32 %x, 3
|
||||
; CHECK: ret;
|
||||
ret i32 %z
|
||||
}
|
||||
|
||||
define ptx_device i32 @t3(i32 %x) {
|
||||
; CHECK: shr.u32 r0, 3, r1
|
||||
%z = lshr i32 3, %x
|
||||
; CHECK: ret;
|
||||
ret i32 %z
|
||||
}
|
||||
|
||||
define ptx_device i32 @t4(i32 %x, i32 %y) {
|
||||
; CHECK: shr.s32 r0, r1, r2
|
||||
%z = ashr i32 %x, %y
|
||||
; CHECK: ret;
|
||||
ret i32 %z
|
||||
}
|
||||
|
||||
define ptx_device i32 @t5(i32 %x) {
|
||||
; CHECK: shr.s32 r0, r1, 3
|
||||
%z = ashr i32 %x, 3
|
||||
; CHECK: ret;
|
||||
ret i32 %z
|
||||
}
|
||||
|
||||
define ptx_device i32 @t6(i32 %x) {
|
||||
; CHECK: shr.s32 r0, -3, r1
|
||||
%z = ashr i32 -3, %x
|
||||
; CHECK: ret;
|
||||
ret i32 %z
|
||||
}
|
Loading…
Reference in New Issue
Block a user