aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/lib/aarch64.exp
blob: 602120a72a4eb0ae0db39fc82ce9c9410033db71 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# 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 <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
    }
}