# Copyright 2020-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

# Test bfloat16 support in AVX512 registers

if { [skip_avx512bf16_tests] } {
    unsupported "target does not support AVX512BF16"
    return -1
}

standard_testfile

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

if { ![runto_main] } {
    return -1
}

# Test xmm
set line1 [gdb_get_line_number "first breakpoint here"]
gdb_breakpoint $line1
gdb_continue_to_breakpoint "line1" ".*$srcfile:$line1.*"

gdb_test "print \$xmm0.v8_bfloat16" \
    "= \\{0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875\\}"

gdb_test "print \$xmm6.v8_bfloat16" \
    "= \\{3, 3.125, 3.25, 3.375, 3.5, 3.625, 3.75, 3.875\\}"

# Test ymm
set line2 [gdb_get_line_number "second breakpoint here"]
gdb_breakpoint $line2
gdb_continue_to_breakpoint "line2" ".*$srcfile:$line2.*"

gdb_test "print \$ymm0.v16_bfloat16\[1\]" "= 8.25"
gdb_test "print \$ymm6.v16_bfloat16\[1\]" "= 20.25"

# Test zmm
set line3 [gdb_get_line_number "third breakpoint here"]
gdb_breakpoint $line3
gdb_continue_to_breakpoint "line3" ".*$srcfile:$line3.*"

gdb_test "print \$zmm0.v32_bfloat16\[1\]" "= 20.5"
gdb_test "print \$zmm6.v32_bfloat16\[1\]" "= 68.5"

# Test setting of bfloat values
gdb_test_no_output "set var \$xmm0.v8_bfloat16\[0\] = 32.25" \
    "set %xmm0.v8_bfloat16\[0\]"
gdb_test_no_output "set var \$ymm4.v16_bfloat16\[1\] = 33.5" \
    "set %ymm4.v16_bfloat16\[1\]"
gdb_test_no_output "set var \$zmm7.v32_bfloat16\[2\] = 22.75" \
    "set %zmm7.v32_bfloat16\[2\]"

gdb_test "p \$xmm0.v8_bfloat16\[0\]" "= 32.25"
gdb_test "p \$ymm4.v16_bfloat16\[1\]" "= 33.5"
gdb_test "p \$zmm7.v32_bfloat16\[2\]" "= 22.75"
