# 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.

if { ![istarget powerpc*-*] || [skip_power_isa_3_1_tests] } {
    verbose "Skipping powerpc ISA 3.1 plxv test."
    return
}

set retval 0

standard_testfile .s

if { [prepare_for_testing "failed to prepare" $testfile "$srcfile" \
      {debug quiet}] } {
    return -1
}

gdb_test "set radix 0b10000"
gdb_test "set debug displaced"

if ![runto_main] then {
      return
}

gdb_test "set debug displaced on"

# Proc to extract the uint128 hex value from the output of
# a print vector statement.
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 -wrap "\\$\[0-9\]* = (0x\[0-9a-zA-Z\]+).*" {
			set val $expect_out(1,string)
				pass "$test"
		}
		-re -wrap ".*Illegal instruction.* $" {
			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 -wrap ".*Illegal instruction.*" {
			fail "Illegal instruction on single step."
		return
		}
		-re -wrap ".*" {
		 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 lnia"
stepi_over_instruction  "stepi over addi"

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"

