# Copyright 2023-2024 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 . */ # 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 ". # proc 1d_array_value_pattern { byte elements } { set brace_open "{" set brace_close "}" append data $brace_open $byte if {$elements > 1} { append data " " } 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 } }". # 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 " " } 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 } }