Preparation: tmp1, tmp2, tmp3 <- r0, r1, r2;
r0, r1, r2 <- rd, rn, rm
- Insn: <op><cond> r0, r1, r2 [, <shift>]
+ Insn: <op><cond> r0, [r1,] r2 [, <shift>]
Cleanup: rd <- r0; r0, r1, r2 <- tmp1, tmp2, tmp3
*/
struct regcache *regs,
struct displaced_step_closure *dsc)
{
- unsigned rn, rm, rd;
+ unsigned rm, rd;
- rd = bits (insn, 3, 6);
- rn = (bit (insn, 7) << 3) | bits (insn, 0, 2);
- rm = 2;
+ rm = bits (insn, 3, 6);
+ rd = (bit (insn, 7) << 3) | bits (insn, 0, 2);
- if (rd != ARM_PC_REGNUM && rn != ARM_PC_REGNUM)
+ if (rd != ARM_PC_REGNUM && rm != ARM_PC_REGNUM)
return thumb_copy_unmodified_16bit (gdbarch, insn, "ALU reg", dsc);
if (debug_displaced)
- fprintf_unfiltered (gdb_stdlog, "displaced: copying reg %s insn %.4x\n",
- "ALU", (unsigned short) insn);
+ fprintf_unfiltered (gdb_stdlog, "displaced: copying ALU reg insn %.4x\n",
+ (unsigned short) insn);
- dsc->modinsn[0] = ((insn & 0xff00) | 0x08);
+ dsc->modinsn[0] = ((insn & 0xff00) | 0x10);
- install_alu_reg (gdbarch, regs, dsc, rd, rn, rm);
+ install_alu_reg (gdbarch, regs, dsc, rd, rd, rm);
return 0;
}
".*bx lr.*"
}
+# Test 16 bit thumb instruction 'add rd, pc'.
+
+proc test_add_rn_pc {} {
+ global srcfile gdb_prompt
+
+ set test "break test_add_rn_pc"
+ gdb_test_multiple "break *test_add_rn_pc" $test {
+ -re "Breakpoint.*at.* file .*$srcfile, line.*\r\n$gdb_prompt $" {
+ pass $test
+ }
+ -re "No symbol.*\r\n$gdb_prompt $" {
+ return
+ }
+ }
+
+ gdb_continue_to_breakpoint "continue to test_add_rn_pc" \
+ ".*mov.*r3, 4.*"
+
+ gdb_test "break *test_add_rn_pc_start" \
+ "Breakpoint.*at.* file .*$srcfile, line.*" \
+ "break test_add_rn_pc_start"
+
+ gdb_continue_to_breakpoint "continue to test_add_rn_pc_start" \
+ ".*add.*r3,.*pc.*"
+
+ set pc_val [get_integer_valueof "\$pc" 0]
+
+ gdb_test "break *test_add_rn_pc_end" \
+ "Breakpoint.*at.* file .*$srcfile, line.*" \
+ "break test_add_rn_pc_end"
+
+ gdb_continue_to_breakpoint "continue to test_add_rn_pc_end" \
+ ".*bx lr.*"
+
+ set r3_val [get_integer_valueof "\$r3" 0]
+ # Test the value in r3 is correct.
+ gdb_assert { [expr {$pc_val + 4 + 4} == $r3_val] }
+}
+
# Get things started.
clean_restart ${testfile}
test_str_pc
+test_add_rn_pc
+
##########################################
# Done, run program to exit.