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

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@gnu.org

# This file is part of the gdb testsuite.


if { ![istarget i?86-*-*] && ![istarget x86_64-*-* ] } {
    verbose "Skipping x86 AVX512 tests."
    return
}

standard_testfile

set comp_flags "-mavx512f -I${srcdir}/../nat"

if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} \
     [list debug nowarnings additional_flags=${comp_flags}]] } {
    return -1
}

if ![runto_main] {
    return -1
}

set supports_avx512 0

set test "probe AVX512 support"
gdb_test_multiple "print have_avx512()" $test {
    -re ".. = 1\r\n$gdb_prompt $" {
        pass $test
        set supports_avx512 1
    }
    -re ".. = 0\r\n$gdb_prompt $" {
        pass $test
    }
}

if { !$supports_avx512 } {
    unsupported "processor does not support AVX512"
    return
}

gdb_test "break [gdb_get_line_number "first breakpoint here"]" \
    "Breakpoint .* at .*i386-avx512.c.*" \
    "set first breakpoint in main"
gdb_continue_to_breakpoint "continue to first breakpoint in main"

set nr_regs 8

for { set r 1 } { $r < $nr_regs } { incr r } {
    gdb_test "print/x \$k$r" \
        ".. = 0x[format %x $r]2[format %x $r]1" \
        "check contents of %k$r"
}

for { set r 1 } { $r < $nr_regs } { incr r } {
    gdb_test "set var \$k$r = 0x$r$r$r$r" "" "set %k$r"
}

gdb_test "break [gdb_get_line_number "second breakpoint here"]" \
    "Breakpoint .* at .*i386-avx512.c.*" \
    "set second breakpoint in main"
gdb_continue_to_breakpoint "continue to second breakpoint in main"

set nr_regs 7

for { set r 0 } { $r < $nr_regs } { incr r } {
    set val [expr $r + 1]
    gdb_test "print/x k_data\[$r\]" \
        ".. = 0x$val$val$val$val" \
        "check contents of k_data\[$r\]"
}

gdb_test "break [gdb_get_line_number "third breakpoint here"]" \
    "Breakpoint .* at .*i386-avx512.c.*" \
    "set third breakpoint in main"
gdb_continue_to_breakpoint "continue to third breakpoint in main"

if [is_amd64_regs_target] {
    set nr_regs 32
} else {
    set nr_regs 8
}

for { set r 0 } { $r < $nr_regs } { incr r } {
    gdb_test "print \$zmm$r.v8_double" \
        ".. = \\{$r, $r.125, $r.25, $r.375, $r.5, $r.625, $r.75, $r.875\\}.*" \
        "check double contents of %zmm$r"
    gdb_test "print \$zmm$r.v32_int16" \
        ".. = \\{(-?\[0-9\]+, ){31}-?\[0-9\]+\\}.*" \
        "check int16 contents of %zmm$r"
    gdb_test "print \$ymm$r.v4_double" \
        ".. = \\{$r, $r.125, $r.25, $r.375\\}.*" \
        "check float contents of %ymm$r"
    gdb_test "print \$ymm$r.v16_int16" \
        ".. = \\{(-?\[0-9\]+, ){15}-?\[0-9\]+\\}.*" \
        "check int16 contents of %ymm$r"
    gdb_test "print \$xmm$r.v2_double" \
        ".. = \\{$r, $r.125\\}.*" \
        "check float contents of %xmm$r"
    gdb_test "print \$xmm$r.v8_int16" \
        ".. = \\{(-?\[0-9\]+, ){7}-?\[0-9\]+\\}.*" \
        "check int16 contents of %xmm$r"
}

for { set r 0 } { $r < $nr_regs } { incr r } {
    gdb_test "set var \$zmm$r.v8_double\[0\] = $r + 10" "" "set %zmm$r.v8_double\[0\]"
    gdb_test "set var \$zmm$r.v8_double\[1\] = $r + 10.125" "" "set %zmm$r.v8_double\[1\]"
    gdb_test "set var \$zmm$r.v8_double\[2\] = $r + 10.25" "" "set %zmm$r.v8_double\[2\]"
    gdb_test "set var \$zmm$r.v8_double\[3\] = $r + 10.375" "" "set %zmm$r.v8_double\[3\]"
    gdb_test "set var \$zmm$r.v8_double\[4\] = $r + 10.5" "" "set %zmm$r.v8_double\[4\]"
    gdb_test "set var \$zmm$r.v8_double\[5\] = $r + 10.625" "" "set %zmm$r.v8_double\[5\]"
    gdb_test "set var \$zmm$r.v8_double\[6\] = $r + 10.75" "" "set %zmm$r.v8_double\[6\]"
    gdb_test "set var \$zmm$r.v8_double\[7\] = $r + 10.875" "" "set %zmm$r.v8_double\[7\]"
}

gdb_test "break [gdb_get_line_number "fourth breakpoint here"]" \
    "Breakpoint .* at .*i386-avx512.c.*" \
    "set fourth breakpoint in main"
gdb_continue_to_breakpoint "continue to fourth breakpoint in main"

for { set r 0 } { $r < $nr_regs } { incr r } {
    gdb_test "print zmm_data\[$r\]" \
        ".. = \\{f = \\{[expr $r + 10], [expr $r.125 + 10], [expr $r.25 + 10], [expr $r.375 + 10], [expr $r.5 + 10], [expr $r.625 + 10], [expr $r.75 + 10], [expr $r.875 + 10]\\}\\}.*" \
        "check contents of zmm_data\[$r\] after writing ZMM regs"
}

for { set r 0 } { $r < $nr_regs } { incr r } {
    gdb_test "set var \$ymm$r.v4_double\[0\] = $r + 20" "" "set %ymm$r.v4_double\[0\]"
    gdb_test "set var \$ymm$r.v4_double\[1\] = $r + 20.125" "" "set %ymm$r.v4_double\[1\]"
    gdb_test "set var \$ymm$r.v4_double\[2\] = $r + 20.25" "" "set %ymm$r.v4_double\[2\]"
    gdb_test "set var \$ymm$r.v4_double\[3\] = $r + 20.375" "" "set %ymm$r.v4_double\[3\]"
}

gdb_test "break [gdb_get_line_number "fifth breakpoint here"]" \
    "Breakpoint .* at .*i386-avx512.c.*" \
    "set fifth breakpoint in main"
gdb_continue_to_breakpoint "continue to fifth breakpoint in main"

for { set r 0 } { $r < $nr_regs } { incr r } {
    gdb_test "print zmm_data\[$r\]" \
        ".. = \\{f = \\{[expr $r + 20], [expr $r.125 + 20], [expr $r.25 + 20], [expr $r.375 + 20], [expr $r.5 + 10], [expr $r.625 + 10], [expr $r.75 + 10], [expr $r.875 + 10]\\}\\}.*" \
        "check contents of zmm_data\[$r\] after writing YMM regs"
}

for { set r 0 } { $r < $nr_regs } { incr r } {
    gdb_test "set var \$xmm$r.v2_double\[0\] = $r + 30" "" "set %xmm$r.v2_double\[0\]"
    gdb_test "set var \$xmm$r.v2_double\[1\] = $r + 30.125" "" "set %xmm$r.v2_double\[1\]"
}

gdb_test "break [gdb_get_line_number "sixth breakpoint here"]" \
    "Breakpoint .* at .*i386-avx512.c.*" \
    "set sixth breakpoint in main"
gdb_continue_to_breakpoint "continue to sixth breakpoint in main"

for { set r 0 } { $r < $nr_regs } { incr r } {
    gdb_test "print zmm_data\[$r\]" \
        ".. = \\{f = \\{[expr $r + 30], [expr $r.125 + 30], [expr $r.25 + 20], [expr $r.375 + 20], [expr $r.5 + 10], [expr $r.625 + 10], [expr $r.75 + 10], [expr $r.875 + 10]\\}\\}.*" \
        "check contents of zmm_data\[$r\] after writing XMM regs"
}

gdb_test "break [gdb_get_line_number "seventh breakpoint here"]" \
    "Breakpoint .* at .*i386-avx512.c.*" \
    "set seventh breakpoint in main"
gdb_continue_to_breakpoint "continue to seventh breakpoint in main"
gdb_test "print \$zmm0.v16_int32" "= {-1, -1, -1, -1, 0 <repeats 12 times>}"

if { $nr_regs >= 16 } {
    gdb_test "print \$zmm16.v16_int32" "= {-1 <repeats 16 times>}"
}
