[nvptx] Basic -misa support for nvptx
authorCesar Philippidis <cesar@codesourcery.com>
Wed, 5 Sep 2018 22:27:31 +0000 (15:27 -0700)
committerCesar Philippidis <cesar@gcc.gnu.org>
Wed, 5 Sep 2018 22:27:31 +0000 (15:27 -0700)
gcc/
* config/nvptx/nvptx-opts.h: New file.
* config/nvptx/nvptx.c (nvptx_file_start): Print the correct .target.
* config/nvptx/nvptx.h: Include "nvptx-opts.h".
(ASM_SPEC): Define.
(TARGET_SM35): New macro.
* config/nvptx/nvptx.md (atomic_fetch_<logic><mode>): Enable with the
correct predicate.
* config/nvptx/nvptx.opt (ptx_isa, sm_30, sm_35): New enum and its
values.
(misa=): New option.
* doc/invoke.texi (Nvidia PTX Options): Document -misa.

gcc/testsuite/
* gcc.target/nvptx/atomic_fetch-1.c: New test.
* gcc.target/nvptx/atomic_fetch-1.c: New test.

Co-Authored-By: Bernd Schmidt <bernds_cb1@t-online.de>
From-SVN: r264133

gcc/ChangeLog
gcc/config/nvptx/nvptx-opts.h [new file with mode: 0644]
gcc/config/nvptx/nvptx.c
gcc/config/nvptx/nvptx.h
gcc/config/nvptx/nvptx.md
gcc/config/nvptx/nvptx.opt
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/nvptx/atomic-fetch-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/nvptx/atomic_fetch-1.c [new file with mode: 0644]

index 7b65c2fbe43fc2006fbb36ddf471823c4d5bfc2f..9400a2ac97a472a4c8942fe81649cd4d05e844de 100644 (file)
@@ -1,3 +1,18 @@
+2018-09-05  Cesar Philippidis  <cesar@codesourcery.com>
+           Bernd Schmidt  <bernds_cb1@t-online.de>
+
+       * config/nvptx/nvptx-opts.h: New file.
+       * config/nvptx/nvptx.c (nvptx_file_start): Print the correct .target.
+       * config/nvptx/nvptx.h: Include "nvptx-opts.h".
+       (ASM_SPEC): Define.
+       (TARGET_SM35): New macro.
+       * config/nvptx/nvptx.md (atomic_fetch_<logic><mode>): Enable with the
+       correct predicate.
+       * config/nvptx/nvptx.opt (ptx_isa, sm_30, sm_35): New enum and its
+       values.
+       (misa=): New option.
+       * doc/invoke.texi (Nvidia PTX Options): Document -misa.
+
 2018-09-05  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.md (truncdfsf2): Remove expander.
diff --git a/gcc/config/nvptx/nvptx-opts.h b/gcc/config/nvptx/nvptx-opts.h
new file mode 100644 (file)
index 0000000..55d9599
--- /dev/null
@@ -0,0 +1,30 @@
+/* Definitions for the NVPTX port needed for option handling.
+   Copyright (C) 2015-2018 Free Software Foundation, Inc.
+
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3, or (at your
+   option) any later version.
+
+   GCC is distributed in the hope that it will be useful, but WITHOUT
+   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+   License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef NVPTX_OPTS_H
+#define NVPTX_OPTS_H
+
+enum ptx_isa
+{
+  PTX_ISA_SM30,
+  PTX_ISA_SM35
+};
+
+#endif
+
index c0b0a2ec3ab95f71132d3f49134ac6b2128b4b63..9903a2738633806efa05e52cbe21e91290eee59a 100644 (file)
@@ -4931,7 +4931,10 @@ nvptx_file_start (void)
 {
   fputs ("// BEGIN PREAMBLE\n", asm_out_file);
   fputs ("\t.version\t3.1\n", asm_out_file);
-  fputs ("\t.target\tsm_30\n", asm_out_file);
+  if (TARGET_SM35)
+    fputs ("\t.target\tsm_35\n", asm_out_file);
+  else
+    fputs ("\t.target\tsm_30\n", asm_out_file);
   fprintf (asm_out_file, "\t.address_size %d\n", GET_MODE_BITSIZE (Pmode));
   fputs ("// END PREAMBLE\n", asm_out_file);
 }
index dfa1e9aa859cf846496a17caf6c4ae97057a1977..a2fe8b68b222b7f65839b4ecd6f5f85f3c8d084c 100644 (file)
 #ifndef GCC_NVPTX_H
 #define GCC_NVPTX_H
 
+#ifndef NVPTX_OPTS_H
+#include "config/nvptx/nvptx-opts.h"
+#endif
+
 /* Run-time Target.  */
 
 #define STARTFILE_SPEC "%{mmainkernel:crt0.o}"
 
+#define ASM_SPEC "%{misa=*:-m %*}"
+
 #define TARGET_CPU_CPP_BUILTINS()              \
   do                                           \
     {                                          \
@@ -87,6 +93,8 @@
 #define Pmode (TARGET_ABI64 ? DImode : SImode)
 #define STACK_SIZE_MODE Pmode
 
+#define TARGET_SM35 (ptx_isa_option >= PTX_ISA_SM35)
+
 /* Registers.  Since ptx is a virtual target, we just define a few
    hard registers for special purposes and leave pseudos unallocated.
    We have to have some available hard registers, to keep gcc setup
index 2988f5dfa91e110a52121143008df9d26e2a2355..dd6032d021bd4d6d80454c12bf2e1de28e3342fe 100644 (file)
 (define_code_iterator any_logic [and ior xor])
 (define_code_attr logic [(and "and") (ior "or") (xor "xor")])
 
-;; Currently disabled until we add better subtarget support - requires sm_32.
 (define_insn "atomic_fetch_<logic><mode>"
   [(set (match_operand:SDIM 1 "memory_operand" "+m")
        (unspec_volatile:SDIM
          UNSPECV_LOCK))
    (set (match_operand:SDIM 0 "nvptx_register_operand" "=R")
        (match_dup 1))]
-  "0"
+  "TARGET_SM35"
   "%.\\tatom%A1.b%T0.<logic>\\t%0, %1, %2;"
   [(set_attr "atomic" "true")])
 
index 04277d1d98eb9df96909d2072451d062a39f72e9..8194c0324d64fa37675de77487166aaa691d8f5a 100644 (file)
@@ -48,3 +48,17 @@ Generate code that can keep local state uniform across all lanes.
 mgomp
 Target Report Mask(GOMP)
 Generate code for OpenMP offloading: enables -msoft-stack and -muniform-simt.
+
+Enum
+Name(ptx_isa) Type(int)
+Known PTX ISA versions (for use with the -misa= option):
+
+EnumValue
+Enum(ptx_isa) String(sm_30) Value(PTX_ISA_SM30)
+
+EnumValue
+Enum(ptx_isa) String(sm_35) Value(PTX_ISA_SM35)
+
+misa=
+Target RejectNegative ToLower Joined Enum(ptx_isa) Var(ptx_isa_option) Init(PTX_ISA_SM30)
+Specify the version of the ptx ISA to use.
index ca92028b9ea0fb1fbd8c55ab5f415fc3c1b2c945..8ac29fd48e144fcc07399d850b5e2f62b15149ba 100644 (file)
@@ -22466,6 +22466,12 @@ These options are defined for Nvidia PTX:
 @opindex m64
 Generate code for 32-bit or 64-bit ABI.
 
+@item -misa=@var{ISA-string}
+@opindex march
+Generate code for given the specified PTX ISA (e.g.@ @samp{sm_35}).  ISA
+strings must be lower-case.  Valid ISA strings include @samp{sm_30} and
+@samp{sm_35}.  The default ISA is sm_30.
+
 @item -mmainkernel
 @opindex mmainkernel
 Link in code for a __main kernel.  This is for stand-alone instead of
index a736ccf999a2aafd2c12eeb893db81ed6299f94b..5ccc2442c3e251c883ab1d2e27b8275529487c57 100644 (file)
@@ -1,3 +1,9 @@
+2018-09-05  Cesar Philippidis  <cesar@codesourcery.com>
+           Bernd Schmidt  <bernds_cb1@t-online.de>
+
+       * gcc.target/nvptx/atomic_fetch-1.c: New test.
+       * gcc.target/nvptx/atomic_fetch-1.c: New test.
+
 2018-09-05  Marek Polacek  <polacek@redhat.com>
 
        PR c++/87109, wrong overload with ref-qualifiers.
diff --git a/gcc/testsuite/gcc.target/nvptx/atomic-fetch-2.c b/gcc/testsuite/gcc.target/nvptx/atomic-fetch-2.c
new file mode 100644 (file)
index 0000000..1d35a17
--- /dev/null
@@ -0,0 +1,24 @@
+/* Test the nvptx atomic instructions for __atomic_fetch_OP for SM_30
+   targets.  */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -misa=sm_30" } */
+
+int
+main()
+{
+  unsigned long long a = ~0;
+  unsigned b = 0xa;
+
+  __atomic_fetch_add (&a, b, 0);
+  __atomic_fetch_and (&a, b, 0);
+  __atomic_fetch_or (&a, b, 0);
+  __atomic_fetch_xor (&a, b, 0);
+  
+  return a;
+}
+
+/* { dg-final { scan-assembler-not "atom.b64.add" } } */
+/* { dg-final { scan-assembler-not "atom.b64.and" } } */
+/* { dg-final { scan-assembler-not "atom.b64.or" } } */
+/* { dg-final { scan-assembler-not "atom.b64.xor" } } */
diff --git a/gcc/testsuite/gcc.target/nvptx/atomic_fetch-1.c b/gcc/testsuite/gcc.target/nvptx/atomic_fetch-1.c
new file mode 100644 (file)
index 0000000..c637caa
--- /dev/null
@@ -0,0 +1,24 @@
+/* Test the nvptx atomic instructions for __atomic_fetch_OP for SM_35
+   targets.  */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -misa=sm_35" } */
+
+int
+main()
+{
+  unsigned long long a = ~0;
+  unsigned b = 0xa;
+
+  __atomic_fetch_add (&a, b, 0);
+  __atomic_fetch_and (&a, b, 0);
+  __atomic_fetch_or (&a, b, 0);
+  __atomic_fetch_xor (&a, b, 0);
+  
+  return a;
+}
+
+/* { dg-final { scan-assembler "atom.add.u64" } } */
+/* { dg-final { scan-assembler "atom.b64.and" } } */
+/* { dg-final { scan-assembler "atom.b64.or" } } */
+/* { dg-final { scan-assembler "atom.b64.xor" } } */