# Copyright 2014-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/>.

# This file is part of the gdb testsuite.

# Test PowerPC instructions disassembly.

standard_testfile .s
set objfile [standard_output_file ${testfile}.o]

if {![istarget "powerpc*-*-*"]} then {
    verbose "Skipping PowerPC instructions disassembly."
    return
}

if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objfile}" object {debug}] != "" } {
    untested "PowerPC instructions disassembly"
    return -1
}

clean_restart ${objfile}

# Disassemble the function.
set func ""

gdb_test "set disassembler-options vsx"
set test "disass func"
gdb_test_multiple $test $test {
    -re "\r\nDump of assembler code for function func:(\r\n.*\r\n)End of assembler dump.\r\n$gdb_prompt $" {
	set func $expect_out(1,string)
	pass $test
    }
}

proc instr_to_patt {instr} {
    global decimal hex
    # 0x0000000000000018 <+24>:	stxvd2x vs43,r4,r5
    return "\[ \t\]*$hex <\\+$decimal>:\[ \t\]*[string_to_regexp $instr]"
}

proc func_check {instr} {
    global func

    set test "found: $instr"
    if [regexp -nocase -line [instr_to_patt $instr] $func] {
	pass $test
    } else {
	fail $test
    }
}

func_check "lxsiwzx vs62,r14,r26"
func_check "lxsiwzx vs40,0,r25"
func_check "lxsiwax vs25,0,r26"
func_check "lxsiwax vs3,0,r3"
func_check "mffprd  r12,f30"
func_check "mfvrd   r12,v30"
func_check "mffprwz r20,f12"
func_check "mfvrwz  r21,v12"
func_check "stxsiwx vs14,r9,r14"
func_check "stxsiwx vs21,0,r8"
func_check "mtfprd  f11,r28"
func_check "mtvrd   v11,r29"
func_check "mtfprwa f24,r22"
func_check "mtvrwa  v25,r23"
func_check "mtfprwz f26,r27"
func_check "mtvrwz  v27,r28"
func_check "lxsspx  vs13,r19,r13"
func_check "lxsspx  vs18,0,r13"
func_check "stxsspx vs43,r2,r4"
func_check "stxsspx vs55,0,r11"
func_check "xsaddsp vs54,vs48,vs25"
func_check "xsmaddasp vs14,vs50,vs1"
func_check "xssubsp vs26,vs22,vs42"
func_check "xsmaddmsp vs27,vs53,vs52"
func_check "xsrsqrtesp vs8,vs59"
func_check "xssqrtsp vs12,vs41"
func_check "xsmulsp vs57,vs11,vs32"
func_check "xsmsubasp vs38,vs20,vs26"
func_check "xsdivsp vs26,vs19,vs6"
func_check "xsmsubmsp vs35,vs37,vs55"
func_check "xsresp  vs59,vs8"
func_check "xsnmaddasp vs44,vs33,vs33"
func_check "xsnmaddmsp vs17,vs62,vs30"
func_check "xsnmsubasp vs54,vs52,vs31"
func_check "xsnmsubmsp vs37,vs5,vs58"
func_check "xxlorc  vs30,vs54,vs44"
func_check "xxlnand vs49,vs14,vs29"
func_check "xxleqv  vs62,vs22,vs30"
func_check "xscvdpspn vs60,vs54"
func_check "xsrsp   vs22,vs45"
func_check "xscvuxdsp vs26,vs59"
func_check "xscvsxdsp vs38,vs49"
func_check "xscvspdpn vs59,vs26"
func_check "fmrgow  f24,f14,f2"
func_check "fmrgew  f22,f7,f5"
