* config/nvptx/nvptx.md (allocate_stack): Emit sorry during
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 21 Aug 2015 19:34:34 +0000 (19:34 +0000)
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 21 Aug 2015 19:34:34 +0000 (19:34 +0000)
expansion.
* config/nvptx/nvptx.c (nvptx_declare_function_name): Look at
crtl->stack_alignment_needed to determine alignment.
(nvptx_get_drap_rtx): New.
(TARGET_GET_DRAP_RTX): Override.
* config/nvptx/nvptx.h (MAX_STACK_ALIGNMENT): Set.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@227084 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/nvptx/nvptx.c
gcc/config/nvptx/nvptx.h
gcc/config/nvptx/nvptx.md

index 37b8d8e..61a3360 100644 (file)
@@ -1,3 +1,13 @@
+2015-08-21  Nathan Sidwell  <nathan@acm.org>
+
+       * config/nvptx/nvptx.md (allocate_stack): Emit sorry during
+       expansion.
+       * config/nvptx/nvptx.c (nvptx_declare_function_name): Look at
+       crtl->stack_alignment_needed to determine alignment.
+       (nvptx_get_drap_rtx): New.
+       (TARGET_GET_DRAP_RTX): Override.
+       * config/nvptx/nvptx.h (MAX_STACK_ALIGNMENT): Set.
+
 2015-08-21  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
 
        * config.build: Remove case for m68000-hp-hpux* | m68k-hp-hpux*.
index a356967..8f74a14 100644 (file)
@@ -598,9 +598,11 @@ nvptx_declare_function_name (FILE *file, const char *name, const_tree decl)
   sz = get_frame_size ();
   if (sz > 0 || cfun->machine->has_call_with_sc)
     {
+      int alignment = crtl->stack_alignment_needed / BITS_PER_UNIT;
+
       fprintf (file, "\t.reg.u%d %%frame;\n"
-              "\t.local.align 8 .b8 %%farray[" HOST_WIDE_INT_PRINT_DEC"];\n",
-              BITS_PER_WORD, sz == 0 ? 1 : sz);
+              "\t.local.align %d .b8 %%farray[" HOST_WIDE_INT_PRINT_DEC"];\n",
+              BITS_PER_WORD, alignment, sz == 0 ? 1 : sz);
       fprintf (file, "\tcvta.local.u%d %%frame, %%farray;\n",
               BITS_PER_WORD);
     }
@@ -726,6 +728,14 @@ nvptx_function_ok_for_sibcall (tree, tree)
   return false;
 }
 
+/* Return Dynamic ReAlignment Pointer RTX.  For PTX there isn't any.  */
+
+static rtx
+nvptx_get_drap_rtx (void)
+{
+  return NULL_RTX;
+}
+
 /* Implement the TARGET_CALL_ARGS hook.  Record information about one
    argument to the next call.  */
 
@@ -2118,6 +2128,8 @@ nvptx_file_end (void)
 #define TARGET_LIBCALL_VALUE nvptx_libcall_value
 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
 #define TARGET_FUNCTION_OK_FOR_SIBCALL nvptx_function_ok_for_sibcall
+#undef TARGET_GET_DRAP_RTX
+#define TARGET_GET_DRAP_RTX nvptx_get_drap_rtx
 #undef TARGET_SPLIT_COMPLEX_ARG
 #define TARGET_SPLIT_COMPLEX_ARG hook_bool_const_tree_true
 #undef TARGET_RETURN_IN_MEMORY
index afe4fcd..60a922a 100644 (file)
@@ -52,6 +52,8 @@
 #define BIGGEST_ALIGNMENT 64
 #define STRICT_ALIGNMENT 1
 
+#define MAX_STACK_ALIGNMENT (1024 * 8)
+
 /* Copied from elf.h and other places.  We'd otherwise use
    BIGGEST_ALIGNMENT and fail a number of testcases.  */
 #define MAX_OFILE_ALIGNMENT (32768 * 8)
index 7c2cb9c..b857e53 100644 (file)
    (match_operand 1 "nvptx_register_operand")]
   ""
 {
+  /* The ptx documentation specifies an alloca intrinsic (for 32 bit
+     only)  but notes it is not implemented.  The assembler emits a
+     confused error message.  Issue a blunt one now instead.  */
+  sorry ("target cannot support alloca.");
+  emit_insn (gen_nop ());
+  DONE;
   if (TARGET_ABI64)
     emit_insn (gen_allocate_stack_di (operands[0], operands[1]));
   else