# Copyright 2023-2025 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/>.  */

# Support routines for aarch64-specific tests

#
# Return a regular expression that matches what gdb would print for a
# 1-dimension vector containing ELEMENTS elements of value BYTE.
#
# The pattern is of the form "{BYTE <repeats ELEMENTS times>".
#
proc 1d_array_value_pattern { byte elements } {
    set brace_open "{"
    set brace_close "}"

    append data $brace_open $byte
    if {$elements > 1} {
	append data " <repeats $elements times>"
    }
    append data $brace_close

    verbose -log "1d_array_value_pattern Pattern string is..."
    verbose -log $data
    return $data
}

#
# Return a regular expression that matches what gdb would print for a
# 2-dimension vector containing ROWS rows and COLUMNS columns of elements
# of value BYTE.
#
# The pattern is of the form
# "{{BYTE <repeats COLUMNS times>} <repeats ROWS times>}".
#
proc 2d_array_value_pattern { byte rows columns } {
    set brace_open "{"
    set brace_close "}"

    append data $brace_open [1d_array_value_pattern $byte $columns]
    if {$rows > 1} {
	append data " <repeats $rows times>"
    }
    append data $brace_close

    verbose -log "2d_array_value_pattern Pattern string is..."
    verbose -log $data
    return $data
}

#
# Initialize register NAME, a 1-dimension vector, with ELEMENTS elements
# by setting all elements to BYTE.  ELEMENTS is limited at 256 for memory
# usage purposes.
#
# The initialization is of the form "{BYTE, BYTE, BYTE ...}".
#
proc initialize_1d_array { name byte elements } {
    set brace_open "{"
    set brace_close "}"

    append data $brace_open

    # Build the assignment in a single shot.
    for {set element 0} {$element < $elements} {incr element} {
	# Construct the initializer by appending elements to it.
	append data $byte

	# If this isn't the last element, add a comma.
	if {[expr $element + 1] < $elements} {
	    append data ", "
	}
    }
    append data $brace_close

    verbose -log "initialization string is..."
    verbose -log $data
    gdb_test_no_output "set $name = $data" "write to $name"
}

#
# Return an initializer string for a 2-dimension vector with ROWS rows and
# COLUMNS columns, initializing all elements to BYTE for register NAME.
#
# COLUMNS is limited to 256 elements for memory usage purposes.
#
# The initialization is of the form "{{BYTE, BYTE}, ..., {BYTE, BYTE}}}".
#
proc initialize_2d_array { name byte rows columns } {
    set brace_open "{"
    set brace_close "}"

    if {[expr $rows * $columns] <= 256} {
	# Build the assignment in a single shot, as we have a maximum of 256
	# elements.
	for {set row 0} {$row < $rows} {incr row} {
	    append data $brace_open
	    for {set column 0} {$column < $columns} {incr column} {
		# Construct the initializer by appending elements to it.
		append data $byte

		# If this isn't the last column, add a comma.
		if {[expr $column + 1] < $columns} {
		    append data ", "
		}
	    }

	    append data $brace_close

	    # If this isn't the last row, add a comma.
	    if {[expr $row + 1] < $rows} {
		append data ","
	    }
	}

	set data $brace_open$data
	set data $data$brace_close

	verbose -log "initialization string is..."
	verbose -log $data
	gdb_test_no_output "set $name = $data" "write to $name"
    } else {
	# There are too many elements to initialize (more than 256), so we
	# will do the initialization row by row.
	for {set row 0} {$row < $rows} {incr row} {
	    initialize_1d_array "$name\[$row\]" $byte $columns
	}
    }
}

#
# Validate the values of the FPSIMD registers.
#
proc check_fpsimd_regs { byte state vl svl} {
    set fpsimd_pattern [string_to_regexp [1d_array_value_pattern $byte 16]]

    for {set number 0} {$number < 32} {incr number} {
	set register_name "\$v${number}\.b\.u"
	gdb_test "print sizeof $register_name" " = 16"
	gdb_test "print $register_name" $fpsimd_pattern
    }
}
