# Copyright (C) 2008 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@prep.ai.mit.edu
#

# Tests for Powerpc floating point register setting and fetching

if $tracelevel then {
    strace $tracelevel
}

if ![istarget "powerpc*"] then {
    verbose "Skipping powerpc floating point register tests."
    return
}

set testfile "ppc-fp"
set binfile ${objdir}/${subdir}/${testfile}
set srcfile ${testfile}.c

if [get_compiler_info $binfile] {
    warning "get_compiler failed"
    return -1
}

if ![test_compiler_info gcc*] {
    # We use GCC's extended asm syntax
    warning "unknown compiler"
    return -1
}

if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {quiet debug}] != "" } {
    verbose "Skipping FPSCR tests."
    return -1
}

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

gdb_breakpoint [gdb_get_line_number "Invalid operation."]
gdb_breakpoint [gdb_get_line_number "Division by zero."]

gdb_run_cmd

# When the prompt comes back we'll be in the invalid operation breakpoint.
gdb_expect { -re ".*$gdb_prompt $" {} }

# First, verify if FPSCR exists and is all zeroes.
gdb_test_multiple "print \$fpscr" "FPSCR exists" {
  -re " = 0\[\r\n\]+$gdb_prompt $" { pass "FPSCR is all zeroes" }

  -re " = void\[\r\n\]+$gdb_prompt $" {
    # There's no FPSCR.  Skip this testcase.
    verbose "Skipping powerpc floating point register tests."
    return
  }
}

# Step over invalid operation.
gdb_test "next" "" ""

# Verify that the following bits are set (See Power ISA for details):
#
# 32 - Floating-Point Exception Summary (FX)
# 34 - Floating-Point Invalid Operation Summary (VX)
# 42 - Floating-Point Invalid Operation Exception (VXZDZ)
# 47 - Floating-Point Result Class Descriptor (C)
# 51 - Floating-Point Unordered or NaN (FU or ?)
gdb_test "print/t \$fpscr" " = 10100000001000010001000000000000" "FPSCR for invalid operation"

gdb_continue_to_breakpoint "go to division by zero"

# Step over division by zero.
gdb_test "next" "" ""

# Verify that the following bits are set (See Power ISA for details):
#
# 32 - Floating-Point Exception Summary (FX)
# 37 - Floating-Point Zero Divide Exception (ZX)
# 49 - Floating-Point Greater Than or Positive (FG or >)
# 51 - Floating-Point Unordered or NaN (FU or ?)
gdb_test "print/t \$fpscr" " = 10000100000000000101000000000000" "FPSCR for division by zero"
