1# Copyright 2009-2023 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 3 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16# This file is part of the gdb testsuite. 17 18 19if {![is_x86_like_target]} { 20 verbose "Skipping i387 reverse float tests." 21 return 22} 23 24standard_testfile 25 26# some targets have leading underscores on assembly symbols. 27set additional_flags [gdb_target_symbol_prefix_flags] 28 29if {[prepare_for_testing "failed to prepare" $testfile $srcfile \ 30 [list debug $additional_flags]]} { 31 return -1 32} 33 34runto_main 35 36# Record to end of main 37 38set location [gdb_get_line_number "END I387-FLOAT-REVERSE"] 39gdb_test_no_output "record" "Turn on process record" 40# This can take awhile. 41set oldtimeout $timeout 42set timeout [expr $oldtimeout + 120] 43gdb_test "until $location" ".*$srcfile:$location.*" \ 44 "record to end of main" 45set timeout $oldtimeout 46 47# Now rewind to beginning so we can begin testing. 48 49set location [gdb_get_line_number "BEGIN I387-FLOAT-REVERSE"] 50gdb_test_no_output "set exec-dir reverse" "set reverse direction" 51gdb_test "until $location" ".*$srcfile:$location.*" \ 52 "rewind to beginning of main" 53gdb_test_no_output "set exec-dir forward" "set forward direction" 54 55with_test_prefix "forward" { 56 # Test FPU env particularly ftag and fstatus reigters. 57 58 set location [gdb_get_line_number "TEST ENV"] 59 gdb_test "until $location" ".*$srcfile:$location.*asm.*nop.*" \ 60 "begin testing fpu env" 61 62 gdb_test "n" "asm.*fsave.*" "save FPU env in memory" 63 gdb_test "n" "asm.*frstor.*" "restore FPU env" 64 gdb_test "n" "asm.*fstsw.*" "store status word in EAX" 65 gdb_test "n" "asm.*fld1.*" "push st0" 66 67 gdb_test "info register ax" "ax *0x0.*\[ \t\]+.*" "verify eax == 0x0" 68 gdb_test "info register fstat" "fstat *0.*\[ \t\]+.*" "verify fstat == 0" 69 gdb_test "info register ftag" "ftag *0xffff.*\[ \t\]+.*" "verify ftag == 0xffff" 70 71 gdb_test "stepi" "asm.*fldl2t.*" "step to fldl2t" 72 gdb_test "info register fstat" "fstat *0x3800.*\[ \t\]+.*" "verify fstat == 0x3800" 73 gdb_test "info register ftag" "ftag *0x3fff.*\[ \t\]+.*" "verify ftag == 0x3fff" 74 75 gdb_test "stepi" "asm.*fldl2e.*" "step to fldl2e" 76 gdb_test "info register fstat" "fstat *0x3000.*\[ \t\]+.*" "verify fstat == 0x3000" 77 gdb_test "info register ftag" "ftag *0xfff.*\[ \t\]+.*" "verify ftag == 0xfff" 78 79 gdb_test "stepi" "asm.*fldpi.*" "step to fldpi" 80 gdb_test "info register fstat" "fstat *0x2800.*\[ \t\]+.*" "verify fstat == 0x2800" 81 gdb_test "info register ftag" "ftag *0x3ff.*\[ \t\]+.*" "verify ftag == 0x3ff" 82 83 gdb_test "stepi" "asm.*fldlg2.*" "step to fldlg2" 84 gdb_test "info register fstat" "fstat *0x2000.*\[ \t\]+.*" "verify fstat == 0x2000" 85 gdb_test "info register ftag" "ftag *0xff.*\[ \t\]+.*" "verify ftag == 0xff" 86 87 gdb_test "stepi" "asm.*fldln2.*" "step to fldln2" 88 gdb_test "info register fstat" "fstat *0x1800.*\[ \t\]+.*" "verify fstat == 0x1800" 89 gdb_test "info register ftag" "ftag *0x3f.*\[ \t\]+.*" "verify ftag == 0x3f" 90 91 gdb_test "stepi" "asm.*fldz.*" "step to fldz" 92 gdb_test "info register fstat" "fstat *0x1000.*\[ \t\]+.*" "verify fstat == 0x1000" 93 gdb_test "info register ftag" "ftag *0xf.*\[ \t\]+.*" "verify ftag == 0xf" 94 95 gdb_test "stepi" "asm.*nop.*" "step to nop" 96 gdb_test "info register fstat" "fstat *0x800.*\[ \t\]+.*" "verify fstat == 0x800" 97 gdb_test "info register ftag" "ftag *0x7.*\[ \t\]+.*" "verify ftag == 0x7" 98} 99 100# Move backward and check we get the same registers back. 101 102with_test_prefix "backward" { 103 gdb_test "reverse-stepi" "asm.*fldz.*" "step to fldz" 104 gdb_test "info register fstat" "fstat *0x1000.*\[ \t\]+.*" "verify fstat == 0x1000" 105 gdb_test "info register ftag" "ftag *0xf.*\[ \t\]+.*" "verify ftag == 0xf" 106 107 gdb_test "reverse-stepi" "asm.*fldln2.*" "step to fldln2" 108 gdb_test "info register fstat" "fstat *0x1800.*\[ \t\]+.*" "verify fstat == 0x1800" 109 gdb_test "info register ftag" "ftag *0x3f.*\[ \t\]+.*" "verify ftag == 0x3f" 110 111 gdb_test "reverse-stepi" "asm.*fldlg2.*" "step to fldlg2" 112 gdb_test "info register fstat" "fstat *0x2000.*\[ \t\]+.*" "verify fstat == 0x2000" 113 gdb_test "info register ftag" "ftag *0xff.*\[ \t\]+.*" "verify ftag == 0xff" 114 115 gdb_test "reverse-stepi" "asm.*fldpi.*" "step to fldpi" 116 gdb_test "info register fstat" "fstat *0x2800.*\[ \t\]+.*" "verify fstat == 0x2800" 117 gdb_test "info register ftag" "ftag *0x3ff.*\[ \t\]+.*" "verify ftag == 0x3ff" 118 119 gdb_test "reverse-stepi" "asm.*fldl2e.*" "step tp fldl2d" 120 gdb_test "info register fstat" "fstat *0x3000.*\[ \t\]+.*" "verify fstat == 0x3000" 121 gdb_test "info register ftag" "ftag *0xfff.*\[ \t\]+.*" "verify ftag == 0xfff" 122 123 gdb_test "reverse-stepi" "asm.*fldl2t.*" "step to fldl2t" 124 gdb_test "info register fstat" "fstat *0x3800.*\[ \t\]+.*" "verify fstat == 0x3800" 125 gdb_test "info register ftag" "ftag *0x3fff.*\[ \t\]+.*" "verify ftag == 0x3fff" 126 127 gdb_test "reverse-stepi" "asm.*fld1.*" "step to fld1" 128 gdb_test "info register fstat" "fstat *0.*\[ \t\]+.*" "verify fstat == 0" 129 gdb_test "info register ftag" "ftag *0xffff.*\[ \t\]+.*" "verify ftag == 0xffff" 130} 131