[rs6000] GDB testcases for exercising breakpoints over PC-Relative instructions

Message ID f75ec92bc04539d097869b57b1f919a038b51eb8.camel@vnet.ibm.com
State New
Headers show
Series
  • [rs6000] GDB testcases for exercising breakpoints over PC-Relative instructions
Related show

Commit Message

Keith Seitz via Gdb-patches March 27, 2021, 12:25 a.m.
Hi,
      A few testcases to exercise powerpc PC-Relative instructions.
    These exercise single-stepping over prefixed instructions and
    verifying the loaded values are correct when we have single-stepped
    over an instruction that was executed from a displaced
    location.
    
    This is meant to assure that
    - single stepping over a prefixed instruction succeeds, in particular to
    confirm that an 8-byte instruction is properly handled.
    - An instruction that references the PC/NIA is properly fixed-up upon
    completion.


    YYYY-MM-DD  Will Schmidt  <will_schmidt@vnet.ibm.com>

    gdb/testsuite/ChangeLog:
	* gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.s:  Testcase with pnop and 
	  pcrelative plxv instructions.
	* gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.exp: Testcase harness.
	* gdb/testsuite/gdb.arch/powerpc-plxv.s:  Testcase with plxv and nop instructions.
	* gdb/testsuite/gdb.arch/powerpc-plxv.exp:  Testcase harness.



 powerpc-breakpoint-on-prefix-insn.exp |  135 ++++++++++++++++++++++++++++++++++
 powerpc-breakpoint-on-prefix-insn.s   |   29 +++++++
 powerpc-plxv.exp                      |  133 +++++++++++++++++++++++++++++++++
 powerpc-plxv.s                        |   30 +++++++
 4 files changed, 327 insertions(+)

Comments

Andrew Burgess March 27, 2021, 2:27 p.m. | #1
* will schmidt via Gdb-patches <gdb-patches@sourceware.org> [2021-03-26 19:25:26 -0500]:

> 

>     Hi,

>       A few testcases to exercise powerpc PC-Relative instructions.

>     These exercise single-stepping over prefixed instructions and

>     verifying the loaded values are correct when we have single-stepped

>     over an instruction that was executed from a displaced

>     location.

>     

>     This is meant to assure that

>     - single stepping over a prefixed instruction succeeds, in particular to

>     confirm that an 8-byte instruction is properly handled.

>     - An instruction that references the PC/NIA is properly fixed-up upon

>     completion.


Thanks for adding these tests, I can't comment on the actual PPC code,
but I have some style feedback:

> 

> 

>     YYYY-MM-DD  Will Schmidt  <will_schmidt@vnet.ibm.com>

> 

>     gdb/testsuite/ChangeLog:

> 	* gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.s:  Testcase with pnop and 

> 	  pcrelative plxv instructions.


This doesn't look correct, lines should be wrapped to under 80
characters, and follow on lines should only have a single leading tab,
no extra whitespace.  Also, entries in the gdb/testsuite/ChangeLog
don't include gdb/testsuite/ for their file entries.  This entry
should look like:

	* gdb.arch/powerpc-breakpoint-on-prefix-insn.s: Testcase with pnop
	and pcrelative plxv instructions.
	* gdb.arch/powerpc-breakpoint-on-prefix-insn.exp: Testcase
	harness.
	* gdb.arch/powerpc-plxv.s: Testcase with plxv and nop
	instructions.
	* gdb.arch/powerpc-plxv.exp: Testcase harness.

> 	* gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.exp: Testcase harness.

> 	* gdb/testsuite/gdb.arch/powerpc-plxv.s:  Testcase with plxv and nop instructions.

> 	* gdb/testsuite/gdb.arch/powerpc-plxv.exp:  Testcase harness.

> 

> 

> 

>  powerpc-breakpoint-on-prefix-insn.exp |  135 ++++++++++++++++++++++++++++++++++

>  powerpc-breakpoint-on-prefix-insn.s   |   29 +++++++

>  powerpc-plxv.exp                      |  133 +++++++++++++++++++++++++++++++++

>  powerpc-plxv.s                        |   30 +++++++

>  4 files changed, 327 insertions(+)

> 

> 

> diff --git a/gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.exp b/gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.exp

> new file mode 100644

> index 0000000000..35c9d88703

> --- /dev/null

> +++ b/gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.exp

> @@ -0,0 +1,135 @@

> +# Copyright 2021 Free Software Foundation, Inc.

> +

> +# This program 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 of the License, or

> +# (at your option) any later version.

> +#

> +# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.

> +

> +# Test to see if gdb is properly single stepping over the

> +# displaced plxv instruction.

> +# plxv is an extended mnemonic for the addpcis instruction, which

> +# stores the $NIA plus an immediate value into a register.

> +#

> +#		plxv Rx == addpcis Rx,0 == plxv Rx

> +#		subcis Rx,value == addpcis Rx,-value

> +

> +if { ![istarget powerpc*-*] } {

> +    verbose "Skipping powerpc plxv test."

> +    return

> +}

> +

> +set retval 0

> +

> +set testfile "powerpc-breakpoint-on-prefix-insn"

> +set srcfile ${testfile}.s

> +set binfile [standard_output_file ${testfile}]


Can these not be replace with 'standard_testfile .s' ?

> +

> +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {}] != "" } {


This line should be wrapped to keep it under 80 characters, however, I
think you should consider switching to use prepare_for_testing here
instead.

> +    untested "PowerPC plxv test"

> +    return -1

> +}

> +

> +gdb_exit

> +gdb_start

> +gdb_load ${binfile}


These would not be needed when using prepare_for_testing.

> +gdb_test "set radix 0b10000"

> +gdb_test "set debug displaced"

> +

> +if ![runto_main] then {

> +      return

> +}

> +

> +proc get_vector_hexadecimal_valueof { exp default {test ""} } {

> +global gdb_prompt

> +set val 0xeeee


The indentation seems messed up here.

> +	if {$test == ""} {

> +		set test "get vector_hexadecimal valueof \"${exp}\""


The single underscore in here seems weird, I'd have expected either
the proper function name (so more underscores), or separate words (no
underscores).

> +	}

> +    gdb_test_multiple "print $${exp}.uint128" $test {

> +	-re "\\$\[0-9\]* = (0x\[0-9a-zA-Z\]+).*$gdb_prompt $" {


You can use '-re -wrap "\\$\[0-9\]* = (0x\[0-9a-zA-Z\]+).*"' and avoid
the use of $gdb_prompt here.

> +	    set val $expect_out(1,string)

> +	    pass "$test"

> +	}

> +    }

> +    return ${val}

> +}

> +

> +proc stepi_over_instruction { xyz } {


This proc especially, but also the previous one, should have a short
header comment.

> +       global gdb_prompt

> +       gdb_test_multiple "stepi" "${xyz} " {

> +               -re ".*Illegal instruction.*${gdb_prompt}" {

> +                   fail "Illegal instruction on single step."

> +               return


The indentation seems weird here too.

> +               }

> +               -re ".*${gdb_prompt}" {

> +                pass "stepi ${xyz}"

> +               }

> +       }

> +}

> +

> +set check_pc [get_hexadecimal_valueof "\$pc" "default0"]

> +

> +# set some breakpoints on the instructions below main().


Capital letter at the start of a sentence please.


> +gdb_test "info reg pc"

> +gdb_test "disas /r main"

> +set bp1 *$check_pc+8

> +set bp2 *$check_pc+0d16

> +set bp3 *$check_pc+0d24

> +set bp4 *$check_pc+0d32

> +set bp5 *$check_pc+0d40

> +set bp6 *$check_pc+0

> +gdb_breakpoint $bp1

> +gdb_breakpoint $bp2

> +gdb_breakpoint $bp3

> +gdb_breakpoint $bp4

> +gdb_breakpoint $bp5

> +gdb_breakpoint $bp6

> +gdb_test "info break"

> +

> +# single-step through the plxv instructions, and see what happens.


Capital letter here too please.

> +# If the breakpoints are improperly set, these will fail with

> +# illegal instruction errors.

> +stepi_over_instruction "stepi over pnop"

> +stepi_over_instruction "stepi over vs4 assignment"

> +stepi_over_instruction "stepi over pnop"

> +stepi_over_instruction "stepi over vs5 assignment"

> +stepi_over_instruction "stepi over pnop"

> +stepi_over_instruction "stepi over vs6 assignment"

> +stepi_over_instruction "stepi over pnop"

> +stepi_over_instruction "stepi over vs7 assignment"

> +stepi_over_instruction "stepi over pnop"

> +

> +set check_vs4 [get_vector_hexadecimal_valueof "vs4" "default0"]

> +set check_vs5 [get_vector_hexadecimal_valueof "vs5" "default0"]

> +set check_vs6 [get_vector_hexadecimal_valueof "vs6" "default0"]

> +set check_vs7 [get_vector_hexadecimal_valueof "vs7" "default0"]

> +

> +set vs4_expected 0xa5b5c5d5a4b4c4d4a3b3c3d3a2b2c2d2

> +set vs5_expected 0xa7b7c7d7a6b6c6d6a5b5c5d5a4b4c4d4

> +set vs6_expected 0xa9b9c9d9a8b8c8d8a7b7c7d7a6b6c6d6

> +set vs7_expected 0xabbbcbdbaabacadaa9b9c9d9a8b8c8d8

> +

> +if [expr  $check_vs4 != $vs4_expected] {

> +    fail "unexpected value vs4;  actual:$check_vs4 expected:$vs4_expected"

> +}

> +if [expr $check_vs5 != $vs5_expected ] {

> +    fail "unexpected value vs5;   actual:$check_vs5 expected:$vs5_expected"

> +}

> +if [expr $check_vs6 != $vs6_expected ] {

> +    fail "unexpected value vs6;   actual:$check_vs6 expected:$vs6_expected"

> +}

> +if [expr $check_vs7 != $vs7_expected ] {

> +    fail "unexpected value vs7;   actual:$check_vs7 expected:$vs7_expected"

> +}

> +

> +gdb_test "info register vs4 vs5 vs6 vs7 "

> +

> +

> diff --git a/gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.s b/gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.s

> new file mode 100644

> index 0000000000..e5d2b5f69d

> --- /dev/null

> +++ b/gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.s

> @@ -0,0 +1,29 @@


You should add a copyright notice at the start of this file unless for
some reason adding one would stop the test working.  I can't see why
it would in this case.

> +

> +.global main

> +.type main,function

> +main:

> +	pnop

> +	plxv 4,40(0),1

> +	pnop

> +	plxv 5,40(0),1

> +	pnop

> +	plxv 6,40(0),1

> +	pnop

> +	plxv 7,40(0),1

> +	pnop

> +check_here:

> +	blr

> +mydata:

> +	.long 0xa1b1c1d1	# <<-

> +	.long 0xa2b2c2d2	# <<- loaded into vs4

> +	.long 0xa3b3c3d3	# <<- loaded into vs4

> +	.long 0xa4b4c4d4	# <<- loaded into vs4, vs5

> +	.long 0xa5b5c5d5	# <<- loaded into vs4, vs5

> +	.long 0xa6b6c6d6	# <<- loaded into      vs5, vs6

> +	.long 0xa7b7c7d7	# <<- loaded into      vs5, vs6

> +	.long 0xa8b8c8d8	# <<- loaded into           vs6, vs7

> +	.long 0xa9b9c9d9	# <<- loaded into           vs6, vs7

> +	.long 0xaabacada	# <<- loaded into                vs7

> +	.long 0xabbbcbdb	# <<- loaded into                vs7

> +	.long 0xacbcccdc	# <<-

> +

> diff --git a/gdb/testsuite/gdb.arch/powerpc-plxv.exp b/gdb/testsuite/gdb.arch/powerpc-plxv.exp

> new file mode 100644

> index 0000000000..d71810f871

> --- /dev/null

> +++ b/gdb/testsuite/gdb.arch/powerpc-plxv.exp

> @@ -0,0 +1,133 @@

> +# Copyright 2021 Free Software Foundation, Inc.

> +

> +# This program 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 of the License, or

> +# (at your option) any later version.

> +#

> +# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.

> +

> +# Test to see if gdb is properly single stepping over the

> +# displaced plxv instruction.

> +# plxv is an extended mnemonic for the addpcis instruction, which

> +# stores the $NIA plus an immediate value into a register.

> +#

> +#		plxv Rx == addpcis Rx,0 == plxv Rx

> +#		subcis Rx,value == addpcis Rx,-value


This comment seems to be identical to the one in the previous file.  I
assume there's something different about these tests, so the comments
should reflect those differences.

I think most of the feedback from the previous file applies to the
ones below too so I'll not repeat myself.

Thanks,
Andrew

> +

> +if { ![istarget powerpc*-*] } {

> +    verbose "Skipping powerpc plxv test."

> +    return

> +}

> +

> +set retval 0

> +

> +set testfile "powerpc-plxv"

> +set srcfile ${testfile}.s

> +set binfile [standard_output_file ${testfile}]

> +

> +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {}] != "" } {

> +    untested "PowerPC plxv test"

> +    return -1

> +}

> +

> +gdb_exit

> +gdb_start

> +gdb_load ${binfile}

> +gdb_test "set radix 0b10000"

> +gdb_test "set debug displaced"

> +

> +if ![runto_main] then {

> +      return

> +}

> +

> +proc get_vector_hexadecimal_valueof { exp default {test ""} } {

> +	set val "0x0000"

> +	global gdb_prompt

> +	if {$test == ""} {

> +		set test "get vector_hexadecimal valueof \"${exp}\""

> +	}

> +	gdb_test_multiple "print $${exp}.uint128" $test {

> +		-re "\\$\[0-9\]* = (0x\[0-9a-zA-Z\]+).*$gdb_prompt $" {

> +			set val $expect_out(1,string)

> +				pass "$test"

> +		}

> +		-re ".*Illegal instruction.*${gdb_prompt} $" {

> +			fail "Illegal instruction on print."

> +			set val 0xffff

> +		}

> +	}

> +	return ${val}

> +}

> +

> +proc stepi_over_instruction { xyz } {

> +	global gdb_prompt

> +	gdb_test_multiple "stepi" "${xyz} " {

> +		-re ".*Illegal instruction.*${gdb_prompt}" {

> +		    fail "Illegal instruction on single step."

> +		return

> +		}

> +		-re ".*${gdb_prompt}" {

> +		 pass "stepi ${xyz}"

> +		}

> +	}

> +}

> +

> +set check_pc [get_hexadecimal_valueof "\$pc" "default0"]

> +

> +# set some breakpoints on the instructions below main().

> +gdb_test "disas /r main"

> +set bp1 *$check_pc+4

> +set bp2 *$check_pc+0d12

> +set bp3 *$check_pc+0d20

> +set bp4 *$check_pc+0d28

> +gdb_breakpoint $bp1

> +gdb_breakpoint $bp2

> +gdb_breakpoint $bp3

> +gdb_breakpoint $bp4

> +

> +# single-step through the plxv instructions, and retrieve the

> +# register values as we proceed.

> +

> +stepi_over_instruction  "stepi over NOP"

> +

> +stepi_over_instruction  "stepi over vs4 assignment"

> +set check_vs4 [get_vector_hexadecimal_valueof "vs4" "default0"]

> +

> +stepi_over_instruction  "stepi over vs5 assignment"

> +set check_vs5 [get_vector_hexadecimal_valueof "vs5" "default0"]

> +

> +stepi_over_instruction  "stepi over vs6 assignment"

> +set check_vs6 [get_vector_hexadecimal_valueof "vs6" "default0"]

> +

> +stepi_over_instruction  "stepi over vs7 assignment"

> +set check_vs7 [get_vector_hexadecimal_valueof "vs7" "default0"]

> +

> +set vs4_expected 0xa5b5c5d5a4b4c4d4a3b3c3d3a2b2c2d2

> +set vs5_expected 0xa7b7c7d7a6b6c6d6a5b5c5d5a4b4c4d4

> +set vs6_expected 0xa9b9c9d9a8b8c8d8a7b7c7d7a6b6c6d6

> +set vs7_expected 0xabbbcbdbaabacadaa9b9c9d9a8b8c8d8

> +

> +if [expr  $check_vs4 != $vs4_expected] {

> +    fail "unexpected value vs4;  actual:$check_vs4 expected:$vs4_expected"

> +}

> +if [expr $check_vs5 != $vs5_expected ] {

> +    fail "unexpected value vs5;   actual:$check_vs5 expected:$vs5_expected"

> +}

> +if [expr $check_vs6 != $vs6_expected ] {

> +    fail "unexpected value vs6;   actual:$check_vs6 expected:$vs6_expected"

> +}

> +if [expr $check_vs7 != $vs7_expected ] {

> +    fail "unexpected value vs7;   actual:$check_vs7 expected:$vs7_expected"

> +}

> +

> +gdb_test "info break"

> +gdb_test "info register vs4 vs5 vs6 vs7 "

> +gdb_test "disas main #2"

> +

> diff --git a/gdb/testsuite/gdb.arch/powerpc-plxv.s b/gdb/testsuite/gdb.arch/powerpc-plxv.s

> new file mode 100644

> index 0000000000..d87b0771c8

> --- /dev/null

> +++ b/gdb/testsuite/gdb.arch/powerpc-plxv.s

> @@ -0,0 +1,30 @@

> +

> +# Test to verify that the prefixed instructions that load/store

> +# data off of a PC-Relative value behave properly when a

> +# breakpoint is set on the instruction and the instruction

> +# is executed from a displaced location.

> +

> +.global main

> +.type main,function

> +main:

> +	nop

> +	plxv 4,40(0),1

> +	plxv 5,40(0),1

> +	plxv 6,40(0),1

> +	plxv 7,40(0),1

> +check_here:

> +	blr

> +mydata:

> +	.long 0xa1b1c1d1	# <<-

> +	.long 0xa2b2c2d2	# <<- loaded into vs4

> +	.long 0xa3b3c3d3	# <<- loaded into vs4

> +	.long 0xa4b4c4d4	# <<- loaded into vs4, vs5

> +	.long 0xa5b5c5d5	# <<- loaded into vs4, vs5

> +	.long 0xa6b6c6d6	# <<- loaded into      vs5, vs6

> +	.long 0xa7b7c7d7	# <<- loaded into      vs5, vs6

> +	.long 0xa8b8c8d8	# <<- loaded into           vs6, vs7

> +	.long 0xa9b9c9d9	# <<- loaded into           vs6, vs7

> +	.long 0xaabacada	# <<- loaded into                vs7

> +	.long 0xabbbcbdb	# <<- loaded into                vs7

> +	.long 0xacbcccdc	# <<-

> +

>
Keith Seitz via Gdb-patches March 29, 2021, 3:09 p.m. | #2
On Sat, 2021-03-27 at 14:27 +0000, Andrew Burgess wrote:
> * will schmidt via Gdb-patches <gdb-patches@sourceware.org> [2021-03-

> 26 19:25:26 -0500]:

> 

> > 

> >     Hi,

> >       A few testcases to exercise powerpc PC-Relative instructions.

> >     These exercise single-stepping over prefixed instructions and

> >     verifying the loaded values are correct when we have single-

> > stepped

> >     over an instruction that was executed from a displaced

> >     location.

> >     

> >     This is meant to assure that

> >     - single stepping over a prefixed instruction succeeds, in

> > particular to

> >     confirm that an 8-byte instruction is properly handled.

> >     - An instruction that references the PC/NIA is properly fixed-

> > up upon

> >     completion.

> 

> Thanks for adding these tests, I can't comment on the actual PPC

> code,

> but I have some style feedback:


Thanks for the review.  I'll refresh/rework and repost once i've
updated and have confirmed things still work.  


(snip)

> > +    verbose "Skipping powerpc plxv test."

> > +    return

> > +}

> > +

> > +set retval 0

> > +

> > +set testfile "powerpc-breakpoint-on-prefix-insn"

> > +set srcfile ${testfile}.s

> > +set binfile [standard_output_file ${testfile}]

> 

> Can these not be replace with 'standard_testfile .s' ?


I'll update locally and see.  I was definitely having some issue with
this early on, but could easily have been a self-inflicted issue.
Are there any expected issues or limitations with 
standard_testfile .c versus .s here?  


> > +	}

> > +    gdb_test_multiple "print $${exp}.uint128" $test {

> > +	-re "\\$\[0-9\]* = (0x\[0-9a-zA-Z\]+).*$gdb_prompt $" {

> 

> You can use '-re -wrap "\\$\[0-9\]* = (0x\[0-9a-zA-Z\]+).*"' and

> avoid

> the use of $gdb_prompt here.


Ok, good.   I had initially written this without $gdb_prompt, but found
things would randomly fail.   I'll update with -wrap and see. 


> 

> I think most of the feedback from the previous file applies to the

> ones below too so I'll not repeat myself.


Appreciate the review, 
thanks
-Will

> 

> Thanks,

> Andrew

> 

> >
Keith Seitz via Gdb-patches March 29, 2021, 10:43 p.m. | #3
Hi,
  This is V2 of this patch.  Multiple updates per feedback received.
Thanks,
-Will

[v1]
  A few testcases to exercise powerpc PC-Relative instructions.
These exercise single-stepping over prefixed instructions and
verifying the loaded values are correct when we have single-stepped
over an instruction that was executed from a displaced
location.

This is meant to assure that
- single stepping over a prefixed instruction succeeds, in particular to
confirm that an 8-byte instruction is properly handled.
- An instruction that references the PC/NIA is properly fixed-up upon
completion.

[v2]
  Updated tests to use standard_testfile ; updated to use prepare_for_testing.
Multiple whitespace/indentation updates.
Updated -regex checks to use -wrap.   Copyright notices added.  Comments
updated and corrected in tests.


YYYY-MM-DD  Will Schmidt  <will_schmidt@vnet.ibm.com>

	gdb/testsuite/ChangeLog:
	* gdb.arch/powerpc-breakpoint-on-prefix-insn.s:  Testcase with
	pnop and pcrelative plxv instructions.
	* gdb.arch/powerpc-breakpoint-on-prefix-insn.exp: Testcase harness.
	* gdb.arch/powerpc-plxv.s:  Testcase with plxv and nop instructions.
	* gdb.arch/powerpc-plxv.exp:  Testcase harness.


diff --git a/gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.exp b/gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.exp
new file mode 100644
index 00000000000..2f83695f19d
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.exp
@@ -0,0 +1,132 @@
+# Copyright 2021 Free Software Foundation, Inc.
+
+# This program 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 of the License, or
+# (at your option) any later version.
+#
+# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Test to see if gdb is properly single stepping over the
+# displaced plxv instruction.   Depending on the Relocation flag
+# which is part of the instruction encoding, the plxv instruction
+# indicates that data is loaded from either an offset(address) or
+# from a location at an offset from the current instruction address.
+#
+
+if { ![istarget powerpc*-*] } {
+    verbose "Skipping powerpc plxv test."
+    return
+}
+
+set retval 0
+
+standard_testfile .s
+
+if { [prepare_for_testing "failed to prepare" $testfile "$srcfile" \
+      {debug quiet}] } {
+    return -1
+}
+
+if ![runto_main] then {
+      return
+}
+
+gdb_test "set radix 0b10000"
+gdb_test "set debug displaced"
+
+# Proc to extract the uint128 hex value from the output of
+# a print vs##.uint128 output.
+proc get_vector_hexadecimal_valueof { exp default {test ""} } {
+    global gdb_prompt
+    set val 0xeeee
+    if {$test == ""} {
+	set test "get_vector_hexadecimal_valueof \"${exp}\""
+    }
+    gdb_test_multiple "print $${exp}.uint128" $test {
+	-re -wrap  "\\$\[0-9\]* = (0x\[0-9a-zA-Z\]+).*" {
+	    set val $expect_out(1,string)
+	    pass "$test"
+	}
+    }
+    return ${val}
+}
+
+# Proc to do a single-step, and ensure we gently handle
+# an illegal instruction situation.
+proc stepi_over_instruction { xyz } {
+    global gdb_prompt
+    gdb_test_multiple "stepi" "${xyz} " {
+         -re ".*Illegal instruction.*${gdb_prompt}" {
+	    fail "Illegal instruction on single step."
+	    return
+	 }
+	 -re ".*${gdb_prompt}" {
+	     pass "stepi ${xyz}"
+         }
+    }
+}
+
+set check_pc [get_hexadecimal_valueof "\$pc" "default0"]
+
+# Set some breakpoints on the instructions below main().
+gdb_test "info reg pc"
+gdb_test "disas /r main"
+set bp1 *$check_pc+8
+set bp2 *$check_pc+0d16
+set bp3 *$check_pc+0d24
+set bp4 *$check_pc+0d32
+set bp5 *$check_pc+0d40
+set bp6 *$check_pc+0
+gdb_breakpoint $bp1
+gdb_breakpoint $bp2
+gdb_breakpoint $bp3
+gdb_breakpoint $bp4
+gdb_breakpoint $bp5
+gdb_breakpoint $bp6
+gdb_test "info break"
+
+# Single-step through the plxv instructions, and see what happens.
+# If the breakpoints are improperly set, these will fail with
+# illegal instruction errors.
+stepi_over_instruction "stepi over pnop 1"
+stepi_over_instruction "stepi over vs4 assignment"
+stepi_over_instruction "stepi over pnop 2"
+stepi_over_instruction "stepi over vs5 assignment"
+stepi_over_instruction "stepi over pnop 3"
+stepi_over_instruction "stepi over vs6 assignment"
+stepi_over_instruction "stepi over pnop 4"
+stepi_over_instruction "stepi over vs7 assignment"
+stepi_over_instruction "stepi over pnop"
+
+set check_vs4 [get_vector_hexadecimal_valueof "vs4" "default0"]
+set check_vs5 [get_vector_hexadecimal_valueof "vs5" "default0"]
+set check_vs6 [get_vector_hexadecimal_valueof "vs6" "default0"]
+set check_vs7 [get_vector_hexadecimal_valueof "vs7" "default0"]
+
+set vs4_expected 0xa5b5c5d5a4b4c4d4a3b3c3d3a2b2c2d2
+set vs5_expected 0xa7b7c7d7a6b6c6d6a5b5c5d5a4b4c4d4
+set vs6_expected 0xa9b9c9d9a8b8c8d8a7b7c7d7a6b6c6d6
+set vs7_expected 0xabbbcbdbaabacadaa9b9c9d9a8b8c8d8
+
+if [expr  $check_vs4 != $vs4_expected] {
+    fail "unexpected value vs4;  actual:$check_vs4 expected:$vs4_expected"
+}
+if [expr $check_vs5 != $vs5_expected ] {
+    fail "unexpected value vs5;   actual:$check_vs5 expected:$vs5_expected"
+}
+if [expr $check_vs6 != $vs6_expected ] {
+    fail "unexpected value vs6;   actual:$check_vs6 expected:$vs6_expected"
+}
+if [expr $check_vs7 != $vs7_expected ] {
+    fail "unexpected value vs7;   actual:$check_vs7 expected:$vs7_expected"
+}
+
+gdb_test "info register vs4 vs5 vs6 vs7 "
+
diff --git a/gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.s b/gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.s
new file mode 100644
index 00000000000..b04364be85b
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.s
@@ -0,0 +1,44 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2021 Free Software Foundation, Inc.
+
+   This program 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 of the License, or
+   (at your option) any later version.
+
+   This program 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 this program.  If not, see <http://www.gnu.org/licenses/>. */
+
+.global main
+.type main,function
+main:
+	pnop
+	plxv 4,0x48(0),1
+	pnop
+	plxv 5,0x40(0),1
+	pnop
+	plxv 6,0x38(0),1
+	pnop
+	plxv 7,0x30(0),1
+	pnop
+	blr
+mydata:
+	.long 0xa1b1c1d1	# <<-
+	.long 0xa2b2c2d2	# <<- loaded into vs4
+	.long 0xa3b3c3d3	# <<- loaded into vs4
+	.long 0xa4b4c4d4	# <<- loaded into vs4, vs5
+	.long 0xa5b5c5d5	# <<- loaded into vs4, vs5
+	.long 0xa6b6c6d6	# <<- loaded into      vs5, vs6
+	.long 0xa7b7c7d7	# <<- loaded into      vs5, vs6
+	.long 0xa8b8c8d8	# <<- loaded into           vs6, vs7
+	.long 0xa9b9c9d9	# <<- loaded into           vs6, vs7
+	.long 0xaabacada	# <<- loaded into                vs7
+	.long 0xabbbcbdb	# <<- loaded into                vs7
+	.long 0xacbcccdc	# <<-
+
diff --git a/gdb/testsuite/gdb.arch/powerpc-plxv.exp b/gdb/testsuite/gdb.arch/powerpc-plxv.exp
new file mode 100644
index 00000000000..69e4f328bc8
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/powerpc-plxv.exp
@@ -0,0 +1,137 @@
+# Copyright 2021 Free Software Foundation, Inc.
+
+# This program 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 of the License, or
+# (at your option) any later version.
+#
+# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Test to see if gdb is properly single stepping over the
+# displaced plxv instruction.
+# plxv is an extended mnemonic for the addpcis instruction, which
+# stores the $NIA plus an immediate value into a register.
+#
+#		plxv Rx == addpcis Rx,0 == plxv Rx
+#		subcis Rx,value == addpcis Rx,-value
+
+if { ![istarget powerpc*-*] } {
+    verbose "Skipping powerpc plxv test."
+    return
+}
+
+set retval 0
+
+set testfile "powerpc-plxv"
+set srcfile ${testfile}.s
+set binfile [standard_output_file ${testfile}]
+
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {}] != "" } {
+    untested "PowerPC plxv test"
+    return -1
+}
+
+gdb_exit
+gdb_start
+gdb_load ${binfile}
+gdb_test "set radix 0b10000"
+gdb_test "set debug displaced"
+
+if ![runto_main] then {
+      return
+}
+
+# Proc to extract the uint128 hex value from the output of
+# a print vs##.uint128 output.
+proc get_vector_hexadecimal_valueof { exp default {test ""} } {
+	set val "0x0000"
+	global gdb_prompt
+	if {$test == ""} {
+		set test "get vector_hexadecimal valueof \"${exp}\""
+	}
+	gdb_test_multiple "print $${exp}.uint128" $test {
+		-re "\\$\[0-9\]* = (0x\[0-9a-zA-Z\]+).*$gdb_prompt $" {
+			set val $expect_out(1,string)
+				pass "$test"
+		}
+		-re ".*Illegal instruction.*${gdb_prompt} $" {
+			fail "Illegal instruction on print."
+			set val 0xffff
+		}
+	}
+	return ${val}
+}
+
+# Proc to do a single-step, and ensure we gently handle
+# an illegal instruction situation.
+proc stepi_over_instruction { xyz } {
+	global gdb_prompt
+	gdb_test_multiple "stepi" "${xyz} " {
+		-re ".*Illegal instruction.*${gdb_prompt}" {
+		    fail "Illegal instruction on single step."
+		return
+		}
+		-re ".*${gdb_prompt}" {
+		 pass "stepi ${xyz}"
+		}
+	}
+}
+
+set check_pc [get_hexadecimal_valueof "\$pc" "default0"]
+
+# Set some breakpoints on the instructions below main().
+gdb_test "disas /r main"
+set bp1 *$check_pc+4
+set bp2 *$check_pc+0d12
+set bp3 *$check_pc+0d20
+set bp4 *$check_pc+0d28
+gdb_breakpoint $bp1
+gdb_breakpoint $bp2
+gdb_breakpoint $bp3
+gdb_breakpoint $bp4
+
+# Single-step through the plxv instructions, and retrieve the
+# register values as we proceed.
+
+stepi_over_instruction  "stepi over NOP"
+
+stepi_over_instruction  "stepi over vs4 assignment"
+set check_vs4 [get_vector_hexadecimal_valueof "vs4" "default0"]
+
+stepi_over_instruction  "stepi over vs5 assignment"
+set check_vs5 [get_vector_hexadecimal_valueof "vs5" "default0"]
+
+stepi_over_instruction  "stepi over vs6 assignment"
+set check_vs6 [get_vector_hexadecimal_valueof "vs6" "default0"]
+
+stepi_over_instruction  "stepi over vs7 assignment"
+set check_vs7 [get_vector_hexadecimal_valueof "vs7" "default0"]
+
+set vs4_expected 0xa5b5c5d5a4b4c4d4a3b3c3d3a2b2c2d2
+set vs5_expected 0xa7b7c7d7a6b6c6d6a5b5c5d5a4b4c4d4
+set vs6_expected 0xa9b9c9d9a8b8c8d8a7b7c7d7a6b6c6d6
+set vs7_expected 0xabbbcbdbaabacadaa9b9c9d9a8b8c8d8
+
+if [expr  $check_vs4 != $vs4_expected] {
+    fail "unexpected value vs4;  actual:$check_vs4 expected:$vs4_expected"
+}
+if [expr $check_vs5 != $vs5_expected ] {
+    fail "unexpected value vs5;   actual:$check_vs5 expected:$vs5_expected"
+}
+if [expr $check_vs6 != $vs6_expected ] {
+    fail "unexpected value vs6;   actual:$check_vs6 expected:$vs6_expected"
+}
+if [expr $check_vs7 != $vs7_expected ] {
+    fail "unexpected value vs7;   actual:$check_vs7 expected:$vs7_expected"
+}
+
+gdb_test "info break"
+gdb_test "info register vs4 vs5 vs6 vs7 "
+gdb_test "disas main #2"
+
diff --git a/gdb/testsuite/gdb.arch/powerpc-plxv.s b/gdb/testsuite/gdb.arch/powerpc-plxv.s
new file mode 100644
index 00000000000..0ca6d4775c2
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/powerpc-plxv.s
@@ -0,0 +1,47 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2021 Free Software Foundation, Inc.
+
+   This program 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 of the License, or
+   (at your option) any later version.
+
+   This program 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 this program.  If not, see <http://www.gnu.org/licenses/>. */
+
+
+# Test to verify that the prefixed instructions that load/store
+# data off of a PC-Relative value behave properly when a
+# breakpoint is set on the instruction and the instruction
+# is executed from a displaced location.
+
+.global main
+.type main,function
+main:
+	nop
+	plxv 4,40(0),1
+	plxv 5,40(0),1
+	plxv 6,40(0),1
+	plxv 7,40(0),1
+check_here:
+	blr
+mydata:
+	.long 0xa1b1c1d1	# <<-
+	.long 0xa2b2c2d2	# <<- loaded into vs4
+	.long 0xa3b3c3d3	# <<- loaded into vs4
+	.long 0xa4b4c4d4	# <<- loaded into vs4, vs5
+	.long 0xa5b5c5d5	# <<- loaded into vs4, vs5
+	.long 0xa6b6c6d6	# <<- loaded into      vs5, vs6
+	.long 0xa7b7c7d7	# <<- loaded into      vs5, vs6
+	.long 0xa8b8c8d8	# <<- loaded into           vs6, vs7
+	.long 0xa9b9c9d9	# <<- loaded into           vs6, vs7
+	.long 0xaabacada	# <<- loaded into                vs7
+	.long 0xabbbcbdb	# <<- loaded into                vs7
+	.long 0xacbcccdc	# <<-
+

Patch

diff --git a/gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.exp b/gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.exp
new file mode 100644
index 0000000000..35c9d88703
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.exp
@@ -0,0 +1,135 @@ 
+# Copyright 2021 Free Software Foundation, Inc.
+
+# This program 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 of the License, or
+# (at your option) any later version.
+#
+# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Test to see if gdb is properly single stepping over the
+# displaced plxv instruction.
+# plxv is an extended mnemonic for the addpcis instruction, which
+# stores the $NIA plus an immediate value into a register.
+#
+#		plxv Rx == addpcis Rx,0 == plxv Rx
+#		subcis Rx,value == addpcis Rx,-value
+
+if { ![istarget powerpc*-*] } {
+    verbose "Skipping powerpc plxv test."
+    return
+}
+
+set retval 0
+
+set testfile "powerpc-breakpoint-on-prefix-insn"
+set srcfile ${testfile}.s
+set binfile [standard_output_file ${testfile}]
+
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {}] != "" } {
+    untested "PowerPC plxv test"
+    return -1
+}
+
+gdb_exit
+gdb_start
+gdb_load ${binfile}
+gdb_test "set radix 0b10000"
+gdb_test "set debug displaced"
+
+if ![runto_main] then {
+      return
+}
+
+proc get_vector_hexadecimal_valueof { exp default {test ""} } {
+global gdb_prompt
+set val 0xeeee
+	if {$test == ""} {
+		set test "get vector_hexadecimal valueof \"${exp}\""
+	}
+    gdb_test_multiple "print $${exp}.uint128" $test {
+	-re "\\$\[0-9\]* = (0x\[0-9a-zA-Z\]+).*$gdb_prompt $" {
+	    set val $expect_out(1,string)
+	    pass "$test"
+	}
+    }
+    return ${val}
+}
+
+proc stepi_over_instruction { xyz } {
+       global gdb_prompt
+       gdb_test_multiple "stepi" "${xyz} " {
+               -re ".*Illegal instruction.*${gdb_prompt}" {
+                   fail "Illegal instruction on single step."
+               return
+               }
+               -re ".*${gdb_prompt}" {
+                pass "stepi ${xyz}"
+               }
+       }
+}
+
+set check_pc [get_hexadecimal_valueof "\$pc" "default0"]
+
+# set some breakpoints on the instructions below main().
+gdb_test "info reg pc"
+gdb_test "disas /r main"
+set bp1 *$check_pc+8
+set bp2 *$check_pc+0d16
+set bp3 *$check_pc+0d24
+set bp4 *$check_pc+0d32
+set bp5 *$check_pc+0d40
+set bp6 *$check_pc+0
+gdb_breakpoint $bp1
+gdb_breakpoint $bp2
+gdb_breakpoint $bp3
+gdb_breakpoint $bp4
+gdb_breakpoint $bp5
+gdb_breakpoint $bp6
+gdb_test "info break"
+
+# single-step through the plxv instructions, and see what happens.
+# If the breakpoints are improperly set, these will fail with
+# illegal instruction errors.
+stepi_over_instruction "stepi over pnop"
+stepi_over_instruction "stepi over vs4 assignment"
+stepi_over_instruction "stepi over pnop"
+stepi_over_instruction "stepi over vs5 assignment"
+stepi_over_instruction "stepi over pnop"
+stepi_over_instruction "stepi over vs6 assignment"
+stepi_over_instruction "stepi over pnop"
+stepi_over_instruction "stepi over vs7 assignment"
+stepi_over_instruction "stepi over pnop"
+
+set check_vs4 [get_vector_hexadecimal_valueof "vs4" "default0"]
+set check_vs5 [get_vector_hexadecimal_valueof "vs5" "default0"]
+set check_vs6 [get_vector_hexadecimal_valueof "vs6" "default0"]
+set check_vs7 [get_vector_hexadecimal_valueof "vs7" "default0"]
+
+set vs4_expected 0xa5b5c5d5a4b4c4d4a3b3c3d3a2b2c2d2
+set vs5_expected 0xa7b7c7d7a6b6c6d6a5b5c5d5a4b4c4d4
+set vs6_expected 0xa9b9c9d9a8b8c8d8a7b7c7d7a6b6c6d6
+set vs7_expected 0xabbbcbdbaabacadaa9b9c9d9a8b8c8d8
+
+if [expr  $check_vs4 != $vs4_expected] {
+    fail "unexpected value vs4;  actual:$check_vs4 expected:$vs4_expected"
+}
+if [expr $check_vs5 != $vs5_expected ] {
+    fail "unexpected value vs5;   actual:$check_vs5 expected:$vs5_expected"
+}
+if [expr $check_vs6 != $vs6_expected ] {
+    fail "unexpected value vs6;   actual:$check_vs6 expected:$vs6_expected"
+}
+if [expr $check_vs7 != $vs7_expected ] {
+    fail "unexpected value vs7;   actual:$check_vs7 expected:$vs7_expected"
+}
+
+gdb_test "info register vs4 vs5 vs6 vs7 "
+
+
diff --git a/gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.s b/gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.s
new file mode 100644
index 0000000000..e5d2b5f69d
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/powerpc-breakpoint-on-prefix-insn.s
@@ -0,0 +1,29 @@ 
+
+.global main
+.type main,function
+main:
+	pnop
+	plxv 4,40(0),1
+	pnop
+	plxv 5,40(0),1
+	pnop
+	plxv 6,40(0),1
+	pnop
+	plxv 7,40(0),1
+	pnop
+check_here:
+	blr
+mydata:
+	.long 0xa1b1c1d1	# <<-
+	.long 0xa2b2c2d2	# <<- loaded into vs4
+	.long 0xa3b3c3d3	# <<- loaded into vs4
+	.long 0xa4b4c4d4	# <<- loaded into vs4, vs5
+	.long 0xa5b5c5d5	# <<- loaded into vs4, vs5
+	.long 0xa6b6c6d6	# <<- loaded into      vs5, vs6
+	.long 0xa7b7c7d7	# <<- loaded into      vs5, vs6
+	.long 0xa8b8c8d8	# <<- loaded into           vs6, vs7
+	.long 0xa9b9c9d9	# <<- loaded into           vs6, vs7
+	.long 0xaabacada	# <<- loaded into                vs7
+	.long 0xabbbcbdb	# <<- loaded into                vs7
+	.long 0xacbcccdc	# <<-
+
diff --git a/gdb/testsuite/gdb.arch/powerpc-plxv.exp b/gdb/testsuite/gdb.arch/powerpc-plxv.exp
new file mode 100644
index 0000000000..d71810f871
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/powerpc-plxv.exp
@@ -0,0 +1,133 @@ 
+# Copyright 2021 Free Software Foundation, Inc.
+
+# This program 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 of the License, or
+# (at your option) any later version.
+#
+# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Test to see if gdb is properly single stepping over the
+# displaced plxv instruction.
+# plxv is an extended mnemonic for the addpcis instruction, which
+# stores the $NIA plus an immediate value into a register.
+#
+#		plxv Rx == addpcis Rx,0 == plxv Rx
+#		subcis Rx,value == addpcis Rx,-value
+
+if { ![istarget powerpc*-*] } {
+    verbose "Skipping powerpc plxv test."
+    return
+}
+
+set retval 0
+
+set testfile "powerpc-plxv"
+set srcfile ${testfile}.s
+set binfile [standard_output_file ${testfile}]
+
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {}] != "" } {
+    untested "PowerPC plxv test"
+    return -1
+}
+
+gdb_exit
+gdb_start
+gdb_load ${binfile}
+gdb_test "set radix 0b10000"
+gdb_test "set debug displaced"
+
+if ![runto_main] then {
+      return
+}
+
+proc get_vector_hexadecimal_valueof { exp default {test ""} } {
+	set val "0x0000"
+	global gdb_prompt
+	if {$test == ""} {
+		set test "get vector_hexadecimal valueof \"${exp}\""
+	}
+	gdb_test_multiple "print $${exp}.uint128" $test {
+		-re "\\$\[0-9\]* = (0x\[0-9a-zA-Z\]+).*$gdb_prompt $" {
+			set val $expect_out(1,string)
+				pass "$test"
+		}
+		-re ".*Illegal instruction.*${gdb_prompt} $" {
+			fail "Illegal instruction on print."
+			set val 0xffff
+		}
+	}
+	return ${val}
+}
+
+proc stepi_over_instruction { xyz } {
+	global gdb_prompt
+	gdb_test_multiple "stepi" "${xyz} " {
+		-re ".*Illegal instruction.*${gdb_prompt}" {
+		    fail "Illegal instruction on single step."
+		return
+		}
+		-re ".*${gdb_prompt}" {
+		 pass "stepi ${xyz}"
+		}
+	}
+}
+
+set check_pc [get_hexadecimal_valueof "\$pc" "default0"]
+
+# set some breakpoints on the instructions below main().
+gdb_test "disas /r main"
+set bp1 *$check_pc+4
+set bp2 *$check_pc+0d12
+set bp3 *$check_pc+0d20
+set bp4 *$check_pc+0d28
+gdb_breakpoint $bp1
+gdb_breakpoint $bp2
+gdb_breakpoint $bp3
+gdb_breakpoint $bp4
+
+# single-step through the plxv instructions, and retrieve the
+# register values as we proceed.
+
+stepi_over_instruction  "stepi over NOP"
+
+stepi_over_instruction  "stepi over vs4 assignment"
+set check_vs4 [get_vector_hexadecimal_valueof "vs4" "default0"]
+
+stepi_over_instruction  "stepi over vs5 assignment"
+set check_vs5 [get_vector_hexadecimal_valueof "vs5" "default0"]
+
+stepi_over_instruction  "stepi over vs6 assignment"
+set check_vs6 [get_vector_hexadecimal_valueof "vs6" "default0"]
+
+stepi_over_instruction  "stepi over vs7 assignment"
+set check_vs7 [get_vector_hexadecimal_valueof "vs7" "default0"]
+
+set vs4_expected 0xa5b5c5d5a4b4c4d4a3b3c3d3a2b2c2d2
+set vs5_expected 0xa7b7c7d7a6b6c6d6a5b5c5d5a4b4c4d4
+set vs6_expected 0xa9b9c9d9a8b8c8d8a7b7c7d7a6b6c6d6
+set vs7_expected 0xabbbcbdbaabacadaa9b9c9d9a8b8c8d8
+
+if [expr  $check_vs4 != $vs4_expected] {
+    fail "unexpected value vs4;  actual:$check_vs4 expected:$vs4_expected"
+}
+if [expr $check_vs5 != $vs5_expected ] {
+    fail "unexpected value vs5;   actual:$check_vs5 expected:$vs5_expected"
+}
+if [expr $check_vs6 != $vs6_expected ] {
+    fail "unexpected value vs6;   actual:$check_vs6 expected:$vs6_expected"
+}
+if [expr $check_vs7 != $vs7_expected ] {
+    fail "unexpected value vs7;   actual:$check_vs7 expected:$vs7_expected"
+}
+
+gdb_test "info break"
+gdb_test "info register vs4 vs5 vs6 vs7 "
+gdb_test "disas main #2"
+
diff --git a/gdb/testsuite/gdb.arch/powerpc-plxv.s b/gdb/testsuite/gdb.arch/powerpc-plxv.s
new file mode 100644
index 0000000000..d87b0771c8
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/powerpc-plxv.s
@@ -0,0 +1,30 @@ 
+
+# Test to verify that the prefixed instructions that load/store
+# data off of a PC-Relative value behave properly when a
+# breakpoint is set on the instruction and the instruction
+# is executed from a displaced location.
+
+.global main
+.type main,function
+main:
+	nop
+	plxv 4,40(0),1
+	plxv 5,40(0),1
+	plxv 6,40(0),1
+	plxv 7,40(0),1
+check_here:
+	blr
+mydata:
+	.long 0xa1b1c1d1	# <<-
+	.long 0xa2b2c2d2	# <<- loaded into vs4
+	.long 0xa3b3c3d3	# <<- loaded into vs4
+	.long 0xa4b4c4d4	# <<- loaded into vs4, vs5
+	.long 0xa5b5c5d5	# <<- loaded into vs4, vs5
+	.long 0xa6b6c6d6	# <<- loaded into      vs5, vs6
+	.long 0xa7b7c7d7	# <<- loaded into      vs5, vs6
+	.long 0xa8b8c8d8	# <<- loaded into           vs6, vs7
+	.long 0xa9b9c9d9	# <<- loaded into           vs6, vs7
+	.long 0xaabacada	# <<- loaded into                vs7
+	.long 0xabbbcbdb	# <<- loaded into                vs7
+	.long 0xacbcccdc	# <<-
+