===================================================================
@@ -0,0 +1,61 @@
+# Copyright (C) 2026 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/>.
+
+# Feature availability check helpers for MIPS tests.
+
+# Check for MIPS I branch support. These instructions may be absent,
+# such as with MIPS16 compilations. Make sure an actual BLTZ machine
+# instruction is produced and no macro expanded.
+proc allow_mips1_branch_tests {} {
+ return [allow_target_tests "allow_mips1_branch_tests" \
+ "MIPS I branch support" "Illegal instruction" \
+ {
+ int main() {
+ asm volatile (
+ ".set push\n\t"
+ ".set noreorder\n\t"
+ ".set nomacro\n\t"
+ "bltz $0, 0f\n\t"
+ " nop\n"
+ "0:\n\t"
+ ".set pop\n");
+ return 0;
+ }
+ } \
+ {-Wa,-fatal-warnings -mno-mips16 -minterlink-compressed}]
+}
+
+# Check for MIPS I branch-and-link support. These instructions may be
+# absent, such as with MIPSr6, or MIPS16 compilations. Make sure an
+# actual BLTZAL machine instruction is produced and no macro expanded.
+proc allow_mips1_bal_tests {} {
+ return [allow_target_tests "allow_mips1_bal_tests" \
+ "MIPS I branch-and-link support" "Illegal instruction" \
+ {
+ int main() {
+ asm volatile (
+ ".set push\n\t"
+ ".set noreorder\n\t"
+ ".set nomacro\n\t"
+ "bltzal $4, 0f\n\t"
+ " nop\n"
+ "0:\n\t"
+ ".set pop\n"
+ : : : "$31");
+ return 0;
+ }
+ } \
+ {-Wa,-fatal-warnings -mno-mips16 -minterlink-compressed}]
+}
===================================================================
@@ -0,0 +1,78 @@
+# Copyright (C) 2026 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/>.
+
+# Template for MIPS single-stepping tests.
+
+# Send `stepi' to gdb until inferior hits a breakpoint, starting with
+# ERR (which is a program variable) set to STEPS and decrementing it
+# with each step. Use MESSAGE for the test result.
+proc stepi { steps message } {
+ global gdb_prompt
+
+ set timeout [get_largest_timeout]
+ set start [timestamp]
+
+ gdb_test_no_output -nopass "set err = $steps"
+ while { [timestamp] - $start < $steps * $timeout } {
+ gdb_test_multiple "stepi" "" {
+ -re ".*Breakpoint.*$gdb_prompt" {
+ send_gdb "set err -= 1\n"
+ gdb_expect {
+ -re "$gdb_prompt" { }
+ }
+ pass $message
+ return 1
+ }
+ -re ".*$gdb_prompt" {
+ send_gdb "set err -= 1\n"
+ gdb_expect {
+ -re "$gdb_prompt" { }
+ }
+ }
+ }
+ }
+ fail $message
+ return 0
+}
+
+if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} \
+ [lappend compile_flags debug]] } {
+ return
+}
+
+if { ![runto_main] } {
+ return
+}
+
+# Put breakpoints at the boundaries of the stepping range.
+foreach place [list step_start step_stop] {
+ if {![gdb_breakpoint "$place"]} {
+ unresolved "couldn't put breakpoint at $place"
+ return
+ }
+}
+
+# Advance to the beginning of the range.
+gdb_test "continue" ".*Breakpoint.*" "continue to step_start"
+
+# Make it easier to match results against expectations in the case of failures.
+gdb_test "info registers" ".*"
+gdb_test "display /i \$pc" ".*"
+
+# Step through to the end of the range.
+stepi $steps "step through to step_stop"
+
+# And run to completion to retrieve the result.
+gdb_test "continue" ".*exited normally.*" "continue to completion"
===================================================================
@@ -0,0 +1,70 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright (C) 2026 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 usefu,
+ 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/>. */
+
+/* Test single-stepping through MIPS I branch-and-link instructions. */
+
+int
+test_mips1_bal (void)
+{
+ /* Make 'err' available to the debugger to track the number of single
+ steps executed. Use `volatile' to prevent the variable from being
+ optimized away. */
+ volatile int err = -1;
+
+ int any = 0x55aa;
+ int mone = -1;
+ int zero = 0;
+ int one = 1;
+
+ asm volatile (
+ ".macro b_test op, args:vararg\n\t"
+ "\\op \\args, 0f\n\t"
+ " nop\n\t"
+ "nop\n"
+ "0:\n\t"
+ ".endm\n\t"
+
+ ".set push\n\t"
+ ".set noreorder\n\t"
+ ".globl step_start\n\t"
+ ".type step_start, @function\n"
+ "step_start:\n\t" /* Units: steps. */
+ "nop\n\t" /* NOP: 1s */
+ "b_test bltzal, %[mone]\n\t" /* Taken: 1s */
+ "b_test bltzal, %[zero]\n\t" /* Not taken: 2s */
+ "b_test bltzal, %[one]\n\t" /* Not taken: 2s */
+ "b_test bgezal, %[mone]\n\t" /* Not taken: 2s */
+ "b_test bgezal, %[zero]\n\t" /* Taken: 1s */
+ "b_test bgezal, %[one]\n\t" /* Taken: 1s */
+ "nop\n\t" /* NOP: 1s */
+ ".globl step_stop\n\t" /* Total: 11s */
+ ".type step_stop, @function\n"
+ "step_stop:\n\t"
+ ".set pop\n"
+ :
+ : [mone] "r" (mone), [zero] "r" (zero), [one] "r" (one),
+ [any] "r" (any)
+ : "$31");
+
+ return err;
+}
+
+int
+main (void)
+{
+ return test_mips1_bal ();
+}
===================================================================
@@ -0,0 +1,30 @@
+# Copyright (C) 2026 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/>.
+
+# Test single-stepping through MIPS I branch-and-link instructions.
+
+require {istarget "mips*-*-*"}
+
+source $srcdir/$subdir/mips-allow.exp.tcl
+
+require allow_mips1_bal_tests
+
+standard_testfile
+
+set steps 11
+foreach flag {-mno-mips16 -minterlink-compressed} {
+ lappend compile_flags "additional_flags=$flag"
+}
+source $srcdir/$subdir/mips-stepi.exp.tcl
===================================================================
@@ -0,0 +1,80 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright (C) 2026 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 usefu,
+ 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/>. */
+
+/* Test single-stepping through MIPS I branch instructions. */
+
+int
+test_mips1_branch (void)
+{
+ /* Make 'err' available to the debugger to track the number of single
+ steps executed. Use `volatile' to prevent the variable from being
+ optimized away. */
+ volatile int err = -1;
+
+ int any = 0x55aa;
+ int mone = -1;
+ int zero = 0;
+ int one = 1;
+
+ asm volatile (
+ ".macro b_test op, args:vararg\n\t"
+ "\\op \\args, 0f\n\t"
+ " nop\n\t"
+ "nop\n"
+ "0:\n\t"
+ ".endm\n\t"
+
+ ".set push\n\t"
+ ".set noreorder\n\t"
+ ".globl step_start\n\t"
+ ".type step_start, @function\n"
+ "step_start:\n\t" /* Units: steps. */
+ "nop\n\t" /* NOP: 1s */
+ "b_test beq, %[any], %[any]\n\t" /* Taken: 1s */
+ "b_test beq, %[any], %[one]\n\t" /* Not taken: 2s */
+ "b_test bne, %[any], %[any]\n\t" /* Not taken: 2s */
+ "b_test bne, %[any], %[one]\n\t" /* Taken: 1s */
+ "b_test bltz, %[mone]\n\t" /* Taken: 1s */
+ "b_test bltz, %[zero]\n\t" /* Not taken: 2s */
+ "b_test bltz, %[one]\n\t" /* Not taken: 2s */
+ "b_test blez, %[mone]\n\t" /* Taken: 1s */
+ "b_test blez, %[zero]\n\t" /* Taken: 1s */
+ "b_test blez, %[one]\n\t" /* Not taken: 2s */
+ "b_test bgez, %[mone]\n\t" /* Not taken: 2s */
+ "b_test bgez, %[zero]\n\t" /* Taken: 1s */
+ "b_test bgez, %[one]\n\t" /* Taken: 1s */
+ "b_test bgtz, %[mone]\n\t" /* Not taken: 2s */
+ "b_test bgtz, %[zero]\n\t" /* Not taken: 2s */
+ "b_test bgtz, %[one]\n\t" /* Taken: 1s */
+ "nop\n\t" /* NOP: 1s */
+ ".globl step_stop\n\t" /* Total: 26s */
+ ".type step_stop, @function\n"
+ "step_stop:\n\t"
+ ".set pop\n"
+ :
+ : [mone] "r" (mone), [zero] "r" (zero), [one] "r" (one),
+ [any] "r" (any)
+ : "$31");
+
+ return err;
+}
+
+int
+main (void)
+{
+ return test_mips1_branch ();
+}
===================================================================
@@ -0,0 +1,30 @@
+# Copyright (C) 2026 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/>.
+
+# Test single-stepping through MIPS I branch instructions.
+
+require {istarget "mips*-*-*"}
+
+source $srcdir/$subdir/mips-allow.exp.tcl
+
+require allow_mips1_branch_tests
+
+standard_testfile
+
+set steps 26
+foreach flag {-mno-mips16 -minterlink-compressed} {
+ lappend compile_flags "additional_flags=$flag"
+}
+source $srcdir/$subdir/mips-stepi.exp.tcl