# Copyright 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  

# Test for warnings when producing load hazards (instructions that
# reference the target of load one stage further down the pipeline.
# Written by Ben Elliston (bje@redhat.com)

# Run GAS and check that it emits the desired warning for the test case.
# Arguments:
#   file -- name of the test case to assemble.
#   testname -- a string describing the test.
#   warnpattern -- a regular expression, suitable for use by the Tcl
#     regexp command, to decide if the warning string was emitted by
#     the assembler to stderr.

proc iq2000_warning_test { file testname {warnpattern ""} } {
    global comp_output

    gas_run $file "" ">/dev/null"
    verbose "output was $comp_output" 2

    if {$warnpattern == ""} {
	if {$comp_output == ""} { pass $testname } else { fail $testname }
	return
    }

    if {[regexp "Warning: $warnpattern" $comp_output]} {
	pass $testname
    } else {
	fail $testname
    }
}

if [istarget iq2000*-*-*] {
    foreach file [lsort [glob -nocomplain -- $srcdir/$subdir/hazard*.s]] {
	set file [file tail $file]
	switch -- $file {
	    "hazard0.s" {
		set warnpattern "operand references R10 of previous load"
	    }
	    "hazard1.s" {
		set warnpattern "operand references R1 of previous load"
	    }
	    "hazard2.s" {
		set warnpattern "operand references R2 of previous load"
	    }
	    "hazard3.s" {
		set warnpattern "instruction implicitly accesses R31 of previous load"
	    }
	    "hazard4.s" {
		set warnpattern "operand references R10 of previous load"
	    }
	    "hazard5.s" {
		set warnpattern "operand references R8 of previous load"
	    }
	    default {
		error "no expected result specified for $file"
		return
	    }
	}
	iq2000_warning_test $file "assembler emits load hazard warning for $file" $warnpattern
    }

    set testname "assembler emits no warnings when there are no load hazards"
    iq2000_warning_test nohazard.s $testname
}
