# Copyright (C) 2008-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/>.
#

# Tests for Powerpc floating point register setting and fetching

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] {
    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"
