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

# Tests for ARM iWMMXt register setting and fetching.

if ![istarget "arm*-*-*"] then {
    verbose "Skipping iWMMXt register tests."
    return
}

set testfile "iwmmxt-regs"
set binfile ${objdir}/${subdir}/${testfile}
set src1 ${srcdir}/${subdir}/${testfile}.c

# Try to compile the test case.  If we can't, assume this is not an
# iWMMXt toolchain and bail out.
if { [gdb_compile ${src1} ${binfile} executable {quiet debug}] != "" } {
    verbose "Skipping iWMMXt register tests."
    return
}

gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

#
# Run to `main' where we begin our tests.
#

if ![runto_main] then {
    return 0
}

# Set all the registers to arbitrary values.
for {set i 0} {$i < 16} {incr i 1} {
    gdb_test "set \$wR$i.u64 = ((${i}LL << 32) | ${i})" "" "set reg wR$i"
}
gdb_test "set \$wCSSF = 300" "" "set reg wCSSF"
gdb_test "set \$wCASF = 200" "" "set reg wCASF"
for {set i 0} {$i < 4} {incr i 1} {
    gdb_test "set \$wCGR$i = 100 + $i" "" "set reg wCGR$i"
}

# See if the sets stuck.
gdb_test "next" ".*write_regs.*" "next over read_regs"

for {set i 0} {$i < 16} {incr i 1} {
    gdb_test "p \$wR$i.u64 == ((${i}LL << 32) | ${i})" "\\\$$decimal = 1" "test reg wR$i"
}
# Don't test wCSSF.
gdb_test "p \$wCASF" "\\\$$decimal = 200" "test reg wCASF"
for {set i 0} {$i < 4} {incr i 1} {
    gdb_test "p \$wCGR$i == 100 + $i" "\\\$$decimal = 1" "test reg wCGR$i"
}

# Also verify the copies read by the target.
for {set i 0} {$i < 16} {incr i 1} {
    gdb_test "p regs\[$i\] == ((${i}LL << 32) | ${i})" "\\\$$decimal = 1" "test stored wR$i"
}
# Don't test wcssf.
gdb_test "p control_regs\[1\]" "\\\$$decimal = 200" "test stored wCASF"
for {set i 0} {$i < 4} {incr i 1} {
    gdb_test "p control_regs\[$i + 2\] == 100 + $i" "\\\$$decimal = 1" "test stored wCGR$i"
}
