From 42240548bff3ab683ff48c8eb0de53d1a9068aa4 Mon Sep 17 00:00:00 2001
From: Peter Bergner <bergner@vnet.ibm.com>
Date: Wed, 1 Apr 2009 01:41:07 +0000
Subject: [PATCH] gas/ 	* config/tc-ppc.c (ppc_handle_align): Handle power7's
 group ending nop.

gas/testsuite/
	* gas/ppc/power7.d ("ori", ".p2align"): Add tests for group ending nop.
	* gas/ppc/power7.s: Likewise.
	* gas/ppc/power6.d: Likewise.
	* gas/ppc/power6.s: Likewise.
---
 gas/ChangeLog                  |  4 ++++
 gas/config/tc-ppc.c            | 20 +++++++++++++-------
 gas/testsuite/ChangeLog        |  7 +++++++
 gas/testsuite/gas/ppc/power6.d |  2 ++
 gas/testsuite/gas/ppc/power6.s |  2 ++
 gas/testsuite/gas/ppc/power7.d |  4 ++++
 gas/testsuite/gas/ppc/power7.s |  2 ++
 7 files changed, 34 insertions(+), 7 deletions(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 39577441507..fee4807f91b 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,7 @@
+2009-03-31  Peter Bergner  <bergner@vnet.ibm.com>
+
+	* config/tc-ppc.c (ppc_handle_align): Handle power7's group ending nop.
+
 2009-03-31  Dave Korn  <dave.korn.cygwin@gmail.com>
 
 	* doc/internals.texi:  Fix trivial syntax errors.
diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c
index 537b676be7e..0b0edbd97fc 100644
--- a/gas/config/tc-ppc.c
+++ b/gas/config/tc-ppc.c
@@ -5687,13 +5687,14 @@ ppc_handle_align (struct frag *fragP)
       fragP->fr_var = 4;
       md_number_to_chars (dest, 0x60000000, 4);
 
-      if ((ppc_cpu & PPC_OPCODE_POWER6) != 0)
+      if ((ppc_cpu & PPC_OPCODE_POWER6) != 0
+	  || (ppc_cpu & PPC_OPCODE_POWER7) != 0)
 	{
-	  /* For power6, we want the last nop to be a group terminating
-	     one, "ori 1,1,0".  Do this by inserting an rs_fill frag
-	     immediately after this one, with its address set to the last
-	     nop location.  This will automatically reduce the number of
-	     nops in the current frag by one.  */
+	  /* For power6 and power7, we want the last nop to be a group
+	     terminating one.  Do this by inserting an rs_fill frag immediately
+	     after this one, with its address set to the last nop location.
+	     This will automatically reduce the number of nops in the current
+	     frag by one.  */
 	  if (count > 4)
 	    {
 	      struct frag *group_nop = xmalloc (SIZEOF_STRUCT_FRAG + 4);
@@ -5707,7 +5708,12 @@ ppc_handle_align (struct frag *fragP)
 	      dest = group_nop->fr_literal;
 	    }
 
-	  md_number_to_chars (dest, 0x60210000, 4);
+	  if ((ppc_cpu & PPC_OPCODE_POWER7) != 0)
+	    /* power7 group terminating nop: "ori 2,2,0".  */
+	    md_number_to_chars (dest, 0x60420000, 4);
+	  else
+	    /* power6 group terminating nop: "ori 1,1,0".  */
+	    md_number_to_chars (dest, 0x60210000, 4);
 	}
     }
 }
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index b881c61482e..82db4f0f475 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2009-03-31  Peter Bergner  <bergner@vnet.ibm.com>
+
+	* gas/ppc/power7.d ("ori", ".p2align"): Add tests for group ending nop.
+	* gas/ppc/power7.s: Likewise.
+	* gas/ppc/power6.d: Likewise.
+	* gas/ppc/power6.s: Likewise.
+
 2009-03-30  Joseph Myers  <joseph@codesourcery.com>
 
 	* gas/arm/mapsecs.d, gas/arm/mapsecs.s: New.
diff --git a/gas/testsuite/gas/ppc/power6.d b/gas/testsuite/gas/ppc/power6.d
index c4d1ff0c0e9..bf75982a279 100644
--- a/gas/testsuite/gas/ppc/power6.d
+++ b/gas/testsuite/gas/ppc/power6.d
@@ -69,3 +69,5 @@ Disassembly of section \.text:
   ec:	7d 6a 02 74 	cbcdtd  r10,r11
   f0:	7d 6a 02 34 	cdtbcd  r10,r11
   f4:	7d 4b 60 94 	addg6s  r10,r11,r12
+  f8:	60 21 00 00 	ori     r1,r1,0
+  fc:	60 21 00 00 	ori     r1,r1,0
diff --git a/gas/testsuite/gas/ppc/power6.s b/gas/testsuite/gas/ppc/power6.s
index 9f5cde15c6c..106468f17d4 100644
--- a/gas/testsuite/gas/ppc/power6.s
+++ b/gas/testsuite/gas/ppc/power6.s
@@ -64,3 +64,5 @@ start:
 	cbcdtd  10,11
 	cdtbcd  10,11
 	addg6s  10,11,12
+	ori	1,1,0
+	.p2align 4,,15
diff --git a/gas/testsuite/gas/ppc/power7.d b/gas/testsuite/gas/ppc/power7.d
index b8dae904d48..b97418374e0 100644
--- a/gas/testsuite/gas/ppc/power7.d
+++ b/gas/testsuite/gas/ppc/power7.d
@@ -111,3 +111,7 @@ Disassembly of section \.text:
  194:	ed c0 78 34 	frsqrtes f14,f15
  198:	ed c0 78 35 	frsqrtes\. f14,f15
  19c:	7c 43 27 1e 	isel    r2,r3,r4,28
+ 1a0:	60 42 00 00 	ori     r2,r2,0
+ 1a4:	60 00 00 00 	nop
+ 1a8:	60 00 00 00 	nop
+ 1ac:	60 42 00 00 	ori     r2,r2,0
diff --git a/gas/testsuite/gas/ppc/power7.s b/gas/testsuite/gas/ppc/power7.s
index 2e2448abec6..773645253cf 100644
--- a/gas/testsuite/gas/ppc/power7.s
+++ b/gas/testsuite/gas/ppc/power7.s
@@ -104,3 +104,5 @@ power7:
 	frsqrtes  14,15
 	frsqrtes. 14,15
 	isel	  2,3,4,28
+	ori	  2,2,0
+	.p2align 4,,15