# Copyright 2003, 2007-2012 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/>.

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@gnu.org

# This file is part of the gdb testsuite.

#
# Test floating-point related functionality.
#


if { [prepare_for_testing float.exp float float.c] } {
    return -1
}

# Set it up at a breakpoint so we have its registers.

if ![runto_main] then {
    perror "couldn't run to breakpoint"
    continue
}

# Test "info float".

if { [istarget "alpha*-*-*"] } then {
    gdb_test "info float" "f0.*" "info float"
} elseif { [istarget "arm*-*-*"] } then {
    gdb_test_multiple "info float" "info float" {
	-re "Software FPU type.*mask:.*flags:.*$gdb_prompt $" {
	    pass "info float (FPA)"
	}
	-re "fpscr.*s0.*s1.*s31.*$gdb_prompt $" {
	    # Only check for single precision; d0 might be a vector register
	    # if we have NEON.
	    pass "info float (VFP)"
	}
        -re "No floating.point info available for this processor.*" {
            pass "info float (without FPU)"
	}
    }
} elseif { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } then {
    gdb_test "info float" "R7:.*Status Word:.*Opcode:.*" "info float"
} elseif [istarget "ia64-*-*"] then {
    gdb_test "info float" "f0.*f1.*f127.*" "info float"
} elseif [istarget "m68k-*-*"] then {
    gdb_test_multiple "info float" "info_float" {
        -re "fp0.*fp1.*fp7.*$gdb_prompt $" {
            pass "info float (with FPU)"
	}
        -re "No floating.point info available for this processor.*" {
            pass "info float (without FPU)"
	}
    }
} elseif [istarget "mips*-*-*"] then {
    gdb_test "info float" "f0:.*flt:.*dbl:.*" "info float"
} elseif [istarget "powerpc*-*-*"] then {
    gdb_test_multiple "info float" "info_float" {
        -re "f0.*f1.*f31.*fpscr.*$gdb_prompt $" {
            pass "info float (with FPU)"
	}
        -re "No floating.point info available for this processor.*" {
            pass "info float (without FPU)"
	}
    }
} elseif [istarget "s390*-*-*"] then {
    gdb_test "info float" "fpc.*f0.*f1.*f15.*" "info float"
} elseif [istarget "sh*-*"] then {
    # SH may or may not have an FPU
    gdb_test_multiple "info float" "info float" {
	-re "fpul.*fr0.*fr1.*fr15.*$gdb_prompt $" {
	      pass "info float (with FPU)"
	  }
	-re "No floating.point info available for this processor.*" {
	      pass "info float (without FPU)"
	}
    }
} elseif [istarget "hppa*-*"] then {
    gdb_test "info float" "fr4.*fr4R.*fr31R.*" "info float"
} elseif [istarget "sparc*-*-*"] then {
    gdb_test "info float" "f0.*f1.*f31.*d0.*d30.*" "info float"
} else {
    gdb_test "info float" "No floating.point info available for this processor." "info float (unknown target)"
}

gdb_test "step"
gdb_test "finish" "Value returned is .* = (inf|nan).*"
