[llvm] r211931 - [NVPTX] Add support for isspacep instruction

Tom Stellard tom at stellard.net
Fri Jun 27 12:03:52 PDT 2014


On Fri, Jun 27, 2014 at 06:35:25PM -0000, Justin Holewinski wrote:
> Author: jholewinski
> Date: Fri Jun 27 13:35:24 2014
> New Revision: 211931
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=211931&view=rev
> Log:
> [NVPTX] Add support for isspacep instruction
> 
> Added:
>     llvm/trunk/test/CodeGen/NVPTX/isspacep.ll
> Modified:
>     llvm/trunk/include/llvm/IR/IntrinsicsNVVM.td
>     llvm/trunk/lib/Target/NVPTX/NVPTXInstrInfo.td
>     llvm/trunk/lib/Target/NVPTX/NVPTXIntrinsics.td
> 
> Modified: llvm/trunk/include/llvm/IR/IntrinsicsNVVM.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/IntrinsicsNVVM.td?rev=211931&r1=211930&r2=211931&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/IntrinsicsNVVM.td (original)
> +++ llvm/trunk/include/llvm/IR/IntrinsicsNVVM.td Fri Jun 27 13:35:24 2014
> @@ -889,6 +889,24 @@ def int_nvvm_compiler_error :
>  def int_nvvm_compiler_warn :
>      Intrinsic<[], [llvm_anyptr_ty], [], "llvm.nvvm.compiler.warn">;
>  
> +// isspacep.{const, global, local, shared}
> +def int_nvvm_isspacep_const
> +  : Intrinsic<[llvm_i1_ty], [llvm_ptr_ty], [IntrNoMem],
> +              "llvm.nvvm.isspacep.const">,
> +    GCCBuiltin<"__nvvm_isspacep_const">;
> +def int_nvvm_isspacep_global
> +  : Intrinsic<[llvm_i1_ty], [llvm_ptr_ty], [IntrNoMem],
> +              "llvm.nvvm.isspacep.global">,
> +    GCCBuiltin<"__nvvm_isspacep_global">;
> +def int_nvvm_isspacep_local
> +  : Intrinsic<[llvm_i1_ty], [llvm_ptr_ty], [IntrNoMem],
> +              "llvm.nvvm.isspacep.local">,
> +    GCCBuiltin<"__nvvm_isspacep_local">;
> +def int_nvvm_isspacep_shared
> +  : Intrinsic<[llvm_i1_ty], [llvm_ptr_ty], [IntrNoMem],
> +              "llvm.nvvm.isspacep.shared">,
> +    GCCBuiltin<"__nvvm_isspacep_shared">;
> +
>  // Environment register read
>  def int_nvvm_read_ptx_sreg_envreg0
>    : Intrinsic<[llvm_i32_ty], [], [IntrNoMem],
> 
> Modified: llvm/trunk/lib/Target/NVPTX/NVPTXInstrInfo.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/NVPTX/NVPTXInstrInfo.td?rev=211931&r1=211930&r2=211931&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/NVPTX/NVPTXInstrInfo.td (original)
> +++ llvm/trunk/lib/Target/NVPTX/NVPTXInstrInfo.td Fri Jun 27 13:35:24 2014
> @@ -161,6 +161,8 @@ def hasHWROT32 : Predicate<"Subtarget.ha
>  
>  def true : Predicate<"1">;
>  
> +def hasPTX31 : Predicate<"Subtarget.getPTXVersion() >= 31">;
> +
>  
>  //===----------------------------------------------------------------------===//
>  // Some Common Instruction Class Templates
> 
> Modified: llvm/trunk/lib/Target/NVPTX/NVPTXIntrinsics.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/NVPTX/NVPTXIntrinsics.td?rev=211931&r1=211930&r2=211931&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/NVPTX/NVPTXIntrinsics.td (original)
> +++ llvm/trunk/lib/Target/NVPTX/NVPTXIntrinsics.td Fri Jun 27 13:35:24 2014
> @@ -1689,6 +1689,44 @@ def INT_NVVM_COMPILER_ERROR_64 : NVPTXIn
>                  [(int_nvvm_compiler_error Int64Regs:$a)]>;
>  
>  
> +// isspacep
> +
> +def ISSPACEP_CONST_32
> +  : NVPTXInst<(outs Int1Regs:$d), (ins Int32Regs:$a),
> +              "isspacep.const \t$d, $a;",
> +              [(set Int1Regs:$d, (int_nvvm_isspacep_const Int32Regs:$a))]>,

You can use types here instead of register classes.  e.g.

[(set i1:$d, (int_nvvm_isspacep_const i32:$a))]

This may not matter for your target if Int1Regs and Int32Regs each only support
one type, but I think this feature was added for a reason, and I'm not sure what
the implications of using registers here will be in the future.

-Tom

> +    Requires<[hasPTX31]>;
> +def ISSPACEP_CONST_64
> +  : NVPTXInst<(outs Int1Regs:$d), (ins Int64Regs:$a),
> +              "isspacep.const \t$d, $a;",
> +              [(set Int1Regs:$d, (int_nvvm_isspacep_const Int64Regs:$a))]>,
> +    Requires<[hasPTX31]>;
> +def ISSPACEP_GLOBAL_32
> +  : NVPTXInst<(outs Int1Regs:$d), (ins Int32Regs:$a),
> +              "isspacep.global \t$d, $a;",
> +              [(set Int1Regs:$d, (int_nvvm_isspacep_global Int32Regs:$a))]>;
> +def ISSPACEP_GLOBAL_64
> +  : NVPTXInst<(outs Int1Regs:$d), (ins Int64Regs:$a),
> +              "isspacep.global \t$d, $a;",
> +              [(set Int1Regs:$d, (int_nvvm_isspacep_global Int64Regs:$a))]>;
> +def ISSPACEP_LOCAL_32
> +  : NVPTXInst<(outs Int1Regs:$d), (ins Int32Regs:$a),
> +              "isspacep.local \t$d, $a;",
> +              [(set Int1Regs:$d, (int_nvvm_isspacep_local Int32Regs:$a))]>;
> +def ISSPACEP_LOCAL_64
> +  : NVPTXInst<(outs Int1Regs:$d), (ins Int64Regs:$a),
> +              "isspacep.local \t$d, $a;",
> +              [(set Int1Regs:$d, (int_nvvm_isspacep_local Int64Regs:$a))]>;
> +def ISSPACEP_SHARED_32
> +  : NVPTXInst<(outs Int1Regs:$d), (ins Int32Regs:$a),
> +              "isspacep.shared \t$d, $a;",
> +              [(set Int1Regs:$d, (int_nvvm_isspacep_shared Int32Regs:$a))]>;
> +def ISSPACEP_SHARED_64
> +  : NVPTXInst<(outs Int1Regs:$d), (ins Int64Regs:$a),
> +              "isspacep.shared \t$d, $a;",
> +              [(set Int1Regs:$d, (int_nvvm_isspacep_shared Int64Regs:$a))]>;
> +
> +
>  // Special register reads
>  def MOV_SPECIAL : NVPTXInst<(outs Int32Regs:$d),
>                              (ins SpecialRegs:$r),
> 
> Added: llvm/trunk/test/CodeGen/NVPTX/isspacep.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/NVPTX/isspacep.ll?rev=211931&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/NVPTX/isspacep.ll (added)
> +++ llvm/trunk/test/CodeGen/NVPTX/isspacep.ll Fri Jun 27 13:35:24 2014
> @@ -0,0 +1,35 @@
> +; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s
> +
> +declare i1 @llvm.nvvm.isspacep.const(i8*) readnone noinline
> +declare i1 @llvm.nvvm.isspacep.global(i8*) readnone noinline
> +declare i1 @llvm.nvvm.isspacep.local(i8*) readnone noinline
> +declare i1 @llvm.nvvm.isspacep.shared(i8*) readnone noinline
> +
> +; CHECK: is_const
> +define i1 @is_const(i8* %addr) {
> +; CHECK: isspacep.const
> +  %v = tail call i1 @llvm.nvvm.isspacep.const(i8* %addr)
> +  ret i1 %v
> +}
> +
> +; CHECK: is_global
> +define i1 @is_global(i8* %addr) {
> +; CHECK: isspacep.global
> +  %v = tail call i1 @llvm.nvvm.isspacep.global(i8* %addr)
> +  ret i1 %v
> +}
> +
> +; CHECK: is_local
> +define i1 @is_local(i8* %addr) {
> +; CHECK: isspacep.local
> +  %v = tail call i1 @llvm.nvvm.isspacep.local(i8* %addr)
> +  ret i1 %v
> +}
> +
> +; CHECK: is_shared
> +define i1 @is_shared(i8* %addr) {
> +; CHECK: isspacep.shared
> +  %v = tail call i1 @llvm.nvvm.isspacep.shared(i8* %addr)
> +  ret i1 %v
> +}
> +
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list