Use GFX9 granulated sgprs count correctly.
authorAndrew Stubbs <ams@codesourcery.com>
Fri, 22 Nov 2019 14:42:49 +0000 (14:42 +0000)
committerAndrew Stubbs <ams@gcc.gnu.org>
Fri, 22 Nov 2019 14:42:49 +0000 (14:42 +0000)
2019-11-22  Andrew Stubbs  <ams@codesourcery.com>

gcc/
* config/gcn/gcn.c (gcn_hsa_declare_function_name): Calculate
granulated_sgprs according to architecture.

From-SVN: r278617

gcc/ChangeLog
gcc/config/gcn/gcn.c

index 62ddef2dd31af7b2ac463e3fe41448c99d251763..2512838bc3efc99ebb5f46d42f266966e697142a 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-22  Andrew Stubbs  <ams@codesourcery.com>
+
+       * config/gcn/gcn.c (gcn_hsa_declare_function_name): Calculate
+       granulated_sgprs according to architecture.
+
 2019-11-22  Jan Hubicka  <jh@suse.cz>
 
        * ggc-page.c (ggc_collect): Call memory_block_pool::trim.
index 26c1067e52ab78dd7b128f008b716af75be75df2..3a8c10ed8b45b84d1b68c837ed21b81814cd9116 100644 (file)
@@ -4922,6 +4922,14 @@ gcn_hsa_declare_function_name (FILE *file, const char *name, tree)
        sgpr = MAX_NORMAL_SGPR_COUNT - extra_regs;
     }
 
+  /* GFX8 allocates SGPRs in blocks of 8.
+     GFX9 uses blocks of 16.  */
+  int granulated_sgprs;
+  if (TARGET_GCN3)
+    granulated_sgprs = (sgpr + extra_regs + 7) / 8 - 1;
+  else if (TARGET_GCN5)
+    granulated_sgprs = 2 * ((sgpr + extra_regs + 15) / 16 - 1);
+
   fputs ("\t.align\t256\n", file);
   fputs ("\t.type\t", file);
   assemble_name (file, name);
@@ -4960,7 +4968,7 @@ gcn_hsa_declare_function_name (FILE *file, const char *name, tree)
           "\t\tcompute_pgm_rsrc2_excp_en = 0\n",
           (vgpr - 1) / 4,
           /* Must match wavefront_sgpr_count */
-          (sgpr + extra_regs + 7) / 8 - 1,
+          granulated_sgprs,
           /* The total number of SGPR user data registers requested.  This
              number must match the number of user data registers enabled.  */
           cfun->machine->args.nsgprs);