--- /dev/null
+include Makefile.variables
+include Makefile.local
+include Makefile.generic
+include Makefile.config
+
+.PHONY: web
+
+ifeq ($(HAVE_OCLOSURE), yes)
+web: webconfig
+ @ echo 'module Int = IntByInt64' > src/common/intValueConfig.ml
+ @ $(OCAMLBUILD) src/accweb.byte
+ @ js_of_ocaml accweb.byte
+ @ oclosure_req accweb.js
+ @ mv *.js web
+endif
--- /dev/null
+# -*- Makefile -*-
+
+-include Makefile.local
+
+.PHONY: announce cparserlib webconfig configure
+
+announce:
+ @ echo "Source configuration ..."
+ @ echo 'module Int = IntByBig_int' > src/common/intValueConfig.ml
+
+cparserlib:
+ @ echo "CIL parser compilation ..."
+ @ $(MAKE) --silent -C cparser all install
+
+ifeq ($(HAVE_OCLOSURE), yes)
+webconfig:
+ @ echo "Configuring O'Closure support."
+ @ cat _tags.common > _tags
+ @ cat _tags.js_of_ocaml >> _tags
+else
+webconfig:
+ @ echo "Skipping O'Closure support."
+endif
+
+configure: announce cparserlib
+ @ cat _tags.common > _tags
+ @ cat _tags.compiler >> _tags
+
+
+
--- /dev/null
+# -*- Makefile -*-
+BTARGET = $(TARGET).byte
+JTARGET = $(TARGET).js
+OTARGET = $(TARGET).native
+BLTARGET = $(TARGET).cma
+BNTARGET = $(TARGET).cmxa
+STARGET = $(shell if `which ocamlopt`; then \
+ echo $(OTARGET); \
+ else echo $(BTARGET); fi)
+
+PREFIX ?= /usr/local
+
+TESTDIR = tests
+
+#########################
+## Tools configuration ##
+#########################
+
+# Menhir can be told to produce a parser that explains what
+# it is doing.
+ifeq ($(DEBUGPARSING), yes)
+ MENHIROPT=-yaccflag --explain -yaccflag --trace
+else
+ MENHIROPT=-yaccflag --explain
+endif
+
+# In Emacs, use classic display to enable error jumping.
+TERM = $(shell echo $$TERM)
+ifeq ($(TERM), dumb)
+ OCAMLBUILD = $(OCAMLBUILDCMD) -use-ocamlfind -cflag "-dtypes" -tag debug -classic-display -no-hygiene $(MENHIROPT)
+else
+ OCAMLBUILD = $(OCAMLBUILDCMD) -use-ocamlfind -no-hygiene $(MENHIROPT) -lflags -I,`pwd`/lib
+endif
+
+ifeq ($(PROFILE), 1)
+ OCAMLBUILD += -tag profile
+endif
+
+
+OCAMLDOC = ocamldoc
+HEADACHE = headache
+
+#########
+# Rules #
+#########
+
+.PHONY: configure all-generic byte opt doc clean dist install uninstall headers clear
+
+all-generic: configure clear $(STARGET) $(TARGET)
+
+$(TARGET):
+ ln -s $(STARGET) $(TARGET)
+
+clear:
+ @ rm -f $(STARGET)
+
+opt: $(OTARGET)
+
+byte: $(BTARGET)
+
+%:
+ @ $(OCAMLBUILD) src/$@
+
+$(JTARGET):
+ @ $(OCAMLBUILD) -use-ocamlfind -tag "use-nums" -tag "package(js_of_ocaml)" src/$(BTARGET)
+ js_of_ocaml $(BTARGET)
+
+byte-debug:
+ $(OCAMLBUILD) -tag debug src/$(BTARGET)
+
+ifeq ($(strip $(PREFIX)),)
+install uninstall:
+ @echo "Cannot (un)install $(EXECUTABLE): the PREFIX variable is undefined." && false
+else
+install: $(EXECUTABLE)
+ mkdir -p $(PREFIX)/bin/
+ install $(STARGET) $(PREFIX)/bin/$(TARGET)
+uninstall:
+ /bin/rm -f $(PREFIX)/bin/$(TARGET)
+endif
+
+#######################
+# Administrative part #
+#######################
+
+headers:
+ for i in src/*.ml src/*.mli src/*.mly; do \
+ $(HEADACHE) -h admin/header -c admin/headache.cfg $$i; \
+ done
+
+clean:
+ @ $(OCAMLBUILD) -clean
+ make -C cparser clean
+ make -C $(TESTDIR) clean
+ find -name '*~' -exec rm '{}' \;
+ rm -fr config.log config.status *~ $(TARGET) $(PACKAGE) $(PACKAGE).tar.gz
+
+doc: byte
+ $(OCAMLBUILD) $(TARGET).docdir/index.html
+ mkdir -p doc/html
+ rm -f $(TARGET).docdir/style.css 2> /dev/null
+ mv $(TARGET).docdir/* doc/html
+ rm $(TARGET).docdir
+
+dist:
+ rm -fr $(PACKAGE)
+ mkdir $(PACKAGE)
+ for i in `cat distributed_files` doc/html/*.html; do \
+ if test -f $$i; then \
+ cp -fr --parents $$i $(PACKAGE); \
+ else \
+ mkdir -p $$i; \
+ fi; \
+ done
+ tar cvfz $(PACKAGE).tar.gz $(PACKAGE)
+
+check: all
+ $(MAKE) -C $(TESTDIR) check
--- /dev/null
+include Makefile.variables
+include Makefile.local
+include Makefile.generic
+include Makefile.config
+
+.PHONY: web
+
+ifeq ($(HAVE_OCLOSURE), yes)
+web: webconfig
+ @ echo 'module Int = IntByInt64' > src/common/intValueConfig.ml
+ @ $(OCAMLBUILD) src/accweb.byte
+ @ js_of_ocaml accweb.byte
+ @ oclosure_req accweb.js
+ @ mv *.js web
+endif
\ No newline at end of file
--- /dev/null
+###########################
+## Package configuration ##
+###########################
+.PHONY: all
+
+all: all-generic
+
+VERSION = 0.2
+TARGET = acc
+TARGETEXT = acc
+PACKAGE = acc-$(VERSION)
+
--- /dev/null
+# -*- Makefile -*-
+#
+# Local configuration file.
+#
+
+JS_OF_OCAML = @JS_OF_OCAML@
+OCAMLBUILDCMD = @OCAMLBUILD@
+HAVE_OCLOSURE = @HAVE_OCLOSURE@
+PREFIX = @prefix@
\ No newline at end of file
--- /dev/null
+ Description
+-------------
+
+ This is an experimental annotating C compiler that was built upon
+ the CIL parser[1], Xavier Leroy's translation from C to Clight, and
+ an existing back-end compiler for a register transfer language to a
+ subset of the MIPS assembly language[2].
+
+ We wrote 3 compiler passes: one from Clight to Cminor, another from
+ Cminor to an abstract register transfer language (RTLabs), and a
+ last one from RTLabs to an RTL that uses MIPS instructions. We
+ extended interpreters for the intermediate languages to output a
+ list of labels which denote key control points of the program that
+ have been crossed during the interpretation. These labels are the
+ places where the code can be instrumented to obtain a precise cost
+ annotation. Thus, in that experiment, the annotation function is the
+ composition of a labelling function followed by an instrumentation
+ function.
+
+ The architecture of the compiler is described in full details in the
+ documentation of this development, which can be found in this source
+ tree at doc/html/index.html.
+
+[1] http://cil-parser.sourceforge.net/
+[2] http://www.enseignement.polytechnique.fr/informatique/INF564/petit.tar.gz
+
+ Licence
+---------
+
+ This piece of code must not be distributed. It is addressed to the
+ CerCo partners only.
+
+ Requirements
+--------------
+
+ - ocaml (>= 3.12)
+ - menhir (>= 20090505)
+ - CIL (included in the distribution)
+ - GNU Make (>= 3.8)
+ - gcc
+
+ Compilation
+-------------
+
+ You can compile this compiler using the following command:
+
+ % make
+
+ (assuming that you are located at the root of the source tree)
+
+ Installation
+--------------
+
+ To install the compiler in your favorite system hierarchy, use:
+
+ % PREFIX=your-directory make install
+
+ The executable "acc" will be installed in the subdirectory "bin/" of
+ "your-directory". If PREFIX is not provided, the default directory used will
+ be "/usr/local/bin/".
+
+ Usage
+-------
+
+Usage: acc.native [options] file...
+ -s Choose the source language between:
+ Clight, Cminor
+ [default is C]
+ -l Choose the target language between:
+ Clight, Cminor, RTLabs, RTL, ERTL, LTL, LIN, ASM
+ [default is ASM]
+ -a Add cost annotations on the source code.
+ -i Interpret the compiled code.
+ -d Debugging mode.
+ -dev Playground for developers.
+ -help Display this list of options
+ --help Display this list of options
+
+ Test-suite
+------------
+
+ You can optionnally check that compilation went well by confronting
+ the freshly built compiler to our test-suite. At the root of the
+ source tree, use:
+
+ % make check
+
+ mcu8051ide
+------------
+
+ The object code can be simulated using the mcu8051ide[3] emulator. The code
+ makes use of an external memory and that the usage of such memory is not the
+ default option in mcu8051ide. In order to enable this option, click on the
+ 'Project' menu, and then on 'Edit project'. There is a box to enable 'External
+ RAM (XDATA)' and a scrolling bar to specify its size (we suggest to use the
+ maximum possible). Also, since the produced code might be too big for standard
+ memory, it is recommended to enable 'External ROM/FLASH (XCODE)' to its
+ maximum size.
+
+[3] http://mcu8051ide.sourceforge.net/
+
+ Known bugs
+------------
+
+ - shift operations between [int] and [unsigned int]
+ - accessing an array initialized by a string
--- /dev/null
+<src/*>: pkg_menhirLib, use_str, use_cparser
+<src/clight/*>: use_unix, pkg_menhirLib, use_str, use_cparser
+
+<src>: include
+<src/utilities>: include
+<src/common>: include
+<src/RTL>: include
+<src/ERTL>: include
+<src/LTL>: include
+<src/LIN>: include
+<src/ASM>: include
+<src/clight>: include
+<src/cminor>: include
+<src/RTLabs>: include
+<src/RTL>: include
+
+<*>: use_unix, use_menhir, use_cparser
--- /dev/null
+<src/*>: use_nums
+
--- /dev/null
+
+<src/utilities/*> : package(js_of_ocaml.syntax), package(js_of_ocaml), syntax(camlp4o), package(oclosure)
+<src/*> : package(js_of_ocaml.syntax), package(js_of_ocaml), syntax(camlp4o), package(oclosure)
+<*>: package(js_of_ocaml.syntax), package(js_of_ocaml), syntax(camlp4o), package(oclosure)
--- /dev/null
+Acc
+Options
+AnnotationOptions
+Languages
+Checker
+OptionsParsing
+Position
+ASMCompute_costs
+ASMInterpret
+ASM
+ASMPrinter
+MIPSInterpret
+MIPS
+MIPSOps
+PrintOps
+ClightAnnotator
+ClightInterpret
+ClightLabelling
+Clight
+ClightParser
+ClightPrinter
+ClightToCminor
+CminorAnnotator
+CminorInterpret
+CminorLabelling
+Cminor
+CminorPrinter
+CminorToRTLabs
+AST
+Atom
+AtomSig
+CostLabel
+Label
+Memory
+Primitive
+PrintPrimitive
+Register
+Value
+Build
+ERTLInterpret
+ERTL
+ERTLPrinter
+ERTLToLTLI
+ERTLToLTL
+Liveness
+Uses
+Zero
+LINInterpret
+LIN
+LINPrinter
+LINToASM
+Branch
+LTLInterpret
+LTL
+LTLPrinter
+LTLToLINI
+LTLToLIN
+RTLabsInterpret
+RTLabs
+RTLabsPrinter
+RTLabsToRTL
+RTLInterpret
+RTL
+RTLPrinter
+RTLToERTLI
+RTLToERTL
+Coloring
+Error
+Fix
+Integer
+Interference
+Misc
+MiscPottier
+MyMap
+PrintCFG
+Print
+PrintPottier
+PrioritySet
+SetMap
+Spill
+StringSig
+StringTools
+SyntacticAnalysis
+UnionFind
--- /dev/null
+#!/usr/bin/env ocaml
+
+(* This script is a wrapper for ocamldoc.
+
+ This is a simple workaround for the defaults ocamldoc rules of
+ ocamlbuild. *)
+
+(* We assume that the command line arguments are given in the
+ following order:
+
+ ocamldoc [options] FILE.(ml|mli)
+
+ where FILE is either an implementation or an interface.
+
+ This script rewrites this command line into something of
+ the shape:
+
+ ocamldoc [options] -intf FILE.mli -impl FILE.ml
+
+ provided that FILE.mli and FILE.ml exist (otherwise, one of these
+ two options is dropped out).
+
+*)
+
+open List
+
+let nb = Array.length Sys.argv
+let args = List.tl (Array.to_list Sys.argv)
+let file = Filename.chop_extension (Sys.argv.(nb - 1))
+let file_is = Filename.check_suffix Sys.argv.(nb - 1)
+let impl = file ^ ".ml"
+let opt what f = if Sys.file_exists f then what ^ " " ^ f else ""
+
+let cmd =
+ match args with
+ | [] -> "ocamlfind ocamldoc"
+ | _ ->
+ if file_is ".ml" || file_is ".mli" then
+ let options = rev (tl (rev args)) in
+ Printf.sprintf "ocamlfind ocamldoc %s %s %s"
+ (opt "-impl" (file ^ ".ml"))
+ (opt "-intf" (file ^ ".mli"))
+ (String.concat " " options)
+ else
+ Printf.sprintf "ocamlfind ocamldoc %s"
+ (String.concat " " args)
+
+let _ =
+ exit (Sys.command cmd)
+
--- /dev/null
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"
+ if (eval "$as_required") 2>/dev/null; then :
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir/$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+ if test "x$CONFIG_SHELL" != x; then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno; then :
+ $as_echo "$0: This script requires a shell more modern than all"
+ $as_echo "$0: the shells that I found on your system."
+ if test x${ZSH_VERSION+set} = xset ; then
+ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+PACKAGE_URL=
+
+ac_unique_file="configure.ac"
+ac_subst_vars='LTLIBOBJS
+LIBOBJS
+HAVE_OCLOSURE
+JS_OF_OCAML
+OCAMLBUILD
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+with_webapp
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\_ACEOF
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-webapp support the generation of a WEB application using
+ js_of_ocaml
+
+Report bugs to the package provider.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ $as_echo "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ $as_echo "$as_me: caught signal $ac_signal"
+ $as_echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+ # We do not want a PATH search for config.site.
+ case $CONFIG_SITE in #((
+ -*) ac_site_file1=./$CONFIG_SITE;;
+ */*) ac_site_file1=$CONFIG_SITE;;
+ *) ac_site_file1=./$CONFIG_SITE;;
+ esac
+elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+else
+ ac_site_file1=$ac_default_prefix/share/config.site
+ ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+ test "x$ac_site_file" = xNONE && continue
+ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+for ac_prog in ocamlbuild
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OCAMLBUILD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$OCAMLBUILD"; then
+ ac_cv_prog_OCAMLBUILD="$OCAMLBUILD" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OCAMLBUILD="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+OCAMLBUILD=$ac_cv_prog_OCAMLBUILD
+if test -n "$OCAMLBUILD"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLBUILD" >&5
+$as_echo "$OCAMLBUILD" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$OCAMLBUILD" && break
+done
+
+
+
+
+# Check whether --with-webapp was given.
+if test "${with_webapp+set}" = set; then :
+ withval=$with_webapp;
+else
+ with_webapp=check
+fi
+
+
+echo "let parser_lib = \"`pwd`/lib\"" > myocamlbuild_config.ml
+
+if test "x$with_webapp" != xno; then :
+ for ac_prog in js_of_ocaml
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_JS_OF_OCAML+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$JS_OF_OCAML"; then
+ ac_cv_prog_JS_OF_OCAML="$JS_OF_OCAML" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_JS_OF_OCAML="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+JS_OF_OCAML=$ac_cv_prog_JS_OF_OCAML
+if test -n "$JS_OF_OCAML"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JS_OF_OCAML" >&5
+$as_echo "$JS_OF_OCAML" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$JS_OF_OCAML" && break
+done
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for oclosure" >&5
+$as_echo_n "checking for oclosure... " >&6; }
+ if sh configure-oclosure.sh; then
+ HAVE_OCLOSURE=yes
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ fi
+fi
+
+ac_config_files="$ac_config_files Makefile.variables"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section. Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+:mline
+/\\$/{
+ N
+ s,\\\n,,
+ b mline
+}
+t clear
+:clear
+s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+ g
+ s/^\n//
+ s/\n/ /g
+ p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to the package provider."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ $as_echo "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h | --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "Makefile.variables") CONFIG_FILES="$CONFIG_FILES Makefile.variables" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = "\a"
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+
+eval set X " :F $CONFIG_FILES "
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+
+
+
+ esac
+
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section. Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+:mline
+/\\$/{
+ N
+ s,\\\n,,
+ b mline
+}
+t clear
+:clear
+s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+ g
+ s/^\n//
+ s/\n/ /g
+ p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to the package provider."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ $as_echo "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h | --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "Makefile.variables") CONFIG_FILES="$CONFIG_FILES Makefile.variables" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = "\a"
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+
+eval set X " :F $CONFIG_FILES "
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+
+
+
+ esac
+
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
--- /dev/null
+#!/usr/bin/env sh
+
+rm -f _tags
+cat _tags.compiler > _tags
+cat _tags.js_of_ocaml >> _tags
+ocamlbuild -use-ocamlfind -no-hygiene src/utilities/checkOClosure.byte -quiet || true
+ocamlbuild -clean -quiet
+rm -f _tags
\ No newline at end of file
--- /dev/null
+#
+# Autoconf
+#
+AC_INIT(configure.ac)
+
+AC_CHECK_PROGS([OCAMLBUILD],[ocamlbuild])
+AC_SUBST(OCAMLBUILD)
+
+AC_ARG_WITH([webapp],
+ [AS_HELP_STRING([--with-webapp],
+ [support the generation of a WEB application using js_of_ocaml])],
+ [],
+ [with_webapp=check])
+
+echo "let parser_lib = \"`pwd`/lib\"" > myocamlbuild_config.ml
+
+AS_IF([test "x$with_webapp" != xno],
+ [AC_CHECK_PROGS([JS_OF_OCAML],[js_of_ocaml])
+ AC_SUBST(JS_OF_OCAML)
+ AC_MSG_CHECKING([for oclosure])
+ if sh configure-oclosure.sh; then
+ AC_SUBST(HAVE_OCLOSURE, yes)
+ AC_MSG_RESULT(yes)
+ fi])
+
+AC_OUTPUT(Makefile.variables)
+AC_OUTPUT(Makefile)
+
--- /dev/null
+AddCasts.cmi: C.cmi
+Bitfields.cmi: C.cmi
+Builtins.cmi: Env.cmi C.cmi
+Ceval.cmi: Env.cmi C.cmi
+Cleanup.cmi: C.cmi
+C.cmi:
+Cprint.cmi: C.cmi
+Cutil.cmi: Env.cmi C.cmi
+Elab.cmi: C.cmi
+Env.cmi: C.cmi
+Errors.cmi:
+GCC.cmi: Builtins.cmi
+Lexer.cmi: Parser.cmi
+Machine.cmi:
+Parse_aux.cmi:
+Parse.cmi: C.cmi
+Parser.cmi: Cabs.cmo
+Rename.cmi: C.cmi
+SimplExpr.cmi: C.cmi
+StructAssign.cmi: C.cmi
+StructByValue.cmi: C.cmi
+Transform.cmi: Env.cmi C.cmi
+Unblock.cmi: C.cmi
+AddCasts.cmo: Transform.cmi Cutil.cmi C.cmi AddCasts.cmi
+AddCasts.cmx: Transform.cmx Cutil.cmx C.cmi AddCasts.cmi
+Bitfields.cmo: Transform.cmi Machine.cmi Cutil.cmi C.cmi Bitfields.cmi
+Bitfields.cmx: Transform.cmx Machine.cmx Cutil.cmx C.cmi Bitfields.cmi
+Builtins.cmo: Env.cmi Cutil.cmi C.cmi Builtins.cmi
+Builtins.cmx: Env.cmx Cutil.cmx C.cmi Builtins.cmi
+Cabshelper.cmo: Cabs.cmo
+Cabshelper.cmx: Cabs.cmx
+Cabs.cmo:
+Cabs.cmx:
+Ceval.cmo: Machine.cmi Cutil.cmi C.cmi Ceval.cmi
+Ceval.cmx: Machine.cmx Cutil.cmx C.cmi Ceval.cmi
+Cleanup.cmo: Cutil.cmi C.cmi Cleanup.cmi
+Cleanup.cmx: Cutil.cmx C.cmi Cleanup.cmi
+Cprint.cmo: C.cmi Cprint.cmi
+Cprint.cmx: C.cmi Cprint.cmi
+Cutil.cmo: Machine.cmi Errors.cmi Env.cmi Cprint.cmi C.cmi Cutil.cmi
+Cutil.cmx: Machine.cmx Errors.cmx Env.cmx Cprint.cmx C.cmi Cutil.cmi
+Elab.cmo: Parser.cmi Machine.cmi Lexer.cmi Errors.cmi Env.cmi Cutil.cmi \
+ Cprint.cmi Cleanup.cmi Ceval.cmi Cabshelper.cmo Cabs.cmo C.cmi \
+ Builtins.cmi Elab.cmi
+Elab.cmx: Parser.cmx Machine.cmx Lexer.cmx Errors.cmx Env.cmx Cutil.cmx \
+ Cprint.cmx Cleanup.cmx Ceval.cmx Cabshelper.cmx Cabs.cmx C.cmi \
+ Builtins.cmx Elab.cmi
+Env.cmo: C.cmi Env.cmi
+Env.cmx: C.cmi Env.cmi
+Errors.cmo: Errors.cmi
+Errors.cmx: Errors.cmi
+GCC.cmo: Cutil.cmi C.cmi Builtins.cmi GCC.cmi
+GCC.cmx: Cutil.cmx C.cmi Builtins.cmx GCC.cmi
+Lexer.cmo: Parser.cmi Parse_aux.cmi Cabshelper.cmo Lexer.cmi
+Lexer.cmx: Parser.cmx Parse_aux.cmx Cabshelper.cmx Lexer.cmi
+Machine.cmo: Machine.cmi
+Machine.cmx: Machine.cmi
+Main.cmo: Parse.cmi GCC.cmi Cprint.cmi Builtins.cmi
+Main.cmx: Parse.cmx GCC.cmx Cprint.cmx Builtins.cmx
+Parse_aux.cmo: Errors.cmi Cabshelper.cmo Parse_aux.cmi
+Parse_aux.cmx: Errors.cmx Cabshelper.cmx Parse_aux.cmi
+Parse.cmo: Unblock.cmi StructByValue.cmi StructAssign.cmi SimplExpr.cmi \
+ Rename.cmi Errors.cmi Elab.cmi Bitfields.cmi AddCasts.cmi Parse.cmi
+Parse.cmx: Unblock.cmx StructByValue.cmx StructAssign.cmx SimplExpr.cmx \
+ Rename.cmx Errors.cmx Elab.cmx Bitfields.cmx AddCasts.cmx Parse.cmi
+Parser.cmo: Parse_aux.cmi Cabshelper.cmo Cabs.cmo Parser.cmi
+Parser.cmx: Parse_aux.cmx Cabshelper.cmx Cabs.cmx Parser.cmi
+Rename.cmo: Errors.cmi Cutil.cmi C.cmi Builtins.cmi Rename.cmi
+Rename.cmx: Errors.cmx Cutil.cmx C.cmi Builtins.cmx Rename.cmi
+SimplExpr.cmo: Transform.cmi Errors.cmi Cutil.cmi C.cmi SimplExpr.cmi
+SimplExpr.cmx: Transform.cmx Errors.cmx Cutil.cmx C.cmi SimplExpr.cmi
+StructAssign.cmo: Transform.cmi Errors.cmi Env.cmi Cutil.cmi C.cmi \
+ StructAssign.cmi
+StructAssign.cmx: Transform.cmx Errors.cmx Env.cmx Cutil.cmx C.cmi \
+ StructAssign.cmi
+StructByValue.cmo: Transform.cmi Env.cmi Cutil.cmi C.cmi StructByValue.cmi
+StructByValue.cmx: Transform.cmx Env.cmx Cutil.cmx C.cmi StructByValue.cmi
+Transform.cmo: Env.cmi Cutil.cmi C.cmi Builtins.cmi Transform.cmi
+Transform.cmx: Env.cmx Cutil.cmx C.cmi Builtins.cmx Transform.cmi
+Unblock.cmo: Transform.cmi Errors.cmi Cutil.cmi C.cmi Unblock.cmi
+Unblock.cmx: Transform.cmx Errors.cmx Cutil.cmx C.cmi Unblock.cmi
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Materialize implicit casts *)
+
+(* Assumes: simplified code
+ Produces: simplified code
+ Preserves: unblocked code *)
+
+open C
+open Cutil
+open Transform
+
+(* We have the option of materializing all casts or leave "widening"
+ casts implicit. Widening casts are:
+- from a small integer type to a larger integer type,
+- from a small float type to a larger float type,
+- from a pointer type to void *.
+*)
+
+let omit_widening_casts = ref false
+
+let widening_cast env tfrom tto =
+ begin match unroll env tfrom, unroll env tto with
+ | TInt(k1, _), TInt(k2, _) ->
+ let r1 = integer_rank k1 and r2 = integer_rank k2 in
+ r1 < r2 || (r1 = r2 && is_signed_ikind k1 = is_signed_ikind k2)
+ | TFloat(k1, _), TFloat(k2, _) ->
+ float_rank k1 <= float_rank k2
+ | TPtr(ty1, _), TPtr(ty2, _) -> is_void_type env ty2
+ | _, _ -> false
+ end
+
+let cast_not_needed env tfrom tto =
+ let tfrom = pointer_decay env tfrom
+ and tto = pointer_decay env tto in
+ compatible_types env tfrom tto
+ || (!omit_widening_casts && widening_cast env tfrom tto)
+
+let cast env e tto =
+ if cast_not_needed env e.etyp tto
+ then e
+ else {edesc = ECast(tto, e); etyp = tto}
+
+(* Note: this pass applies only to simplified expressions
+ because casts cannot be materialized in op= expressions... *)
+
+let rec add_expr env e =
+ match e.edesc with
+ | EConst _ -> e
+ | EVar _ -> e
+ | ESizeof _ -> e
+ | EUnop(op, e1) ->
+ let e1' = add_expr env e1 in
+ let desc =
+ match op with
+ | Ominus | Oplus | Onot ->
+ EUnop(op, cast env e1' e.etyp)
+ | Olognot | Oderef | Oaddrof
+ | Odot _ | Oarrow _ ->
+ EUnop(op, e1')
+ | Opreincr | Opredecr | Opostincr | Opostdecr ->
+ assert false (* not simplified *)
+ in { edesc = desc; etyp = e.etyp }
+ | EBinop(op, e1, e2, ty) ->
+ let e1' = add_expr env e1 in
+ let e2' = add_expr env e2 in
+ let desc =
+ match op with
+ | Oadd ->
+ if is_pointer_type env ty
+ then EBinop(Oadd, e1', e2', ty)
+ else EBinop(Oadd, cast env e1' ty, cast env e2' ty, ty)
+ | Osub ->
+ if is_pointer_type env ty
+ then EBinop(Osub, e1', e2', ty)
+ else EBinop(Osub, cast env e1' ty, cast env e2' ty, ty)
+ | Omul|Odiv|Omod|Oand|Oor|Oxor|Oeq|One|Olt|Ogt|Ole|Oge ->
+ EBinop(op, cast env e1' ty, cast env e2' ty, ty)
+ | Oshl|Oshr ->
+ EBinop(op, cast env e1' ty, e2', ty)
+ | Oindex | Ologand | Ologor | Ocomma ->
+ EBinop(op, e1', e2', ty)
+ | Oassign
+ | Oadd_assign|Osub_assign|Omul_assign|Odiv_assign|Omod_assign
+ | Oand_assign|Oor_assign|Oxor_assign|Oshl_assign|Oshr_assign ->
+ assert false (* not simplified *)
+ in { edesc = desc; etyp = e.etyp }
+ | EConditional(e1, e2, e3) ->
+ { edesc =
+ EConditional(add_expr env e1, add_expr env e2, add_expr env e3);
+ etyp = e.etyp }
+ | ECast(ty, e1) ->
+ { edesc = ECast(ty, add_expr env e1); etyp = e.etyp }
+ | ECall(e1, el) ->
+ assert false (* not simplified *)
+
+(* Arguments to a prototyped function *)
+
+let rec add_proto env args params =
+ match args, params with
+ | [], _ -> []
+ | _::_, [] -> add_noproto env args
+ | arg1 :: argl, (_, ty_p) :: paraml ->
+ cast env (add_expr env arg1) ty_p ::
+ add_proto env argl paraml
+
+(* Arguments to a non-prototyped function *)
+
+and add_noproto env args =
+ match args with
+ | [] -> []
+ | arg1 :: argl ->
+ cast env (add_expr env arg1) (default_argument_conversion env arg1.etyp) ::
+ add_noproto env argl
+
+(* Arguments to function calls in general *)
+
+let add_arguments env ty_fun args =
+ let ty_args =
+ match unroll env ty_fun with
+ | TFun(res, args, vararg, a) -> args
+ | TPtr(ty, a) ->
+ begin match unroll env ty with
+ | TFun(res, args, vararg, a) -> args
+ | _ -> assert false
+ end
+ | _ -> assert false in
+ match ty_args with
+ | None -> add_noproto env args
+ | Some targs -> add_proto env args targs
+
+(* Toplevel expressions (appearing in Sdo statements) *)
+
+let add_topexpr env loc e =
+ match e.edesc with
+ | EBinop(Oassign, lhs, {edesc = ECall(e1, el); etyp = ty}, _) ->
+ let ecall =
+ {edesc = ECall(add_expr env e1, add_arguments env e1.etyp el);
+ etyp = ty} in
+ if cast_not_needed env ty lhs.etyp then
+ sassign loc (add_expr env lhs) ecall
+ else begin
+ let tmp = new_temp (erase_attributes_type env ty) in
+ sseq loc (sassign loc tmp ecall)
+ (sassign loc (add_expr env lhs) (cast env tmp lhs.etyp))
+ end
+ | EBinop(Oassign, lhs, rhs, _) ->
+ sassign loc (add_expr env lhs) (cast env (add_expr env rhs) lhs.etyp)
+ | ECall(e1, el) ->
+ let ecall =
+ {edesc = ECall(add_expr env e1, add_arguments env e1.etyp el);
+ etyp = e.etyp} in
+ {sdesc = Sdo ecall; sloc = loc}
+ | _ ->
+ assert false
+
+(* Initializers *)
+
+let rec add_init env tto = function
+ | Init_single e ->
+ Init_single (cast env (add_expr env e) tto)
+ | Init_array il ->
+ let ty_elt =
+ match unroll env tto with
+ | TArray(ty, _, _) -> ty | _ -> assert false in
+ Init_array (List.map (add_init env ty_elt) il)
+ | Init_struct(id, fil) ->
+ Init_struct (id, List.map
+ (fun (fld, i) -> (fld, add_init env fld.fld_typ i))
+ fil)
+ | Init_union(id, fld, i) ->
+ Init_union(id, fld, add_init env fld.fld_typ i)
+
+(* Declarations *)
+
+let add_decl env (sto, id, ty, optinit) =
+ (sto, id, ty,
+ begin match optinit with
+ | None -> None
+ | Some init -> Some(add_init env ty init)
+ end)
+
+(* Statements *)
+
+let rec add_stmt env f s =
+ match s.sdesc with
+ | Sskip -> s
+ | Sdo e -> add_topexpr env s.sloc e
+ | Sseq(s1, s2) ->
+ {sdesc = Sseq(add_stmt env f s1, add_stmt env f s2); sloc = s.sloc }
+ | Sif(e, s1, s2) ->
+ {sdesc = Sif(add_expr env e, add_stmt env f s1, add_stmt env f s2);
+ sloc = s.sloc}
+ | Swhile(e, s1) ->
+ {sdesc = Swhile(add_expr env e, add_stmt env f s1);
+ sloc = s.sloc}
+ | Sdowhile(s1, e) ->
+ {sdesc = Sdowhile(add_stmt env f s1, add_expr env e);
+ sloc = s.sloc}
+ | Sfor(s1, e, s2, s3) ->
+ {sdesc = Sfor(add_stmt env f s1, add_expr env e, add_stmt env f s2,
+ add_stmt env f s3);
+ sloc = s.sloc}
+ | Sbreak -> s
+ | Scontinue -> s
+ | Sswitch(e, s1) ->
+ {sdesc = Sswitch(add_expr env e, add_stmt env f s1); sloc = s.sloc}
+ | Slabeled(lbl, s) ->
+ {sdesc = Slabeled(lbl, add_stmt env f s); sloc = s.sloc}
+ | Sgoto lbl -> s
+ | Sreturn None -> s
+ | Sreturn (Some e) ->
+ {sdesc = Sreturn(Some(cast env (add_expr env e) f.fd_ret)); sloc = s.sloc}
+ | Sblock sl ->
+ {sdesc = Sblock(List.map (add_stmt env f) sl); sloc = s.sloc}
+ | Sdecl d ->
+ {sdesc = Sdecl(add_decl env d); sloc = s.sloc}
+
+let add_fundef env f =
+ reset_temps();
+ let body' = add_stmt env f f.fd_body in
+ let temps = get_temps () in
+ (* fd_locals have no initializers, so no need to transform them *)
+ { f with fd_locals = f.fd_locals @ temps; fd_body = body' }
+
+
+let program ?(all = false) p =
+ omit_widening_casts := not all;
+ Transform.program ~decl:add_decl ~fundef:add_fundef p
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+val program: ?all: bool -> C.program -> C.program
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Elimination of bit fields in structs *)
+
+(* Assumes: unblocked, simplified code.
+ Preserves: unblocked, simplified code. *)
+
+open Printf
+open Machine
+open C
+open Cutil
+open Transform
+
+(* Info associated to each bitfield *)
+
+type bitfield_info =
+ { bf_carrier: string; (* name of underlying regular field *)
+ bf_carrier_typ: typ; (* type of underlying regular field *)
+ bf_pos: int; (* start bit *)
+ bf_size: int; (* size in bit *)
+ bf_signed: bool } (* signed or unsigned *)
+
+(* invariants:
+ 0 <= pos < bitsizeof(int)
+ 0 < sz <= bitsizeof(int)
+ 0 < pos + sz <= bitsizeof(int)
+*)
+
+(* Mapping (struct identifier, bitfield name) -> bitfield info *)
+
+let bitfield_table =
+ (Hashtbl.create 57: (ident * string, bitfield_info) Hashtbl.t)
+
+(* Packing algorithm -- keep consistent with [Cutil.pack_bitfield]! *)
+
+let unsigned_ikind_for_carrier nbits =
+ if nbits <= 8 then IUChar else
+ if nbits <= 8 * !config.sizeof_short then IUShort else
+ if nbits <= 8 * !config.sizeof_int then IUInt else
+ if nbits <= 8 * !config.sizeof_long then IULong else
+ if nbits <= 8 * !config.sizeof_longlong then IULongLong else
+ assert false
+
+let pack_bitfields env id ml =
+ let rec pack accu pos = function
+ | [] ->
+ (pos, accu, [])
+ | m :: ms as ml ->
+ match m.fld_bitfield with
+ | None -> (pos, accu, ml)
+ | Some n ->
+ if n = 0 then
+ (pos, accu, ms) (* bit width 0 means end of pack *)
+ else if pos + n > 8 * !config.sizeof_int then
+ (pos, accu, ml) (* doesn't fit in current word *)
+ else begin
+ let signed =
+ match unroll env m.fld_typ with
+ | TInt(ik, _) -> is_signed_ikind ik
+ | _ -> assert false (* should never happen, checked in Elab *) in
+ pack ((m.fld_name, pos, n, signed) :: accu) (pos + n) ms
+ end
+ in pack [] 0 ml
+
+let rec transf_members env id count = function
+ | [] -> []
+ | m :: ms as ml ->
+ if m.fld_bitfield = None then
+ m :: transf_members env id count ms
+ else begin
+ let (nbits, bitfields, ml') = pack_bitfields env id ml in
+ let carrier = sprintf "__bf%d" count in
+ let carrier_typ = TInt(unsigned_ikind_for_carrier nbits, []) in
+ List.iter
+ (fun (name, pos, sz, signed) ->
+ Hashtbl.add bitfield_table
+ (id, name)
+ {bf_carrier = carrier; bf_carrier_typ = carrier_typ;
+ bf_pos = pos; bf_size = sz; bf_signed = signed})
+ bitfields;
+ { fld_name = carrier; fld_typ = carrier_typ; fld_bitfield = None}
+ :: transf_members env id (count + 1) ml'
+ end
+
+let transf_composite env su id ml =
+ match su with
+ | Struct -> transf_members env id 1 ml
+ | Union -> ml
+
+(* Bitfield manipulation expressions *)
+
+let left_shift_count bf =
+ intconst
+ (Int64.of_int (8 * !config.sizeof_int - (bf.bf_pos + bf.bf_size)))
+ IInt
+
+let right_shift_count bf =
+ intconst
+ (Int64.of_int (8 * !config.sizeof_int - bf.bf_size))
+ IInt
+
+let insertion_mask bf =
+ let m =
+ Int64.shift_left
+ (Int64.pred (Int64.shift_left 1L bf.bf_size))
+ bf.bf_pos in
+ (* Give the mask an hexadecimal string representation, nicer to read *)
+ {edesc = EConst(CInt(m, IUInt, sprintf "0x%LXU" m)); etyp = TInt(IUInt, [])}
+
+(* Extract the value of a bitfield *)
+
+(* Reference C code:
+
+unsigned int bitfield_unsigned_extract(unsigned int x, int ofs, int sz)
+{
+ return (x << (BITSIZE_UINT - (ofs + sz))) >> (BITSIZE_UINT - sz);
+}
+
+signed int bitfield_signed_extract(unsigned int x, int ofs, int sz)
+{
+ return ((signed int) (x << (BITSIZE_UINT - (ofs + sz))))
+ >> (BITSIZE_UINT - sz);
+}
+
+*)
+
+let bitfield_extract bf carrier =
+ let e1 =
+ {edesc = EBinop(Oshl, carrier, left_shift_count bf, TInt(IUInt, []));
+ etyp = carrier.etyp} in
+ let ty = TInt((if bf.bf_signed then IInt else IUInt), []) in
+ let e2 =
+ {edesc = ECast(ty, e1); etyp = ty} in
+ {edesc = EBinop(Oshr, e2, right_shift_count bf, e2.etyp);
+ etyp = e2.etyp}
+
+(* Assign a bitfield within a carrier *)
+
+(* Reference C code:
+
+unsigned int bitfield_insert(unsigned int x, int ofs, int sz, unsigned int y)
+{
+ unsigned int mask = ((1U << sz) - 1) << ofs;
+ return (x & ~mask) | ((y << ofs) & mask);
+}
+
+*)
+
+let bitfield_assign bf carrier newval =
+ let msk = insertion_mask bf in
+ let notmsk = {edesc = EUnop(Onot, msk); etyp = msk.etyp} in
+ let newval_shifted =
+ {edesc = EBinop(Oshl, newval, intconst (Int64.of_int bf.bf_pos) IUInt,
+ TInt(IUInt,[]));
+ etyp = TInt(IUInt,[])} in
+ let newval_masked =
+ {edesc = EBinop(Oand, newval_shifted, msk, TInt(IUInt,[]));
+ etyp = TInt(IUInt,[])}
+ and oldval_masked =
+ {edesc = EBinop(Oand, carrier, notmsk, TInt(IUInt,[]));
+ etyp = TInt(IUInt,[])} in
+ {edesc = EBinop(Oor, oldval_masked, newval_masked, TInt(IUInt,[]));
+ etyp = TInt(IUInt,[])}
+
+(* Expressions *)
+
+let transf_expr env e =
+
+ let is_bitfield_access ty fieldname =
+ match unroll env ty with
+ | TStruct(id, _) ->
+ (try Some(Hashtbl.find bitfield_table (id, fieldname))
+ with Not_found -> None)
+ | _ -> None in
+
+ let is_bitfield_access_ptr ty fieldname =
+ match unroll env ty with
+ | TPtr(ty', _) -> is_bitfield_access ty' fieldname
+ | _ -> None in
+
+ let rec texp e =
+ match e.edesc with
+ | EConst _ -> e
+ | ESizeof _ -> e
+ | EVar _ -> e
+
+ | EUnop(Odot fieldname, e1) ->
+ let e1' = texp e1 in
+ begin match is_bitfield_access e1.etyp fieldname with
+ | None ->
+ {edesc = EUnop(Odot fieldname, e1'); etyp = e.etyp}
+ | Some bf ->
+ bitfield_extract bf
+ {edesc = EUnop(Odot bf.bf_carrier, e1');
+ etyp = bf.bf_carrier_typ}
+ end
+
+ | EUnop(Oarrow fieldname, e1) ->
+ let e1' = texp e1 in
+ begin match is_bitfield_access_ptr e1.etyp fieldname with
+ | None ->
+ {edesc = EUnop(Oarrow fieldname, e1'); etyp = e.etyp}
+ | Some bf ->
+ bitfield_extract bf
+ {edesc = EUnop(Oarrow bf.bf_carrier, e1');
+ etyp = bf.bf_carrier_typ}
+ end
+
+ | EUnop(op, e1) ->
+ (* Note: simplified expr, so no ++/-- *)
+ {edesc = EUnop(op, texp e1); etyp = e.etyp}
+
+ | EBinop(Oassign, e1, e2, ty) ->
+ begin match e1.edesc with
+ | EUnop(Odot fieldname, e11) ->
+ let lhs = texp e11 in let rhs = texp e2 in
+ begin match is_bitfield_access e11.etyp fieldname with
+ | None ->
+ {edesc = EBinop(Oassign,
+ {edesc = EUnop(Odot fieldname, lhs);
+ etyp = e1.etyp},
+ rhs, ty);
+ etyp = e.etyp}
+ | Some bf ->
+ let carrier =
+ {edesc = EUnop(Odot bf.bf_carrier, lhs);
+ etyp = bf.bf_carrier_typ} in
+ {edesc = EBinop(Oassign, carrier,
+ bitfield_assign bf carrier rhs,
+ carrier.etyp);
+ etyp = carrier.etyp}
+ end
+ | EUnop(Oarrow fieldname, e11) ->
+ let lhs = texp e11 in let rhs = texp e2 in
+ begin match is_bitfield_access_ptr e11.etyp fieldname with
+ | None ->
+ {edesc = EBinop(Oassign,
+ {edesc = EUnop(Oarrow fieldname, lhs);
+ etyp = e1.etyp},
+ rhs, ty);
+ etyp = e.etyp}
+ | Some bf ->
+ let carrier =
+ {edesc = EUnop(Oarrow bf.bf_carrier, lhs);
+ etyp = bf.bf_carrier_typ} in
+ {edesc = EBinop(Oassign, carrier,
+ bitfield_assign bf carrier rhs,
+ carrier.etyp);
+ etyp = carrier.etyp}
+ end
+ | _ ->
+ {edesc = EBinop(Oassign, texp e1, texp e2, e1.etyp); etyp = e1.etyp}
+ end
+
+ | EBinop(op, e1, e2, ty) ->
+ (* Note: simplified expr assumed, so no assign-op *)
+ {edesc = EBinop(op, texp e1, texp e2, ty); etyp = e.etyp}
+ | EConditional(e1, e2, e3) ->
+ {edesc = EConditional(texp e1, texp e2, texp e3); etyp = e.etyp}
+ | ECast(ty, e1) ->
+ {edesc = ECast(ty, texp e1); etyp = e.etyp}
+ | ECall(e1, el) ->
+ {edesc = ECall(texp e1, List.map texp el); etyp = e.etyp}
+
+ in texp e
+
+(* Statements *)
+
+let rec transf_stmt env s =
+ match s.sdesc with
+ | Sskip -> s
+ | Sdo e ->
+ {sdesc = Sdo(transf_expr env e); sloc = s.sloc}
+ | Sseq(s1, s2) ->
+ {sdesc = Sseq(transf_stmt env s1, transf_stmt env s2); sloc = s.sloc }
+ | Sif(e, s1, s2) ->
+ {sdesc = Sif(transf_expr env e, transf_stmt env s1, transf_stmt env s2);
+ sloc = s.sloc}
+ | Swhile(e, s1) ->
+ {sdesc = Swhile(transf_expr env e, transf_stmt env s1);
+ sloc = s.sloc}
+ | Sdowhile(s1, e) ->
+ {sdesc = Sdowhile(transf_stmt env s1, transf_expr env e);
+ sloc = s.sloc}
+ | Sfor(s1, e, s2, s3) ->
+ {sdesc = Sfor(transf_stmt env s1, transf_expr env e, transf_stmt env s2,
+ transf_stmt env s3);
+ sloc = s.sloc}
+ | Sbreak -> s
+ | Scontinue -> s
+ | Sswitch(e, s1) ->
+ {sdesc = Sswitch(transf_expr env e, transf_stmt env s1); sloc = s.sloc}
+ | Slabeled(lbl, s) ->
+ {sdesc = Slabeled(lbl, transf_stmt env s); sloc = s.sloc}
+ | Sgoto lbl -> s
+ | Sreturn None -> s
+ | Sreturn (Some e) ->
+ {sdesc = Sreturn(Some(transf_expr env e)); sloc = s.sloc}
+ | Sblock _ | Sdecl _ ->
+ assert false (* should not occur in unblocked code *)
+
+(* Functions *)
+
+let transf_fundef env f =
+ { f with fd_body = transf_stmt env f.fd_body }
+
+(* Initializers *)
+
+let bitfield_initializer bf i =
+ match i with
+ | Init_single e ->
+ let m = Int64.pred (Int64.shift_left 1L bf.bf_size) in
+ let e_mask =
+ {edesc = EConst(CInt(m, IUInt, sprintf "0x%LXU" m));
+ etyp = TInt(IUInt, [])} in
+ let e_and =
+ {edesc = EBinop(Oand, e, e_mask, TInt(IUInt,[]));
+ etyp = TInt(IUInt,[])} in
+ {edesc = EBinop(Oshl, e_and, intconst (Int64.of_int bf.bf_pos) IInt,
+ TInt(IUInt, []));
+ etyp = TInt(IUInt, [])}
+ | _ -> assert false
+
+let rec pack_bitfield_init id carrier fld_init_list =
+ match fld_init_list with
+ | [] -> ([], [])
+ | (fld, i) :: rem ->
+ try
+ let bf = Hashtbl.find bitfield_table (id, fld.fld_name) in
+ if bf.bf_carrier <> carrier then
+ ([], fld_init_list)
+ else begin
+ let (el, rem') = pack_bitfield_init id carrier rem in
+ (bitfield_initializer bf i :: el, rem')
+ end
+ with Not_found ->
+ ([], fld_init_list)
+
+let rec or_expr_list = function
+ | [] -> assert false
+ | [e] -> e
+ | e1 :: el ->
+ {edesc = EBinop(Oor, e1, or_expr_list el, TInt(IUInt,[]));
+ etyp = TInt(IUInt,[])}
+
+let rec transf_struct_init id fld_init_list =
+ match fld_init_list with
+ | [] -> []
+ | (fld, i) :: rem ->
+ try
+ let bf = Hashtbl.find bitfield_table (id, fld.fld_name) in
+ let (el, rem') =
+ pack_bitfield_init id bf.bf_carrier fld_init_list in
+ ({fld_name = bf.bf_carrier; fld_typ = bf.bf_carrier_typ;
+ fld_bitfield = None},
+ Init_single {edesc = ECast(bf.bf_carrier_typ, or_expr_list el);
+ etyp = bf.bf_carrier_typ})
+ :: transf_struct_init id rem'
+ with Not_found ->
+ (fld, i) :: transf_struct_init id rem
+
+let rec transf_init env i =
+ match i with
+ | Init_single e -> Init_single (transf_expr env e)
+ | Init_array il -> Init_array (List.map (transf_init env) il)
+ | Init_struct(id, fld_init_list) ->
+ let fld_init_list' =
+ List.map (fun (f, i) -> (f, transf_init env i)) fld_init_list in
+ Init_struct(id, transf_struct_init id fld_init_list')
+ | Init_union(id, fld, i) -> Init_union(id, fld, transf_init env i)
+
+let transf_decl env (sto, id, ty, init_opt) =
+ (sto, id, ty,
+ match init_opt with None -> None | Some i -> Some(transf_init env i))
+
+(* Programs *)
+
+let program p =
+ Transform.program
+ ~composite:transf_composite
+ ~decl: transf_decl
+ ~fundef:transf_fundef
+ p
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+val program: C.program -> C.program
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Compiler built-ins *)
+
+open C
+open Cutil
+
+let env = ref Env.empty
+let idents = ref []
+let decls = ref []
+
+let environment () = !env
+let identifiers () = !idents
+let declarations () = List.rev !decls
+
+let add_typedef (s, ty) =
+ let (id, env') = Env.enter_typedef !env s ty in
+ env := env';
+ idents := id :: !idents;
+ decls := {gdesc = Gtypedef(id, ty); gloc = no_loc} :: !decls
+
+let add_function (s, (res, args, va)) =
+ let ty =
+ TFun(res,
+ Some (List.map (fun ty -> (Env.fresh_ident "", ty)) args),
+ va, []) in
+ let (id, env') = Env.enter_ident !env s Storage_extern ty in
+ env := env';
+ idents := id :: !idents;
+ decls := {gdesc = Gdecl(Storage_extern, id, ty, None); gloc = no_loc} :: !decls
+
+type t = {
+ typedefs: (string * C.typ) list;
+ functions: (string * (C.typ * C.typ list * bool)) list
+}
+
+let set blt =
+ env := Env.empty;
+ idents := [];
+ List.iter add_typedef blt.typedefs;
+ List.iter add_function blt.functions
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+val environment: unit -> Env.t
+val identifiers: unit -> C.ident list
+val declarations: unit -> C.globdecl list
+
+type t = {
+ typedefs: (string * C.typ) list;
+ functions: (string * (C.typ * C.typ list * bool)) list
+}
+
+val set: t -> unit
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* C abstract syntax after elaboration *)
+
+(* Locations *)
+
+type location = string * int (* filename, line number *)
+
+(* Identifiers *)
+
+type ident =
+ { name: string; (* name as in the source *)
+ stamp: int } (* unique ID *)
+
+(* kinds of integers *)
+
+type ikind =
+ | IBool (** [_Bool] *)
+ | IChar (** [char] *)
+ | ISChar (** [signed char] *)
+ | IUChar (** [unsigned char] *)
+ | IInt (** [int] *)
+ | IUInt (** [unsigned int] *)
+ | IShort (** [short] *)
+ | IUShort (** [unsigned short] *)
+ | ILong (** [long] *)
+ | IULong (** [unsigned long] *)
+ | ILongLong (** [long long] (or [_int64] on Microsoft Visual C) *)
+ | IULongLong (** [unsigned long long] (or [unsigned _int64] on Microsoft
+ Visual C) *)
+
+(** Kinds of floating-point numbers*)
+
+type fkind =
+ FFloat (** [float] *)
+ | FDouble (** [double] *)
+ | FLongDouble (** [long double] *)
+
+
+(** Constants *)
+
+type constant =
+ | CInt of int64 * ikind * string (* as it appeared in the source *)
+ | CFloat of float * fkind * string (* as it appeared in the source *)
+ | CStr of string
+ | CWStr of int64 list
+ | CEnum of ident * int64 (* enum tag, integer value *)
+
+(** Attributes *)
+
+type attribute = AConst | AVolatile | ARestrict
+
+type attributes = attribute list
+
+(** Storage classes *)
+
+type storage =
+ | Storage_default
+ | Storage_extern
+ | Storage_static
+ | Storage_register
+
+(** Unary operators *)
+
+type unary_operator =
+ | Ominus (* unary "-" *)
+ | Oplus (* unary "+" *)
+ | Olognot (* "!" *)
+ | Onot (* "~" *)
+ | Oderef (* unary "*" *)
+ | Oaddrof (* "&" *)
+ | Opreincr (* "++" prefix *)
+ | Opredecr (* "--" prefix *)
+ | Opostincr (* "++" postfix *)
+ | Opostdecr (* "--" postfix *)
+ | Odot of string (* ".field" *)
+ | Oarrow of string (* "->field" *)
+
+type binary_operator =
+ | Oadd (* binary "+" *)
+ | Osub (* binary "-" *)
+ | Omul (* binary "*" *)
+ | Odiv (* "/" *)
+ | Omod (* "%" *)
+ | Oand (* "&" *)
+ | Oor (* "|" *)
+ | Oxor (* "^" *)
+ | Oshl (* "<<" *)
+ | Oshr (* ">>" *)
+ | Oeq (* "==" *)
+ | One (* "!=" *)
+ | Olt (* "<" *)
+ | Ogt (* ">" *)
+ | Ole (* "<=" *)
+ | Oge (* ">=" *)
+ | Oindex (* "a[i]" *)
+ | Oassign (* "=" *)
+ | Oadd_assign (* "+=" *)
+ | Osub_assign (* "-=" *)
+ | Omul_assign (* "*=" *)
+ | Odiv_assign (* "/=" *)
+ | Omod_assign (* "%=" *)
+ | Oand_assign (* "&=" *)
+ | Oor_assign (* "|=" *)
+ | Oxor_assign (* "^=" *)
+ | Oshl_assign (* "<<=" *)
+ | Oshr_assign (* ">>=" *)
+ | Ocomma (* "," *)
+ | Ologand (* "&&" *)
+ | Ologor (* "||" *)
+
+(** Types *)
+
+type typ =
+ | TVoid of attributes
+ | TInt of ikind * attributes
+ | TFloat of fkind * attributes
+ | TPtr of typ * attributes
+ | TArray of typ * int64 option * attributes
+ | TFun of typ * (ident * typ) list option * bool * attributes
+ | TNamed of ident * attributes
+ | TStruct of ident * attributes
+ | TUnion of ident * attributes
+
+(** Expressions *)
+
+type exp = { edesc: exp_desc; etyp: typ }
+
+and exp_desc =
+ | EConst of constant
+ | ESizeof of typ
+ | EVar of ident
+ | EUnop of unary_operator * exp
+ | EBinop of binary_operator * exp * exp * typ
+ (* the type at which the operation is performed *)
+ | EConditional of exp * exp * exp
+ | ECast of typ * exp
+ | ECall of exp * exp list
+
+(** Statements *)
+
+type stmt = { sdesc: stmt_desc; sloc: location }
+
+and stmt_desc =
+ | Sskip
+ | Sdo of exp
+ | Sseq of stmt * stmt
+ | Sif of exp * stmt * stmt
+ | Swhile of exp * stmt
+ | Sdowhile of stmt * exp
+ | Sfor of stmt * exp * stmt * stmt
+ | Sbreak
+ | Scontinue
+ | Sswitch of exp * stmt
+ | Slabeled of slabel * stmt
+ | Sgoto of string
+ | Sreturn of exp option
+ | Sblock of stmt list
+ | Sdecl of decl
+
+and slabel =
+ | Slabel of string
+ | Scase of exp
+ | Sdefault
+
+(** Declarations *)
+
+and decl =
+ storage * ident * typ * init option
+
+(** Initializers *)
+
+and init =
+ | Init_single of exp
+ | Init_array of init list
+ | Init_struct of ident * (field * init) list
+ | Init_union of ident * field * init
+
+(** Struct or union field *)
+
+and field = {
+ fld_name: string;
+ fld_typ: typ;
+ fld_bitfield: int option
+}
+
+type struct_or_union =
+ | Struct
+ | Union
+
+(** Function definitions *)
+
+type fundef = {
+ fd_storage: storage;
+ fd_inline: bool;
+ fd_name: ident;
+ fd_ret: typ; (* return type *)
+ fd_params: (ident * typ) list; (* formal parameters *)
+ fd_vararg: bool; (* variable arguments? *)
+ fd_locals: decl list; (* local variables *)
+ fd_body: stmt
+}
+
+(** Global declarations *)
+
+type globdecl =
+ { gdesc: globdecl_desc; gloc: location }
+
+and globdecl_desc =
+ | Gdecl of decl (* variable declaration, function prototype *)
+ | Gfundef of fundef (* function definition *)
+ | Gcompositedecl of struct_or_union * ident (* struct/union declaration *)
+ | Gcompositedef of struct_or_union * ident * field list
+ (* struct/union definition *)
+ | Gtypedef of ident * typ (* typedef *)
+ | Genumdef of ident * (ident * exp option) list (* enum definition *)
+ | Gpragma of string (* #pragma directive *)
+
+type program = globdecl list
--- /dev/null
+include GCC
--- /dev/null
+(*
+ *
+ * Copyright (c) 2001-2002,
+ * George C. Necula <necula@cs.berkeley.edu>
+ * Scott McPeak <smcpeak@cs.berkeley.edu>
+ * Wes Weimer <weimer@cs.berkeley.edu>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. The names of the contributors may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *)
+
+(** This file was originally part of Hugues Casee's frontc 2.0, and has been
+ * extensively changed since.
+**
+** 1.0 3.22.99 Hugues Cassé First version.
+** 2.0 George Necula 12/12/00: Many extensions
+ **)
+
+(*
+** Types
+*)
+
+type cabsloc = {
+ lineno : int;
+ filename: string;
+ byteno: int;
+ ident : int;
+}
+
+type typeSpecifier = (* Merge all specifiers into one type *)
+ Tvoid (* Type specifier ISO 6.7.2 *)
+ | Tchar
+ | Tshort
+ | Tint
+ | Tlong
+ | Tint64
+ | T_Bool
+ | Tfloat
+ | Tdouble
+ | Tsigned
+ | Tunsigned
+ | Tnamed of string
+ (* each of the following three kinds of specifiers contains a field
+ * or item list iff it corresponds to a definition (as opposed to
+ * a forward declaration or simple reference to the type); they
+ * also have a list of __attribute__s that appeared between the
+ * keyword and the type name (definitions only) *)
+ | Tstruct of string * field_group list option * attribute list
+ | Tunion of string * field_group list option * attribute list
+ | Tenum of string * enum_item list option * attribute list
+ | TtypeofE of expression (* GCC __typeof__ *)
+ | TtypeofT of specifier * decl_type (* GCC __typeof__ *)
+
+and storage =
+ NO_STORAGE | AUTO | STATIC | EXTERN | REGISTER
+
+and funspec =
+ INLINE | VIRTUAL | EXPLICIT
+
+and cvspec =
+ CV_CONST | CV_VOLATILE | CV_RESTRICT
+
+(* Type specifier elements. These appear at the start of a declaration *)
+(* Everywhere they appear in this file, they appear as a 'spec_elem list', *)
+(* which is not interpreted by cabs -- rather, this "word soup" is passed *)
+(* on to the compiler. Thus, we can represent e.g. 'int long float x' even *)
+(* though the compiler will of course choke. *)
+and spec_elem =
+ SpecTypedef
+ | SpecCV of cvspec (* const/volatile *)
+ | SpecAttr of attribute (* __attribute__ *)
+ | SpecStorage of storage
+ | SpecInline
+ | SpecType of typeSpecifier
+
+(* decided to go ahead and replace 'spec_elem list' with specifier *)
+and specifier = spec_elem list
+
+
+(* Declarator type. They modify the base type given in the specifier. Keep
+ * them in the order as they are printed (this means that the top level
+ * constructor for ARRAY and PTR is the inner-level in the meaning of the
+ * declared type) *)
+and decl_type =
+ | JUSTBASE (* Prints the declared name *)
+ | PARENTYPE of attribute list * decl_type * attribute list
+ (* Prints "(attrs1 decl attrs2)".
+ * attrs2 are attributes of the
+ * declared identifier and it is as
+ * if they appeared at the very end
+ * of the declarator. attrs1 can
+ * contain attributes for the
+ * identifier or attributes for the
+ * enclosing type. *)
+ | ARRAY of decl_type * attribute list * expression
+ (* Prints "decl [ attrs exp ]".
+ * decl is never a PTR. *)
+ | PTR of attribute list * decl_type (* Prints "* attrs decl" *)
+ | PROTO of decl_type * single_name list * bool
+ (* Prints "decl (args[, ...])".
+ * decl is never a PTR.*)
+
+(* The base type and the storage are common to all names. Each name might
+ * contain type or storage modifiers *)
+(* e.g.: int x, y; *)
+and name_group = specifier * name list
+
+(* The optional expression is the bitfield *)
+and field_group = specifier * (name * expression option) list
+
+(* like name_group, except the declared variables are allowed to have initializers *)
+(* e.g.: int x=1, y=2; *)
+and init_name_group = specifier * init_name list
+
+(* The decl_type is in the order in which they are printed. Only the name of
+ * the declared identifier is pulled out. The attributes are those that are
+ * printed after the declarator *)
+(* e.g: in "int *x", "*x" is the declarator; "x" will be pulled out as *)
+(* the string, and decl_type will be PTR([], JUSTBASE) *)
+and name = string * decl_type * attribute list * cabsloc
+
+(* A variable declarator ("name") with an initializer *)
+and init_name = name * init_expression
+
+(* Single names are for declarations that cannot come in groups, like
+ * function parameters and functions *)
+and single_name = specifier * name
+
+
+and enum_item = string * expression * cabsloc
+
+(*
+** Declaration definition (at toplevel)
+*)
+and definition =
+ FUNDEF of single_name * block * cabsloc * cabsloc
+ | DECDEF of init_name_group * cabsloc (* global variable(s), or function prototype *)
+ | TYPEDEF of name_group * cabsloc
+ | ONLYTYPEDEF of specifier * cabsloc
+ | GLOBASM of string * cabsloc
+ | PRAGMA of string * cabsloc
+ | LINKAGE of string * cabsloc * definition list (* extern "C" { ... } *)
+
+(* the string is a file name, and then the list of toplevel forms *)
+and file = string * definition list
+
+
+(*
+** statements
+*)
+
+(* A block contains a list of local label declarations ( GCC's ({ __label__
+ * l1, l2; ... }) ) , a list of definitions and a list of statements *)
+and block =
+ { blabels: string list;
+ battrs: attribute list;
+ bstmts: statement list
+ }
+
+(* GCC asm directives have lots of extra information to guide the optimizer *)
+and asm_details =
+ { aoutputs: (string option * string * expression) list; (* optional name, constraints and expressions for outputs *)
+ ainputs: (string option * string * expression) list; (* optional name, constraints and expressions for inputs *)
+ aclobbers: string list (* clobbered registers *)
+ }
+
+and statement =
+ NOP of cabsloc
+ | COMPUTATION of expression * cabsloc
+ | BLOCK of block * cabsloc
+(* | SEQUENCE of statement * statement * cabsloc *)
+ | IF of expression * statement * statement * cabsloc
+ | WHILE of expression * statement * cabsloc
+ | DOWHILE of expression * statement * cabsloc
+ | FOR of for_clause * expression * expression * statement * cabsloc
+ | BREAK of cabsloc
+ | CONTINUE of cabsloc
+ | RETURN of expression * cabsloc
+ | SWITCH of expression * statement * cabsloc
+ | CASE of expression * statement * cabsloc
+ | CASERANGE of expression * expression * statement * cabsloc
+ | DEFAULT of statement * cabsloc
+ | LABEL of string * statement * cabsloc
+ | GOTO of string * cabsloc
+ | COMPGOTO of expression * cabsloc (* GCC's "goto *exp" *)
+ | DEFINITION of definition (*definition or declaration of a variable or type*)
+
+ | ASM of attribute list * (* typically only volatile and const *)
+ string list * (* template *)
+ asm_details option * (* extra details to guide GCC's optimizer *)
+ cabsloc
+
+ (** MS SEH *)
+ | TRY_EXCEPT of block * expression * block * cabsloc
+ | TRY_FINALLY of block * block * cabsloc
+
+and for_clause =
+ FC_EXP of expression
+ | FC_DECL of definition
+
+(*
+** Expressions
+*)
+and binary_operator =
+ ADD | SUB | MUL | DIV | MOD
+ | AND | OR
+ | BAND | BOR | XOR | SHL | SHR
+ | EQ | NE | LT | GT | LE | GE
+ | ASSIGN
+ | ADD_ASSIGN | SUB_ASSIGN | MUL_ASSIGN | DIV_ASSIGN | MOD_ASSIGN
+ | BAND_ASSIGN | BOR_ASSIGN | XOR_ASSIGN | SHL_ASSIGN | SHR_ASSIGN
+
+and unary_operator =
+ MINUS | PLUS | NOT | BNOT | MEMOF | ADDROF
+ | PREINCR | PREDECR | POSINCR | POSDECR
+
+and expression =
+ NOTHING
+ | UNARY of unary_operator * expression
+ | LABELADDR of string (* GCC's && Label *)
+ | BINARY of binary_operator * expression * expression
+ | QUESTION of expression * expression * expression
+
+ (* A CAST can actually be a constructor expression *)
+ | CAST of (specifier * decl_type) * init_expression
+
+ (* There is a special form of CALL in which the function called is
+ __builtin_va_arg and the second argument is sizeof(T). This
+ should be printed as just T *)
+ | CALL of expression * expression list
+ | COMMA of expression list
+ | CONSTANT of constant
+ | PAREN of expression
+ | VARIABLE of string
+ | EXPR_SIZEOF of expression
+ | TYPE_SIZEOF of specifier * decl_type
+ | EXPR_ALIGNOF of expression
+ | TYPE_ALIGNOF of specifier * decl_type
+ | INDEX of expression * expression
+ | MEMBEROF of expression * string
+ | MEMBEROFPTR of expression * string
+ | GNU_BODY of block
+
+and constant =
+ | CONST_INT of string (* the textual representation *)
+ | CONST_FLOAT of string (* the textual representaton *)
+ | CONST_CHAR of int64 list
+ | CONST_WCHAR of int64 list
+ | CONST_STRING of string
+ | CONST_WSTRING of int64 list
+ (* ww: wstrings are stored as an int64 list at this point because
+ * we might need to feed the wide characters piece-wise into an
+ * array initializer (e.g., wchar_t foo[] = L"E\xabcd";). If that
+ * doesn't happen we will convert it to an (escaped) string before
+ * passing it to Cil. *)
+
+and init_expression =
+ | NO_INIT
+ | SINGLE_INIT of expression
+ | COMPOUND_INIT of (initwhat * init_expression) list
+
+and initwhat =
+ NEXT_INIT
+ | INFIELD_INIT of string * initwhat
+ | ATINDEX_INIT of expression * initwhat
+ | ATINDEXRANGE_INIT of expression * expression
+
+
+ (* Each attribute has a name and some
+ * optional arguments *)
+and attribute = string * expression list
+
+
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+
+open Cabs
+
+let nextident = ref 0
+let getident () =
+ nextident := !nextident + 1;
+ !nextident
+
+let currentLoc_lexbuf lb =
+ let p = Lexing.lexeme_start_p lb in
+ { lineno = p.Lexing.pos_lnum;
+ filename = p.Lexing.pos_fname;
+ byteno = p.Lexing.pos_cnum;
+ ident = getident ();}
+
+let currentLoc () =
+ let p = Parsing.symbol_start_pos() in
+ { lineno = p.Lexing.pos_lnum;
+ filename = p.Lexing.pos_fname;
+ byteno = p.Lexing.pos_cnum;
+ ident = getident ();}
+
+let cabslu = {lineno = -10;
+ filename = "cabs loc unknown";
+ byteno = -10;
+ ident = 0}
+
+(*********** HELPER FUNCTIONS **********)
+
+let missingFieldDecl = ("___missing_field_name", JUSTBASE, [], cabslu)
+
+let rec isStatic = function
+ [] -> false
+ | (SpecStorage STATIC) :: _ -> true
+ | _ :: rest -> isStatic rest
+
+let rec isExtern = function
+ [] -> false
+ | (SpecStorage EXTERN) :: _ -> true
+ | _ :: rest -> isExtern rest
+
+let rec isInline = function
+ [] -> false
+ | SpecInline :: _ -> true
+ | _ :: rest -> isInline rest
+
+let rec isTypedef = function
+ [] -> false
+ | SpecTypedef :: _ -> true
+ | _ :: rest -> isTypedef rest
+
+
+let get_definitionloc (d : definition) : cabsloc =
+ match d with
+ | FUNDEF(_, _, l, _) -> l
+ | DECDEF(_, l) -> l
+ | TYPEDEF(_, l) -> l
+ | ONLYTYPEDEF(_, l) -> l
+ | GLOBASM(_, l) -> l
+ | PRAGMA(_, l) -> l
+ | LINKAGE (_, l, _) -> l
+
+let get_statementloc (s : statement) : cabsloc =
+begin
+ match s with
+ | NOP(loc) -> loc
+ | COMPUTATION(_,loc) -> loc
+ | BLOCK(_,loc) -> loc
+(* | SEQUENCE(_,_,loc) -> loc *)
+ | IF(_,_,_,loc) -> loc
+ | WHILE(_,_,loc) -> loc
+ | DOWHILE(_,_,loc) -> loc
+ | FOR(_,_,_,_,loc) -> loc
+ | BREAK(loc) -> loc
+ | CONTINUE(loc) -> loc
+ | RETURN(_,loc) -> loc
+ | SWITCH(_,_,loc) -> loc
+ | CASE(_,_,loc) -> loc
+ | CASERANGE(_,_,_,loc) -> loc
+ | DEFAULT(_,loc) -> loc
+ | LABEL(_,_,loc) -> loc
+ | GOTO(_,loc) -> loc
+ | COMPGOTO (_, loc) -> loc
+ | DEFINITION d -> get_definitionloc d
+ | ASM(_,_,_,loc) -> loc
+ | TRY_EXCEPT(_, _, _, loc) -> loc
+ | TRY_FINALLY(_, _, loc) -> loc
+end
+
+
+let explodeStringToInts (s: string) : int64 list =
+ let rec allChars i acc =
+ if i < 0 then acc
+ else allChars (i - 1) (Int64.of_int (Char.code (String.get s i)) :: acc)
+ in
+ allChars (-1 + String.length s) []
+
+let valueOfDigit chr =
+ let int_value =
+ match chr with
+ '0'..'9' -> (Char.code chr) - (Char.code '0')
+ | 'a'..'z' -> (Char.code chr) - (Char.code 'a') + 10
+ | 'A'..'Z' -> (Char.code chr) - (Char.code 'A') + 10
+ | _ -> assert false in
+ Int64.of_int int_value
+
+let string_of_cabsloc l =
+ Printf.sprintf "%s:%d" l.filename l.lineno
+
+let format_cabsloc pp l =
+ Format.fprintf pp "%s:%d" l.filename l.lineno
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Evaluation of compile-time constants *)
+
+open C
+open Cutil
+open Machine
+
+(* Extra arith on int64 *)
+
+external int64_unsigned_to_float: int64 -> float
+ = "cparser_int64_unsigned_to_float"
+external int64_unsigned_div: int64 -> int64 -> int64
+ = "cparser_int64_unsigned_div"
+external int64_unsigned_mod: int64 -> int64 -> int64
+ = "cparser_int64_unsigned_mod"
+external int64_unsigned_compare: int64 -> int64 -> int
+ = "cparser_int64_unsigned_compare"
+
+exception Notconst
+
+(* Reduce n to the range of representable integers of the given kind *)
+
+let normalize_int n ik =
+ if ik = IBool then
+ if n = 0L then 0L else 1L
+ else begin
+ let bitsize = sizeof_ikind ik * 8
+ and signed = is_signed_ikind ik in
+ if bitsize >= 64 then n else begin
+ let a = 64 - bitsize in
+ let p = Int64.shift_left n a in
+ if signed
+ then Int64.shift_right p a
+ else Int64.shift_right_logical p a
+ end
+ end
+
+(* Reduce n to the range of representable floats of the given kind *)
+
+let normalize_float f fk =
+ match fk with
+ | FFloat -> Int32.float_of_bits (Int32.bits_of_float f)
+ | FDouble -> f
+ | FLongDouble -> raise Notconst (* cannot accurately compute on this type *)
+
+type value =
+ | I of int64
+ | F of float
+ | S of string
+ | WS of int64 list
+
+let boolean_value v =
+ match v with
+ | I n -> n <> 0L
+ | F n -> n <> 0.0
+ | S _ | WS _ -> true
+
+let constant = function
+ | CInt(v, ik, _) -> I (normalize_int v ik)
+ | CFloat(v, fk, _) -> F (normalize_float v fk)
+ | CStr s -> S s
+ | CWStr s -> WS s
+ | CEnum(id, v) -> I v
+
+let is_signed env ty =
+ match unroll env ty with
+ | TInt(ik, _) -> is_signed_ikind ik
+ | _ -> false
+
+let cast env ty_to ty_from v =
+ match unroll env ty_to, v with
+ | TInt(IBool, _), _ ->
+ if boolean_value v then I 1L else I 0L
+ | TInt(ik, _), I n ->
+ I(normalize_int n ik)
+ | TInt(ik, _), F n ->
+ I(normalize_int (Int64.of_float n) ik)
+ | TInt(ik, _), (S _ | WS _) ->
+ if sizeof_ikind ik >= !config.sizeof_ptr
+ then v
+ else raise Notconst
+ | TFloat(fk, _), F n ->
+ F(normalize_float n fk)
+ | TFloat(fk, _), I n ->
+ if is_signed env ty_from
+ then F(normalize_float (Int64.to_float n) fk)
+ else F(normalize_float (int64_unsigned_to_float n) fk)
+ | TPtr(ty, _), I n ->
+ I (normalize_int n ptr_t_ikind)
+ | TPtr(ty, _), F n ->
+ if n = 0.0 then I 0L else raise Notconst
+ | TPtr(ty, _), (S _ | WS _) ->
+ v
+ | _, _ ->
+ raise Notconst
+
+let unop env op tyres ty v =
+ let res =
+ match op, tyres, v with
+ | Ominus, TInt _, I n -> I (Int64.neg n)
+ | Ominus, TFloat _, F n -> F (-. n)
+ | Oplus, TInt _, I n -> I n
+ | Oplus, TFloat _, F n -> F n
+ | Olognot, _, _ -> if boolean_value v then I 0L else I 1L
+ | _ -> raise Notconst
+ in cast env ty tyres res
+
+let comparison env direction ptraction tyop ty1 v1 ty2 v2 =
+ (* tyop = type at which the comparison is done *)
+ let b =
+ match cast env tyop ty1 v1, cast env tyop ty2 v2 with
+ | I n1, I n2 ->
+ if is_signed env tyop
+ then direction (compare n1 n2) 0
+ else direction (int64_unsigned_compare n1 n2) 0 (* including pointers *)
+ | F n1, F n2 ->
+ direction (compare n1 n2) 0
+ | (S _ | WS _), I 0L ->
+ begin match ptraction with None -> raise Notconst | Some b -> b end
+ | I 0L, (S _ | WS _) ->
+ begin match ptraction with None -> raise Notconst | Some b -> b end
+ | _, _ ->
+ raise Notconst
+ in if b then I 1L else I 0L
+
+let binop env op tyop tyres ty1 v1 ty2 v2 =
+ (* tyop = type at which the computation is done
+ tyres = expected result type *)
+ let res =
+ match op with
+ | Oadd ->
+ if is_arith_type env ty1 && is_arith_type env ty2 then begin
+ match cast env tyop ty1 v1, cast env tyop ty2 v2 with
+ | I n1, I n2 -> I (Int64.add n1 n2)
+ | F n1, F n2 -> F (n1 +. n2)
+ | _, _ -> raise Notconst
+ end else
+ raise Notconst
+ | Osub ->
+ if is_arith_type env ty1 && is_arith_type env ty2 then begin
+ match cast env tyop ty1 v1, cast env tyop ty2 v2 with
+ | I n1, I n2 -> I (Int64.sub n1 n2)
+ | F n1, F n2 -> F (n1 -. n2)
+ | _, _ -> raise Notconst
+ end else
+ raise Notconst
+ | Omul ->
+ begin match cast env tyop ty1 v1, cast env tyop ty2 v2 with
+ | I n1, I n2 -> I (Int64.mul n1 n2)
+ | F n1, F n2 -> F (n1 *. n2)
+ | _, _ -> raise Notconst
+ end
+ | Odiv ->
+ begin match cast env tyop ty1 v1, cast env tyop ty2 v2 with
+ | I n1, I n2 ->
+ if n2 = 0L then raise Notconst else
+ if is_signed env tyop then I (Int64.div n1 n2)
+ else I (int64_unsigned_div n1 n2)
+ | F n1, F n2 -> F (n1 /. n2)
+ | _, _ -> raise Notconst
+ end
+ | Omod ->
+ begin match v1, v2 with
+ | I n1, I n2 ->
+ if n2 = 0L then raise Notconst else
+ if is_signed env tyop then I (Int64.rem n1 n2)
+ else I (int64_unsigned_mod n1 n2)
+ | _, _ -> raise Notconst
+ end
+ | Oand ->
+ begin match v1, v2 with
+ | I n1, I n2 -> I (Int64.logand n1 n2)
+ | _, _ -> raise Notconst
+ end
+ | Oor ->
+ begin match v1, v2 with
+ | I n1, I n2 -> I (Int64.logor n1 n2)
+ | _, _ -> raise Notconst
+ end
+ | Oxor ->
+ begin match v1, v2 with
+ | I n1, I n2 -> I (Int64.logxor n1 n2)
+ | _, _ -> raise Notconst
+ end
+ | Oshl ->
+ begin match v1, v2 with
+ | I n1, I n2 when n2 >= 0L && n2 < 64L ->
+ I (Int64.shift_left n1 (Int64.to_int n2))
+ | _, _ -> raise Notconst
+ end
+ | Oshr ->
+ begin match v1, v2 with
+ | I n1, I n2 when n2 >= 0L && n2 < 64L ->
+ if is_signed env tyop
+ then I (Int64.shift_right n1 (Int64.to_int n2))
+ else I (Int64.shift_right_logical n1 (Int64.to_int n2))
+ | _, _ -> raise Notconst
+ end
+ | Oeq ->
+ comparison env (=) (Some false) tyop ty1 v1 ty2 v2
+ | One ->
+ comparison env (<>) (Some true) tyop ty1 v1 ty2 v2
+ | Olt ->
+ comparison env (<) None tyop ty1 v1 ty2 v2
+ | Ogt ->
+ comparison env (>) None tyop ty1 v1 ty2 v2
+ | Ole ->
+ comparison env (<=) None tyop ty1 v1 ty2 v2
+ | Oge ->
+ comparison env (>=) None tyop ty1 v1 ty2 v2
+ | Ocomma ->
+ v2
+ | Ologand ->
+ if boolean_value v1
+ then if boolean_value v2 then I 1L else I 0L
+ else I 0L
+ | Ologor ->
+ if boolean_value v1
+ then I 1L
+ else if boolean_value v2 then I 1L else I 0L
+ | _ -> raise Notconst
+ (* force normalization of result, e.g. of double to float *)
+ in cast env tyres tyres res
+
+let rec expr env e =
+ match e.edesc with
+ | EConst c ->
+ constant c
+ | ESizeof ty ->
+ begin match sizeof env ty with
+ | None -> raise Notconst
+ | Some n -> I(Int64.of_int n)
+ end
+ | EVar _ ->
+ raise Notconst
+ | EUnop(op, e1) ->
+ unop env op e.etyp e1.etyp (expr env e1)
+ | EBinop(op, e1, e2, ty) ->
+ binop env op ty e.etyp e1.etyp (expr env e1) e2.etyp (expr env e2)
+ | EConditional(e1, e2, e3) ->
+ if boolean_value (expr env e1) then expr env e2 else expr env e3
+ | ECast(ty, e1) ->
+ cast env e1.etyp ty (expr env e1)
+ | ECall _ ->
+ raise Notconst
+
+let integer_expr env e =
+ try
+ match cast env e.etyp (TInt(ILongLong, [])) (expr env e) with
+ | I n -> Some n
+ | _ -> None
+ with Notconst -> None
+
+let constant_expr env ty e =
+ try
+ match unroll env ty, cast env e.etyp ty (expr env e) with
+ | TInt(ik, _), I n -> Some(CInt(n, ik, ""))
+ | TFloat(fk, _), F n -> Some(CFloat(n, fk, ""))
+ | TPtr(_, _), I 0L -> Some(CInt(0L, IInt, ""))
+ | TPtr(_, _), S s -> Some(CStr s)
+ | TPtr(_, _), WS s -> Some(CWStr s)
+ | _ -> None
+ with Notconst -> None
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+val integer_expr : Env.t -> C.exp -> int64 option
+val constant_expr : Env.t -> C.typ -> C.exp -> C.constant option
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Removing unused declarations *)
+
+open C
+open Cutil
+
+(* The set of all identifiers referenced so far *)
+let referenced = ref IdentSet.empty
+
+(* Record that a new identifier was added to this set *)
+let ref_changed = ref false
+
+(* Record a reference to an identifier. If seen for the first time,
+ add it to worklist. *)
+
+let addref id =
+ if not (IdentSet.mem id !referenced) then begin
+(* Printf.printf "Referenced: %s$%d\n" id.name id.stamp; *)
+ referenced := IdentSet.add id !referenced;
+ ref_changed := true
+ end
+
+let needed id =
+ IdentSet.mem id !referenced
+
+(* Iterate [addref] on all syntactic categories. *)
+
+let rec add_typ = function
+ | TPtr(ty, _) -> add_typ ty
+ | TArray(ty, _, _) -> add_typ ty
+ | TFun(res, None, _, _) -> add_typ res
+ | TFun(res, Some params, _, _) -> add_typ res; add_vars params
+ | TNamed(id, _) -> addref id
+ | TStruct(id, _) -> addref id
+ | TUnion(id, _) -> addref id
+ | _ -> ()
+
+and add_vars vl =
+ List.iter (fun (id, ty) -> add_typ ty) vl
+
+let rec add_exp e =
+ add_typ e.etyp; (* perhaps not necessary but play it safe *)
+ match e.edesc with
+ | EConst (CEnum(id, v)) -> addref id
+ | EConst _ -> ()
+ | ESizeof ty -> add_typ ty
+ | EVar id -> addref id
+ | EUnop(op, e1) -> add_exp e1
+ | EBinop(op, e1, e2, ty) -> add_exp e1; add_exp e2
+ | EConditional(e1, e2, e3) -> add_exp e1; add_exp e2; add_exp e3
+ | ECast(ty, e1) -> add_typ ty; add_exp e1
+ | ECall(e1, el) -> add_exp e1; List.iter add_exp el
+
+let rec add_init = function
+ | Init_single e -> add_exp e
+ | Init_array il -> List.iter add_init il
+ | Init_struct(id, il) -> addref id; List.iter (fun (_, i) -> add_init i) il
+ | Init_union(id, _, i) -> addref id; add_init i
+
+let add_decl (sto, id, ty, init) =
+ add_typ ty;
+ match init with None -> () | Some i -> add_init i
+
+let rec add_stmt s =
+ match s.sdesc with
+ | Sskip -> ()
+ | Sdo e -> add_exp e
+ | Sseq(s1, s2) -> add_stmt s1; add_stmt s2
+ | Sif(e, s1, s2) -> add_exp e; add_stmt s1; add_stmt s2
+ | Swhile(e, s1) -> add_exp e; add_stmt s1
+ | Sdowhile(s1, e) -> add_stmt s1; add_exp e
+ | Sfor(e1, e2, e3, s1) -> add_stmt e1; add_exp e2; add_stmt e3; add_stmt s1
+ | Sbreak -> ()
+ | Scontinue -> ()
+ | Sswitch(e, s1) -> add_exp e; add_stmt s1
+ | Slabeled(lbl, s) ->
+ begin match lbl with Scase e -> add_exp e | _ -> () end;
+ add_stmt s
+ | Sgoto lbl -> ()
+ | Sreturn None -> ()
+ | Sreturn(Some e) -> add_exp e
+ | Sblock sl -> List.iter add_stmt sl
+ | Sdecl d -> add_decl d
+
+let add_fundef f =
+ add_typ f.fd_ret;
+ add_vars f.fd_params;
+ List.iter add_decl f.fd_locals;
+ add_stmt f.fd_body
+
+let add_field f = add_typ f.fld_typ
+
+let add_enum e =
+ List.iter
+ (fun (id, opt_e) -> match opt_e with Some e -> add_exp e | None -> ())
+ e
+
+(* Saturate the set of referenced identifiers, starting with externally
+ visible global declarations *)
+
+let visible_decl (sto, id, ty, init) =
+ sto = Storage_default &&
+ match ty with TFun _ -> false | _ -> true
+
+let rec add_init_globdecls accu = function
+ | [] -> accu
+ | g :: rem ->
+ match g.gdesc with
+ | Gdecl decl when visible_decl decl ->
+ add_decl decl; add_init_globdecls accu rem
+ | Gfundef({fd_storage = Storage_default} as f) ->
+ add_fundef f; add_init_globdecls accu rem
+ | Gdecl _ | Gfundef _ | Gcompositedef _ | Gtypedef _ | Genumdef _ ->
+ (* Keep for later iterations *)
+ add_init_globdecls (g :: accu) rem
+ | Gcompositedecl _ | Gpragma _ ->
+ (* Discard, since these cannot introduce more references later *)
+ add_init_globdecls accu rem
+
+let rec add_needed_globdecls accu = function
+ | [] -> accu
+ | g :: rem ->
+ match g.gdesc with
+ | Gdecl((sto, id, ty, init) as decl) ->
+ if needed id
+ then (add_decl decl; add_needed_globdecls accu rem)
+ else add_needed_globdecls (g :: accu) rem
+ | Gfundef f ->
+ if needed f.fd_name
+ then (add_fundef f; add_needed_globdecls accu rem)
+ else add_needed_globdecls (g :: accu) rem
+ | Gcompositedef(_, id, flds) ->
+ if needed id
+ then (List.iter add_field flds; add_needed_globdecls accu rem)
+ else add_needed_globdecls (g :: accu) rem
+ | Gtypedef(id, ty) ->
+ if needed id
+ then (add_typ ty; add_needed_globdecls accu rem)
+ else add_needed_globdecls (g :: accu) rem
+ | Genumdef(id, enu) ->
+ if List.exists (fun (id, _) -> needed id) enu
+ then (add_enum enu; add_needed_globdecls accu rem)
+ else add_needed_globdecls (g :: accu) rem
+ | _ ->
+ assert false
+
+let saturate p =
+ let rec loop p =
+ if !ref_changed then begin
+ ref_changed := false;
+ loop (add_needed_globdecls [] p)
+ end in
+ ref_changed := false;
+ loop (add_init_globdecls [] p)
+
+(* Remove unreferenced definitions *)
+
+let rec simpl_globdecls accu = function
+ | [] -> accu
+ | g :: rem ->
+ let need =
+ match g.gdesc with
+ | Gdecl((sto, id, ty, init) as decl) -> visible_decl decl || needed id
+ | Gfundef f -> f.fd_storage = Storage_default || needed f.fd_name
+ | Gcompositedecl(_, id) -> needed id
+ | Gcompositedef(_, id, flds) -> needed id
+ | Gtypedef(id, ty) -> needed id
+ | Genumdef(id, enu) -> List.exists (fun (id, _) -> needed id) enu
+ | Gpragma s -> true in
+ if need
+ then simpl_globdecls (g :: accu) rem
+ else simpl_globdecls accu rem
+
+let program p =
+ referenced := IdentSet.empty;
+ saturate p;
+ let p' = simpl_globdecls [] p in
+ referenced := IdentSet.empty;
+ p'
+
+
+
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+val program : C.program -> C.program
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Pretty-printer for C abstract syntax *)
+
+open Format
+open C
+
+let print_idents_in_full = ref false
+
+let print_line_numbers = ref false
+
+let location pp (file, lineno) =
+ if !print_line_numbers && lineno >= 0 then
+ fprintf pp "# %d \"%s\"@ " lineno file
+
+let ident pp i =
+ if !print_idents_in_full
+ then fprintf pp "%s$%d" i.name i.stamp
+ else fprintf pp "%s" i.name
+
+let attribute pp = function
+ | AConst -> fprintf pp "const"
+ | AVolatile -> fprintf pp "volatile"
+ | ARestrict -> fprintf pp "restrict"
+
+let attributes pp = function
+ | [] -> ()
+ | al -> List.iter (fun a -> fprintf pp " %a" attribute a) al
+
+let name_of_ikind = function
+ | IBool -> "_Bool"
+ | IChar -> "char"
+ | ISChar -> "signed char"
+ | IUChar -> "unsigned char"
+ | IInt -> "int"
+ | IUInt -> "unsigned int"
+ | IShort -> "short"
+ | IUShort -> "unsigned short"
+ | ILong -> "long"
+ | IULong -> "unsigned long"
+ | ILongLong -> "long long"
+ | IULongLong -> "unsigned long long"
+
+let name_of_fkind = function
+ | FFloat -> "float"
+ | FDouble -> "double"
+ | FLongDouble -> "long double"
+
+let rec dcl pp ty n =
+ match ty with
+ | TVoid a ->
+ fprintf pp "void%a%t" attributes a n
+ | TInt(k, a) ->
+ fprintf pp "%s%a%t" (name_of_ikind k) attributes a n
+ | TFloat(k, a) ->
+ fprintf pp "%s%a%t" (name_of_fkind k) attributes a n
+ | TPtr(t, a) ->
+ let n' pp =
+ match t with
+ | TFun _ | TArray _ -> fprintf pp " (*%a%t)" attributes a n
+ | _ -> fprintf pp " *%a%t" attributes a n in
+ dcl pp t n'
+ | TArray(t, sz, a) ->
+ let n' pp =
+ begin match a with
+ | [] -> n pp
+ | _ -> fprintf pp " (%a%t)" attributes a n
+ end;
+ begin match sz with
+ | None -> fprintf pp "[]"
+ | Some i -> fprintf pp "[%Ld]" i
+ end in
+ dcl pp t n'
+ | TFun(tres, args, vararg, a) ->
+ let param (id, ty) =
+ dcl pp ty
+ (fun pp -> fprintf pp " %a" ident id) in
+ let n' pp =
+ begin match a with
+ | [] -> n pp
+ | _ -> fprintf pp " (%a%t)" attributes a n
+ end;
+ fprintf pp "(@[<hov 0>";
+ begin match args with
+ | None -> ()
+ | Some [] -> if vararg then fprintf pp "..." else fprintf pp "void"
+ | Some (a1 :: al) ->
+ param a1;
+ List.iter (fun a -> fprintf pp ",@ "; param a) al;
+ if vararg then fprintf pp ",@ ..."
+ end;
+ fprintf pp "@])" in
+ dcl pp tres n'
+ | TNamed(id, a) ->
+ fprintf pp "%a%a%t" ident id attributes a n
+ | TStruct(id, a) ->
+ fprintf pp "struct %a%a%t" ident id attributes a n
+ | TUnion(id, a) ->
+ fprintf pp "union %a%a%t" ident id attributes a n
+
+let typ pp ty =
+ dcl pp ty (fun _ -> ())
+
+let const pp = function
+ | CInt(v, ik, s) ->
+ if s <> "" then
+ fprintf pp "%s" s
+ else begin
+ fprintf pp "%Ld" v;
+ match ik with
+ | IULongLong -> fprintf pp "ULL"
+ | ILongLong -> fprintf pp "LL"
+ | IULong -> fprintf pp "UL"
+ | ILong -> fprintf pp "L"
+ | IUInt -> fprintf pp "U"
+ | _ -> ()
+ end
+ | CFloat(v, fk, s) ->
+ if s <> "" then
+ fprintf pp "%s" s
+ else begin
+ fprintf pp "%.18g" v;
+ match fk with
+ | FFloat -> fprintf pp "F"
+ | FLongDouble -> fprintf pp "L"
+ | _ -> ()
+ end
+ | CStr s ->
+ fprintf pp "\"";
+ for i = 0 to String.length s - 1 do
+ match s.[i] with
+ | '\009' -> fprintf pp "\\t"
+ | '\010' -> fprintf pp "\\n"
+ | '\013' -> fprintf pp "\\r"
+ | '\"' -> fprintf pp "\\\""
+ | '\\' -> fprintf pp "\\\\"
+ | c ->
+ if c >= ' ' && c <= '~'
+ then fprintf pp "%c" c
+ else fprintf pp "\\%03o" (Char.code c)
+ done;
+ fprintf pp "\""
+ | CWStr l ->
+ fprintf pp "L\"";
+ List.iter
+ (fun c ->
+ if c >= 32L && c <= 126L && c <> 34L && c <>92L
+ then fprintf pp "%c" (Char.chr (Int64.to_int c))
+ else fprintf pp "\" \"\\x%02Lx\" \"" c)
+ l;
+ fprintf pp "\""
+ | CEnum(id, v) ->
+ ident pp id
+
+type associativity = LtoR | RtoL | NA
+
+let precedence = function (* H&S section 7.2 *)
+ | EConst _ -> (16, NA)
+ | ESizeof _ -> (15, RtoL)
+ | EVar _ -> (16, NA)
+ | EBinop(Oindex, _, _, _) -> (16, LtoR)
+ | ECall _ -> (16, LtoR)
+ | EUnop((Odot _|Oarrow _), _) -> (16, LtoR)
+ | EUnop((Opostincr|Opostdecr), _) -> (16, LtoR)
+ | EUnop((Opreincr|Opredecr|Onot|Olognot|Ominus|Oplus|Oaddrof|Oderef), _) -> (15, RtoL)
+ | ECast _ -> (14, RtoL)
+ | EBinop((Omul|Odiv|Omod), _, _, _) -> (13, LtoR)
+ | EBinop((Oadd|Osub), _, _, _) -> (12, LtoR)
+ | EBinop((Oshl|Oshr), _, _, _) -> (11, LtoR)
+ | EBinop((Olt|Ogt|Ole|Oge), _, _, _) -> (10, LtoR)
+ | EBinop((Oeq|One), _, _, _) -> (9, LtoR)
+ | EBinop(Oand, _, _, _) -> (8, LtoR)
+ | EBinop(Oxor, _, _, _) -> (7, LtoR)
+ | EBinop(Oor, _, _, _) -> (6, LtoR)
+ | EBinop(Ologand, _, _, _) -> (5, LtoR)
+ | EBinop(Ologor, _, _, _) -> (4, LtoR)
+ | EConditional _ -> (3, RtoL)
+ | EBinop((Oassign|Oadd_assign|Osub_assign|Omul_assign|Odiv_assign|Omod_assign|Oand_assign|Oor_assign|Oxor_assign|Oshl_assign|Oshr_assign), _, _, _) -> (2, RtoL)
+ | EBinop(Ocomma, _, _, _) -> (1, LtoR)
+
+let rec exp pp (prec, a) =
+ let (prec', assoc) = precedence a.edesc in
+ let (prec1, prec2) =
+ if assoc = LtoR
+ then (prec', prec' + 1)
+ else (prec' + 1, prec') in
+ if prec' < prec
+ then fprintf pp "@[<hov 2>("
+ else fprintf pp "@[<hov 2>";
+ begin match a.edesc with
+ | EConst cst -> const pp cst
+ | EVar id -> ident pp id
+ | ESizeof ty -> fprintf pp "sizeof(%a)" typ ty
+ | EUnop(Ominus, a1) ->
+ fprintf pp "-%a" exp (prec', a1)
+ | EUnop(Oplus, a1) ->
+ fprintf pp "+%a" exp (prec', a1)
+ | EUnop(Olognot, a1) ->
+ fprintf pp "!%a" exp (prec', a1)
+ | EUnop(Onot, a1) ->
+ fprintf pp "~%a" exp (prec', a1)
+ | EUnop(Oderef, a1) ->
+ fprintf pp "*%a" exp (prec', a1)
+ | EUnop(Oaddrof, a1) ->
+ fprintf pp "&%a" exp (prec', a1)
+ | EUnop(Opreincr, a1) ->
+ fprintf pp "++%a" exp (prec', a1)
+ | EUnop(Opredecr, a1) ->
+ fprintf pp "--%a" exp (prec', a1)
+ | EUnop(Opostincr, a1) ->
+ fprintf pp "%a++" exp (prec', a1)
+ | EUnop(Opostdecr, a1) ->
+ fprintf pp "%a--" exp (prec', a1)
+ | EUnop(Odot s, a1) ->
+ fprintf pp "%a.%s" exp (prec', a1)s
+ | EUnop(Oarrow s, a1) ->
+ fprintf pp "%a->%s" exp (prec', a1)s
+ | EBinop(Oadd, a1, a2, _) ->
+ fprintf pp "%a@ + %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Osub, a1, a2, _) ->
+ fprintf pp "%a@ - %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Omul, a1, a2, _) ->
+ fprintf pp "%a@ * %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Odiv, a1, a2, _) ->
+ fprintf pp "%a@ / %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Omod, a1, a2, _) ->
+ fprintf pp "%a@ %% %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Oand, a1, a2, _) ->
+ fprintf pp "%a@ & %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Oor, a1, a2, _) ->
+ fprintf pp "%a@ | %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Oxor, a1, a2, _) ->
+ fprintf pp "%a@ ^ %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Oshl, a1, a2, _) ->
+ fprintf pp "%a@ << %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Oshr, a1, a2, _) ->
+ fprintf pp "%a@ >> %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Oeq, a1, a2, _) ->
+ fprintf pp "%a@ == %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(One, a1, a2, _) ->
+ fprintf pp "%a@ != %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Olt, a1, a2, _) ->
+ fprintf pp "%a@ < %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Ogt, a1, a2, _) ->
+ fprintf pp "%a@ > %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Ole, a1, a2, _) ->
+ fprintf pp "%a@ <= %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Oge, a1, a2, _) ->
+ fprintf pp "%a@ >= %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Oindex, a1, a2, _) ->
+ fprintf pp "%a[%a]" exp (prec1, a1) exp (0, a2)
+ | EBinop(Oassign, a1, a2, _) ->
+ fprintf pp "%a =@ %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Oadd_assign, a1, a2, _) ->
+ fprintf pp "%a +=@ %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Osub_assign, a1, a2, _) ->
+ fprintf pp "%a -=@ %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Omul_assign, a1, a2, _) ->
+ fprintf pp "%a *=@ %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Odiv_assign, a1, a2, _) ->
+ fprintf pp "%a /=@ %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Omod_assign, a1, a2, _) ->
+ fprintf pp "%a %%=@ %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Oand_assign, a1, a2, _) ->
+ fprintf pp "%a &=@ %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Oor_assign, a1, a2, _) ->
+ fprintf pp "%a |=@ %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Oxor_assign, a1, a2, _) ->
+ fprintf pp "%a ^=@ %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Oshl_assign, a1, a2, _) ->
+ fprintf pp "%a <<=@ %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Oshr_assign, a1, a2, _) ->
+ fprintf pp "%a >>=@ %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Ocomma, a1, a2, _) ->
+ fprintf pp "%a,@ %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Ologand, a1, a2, _) ->
+ fprintf pp "%a@ && %a" exp (prec1, a1) exp (prec2, a2)
+ | EBinop(Ologor, a1, a2, _) ->
+ fprintf pp "%a@ || %a" exp (prec1, a1) exp (prec2, a2)
+ | EConditional(a1, a2, a3) ->
+ fprintf pp "%a@ ? %a@ : %a" exp (4, a1) exp (4, a2) exp (4, a3)
+ | ECast(ty, a1) ->
+ fprintf pp "(%a) %a" typ ty exp (prec', a1)
+ | ECall({edesc = EVar {name = "__builtin_va_start"}},
+ [a1; {edesc = EUnop(Oaddrof, a2)}]) ->
+ fprintf pp "__builtin_va_start@[<hov 1>(%a,@ %a)@]"
+ exp (2, a1) exp (2, a2)
+ | ECall({edesc = EVar {name = "__builtin_va_arg"}},
+ [a1; {edesc = ESizeof ty}]) ->
+ fprintf pp "__builtin_va_arg@[<hov 1>(%a,@ %a)@]"
+ exp (2, a1) typ ty
+ | ECall(a1, al) ->
+ fprintf pp "%a@[<hov 1>(" exp (prec', a1);
+ begin match al with
+ | [] -> ()
+ | a1 :: al ->
+ fprintf pp "%a" exp (2, a1);
+ List.iter (fun a -> fprintf pp ",@ %a" exp (2, a)) al
+ end;
+ fprintf pp ")@]"
+ end;
+ if prec' < prec then fprintf pp ")@]" else fprintf pp "@]"
+
+let rec init pp = function
+ | Init_single e ->
+ exp pp (2, e)
+ | Init_array il ->
+ fprintf pp "@[<hov 1>{";
+ List.iter (fun i -> fprintf pp "%a,@ " init i) il;
+ fprintf pp "}@]"
+ | Init_struct(id, il) ->
+ fprintf pp "@[<hov 1>{";
+ List.iter (fun (fld, i) -> fprintf pp "%a,@ " init i) il;
+ fprintf pp "}@]"
+ | Init_union(id, fld, i) ->
+ fprintf pp "@[<hov 1>{%a}@]" init i
+
+let simple_decl pp (id, ty) =
+ dcl pp ty (fun pp -> fprintf pp " %a" ident id)
+
+let storage pp = function
+ | Storage_default -> ()
+ | Storage_extern -> fprintf pp "extern "
+ | Storage_static -> fprintf pp "static "
+ | Storage_register -> fprintf pp "register "
+
+let full_decl pp (sto, id, ty, int) =
+ fprintf pp "@[<hov 2>%a" storage sto;
+ dcl pp ty (fun pp -> fprintf pp " %a" ident id);
+ begin match int with
+ | None -> ()
+ | Some i -> fprintf pp " =@ %a" init i
+ end;
+ fprintf pp ";@]"
+
+exception Not_expr
+
+let rec exp_of_stmt s =
+ match s.sdesc with
+ | Sdo e -> e
+ | Sseq(s1, s2) ->
+ {edesc = EBinop(Ocomma, exp_of_stmt s1, exp_of_stmt s2, TVoid []);
+ etyp = TVoid []}
+ | Sif(e, s1, s2) ->
+ {edesc = EConditional(e, exp_of_stmt s1, exp_of_stmt s2);
+ etyp = TVoid []}
+ | _ ->
+ raise Not_expr
+
+let rec stmt pp s =
+ location pp s.sloc;
+ match s.sdesc with
+ | Sskip ->
+ fprintf pp "/*skip*/;"
+ | Sdo e ->
+ fprintf pp "%a;" exp (0, e)
+ | Sseq(s1, s2) ->
+ fprintf pp "%a@ %a" stmt s1 stmt s2
+ | Sif(e, s1, {sdesc = Sskip}) ->
+ fprintf pp "@[<v 2>if (%a) {@ %a@;<0 -2>}@]"
+ exp (0, e) stmt_block s1
+ | Sif(e, {sdesc = Sskip}, s2) ->
+ let not_e = {edesc = EUnop(Olognot, e); etyp = TInt(IInt, [])} in
+ fprintf pp "@[<v 2>if (%a) {@ %a@;<0 -2>}@]"
+ exp (0, not_e) stmt_block s2
+ | Sif(e, s1, s2) ->
+ fprintf pp "@[<v 2>if (%a) {@ %a@;<0 -2>} else {@ %a@;<0 -2>}@]"
+ exp (0, e) stmt_block s1 stmt_block s2
+ | Swhile(e, s1) ->
+ fprintf pp "@[<v 2>while (%a) {@ %a@;<0 -2>}@]"
+ exp (0, e) stmt_block s1
+ | Sdowhile(s1, e) ->
+ fprintf pp "@[<v 2>do {@ %a@;<0 -2>} while(%a);@]"
+ stmt_block s1 exp (0, e)
+ | Sfor(e1, e2, e3, s1) ->
+ fprintf pp "@[<v 2>for (@[<hv 0>%a;@ %a;@ %a) {@]@ %a@;<0 -2>}@]"
+ opt_exp e1
+ exp (0, e2)
+ opt_exp e3
+ stmt_block s1
+ | Sbreak ->
+ fprintf pp "break;"
+ | Scontinue ->
+ fprintf pp "continue;"
+ | Sswitch(e, s1) ->
+ fprintf pp "@[<v 2>switch (%a) {@ %a@;<0 -2>}@]"
+ exp (0, e)
+ stmt_block s1
+ | Slabeled(lbl, s1) ->
+ fprintf pp "%a:@ %a" slabel lbl stmt s1
+ | Sgoto lbl ->
+ fprintf pp "goto %s;" lbl
+ | Sreturn None ->
+ fprintf pp "return;"
+ | Sreturn (Some e) ->
+ fprintf pp "return %a;" exp (0, e)
+ | Sblock sl ->
+ fprintf pp "@[<v 2>{@ %a@;<0 -2>}@]" stmt_block s
+ | Sdecl d ->
+ full_decl pp d
+
+and slabel pp = function
+ | Slabel s ->
+ fprintf pp "%s" s
+ | Scase e ->
+ fprintf pp "case %a" exp (0, e)
+ | Sdefault ->
+ fprintf pp "default"
+
+and stmt_block pp s =
+ match s.sdesc with
+ | Sblock [] -> ()
+ | Sblock (s1 :: sl) ->
+ stmt pp s1;
+ List.iter (fun s -> fprintf pp "@ %a" stmt s) sl
+ | _ ->
+ stmt pp s
+
+and opt_exp pp s =
+ if s.sdesc = Sskip then fprintf pp "/*nothing*/" else
+ try
+ exp pp (0, exp_of_stmt s)
+ with Not_expr ->
+ fprintf pp "@[<v 3>({ %a })@]" stmt s
+
+let fundef pp f =
+ fprintf pp "@[<hov 2>%s%a"
+ (if f.fd_inline then "inline " else "")
+ storage f.fd_storage;
+ simple_decl pp (f.fd_name, TFun(f.fd_ret, Some f.fd_params, f.fd_vararg, []));
+ fprintf pp "@]@ @[<v 2>{@ ";
+ List.iter (fun d -> fprintf pp "%a@ " full_decl d) f.fd_locals;
+ stmt_block pp f.fd_body;
+ fprintf pp "@;<0 -2>}@]@ @ "
+
+let field pp f =
+ simple_decl pp ({name = f.fld_name; stamp = 0}, f.fld_typ);
+ match f.fld_bitfield with
+ | None -> ()
+ | Some n -> fprintf pp " : %d" n
+
+let globdecl pp g =
+ location pp g.gloc;
+ match g.gdesc with
+ | Gdecl d ->
+ fprintf pp "%a@ @ " full_decl d
+ | Gfundef f ->
+ fundef pp f
+ | Gcompositedecl(kind, id) ->
+ fprintf pp "%s %a;@ @ "
+ (match kind with Struct -> "struct" | Union -> "union")
+ ident id
+ | Gcompositedef(kind, id, flds) ->
+ fprintf pp "@[<v 2>%s %a {"
+ (match kind with Struct -> "struct" | Union -> "union")
+ ident id;
+ List.iter (fun fld -> fprintf pp "@ %a;" field fld) flds;
+ fprintf pp "@;<0 -2>};@]@ @ "
+ | Gtypedef(id, ty) ->
+ fprintf pp "@[<hov 2>typedef %a;@]@ @ " simple_decl (id, ty)
+ | Genumdef(id, fields) ->
+ fprintf pp "@[<v 2>enum %a {" ident id;
+ List.iter
+ (fun (name, opt_e) ->
+ fprintf pp "@ %a" ident name;
+ begin match opt_e with
+ | None -> ()
+ | Some e -> fprintf pp " = %a" exp (0, e)
+ end;
+ fprintf pp ",")
+ fields;
+ fprintf pp "@;<0 -2>};@]@ @ "
+ | Gpragma s ->
+ fprintf pp "#pragma %s@ @ " s
+
+let program pp prog =
+ fprintf pp "@[<v 0>";
+ List.iter (globdecl pp) prog;
+ fprintf pp "@]@."
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+val print_idents_in_full : bool ref
+val print_line_numbers : bool ref
+
+val location : Format.formatter -> C.location -> unit
+val typ : Format.formatter -> C.typ -> unit
+val simple_decl : Format.formatter -> C.ident * C.typ -> unit
+val full_decl: Format.formatter -> C.decl -> unit
+val const : Format.formatter -> C.constant -> unit
+val exp : Format.formatter -> int * C.exp -> unit
+val opt_exp : Format.formatter -> C.stmt -> unit
+val stmt : Format.formatter -> C.stmt -> unit
+val fundef : Format.formatter -> C.fundef -> unit
+val init : Format.formatter -> C.init -> unit
+val storage : Format.formatter -> C.storage -> unit
+val field : Format.formatter -> C.field -> unit
+val globdecl : Format.formatter -> C.globdecl -> unit
+val program : Format.formatter -> C.program -> unit
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Operations on C types and abstract syntax *)
+
+open Printf
+open Errors
+open C
+open Env
+open Machine
+
+(* Set and Map structures over identifiers *)
+
+module Ident = struct
+ type t = ident
+ let compare id1 id2 = Pervasives.compare id1.stamp id2.stamp
+end
+
+module IdentSet = Set.Make(Ident)
+module IdentMap = Map.Make(Ident)
+
+(* Operations on attributes *)
+
+(* Lists of attributes are kept sorted in increasing order *)
+
+let rec add_attributes (al1: attributes) (al2: attributes) =
+ match al1, al2 with
+ | [], _ -> al2
+ | _, [] -> al1
+ | a1 :: al1', a2 :: al2' ->
+ if a1 < a2 then a1 :: add_attributes al1' al2
+ else if a1 > a2 then a2 :: add_attributes al1 al2'
+ else a1 :: add_attributes al1' al2'
+
+let rec remove_attributes (al1: attributes) (al2: attributes) =
+ (* viewed as sets: al1 \ al2 *)
+ match al1, al2 with
+ | [], _ -> []
+ | _, [] -> al1
+ | a1 :: al1', a2 :: al2' ->
+ if a1 < a2 then a1 :: remove_attributes al1' al2
+ else if a1 > a2 then remove_attributes al1 al2'
+ else remove_attributes al1' al2'
+
+let rec incl_attributes (al1: attributes) (al2: attributes) =
+ match al1, al2 with
+ | [], _ -> true
+ | _ :: _, [] -> false
+ | a1 :: al1', a2 :: al2' ->
+ if a1 < a2 then false
+ else if a1 > a2 then incl_attributes al1 al2'
+ else incl_attributes al1' al2'
+
+(* Adding top-level attributes to a type. Doesn't need to unroll defns. *)
+(* Array types cannot carry attributes, so add them to the element type. *)
+
+let rec add_attributes_type attr t =
+ match t with
+ | TVoid a -> TVoid (add_attributes attr a)
+ | TInt(ik, a) -> TInt(ik, add_attributes attr a)
+ | TFloat(fk, a) -> TFloat(fk, add_attributes attr a)
+ | TPtr(ty, a) -> TPtr(ty, add_attributes attr a)
+ | TArray(ty, sz, a) -> TArray(add_attributes_type attr ty, sz, a)
+ | TFun(ty, params, vararg, a) -> TFun(ty, params, vararg, add_attributes attr
+a)
+ | TNamed(s, a) -> TNamed(s, add_attributes attr a)
+ | TStruct(s, a) -> TStruct(s, add_attributes attr a)
+ | TUnion(s, a) -> TUnion(s, add_attributes attr a)
+
+(* Unrolling of typedef *)
+
+let rec unroll env t =
+ match t with
+ | TNamed(name, attr) ->
+ let ty = Env.find_typedef env name in
+ unroll env (add_attributes_type attr ty)
+ | _ -> t
+
+(* Extracting the attributes of a type *)
+
+let rec attributes_of_type env t =
+ match t with
+ | TVoid a -> a
+ | TInt(ik, a) -> a
+ | TFloat(fk, a) -> a
+ | TPtr(ty, a) -> a
+ | TArray(ty, sz, a) -> a (* correct? *)
+ | TFun(ty, params, vararg, a) -> a
+ | TNamed(s, a) -> attributes_of_type env (unroll env t)
+ | TStruct(s, a) -> a
+ | TUnion(s, a) -> a
+
+(* Changing the attributes of a type (at top-level) *)
+(* Same hack as above for array types. *)
+
+let rec change_attributes_type env (f: attributes -> attributes) t =
+ match t with
+ | TVoid a -> TVoid (f a)
+ | TInt(ik, a) -> TInt(ik, f a)
+ | TFloat(fk, a) -> TFloat(fk, f a)
+ | TPtr(ty, a) -> TPtr(ty, f a)
+ | TArray(ty, sz, a) ->
+ TArray(change_attributes_type env f ty, sz, a)
+ | TFun(ty, params, vararg, a) -> TFun(ty, params, vararg, f a)
+ | TNamed(s, a) ->
+ let t1 = unroll env t in
+ let t2 = change_attributes_type env f t1 in
+ if t2 = t1 then t else t2 (* avoid useless expansion *)
+ | TStruct(s, a) -> TStruct(s, f a)
+ | TUnion(s, a) -> TUnion(s, f a)
+
+let remove_attributes_type env attr t =
+ change_attributes_type env (fun a -> remove_attributes a attr) t
+
+let erase_attributes_type env t =
+ change_attributes_type env (fun a -> []) t
+
+(* Type compatibility *)
+
+exception Incompat
+
+let combine_types ?(noattrs = false) env t1 t2 =
+
+ let comp_attr a1 a2 =
+ if a1 = a2 then a2
+ else if noattrs then add_attributes a1 a2
+ else raise Incompat
+ and comp_base x1 x2 =
+ if x1 = x2 then x2 else raise Incompat
+ and comp_array_size sz1 sz2 =
+ match sz1, sz2 with
+ | None, _ -> sz2
+ | _, None -> sz1
+ | Some n1, Some n2 -> if n1 = n2 then Some n2 else raise Incompat
+ and comp_conv (id, ty) =
+ match unroll env ty with
+ | TInt(kind, attr) ->
+ begin match kind with
+ | IBool | IChar | ISChar | IUChar | IShort | IUShort -> raise Incompat
+ | _ -> ()
+ end
+ | TFloat(kind, attr) ->
+ begin match kind with
+ | FFloat -> raise Incompat
+ | _ -> ()
+ end
+ | _ -> () in
+
+ let rec comp t1 t2 =
+ match t1, t2 with
+ | TVoid a1, TVoid a2 ->
+ TVoid(comp_attr a1 a2)
+ | TInt(ik1, a1), TInt(ik2, a2) ->
+ TInt(comp_base ik1 ik2, comp_attr a1 a2)
+ | TFloat(fk1, a1), TFloat(fk2, a2) ->
+ TFloat(comp_base fk1 fk2, comp_attr a1 a2)
+ | TPtr(ty1, a1), TPtr(ty2, a2) ->
+ TPtr(comp ty1 ty2, comp_attr a1 a2)
+ | TArray(ty1, sz1, a1), TArray(ty2, sz2, a2) ->
+ TArray(comp ty1 ty2, comp_array_size sz1 sz2, comp_attr a1 a2)
+ | TFun(ty1, params1, vararg1, a1), TFun(ty2, params2, vararg2, a2) ->
+ let (params, vararg) =
+ match params1, params2 with
+ | None, None -> None, false
+ | None, Some l2 -> List.iter comp_conv l2; (params2, vararg2)
+ | Some l1, None -> List.iter comp_conv l1; (params1, vararg1)
+ | Some l1, Some l2 ->
+ if List.length l1 <> List.length l2 then raise Incompat;
+ (Some(List.map2 (fun (id1, ty1) (id2, ty2) -> (id2, comp ty1 ty2))
+ l1 l2),
+ comp_base vararg1 vararg2)
+ in
+ TFun(comp ty1 ty2, params, vararg, comp_attr a1 a2)
+ | TNamed _, _ -> comp (unroll env t1) t2
+ | _, TNamed _ -> comp t1 (unroll env t2)
+ | TStruct(s1, a1), TStruct(s2, a2) ->
+ TStruct(comp_base s1 s2, comp_attr a1 a2)
+ | TUnion(s1, a1), TUnion(s2, a2) ->
+ TUnion(comp_base s1 s2, comp_attr a1 a2)
+ | _, _ ->
+ raise Incompat
+
+ in try Some(comp t1 t2) with Incompat -> None
+
+let compatible_types ?noattrs env t1 t2 =
+ match combine_types ?noattrs env t1 t2 with Some _ -> true | None -> false
+
+(* Naive placement algorithm for bit fields, might not match that
+ of the compiler. *)
+
+let pack_bitfields ml =
+ let rec pack nbits = function
+ | [] ->
+ (nbits, [])
+ | m :: ms as ml ->
+ match m.fld_bitfield with
+ | None -> (nbits, ml)
+ | Some n ->
+ if n = 0 then
+ (nbits, ms) (* bit width 0 means end of pack *)
+ else if nbits + n > 8 * !config.sizeof_int then
+ (nbits, ml) (* doesn't fit in current word *)
+ else
+ pack (nbits + n) ms (* add to current word *)
+ in
+ let (nbits, ml') = pack 0 ml in
+ let sz =
+ if nbits <= 8 then 1 else
+ if nbits <= 16 then 2 else
+ if nbits <= 32 then 4 else
+ if nbits <= 64 then 8 else assert false in
+ (sz, ml')
+
+(* Natural alignment, in bytes *)
+
+let alignof_ikind = function
+ | IBool | IChar | ISChar | IUChar -> 1
+ | IInt | IUInt -> !config.alignof_int
+ | IShort | IUShort -> !config.alignof_short
+ | ILong | IULong -> !config.alignof_long
+ | ILongLong | IULongLong -> !config.alignof_longlong
+
+let alignof_fkind = function
+ | FFloat -> !config.alignof_float
+ | FDouble -> !config.alignof_double
+ | FLongDouble -> !config.alignof_longdouble
+
+(* Return natural alignment of given type, or None if the type is incomplete *)
+
+let rec alignof env t =
+ match t with
+ | TVoid _ -> !config.alignof_void
+ | TInt(ik, _) -> Some(alignof_ikind ik)
+ | TFloat(fk, _) -> Some(alignof_fkind fk)
+ | TPtr(_, _) -> Some(!config.alignof_ptr)
+ | TArray(ty, _, _) -> alignof env ty
+ | TFun(_, _, _, _) -> !config.alignof_fun
+ | TNamed(_, _) -> alignof env (unroll env t)
+ | TStruct(name, _) ->
+ let ci = Env.find_struct env name in ci.ci_alignof
+ | TUnion(name, _) ->
+ let ci = Env.find_union env name in ci.ci_alignof
+
+(* Compute the natural alignment of a struct or union. *)
+
+let alignof_struct_union env members =
+ let rec align_rec al = function
+ | [] -> Some al
+ | m :: rem as ml ->
+ if m.fld_bitfield = None then begin
+ match alignof env m.fld_typ with
+ | None -> None
+ | Some a -> align_rec (max a al) rem
+ end else begin
+ let (sz, ml') = pack_bitfields ml in
+ align_rec (max sz al) ml'
+ end
+ in align_rec 1 members
+
+let align x boundary =
+ (* boundary must be a power of 2 *)
+ (x + boundary - 1) land (lnot (boundary - 1))
+
+(* Size of, in bytes *)
+
+let sizeof_ikind = function
+ | IBool | IChar | ISChar | IUChar -> 1
+ | IInt | IUInt -> !config.sizeof_int
+ | IShort | IUShort -> !config.sizeof_short
+ | ILong | IULong -> !config.sizeof_long
+ | ILongLong | IULongLong -> !config.sizeof_longlong
+
+let sizeof_fkind = function
+ | FFloat -> !config.sizeof_float
+ | FDouble -> !config.sizeof_double
+ | FLongDouble -> !config.sizeof_longdouble
+
+(* Overflow-avoiding multiplication of an int64 and an int, with
+ result in type int. *)
+
+let cautious_mul (a: int64) (b: int) =
+ if b = 0 || a <= Int64.of_int (max_int / b)
+ then Some(Int64.to_int a * b)
+ else None
+
+(* Return size of type, in bytes, or [None] if the type is incomplete *)
+
+let rec sizeof env t =
+ match t with
+ | TVoid _ -> !config.sizeof_void
+ | TInt(ik, _) -> Some(sizeof_ikind ik)
+ | TFloat(fk, _) -> Some(sizeof_fkind fk)
+ | TPtr(_, _) -> Some(!config.sizeof_ptr)
+ | TArray(ty, None, _) -> None
+ | TArray(ty, Some n, _) as t' ->
+ begin match sizeof env ty with
+ | None -> None
+ | Some s ->
+ match cautious_mul n s with
+ | Some sz -> Some sz
+ | None -> error "sizeof(%a) overflows" Cprint.typ t'; Some 1
+ end
+ | TFun(_, _, _, _) -> !config.sizeof_fun
+ | TNamed(_, _) -> sizeof env (unroll env t)
+ | TStruct(name, _) ->
+ let ci = Env.find_struct env name in ci.ci_sizeof
+ | TUnion(name, _) ->
+ let ci = Env.find_union env name in ci.ci_sizeof
+
+(* Compute the size of a union.
+ It is the size is the max of the sizes of fields, rounded up to the
+ natural alignment. *)
+
+let sizeof_union env members =
+ let rec sizeof_rec sz = function
+ | [] ->
+ begin match alignof_struct_union env members with
+ | None -> None (* should not happen? *)
+ | Some al -> Some (align sz al)
+ end
+ | m :: rem ->
+ begin match sizeof env m.fld_typ with
+ | None -> None
+ | Some s -> sizeof_rec (max sz s) rem
+ end
+ in sizeof_rec 0 members
+
+(* Compute the size of a struct.
+ We lay out fields consecutively, inserting padding to preserve
+ their natural alignment. *)
+
+let sizeof_struct env members =
+ let rec sizeof_rec ofs = function
+ | [] | [ { fld_typ = TArray(_, None, _) } ] ->
+ (* C99: ty[] allowed as last field *)
+ begin match alignof_struct_union env members with
+ | None -> None (* should not happen? *)
+ | Some al -> Some (align ofs al)
+ end
+ | m :: rem as ml ->
+ if m.fld_bitfield = None then begin
+ match alignof env m.fld_typ, sizeof env m.fld_typ with
+ | Some a, Some s -> sizeof_rec (align ofs a + s) rem
+ | _, _ -> None
+ end else begin
+ let (sz, ml') = pack_bitfields ml in
+ sizeof_rec (align ofs sz + sz) ml'
+ end
+ in sizeof_rec 0 members
+
+(* Determine whether a type is incomplete *)
+
+let incomplete_type env t =
+ match sizeof env t with None -> true | Some _ -> false
+
+(* Computing composite_info records *)
+
+let composite_info_decl env su =
+ { ci_kind = su; ci_members = []; ci_alignof = None; ci_sizeof = None }
+
+let composite_info_def env su m =
+ { ci_kind = su; ci_members = m;
+ ci_alignof = alignof_struct_union env m;
+ ci_sizeof =
+ match su with
+ | Struct -> sizeof_struct env m
+ | Union -> sizeof_union env m }
+
+(* Type of a function definition *)
+
+let fundef_typ fd =
+ TFun(fd.fd_ret, Some fd.fd_params, fd.fd_vararg, [])
+
+(* Signedness of integer kinds *)
+
+let is_signed_ikind = function
+ | IBool -> false
+ | IChar -> !config.char_signed
+ | ISChar -> true
+ | IUChar -> false
+ | IInt -> true
+ | IUInt -> false
+ | IShort -> true
+ | IUShort -> false
+ | ILong -> true
+ | IULong -> false
+ | ILongLong -> true
+ | IULongLong -> false
+
+(* Conversion to unsigned ikind *)
+
+let unsigned_ikind_of = function
+ | IBool -> IBool
+ | IChar | ISChar | IUChar -> IUChar
+ | IInt | IUInt -> IUInt
+ | IShort | IUShort -> IUShort
+ | ILong | IULong -> IULong
+ | ILongLong | IULongLong -> IULongLong
+
+(* Some classification functions over types *)
+
+let is_void_type env t =
+ match unroll env t with
+ | TVoid _ -> true
+ | _ -> false
+
+let is_integer_type env t =
+ match unroll env t with
+ | TInt(_, _) -> true
+ | _ -> false
+
+let is_arith_type env t =
+ match unroll env t with
+ | TInt(_, _) -> true
+ | TFloat(_, _) -> true
+ | _ -> false
+
+let is_pointer_type env t =
+ match unroll env t with
+ | TPtr _ -> true
+ | _ -> false
+
+let is_scalar_type env t =
+ match unroll env t with
+ | TInt(_, _) -> true
+ | TFloat(_, _) -> true
+ | TPtr _ -> true
+ | TArray _ -> true (* assume implicit decay *)
+ | TFun _ -> true (* assume implicit decay *)
+ | _ -> false
+
+let is_composite_type env t =
+ match unroll env t with
+ | TStruct _ | TUnion _ -> true
+ | _ -> false
+
+let is_function_type env t =
+ match unroll env t with
+ | TFun _ -> true
+ | _ -> false
+
+(* Ranking of integer kinds *)
+
+let integer_rank = function
+ | IBool -> 1
+ | IChar | ISChar | IUChar -> 2
+ | IShort | IUShort -> 3
+ | IInt | IUInt -> 4
+ | ILong | IULong -> 5
+ | ILongLong | IULongLong -> 6
+
+(* Ranking of float kinds *)
+
+let float_rank = function
+ | FFloat -> 1
+ | FDouble -> 2
+ | FLongDouble -> 3
+
+(* Array and function types "decay" to pointer types in many cases *)
+
+let pointer_decay env t =
+ match unroll env t with
+ | TArray(ty, _, _) -> TPtr(ty, [])
+ | TFun _ as ty -> TPtr(ty, [])
+ | t -> t
+
+(* The usual unary conversions (H&S 6.3.3) *)
+
+let unary_conversion env t =
+ match unroll env t with
+ (* Promotion of small integer types *)
+ | TInt(kind, attr) ->
+ begin match kind with
+ | IBool | IChar | ISChar | IUChar | IShort | IUShort ->
+ TInt(IInt, attr)
+ | IInt | IUInt | ILong | IULong | ILongLong | IULongLong ->
+ TInt(kind, attr)
+ end
+ (* Arrays and functions decay automatically to pointers *)
+ | TArray(ty, _, _) -> TPtr(ty, [])
+ | TFun _ as ty -> TPtr(ty, [])
+ (* Other types are not changed *)
+ | t -> t
+
+(* The usual binary conversions (H&S 6.3.4).
+ Applies only to arithmetic types.
+ Return the type to which both sides are to be converted. *)
+
+let binary_conversion env t1 t2 =
+ let t1 = unary_conversion env t1 in
+ let t2 = unary_conversion env t2 in
+ match unroll env t1, unroll env t2 with
+ | TFloat(FLongDouble, _), (TInt _ | TFloat _) -> t1
+ | (TInt _ | TFloat _), TFloat(FLongDouble, _) -> t2
+ | TFloat(FDouble, _), (TInt _ | TFloat _) -> t1
+ | (TInt _ | TFloat _), TFloat(FDouble, _) -> t2
+ | TFloat(FFloat, _), (TInt _ | TFloat _) -> t1
+ | (TInt _), TFloat(FFloat, _) -> t2
+ | TInt(k1, _), TInt(k2, _) ->
+ if k1 = k2 then t1 else begin
+ match is_signed_ikind k1, is_signed_ikind k2 with
+ | true, true | false, false ->
+ (* take the bigger of the two types *)
+ if integer_rank k1 >= integer_rank k2 then t1 else t2
+ | false, true ->
+ (* if rank (unsigned type) >= rank (signed type),
+ take the unsigned type *)
+ if integer_rank k1 >= integer_rank k2 then t1
+ (* if rank (unsigned type) < rank (signed type)
+ and all values of the unsigned type can be represented
+ in the signed type, take the signed type *)
+ else if sizeof_ikind k2 > sizeof_ikind k1 then t2
+ (* if rank (unsigned type) < rank (signed type)
+ and some values of the unsigned type cannot be represented
+ in the signed type,
+ take the unsigned type corresponding to the signed type *)
+ else TInt(unsigned_ikind_of k2, [])
+ | true, false ->
+ if integer_rank k2 >= integer_rank k1 then t2
+ else if sizeof_ikind k1 > sizeof_ikind k2 then t1
+ else TInt(unsigned_ikind_of k1, [])
+ end
+ | _, _ -> assert false
+
+(* Conversion on function arguments (with protoypes) *)
+
+let argument_conversion env t =
+ (* Arrays and functions degrade automatically to pointers *)
+ (* Other types are not changed *)
+ match unroll env t with
+ | TArray(ty, _, _) -> TPtr(ty, [])
+ | TFun _ as ty -> TPtr(ty, [])
+ | _ -> t (* preserve typedefs *)
+
+(* Conversion on function arguments (old-style unprototyped, or vararg *)
+(* H&S 6.3.5 *)
+
+let default_argument_conversion env t =
+ match unary_conversion env t with
+ | TFloat(FFloat, attr) -> TFloat(FDouble, attr)
+ | t' -> t'
+
+(** Is the type Tptr(ty, a) appropriate for pointer arithmetic? *)
+
+let pointer_arithmetic_ok env ty =
+ match unroll env ty with
+ | TVoid _ | TFun _ -> false
+ | _ -> not (incomplete_type env ty)
+
+(** Special types *)
+
+let find_matching_unsigned_ikind sz =
+ if sz = !config.sizeof_int then IUInt
+ else if sz = !config.sizeof_long then IULong
+ else if sz = !config.sizeof_longlong then IULongLong
+ else assert false
+
+let find_matching_signed_ikind sz =
+ if sz = !config.sizeof_int then IInt
+ else if sz = !config.sizeof_long then ILong
+ else if sz = !config.sizeof_longlong then ILongLong
+ else assert false
+
+let wchar_ikind = find_matching_unsigned_ikind !config.sizeof_wchar
+let size_t_ikind = find_matching_unsigned_ikind !config.sizeof_size_t
+let ptr_t_ikind = find_matching_unsigned_ikind !config.sizeof_ptr
+let ptrdiff_t_ikind = find_matching_signed_ikind !config.sizeof_ptrdiff_t
+let enum_ikind = IInt
+
+(** The type of a constant *)
+
+let type_of_constant = function
+ | CInt(_, ik, _) -> TInt(ik, [])
+ | CFloat(_, fk, _) -> TFloat(fk, [])
+ | CStr _ -> TPtr(TInt(IChar, []), []) (* XXX or array? const? *)
+ | CWStr _ -> TPtr(TInt(wchar_ikind, []), []) (* XXX or array? const? *)
+ | CEnum(_, _) -> TInt(IInt, [])
+
+(* Check that a C expression is a lvalue *)
+
+let rec is_lvalue env e =
+ (* Type must not be array or function *)
+ match unroll env e.etyp with
+ | TFun _ | TArray _ -> false
+ | _ ->
+ match e.edesc with
+ | EVar id -> true
+ | EUnop((Oderef | Oarrow _), _) -> true
+ | EUnop(Odot _, e') -> is_lvalue env e'
+ | EBinop(Oindex, _, _, _) -> true
+ | _ -> false
+
+(* Check that a C expression is the literal "0", which can be used
+ as a pointer. *)
+
+let is_literal_0 e =
+ match e.edesc with
+ | EConst(CInt(0L, _, _)) -> true
+ | _ -> false
+
+(* Check that an assignment is allowed *)
+
+let valid_assignment env from tto =
+ match pointer_decay env from.etyp, pointer_decay env tto with
+ | (TInt _ | TFloat _), (TInt _ | TFloat _) -> true
+ | TInt _, TPtr _ -> is_literal_0 from
+ | TPtr(ty, _), TPtr(ty', _) ->
+ incl_attributes (attributes_of_type env ty) (attributes_of_type env ty')
+ && (is_void_type env ty || is_void_type env ty'
+ || compatible_types env
+ (erase_attributes_type env ty)
+ (erase_attributes_type env ty'))
+ | TStruct(s, _), TStruct(s', _) -> s = s'
+ | TUnion(s, _), TUnion(s', _) -> s = s'
+ | _, _ -> false
+
+(* Check that a cast is allowed *)
+
+let valid_cast env tfrom tto =
+ compatible_types ~noattrs:true env tfrom tto ||
+ begin match unroll env tfrom, unroll env tto with
+ | _, TVoid _ -> true
+ (* from any int-or-pointer (with array and functions decaying to pointers)
+ to any int-or-pointer *)
+ | (TInt _ | TPtr _ | TArray _ | TFun _), (TInt _ | TPtr _) -> true
+ (* between int and float types *)
+ | (TInt _ | TFloat _), (TInt _ | TFloat _) -> true
+ | _, _ -> false
+ end
+
+(* Construct an integer constant *)
+
+let intconst v ik =
+ { edesc = EConst(CInt(v, ik, "")); etyp = TInt(ik, []) }
+
+(* Construct a float constant *)
+
+let floatconst v fk =
+ { edesc = EConst(CFloat(v, fk, "")); etyp = TFloat(fk, []) }
+
+(* Construct the literal "0" with void * type *)
+
+let nullconst =
+ { edesc = EConst(CInt(0L, ptr_t_ikind, "0")); etyp = TPtr(TVoid [], []) }
+
+(* Construct a sequence *)
+
+let sseq loc s1 s2 =
+ match s1.sdesc, s2.sdesc with
+ | Sskip, _ -> s2
+ | _, Sskip -> s1
+ | _, Sblock sl -> { sdesc = Sblock(s1 :: sl); sloc = loc }
+ | _, _ -> { sdesc = Sseq(s1, s2); sloc = loc }
+
+(* Construct an assignment statement *)
+
+let sassign loc lv rv =
+ { sdesc = Sdo {edesc = EBinop(Oassign, lv, rv, lv.etyp); etyp = lv.etyp};
+ sloc = loc }
+
+(* Empty location *)
+
+let no_loc = ("", -1)
+
+(* Dummy skip statement *)
+
+let sskip = { sdesc = Sskip; sloc = no_loc }
+
+(* Print a location *)
+
+let printloc oc (filename, lineno) =
+ if filename <> "" then Printf.fprintf oc "%s:%d: " filename lineno
+
+(* Format a location *)
+
+let formatloc pp (filename, lineno) =
+ if filename <> "" then Format.fprintf pp "%s:%d: " filename lineno
+
+
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Useful functions to manipulate C abstract syntax *)
+
+open C
+
+(* Sets and maps over identifiers *)
+module IdentSet : Set.S with type elt = ident
+module IdentMap : Map.S with type key = ident
+
+(* Typedef handling *)
+val unroll : Env.t -> typ -> typ
+ (* Expand typedefs at head of type. Returned type is not [TNamed]. *)
+
+(* Attributes *)
+
+val add_attributes : attributes -> attributes -> attributes
+ (* Union of two sets of attributes *)
+val remove_attributes : attributes -> attributes -> attributes
+ (* Difference [attr1 \ attr2] between two sets of attributes *)
+val incl_attributes : attributes -> attributes -> bool
+ (* Check that first set of attributes is a subset of second set. *)
+val attributes_of_type : Env.t -> typ -> attributes
+ (* Return the attributes of the given type, expanding typedefs if needed. *)
+val add_attributes_type : attributes -> typ -> typ
+ (* Add the given set of attributes to those of the given type. *)
+val remove_attributes_type : Env.t -> attributes -> typ -> typ
+ (* Remove the given set of attributes to those of the given type. *)
+val erase_attributes_type : Env.t -> typ -> typ
+ (* Erase the attributes of the given type. *)
+
+(* Type compatibility *)
+val compatible_types : ?noattrs: bool -> Env.t -> typ -> typ -> bool
+ (* Check that the two given types are compatible.
+ If [noattrs], ignore attributes (recursively). *)
+val combine_types : ?noattrs: bool -> Env.t -> typ -> typ -> typ option
+ (* Like [compatible_types], but if the two types are compatible,
+ return the most precise type compatible with both. *)
+
+(* Size and alignment *)
+
+val sizeof : Env.t -> typ -> int option
+ (* Return the size alignment of the given type, in bytes.
+ Machine-dependent. [None] is returned if the type is incomplete. *)
+val alignof : Env.t -> typ -> int option
+ (* Return the natural alignment of the given type, in bytes.
+ Machine-dependent. [None] is returned if the type is incomplete. *)
+val sizeof_ikind: ikind -> int
+ (* Return the size of the given integer kind. *)
+val incomplete_type : Env.t -> typ -> bool
+ (* Return true if the given type is incomplete, e.g.
+ declared but not defined struct or union, or array type without a size. *)
+
+(* Computing composite_info records *)
+
+val composite_info_decl: Env.t -> struct_or_union -> Env.composite_info
+val composite_info_def: Env.t -> struct_or_union -> field list -> Env.composite_info
+
+(* Type classification functions *)
+
+val is_void_type : Env.t -> typ -> bool
+ (* Is type [void]? *)
+val is_integer_type : Env.t -> typ -> bool
+ (* Is type integer? *)
+val is_arith_type : Env.t -> typ -> bool
+ (* Is type integer or float? *)
+val is_pointer_type : Env.t -> typ -> bool
+ (* Is type a pointer type? *)
+val is_scalar_type : Env.t -> typ -> bool
+ (* Is type integer, float or pointer? *)
+val is_composite_type : Env.t -> typ -> bool
+ (* Is type a struct or union? *)
+val is_function_type : Env.t -> typ -> bool
+ (* Is type a function type? (not pointer to function) *)
+val pointer_arithmetic_ok : Env.t -> typ -> bool
+ (* Is the type [*ty] appropriate for pointer arithmetic?
+ [ty] must not be void, nor a function type, nor an incomplete type. *)
+val is_signed_ikind : ikind -> bool
+ (* Return true if the given integer kind is a signed type. *)
+val unsigned_ikind_of : ikind -> ikind
+ (* Return the unsigned integer kind corresponding to the given
+ integer kind. *)
+val integer_rank : ikind -> int
+ (* Order integer kinds from smaller to bigger *)
+val float_rank : fkind -> int
+ (* Order float kinds from smaller to bigger *)
+
+(* Usual conversions over types *)
+
+val pointer_decay : Env.t -> typ -> typ
+ (* Transform (decay) array and function types to pointer types. *)
+val unary_conversion : Env.t -> typ -> typ
+ (* The usual unary conversions:
+ small integer types are promoted to [int]
+ array and function types decay *)
+val binary_conversion : Env.t -> typ -> typ -> typ
+ (* The usual binary conversions. Applies only to arithmetic types.
+ Return the arithmetic type to which both operands of the binop
+ are converted. *)
+val argument_conversion : Env.t -> typ -> typ
+ (* Conversion applied to the argument of a prototyped function.
+ Equivalent to [pointer_decay]. *)
+val default_argument_conversion : Env.t -> typ -> typ
+ (* Conversion applied to the argument of a nonprototyped or variadic
+ function. Like unary conversion, plus [float] becomes [double]. *)
+
+(* Special types *)
+val enum_ikind : ikind
+ (* Integer kind for enum values. Always [IInt]. *)
+val wchar_ikind : ikind
+ (* Integer kind for wchar_t type. Unsigned. *)
+val size_t_ikind : ikind
+ (* Integer kind for size_t type. Unsigned. *)
+val ptr_t_ikind : ikind
+ (* Integer kind for ptr_t type. Smallest unsigned kind large enough
+ to contain a pointer without information loss. *)
+val ptrdiff_t_ikind : ikind
+ (* Integer kind for ptrdiff_t type. Smallest signed kind large enough
+ to contain the difference between two pointers. *)
+
+(* Helpers for type-checking *)
+
+val type_of_constant : constant -> typ
+ (* Return the type of the given constant. *)
+val is_literal_0 : exp -> bool
+ (* Is the given expression the integer literal "0"? *)
+val is_lvalue : Env.t -> exp -> bool
+ (* Is the given expression a l-value? *)
+val valid_assignment : Env.t -> exp -> typ -> bool
+ (* Check that an assignment of the given expression to a l-value of
+ the given type is allowed. *)
+val valid_cast : Env.t -> typ -> typ -> bool
+ (* Check that a cast from the first type to the second is allowed. *)
+val fundef_typ: fundef -> typ
+ (* Return the function type for the given function definition. *)
+
+(* Constructors *)
+
+val intconst : int64 -> ikind -> exp
+ (* Build expression for given integer constant. *)
+val floatconst : float -> fkind -> exp
+ (* Build expression for given float constant. *)
+val nullconst : exp
+ (* Expression for [(void * ) 0] *)
+val sskip: stmt
+ (* The [skip] statement. No location. *)
+val sseq : location -> stmt -> stmt -> stmt
+ (* Return the statement [s1; s2], optimizing the cases
+ where [s1] or [s2] is [skip], or [s2] is a block. *)
+val sassign : location -> exp -> exp -> stmt
+ (* Return the statement [exp1 = exp2;] *)
+
+(* Locations *)
+
+val no_loc: location
+ (* Denotes an unknown location. *)
+val printloc: out_channel -> location -> unit
+ (* Printer for locations (for Printf) *)
+val formatloc: Format.formatter -> location -> unit
+ (* Printer for locations (for Format) *)
+
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Elaboration from Cabs parse tree to C simplified, typed syntax tree *)
+
+open Format
+open Errors
+open Machine
+open Cabs
+open Cabshelper
+open C
+open Cutil
+open Env
+
+(** * Utility functions *)
+
+(* Error reporting *)
+
+let fatal_error loc fmt =
+ Errors.fatal_error ("%a: Error:@ " ^^ fmt) format_cabsloc loc
+
+let error loc fmt =
+ Errors.error ("%a: Error:@ " ^^ fmt) format_cabsloc loc
+
+let warning loc fmt =
+ Errors.warning ("%a: Warning:@ " ^^ fmt) format_cabsloc loc
+
+(* Error reporting for Env functions *)
+
+let wrap fn loc env arg =
+ try fn env arg
+ with Env.Error msg -> fatal_error loc "%s" (Env.error_message msg)
+
+(* Translation of locations *)
+
+let elab_loc l = (l.filename, l.lineno)
+
+(* Buffering of the result (a list of topdecl *)
+
+let top_declarations = ref ([] : globdecl list)
+
+let emit_elab loc td =
+ top_declarations := { gdesc = td; gloc = loc } :: !top_declarations
+
+let reset() = top_declarations := []
+
+let elaborated_program () =
+ let p = !top_declarations in
+ top_declarations := [];
+ (* Reverse it and eliminate unreferenced declarations *)
+ Cleanup.program p
+
+(* Location stuff *)
+
+let loc_of_name (_, _, _, loc) = loc
+
+let loc_of_namelist = function [] -> cabslu | name :: _ -> loc_of_name name
+
+let loc_of_init_name_list =
+ function [] -> cabslu | (name, init) :: _ -> loc_of_name name
+
+(* Monadic map for functions env -> 'a -> 'b * env *)
+
+let rec mmap f env = function
+ | [] -> ([], env)
+ | hd :: tl ->
+ let (hd', env1) = f env hd in
+ let (tl', env2) = mmap f env1 tl in
+ (hd' :: tl', env2)
+
+(* To detect redefinitions within the same scope *)
+
+let redef fn env arg =
+ try
+ let (id, info) = fn env arg in
+ if Env.in_current_scope env id then Some(id, info) else None
+ with Env.Error _ ->
+ None
+
+(* Forward declarations *)
+
+let elab_expr_f : (cabsloc -> Env.t -> Cabs.expression -> C.exp) ref
+ = ref (fun _ _ _ -> assert false)
+
+let elab_block_f : (cabsloc -> C.typ -> Env.t -> Cabs.block -> C.stmt) ref
+ = ref (fun _ _ _ _ -> assert false)
+
+\f
+(** * Elaboration of constants *)
+
+let has_suffix s suff =
+ let ls = String.length s and lsuff = String.length suff in
+ ls >= lsuff && String.sub s (ls - lsuff) lsuff = suff
+
+let chop_last s n =
+ assert (String.length s >= n);
+ String.sub s 0 (String.length s - n)
+
+let has_prefix s pref =
+ let ls = String.length s and lpref = String.length pref in
+ ls >= lpref && String.sub s 0 lpref = pref
+
+let chop_first s n =
+ assert (String.length s >= n);
+ String.sub s n (String.length s - n)
+
+exception Overflow
+exception Bad_digit
+
+let parse_int base s =
+ let max_val = (* (2^64-1) / base, unsigned *)
+ match base with
+ | 8 -> 2305843009213693951L
+ | 10 -> 1844674407370955161L
+ | 16 -> 1152921504606846975L
+ | _ -> assert false in
+ let v = ref 0L in
+ for i = 0 to String.length s - 1 do
+ if !v > max_val then raise Overflow;
+ v := Int64.mul !v (Int64.of_int base);
+ let c = s.[i] in
+ let digit =
+ if c >= '0' && c <= '9' then Char.code c - 48
+ else if c >= 'A' && c <= 'F' then Char.code c - 55
+ else raise Bad_digit in
+ if digit >= base then raise Bad_digit;
+ v := Int64.add !v (Int64.of_int digit)
+ done;
+ !v
+
+let integer_representable v ik =
+ let bitsize = sizeof_ikind ik * 8
+ and signed = is_signed_ikind ik in
+ if bitsize >= 64 then
+ (not signed) || (v >= 0L && v <= 0x7FFF_FFFF_FFFF_FFFFL)
+ else if not signed then
+ v >= 0L && v < Int64.shift_left 1L bitsize
+ else
+ v >= 0L && v < Int64.shift_left 1L (bitsize - 1)
+
+let elab_int_constant loc s0 =
+ let s = String.uppercase s0 in
+ (* Determine possible types and chop type suffix *)
+ let (s, dec_kinds, hex_kinds) =
+ if has_suffix s "ULL" || has_suffix s "LLU" then
+ (chop_last s 3, [IULongLong], [IULongLong])
+ else if has_suffix s "LL" then
+ (chop_last s 2, [ILongLong], [ILongLong; IULongLong])
+ else if has_suffix s "UL" || has_suffix s "LU" then
+ (chop_last s 2, [IULong; IULongLong], [IULong; IULongLong])
+ else if has_suffix s "L" then
+ (chop_last s 1, [ILong; ILongLong],
+ [ILong; IULong; ILongLong; IULongLong])
+ else if has_suffix s "U" then
+ (chop_last s 1, [IUInt; IULong; IULongLong],
+ [IUInt; IULong; IULongLong])
+ else
+ (s, [IInt; ILong; IULong; ILongLong],
+ [IInt; IUInt; ILong; IULong; ILongLong; IULongLong])
+ in
+ (* Determine base *)
+ let (s, base) =
+ if has_prefix s "0X" then
+ (chop_first s 2, 16)
+ else if has_prefix s "0" then
+ (chop_first s 1, 8)
+ else
+ (s, 10)
+ in
+ (* Parse digits *)
+ let v =
+ try parse_int base s
+ with
+ | Overflow ->
+ error loc "integer literal '%s' is too large" s0;
+ 0L
+ | Bad_digit ->
+ error loc "bad digit in integer literal '%s'" s0;
+ 0L
+ in
+ (* Find smallest allowable type that fits *)
+ let ty =
+ try List.find (fun ty -> integer_representable v ty)
+ (if base = 10 then dec_kinds else hex_kinds)
+ with Not_found ->
+ error loc "integer literal '%s' cannot be represented" s0;
+ IInt
+ in
+ (v, ty)
+
+let elab_float_constant loc s0 =
+ let s = String.uppercase s0 in
+ (* Determine type and chop suffix *)
+ let (s, ty) =
+ if has_suffix s "L" then
+ (chop_last s 1, FLongDouble)
+ else if has_suffix s "F" then
+ (chop_last s 1, FFloat)
+ else
+ (s, FDouble) in
+ (* Convert to Caml float - XXX loss of precision for long double *)
+ let v =
+ try float_of_string s
+ with Failure _ -> error loc "bad float literal '%s'" s0; 0.0 in
+ (v, ty)
+
+let elab_char_constant loc sz cl =
+ let nbits = 8 * sz in
+ (* Treat multi-char constants as a number in base 2^nbits *)
+ let max_val = Int64.shift_left 1L (64 - nbits) in
+ let v =
+ List.fold_left
+ (fun acc d ->
+ if acc >= max_val then begin
+ error loc "character literal overflows";
+ end;
+ Int64.add (Int64.shift_left acc nbits) d)
+ 0L cl in
+ let ty =
+ if v < 256L then IInt
+ else if v < Int64.shift_left 1L (8 * sizeof_ikind IULong) then IULong
+ else IULongLong in
+ (v, ty)
+
+let elab_constant loc = function
+ | CONST_INT s ->
+ let (v, ik) = elab_int_constant loc s in
+ CInt(v, ik, s)
+ | CONST_FLOAT s ->
+ let (v, fk) = elab_float_constant loc s in
+ CFloat(v, fk, s)
+ | CONST_CHAR cl ->
+ let (v, ik) = elab_char_constant loc 1 cl in
+ CInt(v, ik, "")
+ | CONST_WCHAR cl ->
+ let (v, ik) = elab_char_constant loc !config.sizeof_wchar cl in
+ CInt(v, ik, "")
+ | CONST_STRING s -> CStr s
+ | CONST_WSTRING s -> CWStr s
+
+\f
+(** * Elaboration of type expressions, type specifiers, name declarations *)
+
+(* Elaboration of attributes *)
+
+let elab_attribute loc = function
+ | ("const", []) -> Some AConst
+ | ("restrict", []) -> Some ARestrict
+ | ("volatile", []) -> Some AVolatile
+ | (name, args) ->
+ (* warning loc "ignoring '%s' attribute" name; *)
+ None
+
+let rec elab_attributes loc = function
+ | [] -> []
+ | a1 :: al ->
+ match elab_attribute loc a1 with
+ | None -> elab_attributes loc al
+ | Some a -> add_attributes [a] (elab_attributes loc al)
+
+(* Auxiliary for typespec elaboration *)
+
+let typespec_rank = function (* Don't change this *)
+ | Cabs.Tvoid -> 0
+ | Cabs.Tsigned -> 1
+ | Cabs.Tunsigned -> 2
+ | Cabs.Tchar -> 3
+ | Cabs.Tshort -> 4
+ | Cabs.Tlong -> 5
+ | Cabs.Tint -> 6
+ | Cabs.Tint64 -> 7
+ | Cabs.Tfloat -> 8
+ | Cabs.Tdouble -> 9
+ | Cabs.T_Bool -> 10
+ | _ -> 11 (* There should be at most one of the others *)
+
+let typespec_order t1 t2 = compare (typespec_rank t1) (typespec_rank t2)
+
+(* Elaboration of a type specifier. Returns 4-tuple:
+ (storage class, "inline" flag, elaborated type, new env)
+ Optional argument "only" is true if this is a standalone
+ struct or union declaration, without variable names.
+*)
+
+let rec elab_specifier ?(only = false) loc env specifier =
+ (* We first divide the parts of the specifier as follows:
+ - a storage class
+ - a set of attributes (const, volatile, restrict)
+ - a list of type specifiers *)
+ let sto = ref Storage_default
+ and inline = ref false
+ and attr = ref []
+ and tyspecs = ref [] in
+
+ let do_specifier = function
+ | SpecTypedef -> ()
+ | SpecCV cv ->
+ let a =
+ match cv with
+ | CV_CONST -> AConst
+ | CV_VOLATILE -> AVolatile
+ | CV_RESTRICT -> ARestrict in
+ attr := add_attributes [a] !attr
+ | SpecAttr a ->
+ attr := add_attributes (elab_attributes loc [a]) !attr
+ | SpecStorage st ->
+ if !sto <> Storage_default then
+ error loc "multiple storage specifiers";
+ begin match st with
+ | NO_STORAGE -> ()
+ | AUTO -> ()
+ | STATIC -> sto := Storage_static
+ | EXTERN -> sto := Storage_extern
+ | REGISTER -> sto := Storage_register
+ end
+ | SpecInline -> inline := true
+ | SpecType tys -> tyspecs := tys :: !tyspecs in
+
+ List.iter do_specifier specifier;
+
+ let simple ty = (!sto, !inline, add_attributes_type !attr ty, env) in
+
+ (* Now interpret the list of type specifiers. Much of this code
+ is stolen from CIL. *)
+ match List.stable_sort typespec_order (List.rev !tyspecs) with
+ | [Cabs.Tvoid] -> simple (TVoid [])
+
+ | [Cabs.T_Bool] -> simple (TInt(IBool, []))
+ | [Cabs.Tchar] -> simple (TInt(IChar, []))
+ | [Cabs.Tsigned; Cabs.Tchar] -> simple (TInt(ISChar, []))
+ | [Cabs.Tunsigned; Cabs.Tchar] -> simple (TInt(IUChar, []))
+
+ | [Cabs.Tshort] -> simple (TInt(IShort, []))
+ | [Cabs.Tsigned; Cabs.Tshort] -> simple (TInt(IShort, []))
+ | [Cabs.Tshort; Cabs.Tint] -> simple (TInt(IShort, []))
+ | [Cabs.Tsigned; Cabs.Tshort; Cabs.Tint] -> simple (TInt(IShort, []))
+
+ | [Cabs.Tunsigned; Cabs.Tshort] -> simple (TInt(IUShort, []))
+ | [Cabs.Tunsigned; Cabs.Tshort; Cabs.Tint] -> simple (TInt(IUShort, []))
+
+ | [] -> simple (TInt(IInt, []))
+ | [Cabs.Tint] -> simple (TInt(IInt, []))
+ | [Cabs.Tsigned] -> simple (TInt(IInt, []))
+ | [Cabs.Tsigned; Cabs.Tint] -> simple (TInt(IInt, []))
+
+ | [Cabs.Tunsigned] -> simple (TInt(IUInt, []))
+ | [Cabs.Tunsigned; Cabs.Tint] -> simple (TInt(IUInt, []))
+
+ | [Cabs.Tlong] -> simple (TInt(ILong, []))
+ | [Cabs.Tsigned; Cabs.Tlong] -> simple (TInt(ILong, []))
+ | [Cabs.Tlong; Cabs.Tint] -> simple (TInt(ILong, []))
+ | [Cabs.Tsigned; Cabs.Tlong; Cabs.Tint] -> simple (TInt(ILong, []))
+
+ | [Cabs.Tunsigned; Cabs.Tlong] -> simple (TInt(IULong, []))
+ | [Cabs.Tunsigned; Cabs.Tlong; Cabs.Tint] -> simple (TInt(IULong, []))
+
+ | [Cabs.Tlong; Cabs.Tlong] -> simple (TInt(ILongLong, []))
+ | [Cabs.Tsigned; Cabs.Tlong; Cabs.Tlong] -> simple (TInt(ILongLong, []))
+ | [Cabs.Tlong; Cabs.Tlong; Cabs.Tint] -> simple (TInt(ILongLong, []))
+ | [Cabs.Tsigned; Cabs.Tlong; Cabs.Tlong; Cabs.Tint] -> simple (TInt(ILongLong, []))
+
+ | [Cabs.Tunsigned; Cabs.Tlong; Cabs.Tlong] -> simple (TInt(IULongLong, []))
+ | [Cabs.Tunsigned; Cabs.Tlong; Cabs.Tlong; Cabs.Tint] -> simple (TInt(IULongLong, []))
+
+ (* int64 is a MSVC extension *)
+ | [Cabs.Tint64] -> simple (TInt(ILongLong, []))
+ | [Cabs.Tsigned; Cabs.Tint64] -> simple (TInt(ILongLong, []))
+ | [Cabs.Tunsigned; Cabs.Tint64] -> simple (TInt(IULongLong, []))
+
+ | [Cabs.Tfloat] -> simple (TFloat(FFloat, []))
+ | [Cabs.Tdouble] -> simple (TFloat(FDouble, []))
+
+ | [Cabs.Tlong; Cabs.Tdouble] -> simple (TFloat(FLongDouble, []))
+
+ (* Now the other type specifiers *)
+
+ | [Cabs.Tnamed id] ->
+ let (id', info) = wrap Env.lookup_typedef loc env id in
+ simple (TNamed(id', []))
+
+ | [Cabs.Tstruct(id, optmembers, a)] ->
+ let (id', env') =
+ elab_struct_or_union only Struct loc id optmembers env in
+ let attr' = add_attributes !attr (elab_attributes loc a) in
+ (!sto, !inline, TStruct(id', attr'), env')
+
+ | [Cabs.Tunion(id, optmembers, a)] ->
+ let (id', env') =
+ elab_struct_or_union only Union loc id optmembers env in
+ let attr' = add_attributes !attr (elab_attributes loc a) in
+ (!sto, !inline, TUnion(id', attr'), env')
+
+ | [Cabs.Tenum(id, optmembers, a)] ->
+ let env' =
+ elab_enum loc id optmembers env in
+ let attr' = add_attributes !attr (elab_attributes loc a) in
+ (!sto, !inline, TInt(enum_ikind, attr'), env')
+
+ | [Cabs.TtypeofE _] ->
+ fatal_error loc "GCC __typeof__ not supported"
+ | [Cabs.TtypeofT _] ->
+ fatal_error loc "GCC __typeof__ not supported"
+
+ (* Specifier doesn't make sense *)
+ | _ ->
+ fatal_error loc "illegal combination of type specifiers"
+
+(* Elaboration of a type declarator. *)
+
+and elab_type_declarator loc env ty = function
+ | Cabs.JUSTBASE ->
+ (ty, env)
+ | Cabs.PARENTYPE(attr1, d, attr2) ->
+ (* XXX ignoring the distinction between attrs after and before *)
+ let a = elab_attributes loc (attr1 @ attr2) in
+ elab_type_declarator loc env (add_attributes_type a ty) d
+ | Cabs.ARRAY(d, attr, sz) ->
+ let a = elab_attributes loc attr in
+ let sz' =
+ match sz with
+ | Cabs.NOTHING ->
+ None
+ | _ ->
+ match Ceval.integer_expr env (!elab_expr_f loc env sz) with
+ | Some n ->
+ if n < 0L then error loc "array size is negative";
+ Some n
+ | None ->
+ error loc "array size is not a compile-time constant";
+ Some 1L in (* produces better error messages later *)
+ elab_type_declarator loc env (TArray(ty, sz', a)) d
+ | Cabs.PTR(attr, d) ->
+ let a = elab_attributes loc attr in
+ elab_type_declarator loc env (TPtr(ty, a)) d
+ | Cabs.PROTO(d, params, vararg) ->
+ begin match unroll env ty with
+ | TArray _ | TFun _ ->
+ error loc "illegal function return type@ %a" Cprint.typ ty
+ | _ -> ()
+ end;
+ let params' = elab_parameters env params in
+ elab_type_declarator loc env (TFun(ty, params', vararg, [])) d
+
+(* Elaboration of parameters in a prototype *)
+
+and elab_parameters env params =
+ match params with
+ | [] -> (* old-style K&R prototype *)
+ None
+ | _ ->
+ (* Prototype introduces a new scope *)
+ let (vars, _) = mmap elab_parameter (Env.new_scope env) params in
+ (* Catch special case f(void) *)
+ match vars with
+ | [ ( {name=""}, TVoid _) ] -> Some []
+ | _ -> Some vars
+
+(* Elaboration of a function parameter *)
+
+and elab_parameter env (spec, name) =
+ let (id, sto, inl, ty, env1) = elab_name env spec name in
+ if sto <> Storage_default && sto <> Storage_register then
+ error (loc_of_name name)
+ "'extern' or 'static' storage not supported for function parameter";
+ (* replace array and function types by pointer types *)
+ let ty1 = argument_conversion env1 ty in
+ let (id', env2) = Env.enter_ident env1 id sto ty1 in
+ ( (id', ty1) , env2 )
+
+(* Elaboration of a (specifier, Cabs "name") pair *)
+
+and elab_name env spec (id, decl, attr, loc) =
+ let (sto, inl, bty, env') = elab_specifier loc env spec in
+ let (ty, env'') = elab_type_declarator loc env' bty decl in
+ let a = elab_attributes loc attr in
+ (id, sto, inl, add_attributes_type a ty, env'')
+
+(* Elaboration of a name group *)
+
+and elab_name_group env (spec, namelist) =
+ let (sto, inl, bty, env') =
+ elab_specifier (loc_of_namelist namelist) env spec in
+ let elab_one_name env (id, decl, attr, loc) =
+ let (ty, env1) =
+ elab_type_declarator loc env bty decl in
+ let a = elab_attributes loc attr in
+ ((id, sto, add_attributes_type a ty), env1) in
+ mmap elab_one_name env' namelist
+
+(* Elaboration of an init-name group *)
+
+and elab_init_name_group env (spec, namelist) =
+ let (sto, inl, bty, env') =
+ elab_specifier (loc_of_init_name_list namelist) env spec in
+ let elab_one_name env ((id, decl, attr, loc), init) =
+ let (ty, env1) =
+ elab_type_declarator loc env bty decl in
+ let a = elab_attributes loc attr in
+ ((id, sto, add_attributes_type a ty, init), env1) in
+ mmap elab_one_name env' namelist
+
+(* Elaboration of a field group *)
+
+and elab_field_group env (spec, fieldlist) =
+ let (names, env') =
+ elab_name_group env (spec, List.map fst fieldlist) in
+
+ let elab_bitfield ((_, _, _, loc), optbitsize) (id, sto, ty) =
+ if sto <> Storage_default then
+ error loc "member '%s' has non-default storage" id;
+ let optbitsize' =
+ match optbitsize with
+ | None -> None
+ | Some sz ->
+ let ik =
+ match unroll env' ty with
+ | TInt(ik, _) -> ik
+ | _ -> ILongLong (* trigger next error message *) in
+ if integer_rank ik > integer_rank IInt then
+ error loc
+ "the type of a bit field must be an integer type \
+ no bigger than 'int'";
+ match Ceval.integer_expr env' (!elab_expr_f loc env sz) with
+ | Some n ->
+ if n < 0L then begin
+ error loc "bit size of member (%Ld) is negative" n;
+ None
+ end else
+ if n > Int64.of_int(sizeof_ikind ik * 8) then begin
+ error loc "bit size of member (%Ld) is too large" n;
+ None
+ end else
+ Some(Int64.to_int n)
+ | None ->
+ error loc "bit size of member is not a compile-time constant";
+ None in
+ { fld_name = id; fld_typ = ty; fld_bitfield = optbitsize' }
+ in
+ (List.map2 elab_bitfield fieldlist names, env')
+
+(* Elaboration of a struct or union *)
+
+and elab_struct_or_union_info kind loc env members =
+ let (m, env') = mmap elab_field_group env members in
+ let m = List.flatten m in
+ (* Check for incomplete types *)
+ let rec check_incomplete = function
+ | [] -> ()
+ | [ { fld_typ = TArray(ty_elt, None, _) } ] when kind = Struct -> ()
+ (* C99: ty[] allowed as last field of a struct *)
+ | fld :: rem ->
+ if incomplete_type env' fld.fld_typ then
+ error loc "member '%s' has incomplete type" fld.fld_name;
+ check_incomplete rem in
+ check_incomplete m;
+ (composite_info_def env' kind m, env')
+
+(* Elaboration of a struct or union *)
+
+and elab_struct_or_union only kind loc tag optmembers env =
+ let optbinding =
+ if tag = "" then None else Env.lookup_composite env tag in
+ match optbinding, optmembers with
+ | Some(tag', ci), None
+ when (not only) || Env.in_current_scope env tag' ->
+ (* Reference to an already declared struct or union.
+ Special case: if this is an "only" declaration (without variable names)
+ and the composite was bound in another scope,
+ create a new incomplete composite instead via the case
+ "_, None" below. *)
+ (tag', env)
+ | Some(tag', ({ci_sizeof = None} as ci)), Some members
+ when Env.in_current_scope env tag' ->
+ if ci.ci_kind <> kind then
+ error loc "struct/union mismatch on tag '%s'" tag;
+ (* finishing the definition of an incomplete struct or union *)
+ let (ci', env') = elab_struct_or_union_info kind loc env members in
+ (* Emit a global definition for it *)
+ emit_elab (elab_loc loc)
+ (Gcompositedef(kind, tag', ci'.ci_members));
+ (* Replace infos but keep same ident *)
+ (tag', Env.add_composite env' tag' ci')
+ | Some(tag', {ci_sizeof = Some _}), Some _
+ when Env.in_current_scope env tag' ->
+ error loc "redefinition of struct or union '%s'" tag;
+ (tag', env)
+ | _, None ->
+ (* declaration of an incomplete struct or union *)
+ if tag = "" then
+ error loc "anonymous, incomplete struct or union";
+ let ci = composite_info_decl env kind in
+ (* enter it with a new name *)
+ let (tag', env') = Env.enter_composite env tag ci in
+ (* emit it *)
+ emit_elab (elab_loc loc)
+ (Gcompositedecl(kind, tag'));
+ (tag', env')
+ | _, Some members ->
+ (* definition of a complete struct or union *)
+ let ci1 = composite_info_decl env kind in
+ (* enter it, incomplete, with a new name *)
+ let (tag', env') = Env.enter_composite env tag ci1 in
+ (* emit a declaration so that inner structs and unions can refer to it *)
+ emit_elab (elab_loc loc)
+ (Gcompositedecl(kind, tag'));
+ (* elaborate the members *)
+ let (ci2, env'') = elab_struct_or_union_info kind loc env' members in
+ (* emit a definition *)
+ emit_elab (elab_loc loc)
+ (Gcompositedef(kind, tag', ci2.ci_members));
+ (* Replace infos but keep same ident *)
+ (tag', Env.add_composite env'' tag' ci2)
+
+(* Elaboration of an enum item *)
+
+and elab_enum_item env (s, exp, loc) nextval =
+ let (v, exp') =
+ match exp with
+ | NOTHING ->
+ (nextval, None)
+ | _ ->
+ let exp' = !elab_expr_f loc env exp in
+ match Ceval.integer_expr env exp' with
+ | Some n -> (n, Some exp')
+ | None ->
+ error loc
+ "value of enumerator '%s' is not a compile-time constant" s;
+ (nextval, Some exp') in
+ if redef Env.lookup_ident env s <> None then
+ error loc "redefinition of enumerator '%s'" s;
+ let (id, env') = Env.enter_enum_item env s v in
+ ((id, exp'), Int64.succ v, env')
+
+(* Elaboration of an enumeration declaration *)
+
+and elab_enum loc tag optmembers env =
+ match optmembers with
+ | None -> env
+ | Some members ->
+ let rec elab_members env nextval = function
+ | [] -> ([], env)
+ | hd :: tl ->
+ let (dcl1, nextval1, env1) = elab_enum_item env hd nextval in
+ let (dcl2, env2) = elab_members env1 nextval1 tl in
+ (dcl1 :: dcl2, env2) in
+ let (dcls, env') = elab_members env 0L members in
+ let tag' = Env.fresh_ident tag in
+ emit_elab (elab_loc loc) (Genumdef(tag', dcls));
+ env'
+
+(* Elaboration of a naked type, e.g. in a cast *)
+
+let elab_type loc env spec decl =
+ let (sto, inl, bty, env') = elab_specifier loc env spec in
+ let (ty, env'') = elab_type_declarator loc env' bty decl in
+ if sto <> Storage_default || inl then
+ error loc "'extern', 'static', 'register' and 'inline' are meaningless in cast";
+ ty
+
+\f
+(* Elaboration of expressions *)
+
+let elab_expr loc env a =
+
+ let err fmt = error loc fmt in (* non-fatal error *)
+ let error fmt = fatal_error loc fmt in
+ let warning fmt = warning loc fmt in
+
+ let rec elab = function
+
+ | NOTHING ->
+ error "empty expression"
+
+(* 7.3 Primary expressions *)
+
+ | VARIABLE s ->
+ begin match wrap Env.lookup_ident loc env s with
+ | (id, II_ident(sto, ty)) ->
+ { edesc = EVar id; etyp = ty }
+ | (id, II_enum v) ->
+ { edesc = EConst(CEnum(id, v)); etyp = TInt(enum_ikind, []) }
+ end
+
+ | CONSTANT cst ->
+ let cst' = elab_constant loc cst in
+ { edesc = EConst cst'; etyp = type_of_constant cst' }
+
+ | PAREN e ->
+ elab e
+
+(* 7.4 Postfix expressions *)
+
+ | INDEX(a1, a2) -> (* e1[e2] *)
+ let b1 = elab a1 in let b2 = elab a2 in
+ let tres =
+ match (unroll env b1.etyp, unroll env b2.etyp) with
+ | (TPtr(t, _) | TArray(t, _, _)), TInt _ -> t
+ | TInt _, (TPtr(t, _) | TArray(t, _, _)) -> t
+ | t1, t2 -> error "incorrect types for array subscripting" in
+ { edesc = EBinop(Oindex, b1, b2, TPtr(tres, [])); etyp = tres }
+
+ | MEMBEROF(a1, fieldname) ->
+ let b1 = elab a1 in
+ let (fld, attrs) =
+ match unroll env b1.etyp with
+ | TStruct(id, attrs) ->
+ (wrap Env.find_struct_member loc env (id, fieldname), attrs)
+ | TUnion(id, attrs) ->
+ (wrap Env.find_union_member loc env (id, fieldname), attrs)
+ | _ ->
+ error "left-hand side of '.' is not a struct or union" in
+ (* A field of a const/volatile struct or union is itself const/volatile *)
+ { edesc = EUnop(Odot fieldname, b1);
+ etyp = add_attributes_type attrs fld.fld_typ }
+
+ | MEMBEROFPTR(a1, fieldname) ->
+ let b1 = elab a1 in
+ let (fld, attrs) =
+ match unroll env b1.etyp with
+ | TPtr(t, _) ->
+ begin match unroll env t with
+ | TStruct(id, attrs) ->
+ (wrap Env.find_struct_member loc env (id, fieldname), attrs)
+ | TUnion(id, attrs) ->
+ (wrap Env.find_union_member loc env (id, fieldname), attrs)
+ | _ ->
+ error "left-hand side of '->' is not a pointer to a struct or union"
+ end
+ | _ ->
+ error "left-hand side of '->' is not a pointer " in
+ { edesc = EUnop(Oarrow fieldname, b1);
+ etyp = add_attributes_type attrs fld.fld_typ }
+
+(* Hack to treat vararg.h functions the GCC way. Helps with testing.
+ va_start(ap,n)
+ (preprocessing) --> __builtin_va_start(ap, arg)
+ (elaboration) --> __builtin_va_start(ap, &arg)
+ va_arg(ap, ty)
+ (preprocessing) --> __builtin_va_arg(ap, ty)
+ (parsing) --> __builtin_va_arg(ap, sizeof(ty))
+*)
+ | CALL((VARIABLE "__builtin_va_start" as a1), [a2; a3]) ->
+ let b1 = elab a1 and b2 = elab a2 and b3 = elab a3 in
+ { edesc = ECall(b1, [b2; {edesc = EUnop(Oaddrof, b3);
+ etyp = TPtr(b3.etyp, [])}]);
+ etyp = TVoid [] }
+ | CALL((VARIABLE "__builtin_va_arg" as a1),
+ [a2; (TYPE_SIZEOF _) as a3]) ->
+ let b1 = elab a1 and b2 = elab a2 and b3 = elab a3 in
+ let ty = match b3.edesc with ESizeof ty -> ty | _ -> assert false in
+ { edesc = ECall(b1, [b2; b3]); etyp = ty }
+
+ | CALL(a1, al) ->
+ let b1 =
+ (* Catch the old-style usage of calling a function without
+ having declared it *)
+ match a1 with
+ | VARIABLE n when not (Env.ident_is_bound env n) ->
+ let ty = TFun(TInt(IInt, []), None, false, []) in
+ (* Emit an extern declaration for it *)
+ let id = Env.fresh_ident n in
+ emit_elab (elab_loc loc) (Gdecl(Storage_extern, id, ty, None));
+ { edesc = EVar id; etyp = ty }
+ | _ -> elab a1 in
+ let bl = List.map elab al in
+ (* Extract type information *)
+ let (res, args, vararg) =
+ match unroll env b1.etyp with
+ | TFun(res, args, vararg, a) -> (res, args, vararg)
+ | TPtr(ty, a) ->
+ begin match unroll env ty with
+ | TFun(res, args, vararg, a) -> (res, args, vararg)
+ | _ -> error "the function part of a call does not have a function type"
+ end
+ | _ -> error "the function part of a call does not have a function type"
+ in
+ (* Type-check the arguments against the prototype *)
+ let bl' =
+ match args with
+ | None -> bl
+ | Some proto -> elab_arguments 1 bl proto vararg in
+ { edesc = ECall(b1, bl'); etyp = res }
+
+ | UNARY(POSINCR, a1) ->
+ elab_pre_post_incr_decr Opostincr "postfix '++'" a1
+ | UNARY(POSDECR, a1) ->
+ elab_pre_post_incr_decr Opostdecr "postfix '--'" a1
+
+(* 7.5 Unary expressions *)
+
+ | CAST ((spec, dcl), SINGLE_INIT a1) ->
+ let ty = elab_type loc env spec dcl in
+ let b1 = elab a1 in
+ if not (valid_cast env b1.etyp ty) then
+ err "illegal cast from %a@ to %a" Cprint.typ b1.etyp Cprint.typ ty;
+ { edesc = ECast(ty, b1); etyp = ty }
+
+ | CAST ((spec, dcl), _) ->
+ error "cast of initializer expression is not supported"
+
+ | EXPR_SIZEOF(CONSTANT(CONST_STRING s)) ->
+ let cst = CInt(Int64.of_int (String.length s), size_t_ikind, "") in
+ { edesc = EConst cst; etyp = type_of_constant cst }
+
+ | EXPR_SIZEOF a1 ->
+ let b1 = elab a1 in
+ if sizeof env b1.etyp = None then
+ err "incomplete type %a" Cprint.typ b1.etyp;
+ { edesc = ESizeof b1.etyp; etyp = TInt(size_t_ikind, []) }
+
+ | TYPE_SIZEOF (spec, dcl) ->
+ let ty = elab_type loc env spec dcl in
+ if sizeof env ty = None then
+ err "incomplete type %a" Cprint.typ ty;
+ { edesc = ESizeof ty; etyp = TInt(size_t_ikind, []) }
+
+ | UNARY(PLUS, a1) ->
+ let b1 = elab a1 in
+ if not (is_arith_type env b1.etyp) then
+ error "argument of unary '+' is not an arithmetic type";
+ { edesc = EUnop(Oplus, b1); etyp = unary_conversion env b1.etyp }
+
+ | UNARY(MINUS, a1) ->
+ let b1 = elab a1 in
+ if not (is_arith_type env b1.etyp) then
+ error "argument of unary '-' is not an arithmetic type";
+ { edesc = EUnop(Ominus, b1); etyp = unary_conversion env b1.etyp }
+
+ | UNARY(BNOT, a1) ->
+ let b1 = elab a1 in
+ if not (is_integer_type env b1.etyp) then
+ error "argument of '~' is not an integer type";
+ { edesc = EUnop(Onot, b1); etyp = unary_conversion env b1.etyp }
+
+ | UNARY(NOT, a1) ->
+ let b1 = elab a1 in
+ if not (is_scalar_type env b1.etyp) then
+ error "argument of '!' is not a scalar type";
+ { edesc = EUnop(Olognot, b1); etyp = TInt(IInt, []) }
+
+ | UNARY(ADDROF, a1) ->
+ let b1 = elab a1 in
+ begin match unroll env b1.etyp with
+ | TArray _ | TFun _ -> ()
+ | _ ->
+ if not (is_lvalue env b1) then err "argument of '&' is not a l-value"
+ end;
+ { edesc = EUnop(Oaddrof, b1); etyp = TPtr(b1.etyp, []) }
+
+ | UNARY(MEMOF, a1) ->
+ let b1 = elab a1 in
+ begin match unroll env b1.etyp with
+ (* '*' applied to a function type has no effect *)
+ | TFun _ -> b1
+ | TPtr(ty, _) | TArray(ty, _, _) ->
+ { edesc = EUnop(Oderef, b1); etyp = ty }
+ | _ ->
+ error "argument of unary '*' is not a pointer"
+ end
+
+ | UNARY(PREINCR, a1) ->
+ elab_pre_post_incr_decr Opreincr "prefix '++'" a1
+ | UNARY(PREDECR, a1) ->
+ elab_pre_post_incr_decr Opredecr "prefix '--'" a1
+
+(* 7.6 Binary operator expressions *)
+
+ | BINARY(MUL, a1, a2) ->
+ elab_binary_arithmetic "*" Omul a1 a2
+
+ | BINARY(DIV, a1, a2) ->
+ elab_binary_arithmetic "/" Odiv a1 a2
+
+ | BINARY(MOD, a1, a2) ->
+ elab_binary_integer "/" Omod a1 a2
+
+ | BINARY(ADD, a1, a2) ->
+ let b1 = elab a1 in
+ let b2 = elab a2 in
+ let tyres =
+ if is_arith_type env b1.etyp && is_arith_type env b2.etyp then
+ binary_conversion env b1.etyp b2.etyp
+ else begin
+ let (ty, attr) =
+ match unroll env b1.etyp, unroll env b2.etyp with
+ | (TPtr(ty, a) | TArray(ty, _, a)), TInt _ -> (ty, a)
+ | TInt _, (TPtr(ty, a) | TArray(ty, _, a)) -> (ty, a)
+ | _, _ -> error "type error in binary '+'" in
+ if not (pointer_arithmetic_ok env ty) then
+ err "illegal pointer arithmetic in binary '+'";
+ TPtr(ty, attr)
+ end in
+ { edesc = EBinop(Oadd, b1, b2, tyres); etyp = tyres }
+
+ | BINARY(SUB, a1, a2) ->
+ let b1 = elab a1 in
+ let b2 = elab a2 in
+ let (tyop, tyres) =
+ if is_arith_type env b1.etyp && is_arith_type env b2.etyp then begin
+ let tyres = binary_conversion env b1.etyp b2.etyp in
+ (tyres, tyres)
+ end else begin
+ match unroll env b1.etyp, unroll env b2.etyp with
+ | (TPtr(ty, a) | TArray(ty, _, a)), TInt _ ->
+ if not (pointer_arithmetic_ok env ty) then
+ err "illegal pointer arithmetic in binary '-'";
+ (TPtr(ty, a), TPtr(ty, a))
+ | TInt _, (TPtr(ty, a) | TArray(ty, _, a)) ->
+ if not (pointer_arithmetic_ok env ty) then
+ err "illegal pointer arithmetic in binary '-'";
+ (TPtr(ty, a), TPtr(ty, a))
+ | (TPtr(ty1, a1) | TArray(ty1, _, a1)),
+ (TPtr(ty2, a2) | TArray(ty2, _, a2)) ->
+ if not (compatible_types ~noattrs:true env ty1 ty2) then
+ err "mismatch between pointer types in binary '-'";
+ if not (pointer_arithmetic_ok env ty1) then
+ err "illegal pointer arithmetic in binary '-'";
+ (TPtr(ty1, []), TInt(ptrdiff_t_ikind, []))
+ | _, _ -> error "type error in binary '-'"
+ end in
+ { edesc = EBinop(Osub, b1, b2, tyop); etyp = tyres }
+
+ | BINARY(SHL, a1, a2) ->
+ elab_shift "<<" Oshl a1 a2
+
+ | BINARY(SHR, a1, a2) ->
+ elab_shift ">>" Oshr a1 a2
+
+ | BINARY(EQ, a1, a2) ->
+ elab_comparison Oeq a1 a2
+ | BINARY(NE, a1, a2) ->
+ elab_comparison One a1 a2
+ | BINARY(LT, a1, a2) ->
+ elab_comparison Olt a1 a2
+ | BINARY(GT, a1, a2) ->
+ elab_comparison Ogt a1 a2
+ | BINARY(LE, a1, a2) ->
+ elab_comparison Ole a1 a2
+ | BINARY(GE, a1, a2) ->
+ elab_comparison Oge a1 a2
+
+ | BINARY(BAND, a1, a2) ->
+ elab_binary_integer "&" Oand a1 a2
+ | BINARY(BOR, a1, a2) ->
+ elab_binary_integer "|" Oor a1 a2
+ | BINARY(XOR, a1, a2) ->
+ elab_binary_integer "^" Oxor a1 a2
+
+(* 7.7 Logical operator expressions *)
+
+ | BINARY(AND, a1, a2) ->
+ elab_logical_operator "&&" Ologand a1 a2
+ | BINARY(OR, a1, a2) ->
+ elab_logical_operator "||" Ologor a1 a2
+
+(* 7.8 Conditional expressions *)
+ | QUESTION(a1, a2, a3) ->
+ let b1 = elab a1 in
+ let b2 = elab a2 in
+ let b3 = elab a3 in
+ if not (is_scalar_type env b1.etyp) then
+ err ("the first argument of '? :' is not a scalar type");
+ begin match pointer_decay env b2.etyp, pointer_decay env b3.etyp with
+ | (TInt _ | TFloat _), (TInt _ | TFloat _) ->
+ { edesc = EConditional(b1, b2, b3);
+ etyp = binary_conversion env b2.etyp b3.etyp }
+ | TPtr(ty1, a1), TPtr(ty2, a2) ->
+ let tyres =
+ if is_void_type env ty1 || is_void_type env ty2 then
+ TPtr(TVoid [], add_attributes a1 a2)
+ else
+ match combine_types ~noattrs:true env
+ (TPtr(ty1, a1)) (TPtr(ty2, a2)) with
+ | None ->
+ error "the second and third arguments of '? :' \
+ have incompatible pointer types"
+ | Some ty -> ty
+ in
+ { edesc = EConditional(b1, b2, b3); etyp = tyres }
+ | TPtr(ty1, a1), TInt _ when is_literal_0 b3 ->
+ { edesc = EConditional(b1, b2, nullconst); etyp = TPtr(ty1, a1) }
+ | TInt _, TPtr(ty2, a2) when is_literal_0 b2 ->
+ { edesc = EConditional(b1, nullconst, b3); etyp = TPtr(ty2, a2) }
+ | ty1, ty2 ->
+ match combine_types env ty1 ty2 with
+ | None ->
+ error ("the second and third arguments of '? :' have incompatible types")
+ | Some tyres ->
+ { edesc = EConditional(b1, b2, b3); etyp = tyres }
+ end
+
+(* 7.9 Assignment expressions *)
+
+ | BINARY(ASSIGN, a1, a2) ->
+ let b1 = elab a1 in
+ let b2 = elab a2 in
+ if not (is_lvalue env b1) then
+ err "left-hand side of assignment is not a l-value";
+ if List.mem AConst (attributes_of_type env b1.etyp) then
+ err "left-hand side of assignment has 'const' type";
+ if not (valid_assignment env b2 b1.etyp) then begin
+ if valid_cast env b2.etyp b1.etyp then
+ warning "assigning a value of type@ %a@ to a lvalue of type@ %a"
+ Cprint.typ b2.etyp Cprint.typ b1.etyp
+ else
+ err "assigning a value of type@ %a@ to a lvalue of type@ %a"
+ Cprint.typ b2.etyp Cprint.typ b1.etyp;
+ end;
+ { edesc = EBinop(Oassign, b1, b2, b1.etyp); etyp = b1.etyp }
+
+ | BINARY((ADD_ASSIGN | SUB_ASSIGN | MUL_ASSIGN | DIV_ASSIGN | MOD_ASSIGN
+ | BAND_ASSIGN | BOR_ASSIGN | XOR_ASSIGN | SHL_ASSIGN | SHR_ASSIGN
+ as op), a1, a2) ->
+ let (sop, top) =
+ match op with
+ | ADD_ASSIGN -> (ADD, Oadd_assign)
+ | SUB_ASSIGN -> (SUB, Osub_assign)
+ | MUL_ASSIGN -> (MUL, Omul_assign)
+ | DIV_ASSIGN -> (DIV, Odiv_assign)
+ | MOD_ASSIGN -> (MOD, Omod_assign)
+ | BAND_ASSIGN -> (BAND, Oand_assign)
+ | BOR_ASSIGN -> (BOR, Oor_assign)
+ | XOR_ASSIGN -> (XOR, Oxor_assign)
+ | SHL_ASSIGN -> (SHL, Oshl_assign)
+ | SHR_ASSIGN -> (SHR, Oshr_assign)
+ | _ -> assert false in
+ begin match elab (BINARY(sop, a1, a2)) with
+ | { edesc = EBinop(_, b1, b2, _); etyp = ty } as b ->
+ if not (is_lvalue env b1) then
+ err ("left-hand side of assignment is not a l-value");
+ if List.mem AConst (attributes_of_type env b1.etyp) then
+ err "left-hand side of assignment has 'const' type";
+ if not (valid_assignment env b b1.etyp) then begin
+ if valid_cast env ty b1.etyp then
+ warning "assigning a value of type@ %a@ to a lvalue of type@ %a"
+ Cprint.typ ty Cprint.typ b1.etyp
+ else
+ err "assigning a value of type@ %a@ to a lvalue of type@ %a"
+ Cprint.typ ty Cprint.typ b1.etyp;
+ end;
+ { edesc = EBinop(top, b1, b2, ty); etyp = b1.etyp }
+ | _ -> assert false
+ end
+
+(* 7.10 Sequential expressions *)
+
+ | COMMA [] ->
+ error "empty sequential expression"
+ | COMMA (a1 :: al) -> (* watch for left associativity *)
+ let rec elab_comma accu = function
+ | [] -> accu
+ | a :: l ->
+ let b = elab a in
+ elab_comma { edesc = EBinop(Ocomma, accu, b, b.etyp); etyp = b.etyp } l
+ in elab_comma (elab a1) al
+
+(* Extensions that we do not handle *)
+
+ | LABELADDR _ ->
+ error "GCC's &&label construct is not supported"
+ | GNU_BODY _ ->
+ error "GCC's statements within expressions are not supported"
+ | EXPR_ALIGNOF _ | TYPE_ALIGNOF _ ->
+ error "GCC's __alignof__ construct is not supported"
+
+(*
+ | EXPR_ALIGNOF a1 ->
+ warning "nonstandard `alignof' expression, turned into a constant";
+ let b1 = elab a1 in
+ begin match alignof env b1.etyp with
+ | None -> error "incomplete type %a" Cprint.typ b1.etyp
+ | Some al -> intconst (Int64.of_int al) size_t_ikind
+ end
+ | TYPE_ALIGNOF (spec, dcl) ->
+ warning "nonstandard `alignof' expression, turned into a constant";
+ let ty = elab_type loc env spec dcl in
+ begin match alignof env ty with
+ | None -> error "incomplete type %a" Cprint.typ ty
+ | Some al -> intconst (Int64.of_int al) size_t_ikind
+ end
+*)
+
+(* Elaboration of pre- or post- increment/decrement *)
+ and elab_pre_post_incr_decr op msg a1 =
+ let b1 = elab a1 in
+ if not (is_lvalue env b1) then
+ err "the argument of %s is not a l-value" msg;
+ if not (is_scalar_type env b1.etyp) then
+ err "the argument of %s must be an arithmetic or pointer type" msg;
+ { edesc = EUnop(op, b1); etyp = b1.etyp }
+
+(* Elaboration of binary operators over integers *)
+ and elab_binary_integer msg op a1 a2 =
+ let b1 = elab a1 in
+ if not (is_integer_type env b1.etyp) then
+ error "the first argument of '%s' is not an integer type" msg;
+ let b2 = elab a2 in
+ if not (is_integer_type env b2.etyp) then
+ error "the second argument of '%s' is not an integer type" msg;
+ let tyres = binary_conversion env b1.etyp b2.etyp in
+ { edesc = EBinop(op, b1, b2, tyres); etyp = tyres }
+
+(* Elaboration of binary operators over arithmetic types *)
+ and elab_binary_arithmetic msg op a1 a2 =
+ let b1 = elab a1 in
+ if not (is_arith_type env b1.etyp) then
+ error "the first argument of '%s' is not an arithmetic type" msg;
+ let b2 = elab a2 in
+ if not (is_arith_type env b2.etyp) then
+ error "the second argument of '%s' is not an arithmetic type" msg;
+ let tyres = binary_conversion env b1.etyp b2.etyp in
+ { edesc = EBinop(op, b1, b2, tyres); etyp = tyres }
+
+(* Elaboration of shift operators *)
+ and elab_shift msg op a1 a2 =
+ let b1 = elab a1 in
+ if not (is_integer_type env b1.etyp) then
+ error "the first argument of '%s' is not an integer type" msg;
+ let b2 = elab a2 in
+ if not (is_integer_type env b2.etyp) then
+ error "the second argument of '%s' is not an integer type" msg;
+ let tyres = unary_conversion env b1.etyp in
+ { edesc = EBinop(op, b1, b2, tyres); etyp = tyres }
+
+(* Elaboration of comparisons *)
+ and elab_comparison op a1 a2 =
+ let b1 = elab a1 in
+ let b2 = elab a2 in
+ let resdesc =
+ match pointer_decay env b1.etyp, pointer_decay env b2.etyp with
+ | (TInt _ | TFloat _), (TInt _ | TFloat _) ->
+ EBinop(op, b1, b2, binary_conversion env b1.etyp b2.etyp)
+ | TInt _, TPtr(ty, _) when is_literal_0 b1 ->
+ EBinop(op, nullconst, b2, TPtr(ty, []))
+ | TPtr(ty, _), TInt _ when is_literal_0 b2 ->
+ EBinop(op, b1, nullconst, TPtr(ty, []))
+ | TPtr(ty1, _), TPtr(ty2, _)
+ when is_void_type env ty1 ->
+ EBinop(op, b1, b2, TPtr(ty2, []))
+ | TPtr(ty1, _), TPtr(ty2, _)
+ when is_void_type env ty2 ->
+ EBinop(op, b1, b2, TPtr(ty1, []))
+ | TPtr(ty1, _), TPtr(ty2, _) ->
+ if not (compatible_types ~noattrs:true env ty1 ty2) then
+ warning "comparison between incompatible pointer types";
+ EBinop(op, b1, b2, TPtr(ty1, []))
+ | TPtr _, TInt _
+ | TInt _, TPtr _ ->
+ warning "comparison between integer and pointer";
+ EBinop(op, b1, b2, TPtr(TVoid [], []))
+ | ty1, ty2 ->
+ error "illegal comparison between types@ %a@ and %a"
+ Cprint.typ b1.etyp Cprint.typ b2.etyp in
+ { edesc = resdesc; etyp = TInt(IInt, []) }
+
+(* Elaboration of && and || *)
+ and elab_logical_operator msg op a1 a2 =
+ let b1 = elab a1 in
+ if not (is_scalar_type env b1.etyp) then
+ err "the first argument of '%s' is not a scalar type" msg;
+ let b2 = elab a2 in
+ if not (is_scalar_type env b2.etyp) then
+ err "the second argument of '%s' is not a scalar type" msg;
+ { edesc = EBinop(op, b1, b2, TInt(IInt, [])); etyp = TInt(IInt, []) }
+
+(* Type-checking of function arguments *)
+ and elab_arguments argno args params vararg =
+ match args, params with
+ | [], [] -> []
+ | [], _::_ -> err "not enough arguments in function call"; []
+ | _::_, [] ->
+ if vararg
+ then args
+ else (err "too many arguments in function call"; args)
+ | arg1 :: argl, (_, ty_p) :: paraml ->
+ let ty_a = argument_conversion env arg1.etyp in
+ if not (valid_assignment env {arg1 with etyp = ty_a} ty_p) then begin
+ if valid_cast env ty_a ty_p then
+ warning
+ "argument #%d of function call has type@ %a@ \
+ instead of the expected type@ %a"
+ argno Cprint.typ ty_a Cprint.typ ty_p
+ else
+ err
+ "argument #%d of function call has type@ %a@ \
+ instead of the expected type@ %a"
+ argno Cprint.typ ty_a Cprint.typ ty_p
+ end;
+ arg1 :: elab_arguments (argno + 1) argl paraml vararg
+
+ in elab a
+
+(* Filling in forward declaration *)
+let _ = elab_expr_f := elab_expr
+
+let elab_opt_expr loc env = function
+ | NOTHING -> None
+ | a -> Some (elab_expr loc env a)
+
+let elab_for_expr loc env = function
+ | NOTHING -> { sdesc = Sskip; sloc = elab_loc loc }
+ | a -> { sdesc = Sdo (elab_expr loc env a); sloc = elab_loc loc }
+
+\f
+(* Elaboration of initializers *)
+
+(* Initializers are first elaborated to the following type: *)
+
+let project_init loc il =
+ List.map
+ (fun (what, i) ->
+ if what <> NEXT_INIT then
+ error loc "C99 initializers are not supported";
+ i)
+ il
+
+let below_optsize n opt_sz =
+ match opt_sz with None -> true | Some sz -> n < sz
+
+let init_char_array_string opt_size s =
+ let init = ref []
+ and len = ref 0L in
+ let enter x =
+ if below_optsize !len opt_size then begin
+ init := Init_single (intconst x IChar) :: !init;
+ len := Int64.succ !len
+ end in
+ for i = 0 to String.length s - 1 do
+ enter (Int64.of_int (Char.code s.[i]))
+ done;
+ enter 0L;
+ Init_array (List.rev !init)
+
+let init_int_array_wstring opt_size s =
+ let init = ref []
+ and len = ref 0L in
+ let enter x =
+ if below_optsize !len opt_size then begin
+ init := Init_single (intconst x IInt) :: !init;
+ len := Int64.succ !len
+ end in
+ List.iter enter s;
+ enter 0L;
+ Init_array (List.rev !init)
+
+let check_init_type loc env a ty =
+ if valid_assignment env a ty then ()
+ else if valid_cast env a.etyp ty then
+ warning loc
+ "initializer has type@ %a@ instead of the expected type @ %a"
+ Cprint.typ a.etyp Cprint.typ ty
+ else
+ error loc
+ "initializer has type@ %a@ instead of the expected type @ %a"
+ Cprint.typ a.etyp Cprint.typ ty
+
+(* Build an initializer for type [ty], consuming initialization items
+ from the list [ile]. Return a pair (initializer, items not consumed). *)
+
+let rec elab_init loc env ty ile =
+ match unroll env ty with
+ | TArray(ty_elt, opt_sz, _) ->
+ let rec elab_init_array n accu rem =
+ match opt_sz, rem with
+ | Some sz, _ when n >= sz ->
+ (Init_array(List.rev accu), rem)
+ | None, [] ->
+ (Init_array(List.rev accu), rem)
+ | _, _ ->
+ let (i, rem') = elab_init loc env ty_elt rem in
+ elab_init_array (Int64.succ n) (i :: accu) rem' in
+ begin match ile with
+ (* char array = "string literal" *)
+ | (SINGLE_INIT (CONSTANT (CONST_STRING s))
+ | COMPOUND_INIT [_, SINGLE_INIT(CONSTANT (CONST_STRING s))]) :: ile1
+ when (match unroll env ty_elt with
+ | TInt((IChar|IUChar|ISChar), _) -> true
+ | _ -> false) ->
+ (init_char_array_string opt_sz s, ile1)
+ (* wchar array = L"wide string literal" *)
+ | (SINGLE_INIT (CONSTANT (CONST_WSTRING s))
+ | COMPOUND_INIT [_, SINGLE_INIT(CONSTANT (CONST_WSTRING s))]) :: ile1
+ when (match unroll env ty_elt with
+ | TInt _ -> true
+ | _ -> false) ->
+ (init_int_array_wstring opt_sz s, ile1)
+ (* array = { elt, ..., elt } *)
+ | COMPOUND_INIT ile1 :: ile2 ->
+ let (ie, rem) = elab_init_array 0L [] (project_init loc ile1) in
+ if rem <> [] then
+ warning loc "excess elements at end of array initializer";
+ (ie, ile2)
+ (* array = elt, ..., elt (within a bigger compound initializer) *)
+ | _ ->
+ elab_init_array 0L [] ile
+ end
+ | TStruct(id, _) ->
+ let ci = wrap Env.find_struct loc env id in
+ let rec elab_init_fields fld accu rem =
+ match fld with
+ | [] ->
+ (Init_struct(id, List.rev accu), rem)
+ | fld1 :: fld' ->
+ let (i, rem') = elab_init loc env fld1.fld_typ rem in
+ elab_init_fields fld' ((fld1, i) :: accu) rem' in
+ begin match ile with
+ (* struct = { elt, ..., elt } *)
+ | COMPOUND_INIT ile1 :: ile2 ->
+ let (ie, rem) =
+ elab_init_fields ci.ci_members [] (project_init loc ile1) in
+ if rem <> [] then
+ warning loc "excess elements at end of struct initializer";
+ (ie, ile2)
+ (* struct = elt, ..., elt (within a bigger compound initializer) *)
+ | _ ->
+ elab_init_fields ci.ci_members [] ile
+ end
+ | TUnion(id, _) ->
+ let ci = wrap Env.find_union loc env id in
+ let fld1 =
+ match ci.ci_members with [] -> assert false | hd :: tl -> hd in
+ begin match ile with
+ (* union = { elt } *)
+ | COMPOUND_INIT ile1 :: ile2 ->
+ let (i, rem) =
+ elab_init loc env fld1.fld_typ (project_init loc ile1) in
+ if rem <> [] then
+ warning loc "excess elements at end of union initializer";
+ (Init_union(id, fld1, i), ile2)
+ (* union = elt (within a bigger compound initializer) *)
+ | _ ->
+ let (i, rem) = elab_init loc env fld1.fld_typ ile in
+ (Init_union(id, fld1, i), rem)
+ end
+ | TInt _ | TFloat _ | TPtr _ ->
+ begin match ile with
+ (* scalar = elt *)
+ | SINGLE_INIT a :: ile1 ->
+ let a' = elab_expr loc env a in
+ check_init_type loc env a' ty;
+ (Init_single a', ile1)
+ (* scalar = nothing (within a bigger compound initializer) *)
+ | (NO_INIT :: ile1) | ([] as ile1) ->
+ begin match unroll env ty with
+ | TInt _ -> (Init_single (intconst 0L IInt), ile1)
+ | TFloat _ -> (Init_single (floatconst 0.0 FDouble), ile1)
+ | TPtr _ -> (Init_single nullconst, ile1)
+ | _ -> assert false
+ end
+ | COMPOUND_INIT _ :: ile1 ->
+ fatal_error loc "compound initializer for type@ %a" Cprint.typ ty
+ end
+ | _ ->
+ fatal_error loc "impossible to initialize at type@ %a" Cprint.typ ty
+
+let elab_initial loc env ty ie =
+ match unroll env ty, ie with
+ | _, NO_INIT -> None
+ (* scalar or composite = expr *)
+ | (TInt _ | TFloat _ | TPtr _ | TStruct _ | TUnion _), SINGLE_INIT a ->
+ let a' = elab_expr loc env a in
+ check_init_type loc env a' ty;
+ Some (Init_single a')
+ (* array = expr or
+ array or struct or union = { elt, ..., elt } *)
+ | (TArray _, SINGLE_INIT _)
+ | ((TArray _ | TStruct _ | TUnion _), COMPOUND_INIT _) ->
+ let (i, rem) = elab_init loc env ty [ie] in
+ if rem <> [] then
+ warning loc "excess elements at end of compound initializer";
+ Some i
+ | _, _ ->
+ error loc "ill-formed initializer for type@ %a" Cprint.typ ty;
+ None
+
+(* Complete an array type with the size obtained from the initializer:
+ "int x[] = { 1, 2, 3 }" becomes "int x[3] = ..." *)
+
+let fixup_typ env ty init =
+ match unroll env ty, init with
+ | TArray(ty_elt, None, attr), Init_array il ->
+ TArray(ty_elt, Some(Int64.of_int(List.length il)), attr)
+ | _ -> ty
+
+(* Entry point *)
+
+let elab_initializer loc env ty ie =
+ match elab_initial loc env ty ie with
+ | None ->
+ (ty, None)
+ | Some init ->
+ (fixup_typ env ty init, Some init)
+
+\f
+(* Elaboration of top-level and local definitions *)
+
+let enter_typedef loc env (s, sto, ty) =
+ if sto <> Storage_default then
+ error loc "Non-default storage on 'typedef' definition";
+ if redef Env.lookup_typedef env s <> None then
+ error loc "Redefinition of typedef '%s'" s;
+ let (id, env') =
+ Env.enter_typedef env s ty in
+ emit_elab (elab_loc loc) (Gtypedef(id, ty));
+ env'
+
+let enter_or_refine_ident local loc env s sto ty =
+ match redef Env.lookup_ident env s with
+ | Some(id, II_ident(old_sto, old_ty)) ->
+ let new_ty =
+ if local then begin
+ error loc "redefinition of local variable '%s'" s;
+ ty
+ end else begin
+ match combine_types env old_ty ty with
+ | Some new_ty ->
+ new_ty
+ | None ->
+ warning loc "redefinition of '%s' with incompatible type" s; ty
+ end in
+ let new_sto =
+ if old_sto = Storage_extern then sto else
+ if sto = Storage_extern then old_sto else
+ if old_sto = sto then sto else begin
+ warning loc "redefinition of '%s' with incompatible storage class" s;
+ sto
+ end in
+ (id, Env.add_ident env id new_sto new_ty)
+ | Some(id, II_enum v) ->
+ error loc "illegal redefinition of enumerator '%s'" s;
+ (id, Env.add_ident env id sto ty)
+ | _ ->
+ Env.enter_ident env s sto ty
+
+let rec enter_decdefs local loc env = function
+ | [] ->
+ ([], env)
+ | (s, sto, ty, init) :: rem ->
+ (* Sanity checks on storage class *)
+ begin match sto with
+ | Storage_extern ->
+ if init <> NO_INIT then error loc
+ "'extern' declaration cannot have an initializer"
+ | Storage_register ->
+ if not local then error loc "'register' on global declaration"
+ | _ -> ()
+ end;
+ (* function declarations are always extern *)
+ let sto' =
+ match unroll env ty with TFun _ -> Storage_extern | _ -> sto in
+ (* enter ident in environment with declared type, because
+ initializer can refer to the ident *)
+ let (id, env1) = enter_or_refine_ident local loc env s sto' ty in
+ (* process the initializer *)
+ let (ty', init') = elab_initializer loc env1 ty init in
+ (* update environment with refined type *)
+ let env2 = Env.add_ident env1 id sto' ty' in
+ (* check for incomplete type *)
+ if sto' <> Storage_extern && incomplete_type env ty' then
+ warning loc "'%s' has incomplete type" s;
+ if local && sto <> Storage_extern && sto <> Storage_static then begin
+ (* Local definition *)
+ let (decls, env3) = enter_decdefs local loc env2 rem in
+ ((sto', id, ty', init') :: decls, env3)
+ end else begin
+ (* Global definition *)
+ emit_elab (elab_loc loc) (Gdecl(sto, id, ty', init'));
+ enter_decdefs local loc env2 rem
+ end
+
+let elab_fundef env (spec, name) body loc1 loc2 =
+ let (s, sto, inline, ty, env1) = elab_name env spec name in
+ if sto = Storage_register then
+ error loc1 "a function definition cannot have 'register' storage class";
+ (* Fix up the type. We can have params = None but only for an
+ old-style parameterless function "int f() {...}" *)
+ let ty =
+ match ty with
+ | TFun(ty_ret, None, vararg, attr) -> TFun(ty_ret, Some [], vararg, attr)
+ | _ -> ty in
+ (* Extract info from type *)
+ let (ty_ret, params, vararg) =
+ match ty with
+ | TFun(ty_ret, Some params, vararg, attr) -> (ty_ret, params, vararg)
+ | _ -> fatal_error loc1 "wrong type for function definition" in
+ (* Enter function in the environment, for recursive references *)
+ let (fun_id, env1) = enter_or_refine_ident false loc1 env s sto ty in
+ (* Enter parameters in the environment *)
+ let env2 =
+ List.fold_left (fun e (id, ty) -> Env.add_ident e id Storage_default ty)
+ (Env.new_scope env1) params in
+ (* Elaborate function body *)
+ let body' = !elab_block_f loc2 ty_ret env2 body in
+ (* Build and emit function definition *)
+ let fn =
+ { fd_storage = sto;
+ fd_inline = inline;
+ fd_name = fun_id;
+ fd_ret = ty_ret;
+ fd_params = params;
+ fd_vararg = vararg;
+ fd_locals = [];
+ fd_body = body' } in
+ emit_elab (elab_loc loc1) (Gfundef fn);
+ env1
+
+let rec elab_definition (local: bool) (env: Env.t) (def: Cabs.definition)
+ : decl list * Env.t =
+ match def with
+ (* "int f(int x) { ... }" *)
+ | FUNDEF(spec_name, body, loc1, loc2) ->
+ if local then error loc1 "local definition of a function";
+ let env1 = elab_fundef env spec_name body loc1 loc2 in
+ ([], env1)
+
+ (* "int x = 12, y[10], *z" *)
+ | DECDEF(init_name_group, loc) ->
+ let (dl, env1) = elab_init_name_group env init_name_group in
+ enter_decdefs local loc env1 dl
+
+ (* "typedef int * x, y[10]; " *)
+ | TYPEDEF(namegroup, loc) ->
+ let (dl, env1) = elab_name_group env namegroup in
+ let env2 = List.fold_left (enter_typedef loc) env1 dl in
+ ([], env2)
+
+ (* "struct s { ...};" or "union u;" *)
+ | ONLYTYPEDEF(spec, loc) ->
+ let (sto, inl, ty, env') = elab_specifier ~only:true loc env spec in
+ if sto <> Storage_default || inl then
+ error loc "Non-default storage or 'inline' on 'struct' or 'union' declaration";
+ ([], env')
+
+ (* global asm statement *)
+ | GLOBASM(_, loc) ->
+ error loc "Top-level 'asm' statement is not supported";
+ ([], env)
+
+ (* pragma *)
+ | PRAGMA(s, loc) ->
+ emit_elab (elab_loc loc) (Gpragma s);
+ ([], env)
+
+ (* extern "C" { ... } *)
+ | LINKAGE(_, loc, defs) ->
+ elab_definitions local env defs
+
+and elab_definitions local env = function
+ | [] -> ([], env)
+ | d1 :: dl ->
+ let (decl1, env1) = elab_definition local env d1 in
+ let (decl2, env2) = elab_definitions local env1 dl in
+ (decl1 @ decl2, env2)
+
+\f
+(* Elaboration of statements *)
+
+(* Extract list of Cabs statements from a Cabs block *)
+
+let block_body loc b =
+ if b.blabels <> [] then
+ error loc "GCC's '__label__' declaration is not supported";
+ if b.battrs <> [] then
+ warning loc "ignoring attributes on this block";
+ b.bstmts
+
+(* Elaboration of a block. Return the corresponding C statement. *)
+
+let elab_block loc return_typ env b =
+
+let rec elab_stmt env s =
+
+ match s with
+
+(* 8.2 Expression statements *)
+
+ | COMPUTATION(a, loc) ->
+ { sdesc = Sdo (elab_expr loc env a); sloc = elab_loc loc }
+
+(* 8.3 Labeled statements *)
+
+ | LABEL(lbl, s1, loc) ->
+ { sdesc = Slabeled(Slabel lbl, elab_stmt env s1); sloc = elab_loc loc }
+
+ | CASE(a, s1, loc) ->
+ let a' = elab_expr loc env a in
+ begin match Ceval.integer_expr env a' with
+ | None ->
+ error loc "argument of 'case' must be an integer compile-time constant"
+ | Some n -> ()
+ end;
+ { sdesc = Slabeled(Scase a', elab_stmt env s1); sloc = elab_loc loc }
+
+ | CASERANGE(_, _, _, loc) ->
+ error loc "GCC's 'case' with range of values is not supported";
+ sskip
+
+ | DEFAULT(s1, loc) ->
+ { sdesc = Slabeled(Sdefault, elab_stmt env s1); sloc = elab_loc loc }
+
+(* 8.4 Compound statements *)
+
+ | BLOCK(b, loc) ->
+ elab_blk loc env b
+
+(* 8.5 Conditional statements *)
+
+ | IF(a, s1, s2, loc) ->
+ let a' = elab_expr loc env a in
+ if not (is_scalar_type env a'.etyp) then
+ error loc "the condition of 'if' does not have scalar type";
+ let s1' = elab_stmt env s1 in
+ let s2' = elab_stmt env s2 in
+ { sdesc = Sif(a', s1', s2'); sloc = elab_loc loc }
+
+(* 8.6 Iterative statements *)
+
+ | WHILE(a, s1, loc) ->
+ let a' = elab_expr loc env a in
+ if not (is_scalar_type env a'.etyp) then
+ error loc "the condition of 'while' does not have scalar type";
+ let s1' = elab_stmt env s1 in
+ { sdesc = Swhile(a', s1'); sloc = elab_loc loc }
+
+ | DOWHILE(a, s1, loc) ->
+ let s1' = elab_stmt env s1 in
+ let a' = elab_expr loc env a in
+ if not (is_scalar_type env a'.etyp) then
+ error loc "the condition of 'while' does not have scalar type";
+ { sdesc = Sdowhile(s1', a'); sloc = elab_loc loc }
+
+ | FOR(fc, a2, a3, s1, loc) ->
+ let a1' =
+ match fc with
+ | FC_EXP a1 ->
+ elab_for_expr loc env a1
+ | FC_DECL def ->
+ error loc "C99 declaration within `for' not supported";
+ sskip in
+ let a2' =
+ if a2 = NOTHING
+ then intconst 1L IInt
+ else elab_expr loc env a2 in
+ if not (is_scalar_type env a2'.etyp) then
+ error loc "the condition of 'for' does not have scalar type";
+ let a3' = elab_for_expr loc env a3 in
+ let s1' = elab_stmt env s1 in
+ { sdesc = Sfor(a1', a2', a3', s1'); sloc = elab_loc loc }
+
+(* 8.7 Switch statement *)
+ | SWITCH(a, s1, loc) ->
+ let a' = elab_expr loc env a in
+ if not (is_arith_type env a'.etyp) then
+ error loc "the argument of 'switch' does not have arithmetic type";
+ let s1' = elab_stmt env s1 in
+ { sdesc = Sswitch(a', s1'); sloc = elab_loc loc }
+
+(* 8,8 Break and continue statements *)
+ | BREAK loc ->
+ { sdesc = Sbreak; sloc = elab_loc loc }
+ | CONTINUE loc ->
+ { sdesc = Scontinue; sloc = elab_loc loc }
+
+(* 8.9 Return statements *)
+ | RETURN(a, loc) ->
+ let a' = elab_opt_expr loc env a in
+ begin match (unroll env return_typ, a') with
+ | TVoid _, None -> ()
+ | TVoid _, Some _ ->
+ error loc
+ "'return' with a value in a function of return type 'void'"
+ | _, None ->
+ warning loc
+ "'return' without a value in a function of return type@ %a"
+ Cprint.typ return_typ
+ | _, Some b ->
+ if not (valid_assignment env b return_typ) then begin
+ if valid_cast env b.etyp return_typ then
+ warning loc
+ "return value has type@ %a@ \
+ instead of the expected type@ %a"
+ Cprint.typ b.etyp Cprint.typ return_typ
+ else
+ error loc
+ "return value has type@ %a@ \
+ instead of the expected type@ %a"
+ Cprint.typ b.etyp Cprint.typ return_typ
+ end
+ end;
+ { sdesc = Sreturn a'; sloc = elab_loc loc }
+
+(* 8.10 Goto statements *)
+ | GOTO(lbl, loc) ->
+ { sdesc = Sgoto lbl; sloc = elab_loc loc }
+
+(* 8.11 Null statements *)
+ | NOP loc ->
+ { sdesc = Sskip; sloc = elab_loc loc }
+
+(* Unsupported *)
+ | DEFINITION def ->
+ error (get_definitionloc def) "ill-placed definition";
+ sskip
+ | COMPGOTO(a, loc) ->
+ error loc "GCC's computed 'goto' is not supported";
+ sskip
+ | ASM(_, _, _, loc) ->
+ error loc "'asm' statement is not supported";
+ sskip
+ | TRY_EXCEPT(_, _, _, loc) ->
+ error loc "'try ... except' statement is not supported";
+ sskip
+ | TRY_FINALLY(_, _, loc) ->
+ error loc "'try ... finally' statement is not supported";
+ sskip
+
+and elab_blk loc env b =
+ let b' = elab_blk_body (Env.new_scope env) (block_body loc b) in
+ { sdesc = Sblock b'; sloc = elab_loc loc }
+
+and elab_blk_body env sl =
+ match sl with
+ | [] ->
+ []
+ | DEFINITION def :: sl1 ->
+ let (dcl, env') = elab_definition true env def in
+ let loc = elab_loc (get_definitionloc def) in
+ List.map (fun d -> {sdesc = Sdecl d; sloc = loc}) dcl
+ @ elab_blk_body env' sl1
+ | s :: sl1 ->
+ let s' = elab_stmt env s in
+ s' :: elab_blk_body env sl1
+
+in elab_blk loc env b
+
+(* Filling in forward declaration *)
+let _ = elab_block_f := elab_block
+
+\f
+(** * Entry point *)
+
+let elab_preprocessed_file lb =
+ let lb = Lexer.init lb in
+ reset();
+ ignore (elab_definitions false (Builtins.environment())
+ (Parser.file Lexer.initial lb));
+ Lexer.finish();
+ elaborated_program()
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+val elab_preprocessed_file : Lexing.lexbuf -> C.program
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Typing environment *)
+
+open C
+
+type error =
+ | Unbound_identifier of string
+ | Unbound_tag of string * string
+ | Tag_mismatch of string * string * string
+ | Unbound_typedef of string
+ | No_member of string * string * string
+
+exception Error of error
+
+(* Maps over ident, accessible both by name or by name + stamp *)
+
+module StringMap = Map.Make(String)
+
+module IdentMap = struct
+ type 'a t = (ident * 'a) list StringMap.t
+ let empty : 'a t = StringMap.empty
+
+ (* Search by name and return topmost binding *)
+ let lookup s m =
+ match StringMap.find s m with
+ | id_data :: _ -> id_data
+ | [] -> assert false
+
+ (* Search by identifier and return associated binding *)
+ let find id m =
+ let rec lookup_in = function
+ | [] -> raise Not_found
+ | (id', data) :: rem ->
+ if id'.stamp = id.stamp then data else lookup_in rem in
+ lookup_in (StringMap.find id.name m)
+
+ (* Insert by identifier *)
+ let add id data m =
+ let l = try StringMap.find id.name m with Not_found -> [] in
+ StringMap.add id.name ((id, data) :: l) m
+end
+
+let gensym = ref 0
+
+let fresh_ident s = incr gensym; { name = s; stamp = !gensym }
+
+(* Infos associated with structs or unions *)
+
+type composite_info = {
+ ci_kind: struct_or_union;
+ ci_members: field list; (* members, in order *)
+ ci_alignof: int option; (* alignment; None if incomplete *)
+ ci_sizeof: int option; (* size; None if incomplete *)
+}
+
+(* Infos associated with an ordinary identifier *)
+
+type ident_info =
+ | II_ident of storage * typ
+ | II_enum of int64 (* value of the enum *)
+
+(* Infos associated with a typedef *)
+
+type typedef_info = typ
+
+(* Environments *)
+
+type t = {
+ env_scope: int;
+ env_ident: ident_info IdentMap.t;
+ env_tag: composite_info IdentMap.t;
+ env_typedef: typedef_info IdentMap.t
+}
+
+let empty = {
+ env_scope = 0;
+ env_ident = IdentMap.empty;
+ env_tag = IdentMap.empty;
+ env_typedef = IdentMap.empty
+}
+
+(* Enter a new scope. *)
+
+let new_scope env =
+ { env with env_scope = !gensym + 1 }
+
+let in_current_scope env id = id.stamp >= env.env_scope
+
+(* Looking up things by source name *)
+
+let lookup_ident env s =
+ try
+ IdentMap.lookup s env.env_ident
+ with Not_found ->
+ raise(Error(Unbound_identifier s))
+
+let lookup_tag env s =
+ try
+ IdentMap.lookup s env.env_tag
+ with Not_found ->
+ raise(Error(Unbound_tag(s, "tag")))
+
+let lookup_struct env s =
+ try
+ let (id, ci as res) = IdentMap.lookup s env.env_tag in
+ if ci.ci_kind <> Struct then
+ raise(Error(Tag_mismatch(s, "struct", "union")));
+ res
+ with Not_found ->
+ raise(Error(Unbound_tag(s, "struct")))
+
+let lookup_union env s =
+ try
+ let (id, ci as res) = IdentMap.lookup s env.env_tag in
+ if ci.ci_kind <> Union then
+ raise(Error(Tag_mismatch(s, "union", "struct")));
+ res
+ with Not_found ->
+ raise(Error(Unbound_tag(s, "union")))
+
+let lookup_composite env s =
+ try Some (IdentMap.lookup s env.env_tag)
+ with Not_found -> None
+
+let lookup_typedef env s =
+ try
+ IdentMap.lookup s env.env_typedef
+ with Not_found ->
+ raise(Error(Unbound_typedef s))
+
+(* Checking if a source name is bound *)
+
+let ident_is_bound env s = StringMap.mem s env.env_ident
+
+(* Finding things by translated identifier *)
+
+let find_ident env id =
+ try IdentMap.find id env.env_ident
+ with Not_found ->
+ raise(Error(Unbound_identifier(id.name)))
+
+let find_tag env id =
+ try IdentMap.find id env.env_tag
+ with Not_found ->
+ raise(Error(Unbound_tag(id.name, "tag")))
+
+let find_struct env id =
+ try
+ let ci = IdentMap.find id env.env_tag in
+ if ci.ci_kind <> Struct then
+ raise(Error(Tag_mismatch(id.name, "struct", "union")));
+ ci
+ with Not_found ->
+ raise(Error(Unbound_tag(id.name, "struct")))
+
+let find_union env id =
+ try
+ let ci = IdentMap.find id env.env_tag in
+ if ci.ci_kind <> Union then
+ raise(Error(Tag_mismatch(id.name, "union", "struct")));
+ ci
+ with Not_found ->
+ raise(Error(Unbound_tag(id.name, "union")))
+
+let find_member ci m =
+ List.find (fun f -> f.fld_name = m) ci
+
+let find_struct_member env (id, m) =
+ try
+ let ci = find_struct env id in
+ find_member ci.ci_members m
+ with Not_found ->
+ raise(Error(No_member(id.name, "struct", m)))
+
+let find_union_member env (id, m) =
+ try
+ let ci = find_union env id in
+ find_member ci.ci_members m
+ with Not_found ->
+ raise(Error(No_member(id.name, "union", m)))
+
+let find_typedef env id =
+ try
+ IdentMap.find id env.env_typedef
+ with Not_found ->
+ raise(Error(Unbound_typedef(id.name)))
+
+(* Inserting things by source name, with generation of a translated name *)
+
+let enter_ident env s sto ty =
+ let id = fresh_ident s in
+ (id,
+ { env with env_ident = IdentMap.add id (II_ident(sto, ty)) env.env_ident })
+
+let enter_composite env s ci =
+ let id = fresh_ident s in
+ (id, { env with env_tag = IdentMap.add id ci env.env_tag })
+
+let enter_enum_item env s v =
+ let id = fresh_ident s in
+ (id, { env with env_ident = IdentMap.add id (II_enum v) env.env_ident })
+
+let enter_typedef env s info =
+ let id = fresh_ident s in
+ (id, { env with env_typedef = IdentMap.add id info env.env_typedef })
+
+(* Inserting things by translated name *)
+
+let add_ident env id sto ty =
+ { env with env_ident = IdentMap.add id (II_ident(sto, ty)) env.env_ident }
+
+let add_composite env id ci =
+ { env with env_tag = IdentMap.add id ci env.env_tag }
+
+let add_typedef env id info =
+ { env with env_typedef = IdentMap.add id info env.env_typedef }
+
+(* Error reporting *)
+
+open Printf
+
+let error_message = function
+ | Unbound_identifier name ->
+ sprintf "Unbound identifier '%s'" name
+ | Unbound_tag(name, kind) ->
+ sprintf "Unbound %s '%s'" kind name
+ | Tag_mismatch(name, expected, actual) ->
+ sprintf "'%s' was declared as a %s but is used as a %s"
+ name actual expected
+ | Unbound_typedef name ->
+ sprintf "Unbound typedef '%s'" name
+ | No_member(compname, compkind, memname) ->
+ sprintf "%s '%s' has no member named '%s'"
+ compkind compname memname
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+type error =
+ Unbound_identifier of string
+ | Unbound_tag of string * string
+ | Tag_mismatch of string * string * string
+ | Unbound_typedef of string
+ | No_member of string * string * string
+val error_message : error -> string
+exception Error of error
+
+val fresh_ident : string -> C.ident
+
+type composite_info = {
+ ci_kind: C.struct_or_union;
+ ci_members: C.field list; (* members, in order *)
+ ci_alignof: int option; (* alignment; None if incomplete *)
+ ci_sizeof: int option; (* size; None if incomplete *)
+}
+
+type ident_info = II_ident of C.storage * C.typ | II_enum of int64
+
+type typedef_info = C.typ
+
+type t
+
+val empty : t
+
+val new_scope : t -> t
+val in_current_scope : t -> C.ident -> bool
+
+val lookup_ident : t -> string -> C.ident * ident_info
+val lookup_tag : t -> string -> C.ident * composite_info
+val lookup_struct : t -> string -> C.ident * composite_info
+val lookup_union : t -> string -> C.ident * composite_info
+val lookup_composite : t -> string -> (C.ident * composite_info) option
+val lookup_typedef : t -> string -> C.ident * typedef_info
+
+val ident_is_bound : t -> string -> bool
+
+val find_ident : t -> C.ident -> ident_info
+val find_tag : t -> C.ident -> composite_info
+val find_struct : t -> C.ident -> composite_info
+val find_union : t -> C.ident -> composite_info
+val find_member : C.field list -> string -> C.field
+val find_struct_member : t -> C.ident * string -> C.field
+val find_union_member : t -> C.ident * string -> C.field
+val find_typedef : t -> C.ident -> typedef_info
+
+val enter_ident : t -> string -> C.storage -> C.typ -> C.ident * t
+val enter_composite : t -> string -> composite_info -> C.ident * t
+val enter_enum_item : t -> string -> int64 -> C.ident * t
+val enter_typedef : t -> string -> typedef_info -> C.ident * t
+
+val add_ident : t -> C.ident -> C.storage -> C.typ -> t
+val add_composite : t -> C.ident -> composite_info -> t
+val add_typedef : t -> C.ident -> typedef_info -> t
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Management of errors and warnings *)
+
+open Format
+
+let warn_error = ref false
+
+let num_errors = ref 0
+let num_warnings = ref 0
+
+let reset () = num_errors := 0; num_warnings := 0
+
+exception Abort
+
+let fatal_error fmt =
+ incr num_errors;
+ kfprintf
+ (fun _ -> raise Abort)
+ err_formatter
+ ("@[<hov 2>" ^^ fmt ^^ ".@]@.@[<hov 0>Fatal error.@]@.")
+
+let error fmt =
+ incr num_errors;
+ eprintf ("@[<hov 2>" ^^ fmt ^^ ".@]@.")
+
+let warning fmt =
+ incr num_warnings;
+ eprintf ("@[<hov 2>" ^^ fmt ^^ ".@]@.")
+
+let check_errors () =
+ if !num_errors > 0 then
+ eprintf "@[<hov 0>%d error%s detected.@]@."
+ !num_errors
+ (if !num_errors = 1 then "" else "s");
+ if !warn_error && !num_warnings > 0 then
+ eprintf "@[<hov 0>%d error-enabled warning%s detected.@]@."
+ !num_warnings
+ (if !num_warnings = 1 then "" else "s");
+ !num_errors > 0 || (!warn_error && !num_warnings > 0)
+
+
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+val warn_error : bool ref
+val reset : unit -> unit
+exception Abort
+val fatal_error : ('a, Format.formatter, unit, unit, unit, 'b) format6 -> 'a
+val error : ('a, Format.formatter, unit, unit, unit, unit) format6 -> 'a
+val warning : ('a, Format.formatter, unit, unit, unit, unit) format6 -> 'a
+val check_errors : unit -> bool
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* GCC built-ins *)
+
+open C
+open Cutil
+
+(* Code adapted from CIL *)
+
+let voidType = TVoid []
+let charType = TInt(IChar, [])
+let intType = TInt(IInt, [])
+let uintType = TInt(IUInt, [])
+let longType = TInt(ILong, [])
+let ulongType = TInt(IULong, [])
+let ulongLongType = TInt(IULongLong, [])
+let floatType = TFloat(FFloat, [])
+let doubleType = TFloat(FDouble, [])
+let longDoubleType = TFloat (FLongDouble, [])
+let voidPtrType = TPtr(TVoid [], [])
+let voidConstPtrType = TPtr(TVoid [AConst], [])
+let charPtrType = TPtr(TInt(IChar, []), [])
+let charConstPtrType = TPtr(TInt(IChar, [AConst]), [])
+let intPtrType = TPtr(TInt(IInt, []), [])
+let sizeType = TInt(size_t_ikind, [])
+
+let builtins = {
+ Builtins.typedefs = [
+ "__builtin_va_list", voidPtrType
+];
+ Builtins.functions = [
+ "__builtin___fprintf_chk", (intType, [ voidPtrType; intType; charConstPtrType ], true) (* first argument is really FILE*, not void*, but we don't want to build in the definition for FILE *);
+ "__builtin___memcpy_chk", (voidPtrType, [ voidPtrType; voidConstPtrType; sizeType; sizeType ], false);
+ "__builtin___memmove_chk", (voidPtrType, [ voidPtrType; voidConstPtrType; sizeType; sizeType ], false);
+ "__builtin___mempcpy_chk", (voidPtrType, [ voidPtrType; voidConstPtrType; sizeType; sizeType ], false);
+ "__builtin___memset_chk", (voidPtrType, [ voidPtrType; intType; sizeType; sizeType ], false);
+ "__builtin___printf_chk", (intType, [ intType; charConstPtrType ], true);
+ "__builtin___snprintf_chk", (intType, [ charPtrType; sizeType; intType; sizeType; charConstPtrType ], true);
+ "__builtin___sprintf_chk", (intType, [ charPtrType; intType; sizeType; charConstPtrType ], true);
+ "__builtin___stpcpy_chk", (charPtrType, [ charPtrType; charConstPtrType; sizeType ], false);
+ "__builtin___strcat_chk", (charPtrType, [ charPtrType; charConstPtrType; sizeType ], false);
+ "__builtin___strcpy_chk", (charPtrType, [ charPtrType; charConstPtrType; sizeType ], false);
+ "__builtin___strncat_chk", (charPtrType, [ charPtrType; charConstPtrType; sizeType; sizeType ], false);
+ "__builtin___strncpy_chk", (charPtrType, [ charPtrType; charConstPtrType; sizeType; sizeType ], false);
+ "__builtin___vfprintf_chk", (intType, [ voidPtrType; intType; charConstPtrType; voidPtrType ], false) (* first argument is really FILE*, not void*, but we don't want to build in the definition for FILE *);
+ "__builtin___vprintf_chk", (intType, [ intType; charConstPtrType; voidPtrType ], false);
+ "__builtin___vsnprintf_chk", (intType, [ charPtrType; sizeType; intType; sizeType; charConstPtrType; voidPtrType ], false);
+ "__builtin___vsprintf_chk", (intType, [ charPtrType; intType; sizeType; charConstPtrType; voidPtrType ], false);
+
+ "__builtin_acos", (doubleType, [ doubleType ], false);
+ "__builtin_acosf", (floatType, [ floatType ], false);
+ "__builtin_acosl", (longDoubleType, [ longDoubleType ], false);
+
+ "__builtin_alloca", (voidPtrType, [ uintType ], false);
+
+ "__builtin_asin", (doubleType, [ doubleType ], false);
+ "__builtin_asinf", (floatType, [ floatType ], false);
+ "__builtin_asinl", (longDoubleType, [ longDoubleType ], false);
+
+ "__builtin_atan", (doubleType, [ doubleType ], false);
+ "__builtin_atanf", (floatType, [ floatType ], false);
+ "__builtin_atanl", (longDoubleType, [ longDoubleType ], false);
+
+ "__builtin_atan2", (doubleType, [ doubleType; doubleType ], false);
+ "__builtin_atan2f", (floatType, [ floatType; floatType ], false);
+ "__builtin_atan2l", (longDoubleType, [ longDoubleType;
+ longDoubleType ], false);
+
+ "__builtin_ceil", (doubleType, [ doubleType ], false);
+ "__builtin_ceilf", (floatType, [ floatType ], false);
+ "__builtin_ceill", (longDoubleType, [ longDoubleType ], false);
+
+ "__builtin_cos", (doubleType, [ doubleType ], false);
+ "__builtin_cosf", (floatType, [ floatType ], false);
+ "__builtin_cosl", (longDoubleType, [ longDoubleType ], false);
+
+ "__builtin_cosh", (doubleType, [ doubleType ], false);
+ "__builtin_coshf", (floatType, [ floatType ], false);
+ "__builtin_coshl", (longDoubleType, [ longDoubleType ], false);
+
+ "__builtin_clz", (intType, [ uintType ], false);
+ "__builtin_clzl", (intType, [ ulongType ], false);
+ "__builtin_clzll", (intType, [ ulongLongType ], false);
+ "__builtin_constant_p", (intType, [ intType ], false);
+ "__builtin_ctz", (intType, [ uintType ], false);
+ "__builtin_ctzl", (intType, [ ulongType ], false);
+ "__builtin_ctzll", (intType, [ ulongLongType ], false);
+
+ "__builtin_exp", (doubleType, [ doubleType ], false);
+ "__builtin_expf", (floatType, [ floatType ], false);
+ "__builtin_expl", (longDoubleType, [ longDoubleType ], false);
+
+ "__builtin_expect", (longType, [ longType; longType ], false);
+
+ "__builtin_fabs", (doubleType, [ doubleType ], false);
+ "__builtin_fabsf", (floatType, [ floatType ], false);
+ "__builtin_fabsl", (longDoubleType, [ longDoubleType ], false);
+
+ "__builtin_ffs", (intType, [ uintType ], false);
+ "__builtin_ffsl", (intType, [ ulongType ], false);
+ "__builtin_ffsll", (intType, [ ulongLongType ], false);
+ "__builtin_frame_address", (voidPtrType, [ uintType ], false);
+
+ "__builtin_floor", (doubleType, [ doubleType ], false);
+ "__builtin_floorf", (floatType, [ floatType ], false);
+ "__builtin_floorl", (longDoubleType, [ longDoubleType ], false);
+
+ "__builtin_huge_val", (doubleType, [], false);
+ "__builtin_huge_valf", (floatType, [], false);
+ "__builtin_huge_vall", (longDoubleType, [], false);
+ "__builtin_inf", (doubleType, [], false);
+ "__builtin_inff", (floatType, [], false);
+ "__builtin_infl", (longDoubleType, [], false);
+ "__builtin_memcpy", (voidPtrType, [ voidPtrType; voidConstPtrType; uintType ], false);
+ "__builtin_mempcpy", (voidPtrType, [ voidPtrType; voidConstPtrType; sizeType ], false);
+
+ "__builtin_fmod", (doubleType, [ doubleType ], false);
+ "__builtin_fmodf", (floatType, [ floatType ], false);
+ "__builtin_fmodl", (longDoubleType, [ longDoubleType ], false);
+
+ "__builtin_frexp", (doubleType, [ doubleType; intPtrType ], false);
+ "__builtin_frexpf", (floatType, [ floatType; intPtrType ], false);
+ "__builtin_frexpl", (longDoubleType, [ longDoubleType;
+ intPtrType ], false);
+
+ "__builtin_ldexp", (doubleType, [ doubleType; intType ], false);
+ "__builtin_ldexpf", (floatType, [ floatType; intType ], false);
+ "__builtin_ldexpl", (longDoubleType, [ longDoubleType;
+ intType ], false);
+
+ "__builtin_log", (doubleType, [ doubleType ], false);
+ "__builtin_logf", (floatType, [ floatType ], false);
+ "__builtin_logl", (longDoubleType, [ longDoubleType ], false);
+
+ "__builtin_log10", (doubleType, [ doubleType ], false);
+ "__builtin_log10f", (floatType, [ floatType ], false);
+ "__builtin_log10l", (longDoubleType, [ longDoubleType ], false);
+
+ "__builtin_modff", (floatType, [ floatType;
+ TPtr(floatType,[]) ], false);
+ "__builtin_modfl", (longDoubleType, [ longDoubleType;
+ TPtr(longDoubleType, []) ],
+ false);
+
+ "__builtin_nan", (doubleType, [ charConstPtrType ], false);
+ "__builtin_nanf", (floatType, [ charConstPtrType ], false);
+ "__builtin_nanl", (longDoubleType, [ charConstPtrType ], false);
+ "__builtin_nans", (doubleType, [ charConstPtrType ], false);
+ "__builtin_nansf", (floatType, [ charConstPtrType ], false);
+ "__builtin_nansl", (longDoubleType, [ charConstPtrType ], false);
+ "__builtin_next_arg", (voidPtrType, [], false);
+ "__builtin_object_size", (sizeType, [ voidPtrType; intType ], false);
+
+ "__builtin_parity", (intType, [ uintType ], false);
+ "__builtin_parityl", (intType, [ ulongType ], false);
+ "__builtin_parityll", (intType, [ ulongLongType ], false);
+
+ "__builtin_popcount", (intType, [ uintType ], false);
+ "__builtin_popcountl", (intType, [ ulongType ], false);
+ "__builtin_popcountll", (intType, [ ulongLongType ], false);
+
+ "__builtin_powi", (doubleType, [ doubleType; intType ], false);
+ "__builtin_powif", (floatType, [ floatType; intType ], false);
+ "__builtin_powil", (longDoubleType, [ longDoubleType; intType ], false);
+ "__builtin_prefetch", (voidType, [ voidConstPtrType ], true);
+ "__builtin_return", (voidType, [ voidConstPtrType ], false);
+ "__builtin_return_address", (voidPtrType, [ uintType ], false);
+
+ "__builtin_sin", (doubleType, [ doubleType ], false);
+ "__builtin_sinf", (floatType, [ floatType ], false);
+ "__builtin_sinl", (longDoubleType, [ longDoubleType ], false);
+
+ "__builtin_sinh", (doubleType, [ doubleType ], false);
+ "__builtin_sinhf", (floatType, [ floatType ], false);
+ "__builtin_sinhl", (longDoubleType, [ longDoubleType ], false);
+
+ "__builtin_sqrt", (doubleType, [ doubleType ], false);
+ "__builtin_sqrtf", (floatType, [ floatType ], false);
+ "__builtin_sqrtl", (longDoubleType, [ longDoubleType ], false);
+
+ "__builtin_stpcpy", (charPtrType, [ charPtrType; charConstPtrType ], false);
+ "__builtin_strchr", (charPtrType, [ charPtrType; charType ], false);
+ "__builtin_strcmp", (intType, [ charConstPtrType; charConstPtrType ], false);
+ "__builtin_strcpy", (charPtrType, [ charPtrType; charConstPtrType ], false);
+ "__builtin_strcspn", (uintType, [ charConstPtrType; charConstPtrType ], false);
+ "__builtin_strncat", (charPtrType, [ charPtrType; charConstPtrType; sizeType ], false);
+ "__builtin_strncmp", (intType, [ charConstPtrType; charConstPtrType; sizeType ], false);
+ "__builtin_strncpy", (charPtrType, [ charPtrType; charConstPtrType; sizeType ], false);
+ "__builtin_strspn", (intType, [ charConstPtrType; charConstPtrType ], false);
+ "__builtin_strpbrk", (charPtrType, [ charConstPtrType; charConstPtrType ], false);
+ (* When we parse builtin_types_compatible_p, we change its interface *)
+ "__builtin_types_compatible_p",
+ (intType, [ uintType; (* Sizeof the type *)
+ uintType (* Sizeof the type *) ],
+ false);
+ "__builtin_tan", (doubleType, [ doubleType ], false);
+ "__builtin_tanf", (floatType, [ floatType ], false);
+ "__builtin_tanl", (longDoubleType, [ longDoubleType ], false);
+
+ "__builtin_tanh", (doubleType, [ doubleType ], false);
+ "__builtin_tanhf", (floatType, [ floatType ], false);
+ "__builtin_tanhl", (longDoubleType, [ longDoubleType ], false);
+
+ "__builtin_va_end", (voidType, [ voidPtrType ], false);
+ "__builtin_varargs_start",
+ (voidType, [ voidPtrType ], false);
+ (* When we elaborate builtin_stdarg_start/builtin_va_start,
+ second argument is passed by address *)
+ "__builtin_va_start", (voidType, [ voidPtrType; voidPtrType ], false);
+ "__builtin_stdarg_start", (voidType, [ voidPtrType ], false);
+ (* When we parse builtin_va_arg, type argument becomes sizeof type *)
+ "__builtin_va_arg", (voidType, [ voidPtrType; sizeType ], false);
+ "__builtin_va_copy", (voidType, [ voidPtrType;
+ voidPtrType ],
+ false)
+]
+}
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* GCC built-ins *)
+
+val builtins: Builtins.t
--- /dev/null
+(*
+ *
+ * Copyright (c) 2001-2002,
+ * George C. Necula <necula@cs.berkeley.edu>
+ * Scott McPeak <smcpeak@cs.berkeley.edu>
+ * Wes Weimer <weimer@cs.berkeley.edu>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. The names of the contributors may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *)
+
+
+(* This interface is generated manually. The corresponding .ml file is
+ * generated automatically and is placed in ../obj/clexer.ml. The reason we
+ * want this interface is to avoid confusing make with freshly generated
+ * interface files *)
+
+
+val init: Lexing.lexbuf -> Lexing.lexbuf
+val finish: unit -> unit
+
+(* This is the main parser function *)
+val initial: Lexing.lexbuf -> Parser.token
+
+
+val push_context: unit -> unit (* Start a context *)
+val add_type: string -> unit (* Add a new string as a type name *)
+val add_identifier: string -> unit (* Add a new string as a variable name *)
+val pop_context: unit -> unit (* Remove all names added in this context *)
+
--- /dev/null
+(*
+ *
+ * Copyright (c) 2001-2003,
+ * George C. Necula <necula@cs.berkeley.edu>
+ * Scott McPeak <smcpeak@cs.berkeley.edu>
+ * Wes Weimer <weimer@cs.berkeley.edu>
+ * Ben Liblit <liblit@cs.berkeley.edu>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. The names of the contributors may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *)
+(* FrontC -- lexical analyzer
+**
+** 1.0 3.22.99 Hugues Cassé First version.
+** 2.0 George Necula 12/12/00: Many extensions
+*)
+{
+open Lexing
+open Parse_aux
+open Parser
+
+exception Eof
+
+module H = Hashtbl
+
+let newline lb =
+ let cp = lb.lex_curr_p in
+ lb.lex_curr_p <- { cp with pos_lnum = 1 + cp.pos_lnum }
+
+let setCurrentLine lb lineno =
+ let cp = lb.lex_curr_p in
+ lb.lex_curr_p <- { cp with pos_lnum = lineno }
+
+let setCurrentFile lb file =
+ let cp = lb.lex_curr_p in
+ lb.lex_curr_p <- { cp with pos_fname = file }
+
+let matchingParsOpen = ref 0
+
+let currentLoc = Cabshelper.currentLoc_lexbuf
+
+let int64_to_char value =
+ assert (value <= 255L && value >= 0L);
+ Char.chr (Int64.to_int value)
+
+(* takes a not-nul-terminated list, and converts it to a string. *)
+let rec intlist_to_string (str: int64 list):string =
+ match str with
+ [] -> "" (* add nul-termination *)
+ | value::rest ->
+ let this_char = int64_to_char value in
+ (String.make 1 this_char) ^ (intlist_to_string rest)
+
+(*
+** Keyword hashtable
+*)
+let lexicon = H.create 211
+let init_lexicon _ =
+ H.clear lexicon;
+ List.iter
+ (fun (key, builder) -> H.add lexicon key builder)
+ [ ("_Bool", fun loc -> UNDERSCORE_BOOL loc);
+ ("auto", fun loc -> AUTO loc);
+ ("const", fun loc -> CONST loc);
+ ("__const", fun loc -> CONST loc);
+ ("__const__", fun loc -> CONST loc);
+ ("static", fun loc -> STATIC loc);
+ ("extern", fun loc -> EXTERN loc);
+ ("long", fun loc -> LONG loc);
+ ("short", fun loc -> SHORT loc);
+ ("register", fun loc -> REGISTER loc);
+ ("signed", fun loc -> SIGNED loc);
+ ("__signed", fun loc -> SIGNED loc);
+ ("unsigned", fun loc -> UNSIGNED loc);
+ ("volatile", fun loc -> VOLATILE loc);
+ ("__volatile", fun loc -> VOLATILE loc);
+ (* WW: see /usr/include/sys/cdefs.h for why __signed and __volatile
+ * are accepted GCC-isms *)
+ ("char", fun loc -> CHAR loc);
+ ("int", fun loc -> INT loc);
+ ("float", fun loc -> FLOAT loc);
+ ("double", fun loc -> DOUBLE loc);
+ ("void", fun loc -> VOID loc);
+ ("enum", fun loc -> ENUM loc);
+ ("struct", fun loc -> STRUCT loc);
+ ("typedef", fun loc -> TYPEDEF loc);
+ ("union", fun loc -> UNION loc);
+ ("break", fun loc -> BREAK loc);
+ ("continue", fun loc -> CONTINUE loc);
+ ("goto", fun loc -> GOTO loc);
+ ("return", fun loc -> RETURN loc);
+ ("switch", fun loc -> SWITCH loc);
+ ("case", fun loc -> CASE loc);
+ ("default", fun loc -> DEFAULT loc);
+ ("while", fun loc -> WHILE loc);
+ ("do", fun loc -> DO loc);
+ ("for", fun loc -> FOR loc);
+ ("if", fun loc -> IF loc);
+ ("else", fun _ -> ELSE);
+ (*** Implementation specific keywords ***)
+ ("__signed__", fun loc -> SIGNED loc);
+ ("__inline__", fun loc -> INLINE loc);
+ ("inline", fun loc -> INLINE loc);
+ ("__inline", fun loc -> INLINE loc);
+ ("_inline", fun loc ->
+ if !msvcMode then
+ INLINE loc
+ else
+ IDENT ("_inline", loc));
+ ("__attribute__", fun loc -> ATTRIBUTE loc);
+ ("__attribute", fun loc -> ATTRIBUTE loc);
+(*
+ ("__attribute_used__", fun loc -> ATTRIBUTE_USED loc);
+*)
+ ("__blockattribute__", fun _ -> BLOCKATTRIBUTE);
+ ("__blockattribute", fun _ -> BLOCKATTRIBUTE);
+ ("__asm__", fun loc -> ASM loc);
+ ("asm", fun loc -> ASM loc);
+ ("__typeof__", fun loc -> TYPEOF loc);
+ ("__typeof", fun loc -> TYPEOF loc);
+ ("typeof", fun loc -> TYPEOF loc);
+ ("__alignof", fun loc -> ALIGNOF loc);
+ ("__alignof__", fun loc -> ALIGNOF loc);
+ ("__volatile__", fun loc -> VOLATILE loc);
+ ("__volatile", fun loc -> VOLATILE loc);
+
+ ("__FUNCTION__", fun loc -> FUNCTION__ loc);
+ ("__func__", fun loc -> FUNCTION__ loc); (* ISO 6.4.2.2 *)
+ ("__PRETTY_FUNCTION__", fun loc -> PRETTY_FUNCTION__ loc);
+ ("__label__", fun _ -> LABEL__);
+ (*** weimer: GCC arcana ***)
+ ("__restrict", fun loc -> RESTRICT loc);
+ ("restrict", fun loc -> RESTRICT loc);
+(* ("__extension__", EXTENSION); *)
+ (**** MS VC ***)
+ ("__int64", fun loc -> INT64 loc);
+ ("__int32", fun loc -> INT loc);
+ ("_cdecl", fun loc -> MSATTR ("_cdecl", loc));
+ ("__cdecl", fun loc -> MSATTR ("__cdecl", loc));
+ ("_stdcall", fun loc -> MSATTR ("_stdcall", loc));
+ ("__stdcall", fun loc -> MSATTR ("__stdcall", loc));
+ ("_fastcall", fun loc -> MSATTR ("_fastcall", loc));
+ ("__fastcall", fun loc -> MSATTR ("__fastcall", loc));
+ ("__w64", fun loc -> MSATTR("__w64", loc));
+ ("__declspec", fun loc -> DECLSPEC loc);
+ ("__forceinline", fun loc -> INLINE loc); (* !! we turn forceinline
+ * into inline *)
+ ("__try", fun loc -> TRY loc);
+ ("__except", fun loc -> EXCEPT loc);
+ ("__finally", fun loc -> FINALLY loc);
+ (* weimer: some files produced by 'GCC -E' expect this type to be
+ * defined *)
+ ("__builtin_va_list", fun loc -> NAMED_TYPE ("__builtin_va_list", loc));
+ ("__builtin_va_arg", fun loc -> BUILTIN_VA_ARG loc);
+ ("__builtin_types_compatible_p", fun loc -> BUILTIN_TYPES_COMPAT loc);
+ ("__builtin_offsetof", fun loc -> BUILTIN_OFFSETOF loc);
+ (* On some versions of GCC __thread is a regular identifier *)
+ ("__thread", fun loc -> THREAD loc)
+ ]
+
+(* Mark an identifier as a type name. The old mapping is preserved and will
+ * be reinstated when we exit this context *)
+let add_type name =
+ (* ignore (print_string ("adding type name " ^ name ^ "\n")); *)
+ H.add lexicon name (fun loc -> NAMED_TYPE (name, loc))
+
+let context : string list list ref = ref []
+
+let push_context _ = context := []::!context
+
+let pop_context _ =
+ match !context with
+ [] -> assert false
+ | con::sub ->
+ (context := sub;
+ List.iter (fun name ->
+ (* ignore (print_string ("removing lexicon for " ^ name ^ "\n")); *)
+ H.remove lexicon name) con)
+
+(* Mark an identifier as a variable name. The old mapping is preserved and
+ * will be reinstated when we exit this context *)
+let add_identifier name =
+ match !context with
+ [] -> () (* Just ignore raise (InternalError "Empty context stack") *)
+ | con::sub ->
+ context := (name::con)::sub;
+ H.add lexicon name (fun loc -> IDENT (name, loc))
+
+
+(*
+** Useful primitives
+*)
+let scan_ident lb id =
+ let here = currentLoc lb in
+ try (H.find lexicon id) here
+ (* default to variable name, as opposed to type *)
+ with Not_found -> IDENT (id, here)
+
+
+(*
+** Buffer processor
+*)
+
+
+let init source =
+ init_lexicon ();
+ (* Inititialize the pointer in Errormsg *)
+ Parse_aux.add_type := add_type;
+ Parse_aux.push_context := push_context;
+ Parse_aux.pop_context := pop_context;
+ Parse_aux.add_identifier := add_identifier;
+ (* Build lexbuf *)
+ let lb = source in
+ let cp = lb.lex_curr_p in
+ lb.lex_curr_p <- {cp with pos_lnum = 1};
+ lb
+
+let finish () =
+ ()
+
+(*** Error handling ***)
+let error = parse_error
+
+
+(*** escape character management ***)
+let scan_escape (char: char) : int64 =
+ let result = match char with
+ 'n' -> '\n'
+ | 'r' -> '\r'
+ | 't' -> '\t'
+ | 'b' -> '\b'
+ | 'f' -> '\012' (* ASCII code 12 *)
+ | 'v' -> '\011' (* ASCII code 11 *)
+ | 'a' -> '\007' (* ASCII code 7 *)
+ | 'e' | 'E' -> '\027' (* ASCII code 27. This is a GCC extension *)
+ | '\'' -> '\''
+ | '"'-> '"' (* '"' *)
+ | '?' -> '?'
+ | '(' when not !msvcMode -> '('
+ | '{' when not !msvcMode -> '{'
+ | '[' when not !msvcMode -> '['
+ | '%' when not !msvcMode -> '%'
+ | '\\' -> '\\'
+ | other -> error ("Unrecognized escape sequence: \\" ^ (String.make 1 other)); raise Parsing.Parse_error
+ in
+ Int64.of_int (Char.code result)
+
+let scan_hex_escape str =
+ let radix = Int64.of_int 16 in
+ let the_value = ref Int64.zero in
+ (* start at character 2 to skip the \x *)
+ for i = 2 to (String.length str) - 1 do
+ let thisDigit = Cabshelper.valueOfDigit (String.get str i) in
+ (* the_value := !the_value * 16 + thisDigit *)
+ the_value := Int64.add (Int64.mul !the_value radix) thisDigit
+ done;
+ !the_value
+
+let scan_oct_escape str =
+ let radix = Int64.of_int 8 in
+ let the_value = ref Int64.zero in
+ (* start at character 1 to skip the \x *)
+ for i = 1 to (String.length str) - 1 do
+ let thisDigit = Cabshelper.valueOfDigit (String.get str i) in
+ (* the_value := !the_value * 8 + thisDigit *)
+ the_value := Int64.add (Int64.mul !the_value radix) thisDigit
+ done;
+ !the_value
+
+let lex_hex_escape remainder lexbuf =
+ let prefix = scan_hex_escape (Lexing.lexeme lexbuf) in
+ prefix :: remainder lexbuf
+
+let lex_oct_escape remainder lexbuf =
+ let prefix = scan_oct_escape (Lexing.lexeme lexbuf) in
+ prefix :: remainder lexbuf
+
+let lex_simple_escape remainder lexbuf =
+ let lexchar = Lexing.lexeme_char lexbuf 1 in
+ let prefix = scan_escape lexchar in
+ prefix :: remainder lexbuf
+
+let lex_unescaped remainder lexbuf =
+ let prefix = Int64.of_int (Char.code (Lexing.lexeme_char lexbuf 0)) in
+ prefix :: remainder lexbuf
+
+let lex_comment remainder lexbuf =
+ let ch = Lexing.lexeme_char lexbuf 0 in
+ let prefix = Int64.of_int (Char.code ch) in
+ if ch = '\n' then newline lexbuf;
+ prefix :: remainder lexbuf
+
+let make_char (i:int64):char =
+ let min_val = Int64.zero in
+ let max_val = Int64.of_int 255 in
+ (* if i < 0 || i > 255 then error*)
+ if compare i min_val < 0 || compare i max_val > 0 then begin
+ let msg = Printf.sprintf "clexer:make_char: character 0x%Lx too big" i in
+ error msg
+ end;
+ Char.chr (Int64.to_int i)
+
+
+(* ISO standard locale-specific function to convert a wide character
+ * into a sequence of normal characters. Here we work on strings.
+ * We convert L"Hi" to "H\000i\000"
+ matth: this seems unused.
+let wbtowc wstr =
+ let len = String.length wstr in
+ let dest = String.make (len * 2) '\000' in
+ for i = 0 to len-1 do
+ dest.[i*2] <- wstr.[i] ;
+ done ;
+ dest
+*)
+
+(* This function converst the "Hi" in L"Hi" to { L'H', L'i', L'\0' }
+ matth: this seems unused.
+let wstr_to_warray wstr =
+ let len = String.length wstr in
+ let res = ref "{ " in
+ for i = 0 to len-1 do
+ res := !res ^ (Printf.sprintf "L'%c', " wstr.[i])
+ done ;
+ res := !res ^ "}" ;
+ !res
+*)
+
+}
+
+let decdigit = ['0'-'9']
+let octdigit = ['0'-'7']
+let hexdigit = ['0'-'9' 'a'-'f' 'A'-'F']
+let letter = ['a'- 'z' 'A'-'Z']
+
+
+let usuffix = ['u' 'U']
+let lsuffix = "l"|"L"|"ll"|"LL"
+let intsuffix = lsuffix | usuffix | usuffix lsuffix | lsuffix usuffix
+ | usuffix ? "i64"
+
+
+let hexprefix = '0' ['x' 'X']
+
+let intnum = decdigit+ intsuffix?
+let octnum = '0' octdigit+ intsuffix?
+let hexnum = hexprefix hexdigit+ intsuffix?
+
+let exponent = ['e' 'E']['+' '-']? decdigit+
+let fraction = '.' decdigit+
+let decfloat = (intnum? fraction)
+ |(intnum exponent)
+ |(intnum? fraction exponent)
+ | (intnum '.')
+ | (intnum '.' exponent)
+
+let hexfraction = hexdigit* '.' hexdigit+ | hexdigit+
+let binexponent = ['p' 'P'] ['+' '-']? decdigit+
+let hexfloat = hexprefix hexfraction binexponent
+ | hexprefix hexdigit+ binexponent
+
+let floatsuffix = ['f' 'F' 'l' 'L']
+let floatnum = (decfloat | hexfloat) floatsuffix?
+
+let ident = (letter|'_'|'$')(letter|decdigit|'_'|'$')*
+let blank = [' ' '\t' '\012' '\r']+
+let escape = '\\' _
+let hex_escape = '\\' ['x' 'X'] hexdigit+
+let oct_escape = '\\' octdigit octdigit? octdigit?
+
+rule initial =
+ parse "/*" { comment lexbuf;
+ initial lexbuf}
+| "//" { onelinecomment lexbuf;
+ newline lexbuf;
+ initial lexbuf
+ }
+| blank { initial lexbuf}
+| '\n' { newline lexbuf;
+ initial lexbuf }
+| '\\' '\r' * '\n' { newline lexbuf;
+ initial lexbuf
+ }
+| '#' { hash lexbuf}
+(*
+| "_Pragma" { PRAGMA (currentLoc lexbuf) }
+*)
+| '\'' { CST_CHAR (chr lexbuf, currentLoc lexbuf)}
+| "L'" { CST_WCHAR (chr lexbuf, currentLoc lexbuf) }
+| '"' { (* '"' *)
+(* matth: BUG: this could be either a regular string or a wide string.
+ * e.g. if it's the "world" in
+ * L"Hello, " "world"
+ * then it should be treated as wide even though there's no L immediately
+ * preceding it. See test/small1/wchar5.c for a failure case. *)
+ CST_STRING (str lexbuf, currentLoc lexbuf) }
+| "L\"" { (* weimer: wchar_t string literal *)
+ CST_WSTRING(str lexbuf, currentLoc lexbuf) }
+| floatnum {CST_FLOAT (Lexing.lexeme lexbuf, currentLoc lexbuf)}
+| hexnum {CST_INT (Lexing.lexeme lexbuf, currentLoc lexbuf)}
+| octnum {CST_INT (Lexing.lexeme lexbuf, currentLoc lexbuf)}
+| intnum {CST_INT (Lexing.lexeme lexbuf, currentLoc lexbuf)}
+| "!quit!" {EOF}
+| "..." {ELLIPSIS}
+| "+=" {PLUS_EQ}
+| "-=" {MINUS_EQ}
+| "*=" {STAR_EQ}
+| "/=" {SLASH_EQ}
+| "%=" {PERCENT_EQ}
+| "|=" {PIPE_EQ}
+| "&=" {AND_EQ}
+| "^=" {CIRC_EQ}
+| "<<=" {INF_INF_EQ}
+| ">>=" {SUP_SUP_EQ}
+| "<<" {INF_INF}
+| ">>" {SUP_SUP}
+| "==" {EQ_EQ}
+| "!=" {EXCLAM_EQ}
+| "<=" {INF_EQ}
+| ">=" {SUP_EQ}
+| "=" {EQ}
+| "<" {INF}
+| ">" {SUP}
+| "++" {PLUS_PLUS (currentLoc lexbuf)}
+| "--" {MINUS_MINUS (currentLoc lexbuf)}
+| "->" {ARROW}
+| '+' {PLUS (currentLoc lexbuf)}
+| '-' {MINUS (currentLoc lexbuf)}
+| '*' {STAR (currentLoc lexbuf)}
+| '/' {SLASH}
+| '%' {PERCENT}
+| '!' {EXCLAM (currentLoc lexbuf)}
+| "&&" {AND_AND (currentLoc lexbuf)}
+| "||" {PIPE_PIPE}
+| '&' {AND (currentLoc lexbuf)}
+| '|' {PIPE}
+| '^' {CIRC}
+| '?' {QUEST}
+| ':' {COLON}
+| '~' {TILDE (currentLoc lexbuf)}
+
+| '{' {LBRACE (currentLoc lexbuf)}
+| '}' {RBRACE (currentLoc lexbuf)}
+| '[' {LBRACKET}
+| ']' {RBRACKET}
+| '(' { (LPAREN (currentLoc lexbuf)) }
+| ')' {RPAREN}
+| ';' { (SEMICOLON (currentLoc lexbuf)) }
+| ',' {COMMA}
+| '.' {DOT}
+| "sizeof" {SIZEOF (currentLoc lexbuf)}
+| "__asm" { if !msvcMode then
+ MSASM (msasm lexbuf, currentLoc lexbuf)
+ else (ASM (currentLoc lexbuf)) }
+
+(* If we see __pragma we eat it and the matching parentheses as well *)
+| "__pragma" { matchingParsOpen := 0;
+ let _ = matchingpars lexbuf in
+ initial lexbuf
+ }
+
+(* __extension__ is a black. The parser runs into some conflicts if we let it
+ * pass *)
+| "__extension__" {initial lexbuf }
+| ident {scan_ident lexbuf (Lexing.lexeme lexbuf)}
+| eof {EOF}
+| _ {parse_error "Invalid symbol"; raise Parsing.Parse_error }
+and comment =
+ parse
+ "*/" { () }
+| eof { () }
+| '\n' { newline lexbuf; comment lexbuf }
+| _ { comment lexbuf }
+
+
+and onelinecomment = parse
+ '\n'|eof { () }
+| _ { onelinecomment lexbuf }
+
+and matchingpars = parse
+ '\n' { newline lexbuf; matchingpars lexbuf }
+| blank { matchingpars lexbuf }
+| '(' { incr matchingParsOpen; matchingpars lexbuf }
+| ')' { decr matchingParsOpen;
+ if !matchingParsOpen = 0 then
+ ()
+ else
+ matchingpars lexbuf
+ }
+| "/*" { comment lexbuf; matchingpars lexbuf}
+| '"' { (* '"' *)
+ let _ = str lexbuf in
+ matchingpars lexbuf
+ }
+| _ { matchingpars lexbuf }
+
+(* # <line number> <file name> ... *)
+and hash = parse
+ '\n' { newline lexbuf; initial lexbuf}
+| blank { hash lexbuf}
+| intnum { (* We are seeing a line number. This is the number for the
+ * next line *)
+ let s = Lexing.lexeme lexbuf in
+ begin try
+ setCurrentLine lexbuf (int_of_string s - 1)
+ with Failure ("int_of_string") ->
+ (* the int is too big. *)
+ ()
+ end;
+ (* A file name may follow *)
+ file lexbuf }
+| "line" { hash lexbuf } (* MSVC line number info *)
+| "pragma" blank
+ { let here = currentLoc lexbuf in
+ PRAGMA_LINE (pragma lexbuf, here)
+ }
+| _ { endline lexbuf}
+
+and file = parse
+ '\n' { newline lexbuf; initial lexbuf}
+| blank { file lexbuf}
+| '"' [^ '\012' '\t' '"']* '"' { (* '"' *)
+ let n = Lexing.lexeme lexbuf in
+ let n1 = String.sub n 1
+ ((String.length n) - 2) in
+ setCurrentFile lexbuf n1;
+ endline lexbuf}
+
+| _ { endline lexbuf}
+
+and endline = parse
+ '\n' { newline lexbuf; initial lexbuf}
+| eof { EOF }
+| _ { endline lexbuf}
+
+and pragma = parse
+ '\n' { newline lexbuf; "" }
+| _ { let cur = Lexing.lexeme lexbuf in
+ cur ^ (pragma lexbuf) }
+
+and str = parse
+ '"' {[]} (* no nul terminiation in CST_STRING '"' *)
+| hex_escape { lex_hex_escape str lexbuf}
+| oct_escape { lex_oct_escape str lexbuf}
+| escape { lex_simple_escape str lexbuf}
+| _ { lex_unescaped str lexbuf}
+
+and chr = parse
+ '\'' {[]}
+| hex_escape {lex_hex_escape chr lexbuf}
+| oct_escape {lex_oct_escape chr lexbuf}
+| escape {lex_simple_escape chr lexbuf}
+| _ {lex_unescaped chr lexbuf}
+
+and msasm = parse
+ blank { msasm lexbuf }
+| '{' { msasminbrace lexbuf }
+| _ { let cur = Lexing.lexeme lexbuf in
+ cur ^ (msasmnobrace lexbuf) }
+
+and msasminbrace = parse
+ '}' { "" }
+| _ { let cur = Lexing.lexeme lexbuf in
+ cur ^ (msasminbrace lexbuf) }
+and msasmnobrace = parse
+ ['}' ';' '\n'] { lexbuf.Lexing.lex_curr_pos <-
+ lexbuf.Lexing.lex_curr_pos - 1;
+ "" }
+| "__asm" { lexbuf.Lexing.lex_curr_pos <-
+ lexbuf.Lexing.lex_curr_pos - 5;
+ "" }
+| _ { let cur = Lexing.lexeme lexbuf in
+
+ cur ^ (msasmnobrace lexbuf) }
+
+{
+
+}
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Machine-dependent aspects *)
+
+type t = {
+ char_signed: bool;
+ sizeof_ptr: int;
+ sizeof_short: int;
+ sizeof_int: int;
+ sizeof_long: int;
+ sizeof_longlong: int;
+ sizeof_float: int;
+ sizeof_double: int;
+ sizeof_longdouble: int;
+ sizeof_void: int option;
+ sizeof_fun: int option;
+ sizeof_wchar: int;
+ sizeof_size_t: int;
+ sizeof_ptrdiff_t: int;
+ alignof_ptr: int;
+ alignof_short: int;
+ alignof_int: int;
+ alignof_long: int;
+ alignof_longlong: int;
+ alignof_float: int;
+ alignof_double: int;
+ alignof_longdouble: int;
+ alignof_void: int option;
+ alignof_fun: int option
+}
+
+let ilp32ll64 = {
+ char_signed = false;
+ sizeof_ptr = 4;
+ sizeof_short = 2;
+ sizeof_int = 4;
+ sizeof_long = 4;
+ sizeof_longlong = 8;
+ sizeof_float = 4;
+ sizeof_double = 8;
+ sizeof_longdouble = 16;
+ sizeof_void = None;
+ sizeof_fun = None;
+ sizeof_wchar = 4;
+ sizeof_size_t = 4;
+ sizeof_ptrdiff_t = 4;
+ alignof_ptr = 4;
+ alignof_short = 2;
+ alignof_int = 4;
+ alignof_long = 4;
+ alignof_longlong = 8;
+ alignof_float = 4;
+ alignof_double = 8;
+ alignof_longdouble = 16;
+ alignof_void = None;
+ alignof_fun = None
+}
+
+let i32lpll64 = {
+ char_signed = false;
+ sizeof_ptr = 8;
+ sizeof_short = 2;
+ sizeof_int = 4;
+ sizeof_long = 8;
+ sizeof_longlong = 8;
+ sizeof_float = 4;
+ sizeof_double = 8;
+ sizeof_longdouble = 16;
+ sizeof_void = None;
+ sizeof_fun = None;
+ sizeof_wchar = 4;
+ sizeof_size_t = 8;
+ sizeof_ptrdiff_t = 8;
+ alignof_ptr = 8;
+ alignof_short = 2;
+ alignof_int = 4;
+ alignof_long = 8;
+ alignof_longlong = 8;
+ alignof_float = 4;
+ alignof_double = 8;
+ alignof_longdouble = 16;
+ alignof_void = None;
+ alignof_fun = None
+}
+
+let il32pll64 = {
+ char_signed = false;
+ sizeof_ptr = 8;
+ sizeof_short = 2;
+ sizeof_int = 4;
+ sizeof_long = 4;
+ sizeof_longlong = 8;
+ sizeof_float = 4;
+ sizeof_double = 8;
+ sizeof_longdouble = 16;
+ sizeof_void = None;
+ sizeof_fun = None;
+ sizeof_wchar = 4;
+ sizeof_size_t = 8;
+ sizeof_ptrdiff_t = 8;
+ alignof_ptr = 8;
+ alignof_short = 2;
+ alignof_int = 4;
+ alignof_long = 4;
+ alignof_longlong = 8;
+ alignof_float = 4;
+ alignof_double = 8;
+ alignof_longdouble = 16;
+ alignof_void = None;
+ alignof_fun = None
+}
+
+let make_char_signed c = {c with char_signed = true}
+
+let gcc_extensions c =
+ { c with sizeof_void = Some 1; sizeof_fun = Some 1;
+ alignof_void = Some 1; alignof_fun = Some 1 }
+
+let config =
+ ref (match Sys.word_size with
+ | 32 -> ilp32ll64
+ | 64 -> if Sys.os_type = "Win32" then il32pll64 else i32lpll64
+ | _ -> assert false)
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Machine-dependent aspects *)
+
+type t = {
+ char_signed: bool;
+ sizeof_ptr: int;
+ sizeof_short: int;
+ sizeof_int: int;
+ sizeof_long: int;
+ sizeof_longlong: int;
+ sizeof_float: int;
+ sizeof_double: int;
+ sizeof_longdouble: int;
+ sizeof_void: int option;
+ sizeof_fun: int option;
+ sizeof_wchar: int;
+ sizeof_size_t: int;
+ sizeof_ptrdiff_t: int;
+ alignof_ptr: int;
+ alignof_short: int;
+ alignof_int: int;
+ alignof_long: int;
+ alignof_longlong: int;
+ alignof_float: int;
+ alignof_double: int;
+ alignof_longdouble: int;
+ alignof_void: int option;
+ alignof_fun: int option
+}
+
+val ilp32ll64 : t
+val i32lpll64 : t
+val il32pll64 : t
+val make_char_signed : t -> t
+val gcc_extensions : t -> t
+
+val config : t ref
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Wrapper around gcc to parse, transform, pretty-print, and call gcc on result *)
+
+let transfs = ref ""
+
+let safe_remove name =
+ try Sys.remove name with Sys_error _ -> ()
+
+let process_c_file prepro_opts name =
+ let ppname = Filename.temp_file "cparser" ".i" in
+ let cpname = Filename.chop_suffix name ".c" ^ ".i" in
+ let rc =
+ Sys.command
+ (Printf.sprintf "gcc -E -U__GNUC__ %s %s > %s"
+ (String.concat " " (List.map Filename.quote prepro_opts))
+ (Filename.quote name) (Filename.quote ppname)) in
+ if rc <> 0 then begin
+ safe_remove ppname;
+ exit 2
+ end;
+ let ic = open_in ppname in
+ let lexbuf = Lexing.from_channel ic in
+ lexbuf.Lexing.lex_curr_p <- { lexbuf.Lexing.lex_curr_p with Lexing.pos_fname = ppname };
+ let r = Parse.preprocessed_file !transfs name lexbuf in
+ close_in ic;
+ safe_remove ppname;
+ match r with
+ | None -> exit 2
+ | Some p ->
+ let oc = open_out cpname in
+ let oform = Format.formatter_of_out_channel oc in
+ Cprint.program oform p;
+ close_out oc;
+ cpname
+
+let starts_with pref s =
+ String.length s >= String.length pref
+ && String.sub s 0 (String.length pref) = pref
+
+let ends_with suff s =
+ String.length s >= String.length suff
+ && String.sub s (String.length s - String.length suff) (String.length suff)
+ = suff
+
+let rec parse_cmdline prepro args i =
+ if i >= Array.length Sys.argv then List.rev args else begin
+ (* should skip arguments more cleanly... *)
+ let s = Sys.argv.(i) in
+ if s = "-Xsimplif" && i + 1 < Array.length Sys.argv then begin
+ transfs := Sys.argv.(i+1);
+ parse_cmdline prepro args (i+2)
+ end else if (s = "-I" || s = "-D" || s = "-U")
+ && i + 1 < Array.length Sys.argv then
+ parse_cmdline (Sys.argv.(i+1) :: s :: prepro) args (i+2)
+ else if starts_with "-I" s
+ || starts_with "-D" s
+ || starts_with "-U" s then
+ parse_cmdline (s :: prepro) args (i + 1)
+ else if s = "-Wall" then
+ parse_cmdline prepro ("-Wno-parentheses" :: "-Wall" :: args) (i+1)
+ else if ends_with ".c" s then begin
+ let s' = process_c_file (List.rev prepro) s in
+ parse_cmdline prepro (s' :: args) (i + 1)
+ end else
+ parse_cmdline prepro (s :: args) (i + 1)
+ end
+
+
+let _ =
+ Builtins.set GCC.builtins;
+ let args = parse_cmdline [] [] 1 in
+ let cmd = "gcc " ^ String.concat " " (List.map Filename.quote args) in
+ let rc = Sys.command cmd in
+ exit rc
+
--- /dev/null
+OCAMLC=ocamlc -g
+OCAMLOPT=ocamlopt -g
+OCAMLLEX=ocamllex
+OCAMLYACC=ocamlyacc -v
+OCAMLDEP=ocamldep
+OCAMLMKLIB=ocamlmklib
+
+LIBDIR=../lib
+
+INTFS=C.mli
+
+SRCS=Errors.ml Cabs.ml Cabshelper.ml Parse_aux.ml Parser.ml Lexer.ml \
+ Machine.ml \
+ Env.ml Cprint.ml Cutil.ml Ceval.ml \
+ Builtins.ml GCC.ml CBuiltins.ml \
+ Cleanup.ml Elab.ml Rename.ml \
+ Transform.ml \
+ Unblock.ml SimplExpr.ml AddCasts.ml StructByValue.ml StructAssign.ml \
+ Bitfields.ml \
+ Parse.ml
+
+COBJS=uint64.o
+BOBJS=$(SRCS:.ml=.cmo)
+NOBJS=$(SRCS:.ml=.cmx)
+IOBJS=$(INTFS:.mli=.cmi)
+NATIVETARGETS=$(shell if `which ocamlopt`; \
+ then echo "cparser.cmxa cparser cparser.a libcparser.a dllcparser.so"; fi)
+
+all: $(NATIVETARGETS) cparser.cma cparser.byte
+
+install:
+ mkdir -p $(LIBDIR)
+ cp -p Cparser.cmi cparser.cma $(NATIVETARGETS) $(LIBDIR)
+
+cparser: $(COBJS) $(NOBJS) Main.cmx
+ $(OCAMLOPT) -o cparser $(COBJS) $(NOBJS) Main.cmx
+
+cparser.byte: $(COBJS) $(BOBJS) Main.cmo
+ $(OCAMLC) -custom -o cparser.byte $(COBJS) $(BOBJS) Main.cmo
+
+cparser.cma libcparser.a: uint64.o Cparser.cmo
+ $(OCAMLMKLIB) -o cparser uint64.o Cparser.cmo
+
+cparser.cmxa: uint64.o Cparser.cmx
+ $(OCAMLMKLIB) -o cparser uint64.o Cparser.cmx
+
+Cparser.cmo Cparser.cmi: $(IOBJS) $(BOBJS)
+ $(OCAMLC) -pack -o Cparser.cmo $(IOBJS) $(BOBJS)
+
+Cparser.cmx: $(IOBJS) $(NOBJS)
+ $(OCAMLOPT) -pack -o Cparser.cmx $(IOBJS) $(NOBJS)
+
+Parser.ml Parser.mli: Parser.mly
+ $(OCAMLYACC) Parser.mly
+
+clean::
+ rm -f Parser.ml Parser.mli Parser.output
+
+beforedepend:: Parser.ml Parser.mli
+
+Lexer.ml: Lexer.mll
+ $(OCAMLLEX) Lexer.mll
+
+clean::
+ rm -f Lexer.ml
+
+beforedepend:: Lexer.ml
+
+.SUFFIXES: .ml .mli .cmi .cmo .cmx
+
+.mli.cmi:
+ $(OCAMLC) -c $*.mli
+.ml.cmo:
+ $(OCAMLC) -c $*.ml
+.ml.cmx:
+ $(OCAMLOPT) -c -for-pack Cparser $*.ml
+.c.o:
+ $(OCAMLC) -c $*.c
+
+clean::
+ rm -f *.cm? *.o *.so *.a *.cmxa *.byte cparser
+
+depend: beforedepend
+ $(OCAMLDEP) *.mli *.ml > .depend
+
+include .depend
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Entry point for the library: parse, elaborate, and transform *)
+
+module CharSet = Set.Make(struct type t = char let compare = compare end)
+
+let transform_program t p =
+ let run_pass pass flag p = if CharSet.mem flag t then pass p else p in
+ Rename.program
+ (run_pass (AddCasts.program ~all:(CharSet.mem 'C' t)) 'c'
+ (run_pass StructAssign.program 'S'
+ (run_pass StructByValue.program 's'
+ (run_pass Bitfields.program 'f'
+ (run_pass (SimplExpr.program ~volatile:(CharSet.mem 'v' t)) 'e'
+ (run_pass Unblock.program 'b'
+ p))))))
+
+let parse_transformations s =
+ let t = ref CharSet.empty in
+ let set s = String.iter (fun c -> t := CharSet.add c !t) s in
+ String.iter
+ (function 'b' -> set "b"
+ | 'e' -> set "e"
+ | 'c' -> set "ec"
+ | 'C' -> set "ecC"
+ | 's' -> set "s"
+ | 'S' -> set "esS"
+ | 'v' -> set "ev"
+ | 'f' -> set "bef"
+ | _ -> ())
+ s;
+ !t
+
+let preprocessed_file transfs name lb =
+ Errors.reset();
+ let t = parse_transformations transfs in
+ let p =
+ try
+ Rename.program (transform_program t (Elab.elab_preprocessed_file lb))
+ with Parsing.Parse_error ->
+ Errors.error "Error during parsing"; []
+ | Errors.Abort ->
+ [] in
+ if Errors.check_errors() then None else Some p
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Entry point for the library: parse, elaborate, and transform *)
+
+val preprocessed_file: string -> string -> Lexing.lexbuf -> C.program option
+
+(* first arg: desired transformations
+ second arg: source file name before preprocessing
+ third arg: file after preprocessing *)
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+open Format
+open Errors
+open Cabshelper
+
+(* Report parsing errors *)
+
+let parse_error msg =
+ error "%a: %s" format_cabsloc (currentLoc()) msg
+
+(* Are we parsing msvc syntax? *)
+
+let msvcMode = ref false
+
+(* We provide here a pointer to a function. It will be set by the lexer and
+ * used by the parser. In Ocaml lexers depend on parsers, so we we have put
+ * such functions in a separate module. *)
+let add_identifier: (string -> unit) ref =
+ ref (fun _ -> assert false)
+
+let add_type: (string -> unit) ref =
+ ref (fun _ -> assert false)
+
+let push_context: (unit -> unit) ref =
+ ref (fun _ -> assert false)
+
+let pop_context: (unit -> unit) ref =
+ ref (fun _ -> assert false)
+
+(* Keep here the current pattern for formatparse *)
+let currentPattern = ref ""
+
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+val parse_error : string -> unit
+val msvcMode : bool ref
+val add_identifier : (string -> unit) ref
+val add_type : (string -> unit) ref
+val push_context : (unit -> unit) ref
+val pop_context : (unit -> unit) ref
+val currentPattern : string ref
--- /dev/null
+/*(*
+ *
+ * Copyright (c) 2001-2003,
+ * George C. Necula <necula@cs.berkeley.edu>
+ * Scott McPeak <smcpeak@cs.berkeley.edu>
+ * Wes Weimer <weimer@cs.berkeley.edu>
+ * Ben Liblit <liblit@cs.berkeley.edu>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. The names of the contributors may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ **)
+(**
+** 1.0 3.22.99 Hugues Cassé First version.
+** 2.0 George Necula 12/12/00: Practically complete rewrite.
+*)
+*/
+%{
+open Cabs
+open Cabshelper
+open Parse_aux
+
+(*
+** Expression building
+*)
+let smooth_expression lst =
+ match lst with
+ [] -> NOTHING
+ | [expr] -> expr
+ | _ -> COMMA (lst)
+
+
+let currentFunctionName = ref "<outside any function>"
+
+let announceFunctionName ((n, decl, _, _):name) =
+ !add_identifier n;
+ (* Start a context that includes the parameter names and the whole body.
+ * Will pop when we finish parsing the function body *)
+ !push_context ();
+ (* Go through all the parameter names and mark them as identifiers *)
+ let rec findProto = function
+ PROTO (d, args, _) when isJUSTBASE d ->
+ List.iter (fun (_, (an, _, _, _)) -> !add_identifier an) args
+
+ | PROTO (d, _, _) -> findProto d
+ | PARENTYPE (_, d, _) -> findProto d
+ | PTR (_, d) -> findProto d
+ | ARRAY (d, _, _) -> findProto d
+ | _ -> parse_error "Cannot find the prototype in a function definition";
+ raise Parsing.Parse_error
+
+ and isJUSTBASE = function
+ JUSTBASE -> true
+ | PARENTYPE (_, d, _) -> isJUSTBASE d
+ | _ -> false
+ in
+ findProto decl;
+ currentFunctionName := n
+
+
+
+let applyPointer (ptspecs: attribute list list) (dt: decl_type)
+ : decl_type =
+ (* Outer specification first *)
+ let rec loop = function
+ [] -> dt
+ | attrs :: rest -> PTR(attrs, loop rest)
+ in
+ loop ptspecs
+
+let doDeclaration (loc: cabsloc) (specs: spec_elem list) (nl: init_name list) : definition =
+ if isTypedef specs then begin
+ (* Tell the lexer about the new type names *)
+ List.iter (fun ((n, _, _, _), _) -> !add_type n) nl;
+ TYPEDEF ((specs, List.map (fun (n, _) -> n) nl), loc)
+ end else
+ if nl = [] then
+ ONLYTYPEDEF (specs, loc)
+ else begin
+ (* Tell the lexer about the new variable names *)
+ List.iter (fun ((n, _, _, _), _) -> !add_identifier n) nl;
+ DECDEF ((specs, nl), loc)
+ end
+
+
+let doFunctionDef (loc: cabsloc)
+ (lend: cabsloc)
+ (specs: spec_elem list)
+ (n: name)
+ (b: block) : definition =
+ let fname = (specs, n) in
+ FUNDEF (fname, b, loc, lend)
+
+
+let doOldParDecl (names: string list)
+ ((pardefs: name_group list), (isva: bool))
+ : single_name list * bool =
+ let findOneName n =
+ (* Search in pardefs for the definition for this parameter *)
+ let rec loopGroups = function
+ [] -> ([SpecType Tint], (n, JUSTBASE, [], cabslu))
+ | (specs, names) :: restgroups ->
+ let rec loopNames = function
+ [] -> loopGroups restgroups
+ | ((n',_, _, _) as sn) :: _ when n' = n -> (specs, sn)
+ | _ :: restnames -> loopNames restnames
+ in
+ loopNames names
+ in
+ loopGroups pardefs
+ in
+ let args = List.map findOneName names in
+ (args, isva)
+
+let int64_to_char value =
+ if (compare value (Int64.of_int 255) > 0) || (compare value Int64.zero < 0) then
+ begin
+ let msg = Printf.sprintf "cparser:intlist_to_string: character 0x%Lx too big" value in
+ parse_error msg;
+ raise Parsing.Parse_error
+ end
+ else
+ Char.chr (Int64.to_int value)
+
+(* takes a not-nul-terminated list, and converts it to a string. *)
+let rec intlist_to_string (str: int64 list):string =
+ match str with
+ [] -> "" (* add nul-termination *)
+ | value::rest ->
+ let this_char = int64_to_char value in
+ (String.make 1 this_char) ^ (intlist_to_string rest)
+
+let fst3 (result, _, _) = result
+let snd3 (_, result, _) = result
+let trd3 (_, _, result) = result
+
+
+(*
+ transform: __builtin_offsetof(type, member)
+ into : (size_t) (&(type * ) 0)->member
+ *)
+
+let transformOffsetOf (speclist, dtype) member =
+ let rec addPointer = function
+ | JUSTBASE ->
+ PTR([], JUSTBASE)
+ | PARENTYPE (attrs1, dtype, attrs2) ->
+ PARENTYPE (attrs1, addPointer dtype, attrs2)
+ | ARRAY (dtype, attrs, expr) ->
+ ARRAY (addPointer dtype, attrs, expr)
+ | PTR (attrs, dtype) ->
+ PTR (attrs, addPointer dtype)
+ | PROTO (dtype, names, variadic) ->
+ PROTO (addPointer dtype, names, variadic)
+ in
+ let nullType = (speclist, addPointer dtype) in
+ let nullExpr = CONSTANT (CONST_INT "0") in
+ let castExpr = CAST (nullType, SINGLE_INIT nullExpr) in
+
+ let rec replaceBase = function
+ | VARIABLE field ->
+ MEMBEROFPTR (castExpr, field)
+ | MEMBEROF (base, field) ->
+ MEMBEROF (replaceBase base, field)
+ | INDEX (base, index) ->
+ INDEX (replaceBase base, index)
+ | _ ->
+ parse_error "malformed offset expression in __builtin_offsetof";
+ raise Parsing.Parse_error
+ in
+ let memberExpr = replaceBase member in
+ let addrExpr = UNARY (ADDROF, memberExpr) in
+ (* slight cheat: hard-coded assumption that size_t == unsigned int *)
+ let sizeofType = [SpecType Tunsigned], JUSTBASE in
+ let resultExpr = CAST (sizeofType, SINGLE_INIT addrExpr) in
+ resultExpr
+
+%}
+
+%token <string * Cabs.cabsloc> IDENT
+%token <int64 list * Cabs.cabsloc> CST_CHAR
+%token <int64 list * Cabs.cabsloc> CST_WCHAR
+%token <string * Cabs.cabsloc> CST_INT
+%token <string * Cabs.cabsloc> CST_FLOAT
+%token <string * Cabs.cabsloc> NAMED_TYPE
+
+/* Each character is its own list element, and the terminating nul is not
+ included in this list. */
+%token <int64 list * Cabs.cabsloc> CST_STRING
+%token <int64 list * Cabs.cabsloc> CST_WSTRING
+
+%token EOF
+%token<Cabs.cabsloc> CHAR INT DOUBLE FLOAT VOID INT64 INT32 UNDERSCORE_BOOL
+%token<Cabs.cabsloc> ENUM STRUCT TYPEDEF UNION
+%token<Cabs.cabsloc> SIGNED UNSIGNED LONG SHORT
+%token<Cabs.cabsloc> VOLATILE EXTERN STATIC CONST RESTRICT AUTO REGISTER
+%token<Cabs.cabsloc> THREAD
+
+%token<Cabs.cabsloc> SIZEOF ALIGNOF
+
+%token EQ PLUS_EQ MINUS_EQ STAR_EQ SLASH_EQ PERCENT_EQ
+%token AND_EQ PIPE_EQ CIRC_EQ INF_INF_EQ SUP_SUP_EQ
+%token ARROW DOT
+
+%token EQ_EQ EXCLAM_EQ INF SUP INF_EQ SUP_EQ
+%token<Cabs.cabsloc> PLUS MINUS STAR
+%token SLASH PERCENT
+%token<Cabs.cabsloc> TILDE AND
+%token PIPE CIRC
+%token<Cabs.cabsloc> EXCLAM AND_AND
+%token PIPE_PIPE
+%token INF_INF SUP_SUP
+%token<Cabs.cabsloc> PLUS_PLUS MINUS_MINUS
+
+%token RPAREN
+%token<Cabs.cabsloc> LPAREN RBRACE
+%token<Cabs.cabsloc> LBRACE
+%token LBRACKET RBRACKET
+%token COLON
+%token<Cabs.cabsloc> SEMICOLON
+%token COMMA ELLIPSIS QUEST
+
+%token<Cabs.cabsloc> BREAK CONTINUE GOTO RETURN
+%token<Cabs.cabsloc> SWITCH CASE DEFAULT
+%token<Cabs.cabsloc> WHILE DO FOR
+%token<Cabs.cabsloc> IF TRY EXCEPT FINALLY
+%token ELSE
+
+%token<Cabs.cabsloc> ATTRIBUTE INLINE ASM TYPEOF FUNCTION__ PRETTY_FUNCTION__
+%token LABEL__
+%token<Cabs.cabsloc> BUILTIN_VA_ARG ATTRIBUTE_USED
+%token BUILTIN_VA_LIST
+%token BLOCKATTRIBUTE
+%token<Cabs.cabsloc> BUILTIN_TYPES_COMPAT BUILTIN_OFFSETOF
+%token<Cabs.cabsloc> DECLSPEC
+%token<string * Cabs.cabsloc> MSASM MSATTR
+%token<string * Cabs.cabsloc> PRAGMA_LINE
+%token PRAGMA_EOL
+
+/* operator precedence */
+%nonassoc IF
+%nonassoc ELSE
+
+
+%left COMMA
+%right EQ PLUS_EQ MINUS_EQ STAR_EQ SLASH_EQ PERCENT_EQ
+ AND_EQ PIPE_EQ CIRC_EQ INF_INF_EQ SUP_SUP_EQ
+%right QUEST COLON
+%left PIPE_PIPE
+%left AND_AND
+%left PIPE
+%left CIRC
+%left AND
+%left EQ_EQ EXCLAM_EQ
+%left INF SUP INF_EQ SUP_EQ
+%left INF_INF SUP_SUP
+%left PLUS MINUS
+%left STAR SLASH PERCENT CONST RESTRICT VOLATILE
+%right EXCLAM TILDE PLUS_PLUS MINUS_MINUS CAST RPAREN ADDROF SIZEOF ALIGNOF
+%left LBRACKET
+%left DOT ARROW LPAREN LBRACE
+%right NAMED_TYPE /* We'll use this to handle redefinitions of
+ * NAMED_TYPE as variables */
+%left IDENT
+
+/* Non-terminals informations */
+%start interpret file
+%type <Cabs.definition list> file interpret globals
+
+%type <Cabs.definition> global
+
+
+%type <Cabs.attribute list> attributes attributes_with_asm asmattr
+%type <Cabs.statement> statement
+%type <Cabs.constant * cabsloc> constant
+%type <string * cabsloc> string_constant
+%type <Cabs.expression * cabsloc> expression
+%type <Cabs.expression> opt_expression
+%type <Cabs.init_expression> init_expression
+%type <Cabs.expression list * cabsloc> comma_expression
+%type <Cabs.expression list * cabsloc> paren_comma_expression
+%type <Cabs.expression list> arguments
+%type <Cabs.expression list> bracket_comma_expression
+%type <int64 list Queue.t * cabsloc> string_list
+%type <int64 list * cabsloc> wstring_list
+
+%type <Cabs.initwhat * Cabs.init_expression> initializer
+%type <(Cabs.initwhat * Cabs.init_expression) list> initializer_list
+%type <Cabs.initwhat> init_designators init_designators_opt
+
+%type <spec_elem list * cabsloc> decl_spec_list
+%type <typeSpecifier * cabsloc> type_spec
+%type <Cabs.field_group list> struct_decl_list
+
+
+%type <Cabs.name> old_proto_decl
+%type <Cabs.single_name> parameter_decl
+%type <Cabs.enum_item> enumerator
+%type <Cabs.enum_item list> enum_list
+%type <Cabs.definition> declaration function_def
+%type <cabsloc * spec_elem list * name> function_def_start
+%type <Cabs.spec_elem list * Cabs.decl_type> type_name
+%type <Cabs.block * cabsloc * cabsloc> block
+%type <Cabs.statement list> block_element_list
+%type <string list> local_labels local_label_names
+%type <string list> old_parameter_list_ne
+
+%type <Cabs.init_name> init_declarator
+%type <Cabs.init_name list> init_declarator_list
+%type <Cabs.name> declarator
+%type <Cabs.name * expression option> field_decl
+%type <(Cabs.name * expression option) list> field_decl_list
+%type <string * Cabs.decl_type> direct_decl
+%type <Cabs.decl_type> abs_direct_decl abs_direct_decl_opt
+%type <Cabs.decl_type * Cabs.attribute list> abstract_decl
+
+ /* (* Each element is a "* <type_quals_opt>". *) */
+%type <attribute list list * cabsloc> pointer pointer_opt
+%type <Cabs.cabsloc> location
+%type <Cabs.spec_elem * cabsloc> cvspec
+%%
+
+interpret:
+ file EOF {$1}
+;
+file: globals {$1}
+;
+globals:
+ /* empty */ { [] }
+| global globals { $1 :: $2 }
+| SEMICOLON globals { $2 }
+;
+
+location:
+ /* empty */ { currentLoc () } %prec IDENT
+
+
+/*** Global Definition ***/
+global:
+| declaration { $1 }
+| function_def { $1 }
+/*(* Some C header files ar shared with the C++ compiler and have linkage
+ * specification *)*/
+| EXTERN string_constant declaration { LINKAGE (fst $2, (*handleLoc*) (snd $2), [ $3 ]) }
+| EXTERN string_constant LBRACE globals RBRACE
+ { LINKAGE (fst $2, (*handleLoc*) (snd $2), $4) }
+| ASM LPAREN string_constant RPAREN SEMICOLON
+ { GLOBASM (fst $3, (*handleLoc*) $1) }
+| pragma { $1 }
+/* (* Old-style function prototype. This should be somewhere else, like in
+ * "declaration". For now we keep it at global scope only because in local
+ * scope it looks too much like a function call *) */
+| IDENT LPAREN old_parameter_list_ne RPAREN old_pardef_list SEMICOLON
+ { (* Convert pardecl to new style *)
+ let pardecl, isva = doOldParDecl $3 $5 in
+ (* Make the function declarator *)
+ doDeclaration ((*handleLoc*) (snd $1)) []
+ [((fst $1, PROTO(JUSTBASE, pardecl,isva), [], cabslu),
+ NO_INIT)]
+ }
+/* (* Old style function prototype, but without any arguments *) */
+| IDENT LPAREN RPAREN SEMICOLON
+ { (* Make the function declarator *)
+ doDeclaration ((*handleLoc*)(snd $1)) []
+ [((fst $1, PROTO(JUSTBASE,[],false), [], cabslu),
+ NO_INIT)]
+ }
+/* | location error SEMICOLON { PRAGMA (VARIABLE "parse_error", $1) } */
+;
+
+id_or_typename:
+ IDENT {fst $1}
+| NAMED_TYPE {fst $1}
+;
+
+maybecomma:
+ /* empty */ { () }
+| COMMA { () }
+;
+
+/* *** Expressions *** */
+
+primary_expression: /*(* 6.5.1. *)*/
+| IDENT
+ {VARIABLE (fst $1), snd $1}
+| constant
+ {CONSTANT (fst $1), snd $1}
+| paren_comma_expression
+ {PAREN (smooth_expression (fst $1)), snd $1}
+| LPAREN block RPAREN
+ { GNU_BODY (fst3 $2), $1 }
+;
+
+postfix_expression: /*(* 6.5.2 *)*/
+| primary_expression
+ { $1 }
+| postfix_expression bracket_comma_expression
+ {INDEX (fst $1, smooth_expression $2), snd $1}
+| postfix_expression LPAREN arguments RPAREN
+ {CALL (fst $1, $3), snd $1}
+| BUILTIN_VA_ARG LPAREN expression COMMA type_name RPAREN
+ { let b, d = $5 in
+ CALL (VARIABLE "__builtin_va_arg",
+ [fst $3; TYPE_SIZEOF (b, d)]), $1 }
+| BUILTIN_TYPES_COMPAT LPAREN type_name COMMA type_name RPAREN
+ { let b1,d1 = $3 in
+ let b2,d2 = $5 in
+ CALL (VARIABLE "__builtin_types_compatible_p",
+ [TYPE_SIZEOF(b1,d1); TYPE_SIZEOF(b2,d2)]), $1 }
+| BUILTIN_OFFSETOF LPAREN type_name COMMA offsetof_member_designator RPAREN
+ { transformOffsetOf $3 $5, $1 }
+| postfix_expression DOT id_or_typename
+ {MEMBEROF (fst $1, $3), snd $1}
+| postfix_expression ARROW id_or_typename
+ {MEMBEROFPTR (fst $1, $3), snd $1}
+| postfix_expression PLUS_PLUS
+ {UNARY (POSINCR, fst $1), snd $1}
+| postfix_expression MINUS_MINUS
+ {UNARY (POSDECR, fst $1), snd $1}
+/* (* We handle GCC constructor expressions *) */
+| LPAREN type_name RPAREN LBRACE initializer_list_opt RBRACE
+ { CAST($2, COMPOUND_INIT $5), $1 }
+;
+
+offsetof_member_designator: /* GCC extension for __builtin_offsetof */
+| id_or_typename
+ { VARIABLE ($1) }
+| offsetof_member_designator DOT IDENT
+ { MEMBEROF ($1, fst $3) }
+| offsetof_member_designator bracket_comma_expression
+ { INDEX ($1, smooth_expression $2) }
+;
+
+unary_expression: /*(* 6.5.3 *)*/
+| postfix_expression
+ { $1 }
+| PLUS_PLUS unary_expression
+ {UNARY (PREINCR, fst $2), $1}
+| MINUS_MINUS unary_expression
+ {UNARY (PREDECR, fst $2), $1}
+| SIZEOF unary_expression
+ {EXPR_SIZEOF (fst $2), $1}
+| SIZEOF LPAREN type_name RPAREN
+ {let b, d = $3 in TYPE_SIZEOF (b, d), $1}
+| ALIGNOF unary_expression
+ {EXPR_ALIGNOF (fst $2), $1}
+| ALIGNOF LPAREN type_name RPAREN
+ {let b, d = $3 in TYPE_ALIGNOF (b, d), $1}
+| PLUS cast_expression
+ {UNARY (PLUS, fst $2), $1}
+| MINUS cast_expression
+ {UNARY (MINUS, fst $2), $1}
+| STAR cast_expression
+ {UNARY (MEMOF, fst $2), $1}
+| AND cast_expression
+ {UNARY (ADDROF, fst $2), $1}
+| EXCLAM cast_expression
+ {UNARY (NOT, fst $2), $1}
+| TILDE cast_expression
+ {UNARY (BNOT, fst $2), $1}
+| AND_AND IDENT { LABELADDR (fst $2), $1 }
+;
+
+cast_expression: /*(* 6.5.4 *)*/
+| unary_expression
+ { $1 }
+| LPAREN type_name RPAREN cast_expression
+ { CAST($2, SINGLE_INIT (fst $4)), $1 }
+;
+
+multiplicative_expression: /*(* 6.5.5 *)*/
+| cast_expression
+ { $1 }
+| multiplicative_expression STAR cast_expression
+ {BINARY(MUL, fst $1, fst $3), snd $1}
+| multiplicative_expression SLASH cast_expression
+ {BINARY(DIV, fst $1, fst $3), snd $1}
+| multiplicative_expression PERCENT cast_expression
+ {BINARY(MOD, fst $1, fst $3), snd $1}
+;
+
+additive_expression: /*(* 6.5.6 *)*/
+| multiplicative_expression
+ { $1 }
+| additive_expression PLUS multiplicative_expression
+ {BINARY(ADD, fst $1, fst $3), snd $1}
+| additive_expression MINUS multiplicative_expression
+ {BINARY(SUB, fst $1, fst $3), snd $1}
+;
+
+shift_expression: /*(* 6.5.7 *)*/
+| additive_expression
+ { $1 }
+| shift_expression INF_INF additive_expression
+ {BINARY(SHL, fst $1, fst $3), snd $1}
+| shift_expression SUP_SUP additive_expression
+ {BINARY(SHR, fst $1, fst $3), snd $1}
+;
+
+
+relational_expression: /*(* 6.5.8 *)*/
+| shift_expression
+ { $1 }
+| relational_expression INF shift_expression
+ {BINARY(LT, fst $1, fst $3), snd $1}
+| relational_expression SUP shift_expression
+ {BINARY(GT, fst $1, fst $3), snd $1}
+| relational_expression INF_EQ shift_expression
+ {BINARY(LE, fst $1, fst $3), snd $1}
+| relational_expression SUP_EQ shift_expression
+ {BINARY(GE, fst $1, fst $3), snd $1}
+;
+
+equality_expression: /*(* 6.5.9 *)*/
+| relational_expression
+ { $1 }
+| equality_expression EQ_EQ relational_expression
+ {BINARY(EQ, fst $1, fst $3), snd $1}
+| equality_expression EXCLAM_EQ relational_expression
+ {BINARY(NE, fst $1, fst $3), snd $1}
+;
+
+
+bitwise_and_expression: /*(* 6.5.10 *)*/
+| equality_expression
+ { $1 }
+| bitwise_and_expression AND equality_expression
+ {BINARY(BAND, fst $1, fst $3), snd $1}
+;
+
+bitwise_xor_expression: /*(* 6.5.11 *)*/
+| bitwise_and_expression
+ { $1 }
+| bitwise_xor_expression CIRC bitwise_and_expression
+ {BINARY(XOR, fst $1, fst $3), snd $1}
+;
+
+bitwise_or_expression: /*(* 6.5.12 *)*/
+| bitwise_xor_expression
+ { $1 }
+| bitwise_or_expression PIPE bitwise_xor_expression
+ {BINARY(BOR, fst $1, fst $3), snd $1}
+;
+
+logical_and_expression: /*(* 6.5.13 *)*/
+| bitwise_or_expression
+ { $1 }
+| logical_and_expression AND_AND bitwise_or_expression
+ {BINARY(AND, fst $1, fst $3), snd $1}
+;
+
+logical_or_expression: /*(* 6.5.14 *)*/
+| logical_and_expression
+ { $1 }
+| logical_or_expression PIPE_PIPE logical_and_expression
+ {BINARY(OR, fst $1, fst $3), snd $1}
+;
+
+conditional_expression: /*(* 6.5.15 *)*/
+| logical_or_expression
+ { $1 }
+| logical_or_expression QUEST opt_expression COLON conditional_expression
+ {QUESTION (fst $1, $3, fst $5), snd $1}
+;
+
+/*(* The C spec says that left-hand sides of assignment expressions are unary
+ * expressions. GCC allows cast expressions in there ! *)*/
+
+assignment_expression: /*(* 6.5.16 *)*/
+| conditional_expression
+ { $1 }
+| cast_expression EQ assignment_expression
+ {BINARY(ASSIGN, fst $1, fst $3), snd $1}
+| cast_expression PLUS_EQ assignment_expression
+ {BINARY(ADD_ASSIGN, fst $1, fst $3), snd $1}
+| cast_expression MINUS_EQ assignment_expression
+ {BINARY(SUB_ASSIGN, fst $1, fst $3), snd $1}
+| cast_expression STAR_EQ assignment_expression
+ {BINARY(MUL_ASSIGN, fst $1, fst $3), snd $1}
+| cast_expression SLASH_EQ assignment_expression
+ {BINARY(DIV_ASSIGN, fst $1, fst $3), snd $1}
+| cast_expression PERCENT_EQ assignment_expression
+ {BINARY(MOD_ASSIGN, fst $1, fst $3), snd $1}
+| cast_expression AND_EQ assignment_expression
+ {BINARY(BAND_ASSIGN, fst $1, fst $3), snd $1}
+| cast_expression PIPE_EQ assignment_expression
+ {BINARY(BOR_ASSIGN, fst $1, fst $3), snd $1}
+| cast_expression CIRC_EQ assignment_expression
+ {BINARY(XOR_ASSIGN, fst $1, fst $3), snd $1}
+| cast_expression INF_INF_EQ assignment_expression
+ {BINARY(SHL_ASSIGN, fst $1, fst $3), snd $1}
+| cast_expression SUP_SUP_EQ assignment_expression
+ {BINARY(SHR_ASSIGN, fst $1, fst $3), snd $1}
+;
+
+expression: /*(* 6.5.17 *)*/
+ assignment_expression
+ { $1 }
+;
+
+
+constant:
+ CST_INT {CONST_INT (fst $1), snd $1}
+| CST_FLOAT {CONST_FLOAT (fst $1), snd $1}
+| CST_CHAR {CONST_CHAR (fst $1), snd $1}
+| CST_WCHAR {CONST_WCHAR (fst $1), snd $1}
+| string_constant {CONST_STRING (fst $1), snd $1}
+| wstring_list {CONST_WSTRING (fst $1), snd $1}
+;
+
+string_constant:
+/* Now that we know this constant isn't part of a wstring, convert it
+ back to a string for easy viewing. */
+ string_list {
+ let queue, location = $1 in
+ let buffer = Buffer.create (Queue.length queue) in
+ Queue.iter
+ (List.iter
+ (fun value ->
+ let char = int64_to_char value in
+ Buffer.add_char buffer char))
+ queue;
+ Buffer.contents buffer, location
+ }
+;
+one_string_constant:
+/* Don't concat multiple strings. For asm templates. */
+ CST_STRING {intlist_to_string (fst $1) }
+;
+string_list:
+ one_string {
+ let queue = Queue.create () in
+ Queue.add (fst $1) queue;
+ queue, snd $1
+ }
+| string_list one_string {
+ Queue.add (fst $2) (fst $1);
+ $1
+ }
+;
+
+wstring_list:
+ CST_WSTRING { $1 }
+| wstring_list one_string { (fst $1) @ (fst $2), snd $1 }
+| wstring_list CST_WSTRING { (fst $1) @ (fst $2), snd $1 }
+/* Only the first string in the list needs an L, so L"a" "b" is the same
+ * as L"ab" or L"a" L"b". */
+
+one_string:
+ CST_STRING {$1}
+| FUNCTION__ {(Cabshelper.explodeStringToInts
+ !currentFunctionName), $1}
+| PRETTY_FUNCTION__ {(Cabshelper.explodeStringToInts
+ !currentFunctionName), $1}
+;
+
+init_expression:
+ expression { SINGLE_INIT (fst $1) }
+| LBRACE initializer_list_opt RBRACE
+ { COMPOUND_INIT $2}
+
+initializer_list: /* ISO 6.7.8. Allow a trailing COMMA */
+ initializer { [$1] }
+| initializer COMMA initializer_list_opt { $1 :: $3 }
+;
+initializer_list_opt:
+ /* empty */ { [] }
+| initializer_list { $1 }
+;
+initializer:
+ init_designators eq_opt init_expression { ($1, $3) }
+| gcc_init_designators init_expression { ($1, $2) }
+| init_expression { (NEXT_INIT, $1) }
+;
+eq_opt:
+ EQ { () }
+ /*(* GCC allows missing = *)*/
+| /*(* empty *)*/ { () }
+;
+init_designators:
+ DOT id_or_typename init_designators_opt { INFIELD_INIT($2, $3) }
+| LBRACKET expression RBRACKET init_designators_opt
+ { ATINDEX_INIT(fst $2, $4) }
+| LBRACKET expression ELLIPSIS expression RBRACKET
+ { ATINDEXRANGE_INIT(fst $2, fst $4) }
+;
+init_designators_opt:
+ /* empty */ { NEXT_INIT }
+| init_designators { $1 }
+;
+
+gcc_init_designators: /*(* GCC supports these strange things *)*/
+ id_or_typename COLON { INFIELD_INIT($1, NEXT_INIT) }
+;
+
+arguments:
+ /* empty */ { [] }
+| comma_expression { fst $1 }
+;
+
+opt_expression:
+ /* empty */
+ {NOTHING}
+| comma_expression
+ {smooth_expression (fst $1)}
+;
+
+comma_expression:
+ expression {[fst $1], snd $1}
+| expression COMMA comma_expression { fst $1 :: fst $3, snd $1 }
+| error COMMA comma_expression { $3 }
+;
+
+comma_expression_opt:
+ /* empty */ { NOTHING }
+| comma_expression { smooth_expression (fst $1) }
+;
+
+paren_comma_expression:
+ LPAREN comma_expression RPAREN { $2 }
+| LPAREN error RPAREN { [], $1 }
+;
+
+bracket_comma_expression:
+ LBRACKET comma_expression RBRACKET { fst $2 }
+| LBRACKET error RBRACKET { [] }
+;
+
+
+/*** statements ***/
+block: /* ISO 6.8.2 */
+ block_begin local_labels block_attrs block_element_list RBRACE
+ {!pop_context();
+ { blabels = $2;
+ battrs = $3;
+ bstmts = $4 },
+ $1, $5
+ }
+| error location RBRACE { { blabels = [];
+ battrs = [];
+ bstmts = [] },
+ $2, $3
+ }
+;
+block_begin:
+ LBRACE {!push_context (); $1}
+;
+
+block_attrs:
+ /* empty */ { [] }
+| BLOCKATTRIBUTE paren_attr_list_ne
+ { [("__blockattribute__", $2)] }
+;
+
+/* statements and declarations in a block, in any order (for C99 support) */
+block_element_list:
+ /* empty */ { [] }
+| declaration block_element_list { DEFINITION($1) :: $2 }
+| statement block_element_list { $1 :: $2 }
+/*(* GCC accepts a label at the end of a block *)*/
+| IDENT COLON { [ LABEL (fst $1, NOP (snd $1),
+ snd $1)] }
+| pragma block_element_list { $2 }
+;
+
+local_labels:
+ /* empty */ { [] }
+| LABEL__ local_label_names SEMICOLON local_labels { $2 @ $4 }
+;
+local_label_names:
+ IDENT { [ fst $1 ] }
+| IDENT COMMA local_label_names { fst $1 :: $3 }
+;
+
+
+
+statement:
+ SEMICOLON {NOP ((*handleLoc*) $1) }
+| comma_expression SEMICOLON
+ {COMPUTATION (smooth_expression (fst $1), (*handleLoc*)(snd $1))}
+| block {BLOCK (fst3 $1, (*handleLoc*)(snd3 $1))}
+| IF paren_comma_expression statement %prec IF
+ {IF (smooth_expression (fst $2), $3, NOP $1, $1)}
+| IF paren_comma_expression statement ELSE statement
+ {IF (smooth_expression (fst $2), $3, $5, (*handleLoc*) $1)}
+| SWITCH paren_comma_expression statement
+ {SWITCH (smooth_expression (fst $2), $3, (*handleLoc*) $1)}
+| WHILE paren_comma_expression statement
+ {WHILE (smooth_expression (fst $2), $3, (*handleLoc*) $1)}
+| DO statement WHILE paren_comma_expression SEMICOLON
+ {DOWHILE (smooth_expression (fst $4), $2, (*handleLoc*) $1)}
+| FOR LPAREN for_clause opt_expression
+ SEMICOLON opt_expression RPAREN statement
+ {FOR ($3, $4, $6, $8, (*handleLoc*) $1)}
+| IDENT COLON attribute_nocv_list statement
+ {(* The only attribute that should appear here
+ is "unused". For now, we drop this on the
+ floor, since unused labels are usually
+ removed anyways by Rmtmps. *)
+ LABEL (fst $1, $4, (snd $1))}
+| CASE expression COLON statement
+ {CASE (fst $2, $4, (*handleLoc*) $1)}
+| CASE expression ELLIPSIS expression COLON statement
+ {CASERANGE (fst $2, fst $4, $6, (*handleLoc*) $1)}
+| DEFAULT COLON
+ {DEFAULT (NOP $1, (*handleLoc*) $1)}
+| RETURN SEMICOLON {RETURN (NOTHING, (*handleLoc*) $1)}
+| RETURN comma_expression SEMICOLON
+ {RETURN (smooth_expression (fst $2), (*handleLoc*) $1)}
+| BREAK SEMICOLON {BREAK ((*handleLoc*) $1)}
+| CONTINUE SEMICOLON {CONTINUE ((*handleLoc*) $1)}
+| GOTO IDENT SEMICOLON
+ {GOTO (fst $2, (*handleLoc*) $1)}
+| GOTO STAR comma_expression SEMICOLON
+ { COMPGOTO (smooth_expression (fst $3), (*handleLoc*) $1) }
+| ASM asmattr LPAREN asmtemplate asmoutputs RPAREN SEMICOLON
+ { ASM ($2, $4, $5, (*handleLoc*) $1) }
+| MSASM { ASM ([], [fst $1], None, (*handleLoc*)(snd $1))}
+| TRY block EXCEPT paren_comma_expression block
+ { let b, _, _ = $2 in
+ let h, _, _ = $5 in
+ if not !msvcMode then
+ parse_error "try/except in GCC code";
+ TRY_EXCEPT (b, COMMA (fst $4), h, (*handleLoc*) $1) }
+| TRY block FINALLY block
+ { let b, _, _ = $2 in
+ let h, _, _ = $4 in
+ if not !msvcMode then
+ parse_error "try/finally in GCC code";
+ TRY_FINALLY (b, h, (*handleLoc*) $1) }
+
+| error location SEMICOLON { (NOP $2)}
+;
+
+
+for_clause:
+ opt_expression SEMICOLON { FC_EXP $1 }
+| declaration { FC_DECL $1 }
+;
+
+declaration: /* ISO 6.7.*/
+ decl_spec_list init_declarator_list SEMICOLON
+ { doDeclaration ((*handleLoc*)(snd $1)) (fst $1) $2 }
+| decl_spec_list SEMICOLON
+ { doDeclaration ((*handleLoc*)(snd $1)) (fst $1) [] }
+;
+init_declarator_list: /* ISO 6.7 */
+ init_declarator { [$1] }
+| init_declarator COMMA init_declarator_list { $1 :: $3 }
+
+;
+init_declarator: /* ISO 6.7 */
+ declarator { ($1, NO_INIT) }
+| declarator EQ init_expression
+ { ($1, $3) }
+;
+
+decl_spec_list: /* ISO 6.7 */
+ /* ISO 6.7.1 */
+| TYPEDEF decl_spec_list_opt { SpecTypedef :: $2, $1 }
+| EXTERN decl_spec_list_opt { SpecStorage EXTERN :: $2, $1 }
+| STATIC decl_spec_list_opt { SpecStorage STATIC :: $2, $1 }
+| AUTO decl_spec_list_opt { SpecStorage AUTO :: $2, $1 }
+| REGISTER decl_spec_list_opt { SpecStorage REGISTER :: $2, $1}
+ /* ISO 6.7.2 */
+| type_spec decl_spec_list_opt_no_named { SpecType (fst $1) :: $2, snd $1 }
+ /* ISO 6.7.4 */
+| INLINE decl_spec_list_opt { SpecInline :: $2, $1 }
+| cvspec decl_spec_list_opt { (fst $1) :: $2, snd $1 }
+| attribute_nocv decl_spec_list_opt { SpecAttr (fst $1) :: $2, snd $1 }
+;
+/* (* In most cases if we see a NAMED_TYPE we must shift it. Thus we declare
+ * NAMED_TYPE to have right associativity *) */
+decl_spec_list_opt:
+ /* empty */ { [] } %prec NAMED_TYPE
+| decl_spec_list { fst $1 }
+;
+/* (* We add this separate rule to handle the special case when an appearance
+ * of NAMED_TYPE should not be considered as part of the specifiers but as
+ * part of the declarator. IDENT has higher precedence than NAMED_TYPE *)
+ */
+decl_spec_list_opt_no_named:
+ /* empty */ { [] } %prec IDENT
+| decl_spec_list { fst $1 }
+;
+type_spec: /* ISO 6.7.2 */
+ VOID { Tvoid, $1}
+| UNDERSCORE_BOOL { T_Bool, $1 }
+| CHAR { Tchar, $1 }
+| SHORT { Tshort, $1 }
+| INT { Tint, $1 }
+| LONG { Tlong, $1 }
+| INT64 { Tint64, $1 }
+| FLOAT { Tfloat, $1 }
+| DOUBLE { Tdouble, $1 }
+| SIGNED { Tsigned, $1 }
+| UNSIGNED { Tunsigned, $1 }
+| STRUCT id_or_typename
+ { Tstruct ($2, None, []), $1 }
+| STRUCT just_attributes id_or_typename
+ { Tstruct ($3, None, $2), $1 }
+| STRUCT id_or_typename LBRACE struct_decl_list RBRACE
+ { Tstruct ($2, Some $4, []), $1 }
+| STRUCT LBRACE struct_decl_list RBRACE
+ { Tstruct ("", Some $3, []), $1 }
+| STRUCT just_attributes id_or_typename LBRACE struct_decl_list RBRACE
+ { Tstruct ($3, Some $5, $2), $1 }
+| STRUCT just_attributes LBRACE struct_decl_list RBRACE
+ { Tstruct ("", Some $4, $2), $1 }
+| UNION id_or_typename
+ { Tunion ($2, None, []), $1 }
+| UNION id_or_typename LBRACE struct_decl_list RBRACE
+ { Tunion ($2, Some $4, []), $1 }
+| UNION LBRACE struct_decl_list RBRACE
+ { Tunion ("", Some $3, []), $1 }
+| UNION just_attributes id_or_typename LBRACE struct_decl_list RBRACE
+ { Tunion ($3, Some $5, $2), $1 }
+| UNION just_attributes LBRACE struct_decl_list RBRACE
+ { Tunion ("", Some $4, $2), $1 }
+| ENUM id_or_typename
+ { Tenum ($2, None, []), $1 }
+| ENUM id_or_typename LBRACE enum_list maybecomma RBRACE
+ { Tenum ($2, Some $4, []), $1 }
+| ENUM LBRACE enum_list maybecomma RBRACE
+ { Tenum ("", Some $3, []), $1 }
+| ENUM just_attributes id_or_typename LBRACE enum_list maybecomma RBRACE
+ { Tenum ($3, Some $5, $2), $1 }
+| ENUM just_attributes LBRACE enum_list maybecomma RBRACE
+ { Tenum ("", Some $4, $2), $1 }
+| NAMED_TYPE { Tnamed (fst $1), snd $1 }
+| TYPEOF LPAREN expression RPAREN { TtypeofE (fst $3), $1 }
+| TYPEOF LPAREN type_name RPAREN { let s, d = $3 in
+ TtypeofT (s, d), $1 }
+;
+struct_decl_list: /* (* ISO 6.7.2. Except that we allow empty structs. We
+ * also allow missing field names. *)
+ */
+ /* empty */ { [] }
+| decl_spec_list SEMICOLON struct_decl_list
+ { (fst $1,
+ [(missingFieldDecl, None)]) :: $3 }
+/*(* GCC allows extra semicolons *)*/
+| SEMICOLON struct_decl_list
+ { $2 }
+| decl_spec_list field_decl_list SEMICOLON struct_decl_list
+ { (fst $1, $2)
+ :: $4 }
+/*(* MSVC allows pragmas in strange places *)*/
+| pragma struct_decl_list { $2 }
+
+| error SEMICOLON struct_decl_list
+ { $3 }
+;
+field_decl_list: /* (* ISO 6.7.2 *) */
+ field_decl { [$1] }
+| field_decl COMMA field_decl_list { $1 :: $3 }
+;
+field_decl: /* (* ISO 6.7.2. Except that we allow unnamed fields. *) */
+| declarator { ($1, None) }
+| declarator COLON expression attributes
+ { let (n,decl,al,loc) = $1 in
+ let al' = al @ $4 in
+ ((n,decl,al',loc), Some (fst $3)) }
+| COLON expression { (missingFieldDecl, Some (fst $2)) }
+;
+
+enum_list: /* (* ISO 6.7.2.2 *) */
+ enumerator {[$1]}
+| enum_list COMMA enumerator {$1 @ [$3]}
+| enum_list COMMA error { $1 }
+;
+enumerator:
+ IDENT {(fst $1, NOTHING, snd $1)}
+| IDENT EQ expression {(fst $1, fst $3, snd $1)}
+;
+
+
+declarator: /* (* ISO 6.7.5. Plus Microsoft declarators.*) */
+ pointer_opt direct_decl attributes_with_asm
+ { let (n, decl) = $2 in
+ (n, applyPointer (fst $1) decl, $3, (snd $1)) }
+;
+
+
+direct_decl: /* (* ISO 6.7.5 *) */
+ /* (* We want to be able to redefine named
+ * types as variable names *) */
+| id_or_typename { ($1, JUSTBASE) }
+
+| LPAREN attributes declarator RPAREN
+ { let (n,decl,al,loc) = $3 in
+ (n, PARENTYPE($2,decl,al)) }
+
+| direct_decl LBRACKET attributes comma_expression_opt RBRACKET
+ { let (n, decl) = $1 in
+ (n, ARRAY(decl, $3, $4)) }
+| direct_decl LBRACKET attributes error RBRACKET
+ { let (n, decl) = $1 in
+ (n, ARRAY(decl, $3, NOTHING)) }
+| direct_decl parameter_list_startscope rest_par_list RPAREN
+ { let (n, decl) = $1 in
+ let (params, isva) = $3 in
+ !pop_context ();
+ (n, PROTO(decl, params, isva))
+ }
+;
+parameter_list_startscope:
+ LPAREN { !push_context () }
+;
+rest_par_list:
+| /* empty */ { ([], false) }
+| parameter_decl rest_par_list1 { let (params, isva) = $2 in
+ ($1 :: params, isva)
+ }
+;
+rest_par_list1:
+ /* empty */ { ([], false) }
+| COMMA ELLIPSIS { ([], true) }
+| COMMA parameter_decl rest_par_list1 { let (params, isva) = $3 in
+ ($2 :: params, isva)
+ }
+;
+
+
+parameter_decl: /* (* ISO 6.7.5 *) */
+ decl_spec_list declarator { (fst $1, $2) }
+| decl_spec_list abstract_decl { let d, a = $2 in
+ (fst $1, ("", d, a, cabslu)) }
+| decl_spec_list { (fst $1, ("", JUSTBASE, [], cabslu)) }
+| LPAREN parameter_decl RPAREN { $2 }
+;
+
+/* (* Old style prototypes. Like a declarator *) */
+old_proto_decl:
+ pointer_opt direct_old_proto_decl { let (n, decl, a) = $2 in
+ (n, applyPointer (fst $1) decl,
+ a, snd $1)
+ }
+
+;
+
+direct_old_proto_decl:
+ direct_decl LPAREN old_parameter_list_ne RPAREN old_pardef_list
+ { let par_decl, isva = doOldParDecl $3 $5 in
+ let n, decl = $1 in
+ (n, PROTO(decl, par_decl, isva), [])
+ }
+| direct_decl LPAREN RPAREN
+ { let n, decl = $1 in
+ (n, PROTO(decl, [], false), [])
+ }
+
+/* (* appears sometimesm but generates a shift-reduce conflict. *)
+| LPAREN STAR direct_decl LPAREN old_parameter_list_ne RPAREN RPAREN LPAREN RPAREN old_pardef_list
+ { let par_decl, isva
+ = doOldParDecl $5 $10 in
+ let n, decl = $3 in
+ (n, PROTO(decl, par_decl, isva), [])
+ }
+*/
+;
+
+old_parameter_list_ne:
+| IDENT { [fst $1] }
+| IDENT COMMA old_parameter_list_ne { let rest = $3 in
+ (fst $1 :: rest) }
+;
+
+old_pardef_list:
+ /* empty */ { ([], false) }
+| decl_spec_list old_pardef SEMICOLON ELLIPSIS
+ { ([(fst $1, $2)], true) }
+| decl_spec_list old_pardef SEMICOLON old_pardef_list
+ { let rest, isva = $4 in
+ ((fst $1, $2) :: rest, isva)
+ }
+;
+
+old_pardef:
+ declarator { [$1] }
+| declarator COMMA old_pardef { $1 :: $3 }
+| error { [] }
+;
+
+
+pointer: /* (* ISO 6.7.5 *) */
+ STAR attributes pointer_opt { $2 :: fst $3, $1 }
+;
+pointer_opt:
+ /**/ { let l = currentLoc () in
+ ([], l) }
+| pointer { $1 }
+;
+
+type_name: /* (* ISO 6.7.6 *) */
+ decl_spec_list abstract_decl { let d, a = $2 in
+ if a <> [] then begin
+ parse_error "attributes in type name";
+ raise Parsing.Parse_error
+ end;
+ (fst $1, d)
+ }
+| decl_spec_list { (fst $1, JUSTBASE) }
+;
+abstract_decl: /* (* ISO 6.7.6. *) */
+ pointer_opt abs_direct_decl attributes { applyPointer (fst $1) $2, $3 }
+| pointer { applyPointer (fst $1) JUSTBASE, [] }
+;
+
+abs_direct_decl: /* (* ISO 6.7.6. We do not support optional declarator for
+ * functions. Plus Microsoft attributes. See the
+ * discussion for declarator. *) */
+| LPAREN attributes abstract_decl RPAREN
+ { let d, a = $3 in
+ PARENTYPE ($2, d, a)
+ }
+
+| LPAREN error RPAREN
+ { JUSTBASE }
+
+| abs_direct_decl_opt LBRACKET comma_expression_opt RBRACKET
+ { ARRAY($1, [], $3) }
+/*(* The next should be abs_direct_decl_opt but we get conflicts *)*/
+| abs_direct_decl parameter_list_startscope rest_par_list RPAREN
+ { let (params, isva) = $3 in
+ !pop_context ();
+ PROTO ($1, params, isva)
+ }
+;
+abs_direct_decl_opt:
+ abs_direct_decl { $1 }
+| /* empty */ { JUSTBASE }
+;
+function_def: /* (* ISO 6.9.1 *) */
+ function_def_start block
+ { let (loc, specs, decl) = $1 in
+ currentFunctionName := "<__FUNCTION__ used outside any functions>";
+ !pop_context (); (* The context pushed by
+ * announceFunctionName *)
+ doFunctionDef ((*handleLoc*) loc) (trd3 $2) specs decl (fst3 $2)
+ }
+
+
+function_def_start: /* (* ISO 6.9.1 *) */
+ decl_spec_list declarator
+ { announceFunctionName $2;
+ (snd $1, fst $1, $2)
+ }
+
+/* (* Old-style function prototype *) */
+| decl_spec_list old_proto_decl
+ { announceFunctionName $2;
+ (snd $1, fst $1, $2)
+ }
+/* (* New-style function that does not have a return type *) */
+| IDENT parameter_list_startscope rest_par_list RPAREN
+ { let (params, isva) = $3 in
+ let fdec =
+ (fst $1, PROTO(JUSTBASE, params, isva), [], snd $1) in
+ announceFunctionName fdec;
+ (* Default is int type *)
+ let defSpec = [SpecType Tint] in
+ (snd $1, defSpec, fdec)
+ }
+
+/* (* No return type and old-style parameter list *) */
+| IDENT LPAREN old_parameter_list_ne RPAREN old_pardef_list
+ { (* Convert pardecl to new style *)
+ let pardecl, isva = doOldParDecl $3 $5 in
+ (* Make the function declarator *)
+ let fdec = (fst $1,
+ PROTO(JUSTBASE, pardecl,isva),
+ [], snd $1) in
+ announceFunctionName fdec;
+ (* Default is int type *)
+ let defSpec = [SpecType Tint] in
+ (snd $1, defSpec, fdec)
+ }
+/* (* No return type and no parameters *) */
+| IDENT LPAREN RPAREN
+ { (* Make the function declarator *)
+ let fdec = (fst $1,
+ PROTO(JUSTBASE, [], false),
+ [], snd $1) in
+ announceFunctionName fdec;
+ (* Default is int type *)
+ let defSpec = [SpecType Tint] in
+ (snd $1, defSpec, fdec)
+ }
+;
+
+/* const/volatile as type specifier elements */
+cvspec:
+ CONST { SpecCV(CV_CONST), $1 }
+| VOLATILE { SpecCV(CV_VOLATILE), $1 }
+| RESTRICT { SpecCV(CV_RESTRICT), $1 }
+;
+
+/*** GCC attributes ***/
+attributes:
+ /* empty */ { []}
+| attribute attributes { fst $1 :: $2 }
+;
+
+/* (* In some contexts we can have an inline assembly to specify the name to
+ * be used for a global. We treat this as a name attribute *) */
+attributes_with_asm:
+ /* empty */ { [] }
+| attribute attributes_with_asm { fst $1 :: $2 }
+| ASM LPAREN string_constant RPAREN attributes
+ { ("__asm__",
+ [CONSTANT(CONST_STRING (fst $3))]) :: $5 }
+;
+
+/* things like __attribute__, but no const/volatile */
+attribute_nocv:
+ ATTRIBUTE LPAREN paren_attr_list RPAREN
+ { ("__attribute__", $3), $1 }
+/*(*
+| ATTRIBUTE_USED { ("__attribute__",
+ [ VARIABLE "used" ]), $1 }
+*)*/
+| DECLSPEC paren_attr_list_ne { ("__declspec", $2), $1 }
+| MSATTR { (fst $1, []), snd $1 }
+ /* ISO 6.7.3 */
+| THREAD { ("__thread",[]), $1 }
+;
+
+attribute_nocv_list:
+ /* empty */ { []}
+| attribute_nocv attribute_nocv_list { fst $1 :: $2 }
+;
+
+/* __attribute__ plus const/volatile */
+attribute:
+ attribute_nocv { $1 }
+| CONST { ("const", []), $1 }
+| RESTRICT { ("restrict",[]), $1 }
+| VOLATILE { ("volatile",[]), $1 }
+;
+
+/* (* sm: I need something that just includes __attribute__ and nothing more,
+ * to support them appearing between the 'struct' keyword and the type name.
+ * Actually, a declspec can appear there as well (on MSVC) *) */
+just_attribute:
+ ATTRIBUTE LPAREN paren_attr_list RPAREN
+ { ("__attribute__", $3) }
+| DECLSPEC paren_attr_list_ne { ("__declspec", $2) }
+;
+
+/* this can't be empty, b/c I folded that possibility into the calling
+ * productions to avoid some S/R conflicts */
+just_attributes:
+ just_attribute { [$1] }
+| just_attribute just_attributes { $1 :: $2 }
+;
+
+/** (* PRAGMAS and ATTRIBUTES *) ***/
+pragma:
+| PRAGMA_LINE { PRAGMA (fst $1, snd $1) }
+;
+
+/* (* We want to allow certain strange things that occur in pragmas, so we
+ * cannot use directly the language of expressions *) */
+primary_attr:
+ IDENT { VARIABLE (fst $1) }
+ /*(* The NAMED_TYPE here creates conflicts with IDENT *)*/
+| NAMED_TYPE { VARIABLE (fst $1) }
+| LPAREN attr RPAREN { $2 }
+| IDENT IDENT { CALL(VARIABLE (fst $1), [VARIABLE (fst $2)]) }
+| CST_INT { CONSTANT(CONST_INT (fst $1)) }
+| string_constant { CONSTANT(CONST_STRING (fst $1)) }
+ /*(* Const when it appears in
+ * attribute lists, is translated
+ * to aconst *)*/
+| CONST { VARIABLE "aconst" }
+
+| IDENT COLON CST_INT { VARIABLE (fst $1 ^ ":" ^ fst $3) }
+
+/*(* The following rule conflicts with the ? : attributes. We give it a very
+ * low priority *)*/
+| CST_INT COLON CST_INT { VARIABLE (fst $1 ^ ":" ^ fst $3) }
+
+| DEFAULT COLON CST_INT { VARIABLE ("default:" ^ fst $3) }
+
+ /*(** GCC allows this as an
+ * attribute for functions,
+ * synonim for noreturn **)*/
+| VOLATILE { VARIABLE ("__noreturn__") }
+;
+
+postfix_attr:
+ primary_attr { $1 }
+ /* (* use a VARIABLE "" so that the
+ * parentheses are printed *) */
+| IDENT LPAREN RPAREN { CALL(VARIABLE (fst $1), [VARIABLE ""]) }
+| IDENT paren_attr_list_ne { CALL(VARIABLE (fst $1), $2) }
+
+| postfix_attr ARROW id_or_typename {MEMBEROFPTR ($1, $3)}
+| postfix_attr DOT id_or_typename {MEMBEROF ($1, $3)}
+| postfix_attr LBRACKET attr RBRACKET {INDEX ($1, $3) }
+;
+
+/*(* Since in attributes we use both IDENT and NAMED_TYPE as indentifiers,
+ * that leads to conflicts for SIZEOF and ALIGNOF. In those cases we require
+ * that their arguments be expressions, not attributes *)*/
+unary_attr:
+ postfix_attr { $1 }
+| SIZEOF unary_expression {EXPR_SIZEOF (fst $2) }
+| SIZEOF LPAREN type_name RPAREN
+ {let b, d = $3 in TYPE_SIZEOF (b, d)}
+
+| ALIGNOF unary_expression {EXPR_ALIGNOF (fst $2) }
+| ALIGNOF LPAREN type_name RPAREN {let b, d = $3 in TYPE_ALIGNOF (b, d)}
+| PLUS cast_attr {UNARY (PLUS, $2)}
+| MINUS cast_attr {UNARY (MINUS, $2)}
+| STAR cast_attr {UNARY (MEMOF, $2)}
+| AND cast_attr
+ {UNARY (ADDROF, $2)}
+| EXCLAM cast_attr {UNARY (NOT, $2)}
+| TILDE cast_attr {UNARY (BNOT, $2)}
+;
+
+cast_attr:
+ unary_attr { $1 }
+;
+
+multiplicative_attr:
+ cast_attr { $1 }
+| multiplicative_attr STAR cast_attr {BINARY(MUL ,$1 , $3)}
+| multiplicative_attr SLASH cast_attr {BINARY(DIV ,$1 , $3)}
+| multiplicative_attr PERCENT cast_attr {BINARY(MOD ,$1 , $3)}
+;
+
+
+additive_attr:
+ multiplicative_attr { $1 }
+| additive_attr PLUS multiplicative_attr {BINARY(ADD ,$1 , $3)}
+| additive_attr MINUS multiplicative_attr {BINARY(SUB ,$1 , $3)}
+;
+
+shift_attr:
+ additive_attr { $1 }
+| shift_attr INF_INF additive_attr {BINARY(SHL ,$1 , $3)}
+| shift_attr SUP_SUP additive_attr {BINARY(SHR ,$1 , $3)}
+;
+
+relational_attr:
+ shift_attr { $1 }
+| relational_attr INF shift_attr {BINARY(LT ,$1 , $3)}
+| relational_attr SUP shift_attr {BINARY(GT ,$1 , $3)}
+| relational_attr INF_EQ shift_attr {BINARY(LE ,$1 , $3)}
+| relational_attr SUP_EQ shift_attr {BINARY(GE ,$1 , $3)}
+;
+
+equality_attr:
+ relational_attr { $1 }
+| equality_attr EQ_EQ relational_attr {BINARY(EQ ,$1 , $3)}
+| equality_attr EXCLAM_EQ relational_attr {BINARY(NE ,$1 , $3)}
+;
+
+
+bitwise_and_attr:
+ equality_attr { $1 }
+| bitwise_and_attr AND equality_attr {BINARY(BAND ,$1 , $3)}
+;
+
+bitwise_xor_attr:
+ bitwise_and_attr { $1 }
+| bitwise_xor_attr CIRC bitwise_and_attr {BINARY(XOR ,$1 , $3)}
+;
+
+bitwise_or_attr:
+ bitwise_xor_attr { $1 }
+| bitwise_or_attr PIPE bitwise_xor_attr {BINARY(BOR ,$1 , $3)}
+;
+
+logical_and_attr:
+ bitwise_or_attr { $1 }
+| logical_and_attr AND_AND bitwise_or_attr {BINARY(AND ,$1 , $3)}
+;
+
+logical_or_attr:
+ logical_and_attr { $1 }
+| logical_or_attr PIPE_PIPE logical_and_attr {BINARY(OR ,$1 , $3)}
+;
+
+conditional_attr:
+ logical_or_attr { $1 }
+/* This is in conflict for now */
+| logical_or_attr QUEST conditional_attr COLON conditional_attr
+ { QUESTION($1, $3, $5) }
+
+
+attr: conditional_attr { $1 }
+;
+
+attr_list_ne:
+| attr { [$1] }
+| attr COMMA attr_list_ne { $1 :: $3 }
+| error COMMA attr_list_ne { $3 }
+;
+attr_list:
+ /* empty */ { [] }
+| attr_list_ne { $1 }
+;
+paren_attr_list_ne:
+ LPAREN attr_list_ne RPAREN { $2 }
+| LPAREN error RPAREN { [] }
+;
+paren_attr_list:
+ LPAREN attr_list RPAREN { $2 }
+| LPAREN error RPAREN { [] }
+;
+/*** GCC ASM instructions ***/
+asmattr:
+ /* empty */ { [] }
+| VOLATILE asmattr { ("volatile", []) :: $2 }
+| CONST asmattr { ("const", []) :: $2 }
+;
+asmtemplate:
+ one_string_constant { [$1] }
+| one_string_constant asmtemplate { $1 :: $2 }
+;
+asmoutputs:
+ /* empty */ { None }
+| COLON asmoperands asminputs
+ { let (ins, clobs) = $3 in
+ Some {aoutputs = $2; ainputs = ins; aclobbers = clobs} }
+;
+asmoperands:
+ /* empty */ { [] }
+| asmoperandsne { List.rev $1 }
+;
+asmoperandsne:
+ asmoperand { [$1] }
+| asmoperandsne COMMA asmoperand { $3 :: $1 }
+;
+asmoperand:
+ asmopname string_constant LPAREN expression RPAREN { ($1, fst $2, fst $4) }
+| asmopname string_constant LPAREN error RPAREN { ($1, fst $2, NOTHING ) }
+;
+asminputs:
+ /* empty */ { ([], []) }
+| COLON asmoperands asmclobber
+ { ($2, $3) }
+;
+asmopname:
+ /* empty */ { None }
+| LBRACKET IDENT RBRACKET { Some (fst $2) }
+;
+
+asmclobber:
+ /* empty */ { [] }
+| COLON asmcloberlst_ne { $2 }
+;
+asmcloberlst_ne:
+ one_string_constant { [$1] }
+| one_string_constant COMMA asmcloberlst_ne { $1 :: $3 }
+;
+
+%%
+
+
+
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Renaming of identifiers *)
+
+open C
+open Cutil
+
+module StringSet = Set.Make(String)
+
+type rename_env = {
+ re_id: ident IdentMap.t;
+ re_used: StringSet.t
+}
+
+let empty_env = { re_id = IdentMap.empty; re_used = StringSet.empty }
+
+(* For public global identifiers, we must keep their names *)
+
+let enter_global env id =
+ { re_id = IdentMap.add id id env.re_id;
+ re_used = StringSet.add id.name env.re_used }
+
+(* For static or local identifiers, we make up a new name if needed *)
+(* If the same identifier has already been declared,
+ don't rename a second time *)
+
+let rename env id =
+ if IdentMap.mem id env.re_id then (id, env) else begin
+ let basename =
+ if id.name = "" then Printf.sprintf "_%d" id.stamp else id.name in
+ let newname =
+ if not (StringSet.mem basename env.re_used) then basename else begin
+ let rec find_name n =
+ let s = Printf.sprintf "%s__%d" basename n in
+ if StringSet.mem s env.re_used
+ then find_name (n+1)
+ else s
+ in find_name 1
+ end in
+ let newid = {name = newname; stamp = id.stamp } in
+ ( newid,
+ { re_id = IdentMap.add id newid env.re_id;
+ re_used = StringSet.add newname env.re_used } )
+ end
+
+(* Monadic map to thread an environment *)
+
+let rec mmap (f: rename_env -> 'a -> 'b * rename_env) env = function
+ | [] -> ([], env)
+ | hd :: tl ->
+ let (hd', env1) = f env hd in
+ let (tl', env2) = mmap f env1 tl in
+ (hd' :: tl', env2)
+
+(* Renaming *)
+
+let ident env id =
+ try
+ IdentMap.find id env.re_id
+ with Not_found ->
+ Errors.fatal_error "Internal error: Rename: %s__%d unbound"
+ id.name id.stamp
+
+let rec typ env = function
+ | TPtr(ty, a) -> TPtr(typ env ty, a)
+ | TArray(ty, sz, a) -> TArray(typ env ty, sz, a)
+ | TFun(res, None, va, a) -> TFun(typ env res, None, va, a)
+ | TFun(res, Some p, va, a) ->
+ let (p', _) = mmap param env p in
+ TFun(typ env res, Some p', va, a)
+ | TNamed(id, a) -> TNamed(ident env id, a)
+ | TStruct(id, a) -> TStruct(ident env id, a)
+ | TUnion(id, a) -> TUnion(ident env id, a)
+ | ty -> ty
+
+and param env (id, ty) =
+ if id.name = "" then
+ ((id, typ env ty), env)
+ else
+ let (id', env') = rename env id in ((id', typ env' ty), env')
+
+let constant env = function
+ | CEnum(id, v) -> CEnum(ident env id, v)
+ | cst -> cst
+
+let rec exp env e =
+ { edesc = exp_desc env e.edesc; etyp = typ env e.etyp }
+
+and exp_desc env = function
+ | EConst cst -> EConst(constant env cst)
+ | ESizeof ty -> ESizeof(typ env ty)
+ | EVar id -> EVar(ident env id)
+ | EUnop(op, a) -> EUnop(op, exp env a)
+ | EBinop(op, a, b, ty) -> EBinop(op, exp env a, exp env b, typ env ty)
+ | EConditional(a, b, c) -> EConditional(exp env a, exp env b, exp env c)
+ | ECast(ty, a) -> ECast(typ env ty, exp env a)
+ | ECall(a, al) -> ECall(exp env a, List.map (exp env) al)
+
+let optexp env = function
+ | None -> None
+ | Some a -> Some (exp env a)
+
+let field env f =
+ { fld_name = f.fld_name;
+ fld_typ = typ env f.fld_typ;
+ fld_bitfield = f.fld_bitfield }
+
+let rec init env = function
+ | Init_single e -> Init_single(exp env e)
+ | Init_array il -> Init_array (List.map (init env) il)
+ | Init_struct(id, il) ->
+ Init_struct(ident env id,
+ List.map (fun (f, i) -> (field env f, init env i)) il)
+ | Init_union(id, f, i) ->
+ Init_union(ident env id, field env f, init env i)
+
+let decl env (sto, id, ty, int) =
+ let (id', env') = rename env id in
+ ((sto,
+ id',
+ typ env' ty,
+ match int with None -> None | Some i -> Some(init env' i)),
+ env')
+
+let rec stmt env s =
+ { sdesc = stmt_desc env s.sdesc; sloc = s.sloc }
+
+and stmt_desc env = function
+ | Sskip -> Sskip
+ | Sdo a -> Sdo (exp env a)
+ | Sseq(s1, s2) -> Sseq(stmt env s1, stmt env s2)
+ | Sif(a, s1, s2) -> Sif(exp env a, stmt env s1, stmt env s2)
+ | Swhile(a, s) -> Swhile(exp env a, stmt env s)
+ | Sdowhile(s, a) -> Sdowhile(stmt env s, exp env a)
+ | Sfor(a1, a2, a3, s) ->
+ Sfor(stmt env a1, exp env a2, stmt env a3, stmt env s)
+ | Sbreak -> Sbreak
+ | Scontinue -> Scontinue
+ | Sswitch(a, s) -> Sswitch(exp env a, stmt env s)
+ | Slabeled(lbl, s) -> Slabeled(slabel env lbl, stmt env s)
+ | Sgoto lbl -> Sgoto lbl
+ | Sreturn a -> Sreturn (optexp env a)
+ | Sblock sl -> let (sl', _) = mmap stmt_or_decl env sl in Sblock sl'
+ | Sdecl d -> assert false
+
+and stmt_or_decl env s =
+ match s.sdesc with
+ | Sdecl d ->
+ let (d', env') = decl env d in
+ ({ sdesc = Sdecl d'; sloc = s.sloc}, env')
+ | _ ->
+ (stmt env s, env)
+
+and slabel env = function
+ | Scase e -> Scase(exp env e)
+ | sl -> sl
+
+let fundef env f =
+ let (name', env0) = rename env f.fd_name in
+ let (params', env1) = mmap param env0 f.fd_params in
+ let (locals', env2) = mmap decl env1 f.fd_locals in
+ ( { fd_storage = f.fd_storage;
+ fd_inline = f.fd_inline;
+ fd_name = name';
+ fd_ret = typ env0 f.fd_ret;
+ fd_params = params';
+ fd_vararg = f.fd_vararg;
+ fd_locals = locals';
+ fd_body = stmt env2 f.fd_body },
+ env0 )
+
+let enum env (id, opte) =
+ let (id', env') = rename env id in
+ ((id', optexp env' opte), env')
+
+let rec globdecl env g =
+ let (desc', env') = globdecl_desc env g.gdesc in
+ ( { gdesc = desc'; gloc = g.gloc }, env' )
+
+and globdecl_desc env = function
+ | Gdecl d ->
+ let (d', env') = decl env d in
+ (Gdecl d', env')
+ | Gfundef fd ->
+ let (fd', env') = fundef env fd in
+ (Gfundef fd', env')
+ | Gcompositedecl(kind, id) ->
+ let (id', env') = rename env id in
+ (Gcompositedecl(kind, id'), env')
+ | Gcompositedef(kind, id, members) ->
+ (Gcompositedef(kind, ident env id, List.map (field env) members), env)
+ | Gtypedef(id, ty) ->
+ let (id', env') = rename env id in
+ (Gtypedef(id', typ env' ty), env')
+ | Genumdef(id, members) ->
+ let (id', env') = rename env id in
+ let (members', env'') = mmap enum env' members in
+ (Genumdef(id', members'), env'')
+ | Gpragma s ->
+ (Gpragma s, env)
+
+let rec globdecls env accu = function
+ | [] -> List.rev accu
+ | dcl :: rem ->
+ let (dcl', env') = globdecl env dcl in
+ globdecls env' (dcl' :: accu) rem
+
+(* Reserve names of builtins *)
+
+let reserve_builtins () =
+ List.fold_left enter_global empty_env (Builtins.identifiers())
+
+(* Reserve global declarations with public visibility *)
+
+let rec reserve_public env = function
+ | [] -> env
+ | dcl :: rem ->
+ let env' =
+ match dcl.gdesc with
+ | Gdecl(sto, id, _, _) ->
+ begin match sto with
+ | Storage_default | Storage_extern -> enter_global env id
+ | Storage_static -> env
+ | _ -> assert false
+ end
+ | Gfundef f ->
+ begin match f.fd_storage with
+ | Storage_default | Storage_extern -> enter_global env f.fd_name
+ | Storage_static -> env
+ | _ -> assert false
+ end
+ | _ -> env in
+ reserve_public env' rem
+
+(* Rename the program *)
+
+let program p =
+ globdecls
+ (reserve_public (reserve_builtins()) p)
+ [] p
+
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+val program : C.program -> C.program
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Pulling side-effects out of expressions *)
+
+(* Assumes: nothing
+ Produces: simplified code *)
+
+open C
+open Cutil
+open Transform
+
+(* Grammar of simplified expressions:
+ e ::= EConst cst
+ | ESizeof ty
+ | EVar id
+ | EUnop pure-unop e
+ | EBinop pure-binop e e
+ | EConditional e e e
+ | ECast ty e
+
+ Grammar of statements produced to reflect side-effects in expressions:
+ s ::= Sskip
+ | Sdo (EBinop Oassign e e)
+ | Sdo (EBinop Oassign e (ECall e e* ))
+ | Sdo (Ecall e el)
+ | Sseq s s
+ | Sif e s s
+*)
+
+let rec is_simpl_expr e =
+ match e.edesc with
+ | EConst cst -> true
+ | ESizeof ty -> true
+ | EVar id -> true
+ | EUnop((Ominus|Oplus|Olognot|Onot|Oderef|Oaddrof), e1) ->
+ is_simpl_expr e1
+ | EBinop((Oadd|Osub|Omul|Odiv|Omod|Oand|Oor|Oxor|Oshl|Oshr|
+ Oeq|One|Olt|Ogt|Ole|Oge|Oindex|Ologand|Ologor), e1, e2, _) ->
+ is_simpl_expr e1 && is_simpl_expr e2
+ | EConditional(e1, e2, e3) ->
+ is_simpl_expr e1 && is_simpl_expr e2 && is_simpl_expr e3
+ | ECast(ty, e1) ->
+ is_simpl_expr e1
+ | _ ->
+ false
+
+(* "Destination" of a simplified expression *)
+
+type exp_destination =
+ | RHS (* evaluate as a r-value *)
+ | LHS (* evaluate as a l-value *)
+ | Drop (* drop its value, we only need the side-effects *)
+ | Set of exp (* assign it to the given simplified l.h.s. *)
+
+let voidconst = { nullconst with etyp = TVoid [] }
+
+(* Reads from volatile lvalues are also considered as side-effects if
+ [volatilize] is true. *)
+
+let volatilize = ref false
+
+(* [simpl_expr loc env e act] returns a pair [s, e'] of
+ a statement that performs the side-effects present in [e] and
+ a simplified, side-effect-free expression [e'].
+ If [act] is [RHS], [e'] evaluates to the same value as [e].
+ If [act] is [LHS], [e'] evaluates to the same location as [e].
+ If [act] is [Drop], [e'] is not meaningful and must be ignored.
+ If [act] is [Set lhs], [s] also performs an assignment
+ equivalent to [lhs = e]. [e'] is not meaningful. *)
+
+let simpl_expr loc env e act =
+
+ (* Temporaries should not be [const] because we assign into them,
+ and need not be [volatile] because no one else is writing into them.
+ As for [restrict] it doesn't make sense anyway. *)
+
+ let new_temp ty =
+ Transform.new_temp (erase_attributes_type env ty) in
+
+ let eboolvalof e =
+ { edesc = EBinop(One, e, intconst 0L IInt, TInt(IInt, []));
+ etyp = TInt(IInt, []) } in
+
+ let sseq s1 s2 = Cutil.sseq loc s1 s2 in
+
+ let sassign e1 e2 =
+ { sdesc = Sdo {edesc = EBinop(Oassign, e1, e2, e1.etyp); etyp = e1.etyp};
+ sloc = loc } in
+
+ let sif e s1 s2 =
+ { sdesc = Sif(e, s1, s2); sloc = loc } in
+
+ let is_volatile_read e =
+ !volatilize
+ && List.mem AVolatile (attributes_of_type env e.etyp)
+ && is_lvalue env e in
+
+ let lhs_to_rhs e =
+ if is_volatile_read e
+ then (let t = new_temp e.etyp in (sassign t e, t))
+ else (sskip, e) in
+
+ let finish act s e =
+ match act with
+ | RHS ->
+ if is_volatile_read e
+ then (let t = new_temp e.etyp in (sseq s (sassign t e), t))
+ else (s, e)
+ | LHS ->
+ (s, e)
+ | Drop ->
+ if is_volatile_read e
+ then (let t = new_temp e.etyp in (sseq s (sassign t e), voidconst))
+ else (s, voidconst)
+ | Set lhs ->
+ if is_volatile_read e
+ then (let t = new_temp e.etyp in
+ (sseq s (sseq (sassign t e) (sassign lhs t)), voidconst))
+ else (sseq s (sassign lhs e), voidconst) in
+
+ let rec simpl e act =
+ match e.edesc with
+
+ | EConst cst ->
+ finish act sskip e
+
+ | ESizeof ty ->
+ finish act sskip e
+
+ | EVar id ->
+ finish act sskip e
+
+ | EUnop(op, e1) ->
+
+ begin match op with
+
+ | Ominus | Oplus | Olognot | Onot | Oderef | Oarrow _ ->
+ let (s1, e1') = simpl e1 RHS in
+ finish act s1 {edesc = EUnop(op, e1'); etyp = e.etyp}
+
+ | Oaddrof ->
+ let (s1, e1') = simpl e1 LHS in
+ finish act s1 {edesc = EUnop(op, e1'); etyp = e.etyp}
+
+ | Odot _ ->
+ let (s1, e1') = simpl e1 (if act = LHS then LHS else RHS) in
+ finish act s1 {edesc = EUnop(op, e1'); etyp = e.etyp}
+
+ | Opreincr | Opredecr ->
+ let (s1, e1') = simpl e1 LHS in
+ let (s2, e2') = lhs_to_rhs e1' in
+ let op' = match op with Opreincr -> Oadd | _ -> Osub in
+ let ty = unary_conversion env e.etyp in
+ let e3 =
+ {edesc = EBinop(op', e2', intconst 1L IInt, ty); etyp = ty} in
+ begin match act with
+ | Drop ->
+ (sseq s1 (sseq s2 (sassign e1' e3)), voidconst)
+ | _ ->
+ let tmp = new_temp e.etyp in
+ finish act (sseq s1 (sseq s2 (sseq (sassign tmp e3)
+ (sassign e1' tmp))))
+ tmp
+ end
+
+ | Opostincr | Opostdecr ->
+ let (s1, e1') = simpl e1 LHS in
+ let op' = match op with Opostincr -> Oadd | _ -> Osub in
+ let ty = unary_conversion env e.etyp in
+ begin match act with
+ | Drop ->
+ let (s2, e2') = lhs_to_rhs e1' in
+ let e3 =
+ {edesc = EBinop(op', e2', intconst 1L IInt, ty); etyp = ty} in
+ (sseq s1 (sseq s2 (sassign e1' e3)), voidconst)
+ | _ ->
+ let tmp = new_temp e.etyp in
+ let e3 =
+ {edesc = EBinop(op', tmp, intconst 1L IInt, ty); etyp = ty} in
+ finish act (sseq s1 (sseq (sassign tmp e1') (sassign e1' e3)))
+ tmp
+ end
+
+ end
+
+ | EBinop(op, e1, e2, ty) ->
+
+ begin match op with
+
+ | Oadd | Osub | Omul | Odiv | Omod | Oand | Oor | Oxor
+ | Oshl | Oshr | Oeq | One | Olt | Ogt | Ole | Oge | Oindex ->
+ let (s1, e1') = simpl e1 RHS in
+ let (s2, e2') = simpl e2 RHS in
+ finish act (sseq s1 s2)
+ {edesc = EBinop(op, e1', e2', ty); etyp = e.etyp}
+
+ | Oassign ->
+ if act = Drop && is_simpl_expr e1 then
+ simpl e2 (Set e1)
+ else begin
+ match act with
+ | Drop ->
+ let (s1, e1') = simpl e1 LHS in
+ let (s2, e2') = simpl e2 RHS in
+ (sseq s1 (sseq s2 (sassign e1' e2')), voidconst)
+ | _ ->
+ let tmp = new_temp e.etyp in
+ let (s1, e1') = simpl e1 LHS in
+ let (s2, e2') = simpl e2 (Set tmp) in
+ finish act (sseq s1 (sseq s2 (sassign e1' tmp)))
+ tmp
+ end
+
+ | Oadd_assign | Osub_assign | Omul_assign | Odiv_assign
+ | Omod_assign | Oand_assign | Oor_assign | Oxor_assign
+ | Oshl_assign | Oshr_assign ->
+ let (s1, e1') = simpl e1 LHS in
+ let (s11, e11') = lhs_to_rhs e1' in
+ let (s2, e2') = simpl e2 RHS in
+ let op' =
+ match op with
+ | Oadd_assign -> Oadd | Osub_assign -> Osub
+ | Omul_assign -> Omul | Odiv_assign -> Odiv
+ | Omod_assign -> Omod | Oand_assign -> Oand
+ | Oor_assign -> Oor | Oxor_assign -> Oxor
+ | Oshl_assign -> Oshl | Oshr_assign -> Oshr
+ | _ -> assert false in
+ let e3 =
+ { edesc = EBinop(op', e11', e2', ty); etyp = ty } in
+ begin match act with
+ | Drop ->
+ (sseq s1 (sseq s11 (sseq s2 (sassign e1' e3))), voidconst)
+ | _ ->
+ let tmp = new_temp e.etyp in
+ finish act (sseq s1 (sseq s11 (sseq s2
+ (sseq (sassign tmp e3) (sassign e1' tmp)))))
+ tmp
+ end
+
+ | Ocomma ->
+ let (s1, _) = simpl e1 Drop in
+ let (s2, e2') = simpl e2 act in
+ (sseq s1 s2, e2')
+
+ | Ologand ->
+ let (s1, e1') = simpl e1 RHS in
+ if is_simpl_expr e2 then begin
+ finish act s1
+ {edesc = EBinop(Ologand, e1', e2, ty); etyp = e.etyp}
+ end else begin
+ match act with
+ | Drop ->
+ let (s2, _) = simpl e2 Drop in
+ (sseq s1 (sif e1' s2 sskip), voidconst)
+ | RHS | LHS -> (* LHS should not happen *)
+ let (s2, e2') = simpl e2 RHS in
+ let tmp = new_temp e.etyp in
+ (sseq s1 (sif e1'
+ (sseq s2 (sassign tmp (eboolvalof e2')))
+ (sassign tmp (intconst 0L IInt))),
+ tmp)
+ | Set lv ->
+ let (s2, e2') = simpl e2 RHS in
+ (sseq s1 (sif e1'
+ (sseq s2 (sassign lv (eboolvalof e2')))
+ (sassign lv (intconst 0L IInt))),
+ voidconst)
+ end
+
+ | Ologor ->
+ let (s1, e1') = simpl e1 RHS in
+ if is_simpl_expr e2 then begin
+ finish act s1
+ {edesc = EBinop(Ologor, e1', e2, ty); etyp = e.etyp}
+ end else begin
+ match act with
+ | Drop ->
+ let (s2, _) = simpl e2 Drop in
+ (sseq s1 (sif e1' sskip s2), voidconst)
+ | RHS | LHS -> (* LHS should not happen *)
+ let (s2, e2') = simpl e2 RHS in
+ let tmp = new_temp e.etyp in
+ (sseq s1 (sif e1'
+ (sassign tmp (intconst 1L IInt))
+ (sseq s2 (sassign tmp (eboolvalof e2')))),
+ tmp)
+ | Set lv ->
+ let (s2, e2') = simpl e2 RHS in
+ (sseq s1 (sif e1'
+ (sassign lv (intconst 1L IInt))
+ (sseq s2 (sassign lv (eboolvalof e2')))),
+ voidconst)
+ end
+
+ end
+
+ | EConditional(e1, e2, e3) ->
+ let (s1, e1') = simpl e1 RHS in
+ if is_simpl_expr e2 && is_simpl_expr e3 then begin
+ finish act s1 {edesc = EConditional(e1', e2, e3); etyp = e.etyp}
+ end else begin
+ match act with
+ | Drop ->
+ let (s2, _) = simpl e2 Drop in
+ let (s3, _) = simpl e3 Drop in
+ (sseq s1 (sif e1' s2 s3), voidconst)
+ | RHS | LHS -> (* LHS should not happen *)
+ let tmp = new_temp e.etyp in
+ let (s2, _) = simpl e2 (Set tmp) in
+ let (s3, _) = simpl e3 (Set tmp) in
+ (sseq s1 (sif e1' s2 s3), tmp)
+ | Set lv ->
+ let (s2, _) = simpl e2 (Set lv) in
+ let (s3, _) = simpl e3 (Set lv) in
+ (sseq s1 (sif e1' s2 s3), voidconst)
+ end
+
+ | ECast(ty, e1) ->
+ if is_void_type env ty then begin
+ if act <> Drop then
+ Errors.warning "%acast to 'void' in a context expecting a value\n"
+ formatloc loc;
+ simpl e1 act
+ end else begin
+ let (s1, e1') = simpl e1 RHS in
+ finish act s1 {edesc = ECast(ty, e1'); etyp = e.etyp}
+ end
+
+ | ECall(e1, el) ->
+ let (s1, e1') = simpl e1 RHS in
+ let (s2, el') = simpl_list el in
+ let e2 = { edesc = ECall(e1', el'); etyp = e.etyp } in
+ begin match act with
+ | Drop ->
+ (sseq s1 (sseq s2 {sdesc = Sdo e2; sloc=loc}), voidconst)
+ | Set({edesc = EVar _} as lhs) ->
+ (* CompCert wants the destination of a call to be a variable,
+ not a more complex lhs. In the latter case, we
+ fall through the catch-all case below *)
+ (sseq s1 (sseq s2 (sassign lhs e2)), voidconst)
+ | _ ->
+ let tmp = new_temp e.etyp in
+ finish act (sseq s1 (sseq s2 (sassign tmp e2))) tmp
+ end
+
+ and simpl_list = function
+ | [] -> (sskip, [])
+ | e1 :: el ->
+ let (s1, e1') = simpl e1 RHS in
+ let (s2, el') = simpl_list el in
+ (sseq s1 s2, e1' :: el')
+
+ in simpl e act
+
+(* Simplification of an initializer *)
+
+let simpl_initializer loc env i =
+
+ let rec simpl_init = function
+ | Init_single e ->
+ let (s, e') = simpl_expr loc env e RHS in
+ (s, Init_single e)
+ | Init_array il ->
+ let rec simpl = function
+ | [] -> (sskip, [])
+ | i1 :: il ->
+ let (s1, i1') = simpl_init i1 in
+ let (s2, il') = simpl il in
+ (sseq loc s1 s2, i1' :: il') in
+ let (s, il') = simpl il in
+ (s, Init_array il')
+ | Init_struct(id, il) ->
+ let rec simpl = function
+ | [] -> (sskip, [])
+ | (f1, i1) :: il ->
+ let (s1, i1') = simpl_init i1 in
+ let (s2, il') = simpl il in
+ (sseq loc s1 s2, (f1, i1') :: il') in
+ let (s, il') = simpl il in
+ (s, Init_struct(id, il'))
+ | Init_union(id, f, i) ->
+ let (s, i') = simpl_init i in
+ (s, Init_union(id, f, i'))
+
+ in simpl_init i
+
+(* Construct a simplified statement equivalent to [if (e) s1; else s2;].
+ Optimizes the case where e contains [&&] or [||] or [?].
+ [s1] or [s2] can be duplicated, so use only for small [s1] and [s2]
+ that do not define any labels. *)
+
+let rec simpl_if loc env e s1 s2 =
+ match e.edesc with
+ | EUnop(Olognot, e1) ->
+ simpl_if loc env e1 s2 s1
+ | EBinop(Ologand, e1, e2, _) ->
+ simpl_if loc env e1
+ (simpl_if loc env e2 s1 s2)
+ s2
+ | EBinop(Ologor, e1, e2, _) ->
+ simpl_if loc env e1
+ s1
+ (simpl_if loc env e2 s1 s2)
+ | EConditional(e1, e2, e3) ->
+ simpl_if loc env e1
+ (simpl_if loc env e2 s1 s2)
+ (simpl_if loc env e3 s1 s2)
+ | _ ->
+ let (s, e') = simpl_expr loc env e RHS in
+ sseq loc s {sdesc = Sif(e', s1, s2); sloc = loc}
+
+(* Trivial statements for which [simpl_if] is applicable *)
+
+let trivial_stmt s =
+ match s.sdesc with
+ | Sskip | Scontinue | Sbreak | Sgoto _ -> true
+ | _ -> false
+
+(* Construct a simplified statement equivalent to [if (!e) exit; ]. *)
+
+let break_if_false loc env e =
+ simpl_if loc env e
+ {sdesc = Sskip; sloc = loc}
+ {sdesc = Sbreak; sloc = loc}
+
+(* Simplification of a statement *)
+
+let simpl_statement env s =
+
+ let rec simpl_stmt s =
+ match s.sdesc with
+
+ | Sskip ->
+ s
+
+ | Sdo e ->
+ let (s', _) = simpl_expr s.sloc env e Drop in
+ s'
+
+ | Sseq(s1, s2) ->
+ {sdesc = Sseq(simpl_stmt s1, simpl_stmt s2); sloc = s.sloc}
+
+ | Sif(e, s1, s2) ->
+ if trivial_stmt s1 && trivial_stmt s2 then
+ simpl_if s.sloc env e (simpl_stmt s1) (simpl_stmt s2)
+ else begin
+ let (s', e') = simpl_expr s.sloc env e RHS in
+ sseq s.sloc s'
+ {sdesc = Sif(e', simpl_stmt s1, simpl_stmt s2);
+ sloc = s.sloc}
+ end
+
+ | Swhile(e, s1) ->
+ if is_simpl_expr e then
+ {sdesc = Swhile(e, simpl_stmt s1); sloc = s.sloc}
+ else
+ {sdesc =
+ Swhile(intconst 1L IInt,
+ sseq s.sloc (break_if_false s.sloc env e)
+ (simpl_stmt s1));
+ sloc = s.sloc}
+
+ | Sdowhile(s1, e) ->
+ if is_simpl_expr e then
+ {sdesc = Sdowhile(simpl_stmt s1, e); sloc = s.sloc}
+ else begin
+ let tmp = new_temp (TInt(IInt, [])) in
+ let (s', _) = simpl_expr s.sloc env e (Set tmp) in
+ let s_init =
+ {sdesc = Sdo {edesc = EBinop(Oassign, tmp, intconst 1L IInt, tmp.etyp);
+ etyp = tmp.etyp};
+ sloc = s.sloc} in
+ {sdesc = Sfor(s_init, tmp, s', simpl_stmt s1); sloc = s.sloc}
+ end
+(*** Alternate translation that unfortunately puts a "break" in the
+ "next" part of a "for", something that is not supported
+ by Clight semantics, and has unknown behavior in gcc.
+ {sdesc =
+ Sfor(sskip,
+ intconst 1L IInt,
+ break_if_false s.sloc env e,
+ simpl_stmt s1);
+ sloc = s.sloc}
+***)
+
+ | Sfor(s1, e, s2, s3) ->
+ if is_simpl_expr e then
+ {sdesc = Sfor(simpl_stmt s1,
+ e,
+ simpl_stmt s2,
+ simpl_stmt s3);
+ sloc = s.sloc}
+ else
+ let (s', e') = simpl_expr s.sloc env e RHS in
+ {sdesc = Sfor(sseq s.sloc (simpl_stmt s1) s',
+ e',
+ sseq s.sloc (simpl_stmt s2) s',
+ simpl_stmt s3);
+ sloc = s.sloc}
+
+ | Sbreak ->
+ s
+ | Scontinue ->
+ s
+
+ | Sswitch(e, s1) ->
+ let (s', e') = simpl_expr s.sloc env e RHS in
+ sseq s.sloc s' {sdesc = Sswitch(e', simpl_stmt s1); sloc = s.sloc}
+
+ | Slabeled(lbl, s1) ->
+ {sdesc = Slabeled(lbl, simpl_stmt s1); sloc = s.sloc}
+
+ | Sgoto lbl ->
+ s
+
+ | Sreturn None ->
+ s
+
+ | Sreturn (Some e) ->
+ let (s', e') = simpl_expr s.sloc env e RHS in
+ sseq s.sloc s' {sdesc = Sreturn(Some e'); sloc = s.sloc}
+
+ | Sblock sl ->
+ {sdesc = Sblock(simpl_block sl); sloc = s.sloc}
+
+ | Sdecl d -> assert false
+
+ and simpl_block = function
+ | [] -> []
+ | ({sdesc = Sdecl(sto, id, ty, None)} as s) :: sl ->
+ s :: simpl_block sl
+ | ({sdesc = Sdecl(sto, id, ty, Some i)} as s) :: sl ->
+ let (s', i') = simpl_initializer s.sloc env i in
+ let sl' =
+ {sdesc = Sdecl(sto, id, ty, Some i'); sloc = s.sloc}
+ :: simpl_block sl in
+ if s'.sdesc = Sskip then sl' else s' :: sl'
+ | s :: sl ->
+ simpl_stmt s :: simpl_block sl
+
+ in simpl_stmt s
+
+(* Simplification of a function definition *)
+
+let simpl_fundef env f =
+ reset_temps();
+ let body' = simpl_statement env f.fd_body in
+ let temps = get_temps() in
+ { f with fd_locals = f.fd_locals @ temps; fd_body = body' }
+
+(* Entry point *)
+
+let program ?(volatile = false) p =
+ volatilize := volatile;
+ Transform.program ~fundef:simpl_fundef p
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Pulling side effects out of expressions.
+ If [volatile] is [true], treats reads from volatile rvalues
+ as side-effects *)
+
+val program: ?volatile: bool -> C.program -> C.program
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Expand assignments between structs and between unions *)
+
+(* Assumes: simplified code.
+ Preserves: simplified code, unblocked code *)
+
+open C
+open Cutil
+open Env
+open Errors
+
+let maxsize = ref 8
+
+let need_memcpy = ref (None: ident option)
+
+let memcpy_type =
+ TFun(TPtr(TVoid [], []),
+ Some [(Env.fresh_ident "", TPtr(TVoid [], []));
+ (Env.fresh_ident "", TPtr(TVoid [AConst], []));
+ (Env.fresh_ident "", TInt(size_t_ikind, []))],
+ false, [])
+
+let memcpy_ident () =
+ match !need_memcpy with
+ | None ->
+ let id = Env.fresh_ident "memcpy" in
+ need_memcpy := Some id;
+ id
+ | Some id ->
+ id
+
+let transf_assign env loc lhs rhs =
+
+ let num_assign = ref 0 in
+
+ let assign l r =
+ incr num_assign;
+ if !num_assign > !maxsize
+ then raise Exit
+ else sassign loc l r in
+
+ let rec transf l r =
+ match unroll env l.etyp with
+ | TStruct(id, attr) ->
+ let ci = Env.find_struct env id in
+ if ci.ci_sizeof = None then
+ error "%a: Error: incomplete struct '%s'" formatloc loc id.name;
+ transf_struct l r ci.ci_members
+ | TUnion(id, attr) ->
+ raise Exit
+ | TArray(ty_elt, Some sz, attr) ->
+ transf_array l r ty_elt 0L sz
+ | TArray(ty_elt, None, attr) ->
+ error "%a: Error: array of unknown size" formatloc loc;
+ sskip (* will be ignored later *)
+ | _ ->
+ assign l r
+
+ and transf_struct l r = function
+ | [] -> sskip
+ | f :: fl ->
+ sseq loc (transf {edesc = EUnop(Odot f.fld_name, l); etyp = f.fld_typ}
+ {edesc = EUnop(Odot f.fld_name, r); etyp = f.fld_typ})
+ (transf_struct l r fl)
+
+ and transf_array l r ty idx sz =
+ if idx >= sz then sskip else begin
+ let e = intconst idx size_t_ikind in
+ sseq loc (transf {edesc = EBinop(Oindex, l, e, ty); etyp = ty}
+ {edesc = EBinop(Oindex, r, e, ty); etyp = ty})
+ (transf_array l r ty (Int64.add idx 1L) sz)
+ end
+ in
+
+ try
+ transf lhs rhs
+ with Exit ->
+ let memcpy = {edesc = EVar(memcpy_ident()); etyp = memcpy_type} in
+ let e_lhs = {edesc = EUnop(Oaddrof, lhs); etyp = TPtr(lhs.etyp, [])} in
+ let e_rhs = {edesc = EUnop(Oaddrof, rhs); etyp = TPtr(rhs.etyp, [])} in
+ let e_size = {edesc = ESizeof(lhs.etyp); etyp = TInt(size_t_ikind, [])} in
+ {sdesc = Sdo {edesc = ECall(memcpy, [e_lhs; e_rhs; e_size]);
+ etyp = TVoid[]};
+ sloc = loc}
+
+let rec transf_stmt env s =
+ match s.sdesc with
+ | Sskip -> s
+ | Sdo {edesc = EBinop(Oassign, lhs, rhs, _)}
+ when is_composite_type env lhs.etyp ->
+ transf_assign env s.sloc lhs rhs
+ | Sdo _ -> s
+ | Sseq(s1, s2) ->
+ {s with sdesc = Sseq(transf_stmt env s1, transf_stmt env s2)}
+ | Sif(e, s1, s2) ->
+ {s with sdesc = Sif(e, transf_stmt env s1, transf_stmt env s2)}
+ | Swhile(e, s1) ->
+ {s with sdesc = Swhile(e, transf_stmt env s1)}
+ | Sdowhile(s1, e) ->
+ {s with sdesc = Sdowhile(transf_stmt env s1, e)}
+ | Sfor(s1, e, s2, s3) ->
+ {s with sdesc = Sfor(transf_stmt env s1, e,
+ transf_stmt env s2, transf_stmt env s3)}
+ | Sbreak -> s
+ | Scontinue -> s
+ | Sswitch(e, s1) ->
+ {s with sdesc = Sswitch(e, transf_stmt env s1)}
+ | Slabeled(lbl, s1) ->
+ {s with sdesc = Slabeled(lbl, transf_stmt env s1)}
+ | Sgoto lbl -> s
+ | Sreturn _ -> s
+ | Sblock sl ->
+ {s with sdesc = Sblock(List.map (transf_stmt env) sl)}
+ | Sdecl d -> s
+
+let transf_fundef env fd =
+ {fd with fd_body = transf_stmt env fd.fd_body}
+
+let program p =
+ need_memcpy := None;
+ let p' = Transform.program ~fundef:transf_fundef p in
+ match !need_memcpy with
+ | None -> p'
+ | Some id ->
+ {gdesc = Gdecl(Storage_extern, id, memcpy_type, None); gloc = no_loc}
+ :: p'
+
+(* Horrible hack *)
+(***
+ let has_memcpy = ref false in
+ need_memcpy := None;
+ List.iter
+ (function {gdesc = Gdecl(_, ({name = "memcpy"} as id), _, _)} ->
+ need_memcpy := Some id; has_memcpy := true
+ | _ -> ())
+ p;
+ let p' = Transform.program ~fundef:transf_fundef p in
+ match !need_memcpy with
+ | Some id when not !has_memcpy ->
+ {gdesc = Gdecl(Storage_extern, id, memcpy_type, None); gloc = no_loc}
+ :: p'
+ | _ -> p'
+***)
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Expand assignments between structs and between unions *)
+
+val program: C.program -> C.program
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Eliminate by-value passing of structs and unions. *)
+
+(* Assumes: nothing.
+ Preserves: simplified code, unblocked code *)
+
+open C
+open Cutil
+open Transform
+
+(* In function argument types, struct s -> struct s *
+ In function result types, struct s -> void + add 1st parameter struct s *
+ Try to preserve original typedef names when no change.
+*)
+
+let rec transf_type env t =
+ match unroll env t with
+ | TFun(tres, None, vararg, attr) ->
+ let tres' = transf_type env tres in
+ TFun((if is_composite_type env tres then TVoid [] else tres'),
+ None, vararg, attr)
+ | TFun(tres, Some args, vararg, attr) ->
+ let args' = List.map (transf_funarg env) args in
+ let tres' = transf_type env tres in
+ if is_composite_type env tres then begin
+ let res = Env.fresh_ident "_res" in
+ TFun(TVoid [], Some((res, TPtr(tres', [])) :: args'), vararg, attr)
+ end else
+ TFun(tres', Some args', vararg, attr)
+ | TPtr(t1, attr) ->
+ let t1' = transf_type env t1 in
+ if t1' = t1 then t else TPtr(transf_type env t1, attr)
+ | TArray(t1, sz, attr) ->
+ let t1' = transf_type env t1 in
+ if t1' = t1 then t else TArray(transf_type env t1, sz, attr)
+ | _ -> t
+
+and transf_funarg env (id, t) =
+ let t = transf_type env t in
+ if is_composite_type env t
+ then (id, TPtr(add_attributes_type [AConst] t, []))
+ else (id, t)
+
+(* Simple exprs: no change in structure, since calls cannot occur within,
+ but need to rewrite the types. *)
+
+let rec transf_expr env e =
+ { etyp = transf_type env e.etyp;
+ edesc = match e.edesc with
+ | EConst c -> EConst c
+ | ESizeof ty -> ESizeof (transf_type env ty)
+ | EVar x -> EVar x
+ | EUnop(op, e1) -> EUnop(op, transf_expr env e1)
+ | EBinop(op, e1, e2, ty) ->
+ EBinop(op, transf_expr env e1, transf_expr env e2, transf_type env ty)
+ | EConditional(e1, e2, e3) ->
+ assert (not (is_composite_type env e.etyp));
+ EConditional(transf_expr env e1, transf_expr env e2, transf_expr env e3)
+ | ECast(ty, e1) -> ECast(transf_type env ty, transf_expr env e1)
+ | ECall(e1, el) -> assert false
+ }
+
+(* Initializers *)
+
+let rec transf_init env = function
+ | Init_single e ->
+ Init_single (transf_expr env e)
+ | Init_array il ->
+ Init_array (List.map (transf_init env) il)
+ | Init_struct(id, fil) ->
+ Init_struct (id, List.map (fun (fld, i) -> (fld, transf_init env i)) fil)
+ | Init_union(id, fld, i) ->
+ Init_union(id, fld, transf_init env i)
+
+(* Declarations *)
+
+let transf_decl env (sto, id, ty, init) =
+ (sto, id, transf_type env ty,
+ match init with None -> None | Some i -> Some (transf_init env i))
+
+(* Transformation of statements and function bodies *)
+
+let transf_funbody env body optres =
+
+let transf_type t = transf_type env t
+and transf_expr e = transf_expr env e in
+
+(* Function arguments: pass by reference those having struct/union type *)
+
+let transf_arg e =
+ let e' = transf_expr e in
+ if is_composite_type env e'.etyp
+ then {edesc = EUnop(Oaddrof, e'); etyp = TPtr(e'.etyp, [])}
+ else e'
+in
+
+(* Function calls: if return type is struct or union,
+ lv = f(...) -> f(&lv, ...)
+ f(...) -> f(&newtemp, ...)
+ Returns: if return type is struct or union,
+ return x -> _res = x; return
+*)
+
+let rec transf_stmt s =
+ match s.sdesc with
+ | Sskip -> s
+ | Sdo {edesc = ECall(fn, args); etyp = ty} ->
+ let fn = transf_expr fn in
+ let args = List.map transf_arg args in
+ if is_composite_type env ty then begin
+ let tmp = new_temp ~name:"_res" ty in
+ let arg0 = {edesc = EUnop(Oaddrof, tmp); etyp = TPtr(ty, [])} in
+ {s with sdesc = Sdo {edesc = ECall(fn, arg0 :: args); etyp = TVoid []}}
+ end else
+ {s with sdesc = Sdo {edesc = ECall(fn, args); etyp = ty}}
+ | Sdo {edesc = EBinop(Oassign, dst, {edesc = ECall(fn, args); etyp = ty}, _)} ->
+ let dst = transf_expr dst in
+ let fn = transf_expr fn in
+ let args = List.map transf_arg args in
+ let ty = transf_type ty in
+ if is_composite_type env ty then begin
+ let arg0 = {edesc = EUnop(Oaddrof, dst); etyp = TPtr(dst.etyp, [])} in
+ {s with sdesc = Sdo {edesc = ECall(fn, arg0 :: args); etyp = TVoid []}}
+ end else
+ sassign s.sloc dst {edesc = ECall(fn, args); etyp = ty}
+ | Sdo e ->
+ {s with sdesc = Sdo(transf_expr e)}
+ | Sseq(s1, s2) ->
+ {s with sdesc = Sseq(transf_stmt s1, transf_stmt s2)}
+ | Sif(e, s1, s2) ->
+ {s with sdesc = Sif(transf_expr e, transf_stmt s1, transf_stmt s2)}
+ | Swhile(e, s1) ->
+ {s with sdesc = Swhile(transf_expr e, transf_stmt s1)}
+ | Sdowhile(s1, e) ->
+ {s with sdesc = Sdowhile(transf_stmt s1, transf_expr e)}
+ | Sfor(s1, e, s2, s3) ->
+ {s with sdesc = Sfor(transf_stmt s1, transf_expr e,
+ transf_stmt s2, transf_stmt s3)}
+ | Sbreak -> s
+ | Scontinue -> s
+ | Sswitch(e, s1) ->
+ {s with sdesc = Sswitch(transf_expr e, transf_stmt s1)}
+ | Slabeled(lbl, s1) ->
+ {s with sdesc = Slabeled(lbl, transf_stmt s1)}
+ | Sgoto lbl -> s
+ | Sreturn None -> s
+ | Sreturn(Some e) ->
+ let e = transf_expr e in
+ begin match optres with
+ | None ->
+ {s with sdesc = Sreturn(Some e)}
+ | Some dst ->
+ sseq s.sloc
+ (sassign s.sloc dst e)
+ {sdesc = Sreturn None; sloc = s.sloc}
+ end
+ | Sblock sl ->
+ {s with sdesc = Sblock(List.map transf_stmt sl)}
+ | Sdecl d ->
+ {s with sdesc = Sdecl(transf_decl env d)}
+
+in
+ transf_stmt body
+
+let transf_params loc env params =
+ let rec transf_prm = function
+ | [] ->
+ ([], [], sskip)
+ | (id, ty) :: params ->
+ let ty = transf_type env ty in
+ if is_composite_type env ty then begin
+ let id' = Env.fresh_ident id.name in
+ let ty' = TPtr(add_attributes_type [AConst] ty, []) in
+ let (params', decls, init) = transf_prm params in
+ ((id', ty') :: params',
+ (Storage_default, id, ty, None) :: decls,
+ sseq loc
+ (sassign loc {edesc = EVar id; etyp = ty}
+ {edesc = EUnop(Oderef, {edesc = EVar id'; etyp = ty'});
+ etyp = ty})
+ init)
+ end else begin
+ let (params', decls, init) = transf_prm params in
+ ((id, ty) :: params', decls, init)
+ end
+ in transf_prm params
+
+let transf_fundef env f =
+ reset_temps();
+ let ret = transf_type env f.fd_ret in
+ let (params, newdecls, init) = transf_params f.fd_body.sloc env f.fd_params in
+ let (ret1, params1, body1) =
+ if is_composite_type env ret then begin
+ let vres = Env.fresh_ident "_res" in
+ let tres = TPtr(ret, []) in
+ let eres = {edesc = EVar vres; etyp = tres} in
+ let eeres = {edesc = EUnop(Oderef, eres); etyp = ret} in
+ (TVoid [],
+ (vres, tres) :: params,
+ transf_funbody env f.fd_body (Some eeres))
+ end else
+ (ret, params, transf_funbody env f.fd_body None) in
+ let body2 = sseq body1.sloc init body1 in
+ let temps = get_temps() in
+ {f with fd_ret = ret1; fd_params = params1;
+ fd_locals = newdecls @ f.fd_locals @ temps; fd_body = body2}
+
+(* Composites *)
+
+let transf_composite env su id fl =
+ List.map (fun f -> {f with fld_typ = transf_type env f.fld_typ}) fl
+
+(* Entry point *)
+
+let program p =
+ Transform.program
+ ~decl:transf_decl
+ ~fundef:transf_fundef
+ ~composite:transf_composite
+ ~typedef:(fun env id ty -> transf_type env ty)
+ p
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+val program: C.program -> C.program
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Generic program transformation *)
+
+open C
+open Cutil
+open Env
+
+(* Recording fresh temporaries *)
+
+let temporaries = ref ([]: decl list)
+
+let reset_temps () =
+ temporaries := []
+
+let new_temp_var ?(name = "t") ty =
+ let id = Env.fresh_ident name in
+ temporaries := (Storage_default, id, ty, None) :: !temporaries;
+ id
+
+let new_temp ?(name = "t") ty =
+ let id = new_temp_var ~name ty in
+ { edesc = EVar id; etyp = ty }
+
+let get_temps () =
+ let temps = !temporaries in
+ temporaries := [];
+ List.rev temps
+
+(* Generic transformation *)
+
+let program
+ ?(decl = fun env d -> d)
+ ?(fundef = fun env fd -> fd)
+ ?(composite = fun env su id fl -> fl)
+ ?(typedef = fun env id ty -> ty)
+ p =
+
+(* In all transformations of interest so far, the environment is used only
+ for its type definitions and struct/union definitions,
+ so we do not update it for other definitions. *)
+
+ let rec transf_globdecls env accu = function
+ | [] -> List.rev accu
+ | g :: gl ->
+ let (desc', env') =
+ match g.gdesc with
+ | Gdecl((sto, id, ty, init) as d) ->
+ (Gdecl(decl env d), Env.add_ident env id sto ty)
+ | Gfundef f ->
+ (Gfundef(fundef env f),
+ Env.add_ident env f.fd_name f.fd_storage (fundef_typ f))
+ | Gcompositedecl(su, id) ->
+ (Gcompositedecl(su, id),
+ Env.add_composite env id (composite_info_decl env su))
+ | Gcompositedef(su, id, fl) ->
+ (Gcompositedef(su, id, composite env su id fl),
+ Env.add_composite env id (composite_info_def env su fl))
+ | Gtypedef(id, ty) ->
+ (Gtypedef(id, typedef env id ty), Env.add_typedef env id ty)
+ | Genumdef _ as gd -> (gd, env)
+ | Gpragma _ as gd -> (gd, env)
+ in
+ transf_globdecls env' ({g with gdesc = desc'} :: accu) gl
+
+ in transf_globdecls (Builtins.environment()) [] p
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Generic program transformation *)
+
+val reset_temps : unit -> unit
+val new_temp_var : ?name:string -> C.typ -> C.ident
+val new_temp : ?name:string -> C.typ -> C.exp
+val get_temps : unit -> C.decl list
+
+val program :
+ ?decl:(Env.t -> C.decl -> C.decl) ->
+ ?fundef:(Env.t -> C.fundef -> C.fundef) ->
+ ?composite:(Env.t ->
+ C.struct_or_union -> C.ident -> C.field list -> C.field list) ->
+ ?typedef:(Env.t -> C.ident -> Env.typedef_info -> Env.typedef_info) ->
+ C.program ->
+ C.program
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Simplification of blocks and initializers within functions *)
+
+(* Assumes: nothing
+ Produces: unblocked code *)
+
+open C
+open Cutil
+open Errors
+
+(* Convert an initializer to a list of assignments.
+ Prepend those assignments to the given statement. *)
+
+let sdoseq loc e s =
+ sseq loc {sdesc = Sdo e; sloc = loc} s
+
+let rec local_initializer loc env path init k =
+ match init with
+ | Init_single e ->
+ sdoseq loc
+ { edesc = EBinop(Oassign, path, e, path.etyp); etyp = path.etyp }
+ k
+ | Init_array il ->
+ let ty_elt =
+ match unroll env path.etyp with
+ | TArray(ty_elt, _, _) -> ty_elt
+ | _ -> fatal_error "%aWrong type for array initializer"
+ formatloc loc in
+ let rec array_init pos = function
+ | [] -> k
+ | i :: il ->
+ local_initializer loc env
+ { edesc = EBinop(Oindex, path, intconst pos IInt, TPtr(ty_elt, []));
+ etyp = ty_elt }
+ i
+ (array_init (Int64.succ pos) il) in
+ array_init 0L il
+ | Init_struct(id, fil) ->
+ let field_init (fld, i) k =
+ local_initializer loc env
+ { edesc = EUnop(Odot fld.fld_name, path); etyp = fld.fld_typ }
+ i k in
+ List.fold_right field_init fil k
+ | Init_union(id, fld, i) ->
+ local_initializer loc env
+ { edesc = EUnop(Odot fld.fld_name, path); etyp = fld.fld_typ }
+ i k
+
+(* Record new variables to be locally defined *)
+
+let local_variables = ref ([]: decl list)
+
+(* Note: "const int x = y - 1;" is legal, but we turn it into
+ "const int x; x = y - 1;", which is not. Therefore, remove
+ top-level 'const' attribute. Also remove it on element type of
+ array type. *)
+
+let remove_const env ty = remove_attributes_type env [AConst] ty
+
+(* Process a variable declaration.
+ The variable is entered in [local_variables].
+ The initializer, if any, is converted into assignments and
+ prepended to [k]. *)
+
+let process_decl loc env (sto, id, ty, optinit) k =
+ let ty' = remove_const env ty in
+ local_variables := (sto, id, ty', None) :: !local_variables;
+ match optinit with
+ | None -> k
+ | Some init ->
+ local_initializer loc env { edesc = EVar id; etyp = ty' } init k
+
+(* Simplification of blocks within a statement *)
+
+let rec unblock_stmt env s =
+ match s.sdesc with
+ | Sskip -> s
+ | Sdo e -> s
+ | Sseq(s1, s2) ->
+ {s with sdesc = Sseq(unblock_stmt env s1, unblock_stmt env s2)}
+ | Sif(e, s1, s2) ->
+ {s with sdesc = Sif(e, unblock_stmt env s1, unblock_stmt env s2)}
+ | Swhile(e, s1) ->
+ {s with sdesc = Swhile(e, unblock_stmt env s1)}
+ | Sdowhile(s1, e) ->
+ {s with sdesc = Sdowhile(unblock_stmt env s1, e)}
+ | Sfor(s1, e, s2, s3) ->
+ {s with sdesc = Sfor(unblock_stmt env s1, e, unblock_stmt env s2, unblock_stmt env s3)}
+ | Sbreak -> s
+ | Scontinue -> s
+ | Sswitch(e, s1) ->
+ {s with sdesc = Sswitch(e, unblock_stmt env s1)}
+ | Slabeled(lbl, s1) ->
+ {s with sdesc = Slabeled(lbl, unblock_stmt env s1)}
+ | Sgoto lbl -> s
+ | Sreturn opte -> s
+ | Sblock sl -> unblock_block env sl
+ | Sdecl d -> assert false
+
+and unblock_block env = function
+ | [] -> sskip
+ | {sdesc = Sdecl d; sloc = loc} :: sl ->
+ process_decl loc env d (unblock_block env sl)
+ | s :: sl ->
+ sseq s.sloc (unblock_stmt env s) (unblock_block env sl)
+
+(* Simplification of blocks within a function *)
+
+let unblock_fundef env f =
+ local_variables := [];
+ let body = unblock_stmt env f.fd_body in
+ let decls = !local_variables in
+ local_variables := [];
+ { f with fd_locals = f.fd_locals @ decls; fd_body = body }
+
+(* Entry point *)
+
+let program p =
+ Transform.program ~fundef:unblock_fundef p
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Simplification of blocks and initializers within functions *)
+
+val program: C.program -> C.program
--- /dev/null
+/* *********************************************************************/
+/* */
+/* The Compcert verified compiler */
+/* */
+/* Xavier Leroy, INRIA Paris-Rocquencourt */
+/* */
+/* Copyright Institut National de Recherche en Informatique et en */
+/* Automatique. All rights reserved. This file is distributed */
+/* under the terms of the GNU General Public License as published by */
+/* the Free Software Foundation, either version 2 of the License, or */
+/* (at your option) any later version. This file is also distributed */
+/* under the terms of the INRIA Non-Commercial License Agreement. */
+/* */
+/* *********************************************************************/
+
+#include <caml/mlvalues.h>
+#include <caml/alloc.h>
+
+value cparser_int64_unsigned_to_float(value v)
+{
+ return caml_copy_double((double)((uint64) Int64_val(v)));
+}
+
+value cparser_int64_unsigned_div(value v1, value v2)
+{
+ return caml_copy_int64((uint64) Int64_val(v1) / (uint64) Int64_val(v2));
+}
+
+value cparser_int64_unsigned_mod(value v1, value v2)
+{
+ return caml_copy_int64((uint64) Int64_val(v1) % (uint64) Int64_val(v2));
+}
+
+value cparser_int64_unsigned_compare(value v1, value v2)
+{
+ uint64 n1 = (uint64) Int64_val(v1);
+ uint64 n2 = (uint64) Int64_val(v2);
+ if (n1 < n2) return Val_int(-1);
+ if (n1 > n2) return Val_int(1);
+ return Val_int(0);
+}
+
--- /dev/null
+.
+./_tags
+./configure
+./Makefile.in
+./README
+./_tags.common
+./Makefile.local
+./myocamlbuild.ml
+./Makefile.config
+./distributed_files
+./Makefile.variables.in
+./_tags.compiler
+./cparser
+./cparser/SimplExpr.ml
+./cparser/Env.mli
+./cparser/C.mli
+./cparser/Builtins.mli
+./cparser/CBuiltins.ml
+./cparser/Lexer.mli
+./cparser/Elab.mli
+./cparser/StructAssign.mli
+./cparser/Parse.mli
+./cparser/Bitfields.ml
+./cparser/Machine.mli
+./cparser/Unblock.ml
+./cparser/Cleanup.mli
+./cparser/Ceval.mli
+./cparser/StructByValue.ml
+./cparser/Unblock.mli
+./cparser/Cabshelper.ml
+./cparser/AddCasts.ml
+./cparser/.depend
+./cparser/Main.ml
+./cparser/Cprint.ml
+./cparser/Machine.ml
+./cparser/StructByValue.mli
+./cparser/GCC.ml
+./cparser/uint64.c
+./cparser/Cabs.ml
+./cparser/Cutil.ml
+./cparser/Env.ml
+./cparser/Rename.ml
+./cparser/Bitfields.mli
+./cparser/Transform.ml
+./cparser/Errors.ml
+./cparser/Parse_aux.ml
+./cparser/Elab.ml
+./cparser/Cleanup.ml
+./cparser/Ceval.ml
+./cparser/Parser.mly
+./cparser/Makefile
+./cparser/Cutil.mli
+./cparser/Parse_aux.mli
+./cparser/GCC.mli
+./cparser/AddCasts.mli
+./cparser/SimplExpr.mli
+./cparser/Parse.ml
+./cparser/Errors.mli
+./cparser/Rename.mli
+./cparser/StructAssign.ml
+./cparser/Builtins.ml
+./cparser/Lexer.mll
+./cparser/Cprint.mli
+./cparser/Transform.mli
+./Makefile.generic
+./web
+./web/fetopen.png
+./web/accweb.js
+./web/make-cerco-input.sh
+./web/cerco_input.xml
+./web/accweb.html
+./web/accweb_oclosure.js
+./configure.ac
+./tests
+./tests/review1
+./tests/review1/bubble_sort.c
+./tests/review1/search.c
+./tests/tmp_tests
+./tests/tmp_tests/Backend
+./tests/tmp_tests/Backend/struct_and_ptr_and_fact_u.c
+./tests/tmp_tests/Backend/bubble_sort_u.c
+./tests/tmp_tests/Backend/quicksort.c
+./tests/tmp_tests/Backend/bubble_sort.c
+./tests/tmp_tests/Backend/array_copy_u.c
+./tests/tmp_tests/Backend/array_copy.c
+./tests/tmp_tests/Backend/struct_and_ptr_and_fact.c
+./tests/tmp_tests/Backend/search.c
+./tests/tmp_tests/Backend/quicksort_u.c
+./tests/tmp_tests/Frontend
+./tests/tmp_tests/Frontend/bubble_sort.RTLabs
+./tests/tmp_tests/Frontend/call.c
+./tests/tmp_tests/Frontend/struct_and_ptr_and_fact.RTLabs
+./tests/tmp_tests/Frontend/quicksort.RTLabs
+./tests/tmp_tests/Frontend/array_copy.RTLabs
+./tests/tmp_tests/Frontend/quicksort.c
+./tests/tmp_tests/Frontend/cparser294ccc9.i
+./tests/tmp_tests/Frontend/bubble_sort.c
+./tests/tmp_tests/Frontend/array_copy.c
+./tests/tmp_tests/Frontend/struct_and_ptr_and_fact.c
+./tests/tmp_tests/Frontend/cparser19c05bb.c
+./tests/tmp_tests/Frontend/search.RTLabs
+./tests/tmp_tests/Frontend/search.c
+./tests/GCCTestSuite
+./tests/GCCTestSuite/label-compound-stmt-1.c
+./tests/GCCTestSuite/wchar_t-2.s.expected
+./tests/GCCTestSuite/intermod-1.hex.expected
+./tests/GCCTestSuite/pr22335-1.c
+./tests/GCCTestSuite/pack-test-2.hex.expected
+./tests/GCCTestSuite/pr26570.s.expected
+./tests/GCCTestSuite/darwin-ld-3.s.expected
+./tests/GCCTestSuite/decl-4.hex.expected
+./tests/GCCTestSuite/attr-used.c.expected
+./tests/GCCTestSuite/c90-impl-int-1.hex.expected
+./tests/GCCTestSuite/arm-scd42-1.s.expected
+./tests/GCCTestSuite/declspec-12.s.expected
+./tests/GCCTestSuite/darwin-ld-20040828-2.s.expected
+./tests/GCCTestSuite/arm-scd42-3.s.expected
+./tests/GCCTestSuite/symbian4.c
+./tests/GCCTestSuite/compare8.hex.expected
+./tests/GCCTestSuite/visibility-4.c.expected
+./tests/GCCTestSuite/c90-dupqual-1.s.expected
+./tests/GCCTestSuite/profile-generate-1.s.expected
+./tests/GCCTestSuite/register-var-2.c.expected
+./tests/GCCTestSuite/array-quals-2.hex.expected
+./tests/GCCTestSuite/winline-7.s.expected
+./tests/GCCTestSuite/pr11459-1.hex.expected
+./tests/GCCTestSuite/pragma-isr-trap_exit.s.expected
+./tests/GCCTestSuite/uninit-6.c.expected
+./tests/GCCTestSuite/inline-8.hex.expected
+./tests/GCCTestSuite/pr11864-1.c
+./tests/GCCTestSuite/bitfld-5.c
+./tests/GCCTestSuite/void-cast-1.c
+./tests/GCCTestSuite/darwin-ld-5.hex.expected
+./tests/GCCTestSuite/darwin-ld-20040828-1.c.expected
+./tests/GCCTestSuite/local1.hex.expected
+./tests/GCCTestSuite/qual-return-4.hex.expected
+./tests/GCCTestSuite/noreturn-7.c.expected
+./tests/GCCTestSuite/951130-1.hex.expected
+./tests/GCCTestSuite/empty-source-3.hex.expected
+./tests/GCCTestSuite/pr22308-1.s.expected
+./tests/GCCTestSuite/pr23584.s.expected
+./tests/GCCTestSuite/winline-3.hex.expected
+./tests/GCCTestSuite/concat2.c.expected
+./tests/GCCTestSuite/pr17635.hex.expected
+./tests/GCCTestSuite/empty-source-1.c
+./tests/GCCTestSuite/visibility-8.s.expected
+./tests/GCCTestSuite/parm-mismatch-1.c.expected
+./tests/GCCTestSuite/980502-1.c.expected
+./tests/GCCTestSuite/profile-generate-2.hex.expected
+./tests/GCCTestSuite/wchar_t-1.hex.expected
+./tests/GCCTestSuite/symbian1.c.expected
+./tests/GCCTestSuite/noreturn-2.c
+./tests/GCCTestSuite/pr15825-1.hex.expected
+./tests/GCCTestSuite/inline2.c
+./tests/GCCTestSuite/c90-idem-qual-3.c
+./tests/GCCTestSuite/pr29581-1.hex.expected
+./tests/GCCTestSuite/anon-struct-6.c.expected
+./tests/GCCTestSuite/inline-17.s.expected
+./tests/GCCTestSuite/pr25795-1.c
+./tests/GCCTestSuite/c99-main-1.s.expected
+./tests/GCCTestSuite/pr30473.c
+./tests/GCCTestSuite/arm-scd42-3.hex.expected
+./tests/GCCTestSuite/darwin-ld-4.s.expected
+./tests/GCCTestSuite/c99-idem-qual-3.c.expected
+./tests/GCCTestSuite/register-var-1.c
+./tests/GCCTestSuite/section1.c
+./tests/GCCTestSuite/inline-7.c.expected
+./tests/GCCTestSuite/funroll-loops-all.c.expected
+./tests/GCCTestSuite/inline-18.hex.expected
+./tests/GCCTestSuite/c90-mixdecl-1.c.expected
+./tests/GCCTestSuite/attr-mode-1.c.expected
+./tests/GCCTestSuite/c90-flex-array-1.c
+./tests/GCCTestSuite/c90-impl-int-1.c
+./tests/GCCTestSuite/pr18241-5.hex.expected
+./tests/GCCTestSuite/uninit-D.s.expected
+./tests/GCCTestSuite/pr17036-1.hex.expected
+./tests/GCCTestSuite/cris-peep2-andu2.hex.expected
+./tests/GCCTestSuite/c99-tag-2.c
+./tests/GCCTestSuite/c90-array-quals-2.c
+./tests/GCCTestSuite/bitfld-6.c.expected
+./tests/GCCTestSuite/void-cast-2.hex.expected
+./tests/GCCTestSuite/pr24367.hex.expected
+./tests/GCCTestSuite/c99-array-lval-6.hex.expected
+./tests/GCCTestSuite/noreturn-7.hex.expected
+./tests/GCCTestSuite/const-elim-2.c
+./tests/GCCTestSuite/c90-idem-qual-2.c
+./tests/GCCTestSuite/940409-1.c
+./tests/GCCTestSuite/pr21085.s.expected
+./tests/GCCTestSuite/c99-array-lval-6.c.expected
+./tests/GCCTestSuite/align-1.s.expected
+./tests/GCCTestSuite/volatile1.s.expected
+./tests/GCCTestSuite/uninit-C.c.expected
+./tests/GCCTestSuite/decl-4.c
+./tests/GCCTestSuite/winline-1.s.expected
+./tests/GCCTestSuite/always_inline2.c.expected
+./tests/GCCTestSuite/simd-1b.hex.expected
+./tests/GCCTestSuite/winline-2.c
+./tests/GCCTestSuite/c99-tag-2.s.expected
+./tests/GCCTestSuite/pr22335-2.s.expected
+./tests/GCCTestSuite/attr-mode-1.hex.expected
+./tests/GCCTestSuite/inline-8.c.expected
+./tests/GCCTestSuite/c99-array-nonobj-1.s.expected
+./tests/GCCTestSuite/compare7.c
+./tests/GCCTestSuite/darwin-ld-20040809-2.c
+./tests/GCCTestSuite/pr23625.s.expected
+./tests/GCCTestSuite/uninit-5.c.expected
+./tests/GCCTestSuite/const-elim-2.hex.expected
+./tests/GCCTestSuite/pr15698-3.c.expected
+./tests/GCCTestSuite/pr25559.c.expected
+./tests/GCCTestSuite/pr26004.c
+./tests/GCCTestSuite/always_inline3.c
+./tests/GCCTestSuite/inline-21.c
+./tests/GCCTestSuite/always_inline3.s.expected
+./tests/GCCTestSuite/empty-source-2.hex.expected
+./tests/GCCTestSuite/pr11459-1.s.expected
+./tests/GCCTestSuite/inline-6.c.expected
+./tests/GCCTestSuite/unused-3.s.expected
+./tests/GCCTestSuite/wtr-switch-1.s.expected
+./tests/GCCTestSuite/pr18921-1.s.expected
+./tests/GCCTestSuite/empty-source-3.c
+./tests/GCCTestSuite/inline-10.c
+./tests/GCCTestSuite/nonnull-1.c
+./tests/GCCTestSuite/dll-4.c
+./tests/GCCTestSuite/cleanup-6.c.expected
+./tests/GCCTestSuite/pr17957.hex.expected
+./tests/GCCTestSuite/unused-4.s.expected
+./tests/GCCTestSuite/winline-5.hex.expected
+./tests/GCCTestSuite/inline2.c.expected
+./tests/GCCTestSuite/pragma-ep-2.c.expected
+./tests/GCCTestSuite/cast-qual-1.hex.expected
+./tests/GCCTestSuite/uninit-F.c.expected
+./tests/GCCTestSuite/uninit-H.hex.expected
+./tests/GCCTestSuite/visibility-9.c.expected
+./tests/GCCTestSuite/winline-7.c.expected
+./tests/GCCTestSuite/ultrasp4.hex.expected
+./tests/GCCTestSuite/unused-5.c.expected
+./tests/GCCTestSuite/redecl-9.hex.expected
+./tests/GCCTestSuite/c99-impl-int-2.c.expected
+./tests/GCCTestSuite/dollar.c.expected
+./tests/GCCTestSuite/fold-xor-2.c.expected
+./tests/GCCTestSuite/deprecated-3.c
+./tests/GCCTestSuite/c90-array-lval-5.c
+./tests/GCCTestSuite/pr15784-4.c
+./tests/GCCTestSuite/anon-struct-6.s.expected
+./tests/GCCTestSuite/c99-restrict-2.c
+./tests/GCCTestSuite/null-pointer-1.s.expected
+./tests/GCCTestSuite/inline-18.s.expected
+./tests/GCCTestSuite/comp-return-1.s.expected
+./tests/GCCTestSuite/cleanup-6.s.expected
+./tests/GCCTestSuite/alias-8.c.expected
+./tests/GCCTestSuite/c90-array-quals-2.c.expected
+./tests/GCCTestSuite/uninit-11.c.expected
+./tests/GCCTestSuite/c99-dupqual-1.c.expected
+./tests/GCCTestSuite/pr22329.c
+./tests/GCCTestSuite/fold-abs-3.c
+./tests/GCCTestSuite/pr3074-1.s.expected
+./tests/GCCTestSuite/pr15698-4.c.expected
+./tests/GCCTestSuite/pragma-ep-3.s.expected
+./tests/GCCTestSuite/pr15698-6.s.expected
+./tests/GCCTestSuite/struct-ret-2.c.expected
+./tests/GCCTestSuite/inline5.s.expected
+./tests/GCCTestSuite/redecl-13.c
+./tests/GCCTestSuite/inline1.s.expected
+./tests/GCCTestSuite/sparc-constant-1.c
+./tests/GCCTestSuite/pr15698-6.c.expected
+./tests/GCCTestSuite/darwin-ld-1.s.expected
+./tests/GCCTestSuite/funcdef-var-2.hex.expected
+./tests/GCCTestSuite/unused-5.hex.expected
+./tests/GCCTestSuite/pr29581-3.hex.expected
+./tests/GCCTestSuite/always_inline3.c.expected
+./tests/GCCTestSuite/parm-mismatch-1.hex.expected
+./tests/GCCTestSuite/fdata-sections-1.hex.expected
+./tests/GCCTestSuite/label-compound-stmt-1.c.expected
+./tests/GCCTestSuite/ultrasp2.c.expected
+./tests/GCCTestSuite/c99-func-2.c
+./tests/GCCTestSuite/alias-2.c.expected
+./tests/GCCTestSuite/struct-empty-2.hex.expected
+./tests/GCCTestSuite/attr-isr-trap_exit.c.expected
+./tests/GCCTestSuite/assign-warn-3.c
+./tests/GCCTestSuite/c99-array-lval-7.c
+./tests/GCCTestSuite/pr18921-1.c
+./tests/GCCTestSuite/uninit-2.c
+./tests/GCCTestSuite/visibility-b.c.expected
+./tests/GCCTestSuite/c90-enum-comma-1.s.expected
+./tests/GCCTestSuite/profile-generate-1.hex.expected
+./tests/GCCTestSuite/winline-2.s.expected
+./tests/GCCTestSuite/null-pointer-1.hex.expected
+./tests/GCCTestSuite/always_inline2.hex.expected
+./tests/GCCTestSuite/visibility-1.c.expected
+./tests/GCCTestSuite/990213-1.s.expected
+./tests/GCCTestSuite/void-cast-2.c.expected
+./tests/GCCTestSuite/uninit-11.hex.expected
+./tests/GCCTestSuite/redecl-8.hex.expected
+./tests/GCCTestSuite/pr24445.c.expected
+./tests/GCCTestSuite/nrv2.hex.expected
+./tests/GCCTestSuite/uninit-B.c
+./tests/GCCTestSuite/pr24683.c.expected
+./tests/GCCTestSuite/c99-array-lval-1.c.expected
+./tests/GCCTestSuite/pr14796-1.c.expected
+./tests/GCCTestSuite/990213-1.c
+./tests/GCCTestSuite/if-empty-1.c.expected
+./tests/GCCTestSuite/register-var-2.hex.expected
+./tests/GCCTestSuite/funcdef-attr-1.c
+./tests/GCCTestSuite/uninit-D.hex.expected
+./tests/GCCTestSuite/inline4.s.expected
+./tests/GCCTestSuite/winline-7.c
+./tests/GCCTestSuite/pr15698-7.c
+./tests/GCCTestSuite/c90-static-1.c
+./tests/GCCTestSuite/transparent-union-3.s.expected
+./tests/GCCTestSuite/visibility-9.c
+./tests/GCCTestSuite/pr15698-4.hex.expected
+./tests/GCCTestSuite/builtin-strstr.s.expected
+./tests/GCCTestSuite/assign-warn-3.hex.expected
+./tests/GCCTestSuite/darwin-ld-20040828-3.c
+./tests/GCCTestSuite/uninit-G.hex.expected
+./tests/GCCTestSuite/pr15784-4.hex.expected
+./tests/GCCTestSuite/pr24683.c
+./tests/GCCTestSuite/attr-isr-trap_exit.c
+./tests/GCCTestSuite/c99-func-2.s.expected
+./tests/GCCTestSuite/enum3.s.expected
+./tests/GCCTestSuite/uninit-2.c.expected
+./tests/GCCTestSuite/pragma-ep-3.c.expected
+./tests/GCCTestSuite/darwin-ld-20040809-2.c.expected
+./tests/GCCTestSuite/visibility-5.c
+./tests/GCCTestSuite/dll-2.hex.expected
+./tests/GCCTestSuite/if-empty-1.c
+./tests/GCCTestSuite/pr28402.c
+./tests/GCCTestSuite/pr22308-1.hex.expected
+./tests/GCCTestSuite/darwin-20040809-2.c.expected
+./tests/GCCTestSuite/array-1.s.expected
+./tests/GCCTestSuite/pr22308-1.c.expected
+./tests/GCCTestSuite/old-style-then-proto-1.s.expected
+./tests/GCCTestSuite/bitfld-14.c.expected
+./tests/GCCTestSuite/anon-struct-7.c.expected
+./tests/GCCTestSuite/old-style-then-proto-1.c
+./tests/GCCTestSuite/pr20017.c.expected
+./tests/GCCTestSuite/visibility-a.s.expected
+./tests/GCCTestSuite/inline-4.c
+./tests/GCCTestSuite/920413-1.hex.expected
+./tests/GCCTestSuite/profile-generate-1.c
+./tests/GCCTestSuite/declspec-12.hex.expected
+./tests/GCCTestSuite/c99-tag-2.c.expected
+./tests/GCCTestSuite/cast-qual-1.c
+./tests/GCCTestSuite/cris-peep2-xsrand.s.expected
+./tests/GCCTestSuite/merge-all-constants-1.c
+./tests/GCCTestSuite/c90-impl-int-2.c
+./tests/GCCTestSuite/visibility-b.c
+./tests/GCCTestSuite/pragma-pack-4.s.expected
+./tests/GCCTestSuite/declspec-3.c.expected
+./tests/GCCTestSuite/qual-return-3.hex.expected
+./tests/GCCTestSuite/compare8.c
+./tests/GCCTestSuite/compare9.s.expected
+./tests/GCCTestSuite/c90-static-1.s.expected
+./tests/GCCTestSuite/980502-1.c
+./tests/GCCTestSuite/wtr-strcat-1.hex.expected
+./tests/GCCTestSuite/nested-redef-1.s.expected
+./tests/GCCTestSuite/c90-dupqual-1.hex.expected
+./tests/GCCTestSuite/pr24620.c
+./tests/GCCTestSuite/doloop-2.s.expected
+./tests/GCCTestSuite/compare8.s.expected
+./tests/GCCTestSuite/merge-all-constants-1.c.expected
+./tests/GCCTestSuite/simd-1b.c.expected
+./tests/GCCTestSuite/warn-1.s.expected
+./tests/GCCTestSuite/920413-1.c.expected
+./tests/GCCTestSuite/cris-peep2-andu1.hex.expected
+./tests/GCCTestSuite/doloop-2.c.expected
+./tests/GCCTestSuite/c90-static-1.hex.expected
+./tests/GCCTestSuite/uninit-1.s.expected
+./tests/GCCTestSuite/fold-abs-3.hex.expected
+./tests/GCCTestSuite/uninit-1.c
+./tests/GCCTestSuite/winline-1.c
+./tests/GCCTestSuite/struct-empty-2.s.expected
+./tests/GCCTestSuite/struct-empty-3.s.expected
+./tests/GCCTestSuite/winline-1.c.expected
+./tests/GCCTestSuite/pr15784-4.c.expected
+./tests/GCCTestSuite/ultrasp10.c.expected
+./tests/GCCTestSuite/dll-4.hex.expected
+./tests/GCCTestSuite/fold-abs-1.hex.expected
+./tests/GCCTestSuite/typedef-init.hex.expected
+./tests/GCCTestSuite/declspec-3.hex.expected
+./tests/GCCTestSuite/uninit-1.hex.expected
+./tests/GCCTestSuite/compare6.s.expected
+./tests/GCCTestSuite/label-compound-stmt-1.s.expected
+./tests/GCCTestSuite/pr14796-1.hex.expected
+./tests/GCCTestSuite/cris-peep2-andu2.s.expected
+./tests/GCCTestSuite/pr14475.c.expected
+./tests/GCCTestSuite/h8300-stack-1.c.expected
+./tests/GCCTestSuite/fold-mod-1.c.expected
+./tests/GCCTestSuite/asm-fs-1.c.expected
+./tests/GCCTestSuite/pr24615.s.expected
+./tests/GCCTestSuite/pr24615.c
+./tests/GCCTestSuite/pr23165.hex.expected
+./tests/GCCTestSuite/inline-1.c
+./tests/GCCTestSuite/local1.s.expected
+./tests/GCCTestSuite/m-un-1.s.expected
+./tests/GCCTestSuite/postincr-1.c.expected
+./tests/GCCTestSuite/pr24445.c
+./tests/GCCTestSuite/wtr-strcat-1.s.expected
+./tests/GCCTestSuite/anon-struct-3.c
+./tests/GCCTestSuite/inline-6.s.expected
+./tests/GCCTestSuite/c90-impl-int-2.hex.expected
+./tests/GCCTestSuite/warn-1.c.expected
+./tests/GCCTestSuite/wtr-unary-plus-1.c.expected
+./tests/GCCTestSuite/kpice1.hex.expected
+./tests/GCCTestSuite/pr23625.hex.expected
+./tests/GCCTestSuite/c90-restrict-1.c.expected
+./tests/GCCTestSuite/uninit-F.c
+./tests/GCCTestSuite/return-type-1.hex.expected
+./tests/GCCTestSuite/visibility-3.s.expected
+./tests/GCCTestSuite/pragma-isr-trap_exit.c
+./tests/GCCTestSuite/pr22335-2.hex.expected
+./tests/GCCTestSuite/warn-1.c
+./tests/GCCTestSuite/pr25993.s.expected
+./tests/GCCTestSuite/struct-ret-2.hex.expected
+./tests/GCCTestSuite/pr15698-7.s.expected
+./tests/GCCTestSuite/align-1.c
+./tests/GCCTestSuite/pr28402.hex.expected
+./tests/GCCTestSuite/fold-abs-1.s.expected
+./tests/GCCTestSuite/uninit-3.c
+./tests/GCCTestSuite/nested-calls-1.s.expected
+./tests/GCCTestSuite/inline-mcpy.c.expected
+./tests/GCCTestSuite/cris-peep2-andu2.c.expected
+./tests/GCCTestSuite/bitfld-10.c
+./tests/GCCTestSuite/uninit-I.c
+./tests/GCCTestSuite/pr22311-1.s.expected
+./tests/GCCTestSuite/attr-alwaysinline.s.expected
+./tests/GCCTestSuite/funroll-loops-all.hex.expected
+./tests/GCCTestSuite/951130-1.c
+./tests/GCCTestSuite/empty-source-1.hex.expected
+./tests/GCCTestSuite/pr15443-2.hex.expected
+./tests/GCCTestSuite/uninit-I.c.expected
+./tests/GCCTestSuite/c99-flex-array-3.c
+./tests/GCCTestSuite/anon-struct-7.s.expected
+./tests/GCCTestSuite/pr24620.hex.expected
+./tests/GCCTestSuite/typedef-init.c.expected
+./tests/GCCTestSuite/uninit-9.hex.expected
+./tests/GCCTestSuite/pragma-ep-3.c
+./tests/GCCTestSuite/wtr-escape-1.hex.expected
+./tests/GCCTestSuite/attr-used-2.c
+./tests/GCCTestSuite/uninit-8.c.expected
+./tests/GCCTestSuite/anon-struct-5.s.expected
+./tests/GCCTestSuite/c99-array-lval-7.s.expected
+./tests/GCCTestSuite/symbian5.c
+./tests/GCCTestSuite/visibility-3.hex.expected
+./tests/GCCTestSuite/inline-10.hex.expected
+./tests/GCCTestSuite/array-quals-2.c
+./tests/GCCTestSuite/darwin-ld-3.hex.expected
+./tests/GCCTestSuite/pr15698-3.c
+./tests/GCCTestSuite/pr17957.c.expected
+./tests/GCCTestSuite/struct-ret-2.s.expected
+./tests/GCCTestSuite/visibility-c.c
+./tests/GCCTestSuite/compare7.hex.expected
+./tests/GCCTestSuite/null-pointer-1.c.expected
+./tests/GCCTestSuite/funcdef-attr-1.hex.expected
+./tests/GCCTestSuite/940409-1.s.expected
+./tests/GCCTestSuite/visibility-7.s.expected
+./tests/GCCTestSuite/fold-abs-1.c.expected
+./tests/GCCTestSuite/void-cast-2.c
+./tests/GCCTestSuite/pr29736.c
+./tests/GCCTestSuite/darwin-ld-3.c
+./tests/GCCTestSuite/wint_t-1.c
+./tests/GCCTestSuite/darwin-ld-5.s.expected
+./tests/GCCTestSuite/cris-peep2-andu1.c
+./tests/GCCTestSuite/compare6.c
+./tests/GCCTestSuite/label-compound-stmt-1.hex.expected
+./tests/GCCTestSuite/unroll-1.c.expected
+./tests/GCCTestSuite/redecl-8.c
+./tests/GCCTestSuite/c99-impl-int-1.c
+./tests/GCCTestSuite/uninit-9.c
+./tests/GCCTestSuite/bitfld-6.hex.expected
+./tests/GCCTestSuite/pr14475.hex.expected
+./tests/GCCTestSuite/pr18809-1.c.expected
+./tests/GCCTestSuite/funcdef-var-2.c
+./tests/GCCTestSuite/c99-array-nonobj-1.hex.expected
+./tests/GCCTestSuite/c90-array-lval-6.c
+./tests/GCCTestSuite/uninit-E.c.expected
+./tests/GCCTestSuite/wtr-union-init-1.c.expected
+./tests/GCCTestSuite/visibility-10.hex.expected
+./tests/GCCTestSuite/ftrapv-1.c.expected
+./tests/GCCTestSuite/visibility-4.hex.expected
+./tests/GCCTestSuite/darwin-ld-20040809-1.hex.expected
+./tests/GCCTestSuite/inline-8.s.expected
+./tests/GCCTestSuite/uninit-C.c
+./tests/GCCTestSuite/c90-longlong-1.hex.expected
+./tests/GCCTestSuite/pr24683.s.expected
+./tests/GCCTestSuite/pr32450.c
+./tests/GCCTestSuite/c90-enum-comma-1.c
+./tests/GCCTestSuite/inline-mcpy.s.expected
+./tests/GCCTestSuite/inline1.c
+./tests/GCCTestSuite/visibility-8.c.expected
+./tests/GCCTestSuite/inline-7.s.expected
+./tests/GCCTestSuite/pr23625.c
+./tests/GCCTestSuite/noreturn-6.hex.expected
+./tests/GCCTestSuite/postincr-1.s.expected
+./tests/GCCTestSuite/visibility-a.c.expected
+./tests/GCCTestSuite/reg-vol-struct-1.c.expected
+./tests/GCCTestSuite/concat2.c
+./tests/GCCTestSuite/pragma-isr-trap_exit.c.expected
+./tests/GCCTestSuite/winline-3.c.expected
+./tests/GCCTestSuite/merge-all-constants-1.s.expected
+./tests/GCCTestSuite/c99-array-lval-1.c
+./tests/GCCTestSuite/pr22329.s.expected
+./tests/GCCTestSuite/nested-redef-1.c
+./tests/GCCTestSuite/enum3.c.expected
+./tests/GCCTestSuite/profile-generate-2.s.expected
+./tests/GCCTestSuite/pr17581-1.c
+./tests/GCCTestSuite/c90-dupqual-1.c.expected
+./tests/GCCTestSuite/winline-6.c.expected
+./tests/GCCTestSuite/pr15698-3.hex.expected
+./tests/GCCTestSuite/pr29581-3.c
+./tests/GCCTestSuite/winline-5.c
+./tests/GCCTestSuite/unused-2.c
+./tests/GCCTestSuite/if-empty-1.hex.expected
+./tests/GCCTestSuite/concat.c.expected
+./tests/GCCTestSuite/c90-array-quals.c
+./tests/GCCTestSuite/return-type-3.c
+./tests/GCCTestSuite/darwin-ld-1.hex.expected
+./tests/GCCTestSuite/postincr-1.hex.expected
+./tests/GCCTestSuite/c90-impl-int-2.s.expected
+./tests/GCCTestSuite/doloop-2.hex.expected
+./tests/GCCTestSuite/cast-qual-1.c.expected
+./tests/GCCTestSuite/inline5.c
+./tests/GCCTestSuite/bitfld-10.hex.expected
+./tests/GCCTestSuite/darwin-ld-3.c.expected
+./tests/GCCTestSuite/void-cast-1.s.expected
+./tests/GCCTestSuite/pr26004.hex.expected
+./tests/GCCTestSuite/assign-warn-3.s.expected
+./tests/GCCTestSuite/align-1.hex.expected
+./tests/GCCTestSuite/return-type-1.s.expected
+./tests/GCCTestSuite/pr25196.hex.expected
+./tests/GCCTestSuite/unused-6.hex.expected
+./tests/GCCTestSuite/section1.s.expected
+./tests/GCCTestSuite/c90-array-lval-5.s.expected
+./tests/GCCTestSuite/c99-tag-2.hex.expected
+./tests/GCCTestSuite/pr26004.c.expected
+./tests/GCCTestSuite/switch-1.c
+./tests/GCCTestSuite/c99-restrict-1.c
+./tests/GCCTestSuite/uninit-E.hex.expected
+./tests/GCCTestSuite/uninit-D.c
+./tests/GCCTestSuite/c99-idem-qual-1.s.expected
+./tests/GCCTestSuite/alias-8.c
+./tests/GCCTestSuite/struct-empty-3.c
+./tests/GCCTestSuite/nrv2.c
+./tests/GCCTestSuite/c90-array-lval-7.c
+./tests/GCCTestSuite/intmax_t-1.s.expected
+./tests/GCCTestSuite/anon-struct-8.c.expected
+./tests/GCCTestSuite/asm-fs-1.s.expected
+./tests/GCCTestSuite/c99-func-4.s.expected
+./tests/GCCTestSuite/nonnull-2.s.expected
+./tests/GCCTestSuite/c99-func-2.hex.expected
+./tests/GCCTestSuite/qual-return-2.c
+./tests/GCCTestSuite/darwin-ld-20040828-2.c
+./tests/GCCTestSuite/compare8.c.expected
+./tests/GCCTestSuite/c99-idem-qual-2.c
+./tests/GCCTestSuite/void-cast-1.c.expected
+./tests/GCCTestSuite/pr3074-1.c.expected
+./tests/GCCTestSuite/pr20115.s.expected
+./tests/GCCTestSuite/c99-restrict-1.hex.expected
+./tests/GCCTestSuite/gnu89-dupqual-1.s.expected
+./tests/GCCTestSuite/unused-6.s.expected
+./tests/GCCTestSuite/old-style-then-proto-1.hex.expected
+./tests/GCCTestSuite/m-un-1.hex.expected
+./tests/GCCTestSuite/verbose-asm.c
+./tests/GCCTestSuite/return-type-2.c
+./tests/GCCTestSuite/attr-used.s.expected
+./tests/GCCTestSuite/always_inline2.s.expected
+./tests/GCCTestSuite/pr20130-1.c
+./tests/GCCTestSuite/builtin-strstr.hex.expected
+./tests/GCCTestSuite/cris-peep2-xsrand.c.expected
+./tests/GCCTestSuite/nested-redef-1.hex.expected
+./tests/GCCTestSuite/pr18928-1.c
+./tests/GCCTestSuite/fdata-sections-1.c.expected
+./tests/GCCTestSuite/darwin-ld-20040828-2.c.expected
+./tests/GCCTestSuite/uninit-3.s.expected
+./tests/GCCTestSuite/darwin-ld-20040828-3.s.expected
+./tests/GCCTestSuite/pr17036-1.c.expected
+./tests/GCCTestSuite/ftrapv-1.c
+./tests/GCCTestSuite/if-empty-1.s.expected
+./tests/GCCTestSuite/uninit-9.c.expected
+./tests/GCCTestSuite/c99-longlong-1.c
+./tests/GCCTestSuite/uninit-4.c
+./tests/GCCTestSuite/qual-return-4.c
+./tests/GCCTestSuite/dll-4.c.expected
+./tests/GCCTestSuite/visibility-7.c.expected
+./tests/GCCTestSuite/pack-test-2.s.expected
+./tests/GCCTestSuite/redecl-9.s.expected
+./tests/GCCTestSuite/uninit-G.c
+./tests/GCCTestSuite/c99-impl-int-1.hex.expected
+./tests/GCCTestSuite/doloop-2.c
+./tests/GCCTestSuite/inline4.c
+./tests/GCCTestSuite/h8300-stack-1.c
+./tests/GCCTestSuite/c99-array-lval-5.c
+./tests/GCCTestSuite/bitfld-5.c.expected
+./tests/GCCTestSuite/unused-1.c
+./tests/GCCTestSuite/empty-source-1.s.expected
+./tests/GCCTestSuite/pr12625-1.c.expected
+./tests/GCCTestSuite/bitfld-10.c.expected
+./tests/GCCTestSuite/transparent-union-2.c.expected
+./tests/GCCTestSuite/return-type-3.s.expected
+./tests/GCCTestSuite/pr32450.c.expected
+./tests/GCCTestSuite/visibility-11.c
+./tests/GCCTestSuite/intermod-1.c.expected
+./tests/GCCTestSuite/c90-idem-qual-1.hex.expected
+./tests/GCCTestSuite/pure-1.c.expected
+./tests/GCCTestSuite/extra-semi-1.s.expected
+./tests/GCCTestSuite/visibility-9.s.expected
+./tests/GCCTestSuite/inline-9.hex.expected
+./tests/GCCTestSuite/pr17635.c.expected
+./tests/GCCTestSuite/darwin-ld-1.c.expected
+./tests/GCCTestSuite/pr28402.s.expected
+./tests/GCCTestSuite/pr15825-1.c.expected
+./tests/GCCTestSuite/pr26570.c
+./tests/GCCTestSuite/const-elim-2.c.expected
+./tests/GCCTestSuite/pr25993.c.expected
+./tests/GCCTestSuite/arm-scd42-1.c.expected
+./tests/GCCTestSuite/visibility-10.s.expected
+./tests/GCCTestSuite/profile-generate-2.c
+./tests/GCCTestSuite/c90-longlong-1.c
+./tests/GCCTestSuite/unused-6.c.expected
+./tests/GCCTestSuite/pr28187.s.expected
+./tests/GCCTestSuite/uninit-C.hex.expected
+./tests/GCCTestSuite/c99-idem-qual-2.c.expected
+./tests/GCCTestSuite/attr-isr-trap_exit.hex.expected
+./tests/GCCTestSuite/c90-longlong-1.s.expected
+./tests/GCCTestSuite/c99-flex-array-3.s.expected
+./tests/GCCTestSuite/pr11864-1.c.expected
+./tests/GCCTestSuite/qual-return-4.c.expected
+./tests/GCCTestSuite/unused-1.s.expected
+./tests/GCCTestSuite/pr30473.c.expected
+./tests/GCCTestSuite/pr14796-1.c
+./tests/GCCTestSuite/verbose-asm.c.expected
+./tests/GCCTestSuite/enum2.c
+./tests/GCCTestSuite/pragma-isr2.c
+./tests/GCCTestSuite/winline-6.hex.expected
+./tests/GCCTestSuite/darwin-weakimport-1.s.expected
+./tests/GCCTestSuite/pure-1.hex.expected
+./tests/GCCTestSuite/noreturn-6.c.expected
+./tests/GCCTestSuite/inline5.hex.expected
+./tests/GCCTestSuite/pr18479.s.expected
+./tests/GCCTestSuite/winline-2.hex.expected
+./tests/GCCTestSuite/kpice1.s.expected
+./tests/GCCTestSuite/visibility-5.s.expected
+./tests/GCCTestSuite/enum2.s.expected
+./tests/GCCTestSuite/compare1.c.expected
+./tests/GCCTestSuite/winline-3.c
+./tests/GCCTestSuite/noreturn-6.s.expected
+./tests/GCCTestSuite/redecl-6.hex.expected
+./tests/GCCTestSuite/decl-6.hex.expected
+./tests/GCCTestSuite/symbian1.c
+./tests/GCCTestSuite/pr24367.c
+./tests/GCCTestSuite/wtr-static-1.s.expected
+./tests/GCCTestSuite/c90-array-quals.hex.expected
+./tests/GCCTestSuite/noreturn-2.c.expected
+./tests/GCCTestSuite/cleanup-3.s.expected
+./tests/GCCTestSuite/pr18809-1.hex.expected
+./tests/GCCTestSuite/unused-7.s.expected
+./tests/GCCTestSuite/c99-longlong-1.hex.expected
+./tests/GCCTestSuite/ultrasp2.hex.expected
+./tests/GCCTestSuite/local1.c.expected
+./tests/GCCTestSuite/pr22335-1.hex.expected
+./tests/GCCTestSuite/builtins-35.c.expected
+./tests/GCCTestSuite/unused-5.s.expected
+./tests/GCCTestSuite/c99-func-4.c
+./tests/GCCTestSuite/wtr-unary-plus-1.c
+./tests/GCCTestSuite/fold-abs-3.c.expected
+./tests/GCCTestSuite/qual-return-2.hex.expected
+./tests/GCCTestSuite/anon-struct-3.s.expected
+./tests/GCCTestSuite/visibility-c.s.expected
+./tests/GCCTestSuite/pr23584.c
+./tests/GCCTestSuite/pr24620.s.expected
+./tests/GCCTestSuite/visibility-b.hex.expected
+./tests/GCCTestSuite/sparc-constant-1.c.expected
+./tests/GCCTestSuite/noreturn-1.s.expected
+./tests/GCCTestSuite/pr14796-2.c
+./tests/GCCTestSuite/switch-1.c.expected
+./tests/GCCTestSuite/h8300-stack-1.hex.expected
+./tests/GCCTestSuite/c99-restrict-1.c.expected
+./tests/GCCTestSuite/simd-3.c
+./tests/GCCTestSuite/noreturn-1.c
+./tests/GCCTestSuite/pr25196.s.expected
+./tests/GCCTestSuite/register-var-1.c.expected
+./tests/GCCTestSuite/transparent-union-2.c
+./tests/GCCTestSuite/arm-scd42-1.c
+./tests/GCCTestSuite/wtr-switch-1.c
+./tests/GCCTestSuite/c99-impl-int-2.c
+./tests/GCCTestSuite/cleanup-3.c.expected
+./tests/GCCTestSuite/arm-g2.c
+./tests/GCCTestSuite/c99-const-expr-1.c
+./tests/GCCTestSuite/uninit-11.c
+./tests/GCCTestSuite/wchar_t-1.c
+./tests/GCCTestSuite/pr20130-1.c.expected
+./tests/GCCTestSuite/anon-struct-3.c.expected
+./tests/GCCTestSuite/conv-3.hex.expected
+./tests/GCCTestSuite/pr24600.s.expected
+./tests/GCCTestSuite/pr25559.s.expected
+./tests/GCCTestSuite/c99-flex-array-3.c.expected
+./tests/GCCTestSuite/pragma-isr2.s.expected
+./tests/GCCTestSuite/attr-mode-1.s.expected
+./tests/GCCTestSuite/visibility-5.hex.expected
+./tests/GCCTestSuite/uninit-6.s.expected
+./tests/GCCTestSuite/bitfld-14.c
+./tests/GCCTestSuite/extra-semi-3.c
+./tests/GCCTestSuite/990213-1.hex.expected
+./tests/GCCTestSuite/gnu89-dupqual-1.hex.expected
+./tests/GCCTestSuite/uninit-6.c
+./tests/GCCTestSuite/kpice1.c.expected
+./tests/GCCTestSuite/builtins-35.hex.expected
+./tests/GCCTestSuite/inline-19.c
+./tests/GCCTestSuite/uninit-B.s.expected
+./tests/GCCTestSuite/visibility-a.hex.expected
+./tests/GCCTestSuite/inline-1.s.expected
+./tests/GCCTestSuite/pack-test-3.c.expected
+./tests/GCCTestSuite/bitfld-5.s.expected
+./tests/GCCTestSuite/c99-idem-qual-3.hex.expected
+./tests/GCCTestSuite/uninit-B.c.expected
+./tests/GCCTestSuite/funroll-loops-all.s.expected
+./tests/GCCTestSuite/funcdef-var-2.c.expected
+./tests/GCCTestSuite/c90-idem-qual-2.c.expected
+./tests/GCCTestSuite/darwin-ld-2.c.expected
+./tests/GCCTestSuite/inline5.c.expected
+./tests/GCCTestSuite/extra-semi-2.s.expected
+./tests/GCCTestSuite/pr20115.hex.expected
+./tests/GCCTestSuite/uninit-G.s.expected
+./tests/GCCTestSuite/asm-fs-1.c
+./tests/GCCTestSuite/align-1.c.expected
+./tests/GCCTestSuite/pr26961-1.hex.expected
+./tests/GCCTestSuite/pragma-ep-2.s.expected
+./tests/GCCTestSuite/darwin-ld-20040809-1.c.expected
+./tests/GCCTestSuite/pr21085.hex.expected
+./tests/GCCTestSuite/alias-8.hex.expected
+./tests/GCCTestSuite/pr28402.c.expected
+./tests/GCCTestSuite/pr22311-1.c.expected
+./tests/GCCTestSuite/symbian3.c
+./tests/GCCTestSuite/inline-2.c.expected
+./tests/GCCTestSuite/pr20115-1.hex.expected
+./tests/GCCTestSuite/pack-test-3.hex.expected
+./tests/GCCTestSuite/visibility-8.hex.expected
+./tests/GCCTestSuite/darwin-ld-4.hex.expected
+./tests/GCCTestSuite/darwin-ld-6.c.expected
+./tests/GCCTestSuite/pr11459-1.c
+./tests/GCCTestSuite/redecl-6.c
+./tests/GCCTestSuite/noreturn-7.c
+./tests/GCCTestSuite/wtr-unary-plus-1.hex.expected
+./tests/GCCTestSuite/unused-4.c
+./tests/GCCTestSuite/pr18928-1.hex.expected
+./tests/GCCTestSuite/symbian1.s.expected
+./tests/GCCTestSuite/attr-alwaysinline.c
+./tests/GCCTestSuite/pr14475.c
+./tests/GCCTestSuite/pr17957.s.expected
+./tests/GCCTestSuite/smod-1.c.expected
+./tests/GCCTestSuite/pr25993.c
+./tests/GCCTestSuite/c99-main-1.c.expected
+./tests/GCCTestSuite/uninit-3.c.expected
+./tests/GCCTestSuite/pr25196.c.expected
+./tests/GCCTestSuite/c90-idem-qual-3.s.expected
+./tests/GCCTestSuite/visibility-7.hex.expected
+./tests/GCCTestSuite/wtr-escape-1.c
+./tests/GCCTestSuite/smod-1.hex.expected
+./tests/GCCTestSuite/c90-idem-qual-3.hex.expected
+./tests/GCCTestSuite/qual-return-1.s.expected
+./tests/GCCTestSuite/visibility-b.s.expected
+./tests/GCCTestSuite/m-un-1.c.expected
+./tests/GCCTestSuite/pr24600.c.expected
+./tests/GCCTestSuite/pr18809-1.s.expected
+./tests/GCCTestSuite/c90-static-1.c.expected
+./tests/GCCTestSuite/return-type-3.c.expected
+./tests/GCCTestSuite/compare7.c.expected
+./tests/GCCTestSuite/c90-array-lval-5.c.expected
+./tests/GCCTestSuite/c90-array-lval-7.hex.expected
+./tests/GCCTestSuite/section1.c.expected
+./tests/GCCTestSuite/inline-5.c.expected
+./tests/GCCTestSuite/anon-struct-7.hex.expected
+./tests/GCCTestSuite/trunc-1.hex.expected
+./tests/GCCTestSuite/cast-qual-1.s.expected
+./tests/GCCTestSuite/attr-invalid.c.expected
+./tests/GCCTestSuite/anon-struct-4.hex.expected
+./tests/GCCTestSuite/pr18921-1.c.expected
+./tests/GCCTestSuite/c99-impl-int-2.s.expected
+./tests/GCCTestSuite/c99-flex-array-3.hex.expected
+./tests/GCCTestSuite/c99-array-nonobj-1.c
+./tests/GCCTestSuite/inline-4.hex.expected
+./tests/GCCTestSuite/cris-peep2-xsrand2.s.expected
+./tests/GCCTestSuite/declspec-2.s.expected
+./tests/GCCTestSuite/c99-enum-comma-1.hex.expected
+./tests/GCCTestSuite/pr29736.c.expected
+./tests/GCCTestSuite/c90-const-expr-1.s.expected
+./tests/GCCTestSuite/nested-redef-1.c.expected
+./tests/GCCTestSuite/null-pointer-1.c
+./tests/GCCTestSuite/c99-const-expr-1.s.expected
+./tests/GCCTestSuite/verbose-asm.s.expected
+./tests/GCCTestSuite/pragma-isr-trap_exit.hex.expected
+./tests/GCCTestSuite/c90-restrict-1.s.expected
+./tests/GCCTestSuite/980502-1.hex.expected
+./tests/GCCTestSuite/anon-struct-5.c.expected
+./tests/GCCTestSuite/struct-empty-1.c.expected
+./tests/GCCTestSuite/pragma-isr2.hex.expected
+./tests/GCCTestSuite/declspec-12.c
+./tests/GCCTestSuite/inline-mcpy.c
+./tests/GCCTestSuite/pr17319.c.expected
+./tests/GCCTestSuite/wtr-union-init-1.s.expected
+./tests/GCCTestSuite/inline-5.hex.expected
+./tests/GCCTestSuite/decl-4.s.expected
+./tests/GCCTestSuite/pure-1.c
+./tests/GCCTestSuite/kpice1.c
+./tests/GCCTestSuite/c99-restrict-2.s.expected
+./tests/GCCTestSuite/pr15698-3.s.expected
+./tests/GCCTestSuite/darwin-ld-20040809-2.hex.expected
+./tests/GCCTestSuite/winline-5.s.expected
+./tests/GCCTestSuite/wint_t-1.s.expected
+./tests/GCCTestSuite/uninit-F.s.expected
+./tests/GCCTestSuite/uninit-D.c.expected
+./tests/GCCTestSuite/arm-scd42-3.c
+./tests/GCCTestSuite/compare6.c.expected
+./tests/GCCTestSuite/inline-mcpy.hex.expected
+./tests/GCCTestSuite/typedef-init.c
+./tests/GCCTestSuite/pr17635.c
+./tests/GCCTestSuite/pr17581-1.s.expected
+./tests/GCCTestSuite/inline-1.hex.expected
+./tests/GCCTestSuite/inline-6.c
+./tests/GCCTestSuite/struct-empty-1.c
+./tests/GCCTestSuite/inline-9.c.expected
+./tests/GCCTestSuite/pr22335-2.c
+./tests/GCCTestSuite/smod-1.s.expected
+./tests/GCCTestSuite/darwin-ld-4.c.expected
+./tests/GCCTestSuite/uninit-4.hex.expected
+./tests/GCCTestSuite/wint_t-1.c.expected
+./tests/GCCTestSuite/darwin-ld-2.s.expected
+./tests/GCCTestSuite/intermod-1.c
+./tests/GCCTestSuite/c99-restrict-2.c.expected
+./tests/GCCTestSuite/pr29581-1.c.expected
+./tests/GCCTestSuite/extra-semi-2.hex.expected
+./tests/GCCTestSuite/string-opt-1.s.expected
+./tests/GCCTestSuite/darwin-weakimport-1.c.expected
+./tests/GCCTestSuite/visibility-d.hex.expected
+./tests/GCCTestSuite/inline-6.hex.expected
+./tests/GCCTestSuite/pr22311-1.c
+./tests/GCCTestSuite/darwin-20040812-1.c.expected
+./tests/GCCTestSuite/visibility-11.c.expected
+./tests/GCCTestSuite/uninit-I.hex.expected
+./tests/GCCTestSuite/pr22335-1.s.expected
+./tests/GCCTestSuite/pr3074-1.c
+./tests/GCCTestSuite/pr23165.c.expected
+./tests/GCCTestSuite/pr18809-1.c
+./tests/GCCTestSuite/compare1.c
+./tests/GCCTestSuite/register-var-1.s.expected
+./tests/GCCTestSuite/array-1.c.expected
+./tests/GCCTestSuite/funcdef-attr-1.c.expected
+./tests/GCCTestSuite/string-opt-1.c.expected
+./tests/GCCTestSuite/return-type-2.hex.expected
+./tests/GCCTestSuite/unused-7.c
+./tests/GCCTestSuite/alias-2.c
+./tests/GCCTestSuite/pr17581-1.hex.expected
+./tests/GCCTestSuite/unused-7.hex.expected
+./tests/GCCTestSuite/pr14475.s.expected
+./tests/GCCTestSuite/redecl-9.c
+./tests/GCCTestSuite/dollar.hex.expected
+./tests/GCCTestSuite/c99-array-lval-5.hex.expected
+./tests/GCCTestSuite/const-compare.c.expected
+./tests/GCCTestSuite/pr17581-1.c.expected
+./tests/GCCTestSuite/inline-2.s.expected
+./tests/GCCTestSuite/overflow-1.c.expected
+./tests/GCCTestSuite/uninit-E.c
+./tests/GCCTestSuite/inline-21.s.expected
+./tests/GCCTestSuite/pr24600.hex.expected
+./tests/GCCTestSuite/pr18241-5.c
+./tests/GCCTestSuite/fold-mod-1.hex.expected
+./tests/GCCTestSuite/volatile1.c.expected
+./tests/GCCTestSuite/attr-mode-1.c
+./tests/GCCTestSuite/wchar_t-1.c.expected
+./tests/GCCTestSuite/pr29637.hex.expected
+./tests/GCCTestSuite/fold-mod-1.c
+./tests/GCCTestSuite/extra-semi-1.hex.expected
+./tests/GCCTestSuite/wtr-escape-1.c.expected
+./tests/GCCTestSuite/pr29581-3.s.expected
+./tests/GCCTestSuite/declspec-2.hex.expected
+./tests/GCCTestSuite/return-type-3.hex.expected
+./tests/GCCTestSuite/990213-1.c.expected
+./tests/GCCTestSuite/pr23584.hex.expected
+./tests/GCCTestSuite/920413-1.c
+./tests/GCCTestSuite/qual-return-1.c.expected
+./tests/GCCTestSuite/declspec-2.c
+./tests/GCCTestSuite/visibility-11.s.expected
+./tests/GCCTestSuite/pr12625-1.hex.expected
+./tests/GCCTestSuite/comp-return-1.hex.expected
+./tests/GCCTestSuite/uninit-4.c.expected
+./tests/GCCTestSuite/unused-4.c.expected
+./tests/GCCTestSuite/attr-weakref-1a.c.expected
+./tests/GCCTestSuite/const-compare.c
+./tests/GCCTestSuite/attr-isr-trap_exit.s.expected
+./tests/GCCTestSuite/pr22311-1.hex.expected
+./tests/GCCTestSuite/darwin-20040812-1.c
+./tests/GCCTestSuite/pr15698-6.c
+./tests/GCCTestSuite/pr11459-1.c.expected
+./tests/GCCTestSuite/nonnull-1.c.expected
+./tests/GCCTestSuite/c90-array-quals.s.expected
+./tests/GCCTestSuite/darwin-20040812-1.s.expected
+./tests/GCCTestSuite/pr14092-1.c
+./tests/GCCTestSuite/array-1.hex.expected
+./tests/GCCTestSuite/decl-6.c.expected
+./tests/GCCTestSuite/unroll-1.c
+./tests/GCCTestSuite/pr17036-1.c
+./tests/GCCTestSuite/pragma-re-2.c
+./tests/GCCTestSuite/ultrasp1.hex.expected
+./tests/GCCTestSuite/reg-vol-struct-1.c
+./tests/GCCTestSuite/unused-4.hex.expected
+./tests/GCCTestSuite/simd-3.c.expected
+./tests/GCCTestSuite/switch-1.hex.expected
+./tests/GCCTestSuite/c99-impl-int-1.s.expected
+./tests/GCCTestSuite/attr-weakref-1a.c
+./tests/GCCTestSuite/980502-1.s.expected
+./tests/GCCTestSuite/c99-enum-comma-1.c
+./tests/GCCTestSuite/pr26961-1.c.expected
+./tests/GCCTestSuite/dll-2.c.expected
+./tests/GCCTestSuite/pr20115-1.c
+./tests/GCCTestSuite/c99-idem-qual-3.s.expected
+./tests/GCCTestSuite/nested-calls-1.hex.expected
+./tests/GCCTestSuite/compare5.c.expected
+./tests/GCCTestSuite/pr24600.c
+./tests/GCCTestSuite/fold-mod-1.s.expected
+./tests/GCCTestSuite/darwin-ld-20040828-3.hex.expected
+./tests/GCCTestSuite/noreturn-5.hex.expected
+./tests/GCCTestSuite/struct-empty-3.hex.expected
+./tests/GCCTestSuite/pr30473.hex.expected
+./tests/GCCTestSuite/darwin-ld-1.c
+./tests/GCCTestSuite/pr22329.c.expected
+./tests/GCCTestSuite/c99-idem-qual-3.c
+./tests/GCCTestSuite/c99-idem-qual-1.hex.expected
+./tests/GCCTestSuite/darwin-ld-6.s.expected
+./tests/GCCTestSuite/attr-invalid.c
+./tests/GCCTestSuite/ultrasp1.c
+./tests/GCCTestSuite/arm-scd42-2.hex.expected
+./tests/GCCTestSuite/redecl-16.c
+./tests/GCCTestSuite/pr26961-1.c
+./tests/GCCTestSuite/compare5.c
+./tests/GCCTestSuite/redecl-8.s.expected
+./tests/GCCTestSuite/visibility-6.hex.expected
+./tests/GCCTestSuite/parm-mismatch-1.s.expected
+./tests/GCCTestSuite/wtr-union-init-1.c
+./tests/GCCTestSuite/bitfld-14.hex.expected
+./tests/GCCTestSuite/uninit-G.c.expected
+./tests/GCCTestSuite/extra-semi-1.c
+./tests/GCCTestSuite/darwin-ld-20040828-2.hex.expected
+./tests/GCCTestSuite/struct-ret-2.c
+./tests/GCCTestSuite/uninit-2.s.expected
+./tests/GCCTestSuite/pack-test-3.c
+./tests/GCCTestSuite/trunc-1.c.expected
+./tests/GCCTestSuite/c90-impl-int-1.s.expected
+./tests/GCCTestSuite/darwin-ld-5.c.expected
+./tests/GCCTestSuite/pr15698-4.c
+./tests/GCCTestSuite/940409-1.hex.expected
+./tests/GCCTestSuite/visibility-11.hex.expected
+./tests/GCCTestSuite/pr23049.s.expected
+./tests/GCCTestSuite/cleanup-3.hex.expected
+./tests/GCCTestSuite/asm-fs-1.hex.expected
+./tests/GCCTestSuite/void-cast-2.s.expected
+./tests/GCCTestSuite/pr20017.c
+./tests/GCCTestSuite/string-opt-1.c
+./tests/GCCTestSuite/uninit-8.c
+./tests/GCCTestSuite/wtr-static-1.hex.expected
+./tests/GCCTestSuite/nested-calls-1.c
+./tests/GCCTestSuite/nonnull-2.c.expected
+./tests/GCCTestSuite/pr20130-1.hex.expected
+./tests/GCCTestSuite/compare5.hex.expected
+./tests/GCCTestSuite/c99-restrict-1.s.expected
+./tests/GCCTestSuite/pr24615.c.expected
+./tests/GCCTestSuite/merge-all-constants-1.hex.expected
+./tests/GCCTestSuite/c90-array-quals.c.expected
+./tests/GCCTestSuite/arm-g2.hex.expected
+./tests/GCCTestSuite/unused-6.c
+./tests/GCCTestSuite/ultrasp10.c
+./tests/GCCTestSuite/return-type-1.c
+./tests/GCCTestSuite/visibility-6.s.expected
+./tests/GCCTestSuite/pragma-ep-2.hex.expected
+./tests/GCCTestSuite/wtr-switch-1.hex.expected
+./tests/GCCTestSuite/noreturn-5.c.expected
+./tests/GCCTestSuite/fold-xor-1.hex.expected
+./tests/GCCTestSuite/pr22308-1.c
+./tests/GCCTestSuite/c90-enum-comma-1.hex.expected
+./tests/GCCTestSuite/wtr-strcat-1.c.expected
+./tests/GCCTestSuite/compare9.hex.expected
+./tests/GCCTestSuite/comp-return-1.c
+./tests/GCCTestSuite/builtin-strstr.c.expected
+./tests/GCCTestSuite/attr-used.hex.expected
+./tests/GCCTestSuite/visibility-2.c.expected
+./tests/GCCTestSuite/pr14796-2.hex.expected
+./tests/GCCTestSuite/anon-struct-8.hex.expected
+./tests/GCCTestSuite/declspec-2.c.expected
+./tests/GCCTestSuite/wchar_t-2.hex.expected
+./tests/GCCTestSuite/darwin-version-1.hex.expected
+./tests/GCCTestSuite/switch-4.c.expected
+./tests/GCCTestSuite/unroll-1.hex.expected
+./tests/GCCTestSuite/darwin-20040812-1.hex.expected
+./tests/GCCTestSuite/compare1.hex.expected
+./tests/GCCTestSuite/nonnull-1.hex.expected
+./tests/GCCTestSuite/string-opt-1.hex.expected
+./tests/GCCTestSuite/anon-struct-7.c
+./tests/GCCTestSuite/alias-2.hex.expected
+./tests/GCCTestSuite/cris-peep2-xsrand2.c.expected
+./tests/GCCTestSuite/bitfld-6.c
+./tests/GCCTestSuite/ultrasp2.c
+./tests/GCCTestSuite/pr23165.c
+./tests/GCCTestSuite/nrv2.s.expected
+./tests/GCCTestSuite/pr24615.hex.expected
+./tests/GCCTestSuite/redecl-8.c.expected
+./tests/GCCTestSuite/dollar.c
+./tests/GCCTestSuite/pr3074-1.hex.expected
+./tests/GCCTestSuite/switch-4.hex.expected
+./tests/GCCTestSuite/inline-4.c.expected
+./tests/GCCTestSuite/darwin-20040809-2.c
+./tests/GCCTestSuite/sparc-constant-1.hex.expected
+./tests/GCCTestSuite/declspec-3.c
+./tests/GCCTestSuite/return-type-2.s.expected
+./tests/GCCTestSuite/loop-5.c
+./tests/GCCTestSuite/simd-1b.c
+./tests/GCCTestSuite/arm-scd42-3.c.expected
+./tests/GCCTestSuite/inline-9.s.expected
+./tests/GCCTestSuite/pr23049.c.expected
+./tests/GCCTestSuite/darwin-weakimport-1.c
+./tests/GCCTestSuite/attr-used-2.hex.expected
+./tests/GCCTestSuite/always_inline2.c
+./tests/GCCTestSuite/redecl-16.s.expected
+./tests/GCCTestSuite/enum2.c.expected
+./tests/GCCTestSuite/attr-weakref-1a.s.expected
+./tests/GCCTestSuite/concat.s.expected
+./tests/GCCTestSuite/inline-21.hex.expected
+./tests/GCCTestSuite/qual-return-3.c
+./tests/GCCTestSuite/fold-abs-1.c
+./tests/GCCTestSuite/uninit-2.hex.expected
+./tests/GCCTestSuite/wchar_t-1.s.expected
+./tests/GCCTestSuite/c99-idem-qual-1.c.expected
+./tests/GCCTestSuite/pr17036-1.s.expected
+./tests/GCCTestSuite/reg-vol-struct-1.s.expected
+./tests/GCCTestSuite/intermod-1.s.expected
+./tests/GCCTestSuite/inline-17.c.expected
+./tests/GCCTestSuite/pr12625-1.s.expected
+./tests/GCCTestSuite/wtr-static-1.c
+./tests/GCCTestSuite/qual-return-3.s.expected
+./tests/GCCTestSuite/typedef-init.s.expected
+./tests/GCCTestSuite/inline-7.c
+./tests/GCCTestSuite/pr30473.s.expected
+./tests/GCCTestSuite/c90-longlong-1.c.expected
+./tests/GCCTestSuite/builtin-strstr.c
+./tests/GCCTestSuite/inline1.c.expected
+./tests/GCCTestSuite/unroll-1.s.expected
+./tests/GCCTestSuite/attr-weakref-1a.hex.expected
+./tests/GCCTestSuite/c99-const-expr-1.hex.expected
+./tests/GCCTestSuite/uninit-B.hex.expected
+./tests/GCCTestSuite/c90-idem-qual-1.c.expected
+./tests/GCCTestSuite/dollar.s.expected
+./tests/GCCTestSuite/winline-7.hex.expected
+./tests/GCCTestSuite/transparent-union-3.c
+./tests/GCCTestSuite/c90-array-lval-5.hex.expected
+./tests/GCCTestSuite/inline-9.c
+./tests/GCCTestSuite/c99-impl-int-1.c.expected
+./tests/GCCTestSuite/winline-1.hex.expected
+./tests/GCCTestSuite/uninit-H.c.expected
+./tests/GCCTestSuite/inline-1.c.expected
+./tests/GCCTestSuite/c90-restrict-1.c
+./tests/GCCTestSuite/register-var-2.s.expected
+./tests/GCCTestSuite/c90-mixdecl-1.hex.expected
+./tests/GCCTestSuite/compare6.hex.expected
+./tests/GCCTestSuite/c90-enum-comma-1.c.expected
+./tests/GCCTestSuite/profile-generate-1.c.expected
+./tests/GCCTestSuite/darwin-ld-20040809-1.s.expected
+./tests/GCCTestSuite/array-1.c
+./tests/GCCTestSuite/anon-struct-8.c
+./tests/GCCTestSuite/noreturn-7.s.expected
+./tests/GCCTestSuite/dll-2.c
+./tests/GCCTestSuite/loop-5.hex.expected
+./tests/GCCTestSuite/trunc-1.c
+./tests/GCCTestSuite/cris-peep2-andu1.s.expected
+./tests/GCCTestSuite/pr14092-1.hex.expected
+./tests/GCCTestSuite/anon-struct-3.hex.expected
+./tests/GCCTestSuite/uninit-6.hex.expected
+./tests/GCCTestSuite/pr15698-4.s.expected
+./tests/GCCTestSuite/overflow-1.s.expected
+./tests/GCCTestSuite/c99-array-lval-7.hex.expected
+./tests/GCCTestSuite/anon-struct-5.hex.expected
+./tests/GCCTestSuite/inline-7.hex.expected
+./tests/GCCTestSuite/pr23049.c
+./tests/GCCTestSuite/c90-dupqual-1.c
+./tests/GCCTestSuite/bitfld-10.s.expected
+./tests/GCCTestSuite/pr11864-1.hex.expected
+./tests/GCCTestSuite/alias-8.s.expected
+./tests/GCCTestSuite/visibility-5.c.expected
+./tests/GCCTestSuite/pr15825-1.s.expected
+./tests/GCCTestSuite/darwin-version-1.c
+./tests/GCCTestSuite/winline-2.c.expected
+./tests/GCCTestSuite/c99-func-4.c.expected
+./tests/GCCTestSuite/sparc-constant-1.s.expected
+./tests/GCCTestSuite/nested-calls-1.c.expected
+./tests/GCCTestSuite/arm-scd42-2.c.expected
+./tests/GCCTestSuite/Makefile
+./tests/GCCTestSuite/arm-scd42-1.hex.expected
+./tests/GCCTestSuite/visibility-c.hex.expected
+./tests/GCCTestSuite/anon-struct-8.s.expected
+./tests/GCCTestSuite/attr-alwaysinline.hex.expected
+./tests/GCCTestSuite/inline-18.c
+./tests/GCCTestSuite/pack-test-2.c.expected
+./tests/GCCTestSuite/pack-test-3.s.expected
+./tests/GCCTestSuite/darwin-version-1.c.expected
+./tests/GCCTestSuite/inline4.hex.expected
+./tests/GCCTestSuite/funcdef-attr-1.s.expected
+./tests/GCCTestSuite/intmax_t-1.c.expected
+./tests/GCCTestSuite/funcdef-var-2.s.expected
+./tests/GCCTestSuite/enum3.c
+./tests/GCCTestSuite/anon-struct-4.c.expected
+./tests/GCCTestSuite/pr17957.c
+./tests/GCCTestSuite/cris-peep2-xsrand.c
+./tests/GCCTestSuite/intmax_t-1.c
+./tests/GCCTestSuite/decl-6.s.expected
+./tests/GCCTestSuite/c99-idem-qual-2.hex.expected
+./tests/GCCTestSuite/qual-return-1.hex.expected
+./tests/GCCTestSuite/visibility-1.c
+./tests/GCCTestSuite/const-elim-2.s.expected
+./tests/GCCTestSuite/section1.hex.expected
+./tests/GCCTestSuite/redecl-13.hex.expected
+./tests/GCCTestSuite/uninit-5.c
+./tests/GCCTestSuite/pr25795.c
+./tests/GCCTestSuite/switch-1.s.expected
+./tests/GCCTestSuite/pr28187.hex.expected
+./tests/GCCTestSuite/darwin-20040809-2.s.expected
+./tests/GCCTestSuite/pragma-re-2.s.expected
+./tests/GCCTestSuite/pr29637.c
+./tests/GCCTestSuite/cris-peep2-andu2.c
+./tests/GCCTestSuite/pr25559.c
+./tests/GCCTestSuite/wtr-strcat-1.c
+./tests/GCCTestSuite/const-compare.hex.expected
+./tests/GCCTestSuite/redecl-13.s.expected
+./tests/GCCTestSuite/cleanup-6.hex.expected
+./tests/GCCTestSuite/fold-abs-3.s.expected
+./tests/GCCTestSuite/c99-longlong-1.s.expected
+./tests/GCCTestSuite/c99-idem-qual-2.s.expected
+./tests/GCCTestSuite/c90-flex-array-1.hex.expected
+./tests/GCCTestSuite/inline-18.c.expected
+./tests/GCCTestSuite/c99-idem-qual-1.c
+./tests/GCCTestSuite/c99-func-2.c.expected
+./tests/GCCTestSuite/ultrasp4.s.expected
+./tests/GCCTestSuite/unused-1.hex.expected
+./tests/GCCTestSuite/decl-4.c.expected
+./tests/GCCTestSuite/array-quals-2.s.expected
+./tests/GCCTestSuite/pr18928-1.c.expected
+./tests/GCCTestSuite/cris-peep2-andu1.c.expected
+./tests/GCCTestSuite/pr14796-2.c.expected
+./tests/GCCTestSuite/pr22335-2.c.expected
+./tests/GCCTestSuite/pure-1.s.expected
+./tests/GCCTestSuite/wint_t-1.hex.expected
+./tests/GCCTestSuite/const-compare.s.expected
+./tests/GCCTestSuite/volatile1.hex.expected
+./tests/GCCTestSuite/fdata-sections-1.c
+./tests/GCCTestSuite/c90-idem-qual-1.s.expected
+./tests/GCCTestSuite/ultrasp1.c.expected
+./tests/GCCTestSuite/redecl-9.c.expected
+./tests/GCCTestSuite/inline-2.hex.expected
+./tests/GCCTestSuite/empty-source-3.s.expected
+./tests/GCCTestSuite/symbian4.c.expected
+./tests/GCCTestSuite/simd-3.hex.expected
+./tests/GCCTestSuite/inline-10.s.expected
+./tests/GCCTestSuite/transparent-union-2.hex.expected
+./tests/GCCTestSuite/951130-1.s.expected
+./tests/GCCTestSuite/noreturn-1.hex.expected
+./tests/GCCTestSuite/pr18479.c
+./tests/GCCTestSuite/pr14092-1.c.expected
+./tests/GCCTestSuite/transparent-union-3.c.expected
+./tests/GCCTestSuite/nonnull-2.hex.expected
+./tests/GCCTestSuite/pr21085.c.expected
+./tests/GCCTestSuite/cris-peep2-xsrand.hex.expected
+./tests/GCCTestSuite/c99-dupqual-1.hex.expected
+./tests/GCCTestSuite/pr25559.hex.expected
+./tests/GCCTestSuite/pr18479.c.expected
+./tests/GCCTestSuite/pr12625-1.c
+./tests/GCCTestSuite/fold-xor-2.hex.expected
+./tests/GCCTestSuite/c99-array-nonobj-1.c.expected
+./tests/GCCTestSuite/visibility-2.c
+./tests/GCCTestSuite/anon-struct-5.c
+./tests/GCCTestSuite/visibility-c.c.expected
+./tests/GCCTestSuite/inline-19.s.expected
+./tests/GCCTestSuite/qual-return-4.s.expected
+./tests/GCCTestSuite/symbian5.s.expected
+./tests/GCCTestSuite/pr23584.c.expected
+./tests/GCCTestSuite/loop-5.c.expected
+./tests/GCCTestSuite/inline-19.hex.expected
+./tests/GCCTestSuite/ultrasp4.c.expected
+./tests/GCCTestSuite/c99-array-lval-6.s.expected
+./tests/GCCTestSuite/pr24367.c.expected
+./tests/GCCTestSuite/pr29736.hex.expected
+./tests/GCCTestSuite/c90-array-lval-7.c.expected
+./tests/GCCTestSuite/pr21085.c
+./tests/GCCTestSuite/attr-used-2.c.expected
+./tests/GCCTestSuite/c99-main-1.c
+./tests/GCCTestSuite/profile-generate-2.c.expected
+./tests/GCCTestSuite/c99-array-lval-6.c
+./tests/GCCTestSuite/verbose-asm.hex.expected
+./tests/GCCTestSuite/inline-19.c.expected
+./tests/GCCTestSuite/wtr-escape-1.s.expected
+./tests/GCCTestSuite/arm-g2.c.expected
+./tests/GCCTestSuite/pr15443-2.c
+./tests/GCCTestSuite/wchar_t-2.c
+./tests/GCCTestSuite/bitfld-5.hex.expected
+./tests/GCCTestSuite/arm-scd42-2.c
+./tests/GCCTestSuite/winline-3.s.expected
+./tests/GCCTestSuite/ultrasp10.s.expected
+./tests/GCCTestSuite/pr29637.c.expected
+./tests/GCCTestSuite/comp-return-1.c.expected
+./tests/GCCTestSuite/redecl-16.c.expected
+./tests/GCCTestSuite/c90-impl-int-1.c.expected
+./tests/GCCTestSuite/darwin-ld-20040828-1.hex.expected
+./tests/GCCTestSuite/deprecated-3.s.expected
+./tests/GCCTestSuite/pr18928-1.s.expected
+./tests/GCCTestSuite/pr24445.s.expected
+./tests/GCCTestSuite/c90-array-quals-2.s.expected
+./tests/GCCTestSuite/noreturn-2.s.expected
+./tests/GCCTestSuite/m-un-1.c
+./tests/GCCTestSuite/pr22335-1.c.expected
+./tests/GCCTestSuite/visibility-4.s.expected
+./tests/GCCTestSuite/wtr-unary-plus-1.s.expected
+./tests/GCCTestSuite/noreturn-2.hex.expected
+./tests/GCCTestSuite/extra-semi-3.hex.expected
+./tests/GCCTestSuite/uninit-C.s.expected
+./tests/GCCTestSuite/c90-const-expr-1.c.expected
+./tests/GCCTestSuite/attr-used-2.s.expected
+./tests/GCCTestSuite/920413-1.s.expected
+./tests/GCCTestSuite/darwin-ld-6.c
+./tests/GCCTestSuite/dll-2.s.expected
+./tests/GCCTestSuite/empty-source-2.c
+./tests/GCCTestSuite/c90-array-lval-6.c.expected
+./tests/GCCTestSuite/extra-semi-1.c.expected
+./tests/GCCTestSuite/pr15443-2.s.expected
+./tests/GCCTestSuite/pr23165.s.expected
+./tests/GCCTestSuite/pr15825-1.c
+./tests/GCCTestSuite/inline4.c.expected
+./tests/GCCTestSuite/redecl-6.c.expected
+./tests/GCCTestSuite/pr26004.s.expected
+./tests/GCCTestSuite/inline-2.c
+./tests/GCCTestSuite/register-var-1.hex.expected
+./tests/GCCTestSuite/darwin-version-1.s.expected
+./tests/GCCTestSuite/c99-array-lval-1.hex.expected
+./tests/GCCTestSuite/unused-2.c.expected
+./tests/GCCTestSuite/arm-g2.s.expected
+./tests/GCCTestSuite/uninit-8.s.expected
+./tests/GCCTestSuite/compare3.c.expected
+./tests/GCCTestSuite/c90-flex-array-1.s.expected
+./tests/GCCTestSuite/pr14092-1.s.expected
+./tests/GCCTestSuite/inline2.s.expected
+./tests/GCCTestSuite/darwin-ld-2.hex.expected
+./tests/GCCTestSuite/c99-restrict-2.hex.expected
+./tests/GCCTestSuite/pr25795.hex.expected
+./tests/GCCTestSuite/cris-peep2-xsrand2.hex.expected
+./tests/GCCTestSuite/gnu89-dupqual-1.c
+./tests/GCCTestSuite/c90-array-lval-7.s.expected
+./tests/GCCTestSuite/pragma-ep-2.c
+./tests/GCCTestSuite/pr15698-7.c.expected
+./tests/GCCTestSuite/cris-peep2-xsrand2.c
+./tests/GCCTestSuite/c99-array-lval-7.c.expected
+./tests/GCCTestSuite/overflow-1.hex.expected
+./tests/GCCTestSuite/unused-1.c.expected
+./tests/GCCTestSuite/c99-func-4.hex.expected
+./tests/GCCTestSuite/pr25795.c.expected
+./tests/GCCTestSuite/c99-dupqual-1.s.expected
+./tests/GCCTestSuite/visibility-4.c
+./tests/GCCTestSuite/compare3.c
+./tests/GCCTestSuite/c90-const-expr-1.hex.expected
+./tests/GCCTestSuite/pr17319.c
+./tests/GCCTestSuite/pragma-pack-4.c
+./tests/GCCTestSuite/cleanup-6.c
+./tests/GCCTestSuite/return-type-2.c.expected
+./tests/GCCTestSuite/enum3.hex.expected
+./tests/GCCTestSuite/anon-struct-6.hex.expected
+./tests/GCCTestSuite/darwin-ld-4.c
+./tests/GCCTestSuite/redecl-6.s.expected
+./tests/GCCTestSuite/concat2.hex.expected
+./tests/GCCTestSuite/declspec-3.s.expected
+./tests/GCCTestSuite/symbian4.hex.expected
+./tests/GCCTestSuite/darwin-ld-20040809-1.c
+./tests/GCCTestSuite/builtins-35.s.expected
+./tests/GCCTestSuite/gnu89-dupqual-1.c.expected
+./tests/GCCTestSuite/uninit-5.hex.expected
+./tests/GCCTestSuite/local1.c
+./tests/GCCTestSuite/symbian5.c.expected
+./tests/GCCTestSuite/intmax_t-1.hex.expected
+./tests/GCCTestSuite/c90-impl-int-2.c.expected
+./tests/GCCTestSuite/switch-4.c
+./tests/GCCTestSuite/symbian3.s.expected
+./tests/GCCTestSuite/darwin-ld-6.hex.expected
+./tests/GCCTestSuite/compare3.hex.expected
+./tests/GCCTestSuite/pr20115-1.c.expected
+./tests/GCCTestSuite/visibility-9.hex.expected
+./tests/GCCTestSuite/pragma-pack-4.hex.expected
+./tests/GCCTestSuite/struct-empty-2.c.expected
+./tests/GCCTestSuite/pr20115.c.expected
+./tests/GCCTestSuite/visibility-3.c.expected
+./tests/GCCTestSuite/pr18479.hex.expected
+./tests/GCCTestSuite/darwin-ld-20040809-2.s.expected
+./tests/GCCTestSuite/pr25795-1.c.expected
+./tests/GCCTestSuite/pr23049.hex.expected
+./tests/GCCTestSuite/pr17319.hex.expected
+./tests/GCCTestSuite/uninit-I.s.expected
+./tests/GCCTestSuite/pr19967.c
+./tests/GCCTestSuite/pr26570.c.expected
+./tests/GCCTestSuite/pr24445.hex.expected
+./tests/GCCTestSuite/visibility-d.c.expected
+./tests/GCCTestSuite/pr32450.s.expected
+./tests/GCCTestSuite/decl-6.c
+./tests/GCCTestSuite/pr18241-5.s.expected
+./tests/GCCTestSuite/return-type-1.c.expected
+./tests/GCCTestSuite/redecl-13.c.expected
+./tests/GCCTestSuite/ultrasp2.s.expected
+./tests/GCCTestSuite/uninit-4.s.expected
+./tests/GCCTestSuite/pr14796-1.s.expected
+./tests/GCCTestSuite/anon-struct-6.c
+./tests/GCCTestSuite/fold-xor-1.c
+./tests/GCCTestSuite/c90-idem-qual-3.c.expected
+./tests/GCCTestSuite/pr20017.hex.expected
+./tests/GCCTestSuite/pr15698-6.hex.expected
+./tests/GCCTestSuite/pragma-isr2.c.expected
+./tests/GCCTestSuite/darwin-ld-20040828-1.c
+./tests/GCCTestSuite/pr19967.hex.expected
+./tests/GCCTestSuite/c90-mixdecl-1.s.expected
+./tests/GCCTestSuite/pr25795.s.expected
+./tests/GCCTestSuite/trunc-1.s.expected
+./tests/GCCTestSuite/pr29581-3.c.expected
+./tests/GCCTestSuite/ftrapv-1.s.expected
+./tests/GCCTestSuite/winline-5.c.expected
+./tests/GCCTestSuite/940409-1.c.expected
+./tests/GCCTestSuite/winline-6.c
+./tests/GCCTestSuite/pr25795-1.s.expected
+./tests/GCCTestSuite/simd-3.s.expected
+./tests/GCCTestSuite/uninit-H.c
+./tests/GCCTestSuite/uninit-5.s.expected
+./tests/GCCTestSuite/register-var-2.c
+./tests/GCCTestSuite/unused-3.hex.expected
+./tests/GCCTestSuite/concat2.s.expected
+./tests/GCCTestSuite/extra-semi-2.c
+./tests/GCCTestSuite/951130-1.c.expected
+./tests/GCCTestSuite/visibility-3.c
+./tests/GCCTestSuite/pragma-pack-4.c.expected
+./tests/GCCTestSuite/bitfld-14.s.expected
+./tests/GCCTestSuite/uninit-3.hex.expected
+./tests/GCCTestSuite/c90-const-expr-1.c
+./tests/GCCTestSuite/always_inline3.hex.expected
+./tests/GCCTestSuite/declspec-12.c.expected
+./tests/GCCTestSuite/bitfld-6.s.expected
+./tests/GCCTestSuite/pr22329.hex.expected
+./tests/GCCTestSuite/inline-5.s.expected
+./tests/GCCTestSuite/attr-used.c
+./tests/GCCTestSuite/qual-return-2.c.expected
+./tests/GCCTestSuite/visibility-10.c.expected
+./tests/GCCTestSuite/inline-5.c
+./tests/GCCTestSuite/darwin-ld-5.c
+./tests/GCCTestSuite/pr15443-2.c.expected
+./tests/GCCTestSuite/warn-1.hex.expected
+./tests/GCCTestSuite/pr25196.c
+./tests/GCCTestSuite/c90-array-lval-6.hex.expected
+./tests/GCCTestSuite/pr18921-1.hex.expected
+./tests/GCCTestSuite/compare1.s.expected
+./tests/GCCTestSuite/pack-test-2.c
+./tests/GCCTestSuite/pr15698-7.hex.expected
+./tests/GCCTestSuite/parm-mismatch-1.c
+./tests/GCCTestSuite/overflow-1.c
+./tests/GCCTestSuite/darwin-ld-20040828-3.c.expected
+./tests/GCCTestSuite/array-quals-2.c.expected
+./tests/GCCTestSuite/conv-3.c
+./tests/GCCTestSuite/visibility-d.s.expected
+./tests/GCCTestSuite/h8300-stack-1.s.expected
+./tests/GCCTestSuite/qual-return-3.c.expected
+./tests/GCCTestSuite/ultrasp1.s.expected
+./tests/GCCTestSuite/visibility-7.c
+./tests/GCCTestSuite/conv-3.c.expected
+./tests/GCCTestSuite/symbian4.s.expected
+./tests/GCCTestSuite/visibility-2.s.expected
+./tests/GCCTestSuite/pr26961-1.s.expected
+./tests/GCCTestSuite/attr-invalid.s.expected
+./tests/GCCTestSuite/visibility-8.c
+./tests/GCCTestSuite/symbian3.c.expected
+./tests/GCCTestSuite/c99-array-lval-1.s.expected
+./tests/GCCTestSuite/unused-5.c
+./tests/GCCTestSuite/wtr-static-1.c.expected
+./tests/GCCTestSuite/c90-restrict-1.hex.expected
+./tests/GCCTestSuite/pr29581-1.s.expected
+./tests/GCCTestSuite/pr24620.c.expected
+./tests/GCCTestSuite/compare3.s.expected
+./tests/GCCTestSuite/ftrapv-1.hex.expected
+./tests/GCCTestSuite/c90-array-quals-2.hex.expected
+./tests/GCCTestSuite/darwin-weakimport-1.hex.expected
+./tests/GCCTestSuite/c90-mixdecl-1.c
+./tests/GCCTestSuite/symbian1.hex.expected
+./tests/GCCTestSuite/darwin-20040809-2.hex.expected
+./tests/GCCTestSuite/c99-enum-comma-1.c.expected
+./tests/GCCTestSuite/smod-1.c
+./tests/GCCTestSuite/pr25993.hex.expected
+./tests/GCCTestSuite/redecl-16.hex.expected
+./tests/GCCTestSuite/struct-empty-2.c
+./tests/GCCTestSuite/symbian3.hex.expected
+./tests/GCCTestSuite/fold-xor-2.s.expected
+./tests/GCCTestSuite/pr11864-1.s.expected
+./tests/GCCTestSuite/c90-flex-array-1.c.expected
+./tests/GCCTestSuite/pr17319.s.expected
+./tests/GCCTestSuite/inline-21.c.expected
+./tests/GCCTestSuite/c90-idem-qual-2.s.expected
+./tests/GCCTestSuite/pragma-re-2.c.expected
+./tests/GCCTestSuite/extra-semi-3.c.expected
+./tests/GCCTestSuite/c99-longlong-1.c.expected
+./tests/GCCTestSuite/inline1.hex.expected
+./tests/GCCTestSuite/assign-warn-3.c.expected
+./tests/GCCTestSuite/pr29637.s.expected
+./tests/GCCTestSuite/fold-xor-1.c.expected
+./tests/GCCTestSuite/deprecated-3.c.expected
+./tests/GCCTestSuite/c90-idem-qual-2.hex.expected
+./tests/GCCTestSuite/uninit-1.c.expected
+./tests/GCCTestSuite/visibility-1.hex.expected
+./tests/GCCTestSuite/uninit-11.s.expected
+./tests/GCCTestSuite/anon-struct-4.s.expected
+./tests/GCCTestSuite/noreturn-6.c
+./tests/GCCTestSuite/c99-array-lval-5.s.expected
+./tests/GCCTestSuite/visibility-a.c
+./tests/GCCTestSuite/pr24683.hex.expected
+./tests/GCCTestSuite/enum2.hex.expected
+./tests/GCCTestSuite/visibility-6.c.expected
+./tests/GCCTestSuite/unused-3.c.expected
+./tests/GCCTestSuite/transparent-union-3.hex.expected
+./tests/GCCTestSuite/pragma-ep-3.hex.expected
+./tests/GCCTestSuite/pr19967.s.expected
+./tests/GCCTestSuite/fold-xor-1.s.expected
+./tests/GCCTestSuite/inline-17.c
+./tests/GCCTestSuite/empty-source-1.c.expected
+./tests/GCCTestSuite/inline2.hex.expected
+./tests/GCCTestSuite/uninit-F.hex.expected
+./tests/GCCTestSuite/nrv2.c.expected
+./tests/GCCTestSuite/inline-4.s.expected
+./tests/GCCTestSuite/wtr-union-init-1.hex.expected
+./tests/GCCTestSuite/pr28187.c
+./tests/GCCTestSuite/c99-enum-comma-1.s.expected
+./tests/GCCTestSuite/c99-const-expr-1.c.expected
+./tests/GCCTestSuite/inline-8.c
+./tests/GCCTestSuite/pr15784-4.s.expected
+./tests/GCCTestSuite/uninit-9.s.expected
+./tests/GCCTestSuite/transparent-union-2.s.expected
+./tests/GCCTestSuite/inline-10.c.expected
+./tests/GCCTestSuite/empty-source-3.c.expected
+./tests/GCCTestSuite/pr20017.s.expected
+./tests/GCCTestSuite/alias-2.s.expected
+./tests/GCCTestSuite/uninit-E.s.expected
+./tests/GCCTestSuite/compare9.c
+./tests/GCCTestSuite/pr20115-1.s.expected
+./tests/GCCTestSuite/wtr-switch-1.c.expected
+./tests/GCCTestSuite/arm-scd42-2.s.expected
+./tests/GCCTestSuite/qual-return-1.c
+./tests/GCCTestSuite/noreturn-5.c
+./tests/GCCTestSuite/reg-vol-struct-1.hex.expected
+./tests/GCCTestSuite/pr24367.s.expected
+./tests/GCCTestSuite/compare5.s.expected
+./tests/GCCTestSuite/pr23625.c.expected
+./tests/GCCTestSuite/nonnull-2.c
+./tests/GCCTestSuite/compare9.c.expected
+./tests/GCCTestSuite/c90-array-lval-6.s.expected
+./tests/GCCTestSuite/attr-alwaysinline.c.expected
+./tests/GCCTestSuite/attr-invalid.hex.expected
+./tests/GCCTestSuite/c99-impl-int-2.hex.expected
+./tests/GCCTestSuite/struct-empty-3.c.expected
+./tests/GCCTestSuite/pr17635.s.expected
+./tests/GCCTestSuite/unused-2.s.expected
+./tests/GCCTestSuite/pr20130-1.s.expected
+./tests/GCCTestSuite/concat.hex.expected
+./tests/GCCTestSuite/visibility-6.c
+./tests/GCCTestSuite/dll-4.s.expected
+./tests/GCCTestSuite/fdata-sections-1.s.expected
+./tests/GCCTestSuite/unused-7.c.expected
+./tests/GCCTestSuite/pr32450.hex.expected
+./tests/GCCTestSuite/concat.c
+./tests/GCCTestSuite/switch-4.s.expected
+./tests/GCCTestSuite/darwin-ld-2.c
+./tests/GCCTestSuite/unused-2.hex.expected
+./tests/GCCTestSuite/pr25795-1.hex.expected
+./tests/GCCTestSuite/winline-6.s.expected
+./tests/GCCTestSuite/pr29581-1.c
+./tests/GCCTestSuite/anon-struct-4.c
+./tests/GCCTestSuite/visibility-10.c
+./tests/GCCTestSuite/pragma-re-2.hex.expected
+./tests/GCCTestSuite/empty-source-2.s.expected
+./tests/GCCTestSuite/void-cast-1.hex.expected
+./tests/GCCTestSuite/noreturn-5.s.expected
+./tests/GCCTestSuite/visibility-2.hex.expected
+./tests/GCCTestSuite/pr19967.c.expected
+./tests/GCCTestSuite/empty-source-2.c.expected
+./tests/GCCTestSuite/wchar_t-2.c.expected
+./tests/GCCTestSuite/simd-1b.s.expected
+./tests/GCCTestSuite/pr18241-5.c.expected
+./tests/GCCTestSuite/struct-empty-1.hex.expected
+./tests/GCCTestSuite/extra-semi-2.c.expected
+./tests/GCCTestSuite/extra-semi-3.s.expected
+./tests/GCCTestSuite/c90-idem-qual-1.c
+./tests/GCCTestSuite/pr20115.c
+./tests/GCCTestSuite/volatile1.c
+./tests/GCCTestSuite/symbian5.hex.expected
+./tests/GCCTestSuite/pr14796-2.s.expected
+./tests/GCCTestSuite/noreturn-1.c.expected
+./tests/GCCTestSuite/qual-return-2.s.expected
+./tests/GCCTestSuite/compare7.s.expected
+./tests/GCCTestSuite/visibility-d.c
+./tests/GCCTestSuite/pr29736.s.expected
+./tests/GCCTestSuite/c99-main-1.hex.expected
+./tests/GCCTestSuite/pr28187.c.expected
+./tests/GCCTestSuite/struct-empty-1.s.expected
+./tests/GCCTestSuite/darwin-ld-20040828-1.s.expected
+./tests/GCCTestSuite/old-style-then-proto-1.c.expected
+./tests/GCCTestSuite/uninit-H.s.expected
+./tests/GCCTestSuite/fold-xor-2.c
+./tests/GCCTestSuite/conv-3.s.expected
+./tests/GCCTestSuite/uninit-8.hex.expected
+./tests/GCCTestSuite/ultrasp10.hex.expected
+./tests/GCCTestSuite/cleanup-3.c
+./tests/GCCTestSuite/c99-dupqual-1.c
+./tests/GCCTestSuite/deprecated-3.hex.expected
+./tests/GCCTestSuite/inline-17.hex.expected
+./tests/GCCTestSuite/funroll-loops-all.c
+./tests/GCCTestSuite/c99-array-lval-5.c.expected
+./tests/GCCTestSuite/ultrasp4.c
+./tests/GCCTestSuite/postincr-1.c
+./tests/GCCTestSuite/nonnull-1.s.expected
+./tests/GCCTestSuite/pr26570.hex.expected
+./tests/GCCTestSuite/visibility-1.s.expected
+./tests/GCCTestSuite/unused-3.c
+./tests/GCCTestSuite/builtins-35.c
+./tests/GCCTestSuite/loop-5.s.expected
+./tests/clight
+./tests/clight/binop.log.expected
+./tests/clight/complets.c.expected
+./tests/clight/array.RTLabs.expected
+./tests/clight/ifthenelse.c.expected
+./tests/clight/binop.RTLabs.expected
+./tests/clight/complets.RTL.expected
+./tests/clight/testTB_Array_ecriture.c
+./tests/clight/testTB_Array_lecture.LIN.expected
+./tests/clight/complets.c
+./tests/clight/fib.Cminor.expected
+./tests/clight/fir_complexe.RTL.expected
+./tests/clight/array.c
+./tests/clight/testTB_boucle.ASM.expected
+./tests/clight/testTB_Array_LE.c
+./tests/clight/fir4.ERTL.expected
+./tests/clight/fib.RTLabs.expected
+./tests/clight/fib.LIN.expected
+./tests/clight/01-array.c
+./tests/clight/complets.RTLabs.expected
+./tests/clight/fir_complexe.LTL.expected
+./tests/clight/testTB_Array_double.RTLabs.expected
+./tests/clight/testTB_Array_lecture.ERTL.expected
+./tests/clight/testTB_Array_ecriture.Clight.expected
+./tests/clight/ifthenelse.Cminor.expected
+./tests/clight/ifthenelse.Clight.expected
+./tests/clight/testTB_Array_double.Clight.expected
+./tests/clight/01-testTB_Array_ecriture.c
+./tests/clight/testTB_boucle.ERTL.expected
+./tests/clight/testCOMP_tri.Clight.expected
+./tests/clight/testTB_Array_LE.Clight.expected
+./tests/clight/fir4.ASM.expected
+./tests/clight/testTB_Array_ecriture.RTL.expected
+./tests/clight/testTB_boucle.LIN.expected
+./tests/clight/testCOMP_tri.c
+./tests/clight/testCOMP_tri.log.expected
+./tests/clight/testCOMP_tri.LTL.expected
+./tests/clight/testTB_Array_LE.LIN.expected
+./tests/clight/for.Clight.expected
+./tests/clight/testCOMP_tri.LIN.expected
+./tests/clight/testTB_boucle.c
+./tests/clight/for.ERTL.expected
+./tests/clight/ifthenelse.LIN.expected
+./tests/clight/complets.ERTL.expected
+./tests/clight/array.LIN.expected
+./tests/clight/01-testTB_Array_ecriture.hex
+./tests/clight/testTB_Array_LE.c.expected
+./tests/clight/testTB_Array_double.c
+./tests/clight/fir_complexe.c.expected
+./tests/clight/for.LTL.expected
+./tests/clight/ifthenelse.ERTL.expected
+./tests/clight/array.s
+./tests/clight/fir_complexe.c
+./tests/clight/fir4.c
+./tests/clight/array.LTL.expected
+./tests/clight/fib.c
+./tests/clight/binop.c.expected
+./tests/clight/fib.LTL.expected
+./tests/clight/fir_complexe.RTLabs.expected
+./tests/clight/array.Clight.expected
+./tests/clight/for.RTL.expected
+./tests/clight/for.LIN.expected
+./tests/clight/testTB_Array_lecture.c
+./tests/clight/fir4.c.expected
+./tests/clight/for.ASM.expected
+./tests/clight/testTB_Array_double.Cminor.expected
+./tests/clight/fir4.Clight.expected
+./tests/clight/ifthenelse.ASM.expected
+./tests/clight/testTB_Array_double.RTL.expected
+./tests/clight/testTB_Array_ecriture.LTL.expected
+./tests/clight/testCOMP_tri.ERTL.expected
+./tests/clight/fir_complexe.Clight.expected
+./tests/clight/testTB_Array_LE.hex
+./tests/clight/testCOMP_tri.RTLabs.expected
+./tests/clight/complets.LTL.expected
+./tests/clight/fib.ERTL.expected
+./tests/clight/testTB_Array_double.c.expected
+./tests/clight/array.ASM.expected
+./tests/clight/fir4.LIN.expected
+./tests/clight/binop.c
+./tests/clight/testTB_boucle.RTLabs.expected
+./tests/clight/testTB_Array_double.LTL.expected
+./tests/clight/fir_complexe.ERTL.expected
+./tests/clight/testTB_Array_LE.s
+./tests/clight/for.Cminor.expected
+./tests/clight/testTB_Array_ecriture.RTLabs.expected
+./tests/clight/testTB_Array_ecriture.log.expected
+./tests/clight/testTB_boucle.Clight.expected
+./tests/clight/array.hex
+./tests/clight/complets.Clight.expected
+./tests/clight/binop.RTL.expected
+./tests/clight/fir_complexe.log.expected
+./tests/clight/complets.ASM.expected
+./tests/clight/for.RTLabs.expected
+./tests/clight/fir4.RTLabs.expected
+./tests/clight/testTB_Array_lecture.RTL.expected
+./tests/clight/binop.Clight.expected
+./tests/clight/array.RTL.expected
+./tests/clight/fir4.LTL.expected
+./tests/clight/testTB_Array_LE.ASM.expected
+./tests/clight/01-testTB_Array_LE.c
+./tests/clight/testTB_boucle.log.expected
+./tests/clight/testTB_Array_lecture.c.expected
+./tests/clight/testTB_Array_lecture.Clight.expected
+./tests/clight/ifthenelse.RTL.expected
+./tests/clight/testTB_Array_double.ASM.expected
+./tests/clight/fib.log.expected
+./tests/clight/testTB_boucle.RTL.expected
+./tests/clight/testTB_Array_lecture.ASM.expected
+./tests/clight/testTB_Array_lecture.RTLabs.expected
+./tests/clight/ok-counter
+./tests/clight/testCOMP_tri.Cminor.expected
+./tests/clight/for.c.expected
+./tests/clight/binop.LIN.expected
+./tests/clight/ifthenelse.LTL.expected
+./tests/clight/fib.ASM.expected
+./tests/clight/testTB_Array_ecriture.hex
+./tests/clight/array.Cminor.expected
+./tests/clight/ko-counter
+./tests/clight/testTB_Array_ecriture.ERTL.expected
+./tests/clight/for.log.expected
+./tests/clight/testTB_Array_LE.Cminor.expected
+./tests/clight/testTB_Array_LE.RTLabs.expected
+./tests/clight/testTB_Array_ecriture.s
+./tests/clight/fib.Clight.expected
+./tests/clight/testTB_Array_double.log.expected
+./tests/clight/testTB_Array_LE.RTL.expected
+./tests/clight/Makefile
+./tests/clight/testTB_Array_LE.LTL.expected
+./tests/clight/testTB_boucle.c.expected
+./tests/clight/02-testTB_Array_ecriture.c
+./tests/clight/binop.ASM.expected
+./tests/clight/testTB_Array_LE.log.expected
+./tests/clight/01-testTB_Array_ecriture.s
+./tests/clight/fib.c.expected
+./tests/clight/testCOMP_tri.ASM.expected
+./tests/clight/testTB_Array_ecriture.ASM.expected
+./tests/clight/testTB_boucle.LTL.expected
+./tests/clight/fib.RTL.expected
+./tests/clight/testTB_Array_lecture.log.expected
+./tests/clight/array.c.expected
+./tests/clight/binop.Cminor.expected
+./tests/clight/testTB_Array_ecriture.Cminor.expected
+./tests/clight/fir4.log.expected
+./tests/clight/testCOMP_tri.c.expected
+./tests/clight/testCOMP_tri.RTL.expected
+./tests/clight/testTB_Array_double.ERTL.expected
+./tests/clight/complets.log.expected
+./tests/clight/for.c
+./tests/clight/array.log.expected
+./tests/clight/ifthenelse.RTLabs.expected
+./tests/clight/fir_complexe.LIN.expected
+./tests/clight/testTB_Array_ecriture.LIN.expected
+./tests/clight/ifthenelse.c
+./tests/clight/ifthenelse.log.expected
+./tests/clight/binop.ERTL.expected
+./tests/clight/fir4.RTL.expected
+./tests/clight/testTB_boucle.Cminor.expected
+./tests/clight/testTB_Array_LE.ERTL.expected
+./tests/clight/binop.LTL.expected
+./tests/clight/testTB_Array_lecture.Cminor.expected
+./tests/clight/fib.s.expected
+./tests/clight/fir4.Cminor.expected
+./tests/clight/array.ERTL.expected
+./tests/clight/complets.Cminor.expected
+./tests/clight/fir_complexe.Cminor.expected
+./tests/clight/testTB_Array_lecture.LTL.expected
+./tests/clight/complets.LIN.expected
+./tests/clight/testTB_Array_ecriture.c.expected
+./tests/clight/fir_complexe.ASM.expected
+./tests/clight/testTB_Array_double.LIN.expected
+./tests/Makefile
+./tests/benchs
+./tests/benchs/cparser18c1246.c
+./tests/benchs/cparser162cc31.c
+./tests/benchs/mat_det.c
+./tests/benchs/cparser2ad371c.i
+./tests/benchs/fib.c
+./tests/benchs/min.c
+./tests/benchs/badsort.c
+./tests/benchs/cparser2dcc632.i
+./tests/benchs/acc.run
+./tests/benchs/meantime.sh
+./tests/benchs/quicksort.c
+./tests/benchs/cparser27e7643.i
+./tests/benchs/cparser1ecc129.c
+./tests/benchs/Makefile
+./tests/benchs/cparser1b43f7a.c
+./tests/benchs/cparser296cfe9.i
+./tests/benchs/cparser1e57fb4.c
+./tests/benchs/cparser23ae4e0.i
+./tests/benchs/search.c
+./acc.odocl
+./Makefile
+./doc
+./doc/src
+./doc/src/main
+./doc/html
+./doc/html/style.css
+./src
+./src/accweb.ml
+./src/options.ml
+./src/annotStackSize.ml
+./src/ASM
+./src/ASM/ASMInterpret.mli
+./src/ASM/Parser.mli
+./src/ASM/BitVectors.ml
+./src/ASM/MIPSOps.mli
+./src/ASM/printOps.ml
+./src/ASM/Pretty.ml
+./src/ASM/MIPS.ml
+./src/ASM/ASMPrinter.mli
+./src/ASM/BitVectors.mli
+./src/ASM/MIPSInterpret.mli
+./src/ASM/Physical.mli
+./src/ASM/ASMCosts.ml
+./src/ASM/Pretty.mli
+./src/ASM/IntelHex.ml
+./src/ASM/I8051.mli
+./src/ASM/ASM.mli
+./src/ASM/IntelHex.mli
+./src/ASM/MIPS.mli
+./src/ASM/MIPSInterpret.ml
+./src/ASM/I8051.ml
+./src/ASM/Util.ml
+./src/ASM/ASMPrinter.ml
+./src/ASM/ASMInterpret.ml
+./src/ASM/printOps.mli
+./src/ASM/arch.mli
+./src/ASM/Parser.ml
+./src/ASM/Physical.ml
+./src/ASM/ASMCosts.mli
+./src/driver.mli
+./src/utilities
+./src/utilities/option.ml
+./src/utilities/webify.mli
+./src/utilities/setMap.mli
+./src/utilities/Fix.mli
+./src/utilities/printPottier.ml
+./src/utilities/print.ml
+./src/utilities/syntacticAnalysis.ml
+./src/utilities/unionFind.ml
+./src/utilities/print.mli
+./src/utilities/misc.mli
+./src/utilities/unionFind.mli
+./src/utilities/misc.ml
+./src/utilities/checkOClosure.ml
+./src/utilities/stringTools.mli
+./src/utilities/bijection.mli
+./src/utilities/printPottier.mli
+./src/utilities/stringTools.ml
+./src/utilities/optionsParsing.ml
+./src/utilities/webify.ml
+./src/utilities/interference.mli
+./src/utilities/bijection.ml
+./src/utilities/position.mli
+./src/utilities/prioritySet.mli
+./src/utilities/position.ml
+./src/utilities/integer.mli
+./src/utilities/stringSig.mli
+./src/utilities/coloring.mli
+./src/utilities/coloring.ml
+./src/utilities/interference.ml
+./src/utilities/prioritySet.ml
+./src/utilities/Fix.ml
+./src/utilities/printCFG.ml
+./src/utilities/myMap.ml
+./src/utilities/integer.ml
+./src/utilities/printCFG.mli
+./src/utilities/miscPottier.ml
+./src/utilities/error.ml
+./src/utilities/syntacticAnalysis.mli
+./src/utilities/setMap.ml
+./src/utilities/option.mli
+./src/utilities/miscPottier.mli
+./src/utilities/myMap.mli
+./src/utilities/error.mli
+./src/utilities/eformat.ml
+./src/utilities/eformat.mli
+./src/driver.ml
+./src/RTL
+./src/RTL/RTLInterpret.mli
+./src/RTL/RTL.mli
+./src/RTL/RTLPrinter.ml
+./src/RTL/RTLtailcall.mli
+./src/RTL/RTLToERTL.ml
+./src/RTL/RTLPrinter.mli
+./src/RTL/RTLtailcall.ml
+./src/RTL/RTLInterpret.ml
+./src/RTL/RTLToERTL.mli
+./src/acc.mli
+./src/dev_test.ml
+./src/acc.ml
+./src/clight
+./src/clight/clightLustreMain.mli
+./src/clight/clightToCminor.mli
+./src/clight/runtime.ml
+./src/clight/clightFromC.ml
+./src/clight/clightFlags.ml
+./src/clight/clightInterpret.ml
+./src/clight/clightAnnotator.ml
+./src/clight/clightParser.ml
+./src/clight/clightUtils.mli
+./src/clight/clightInterpret.mli
+./src/clight/clight.mli
+./src/clight/clightLustre.ml
+./src/clight/clightFold.mli
+./src/clight/clightAnnotator.mli
+./src/clight/clightLabelling.mli
+./src/clight/clightFold.ml
+./src/clight/runtime.mli
+./src/clight/clightLustreMain.ml
+./src/clight/clightCasts.mli
+./src/clight/clightParser.mli
+./src/clight/clight32ToClight8.mli
+./src/clight/clightUtils.ml
+./src/clight/clightPrinter.mli
+./src/clight/clight32ToClight8.ml
+./src/clight/clightSwitch.mli
+./src/clight/clightToCminor.ml
+./src/clight/clightLustre.mli
+./src/clight/clightSwitch.ml
+./src/clight/clightLabelling.ml
+./src/clight/clightPrinter.ml
+./src/clight/clightCasts.ml
+./src/checker.mli
+./src/languages.ml
+./src/ERTL
+./src/ERTL/spill.ml
+./src/ERTL/uses.mli
+./src/ERTL/ERTLPrinter.mli
+./src/ERTL/ERTLInterpret.mli
+./src/ERTL/build.ml
+./src/ERTL/spill.mli
+./src/ERTL/ERTLInterpret.ml
+./src/ERTL/liveness.ml
+./src/ERTL/ERTLPrinter.ml
+./src/ERTL/ERTLToLTL.mli
+./src/ERTL/ERTLToLTLI.mli
+./src/ERTL/liveness.mli
+./src/ERTL/build.mli
+./src/ERTL/ERTL.mli
+./src/ERTL/ERTLToLTLI.ml
+./src/ERTL/ERTLToLTL.ml
+./src/ERTL/uses.ml
+./src/options.mli
+./src/checker.ml
+./src/cminor
+./src/cminor/cminorInterpret.mli
+./src/cminor/cminorLexer.mll
+./src/cminor/cminorPrinter.ml
+./src/cminor/cminorLabelling.ml
+./src/cminor/cminorPrinter.mli
+./src/cminor/cminorAnnotator.ml
+./src/cminor/cminorToRTLabs.ml
+./src/cminor/cminorFold.ml
+./src/cminor/cminorInterpret.ml
+./src/cminor/cminorFold.mli
+./src/cminor/cminorToRTLabs.mli
+./src/cminor/cminorAnnotator.mli
+./src/cminor/cminorLabelling.mli
+./src/cminor/cminorParser.mly
+./src/cminor/cminor.mli
+./src/LIN
+./src/LIN/LINPrinter.mli
+./src/LIN/LINToASM.ml
+./src/LIN/LINInterpret.ml
+./src/LIN/LINInterpret.mli
+./src/LIN/LIN.mli
+./src/LIN/LINToASM.mli
+./src/LIN/LINPrinter.ml
+./src/common
+./src/common/register.mli
+./src/common/hdwRegister.ml
+./src/common/intByBig_int.ml
+./src/common/label.ml
+./src/common/value.mli
+./src/common/intValue.ml
+./src/common/intValue.mli
+./src/common/costLabel.ml
+./src/common/primitive.mli
+./src/common/register.ml
+./src/common/costLabel.mli
+./src/common/AST.mli
+./src/common/label.mli
+./src/common/atom.mli
+./src/common/memory.mli
+./src/common/atom.ml
+./src/common/atomSig.mli
+./src/common/intByInt64.ml
+./src/common/primitive.ml
+./src/common/hdwRegister.mli
+./src/common/memory.ml
+./src/common/intValue.in
+./src/common/value.ml
+./src/common/intValueConfig.ml
+./src/languages.mli
+./src/LTL
+./src/LTL/branch.mli
+./src/LTL/LTLToLIN.mli
+./src/LTL/LTLPrinter.mli
+./src/LTL/LTLPrinter.ml
+./src/LTL/LTLToLINI.ml
+./src/LTL/LTLInterpret.mli
+./src/LTL/LTLToLIN.ml
+./src/LTL/LTLInterpret.ml
+./src/LTL/branch.ml
+./src/LTL/LTLToLINI.mli
+./src/LTL/LTL.mli
+./src/RTLabs
+./src/RTLabs/RTLabs.mli
+./src/RTLabs/RTLabsPrinter.ml
+./src/RTLabs/RTLabsInterpret.mli
+./src/RTLabs/RTLabsInterpret.ml
+./src/RTLabs/RTLabsToRTL.mli
+./src/RTLabs/RTLabsPrinter.mli
+./src/RTLabs/RTLabsToRTL.ml
+./configure-oclosure.sh
+./admin
+./admin/_build
+./admin/_build/_log
+./admin/_build/_digests
+./admin/configure-oclosure.sh
+./admin/myocamldoc
+./_tags.js_of_ocaml
+./lib
--- /dev/null
+/* FIXME: This style.css was automatically generated by ocamldoc.
+ FIXME: This should be customized. */
+
+body {
+ margin-left : 5em;
+ margin-right : 5em;
+ padding-left : 5em;
+ padding-right: 5em;
+ border-left : solid 1px;
+ border-right : solid 1px;
+ border-bottom: 0px;
+}
+
+a:visited {
+ color : #416DFF;
+ text-decoration : none;
+}
+a:link {
+ color : #416DFF;
+ text-decoration : none;}
+
+a:hover {
+ color : Red;
+ text-decoration : none;
+ background-color: #5FFF88}
+
+a:active {
+ color : Red;
+ text-decoration : underline;
+}
+
+.keyword {
+ font-weight : bold ;
+ color : Black
+}
+
+.keywordsign {
+ color : #C04600
+}
+
+.superscript {
+ font-size : 4
+}
+
+.subscript {
+ font-size : 4
+}
+
+.comment {
+ color : Green
+}
+
+.constructor {
+ color : Blue
+}
+
+.type {
+ color : #5C6585
+}
+
+.string {
+ color : Maroon
+}
+
+.warning {
+ color : Red ;
+ font-weight : bold
+}
+.info {
+ margin-left : 0em;
+ margin-right : 0em ;
+ font-family : Verdana;
+ font-style: italic
+}
+
+.param_info {
+ margin-top: 4px;
+ margin-left : 3em;
+ margin-right : 3em
+}
+
+.code {
+ color : #465F91 ;
+}
+
+h1 {
+ font-size : 30pt ;
+ text-align: right;
+ font-variant : small-caps;
+}
+
+h2 {
+ font-size : 20pt ;
+ border-bottom: 1px solid #000000;
+ margin-top: 5px;
+ margin-bottom: 2px;
+ margin-left: 0px;
+ margin-right: 0px;
+ padding-left: 0px;
+ padding-right: 0px;
+ text-align: left;
+ padding-top: 1em;
+ font-variant : small-caps;
+}
+
+h3 { font-size : 20pt ;
+ border: 1px solid #000000;
+ margin-top: 5px;
+ margin-bottom: 2px;t
+ ext-align: center;
+ background-color: #90DDFF ;p
+ adding: 2px;
+ }
+
+h4 { font-size : 20pt ;
+ border: 1px solid #000000;
+ margin-top: 5px;
+ margin-bottom: 2px;t
+ ext-align: center;
+ background-color: #90EDFF ;p
+ adding: 2px;
+ }
+
+h5 { font-size : 20pt ;
+ border: 1px solid #000000;
+ margin-top: 5px;
+ margin-bottom: 2px;t
+ ext-align: center;
+ background-color: #90FDFF ;p
+ adding: 2px;
+ }
+
+h6 { font-size : 20pt ;
+ border: 1px solid #000000;
+ margin-top: 5px;
+ margin-bottom: 2px;t
+ ext-align: center;
+ background-color: #C0FFFF ;
+ padding: 2px;
+ }
+
+div.h7 { font-size : 20pt ;
+ border: 1px solid #000000;
+ margin-top: 5px;
+ margin-bottom: 2px;t
+ ext-align: center;
+ background-color: #E0FFFF ;
+ padding: 2px;
+ }
+
+div.h8 { font-size : 20pt ;
+ border: 1px solid #000000;
+ margin-top: 5px;
+ margin-bottom: 2px;t
+ ext-align: center;
+ background-color: #F0FFFF ;
+ padding: 2px;
+ }
+
+div.h9 { font-size : 20pt ;
+ border: 1px solid #000000;
+ margin-top: 5px;
+ margin-bottom: 2px;t
+ ext-align: center;
+ background-color: #FFFFFF ;
+ padding: 2px;
+ }
+
+.typetable { border-style : hidden }
+
+.indextable { border-style : hidden }
+
+.paramstable {
+ border-style : hidden ;
+ padding: 5pt 5pt
+}
+
+tr {
+ background-color : White
+
+}
+td.typefieldcomment {
+ background-color : #FFFFFF ;
+ font-size: smaller ;
+}
+
+pre {
+ margin-bottom: 4px;
+ margin-top: 2em;
+ margin-left: 0em;
+ font-size: 11pt;
+}
+
+div.sig_block {
+ margin-left: 2em
+}
\ No newline at end of file
--- /dev/null
+{2 Driver}
+
+{!modules: Acc Checker Languages Options AnnotationOptions}
+
+{2 Cminor}
+
+{!modules: Cminor CminorAnnotator CminorInterpret CminorLabelling
+ CminorPrinter CminorToRTLabs
+}
+
+{2 Clight}
+
+{!modules: Clight ClightAnnotator ClightInterpret ClightLabelling
+ ClightParser ClightPrinter ClightToCminor
+}
+
+{2 RTLabs}
+
+{!modules: RTLabs RTLabsInterpret RTLabsPrinter RTLabsToRTL}
+
+{2 RTL}
+
+{!modules: RTL RTLInterpret RTLPrinter RTLToERTLI RTLToERTL}
+
+{2 ERTL}
+
+{!modules: ERTL ERTLInterpret Spill Coloring ERTLPrinter
+ ERTLToLTLI ERTLToLTL Liveness Uses Zero
+}
+
+{2 LTL}
+
+{!modules: LTL LTLInterpret LTLPrinter LTLToLINI LTLToLIN}
+
+{2 LIN}
+
+{!modules: LIN LINInterpret LINPrinter LINToASM Branch}
+
+{2 ASM}
+
+{!modules: ASM ASMInterpret ASMCompute_costs ASMPrinter
+ MIPSInterpret MIPS MIPSOps PrintOps}
+
+{2 Language-independent modules}
+
+{!modules: AST Atom AtomSig CostLabel Label Memory
+ Primitive PrintPrimitive Register Value Build
+}
+
+{2 General utilities}
+
+{!modules: OptionsParsing Position Misc Error
+ Error Fix Integer Interference Misc MiscPottier MyMap
+ Option Position PrintCFG Print PrintPottier PrioritySet SetMap
+ StringSig StringTools SyntacticAnalysis UnionFind
+}
\ No newline at end of file
--- /dev/null
+open Ocamlbuild_plugin
+open Myocamlbuild_config
+
+let run_and_read = Ocamlbuild_pack.My_unix.run_and_read
+let blank_sep_strings = Ocamlbuild_pack.Lexers.blank_sep_strings
+
+let find_packages () =
+ blank_sep_strings &
+ Lexing.from_string &
+ run_and_read "ocamlfind list | cut -d' ' -f1"
+
+let find_syntaxes () = ["camlp4o"; "camlp4r"]
+
+let ocamlfind x = S[A"ocamlfind"; x]
+
+
+let _ = dispatch begin function
+ | Before_options ->
+ Options.ocamlc := ocamlfind & A"ocamlc";
+ Options.ocamlopt := ocamlfind & A"ocamlopt";
+ Options.ocamldep := ocamlfind & A"ocamldep";
+ Options.ocamldoc := A"admin/myocamldoc.exe";
+ Options.ocamlmktop := ocamlfind & A"ocamlmktop";
+
+ | After_rules ->
+ flag ["ocaml"; "link"; "program"] & A"-linkpkg";
+ List.iter begin fun pkg ->
+ flag ["ocaml"; "compile"; "pkg_"^pkg] & S[A"-package"; A pkg];
+ flag ["ocaml"; "ocamldep"; "pkg_"^pkg] & S[A"-package"; A pkg];
+ flag ["ocaml"; "doc"; "pkg_"^pkg] & S[A"-package"; A pkg];
+ flag ["ocaml"; "link"; "pkg_"^pkg] & S[A"-package"; A pkg];
+ end (find_packages ());
+ List.iter begin fun s ->
+ flag ["ocaml"; "compile"; "syntax_"^s] & S[A"-syntax"; A s];
+ flag ["ocaml"; "ocamldep"; "syntax_"^s] & S[A"-syntax"; A s];
+ flag ["ocaml"; "doc"; "syntax_"^s] & S[A"-syntax"; A s];
+ end (find_syntaxes ());
+ flag ["ocaml"; "pkg_threads"; "compile"] (S[A "-thread"]);
+ flag ["ocaml"; "pkg_threads"; "link"] (S[A "-thread"]);
+
+ rule "admin/myocamldoc"
+ ~prod:"admin/myocamldoc.exe"
+ ~deps:["admin/myocamldoc"]
+ begin fun _ _ ->
+ Seq [ cp "admin/myocamldoc" "admin/myocamldoc.exe";
+ chmod (A"+rx") "admin/myocamldoc.exe" ]
+ end;
+
+ dep ["doc"] ["admin/myocamldoc.exe"];
+ dep ["doc"; "docdir"; "extension:html"; "ocaml"] [ "doc/src/main" ];
+ flag ["doc"; "docdir"; "extension:html"; "ocaml"]
+ (S[A "-intro"; A "doc/src/main" ]);
+ flag ["doc"] (S[A "-keep-code"]);
+ flag ["doc"] (S[A ("-I "^parser_lib)]);
+
+ ocaml_lib ~extern:true ~dir:parser_lib "cparser";
+
+ | _ -> ()
+end
--- /dev/null
+open BitVectors;;
+
+type ('a,'b) union2 = [ `U1 of 'a | `U2 of 'b ]
+type ('a,'b,'c) union3 = [ `U1 of 'a | `U2 of 'b | `U3 of 'c ]
+type ('a,'b,'c,'d,'e,'f) union6 = [ `U1 of 'a | `U2 of 'b | `U3 of 'c | `U4 of 'd | `U5 of 'e | `U6 of 'f ]
+
+type direct = [ `DIRECT of byte ]
+type indirect = [ `INDIRECT of bit ]
+type ext_indirect = [ `EXT_INDIRECT of bit ]
+type reg = [ `REG of bit * bit * bit ]
+type acc = [ `A ]
+type b = [ `B ]
+type dptr = [ `DPTR ]
+type data = [ `DATA of byte ]
+type data16 = [ `DATA16 of word ]
+type acc_dptr = [ `A_DPTR ]
+type acc_pc = [ `A_PC ]
+type ext_indirect_dptr = [ `EXT_IND_DPTR ]
+type indirect_dptr = [ `IND_DPTR ]
+type carry = [ `C ]
+type bit = [ `BIT of byte ]
+type nbit = [ `NBIT of byte ]
+type rel = [ `REL of byte ]
+type addr11 = [ `ADDR11 of word11 ]
+type addr16 = [ `ADDR16 of word ]
+
+type 'addr jump =
+ [ `JC of 'addr
+ | `JNC of 'addr
+ | `JB of bit * 'addr
+ | `JNB of bit * 'addr
+ | `JBC of bit * 'addr
+ | `JZ of 'addr
+ | `JNZ of 'addr
+ | `CJNE of (acc * [ direct | data ], [ reg | indirect ] * data) union2 * 'addr
+ | `DJNZ of [ reg | direct ] * 'addr
+ ]
+
+type 'addr preinstruction =
+ (* arithmetic operations *)
+ [ `ADD of acc * [ reg | direct | indirect | data ]
+ | `ADDC of acc * [ reg | direct | indirect | data ]
+ | `SUBB of acc * [ reg | direct | indirect | data ]
+ | `INC of [ acc | reg | direct | indirect | dptr ]
+ | `DEC of [ acc | reg | direct | indirect ]
+ | `MUL of acc * b
+ | `DIV of acc * b
+ | `DA of acc
+
+ (* logical operations *)
+ | `ANL of
+ (acc * [ reg | direct | indirect | data ],
+ direct * [ acc | data ],
+ carry * [ bit | nbit]) union3
+ | `ORL of
+ (acc * [ reg | data | direct | indirect ],
+ direct * [ acc | data ],
+ carry * [ bit | nbit]) union3
+ | `XRL of
+ (acc * [ data | reg | direct | indirect ],
+ direct * [ acc | data ]) union2
+ | `CLR of [ acc | carry | bit ]
+ | `CPL of [ acc | carry | bit ]
+ | `RL of acc
+ | `RLC of acc
+ | `RR of acc
+ | `RRC of acc
+ | `SWAP of acc
+
+ (* data transfer *)
+ | `MOV of
+ (acc * [ reg | direct | indirect | data ],
+ [ reg | indirect ] * [ acc | direct | data ],
+ direct * [ acc | reg | direct | indirect | data ],
+ dptr * data16,
+ carry * bit,
+ bit * carry
+ ) union6
+ | `MOVC of acc * [ acc_dptr | acc_pc ]
+ | `MOVX of (acc * [ ext_indirect | ext_indirect_dptr ],
+ [ ext_indirect | ext_indirect_dptr ] * acc) union2
+ | `SETB of [ carry | bit ]
+ | `PUSH of direct
+ | `POP of direct
+ | `XCH of acc * [ reg | direct | indirect ]
+ | `XCHD of acc * indirect
+
+ (* program branching *)
+ | 'addr jump
+ | `ACALL of addr11
+ | `LCALL of addr16
+ | `RET
+ | `RETI
+ | `AJMP of addr11
+ | `LJMP of addr16
+ | `SJMP of rel
+ | `JMP of indirect_dptr
+ | `NOP ]
+
+type instruction = rel preinstruction
+
+type labelled_instruction =
+ [ instruction
+ | `Cost of string
+ | `Label of string
+ | `Jmp of string
+ | `Call of string
+ | `Mov of dptr * string
+ | `WithLabel of [`Label of string] jump
+ ]
+
+(* pairs <datalabel,size> *)
+type preamble = (string * int) list
+
+(* has_main currently unused *)
+type 'a pretty_program =
+ { ppreamble : preamble ;
+ pexit_label : string ;
+ pcode : 'a list ;
+ phas_main : bool }
+
+type program =
+ { code : BitVectors.byte list ;
+ cost_labels : string BitVectors.WordMap.t ;
+ labels : BitVectors.word StringTools.Map.t ;
+ exit_addr : BitVectors.word ;
+ has_main : bool }
--- /dev/null
+
+let error_prefix = "ASMCosts"
+let warning s = prerr_endline (error_prefix ^ s)
+
+
+type instruction_nature =
+ | Goto of BitVectors.word | Branch of BitVectors.word
+ | Direct_fun_call of BitVectors.word | Return
+ | Other
+
+let inst_infos mem pc =
+ let (inst, next_pc, inst_cost) = ASMInterpret.fetch mem pc in
+ let (nature, next_pcs) = match inst with
+ | `LCALL (`ADDR16 addr16) -> (Direct_fun_call addr16, [next_pc])
+ | `ACALL (`ADDR11 addr11) ->
+ (Direct_fun_call (Physical.addr16_of_addr11 pc addr11), [next_pc])
+ | `LJMP (`ADDR16 addr16) -> (Goto addr16, [addr16])
+ | `AJMP (`ADDR11 addr11) ->
+ let addr = Physical.addr16_of_addr11 pc addr11 in
+ (Goto addr, [addr])
+ | `SJMP (`REL addr) ->
+ let _, addr =
+ BitVectors.half_add next_pc (BitVectors.sign_extension addr) in
+ (Goto addr, [addr])
+ | `JMP idptr ->
+ (Other, [next_pc]) (* Indirect jump; precondition: every possible
+ destination should start with its own label *)
+ | `JC addr
+ | `JNC addr
+ | `JB (_,addr)
+ | `JNB (_,addr)
+ | `JBC (_,addr)
+ | `JZ addr
+ | `JNZ addr
+ | `CJNE (_,addr)
+ | `DJNZ (_,addr) ->
+ let `REL addr = addr in
+ let _, addr =
+ BitVectors.half_add next_pc (BitVectors.sign_extension addr) in
+ (Branch addr, [next_pc ; addr])
+ | `RET | `RETI -> (Return, [])
+ | _ -> (Other, [next_pc]) in
+ (nature, next_pc, next_pcs, inst_cost)
+
+
+let rec compare = function
+ | [] -> assert false (* do not use an this argument *)
+ | [(_, cost)] -> cost
+ | (pc1, cost1) :: (pc2, cost2) :: l when cost1 <> cost2 ->
+ warning
+ (Printf.sprintf
+ "Warning: branching to %s has cost %d, branching to %s has cost %d"
+ (string_of_int (BitVectors.int_of_vect pc1)) cost1
+ (string_of_int (BitVectors.int_of_vect pc2)) cost2) ;
+ max cost1 (compare ((pc2, cost2) :: l))
+ | _ :: l -> compare l
+
+let rec block_costl mem costs = function
+ | [] -> 0
+ | [pc] when BitVectors.WordMap.mem pc costs -> 0
+ | [pc] -> block_cost mem costs pc
+ | next_pcs ->
+ compare (List.map (fun pc -> (pc, block_costl mem costs [pc])) next_pcs)
+
+and block_cost mem costs pc =
+ let (_, _, next_pcs, cost) = inst_infos mem pc in
+ cost + (block_costl mem costs next_pcs)
+
+
+let traverse_code mem p =
+ let rec aux pc code =
+ let (_, newpc, _, _) = inst_infos mem pc in
+ match code with
+ | [] -> CostLabel.Map.empty
+ | _::tl when BitVectors.WordMap.mem pc p.ASM.cost_labels ->
+ let lbl = BitVectors.WordMap.find pc p.ASM.cost_labels in
+ let cost = block_cost mem p.ASM.cost_labels pc in
+ let costs_mapping = aux newpc tl in
+ CostLabel.Map.add lbl cost costs_mapping
+ | _::tl -> aux newpc tl
+ in
+ aux (BitVectors.zero `Sixteen) p.ASM.code
+
+
+let first_cost_label mem costs =
+ let rec aux oldpc =
+ if BitVectors.WordMap.mem oldpc costs then
+ (BitVectors.WordMap.find oldpc costs, 0)
+ else
+ let (nature, pc, _, inst_cost) = inst_infos mem oldpc in
+ match nature with
+ | Direct_fun_call pc ->
+ let (lbl, cost) = aux pc in
+ (lbl, inst_cost + cost)
+ | Return
+ | Goto _
+ | Branch _ ->
+ assert false (* no such instructions before calling main *)
+ | Other ->
+ let (lbl, cost) = aux pc in
+ (lbl, inst_cost + cost)
+ in
+ aux (BitVectors.zero `Sixteen)
+
+
+let initialize_cost mem costs costs_mapping =
+ let (lbl, cost) = first_cost_label mem costs in
+ let old_cost =
+ if CostLabel.Map.mem lbl costs_mapping then
+ CostLabel.Map.find lbl costs_mapping
+ else 0 in
+ let new_cost = old_cost + cost in
+ CostLabel.Map.add lbl new_cost costs_mapping
+
+
+let compute p =
+ let mem = ASMInterpret.load_code_memory p.ASM.code in
+ let costs_mapping = traverse_code mem p in
+ if p.ASM.has_main then initialize_cost mem p.ASM.cost_labels costs_mapping
+ else costs_mapping
--- /dev/null
+
+(** This module defines the cost increment associated to each cost
+ label of a [ASM] program. *)
+
+val compute : ASM.program -> int CostLabel.Map.t
--- /dev/null
+open BitVectors;;
+open Physical;;
+open ASM;;
+open IntelHex;;
+open Util;;
+open Parser;;
+
+exception Fetch_exception of string;;
+exception CodeTooLarge;;
+exception Halt;;
+
+let extract = function
+ | Some a -> a
+ | None -> raise (Failure "ASMInterpret.extract")
+
+type time = int;;
+type line = [ `P1 of byte
+ | `P3 of byte
+ | `SerialBuff of [ `Eight of byte | `Nine of BitVectors.bit * byte ]];;
+
+let string_of_line =
+ function
+ `P1 b ->
+ "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n" ^
+ "P1 OUTPUT: " ^ hex_string_of_vect b ^ "\n" ^
+ "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"
+ | `P3 b ->
+ "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n" ^
+ "P2 OUTPUT: " ^ hex_string_of_vect b ^ "\n" ^
+ "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"
+ | `SerialBuff (`Eight b) ->
+ "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n" ^
+ "SERIAL 8b OUTPUT: " ^ string_of_vect b ^ "\n" ^
+ "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"
+ | `SerialBuff (`Nine (b, b')) ->
+ "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n" ^
+ "SERIAL 9b OUTPUT: " ^
+ (let i = int_of_vect b' in
+ if b then
+ string_of_int (128 + i)
+ else
+ string_of_int i) ^
+ "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"
+
+(* In: reception time, line of input, new continuation,
+ Out: transmission time, output line, expected duration until reply,
+ new continuation.
+*)
+
+type epsilon = int
+
+type continuation =
+ [`In of time * line * epsilon * continuation] option *
+ [`Out of (time -> line -> time * continuation)]
+
+let rec debug_continuation =
+ (Some (`In (1, (`SerialBuff (`Eight (vect_of_int 5 `Eight))), 0, debug_continuation))), `Out (
+ fun time line ->
+ (* let _ = prerr_endline <*> string_of_line $ line in *)
+ (time + 1),debug_continuation)
+
+(* no differentiation between internal and external code memory *)
+type status =
+{
+ (* Memory *)
+ code_memory: Physical.WordMap.map; (* can be reduced *)
+ low_internal_ram: Byte7Map.map;
+ high_internal_ram: Byte7Map.map;
+ external_ram: Physical.WordMap.map;
+
+ (* Program counter *)
+ pc: word;
+
+ (* SFRs *)
+ sp: byte;
+ dpl: byte;
+ dph: byte;
+ pcon: byte;
+ tcon: byte;
+ tmod: byte;
+ tl0: byte;
+ tl1: byte;
+ th0: byte;
+ th1: byte;
+ p1: byte;
+ scon: byte;
+ sbuf: byte;
+ ie: byte;
+ p3: byte;
+ ip: byte;
+ psw: byte;
+ acc: byte;
+ b: byte;
+ t2con: byte; (* 8052 only *)
+ rcap2l: byte; (* 8052 only *)
+ rcap2h: byte; (* 8052 only *)
+ tl2: byte; (* 8052 only *)
+ th2: byte; (* 8052 only *)
+
+ (* Latches for the output lines *)
+ p1_latch: byte;
+ p3_latch: byte;
+
+ (* Fields for tracking the state of the processor. *)
+
+ (* IO specific *)
+ previous_p1_val: bool;
+ previous_p3_val: bool;
+
+ serial_epsilon_out: epsilon option;
+ serial_epsilon_in: epsilon option;
+
+ io_epsilon: epsilon;
+
+ serial_v_in: [`Eight of byte | `Nine of (BitVectors.bit * byte) ] option;
+ serial_v_out: [`Eight of byte | `Nine of (BitVectors.bit * byte) ] option;
+
+ serial_k_out: continuation option;
+
+ io: continuation;
+ expected_out_time: [ `None | `Now | `At of time ];
+
+ (* Timer and clock specific *)
+ clock: time;
+ timer0: word;
+ timer1: word;
+ timer2: word; (* can be missing *)
+
+ esi_running: bool;
+ t0i_running: bool;
+ t1i_running: bool;
+ e0i_running: bool;
+ e1i_running: bool;
+ es_running: bool;
+
+ exit_addr : BitVectors.word;
+ cost_labels : string BitVectors.WordMap.t
+}
+
+(* Try to understand what DEC really does!!! *)
+(* Try to understand I/O *)
+let get_sfr status addr from_latch =
+ match int_of_vect addr with
+ (* I/O and timer ports *)
+ 0x80 -> assert false (* P0 not modeled *)
+ | 0x90 ->
+ if from_latch then
+ status.p1_latch
+ else status.p1
+ | 0xA0 -> assert false (* P2 not modeled *)
+ | 0xB0 ->
+ if from_latch then
+ status.p3_latch
+ else status.p3
+ | 0x99 -> status.sbuf
+ | 0x8A -> status.tl0
+ | 0x8B -> status.tl1
+ | 0x8C -> status.th0
+ | 0x8D -> status.th1
+ | 0xC8 -> status.t2con
+ | 0xCA -> status.rcap2l
+ | 0xCB -> status.rcap2h
+ | 0xCC -> status.tl2
+ | 0xCD -> status.th2
+
+ (* control ports *)
+ | 0x87 -> status.pcon
+ | 0x88 -> status.tcon
+ | 0x89 -> status.tmod
+ | 0x98 -> status.scon
+ | 0xA8 -> status.ie
+ | 0xB8 -> status.ip
+
+ (* registers *)
+ | 0x81 -> status.sp
+ | 0x82 -> status.dpl
+ | 0x83 -> status.dph
+ | 0xD0 -> status.psw
+ | 0xE0 -> status.acc
+ | 0xF0 -> status.b
+ | _ -> assert false
+;;
+
+(* Try to understand I/O *)
+let set_sfr status addr v =
+ match int_of_vect addr with
+ (* I/O and timer ports *)
+ 0x80 -> assert false (* P0 not modeled *)
+ | 0x90 -> { status with p1 = v; p1_latch = v }
+ | 0xA0 -> assert false (* P2 not modeled *)
+ | 0xB0 -> { status with p3 = v; p3_latch = v }
+ | 0x99 ->
+ if status.expected_out_time = `None then
+ { status with sbuf = v; expected_out_time = `Now }
+ else
+ (* a real assert false: trying to initiate a transmission whilst one is still active *)
+ assert false
+ | 0x8A -> { status with tl0 = v }
+ | 0x8B -> { status with tl1 = v }
+ | 0x8C -> { status with th0 = v }
+ | 0x8D -> { status with th1 = v }
+ | 0xC8 -> { status with t2con = v }
+ | 0xCA -> { status with rcap2l = v }
+ | 0xCB -> { status with rcap2h = v }
+ | 0xCD -> { status with tl2 = v }
+ | 0xCE -> { status with th2 = v }
+
+ (* control ports *)
+ | 0x87 -> { status with pcon = v }
+ | 0x88 -> { status with tcon = v }
+ | 0x89 -> { status with tmod = v }
+ | 0x98 -> { status with scon = v }
+ | 0xA8 -> { status with ie = v }
+ | 0xB8 -> { status with ip = v }
+
+ (* registers *)
+ | 0x81 -> { status with sp = v }
+ | 0x82 -> { status with dpl = v }
+ | 0x83 -> { status with dph = v }
+ | 0xD0 -> { status with psw = v }
+ | 0xE0 -> { status with acc = v }
+ | 0xF0 -> { status with b = v }
+ | _ -> assert false
+;;
+
+let initialize = {
+ code_memory = Physical.WordMap.empty;
+ low_internal_ram = Byte7Map.empty;
+ high_internal_ram = Byte7Map.empty;
+ external_ram = Physical.WordMap.empty;
+
+ pc = zero `Sixteen;
+
+ sp = vect_of_int 7 `Eight;
+ dpl = zero `Eight;
+ dph = zero `Eight;
+ pcon = zero `Eight;
+ tcon = zero `Eight;
+ tmod = zero `Eight;
+ tl0 = zero `Eight;
+ tl1 = zero `Eight;
+ th0 = zero `Eight;
+ th1 = zero `Eight;
+ p1 = zero `Eight;
+ p1_latch = zero `Eight;
+ scon = zero `Eight;
+ sbuf = zero `Eight;
+ ie = zero `Eight;
+ p3 = zero `Eight;
+ p3_latch = zero `Eight;
+ ip = zero `Eight;
+ psw = zero `Eight;
+ acc = zero `Eight;
+ b = zero `Eight;
+ t2con = zero `Eight;
+ rcap2l = zero `Eight;
+ rcap2h = zero `Eight;
+ tl2 = zero `Eight;
+ th2 = zero `Eight;
+
+ previous_p1_val = false;
+ previous_p3_val = false;
+
+ serial_v_in = None;
+ serial_v_out = None;
+ serial_epsilon_in = None;
+ serial_epsilon_out = None;
+ serial_k_out = None;
+
+ io_epsilon = 5;
+
+ clock = 0;
+ timer0 = zero `Sixteen;
+ timer1 = zero `Sixteen;
+ timer2 = zero `Sixteen;
+
+ expected_out_time = `None;
+
+ io = debug_continuation; (* a real assert false: unprepared for i/o *)
+
+ (* Initially no interrupts are executing *)
+ esi_running = false;
+ t0i_running = false;
+ t1i_running = false;
+ e0i_running = false;
+ e1i_running = false;
+ es_running = false;
+
+ exit_addr = BitVectors.zero `Sixteen;
+ cost_labels = BitVectors.WordMap.empty
+}
+
+let get_cy_flag status =
+ let (cy,_,_,_),(_,_,_,_) = bits_of_byte status.psw in cy
+let get_ac_flag status =
+ let (_,ac,_,_),(_,_,_,_) = bits_of_byte status.psw in ac
+let get_fo_flag status =
+ let (_,_,fo,_),(_,_,_,_) = bits_of_byte status.psw in fo
+let get_rs1_flag status =
+ let (_,_,_,rs1),(_,_,_,_) = bits_of_byte status.psw in rs1
+let get_rs0_flag status =
+ let (_,_,_,_),(rs0,_,_,_) = bits_of_byte status.psw in rs0
+let get_ov_flag status =
+ let (_,_,_,_),(_,ov,_,_) = bits_of_byte status.psw in ov
+let get_ud_flag status =
+ let (_,_,_,_),(_,_,ud,_) = bits_of_byte status.psw in ud
+let get_p_flag status =
+ let (_,_,_,_),(_,_,_,p) = bits_of_byte status.psw in p
+
+let get_address_of_register status (b1,b2,b3) =
+ let bu,_bl = from_byte status.psw in
+ let (_,_,rs1,rs0) = from_nibble bu in
+ let base =
+ match rs1,rs0 with
+ false,false -> 0x00
+ | false,true -> 0x08
+ | true,false -> 0x10
+ | true,true -> 0x18
+ in
+ vect_of_int (base + int_of_vect (mk_nibble false b1 b2 b3)) `Seven
+;;
+
+let get_register status reg =
+ let addr = get_address_of_register status reg in
+ Byte7Map.find addr status.low_internal_ram
+;;
+
+let string_of_status status =
+ let acc_str = (string_of_int <*> int_of_vect $ status.acc) ^ " (" ^ string_of_vect status.acc ^ ")" in
+ let b_str = (string_of_int <*> int_of_vect $ status.b) ^ " (" ^ string_of_vect status.b ^ ")" in
+ let psw_str = (string_of_int <*> int_of_vect $ status.psw) ^ " (" ^ string_of_vect status.psw ^ ")" in
+ let sp_str = (string_of_int <*> int_of_vect $ status.sp) ^ " (" ^ string_of_vect status.sp ^ ")" in
+ let ip_str = (string_of_int <*> int_of_vect $ status.ip) ^ " (" ^ string_of_vect status.ip ^ ")" in
+ let pc_str = (string_of_int <*> int_of_vect $ status.pc) ^ " (" ^ string_of_vect status.pc ^ ")" in
+ let dpl_str = (string_of_int <*> int_of_vect $ status.dpl) ^ " (" ^ string_of_vect status.dpl ^ ")" in
+ let dph_str = (string_of_int <*> int_of_vect $ status.dph) ^ " (" ^ string_of_vect status.dph ^ ")" in
+ let scn_str = (string_of_int <*> int_of_vect $ status.scon) ^ " (" ^ string_of_vect status.scon ^ ")" in
+ let sbf_str = (string_of_int <*> int_of_vect $ status.sbuf) ^ " (" ^ string_of_vect status.sbuf ^ ")" in
+ let tcn_str = (string_of_int <*> int_of_vect $ status.tcon) ^ " (" ^ string_of_vect status.tcon ^ ")" in
+ let tmd_str = (string_of_int <*> int_of_vect $ status.tmod) ^ " (" ^ string_of_vect status.tmod ^ ")" in
+ let r0_str = (string_of_int <*> int_of_vect $ get_register status (false, false, false)) ^ " (" ^ (string_of_vect $ get_register status (false, false, false)) ^ ")" in
+ let r1_str = (string_of_int <*> int_of_vect $ get_register status (false, false, true)) ^ " (" ^ (string_of_vect $ get_register status (false, false, true)) ^ ")" in
+ let r2_str = (string_of_int <*> int_of_vect $ get_register status (false, true, false)) ^ " (" ^ (string_of_vect $ get_register status (false, true, false)) ^ ")" in
+ let r3_str = (string_of_int <*> int_of_vect $ get_register status (false, true, true)) ^ " (" ^ (string_of_vect $ get_register status (false, true, true)) ^ ")" in
+ let r4_str = (string_of_int <*> int_of_vect $ get_register status (true, false, false)) ^ " (" ^ (string_of_vect $ get_register status (true, false, false)) ^ ")" in
+ let r5_str = (string_of_int <*> int_of_vect $ get_register status (true, false, true)) ^ " (" ^ (string_of_vect $ get_register status (true, false, true)) ^ ")" in
+ let r6_str = (string_of_int <*> int_of_vect $ get_register status (true, true, false)) ^ " (" ^ (string_of_vect $ get_register status (true, true, false)) ^ ")" in
+ let r7_str = (string_of_int <*> int_of_vect $ get_register status (true, true, true)) ^ " (" ^ (string_of_vect $ get_register status (true, true, true)) ^ ")" in
+ "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n" ^
+ " Processor status: \n" ^
+ "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n" ^
+ " ACC : " ^ acc_str ^ "\n" ^
+ " B : " ^ b_str ^ "\n" ^
+ " PSW : " ^ psw_str ^ "\n" ^
+ " with flags set as \n" ^
+ " CY : " ^ (string_of_bool <*> get_cy_flag $ status) ^ "\n" ^
+ " AC : " ^ (string_of_bool <*> get_ac_flag $ status) ^ "\n" ^
+ " FO : " ^ (string_of_bool <*> get_fo_flag $ status) ^ "\n" ^
+ " RS1 : " ^ (string_of_bool <*> get_rs1_flag $ status) ^ "\n" ^
+ " RS0 : " ^ (string_of_bool <*> get_rs0_flag $ status) ^ "\n" ^
+ " OV : " ^ (string_of_bool <*> get_ov_flag $ status) ^ "\n" ^
+ " UD : " ^ (string_of_bool <*> get_ud_flag $ status) ^ "\n" ^
+ " P : " ^ (string_of_bool <*> get_p_flag $ status) ^ "\n" ^
+ " SP : " ^ sp_str ^ "\n" ^
+ " IP : " ^ ip_str ^ "\n" ^
+ " PC : " ^ pc_str ^ "\n" ^
+ " DPL : " ^ dpl_str ^ "\n" ^
+ " DPH : " ^ dph_str ^ "\n" ^
+ " SCON: " ^ scn_str ^ "\n" ^
+ " SBUF: " ^ sbf_str ^ "\n" ^
+ " TMOD: " ^ tmd_str ^ "\n" ^
+ " TCON: " ^ tcn_str ^ "\n" ^
+ " Registers: \n" ^
+ " R0 : " ^ r0_str ^ "\n" ^
+ " R1 : " ^ r1_str ^ "\n" ^
+ " R2 : " ^ r2_str ^ "\n" ^
+ " R3 : " ^ r3_str ^ "\n" ^
+ " R4 : " ^ r4_str ^ "\n" ^
+ " R5 : " ^ r5_str ^ "\n" ^
+ " R6 : " ^ r6_str ^ "\n" ^
+ " R7 : " ^ r7_str ^ "\n" ^
+ "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"
+
+(* timings taken from SIEMENS *)
+
+let fetch pmem pc =
+ let next pc =
+ let _carry, res = half_add pc (vect_of_int 1 `Sixteen) in
+ res, Physical.WordMap.find pc pmem
+ in
+ let pc,instr = next pc in
+ let un, ln = from_byte instr in
+ let bits = (from_nibble un, from_nibble ln) in
+ match bits with
+ (a10,a9,a8,true),(false,false,false,true) ->
+ let pc,b1 = next pc in
+ `ACALL (`ADDR11 (mk_word11 a10 a9 a8 b1)), pc, 2
+ | (false,false,true,false),(true,r1,r2,r3) ->
+ `ADD (`A,`REG (r1,r2,r3)), pc, 1
+ | (false,false,true,false),(false,true,false,true) ->
+ let pc,b1 = next pc in
+ `ADD (`A,`DIRECT b1), pc, 1
+ | (false,false,true,false),(false,true,true,i1) ->
+ `ADD (`A,`INDIRECT i1), pc, 1
+ | (false,false,true,false),(false,true,false,false) ->
+ let pc,b1 = next pc in
+ `ADD (`A,`DATA b1), pc, 1
+ | (false,false,true,true),(true,r1,r2,r3) ->
+ `ADDC (`A,`REG (r1,r2,r3)), pc, 1
+ | (false,false,true,true),(false,true,false,true) ->
+ let pc,b1 = next pc in
+ `ADDC (`A,`DIRECT b1), pc, 1
+ | (false,false,true,true),(false,true,true,i1) ->
+ `ADDC (`A,`INDIRECT i1), pc, 1
+ | (false,false,true,true),(false,true,false,false) ->
+ let pc,b1 = next pc in
+ `ADDC (`A,`DATA b1), pc, 1
+ | (a10,a9,a8,false),(false,false,false,true) ->
+ let pc,b1 = next pc in
+ `AJMP (`ADDR11 (mk_word11 a10 a9 a8 b1)), pc, 2
+ | (false,true,false,true),(true,r1,r2,r3) ->
+ `ANL (`U1 (`A, `REG (r1,r2,r3))), pc, 1
+ | (false,true,false,true),(false,true,false,true) ->
+ let pc,b1 = next pc in
+ `ANL (`U1 (`A, `DIRECT b1)), pc, 1
+ | (false,true,false,true),(false,true,true,i1) ->
+ `ANL (`U1 (`A, `INDIRECT i1)), pc, 1
+ | (false,true,false,true),(false,true,false,false) ->
+ let pc,b1 = next pc in
+ `ANL (`U1 (`A, `DATA b1)), pc, 1
+ | (false,true,false,true),(false,false,true,false) ->
+ let pc,b1 = next pc in
+ `ANL (`U2 (`DIRECT b1,`A)), pc, 1
+ | (false,true,false,true),(false,false,true,true) ->
+ let pc,b1 = next pc in
+ let pc,b2 = next pc in
+ `ANL (`U2 (`DIRECT b1,`DATA b2)), pc, 2
+ | (true,false,false,false),(false,false,true,false) ->
+ let pc,b1 = next pc in
+ `ANL (`U3 (`C,`BIT b1)), pc, 2
+ | (true,false,true,true),(false,false,false,false) ->
+ let pc,b1 = next pc in
+ `ANL (`U3 (`C,`NBIT b1)), pc, 2
+ | (true,false,true,true),(false,true,false,true) ->
+ let pc,b1 = next pc in
+ let pc,b2 = next pc in
+ `CJNE (`U1 (`A, `DIRECT b1), `REL b2), pc, 2
+ | (true,false,true,true),(false,true,false,false) ->
+ let pc,b1 = next pc in
+ let pc,b2 = next pc in
+ `CJNE (`U1 (`A, `DATA b1), `REL b2), pc, 2
+ | (true,false,true,true),(true,r1,r2,r3) ->
+ let pc,b1 = next pc in
+ let pc,b2 = next pc in
+ `CJNE (`U2 (`REG(r1,r2,r3), `DATA b1), `REL b2), pc, 2
+ | (true,false,true,true),(false,true,true,i1) ->
+ let pc,b1 = next pc in
+ let pc,b2 = next pc in
+ `CJNE (`U2 (`INDIRECT i1, `DATA b1), `REL b2), pc, 2
+ | (true,true,true,false),(false,true,false,false) ->
+ `CLR `A, pc, 1
+ | (true,true,false,false),(false,false,true,true) ->
+ `CLR `C, pc, 1
+ | (true,true,false,false),(false,false,true,false) ->
+ let pc,b1 = next pc in
+ `CLR (`BIT b1), pc, 1
+ | (true,true,true,true),(false,true,false,false) ->
+ `CPL `A, pc, 1
+ | (true,false,true,true),(false,false,true,true) ->
+ `CPL `C, pc, 1
+ | (true,false,true,true),(false,false,true,false) ->
+ let pc,b1 = next pc in
+ `CPL (`BIT b1), pc, 1
+ | (true,true,false,true),(false,true,false,false) ->
+ `DA `A, pc, 1
+ | (false,false,false,true),(false,true,false,false) ->
+ `DEC `A, pc, 1
+ | (false,false,false,true),(true,r1,r2,r3) ->
+ `DEC (`REG(r1,r2,r3)), pc, 1
+ | (false,false,false,true),(false,true,false,true) ->
+ let pc,b1 = next pc in
+ `DEC (`DIRECT b1), pc, 1
+ | (false,false,false,true),(false,true,true,i1) ->
+ `DEC (`INDIRECT i1), pc, 1
+ | (true,false,false,false),(false,true,false,false) ->
+ `DIV (`A, `B), pc, 4
+ | (true,true,false,true),(true,r1,r2,r3) ->
+ let pc,b1 = next pc in
+ `DJNZ (`REG(r1,r2,r3), `REL b1), pc, 2
+ | (true,true,false,true),(false,true,false,true) ->
+ let pc,b1 = next pc in
+ let pc,b2 = next pc in
+ `DJNZ (`DIRECT b1, `REL b2), pc, 2
+ | (false,false,false,false),(false,true,false,false) ->
+ `INC `A, pc, 1
+ | (false,false,false,false),(true,r1,r2,r3) ->
+ `INC (`REG(r1,r2,r3)), pc, 1
+ | (false,false,false,false),(false,true,false,true) ->
+ let pc,b1 = next pc in
+ `INC (`DIRECT b1), pc, 1
+ | (false,false,false,false),(false,true,true,i1) ->
+ `INC (`INDIRECT i1), pc, 1
+ | (true,false,true,false),(false,false,true,true) ->
+ `INC `DPTR, pc, 2
+ | (false,false,true,false),(false,false,false,false) ->
+ let pc,b1 = next pc in
+ let pc,b2 = next pc in
+ `JB (`BIT b1, `REL b2), pc, 2
+ | (false,false,false,true),(false,false,false,false) ->
+ let pc,b1 = next pc in
+ let pc,b2 = next pc in
+ `JBC (`BIT b1, `REL b2), pc, 2
+ | (false,true,false,false),(false,false,false,false) ->
+ let pc,b1 = next pc in
+ `JC (`REL b1), pc, 2
+ | (false,true,true,true),(false,false,true,true) ->
+ `JMP `IND_DPTR, pc, 2
+ | (false,false,true,true),(false,false,false,false) ->
+ let pc,b1 = next pc in
+ let pc,b2 = next pc in
+ `JNB (`BIT b1, `REL b2), pc, 2
+ | (false,true,false,true),(false,false,false,false) ->
+ let pc,b1 = next pc in
+ `JNC (`REL b1), pc, 2
+ | (false,true,true,true),(false,false,false,false) ->
+ let pc,b1 = next pc in
+ `JNZ (`REL b1), pc, 2
+ | (false,true,true,false),(false,false,false,false) ->
+ let pc,b1 = next pc in
+ `JZ (`REL b1), pc, 2
+ | (false,false,false,true),(false,false,true,false) ->
+ let pc,b1 = next pc in
+ let pc,b2 = next pc in
+ `LCALL (`ADDR16 (mk_word b1 b2)), pc, 2
+ | (false,false,false,false),(false,false,true,false) ->
+ let pc,b1 = next pc in
+ let pc,b2 = next pc in
+ `LJMP (`ADDR16 (mk_word b1 b2)), pc, 2
+ | (true,true,true,false),(true,r1,r2,r3) ->
+ `MOV (`U1 (`A, `REG(r1,r2,r3))), pc, 1
+ | (true,true,true,false),(false,true,false,true) ->
+ let pc,b1 = next pc in
+ `MOV (`U1 (`A, `DIRECT b1)), pc, 1
+ | (true,true,true,false),(false,true,true,i1) ->
+ `MOV (`U1 (`A, `INDIRECT i1)), pc, 1
+ | (false,true,true,true),(false,true,false,false) ->
+ let pc,b1 = next pc in
+ `MOV (`U1 (`A, `DATA b1)), pc, 1
+ | (true,true,true,true),(true,r1,r2,r3) ->
+ `MOV (`U2 (`REG(r1,r2,r3), `A)), pc, 1
+ | (true,false,true,false),(true,r1,r2,r3) ->
+ let pc,b1 = next pc in
+ `MOV (`U2 (`REG(r1,r2,r3), (`DIRECT b1))), pc, 2
+ | (false,true,true,true),(true,r1,r2,r3) ->
+ let pc,b1 = next pc in
+ `MOV (`U2 (`REG(r1,r2,r3), (`DATA b1))), pc, 1
+ | (true,true,true,true),(false,true,false,true) ->
+ let pc,b1 = next pc in
+ `MOV (`U3 (`DIRECT b1, `A)), pc, 1
+ | (true,false,false,false),(true,r1,r2,r3) ->
+ let pc,b1 = next pc in
+ `MOV (`U3 (`DIRECT b1, `REG(r1,r2,r3))), pc, 2
+ | (true,false,false,false),(false,true,false,true) ->
+ let pc,b1 = next pc in
+ let pc,b2 = next pc in
+ `MOV (`U3 (`DIRECT b1, `DIRECT b2)), pc, 2
+ | (true,false,false,false),(false,true,true,i1) ->
+ let pc,b1 = next pc in
+ `MOV (`U3 (`DIRECT b1, `INDIRECT i1)), pc, 2
+ | (false,true,true,true),(false,true,false,true) ->
+ let pc,b1 = next pc in
+ let pc,b2 = next pc in
+ `MOV (`U3 (`DIRECT b1, `DATA b2)), pc, 3
+ | (true,true,true,true),(false,true,true,i1) ->
+ `MOV (`U2 (`INDIRECT i1, `A)), pc, 1
+ | (true,false,true,false),(false,true,true,i1) ->
+ let pc,b1 = next pc in
+ `MOV (`U2 (`INDIRECT i1, `DIRECT b1)), pc, 2
+ | (false,true,true,true),(false,true,true,i1) ->
+ let pc,b1 = next pc in
+ `MOV (`U2 (`INDIRECT i1, `DATA b1)), pc, 1
+ | (true,false,true,false),(false,false,true,false) ->
+ let pc,b1 = next pc in
+ `MOV (`U5 (`C, `BIT b1)), pc, 1
+ | (true,false,false,true),(false,false,true,false) ->
+ let pc,b1 = next pc in
+ `MOV (`U6 (`BIT b1, `C)), pc, 2
+ | (true,false,false,true),(false,false,false,false) ->
+ let pc,b1 = next pc in
+ let pc,b2 = next pc in
+ `MOV (`U4 (`DPTR, `DATA16(mk_word b1 b2))), pc, 2
+ | (true,false,false,true),(false,false,true,true) ->
+ `MOVC (`A, `A_DPTR), pc, 2
+ | (true,false,false,false),(false,false,true,true) ->
+ `MOVC (`A, `A_PC), pc, 2
+ | (true,true,true,false),(false,false,true,i1) ->
+ `MOVX (`U1 (`A, `EXT_INDIRECT i1)), pc, 2
+ | (true,true,true,false),(false,false,false,false) ->
+ `MOVX (`U1 (`A, `EXT_IND_DPTR)), pc, 2
+ | (true,true,true,true),(false,false,true,i1) ->
+ `MOVX (`U2 (`EXT_INDIRECT i1, `A)), pc, 2
+ | (true,true,true,true),(false,false,false,false) ->
+ `MOVX (`U2 (`EXT_IND_DPTR, `A)), pc, 2
+ | (true,false,true,false),(false,true,false,false) ->
+ `MUL(`A, `B), pc, 4
+ | (false,false,false,false),(false,false,false,false) ->
+ `NOP, pc, 1
+ | (false,true,false,false),(true,r1,r2,r3) ->
+ `ORL (`U1(`A, `REG(r1,r2,r3))), pc, 1
+ | (false,true,false,false),(false,true,false,true) ->
+ let pc,b1 = next pc in
+ `ORL (`U1(`A, `DIRECT b1)), pc, 1
+ | (false,true,false,false),(false,true,true,i1) ->
+ `ORL (`U1(`A, `INDIRECT i1)), pc, 1
+ | (false,true,false,false),(false,true,false,false) ->
+ let pc,b1 = next pc in
+ `ORL (`U1(`A, `DATA b1)), pc, 1
+ | (false,true,false,false),(false,false,true,false) ->
+ let pc,b1 = next pc in
+ `ORL (`U2(`DIRECT b1, `A)), pc, 1
+ | (false,true,false,false),(false,false,true,true) ->
+ let pc,b1 = next pc in
+ let pc,b2 = next pc in
+ `ORL (`U2 (`DIRECT b1, `DATA b2)), pc, 2
+ | (false,true,true,true),(false,false,true,false) ->
+ let pc,b1 = next pc in
+ `ORL (`U3 (`C, `BIT b1)), pc, 2
+ | (true,false,true,false),(false,false,false,false) ->
+ let pc,b1 = next pc in
+ `ORL (`U3 (`C, `NBIT b1)), pc, 2
+ | (true,true,false,true),(false,false,false,false) ->
+ let pc,b1 = next pc in
+ `POP (`DIRECT b1), pc, 2
+ | (true,true,false,false),(false,false,false,false) ->
+ let pc,b1 = next pc in
+ `PUSH (`DIRECT b1), pc, 2
+ | (false,false,true,false),(false,false,true,false) ->
+ `RET, pc, 2
+ | (false,false,true,true),(false,false,true,false) ->
+ `RETI, pc, 2
+ | (false,false,true,false),(false,false,true,true) ->
+ `RL `A, pc, 1
+ | (false,false,true,true),(false,false,true,true) ->
+ `RLC `A, pc, 1
+ | (false,false,false,false),(false,false,true,true) ->
+ `RR `A, pc, 1
+ | (false,false,false,true),(false,false,true,true) ->
+ `RRC `A, pc, 1
+ | (true,true,false,true),(false,false,true,true) ->
+ `SETB `C, pc, 1
+ | (true,true,false,true),(false,false,true,false) ->
+ let pc,b1 = next pc in
+ `SETB (`BIT b1), pc, 1
+ | (true,false,false,false),(false,false,false,false) ->
+ let pc,b1 = next pc in
+ `SJMP (`REL b1), pc, 2
+ | (true,false,false,true),(true,r1,r2,r3) ->
+ `SUBB (`A, `REG(r1,r2,r3)), pc, 1
+ | (true,false,false,true),(false,true,false,true) ->
+ let pc,b1 = next pc in
+ `SUBB (`A, `DIRECT b1), pc, 1
+ | (true,false,false,true),(false,true,true,i1) ->
+ `SUBB (`A, `INDIRECT i1), pc, 1
+ | (true,false,false,true),(false,true,false,false) ->
+ let pc,b1 = next pc in
+ `SUBB (`A, `DATA b1), pc, 1
+ | (true,true,false,false),(false,true,false,false) ->
+ `SWAP `A, pc, 1
+ | (true,true,false,false),(true,r1,r2,r3) ->
+ `XCH (`A, `REG(r1,r2,r3)), pc, 1
+ | (true,true,false,false),(false,true,false,true) ->
+ let pc,b1 = next pc in
+ `XCH (`A, `DIRECT b1), pc, 1
+ | (true,true,false,false),(false,true,true,i1) ->
+ `XCH (`A, `INDIRECT i1), pc, 1
+ | (true,true,false,true),(false,true,true,i1) ->
+ `XCHD(`A, `INDIRECT i1), pc, 1
+ | (false,true,true,false),(true,r1,r2,r3) ->
+ `XRL(`U1(`A, `REG(r1,r2,r3))), pc, 1
+ | (false,true,true,false),(false,true,false,true) ->
+ let pc,b1 = next pc in
+ `XRL(`U1(`A, `DIRECT b1)), pc, 1
+ | (false,true,true,false),(false,true,true,i1) ->
+ `XRL(`U1(`A, `INDIRECT i1)), pc, 1
+ | (false,true,true,false),(false,true,false,false) ->
+ let pc,b1 = next pc in
+ `XRL(`U1(`A, `DATA b1)), pc, 1
+ | (false,true,true,false),(false,false,true,false) ->
+ let pc,b1 = next pc in
+ `XRL(`U2(`DIRECT b1, `A)), pc, 1
+ | (false,true,true,false),(false,false,true,true) ->
+ let pc,b1 = next pc in
+ let pc,b2 = next pc in
+ `XRL(`U2(`DIRECT b1, `DATA b2)), pc, 2
+ | (true,false,true,false),(false,true,false,true) ->
+ (* undefined opcode *) assert false
+;;
+
+let assembly1 =
+ function
+ `ACALL (`ADDR11 w) ->
+ let (a10,a9,a8,b1) = from_word11 w in
+ [mk_byte_from_bits ((a10,a9,a8,true),(false,false,false,true)); b1]
+ | `ADD (`A,`REG (r1,r2,r3)) ->
+ [mk_byte_from_bits ((false,false,true,false),(true,r1,r2,r3))]
+ | `ADD (`A, `DIRECT b1) ->
+ [mk_byte_from_bits ((false,false,true,false),(false,true,false,true)); b1]
+ | `ADD (`A, `INDIRECT i1) ->
+ [mk_byte_from_bits ((false,false,true,false),(false,true,true,i1))]
+ | `ADD (`A, `DATA b1) ->
+ [mk_byte_from_bits ((false,false,true,false),(false,true,false,false)); b1]
+ | `ADDC (`A, `REG(r1,r2,r3)) ->
+ [mk_byte_from_bits ((false,false,true,true),(true,r1,r2,r3))]
+ | `ADDC (`A, `DIRECT b1) ->
+ [mk_byte_from_bits ((false,false,true,true),(false,true,false,true)); b1]
+ | `ADDC (`A,`INDIRECT i1) ->
+ [mk_byte_from_bits ((false,false,true,true),(false,true,true,i1))]
+ | `ADDC (`A,`DATA b1) ->
+ [mk_byte_from_bits ((false,false,true,true),(false,true,false,false)); b1]
+ | `AJMP (`ADDR11 w) ->
+ let (a10,a9,a8,b1) = from_word11 w in
+ [mk_byte_from_bits ((a10,a9,a8,false),(false,false,false,true)); b1]
+ | `ANL (`U1 (`A, `REG (r1,r2,r3))) ->
+ [mk_byte_from_bits ((false,true,false,true),(true,r1,r2,r3))]
+ | `ANL (`U1 (`A, `DIRECT b1)) ->
+ [mk_byte_from_bits ((false,true,false,true),(false,true,false,true)); b1]
+ | `ANL (`U1 (`A, `INDIRECT i1)) ->
+ [mk_byte_from_bits ((false,true,false,true),(false,true,true,i1))]
+ | `ANL (`U1 (`A, `DATA b1)) ->
+ [mk_byte_from_bits ((false,true,false,true),(false,true,false,false)); b1]
+ | `ANL (`U2 (`DIRECT b1,`A)) ->
+ [mk_byte_from_bits ((false,true,false,true),(false,false,true,false)); b1]
+ | `ANL (`U2 (`DIRECT b1,`DATA b2)) ->
+ [mk_byte_from_bits ((false,true,false,true),(false,false,true,true)); b1; b2]
+ | `ANL (`U3 (`C,`BIT b1)) ->
+ [mk_byte_from_bits ((true,false,false,false),(false,false,true,false)); b1]
+ | `ANL (`U3 (`C,`NBIT b1)) ->
+ [mk_byte_from_bits ((true,false,true,true),(false,false,false,false)); b1]
+ | `CJNE (`U1 (`A, `DIRECT b1), `REL b2) ->
+ [mk_byte_from_bits ((true,false,true,true),(false,true,false,true)); b1; b2]
+ | `CJNE (`U1 (`A, `DATA b1), `REL b2) ->
+ [mk_byte_from_bits ((true,false,true,true),(false,true,false,false)); b1; b2]
+ | `CJNE (`U2 (`REG(r1,r2,r3), `DATA b1), `REL b2) ->
+ [mk_byte_from_bits ((true,false,true,true),(true,r1,r2,r3)); b1; b2]
+ | `CJNE (`U2 (`INDIRECT i1, `DATA b1), `REL b2) ->
+ [mk_byte_from_bits ((true,false,true,true),(false,true,true,i1)); b1; b2]
+ | `CLR `A ->
+ [mk_byte_from_bits ((true,true,true,false),(false,true,false,false))]
+ | `CLR `C ->
+ [mk_byte_from_bits ((true,true,false,false),(false,false,true,true))]
+ | `CLR (`BIT b1) ->
+ [mk_byte_from_bits ((true,true,false,false),(false,false,true,false)); b1]
+ | `CPL `A ->
+ [mk_byte_from_bits ((true,true,true,true),(false,true,false,false))]
+ | `CPL `C ->
+ [mk_byte_from_bits ((true,false,true,true),(false,false,true,true))]
+ | `CPL (`BIT b1) ->
+ [mk_byte_from_bits ((true,false,true,true),(false,false,true,false)); b1]
+ | `DA `A ->
+ [mk_byte_from_bits ((true,true,false,true),(false,true,false,false))]
+ | `DEC `A ->
+ [mk_byte_from_bits ((false,false,false,true),(false,true,false,false))]
+ | `DEC (`REG(r1,r2,r3)) ->
+ [mk_byte_from_bits ((false,false,false,true),(true,r1,r2,r3))]
+ | `DEC (`DIRECT b1) ->
+ [mk_byte_from_bits ((false,false,false,true),(false,true,false,true)); b1]
+ | `DEC (`INDIRECT i1) ->
+ [mk_byte_from_bits ((false,false,false,true),(false,true,true,i1))]
+ | `DIV (`A, `B) ->
+ [mk_byte_from_bits ((true,false,false,false),(false,true,false,false))]
+ | `DJNZ (`REG(r1,r2,r3), `REL b1) ->
+ [mk_byte_from_bits ((true,true,false,true),(true,r1,r2,r3)); b1]
+ | `DJNZ (`DIRECT b1, `REL b2) ->
+ [mk_byte_from_bits ((true,true,false,true),(false,true,false,true)); b1; b2]
+ | `INC `A ->
+ [mk_byte_from_bits ((false,false,false,false),(false,true,false,false))]
+ | `INC (`REG(r1,r2,r3)) ->
+ [mk_byte_from_bits ((false,false,false,false),(true,r1,r2,r3))]
+ | `INC (`DIRECT b1) ->
+ [mk_byte_from_bits ((false,false,false,false),(false,true,false,true)); b1]
+ | `INC (`INDIRECT i1) ->
+ [mk_byte_from_bits ((false,false,false,false),(false,true,true,i1))]
+ | `INC `DPTR ->
+ [mk_byte_from_bits ((true,false,true,false),(false,false,true,true))]
+ | `JB (`BIT b1, `REL b2) ->
+ [mk_byte_from_bits ((false,false,true,false),(false,false,false,false)); b1; b2]
+ | `JBC (`BIT b1, `REL b2) ->
+ [mk_byte_from_bits ((false,false,false,true),(false,false,false,false)); b1; b2]
+ | `JC (`REL b1) ->
+ [mk_byte_from_bits ((false,true,false,false),(false,false,false,false)); b1]
+ | `JMP `IND_DPTR ->
+ [mk_byte_from_bits ((false,true,true,true),(false,false,true,true))]
+ | `JNB (`BIT b1, `REL b2) ->
+ [mk_byte_from_bits ((false,false,true,true),(false,false,false,false)); b1; b2]
+ | `JNC (`REL b1) ->
+ [mk_byte_from_bits ((false,true,false,true),(false,false,false,false)); b1]
+ | `JNZ (`REL b1) ->
+ [mk_byte_from_bits ((false,true,true,true),(false,false,false,false)); b1]
+ | `JZ (`REL b1) ->
+ [mk_byte_from_bits ((false,true,true,false),(false,false,false,false)); b1]
+ | `LCALL (`ADDR16 w) ->
+ let (b1,b2) = from_word w in
+ [mk_byte_from_bits ((false,false,false,true),(false,false,true,false)); b1; b2]
+ | `LJMP (`ADDR16 w) ->
+ let (b1,b2) = from_word w in
+ [mk_byte_from_bits ((false,false,false,false),(false,false,true,false)); b1; b2]
+ | `MOV (`U1 (`A, `REG(r1,r2,r3))) ->
+ [mk_byte_from_bits ((true,true,true,false),(true,r1,r2,r3))]
+ | `MOV (`U1 (`A, `DIRECT b1)) ->
+ [mk_byte_from_bits ((true,true,true,false),(false,true,false,true)); b1]
+ | `MOV (`U1 (`A, `INDIRECT i1)) ->
+ [mk_byte_from_bits ((true,true,true,false),(false,true,true,i1))]
+ | `MOV (`U1 (`A, `DATA b1)) ->
+ [mk_byte_from_bits ((false,true,true,true),(false,true,false,false)); b1]
+ | `MOV (`U2 (`REG(r1,r2,r3), `A)) ->
+ [mk_byte_from_bits ((true,true,true,true),(true,r1,r2,r3))]
+ | `MOV (`U2 (`REG(r1,r2,r3), (`DIRECT b1))) ->
+ [mk_byte_from_bits ((true,false,true,false),(true,r1,r2,r3)); b1]
+ | `MOV (`U2 (`REG(r1,r2,r3), (`DATA b1))) ->
+ [mk_byte_from_bits ((false,true,true,true),(true,r1,r2,r3)); b1]
+ | `MOV (`U3 (`DIRECT b1, `A)) ->
+ [mk_byte_from_bits ((true,true,true,true),(false,true,false,true)); b1]
+ | `MOV (`U3 (`DIRECT b1, `REG(r1,r2,r3))) ->
+ [mk_byte_from_bits ((true,false,false,false),(true,r1,r2,r3)); b1]
+ | `MOV (`U3 (`DIRECT b1, `DIRECT b2)) ->
+ [mk_byte_from_bits ((true,false,false,false),(false,true,false,true)); b1; b2]
+ | `MOV (`U3 (`DIRECT b1, `INDIRECT i1)) ->
+ [mk_byte_from_bits ((true,false,false,false),(false,true,true,i1)); b1]
+ | `MOV (`U3 (`DIRECT b1, `DATA b2)) ->
+ [mk_byte_from_bits ((false,true,true,true),(false,true,false,true)); b1; b2]
+ | `MOV (`U2 (`INDIRECT i1, `A)) ->
+ [mk_byte_from_bits ((true,true,true,true),(false,true,true,i1))]
+ | `MOV (`U2 (`INDIRECT i1, `DIRECT b1)) ->
+ [mk_byte_from_bits ((true,false,true,false),(false,true,true,i1)); b1]
+ | `MOV (`U2 (`INDIRECT i1, `DATA b1)) ->
+ [mk_byte_from_bits ((false,true,true,true),(false,true,true,i1)); b1]
+ | `MOV (`U5 (`C, `BIT b1)) ->
+ [mk_byte_from_bits ((true,false,true,false),(false,false,true,false)); b1]
+ | `MOV (`U6 (`BIT b1, `C)) ->
+ [mk_byte_from_bits ((true,false,false,true),(false,false,true,false)); b1]
+ | `MOV (`U4 (`DPTR, `DATA16 w)) ->
+ let (b1,b2) = from_word w in
+ [mk_byte_from_bits ((true,false,false,true),(false,false,false,false)); b1; b2]
+ | `MOVC (`A, `A_DPTR) ->
+ [mk_byte_from_bits ((true,false,false,true),(false,false,true,true))]
+ | `MOVC (`A, `A_PC) ->
+ [mk_byte_from_bits ((true,false,false,false),(false,false,true,true))]
+ | `MOVX (`U1 (`A, `EXT_INDIRECT i1)) ->
+ [mk_byte_from_bits ((true,true,true,false),(false,false,true,i1))]
+ | `MOVX (`U1 (`A, `EXT_IND_DPTR)) ->
+ [mk_byte_from_bits ((true,true,true,false),(false,false,false,false))]
+ | `MOVX (`U2 (`EXT_INDIRECT i1, `A)) ->
+ [mk_byte_from_bits ((true,true,true,true),(false,false,true,i1))]
+ | `MOVX (`U2 (`EXT_IND_DPTR, `A)) ->
+ [mk_byte_from_bits ((true,true,true,true),(false,false,false,false))]
+ | `MUL(`A, `B) ->
+ [mk_byte_from_bits ((true,false,true,false),(false,true,false,false))]
+ | `NOP ->
+ [mk_byte_from_bits ((false,false,false,false),(false,false,false,false))]
+ | `ORL (`U1(`A, `REG(r1,r2,r3))) ->
+ [mk_byte_from_bits ((false,true,false,false),(true,r1,r2,r3))]
+ | `ORL (`U1(`A, `DIRECT b1)) ->
+ [mk_byte_from_bits ((false,true,false,false),(false,true,false,true)); b1]
+ | `ORL (`U1(`A, `INDIRECT i1)) ->
+ [mk_byte_from_bits ((false,true,false,false),(false,true,true,i1))]
+ | `ORL (`U1(`A, `DATA b1)) ->
+ [mk_byte_from_bits ((false,true,false,false),(false,true,false,false)); b1]
+ | `ORL (`U2(`DIRECT b1, `A)) ->
+ [mk_byte_from_bits ((false,true,false,false),(false,false,true,false)); b1]
+ | `ORL (`U2 (`DIRECT b1, `DATA b2)) ->
+ [mk_byte_from_bits ((false,true,false,false),(false,false,true,true)); b1; b2]
+ | `ORL (`U3 (`C, `BIT b1)) ->
+ [mk_byte_from_bits ((false,true,true,true),(false,false,true,false)); b1]
+ | `ORL (`U3 (`C, `NBIT b1)) ->
+ [mk_byte_from_bits ((true,false,true,false),(false,false,false,false)); b1]
+ | `POP (`DIRECT b1) ->
+ [mk_byte_from_bits ((true,true,false,true),(false,false,false,false)); b1]
+ | `PUSH (`DIRECT b1) ->
+ [mk_byte_from_bits ((true,true,false,false),(false,false,false,false)); b1]
+ | `RET ->
+ [mk_byte_from_bits ((false,false,true,false),(false,false,true,false))]
+ | `RETI ->
+ [mk_byte_from_bits ((false,false,true,true),(false,false,true,false))]
+ | `RL `A ->
+ [mk_byte_from_bits ((false,false,true,false),(false,false,true,true))]
+ | `RLC `A ->
+ [mk_byte_from_bits ((false,false,true,true),(false,false,true,true))]
+ | `RR `A ->
+ [mk_byte_from_bits ((false,false,false,false),(false,false,true,true))]
+ | `RRC `A ->
+ [mk_byte_from_bits ((false,false,false,true),(false,false,true,true))]
+ | `SETB `C ->
+ [mk_byte_from_bits ((true,true,false,true),(false,false,true,true))]
+ | `SETB (`BIT b1) ->
+ [mk_byte_from_bits ((true,true,false,true),(false,false,true,false)); b1]
+ | `SJMP (`REL b1) ->
+ [mk_byte_from_bits ((true,false,false,false),(false,false,false,false)); b1]
+ | `SUBB (`A, `REG(r1,r2,r3)) ->
+ [mk_byte_from_bits ((true,false,false,true),(true,r1,r2,r3))]
+ | `SUBB (`A, `DIRECT b1) ->
+ [mk_byte_from_bits ((true,false,false,true),(false,true,false,true)); b1]
+ | `SUBB (`A, `INDIRECT i1) ->
+ [mk_byte_from_bits ((true,false,false,true),(false,true,true,i1))]
+ | `SUBB (`A, `DATA b1) ->
+ [mk_byte_from_bits ((true,false,false,true),(false,true,false,false)); b1]
+ | `SWAP `A ->
+ [mk_byte_from_bits ((true,true,false,false),(false,true,false,false))]
+ | `XCH (`A, `REG(r1,r2,r3)) ->
+ [mk_byte_from_bits ((true,true,false,false),(true,r1,r2,r3))]
+ | `XCH (`A, `DIRECT b1) ->
+ [mk_byte_from_bits ((true,true,false,false),(false,true,false,true)); b1]
+ | `XCH (`A, `INDIRECT i1) ->
+ [mk_byte_from_bits ((true,true,false,false),(false,true,true,i1))]
+ | `XCHD(`A, `INDIRECT i1) ->
+ [mk_byte_from_bits ((true,true,false,true),(false,true,true,i1))]
+ | `XRL(`U1(`A, `REG(r1,r2,r3))) ->
+ [mk_byte_from_bits ((false,true,true,false),(true,r1,r2,r3))]
+ | `XRL(`U1(`A, `DIRECT b1)) ->
+ [mk_byte_from_bits ((false,true,true,false),(false,true,false,true)); b1]
+ | `XRL(`U1(`A, `INDIRECT i1)) ->
+ [mk_byte_from_bits ((false,true,true,false),(false,true,true,i1))]
+ | `XRL(`U1(`A, `DATA b1)) ->
+ [mk_byte_from_bits ((false,true,true,false),(false,true,false,false)); b1]
+ | `XRL(`U2(`DIRECT b1, `A)) ->
+ [mk_byte_from_bits ((false,true,true,false),(false,false,true,false)); b1]
+ | `XRL(`U2(`DIRECT b1, `DATA b2)) ->
+ [mk_byte_from_bits ((false,true,true,false),(false,false,true,true)); b1; b2]
+;;
+
+let load_code_memory = MiscPottier.foldi (fun i mem v -> Physical.WordMap.add (vect_of_int i `Sixteen) v mem) Physical.WordMap.empty
+
+let load_mem mem status = { status with code_memory = mem }
+let load l = load_mem (load_code_memory l)
+
+let assembly_jump addr_of =
+ function
+ `JC a1 -> `JC (addr_of a1)
+ | `JNC a1 -> `JNC (addr_of a1)
+ | `JB (a1,a2) -> `JB (a1,addr_of a2)
+ | `JNB (a1,a2) -> `JNB (a1,addr_of a2)
+ | `JBC (a1,a2) -> `JBC (a1,addr_of a2)
+ | `JZ a1 -> `JZ (addr_of a1)
+ | `JNZ a1 -> `JNZ (addr_of a1)
+ | `CJNE (a1,a2) -> `CJNE (a1,addr_of a2)
+ | `DJNZ (a1,a2) -> `DJNZ (a1,addr_of a2)
+;;
+
+let assembly p =
+ let datalabels,_ =
+ List.fold_left
+ (fun (datalabels,addr) (name,size) ->
+ let addr16 = vect_of_int addr `Sixteen in
+ StringTools.Map.add name addr16 datalabels, addr+size
+ ) (StringTools.Map.empty,0) p.ASM.ppreamble
+ in
+ let pc,exit_addr,labels,costs =
+ List.fold_left
+ (fun (pc,exit_addr,labels,costs) i ->
+ match i with
+ `Label s when s = p.ASM.pexit_label -> pc, pc, StringTools.Map.add s pc labels, costs
+ | `Label s -> pc, exit_addr, StringTools.Map.add s pc labels, costs
+ | `Cost s -> pc, exit_addr, labels, BitVectors.WordMap.add pc s costs
+ | `Mov (_,_) -> (snd (half_add pc (vect_of_int 3 `Sixteen))), exit_addr, labels, costs
+ | `Jmp _
+ | `Call _ -> (snd (half_add pc (BitVectors.vect_of_int 3 `Sixteen))), exit_addr, labels, costs
+ (*CSC: very stupid: always expand to worst opcode *)
+ | `WithLabel i ->
+ let fake_addr _ = `REL (zero `Eight) in
+ let fake_jump = assembly_jump fake_addr i in
+ let i',pc',_ = fetch (load_code_memory (assembly1 fake_jump)) (vect_of_int 0 `Sixteen) in
+ assert (fake_jump = i');
+ let pc' = snd (half_add pc' (vect_of_int 5 `Sixteen)) in
+ (snd (half_add pc pc'), exit_addr, labels, costs)
+ | #instruction as i ->
+ let i',pc',_ = fetch (load_code_memory (assembly1 i)) (vect_of_int 0 `Sixteen) in
+ assert (i = i');
+ (snd (half_add pc pc'),exit_addr,labels, costs)
+ )
+ (BitVectors.zero `Sixteen,BitVectors.zero `Sixteen,
+ StringTools.Map.empty, BitVectors.WordMap.empty) p.ASM.pcode
+ in
+ let code =
+ List.flatten (List.map
+ (function
+ `Label _
+ | `Cost _ -> []
+ | `WithLabel i ->
+ (* We need to expand a conditional jump to a label to a machine language
+ conditional jump. Suppose we have:
+ JC label
+ This should be expanded to:
+ JC 2 -- size of a short jump
+ SJMP 3 -- size of a long jump
+ LJMP offset -- offset = position of label in code
+ And, for ever label appearing after the location of the jump in code
+ memory, we must increment by 5, as we added two new instructions. *)
+ let to_ljmp = `REL (vect_of_int 2 `Eight) in
+ (* let offset = 5 in *)
+ let jmp_address, translated_jump =
+ match i with
+ `JC (`Label a) ->
+ let address = StringTools.Map.find a labels in
+ let reconstructed = `JC to_ljmp in
+ address, reconstructed
+ | `JNC (`Label a) ->
+ let address = StringTools.Map.find a labels in
+ let reconstructed = `JNC to_ljmp in
+ address, reconstructed
+ | `JB (b, `Label a) ->
+ let address = StringTools.Map.find a labels in
+ let reconstructed = `JB (b, to_ljmp) in
+ address, reconstructed
+ | `JNB (b, `Label a) ->
+ let address = StringTools.Map.find a labels in
+ let reconstructed = `JNB (b, to_ljmp) in
+ address, reconstructed
+ | `JBC (b, `Label a) ->
+ let address = StringTools.Map.find a labels in
+ let reconstructed = `JBC (b, to_ljmp) in
+ address, reconstructed
+ | `JZ (`Label a) ->
+ let address = StringTools.Map.find a labels in
+ let reconstructed = `JZ (to_ljmp) in
+ address, reconstructed
+ | `JNZ (`Label a) ->
+ let address = StringTools.Map.find a labels in
+ let reconstructed = `JNZ (to_ljmp) in
+ address, reconstructed
+ | `CJNE (args, `Label a) ->
+ let address = StringTools.Map.find a labels in
+ let reconstructed = `CJNE (args, to_ljmp) in
+ address, reconstructed
+ | `DJNZ (args, `Label a) ->
+ let address = StringTools.Map.find a labels in
+ let reconstructed = `DJNZ (args, to_ljmp) in
+ address, reconstructed
+ in
+ let sjmp, jmp = `SJMP (`REL (vect_of_int 3 `Eight)), `LJMP (`ADDR16 jmp_address) in
+ let translation = [ translated_jump; sjmp; jmp ] in
+ List.flatten (List.map assembly1 translation)
+ | `Mov (`DPTR,s) ->
+ (* let addr16 = StringTools.Map.find s datalabels in *)
+ let addrr16 =
+ try StringTools.Map.find s datalabels
+ with Not_found -> StringTools.Map.find s labels in
+ assembly1 (`MOV (`U4 (`DPTR,`DATA16 addrr16)))
+ | `Jmp s ->
+ let pc_offset = StringTools.Map.find s labels in
+ assembly1 (`LJMP (`ADDR16 pc_offset))
+ | `Call s ->
+ let pc_offset = StringTools.Map.find s labels in
+ assembly1 (`LCALL (`ADDR16 pc_offset ))
+ | #instruction as i -> assembly1 i) p.ASM.pcode) in
+ { ASM.code = code ; ASM.cost_labels = costs ;
+ ASM.labels = StringTools.Map.empty ;
+ ASM.exit_addr = exit_addr ; ASM.has_main = p.ASM.phas_main }
+;;
+
+let set_register status v reg =
+ let addr = get_address_of_register status reg in
+ { status with low_internal_ram =
+ Byte7Map.add addr v status.low_internal_ram }
+;;
+
+let get_arg_8 status from_latch =
+ function
+ `DIRECT addr ->
+ let n0, n1 = from_byte addr in
+ (match from_nibble n0 with
+ (false,r1,r2,r3) ->
+ Byte7Map.find (mk_byte7 r1 r2 r3 n1) status.low_internal_ram
+ | _ -> get_sfr status addr from_latch)
+ | `INDIRECT b ->
+ let (b1, b2) = from_byte (get_register status (false,false,b)) in
+ (match (from_nibble b1, b2) with
+ (false,r1,r2,r3),b2 ->
+ Byte7Map.find (mk_byte7 r1 r2 r3 b2) status.low_internal_ram
+ | (true,r1,r2,r3),b2 ->
+ Byte7Map.find (mk_byte7 r1 r2 r3 b2) status.high_internal_ram)
+ | `REG (b1,b2,b3) -> get_register status (b1,b2,b3)
+ | `A -> status.acc
+ | `B -> status.b
+ | `DATA b -> b
+ | `A_DPTR ->
+ let dpr = mk_word status.dph status.dpl in
+ (* CSC: what is the right behaviour in case of overflow?
+ assert false for now. Try to understand what DEC really does *)
+ let cry,addr = half_add dpr (mk_word (vect_of_int 0 `Eight) status.acc) in
+ Physical.WordMap.find addr status.external_ram
+ | `A_PC ->
+ (* CSC: what is the right behaviour in case of overflow?
+ assert false for now *)
+ let cry,addr = half_add status.pc (mk_word (vect_of_int 0 `Eight) status.acc) in
+ Physical.WordMap.find addr status.external_ram
+ | `EXT_INDIRECT b ->
+ let addr = get_register status (false,false,b) in
+ Physical.WordMap.find (mk_word (zero `Eight) addr) status.external_ram
+ | `EXT_IND_DPTR ->
+ let dpr = mk_word status.dph status.dpl in
+ Physical.WordMap.find dpr status.external_ram
+;;
+
+let get_arg_16 _status = function `DATA16 w -> w
+
+let get_arg_1 status from_latch =
+ function
+ `BIT addr
+ | `NBIT addr as x ->
+ let n1, n2 = from_byte addr in
+ let res =
+ (match from_nibble n1 with
+ (false,r1,r2,r3) ->
+ let addr = (int_of_vect (mk_byte7 r1 r2 r3 n2)) in
+ let addr' = vect_of_int ((addr / 8) + 32) `Seven in
+ get_bit (Byte7Map.find addr' status.low_internal_ram) (addr mod 8)
+ | (true,r1,r2,r3) ->
+ let addr = int_of_vect $ mk_byte7 r1 r2 r3 n2 in
+ let div = addr / 8 in
+ let rem = addr mod 8 in
+ get_bit (get_sfr status (vect_of_int ((div * 8) + 128) `Eight) from_latch) rem)
+ in (match x with `NBIT _ -> not res | _ -> res)
+ | `C -> get_cy_flag status
+
+let set_arg_1 status v =
+ function
+ `BIT addr ->
+ let n1, n2 = from_byte addr in
+ (match from_nibble n1 with
+ (false,r1,r2,r3) ->
+ let addr = (int_of_vect (mk_byte7 r1 r2 r3 n2)) in
+ let addr' = vect_of_int ((addr / 8) + 32) `Seven in
+ let n_bit = set_bit (Byte7Map.find addr' status.low_internal_ram) (addr mod 8) v in
+ { status with low_internal_ram = Byte7Map.add addr' n_bit status.low_internal_ram }
+ | (true,r1,r2,r3) ->
+ let addr = int_of_vect $ mk_byte7 r1 r2 r3 n2 in
+ let div = addr / 8 in
+ let rem = addr mod 8 in
+ let addr' = vect_of_int ((div * 8) + 128) `Eight in
+ let sfr = get_sfr status addr' true in (* are we reading from the latch here? *)
+ let sfr' = set_bit sfr rem v in
+ set_sfr status addr' sfr')
+ | `C ->
+ let (n1,n2) = from_byte status.psw in
+ let (_,b2,b3,b4) = from_nibble n1 in
+ { status with psw = (mk_byte (mk_nibble v b2 b3 b4) n2) }
+
+let set_arg_8 status v =
+ function
+ `DIRECT addr ->
+ let (b1, b2) = from_byte addr in
+ (match from_nibble b1 with
+ (false,r1,r2,r3) ->
+ { status with low_internal_ram =
+ Byte7Map.add (mk_byte7 r1 r2 r3 b2) v status.low_internal_ram }
+ | _ -> set_sfr status addr v)
+ | `INDIRECT b ->
+ let (b1, b2) = from_byte (get_register status (false,false,b)) in
+ (match (from_nibble b1, b2) with
+ (false,r1,r2,r3),n1 ->
+ { status with low_internal_ram =
+ Byte7Map.add (mk_byte7 r1 r2 r3 n1) v status.low_internal_ram }
+ | (true,r1,r2,r3),n1 ->
+ { status with high_internal_ram =
+ Byte7Map.add (mk_byte7 r1 r2 r3 n1) v status.high_internal_ram })
+ | `REG (b1,b2,b3) ->
+ set_register status v (b1,b2,b3)
+ | `A -> { status with acc = v }
+ | `B -> { status with b = v }
+ | `EXT_IND_DPTR ->
+ let dpr = mk_word status.dph status.dpl in
+ { status with external_ram =
+ Physical.WordMap.add dpr v status.external_ram }
+ | `EXT_INDIRECT b ->
+ let addr = get_register status (false,false,b) in
+ { status with external_ram =
+ Physical.WordMap.add (mk_word (zero `Eight) addr) v status.external_ram }
+;;
+
+let set_arg_16 status wrd =
+ function
+ `DPTR ->
+ let (dh, dl) = from_word wrd in
+ { status with dph = dh; dpl = dl }
+
+let set_flags status c ac ov =
+ { status with psw =
+ let bu,bl = from_byte status.psw in
+ let (_c,oac,fo,rs1),(rs0,_ov,ud,p) = from_nibble bu, from_nibble bl in
+ let ac = match ac with None -> oac | Some v -> v in
+ mk_byte (mk_nibble c ac fo rs1) (mk_nibble rs0 ov ud p)
+ }
+;;
+
+let xor b1 b2 =
+ if b1 = true && b2 = true then
+ false
+ else if b1 = false && b2 = false then
+ false
+ else true
+;;
+
+let read_at_sp status =
+ let n1,n2 = from_byte status.sp in
+ let m,r1,r2,r3 = from_nibble n1 in
+ Byte7Map.find (mk_byte7 r1 r2 r3 n2)
+ (if m then status.low_internal_ram else status.high_internal_ram)
+;;
+
+let write_at_sp status v =
+ let n1,n2 = from_byte status.sp in
+ match from_nibble n1 with
+ true,r1,r2,r3 ->
+ let memory =
+ Byte7Map.add (mk_byte7 r1 r2 r3 n2) v status.low_internal_ram
+ in
+ { status with low_internal_ram = memory }
+ | false,r1,r2,r3 ->
+ let memory =
+ Byte7Map.add (mk_byte7 r1 r2 r3 n2) v status.high_internal_ram
+ in
+ { status with high_internal_ram = memory }
+;;
+
+let timer0 status b1 b2 ticks =
+ let b = get_bit status.tcon 4 in
+ (* Timer0 first *)
+ (match b1,b2 with
+ true,true ->
+ (* Archaic 13 bit mode. *)
+ if b then
+ let res,_,_,_ = add8_with_c status.tl0 (vect_of_int ticks `Eight) false in
+ let res = int_of_vect res in
+ if res > 31 then
+ let res = res mod 32 in
+ let res',cy',ov',ac' = add8_with_c status.th0 (vect_of_int 1 `Eight) false in
+ if ov' then
+ let b = set_bit status.tcon 7 true in
+ { status with tcon = b; th0 = res'; tl0 = vect_of_int res `Eight }
+ else
+ { status with th0 = res'; tl0 = vect_of_int res `Eight }
+ else
+ { status with tl0 = vect_of_int res `Eight }
+ else
+ status
+ | false,false ->
+ (* 8 bit split timer mode. *)
+ let status =
+ (if b then
+ let res,cy,ov,ac = add8_with_c status.tl0 (vect_of_int ticks `Eight) false in
+ if ov then
+ let b = set_bit status.tcon 5 true in
+ { status with tcon = b; tl0 = res }
+ else
+ { status with tl0 = res }
+ else
+ status)
+ in
+ if get_bit status.tcon 6 then
+ let res,cy,ov,ac = add8_with_c status.th0 (vect_of_int ticks `Eight) false in
+ if ov then
+ let b = set_bit status.tcon 7 true in
+ { status with tcon = b; th0 = res }
+ else
+ { status with th0 = res }
+ else
+ status
+ | false,true ->
+ (* 16 bit timer mode. *)
+ if b then
+ let res,_,ov,_ = add16_with_c (mk_word status.th0 status.tl0) (vect_of_int ticks `Sixteen) false in
+ if ov then
+ let b = set_bit status.tcon 5 true in
+ let new_th0,new_tl0 = from_word res in
+ { status with tcon = b; th0 = new_th0; tl0 = new_tl0 }
+ else
+ let new_th0,new_tl0 = from_word res in
+ { status with th0 = new_th0; tl0 = new_tl0 }
+ else
+ status
+ | true,false ->
+ (* 8 bit single timer mode. *)
+ if b then
+ let res,_,ov,_ = add8_with_c status.tl0 (vect_of_int ticks `Eight) false in
+ if ov then
+ let b = set_bit status.tcon 5 true in
+ { status with tcon = b; tl0 = status.th0; }
+ else
+ { status with tl0 = res }
+ else
+ status)
+
+let timer1 status b3 b4 ticks =
+ let b = get_bit status.tcon 4 in
+ (match b3,b4 with
+ true,true ->
+ (* Archaic 13 bit mode. *)
+ if b then
+ let res,_,_,_ = add8_with_c status.tl1 (vect_of_int ticks `Eight) false in
+ let res = int_of_vect res in
+ if res > 31 then
+ let res = res mod 32 in
+ let res',cy',ov',ac' = add8_with_c status.th1 (vect_of_int 1 `Eight) false in
+ if ov' then
+ let b = set_bit status.tcon 7 true in
+ { status with tcon = b; th1 = res'; tl1 = vect_of_int res `Eight }
+ else
+ { status with th1 = res'; tl0 = vect_of_int res `Eight }
+ else
+ { status with tl1 = vect_of_int res `Eight }
+ else
+ status
+ | false,false ->
+ (* 8 bit split timer mode. *)
+ let status =
+ (if b then
+ let res,cy,ov,ac = add8_with_c status.tl1 (vect_of_int ticks `Eight) false in
+ if ov then
+ let b = set_bit status.tcon 5 true in
+ { status with tcon = b; tl1 = res }
+ else
+ { status with tl1 = res }
+ else
+ status)
+ in
+ if get_bit status.tcon 6 then
+ let res,cy,ov,ac = add8_with_c status.th1 (vect_of_int ticks `Eight) false in
+ if ov then
+ let b = set_bit status.tcon 7 true in
+ { status with tcon = b; th1 = res }
+ else
+ { status with th1 = res }
+ else
+ status
+ | false,true ->
+ (* 16 bit timer mode. *)
+ if b then
+ let res,_,ov,_ = add16_with_c (mk_word status.th0 status.tl1) (vect_of_int ticks `Sixteen) false in
+ if ov then
+ let b = set_bit status.tcon 5 true in
+ let new_th1,new_tl1 = from_word res in
+ { status with tcon = b; th1 = new_th1; tl1 = new_tl1 }
+ else
+ let new_th1,new_tl1 = from_word res in
+ { status with th1 = new_th1; tl1 = new_tl1 }
+ else
+ status
+ | true,false ->
+ (* 8 bit single timer mode. *)
+ if b then
+ let res,_,ov,_ = add8_with_c status.tl1 (vect_of_int ticks `Eight) false in
+ if ov then
+ let b = set_bit status.tcon 5 true in
+ { status with tcon = b; tl1 = status.th1; }
+ else
+ { status with tl1 = res }
+ else
+ status)
+;;
+
+let timers status ticks =
+ (* DPM: Clock/Timer code follows. *)
+ match bits_of_byte status.tmod with
+ | (g1,c1,b1,b2),(g0,c0,b3,b4) ->
+ let status =
+ (if g0 then
+ if get_bit status.p3 2 then
+ if c0 then
+ if status.previous_p1_val && not $ get_bit status.p3 4 then
+ timer0 status b1 b2 ticks
+ else
+ status
+ else
+ timer0 status b1 b2 ticks
+ else
+ status
+ else
+ timer0 status b1 b2 ticks) in
+ (* Timer 1 follows. *)
+ let status =
+ (if g1 then
+ if get_bit status.p1 3 then
+ if c1 then
+ if status.previous_p3_val && not $ get_bit status.p3 5 then
+ timer1 status b3 b4 ticks
+ else
+ status
+ else
+ timer1 status b3 b4 ticks
+ else
+ status
+ else
+ timer1 status b3 b4 ticks) in
+ (* Timer 2 follows *)
+ let status =
+ (let (tf2,exf2,rclk,tclk),(exen2,tr2,ct2,cp2) = bits_of_byte status.t2con in
+ (* Timer2 is enabled *)
+ if tr2 then
+ (* Counter/interval mode *)
+ if ct2 && not cp2 then
+ let word = mk_word status.th2 status.tl2 in
+ let res,_,ov,_ = add16_with_c word (vect_of_int ticks `Sixteen) false in
+ if ov then
+ let new_th2 = status.rcap2h in
+ let new_tl2 = status.rcap2l in
+ (* Overflow flag not set if either of the following flags are set *)
+ if not rclk && not tclk then
+ let b = set_bit status.t2con 7 true in
+ { status with t2con = b;
+ th2 = new_th2;
+ tl2 = new_tl2 }
+ else
+ { status with th2 = new_th2;
+ tl2 = new_tl2 }
+ else
+ (* Reload also signalled when a 1-0 transition is detected *)
+ if status.previous_p1_val && not $ get_bit status.p1 1 then
+ (* In which case signal reload by setting T2CON.6 *)
+ let b = set_bit status.t2con 6 true in
+ { status with th2 = status.rcap2h;
+ tl2 = status.rcap2l;
+ t2con = b }
+ else
+ let new_th2, new_tl2 = from_word res in
+ { status with th2 = new_th2;
+ tl2 = new_tl2 }
+ (* Capture mode *)
+ else if cp2 && exen2 then
+ (* 1-0 transition detected *)
+ (* DPM: look at this: is the timer still running throughout? *)
+ if status.previous_p1_val && not $ get_bit status.p1 1 then
+ status (* Implement clock here *)
+ else
+ status (* Implement clock here *)
+ else
+ status
+ else
+ status) in status
+
+;;
+
+let serial_port_input status in_cont =
+ (* Serial port input *)
+ match in_cont with
+ Some (`In(time, line, epsilon, cont)) when get_bit status.scon 4 ->
+ (let status =
+ (match line with
+ `P1 b ->
+ if status.clock >= time then
+ { status with p1 = b; p1_latch = b; }
+ else
+ status
+ | `P3 b ->
+ if status.clock >= time then
+ { status with p3 = b; p3_latch = b; }
+ else
+ status
+ | `SerialBuff (`Eight b) ->
+ let sm0 = get_bit status.scon 7 in
+ let sm1 = get_bit status.scon 6 in
+ (match (sm0, sm1) with
+ (false, false) ->
+ (* Mode 0: shift register. No delay. *)
+ if status.clock >= time then
+ { status with scon = set_bit status.scon 0 true;
+ io = cont;
+ sbuf = b }
+ else
+ status
+ | (false, true) ->
+ (* Mode 1: 8-bit UART *)
+ (* Explanation: 8 bit asynchronous communication. There's a delay (epsilon)
+ which needs taking care of. If we're trying to communicate at the same time
+ an existing communication is occurring, we assert false (else clause of first
+ if). *)
+ if status.serial_epsilon_in = None && status.serial_v_in = None then
+ if status.clock >= time then
+ (* Waiting for nine bits, multiprocessor communication mode requires nine bits *)
+ if get_bit status.scon 5 then
+ assert false (* really: crash! *)
+ else
+ { status with serial_epsilon_in = Some (epsilon + time);
+ serial_v_in = Some (`Eight b) }
+ else
+ (* Warning about incomplete case analysis here, but safe as we've already tested for
+ None. *)
+ let e = extract status.serial_epsilon_in in
+ let v = extract status.serial_v_in in
+ if status.clock >= e then
+ match v with
+ `Eight v' ->
+ { status with sbuf = v';
+ serial_v_in = None;
+ serial_epsilon_in = None;
+ scon = set_bit status.scon 0 true;
+ io = cont }
+ | _ -> assert false (* trying to read in 9 bits instead of 8 *)
+ else
+ status
+ else
+ assert false
+ | (true, false) | (true, true) ->
+ assert false (* only got eight bits on the line when in 9 bit mode *))
+ | `SerialBuff (`Nine (b,b')) ->
+ let sm0 = get_bit status.scon 7 in
+ let sm1 = get_bit status.scon 6 in
+ match(sm0, sm1) with
+ (false, false) | (false, true) -> assert false
+ | (true, false) | (true, true) ->
+ (* Modes 2 and 3: 9-bit UART *)
+ (* Explanation: 9 bit asynchronous communication. There's a delay (epsilon)
+ which needs taking care of. If we're trying to communicate at the same time
+ an existing communication is occurring, we assert false (else claus of first
+ if). *)
+ if status.serial_epsilon_in = None && status.serial_v_in = None then
+ if status.clock >= time then
+ (* waiting for nine bits, multiprocessor communication mode requires nine bits *)
+ if get_bit status.scon 5 then
+ assert false (* really: crash! *)
+ else
+ { status with serial_epsilon_in = Some (epsilon + time);
+ serial_v_in = Some (`Nine (b, b')) }
+ else
+ (* Warning about incomplete case analysis here, but safe as we've already tested for
+ None. *)
+ let e = extract status.serial_epsilon_in in
+ let v = extract status.serial_v_in in
+ if status.clock >= e then
+ match v with
+ `Nine (v, v') ->
+ let scon' = set_bit status.scon 0 true in
+ { status with sbuf = v';
+ serial_v_in = None;
+ serial_epsilon_in = None;
+ scon = set_bit scon' 2 b;
+ io = cont }
+ | _ -> assert false (* trying to read in 8 bits instead of 9 *)
+ else
+ status
+ else
+ assert false)
+ in
+ { status with io = cont })
+ | _ -> status
+;;
+
+let serial_port_output status out_cont =
+ (* Serial port output *)
+ (let status = { status with serial_epsilon_out = Some (status.clock + status.io_epsilon);
+ serial_v_out = Some (`Eight status.sbuf);
+ serial_k_out = Some (snd (out_cont (status.clock + status.io_epsilon) (`SerialBuff (`Eight status.sbuf)))) } in
+ match status.serial_epsilon_out with
+ Some s ->
+ if status.clock >= s then
+ match status.serial_k_out with
+ None -> assert false (* correct? *)
+ | Some k' -> { status with io = k';
+ scon = set_bit status.scon 1 true; }
+ else
+ status
+ | _ -> assert false)
+;;
+
+let external_serial_interrupt status esi =
+ (* Interrupt enabled *)
+ if esi then
+ (* If we're already running, then fine (todo: check for *another* interrupt
+ and add to a queue, or something? *)
+ if status.t1i_running then
+ status
+ else
+ (* If we should be running, but aren't... *)
+ if false then
+ assert false
+ else
+ status
+ else
+ status
+;;
+
+let external0_interrupt status e0i =
+ (* Interrupt enabled *)
+ if e0i then
+ (* If we're already running, then fine (todo: check for *another* interrupt
+ and add to a queue, or something? *)
+ if status.t1i_running then
+ status
+ else
+ (* If we should be running, but aren't... *)
+ if false then
+ assert false
+ else
+ status
+ else
+ status
+;;
+
+let external1_interrupt status e1i =
+ (* Interrupt enabled *)
+ if e1i then
+ (* If we're already running, then fine (todo: check for *another* interrupt
+ and add to a queue, or something? *)
+ if status.t1i_running then
+ status
+ else
+ (* If we should be running, but aren't... *)
+ if false then
+ assert false
+ else
+ status
+ else
+ status
+;;
+
+let timer0_interrupt status t0i =
+ (* Interrupt enabled *)
+ if t0i then
+ (* If we're already running, then fine (todo: check for *another* interrupt
+ and add to a queue, or something? *)
+ if status.t1i_running then
+ status
+ else
+ (* If we should be running, but aren't... *)
+ if false then
+ assert false
+ else
+ status
+ else
+ status
+;;
+
+let timer1_interrupt status t1i =
+ (* Interrupt enabled *)
+ if t1i then
+ (* If we're already running, then fine (todo: check for *another* interrupt
+ and add to a queue, or something? *)
+ if status.t1i_running then
+ status
+ else
+ (* If we should be running, but aren't... *)
+ if false then
+ assert false
+ else
+ status
+ else
+ status
+;;
+
+let interrupts status =
+ let (ea,_,_,es), (et1,ex1,et0,ex0) = bits_of_byte status.ie in
+ let (_,_,_,ps), (pt1,px1,pt0,px0) = bits_of_byte status.ip in
+ (* DPM: are interrupts enabled? *)
+ if ea then
+ match (ps,pt1,px1,pt0,px0) with
+ _ -> assert false
+ else
+ status
+;;
+
+let execute1 status =
+ let instr,pc,ticks = fetch status.code_memory status.pc in
+ let status = { status with clock = status.clock + ticks; pc = pc } in
+ let status =
+ (match instr with
+ `ADD (`A,d1) ->
+ let v,c,ac,ov =
+ add8_with_c (get_arg_8 status false `A) (get_arg_8 status false d1) false
+ in
+ set_flags (set_arg_8 status v `A) c (Some ac) ov
+ | `ADDC (`A,d1) ->
+ let v,c,ac,ov =
+ add8_with_c (get_arg_8 status false `A) (get_arg_8 status false d1) (get_cy_flag status)
+ in
+ set_flags (set_arg_8 status v `A) c (Some ac) ov
+ | `SUBB (`A,d1) ->
+ let v,c,ac,ov =
+ subb8_with_c (get_arg_8 status false `A) (get_arg_8 status false d1) (get_cy_flag status)
+ in
+ set_flags (set_arg_8 status v `A) c (Some ac) ov
+ | `INC `DPTR ->
+ let cry, low_order_byte = half_add status.dpl (vect_of_int 1 `Eight) in
+ let cry, high_order_byte = full_add status.dph (vect_of_int 0 `Eight) cry in
+ { status with dpl = low_order_byte; dph = high_order_byte }
+ | `INC ((`A | `REG _ | `DIRECT _ | `INDIRECT _) as d) ->
+ let b = get_arg_8 status true d in
+ let cry, res = half_add b (vect_of_int 1 `Eight) in
+ set_arg_8 status res d
+ | `DEC d ->
+ let b = get_arg_8 status true d in
+ let res,c,ac,ov = subb8_with_c b (vect_of_int 1 `Eight) false in
+ set_arg_8 status res d
+ | `MUL (`A,`B) ->
+ let acc = int_of_vect status.acc in
+ let b = int_of_vect status.b in
+ let prod = acc * b in
+ let ov = prod > 255 in
+ let l = vect_of_int (prod mod 256) `Eight in
+ let h = vect_of_int (prod / 256) `Eight in
+ let status = { status with acc = l ; b = h } in
+ (* DPM: Carry flag is always cleared. *)
+ set_flags status false None ov
+ | `DIV (`A,`B) ->
+ let acc = int_of_vect status.acc in
+ let b = int_of_vect status.b in
+ if b = 0 then
+ (* CSC: ACC and B undefined! We leave them as they are. *)
+ set_flags status false None true
+ else
+ let q = vect_of_int (acc / b) `Eight in
+ let r = vect_of_int (acc mod b) `Eight in
+ let status = { status with acc = q ; b = r } in
+ set_flags status false None false
+ | `DA `A ->
+ let acc_upper_nibble, acc_lower_nibble = from_byte status.acc in
+ if int_of_vect acc_lower_nibble > 9 or get_ac_flag status = true then
+ let acc,cy,_,_ = add8_with_c status.acc (vect_of_int 6 `Eight) false in
+ let acc_upper_nibble, acc_lower_nibble = from_byte acc in
+ if int_of_vect acc_upper_nibble > 9 or cy = true then
+ let cry,acc_upper_nibble = half_add acc_upper_nibble (vect_of_int 6 `Four) in
+ let status = { status with acc = mk_byte acc_upper_nibble acc_lower_nibble } in
+ set_flags status cry (Some (get_ac_flag status)) (get_ov_flag status)
+ else
+ status
+ else
+ status
+ | `ANL (`U1(`A, ag)) ->
+ let and_val = get_arg_8 status true `A -&- get_arg_8 status true ag in
+ set_arg_8 status and_val `A
+ | `ANL (`U2((`DIRECT d), ag)) ->
+ let and_val = get_arg_8 status true (`DIRECT d) -&- get_arg_8 status true ag in
+ set_arg_8 status and_val (`DIRECT d)
+ | `ANL (`U3 (`C, b)) ->
+ let and_val = get_cy_flag status && get_arg_1 status true b in
+ set_flags status and_val None (get_ov_flag status)
+ | `ORL (`U1(`A, ag)) ->
+ let or_val = get_arg_8 status true `A -|- get_arg_8 status true ag in
+ set_arg_8 status or_val `A
+ | `ORL (`U2((`DIRECT d), ag)) ->
+ let or_val = get_arg_8 status true (`DIRECT d) -|- get_arg_8 status true ag in
+ set_arg_8 status or_val (`DIRECT d)
+ | `ORL (`U3 (`C, b)) ->
+ let or_val = get_cy_flag status || get_arg_1 status true b in
+ set_flags status or_val None (get_ov_flag status)
+ | `XRL (`U1(`A, ag)) ->
+ let xor_val = get_arg_8 status true `A -^- get_arg_8 status true ag in
+ set_arg_8 status xor_val `A
+ | `XRL (`U2((`DIRECT d), ag)) ->
+ let xor_val = get_arg_8 status true (`DIRECT d) -^- get_arg_8 status true ag in
+ set_arg_8 status xor_val (`DIRECT d)
+ | `CLR `A -> set_arg_8 status (zero `Eight) `A
+ | `CLR `C -> set_arg_1 status false `C
+ | `CLR ((`BIT _) as a) -> set_arg_1 status false a
+ | `CPL `A -> { status with acc = complement status.acc }
+ | `CPL `C -> set_arg_1 status (not $ get_arg_1 status true `C) `C
+ | `CPL ((`BIT _) as b) -> set_arg_1 status (not $ get_arg_1 status true b) b
+ | `RL `A -> { status with acc = rotate_left status.acc }
+ | `RLC `A ->
+ let old_cy = get_cy_flag status in
+ let n1, n2 = from_byte status.acc in
+ let (b1,b2,b3,b4),(b5,b6,b7,b8) = from_nibble n1, from_nibble n2 in
+ let status = set_arg_1 status b1 `C in
+ { status with acc = mk_byte (mk_nibble b2 b3 b4 b5) (mk_nibble b6 b7 b8 old_cy) }
+ | `RR `A -> { status with acc = rotate_right status.acc }
+ | `RRC `A ->
+ let old_cy = get_cy_flag status in
+ let n1, n2 = from_byte status.acc in
+ let (b1,b2,b3,b4),(b5,b6,b7,b8) = from_nibble n1, from_nibble n2 in
+ let status = set_arg_1 status b8 `C in
+ { status with acc = mk_byte (mk_nibble old_cy b1 b2 b3) (mk_nibble b4 b5 b6 b7) }
+ | `SWAP `A ->
+ let (acc_nibble_upper, acc_nibble_lower) = from_byte status.acc in
+ { status with acc = mk_byte acc_nibble_lower acc_nibble_upper }
+ | `MOV(`U1(b1, b2)) -> set_arg_8 status (get_arg_8 status false b2) b1
+ | `MOV(`U2(b1, b2)) -> set_arg_8 status (get_arg_8 status false b2) b1
+ | `MOV(`U3(b1, b2)) -> set_arg_8 status (get_arg_8 status false b2) b1
+ | `MOV(`U4(b1,b2)) -> set_arg_16 status (get_arg_16 status b2) b1
+ | `MOV(`U5(b1,b2)) -> set_arg_1 status (get_arg_1 status false b2) b1
+ | `MOV(`U6(b1,b2)) -> set_arg_1 status (get_arg_1 status false b2) b1
+ | `MOVC (`A, `A_DPTR) ->
+ let big_acc = mk_word (zero `Eight) status.acc in
+ let dptr = mk_word status.dph status.dpl in
+ let cry, addr = half_add dptr big_acc in
+ let lookup = Physical.WordMap.find addr status.code_memory in
+ { status with acc = lookup }
+ | `MOVC (`A, `A_PC) ->
+ let big_acc = mk_word (zero `Eight) status.acc in
+ (* DPM: Under specified: does the carry from PC incrementation affect the *)
+ (* addition of the PC with the DPTR? At the moment, no. *)
+ let cry,inc_pc = half_add status.pc (vect_of_int 1 `Sixteen) in
+ let status = { status with pc = inc_pc } in
+ let cry,addr = half_add inc_pc big_acc in
+ let lookup = Physical.WordMap.find addr status.code_memory in
+ { status with acc = lookup }
+ (* data transfer *)
+ (* DPM: MOVX currently only implements the *copying* of data! *)
+ | `MOVX (`U1 (a1, a2)) -> set_arg_8 status (get_arg_8 status false a2) a1
+ | `MOVX (`U2 (a1, a2)) -> set_arg_8 status (get_arg_8 status false a2) a1
+ | `SETB b -> set_arg_1 status true b
+ | `PUSH a ->
+ (* DPM: What happens if we overflow? *)
+ let cry,new_sp = half_add status.sp (vect_of_int 1 `Eight) in
+ let status = { status with sp = new_sp } in
+ write_at_sp status (get_arg_8 status false a)
+ | `POP (`DIRECT b) ->
+ let contents = read_at_sp status in
+ let new_sp,_,_,_ = subb8_with_c status.sp (vect_of_int 1 `Eight) false in
+ let status = { status with sp = new_sp } in
+ let status = set_arg_8 status contents (`DIRECT b) in
+ status
+ | `XCH(`A, arg) ->
+ let old_arg = get_arg_8 status false arg in
+ let old_acc = status.acc in
+ let status = set_arg_8 status old_acc arg in
+ { status with acc = old_arg }
+ | `XCHD(`A, i) ->
+ let acc_upper_nibble, acc_lower_nibble = from_byte $ get_arg_8 status false `A in
+ let ind_upper_nibble, ind_lower_nibble = from_byte $ get_arg_8 status false i in
+ let new_acc = mk_byte acc_upper_nibble ind_lower_nibble in
+ let new_reg = mk_byte ind_upper_nibble acc_lower_nibble in
+ let status = { status with acc = new_acc } in
+ set_arg_8 status new_reg i
+ (* program branching *)
+ | `JC (`REL rel) ->
+ if get_cy_flag status then
+ let cry, new_pc = half_add status.pc (sign_extension rel) in
+ { status with pc = new_pc }
+ else
+ status
+ | `JNC (`REL rel) ->
+ if not $ get_cy_flag status then
+ let cry, new_pc = half_add status.pc (sign_extension rel) in
+ { status with pc = new_pc }
+ else
+ status
+ | `JB (b, (`REL rel)) ->
+ if get_arg_1 status false b then
+ let cry, new_pc = half_add status.pc (sign_extension rel) in
+ { status with pc = new_pc }
+ else
+ status
+ | `JNB (b, (`REL rel)) ->
+ if not $ get_arg_1 status false b then
+ let cry, new_pc = half_add status.pc (sign_extension rel) in
+ { status with pc = new_pc }
+ else
+ status
+ | `JBC (b, (`REL rel)) ->
+ let status = set_arg_1 status false b in
+ if get_arg_1 status false b then
+ let cry, new_pc = half_add status.pc (sign_extension rel) in
+ { status with pc = new_pc }
+ else
+ status
+ | `RET ->
+ (* DPM: What happens when we underflow? *)
+ let high_bits = read_at_sp status in
+ let new_sp,cy,_,_ = subb8_with_c status.sp (vect_of_int 1 `Eight) false in
+ let status = { status with sp = new_sp } in
+ let low_bits = read_at_sp status in
+ let new_sp,_,_,_ = subb8_with_c status.sp (vect_of_int 1 `Eight) cy in
+ let status = { status with sp = new_sp } in
+ { status with pc = mk_word high_bits low_bits }
+ | `RETI ->
+ let high_bits = read_at_sp status in
+ let new_sp,_,_,_ = subb8_with_c status.sp (vect_of_int 1 `Eight) false in
+ let status = { status with sp = new_sp } in
+ let low_bits = read_at_sp status in
+ let new_sp,_,_,_ = subb8_with_c status.sp (vect_of_int 1 `Eight) false in
+ let status = { status with sp = new_sp } in
+ { status with pc = mk_word high_bits low_bits }
+ | `ACALL (`ADDR11 a) ->
+ let cry, new_sp = half_add status.sp (vect_of_int 1 `Eight) in
+ let status = { status with sp = new_sp } in
+ let pc_upper_byte, pc_lower_byte = from_word status.pc in
+ let status = write_at_sp status pc_lower_byte in
+ let cry, new_sp = half_add status.sp (vect_of_int 1 `Eight) in
+ let status = { status with sp = new_sp } in
+ let status = write_at_sp status pc_upper_byte in
+ let addr = addr16_of_addr11 status.pc a in
+ { status with pc = addr }
+ | `LCALL (`ADDR16 addr) ->
+ let cry, new_sp = half_add status.sp (vect_of_int 1 `Eight) in
+ let status = { status with sp = new_sp } in
+ let pc_upper_byte, pc_lower_byte = from_word status.pc in
+ let status = write_at_sp status pc_lower_byte in
+ let cry, new_sp = half_add status.sp (vect_of_int 1 `Eight) in
+ let status = { status with sp = new_sp } in
+ let status = write_at_sp status pc_upper_byte in
+ { status with pc = addr }
+ | `AJMP (`ADDR11 a) ->
+ let addr = addr16_of_addr11 status.pc a in
+ { status with pc = addr }
+ | `LJMP (`ADDR16 a) ->
+ { status with pc = a }
+ | `SJMP (`REL rel) ->
+ let cry, new_pc = half_add status.pc (sign_extension rel) in
+ { status with pc = new_pc }
+ | `JMP `IND_DPTR ->
+ let dptr = mk_word status.dph status.dpl in
+ let big_acc = mk_word (zero `Eight) status.acc in
+ let cry, jmp_addr = half_add big_acc dptr in
+ let cry, new_pc = half_add status.pc jmp_addr in
+ { status with pc = new_pc }
+ | `JZ (`REL rel) ->
+ if status.acc = zero `Eight then
+ let cry, new_pc = half_add status.pc (sign_extension rel) in
+ { status with pc = new_pc }
+ else
+ status
+ | `JNZ (`REL rel) ->
+ if status.acc <> zero `Eight then
+ let cry, new_pc = half_add status.pc (sign_extension rel) in
+ { status with pc = new_pc }
+ else
+ status
+ | `CJNE ((`U1 (`A, ag)), `REL rel) ->
+ let new_carry = status.acc < get_arg_8 status false ag in
+ if get_arg_8 status false ag <> status.acc then
+ let cry, new_pc = half_add status.pc (sign_extension rel) in
+ let status = set_flags status new_carry None (get_ov_flag status) in
+ { status with pc = new_pc; }
+ else
+ set_flags status new_carry None (get_ov_flag status)
+ | `CJNE ((`U2 (ag, `DATA d)), `REL rel) ->
+ let new_carry = get_arg_8 status false ag < d in
+ if get_arg_8 status false ag <> d then
+ let cry, new_pc = half_add status.pc (sign_extension rel) in
+ let status = { status with pc = new_pc } in
+ set_flags status new_carry None (get_ov_flag status)
+ else
+ set_flags status new_carry None (get_ov_flag status)
+ | `DJNZ (ag, (`REL rel)) ->
+ let new_ag,_,_,_ = subb8_with_c (get_arg_8 status true ag) (vect_of_int 1 `Eight) false in
+ let status = set_arg_8 status new_ag ag in
+ if new_ag <> zero `Eight then
+ let cry, new_pc = half_add status.pc (sign_extension rel) in
+ { status with pc = new_pc }
+ else
+ status
+ | `NOP -> status) in
+ let status = timers status ticks in
+ let in_cont, `Out out_cont = status.io in
+ let status = serial_port_input status in_cont in
+ let status = serial_port_output status out_cont in
+ let status = interrupts status in
+ { status with previous_p1_val = get_bit status.p3 4;
+ previous_p3_val = get_bit status.p3 5 }
+;;
+
+(*
+OLD output routine:
+ (* Serial port output, part one *)
+ let status =
+ (match status.expected_out_time with
+ `At t when status.clock >= t ->
+ { status with scon = set_bit status.scon 1 true; expected_out_time = `None }
+ | _ -> status) in
+
+ (if status.expected_out_time = `Now then
+ if get_bit status.scon 7 then
+ let exp_time, new_cont = out_cont status.clock (`SerialBuff (`Nine ((get_bit status.scon 3), status.sbuf))) in
+ { status with expected_out_time = `At exp_time; io = new_cont }
+ else
+ let exp_time, new_cont = out_cont status.clock (`SerialBuff (`Eight status.sbuf)) in
+ { status with expected_out_time = `At exp_time; io = new_cont }
+ else
+ status) in
+*)
+
+let rec execute f s =
+ let cont =
+ try f s; true
+ with Halt -> false
+ in
+ if cont then execute f (execute1 s)
+ else s
+;;
+
+
+let load_program p =
+ let st = load p.ASM.code initialize in
+ { st with exit_addr = p.ASM.exit_addr ; cost_labels = p.ASM.cost_labels }
+
+let observe_trace trace_ref st =
+ let cost_label =
+ if BitVectors.WordMap.mem st.pc st.cost_labels then
+ [BitVectors.WordMap.find st.pc st.cost_labels]
+ else [] in
+ trace_ref := cost_label @ !trace_ref ;
+ if st.pc = st.exit_addr (* <=> end of program *) then raise Halt else st
+
+let result st =
+ let dpl = st.dpl in
+ let dpr = st.dph in
+ let addr i = BitVectors.vect_of_int i `Seven in
+ let get_ireg i = Physical.Byte7Map.find (addr i) st.low_internal_ram in
+ let r00 = get_ireg 0 in
+ let r01 = get_ireg 1 in
+ let is = [dpl ; dpr ; r00 ; r01] in
+ let f i = IntValue.Int32.of_int (BitVectors.int_of_vect i) in
+ IntValue.Int32.merge (List.map f is)
+
+let interpret debug p =
+ Printf.printf "*** 8051 interpret ***\n%!" ;
+ if p.ASM.has_main then
+ let st = load_program p in
+ let trace = ref [] in
+ let callback = observe_trace trace in
+ let st = execute callback st in
+ let res = result st in
+ if debug then
+ Printf.printf "Result = %s\n%!" (IntValue.Int32.to_string res) ;
+ (res, List.rev !trace)
+ else (IntValue.Int32.zero, [])
+
+
+let size_of_instr instr =
+ let exit_lbl = "exit" in
+ let p = { ASM.ppreamble = [] ; ASM.pexit_label = exit_lbl ;
+ ASM.pcode = [instr ; `Label exit_lbl] ; ASM.phas_main = false } in
+ let p = assembly p in
+ let status = load_program p in
+ let addr_zero = BitVectors.vect_of_int 0 `Sixteen in
+ let (_, size, _) = fetch status.code_memory addr_zero in
+ BitVectors.int_of_vect size
+
+let size_of_instrs instrs =
+ let f res instr = res + (size_of_instr instr) in
+ List.fold_left f 0 instrs
--- /dev/null
+open BitVectors;;
+open Physical;;
+
+exception CodeTooLarge
+
+type time = int;;
+type line = [ `P1 of byte
+ | `P3 of byte
+ | `SerialBuff of [ `Eight of byte
+ | `Nine of BitVectors.bit * byte
+ ]
+ ];;
+
+val string_of_line: line -> string;;
+
+type epsilon = int;;
+
+(* In: reception time, line of input, new continuation,
+ Out: transmission time, output line, expected duration until reply,
+ new continuation.
+*)
+type continuation =
+ [`In of time * line * epsilon * continuation] option *
+ [`Out of (time -> line -> time * continuation) ];;
+
+type status =
+ {
+ (* Memory *)
+ code_memory: WordMap.map; (* can be reduced *)
+ low_internal_ram: Byte7Map.map;
+ high_internal_ram: Byte7Map.map;
+ external_ram: WordMap.map;
+
+ (* Program counter *)
+ pc: word;
+
+ (* SFRs *)
+ sp: byte;
+ dpl: byte;
+ dph: byte;
+ pcon: byte;
+ tcon: byte;
+ tmod: byte;
+ tl0: byte;
+ tl1: byte;
+ th0: byte;
+ th1: byte;
+ p1: byte;
+ scon: byte;
+ sbuf: byte;
+ ie: byte;
+ p3: byte;
+ ip: byte;
+ psw: byte;
+ acc: byte;
+ b: byte;
+ t2con: byte; (* 8052 only *)
+ rcap2l: byte; (* 8052 only *)
+ rcap2h: byte; (* 8052 only *)
+ tl2: byte; (* 8052 only *)
+ th2: byte; (* 8052 only *)
+
+ (* Latches for the output lines *)
+ p1_latch: byte;
+ p3_latch: byte;
+
+ (* Fields for tracking the state of the processor. *)
+
+ (* IO specific *)
+ previous_p1_val: bool;
+ previous_p3_val: bool;
+
+ serial_epsilon_out: epsilon option;
+ serial_epsilon_in: epsilon option;
+
+ io_epsilon: epsilon;
+
+ serial_v_in: [`Eight of byte | `Nine of (BitVectors.bit * byte) ] option;
+ serial_v_out: [`Eight of byte | `Nine of (BitVectors.bit * byte) ] option;
+
+ serial_k_out: continuation option;
+
+ io: continuation;
+ expected_out_time: [ `None | `Now | `At of time ];
+
+ (* Timer and clock specific *)
+ clock: time;
+ timer0: word;
+ timer1: word;
+ timer2: word; (* can be missing *)
+
+ esi_running: bool;
+ t0i_running: bool;
+ t1i_running: bool;
+ e0i_running: bool;
+ e1i_running: bool;
+ es_running: bool;
+
+ exit_addr : BitVectors.word;
+ cost_labels : string BitVectors.WordMap.t
+ }
+
+val string_of_status: status -> string
+
+
+val assembly:
+ [< ASM.labelled_instruction] ASM.pretty_program -> ASM.program
+
+(*
+ val link:
+ (ASM.instruction list * symbol_table * cost_map) list -> BitVectors.byte list
+*)
+
+val initialize: status
+
+val load_code_memory: BitVectors.byte list -> Physical.WordMap.map
+val load_mem: Physical.WordMap.map -> status -> status
+val load: BitVectors.byte list -> status -> status
+
+exception Halt (* to be raised to stop execution *)
+
+(* the callback function is used to observe the execution
+ trace; it can raise Hold to stop execution. Otherwise
+ the processor never halts. *)
+val execute: (status -> unit) -> status -> status
+
+val fetch: Physical.WordMap.map -> word -> ASM.instruction * word * int
+
+val load_program : ASM.program -> status
+val interpret : bool -> ASM.program -> AST.trace
+
+val size_of_instrs : ASM.labelled_instruction list -> int
--- /dev/null
+
+(** This module provides a function to print [ASM] programs. *)
+
+let print_program p =
+ let code_memory = ASMInterpret.load_code_memory p.ASM.code in
+ let intel_hex = IntelHex.pack_exported_code_memory 16 65535 code_memory in
+ IntelHex.string_of_intel_hex_format intel_hex
--- /dev/null
+
+(** This module provides a function to print [ASM] programs. *)
+
+val print_program : ASM.program -> string
--- /dev/null
+open Util;;
+
+type bit = bool
+type 'a vect = bit list
+type nibble = [`Four] vect
+type byte7 = [`Seven] vect
+type byte = [`Eight] vect
+type word = [`Sixteen] vect
+type word11 = [`Eleven] vect
+
+type sizes = [ `Four | `Seven | `Eight | `Eleven | `Sixteen ]
+
+let mk_nibble b1 b2 b3 b4 = [b1; b2; b3; b4]
+let from_nibble =
+ function
+ [b1; b2; b3; b4] -> b1,b2,b3,b4
+ | _ -> assert false
+let mk_byte n1 n2 = n1 @ n2
+let mk_byte_from_bits ((b1,b2,b3,b4),(b5,b6,b7,b8)) = ([b1;b2;b3;b4;b5;b6;b7;b8] : [`Eight] vect)
+let from_byte =
+ function
+ b1::b2::b3::b4::r -> [b1;b2;b3;b4],r
+ | _ -> assert false
+let bits_of_byte =
+ function
+ [b1;b2;b3;b4;b5;b6;b7;b8] -> (b1,b2,b3,b4),(b5,b6,b7,b8)
+ | _ -> assert false
+let mk_byte7 b1 b2 b3 n1 = b1::b2::b3::n1
+let from_byte7 =
+ function
+ b1::b2::b3::r -> b1,b2,b3,r
+ | _ -> assert false
+let mk_word = mk_byte
+let from_word =
+ function
+ b1::b2::b3::b4::b5::b6::b7::b8::r -> [b1;b2;b3;b4;b5;b6;b7;b8],r
+ | _ -> assert false
+let mk_word11 = mk_byte7
+let from_word11 = from_byte7
+
+let get_bit l index =
+ try
+ List.nth (List.rev l) index
+ with (Failure _ | Invalid_argument _) -> assert false
+
+let set_bit l index new_val =
+ try
+ let rec aux index l =
+ match index, l with
+ _, [] -> raise (Invalid_argument "")
+ | 0,_::tl -> new_val::tl
+ | n,hd::tl -> hd::(aux (n-1) tl) in
+ List.rev (aux index (List.rev l))
+ with Invalid_argument "" -> assert false
+
+let (-&-) l1 l2 = List.map2 (fun b1 b2 -> b1 & b2) l1 l2
+let (-|-) l1 l2 = List.map2 (fun b1 b2 -> b1 || b2) l1 l2
+let xor b1 b2 = b1 <> b2
+let (-^-) l1 l2 = List.map2 xor l1 l2
+let complement l1 = List.map (not) l1
+
+let iter_bits f v = String.concat "" (List.map f v)
+let map_bits = List.map
+let map2_bits = List.map2
+
+let string_of_bit = function false -> "0" | true -> "1"
+let string_of_vect l = String.concat "" (List.map string_of_bit l)
+
+let full_add l r c = List.fold_right2 (fun b1 b2 (c,r) -> b1 & b2 || c & (b1 || b2),xor (xor b1 b2) c::r) l r (c,[])
+let half_add l r = full_add l r false
+
+let sign_extension =
+ function
+ [] -> assert false
+ | (he::_) as l ->
+ [he;he;he;he;he;he;he;he] @ l
+;;
+
+
+let rec split_last =
+ function
+ [] -> assert false
+ | [he] -> he,[]
+ | he::tl ->
+ let l,res = split_last tl in
+ l,he::res
+
+let shift_left =
+ function
+ [] -> assert false
+ | _::tl -> tl @ [false]
+let shift_right l = false :: snd (split_last l)
+let rotate_left =
+ function
+ [] -> assert false
+ | he::tl -> tl @ [he]
+let rotate_right l =
+ let he,tl = split_last l in
+ he::tl
+
+(* CSC: can overflow!!! *)
+let int_of_vect v =
+ let rec aux pow v =
+ match v with
+ [] -> 0
+ | hd::tl ->
+ if hd = true then
+ pow + (aux (pow * 2) tl)
+ else
+ aux (pow * 2) tl
+ in
+ aux 1 (List.rev v)
+
+let size_lookup =
+ function
+ `Four -> 4
+ | `Seven -> 7
+ | `Eight -> 8
+ | `Eleven -> 11
+ | `Sixteen -> 16
+
+let rec pow v p =
+ if p = 0 then
+ 1
+ else
+ v * (pow v (p - 1))
+
+let divide_with_remainder x y = (x / y, x mod y)
+
+let rec aux i =
+ if i < 0 then
+ raise (Invalid_argument "Negative index")
+ else
+ let (d, r) = divide_with_remainder i 2 in
+ if (d, r) = (0, 0) then
+ []
+ else if r = 0 then
+ false :: aux d
+ else
+ true :: aux d
+
+let rec pad i l = if i = 0 then l else false :: (pad (i - 1) l)
+
+let vect_of_int i size =
+ let big_list = List.rev (aux i) in
+ if List.length big_list > size_lookup size then
+ raise (Invalid_argument "BitVectors.vect_of_int: size not big enough")
+ else
+ let diff = size_lookup size - List.length big_list in
+ pad diff big_list
+
+let zero size = pad (size_lookup size) []
+
+(* CSC: can overflow!!! *)
+(* CSC: only works properly with bytes!!! *)
+let hex_string_of_vect v = Printf.sprintf "%0 2X" (int_of_vect v);;
+
+module WordMap =
+ Map.Make (struct type t = word let compare = compare end);;
--- /dev/null
+type bit = bool
+
+type 'a vect
+
+type nibble = [`Four] vect
+type byte7 = [`Seven] vect
+type byte = [`Eight] vect
+type word = [`Sixteen] vect
+type word11 = [`Eleven] vect
+
+type sizes = [ `Four | `Seven | `Eight | `Eleven | `Sixteen ]
+
+val mk_nibble: bit -> bit -> bit -> bit -> nibble
+val from_nibble: nibble -> bit * bit * bit * bit
+val mk_byte7: bit -> bit -> bit -> nibble -> byte7
+val from_byte7: byte7 -> bit * bit * bit * nibble
+val mk_byte: nibble -> nibble -> byte
+val mk_byte_from_bits: ((bit * bit * bit * bit) * (bit * bit * bit * bit)) -> byte
+val from_byte: byte -> nibble * nibble
+val bits_of_byte: byte -> ((bit * bit * bit * bit) * (bit * bit * bit * bit))
+val mk_word: byte -> byte -> word
+val from_word: word -> byte * byte
+val mk_word11: bit -> bit -> bit -> byte -> word11
+val from_word11: word11 -> bit * bit * bit * byte
+
+val get_bit: 'a vect -> int -> bit
+val set_bit: 'a vect -> int -> bit -> 'a vect
+
+val int_of_vect: 'a vect -> int
+val vect_of_int: int -> ([< sizes] as 'a) -> 'a vect
+val string_of_bit: bit -> string
+val string_of_vect: 'a vect -> string
+val hex_string_of_vect: 'a vect -> string
+
+val (-&-): 'a vect -> 'a vect -> 'a vect
+val (-|-): 'a vect -> 'a vect -> 'a vect
+val (-^-): 'a vect -> 'a vect -> 'a vect
+val complement: 'a vect -> 'a vect
+
+val iter_bits: (bit -> string) -> 'a vect -> string
+val map_bits: (bit -> bit) -> 'a vect -> 'a vect
+val map2_bits: (bit -> bit -> bit) -> 'a vect -> 'a vect -> 'a vect
+
+val string_of_vect: 'a vect -> string
+
+val zero: [< `Four | `Seven | `Eight | `Eleven | `Sixteen ] -> [< `Four | `Seven | `Eight | `Eleven | `Sixteen ] vect
+
+val half_add: 'a vect -> 'a vect -> bit * 'a vect
+val full_add: 'a vect -> 'a vect -> bit -> bit * 'a vect
+val sign_extension: byte -> word
+
+val rotate_left : 'a vect -> 'a vect
+val rotate_right : 'a vect -> 'a vect
+val shift_right : 'a vect -> 'a vect
+val shift_left : 'a vect -> 'a vect
+
+module WordMap: Map.S with type key = word
--- /dev/null
+
+let int_size = 1
+let ptr_size = 2
+let alignment = None
+
+type opaccs =
+ | Mul
+ | DivuModu
+
+type op1 =
+ | Cmpl
+ | Inc
+
+type op2 =
+ | Add
+ | Addc
+ | Sub
+ | And
+ | Or
+ | Xor
+
+let print_opaccs = function
+ | Mul -> "mul"
+ | DivuModu -> "divu"
+
+let print_op1 = function
+ | Cmpl -> "cmpl"
+ | Inc -> "inc"
+
+let print_op2 = function
+ | Add -> "add"
+ | Addc -> "addc"
+ | Sub -> "sub"
+ | And -> "and"
+ | Or -> "or"
+ | Xor -> "xor"
+
+
+module Eval (Val : Value.S) = struct
+
+ let eval_int_mul size i1 i2 =
+ let module Int = IntValue.Make (struct let size = 2 * size end) in
+ match Int.break (Int.mul i1 i2) 2 with
+ | res1 :: res2 :: _ -> (Val.of_int_repr res1, Val.of_int_repr res2)
+ | _ -> assert false (* should be impossible *)
+
+ let eval_mul v1 v2 =
+ if Val.is_int v1 && Val.is_int v2 then
+ eval_int_mul Val.int_size (Val.to_int_repr v1) (Val.to_int_repr v2)
+ else (Val.undef, Val.undef)
+
+ let opaccs op v1 v2 = match op with
+ | Mul -> eval_mul v1 v2
+ | DivuModu -> (Val.divu v1 v2, Val.modulou v1 v2)
+
+ let op1 = function
+ | Cmpl -> Val.cmpl
+ | Inc -> Val.succ
+
+ let op2 carry op2 v1 v2 = match op2 with
+ | Add -> Val.add_and_of v1 v2
+ | Addc ->
+ let (res1, of1) = Val.add_and_of v1 v2 in
+ let (res2, of2) = Val.add_and_of res1 carry in
+ (res2, Val.or_op of1 of2)
+ | Sub ->
+ let (res1, uf1) = Val.sub_and_uf v1 v2 in
+ let (res2, uf2) = Val.sub_and_uf res1 carry in
+ (res2, Val.or_op uf1 uf2)
+ | And -> (Val.and_op v1 v2, carry)
+ | Or -> (Val.or_op v1 v2, carry)
+ | Xor -> (Val.xor v1 v2, carry)
+
+end
+
+
+type register = int
+let compare_reg = Pervasives.compare
+let eq_reg r1 r2 = r1 = r2
+
+module OrdReg = struct type t = register let compare = compare_reg end
+module RegisterSet = Set.Make (OrdReg)
+module RegisterMap = Map.Make (OrdReg)
+
+let r00 = 0
+let r01 = 1
+let r02 = 2
+let r03 = 3
+let r04 = 4
+let r05 = 5
+let r06 = 6
+let r07 = 7
+let r10 = 8
+let r11 = 9
+let r12 = 10
+let r13 = 11
+let r14 = 12
+let r15 = 13
+let r16 = 14
+let r17 = 15
+let r20 = 16
+let r21 = 17
+let r22 = 18
+let r23 = 19
+let r24 = 20
+let r25 = 21
+let r26 = 22
+let r27 = 23
+let r30 = 24
+let r31 = 25
+let r32 = 26
+let r33 = 27
+let r34 = 28
+let r35 = 29
+let r36 = 30
+let r37 = 31
+let a = 224
+let b = 240
+let dpl = 130
+let dph = 131
+let carry = -1 (* only used for the liveness analysis. *)
+
+let print_register = function
+ | 0 -> "R00"
+ | 1 -> "R01"
+ | 2 -> "R02"
+ | 3 -> "R03"
+ | 4 -> "R04"
+ | 5 -> "R05"
+ | 6 -> "R06"
+ | 7 -> "R07"
+ | 8 -> "R10"
+ | 9 -> "R11"
+ | 10 -> "R12"
+ | 11 -> "R13"
+ | 12 -> "R14"
+ | 13 -> "R15"
+ | 14 -> "R16"
+ | 15 -> "R17"
+ | 16 -> "R20"
+ | 17 -> "R21"
+ | 18 -> "R22"
+ | 19 -> "R23"
+ | 20 -> "R24"
+ | 21 -> "R25"
+ | 22 -> "R26"
+ | 23 -> "R27"
+ | 24 -> "R30"
+ | 25 -> "R31"
+ | 26 -> "R32"
+ | 27 -> "R33"
+ | 28 -> "R34"
+ | 29 -> "R35"
+ | 30 -> "R36"
+ | 31 -> "R37"
+ | 224 -> "A"
+ | 240 -> "B"
+ | 130 -> "DPL"
+ | 131 -> "DPH"
+ | _ -> assert false (* impossible *)
+
+let sst = r10
+let st0 = r02
+let st1 = r03
+let st2 = r04
+let st3 = r05
+let sts = [st0 ; st1 ; st2 ; st3]
+let spl = r06
+let sph = r07
+let rets = [dpl ; dph ; r00 ; r01]
+
+let spl_addr = spl
+let spl_init = 255
+let sph_addr = sph
+let sph_init = 255
+let isp_addr = 129
+let isp_init = 47
+
+let set_of_list rl = List.fold_right RegisterSet.add rl RegisterSet.empty
+let list_of_set rs = RegisterSet.fold (fun r l -> r :: l) rs []
+
+let registers =
+ set_of_list [r00 ; r01 ; r02 ; r03 ; r04 ; r05 ; r06 ; r07 ;
+ r10 ; r11 ; r12 ; r13 ; r14 ; r15 ; r16 ; r17 ;
+ r20 ; r21 ; r22 ; r23 ; r24 ; r25 ; r26 ; r27 ;
+ r30 ; r31 ; r32 ; r33 ; r34 ; r35 ; r36 ; r37 ;
+ a ; b ; dpl ; dph ; spl ; sph ; st0 ; st1 ; sst]
+
+let forbidden =
+ set_of_list
+ [a ; b ; dpl ; dph ; spl ; sph ; st0 ; st1 ; st2 ; st3 ; sst]
+
+let parameters =
+ let params = set_of_list [r30 ; r31 ; r32 ; r33 ; r34 ; r35 ; r36 ; r37] in
+ list_of_set (RegisterSet.diff params forbidden)
+
+let callee_saved =
+ RegisterSet.diff (set_of_list [r20 ; r21 ; r22 ; r23 ; r24 ; r25 ; r26 ; r27])
+ forbidden
+let caller_saved =
+ RegisterSet.diff (RegisterSet.diff registers callee_saved) forbidden
+let allocatable = RegisterSet.diff registers forbidden
+
+let reg_addr r = `DIRECT (BitVectors.vect_of_int r `Eight)
+
+(* External RAM size *)
+let ext_ram_size = MiscPottier.pow 2 16
+(* Internal RAM size *)
+let int_ram_size = MiscPottier.pow 2 8
--- /dev/null
+
+include Arch.S
+
+type opaccs =
+ | Mul
+ | DivuModu
+
+type op1 =
+ | Cmpl
+ | Inc
+
+type op2 =
+ | Add
+ | Addc
+ | Sub
+ | And
+ | Or
+ | Xor
+
+val print_opaccs : opaccs -> string
+val print_op1 : op1 -> string
+val print_op2 : op2 -> string
+
+module Eval (Val : Value.S) : sig
+ val opaccs : opaccs -> Val.t -> Val.t ->
+ (Val.t (* first result (ACC) *) *
+ Val.t (* second result (BACC) *))
+ val op1 : op1 -> Val.t -> Val.t
+ val op2 : Val.t (* carry *) -> op2 -> Val.t -> Val.t ->
+ (Val.t (* returned value *) * Val.t (* new carry value *))
+end
+
+(* Not supported: signed division, signed modulo, shift operations. *)
+
+type register
+val compare_reg : register -> register -> int
+val eq_reg : register -> register -> bool
+
+module RegisterSet : Set.S with type elt = register
+module RegisterMap : Map.S with type key = register
+
+val a : register
+val b : register
+val dpl : register
+val dph : register
+val spl : register
+val sph : register
+val st0 : register
+val st1 : register
+val st2 : register
+val st3 : register
+val sts : register list
+val rets : register list
+val sst : register
+val carry : register (* only used for the liveness analysis *)
+
+val spl_addr : int
+val spl_init : int
+val sph_addr : int
+val sph_init : int
+val isp_addr : int
+val isp_init : int
+
+val registers : RegisterSet.t
+val parameters : register list
+val callee_saved : RegisterSet.t
+val caller_saved : RegisterSet.t
+val allocatable : RegisterSet.t
+val forbidden : RegisterSet.t
+
+val print_register : register -> string
+
+val reg_addr : register -> [> ASM.direct]
+
+val ext_ram_size : int
+val int_ram_size : int
--- /dev/null
+open BitVectors;;
+open ASM;;
+open Util;;
+open Parser;;
+open Printf;;
+
+exception WrongFormat of string
+
+type intel_hex_entry_type =
+ Data
+ | End
+ | ExtendedSeg
+ | ExtendedLinear
+;;
+
+type intel_hex_entry =
+{
+ record_length: byte;
+ record_addr: word;
+ record_type: intel_hex_entry_type;
+ data_field: byte list;
+ data_checksum: byte
+}
+;;
+
+type intel_hex_format = intel_hex_entry list;;
+
+let hex_digit_of_char =
+ function
+ '0' -> 0 | '1' -> 1 | '2' -> 2
+ | '3' -> 3 | '4' -> 4 | '5' -> 5
+ | '6' -> 6 | '7' -> 7 | '8' -> 8
+ | '9' -> 9 | 'A' -> 10 | 'B' -> 11
+ | 'C' -> 12 | 'D' -> 13 | 'E' -> 14
+ | 'F' -> 15 | 'a' -> 10 | 'b' -> 11
+ | 'c' -> 12 | 'd' -> 13 | 'e' -> 14
+ | 'f' -> 15 | _ -> assert false
+
+let intel_hex_entry_type_of_int =
+ function
+ 0 -> Data
+ | 1 -> End
+ | 2 -> ExtendedSeg
+ | 4 -> ExtendedLinear
+ | _ -> assert false
+;;
+
+let int_of_intel_hex_entry_type =
+ function
+ Data -> 0
+ | End -> 1
+ | ExtendedSeg -> 2
+ | ExtendedLinear -> 4
+;;
+
+let prs_nibble =
+ prs_hex_digit >>=
+fun a -> return $ vect_of_int (hex_digit_of_char a) `Four
+;;
+
+let prs_byte =
+ prs_nibble >>=
+fun a -> prs_nibble >>=
+fun b -> return $ mk_byte a b
+;;
+
+let prs_word =
+ prs_byte >>=
+fun a -> prs_byte >>=
+fun b -> return $ mk_word a b
+;;
+
+let prs_length = prs_byte;;
+let prs_data len = prs_exact len prs_byte
+let prs_checksum = prs_byte;;
+let prs_addr = prs_word;;
+
+let prs_type =
+ prs_hex_digit >>=
+fun a -> prs_hex_digit >>=
+fun b ->
+ let a_as_hex = hex_digit_of_char a in
+ let b_as_hex = hex_digit_of_char b in
+(*CSC: is next line correct??? *)
+ let total = a_as_hex + b_as_hex in
+ return $ intel_hex_entry_type_of_int total
+
+let add_bytes v =
+ let r = List.rev v in
+ let rec aux (cry, bs) =
+ function
+ [] -> (cry, bs)
+ | hd::tl ->
+ aux (half_add hd bs) tl
+ in
+ aux (false, (vect_of_int 0 `Eight)) r
+
+let calculate_checksum hex_entry =
+ let ty = (flip vect_of_int $ `Eight) $ int_of_intel_hex_entry_type hex_entry.record_type in
+ let addr1,addr2 = from_word hex_entry.record_addr in
+ let _, total = add_bytes (hex_entry.record_length :: addr1 :: addr2 :: ty :: hex_entry.data_field) in
+ let _,total = half_add (vect_of_int 1 `Eight) $ complement total in
+ total
+
+let checksum_valid hex_entry =
+ let total = calculate_checksum hex_entry in
+ hex_entry.data_checksum = total
+
+let prs_intel_hex_record =
+ prs_char ':' >>=
+fun _ -> prs_length >>=
+fun b -> prs_addr >>=
+fun c -> prs_type >>=
+fun d -> prs_data (int_of_vect b) >>=
+fun e -> prs_checksum >>=
+fun f -> prs_eof >>=
+fun _ ->
+ let entry =
+ { record_length = b;
+ record_addr = c;
+ record_type = d;
+ data_field = e;
+ data_checksum = f }
+ in
+ if checksum_valid entry then
+ return entry
+ else
+ prs_zero
+;;
+
+let prs_intel_hex_format =
+ prs_sep_by prs_intel_hex_record (prs_char '\n')
+;;
+
+let intel_hex_format_of_string s =
+ let chars = char_list_of_string s in
+ match prs_intel_hex_format chars with
+ [] -> None
+ | (prs,_)::_ -> Some prs
+
+let string_of_intel_hex_entry entry =
+ let b = Buffer.create 655536 in
+ let length_string = hex_string_of_vect entry.record_length in
+ let addr_string = Printf.sprintf "%04X" (int_of_vect entry.record_addr) in
+ let checksum_string = Printf.sprintf "%02X" (int_of_vect entry.data_checksum) in
+ let type_string = Printf.sprintf "%02d" (int_of_intel_hex_entry_type entry.record_type) in
+ List.iter (Buffer.add_string b)
+ [
+ ":"; length_string; addr_string; type_string
+ ];
+ List.iter (fun e -> Buffer.add_string b (hex_string_of_vect e)) entry.data_field;
+ Buffer.add_string b checksum_string;
+ Buffer.contents b
+;;
+
+let string_of_intel_hex_format f =
+ let strs = List.map string_of_intel_hex_entry f in
+ let rec aux =
+ function
+ [] -> ""
+ | [e] -> e
+ | hd::tl -> hd ^ "\n" ^ aux tl
+ in
+ aux strs
+
+let intel_hex_of_file path =
+ let fd = open_in path in
+ let rec aux () =
+ match try Some (input_line fd) with End_of_file -> None with
+ None -> []
+ | Some txt ->
+ let read = prs_intel_hex_record (Parser.chars_of_string txt) in
+ let read =
+ match read with
+ [x,[]] -> x
+ | _ -> raise (WrongFormat txt)
+ in
+ read::aux ()
+ in
+ aux ()
+;;
+
+let rec load_from mem addr =
+ function
+ [] -> mem
+ | he::tl ->
+ load_from (Physical.WordMap.add addr he mem) (snd (BitVectors.half_add addr (BitVectors.vect_of_int 1 `Sixteen))) tl
+;;
+
+let process_intel_hex =
+ let rec aux mem =
+ function
+ [] -> assert false
+ | he::tl ->
+ match he.record_type with
+ End -> assert (tl = []); mem
+ | Data -> aux (load_from mem he.record_addr he.data_field) tl
+ | _ -> assert false
+ in
+ aux Physical.WordMap.empty
+;;
+
+(* DPM: this needs some comment:
+ We aim to extract code memory into segmented lists of bytes, with a maximum
+ length (chunk_size). The code memory map has a fixed size (max_addressable)
+ on the 8051. Further, the chunks we extract get segmented when we find an
+ unitialized zone in the code memory.
+*)
+let export_code_memory chunk_size max_addressable code_mem =
+ let rec aux chunk address start_address rbuff lbuff =
+ if address = max_addressable then
+ (start_address, List.rev rbuff)::lbuff
+ else if chunk = 0 then
+ aux chunk_size address address [] ((start_address, List.rev rbuff)::lbuff)
+ else
+ let code = Physical.WordMap.find (vect_of_int address `Sixteen) code_mem in
+ aux (chunk - 1) (address + 1) start_address (code::rbuff) lbuff
+ in
+ List.rev (aux chunk_size 0 0 [] [])
+;;
+
+let clean_exported_code_memory = List.filter (fun x -> snd x <> [])
+;;
+
+let calculate_data_checksum (record_length, record_addr, record_type, data_field) =
+ let ty = (flip vect_of_int $ `Eight) $ int_of_intel_hex_entry_type record_type in
+ let addr1,addr2 = from_word record_addr in
+ let _, total = add_bytes (record_length :: addr1 :: addr2 :: ty :: data_field) in
+ let _,total = half_add (vect_of_int 0 `Eight) $ complement total in
+ total
+;;
+
+let process_exported_code_memory =
+ List.map (fun x ->
+ let record_length = vect_of_int (List.length (snd x)) `Eight in
+ let record_addr = vect_of_int (fst x) `Sixteen in
+ let record_type = Data in
+ let data_field = snd x in
+ let temp_record =
+ { record_length = record_length;
+ record_addr = record_addr;
+ record_type = record_type;
+ data_field = data_field;
+ data_checksum = zero `Eight
+ } in
+ { temp_record with data_checksum = calculate_checksum temp_record })
+;;
+
+let rec zeros len =
+ if len = 0 then
+ []
+ else
+ vect_of_int 0 `Eight :: zeros (len - 1)
+
+let post_process_exported_code_memory intel_hex =
+ let reversed = List.rev intel_hex in
+ let rec aux hex =
+ match hex with
+ [] -> []
+ | he::tl ->
+ if he.record_type = End then
+ aux tl
+ else if he.record_type = Data then
+ if he.data_field = zeros (int_of_vect he.record_length) then
+ aux tl
+ else
+ he::(aux tl)
+ else
+ tl
+ in
+ List.rev (aux reversed)
+
+let pack_exported_code_memory chunk_size max_addressable code_mem =
+ let export = export_code_memory chunk_size max_addressable code_mem in
+ let cleaned = clean_exported_code_memory export in
+ let processed = process_exported_code_memory cleaned in
+ let postprocessed = post_process_exported_code_memory processed in
+ let end_buffer =
+ [{ record_length = zero `Eight;
+ record_addr = zero `Sixteen;
+ record_type = End;
+ data_field = [];
+ data_checksum = vect_of_int 255 `Eight
+ }] in
+ postprocessed @ end_buffer
+;;
+
+let file_of_intel_hex path fmt =
+ let str_fmt = string_of_intel_hex_format fmt in
+ let channel = open_out path in
+ fprintf channel "%s\n" str_fmt;
+ close_out channel
+;;
--- /dev/null
+open BitVectors;;
+open ASM;;
+open Parser;;
+
+exception WrongFormat of string
+
+type intel_hex_format
+
+val string_of_intel_hex_format: intel_hex_format -> string
+val prs_intel_hex_format: intel_hex_format parser
+
+val intel_hex_of_file: string -> intel_hex_format
+val file_of_intel_hex: string -> intel_hex_format -> unit
+val process_intel_hex: intel_hex_format -> Physical.WordMap.map
+
+val pack_exported_code_memory: int -> int -> Physical.WordMap.map -> intel_hex_format
+val file_of_intel_hex: string -> intel_hex_format -> unit
--- /dev/null
+
+let int_size = 4
+let ptr_size = 4
+let alignment = Some 4
+
+let insts = [AST.IOp_notbool]
+
+(*
+(* Adapted from Pottier's PP compiler *)
+
+(* A machine word is 4 bytes. *)
+
+let word =
+ 4l
+
+(* The MIPS CPU contains 32 general-purpose 32-bit registers
+ that are numbered 0 to 31.
+
+ Register 0, known as [$0], always contains the hardwired value 0.
+
+ Register 1, known as [$at], is conventionally reserved for use by
+ the assembler for expanding certain pseudo-instructions into actual
+ hardware instructions. This means that we cannot use it.
+
+ Registers 2 and 3, known as [$v0] and [$v1], are normally used to
+ return values from functions. In our compiler, only [$v0] is used
+ for this purpose. We use [$v1] as a reserved register for spilling
+ and refer to it as [$st0].
+
+ Registers 4 to 7, known as [$a0] to [$a3], are used to pass the
+ first four arguments to functions. Remaining arguments are passed
+ on the stack.
+
+ Registers 8 to 15, 24 and 25, known as [$t0] to [$t9], are
+ caller-saved registers.
+
+ Registers 16 to 23, known as [$s0] to [$s7], are callee-saved
+ registers.
+
+ Registers 26 and 27, known as [$k0] and [$k1], are reserved for use
+ by the operating system kernel.
+
+ Register 28, known as [$gp] for global pointer, points into the
+ middle of a 64K block of memory in the heap that holds constants
+ and global variables.
+
+ Register 29, known as [$sp] for stack pointer, points to the last
+ location in use on the stack.
+
+ Register 30, known as [$fp] for frame pointer, is used in our
+ compiler as a reserved register for spilling. We refer to it as
+ [$st1].
+
+ Register 31, known as [$ra], contains the return address for the
+ current function. It is written by the [jal] instruction. *)
+
+type register =
+ int
+
+let equal : register -> register -> bool = (=)
+
+module RegisterSet = struct
+
+ include Set.Make (struct
+ type t = register
+ let compare = (-)
+ end)
+
+ let disjoint s1 s2 =
+ is_empty (inter s1 s2)
+
+ let of_list rs =
+ List.fold_right add rs empty
+
+end
+
+module RegisterMap = struct
+
+ include Map.Make (struct
+ type t = register
+ let compare = (-)
+ end)
+
+ let lift f s =
+ RegisterSet.fold (fun x m ->
+ add x (f x) m
+ ) s empty
+
+end
+
+(* Naming convention. *)
+
+let zero =
+ 0
+
+let v0, v1, a0, a1, a2, a3 =
+ 2, 3, 4, 5, 6, 7
+
+let t0, t1, t2, t3, t4, t5, t6, t7, t8, t9 =
+ 8, 9, 10, 11, 12, 13, 14, 15, 24, 25
+
+let s0, s1, s2, s3, s4, s5, s6 =
+ 16, 17, 18, 19, 20, 21, 22
+
+let gp_mips =
+ 23 (* s7 *)
+
+let gp_gnu =
+ 28
+
+let sp, fp =
+ 29, 30
+
+let ra =
+ 31
+
+let st0, st1 =
+ v1, fp
+
+let print = function
+ | 0 ->
+ "zero"
+ | 1 ->
+ "at"
+ | 2 ->
+ "v0"
+ | 3 ->
+ "v1"
+ | 4 ->
+ "a0"
+ | 5 ->
+ "a1"
+ | 6 ->
+ "a2"
+ | 7 ->
+ "a3"
+ | 8 ->
+ "t0"
+ | 9 ->
+ "t1"
+ | 10 ->
+ "t2"
+ | 11 ->
+ "t3"
+ | 12 ->
+ "t4"
+ | 13 ->
+ "t5"
+ | 14 ->
+ "t6"
+ | 15 ->
+ "t7"
+ | 24 ->
+ "t8"
+ | 25 ->
+ "t9"
+ | 16 ->
+ "s0"
+ | 17 ->
+ "s1"
+ | 18 ->
+ "s2"
+ | 19 ->
+ "s3"
+ | 20 ->
+ "s4"
+ | 21 ->
+ "s5"
+ | 22 ->
+ "s6"
+ | 23 ->
+ "s7"
+ | 28 ->
+ "gp"
+ | 29 ->
+ "sp"
+ | 30 ->
+ "fp"
+ | 31 ->
+ "ra"
+ | _ ->
+ assert false
+
+let print2 r = string_of_int r
+
+(* Calling convention. *)
+
+let parameters =
+ [ a0; a1; a2; a3 ]
+
+let result =
+ v0
+
+let caller_saved =
+ RegisterSet.of_list (
+ [ v0; a0; a1; a2; a3; t0; t1; t2; t3; t4; t5; t6; t7; t8; t9; ra ]
+ )
+
+let callee_saved =
+ RegisterSet.of_list (
+ [ s0; s1; s2; s3; s4; s5; s6 ]
+ )
+
+let allocatable =
+ (* The register [$zero] can be viewed as allocatable, but this requires building
+ ad hoc interference edges -- see [Build]. In TD7, in order to simplify things,
+ this register is made non-allocatable. *)
+ RegisterSet.add zero (RegisterSet.union caller_saved callee_saved)
+
+let registers =
+ RegisterSet.union allocatable
+ (RegisterSet.of_list [ gp_mips; gp_gnu; sp; st0; st1 ])
+
+*)
--- /dev/null
+
+include Arch.S
+
+(*
+(* Adapted from Pottier's PP compiler *)
+
+(** This module defines the physical registers of the MIPS processor
+ and their conventional use. *)
+
+(* This is the size of a machine word in bytes. *)
+
+val word: int32
+
+(* This is the type of hardware registers. *)
+
+type register
+
+val equal: register -> register -> bool
+(* Names *)
+val print: register -> string
+(* Number *)
+val print2: register -> string
+
+(* A list of the registers used for passing function parameters. *)
+
+val parameters: register list
+
+(* The register used for returning function results. *)
+
+val result: register
+
+(* The return address register. It is best thought of as a register
+ that is used to pass a parameter (namely, the return address). *)
+
+val ra: register
+
+(* The zero register always holds the value 0. Although it is a
+ special register, it is considered allocatable; see module [Zero]
+ for an explanation. *)
+
+val zero: register
+
+(* Sets of hardware registers. *)
+
+module RegisterSet : sig
+ include Set.S with type elt = register
+ val disjoint: t -> t -> bool
+ val of_list: elt list -> t
+end
+
+(* Maps over hardware registers. *)
+
+module RegisterMap : sig
+
+ include Map.S with type key = register
+
+ (* [lift f s] turns the set [s] into a map where every element [x]
+ is mapped to [f x]. *)
+
+ val lift: (key -> 'a) -> RegisterSet.t -> 'a t
+
+end
+
+(* A set of all allocatable hardware registers, that is, of all
+ registers that are available for use by the register allocator --
+ as opposed to reserved for some fixed use. *)
+
+val allocatable: RegisterSet.t
+
+(* A set of all allocatable ``caller-saved'' hardware registers, that
+ is, of all allocatable registers that might be overwritten during a
+ function call. This includes the so-called ``caller-saved temporary
+ registers'' [$t0-$t9] as well as the registers used to implement
+ the calling convention, namely [$a0-$a3], [$v0], and [$ra]. *)
+
+val caller_saved: RegisterSet.t
+
+(* A set of all allocatable ``callee-saved'' hardware registers, that
+ is, of all allocatable registers that must be preserved by function
+ calls. *)
+
+val callee_saved: RegisterSet.t
+
+(* Two non-allocatable registers, reserved for transferring spilled
+ pseudo-registers to and from the stack. *)
+
+val st0: register
+val st1: register
+
+(* The stack pointer register. *)
+
+val sp: register
+
+(* The global pointer register. *)
+
+val gp_mips: register
+val gp_gnu: register
+
+(* A set of all registers that are used in the code that we generate.
+ This includes all allocatable registers, plus the four special
+ registers mentioned above. *)
+
+val registers: RegisterSet.t
+
+*)
--- /dev/null
+
+let error_prefix = "MIPS interpret"
+let error s = Error.global_error error_prefix (s ^ "\n")
+
+
+let unop = function
+ | MIPSOps.UOpAddi i -> Value.add (Value.Val_int i)
+ | MIPSOps.UOpSlti i -> (fun v -> Value.cmp_lt v (Value.Val_int i))
+ | MIPSOps.UOpSltiu i -> (fun v -> Value.cmp_lt_u v (Value.Val_int i))
+ | MIPSOps.UOpAndi i -> Value.and_op (Value.Val_int i)
+ | MIPSOps.UOpOri i -> Value.or_op (Value.Val_int i)
+ | MIPSOps.UOpXori i -> Value.xor (Value.Val_int i)
+ | MIPSOps.UOpNeg -> Value.negint
+ | MIPSOps.UOpNot -> Value.notint
+
+let binop = function
+ | MIPSOps.OpAdd -> Value.add
+ | MIPSOps.OpSub -> Value.sub
+ | MIPSOps.OpMul -> Value.mul
+ | MIPSOps.OpDiv -> Value.div
+ | MIPSOps.OpDivu -> Value.divu
+ | MIPSOps.OpModu -> Value.modulo
+ | MIPSOps.OpLt -> Value.cmp_lt
+ | MIPSOps.OpLtu -> Value.cmp_lt_u
+ | MIPSOps.OpLe -> Value.cmp_le
+ | MIPSOps.OpLeu -> Value.cmp_le_u
+ | MIPSOps.OpGt -> Value.cmp_gt
+ | MIPSOps.OpGtu -> Value.cmp_gt_u
+ | MIPSOps.OpGe -> Value.cmp_ge
+ | MIPSOps.OpGeu -> Value.cmp_ge_u
+ | MIPSOps.OpEq -> Value.cmp_eq
+ | MIPSOps.OpNe -> Value.cmp_ne
+ | MIPSOps.OpSllv -> Value.shl
+ | MIPSOps.OpSrav -> Value.shr
+ | MIPSOps.OpSrlv -> Value.shru
+ | MIPSOps.OpAnd -> Value.and_op
+ | MIPSOps.OpOr -> Value.or_op
+ | MIPSOps.OpXor -> Value.xor
+
+let fun_of_uncon = function
+ | MIPSOps.UConGez -> Value.cmp_ge
+ | MIPSOps.UConGtz -> Value.cmp_gt
+ | MIPSOps.UConLez -> Value.cmp_le
+ | MIPSOps.UConLtz -> Value.cmp_lt
+
+let uncon con = (fun_of_uncon con) (Value.Val_int 0l)
+
+
+let bincon = function
+ | MIPSOps.ConEq -> Value.cmp_eq
+ | MIPSOps.ConNe -> Value.cmp_ne
--- /dev/null
+(* Adapted from Pottier's PP compiler *)
+
+(** This module provides interpretations of the MIPS operators, for
+ use in building interpreters or in the compiler itself. *)
+
+val unop: MIPSOps.unop -> (Value.t -> Value.t)
+val binop: MIPSOps.binop -> (Value.t -> Value.t -> Value.t)
+
+val uncon: MIPSOps.uncon -> (Value.t -> Value.t)
+val bincon: MIPSOps.bincon -> (Value.t -> Value.t -> Value.t)
--- /dev/null
+
+(** This module defines the operators and branch conditions of the
+ MIPS processor. *)
+
+(* Pasted from Pottier's PP compiler *)
+
+(* These type definitions document the target processor's operators
+ and branch conditions. Here, the target processor is the MIPS. *)
+
+(* The MIPS manual explains that some instructions are actual machine
+ instructions, while others are pseudo-instructions, which are
+ expanded away by the assembler. Do we need to be aware of the
+ distinction?
+
+ Ignoring the distinction is interesting. There are several
+ processors in the MIPS family, and the distinction between actual
+ instructions and pseudo-instructions might vary with the
+ processor. For instance, a future member of the MIPS family might
+ implement more instructions in hardware than its predecessors.
+
+ On the other hand, ignoring the distinction means that we cannot
+ use the hardware register [$at], which is reserved by the assembler
+ for translating some pseudo-instructions into actual instructions.
+
+ Our approach is to follow standard practice and to exploit
+ pseudo-instructions when desired. This means that we cannot use
+ register [$at]. *)
+
+(* Immediate constants, used in the definition of some operators. They
+ must fit in 16 bits. *)
+
+type immediate16 =
+ int32
+
+(* Offsets, used as part of addressing modes. They are measured in
+ bytes and must fit in 16 bits. *)
+
+type offset =
+ immediate16
+
+(* Unary (integer arithmetic) operators. *)
+
+type unop =
+ | UOpAddi of immediate16
+ | UOpSlti of immediate16 (* set on less than immediate *)
+ | UOpSltiu of immediate16
+ | UOpAndi of immediate16
+ | UOpOri of immediate16
+ | UOpXori of immediate16
+ | UOpNeg
+ | UOpNot
+
+(* Binary (integer arithmetic or integer comparison) operators. Among
+ the comparison operators, only [OpLt] corresponds to a MIPS binary
+ comparison instruction, namely [slt]. All others correspond to
+ pseudo-instructions. They are exploited because they are
+ convenient. *)
+
+type binop =
+ | OpAdd
+ | OpSub
+ | OpMul
+ | OpDiv
+ | OpDivu
+ | OpModu
+ | OpLt
+ | OpLtu
+ | OpLe
+ | OpLeu
+ | OpGt
+ | OpGtu
+ | OpGe
+ | OpGeu
+ | OpEq
+ | OpNe
+ | OpSllv
+ | OpSrav
+ | OpSrlv
+ | OpAnd
+ | OpOr
+ | OpXor
+
+(* Unary branch conditions. *)
+
+type uncon =
+
+ (* Greater than or equal to zero. *)
+
+ | UConGez
+
+ (* Greater than zero. *)
+
+ | UConGtz
+
+ (* Less than or equal to zero. *)
+
+ | UConLez
+
+ (* Less than zero. *)
+
+ | UConLtz
+
+(* Binary branch conditions. *)
+
+and bincon =
+
+ (* Equal. *)
+
+ | ConEq
+
+ (* Not equal. *)
+
+ | ConNe
--- /dev/null
+open Util;;
+open BitVectors;;
+open ASM;;
+
+let chars_of_string s =
+ let len = String.length s in
+ let rec aux n =
+ if n < len then
+ s.[n] :: aux (n + 1)
+ else
+ []
+ in
+ aux 0
+;;
+
+type 'a parser = char list -> ('a * char list) list
+
+let return x =
+ fun y -> [(x, y)]
+
+let (>>=) f g =
+ fun x ->
+ let frst = f x in
+ List.concat $ List.map (fun (a, x') -> (g a) x') frst
+
+let prs_zero = fun _ -> []
+;;
+
+let prs_eof = function [] -> [(),[]] | _ -> [];;
+
+let prs_predicate p =
+ function
+ hd::tl ->
+ if p hd then
+ [(hd, tl)]
+ else
+ []
+ | [] -> []
+;;
+
+let (++) f g =
+ fun x ->
+ f x @ g x
+;;
+
+let (+++) f g =
+ fun x ->
+ match (f ++ g) x with
+ [] -> []
+ | hd::_ -> [hd]
+;;
+
+let rec prs_many p =
+ prs_many1 p +++ return []
+and prs_many1 p =
+ p >>=
+fun a -> prs_many p >>=
+fun b -> return $ a::b
+;;
+
+let rec prs_exact i p =
+ if i = 0 then
+ return []
+ else
+ p >>=
+fun a -> prs_exact (i - 1) p >>=
+fun b -> return $ a::b
+
+let rec prs_sep_by p s =
+ prs_sep_by1 p s +++ return []
+and prs_sep_by1 p s =
+ p >>=
+fun a -> prs_many $ (s >>= fun _ -> p) >>=
+fun b -> return $ a::b
+
+
+let prs_char c = prs_predicate (fun x -> x = c)
+;;
+
+let prs_hex_digit =
+ prs_predicate
+ (fun x ->
+ x = '0' || x = '1' || x = '2' || x = '3' ||
+ x = '4' || x = '5' || x = '6' || x = '7' ||
+ x = '8' || x = '9' || x = 'A' || x = 'B' ||
+ x = 'C' || x = 'D' || x = 'E' || x = 'F' ||
+ x = 'a' || x = 'b' || x = 'c' || x = 'd' ||
+ x = 'e' || x = 'f')
+
--- /dev/null
+val chars_of_string: string -> char list
+
+type 'a parser = char list -> ('a * char list) list
+
+val return: 'a -> 'a parser
+val (>>=): 'a parser -> ('a -> 'b parser) -> 'b parser
+val prs_zero: 'a parser
+val prs_eof: unit parser
+val prs_predicate: (char -> bool) -> char parser;;
+val prs_many1: 'a parser -> ('a list) parser;;
+val prs_many: 'a parser -> ('a list) parser;;
+val prs_exact: int -> 'a parser -> ('a list) parser;;
+val prs_sep_by: 'a parser -> 'b parser -> ('a list) parser;;
+val prs_sep_by1: 'a parser -> 'b parser -> ('a list) parser;;
+val (++): 'a parser -> 'a parser -> 'a parser;;
+val (+++): 'a parser -> 'a parser -> 'a parser;;
+
+val prs_char: char -> char parser;;
+val prs_hex_digit: char parser;;
--- /dev/null
+open BitVectors;;
+
+exception Byte7_conversion
+
+module type Map =
+ sig
+ type key
+ type map
+ val empty : map
+ val find : key -> map -> byte
+ val add : key -> byte -> map -> map
+ val fold : (key -> byte -> 'b -> 'b) -> map -> 'b -> 'b
+ val equal: (byte -> byte -> bool) -> map -> map -> bool
+ end
+;;
+
+module Byte7Map : Map with type key = byte7 =
+struct
+ include Map.Make (struct type t = byte7 let compare = Pervasives.compare end)
+ type map = byte t
+ let find k m =
+ try
+ find k m
+ with Not_found -> zero `Eight
+ let fold = fold
+ let equal = equal
+end;;
+
+module WordMap : Map with type key = word =
+struct
+ include Map.Make (struct type t = word let compare = Pervasives.compare end)
+ type map = byte t
+ let find k m =
+ try
+ find k m
+ with Not_found -> zero `Eight
+ let fold = fold
+ let equal = equal
+end;;
+
+let int_of_bit =
+ function
+ false -> 0
+ | true -> 1
+
+let add8_with_c (b1 : [`Eight] vect) (b2 : [`Eight] vect) (c : bit) =
+ let n1 = int_of_vect b1 in
+ let n2 = int_of_vect b2 in
+ let c = int_of_bit c in
+ let res = n1 + n2 + c in
+ let ac = n1 mod 16 + n2 mod 16 + c >= 16 in
+ let c6 = n1 mod 128 + n2 mod 128 + c >= 128 in
+ let res,c = res mod 256, res >= 256 in
+ let ov = c <> c6 in
+ vect_of_int res `Eight,c,ac,ov
+;;
+
+let add16_with_c (b1 : [`Sixteen] vect) (b2 : [`Sixteen] vect) (c : bit) =
+ let n1 = int_of_vect b1 in
+ let n2 = int_of_vect b2 in
+ let c = int_of_bit c in
+ let res = n1 + n2 + c in
+ let ac = n1 mod 256 + n2 mod 256 + c >= 256 in
+ let c6 = n1 mod 2097152 + n2 mod 2097152 + c >= 2097152 in
+ let res,c = res mod 4194304, res >= 4194304 in
+ let ov = c <> c6 in
+ vect_of_int res `Sixteen,c,ac,ov
+;;
+
+let subb8_with_c (b1 : [`Eight] vect) (b2 : [`Eight] vect) (c : bit) =
+ let n1 = int_of_vect b1 in
+ let n2 = int_of_vect b2 in
+ let c = int_of_bit c in
+ let res = n1 - n2 - c in
+ let ac = n1 mod 16 - n2 mod 16 - c < 0 in
+ let c6 = n1 mod 128 - n2 mod 128 - c < 0 in
+ let res,c =
+ if res >= 0 then res,false
+ else n1 + 256 - n2 - c, true in
+ let ov = c <> c6 in
+ (vect_of_int res `Eight,c,ac,ov)
+;;
+
+let dec b =
+ let res = int_of_vect b - 1 in
+ if res < 0 then vect_of_int 255 `Eight
+ else vect_of_int res `Eight
+;;
+
+let inc b =
+ let res = int_of_vect b + 1 in
+ if res > 255 then (vect_of_int 0 `Eight : byte)
+ else (vect_of_int res `Eight : byte)
+;;
+
+let byte7_of_bit b =
+ [false;false;false;false;false;false;b]
+;;
+
+let byte_of_byte7 =
+ function
+ ([b1;b2;b3]::n) -> [false;b1;b2;b3]::n
+ | _ -> assert false
+;;
+
+let addr16_of_addr11 pc a =
+ let pc_upper, _ = from_word pc in
+ let n1, n2 = from_byte pc_upper in
+ let (b1,b2,b3,b) = from_word11 a in
+ let (p1,p2,p3,p4),(p5,_,_,_) = from_nibble n1, from_nibble n2 in
+ mk_word (mk_byte (mk_nibble p1 p2 p3 p4) (mk_nibble p5 b1 b2 b3)) b
+;;
--- /dev/null
+open BitVectors;;
+
+exception Byte7_conversion
+
+module type Map =
+ sig
+ type key
+ type map
+ val empty : map
+ val find : key -> map -> byte
+ val add : key -> byte -> map -> map
+ val fold : (key -> byte -> 'b -> 'b) -> map -> 'b -> 'b
+ val equal: (byte -> byte -> bool) -> map -> map -> bool
+ end
+;;
+
+module Byte7Map : Map with type key = byte7
+module WordMap : Map with type key = word
+
+val int_of_bit: bit -> int
+
+val subb8_with_c:
+ byte -> byte -> bit -> byte * bit * bit * bit (* -, c, ac, ov *)
+val add8_with_c:
+ byte -> byte -> bit -> byte * bit * bit * bit
+val add16_with_c:
+ word -> word -> bit -> word * bit * bit * bit
+val dec: byte -> byte (* with roll-over *)
+val inc: byte -> byte (* with roll-over *)
+
+val addr16_of_addr11: word -> word11 -> word
--- /dev/null
+open BitVectors;;
+open ASM;;
+
+let pp_arg =
+ function
+ `A -> "A"
+ | `B -> "B"
+ | `C -> "C"
+ | `DPTR -> "DPTR"
+ | `ADDR11 x -> hex_string_of_vect x
+ | `ADDR16 x -> hex_string_of_vect x
+ | `DATA x -> "#0" ^ hex_string_of_vect x ^ "h"
+ | `DATA16 x -> "#0" ^ hex_string_of_vect x ^ "h"
+ | `BIT x -> "bit " ^ hex_string_of_vect (x: byte)
+ | `NBIT x -> "nbit " ^ hex_string_of_vect (x: byte)
+ | `REG (r1, r2, r3) -> "R" ^ string_of_int (int_of_vect (mk_nibble false r1 r2 r3))
+ | `REL x -> hex_string_of_vect x
+ | `A_DPTR -> "@DPTR"
+ | `A_PC -> "@PC"
+ | `DIRECT x -> "0" ^ (hex_string_of_vect (x: byte)) ^ "h"
+ | `EXT_INDIRECT x -> "ext_indirect " ^ string_of_bool x
+ | `EXT_IND_DPTR -> "@DPTR"
+(* DPM: weird: this seems to be reversed in mcu8051ide: change made. *)
+ | `INDIRECT x -> if not x then "@R0" else "@R1"
+ | `IND_DPTR -> "@DPTR"
+ | `Label s -> s
+;;
+
+let pp_jump =
+ function
+ `CJNE (`U1 (a1,a2),a3) -> "cjne " ^ pp_arg a1 ^ ", " ^ pp_arg a2 ^ ", " ^ pp_arg a3
+ | `CJNE (`U2 (a1,a2),a3) -> "cjne " ^ pp_arg a1 ^ ", " ^ pp_arg a2 ^ ", " ^ pp_arg a3
+ | `DJNZ (a1,a2) -> "djnz " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `JB (a1,a2) -> "jb " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `JBC (a1,a2) -> "jbc " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `JC a1 -> "jc " ^ pp_arg a1
+ | `JNB (a1,a2) -> "jnb " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `JNC a1 -> "jnc " ^ pp_arg a1
+ | `JNZ a1 -> "jnz " ^ pp_arg a1
+ | `JZ a1 -> "jz " ^ pp_arg a1
+
+let pp_instruction =
+ function
+ `Label l -> l ^ ":"
+ | `Cost l -> l ^ ":"
+ | `Jmp j -> "ljmp " ^ j
+ | `Call j -> "lcall " ^ j
+ | `WithLabel i -> pp_jump i
+ | (#jump as i) -> pp_jump i
+ | `Mov (a1,a2) -> "mov " ^ pp_arg a1 ^ ", " ^ a2
+ | `ACALL a1 -> "acall " ^ pp_arg a1
+ | `ADD (a1,a2) -> "add " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `ADDC (a1,a2) -> "addc " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `AJMP a1 -> "ajmp " ^ pp_arg a1
+ | `ANL (`U1 (a1,a2)) -> "anl " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `ANL (`U2 (a1,a2)) -> "anl " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `ANL (`U3 (a1,a2)) -> "anl " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `CLR a1 -> "clr " ^ pp_arg a1
+ | `CPL a1 -> "cpl " ^ pp_arg a1
+ | `DA a1 -> "da " ^ pp_arg a1
+ | `DEC a1 -> "dec " ^ pp_arg a1
+ | `DIV (a1,a2) -> "div AB"
+ | `INC a1 -> "inc " ^ pp_arg a1
+ | `JMP a1 -> "jmp " ^ pp_arg a1
+ | `LCALL a1 -> "lcall " ^ pp_arg a1
+ | `LJMP a1 -> "ljmp " ^ pp_arg a1
+ | `MOV (`U1 (a1,a2)) -> "mov " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `MOV (`U2 (a1,a2)) -> "mov " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `MOV (`U3 (a1,a2)) -> "mov " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `MOV (`U4 (a1,a2)) -> "mov " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `MOV (`U5 (a1,a2)) -> "mov " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `MOV (`U6 (a1,a2)) -> "mov " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `MOVC (a1,a2) -> "movc " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `MOVX (`U1 (a1,a2)) -> "movx " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `MOVX (`U2 (a1,a2)) -> "movx " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `MUL(a1, a2) -> "mul AB"
+ | `NOP -> "nop"
+ | `ORL (`U1(a1,a2)) -> "orl " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `ORL (`U2(a1,a2)) -> "orl " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `ORL (`U3(a1,a2)) -> "orl " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `POP a1 -> "pop " ^ pp_arg a1
+ | `PUSH a1 -> "push " ^ pp_arg a1
+ | `RET -> "ret"
+ | `RETI -> "reti"
+ | `RL a1 -> "rl " ^ pp_arg a1
+ | `RLC a1 -> "rlc " ^ pp_arg a1
+ | `RR a1 -> "rr " ^ pp_arg a1
+ | `RRC a1 -> "rrc " ^ pp_arg a1
+ | `SETB a1 -> "setb " ^ pp_arg a1
+ | `SJMP a1 -> "sjmp " ^ pp_arg a1
+ | `SUBB (a1,a2) -> "subb " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `SWAP a1 -> "swap " ^ pp_arg a1
+ | `XCH (a1,a2) -> "xch " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `XCHD(a1,a2) -> "xchd " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `XRL(`U1(a1,a2)) -> "xrl " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+ | `XRL(`U2(a1,a2)) -> "xrl " ^ pp_arg a1 ^ ", " ^ pp_arg a2
+
+let print_program p =
+ let eformat = Eformat.create () in
+ let printf = Eformat.printf eformat in
+ let mem = ASMInterpret.load_code_memory p.ASM.code in
+ let f pc _ =
+ let (inst, new_pc, cost) = ASMInterpret.fetch mem pc in
+ printf "% 6X: %- 18s ;; %d %s\n"
+ (BitVectors.int_of_vect pc)
+ (pp_instruction inst)
+ cost
+ (if BitVectors.WordMap.mem pc p.ASM.cost_labels then
+ (BitVectors.WordMap.find pc p.ASM.cost_labels)
+ else "") ;
+ new_pc in
+ let _ = List.fold_left f (BitVectors.zero `Sixteen) p.ASM.code in
+ Eformat.get eformat
--- /dev/null
+val pp_arg:
+ [< `A
+ | `ADDR11 of 'a BitVectors.vect
+ | `ADDR16 of 'b BitVectors.vect
+ | `A_DPTR
+ | `A_PC
+ | `B
+ | `BIT of BitVectors.byte
+ | `C
+ | `DATA of 'c BitVectors.vect
+ | `DATA16 of 'd BitVectors.vect
+ | `DIRECT of BitVectors.byte
+ | `DPTR
+ | `EXT_INDIRECT of bool
+ | `EXT_IND_DPTR
+ | `INDIRECT of bool
+ | `IND_DPTR
+ | `NBIT of BitVectors.byte
+ | `REG of BitVectors.bit * BitVectors.bit * BitVectors.bit
+ | `REL of 'e BitVectors.vect ] -> string
+val pp_instruction: [< ASM.labelled_instruction] -> string
+
+val print_program : ASM.program -> string
--- /dev/null
+let ($) f x = f x
+;;
+
+let (<*>) f g x = f (g x)
+;;
+
+let flip f a b = f b a
+;;
+
+let fst (a, b) = a
+;;
+
+let snd (a, b) = b
+;;
+
+let rec pad v i l =
+ match i with
+ 0 -> l
+ | n -> v :: (pad v (i - 1) l)
+;;
+
+let char_list_of_string s =
+ let str_length = String.length s in
+ let rec aux s l buff =
+ if l = str_length then
+ buff
+ else
+ aux s (l + 1) ((String.get s l)::buff)
+ in
+ List.rev $ aux s 0 []
--- /dev/null
+
+module type S =
+sig
+ val int_size : int
+ val ptr_size : int
+ val alignment : int option
+end
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+open MIPSOps
+open Printf
+
+(* Some of the instructions that we emit are in fact pseudo-instructions. *)
+
+(* We use [addu], [addiu], and [subu] instead of [add], [addi], and
+ [sub]. The only difference is that the former never generate
+ overflow exceptions. This is what we desire, since the semantics
+ of Pseudo-Pascal says nothing about overflow exceptions. Overflow
+ is silent. *)
+
+let unop reg f (op, dst, src) =
+ match op with
+ | UOpAddi 0l ->
+ sprintf "move %a, %a" reg dst reg src (* pseudo-instruction *)
+ | UOpAddi i ->
+ sprintf "addi %a, %a, %ld" reg dst reg src i
+ | UOpSlti i ->
+ sprintf "slti %a, %a, %ld" reg dst reg src i
+ | UOpSltiu i ->
+ sprintf "sltiu %a, %a, %ld" reg dst reg src i
+ | UOpAndi i ->
+ sprintf "andi %a, %a, %ld" reg dst reg src i
+ | UOpOri i ->
+ sprintf "ori %a, %a, %ld" reg dst reg src i
+ | UOpXori i ->
+ sprintf "xori %a, %a, %ld" reg dst reg src i
+ | UOpNeg ->
+ sprintf "neg %a, %a" reg dst reg src
+ | UOpNot ->
+ sprintf "not %a, %a" reg dst reg src
+
+let binop = function
+ | OpAdd ->
+ "add "
+ | OpSub ->
+ "sub "
+ | OpMul ->
+ "mulo "
+ | OpDiv ->
+ "div " (* pseudo-instruction *)
+ | OpDivu ->
+ "divu " (* pseudo-instruction *)
+ | OpModu ->
+ "remu " (* pseudo-instruction *)
+ | OpLt ->
+ "slt "
+ | OpLtu ->
+ "sltu "
+ | OpLe ->
+ "sle " (* pseudo-instruction *)
+ | OpLeu ->
+ "sleu " (* pseudo-instruction *)
+ | OpGt ->
+ "sgt " (* pseudo-instruction *)
+ | OpGtu ->
+ "sgtu " (* pseudo-instruction *)
+ | OpGe ->
+ "sge " (* pseudo-instruction *)
+ | OpGeu ->
+ "sgeu " (* pseudo-instruction *)
+ | OpEq ->
+ "seq " (* pseudo-instruction *)
+ | OpNe ->
+ "sne " (* pseudo-instruction *)
+ | OpSllv ->
+ "sllv "
+ | OpSrav ->
+ "srav "
+ | OpSrlv ->
+ "srlv "
+ | OpAnd ->
+ "and "
+ | OpOr ->
+ "or "
+ | OpXor ->
+ "xor "
+
+let uncon reg f (cond, src) =
+ match cond with
+ | UConGez ->
+ sprintf "bgez %a" reg src
+ | UConGtz ->
+ sprintf "bgtz %a" reg src
+ | UConLez ->
+ sprintf "blez %a" reg src
+ | UConLtz ->
+ sprintf "bltz %a" reg src
+
+let bincon = function
+ | ConEq ->
+ "beq "
+ | ConNe ->
+ "bne "
--- /dev/null
+
+(** This module provides functions to print the operators of the
+ MIPS processor. *)
+
+(* Pasted from Pottier's PP compiler *)
+
+open PrintPottier
+
+val unop: 'reg printer -> (MIPSOps.unop * 'reg * 'reg) printer
+val binop: MIPSOps.binop -> string
+val uncon: 'reg printer -> (MIPSOps.uncon * 'reg) printer
+val bincon: MIPSOps.bincon -> string
--- /dev/null
+
+(** This module defines the abstract syntax tree of [RTL]. *)
+
+(* Adapted from Pottiers's Pseudo-Pascal pedagogical compiler *)
+
+(* This is the definition of the abstract syntax for the Explicit
+ Register Transfer Language (ERTL).
+
+ This language is very much like RTL, except the calling convention
+ has been made explicit. That is, functions and procedures no longer
+ accept parameters and return results via a high-level mechanism;
+ instead, they do so via either hardware registers or stack
+ slots.
+
+ Functions and procedures no longer magically return to their caller: instead,
+ a new [St_return] instruction appears, whose semantics is to transfer control
+ to the address stored in the return address registers.
+
+ Functions and procedures are no longer explicitly distinguished: functions
+ are simply procedures that happen to write the hardware register. There only
+ remains a distinction at [St_return] instructions (see below).
+
+ Two new instructions, [St_newframe] and [St_delframe], appear in order to
+ allocate and release stack frames. They will be translated, in the final
+ assembly code, to arithmetic on the stack pointer registers. *)
+
+(* Stack organization.
+
+ The stack is going from top to bottom. Below is a schema of the stack
+ organization viewed by the function being executed.
+
+ formal parameters (the first parameter is at the top)
+ spilled variables (the first spilled variable is a the top)
+ local variables (the first local variable is at the bottom)
+ stack pointer ->
+*)
+
+type registers = Register.t list
+
+type statement =
+
+ (* The empty statement. *)
+ | St_skip of Label.t
+
+ (* Comment. *)
+ | St_comment of string * Label.t
+
+ (* Emit a cost label. *)
+ | St_cost of CostLabel.t * Label.t
+
+ (* Assign the content of a hardware register to a pseudo register. Parameters
+ are the destination pseudo register, the source hardware register, and the
+ label of the next statement. *)
+ | St_get_hdw of Register.t * I8051.register * Label.t
+
+ (* Assign the content of a pseudo register to a hardware register. Parameters
+ are the destination hardware register, the source pseudo register, and the
+ label of the next statement. *)
+ | St_set_hdw of I8051.register * Register.t * Label.t
+
+ (* Assign the content of a hardware register to a hardware
+ register. Parameters are the destination register, the source register, and
+ the label of the next statement. Only used to save the return value before
+ the epilogue and restore it right before leaving the function. *)
+ | St_hdw_to_hdw of I8051.register * I8051.register * Label.t
+
+ (* Allocate required space on the stack for the function. Parameter is the
+ label of the next statement. *)
+ | St_newframe of Label.t
+
+ (* Deallocate required space on the stack for the function. Parameter is the
+ label of the next statement. *)
+ | St_delframe of Label.t
+
+ (* Assign the frame size to a register. Parameters are the destination
+ register, and the label of the next statement. *)
+ | St_framesize of Register.t * Label.t
+
+ (* Pop a value from the IRAM to a register. Parameter are the destination
+ register, and the label of the next statement. *)
+ | St_pop of Register.t * Label.t
+
+ (* Push a value from a register to the IRAM. Parameter are the source
+ register, and the label of the next statement. *)
+ | St_push of Register.t * Label.t
+
+ (* Assign the most significant bits of the address of a symbol to a
+ register. Parameters are the destination register, the symbol and the label
+ of the next statement. *)
+ | St_addrH of Register.t * AST.ident * Label.t
+
+ (* Assign the least significant bits of the address of a symbol to a
+ register. Parameters are the destination register, the symbol and the label
+ of the next statement. *)
+ | St_addrL of Register.t * AST.ident * Label.t
+
+ (* Assign an integer constant to a register. Parameters are the destination
+ register, the integer and the label of the next statement. *)
+ | St_int of Register.t * int * Label.t
+
+ (* Move the content of a register to another. Parameters are the destination
+ register, the source register, and the label of the next statement. *)
+ | St_move of Register.t * Register.t * Label.t
+
+ (* Apply a binary operation that will later be translated in an operation on
+ the accumulators, keeping only the result in ACC. Parameters are the
+ operation, the destination register, the source registers, and the label of
+ the next statement. *)
+ | St_opaccsA of I8051.opaccs * Register.t * Register.t * Register.t * Label.t
+
+ (* Apply a binary operation that will later be translated in an operation on
+ the accumulators, keeping only the result in BACC. Parameters are the
+ operation, the destination register, the source registers, and the label of
+ the next statement. *)
+ | St_opaccsB of I8051.opaccs * Register.t * Register.t * Register.t * Label.t
+
+ (* Apply an unary operation. Parameters are the operation, the destination
+ register, the source register, and the label of the next statement. *)
+ | St_op1 of I8051.op1 * Register.t * Register.t * Label.t
+
+ (* Apply a binary operation. Parameters are the operation, the destination
+ register, the source registers, and the label of the next statement. *)
+ | St_op2 of I8051.op2 * Register.t * Register.t * Register.t * Label.t
+
+ (* Set the carry flag to zero. Parameter is the label of the next
+ statement. *)
+ | St_clear_carry of Label.t
+
+ (* Set the carry flag to 1. Parameter is the label of the next statement. *)
+ | St_set_carry of Label.t
+
+ (* Load from external memory. Parameters are the destination register, the
+ address registers (low bytes first), and the label of the next
+ statement. *)
+ | St_load of Register.t * Register.t * Register.t * Label.t
+
+ (* Store to external memory. Parameters are the address registers (low bytes
+ first), the source register, and the label of the next statement. *)
+ | St_store of Register.t * Register.t * Register.t * Label.t
+
+ (* Call to a function given its name. Parameters are the name of the function,
+ the number of arguments of the function, and the label of the next
+ statement. *)
+ | St_call_id of AST.ident * int * Label.t
+
+ (* Call to a function given its address. Parameters are the registers holding
+ the address of the function, the number of arguments of the function, and
+ the label of the next statement. *)
+ | St_call_ptr of Register.t * Register.t * int * Label.t
+
+(*
+ (* Tail call to a function given its name. Parameters are the name of the
+ function, and the number of arguments of the function. *)
+ | St_tailcall_id of AST.ident * int
+
+ (* Tail call to a function given its address. Parameters are registers holding
+ the address of the function, and the arguments of the function. *)
+ | St_tailcall_ptr of registers * register list
+*)
+
+ (* Branch. Parameters are the register holding the value for the branching,
+ the label to go to when the value is not 0, and the label to go to when the
+ value is 0. *)
+ | St_cond of Register.t * Label.t * Label.t
+
+ (* Transfer control to the address stored in the return address registers. *)
+ | St_return of registers
+
+type graph = statement Label.Map.t
+
+type internal_function =
+ { f_luniverse : Label.Gen.universe ;
+ f_runiverse : Register.universe ;
+ f_params : int ;
+ f_locals : Register.Set.t ;
+ f_stacksize : int ;
+ f_graph : graph ;
+ f_entry : Label.t ;
+ f_exit : Label.t }
+
+type function_def =
+ | F_int of internal_function
+ | F_ext of AST.external_function
+
+(* A program is a list of global variables and their reserved space, a list of
+ function names and their definition, and the name of the main function. *)
+
+type program =
+ { vars : (AST.ident * int (* size *)) list ;
+ functs : (AST.ident * function_def) list ;
+ main : AST.ident option }
--- /dev/null
+
+(** This module provides an interpreter for the ERTL language. *)
+
+
+let error_prefix = "ERTL interpret"
+let error s = Error.global_error error_prefix s
+
+
+module Mem = Driver.ERTLMemory
+module Val = Mem.Value
+let chunk = Driver.ERTLMemory.int_size
+module Eval = I8051.Eval (Val)
+
+
+(* Memory *)
+
+type memory = ERTL.function_def Mem.memory
+
+(* Local environments. They associate a value to the pseudo-registers of the
+ function being executed. *)
+
+type local_env = Val.t Register.Map.t
+
+(* Hardware registers environments. They associate a value to each hardware
+ register. *)
+
+type hdw_reg_env = Val.t I8051.RegisterMap.t
+
+(* Call frames. The execution state has a call stack, each element of the stack
+ being composed of the local environment to resume the execution of the
+ caller. *)
+
+type stack_frame = local_env
+
+(* Execution states. *)
+
+type state =
+ { st_frs : stack_frame list ;
+ pc : Val.address ;
+ isp : Val.address ;
+ exit : Val.address ;
+ lenv : local_env ;
+ carry : Val.t ;
+ renv : hdw_reg_env ;
+ mem : memory ;
+ trace : CostLabel.t list }
+
+
+(* Helpers *)
+
+let add_st_frs st frame = { st with st_frs = frame :: st.st_frs }
+let pop_st_frs st = match st.st_frs with
+ | [] -> error "Empty stack frames."
+ | lenv :: st_frs -> { st with st_frs = st_frs ; lenv = lenv }
+let change_pc st pc = { st with pc = pc }
+let change_isp st isp = { st with isp = isp }
+let change_exit st exit = { st with exit = exit }
+let change_lenv st lenv = { st with lenv = lenv }
+let change_carry st carry = { st with carry = carry }
+let change_renv st renv = { st with renv = renv }
+let change_mem st mem = { st with mem = mem }
+let change_trace st trace = { st with trace = trace }
+let add_trace st cost_lbl = change_trace st (cost_lbl :: st.trace)
+
+let empty_state =
+ { st_frs = [] ;
+ pc = Val.null ;
+ isp = Val.null ;
+ exit = Val.null ;
+ lenv = Register.Map.empty ;
+ carry = Val.undef ;
+ renv = I8051.RegisterMap.empty ;
+ mem = Mem.empty ;
+ trace = [] }
+
+
+(* Each label of each function is associated an address. The base of this
+ address is the base of the function in memory. Inside a function, offsets are
+ bijectively associated to labels. *)
+
+module Labels_Offsets = Bijection.Make (Label) (Val.Offset)
+
+let labels_offsets_internal int_fun =
+ let f lbl _ (lbls_offs, i) =
+ (Labels_Offsets.add1 lbl i lbls_offs, Val.Offset.succ i) in
+ Label.Map.fold f int_fun.ERTL.f_graph
+
+(* [labels_offsets p] builds a bijection between the labels found in the
+ functions of [p] and some memory addresses. *)
+
+let labels_offsets p =
+ let f (lbls_offs, i) (_, def) = match def with
+ | ERTL.F_int int_fun -> labels_offsets_internal int_fun (lbls_offs, i)
+ | _ -> (lbls_offs, i) in
+ fst (List.fold_left f (Labels_Offsets.empty, Val.Offset.zero) p.ERTL.functs)
+
+let fun_def_of_ptr mem ptr = match Mem.find_fun_def mem ptr with
+ | ERTL.F_int def -> def
+ | _ -> error "Trying to fetch the definition of an external function."
+
+let fetch_stmt lbls_offs st =
+ let msg =
+ Printf.sprintf "%s does not point to a statement."
+ (Val.string_of_address st.pc) in
+ if Val.is_mem_address st.pc then
+ let off = Val.offset_of_address st.pc in
+ let def = fun_def_of_ptr st.mem st.pc in
+ let lbl = Labels_Offsets.find2 off lbls_offs in
+ Label.Map.find lbl def.ERTL.f_graph
+ else error msg
+
+let entry_pc lbls_offs ptr def =
+ let off = Labels_Offsets.find1 def.ERTL.f_entry lbls_offs in
+ Val.change_address_offset ptr off
+
+let init_fun_call lbls_offs st ptr def =
+ let f r lenv = Register.Map.add r Val.undef lenv in
+ let lenv = Register.Set.fold f def.ERTL.f_locals Register.Map.empty in
+ let pc = entry_pc lbls_offs ptr def in
+ change_lenv (change_pc st pc) lenv
+
+let next_pc lbls_offs st lbl =
+ let off = Labels_Offsets.find1 lbl lbls_offs in
+ change_pc st (Val.change_address_offset st.pc off)
+
+let framesize st =
+ if Val.is_mem_address st.pc then
+ let def = fun_def_of_ptr st.mem st.pc in
+ def.ERTL.f_stacksize
+ else error "No function at the given address."
+
+type register = Hdw of I8051.register | Psd of Register.t
+
+let add_reg r v st = match r with
+ | Hdw r ->
+ let renv = I8051.RegisterMap.add r v st.renv in
+ change_renv st renv
+ | Psd r ->
+ let lenv = Register.Map.add r v st.lenv in
+ change_lenv st lenv
+
+let get_reg r st = match r with
+ | Hdw r ->
+ if I8051.RegisterMap.mem r st.renv then I8051.RegisterMap.find r st.renv
+ else error ("Unknown hardware register " ^ (I8051.print_register r) ^ ".")
+ | Psd r ->
+ if Register.Map.mem r st.lenv then Register.Map.find r st.lenv
+ else error ("Unknown local register " ^ (Register.print r) ^ ".")
+
+let push st v =
+ let mem = Mem.store st.mem chunk st.isp v in
+ let isp = Val.add_address st.isp (Val.Offset.of_int chunk) in
+ change_mem (change_isp st isp) mem
+
+let pop st =
+ let isp = Val.add_address st.isp (Val.Offset.of_int (-chunk)) in
+ let st = change_isp st isp in
+ let v = Mem.load st.mem chunk st.isp in
+ (st, v)
+
+let get_ra st =
+ let (st, pch) = pop st in
+ let (st, pcl) = pop st in
+ [pcl ; pch]
+
+let save_ra lbls_offs st lbl =
+ let ra =
+ Val.change_address_offset st.pc (Labels_Offsets.find1 lbl lbls_offs) in
+ let st = push st (List.nth ra 0) in
+ let st = push st (List.nth ra 1) in
+ st
+
+let save_frame st = add_st_frs st st.lenv
+
+let label_of_pointer lbls_offs ptr =
+(*
+ Printf.printf "Retrieving label of %s\n%!" (Val.to_string ptr) ;
+*)
+ let off = Val.offset_of_address ptr in
+ Labels_Offsets.find2 off lbls_offs
+
+let pointer_of_label lbls_offs ptr lbl =
+ Val.change_address_offset ptr (Labels_Offsets.find1 lbl lbls_offs)
+
+let get_sp st =
+ List.map (fun r -> get_reg (Hdw r) st) [I8051.spl ; I8051.sph]
+
+let set_sp vs st =
+ let spl = List.nth vs 0 in
+ let sph = List.nth vs 1 in
+ let st = add_reg (Hdw I8051.spl) spl st in
+ let st = add_reg (Hdw I8051.sph) sph st in
+ st
+
+let make_addr st r1 r2 = List.map (fun r -> get_reg (Psd r) st) [r1 ; r2]
+
+
+module InterpretExternal = Primitive.Interpret (Mem)
+
+let interpret_external mem f args = match InterpretExternal.t mem f args with
+ | (mem', InterpretExternal.V vs) -> (mem', vs)
+ | (mem', InterpretExternal.A addr) -> (mem', addr)
+
+let fetch_external_args f st =
+ let size = Mem.size_of_quantity (Primitive.args_byte_size f) in
+ let params = MiscPottier.prefix size I8051.parameters in
+ List.map (fun r -> get_reg (Hdw r) st) params
+
+let set_result st vs =
+ let f st (r, v) = add_reg (Hdw r) v st in
+ List.fold_left f st (MiscPottier.combine I8051.rets vs)
+
+let interpret_external_call st f next_pc =
+ let args = fetch_external_args f st in
+ let (mem, vs) = interpret_external st.mem f args in
+ let st = change_mem st mem in
+ let st = set_result st vs in
+ change_pc st next_pc
+
+let interpret_call lbls_offs st ptr ra =
+ (* let ptr = Mem.find_global st.mem f in *)
+ match Mem.find_fun_def st.mem ptr with
+ | ERTL.F_int def ->
+ let st = save_ra lbls_offs st ra in
+ let st = save_frame st in
+ init_fun_call lbls_offs st ptr def
+ | ERTL.F_ext def ->
+ let next_pc =
+ Val.change_address_offset st.pc (Labels_Offsets.find1 ra lbls_offs) in
+ interpret_external_call st def.AST.ef_tag next_pc
+
+let interpret_return lbls_offs st =
+ let st = pop_st_frs st in
+ let (st, pch) = pop st in
+ let (st, pcl) = pop st in
+ let pc = [pcl ; pch] in
+ change_pc st pc
+
+
+(* Interpret statements. *)
+
+let interpret_stmt lbls_offs st stmt =
+ let next_pc = next_pc lbls_offs in
+ match stmt with
+
+ | ERTL.St_skip lbl ->
+ next_pc st lbl
+
+ | ERTL.St_comment (s, lbl) ->
+(*
+ Printf.printf "*** %s ***\n\n%!" s ;
+*)
+ next_pc st lbl
+
+ | ERTL.St_cost (cost_lbl, lbl) ->
+ let st = add_trace st cost_lbl in
+ next_pc st lbl
+
+ | ERTL.St_get_hdw (destr, srcr, lbl) ->
+ let st = add_reg (Psd destr) (get_reg (Hdw srcr) st) st in
+ next_pc st lbl
+
+ | ERTL.St_set_hdw (destr, srcr, lbl) ->
+ let st = add_reg (Hdw destr) (get_reg (Psd srcr) st) st in
+ next_pc st lbl
+
+ | ERTL.St_hdw_to_hdw (destr, srcr, lbl) ->
+ let st = add_reg (Hdw destr) (get_reg (Hdw srcr) st) st in
+ next_pc st lbl
+
+ | ERTL.St_newframe lbl ->
+ let size = framesize st in
+ let sp = get_sp st in
+ let new_sp = Val.add_address sp (Val.Offset.of_int (-size)) in
+ let st = set_sp new_sp st in
+ next_pc st lbl
+
+ | ERTL.St_delframe lbl ->
+ let size = framesize st in
+ let sp = get_sp st in
+ let new_sp = Val.add_address sp (Val.Offset.of_int size) in
+ let st = set_sp new_sp st in
+ next_pc st lbl
+
+ | ERTL.St_framesize (destr, lbl) ->
+ let size = framesize st in
+ let st = add_reg (Psd destr) (Val.of_int size) st in
+ next_pc st lbl
+
+ | ERTL.St_pop (destr, lbl) ->
+ let (st, v) = pop st in
+ let st = add_reg (Psd destr) v st in
+ next_pc st lbl
+
+ | ERTL.St_push (srcr, lbl) ->
+ let v = get_reg (Psd srcr) st in
+ let st = push st v in
+ next_pc st lbl
+
+ | ERTL.St_addrH (r, x, lbl) ->
+ let vs = Mem.find_global st.mem x in
+ let st = add_reg (Psd r) (List.nth vs 1) st in
+ next_pc st lbl
+
+ | ERTL.St_addrL (r, x, lbl) ->
+ let vs = Mem.find_global st.mem x in
+ let st = add_reg (Psd r) (List.nth vs 0) st in
+ next_pc st lbl
+
+ | ERTL.St_int (r, i, lbl) ->
+ let st = add_reg (Psd r) (Val.of_int i) st in
+ next_pc st lbl
+
+ | ERTL.St_move (destr, srcr, lbl) ->
+ let st = add_reg (Psd destr) (get_reg (Psd srcr) st) st in
+ next_pc st lbl
+
+ | ERTL.St_opaccsA (opaccs, destr, srcr1, srcr2, lbl) ->
+ let (v, _) =
+ Eval.opaccs opaccs
+ (get_reg (Psd srcr1) st)
+ (get_reg (Psd srcr2) st) in
+ let st = add_reg (Psd destr) v st in
+ next_pc st lbl
+
+ | ERTL.St_opaccsB (opaccs, destr, srcr1, srcr2, lbl) ->
+ let (_, v) =
+ Eval.opaccs opaccs
+ (get_reg (Psd srcr1) st)
+ (get_reg (Psd srcr2) st) in
+ let st = add_reg (Psd destr) v st in
+ next_pc st lbl
+
+ | ERTL.St_op1 (op1, destr, srcr, lbl) ->
+ let v = Eval.op1 op1 (get_reg (Psd srcr) st) in
+ let st = add_reg (Psd destr) v st in
+ next_pc st lbl
+
+ | ERTL.St_op2 (op2, destr, srcr1, srcr2, lbl) ->
+ let (v, carry) =
+ Eval.op2 st.carry op2
+ (get_reg (Psd srcr1) st)
+ (get_reg (Psd srcr2) st) in
+ let st = change_carry st carry in
+ let st = add_reg (Psd destr) v st in
+ next_pc st lbl
+
+ | ERTL.St_clear_carry lbl ->
+ let st = change_carry st Val.zero in
+ next_pc st lbl
+
+ | ERTL.St_set_carry lbl ->
+ let st = change_carry st (Val.of_int 1) in
+ next_pc st lbl
+
+ | ERTL.St_load (destr, addr1, addr2, lbl) ->
+ let addr = make_addr st addr1 addr2 in
+ let v = Mem.load st.mem chunk addr in
+ let st = add_reg (Psd destr) v st in
+ next_pc st lbl
+
+ | ERTL.St_store (addr1, addr2, srcr, lbl) ->
+ let addr = make_addr st addr1 addr2 in
+ let mem = Mem.store st.mem chunk addr (get_reg (Psd srcr) st) in
+ let st = change_mem st mem in
+ next_pc st lbl
+
+ | ERTL.St_call_id (f, _, lbl) ->
+ interpret_call lbls_offs st (Mem.find_global st.mem f) lbl
+
+ | ERTL.St_call_ptr (f1, f2, _, lbl) ->
+ interpret_call lbls_offs st (make_addr st f1 f2) lbl
+
+ | ERTL.St_cond (srcr, lbl_true, lbl_false) ->
+ let v = get_reg (Psd srcr) st in
+ let lbl =
+ if Val.is_true v then lbl_true
+ else
+ if Val.is_false v then lbl_false
+ else error "Undecidable branchment." in
+ next_pc st lbl
+
+ | ERTL.St_return _ ->
+ interpret_return lbls_offs st
+
+
+let print_lenv lenv =
+ let f r v =
+ if not (Val.eq v Val.undef) then
+ Printf.printf "\n%s = %s%!" (Register.print r) (Val.to_string v) in
+ Register.Map.iter f lenv
+
+let print_renv renv =
+ let f r v =
+ if not (Val.eq v Val.undef) then
+ Printf.printf "\n%s = %s%!" (I8051.print_register r) (Val.to_string v) in
+ I8051.RegisterMap.iter f renv
+
+let current_label lbls_offs st =
+ Labels_Offsets.find2 (Val.offset_of_address st.pc) lbls_offs
+
+let print_state lbls_offs st =
+ Printf.printf "PC: %s (%s)\n%!"
+ (Val.string_of_address st.pc) (current_label lbls_offs st) ;
+ Printf.printf "SP: %s\n%!" (Val.string_of_address (get_sp st)) ;
+ Printf.printf "ISP: %s%!" (Val.string_of_address st.isp) ;
+ Printf.printf "Carry: %s%!" (Val.to_string st.carry) ;
+ print_lenv st.lenv ;
+ print_renv st.renv ;
+ Mem.print st.mem ;
+ Printf.printf "\n%!"
+
+let compute_result st ret_regs =
+ let vs = List.map (fun r -> get_reg (Psd r) st) ret_regs in
+ let f res v = res && (Val.is_int v) in
+ let is_int vs = (List.length vs > 0) && (List.fold_left f true vs) in
+ if is_int vs then
+ let chunks =
+ List.map (fun v -> IntValue.Int32.cast (Val.to_int_repr v)) vs in
+ IntValue.Int32.merge chunks
+ else IntValue.Int32.zero
+
+let rec iter_small_step debug lbls_offs st =
+ let print_and_return_result (res, cost_labels) =
+ if debug then Printf.printf "Result = %s\n%!"
+ (IntValue.Int32.to_string res) ;
+ (res, cost_labels) in
+ if debug then print_state lbls_offs st ;
+ match fetch_stmt lbls_offs st with
+ | ERTL.St_return ret_regs when Val.eq_address (get_ra st) st.exit ->
+ print_and_return_result (compute_result st ret_regs, List.rev st.trace)
+ | stmt ->
+ let st' = interpret_stmt lbls_offs st stmt in
+ iter_small_step debug lbls_offs st'
+
+
+let add_global_vars =
+ List.fold_left
+ (fun mem (id, size) -> Mem.add_var mem id (AST.SQ (AST.QInt size)) None)
+
+let add_fun_defs =
+ List.fold_left (fun mem (f_id, f_def) -> Mem.add_fun_def mem f_id f_def)
+
+let init_prog (st : state) (p : ERTL.program) : state =
+ let mem = add_global_vars (add_fun_defs st.mem p.ERTL.functs) p.ERTL.vars in
+ change_mem st mem
+
+let init_sp st =
+ let (mem, sp) = Mem.alloc st.mem I8051.ext_ram_size in
+ let sp =
+ Val.change_address_offset sp (Val.Offset.of_int I8051.ext_ram_size) in
+ let st = change_mem st mem in
+ (st, sp)
+
+let init_isp st =
+ let (mem, isp) = Mem.alloc st.mem I8051.int_ram_size in
+ let st = change_mem (change_isp st isp) mem in
+ let (mem, exit) = Mem.alloc st.mem 1 in
+ let st = change_exit st exit in
+ let st = push st (List.nth exit 0) in
+ let st = push st (List.nth exit 1) in
+ st
+
+let init_renv st sp =
+ let f r renv = I8051.RegisterMap.add r Val.undef renv in
+ let renv = I8051.RegisterSet.fold f I8051.registers I8051.RegisterMap.empty in
+ let spl = List.nth sp 0 in
+ let sph = List.nth sp 1 in
+ let renv = I8051.RegisterMap.add I8051.sph sph renv in
+ let renv = I8051.RegisterMap.add I8051.spl spl renv in
+ change_renv st renv
+
+let init_main_call lbls_offs st main =
+ let ptr = Mem.find_global st.mem main in
+ match Mem.find_fun_def st.mem ptr with
+ | ERTL.F_int def ->
+ init_fun_call lbls_offs st ptr def
+ | _ -> error ("Cannot execute the main (\"" ^ main ^ "\"): it is external.")
+
+
+(* Before interpreting, the environment is initialized:
+ - Build a bijection between the labels in the program and some values (taken
+ amongst the offsets).
+ - Add function definitions to the memory and reserve space for the globals.
+ - Allocate memory to emulate the external stack and initialize the external
+ stack pointer.
+ - Allocate memory to emulate the internal stack and initialize the internal
+ stack pointer.
+ - Initialiaze the physical register environment. All are set to 0, except for
+ the stack pointer registers that take the high and low bits of the external
+ stack pointer.
+ - Initialize a call to the main (set the current program counter to the
+ beginning of the function).
+ - Initialize the carry flag to 0. *)
+
+let interpret debug p =
+ Printf.printf "*** ERTL interpret ***\n%!" ;
+ match p.ERTL.main with
+ | None -> (IntValue.Int32.zero, [])
+ | Some main ->
+ let lbls_offs = labels_offsets p in
+ let st = empty_state in
+ let st = init_prog st p in
+ let (st, sp) = init_sp st in
+ let st = init_isp st in
+ let st = init_renv st sp in
+ let st = init_main_call lbls_offs st main in
+ let st = change_carry st Val.zero in
+ iter_small_step debug lbls_offs st
--- /dev/null
+
+(** This module provides an interpreter for the [ERTL] language. *)
+
+val interpret : bool -> ERTL.program -> AST.trace
--- /dev/null
+
+(** This module provides a function to print [ERTL] programs. *)
+
+
+let n_spaces n = String.make n ' '
+
+
+let print_global n (x, size) =
+ Printf.sprintf "%s\"%s\" [%d]" (n_spaces n) x size
+
+let print_globals eformat n globs =
+ Eformat.printf eformat "%sglobals:\n" (n_spaces n) ;
+ List.iter
+ (fun g -> Eformat.printf eformat "%s\n" (print_global (n+2) g)) globs
+
+
+let reg_set_to_list rs =
+ let f r l = l @ [r] in
+ Register.Set.fold f rs []
+
+let print_reg_list first last sep f rl =
+ Printf.sprintf "%s%s%s"
+ first (MiscPottier.string_of_list sep f rl) last
+
+let print_ptr rl = print_reg_list "[" "]" " ; " Register.print rl
+
+let print_args rl = print_reg_list "(" ")" ", " Register.print rl
+
+let print_return rl = print_reg_list "[" "]" " ; " Register.print rl
+
+let print_params rl = print_reg_list "(" ")" ", " Register.print rl
+
+let print_locals rs =
+ let rl = reg_set_to_list rs in
+ Printf.sprintf "%s" (print_reg_list "" "" ", " Register.print rl)
+
+let print_result rl = print_reg_list "[" "]" " ; " Register.print rl
+
+
+let print_statement = function
+ | ERTL.St_skip lbl -> "--> " ^ lbl
+ | ERTL.St_comment (s, lbl) ->
+ Printf.sprintf "*** %s *** --> %s" s lbl
+ | ERTL.St_cost (cost_lbl, lbl) ->
+ Printf.sprintf "emit %s --> %s" cost_lbl lbl
+ | ERTL.St_get_hdw (r1, r2, lbl) ->
+ Printf.sprintf "move %s, %s --> %s"
+ (Register.print r1) (I8051.print_register r2) lbl
+ | ERTL.St_set_hdw (r1, r2, lbl) ->
+ Printf.sprintf "move %s, %s --> %s"
+ (I8051.print_register r1) (Register.print r2) lbl
+ | ERTL.St_hdw_to_hdw (r1, r2, lbl) ->
+ Printf.sprintf "move %s, %s --> %s"
+ (I8051.print_register r1) (I8051.print_register r2) lbl
+ | ERTL.St_newframe lbl ->
+ Printf.sprintf "newframe --> %s" lbl
+ | ERTL.St_delframe lbl ->
+ Printf.sprintf "delframe --> %s" lbl
+ | ERTL.St_framesize (r, lbl) ->
+ Printf.sprintf "imm %s, FRAMESIZE --> %s" (Register.print r) lbl
+ | ERTL.St_pop (r, lbl) ->
+ Printf.sprintf "pop %s --> %s" (Register.print r) lbl
+ | ERTL.St_push (r, lbl) ->
+ Printf.sprintf "push %s --> %s" (Register.print r) lbl
+ | ERTL.St_addrH (dstr, id, lbl) ->
+ Printf.sprintf "addrH %s, %s --> %s" (Register.print dstr) id lbl
+ | ERTL.St_addrL (dstr, id, lbl) ->
+ Printf.sprintf "addrL %s, %s --> %s" (Register.print dstr) id lbl
+ | ERTL.St_int (dstr, i, lbl) ->
+ Printf.sprintf "imm %s, %d --> %s" (Register.print dstr) i lbl
+ | ERTL.St_move (dstr, srcr, lbl) ->
+ Printf.sprintf "move %s, %s --> %s"
+ (Register.print dstr) (Register.print srcr) lbl
+ | ERTL.St_opaccsA (opaccs, dstr, srcr1, srcr2, lbl) ->
+ Printf.sprintf "%sA %s, %s, %s --> %s"
+ (I8051.print_opaccs opaccs)
+ (Register.print dstr)
+ (Register.print srcr1)
+ (Register.print srcr2)
+ lbl
+ | ERTL.St_opaccsB (opaccs, dstr, srcr1, srcr2, lbl) ->
+ Printf.sprintf "%sB %s, %s, %s --> %s"
+ (I8051.print_opaccs opaccs)
+ (Register.print dstr)
+ (Register.print srcr1)
+ (Register.print srcr2)
+ lbl
+ | ERTL.St_op1 (op1, dstr, srcr, lbl) ->
+ Printf.sprintf "%s %s, %s --> %s"
+ (I8051.print_op1 op1)
+ (Register.print dstr)
+ (Register.print srcr)
+ lbl
+ | ERTL.St_op2 (op2, dstr, srcr1, srcr2, lbl) ->
+ Printf.sprintf "%s %s, %s, %s --> %s"
+ (I8051.print_op2 op2)
+ (Register.print dstr)
+ (Register.print srcr1)
+ (Register.print srcr2)
+ lbl
+ | ERTL.St_clear_carry lbl ->
+ Printf.sprintf "clear CARRY --> %s" lbl
+ | ERTL.St_set_carry lbl ->
+ Printf.sprintf "set CARRY --> %s" lbl
+ | ERTL.St_load (dstr, addr1, addr2, lbl) ->
+ Printf.sprintf "load %s, (%s, %s) --> %s"
+ (Register.print dstr)
+ (Register.print addr1)
+ (Register.print addr2)
+ lbl
+ | ERTL.St_store (addr1, addr2, srcr, lbl) ->
+ Printf.sprintf "store (%s, %s), %s --> %s"
+ (Register.print addr1)
+ (Register.print addr2)
+ (Register.print srcr)
+ lbl
+ | ERTL.St_call_id (f, nb_args, lbl) ->
+ Printf.sprintf "call \"%s\", %d --> %s" f nb_args lbl
+ | ERTL.St_call_ptr (f1, f2, nb_args, lbl) ->
+ Printf.sprintf "call_ptr [%s ; %s], %d --> %s"
+ (Register.print f1)
+ (Register.print f2)
+ nb_args
+ lbl
+(*
+ | ERTL.St_tailcall_id (f, nb_args) ->
+ Printf.sprintf "tailcall \"%s\", %d"
+ f
+ nb_args
+ | ERTL.St_tailcall_ptr (f, args) ->
+ Printf.sprintf "tailcall_ptr %s, %s"
+ (print_ptr f)
+ (print_args args)
+*)
+ | ERTL.St_cond (srcr, lbl_true, lbl_false) ->
+ Printf.sprintf "branch %s <> 0 --> %s, %s"
+ (Register.print srcr) lbl_true lbl_false
+ | ERTL.St_return ret_regs ->
+ Printf.sprintf "return %s" (print_return ret_regs)
+
+
+let print_graph eformat n c =
+ let f lbl stmt =
+ Eformat.printf eformat "%s%s: %s\n"
+ (n_spaces n)
+ lbl
+ (print_statement stmt) in
+ Label.Map.iter f c
+
+
+let print_internal_decl eformat n f def =
+ Eformat.printf eformat
+ "%s\"%s\" %d\n%slocals: %s\n%sstacksize: %d\n%sentry: %s\n%sexit: %s\n\n"
+ (n_spaces n)
+ f
+ def.ERTL.f_params
+ (n_spaces (n+2))
+ (print_locals def.ERTL.f_locals)
+ (n_spaces (n+2))
+ def.ERTL.f_stacksize
+ (n_spaces (n+2))
+ def.ERTL.f_entry
+ (n_spaces (n+2))
+ def.ERTL.f_exit ;
+ print_graph eformat (n+2) def.ERTL.f_graph
+
+
+let print_external_decl eformat n f def =
+ Eformat.printf eformat "%sextern \"%s\": %s\n"
+ (n_spaces n)
+ f
+ (Primitive.print_sig def.AST.ef_sig)
+
+
+let print_fun_decl eformat n (f, def) = match def with
+ | ERTL.F_int def -> print_internal_decl eformat n f def
+ | ERTL.F_ext def -> print_external_decl eformat n f def
+
+let print_fun_decls eformat n functs =
+ List.iter
+ (fun f -> print_fun_decl eformat n f ; Eformat.printf eformat "\n\n")
+ functs
+
+
+let print_program p =
+ let eformat = Eformat.create () in
+ Eformat.printf eformat "program:\n\n\n" ;
+ print_globals eformat 2 p.ERTL.vars ;
+ Eformat.printf eformat "\n\n" ;
+ print_fun_decls eformat 2 p.ERTL.functs ;
+ Eformat.get eformat
--- /dev/null
+
+(** This module provides a function to print [ERTL] programs. *)
+
+val print_program : ERTL.program -> string
--- /dev/null
+
+(* This module provides a translation of ERTL programs to LTL
+ programs. *)
+
+(* Adapted from Pottier's PP compiler *)
+
+let translate_internal f (int_fun : ERTL.internal_function)
+ : LTL.internal_function =
+
+ (* Allocate a reference that will hold the control flow
+ graph. Define a function that generates a statement at a fresh
+ label. *)
+
+ let graph = ref Label.Map.empty in
+
+ let fresh_label () = Label.Gen.fresh int_fun.ERTL.f_luniverse in
+
+ let add_graph lbl stmt = graph := Label.Map.add lbl stmt !graph in
+
+ let generate stmt =
+ let l = fresh_label () in
+ add_graph l stmt ;
+ l in
+
+ (* Build an interference graph for this function, and color
+ it. Define a function that allows consulting the coloring. *)
+
+ let module G = struct
+ let liveafter, graph = Build.build int_fun
+ let uses = Uses.examine_internal int_fun
+ let verbose = false
+ let () =
+ if verbose then
+ Printf.printf "Starting hardware register allocation for %s.\n" f
+ end in
+
+ let module C = Coloring.Color (G) in
+
+ let lookup r =
+ Interference.Vertex.Map.find (Interference.lookup G.graph r) C.coloring
+ in
+
+ (* Restrict the interference graph to concern spilled vertices only,
+ and color it again, this time using stack slots as colors. *)
+
+ let module H = struct
+ let graph = Interference.droph (Interference.restrict G.graph (fun v ->
+ match Interference.Vertex.Map.find v C.coloring with
+ | Coloring.Spill ->
+ true
+ | Coloring.Color _ ->
+ false
+ ))
+ let verbose = false
+ let () =
+ if verbose then
+ Printf.printf "Starting stack slot allocation for %s.\n" f
+ end in
+
+ let module S = Spill.Color (H) in
+
+ (* Define a new function that consults both colorings at once. *)
+
+ let lookup r =
+ match lookup r with
+ | Coloring.Spill ->
+ ERTLToLTLI.Spill (Interference.Vertex.Map.find (Interference.lookup H.graph r) S.coloring)
+ | Coloring.Color color ->
+ ERTLToLTLI.Color color
+ in
+
+ (* We are now ready to instantiate the functor that deals with the
+ translation of instructions. The reason why we make this a
+ separate functor is purely pedagogical. Smaller modules are
+ easier to understand. *)
+
+ (* We add the additional stack size required for spilled register to the stack
+ size previously required for the function: this is the final stack size
+ required for the locals. *)
+
+ let locals = S.locals + int_fun.ERTL.f_stacksize in
+
+ (* The full stack size is then the size of the locals in the stack plus the
+ size of the formal parameters of the function. *)
+
+ let stacksize = int_fun.ERTL.f_params + locals in
+
+ let module I = ERTLToLTLI.Make (struct
+ let lookup = lookup
+ let generate = generate
+ let fresh_label = fresh_label
+ let add_graph = add_graph
+ let locals = locals
+ let stacksize = stacksize
+ end) in
+
+ (* Translate the instructions in the existing control flow graph.
+ Pure instructions whose destination pseudo-register is dead are
+ eliminated on the fly. *)
+
+ let () =
+ Label.Map.iter (fun label stmt ->
+ let stmt =
+ match Liveness.eliminable (G.liveafter label) stmt with
+ | Some successor ->
+ LTL.St_skip successor
+ | None ->
+ I.translate_statement stmt
+ in
+ graph := Label.Map.add label stmt !graph
+ ) int_fun.ERTL.f_graph
+ in
+
+ AnnotStackSize.add_stack_size f stacksize;
+ (* Build a [LTL] function. *)
+
+ {
+ LTL.f_luniverse = int_fun.ERTL.f_luniverse;
+ LTL.f_stacksize = stacksize ;
+ LTL.f_entry = int_fun.ERTL.f_entry;
+ LTL.f_exit = int_fun.ERTL.f_exit;
+ LTL.f_graph = !graph
+ }
+
+
+let translate_funct (name, def) =
+ let def' = match def with
+ | ERTL.F_int def -> LTL.F_int (translate_internal name def)
+ | ERTL.F_ext def -> LTL.F_ext def in
+ (name, def')
+
+let translate (p : ERTL.program) : LTL.program =
+ { LTL.vars = p.ERTL.vars;
+ LTL.functs = List.map translate_funct p.ERTL.functs ;
+ LTL.main = p.ERTL.main }
--- /dev/null
+
+(** This module is the external part of the translation of [ERTL]
+ programs into [LTL] programs. *)
+
+(** The translation consists in the following operations:
+ - Build an interference graph and color it. This process relies an a
+ liveness analysis and allows to associate a physical location to each
+ pseudo-register.
+ - Do the actual translation by removing the statements whose written
+ register is dead (using the results of the liveness analysis). *)
+
+val translate : ERTL.program -> LTL.program
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(* This module translates [ERTL] statements into [LTL] statements. It is
+ parameterized over a module [Env], whose signature appears below, which
+ provides support for mapping pseudo-registers to stack slots or hardware
+ registers and for generating instructions (which requires allocating fresh
+ control flow graph labels). *)
+
+type decision =
+ | Spill of AST.immediate
+ | Color of I8051.register
+
+module Make (Env : sig
+
+ val lookup: Register.t -> decision
+
+ (* [generate stmt] returns a fresh statement label, which it associates with
+ [stmt] in the control flow graph. *)
+
+ val generate: LTL.statement -> Label.t
+
+ val fresh_label: unit -> Label.t
+
+ val add_graph: Label.t -> LTL.statement -> unit
+
+ val locals: int
+
+ val stacksize: int
+
+end) = struct
+
+ open Env
+ open I8051
+
+ let adjust off = locals - (off + I8051.int_size)
+
+ let get_stack r off l =
+ let off = adjust off in
+ let l = generate (LTL.St_from_acc (r, l)) in
+ let l = generate (LTL.St_load l) in
+ let l = generate (LTL.St_from_acc (I8051.dph, l)) in
+ let l = generate (LTL.St_op2 (I8051.Addc, I8051.sph, l)) in
+ let l = generate (LTL.St_int (I8051.a, 0, l)) in
+ let l = generate (LTL.St_from_acc (I8051.dpl, l)) in
+ let l = generate (LTL.St_op2 (I8051.Add, I8051.spl, l)) in
+ LTL.St_int (I8051.a, off, l)
+
+ let set_stack off r l =
+ let off = adjust off in
+ let l = generate (LTL.St_store l) in
+ let l = generate (LTL.St_to_acc (r, l)) in
+ let l = generate (LTL.St_from_acc (I8051.dph, l)) in
+ let l = generate (LTL.St_op2 (I8051.Addc, I8051.sph, l)) in
+ let l = generate (LTL.St_int (I8051.a, 0, l)) in
+ let l = generate (LTL.St_from_acc (I8051.dpl, l)) in
+ let l = generate (LTL.St_op2 (I8051.Add, I8051.spl, l)) in
+ LTL.St_int (I8051.a, off, l)
+
+
+ let write (r : Register.t) (l : Label.t) : (I8051.register * Label.t) =
+ match lookup r with
+
+ | Color hwr ->
+ (* Pseudo-register [r] has been mapped to hardware register
+ [hwr]. Just write into [hwr] and branch to [l]. *)
+ (hwr, l)
+
+ | Spill off ->
+ (* Pseudo-register [r] has been mapped to offset [off] in the local zone
+ of the stack. Then, write into [sst] (never allocated) and transfer
+ control to an instruction that copies [sst] in the designated
+ location of the stack before branching to [l]. *)
+ (I8051.sst, generate (set_stack off I8051.sst l))
+
+
+ let read (r : Register.t) (stmt : I8051.register -> LTL.statement) =
+ match lookup r with
+ | Color hwr ->
+ (* Pseudo-register [r] has been mapped to hardware register [hwr]. Just
+ generate statement [stmt] with a reference to register [hwr]. *)
+ generate (stmt hwr)
+
+ | Spill off ->
+ (* Pseudo-register [r] has been mapped to offset [off] in the local zone
+ of the stack. Issue a statement that copies the designated area in
+ the stack into the temporary unallocatable hardware register [sst],
+ then generate statement [stmt] with a reference to register
+ [sst]. *)
+ let temphwr = I8051.sst in
+ let l = generate (stmt temphwr) in
+ generate (get_stack temphwr off l)
+
+
+ let move (dest : decision) (src : decision) l =
+ match dest, src with
+
+ (* Both pseudo-registers are translated to hardware registers. Issue move
+ statements, or no statement at all if both pseudo-registers reside in
+ the same hardware register. *)
+ | Color desthwr, Color sourcehwr when I8051.eq_reg desthwr sourcehwr ->
+ LTL.St_skip l
+ | Color desthwr, Color sourcehwr ->
+ let l = generate (LTL.St_from_acc (desthwr, l)) in
+ LTL.St_to_acc (sourcehwr, l)
+
+ (* One pseudo-register is translated to a hardware register, while the
+ other is spilled. Issue a single stack access instruction. *)
+ | Color desthwr, Spill off -> get_stack desthwr off l
+ | Spill off, Color sourcehwr -> set_stack off sourcehwr l
+
+ (* Both pseudo-registers are spilled. Combine the previous two cases. Of
+ course, if the two pseudo-registers have been spilled into the same
+ stack slot, there is nothing to do. *)
+ | Spill off1, Spill off2 when off1 = off2 ->
+ LTL.St_skip l
+ | Spill off1, Spill off2 ->
+ let temphwr = I8051.sst in
+ let l = generate (set_stack off1 temphwr l) in
+ get_stack temphwr off2 l
+
+
+ let newframe l =
+ if stacksize = 0 then LTL.St_skip l
+ else
+ let l = generate (LTL.St_from_acc (I8051.sph, l)) in
+ let l = generate (LTL.St_op2 (I8051.Sub, I8051.dph, l)) in
+ let l = generate (LTL.St_int (I8051.dph, 0, l)) in
+ let l = generate (LTL.St_to_acc (I8051.sph, l)) in
+ let l = generate (LTL.St_from_acc (I8051.spl, l)) in
+ let l = generate (LTL.St_op2 (I8051.Sub, I8051.dpl, l)) in
+ let l = generate (LTL.St_clear_carry l) in
+ let l = generate (LTL.St_int (I8051.dpl, stacksize, l)) in
+ LTL.St_to_acc (I8051.spl, l)
+
+ let delframe l =
+ if stacksize = 0 then LTL.St_skip l
+ else
+ let l = generate (LTL.St_from_acc (I8051.sph, l)) in
+ let l = generate (LTL.St_op2 (I8051.Addc, I8051.sph, l)) in
+ let l = generate (LTL.St_int (I8051.a, 0, l)) in
+ let l = generate (LTL.St_from_acc (I8051.spl, l)) in
+ let l = generate (LTL.St_op2 (I8051.Add, I8051.spl, l)) in
+ LTL.St_int (I8051.a, stacksize, l)
+
+
+ (* ------------------------------------------------------------------------ *)
+
+ (* [translate_statement] turns a [ERTL] statement into a [LTL] statement, or
+ sequence of statements, that transfers control to the same label(s).
+
+ Existing statement labels are preserved, that is, the labels in the new
+ control flow graph form a superset of the labels in the existing control
+ flow graph. *)
+
+ let translate_statement (stmt : ERTL.statement) : LTL.statement =
+ match stmt with
+
+ | ERTL.St_skip l ->
+ LTL.St_skip l
+
+ | ERTL.St_comment (s, l) ->
+ LTL.St_comment (s, l)
+
+ | ERTL.St_cost (cost_lbl, l) ->
+ LTL.St_cost (cost_lbl, l)
+
+ | ERTL.St_get_hdw (destr, sourcehwr, l) ->
+ move (lookup destr) (Color sourcehwr) l
+
+ | ERTL.St_set_hdw (desthwr, sourcer, l) ->
+ move (Color desthwr) (lookup sourcer) l
+
+ | ERTL.St_hdw_to_hdw (r1, r2, l) ->
+ let l = generate (LTL.St_from_acc (r1, l)) in
+ LTL.St_to_acc (r2, l)
+
+ | ERTL.St_newframe l ->
+ newframe l
+
+ | ERTL.St_delframe l ->
+ delframe l
+
+ | ERTL.St_framesize (r, l) ->
+ let (hdw, l) = write r l in
+ LTL.St_int (hdw, stacksize, l)
+
+ | ERTL.St_pop (r, l) ->
+ let (hdw, l) = write r l in
+ let l = generate (LTL.St_from_acc (hdw, l)) in
+ LTL.St_pop l
+
+ | ERTL.St_push (r, l) ->
+ let l = generate (LTL.St_push l) in
+ let l = read r (fun hdw -> LTL.St_to_acc (hdw, l)) in
+ LTL.St_skip l
+
+ | ERTL.St_addrH (r, x, l) ->
+ let (hdw, l) = write r l in
+ let l = generate (LTL.St_from_acc (hdw, l)) in
+ let l = generate (LTL.St_to_acc (I8051.dph, l)) in
+ LTL.St_addr (x, l)
+
+ | ERTL.St_addrL (r, x, l) ->
+ let (hdw, l) = write r l in
+ let l = generate (LTL.St_from_acc (hdw, l)) in
+ let l = generate (LTL.St_to_acc (I8051.dpl, l)) in
+ LTL.St_addr (x, l)
+
+ | ERTL.St_int (r, i, l) ->
+ let (hdw, l) = write r l in
+ LTL.St_int (hdw, i, l)
+
+ | ERTL.St_move (r1, r2, l) ->
+ move (lookup r1) (lookup r2) l
+
+ | ERTL.St_opaccsA (opaccs, destr, srcr1, srcr2, l) ->
+ let (hdw, l) = write destr l in
+ let l = generate (LTL.St_from_acc (hdw, l)) in
+ let l = generate (LTL.St_opaccs (opaccs, l)) in
+ let l = read srcr1 (fun hdw -> LTL.St_to_acc (hdw, l)) in
+ let l = generate (LTL.St_from_acc (I8051.b, l)) in
+ let l = read srcr2 (fun hdw -> LTL.St_to_acc (hdw, l)) in
+ LTL.St_skip l
+
+ | ERTL.St_opaccsB (opaccs, destr, srcr1, srcr2, l) ->
+ let (hdw, l) = write destr l in
+ let l = generate (LTL.St_from_acc (hdw, l)) in
+ let l = generate (LTL.St_to_acc (I8051.b, l)) in
+ let l = generate (LTL.St_opaccs (opaccs, l)) in
+ let l = read srcr1 (fun hdw -> LTL.St_to_acc (hdw, l)) in
+ let l = generate (LTL.St_from_acc (I8051.b, l)) in
+ let l = read srcr2 (fun hdw -> LTL.St_to_acc (hdw, l)) in
+ LTL.St_skip l
+
+ | ERTL.St_op1 (op1, destr, srcr, l) ->
+ let (hdw, l) = write destr l in
+ let l = generate (LTL.St_from_acc (hdw, l)) in
+ let l = generate (LTL.St_op1 (op1, l)) in
+ let l = read srcr (fun hdw -> LTL.St_to_acc (hdw, l)) in
+ LTL.St_skip l
+
+ | ERTL.St_op2 (op2, destr, srcr1, srcr2, l) ->
+ let (hdw, l) = write destr l in
+ let l = generate (LTL.St_from_acc (hdw, l)) in
+ let l = generate (LTL.St_op2 (op2, I8051.b, l)) in
+ let l = read srcr1 (fun hdw -> LTL.St_to_acc (hdw, l)) in
+ let l = generate (LTL.St_from_acc (I8051.b, l)) in
+ let l = read srcr2 (fun hdw -> LTL.St_to_acc (hdw, l)) in
+ LTL.St_skip l
+
+ | ERTL.St_clear_carry l ->
+ LTL.St_clear_carry l
+
+ | ERTL.St_set_carry l ->
+ LTL.St_set_carry l
+
+ | ERTL.St_load (destr, addr1, addr2, l) ->
+ let (hdw, l) = write destr l in
+ let l = generate (LTL.St_from_acc (hdw, l)) in
+ let l = generate (LTL.St_load l) in
+ let l = generate (LTL.St_from_acc (I8051.dph, l)) in
+ let l = generate (LTL.St_to_acc (I8051.st0, l)) in
+ let l = generate (LTL.St_from_acc (I8051.dpl, l)) in
+ let l = read addr1 (fun hdw -> LTL.St_to_acc (hdw, l)) in
+ let l = generate (LTL.St_from_acc (I8051.st0, l)) in
+ let l = read addr2 (fun hdw -> LTL.St_to_acc (hdw, l)) in
+ LTL.St_skip l
+
+ | ERTL.St_store (addr1, addr2, srcr, l) ->
+ let l = generate (LTL.St_store l) in
+ let l = generate (LTL.St_to_acc (I8051.st1, l)) in
+ let l = generate (LTL.St_from_acc (I8051.dph, l)) in
+ let l = generate (LTL.St_to_acc (I8051.st0, l)) in
+ let l = generate (LTL.St_from_acc (I8051.dpl, l)) in
+ let l = read addr1 (fun hdw -> LTL.St_to_acc (hdw, l)) in
+ let l = generate (LTL.St_from_acc (I8051.st0, l)) in
+ let l = read addr2 (fun hdw -> LTL.St_to_acc (hdw, l)) in
+ let l = generate (LTL.St_from_acc (I8051.st1, l)) in
+ let l = read srcr (fun hdw -> LTL.St_to_acc (hdw, l)) in
+ LTL.St_skip l
+
+ | ERTL.St_call_id (f, _, l) ->
+ LTL.St_call_id (f, l)
+
+ | ERTL.St_call_ptr (f1, f2, _, l) ->
+ let l = generate (LTL.St_call_ptr l) in
+ let l = generate (LTL.St_from_acc (I8051.dph, l)) in
+ let l = generate (LTL.St_to_acc (I8051.st0, l)) in
+ let l = generate (LTL.St_from_acc (I8051.dpl, l)) in
+ let l = read f1 (fun hdw -> LTL.St_to_acc (hdw, l)) in
+ let l = generate (LTL.St_from_acc (I8051.st0, l)) in
+ let l = read f2 (fun hdw -> LTL.St_to_acc (hdw, l)) in
+ LTL.St_skip l
+
+ | ERTL.St_cond (srcr, lbl_true, lbl_false) ->
+ let l = generate (LTL.St_condacc (lbl_true, lbl_false)) in
+ let l = read srcr (fun hdw -> LTL.St_to_acc (hdw, l)) in
+ LTL.St_skip l
+
+ | ERTL.St_return _ ->
+ LTL.St_return
+
+(* ------------------------------------------------------------------------- *)
+
+end
--- /dev/null
+
+(** This module is the central part of the translation of [ERTL]
+ programs into [LTL] programs. *)
+
+(* Pasted from Pottier's PP compiler *)
+
+(* This module translates [ERTL] statements into [LTL] statements. It is
+ parameterized over a module [Env], whose signature appears below, which
+ provides support for mapping pseudo-registers to stack slots or hardware
+ registers and for generating instructions (which requires allocating fresh
+ control flow graph labels). *)
+
+type decision =
+ | Spill of AST.immediate
+ | Color of I8051.register
+
+module Make (Env : sig
+
+ val lookup: Register.t -> decision
+
+ (* [generate instruction] returns a fresh instruction label, which
+ it associates with [instruction] in the control flow graph. *)
+
+ val generate: LTL.statement -> Label.t
+
+ val fresh_label: unit -> Label.t
+
+ val add_graph: Label.t -> LTL.statement -> unit
+
+ val locals: int
+
+ val stacksize: int
+
+ end) : sig
+
+ (* [translate_statement] turns a [ERTL] statement into a [LTL] statement, or
+ sequence of statements, that transfers control to the same label(s).
+
+ Existing statement labels are preserved, that is, the labels in
+ the new control flow graph form a superset of the labels in the
+ existing control flow graph. *)
+
+ val translate_statement: ERTL.statement -> LTL.statement
+
+end
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+open ERTL
+open Interference
+
+let build (int_fun : internal_function) =
+
+ (* Perform liveness analysis. *)
+
+ let liveafter = Liveness.analyze int_fun in
+
+ (* Create an interference graph whose vertices are the procedure's
+ pseudo-registers. This graph initially has no edges. *)
+
+ let graph = create int_fun.f_locals in
+
+ (* Every pseudo register interferes with special forbidden registers. *)
+
+ let graph = mkiph graph int_fun.f_locals I8051.forbidden in
+
+ (* Iterate over all statements in the control flow graph and populate the
+ interference graph with interference and preference edges. *)
+
+ let graph =
+ Label.Map.fold (fun label stmt graph ->
+ let live = liveafter label in
+ match Liveness.eliminable live stmt with
+
+ | Some _ ->
+
+ (* This statement is eliminable and should be ignored. Eliminable
+ statements have not been eliminated yet, because we are still
+ in between ERTL and LTL. They *will* be eliminated soon, though,
+ so there is no reason to take them into account while building
+ the interference graph. *)
+
+ graph
+
+ | None ->
+
+ (* Create interference edges. The general rule is, every
+ pseudo-register or hardware register that is defined (written) by
+ a statement interferes with every pseudo-register or hardware
+ register (other than itself) that is live immediately after the
+ statement executes.
+
+ An exception to the general rule can be made for move
+ statements. In a move statement, we do not need the source
+ and destination pseudo-registers to be assigned distinct hardware
+ registers, since they contain the same value -- in fact, we would
+ like them to be assigned the same hardware register. So, for a
+ move statement, we let the register that is defined (written)
+ interfere with every pseudo-register, other than itself *and
+ other than the source pseudo-register*, that is live immediately
+ after the statement executes. This optimization is explained in
+ Chapter 10 of Appel's book (p. 221).
+
+ This special case is only a hack that works in many cases. There
+ are cases where it doesn't suffice. For instance, if two
+ successive move statements have the same source [r0], then
+ their destinations [r1] and [r2] *will* be considered as
+ interfering, even though it would in fact be correct and
+ desirable to map both of them to the same hardware register. A
+ more general solution would be to perform a static analysis that
+ determines, for every program point, which pseudo-registers
+ definitely hold the same value, and to exploit this information
+ to build fewer interference edges. *)
+
+ let defined = Liveness.defined stmt in
+ let exceptions =
+ match stmt with
+ | St_move (_, sourcer, _)
+ | St_set_hdw (_, sourcer, _) ->
+ Liveness.L.psingleton sourcer
+ | St_get_hdw (_, sourcehwr, _) ->
+ Liveness.L.hsingleton sourcehwr
+ | _ ->
+ Liveness.L.bottom
+ in
+ let graph =
+ mki graph (Liveness.L.diff live exceptions) defined
+ in
+
+(*
+ (* Two registers written at the same time are interfering (they
+ obviously should not be associated the same address).
+ Only happens with St_addr. *)
+
+ let graph =
+ match stmt with
+ | St_addr (r1, r2, _, _) ->
+ mki graph (Liveness.L.psingleton r1) (Liveness.L.psingleton r2)
+ | _ ->
+ graph
+ in
+*)
+
+ (* Create preference edges between pseudo-registers. Two registers
+ should preferably be assigned the same color when they are
+ related by a move statement, so that the move statement can
+ be eliminated. *)
+
+ let graph =
+ match stmt with
+ | St_move (r1, r2, _) ->
+ mkppp graph r1 r2
+ | St_get_hdw (r, hwr, _)
+ | St_set_hdw (hwr, r, _) ->
+ mkpph graph r hwr
+ | _ ->
+ graph
+ in
+ (*
+
+ (* Add interference edges between the hardware register [$zero]
+ and every pseudo-register that the statement renders
+ nonzeroable. See [Zero] for an explanation. *)
+
+ let graph =
+ mkiph graph (Zero.nonzeroable i) (MIPS.RegisterSet.singleton MIPS.zero)
+ in
+ *)
+ graph
+
+ ) int_fun.f_graph graph
+ in
+
+ (* Done. *)
+
+ liveafter, graph
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(** This module builds an interference graph for an [ERTL] function.
+ This is done by running a liveness analysis and exploiting its
+ result. [build] returns both the result of the liveness analysis
+ and the interference graph. *)
+
+val build: ERTL.internal_function -> Liveness.valuation * Interference.graph
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+open ERTL
+
+(* In the following, a ``variable'' means a pseudo-register or an
+ allocatable hardware register. *)
+
+(* These functions allow turning an [ERTL] control flow graph into an
+ explicit graph, that is, making successor edges explicit. This is
+ useful in itself and facilitates the computation of predecessor
+ edges. *)
+
+let statement_successors (stmt : statement) =
+ match stmt with
+ | St_return _ ->
+ Label.Set.empty
+ | St_skip l
+ | St_comment (_, l)
+ | St_cost (_, l)
+ | St_set_hdw (_, _, l)
+ | St_get_hdw (_, _, l)
+ | St_hdw_to_hdw (_, _, l)
+ | St_newframe l
+ | St_delframe l
+ | St_framesize (_, l)
+ | St_push (_, l)
+ | St_pop (_, l)
+ | St_addrH (_, _, l)
+ | St_addrL (_, _, l)
+ | St_int (_, _, l)
+ | St_move (_, _, l)
+ | St_opaccsA (_, _, _, _, l)
+ | St_opaccsB (_, _, _, _, l)
+ | St_op1 (_, _, _, l)
+ | St_op2 (_, _, _, _, l)
+ | St_clear_carry l
+ | St_set_carry l
+ | St_load (_, _, _, l)
+ | St_store (_, _, _, l)
+ | St_call_id (_, _, l)
+ | St_call_ptr (_, _, _, l) ->
+ Label.Set.singleton l
+ | St_cond (_, l1, l2) ->
+ Label.Set.add l1 (Label.Set.singleton l2)
+
+(* The analysis uses the lattice of sets of variables. The lattice's
+ join operation is pointwise set union, which reflects the fact that
+ a variable is deemed live at a program point if and only if it is
+ live at any of the successors of that program point. *)
+
+module L = struct
+
+ (* A set of variable is represented as a pair of a set of
+ pseudo-registers and a set of hardware registers. *)
+
+ type t =
+ Register.Set.t * I8051.RegisterSet.t
+
+ type property =
+ t
+
+ let bottom =
+ Register.Set.empty, I8051.RegisterSet.empty
+
+ let psingleton r =
+ Register.Set.singleton r, I8051.RegisterSet.empty
+
+ let hsingleton hwr =
+ Register.Set.empty, I8051.RegisterSet.singleton hwr
+
+ let join (rset1, hwrset1) (rset2, hwrset2) =
+ (Register.Set.union rset1 rset2, I8051.RegisterSet.union hwrset1 hwrset2)
+
+ let diff (rset1, hwrset1) (rset2, hwrset2) =
+ (Register.Set.diff rset1 rset2, I8051.RegisterSet.diff hwrset1 hwrset2)
+
+ let equal (rset1, hwrset1) (rset2, hwrset2) =
+ Register.Set.equal rset1 rset2 && I8051.RegisterSet.equal hwrset1 hwrset2
+
+ let is_maximal _ =
+ false
+
+end
+
+module Label_ImperativeMap = struct
+
+ type key =
+ Label.Map.key
+
+ type 'data t =
+ 'data Label.Map.t ref
+
+ let create () =
+ ref Label.Map.empty
+
+ let clear t =
+ t := Label.Map.empty
+
+ let add k d t =
+ t := Label.Map.add k d !t
+
+ let find k t =
+ Label.Map.find k !t
+
+ let iter f t =
+ Label.Map.iter f !t
+
+end
+
+module F = Fix.Make (Label_ImperativeMap) (L)
+
+(* These are the sets of variables defined at (written by) a statement. *)
+
+let defined (stmt : statement) : L.t =
+ match stmt with
+ | St_skip _
+ | St_comment _
+ | St_cost _
+ | St_push _
+ | St_store _
+ | St_cond _
+ | St_return _ ->
+ L.bottom
+ | St_clear_carry _
+ | St_set_carry _ ->
+ Register.Set.empty, I8051.RegisterSet.singleton I8051.carry
+ | St_op2 (I8051.Add, r, _, _, _)
+ | St_op2 (I8051.Addc, r, _, _, _)
+ | St_op2 (I8051.Sub, r, _, _, _) ->
+ L.join (L.hsingleton I8051.carry) (L.psingleton r)
+ | St_op1 (I8051.Inc, r, _, _)
+ | St_get_hdw (r, _, _)
+ | St_framesize (r, _)
+ | St_pop (r, _)
+ | St_int (r, _, _)
+ | St_addrH (r, _, _)
+ | St_addrL (r, _, _)
+ | St_move (r, _, _)
+ | St_opaccsA (_, r, _, _, _)
+ | St_opaccsB (_, r, _, _, _)
+ | St_op1 (_, r, _, _)
+ | St_op2 (_, r, _, _, _)
+ | St_load (r, _, _, _) ->
+ L.psingleton r
+ | St_set_hdw (r, _, _)
+ | St_hdw_to_hdw (r, _, _) ->
+ L.hsingleton r
+ | St_call_id _ | St_call_ptr _ ->
+ (* Potentially destroys all caller-save hardware registers. *)
+ Register.Set.empty, I8051.caller_saved
+ | St_newframe _
+ | St_delframe _ ->
+ L.join (L.hsingleton I8051.spl) (L.hsingleton I8051.sph)
+
+let set_of_list rl =
+ List.fold_right I8051.RegisterSet.add rl I8051.RegisterSet.empty
+
+(* This is the set of variables used at (read by) a statement. *)
+
+let set_of_list =
+ let f set r = I8051.RegisterSet.add r set in
+ List.fold_left f I8051.RegisterSet.empty
+
+let ret_regs = set_of_list I8051.rets
+
+let used (stmt : statement) : L.t =
+ match stmt with
+ | St_skip _
+ | St_comment _
+ | St_cost _
+ | St_framesize _
+ | St_pop _
+ | St_addrH _
+ | St_addrL _
+ | St_int _
+ | St_clear_carry _
+ | St_set_carry _ ->
+ L.bottom
+ | St_call_id (_, nparams, _) ->
+ (* Reads the hardware registers that are used to pass parameters. *)
+ Register.Set.empty,
+ set_of_list (MiscPottier.prefix nparams I8051.parameters)
+ | St_call_ptr (r1, r2, nparams, _) ->
+ (* Reads the hardware registers that are used to pass parameters. *)
+ Register.Set.of_list [r1 ; r2],
+ set_of_list (MiscPottier.prefix nparams I8051.parameters)
+ | St_get_hdw (_, r, _)
+ | St_hdw_to_hdw (_, r, _) ->
+ L.hsingleton r
+ | St_set_hdw (_, r, _)
+ | St_push (r, _)
+ | St_move (_, r, _)
+ | St_op1 (_, _, r, _)
+ | St_cond (r, _, _) ->
+ L.psingleton r
+ | St_op2 (I8051.Addc, _, r1, r2, _) ->
+ L.join (L.join (L.psingleton r1) (L.psingleton r2))
+ (L.hsingleton I8051.carry)
+ | St_opaccsA (_, _, r1, r2, _)
+ | St_opaccsB (_, _, r1, r2, _)
+ | St_op2 (_, _, r1, r2, _)
+ | St_load (_, r1, r2, _) ->
+ L.join (L.psingleton r1) (L.psingleton r2)
+ | St_store (r1, r2, r3, _) ->
+ L.join (L.join (L.psingleton r1) (L.psingleton r2)) (L.psingleton r3)
+ | St_newframe _
+ | St_delframe _ ->
+ L.join (L.hsingleton I8051.spl) (L.hsingleton I8051.sph)
+ | St_return _ ->
+ Register.Set.empty, I8051.RegisterSet.union I8051.callee_saved ret_regs
+
+(* A statement is considered pure if it has no side effect, that is, if
+ its only effect is to write a value to its destination variable.
+
+ A pure statement whose destination is dead after the statement will
+ be eliminated during the translation of [ERTL] to [LTL]. This is done by
+ replacing the statement with an [St_skip] statement.
+
+ [eliminable liveafter stmt] returns [Some l], where [l] is [stmt]'s single
+ successor, if statement [stmt] is eliminable. Otherwise, it returns
+ [None]. The parameter [liveafter] is the set of variables that are live
+ after the statement. *)
+
+let eliminable ((pliveafter, hliveafter) : L.t) (stmt : statement) =
+ match stmt with
+ | St_skip _
+ | St_comment _
+ | St_cost _
+ | St_newframe _
+ | St_delframe _
+ | St_pop _
+ | St_push _
+ | St_clear_carry _
+ | St_set_carry _
+ | St_store _
+ | St_call_id _
+ | St_call_ptr _
+ | St_cond _
+ | St_return _ ->
+ None
+ | St_get_hdw (r, _, l)
+ | St_framesize (r, l)
+ | St_int (r, _, l)
+ | St_addrH (r, _, l)
+ | St_addrL (r, _, l)
+ | St_move (r, _, l)
+ | St_opaccsA (_, r, _, _, l)
+ | St_opaccsB (_, r, _, _, l)
+ | St_op1 (_, r, _, l)
+ | St_op2 (_, r, _, _, l)
+ | St_load (r, _, _, l) ->
+ if (Register.Set.mem r pliveafter) ||
+ (I8051.RegisterSet.mem I8051.carry hliveafter) then None else Some l
+ | St_set_hdw (r, _, l)
+ | St_hdw_to_hdw (r, _, l) ->
+ if I8051.RegisterSet.mem r hliveafter then None else Some l
+
+(* This is the abstract semantics of instructions. It defines the
+ variables that are live before the instruction in terms of
+ those that are live after the instruction. *)
+
+(* The standard definition is: a variable is considered live
+ before the instruction if either (1) it is used by the instruction,
+ or (2) it is live after the instruction and not defined by the
+ instruction.
+
+ As an exception to this rule, if the instruction is eliminable,
+ then a variable is considered live before the instruction
+ if and only if it is live after the instruction. This anticipates
+ on the instruction's elimination.
+
+ This exception means that the source variables of a pure
+ instruction need not be considered live if the instruction's result
+ is unused. This allows a sequence of pure instructions whose end
+ result is dead to be considered entirely dead.
+
+ It is a simple, but not entirely trivial, exercise to check that
+ this transfer function is monotone. *)
+
+let statement_semantics (stmt : statement) (liveafter : L.t) : L.t =
+ match eliminable liveafter stmt with
+ | None ->
+ L.join (L.diff liveafter (defined stmt)) (used stmt)
+ | Some _ ->
+ liveafter
+
+(* A valuation is a function that maps a program point (a control flow
+ graph label) to the set of variables that are live after that
+ point. *)
+
+type valuation =
+ Label.t -> L.t
+
+(* This is how we turn an [ERTL] procedure into a liveness analysis
+ problem and solve it. *)
+
+let analyze (int_fun : internal_function) : valuation =
+
+ (* Formulate the problem. Construct a system (recursive) equations
+ that describe the live variables before and after each
+ instruction. *)
+
+ (* The following two functions, [livebefore] and [liveafter],
+ define these equations. Both use an oracle, a valuation --
+ also called [liveafter] -- which is supposed to tell us
+ which variables are live after each label. *)
+
+ (* The live variables before an instruction are computed, using the
+ instruction's semantics, in terms of the live variables after the
+ instruction -- which are given by the oracle. *)
+
+ let livebefore label (liveafter : valuation) : L.t =
+ let stmt : statement = Label.Map.find label int_fun.f_graph in
+ statement_semantics stmt (liveafter label)
+ in
+
+ (* The live variables after an instruction are the union of the live
+ variables before each of the instruction's successors. *)
+
+ let liveafter label (liveafter : valuation) : L.t =
+ let stmt : statement = Label.Map.find label int_fun.f_graph in
+ Label.Set.fold (fun successor accu ->
+ L.join (livebefore successor liveafter) accu
+ ) (statement_successors stmt) L.bottom
+ in
+
+ (* Compute the least fixed point of these recursive equations. *)
+
+ F.lfp liveafter
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(** This module performs liveness analysis over the control flow graph
+ of a single [ERTL] procedure. *)
+
+(* In the following, a ``variable'' means a pseudo-register or an
+ allocatable hardware register. *)
+
+(* We collect liveness information about variables. We are not interested in
+ collecting information about non-allocatable hardware registers such as the
+ stack pointer registers, etc. so they are considered never defined and never
+ used as far as [ERTL] is concerned. *)
+
+open ERTL
+
+(* This is the lattice of sets of variables. *)
+
+module L : sig
+ type t = Register.Set.t * I8051.RegisterSet.t
+ val bottom: t
+ val join: t -> t -> t
+ val equal: t -> t -> bool
+ val diff: t -> t -> t
+ val psingleton: Register.t -> t
+ val hsingleton: I8051.register -> t
+end
+
+(* [defined i] is the set of variables defined at (written by)
+ statement [i]. *)
+
+val defined: statement -> L.t
+
+(* A valuation is a function that maps a program point (a control flow
+ graph label) to the set of variables that are live after that
+ point. *)
+
+type valuation =
+ Label.t -> L.t
+
+(* [analyze int_fun] analyzes the function [int_fun] and returns a valuation. *)
+
+val analyze: internal_function -> valuation
+
+(* Pure instructions whose destination pseudo-register is dead after the
+ instruction will be eliminated during the translation of [ERTL] to [LTL].
+ [eliminable liveafter i] returns [Some successor], where [successor] is
+ [i]'s single successor, if instruction [i] is eliminable. Otherwise, it
+ returns [None]. *)
+
+val eliminable: L.t -> statement -> Label.t option
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+open Interference
+(* open Integer *)
+open Printf
+
+(* ------------------------------------------------------------------------- *)
+(* Colorings. *)
+
+(* This module performs graph coloring with an unlimited number of
+ colors and aggressive coalescing. It is used for assigning stack
+ slots to the pseudo-registers that have been spilled by register
+ allocation. *)
+
+(* A coloring is a partial function of graph vertices to stack
+ slots. Vertices that are not in the domain of the coloring are
+ waiting for a decision to be made. *)
+
+type decision =
+ AST.immediate
+
+type coloring =
+ decision Vertex.Map.t
+
+(* ------------------------------------------------------------------------- *)
+(* Here is the coloring algorithm. *)
+
+module Color (G : sig
+
+ val graph: graph
+ val verbose: bool
+
+end) = struct
+
+ module SlotSet =
+ Set.Make(struct type t = int let compare = Pervasives.compare end)
+
+ (* [forbidden_slots graph coloring v] is the set of stack slots that
+ cannot be assigned to [v] considering the (partial) coloring
+ [coloring]. This takes into account [v]'s possible interferences
+ with other spilled vertices. *)
+
+ let add_slot coloring r slots =
+ SlotSet.add (Vertex.Map.find r coloring) slots
+
+ let forbidden_slots graph coloring v =
+ Vertex.Set.fold (add_slot coloring) (ipp graph v) SlotSet.empty
+
+ (* [allocate_slot forbidden] returns a stack slot that is not a
+ member of the set [forbidden]. Unlike hardware registers, stack
+ slots are infinitely many, so it is always possible to allocate a
+ new one. The reference [locals] holds the space that must be
+ reserved on the stack for locals. *)
+
+ let locals =
+ ref 0
+
+ let allocate_slot forbidden =
+ let rec loop slot =
+ if SlotSet.mem slot forbidden then
+ loop (slot + I8051.int_size)
+ else
+ slot
+ in
+ let slot = loop 0 in
+ locals := max (slot + I8051.int_size) !locals;
+ slot
+
+ (* Allocation is in two phases, implemented by [coalescing] and
+ [simplification]. Each of these functions produces a coloring of its
+ graph argument. *)
+
+ (* [simplification] expects a graph that does not contain any preference
+ edges. It picks a vertex [v], removes it, colors the remaining graph,
+ then colors [v] using a color that is still available. Such a color must
+ exist, since there is an unlimited number of colors. *)
+
+ (* Following Appel, [v] is chosen with lowest degree: this will make this
+ vertex easier to color and might (?) help use fewer colors. *)
+
+ let rec simplification graph : coloring =
+
+ match lowest graph with
+ | Some (v, _) ->
+
+ if G.verbose then
+ printf "SPILL: Picking vertex: %s.\n" (print_vertex graph v);
+
+ (* Remove [v] from the graph and color what remains. *)
+
+ let coloring = simplification (Interference.remove graph v) in
+
+ (* Choose a color for [v]. *)
+
+ let decision =
+ allocate_slot (forbidden_slots graph coloring v)
+ in
+
+ if G.verbose then
+ printf "SPILL: Decision concerning %s: offset %d.\n" (print_vertex graph v) decision;
+
+ (* Record our decision and return. *)
+
+ Vertex.Map.add v decision coloring
+
+ | None ->
+
+ (* The graph is empty. Return an empty coloring. *)
+
+ Vertex.Map.empty
+
+ (* [coalescing] looks for a preference edge, that is, for two vertices
+ [x] and [y] such that [x] and [y] are move-related. In that case,
+ [x] and [y] cannot interfere, because the [Interference] module
+ does not allow two vertices to be related by both an interference
+ edge and a preference edge. If [coalescing] finds such an edge, it
+ coalesces [x] and [y] and continues coalescing. Otherwise, it
+ invokes the next phase, [simplification].
+
+ This is aggressive coalescing: we coalesce all preference edges,
+ without fear of creating high-degree nodes. This is good because
+ a move between two pseudo-registers that have been spilled in
+ distinct stack slots is very expensive: one load followed by one
+ store. *)
+
+ let rec coalescing graph : coloring =
+
+ match pppick graph (fun _ -> true) with
+ | Some (x, y) ->
+
+ if G.verbose then
+ printf "SPILL: Coalescing %s and %s.\n" (print_vertex graph x) (print_vertex graph y);
+
+ let graph = Interference.coalesce graph x y in
+ let coloring = coalescing graph in
+ Vertex.Map.add x (Vertex.Map.find y coloring) coloring
+
+ | None ->
+
+ simplification graph
+
+ (* Run the algorithm. [coalescing] runs first and calls [simplification]
+ when it is done. *)
+
+ let coloring =
+ coalescing G.graph
+
+ (* Report how much stack space was used. *)
+
+ let locals =
+ !locals
+
+end
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(** This module performs graph coloring with an unlimited number of
+ colors and aggressive coalescing. It is used for assigning stack
+ slots to the pseudo-registers that have been spilled by register
+ allocation. *)
+
+(* A coloring is a partial function of graph vertices to stack
+ slots. Vertices that are not in the domain of the coloring are
+ waiting for a decision to be made. *)
+
+type decision =
+ AST.immediate
+
+type coloring =
+ decision Interference.Vertex.Map.t
+
+(* Here is the coloring algorithm. Out of an interference graph, it
+ produces a coloring and reports how many colors (stack slots) were
+ required. The graph is expected to contain interference and
+ preferences edges between vertices only -- no hardware registers
+ are involved. If the [verbose] flag is set, the algorithm prints
+ information messages to the standard output channel. *)
+
+module Color (G : sig
+
+ val graph: Interference.graph
+ val verbose: bool
+
+end) : sig
+
+ val coloring: coloring
+ val locals: int
+
+end
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(* This module offers functions that count how many times each
+ pseudo-register is used within a piece of [ERTL] code. This
+ is used in [Coloring] to drive the spilling heuristics. *)
+
+open ERTL
+
+let lookup uses r =
+ try
+ Register.Map.find r uses
+ with Not_found ->
+ 0
+
+let count r uses = Register.Map.add r (lookup uses r + 1) uses
+
+let examine_statement _ stmt uses =
+ match stmt with
+ | St_skip _
+ | St_comment _
+ | St_cost _
+ | St_hdw_to_hdw _
+ | St_newframe _
+ | St_delframe _
+ | St_clear_carry _
+ | St_set_carry _
+ | St_call_id _
+ | St_return _ ->
+ uses
+ | St_get_hdw (r, _, _)
+ | St_set_hdw (_, r, _)
+ | St_framesize (r, _)
+ | St_pop (r, _)
+ | St_push (r, _)
+ | St_int (r, _, _)
+ | St_addrH (r, _, _)
+ | St_addrL (r, _, _)
+ | St_cond (r, _, _) ->
+ count r uses
+ | St_move (r1, r2, _)
+ | St_op1 (_, r1, r2, _)
+ | St_call_ptr (r1, r2, _, _) ->
+ count r1 (count r2 uses)
+ | St_opaccsA (_, r1, r2, r3, _)
+ | St_opaccsB (_, r1, r2, r3, _)
+ | St_op2 (_, r1, r2, r3, _)
+ | St_load (r1, r2, r3, _)
+ | St_store (r1, r2, r3, _) ->
+ count r1 (count r2 (count r3 uses))
+
+let examine_internal int_fun =
+ let uses =
+ Label.Map.fold examine_statement int_fun.f_graph Register.Map.empty
+ in
+ lookup uses
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(** This module offers functions that count how many times each
+ pseudo-register is used within a piece of [ERTL] code. This is used
+ in [Coloring] to drive the spilling heuristics. *)
+
+(* [examine_procedure int_fun] counts how many times each pseudo-register
+ is used within procedure [int_fun]. It returns a function that maps
+ pseudo-registers to integer use counts. *)
+
+val examine_internal: ERTL.internal_function -> (Register.t -> int)
+
--- /dev/null
+
+(** This module defines the abstract syntax tree of [LIN]. *)
+
+(** Compared to LTL where functions were graphs, the functions of a LIN program
+ are sequential instructions. *)
+
+type statement =
+
+ (* Unconditional branch. *)
+ | St_goto of Label.t
+
+ (* Label a statement. *)
+ | St_label of Label.t
+
+ (* Comment. *)
+ | St_comment of string
+
+ (* Emit a cost label. *)
+ | St_cost of CostLabel.t
+
+ (* Assign an integer constant to a register. Parameters are the destination
+ register, and the integer. *)
+ | St_int of I8051.register * int
+
+ (* Pop a value from the IRAM to the accumulator. *)
+ | St_pop
+
+ (* Push a value from the accumulator to the IRAM. *)
+ | St_push
+
+ (* Assign the address of a symbol to DPTR. Parameter is the symbol. *)
+ | St_addr of AST.ident
+
+ (* Move the content of the accumulator to a register. Parameters is the
+ destination register. *)
+ | St_from_acc of I8051.register
+
+ (* Move the content of a register to the accumulator. Parameters is the source
+ register. *)
+ | St_to_acc of I8051.register
+
+ (* Apply an operation on the accumulators. Parameter is the operation. *)
+ | St_opaccs of I8051.opaccs
+
+ (* Apply an unary operation on the A accumulator. Parameter is the
+ operation. *)
+ | St_op1 of I8051.op1
+
+ (* Apply a binary operation on the A accumulator. Parameters are the
+ operation, and the other source register. *)
+ | St_op2 of I8051.op2 * I8051.register
+
+ (* Set the carry flag to zero. *)
+ | St_clear_carry
+
+ (* Set the carry flag to 1. *)
+ | St_set_carry
+
+ (* Load from external memory (address in DPTR) to the accumulator. *)
+ | St_load
+
+ (* Store to external memory (address in DPTR) from the accumulator. *)
+ | St_store
+
+ (* Call to a function given its name. Parameter is the name of the
+ function. *)
+ | St_call_id of AST.ident
+
+ (* Call to a function given its address in DPTR. *)
+ | St_call_ptr
+
+ (* Branch on A accumulator. Parameter is the label to go to when the A
+ accumulator is not 0. *)
+ | St_condacc of Label.t
+
+ (* Transfer control to the address stored in the return address registers. *)
+ | St_return
+
+type internal_function = statement list
+
+type function_def =
+ | F_int of internal_function
+ | F_ext of AST.external_function
+
+(* A program is a list of global variables and their reserved space, a list of
+ function names and their definition, and the name of the main function. *)
+
+type program =
+ { vars : (AST.ident * int (* size *)) list ;
+ functs : (AST.ident * function_def) list ;
+ main : AST.ident option }
--- /dev/null
+
+(** This module provides an interpreter for the LIN language. *)
+
+
+let error_prefix = "LIN interpret"
+let error s = Error.global_error error_prefix s
+
+
+module Mem = Driver.LINMemory
+module Val = Mem.Value
+let chunk = Driver.LINMemory.int_size
+module Eval = I8051.Eval (Val)
+
+
+(* Memory *)
+
+type memory = LIN.function_def Mem.memory
+
+(* Hardware registers environments. They associate a value to each hardware
+ register. *)
+
+type hdw_reg_env = Val.t I8051.RegisterMap.t
+
+(* Execution states. *)
+
+type state =
+ { pc : Val.address ;
+ isp : Val.address ;
+ exit : Val.address ;
+ carry : Val.t ;
+ renv : hdw_reg_env ;
+ mem : memory ;
+ trace : CostLabel.t list }
+
+
+(* Helpers *)
+
+let change_pc st pc = { st with pc = pc }
+let change_isp st isp = { st with isp = isp }
+let change_exit st exit = { st with exit = exit }
+let change_carry st carry = { st with carry = carry }
+let change_renv st renv = { st with renv = renv }
+let change_mem st mem = { st with mem = mem }
+let change_trace st trace = { st with trace = trace }
+let add_trace st cost_lbl = change_trace st (cost_lbl :: st.trace)
+
+let empty_state =
+ { pc = Val.null ;
+ isp = Val.null ;
+ exit = Val.null ;
+ carry = Val.undef ;
+ renv = I8051.RegisterMap.empty ;
+ mem = Mem.empty ;
+ trace = [] }
+
+
+let int_fun_of_ptr mem ptr = match Mem.find_fun_def mem ptr with
+ | LIN.F_int def -> def
+ | _ -> error "Trying to fetch the definition of an external function."
+
+let current_int_fun st = int_fun_of_ptr st.mem st.pc
+
+let fetch_stmt st =
+ let msg =
+ Printf.sprintf "%s does not point to a statement."
+ (Val.string_of_address st.pc) in
+ if Val.is_mem_address st.pc then
+ let off = Val.offset_of_address st.pc in
+ let def = int_fun_of_ptr st.mem st.pc in
+ List.nth def (Val.Offset.to_int off)
+ else error msg
+
+let init_fun_call st ptr =
+ change_pc st (Val.change_address_offset ptr Val.Offset.zero)
+
+let next_pc st =
+ change_pc st (Val.add_address st.pc Val.Offset.one)
+
+let add_reg r v st =
+ let renv = I8051.RegisterMap.add r v st.renv in
+ change_renv st renv
+
+let get_reg r st =
+ if I8051.RegisterMap.mem r st.renv then I8051.RegisterMap.find r st.renv
+ else error ("Unknown hardware register " ^ (I8051.print_register r) ^ ".")
+
+let push st v =
+ let mem = Mem.store st.mem chunk st.isp v in
+ let isp = Val.add_address st.isp (Val.Offset.of_int chunk) in
+ change_mem (change_isp st isp) mem
+
+let pop st =
+ let isp = Val.add_address st.isp (Val.Offset.of_int (-chunk)) in
+ let st = change_isp st isp in
+ let v = Mem.load st.mem chunk st.isp in
+ (st, v)
+
+let save_ra st =
+ let ra = Val.add_address st.pc Val.Offset.one in
+ let st = push st (List.nth ra 0) in
+ let st = push st (List.nth ra 1) in
+ st
+
+let find_label lbl =
+ let rec aux i = function
+ | [] -> error (Printf.sprintf "Unknown label %s." lbl)
+ | LIN.St_label lbl' :: _ when lbl' = lbl -> i
+ | _ :: code -> aux (i+1) code
+ in
+ aux 0
+
+let pointer_of_label st lbl =
+ let code = current_int_fun st in
+ let off = find_label lbl code in
+ Val.change_address_offset st.pc (Val.Offset.of_int off)
+
+let goto st lbl =
+ change_pc st (pointer_of_label st lbl)
+
+let return_pc st =
+ let (st, pch) = pop st in
+ let (st, pcl) = pop st in
+ (st, [pcl ; pch])
+
+let dptr st = List.map (fun r -> get_reg r st) [I8051.dpl ; I8051.dph]
+
+
+(* State pretty-printing *)
+
+let print_renv renv =
+ let f r v =
+ if not (Val.eq v Val.undef) then
+ Printf.printf "\n%s = %s%!" (I8051.print_register r) (Val.to_string v) in
+ I8051.RegisterMap.iter f renv
+
+let print_state st =
+ Printf.printf "PC: %s\n%!" (Val.string_of_address st.pc) ;
+ Printf.printf "SP: %s\n%!"
+ (Val.string_of_address [get_reg I8051.spl st ; get_reg I8051.sph st]) ;
+ Printf.printf "ISP: %s%!" (Val.string_of_address st.isp) ;
+ print_renv st.renv ;
+ Printf.printf "\nC = %s%!" (Val.to_string st.carry) ;
+ Mem.print st.mem ;
+ Printf.printf "\n%!"
+
+
+module InterpretExternal = Primitive.Interpret (Mem)
+
+let interpret_external mem f args = match InterpretExternal.t mem f args with
+ | (mem', InterpretExternal.V vs) -> (mem', vs)
+ | (mem', InterpretExternal.A addr) -> (mem', addr)
+
+let fetch_external_args f st =
+ let size = Mem.size_of_quantity (Primitive.args_byte_size f) in
+ let params = MiscPottier.prefix size I8051.parameters in
+ List.map (fun r -> get_reg r st) params
+
+let set_result st vs =
+ let f st (r, v) = add_reg r v st in
+ List.fold_left f st (MiscPottier.combine I8051.rets vs)
+
+let interpret_external_call st f =
+ let args = fetch_external_args f st in
+ let (mem, vs) = interpret_external st.mem f args in
+ let st = change_mem st mem in
+ set_result st vs
+
+let interpret_call st ptr =
+ match Mem.find_fun_def st.mem ptr with
+ | LIN.F_int def ->
+ let st = save_ra st in
+ init_fun_call st ptr
+ | LIN.F_ext def ->
+ let st = next_pc st in
+ interpret_external_call st def.AST.ef_tag
+
+let interpret_return st =
+ let (st, pc) = return_pc st in
+ change_pc st pc
+
+let interpret_stmt st stmt =
+ match stmt with
+
+ | LIN.St_goto lbl ->
+ goto st lbl
+
+ | LIN.St_label _ ->
+ next_pc st
+
+ | LIN.St_comment s ->
+(*
+ Printf.printf "*** %s ***\n\n%!" s ;
+*)
+ next_pc st
+
+ | LIN.St_cost cost_lbl ->
+ let st = add_trace st cost_lbl in
+ next_pc st
+
+ | LIN.St_int (r, i) ->
+ let st = add_reg r (Val.of_int i) st in
+ next_pc st
+
+ | LIN.St_pop ->
+ let (st, v) = pop st in
+ let st = add_reg I8051.a v st in
+ next_pc st
+
+ | LIN.St_push ->
+ let v = get_reg I8051.a st in
+ let st = push st v in
+ next_pc st
+
+ | LIN.St_addr x ->
+ let vs = Mem.find_global st.mem x in
+ let st = add_reg I8051.dpl (List.nth vs 0) st in
+ let st = add_reg I8051.dph (List.nth vs 1) st in
+ next_pc st
+
+ | LIN.St_from_acc destr ->
+ let st = add_reg destr (get_reg I8051.a st) st in
+ next_pc st
+
+ | LIN.St_to_acc srcr ->
+ let st = add_reg I8051.a (get_reg srcr st) st in
+ next_pc st
+
+ | LIN.St_opaccs opaccs ->
+ let (a, b) =
+ Eval.opaccs opaccs
+ (get_reg I8051.a st)
+ (get_reg I8051.b st) in
+ let st = add_reg I8051.a a st in
+ let st = add_reg I8051.b b st in
+ next_pc st
+
+ | LIN.St_op1 op1 ->
+ let v = Eval.op1 op1 (get_reg I8051.a st) in
+ let st = add_reg I8051.a v st in
+ next_pc st
+
+ | LIN.St_op2 (op2, srcr) ->
+ let (v, carry) =
+ Eval.op2 st.carry op2
+ (get_reg I8051.a st)
+ (get_reg srcr st) in
+ let st = change_carry st carry in
+ let st = add_reg I8051.a v st in
+ next_pc st
+
+ | LIN.St_clear_carry ->
+ let st = change_carry st Val.zero in
+ next_pc st
+
+ | LIN.St_set_carry ->
+ let st = change_carry st (Val.of_int 1) in
+ next_pc st
+
+ | LIN.St_load ->
+ let addr = dptr st in
+ let v = Mem.load st.mem chunk addr in
+ let st = add_reg I8051.a v st in
+ next_pc st
+
+ | LIN.St_store ->
+ let addr = dptr st in
+ let mem = Mem.store st.mem chunk addr (get_reg I8051.a st) in
+ let st = change_mem st mem in
+ next_pc st
+
+ | LIN.St_call_id f ->
+ interpret_call st (Mem.find_global st.mem f)
+
+ | LIN.St_call_ptr ->
+ interpret_call st (dptr st)
+
+ | LIN.St_condacc lbl_true ->
+ let v = get_reg I8051.a st in
+ if Val.is_true v then goto st lbl_true
+ else
+ if Val.is_false v then next_pc st
+ else error "Undecidable branchment."
+
+ | LIN.St_return ->
+ interpret_return st
+
+
+let compute_result st =
+ let vs = List.map (fun r -> get_reg r st) I8051.rets in
+ let f res v = res && (Val.is_int v) in
+ let is_int vs = (List.length vs > 0) && (List.fold_left f true vs) in
+ if is_int vs then
+ let chunks =
+ List.map (fun v -> IntValue.Int32.cast (Val.to_int_repr v)) vs in
+ IntValue.Int32.merge chunks
+ else IntValue.Int32.zero
+
+let rec iter_small_step debug st =
+ let print_and_return_result (res, cost_labels) =
+ if debug then Printf.printf "Result = %s\n%!"
+ (IntValue.Int32.to_string res) ;
+ (res, cost_labels) in
+ if debug then print_state st ;
+ match fetch_stmt st with
+ | LIN.St_return when Val.eq_address (snd (return_pc st)) st.exit ->
+ print_and_return_result (compute_result st, List.rev st.trace)
+ | stmt ->
+ let st' = interpret_stmt st stmt in
+ iter_small_step debug st'
+
+
+let add_global_vars =
+ List.fold_left
+ (fun mem (id, size) -> Mem.add_var mem id (AST.SQ (AST.QInt size)) None)
+
+let add_fun_defs =
+ List.fold_left (fun mem (f_id, f_def) -> Mem.add_fun_def mem f_id f_def)
+
+let init_prog (st : state) (p : LIN.program) : state =
+ let mem = add_global_vars (add_fun_defs st.mem p.LIN.functs) p.LIN.vars in
+ change_mem st mem
+
+let init_sp st =
+ let (mem, sp) = Mem.alloc st.mem I8051.ext_ram_size in
+ let sp =
+ Val.change_address_offset sp (Val.Offset.of_int I8051.ext_ram_size) in
+ let st = change_mem st mem in
+ (st, sp)
+
+let init_isp st =
+ let (mem, isp) = Mem.alloc st.mem I8051.int_ram_size in
+ let st = change_mem (change_isp st isp) mem in
+ let (mem, exit) = Mem.alloc st.mem 1 in
+ let st = change_exit st exit in
+ let st = push st (List.nth exit 0) in
+ let st = push st (List.nth exit 1) in
+ st
+
+let init_renv st sp =
+ let f r st = add_reg r Val.undef st in
+ let st = I8051.RegisterSet.fold f I8051.registers st in
+ let spl = List.nth sp 0 in
+ let sph = List.nth sp 1 in
+ let st = add_reg I8051.spl spl st in
+ let st = add_reg I8051.sph sph st in
+ st
+
+let init_main_call st main =
+ let ptr = Mem.find_global st.mem main in
+ match Mem.find_fun_def st.mem ptr with
+ | LIN.F_int def ->
+ init_fun_call st ptr
+ | _ -> error ("Cannot execute the main (\"" ^ main ^ "\"): it is external.")
+
+
+(* Before interpreting, the environment is initialized:
+ - Add function definitions to the memory and reserve space for the globals.
+ - Allocate memory to emulate the external stack and initialize the external
+ stack pointer.
+ - Allocate memory to emulate the internal stack and initialize the internal
+ stack pointer.
+ - Initialiaze the physical register environment. All are set to 0, except for
+ the stack pointer registers that take the high and low bits of the external
+ stack pointer.
+ - Initialize a call to the main (set the current program counter to the
+ beginning of the function).
+ - Initialize the carry flag to 0. *)
+
+let interpret debug p =
+ Printf.printf "*** LIN interpret ***\n%!" ;
+ match p.LIN.main with
+ | None -> (IntValue.Int32.zero, [])
+ | Some main ->
+ let st = empty_state in
+ let st = init_prog st p in
+ let (st, sp) = init_sp st in
+ let st = init_isp st in
+ let st = init_renv st sp in
+ let st = init_main_call st main in
+ let st = change_carry st Val.zero in
+ iter_small_step debug st
--- /dev/null
+
+(** This module provides a function to interpret a [LIN] program and
+ return the trace of cost labels encountered. *)
+
+val interpret: bool -> LIN.program -> AST.trace
--- /dev/null
+
+(** This module provides a function to print [LIN] programs. *)
+
+
+let n_spaces n = String.make n ' '
+
+
+let print_global n (x, size) =
+ Printf.sprintf "%s\"%s\" [%d]" (n_spaces n) x size
+
+let print_globals eformat n globs =
+ Eformat.printf eformat "%sglobals:\n" (n_spaces n) ;
+ List.iter
+ (fun g -> Eformat.printf eformat "%s\n" (print_global (n+2) g)) globs
+
+
+let print_reg = I8051.print_register
+
+let print_a = print_reg I8051.a
+
+
+let print_statement = function
+ | LIN.St_goto lbl -> "goto " ^ lbl
+ | LIN.St_label lbl -> lbl ^ ":"
+ | LIN.St_comment s ->
+ Printf.sprintf "*** %s ***" s
+ | LIN.St_cost cost_lbl ->
+ Printf.sprintf "emit %s" cost_lbl
+ | LIN.St_int (dstr, i) ->
+ Printf.sprintf "imm %s, %d" (print_reg dstr) i
+ | LIN.St_pop ->
+ Printf.sprintf "pop %s" print_a
+ | LIN.St_push ->
+ Printf.sprintf "push %s" print_a
+ | LIN.St_addr id ->
+ Printf.sprintf "addr DPTR, %s" id
+ | LIN.St_from_acc dstr ->
+ Printf.sprintf "move %s, %s" (print_reg dstr) print_a
+ | LIN.St_to_acc srcr ->
+ Printf.sprintf "move %s, %s" print_a (print_reg srcr)
+ | LIN.St_opaccs opaccs ->
+ Printf.sprintf "%s %s, %s"
+ (I8051.print_opaccs opaccs) print_a (print_reg I8051.b)
+ | LIN.St_op1 op1 ->
+ Printf.sprintf "%s %s" (I8051.print_op1 op1) print_a
+ | LIN.St_op2 (op2, srcr) ->
+ Printf.sprintf "%s %s, %s"
+ (I8051.print_op2 op2) print_a (print_reg srcr)
+ | LIN.St_clear_carry -> "clear CARRY"
+ | LIN.St_set_carry -> "set CARRY"
+ | LIN.St_load ->
+ Printf.sprintf "movex %s, @DPTR" print_a
+ | LIN.St_store ->
+ Printf.sprintf "movex @DPTR, %s" print_a
+ | LIN.St_call_id f -> Printf.sprintf "call \"%s\"" f
+ | LIN.St_call_ptr ->
+ Printf.sprintf "call_ptr DPTR"
+ | LIN.St_condacc lbl_true ->
+ Printf.sprintf "branch %s <> 0, %s" print_a lbl_true
+ | LIN.St_return -> "return"
+
+
+let print_code eformat n c =
+ let f stmt =
+ Eformat.printf eformat "\n%s%s" (n_spaces n) (print_statement stmt) in
+ List.iter f c
+
+
+let print_internal_decl eformat n f def =
+ Eformat.printf eformat "%s\"%s\"\n\n" (n_spaces n) f ;
+ print_code eformat (n+2) def
+
+
+let print_external_decl eformat n f def =
+ Eformat.printf eformat "%sextern \"%s\": %s\n"
+ (n_spaces n)
+ f
+ (Primitive.print_sig def.AST.ef_sig)
+
+
+let print_fun_decl eformat n (f, def) = match def with
+ | LIN.F_int def -> print_internal_decl eformat n f def
+ | LIN.F_ext def -> print_external_decl eformat n f def
+
+let print_fun_decls eformat n functs =
+ List.iter
+ (fun f -> print_fun_decl eformat n f ; Eformat.printf eformat "\n\n") functs
+
+
+let print_program p =
+ let eformat = Eformat.create () in
+ Eformat.printf eformat "program:\n\n\n" ;
+ print_globals eformat 2 p.LIN.vars ;
+ Eformat.printf eformat "\n\n" ;
+ print_fun_decls eformat 2 p.LIN.functs ;
+ Eformat.get eformat
--- /dev/null
+
+(** This module provides a function to print [LIN] programs. *)
+
+val print_program: LIN.program -> string
--- /dev/null
+
+(** This module translates a [LIN] program into a [ASM] program. *)
+
+
+let error_prefix = "LIN to ASM"
+let error s = Error.global_error error_prefix s
+
+
+(* Translation environment *)
+
+type env =
+ { externals : AST.ident list ;
+ exit_lbl : Label.t ;
+ fresh : unit -> string }
+
+let make_env externals exit_lbl fresh =
+ { externals = externals ;
+ exit_lbl = exit_lbl ;
+ fresh = fresh }
+
+
+(* Fetch the labels found in a LIN program. *)
+
+let statement_labels = function
+ | LIN.St_goto lbl
+ | LIN.St_label lbl
+ | LIN.St_cost lbl
+ | LIN.St_condacc lbl -> Label.Set.singleton lbl
+ | _ -> Label.Set.empty
+
+let funct_labels (_, fun_def) = match fun_def with
+ | LIN.F_int stmts ->
+ let f labels stmt = Label.Set.union labels (statement_labels stmt) in
+ List.fold_left f Label.Set.empty stmts
+ | _ -> Label.Set.empty
+
+let prog_labels p =
+ let f labels funct = Label.Set.union labels (funct_labels funct) in
+ List.fold_left f Label.Set.empty p.LIN.functs
+
+
+let size_of_vect_size = function
+ | `Four -> 4
+ | `Seven -> 7
+ | `Eight -> 8
+ | `Eleven -> 11
+ | `Sixteen -> 16
+
+let vect_of_int i size =
+ let i' =
+ if i < 0 then (MiscPottier.pow 2 (size_of_vect_size size)) + i else i in
+ try BitVectors.vect_of_int i' size
+ with Invalid_argument _ (* "BitVectors.vect_of_int: size not big enough" *) ->
+ error
+ (Printf.sprintf "integer %d is too big to convert using %d bits. Maybe the stack frame of a function is too big."
+ i (size_of_vect_size size))
+
+let byte_of_int i = vect_of_int i `Eight
+let data_of_int i = `DATA (byte_of_int i)
+let data16_of_int i = `DATA16 (vect_of_int i `Sixteen)
+let acc_addr = I8051.reg_addr I8051.a
+let dpl_addr = I8051.reg_addr I8051.dpl
+let dph_addr = I8051.reg_addr I8051.dph
+let st0_addr = I8051.reg_addr I8051.st0
+let st1_addr = I8051.reg_addr I8051.st1
+
+
+let translate_statement env = function
+ | LIN.St_goto lbl -> [`Jmp lbl]
+ | LIN.St_label lbl -> [`Label lbl]
+ | LIN.St_comment _ -> []
+ | LIN.St_cost lbl ->
+ (* TODO: hack! Need to make the difference between cost labels and regular
+ labels. *)
+ [`Cost lbl ; `NOP]
+ | LIN.St_int (r, i) ->
+ [`MOV (`U3 (I8051.reg_addr r, data_of_int i))]
+ | LIN.St_pop ->
+ [`POP acc_addr]
+ | LIN.St_push ->
+ [`PUSH acc_addr]
+ | LIN.St_addr x when List.mem x env.externals ->
+ (* HACK! for Lustre support: externals appears in the code but are not
+ used. *)
+ [`MOV (`U4 (`DPTR, data16_of_int 0))]
+ (* error ("Primitive or external " ^ x ^ " is not supported.") *)
+ | LIN.St_addr x ->
+ [`Mov (`DPTR, x)]
+ | LIN.St_from_acc r ->
+ [`MOV (`U3 (I8051.reg_addr r, `A))]
+ | LIN.St_to_acc r ->
+ [`MOV (`U1 (`A, I8051.reg_addr r))]
+ | LIN.St_opaccs I8051.Mul ->
+ [`MUL (`A, `B)]
+ | LIN.St_opaccs I8051.DivuModu ->
+ [`DIV (`A, `B)]
+ | LIN.St_op1 I8051.Cmpl ->
+ [`CPL `A]
+ | LIN.St_op1 I8051.Inc ->
+ [`INC `A]
+ | LIN.St_op2 (I8051.Add, r) ->
+ [`ADD (`A, I8051.reg_addr r)]
+ | LIN.St_op2 (I8051.Addc, r) ->
+ [`ADDC (`A, I8051.reg_addr r)]
+ | LIN.St_op2 (I8051.Sub, r) ->
+ [`SUBB (`A, I8051.reg_addr r)]
+ | LIN.St_op2 (I8051.And, r) ->
+ [`ANL (`U1 (`A, I8051.reg_addr r))]
+ | LIN.St_op2 (I8051.Or, r) ->
+ [`ORL (`U1 (`A, I8051.reg_addr r))]
+ | LIN.St_op2 (I8051.Xor, r) ->
+ [`XRL (`U1 (`A, I8051.reg_addr r))]
+ | LIN.St_clear_carry ->
+ [`CLR `C]
+ | LIN.St_set_carry ->
+ [`SETB `C]
+ | LIN.St_load ->
+ [`MOVX (`U1 (`A, `EXT_IND_DPTR))]
+ | LIN.St_store ->
+ [`MOVX (`U2 (`EXT_IND_DPTR, `A))]
+ | LIN.St_call_id x when List.mem x env.externals ->
+ (* HACK! for Lustre support: externals appears in the code but are not
+ used. *)
+ []
+ (* error ("Primitive or external " ^ x ^ " is not supported.") *)
+ | LIN.St_call_id f ->
+ [`Call f]
+ | LIN.St_call_ptr ->
+ let lbl = env.fresh () in
+ [`MOV (`U3 (st0_addr, dpl_addr)) ; (* save DPL *)
+ `MOV (`U3 (st1_addr, dph_addr)) ; (* save DPH *)
+ `Mov (`DPTR, lbl) ; (* DPTR <- return address *)
+ `PUSH dpl_addr ; (* push DPL *)
+ `PUSH dph_addr ; (* push DPH *)
+ `MOV (`U3 (dpl_addr, st0_addr)) ; (* restore DPL *)
+ `MOV (`U3 (dph_addr, st1_addr)) ; (* restore DPH *)
+ `MOV (`U1 (`A, data_of_int 0)) ; (* A <- 0 *)
+ `JMP `IND_DPTR ; (* jump to A+DPTR *)
+ `Label lbl] (* return address *)
+ | LIN.St_condacc lbl ->
+ [`WithLabel (`JNZ (`Label lbl))]
+ | LIN.St_return ->
+ [`RET]
+
+let translate_code env code =
+ List.flatten (List.map (translate_statement env) code)
+
+
+let translate_fun_def env (id, def) =
+ let code = match def with
+ | LIN.F_int code -> translate_code env code
+ | LIN.F_ext ext -> [`NOP] in
+ ((`Label id) :: code)
+
+let translate_functs env main functs =
+ let preamble = match main with
+ | None -> []
+ | Some main ->
+ [`MOV (`U3 (`DIRECT (byte_of_int I8051.isp_addr),
+ data_of_int I8051.isp_init)) ;
+ `MOV (`U3 (`DIRECT (byte_of_int I8051.spl_addr),
+ data_of_int I8051.spl_init)) ;
+ `MOV (`U3 (`DIRECT (byte_of_int I8051.sph_addr),
+ data_of_int I8051.sph_init)) ;
+ `Call main ;
+ `Label env.exit_lbl ; `Jmp env.exit_lbl] in
+ preamble @ (List.flatten (List.map (translate_fun_def env) functs))
+
+
+let init_env p =
+ let f_externals (id, def) = match def with LIN.F_ext _ -> [id] | _ -> [] in
+ let externals =
+ List.fold_left (fun res def -> res @ (f_externals def)) [] p.LIN.functs in
+ let prog_lbls = prog_labels p in
+ let exit_lbl = Label.Gen.fresh_prefix prog_lbls "_exit" in
+ let fresh = Label.make_fresh prog_lbls "_call_ret" in
+ make_env externals exit_lbl fresh
+
+
+(* Translating programs.
+
+ Global variables are associated an offset from the base of the external
+ memory. *)
+
+let translate p =
+ let env = init_env p in
+ let p =
+ { ASM.ppreamble = p.LIN.vars ;
+ ASM.pexit_label = env.exit_lbl ;
+ ASM.pcode = translate_functs env p.LIN.main p.LIN.functs ;
+ ASM.phas_main = p.LIN.main <> None } in
+ ASMInterpret.assembly p
--- /dev/null
+
+(** This module translates a [LIN] program into a [ASM] program. *)
+
+(** Very few work here:
+
+ The globals are associated an offset from the bottom of the memory and
+ depending on there size.
+
+ The instruction that loads the address of a global into a register
+ actually loads the offset associated to the global.
+
+ In 8051, a program is supposed to run forever. A preamble that contains
+ two instructions is added: the first calls the main, and the second
+ infinitely jumps to itself once the main has returned. *)
+
+val translate : LIN.program -> ASM.program
--- /dev/null
+
+(** This module defines the abstract syntax tree of [LTL]. *)
+
+(** The main difference with ERTL is that only physical registers are present in
+ LTL (no more pseudo-registers). Pseudo-registers are associated either a
+ physical register or a location on the stack. This is done by a coloring
+ algorithm. Actually, this coloring algorithm relies on the result of a
+ liveness analysis that will also allow to remove dead code. *)
+
+type statement =
+
+ (* The empty statement. *)
+ | St_skip of Label.t
+
+ (* Comment. *)
+ | St_comment of string * Label.t
+
+ (* Emit a cost label. *)
+ | St_cost of CostLabel.t * Label.t
+
+ (* Assign an integer constant to a register. Parameters are the destination
+ register, the integer and the label of the next statement. *)
+ | St_int of I8051.register * int * Label.t
+
+ (* Pop a value from the IRAM to the accumulator. Parameter is the label of the
+ next statement. *)
+ | St_pop of Label.t
+
+ (* Push a value from the accumulator to the IRAM. Parameter is the label of
+ the next statement. *)
+ | St_push of Label.t
+
+ (* Assign the address of a symbol to a DPTR. Parameters are the symbol, and
+ the label of the next statement. *)
+ | St_addr of AST.ident * Label.t
+
+ (* Move the content of the accumulator to a register. Parameters are the
+ destination register, and the label of the next statement. *)
+ | St_from_acc of I8051.register * Label.t
+
+ (* Move the content of a register to the accumulator. Parameters are the
+ source register, and the label of the next statement. *)
+ | St_to_acc of I8051.register * Label.t
+
+ (* Apply an operation on the accumulators. Parameters are the operation, and
+ the label of the next statement. *)
+ | St_opaccs of I8051.opaccs * Label.t
+
+ (* Apply an unary operation on the A accumulator. Parameters are the
+ operation, and the label of the next statement. *)
+ | St_op1 of I8051.op1 * Label.t
+
+ (* Apply a binary operation on the A accumulator. Parameters are the
+ operation, the other source register, and the label of the next
+ statement. *)
+ | St_op2 of I8051.op2 * I8051.register * Label.t
+
+ (* Set the carry flag to zero. Parameter is the label of the next
+ statement. *)
+ | St_clear_carry of Label.t
+
+ (* Set the carry flag to 1. Parameter is the label of the next statement. *)
+ | St_set_carry of Label.t
+
+ (* Load from external memory (address in DPTR) to the accumulator. Parameter
+ is the label of the next statement. *)
+ | St_load of Label.t
+
+ (* Store to external memory (address in DPTR) from the accumulator. Parameter
+ is the label of the next statement. *)
+ | St_store of Label.t
+
+ (* Call to a function given its name. Parameters are the name of the function,
+ and the label of the next statement. *)
+ | St_call_id of AST.ident * Label.t
+
+ (* Call to a function given its address in DPTR. Parameter is the label of the
+ next statement. *)
+ | St_call_ptr of Label.t
+
+ (* Branch on A accumulator. Parameters are the label to go to when the A
+ accumulator is not 0, and the label to go to when the A accumulator is
+ 0. *)
+ | St_condacc of Label.t * Label.t
+
+ (* Transfer control to the address stored in the return address registers. *)
+ | St_return
+
+type graph = statement Label.Map.t
+
+type internal_function =
+ { f_luniverse : Label.Gen.universe ;
+ f_stacksize : int ;
+ f_graph : graph ;
+ f_entry : Label.t ;
+ f_exit : Label.t }
+
+type function_def =
+ | F_int of internal_function
+ | F_ext of AST.external_function
+
+(* A program is a list of global variables and their reserved space, a list of
+ function names and their definition, and the name of the main function. *)
+
+type program =
+ { vars : (AST.ident * int (* size *)) list ;
+ functs : (AST.ident * function_def) list ;
+ main : AST.ident option }
--- /dev/null
+
+(** This module provides an interpreter for the LTL language. *)
+
+
+let error_prefix = "LTL interpret"
+let error s = Error.global_error error_prefix s
+
+
+module Mem = Driver.LTLMemory
+module Val = Mem.Value
+let chunk = Driver.LTLMemory.int_size
+module Eval = I8051.Eval (Val)
+
+
+(* Memory *)
+
+type memory = LTL.function_def Mem.memory
+
+(* Hardware registers environments. They associate a value to the each hardware
+ register. *)
+
+type hdw_reg_env = Val.t I8051.RegisterMap.t
+
+(* Execution states. *)
+
+type state =
+ { pc : Val.address ;
+ isp : Val.address ;
+ exit : Val.address ;
+ carry : Val.t ;
+ renv : hdw_reg_env ;
+ mem : memory ;
+ trace : CostLabel.t list }
+
+
+(* Helpers *)
+
+let change_pc st pc = { st with pc = pc }
+let change_isp st isp = { st with isp = isp }
+let change_exit st exit = { st with exit = exit }
+let change_carry st carry = { st with carry = carry }
+let change_renv st renv = { st with renv = renv }
+let change_mem st mem = { st with mem = mem }
+let change_trace st trace = { st with trace = trace }
+let add_trace st cost_lbl = change_trace st (cost_lbl :: st.trace)
+
+let empty_state =
+ { pc = Val.null ;
+ isp = Val.null ;
+ exit = Val.null ;
+ carry = Val.undef ;
+ renv = I8051.RegisterMap.empty ;
+ mem = Mem.empty ;
+ trace = [] }
+
+
+(* Each label of each function is associated a pointer. The base of this pointer
+ is the base of the function in memory. Inside a function, offsets are
+ bijectively associated to labels. *)
+
+module Labels_Offsets = Bijection.Make (Label) (Val.Offset)
+
+let labels_offsets_internal int_fun =
+ let f lbl _ (lbls_offs, i) =
+ (Labels_Offsets.add1 lbl i lbls_offs, Val.Offset.succ i) in
+ Label.Map.fold f int_fun.LTL.f_graph
+
+(* [labels_offsets p] builds a bijection between the labels found in the
+ functions of [p] and some offsets. *)
+
+let labels_offsets p =
+ let f (lbls_offs, i) (_, def) = match def with
+ | LTL.F_int int_fun -> labels_offsets_internal int_fun (lbls_offs, i)
+ | _ -> (lbls_offs, i) in
+ fst (List.fold_left f (Labels_Offsets.empty, Val.Offset.zero) p.LTL.functs)
+
+let fun_def_of_ptr mem ptr = match Mem.find_fun_def mem ptr with
+ | LTL.F_int def -> def
+ | _ -> error "Trying to fetch the definition of an external function."
+
+let fetch_stmt lbls_offs st =
+ let msg =
+ Printf.sprintf "%s does not point to a statement."
+ (Val.string_of_address st.pc) in
+ if Val.is_mem_address st.pc then
+ let off = Val.offset_of_address st.pc in
+ let def = fun_def_of_ptr st.mem st.pc in
+ let lbl = Labels_Offsets.find2 off lbls_offs in
+ Label.Map.find lbl def.LTL.f_graph
+ else error msg
+
+let entry_pc lbls_offs ptr def =
+ Val.change_address_offset ptr (Labels_Offsets.find1 def.LTL.f_entry lbls_offs)
+
+let init_fun_call lbls_offs st ptr def =
+ let pc = entry_pc lbls_offs ptr def in
+ change_pc st pc
+
+let next_pc lbls_offs st lbl =
+ let off = Labels_Offsets.find1 lbl lbls_offs in
+ change_pc st (Val.change_address_offset st.pc off)
+
+let framesize st =
+ if Val.is_mem_address st.pc then
+ let def = fun_def_of_ptr st.mem st.pc in
+ def.LTL.f_stacksize
+ else error "Trying to load the stack size of an external function."
+
+let add_reg r v st =
+ let renv = I8051.RegisterMap.add r v st.renv in
+ change_renv st renv
+
+let get_reg r st =
+ if I8051.RegisterMap.mem r st.renv then I8051.RegisterMap.find r st.renv
+ else error ("Unknown hardware register " ^ (I8051.print_register r) ^ ".")
+
+let push st v =
+ let mem = Mem.store st.mem chunk st.isp v in
+ let isp = Val.add_address st.isp (Val.Offset.of_int chunk) in
+ change_mem (change_isp st isp) mem
+
+let pop st =
+ let isp = Val.add_address st.isp (Val.Offset.of_int (-chunk)) in
+ let st = change_isp st isp in
+ let v = Mem.load st.mem chunk st.isp in
+ (st, v)
+
+let save_ra lbls_offs st lbl =
+ let ra =
+ Val.change_address_offset st.pc (Labels_Offsets.find1 lbl lbls_offs) in
+ let st = push st (List.nth ra 0) in
+ let st = push st (List.nth ra 1) in
+ st
+
+let label_of_pointer lbls_offs ptr =
+(*
+ Printf.printf "Retrieving label of %s\n%!" (Val.to_string ptr) ;
+*)
+ let off = Val.offset_of_address ptr in
+ Labels_Offsets.find2 off lbls_offs
+
+let pointer_of_label lbls_offs ptr lbl =
+ Val.change_address_offset ptr (Labels_Offsets.find1 lbl lbls_offs)
+
+let return_pc st =
+ let (st, pch) = pop st in
+ let (st, pcl) = pop st in
+ (st, [pcl ; pch])
+
+let dptr st = List.map (fun r -> get_reg r st) [I8051.dpl ; I8051.dph]
+
+
+(* State pretty-printing *)
+
+let current_label lbls_offs st =
+ Labels_Offsets.find2 (Val.offset_of_address st.pc) lbls_offs
+
+let print_renv renv =
+ let f r v =
+ if not (Val.eq v Val.undef) then
+ Printf.printf "\n%s = %s%!" (I8051.print_register r) (Val.to_string v) in
+ I8051.RegisterMap.iter f renv
+
+let print_state lbls_offs st =
+ Printf.printf "PC: %s (%s)\n%!"
+ (Val.string_of_address st.pc) (current_label lbls_offs st) ;
+ Printf.printf "SP: %s\n%!"
+ (Val.string_of_address [get_reg I8051.spl st ; get_reg I8051.sph st]) ;
+ Printf.printf "ISP: %s%!" (Val.string_of_address st.isp) ;
+ print_renv st.renv ;
+ Printf.printf "\nC = %s%!" (Val.to_string st.carry) ;
+ Mem.print st.mem ;
+ Printf.printf "\n%!"
+
+
+module InterpretExternal = Primitive.Interpret (Mem)
+
+let interpret_external mem f args = match InterpretExternal.t mem f args with
+ | (mem', InterpretExternal.V vs) -> (mem', vs)
+ | (mem', InterpretExternal.A addr) -> (mem', addr)
+
+let fetch_external_args f st =
+ let size = Mem.size_of_quantity (Primitive.args_byte_size f) in
+ let params = MiscPottier.prefix size I8051.parameters in
+ List.map (fun r -> get_reg r st) params
+
+let set_result st vs =
+ let f st (r, v) = add_reg r v st in
+ List.fold_left f st (MiscPottier.combine I8051.rets vs)
+
+let interpret_external_call st f next_pc =
+ let args = fetch_external_args f st in
+ let (mem, vs) = interpret_external st.mem f args in
+ let st = change_mem st mem in
+ let st = set_result st vs in
+ change_pc st next_pc
+
+let interpret_call lbls_offs st ptr ra =
+ match Mem.find_fun_def st.mem ptr with
+ | LTL.F_int def ->
+ let st = save_ra lbls_offs st ra in
+ init_fun_call lbls_offs st ptr def
+ | LTL.F_ext def ->
+ let next_pc =
+ Val.change_address_offset st.pc (Labels_Offsets.find1 ra lbls_offs) in
+ interpret_external_call st def.AST.ef_tag next_pc
+
+let interpret_return lbls_offs st =
+ let (st, pc) = return_pc st in
+ change_pc st pc
+
+
+(* Interpret statements. *)
+
+let interpret_stmt lbls_offs st stmt =
+ let next_pc = next_pc lbls_offs in
+ match stmt with
+
+ | LTL.St_skip lbl ->
+ next_pc st lbl
+
+ | LTL.St_comment (s, lbl) ->
+(*
+ Printf.printf "*** %s ***\n\n%!" s ;
+*)
+ next_pc st lbl
+
+ | LTL.St_cost (cost_lbl, lbl) ->
+ let st = add_trace st cost_lbl in
+ next_pc st lbl
+
+ | LTL.St_int (r, i, lbl) ->
+ let st = add_reg r (Val.of_int i) st in
+ next_pc st lbl
+
+ | LTL.St_pop lbl ->
+ let (st, v) = pop st in
+ let st = add_reg I8051.a v st in
+ next_pc st lbl
+
+ | LTL.St_push lbl ->
+ let v = get_reg I8051.a st in
+ let st = push st v in
+ next_pc st lbl
+
+ | LTL.St_addr (x, lbl) ->
+ let vs = Mem.find_global st.mem x in
+ let st = add_reg I8051.dpl (List.nth vs 0) st in
+ let st = add_reg I8051.dph (List.nth vs 1) st in
+ next_pc st lbl
+
+ | LTL.St_from_acc (destr, lbl) ->
+ let st = add_reg destr (get_reg (I8051.a) st) st in
+ next_pc st lbl
+
+ | LTL.St_to_acc (srcr, lbl) ->
+ let st = add_reg I8051.a (get_reg srcr st) st in
+ next_pc st lbl
+
+ | LTL.St_opaccs (opaccs, lbl) ->
+ let (a, b) =
+ Eval.opaccs opaccs
+ (get_reg I8051.a st)
+ (get_reg I8051.b st) in
+ let st = add_reg I8051.a a st in
+ let st = add_reg I8051.b b st in
+ next_pc st lbl
+
+ | LTL.St_op1 (op1, lbl) ->
+ let v = Eval.op1 op1 (get_reg I8051.a st) in
+ let st = add_reg I8051.a v st in
+ next_pc st lbl
+
+ | LTL.St_op2 (op2, srcr, lbl) ->
+ let (v, carry) =
+ Eval.op2 st.carry op2
+ (get_reg I8051.a st)
+ (get_reg srcr st) in
+ let st = change_carry st carry in
+ let st = add_reg I8051.a v st in
+ next_pc st lbl
+
+ | LTL.St_clear_carry lbl ->
+ let st = change_carry st Val.zero in
+ next_pc st lbl
+
+ | LTL.St_set_carry lbl ->
+ let st = change_carry st (Val.of_int 1) in
+ next_pc st lbl
+
+ | LTL.St_load lbl ->
+ let addr = dptr st in
+ let v = Mem.load st.mem chunk addr in
+ let st = add_reg I8051.a v st in
+ next_pc st lbl
+
+ | LTL.St_store lbl ->
+ let addr = dptr st in
+ let mem = Mem.store st.mem chunk addr (get_reg I8051.a st) in
+ let st = change_mem st mem in
+ next_pc st lbl
+
+ | LTL.St_call_id (f, lbl) ->
+ interpret_call lbls_offs st (Mem.find_global st.mem f) lbl
+
+ | LTL.St_call_ptr lbl ->
+ interpret_call lbls_offs st (dptr st) lbl
+
+ | LTL.St_condacc (lbl_true, lbl_false) ->
+ let v = get_reg I8051.a st in
+ let lbl =
+ if Val.is_true v then lbl_true
+ else
+ if Val.is_false v then lbl_false
+ else error "Undecidable branchment." in
+ next_pc st lbl
+
+ | LTL.St_return ->
+ interpret_return lbls_offs st
+
+
+let compute_result st =
+ let vs = List.map (fun r -> get_reg r st) I8051.rets in
+ let f res v = res && (Val.is_int v) in
+ let is_int vs = (List.length vs > 0) && (List.fold_left f true vs) in
+ if is_int vs then
+ let chunks =
+ List.map (fun v -> IntValue.Int32.cast (Val.to_int_repr v)) vs in
+ IntValue.Int32.merge chunks
+ else IntValue.Int32.zero
+
+let rec iter_small_step debug lbls_offs st =
+ let print_and_return_result (res, cost_labels) =
+ if debug then Printf.printf "Result = %s\n%!"
+ (IntValue.Int32.to_string res) ;
+ (res, cost_labels) in
+ if debug then print_state lbls_offs st ;
+ match fetch_stmt lbls_offs st with
+ | LTL.St_return when Val.eq_address (snd (return_pc st)) st.exit ->
+ print_and_return_result (compute_result st, List.rev st.trace)
+ | stmt ->
+ let st' = interpret_stmt lbls_offs st stmt in
+ iter_small_step debug lbls_offs st'
+
+
+let add_global_vars =
+ List.fold_left
+ (fun mem (id, size) -> Mem.add_var mem id (AST.SQ (AST.QInt size)) None)
+
+let add_fun_defs =
+ List.fold_left (fun mem (f_id, f_def) -> Mem.add_fun_def mem f_id f_def)
+
+let init_prog (st : state) (p : LTL.program) : state =
+ let mem = add_global_vars (add_fun_defs st.mem p.LTL.functs) p.LTL.vars in
+ change_mem st mem
+
+let init_sp st =
+ let (mem, sp) = Mem.alloc st.mem I8051.ext_ram_size in
+ let sp =
+ Val.change_address_offset sp (Val.Offset.of_int I8051.ext_ram_size) in
+ let st = change_mem st mem in
+ (st, sp)
+
+let init_isp st =
+ let (mem, isp) = Mem.alloc st.mem I8051.int_ram_size in
+ let st = change_mem (change_isp st isp) mem in
+ let (mem, exit) = Mem.alloc st.mem 1 in
+ let st = change_exit st exit in
+ let st = push st (List.nth exit 0) in
+ let st = push st (List.nth exit 1) in
+ st
+
+let init_renv st sp =
+ let f r st = add_reg r Val.undef st in
+ let st = I8051.RegisterSet.fold f I8051.registers st in
+ let spl = List.nth sp 0 in
+ let sph = List.nth sp 1 in
+ let st = add_reg I8051.spl spl st in
+ let st = add_reg I8051.sph sph st in
+ st
+
+let init_main_call lbls_offs st main =
+ let ptr = Mem.find_global st.mem main in
+ match Mem.find_fun_def st.mem ptr with
+ | LTL.F_int def ->
+ init_fun_call lbls_offs st ptr def
+ | _ -> error ("Cannot execute the main (\"" ^ main ^ "\"): it is external.")
+
+
+(* Before interpreting, the environment is initialized:
+ - Build a bijection between the labels in the program and some values (taken
+ amongst the offsets).
+ - Add function definitions to the memory and reserve space for the globals.
+ - Allocate memory to emulate the external stack and initialize the external
+ stack pointer.
+ - Allocate memory to emulate the internal stack and initialize the internal
+ stack pointer.
+ - Initialiaze the physical register environment. All are set to 0, except for
+ the stack pointer registers that take the high and low bits of the external
+ stack pointer.
+ - Initialize a call to the main (set the current program counter to the
+ beginning of the function).
+ - Initialize the carry flag to 0. *)
+
+let interpret debug p =
+ Printf.printf "*** LTL interpret ***\n%!" ;
+ match p.LTL.main with
+ | None -> (IntValue.Int8.zero, [])
+ | Some main ->
+ let lbls_offs = labels_offsets p in
+ let st = empty_state in
+ let st = init_prog st p in
+ let (st, sp) = init_sp st in
+ let st = init_isp st in
+ let st = init_renv st sp in
+ let st = init_main_call lbls_offs st main in
+ let st = change_carry st Val.zero in
+ iter_small_step debug lbls_offs st
--- /dev/null
+
+(** This module provides a function to interpret a [LTL] program and
+ return the trace of cost labels encountered. *)
+
+val interpret: bool -> LTL.program -> AST.trace
--- /dev/null
+
+(** This module provides a function to print [LTL] programs. *)
+
+
+let n_spaces n = String.make n ' '
+
+
+let print_global n (x, size) =
+ Printf.sprintf "%s\"%s\" [%d]" (n_spaces n) x size
+
+let print_globals eformat n globs =
+ Eformat.printf eformat "%sglobals:\n" (n_spaces n) ;
+ List.iter
+ (fun g -> Eformat.printf eformat "%s\n" (print_global (n+2) g)) globs
+
+
+let print_reg = I8051.print_register
+
+let print_a = print_reg I8051.a
+
+
+let print_statement = function
+ | LTL.St_skip lbl -> "--> " ^ lbl
+ | LTL.St_comment (s, lbl) ->
+ Printf.sprintf "*** %s *** --> %s" s lbl
+ | LTL.St_cost (cost_lbl, lbl) ->
+ Printf.sprintf "emit %s --> %s" cost_lbl lbl
+ | LTL.St_int (dstr, i, lbl) ->
+ Printf.sprintf "imm %s, %d --> %s" (print_reg dstr) i lbl
+ | LTL.St_pop lbl ->
+ Printf.sprintf "pop %s --> %s" print_a lbl
+ | LTL.St_push lbl ->
+ Printf.sprintf "push %s --> %s" print_a lbl
+ | LTL.St_addr (id, lbl) ->
+ Printf.sprintf "addr DPTR, %s --> %s" id lbl
+ | LTL.St_from_acc (dstr, lbl) ->
+ Printf.sprintf "move %s, %s --> %s" (print_reg dstr) print_a lbl
+ | LTL.St_to_acc (srcr, lbl) ->
+ Printf.sprintf "move %s, %s --> %s" print_a (print_reg srcr) lbl
+ | LTL.St_opaccs (opaccs, lbl) ->
+ Printf.sprintf "%s %s, %s --> %s"
+ (I8051.print_opaccs opaccs) print_a (print_reg I8051.b) lbl
+ | LTL.St_op1 (op1, lbl) ->
+ Printf.sprintf "%s %s --> %s" (I8051.print_op1 op1) print_a lbl
+ | LTL.St_op2 (op2, srcr, lbl) ->
+ Printf.sprintf "%s %s, %s --> %s"
+ (I8051.print_op2 op2) print_a (print_reg srcr) lbl
+ | LTL.St_clear_carry lbl ->
+ Printf.sprintf "clear CARRY --> %s" lbl
+ | LTL.St_set_carry lbl ->
+ Printf.sprintf "set CARRY --> %s" lbl
+ | LTL.St_load lbl ->
+ Printf.sprintf "movex %s, @DPTR --> %s" print_a lbl
+ | LTL.St_store lbl ->
+ Printf.sprintf "movex @DPTR, %s --> %s" print_a lbl
+ | LTL.St_call_id (f, lbl) -> Printf.sprintf "call \"%s\" --> %s" f lbl
+ | LTL.St_call_ptr lbl ->
+ Printf.sprintf "call_ptr DPTR --> %s" lbl
+ | LTL.St_condacc (lbl_true, lbl_false) ->
+ Printf.sprintf "branch %s <> 0 --> %s, %s" print_a lbl_true lbl_false
+ | LTL.St_return -> Printf.sprintf "return"
+
+
+let print_graph eformat n c =
+ let f lbl stmt =
+ Eformat.printf eformat "%s%s: %s\n"
+ (n_spaces n)
+ lbl
+ (print_statement stmt) in
+ Label.Map.iter f c
+
+
+let print_internal_decl eformat n f def =
+ Eformat.printf eformat
+ "%s\"%s\"\n%sstacksize: %d\n%sentry: %s\n%sexit: %s\n\n"
+ (n_spaces n)
+ f
+ (n_spaces (n+2))
+ def.LTL.f_stacksize
+ (n_spaces (n+2))
+ def.LTL.f_entry
+ (n_spaces (n+2))
+ def.LTL.f_exit ;
+ print_graph eformat (n+2) def.LTL.f_graph
+
+
+let print_external_decl eformat n f def =
+ Eformat.printf eformat "%sextern \"%s\": %s\n"
+ (n_spaces n)
+ f
+ (Primitive.print_sig def.AST.ef_sig)
+
+
+let print_fun_decl eformat n (f, def) = match def with
+ | LTL.F_int def -> print_internal_decl eformat n f def
+ | LTL.F_ext def -> print_external_decl eformat n f def
+
+let print_fun_decls eformat n functs =
+ List.iter
+ (fun f -> print_fun_decl eformat n f ; Eformat.printf eformat "\n\n")
+ functs
+
+
+let print_program p =
+ let eformat = Eformat.create () in
+ Eformat.printf eformat "program:\n\n\n" ;
+ print_globals eformat 2 p.LTL.vars ;
+ Eformat.printf eformat "\n\n" ;
+ print_fun_decls eformat 2 p.LTL.functs ;
+ Eformat.get eformat
--- /dev/null
+
+
+(** This module provides a function to print [LTL] programs. *)
+
+val print_program : LTL.program -> string
+
--- /dev/null
+(* This module provides a translation of LTL programs to LIN programs. *)
+
+(* Adapted from Pottier's PP compiler *)
+
+(* ------------------------------------------------------------------------- *)
+
+(* [translate_statement] translates an [LTL] statement into a [LIN]
+ statement. *)
+
+let translate_statement = function
+
+ (* Because [Branch.compress] has been called before, no [St_skip]
+ statement can be reached. *)
+
+ | LTL.St_skip lbl ->
+ LIN.St_goto lbl
+
+ (* Sequential statements. *)
+
+ | LTL.St_comment (s, _) ->
+ LIN.St_comment s
+ | LTL.St_cost (lbl, _) ->
+ LIN.St_cost lbl
+ | LTL.St_int (r, i, _) ->
+ LIN.St_int (r, i)
+ | LTL.St_addr (x, _) ->
+ LIN.St_addr x
+ | LTL.St_pop _ ->
+ LIN.St_pop
+ | LTL.St_push _ ->
+ LIN.St_push
+ | LTL.St_clear_carry _ ->
+ LIN.St_clear_carry
+ | LTL.St_set_carry _ ->
+ LIN.St_set_carry
+ | LTL.St_from_acc (r, _) ->
+ LIN.St_from_acc (r)
+ | LTL.St_to_acc (r, _) ->
+ LIN.St_to_acc r
+ | LTL.St_opaccs (opaccs, _) ->
+ LIN.St_opaccs opaccs
+ | LTL.St_op1 (op1, _) ->
+ LIN.St_op1 op1
+ | LTL.St_op2 (op2, r, _) ->
+ LIN.St_op2 (op2, r)
+ | LTL.St_load _ ->
+ LIN.St_load
+ | LTL.St_store _ ->
+ LIN.St_store
+ | LTL.St_call_id (f, _) ->
+ LIN.St_call_id f
+ | LTL.St_call_ptr _ ->
+ LIN.St_call_ptr
+
+ (* Conditional branch statement. In [LIN], control implicitly
+ falls through to the second successor, so only the first
+ successor is explicitly mentioned in the statement. *)
+
+ | LTL.St_condacc (lbl_true, _) ->
+ LIN.St_condacc lbl_true
+
+ (* Statement without a successor. *)
+
+ | LTL.St_return ->
+ LIN.St_return
+
+(* ------------------------------------------------------------------------- *)
+
+(* [translate entry graph] turns an [LTL] control flow graph into
+ a [LIN] sequence of statements. *)
+
+let translate_graph entry graph =
+
+ (* Keep track of the labels that have been visited (initially none), of the
+ labels that must exist within the [LIN] code (initially only the graph's
+ entry point) and of the list of [LIN] statements that are being
+ generated (initially empty). Statements are held in the list in reverse
+ order, for efficiency. The list is reversed once generation is over. *)
+
+ let visited, required, statements =
+ ref Label.Set.empty, ref (Label.Set.singleton entry), ref []
+ in
+
+ (* Instantiate the functor. *)
+
+ let module V = LTLToLINI.Visit (struct
+ let fetch label =
+ Label.Map.find label graph
+ let translate_statement =
+ translate_statement
+ let generate statement =
+ statements := statement :: !statements
+ let require label =
+ required := Label.Set.add label !required
+ let mark label =
+ visited := Label.Set.add label !visited
+ let marked label =
+ Label.Set.mem label !visited
+ end) in
+
+ (* Traverse the control flow graph. *)
+
+ V.visit entry;
+
+ (* Now, get rid of the labels that do not need to exist. Also,
+ reverse the list to re-establish the correct order. *)
+
+ List.filter (function
+ | LIN.St_label l ->
+ Label.Set.mem l !required
+ | _ ->
+ true
+ ) (List.rev !statements)
+
+(* ------------------------------------------------------------------------- *)
+
+(* Extend the translation to procedures and programs. *)
+
+let translate_internal int_fun =
+ (* Compress the graph to eliminate gotos (St_skip) statements. *)
+ let entry, graph = Branch.compress int_fun.LTL.f_entry int_fun.LTL.f_graph in
+ translate_graph entry graph
+
+let translate_funct (name, def) =
+ let def' = match def with
+ | LTL.F_int def -> LIN.F_int (translate_internal def)
+ | LTL.F_ext def -> LIN.F_ext def in
+ (name, def')
+
+let translate (p : LTL.program) : LIN.program =
+ { LIN.vars = p.LTL.vars;
+ LIN.functs = List.map translate_funct p.LTL.functs ;
+ LIN.main = p.LTL.main }
--- /dev/null
+
+(** This module is the external part of the translation of [LTL]
+ programs into [LIN] programs. *)
+
+(** The translation mainly consists in compressing the graph (remove all gotos
+ statements) and then transform the graph structure in a sequence of
+ statements. *)
+
+val translate : LTL.program -> LIN.program
--- /dev/null
+(* Adapted from Pottier's PP compiler *)
+
+open MIPSOps
+
+(* ------------------------------------------------------------------------- *)
+
+(* The functor [Visit] implements the core of the translation of
+ [LTL] to [LIN]. *)
+
+module Visit (S : sig
+
+ (* [fetch l] is the statement found at label [l] in the source
+ program. *)
+
+ val fetch: Label.t -> LTL.statement
+
+ (* [translate_statement stmt] translates the [LTL] statement [stmt] to
+ a [LIN] statement. [LTL] statements that have one explicit
+ successor are turned into [LIN] statements with an implicit
+ successor. [LTL] statements that have two explicit successors
+ are turned into [LIN] statements where the first successor is
+ explicit and the second successor is implicit. *)
+
+ val translate_statement: LTL.statement -> LIN.statement
+
+ (* [generate stmt] generates statement [stmt]. Statements are
+ generated sequentially. *)
+
+ val generate: LIN.statement -> unit
+
+ (* [require l] records the fact that the label [l] should explicitly
+ exist in the [LIN] program. It must be used whenever a [LIN]
+ branch statement is issued. *)
+
+ val require: Label.t -> unit
+
+ (* [mark l] marks the label [l]. [marked l] tells whether [l] is
+ marked. *)
+
+ val mark: Label.t -> unit
+ val marked: Label.t -> bool
+
+end) = struct
+
+ open S
+
+ let rec visit l =
+
+ if marked l then begin
+
+ (* Label [l] has been visited before. This implies that an [St_label l]
+ statement has been issued already. We must now generate an
+ [St_goto] statement that transfers control to this place. Because
+ [l] is the target of a branch statement, we require it to exist
+ in the [LIN] code. *)
+
+ require l;
+ generate (LIN.St_goto l)
+
+ end
+ else begin
+
+ (* Label [l] has never been visited before. First, record that it
+ now has been visited, so as to avoid looping. *)
+
+ mark l;
+
+ (* Then, generate an [St_label l] statement. This statement
+ will be useless if [l] turns out not to be the target of a
+ branch: this is taken care of later. *)
+
+ generate (LIN.St_label l);
+
+ (* Fetch the statement found at label [l] in the source program. *)
+
+ let statement = fetch l in
+
+ (* As an optional optimization, check if this is a conditional branch
+ whose implicit successor has been visited before and whose explicit
+ successor has not. In that case, if we did nothing special, we would
+ produce a conditional branch immediately followed with an
+ unconditional one, like this:
+
+ bgtz $t1, find24
+ j find42
+ find24:
+ ...
+
+ This can be avoided simply by reversing the condition:
+
+ blez $t1, find42
+ ...
+
+ *)
+
+ (* But in fact, there is only a unique conditional branch statement in
+ LTL for the 8051, so this is optimization is not used. *)
+
+ (* Translate the statement. *)
+
+ generate (translate_statement statement);
+
+ (* Note that [translate_statement] never produces an [St_goto]
+ statement. As a result, the code above never generates an [St_label]
+ statement immediately followed with an [St_goto] statement. This
+ proves that we never generate a (conditional or unconditional) branch
+ towards an [St_goto] statement. *)
+
+ (* There now remains to visit the statement's successors. *)
+
+ match statement with
+
+ (* Sequential statements. There is only one successor, with implicit
+ fallthrough. *)
+
+ | LTL.St_skip l
+ | LTL.St_comment (_, l)
+ | LTL.St_cost (_, l)
+ | LTL.St_int (_, _, l)
+ | LTL.St_pop l
+ | LTL.St_push l
+ | LTL.St_addr (_, l)
+ | LTL.St_from_acc (_, l)
+ | LTL.St_to_acc (_, l)
+ | LTL.St_opaccs (_, l)
+ | LTL.St_op1 (_, l)
+ | LTL.St_op2 (_, _, l)
+ | LTL.St_clear_carry l
+ | LTL.St_set_carry l
+ | LTL.St_load l
+ | LTL.St_store l
+ | LTL.St_call_id (_, l)
+ | LTL.St_call_ptr l ->
+
+ visit l
+
+ (* Conditional branch statement. The label that is reached by
+ falling through in [LIN] is [l2], which means that it must be
+ translated first, so that its statements are contiguous with the
+ [LIN] branch statement. The label [l1], on the other hand,
+ becomes the target of a jump, so it is required to exist in the
+ [LIN] code.
+
+ Code for [l1] is generated, if necessary, after we are done dealing
+ with [l2]. If [l1] has already been visited at this point, no code
+ needs be produced, so the second call to visit is made only if [l1]
+ has not been visited yet. *)
+
+ | LTL.St_condacc (l1, l2) ->
+
+ visit l2;
+ require l1;
+ if not (marked l1) then
+ visit l1
+
+ (* Statement without a successor. *)
+
+ (* We would prefer to duplicate, rather than share, these
+ statements. Indeed, it is inefficient to generate a jump towards
+ one of these statements. Unfortunately, it is not easy to achieve
+ this, for two reasons. First, frame deletion is in the way. Second,
+ and worse, we must not generate duplicate labels. Maybe I will find
+ a fix in the future. *)
+
+ | LTL.St_return ->
+
+ ()
+
+ end
+
+end
+
--- /dev/null
+
+(** This module is the central part of the translation of [LTL]
+ programs into [LIN] programs. *)
+
+(* Adapted from Pottier's PP compiler *)
+
+(* The functor [Visit] implements the core of the translation of
+ [LTL] to [LIN]. *)
+
+module Visit (S : sig
+
+ (* [fetch l] is the statement found at label [l] in the source
+ program. *)
+
+ val fetch: Label.t -> LTL.statement
+
+ (* [translate_statement stmt] translates the [LTL] statement [stmt] to
+ a [LIN] statement. [LTL] statements that have one explicit
+ successor are turned into [LIN] statements with an implicit
+ successor. [LTL] statements that have two explicit successors
+ are turned into [LIN] statements where the first successor is
+ explicit and the second successor is implicit. *)
+
+ val translate_statement: LTL.statement -> LIN.statement
+
+ (* [generate stmt] generates statement [stmt]. Statements are
+ generated sequentially. *)
+
+ val generate: LIN.statement -> unit
+
+ (* [require l] records the fact that the label [l] should explicitly
+ exist in the [LIN] program. It must be used whenever a [LIN]
+ branch statement is issued. *)
+
+ val require: Label.t -> unit
+
+ (* [mark l] marks the label [l]. [marked l] tells whether [l] is
+ marked. *)
+
+ val mark: Label.t -> unit
+ val marked: Label.t -> bool
+
+end) : sig
+
+ (* [visit] implements a depth-first traversal of the control flow graph,
+ generating statements as new nodes are being discovered.
+
+ If label [l] has already been discovered, then [visit l] issues
+ an [St_goto] statement towards [l]. If [l] has not been
+ discovered yet, [visit l] marks [l] as discovered, issues an
+ [St_label] statement, translates the statement found at [l] in
+ the source program, and visits its successors. *)
+
+ val visit: Label.t -> unit
+
+end
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+open LTL
+
+let compress entry graph =
+
+ (* Build a table that maps every graph label to a distinct ``point''
+ in the sense of [UnionFind]. *)
+
+ let points =
+ Label.Map.mapi (fun label _ ->
+ UnionFind.fresh label
+ ) graph
+ in
+
+ let lookup label =
+ try
+ Label.Map.find label points
+ with Not_found ->
+ assert false
+ in
+
+ (* For every [St_skip] statement, make the source label an alias for
+ the target label, unless the former is already an alias for the
+ latter (which means that the graph contains a cycle of [St_skip]
+ statements). *)
+
+ Label.Map.iter (fun src stmt ->
+ let source = lookup src in
+ match stmt with
+ | St_skip trgt ->
+ let target = lookup trgt in
+ if UnionFind.equivalent source target then
+ assert false (* can happen if the program contains an empty infinite loop, but let's ignore that *)
+ else
+ UnionFind.union source target
+ | _ ->
+ ()
+ ) graph;
+
+ (* Transform the graph by replacing every label with its representative. *)
+
+ let rep label =
+ UnionFind.find (lookup label)
+ in
+
+ rep entry, Label.Map.map (function
+ | LTL.St_skip l ->
+ LTL.St_skip (rep l) (* statement will be unreachable *)
+ | LTL.St_comment (s, l) ->
+ LTL.St_comment (s, rep l)
+ | LTL.St_cost (lbl, l) ->
+ LTL.St_cost (lbl, rep l)
+ | LTL.St_int (r, i, l) ->
+ LTL.St_int (r, i, rep l)
+ | LTL.St_addr (x, l) ->
+ LTL.St_addr (x, rep l)
+ | LTL.St_pop l ->
+ LTL.St_pop (rep l)
+ | LTL.St_push l ->
+ LTL.St_push (rep l)
+ | LTL.St_clear_carry l ->
+ LTL.St_clear_carry (rep l)
+ | LTL.St_set_carry l ->
+ LTL.St_set_carry (rep l)
+ | LTL.St_from_acc (r, l) ->
+ LTL.St_from_acc (r, rep l)
+ | LTL.St_to_acc (r, l) ->
+ LTL.St_to_acc (r, rep l)
+ | LTL.St_opaccs (opaccs, l) ->
+ LTL.St_opaccs (opaccs, rep l)
+ | LTL.St_op1 (op1, l) ->
+ LTL.St_op1 (op1, rep l)
+ | LTL.St_op2 (op2, r, l) ->
+ LTL.St_op2 (op2, r, rep l)
+ | LTL.St_load l ->
+ LTL.St_load (rep l)
+ | LTL.St_store l ->
+ LTL.St_store (rep l)
+ | LTL.St_call_id (f, l) ->
+ LTL.St_call_id (f, rep l)
+ | LTL.St_call_ptr l ->
+ LTL.St_call_ptr (rep l)
+ | LTL.St_condacc (lbl_true, lbl_false) ->
+ LTL.St_condacc (rep lbl_true, rep lbl_false)
+ | LTL.St_return ->
+ LTL.St_return
+ ) graph
--- /dev/null
+
+(** This module optimizes [LTL] code by suppressing all empty
+ statements. *)
+
+(* Pasted from Pottier's PP compiler *)
+
+(* This module optimizes [LTL] code by suppressing all [St_skip] statements. In
+ short, every statement whose successor is a [St_skip] statement is modified
+ so that its successor is the successor of the [St_skip] statement, and this
+ is repeated until no reachable [St_skip] statements remain. Unreachable
+ [St_skip] statements remain in the graph, but will be implicitly eliminated
+ in the translation of [LTL] to [LIN]. *)
+
+val compress: Label.t -> LTL.graph -> (Label.t * LTL.graph)
--- /dev/null
+
+(** This module defines the abstract syntax tree of [RTL]. *)
+
+(* The main differences between RTLabs and RTL is instruction selection.
+
+ Also, since addresses in 8051 are two words long, the instructions involving
+ addresses use two registers to represent them. *)
+
+type registers = Register.t list
+
+type statement =
+
+ (* The empty statement. *)
+ | St_skip of Label.t
+
+ (* Emit a cost label. *)
+ | St_cost of CostLabel.t * Label.t
+
+ (* Assign the address of a symbol to registers. Parameters are the destination
+ registers (low bytes first), the symbol and the label of the next
+ statement. *)
+ | St_addr of Register.t * Register.t * AST.ident * Label.t
+
+ (* Assign the stack pointer to registers. Parameters are the destination
+ registers (low bytes first), and the label of the next statement. *)
+ | St_stackaddr of Register.t * Register.t * Label.t
+
+ (* Assign an integer constant to a register. Parameters are the destination
+ register, the integer and the label of the next statement. *)
+ | St_int of Register.t * int * Label.t
+
+ (* Move the content of a register to another. Parameters are the destination
+ register, the source register, and the label of the next statement. *)
+ | St_move of Register.t * Register.t * Label.t
+
+ (* Apply a binary operation that will later be translated in an operation on
+ the accumulators. Parameters are the operation, the destination registers
+ (ACC first, BACC second), the source registers, and the label of the next
+ statement. *)
+ | St_opaccs of I8051.opaccs * Register.t * Register.t *
+ Register.t * Register.t * Label.t
+
+ (* Apply an unary operation. Parameters are the operation, the destination
+ register, the source register, and the label of the next statement. *)
+ | St_op1 of I8051.op1 * Register.t * Register.t * Label.t
+
+ (* Apply a binary operation. Parameters are the operation, the destination
+ register, the source registers, and the label of the next statement. *)
+ | St_op2 of I8051.op2 * Register.t * Register.t * Register.t * Label.t
+
+ (* Set the carry flag to zero. Parameter is the label of the next
+ statement. *)
+ | St_clear_carry of Label.t
+
+ (* Set the carry flag to 1. Parameter is the label of the next statement. *)
+ | St_set_carry of Label.t
+
+ (* Load from external memory. Parameters are the destination register, the
+ address registers (low bytes first), and the label of the next
+ statement. *)
+ | St_load of Register.t * Register.t * Register.t * Label.t
+
+ (* Store to external memory. Parameters are the address registers (low bytes
+ first), the source register, and the label of the next statement. *)
+ | St_store of Register.t * Register.t * Register.t * Label.t
+
+ (* Call to a function given its name. Parameters are the name of the function,
+ the arguments of the function, the destination registers, and the label of
+ the next statement. *)
+ | St_call_id of AST.ident * Register.t list * registers * Label.t
+
+ (* Call to a function given its address. Parameters are the registers holding
+ the address of the function (low bytes first), the arguments of the
+ function, the destination registers, and the label of the next
+ statement. *)
+ | St_call_ptr of Register.t * Register.t * Register.t list * registers *
+ Label.t
+
+ (* Tail call to a function given its name. Parameters are the name of the
+ function, and the arguments of the function. *)
+ | St_tailcall_id of AST.ident * Register.t list
+
+ (* Tail call to a function given its address. Parameters are the registers
+ holding the address of the function (low bytes first), and the arguments of
+ the function. *)
+ | St_tailcall_ptr of Register.t * Register.t * Register.t list
+
+ (* Branch. Parameters are the register holding the value for the branching,
+ the label to go to when the value is not 0, and the label to go to when the
+ value is 0. *)
+ | St_cond of Register.t * Label.t * Label.t
+
+ (* Return the value of some registers (low bytes first). *)
+ | St_return of registers
+
+
+type graph = statement Label.Map.t
+
+type internal_function =
+ { f_luniverse : Label.Gen.universe ;
+ f_runiverse : Register.universe ;
+ f_result : Register.t list (* low byte first *) ;
+ f_params : Register.t list ;
+ f_locals : Register.Set.t ;
+ f_stacksize : int ;
+ f_graph : graph ;
+ f_entry : Label.t ;
+ f_exit : Label.t }
+
+type function_def =
+ | F_int of internal_function
+ | F_ext of AST.external_function
+
+(* A program is a list of global variables and their reserved space, a list of
+ function names and their definition, and the name of the main function. *)
+
+type program =
+ { vars : (AST.ident * int (* size *)) list ;
+ functs : (AST.ident * function_def) list ;
+ main : AST.ident option }
--- /dev/null
+
+(** This module provides an interpreter for the RTL language. *)
+
+
+let error_prefix = "RTL interpret"
+let error s = Error.global_error error_prefix s
+
+
+module Mem = Driver.RTLMemory
+module Val = Mem.Value
+let chunk = Driver.RTLMemory.int_size
+module Eval = I8051.Eval (Val)
+
+
+type memory = RTL.function_def Mem.memory
+
+
+(* Local environments. They associate a value to the registers of the function
+ being executed. *)
+
+type local_env = Val.t Register.Map.t
+
+(* Call frames. The execution state has a call stack, each element of the stack
+ being composed of the return registers to store the result of the callee, the
+ graph, the node, the local environment and the value of the carry to resume
+ the execution of the caller. *)
+
+type stack_frame =
+ { ret_regs : Register.t list ;
+ graph : RTL.graph ;
+ pc : Label.t ;
+ sp : Val.address ;
+ lenv : local_env ;
+ carry : Val.t }
+
+(* Execution states. There are three possible states :
+ - The constructor [State] represents a state when executing a function
+ - The constructor [CallState] represents a state when calling a function
+ - The constructor [ReturnState] represents a state when leaving a function *)
+
+type state =
+ | State of stack_frame list * RTL.graph * Label.t * Val.address (* sp *) *
+ local_env * Val.t (* carry *) * memory * CostLabel.t list
+ | CallState of stack_frame list * RTL.function_def *
+ Val.t list (* args *) * memory * CostLabel.t list
+ | ReturnState of stack_frame list * Val.t list (* return values *) *
+ memory * CostLabel.t list
+
+let string_of_local_env lenv =
+ let f x v s =
+ s ^
+ (if Val.eq v Val.undef then ""
+ else (Register.print x) ^ " = " ^ (Val.to_string v) ^ " ") in
+ Register.Map.fold f lenv ""
+
+let string_of_args args =
+ let f s v = s ^ " " ^ (Val.to_string v) in
+ List.fold_left f "" args
+
+let print_state = function
+ | State (_, _, lbl, sp, lenv, carry, mem, _) ->
+ Printf.printf "Stack pointer: %s\n\nCarry: %s\n\nLocal environment:\n%s\n\nMemory:%s\nRegular state: %s\n\n%!"
+ (Val.string_of_address sp)
+ (Val.to_string carry)
+ (string_of_local_env lenv)
+ (Mem.to_string mem)
+ lbl
+ | CallState (_, _, args, mem, _) ->
+ Printf.printf "Memory:%s\nCall state: %s\n\n%!"
+ (Mem.to_string mem)
+ (string_of_args args)
+ | ReturnState (_, vs, mem, _) ->
+ Printf.printf "Memory:%s\nReturn state: %s\n\n%!"
+ (Mem.to_string mem)
+ (string_of_args vs)
+
+
+let find_function mem f =
+ let addr = Mem.find_global mem f in
+ Mem.find_fun_def mem addr
+
+let get_local_value (lenv : local_env) (r : Register.t) : Val.t =
+ if Register.Map.mem r lenv then Register.Map.find r lenv
+ else error ("Unknown local register \"" ^ (Register.print r) ^ "\".")
+let get_arg_values lenv args = List.map (get_local_value lenv) args
+
+let get_local_addr lenv f1 f2 =
+ List.map (get_local_value lenv) [f1 ; f2]
+
+
+let adds rs vs lenv =
+ let f lenv r v = Register.Map.add r v lenv in
+ List.fold_left2 f lenv rs vs
+
+
+(* Assign a value to some destinations registers. *)
+
+let assign_state sfrs graph lbl sp lenv carry mem trace destrs vs =
+ let lenv = adds destrs vs lenv in
+ State (sfrs, graph, lbl, sp, lenv, carry, mem, trace)
+
+(* Branch on a value. *)
+
+let branch_state sfrs graph lbl_true lbl_false sp lenv carry mem trace v =
+ let next_lbl =
+ if Val.is_true v then lbl_true
+ else
+ if Val.is_false v then lbl_false
+ else error "Undefined conditional value." in
+ State (sfrs, graph, next_lbl, sp, lenv, carry, mem, trace)
+
+
+(* Interpret statements. *)
+
+let interpret_statement
+ (sfrs : stack_frame list)
+ (graph : RTL.graph)
+ (sp : Val.address)
+ (lenv : local_env)
+ (carry : Val.t)
+ (mem : memory)
+ (stmt : RTL.statement)
+ (trace : CostLabel.t list) :
+ state = match stmt with
+
+ | RTL.St_skip lbl ->
+ State (sfrs, graph, lbl, sp, lenv, carry, mem, trace)
+
+ | RTL.St_cost (cost_lbl, lbl) ->
+ State (sfrs, graph, lbl, sp, lenv, carry, mem, cost_lbl :: trace)
+
+ | RTL.St_addr (r1, r2, x, lbl) ->
+ assign_state sfrs graph lbl sp lenv carry mem trace [r1 ; r2]
+ (Mem.find_global mem x)
+
+ | RTL.St_stackaddr (r1, r2, lbl) ->
+ assign_state sfrs graph lbl sp lenv carry mem trace [r1 ; r2] sp
+
+ | RTL.St_int (r, i, lbl) ->
+ assign_state sfrs graph lbl sp lenv carry mem trace [r] [Val.of_int i]
+
+ | RTL.St_move (destr, srcr, lbl) ->
+ assign_state sfrs graph lbl sp lenv carry mem trace [destr]
+ [get_local_value lenv srcr]
+
+ | RTL.St_opaccs (opaccs, destr1, destr2, srcr1, srcr2, lbl) ->
+ let (v1, v2) =
+ Eval.opaccs opaccs
+ (get_local_value lenv srcr1)
+ (get_local_value lenv srcr2) in
+ assign_state sfrs graph lbl sp lenv carry mem trace
+ [destr1 ; destr2] [v1 ; v2]
+
+ | RTL.St_op1 (op1, destr, srcr, lbl) ->
+ let v = Eval.op1 op1 (get_local_value lenv srcr) in
+ assign_state sfrs graph lbl sp lenv carry mem trace [destr] [v]
+
+ | RTL.St_op2 (op2, destr, srcr1, srcr2, lbl) ->
+ let (v, carry) =
+ Eval.op2 carry op2
+ (get_local_value lenv srcr1)
+ (get_local_value lenv srcr2) in
+ assign_state sfrs graph lbl sp lenv carry mem trace [destr] [v]
+
+ | RTL.St_clear_carry lbl ->
+ State (sfrs, graph, lbl, sp, lenv, Val.zero, mem, trace)
+
+ | RTL.St_set_carry lbl ->
+ State (sfrs, graph, lbl, sp, lenv, Val.of_int 1, mem, trace)
+
+ | RTL.St_load (destr, addr1, addr2, lbl) ->
+ let addr = get_local_addr lenv addr1 addr2 in
+ let v = Mem.load mem chunk addr in
+ assign_state sfrs graph lbl sp lenv carry mem trace [destr] [v]
+
+ | RTL.St_store (addr1, addr2, srcr, lbl) ->
+ let addr = get_local_addr lenv addr1 addr2 in
+ let mem = Mem.store mem chunk addr (get_local_value lenv srcr) in
+ State (sfrs, graph, lbl, sp, lenv, carry, mem, trace)
+
+ | RTL.St_call_id (f, args, ret_regs, lbl) ->
+ let f_def = find_function mem f in
+ let args = get_arg_values lenv args in
+ let sf =
+ { ret_regs = ret_regs ; graph = graph ; pc = lbl ;
+ sp = sp ; lenv = lenv ; carry = carry }
+ in
+ CallState (sf :: sfrs, f_def, args, mem, trace)
+
+ | RTL.St_call_ptr (f1, f2, args, ret_regs, lbl) ->
+ let addr = get_local_addr lenv f1 f2 in
+ let f_def = Mem.find_fun_def mem addr in
+ let args = get_arg_values lenv args in
+ let sf = { ret_regs = ret_regs ; graph = graph ; pc = lbl ;
+ sp = sp ; lenv = lenv ; carry = carry } in
+ CallState (sf :: sfrs, f_def, args, mem, trace)
+
+ | RTL.St_tailcall_id (f, args) ->
+ let f_def = find_function mem f in
+ let args = get_arg_values lenv args in
+ let mem = Mem.free mem sp in
+ CallState (sfrs, f_def, args, mem, trace)
+
+ | RTL.St_tailcall_ptr (f1, f2, args) ->
+ let addr = get_local_addr lenv f1 f2 in
+ let f_def = Mem.find_fun_def mem addr in
+ let args = get_arg_values lenv args in
+ let mem = Mem.free mem sp in
+ CallState (sfrs, f_def, args, mem, trace)
+
+ | RTL.St_cond (srcr, lbl_true, lbl_false) ->
+ let v = get_local_value lenv srcr in
+ branch_state sfrs graph lbl_true lbl_false sp lenv carry mem trace v
+
+ | RTL.St_return rl ->
+ let vl = List.map (get_local_value lenv) rl in
+ let mem = Mem.free mem sp in
+ ReturnState (sfrs, vl, mem, trace)
+
+
+module InterpretExternal = Primitive.Interpret (Mem)
+
+let interpret_external mem f args = match InterpretExternal.t mem f args with
+ | (mem', InterpretExternal.V vs) -> (mem', vs)
+ | (mem', InterpretExternal.A addr) -> (mem', addr)
+
+let init_locals
+ (locals : Register.Set.t)
+ (params : Register.t list)
+ (args : Val.t list) :
+ local_env =
+ let f r lenv = Register.Map.add r Val.undef lenv in
+ let lenv = Register.Set.fold f locals Register.Map.empty in
+ let f lenv r v = Register.Map.add r v lenv in
+ List.fold_left2 f lenv params args
+
+let state_after_call
+ (sfrs : stack_frame list)
+ (f_def : RTL.function_def)
+ (args : Val.t list)
+ (mem : memory)
+ (trace : CostLabel.t list) :
+ state =
+ match f_def with
+ | RTL.F_int def ->
+ let (mem', sp) = Mem.alloc mem def.RTL.f_stacksize in
+ State (sfrs, def.RTL.f_graph, def.RTL.f_entry, sp,
+ init_locals def.RTL.f_locals def.RTL.f_params args,
+ Val.undef, mem', trace)
+ | RTL.F_ext def ->
+ let (mem', vs) = interpret_external mem def.AST.ef_tag args in
+ ReturnState (sfrs, vs, mem', trace)
+
+let state_after_return
+ (sf : stack_frame)
+ (sfrs : stack_frame list)
+ (ret_vals : Val.t list)
+ (mem : memory)
+ (trace : CostLabel.t list) :
+ state =
+ let f i lenv r = Register.Map.add r (List.nth ret_vals i) lenv in
+ let lenv = MiscPottier.foldi f sf.lenv sf.ret_regs in
+ State (sfrs, sf.graph, sf.pc, sf.sp, lenv, sf.carry, mem, trace)
+
+
+let small_step (st : state) : state = match st with
+ | State (sfrs, graph, pc, sp, lenv, carry, mem, trace) ->
+ let stmt = Label.Map.find pc graph in
+ interpret_statement sfrs graph sp lenv carry mem stmt trace
+ | CallState (sfrs, f_def, args, mem, trace) ->
+ state_after_call sfrs f_def args mem trace
+ | ReturnState ([], ret_vals, mem, trace) ->
+ assert false (* End of execution; handled in iter_small_step. *)
+ | ReturnState (sf :: sfrs, ret_vals, mem, trace) ->
+ state_after_return sf sfrs ret_vals mem trace
+
+
+let compute_result vs =
+ let f res v = res && (Val.is_int v) in
+ let is_int vs = (List.length vs > 0) && (List.fold_left f true vs) in
+ if is_int vs then
+ let chunks =
+ List.map (fun v -> IntValue.Int32.cast (Val.to_int_repr v)) vs in
+ IntValue.Int32.merge chunks
+ else IntValue.Int32.zero
+
+let rec iter_small_step debug st =
+ let print_and_return_result (res, cost_labels) =
+ if debug then Printf.printf "Result = %s\n%!"
+ (IntValue.Int32.to_string res) ;
+ (res, cost_labels) in
+ if debug then print_state st ;
+ match small_step st with
+ | ReturnState ([], vs, mem, trace) ->
+ print_and_return_result (compute_result vs, List.rev trace)
+ | st' -> iter_small_step debug st'
+
+
+let add_global_vars =
+ List.fold_left
+ (fun mem (id, size) -> Mem.add_var mem id (AST.SQ (AST.QInt size)) None)
+
+let add_fun_defs =
+ List.fold_left (fun mem (f_id, f_def) -> Mem.add_fun_def mem f_id f_def)
+
+
+(* The memory is initialized by loading the code into it, and by reserving space
+ for the global variables. *)
+
+let init_mem (p : RTL.program) : memory =
+ add_global_vars (add_fun_defs Mem.empty p.RTL.functs) p.RTL.vars
+
+
+(* Interpret the program only if it has a main. *)
+
+let interpret debug p =
+ Printf.printf "*** RTL interpret ***\n%!" ;
+ match p.RTL.main with
+ | None -> (IntValue.Int32.zero, [])
+ | Some main ->
+ let mem = init_mem p in
+ let main_def = find_function mem main in
+ let st = CallState ([], main_def, [], mem, []) in
+ iter_small_step debug st
--- /dev/null
+
+(** This module provides a function to interpret a [RTL] program
+ and return the trace of cost labels encountered. *)
+
+val interpret : bool -> RTL.program -> AST.trace
--- /dev/null
+
+(** This module provides a function to print [RTL] programs. *)
+
+
+let n_spaces n = String.make n ' '
+
+
+let print_global n (x, size) =
+ Printf.sprintf "%s\"%s\" [%d]" (n_spaces n) x size
+
+let print_globals eformat n globs =
+ Eformat.printf eformat "%sglobals:\n" (n_spaces n) ;
+ List.iter
+ (fun g -> Eformat.printf eformat "%s\n" (print_global (n+2) g)) globs
+
+let print_reg = Register.print
+
+let reg_set_to_list rs =
+ let e = ref [] in
+ Register.Set.iter (fun r -> e := r :: !e) rs;
+ List.rev !e
+
+let print_reg_list first last sep f rl =
+ Printf.sprintf "%s%s%s"
+ first (MiscPottier.string_of_list sep f rl) last
+
+let print_ptr rl = print_reg_list "[" "]" " ; " print_reg rl
+
+let print_args rl = print_reg_list "(" ")" ", " print_reg rl
+
+let print_return rl = print_reg_list "[" "]" " ; " print_reg rl
+
+let print_params rl = print_reg_list "(" ")" ", " Register.print rl
+
+let print_locals rs =
+ let rl = reg_set_to_list rs in
+ Printf.sprintf "%s" (print_reg_list "" "" ", " Register.print rl)
+
+let print_result rl = print_reg_list "[" "]" " ; " Register.print rl
+
+
+let print_statement = function
+ | RTL.St_skip lbl -> "--> " ^ lbl
+ | RTL.St_cost (cost_lbl, lbl) ->
+ Printf.sprintf "emit %s --> %s" cost_lbl lbl
+ | RTL.St_addr (dstr1, dstr2, id, lbl) ->
+ Printf.sprintf "imm (%s, %s), %s --> %s"
+ (print_reg dstr1) (print_reg dstr2) id lbl
+ | RTL.St_stackaddr (dstr1, dstr2, lbl) ->
+ Printf.sprintf "imm (%s, %s), STACK --> %s"
+ (print_reg dstr1) (print_reg dstr2) lbl
+ | RTL.St_int (dstr, i, lbl) ->
+ Printf.sprintf "imm %s, %d --> %s" (print_reg dstr) i lbl
+ | RTL.St_move (dstr, srcr, lbl) ->
+ Printf.sprintf "move %s, %s --> %s"
+ (print_reg dstr) (print_reg srcr) lbl
+ | RTL.St_opaccs (opaccs, dstr1, dstr2, srcr1, srcr2, lbl) ->
+ Printf.sprintf "%s (%s, %s) %s, %s --> %s"
+ (I8051.print_opaccs opaccs)
+ (print_reg dstr1)
+ (print_reg dstr2)
+ (print_reg srcr1)
+ (print_reg srcr2)
+ lbl
+ | RTL.St_op1 (op1, dstr, srcr, lbl) ->
+ Printf.sprintf "%s %s, %s --> %s"
+ (I8051.print_op1 op1) (print_reg dstr) (print_reg srcr) lbl
+ | RTL.St_op2 (op2, dstr, srcr1, srcr2, lbl) ->
+ Printf.sprintf "%s %s, %s, %s --> %s"
+ (I8051.print_op2 op2)
+ (print_reg dstr)
+ (print_reg srcr1)
+ (print_reg srcr2)
+ lbl
+ | RTL.St_clear_carry lbl ->
+ Printf.sprintf "clear CARRY --> %s" lbl
+ | RTL.St_set_carry lbl ->
+ Printf.sprintf "set CARRY --> %s" lbl
+ | RTL.St_load (dstr, addr1, addr2, lbl) ->
+ Printf.sprintf "load %s, (%s, %s) --> %s"
+ (print_reg dstr)
+ (print_reg addr1)
+ (print_reg addr2)
+ lbl
+ | RTL.St_store (addr1, addr2, srcr, lbl) ->
+ Printf.sprintf "store (%s, %s), %s --> %s"
+ (print_reg addr1)
+ (print_reg addr2)
+ (print_reg srcr)
+ lbl
+ | RTL.St_call_id (f, args, dstrs, lbl) ->
+ Printf.sprintf "call \"%s\", %s, %s --> %s"
+ f
+ (print_args args)
+ (print_return dstrs)
+ lbl
+ | RTL.St_call_ptr (f1, f2, args, dstrs, lbl) ->
+ Printf.sprintf "call_ptr [%s ; %s], %s, %s --> %s"
+ (print_reg f1)
+ (print_reg f2)
+ (print_args args)
+ (print_return dstrs)
+ lbl
+ | RTL.St_tailcall_id (f, args) ->
+ Printf.sprintf "tailcall \"%s\", %s"
+ f
+ (print_args args)
+ | RTL.St_tailcall_ptr (f1, f2, args) ->
+ Printf.sprintf "tailcall_ptr [%s ; %s], %s"
+ (print_reg f1)
+ (print_reg f2)
+ (print_args args)
+ | RTL.St_cond (srcr, lbl_true, lbl_false) ->
+ Printf.sprintf "branch %s <> 0 --> %s, %s"
+ (print_reg srcr) lbl_true lbl_false
+ | RTL.St_return regs ->
+ Printf.sprintf "return %s" (print_return regs)
+
+
+let print_graph eformat n c =
+ let f lbl stmt =
+ Eformat.printf eformat "%s%s: %s\n"
+ (n_spaces n)
+ lbl
+ (print_statement stmt) in
+ Label.Map.iter f c
+
+
+let print_internal_decl eformat n f def =
+ Eformat.printf eformat
+ "%s\"%s\"%s\n%slocals: %s\n%sresult: %s\n%sstacksize: %d\n%sentry: %s\n%sexit: %s\n\n"
+ (n_spaces n)
+ f
+ (print_params def.RTL.f_params)
+ (n_spaces (n+2))
+ (print_locals def.RTL.f_locals)
+ (n_spaces (n+2))
+ (print_result def.RTL.f_result)
+ (n_spaces (n+2))
+ def.RTL.f_stacksize
+ (n_spaces (n+2))
+ def.RTL.f_entry
+ (n_spaces (n+2))
+ def.RTL.f_exit ;
+ print_graph eformat (n+2) def.RTL.f_graph
+
+
+let print_external_decl eformat n f def =
+ Eformat.printf eformat "%sextern \"%s\": %s\n"
+ (n_spaces n)
+ f
+ (Primitive.print_sig def.AST.ef_sig)
+
+
+let print_fun_decl eformat n (f, def) = match def with
+ | RTL.F_int def -> print_internal_decl eformat n f def
+ | RTL.F_ext def -> print_external_decl eformat n f def
+
+let print_fun_decls eformat n functs =
+ List.iter
+ (fun f -> print_fun_decl eformat n f ; Eformat.printf eformat "\n\n")
+ functs
+
+
+let print_program p =
+ let eformat = Eformat.create () in
+ Eformat.printf eformat "program:\n\n\n" ;
+ print_globals eformat 2 p.RTL.vars ;
+ Eformat.printf eformat "\n\n" ;
+ print_fun_decls eformat 2 p.RTL.functs ;
+ Eformat.get eformat
--- /dev/null
+
+(** This module provides a function to print [RTL] programs. *)
+
+val print_program : RTL.program -> string
--- /dev/null
+
+(** This module provides a translation of [RTL] programs to [ERTL]
+ programs. *)
+
+
+let error_prefix = "RTL to ERTL"
+let error = Error.global_error error_prefix
+
+
+(* Helper functions *)
+
+let change_exit_label lbl def =
+ { def with ERTL.f_exit = lbl }
+
+let add_graph lbl stmt def =
+ { def with ERTL.f_graph = Label.Map.add lbl stmt def.ERTL.f_graph }
+
+let fresh_label def = Label.Gen.fresh def.ERTL.f_luniverse
+
+let change_label lbl = function
+ | ERTL.St_skip _ -> ERTL.St_skip lbl
+ | ERTL.St_comment (s, _) -> ERTL.St_comment (s, lbl)
+ | ERTL.St_cost (cost_lbl, _) -> ERTL.St_cost (cost_lbl, lbl)
+ | ERTL.St_get_hdw (r1, r2, _) -> ERTL.St_get_hdw (r1, r2, lbl)
+ | ERTL.St_set_hdw (r1, r2, _) -> ERTL.St_set_hdw (r1, r2, lbl)
+ | ERTL.St_hdw_to_hdw (r1, r2, _) -> ERTL.St_hdw_to_hdw (r1, r2, lbl)
+ | ERTL.St_newframe _ -> ERTL.St_newframe lbl
+ | ERTL.St_delframe _ -> ERTL.St_delframe lbl
+ | ERTL.St_framesize (r, _) -> ERTL.St_framesize (r, lbl)
+ | ERTL.St_pop (r, _) -> ERTL.St_pop (r, lbl)
+ | ERTL.St_push (r, _) -> ERTL.St_push (r, lbl)
+ | ERTL.St_addrH (r, id, _) -> ERTL.St_addrH (r, id, lbl)
+ | ERTL.St_addrL (r, id, _) -> ERTL.St_addrL (r, id, lbl)
+ | ERTL.St_int (r, i, _) -> ERTL.St_int (r, i, lbl)
+ | ERTL.St_move (r1, r2, _) -> ERTL.St_move (r1, r2, lbl)
+ | ERTL.St_opaccsA (opaccs, dstr, srcr1, srcr2, _) ->
+ ERTL.St_opaccsA (opaccs, dstr, srcr1, srcr2, lbl)
+ | ERTL.St_opaccsB (opaccs, dstr, srcr1, srcr2, _) ->
+ ERTL.St_opaccsB (opaccs, dstr, srcr1, srcr2, lbl)
+ | ERTL.St_op1 (op1, dstr, srcr, _) -> ERTL.St_op1 (op1, dstr, srcr, lbl)
+ | ERTL.St_op2 (op2, dstr, srcr1, srcr2, _) ->
+ ERTL.St_op2 (op2, dstr, srcr1, srcr2, lbl)
+ | ERTL.St_clear_carry _ -> ERTL.St_clear_carry lbl
+ | ERTL.St_set_carry _ -> ERTL.St_set_carry lbl
+ | ERTL.St_load (dstrs, addr1, addr2, _) ->
+ ERTL.St_load (dstrs, addr1, addr2, lbl)
+ | ERTL.St_store (addr1, addr2, srcrs, _) ->
+ ERTL.St_store (addr1, addr2, srcrs, lbl)
+ | ERTL.St_call_id (f, nb_args, _) -> ERTL.St_call_id (f, nb_args, lbl)
+ | ERTL.St_call_ptr (f1, f2, nb_args, _) ->
+ ERTL.St_call_ptr (f1, f2, nb_args, lbl)
+ | ERTL.St_cond _ as inst -> inst
+ | ERTL.St_return _ as inst -> inst
+
+(* Process a list of function that adds a list of instructions to a graph, from
+ one label to another, and by creating fresh labels inbetween. *)
+
+let rec add_translates translate_list start_lbl dest_lbl def =
+ match translate_list with
+ | [] -> add_graph start_lbl (ERTL.St_skip dest_lbl) def
+ | [trans] -> trans start_lbl dest_lbl def
+ | trans :: translate_list ->
+ let tmp_lbl = fresh_label def in
+ let def = trans start_lbl tmp_lbl def in
+ add_translates translate_list tmp_lbl dest_lbl def
+
+(* Add a sequence of instruction in a graph, from one label to another, by creating
+ fresh labels inbetween. *)
+
+(* FIXME: Clean this up by factorizing with the previous function. *)
+let rec adds_graph stmt_list start_lbl dest_lbl def =
+ match stmt_list with
+ | [] -> add_graph start_lbl (ERTL.St_skip dest_lbl) def
+ | [stmt] ->
+ add_graph start_lbl (change_label dest_lbl stmt) def
+ | stmt :: stmt_list ->
+ let tmp_lbl = fresh_label def in
+ let stmt = change_label tmp_lbl stmt in
+ let def = add_graph start_lbl stmt def in
+ adds_graph stmt_list tmp_lbl dest_lbl def
+
+let fresh_reg def =
+ let r = Register.fresh def.ERTL.f_runiverse in
+ let locals = Register.Set.add r def.ERTL.f_locals in
+ ({ def with ERTL.f_locals = locals }, r)
+
+let rec fresh_regs def n =
+ if n = 0 then (def, [])
+ else
+ let (def, res) = fresh_regs def (n-1) in
+ let (def, r) = fresh_reg def in
+ (def, r :: res)
+
+
+(* Translation *)
+
+let save_hdws l =
+ let f (destr, srcr) start_lbl =
+ adds_graph [ERTL.St_get_hdw (destr, srcr, start_lbl)] start_lbl in
+ List.map f l
+
+let restore_hdws l =
+ let f (destr, srcr) start_lbl =
+ adds_graph [ERTL.St_set_hdw (destr, srcr, start_lbl)] start_lbl in
+ List.map f (List.map (fun (x, y) -> (y, x)) l)
+
+let get_params_hdw params =
+ if List.length params = 0 then
+ [fun start_lbl -> adds_graph [ERTL.St_skip start_lbl] start_lbl]
+ else
+ let l = MiscPottier.combine params I8051.parameters in
+ save_hdws l
+
+let get_param_stack off destr start_lbl dest_lbl def =
+ let (def, addr1) = fresh_reg def in
+ let (def, addr2) = fresh_reg def in
+ let (def, tmpr) = fresh_reg def in
+ adds_graph
+ [ERTL.St_framesize (addr1, start_lbl) ;
+ ERTL.St_int (tmpr, off+I8051.int_size, start_lbl) ;
+ ERTL.St_op2 (I8051.Sub, addr1, addr1, tmpr, start_lbl) ;
+ ERTL.St_get_hdw (tmpr, I8051.spl, start_lbl) ;
+ ERTL.St_op2 (I8051.Add, addr1, addr1, tmpr, start_lbl) ;
+ ERTL.St_int (addr2, 0, start_lbl) ;
+ ERTL.St_get_hdw (tmpr, I8051.sph, start_lbl) ;
+ ERTL.St_op2 (I8051.Addc, addr2, addr2, tmpr, start_lbl) ;
+ ERTL.St_load (destr, addr1, addr2, start_lbl)]
+ start_lbl dest_lbl def
+
+let get_params_stack params =
+ if List.length params = 0 then
+ [fun start_lbl -> adds_graph [ERTL.St_skip start_lbl] start_lbl]
+ else
+ let f i r = get_param_stack i r in
+ MiscPottier.mapi f params
+
+(* Parameters are taken from the physical parameter registers first. If there
+ are not enough such of these, then the remaining parameters are taken from
+ the stack. *)
+
+let get_params params =
+ let n = min (List.length params) (List.length I8051.parameters) in
+ let (hdw_params, stack_params) = MiscPottier.split params n in
+ (get_params_hdw hdw_params) @ (get_params_stack stack_params)
+
+let add_prologue params sral srah sregs def =
+ let start_lbl = def.ERTL.f_entry in
+ let tmp_lbl = fresh_label def in
+ let last_stmt = Label.Map.find start_lbl def.ERTL.f_graph in
+ let def =
+ add_translates
+ ([adds_graph [ERTL.St_comment ("Prologue", start_lbl)]] @
+ (* new frame *)
+ (adds_graph [ERTL.St_comment ("New frame", start_lbl) ;
+ ERTL.St_newframe start_lbl]) ::
+ (* save the return address *)
+ (adds_graph [ERTL.St_comment ("Save return address", start_lbl) ;
+ ERTL.St_pop (sral, start_lbl) ;
+ ERTL.St_pop (srah, start_lbl)]) ::
+ (* save callee-saved registers *)
+ [adds_graph [ERTL.St_comment ("Save callee-saved registers",
+ start_lbl)]] @
+ (save_hdws sregs) @
+ (* fetch parameters *)
+ [adds_graph [ERTL.St_comment ("Fetch parameters", start_lbl)]] @
+ (get_params params) @
+ [adds_graph [ERTL.St_comment ("End Prologue", start_lbl)]])
+ start_lbl tmp_lbl def in
+ add_graph tmp_lbl last_stmt def
+
+
+(* Save the result of a function in a place that cannot be written, even after
+ register allocation. This way, the cleaning sequence of returning from a
+ function will not interfere with the result value, that can be restored right
+ before jumping out of the function. *)
+
+(* L'existence de cette fonction résulte du choix d'utiliser DPTR à la fois
+ pour effectuer l'arithmétique de pointeur sur la pile et le retour des
+ fonctions. On aurait probablement pu faire un autre choix. *)
+let save_return ret_regs start_lbl dest_lbl def =
+ let (def, tmpr) = fresh_reg def in
+ (* Sépare les registres utiles pour le stockage effectif des valeurs
+ des registres de retour de ceux qui ne seront pas utilisés, et
+ donc mis à zéro. *)
+ let ((common1, rest1), (common2, rest2)) =
+ (* I8051.sts are registers that are reserved in order to store the
+ result of functions. *)
+ MiscPottier.reduce I8051.sts ret_regs
+ in
+ assert (rest2 = []); (* parce qu'on suppose que la valeur de retour
+ tient dans l'ensemble des registres réservés
+ pour la stocker. *)
+
+ (* Met a zero les registres utilisés pour le retour car la valeur
+ de retour pourrait être plus petite que la capacité totale de
+ stockage des registres physiques de retour conventionnels. *)
+
+ (* FIXME: Nicolas pense qu'en vérité cette mise à zéro ne sert Ã
+ rien car plus tard (cf. FIXME plus loin dans la fonction
+ fetch_result), ces registres à zéro ne seront pas considérés. *)
+ let init_tmpr = ERTL.St_int (tmpr, 0, start_lbl) in
+
+ (* Sauvegarde temporairement la valeur des registres de retour
+ dans des registres frais car ces registres de retour peuvent
+ être utilisés pour faire de l'arithmétique de pointeurs sur
+ le pointeur de pile lors du dépilement. *)
+ let f_save st r = ERTL.St_set_hdw (st, r, start_lbl) in
+ let saves = List.map2 f_save common1 common2 in
+ (* Le reste est mis à zéro. *)
+ let f_default st = ERTL.St_set_hdw (st, tmpr, start_lbl) in
+ let defaults = List.map f_default rest1 in
+ adds_graph (init_tmpr :: saves @ defaults) start_lbl dest_lbl def
+
+(* Après avoir travaillé sur la pile, on sait que l'on peut sans danger
+ copier le contenu sauvegardé dans les registres temporaires vers
+ les registres de retour. *)
+let assign_result start_lbl =
+ let ((common1, rest1), (common2, rest2)) = MiscPottier.reduce I8051.rets I8051.sts in
+ assert (rest1 = [] && rest2 = []);
+ (* parce qu'on suppose que |I8051.rets| = |I8051.sts|. *)
+ let f ret st = ERTL.St_hdw_to_hdw (ret, st, start_lbl) in
+ let insts = List.map2 f common1 common2 in
+ adds_graph insts start_lbl
+
+let add_epilogue ret_regs sral srah sregs def =
+ let start_lbl = def.ERTL.f_exit in
+ let tmp_lbl = fresh_label def in
+ let last_stmt = Label.Map.find start_lbl def.ERTL.f_graph in
+ let def =
+ add_translates
+ ([adds_graph [ERTL.St_comment ("Epilogue", start_lbl)]] @
+ (* save return value *)
+ [save_return ret_regs] @
+ (* restore callee-saved registers *)
+ [adds_graph [ERTL.St_comment ("Restore callee-saved registers",
+ start_lbl)]] @
+ (restore_hdws sregs) @
+ (* restore the return address *)
+ [adds_graph [ERTL.St_comment ("Restore return address", start_lbl) ;
+ ERTL.St_push (srah, start_lbl) ;
+ ERTL.St_push (sral, start_lbl)]] @
+ (* delete frame *)
+ [adds_graph [ERTL.St_comment ("Delete frame", start_lbl) ;
+ ERTL.St_delframe start_lbl]] @
+ (* assign the result to actual return registers *)
+ [adds_graph [ERTL.St_comment ("Set result", start_lbl)]] @
+ [assign_result] @
+ [adds_graph [ERTL.St_comment ("End Epilogue", start_lbl)]])
+ start_lbl tmp_lbl def in
+ let def = add_graph tmp_lbl last_stmt def in
+ change_exit_label tmp_lbl def
+
+
+let allocate_regs saved def =
+ let f r (def, sregs) =
+ let (def, r') = fresh_reg def in
+ (def, (r', r) :: sregs) in
+ I8051.RegisterSet.fold f saved (def, [])
+
+let add_pro_and_epilogue params ret_regs def =
+ (* Allocate registers to hold the return address. *)
+ let (def, sra) = fresh_regs def 2 in
+ let sral = List.nth sra 0 in
+ let srah = List.nth sra 1 in
+ (* Allocate registers to save callee-saved registers. *)
+ let (def, sregs) = allocate_regs I8051.callee_saved def in
+ (* Add a prologue and a epilogue. *)
+ let def = add_prologue params sral srah sregs def in
+ let def = add_epilogue ret_regs sral srah sregs def in
+ def
+
+
+let set_params_hdw params =
+ if List.length params = 0 then
+ [fun start_lbl -> adds_graph [ERTL.St_skip start_lbl] start_lbl]
+ else
+ let l = MiscPottier.combine params I8051.parameters in
+ restore_hdws l
+
+let set_param_stack off srcr start_lbl dest_lbl def =
+ let (def, addr1) = fresh_reg def in
+ let (def, addr2) = fresh_reg def in
+ let (def, tmpr) = fresh_reg def in
+ adds_graph
+ [ERTL.St_int (addr1, off+I8051.int_size, start_lbl) ;
+ ERTL.St_get_hdw (tmpr, I8051.spl, start_lbl) ;
+ ERTL.St_clear_carry start_lbl ;
+ ERTL.St_op2 (I8051.Sub, addr1, tmpr, addr1, start_lbl) ;
+ ERTL.St_get_hdw (tmpr, I8051.sph, start_lbl) ;
+ ERTL.St_int (addr2, 0, start_lbl) ;
+ ERTL.St_op2 (I8051.Sub, addr2, tmpr, addr2, start_lbl) ;
+ ERTL.St_store (addr1, addr2, srcr, start_lbl)]
+ start_lbl dest_lbl def
+
+let set_params_stack params =
+ if List.length params = 0 then
+ [fun start_lbl -> adds_graph [ERTL.St_skip start_lbl] start_lbl]
+ else
+ let f i r = set_param_stack i r in
+ MiscPottier.mapi f params
+
+(* Parameters are put in the physical parameter registers first. If there are
+ not enough such of these, then the remaining parameters are passed on the
+ stack. *)
+
+let set_params params =
+ let n = min (List.length params) (List.length I8051.parameters) in
+ let (hdw_params, stack_params) = MiscPottier.split params n in
+ (set_params_hdw hdw_params) @ (set_params_stack stack_params)
+
+(* Fetching the result depends on the type of the function, or say, the number
+ of registers that are waiting for a value. Temporary non allocatable
+ registers are used. Indeed, moving directly from DPL to a pseudo-register may
+ cause a bug: DPL might be used to compute the address of the
+ pseudo-register. *)
+
+let fetch_result ret_regs start_lbl =
+ let ((common1, rest1), (common2, rest2)) = MiscPottier.reduce I8051.sts I8051.rets in
+ assert (rest1 = [] && rest2 = []);
+ let f_save st ret = ERTL.St_hdw_to_hdw (st, ret, start_lbl) in
+ let saves = List.map2 f_save common1 common2 in
+ let ((common1, rest1), (common2, rest2)) = MiscPottier.reduce ret_regs I8051.sts in
+ (* FIXME: [rest2] est ignoré mais ce n'est pas grave car ils ne
+ contiennent pas des données significatives. Du coup, il n'était
+ probablement pas nécessaire de les mettre à zéro. *)
+ let f_restore r st = ERTL.St_get_hdw (r, st, start_lbl) in
+ let restores = List.map2 f_restore common1 common2 in
+ adds_graph (saves @ restores) start_lbl
+
+(* When calling a function, we need to set its parameters in specific locations:
+ the physical parameter registers as much as possible, and then the stack
+ below. When the called function returns, we put the result where the calling
+ function expect it to be. *)
+let translate_call stmt args ret_regs start_lbl dest_lbl def =
+ let nb_args = List.length args in
+ add_translates
+ ([adds_graph [ERTL.St_comment ("Starting a call", start_lbl)] ;
+ adds_graph [ERTL.St_comment ("Setting up parameters", start_lbl)]] @
+ set_params args @
+ [adds_graph [stmt nb_args] ;
+ adds_graph [ERTL.St_comment ("Fetching result", start_lbl)] ;
+ fetch_result ret_regs ;
+ adds_graph [ERTL.St_comment ("End of call sequence", start_lbl)]])
+ start_lbl dest_lbl def
+
+let translate_stmt lbl stmt def = match stmt with
+ | RTL.St_skip lbl' ->
+ add_graph lbl (ERTL.St_skip lbl') def
+
+ | RTL.St_cost (cost_lbl, lbl') ->
+ add_graph lbl (ERTL.St_cost (cost_lbl, lbl')) def
+
+ | RTL.St_addr (r1, r2, x, lbl') ->
+ adds_graph
+ [ERTL.St_addrL (r1, x, lbl) ; ERTL.St_addrH (r2, x, lbl) ;]
+ lbl lbl' def
+
+ | RTL.St_stackaddr (r1, r2, lbl') ->
+ adds_graph
+ [ERTL.St_get_hdw (r1, I8051.spl, lbl) ;
+ ERTL.St_get_hdw (r2, I8051.sph, lbl)]
+ lbl lbl' def
+
+ | RTL.St_int (r, i, lbl') ->
+ add_graph lbl (ERTL.St_int (r, i, lbl')) def
+
+ | RTL.St_move (r1, r2, lbl') ->
+ add_graph lbl (ERTL.St_move (r1, r2, lbl')) def
+
+ | RTL.St_opaccs (op, destr1, destr2, srcr1, srcr2, lbl') ->
+ adds_graph [ERTL.St_opaccsA (op, destr1, srcr1, srcr2, lbl) ;
+ ERTL.St_opaccsB (op, destr2, srcr1, srcr2, lbl) ;]
+ lbl lbl' def
+
+ | RTL.St_op1 (op1, destr, srcr, lbl') ->
+ add_graph lbl (ERTL.St_op1 (op1, destr, srcr, lbl')) def
+
+ | RTL.St_op2 (op2, destr, srcr1, srcr2, lbl') ->
+ add_graph lbl (ERTL.St_op2 (op2, destr, srcr1, srcr2, lbl')) def
+
+ | RTL.St_clear_carry lbl' ->
+ add_graph lbl (ERTL.St_clear_carry lbl') def
+
+ | RTL.St_set_carry lbl' ->
+ add_graph lbl (ERTL.St_set_carry lbl') def
+
+ | RTL.St_load (destr, addr1, addr2, lbl') ->
+ add_graph lbl (ERTL.St_load (destr, addr1, addr2, lbl')) def
+
+ | RTL.St_store (addr1, addr2, srcr, lbl') ->
+ add_graph lbl (ERTL.St_store (addr1, addr2, srcr, lbl')) def
+
+ | RTL.St_call_id (f, args, ret_regs, lbl') ->
+ let stmt nb_args = ERTL.St_call_id (f, nb_args, lbl) in
+ translate_call stmt args ret_regs lbl lbl' def
+
+ | RTL.St_call_ptr (f1, f2, args, ret_regs, lbl') ->
+ let stmt nb_args = ERTL.St_call_ptr (f1, f2, nb_args, lbl) in
+ translate_call stmt args ret_regs lbl lbl' def
+
+ | RTL.St_cond (srcr, lbl_true, lbl_false) ->
+ add_graph lbl (ERTL.St_cond (srcr, lbl_true, lbl_false)) def
+
+ | RTL.St_return ret_regs ->
+ add_graph lbl (ERTL.St_return ret_regs) def
+
+ | RTL.St_tailcall_id _ | RTL.St_tailcall_ptr _ ->
+ assert false
+ (* Impossible: the RTL program is supposed to be simplified:
+ no tailcalls. *)
+
+let translate_internal def =
+ let nb_params = List.length (def.RTL.f_params) in
+ (* The stack size is augmented by the number of parameters that cannot fit
+ into physical registers. *)
+ let added_stacksize = max 0 (nb_params - (List.length I8051.parameters)) in
+ let def' =
+ { ERTL.f_luniverse = def.RTL.f_luniverse ;
+ ERTL.f_runiverse = def.RTL.f_runiverse ;
+ ERTL.f_params = nb_params ;
+ (* ERTL does not know about parameter registers. We need to add them to
+ the locals. *)
+ ERTL.f_locals = Register.Set.union def.RTL.f_locals
+ (Register.Set.of_list def.RTL.f_params) ;
+ ERTL.f_stacksize = def.RTL.f_stacksize + added_stacksize ;
+ ERTL.f_graph = Label.Map.empty ;
+ ERTL.f_entry = def.RTL.f_entry ;
+ ERTL.f_exit = def.RTL.f_exit } in
+ let def' = Label.Map.fold translate_stmt def.RTL.f_graph def' in
+ let def' = add_pro_and_epilogue def.RTL.f_params def.RTL.f_result def' in
+ def'
+
+
+let translate_funct (id, def) =
+ let def' = match def with
+ | RTL.F_int def -> ERTL.F_int (translate_internal def)
+ | RTL.F_ext def -> ERTL.F_ext def
+ in
+ (id, def')
+
+
+(* Move the first cost label of each function at the beginning of the
+ function. Indeed, the instructions for calling conventions (stack allocation
+ for example) are added at the very beginning of the function, thus before the
+ first cost label. *)
+
+let generate stmt def =
+ let entry = Label.Gen.fresh def.ERTL.f_luniverse in
+ { def with
+ ERTL.f_graph = Label.Map.add entry stmt def.ERTL.f_graph;
+ ERTL.f_entry = entry
+ }
+
+let find_and_remove_first_cost_label def =
+ let rec aux lbl = match Label.Map.find lbl def.ERTL.f_graph with
+ | ERTL.St_cost (cost_label, next_lbl) ->
+ let graph = Label.Map.add lbl (ERTL.St_skip next_lbl) def.ERTL.f_graph in
+ (cost_label, { def with ERTL.f_graph = graph })
+ | ERTL.St_skip lbl | ERTL.St_comment (_, lbl) | ERTL.St_get_hdw (_, _, lbl)
+ | ERTL.St_set_hdw (_, _, lbl) | ERTL.St_hdw_to_hdw (_, _, lbl)
+ | ERTL.St_pop (_, lbl) | ERTL.St_push (_, lbl) | ERTL.St_addrH (_, _, lbl)
+ | ERTL.St_addrL (_, _, lbl) | ERTL.St_int (_, _, lbl)
+ | ERTL.St_move (_, _, lbl) | ERTL.St_opaccsA (_, _, _, _, lbl)
+ | ERTL.St_opaccsB (_, _, _, _, lbl)
+ | ERTL.St_op1 (_, _, _, lbl) | ERTL.St_op2 (_, _, _, _, lbl)
+ | ERTL.St_clear_carry lbl | ERTL.St_set_carry lbl
+ | ERTL.St_load (_, _, _, lbl)
+ | ERTL.St_store (_, _, _, lbl) | ERTL.St_call_id (_, _, lbl)
+ | ERTL.St_call_ptr (_, _, _, lbl)
+ | ERTL.St_newframe lbl | ERTL.St_delframe lbl | ERTL.St_framesize (_, lbl)
+ ->
+ aux lbl
+ | ERTL.St_cond _ | ERTL.St_return _ ->
+ (* No cost label found (no labelling performed). Indeed, the first cost
+ label must after some linear instructions. *)
+ assert false
+ in
+ aux def.ERTL.f_entry
+
+let move_first_cost_label_up_internal def =
+ let (cost_label, def) = find_and_remove_first_cost_label def in
+ generate (ERTL.St_cost (cost_label, def.ERTL.f_entry)) def
+
+let move_first_cost_label_up (id, def) =
+ let def' = match def with
+ | ERTL.F_int int_fun ->
+ ERTL.F_int (move_first_cost_label_up_internal int_fun)
+ | _ -> def
+ in
+ (id, def')
+
+let translate p =
+ (* We simplify tail calls as regular calls for now. *)
+ let p = RTLtailcall.simplify p in
+ (* The tranformation on each RTL function: create an ERTL function and move
+ its first cost label at the very beginning. *)
+ let f funct = move_first_cost_label_up (translate_funct funct) in
+ { ERTL.vars = p.RTL.vars ;
+ ERTL.functs = List.map f p.RTL.functs ;
+ ERTL.main = p.RTL.main }
--- /dev/null
+
+(** This module provides a translation of [RTL] programs to [ERTL] programs. *)
+
+(** The work consists in expliciting the calling convention.
+
+ Function call instructions will be expanded so has to explicitely pass
+ arguments on dedicated physical registers, and then on specific places in
+ the stack if there are not enough registers.
+
+ We add a prologue at the beginning of each function that does the following
+ things:
+ - Allocate enough space on the stack for the function to execute.
+ - Save the return address.
+ - Save callee-saved registers.
+ - Fetch parameters from physical registers and potentially from the stack.
+
+ Also, we add an epilogue which pretty much reverses the effects of the
+ prologue:
+ - Save the return value in physical registers that can only be used for
+ this.
+ - Restore callee-saved register.
+ - Restore the return address.
+ - Free the allocated space on the stack.
+ - Assign the return value to the physical return registers. *)
+
+val translate : RTL.program -> ERTL.program
--- /dev/null
+
+(** Temporary issue backdoor: tranform tail calls into regular calls *)
+
+let simplify_stmt exit lbl stmt graph = match stmt with
+ | RTL.St_tailcall_id (f, args) ->
+ Label.Map.add lbl (RTL.St_call_id (f, args, [], exit)) graph
+ | RTL.St_tailcall_ptr (f1, f2, args) ->
+ Label.Map.add lbl (RTL.St_call_ptr (f1, f2, args, [], exit)) graph
+ | _ -> graph
+
+let simplify_graph exit graph =
+ Label.Map.fold (simplify_stmt exit) graph graph
+
+let simplify_internal def =
+ { def with RTL.f_graph = simplify_graph def.RTL.f_exit def.RTL.f_graph }
+
+let simplify_funct (id, def) =
+ let def' = match def with
+ | RTL.F_int def -> RTL.F_int (simplify_internal def)
+ | RTL.F_ext def -> RTL.F_ext def
+ in
+ (id, def')
+
+let simplify p =
+ { p with RTL.functs = List.map simplify_funct p.RTL.functs }
--- /dev/null
+
+(** Temporary issue backdoor: tranform tail calls into regular calls *)
+
+val simplify : RTL.program -> RTL.program
--- /dev/null
+
+(** This module defines the abstract syntax tree of [RTLabs]. *)
+
+(* A program in RTLabs associates to each function of the program a
+ Control Flow Graph. Pseudo-registers are used to represent the
+ variables. The operations and instructions of the language are
+ those of Cminor.
+
+ RTLabs is the last language of the frontend. It is intended to
+ ease retargetting. *)
+
+
+(* A function in RTLabs is a mapping from labels to
+ statements. Statements explicitely mention their successors. *)
+
+type statement =
+
+ (* The empty statement. *)
+ | St_skip of Label.t
+
+ (* Emit a cost label. *)
+ | St_cost of CostLabel.t * Label.t
+
+ (* Assign a constant to registers. Parameters are the destination register,
+ the constant and the label of the next statement. *)
+ | St_cst of Register.t * AST.cst * Label.t
+
+ (* Application of an unary operation. Parameters are the operation, the
+ destination register, the argument register and the label of the next
+ statement. *)
+ | St_op1 of AST.op1 * Register.t * Register.t * Label.t
+
+ (* Application of a binary operation. Parameters are the operation, the
+ destination register, the two argument registers and the label of the next
+ statement. *)
+ | St_op2 of AST.op2 * Register.t * Register.t * Register.t * Label.t
+
+ (* Memory load. Parameters are the size in bytes of what to load, the
+ register containing the address, the destination register and the label
+ of the next statement. *)
+ | St_load of AST.quantity * Register.t * Register.t * Label.t
+
+ (* Memory store. Parameters are the size in bytes of what to store, the
+ register containing the address, the source register and the label of the
+ next statement. *)
+ | St_store of AST.quantity * Register.t * Register.t * Label.t
+
+ (* Call to a function given its name. Parameters are the name of the
+ function, the arguments of the function, the destination
+ register, the signature of the function and the label of the next
+ statement. *)
+ | St_call_id of AST.ident * Register.t list * Register.t option *
+ AST.signature * Label.t
+
+ (* Call to a function given its address. Parameters are the register
+ holding the address of the function, the arguments of the
+ function, the destination register, the signature of the function
+ and the label of the next statement. This statement with an
+ [St_op] before can represent a [St_call_id]. However, we
+ differenciate the two to allow translation to a formalism with no
+ function pointer. *)
+ | St_call_ptr of Register.t * Register.t list * Register.t option *
+ AST.signature * Label.t
+
+ (* Tail call to a function given its name. Parameters are the name of the
+ function, the arguments of the function, the signature of the function and
+ the label of the next statement. *)
+ | St_tailcall_id of AST.ident * Register.t list * AST.signature
+
+ (* Tail call to a function given its address. Parameters are a register
+ holding the address of the function, the arguments of the function, the
+ signature of the function and the label of the next statement. Same remark
+ as for the [St_call_ptr]. *)
+ | St_tailcall_ptr of Register.t * Register.t list * AST.signature
+
+ (* Branch. Parameters are the register holding the value to branch on, the
+ label to go to when the value evaluates to true (not 0), and the label
+ to go to when the value evaluates to false (0). *)
+ | St_cond of Register.t * Label.t * Label.t
+
+ (* Jump statement. Parameters are a register and a list of
+ labels. The execution will go to the [n]th label of the list of
+ labels, where [n] is the natural value held in the register. *)
+ | St_jumptable of Register.t * Label.t list
+
+ (* Return statement. *)
+ | St_return of Register.t option
+
+
+type graph = statement Label.Map.t
+
+type internal_function =
+ { f_luniverse : Label.Gen.universe ;
+ f_runiverse : Register.universe ;
+ f_result : (Register.t * AST.sig_type) option ;
+ f_params : (Register.t * AST.sig_type) list ;
+ f_locals : (Register.t * AST.sig_type) list ;
+ f_stacksize : AST.abstract_size ;
+ f_graph : graph ;
+ f_entry : Label.t ;
+ f_exit : Label.t }
+
+type function_def =
+ | F_int of internal_function
+ | F_ext of AST.external_function
+
+(* A program is a list of global variables and their reserved space, a list of
+ function names and their definition, and the name of the main function. *)
+
+type program =
+ { vars : (AST.ident * AST.abstract_size * AST.data list option) list ;
+ functs : (AST.ident * function_def) list ;
+ main : AST.ident option }
--- /dev/null
+
+(** This module provides an interpreter for the RTLabs language. *)
+
+
+let error_prefix = "RTLabs interpret"
+let error s = Error.global_error error_prefix s
+
+
+module Mem = Driver.RTLabsMemory
+module Val = Mem.Value
+
+let error_float () = error "float not supported"
+
+
+type memory = RTLabs.function_def Mem.memory
+
+
+(* Local environments. They associate a value and a type to the registers of the
+ function being executed. *)
+
+type local_env = (Val.t * AST.sig_type) Register.Map.t
+
+(* Call frames. The execution state has a call stack, each element of the stack
+ being composed of the return registers to store the result of the callee, the
+ graph, the stack pointer, the node, the local environment and the typing
+ environments to resume the execution of the caller. *)
+
+type stack_frame =
+ { ret_reg : Register.t option ;
+ graph : RTLabs.graph ;
+ sp : Val.address ;
+ pc : Label.t ;
+ lenv : local_env }
+
+(* Execution states. There are three possible states :
+ - The constructor [State] represents a state when executing a function
+ - The constructor [CallState] represents a state when calling a function
+ - The constructor [ReturnState] represents a state when leaving a function *)
+
+type state =
+ | State of stack_frame list * RTLabs.graph * Val.address (* stack pointer *) *
+ Label.t * local_env * memory * CostLabel.t list
+ | CallState of stack_frame list * RTLabs.function_def *
+ Val.t list (* args *) * memory * CostLabel.t list
+ | ReturnState of stack_frame list * Val.t (* return value *) *
+ memory * CostLabel.t list
+
+let string_of_local_env lenv =
+ let f x (v, _) s =
+ s ^
+ (if Val.eq v Val.undef then ""
+ else (Register.print x) ^ " = " ^ (Val.to_string v) ^ " ") in
+ Register.Map.fold f lenv ""
+
+let string_of_args args =
+ let f s v = s ^ " " ^ (Val.to_string v) in
+ List.fold_left f "" args
+
+let print_state = function
+ | State (_, _, sp, lbl, lenv, mem, _) ->
+ Printf.printf "Stack pointer: %s\n\nLocal environment:\n%s\n\nMemory:%s\nRegular state: %s\n\n%!"
+ (Val.string_of_address sp)
+ (string_of_local_env lenv)
+ (Mem.to_string mem)
+ lbl
+ | CallState (_, _, args, mem, _) ->
+ Printf.printf "Memory:%s\nCall state: %s\n\n%!"
+ (Mem.to_string mem)
+ (string_of_args args)
+ | ReturnState (_, v, mem, _) ->
+ Printf.printf "Memory:%s\nReturn state: %s\n\n%!"
+ (Mem.to_string mem)
+ (Val.to_string v)
+
+
+let find_function mem f =
+ let addr = Mem.find_global mem f in
+ Mem.find_fun_def mem addr
+
+let get_local_env f lenv r =
+ if Register.Map.mem r lenv then f (Register.Map.find r lenv)
+ else error ("Unknown local register \"" ^ (Register.print r) ^ "\".")
+
+let get_value = get_local_env fst
+let get_args lenv args = List.map (get_value lenv) args
+
+let get_type = get_local_env snd
+
+let update_local r v lenv =
+ let f (_, t) = Register.Map.add r (v, t) lenv in
+ get_local_env f lenv r
+
+let update_locals rs vs lenv =
+ let f lenv r v = update_local r v lenv in
+ List.fold_left2 f lenv rs vs
+
+let value_of_address = List.hd
+let address_of_value v = [v]
+
+
+module Eval = CminorInterpret.Eval_op (Mem)
+
+let concrete_stacksize = Eval.concrete_stacksize
+
+
+(* Assign a value to some destinations registers. *)
+
+let assign_state sfrs graph sp lbl lenv mem trace destr v =
+ let lenv = update_local destr v lenv in
+ State (sfrs, graph, sp, lbl, lenv, mem, trace)
+
+(* Branch on a value. *)
+
+let branch_state sfrs graph sp lbl_true lbl_false lenv mem trace v =
+ let next_lbl =
+ if Val.is_true v then lbl_true
+ else
+ if Val.is_false v then lbl_false
+ else error "Undefined conditional value." in
+ State (sfrs, graph, sp, next_lbl, lenv, mem, trace)
+
+
+(* Interpret statements. *)
+
+let interpret_statement
+ (sfrs : stack_frame list)
+ (graph : RTLabs.graph)
+ (sp : Val.address)
+ (lenv : local_env)
+ (mem : memory)
+ (stmt : RTLabs.statement)
+ (trace : CostLabel.t list) :
+ state = match stmt with
+
+ | RTLabs.St_skip lbl ->
+ State (sfrs, graph, sp, lbl, lenv, mem, trace)
+
+ | RTLabs.St_cost (cost_lbl, lbl) ->
+ State (sfrs, graph, sp, lbl, lenv, mem, cost_lbl :: trace)
+
+ | RTLabs.St_cst (destr, cst, lbl) ->
+ let v = Eval.cst mem sp (get_type lenv destr) cst in
+ assign_state sfrs graph sp lbl lenv mem trace destr v
+
+ | RTLabs.St_op1 (op1, destr, srcr, lbl) ->
+ let v =
+ Eval.op1 (get_type lenv destr) (get_type lenv srcr) op1
+ (get_value lenv srcr) in
+ assign_state sfrs graph sp lbl lenv mem trace destr v
+
+ | RTLabs.St_op2 (op2, destr, srcr1, srcr2, lbl) ->
+ let v =
+ Eval.op2
+ (get_type lenv destr) (get_type lenv srcr1) (get_type lenv srcr2)
+ op2
+ (get_value lenv srcr1)
+ (get_value lenv srcr2) in
+ assign_state sfrs graph sp lbl lenv mem trace destr v
+
+ | RTLabs.St_load (q, addr, destr, lbl) ->
+ let addr = address_of_value (get_value lenv addr) in
+ let v = Mem.loadq mem q addr in
+ assign_state sfrs graph sp lbl lenv mem trace destr v
+
+ | RTLabs.St_store (q, addr, srcr, lbl) ->
+ let addr = address_of_value (get_value lenv addr) in
+ let v = get_value lenv srcr in
+ let mem = Mem.storeq mem q addr v in
+ State (sfrs, graph, sp, lbl, lenv, mem, trace)
+
+ | RTLabs.St_call_id (f, args, destr, sg, lbl) ->
+ let f_def = find_function mem f in
+ let args = get_args lenv args in
+ (* Save the stack frame. *)
+ let sf =
+ { ret_reg = destr ; graph = graph ; sp = sp ; pc = lbl ; lenv = lenv }
+ in
+ CallState (sf :: sfrs, f_def, args, mem, trace)
+
+ | RTLabs.St_call_ptr (r, args, destr, sg, lbl) ->
+ let addr = get_value lenv r in
+ let f_def = Mem.find_fun_def mem (address_of_value addr) in
+ let args = get_args lenv args in
+ (* Save the stack frame. *)
+ let sf =
+ { ret_reg = destr ; graph = graph ; sp = sp ; pc = lbl ; lenv = lenv }
+ in
+ CallState (sf :: sfrs, f_def, args, mem, trace)
+
+ | RTLabs.St_tailcall_id (f, args, sg) ->
+ let f_def = find_function mem f in
+ let args = get_args lenv args in
+ (* No need to save the stack frame. But free the stack. *)
+ let mem = Mem.free mem sp in
+ CallState (sfrs, f_def, args, mem, trace)
+
+ | RTLabs.St_tailcall_ptr (r, args, sg) ->
+ let addr = get_value lenv r in
+ let f_def = Mem.find_fun_def mem (address_of_value addr) in
+ let args = get_args lenv args in
+ (* No need to save the stack frame. But free the stack. *)
+ let mem = Mem.free mem sp in
+ CallState (sfrs, f_def, args, mem, trace)
+
+ | RTLabs.St_cond (srcr, lbl_true, lbl_false) ->
+ let v = get_value lenv srcr in
+ branch_state sfrs graph sp lbl_true lbl_false lenv mem trace v
+
+ | RTLabs.St_jumptable (r, table) ->
+ assert false (* TODO: jumptable *)
+
+ | RTLabs.St_return None ->
+ let mem = Mem.free mem sp in
+ ReturnState (sfrs, Val.undef, mem, trace)
+
+ | RTLabs.St_return (Some r) ->
+ let v = get_value lenv r in
+ let mem = Mem.free mem sp in
+ ReturnState (sfrs, v, mem, trace)
+
+
+module InterpretExternal = Primitive.Interpret (Mem)
+
+let interpret_external mem f args = match InterpretExternal.t mem f args with
+ | (mem', InterpretExternal.V vs) ->
+ let v = if List.length vs = 0 then Val.undef else List.hd vs in
+ (mem', v)
+ | (mem', InterpretExternal.A addr) -> (mem', value_of_address addr)
+
+
+let init_locals
+ (locals : (Register.t * AST.sig_type) list)
+ (params : (Register.t * AST.sig_type) list)
+ (args : Val.t list) :
+ local_env =
+ let f_param lenv (r, t) v = Register.Map.add r (v, t) lenv in
+ let f_local lenv (r, t) = Register.Map.add r (Val.undef, t) lenv in
+ let lenv = List.fold_left2 f_param Register.Map.empty params args in
+ List.fold_left f_local lenv locals
+
+let state_after_call
+ (sfrs : stack_frame list)
+ (f_def : RTLabs.function_def)
+ (args : Val.t list)
+ (mem : memory)
+ (trace : CostLabel.t list) :
+ state =
+ match f_def with
+ | RTLabs.F_int def ->
+ let (mem', sp) =
+ Mem.alloc mem (concrete_stacksize def.RTLabs.f_stacksize) in
+ let lenv = init_locals def.RTLabs.f_locals def.RTLabs.f_params args in
+ State (sfrs, def.RTLabs.f_graph, sp, def.RTLabs.f_entry, lenv, mem',
+ trace)
+ | RTLabs.F_ext def ->
+ let (mem', v) = interpret_external mem def.AST.ef_tag args in
+ ReturnState (sfrs, v, mem', trace)
+
+
+let state_after_return
+ (sf : stack_frame)
+ (sfrs : stack_frame list)
+ (ret_val : Val.t)
+ (mem : memory)
+ (trace : CostLabel.t list) :
+ state =
+ let lenv = match sf.ret_reg with
+ | None -> sf.lenv
+ | Some ret_reg -> update_local ret_reg ret_val sf.lenv in
+ State (sfrs, sf.graph, sf.sp, sf.pc, lenv, mem, trace)
+
+
+let small_step (st : state) : state = match st with
+ | State (sfrs, graph, sp, pc, lenv, mem, trace) ->
+ let stmt = Label.Map.find pc graph in
+ interpret_statement sfrs graph sp lenv mem stmt trace
+ | CallState (sfrs, f_def, args, mem, trace) ->
+ state_after_call sfrs f_def args mem trace
+ | ReturnState ([], ret_val, mem, trace) ->
+ assert false (* End of execution; handled in iter_small_step. *)
+ | ReturnState (sf :: sfrs, ret_val, mem, trace) ->
+ state_after_return sf sfrs ret_val mem trace
+
+
+let compute_result v =
+ if Val.is_int v then IntValue.Int32.cast (Val.to_int_repr v)
+ else IntValue.Int32.zero
+
+let rec iter_small_step debug st =
+ let print_and_return_result (res, cost_labels) =
+ if debug then Printf.printf "Result = %s\n%!"
+ (IntValue.Int32.to_string res) ;
+ (res, cost_labels) in
+ if debug then print_state st ;
+ match small_step st with
+ | ReturnState ([], v, mem, trace) ->
+ print_and_return_result (compute_result v, List.rev trace)
+ | st' -> iter_small_step debug st'
+
+
+let add_global_vars =
+ List.fold_left
+ (fun mem (id, size, inits_opt) -> Mem.add_var mem id size inits_opt)
+
+let add_fun_defs =
+ List.fold_left (fun mem (f_id, f_def) -> Mem.add_fun_def mem f_id f_def)
+
+
+(* The memory is initialized by loading the code into it, and by reserving space
+ for the global variables. *)
+
+let init_mem (p : RTLabs.program) : memory =
+ add_global_vars (add_fun_defs Mem.empty p.RTLabs.functs) p.RTLabs.vars
+
+
+(* Interpret the program only if it has a main. *)
+
+let interpret debug p =
+ Printf.printf "*** RTLabs interpret ***\n%!" ;
+ match p.RTLabs.main with
+ | None -> (IntValue.Int32.zero, [])
+ | Some main ->
+ let mem = init_mem p in
+ let main_def = find_function mem main in
+ let st = CallState ([], main_def, [], mem, []) in
+ iter_small_step debug st
--- /dev/null
+
+(** This module provides a function to interpret a [RTLabs] program
+ and return the trace of cost labels encountered. *)
+
+val interpret : bool -> RTLabs.program -> AST.trace
--- /dev/null
+
+let n_spaces n = String.make n ' '
+
+
+let rec print_size = function
+ | AST.SQ q -> Memory.string_of_quantity q
+ | AST.SProd l -> "struct {" ^ (print_size_list l) ^ "}"
+ | AST.SSum l -> "union {" ^ (print_size_list l) ^ "}"
+ | AST.SArray (i, se) ->
+ (print_size se) ^ "[" ^ (string_of_int i) ^ "]"
+and print_size_list l =
+ MiscPottier.string_of_list ", " print_size l
+
+let print_global_size = print_size
+
+let print_data = function
+(*
+ | Data_reserve n -> Printf.sprintf "[%d]" n
+*)
+ | AST.Data_int8 i -> Printf.sprintf "(int8) %d" i
+ | AST.Data_int16 i -> Printf.sprintf "(int16) %d" i
+ | AST.Data_int32 i -> Printf.sprintf "%d" i
+ | AST.Data_float32 f -> Printf.sprintf "%f" f
+ | AST.Data_float64 f -> Printf.sprintf "(float64) %f" f
+
+let print_datas init =
+ let rec aux = function
+ | [] -> ""
+ | [data] -> print_data data
+ | data :: datas -> Printf.sprintf "%s, %s" (print_data data) (aux datas)
+ in
+ Printf.sprintf "{%s}" (aux init)
+
+let print_datas_opt = function
+ | None -> ""
+ | Some init -> " = " ^ (print_datas init)
+
+let print_global n (id, size, init_opt) =
+ Printf.sprintf "%s\"%s\" : %s%s;\n"
+ (n_spaces n) id (print_global_size size) (print_datas_opt init_opt)
+
+let print_globals eformat n =
+ List.iter (fun v -> Eformat.printf eformat "%s" (print_global n v))
+
+
+let print_reg = Register.print
+
+let print_oreg = function
+ | None -> "_"
+ | Some r -> print_reg r
+
+let print_decl (r, t) =
+ (Primitive.print_type t) ^ " " ^ (Register.print r)
+
+let rec print_args args =
+ Printf.sprintf "[%s]" (MiscPottier.string_of_list ", " print_reg args)
+
+let print_result = function
+ | None -> "_"
+ | Some (r, t) -> (Primitive.print_type t) ^ " " ^ (Register.print r)
+
+let print_params r =
+ Printf.sprintf "(%s)" (MiscPottier.string_of_list ", " print_decl r)
+
+let print_locals r =
+ Printf.sprintf "%s" (MiscPottier.string_of_list ", " print_decl r)
+
+
+let print_cmp = function
+ | AST.Cmp_eq -> "eq"
+ | AST.Cmp_ne -> "ne"
+ | AST.Cmp_gt -> "gt"
+ | AST.Cmp_ge -> "ge"
+ | AST.Cmp_lt -> "lt"
+ | AST.Cmp_le -> "le"
+
+let rec print_size = function
+ | AST.SQ q -> Memory.string_of_quantity q
+ | AST.SProd l -> "struct {" ^ (print_size_list l) ^ "}"
+ | AST.SSum l -> "union {" ^ (print_size_list l) ^ "}"
+ | AST.SArray (i, se) ->
+ (print_size se) ^ "[" ^ (string_of_int i) ^ "]"
+and print_size_list l =
+ MiscPottier.string_of_list ", " print_size l
+
+let print_stacksize = print_size
+
+let print_offset (size, depth) =
+ (print_size size) ^ ", " ^ (string_of_int depth)
+
+let print_sizeof = print_size
+
+let print_cst = function
+ | AST.Cst_int i -> Printf.sprintf "imm_int %d" i
+ | AST.Cst_float f -> Printf.sprintf "imm_float %f" f
+ | AST.Cst_addrsymbol id -> Printf.sprintf "imm_addr \"%s\"" id
+ | AST.Cst_stack -> "imm_addr STACK"
+ | AST.Cst_offset off -> Printf.sprintf "imm_offset { %s }" (print_offset off)
+ | AST.Cst_sizeof t -> "imm_sizeof (" ^ (print_size t) ^ ")"
+
+let string_of_signedness = function
+ | AST.Signed -> "s"
+ | AST.Unsigned -> "u"
+
+let string_of_int_type (size, sign) =
+ Printf.sprintf "%d%s" size (string_of_signedness sign)
+
+let print_op1 = function
+ | AST.Op_cast (int_type, dest_size) ->
+ Printf.sprintf "int%sto%d" (string_of_int_type int_type) dest_size
+ | AST.Op_negint -> "negint"
+ | AST.Op_notbool -> "notbool"
+ | AST.Op_notint -> "notint"
+ | AST.Op_id -> "id"
+ | AST.Op_ptrofint -> "ptrofint"
+ | AST.Op_intofptr -> "intofptr"
+
+let print_op2 = function
+ | AST.Op_add -> "add"
+ | AST.Op_sub -> "sub"
+ | AST.Op_mul -> "mul"
+ | AST.Op_div -> "div"
+ | AST.Op_divu -> "/u"
+ | AST.Op_mod -> "mod"
+ | AST.Op_modu -> "modu"
+ | AST.Op_and -> "and"
+ | AST.Op_or -> "or"
+ | AST.Op_xor -> "xor"
+ | AST.Op_shl -> "shl"
+ | AST.Op_shr -> "shr"
+ | AST.Op_shru -> "shru"
+ | AST.Op_cmp cmp -> print_cmp cmp
+ | AST.Op_addp -> "addp"
+ | AST.Op_subp -> "subp"
+ | AST.Op_subpp -> "subpp"
+ | AST.Op_cmpp cmp -> (print_cmp cmp) ^ "p"
+ | AST.Op_cmpu cmp -> (print_cmp cmp) ^ "u"
+
+
+(*
+let print_addressing = function
+ | RTLabs.Aindexed off -> Printf.sprintf "{ %s }" (print_offset off)
+ | RTLabs.Aindexed2 -> "add"
+ | RTLabs.Aglobal (id, off) ->
+ Printf.sprintf "{ %s }(\"%s\")" (print_offset off) id
+ | RTLabs.Abased (id, off) ->
+ Printf.sprintf "add, { %s }(\"%s\")" (print_offset off) id
+ | RTLabs.Ainstack off -> Printf.sprintf "{ %s }(STACK)" (print_offset off)
+*)
+
+
+let rec print_table = function
+ | [] -> ""
+ | [lbl] -> lbl
+ | lbl :: tbl -> lbl ^ ", " ^ (print_table tbl)
+
+
+let print_statement = function
+ | RTLabs.St_skip lbl -> "--> " ^ lbl
+ | RTLabs.St_cost (cost_lbl, lbl) ->
+ Printf.sprintf "emit %s --> %s" cost_lbl lbl
+ | RTLabs.St_cst (destr, cst, lbl) ->
+ Printf.sprintf "imm %s, %s --> %s"
+ (print_reg destr)
+ (print_cst cst)
+ lbl
+ | RTLabs.St_op1 (op1, destr, srcr, lbl) ->
+ Printf.sprintf "%s %s, %s --> %s"
+ (print_op1 op1)
+ (print_reg destr)
+ (print_reg srcr)
+ lbl
+ | RTLabs.St_op2 (op2, destr, srcr1, srcr2, lbl) ->
+ Printf.sprintf "%s %s, %s, %s --> %s"
+ (print_op2 op2)
+ (print_reg destr)
+ (print_reg srcr1)
+ (print_reg srcr2)
+ lbl
+ | RTLabs.St_load (q, addr, destr, lbl) ->
+ Printf.sprintf "load %s, %s, %s --> %s"
+ (Memory.string_of_quantity q)
+ (print_reg addr)
+ (print_reg destr)
+ lbl
+ | RTLabs.St_store (q, addr, srcr, lbl) ->
+ Printf.sprintf "store %s, %s, %s --> %s"
+ (Memory.string_of_quantity q)
+ (print_reg addr)
+ (print_reg srcr)
+ lbl
+ | RTLabs.St_call_id (f, args, res, sg, lbl) ->
+ Printf.sprintf "call \"%s\", %s, %s: %s --> %s"
+ f
+ (print_args args)
+ (print_oreg res)
+ (Primitive.print_sig sg)
+ lbl
+ | RTLabs.St_call_ptr (f, args, res, sg, lbl) ->
+ Printf.sprintf "call_ptr %s, %s, %s: %s --> %s"
+ (print_reg f)
+ (print_args args)
+ (print_oreg res)
+ (Primitive.print_sig sg)
+ lbl
+ | RTLabs.St_tailcall_id (f, args, sg) ->
+ Printf.sprintf "tailcall \"%s\", %s: %s"
+ f
+ (print_args args)
+ (Primitive.print_sig sg)
+ | RTLabs.St_tailcall_ptr (f, args, sg) ->
+ Printf.sprintf "tailcall_ptr \"%s\", %s: %s"
+ (print_reg f)
+ (print_args args)
+ (Primitive.print_sig sg)
+ | RTLabs.St_cond (r, lbl_true, lbl_false) ->
+ Printf.sprintf "%s? --> %s, %s"
+ (print_reg r)
+ lbl_true
+ lbl_false
+(*
+ | RTLabs.St_condcst (cst, t, lbl_true, lbl_false) ->
+ Printf.sprintf "(%s) %s --> %s, %s"
+ (Primitive.print_type t)
+ (print_cst cst)
+ lbl_true
+ lbl_false
+ | RTLabs.St_cond1 (op1, srcr, lbl_true, lbl_false) ->
+ Printf.sprintf "%s %s --> %s, %s"
+ (print_op1 op1)
+ (print_reg srcr)
+ lbl_true
+ lbl_false
+ | RTLabs.St_cond2 (op2, srcr1, srcr2, lbl_true, lbl_false) ->
+ Printf.sprintf "%s %s, %s --> %s, %s"
+ (print_op2 op2)
+ (print_reg srcr1)
+ (print_reg srcr2)
+ lbl_true
+ lbl_false
+*)
+ | RTLabs.St_jumptable (r, tbl) ->
+ Printf.sprintf "j_tbl %s --> %s"
+ (print_reg r)
+ (print_table tbl)
+ | RTLabs.St_return None -> Printf.sprintf "return"
+ | RTLabs.St_return (Some r) -> Printf.sprintf "return %s" (print_reg r)
+
+
+let print_graph eformat n c =
+ let f lbl stmt =
+ Eformat.printf eformat "%s%s: %s\n"
+ (n_spaces n)
+ lbl
+ (print_statement stmt) in
+ Label.Map.iter f c
+
+
+let print_internal_decl eformat n f def =
+ Eformat.printf eformat
+ "%s\"%s\"%s\n%slocals: %s\n%sresult: %s\n%sstacksize: %s\n%sentry: %s\n%sexit: %s\n\n"
+ (n_spaces n)
+ f
+ (print_params def.RTLabs.f_params)
+ (n_spaces (n+2))
+ (print_locals def.RTLabs.f_locals)
+ (n_spaces (n+2))
+ (print_result def.RTLabs.f_result)
+ (n_spaces (n+2))
+ (print_stacksize def.RTLabs.f_stacksize)
+ (n_spaces (n+2))
+ def.RTLabs.f_entry
+ (n_spaces (n+2))
+ def.RTLabs.f_exit ;
+ print_graph eformat (n+2) def.RTLabs.f_graph
+
+
+let print_external_decl eformat n f def =
+ Eformat.printf eformat "%sextern \"%s\": %s\n"
+ (n_spaces n)
+ f
+ (Primitive.print_sig def.AST.ef_sig)
+
+
+let print_fun_decl eformat n (f, def) = match def with
+ | RTLabs.F_int def -> print_internal_decl eformat n f def
+ | RTLabs.F_ext def -> print_external_decl eformat n f def
+
+let print_fun_decls eformat n functs =
+ List.iter
+ (fun f -> print_fun_decl eformat n f ; Eformat.printf eformat "\n\n")
+ functs
+
+
+let print_program p =
+ let eformat = Eformat.create () in
+ Eformat.printf eformat "program:\n\n\n" ;
+ print_globals eformat 2 p.RTLabs.vars ;
+ Eformat.printf eformat "\n\n" ;
+ print_fun_decls eformat 2 p.RTLabs.functs ;
+ Eformat.get eformat
--- /dev/null
+
+(** This module provides a function to print [RTLabs] programs. *)
+
+val print_statement : RTLabs.statement -> string
+
+val print_program : RTLabs.program -> string
--- /dev/null
+
+(** This module provides a translation of [RTLabs] programs to [RTL]
+ programs. *)
+
+
+let error_prefix = "RTLabs to RTL"
+let error = Error.global_error error_prefix
+
+let error_int () = error "int16 and int32 not supported."
+let error_float () = error "float not supported."
+let error_shift () = error "Shift operations not supported."
+
+
+let change_entry def f_entry = { def with RTL.f_entry }
+
+let add_graph lbl stmt def =
+ { def with RTL.f_graph = Label.Map.add lbl stmt def.RTL.f_graph }
+
+let fresh_label def = Label.Gen.fresh def.RTL.f_luniverse
+
+let fresh_reg def =
+ let r = Register.fresh def.RTL.f_runiverse in
+ let locals = Register.Set.add r def.RTL.f_locals in
+ ({ def with RTL.f_locals = locals }, r)
+
+let rec fresh_regs def n =
+ if n = 0 then (def, [])
+ else
+ let (def, res) = fresh_regs def (n-1) in
+ let (def, r) = fresh_reg def in
+ (def, r :: res)
+
+let addr_regs regs = match regs with
+ | r1 :: r2 :: _ -> (r1, r2)
+ | _ -> error "registers are not an address."
+
+let rec register_freshes runiverse n =
+ if n <= 0 then []
+ else (Register.fresh runiverse) :: (register_freshes runiverse (n-1))
+
+let choose_rest rest1 rest2 = match rest1, rest2 with
+ | [], _ -> rest2
+ | _, [] -> rest1
+ | _ -> assert false (* do not use on these arguments *)
+
+let complete_regs def srcrs1 srcrs2 =
+ let nb_added = (List.length srcrs1) - (List.length srcrs2) in
+ let (def, added_regs) = fresh_regs def nb_added in
+ if nb_added > 0 then (srcrs1, srcrs2 @ added_regs, added_regs)
+ else (srcrs1 @ added_regs, srcrs2, added_regs)
+
+
+let size_of_sig_type = function
+ | AST.Sig_int (i, _) -> i / Driver.TargetArch.int_size
+ | AST.Sig_float _ -> error_float ()
+ | AST.Sig_offset -> Driver.TargetArch.int_size
+ | AST.Sig_ptr -> Driver.TargetArch.ptr_size
+
+let concrete_size = Driver.RTLMemory.concrete_size
+
+let concrete_offset = Driver.RTLMemory.concrete_offset
+
+
+(* Local environments *)
+
+type local_env = Register.t list Register.Map.t
+
+let mem_local_env = Register.Map.mem
+let add_local_env = Register.Map.add
+let find_local_env = Register.Map.find
+
+let initialize_local_env runiverse registers result =
+ let registers =
+ registers @ (match result with None -> [] | Some (r, t) -> [(r, t)]) in
+ let f lenv (r, t) =
+ let rs = register_freshes runiverse (size_of_sig_type t) in
+ add_local_env r rs lenv in
+ List.fold_left f Register.Map.empty registers
+
+let map_list_local_env lenv regs =
+ let f res r = res @ (find_local_env r lenv) in
+ List.fold_left f [] regs
+
+let make_addr = function
+ | r1 :: r2 :: _ -> (r1, r2)
+ | _ -> assert false (* do not use on these arguments *)
+
+let find_and_addr r lenv = make_addr (find_local_env r lenv)
+
+let rtl_args regs_list lenv =
+ List.flatten (List.map (fun r -> find_local_env r lenv) regs_list)
+
+
+let change_label lbl = function
+ | RTL.St_skip _ -> RTL.St_skip lbl
+ | RTL.St_cost (cost_lbl, _) -> RTL.St_cost (cost_lbl, lbl)
+ | RTL.St_addr (r1, r2, id, _) -> RTL.St_addr (r1, r2, id, lbl)
+ | RTL.St_stackaddr (r1, r2, _) -> RTL.St_stackaddr (r1, r2, lbl)
+ | RTL.St_int (r, i, _) -> RTL.St_int (r, i, lbl)
+ | RTL.St_move (r1, r2, _) -> RTL.St_move (r1, r2, lbl)
+ | RTL.St_opaccs (opaccs, dstr1, dstr2, srcr1, srcr2, _) ->
+ RTL.St_opaccs (opaccs, dstr1, dstr2, srcr1, srcr2, lbl)
+ | RTL.St_op1 (op1, dstr, srcr, _) -> RTL.St_op1 (op1, dstr, srcr, lbl)
+ | RTL.St_op2 (op2, dstr, srcr1, srcr2, _) ->
+ RTL.St_op2 (op2, dstr, srcr1, srcr2, lbl)
+ | RTL.St_clear_carry _ -> RTL.St_clear_carry lbl
+ | RTL.St_set_carry _ -> RTL.St_set_carry lbl
+ | RTL.St_load (dstrs, addr1, addr2, _) ->
+ RTL.St_load (dstrs, addr1, addr2, lbl)
+ | RTL.St_store (addr1, addr2, srcrs, _) ->
+ RTL.St_store (addr1, addr2, srcrs, lbl)
+ | RTL.St_call_id (f, args, retrs, _) -> RTL.St_call_id (f, args, retrs, lbl)
+ | RTL.St_call_ptr (f1, f2, args, retrs, _) ->
+ RTL.St_call_ptr (f1, f2, args, retrs, lbl)
+ | RTL.St_tailcall_id (f, args) -> RTL.St_tailcall_id (f, args)
+ | RTL.St_tailcall_ptr (f1, f2, args) -> RTL.St_tailcall_ptr (f1, f2, args)
+ | RTL.St_cond _ as inst -> inst
+ | RTL.St_return regs -> RTL.St_return regs
+
+(* Add a list of instruction in a graph, from one label to another, by creating
+ fresh labels inbetween. *)
+
+let rec adds_graph stmt_list start_lbl dest_lbl def = match stmt_list with
+ | [] ->
+ add_graph start_lbl (RTL.St_skip dest_lbl) def
+ | [stmt] ->
+ add_graph start_lbl (change_label dest_lbl stmt) def
+ | stmt :: stmt_list ->
+ let tmp_lbl = fresh_label def in
+ let stmt = change_label tmp_lbl stmt in
+ let def = add_graph start_lbl stmt def in
+ adds_graph stmt_list tmp_lbl dest_lbl def
+
+let generates_graph stmt_list def =
+ let start_lbl = fresh_label def in
+ let dest_lbl = def.RTL.f_entry in
+ change_entry (adds_graph stmt_list start_lbl dest_lbl def) start_lbl
+
+(* Process a list of function that adds a list of instructions to a graph, from
+ one label to another, and by creating fresh labels inbetween. *)
+
+let rec add_translates translate_list start_lbl dest_lbl def =
+ match translate_list with
+ | [] ->
+ add_graph start_lbl (RTL.St_skip dest_lbl) def
+ | [trans] ->
+ trans start_lbl dest_lbl def
+ | trans :: translate_list ->
+ let tmp_lbl = fresh_label def in
+ let def = trans start_lbl tmp_lbl def in
+ add_translates translate_list tmp_lbl dest_lbl def
+
+
+let rec translate_cst cst destrs start_lbl dest_lbl def = match cst with
+
+ | AST.Cst_int _ when destrs = [] ->
+ add_graph start_lbl (RTL.St_skip dest_lbl) def
+
+ | AST.Cst_int i ->
+ let size = List.length destrs in
+ let module M = IntValue.Make (struct let size = size end) in
+ let is = List.map M.to_int (M.break (M.of_int i) size) in
+ let f r i = RTL.St_int (r, i, dest_lbl) in
+ let l = List.map2 f destrs is in
+ adds_graph l start_lbl dest_lbl def
+
+ | AST.Cst_float _ -> error_float ()
+
+ | AST.Cst_addrsymbol id ->
+ let (r1, r2) = make_addr destrs in
+ add_graph start_lbl (RTL.St_addr (r1, r2, id, dest_lbl)) def
+
+ | AST.Cst_stack ->
+ let (r1, r2) = make_addr destrs in
+ add_graph start_lbl (RTL.St_stackaddr (r1, r2, dest_lbl)) def
+
+ | AST.Cst_offset off ->
+ let i = concrete_offset off in
+ translate_cst (AST.Cst_int i) destrs start_lbl dest_lbl def
+
+ | AST.Cst_sizeof size ->
+ let i = concrete_size size in
+ translate_cst (AST.Cst_int i) destrs start_lbl dest_lbl def
+
+
+(** Adds zeros if destination is bigger than source, or truncates if source is
+ bigger than destination. *)
+
+let translate_move destrs srcrs start_lbl =
+ let ((common1, rest1), (common2, rest2)) = MiscPottier.reduce destrs srcrs in
+ let f_common destr srcr = RTL.St_move (destr, srcr, start_lbl) in
+ let translates1 = adds_graph (List.map2 f_common common1 common2) in
+ let translates2 = translate_cst (AST.Cst_int 0) rest1 in
+ add_translates [translates1 ; translates2] start_lbl
+
+let translate_cast_unsigned destrs start_lbl dest_lbl def =
+ let (def, tmp_zero) = fresh_reg def in
+ let zeros = MiscPottier.make tmp_zero (List.length destrs) in
+ add_translates
+ [adds_graph [RTL.St_int (tmp_zero, 0, start_lbl)] ;
+ translate_move destrs zeros]
+ start_lbl dest_lbl def
+
+(** [srcr] will be copied in the first register of [destrs]. The remaining
+ registers of [destrs] needs to be set either to zeros or to ones, depending
+ on the most significant bit of [srcr]. Since 8051 is a 8 bits architecture,
+ we fetch the most significant bit with [src & 10000000]. Let [tmpr] be the
+ result. Then we build zeros or ones with [tmpr * 11111111]. *)
+
+let translate_cast_signed destrs srcr start_lbl dest_lbl def =
+ let (def, tmp_128) = fresh_reg def in
+ let (def, tmp_255) = fresh_reg def in
+ let (def, tmpr) = fresh_reg def in
+ let (def, dummy) = fresh_reg def in
+ let insts =
+ [RTL.St_int (tmp_128, 128, start_lbl) ;
+ RTL.St_op2 (I8051.And, tmpr, tmp_128, srcr, start_lbl) ;
+ RTL.St_opaccs (I8051.DivuModu, tmpr, dummy, tmpr, tmp_128, start_lbl) ;
+ RTL.St_int (tmp_255, 255, start_lbl) ;
+ RTL.St_opaccs (I8051.Mul, tmpr, dummy, tmpr, tmp_255, start_lbl)] in
+ let srcrs = MiscPottier.make tmpr (List.length destrs) in
+ add_translates [adds_graph insts ; translate_move destrs srcrs]
+ start_lbl dest_lbl def
+
+(** Depending on [src_sign], perform either a signed or an unsigned cast. For
+ the signed case, we need the most significant bit of the source. *)
+
+let translate_cast src_size src_sign dest_size destrs srcrs =
+ if List.length srcrs = 0 then adds_graph []
+ else
+ if dest_size < src_size then translate_move destrs srcrs
+ else
+ let ((common1, rest1), (common2, rest2)) =
+ MiscPottier.reduce destrs srcrs in
+ (* dest_size >= src_size, so there will be no rest2 *)
+ assert (rest2 = []) ;
+ let insts_common = translate_move common1 common2 in
+ let sign_reg = MiscPottier.last srcrs in
+ let insts_sign = match src_sign with
+ | AST.Unsigned -> translate_cast_unsigned rest1
+ | AST.Signed -> translate_cast_signed rest1 sign_reg in
+ add_translates [insts_common ; insts_sign]
+
+
+(** [-x] is [~x] (the complement of [x]), and then propagating the carry if some
+ register of the result is greater or equal to 128 (10000000 in binary). *)
+
+(** FIXME Nicolas: why is this correct? *)
+
+let translate_negint destrs srcrs start_lbl dest_lbl def =
+ assert (List.length destrs = List.length srcrs) ;
+ let (def, tmpr) = fresh_reg def in
+ let f_cmpl destr srcr = RTL.St_op1 (I8051.Cmpl, destr, srcr, start_lbl) in
+ let insts_cmpl = List.map2 f_cmpl destrs srcrs in
+ let insts_init =
+ [RTL.St_set_carry start_lbl ;
+ RTL.St_int (tmpr, 0, start_lbl)] in
+ let f_add destr = RTL.St_op2 (I8051.Addc, destr, destr, tmpr, start_lbl) in
+ let insts_add = List.map f_add destrs in
+ adds_graph (insts_cmpl @ insts_init @ insts_add)
+ start_lbl dest_lbl def
+
+
+(** In order to know if a register is different from 0 or not, we can simply
+ substract it from 0 and fetch the carry bit: it is 0 if the register
+ contains 0, and 1 otherwise. By doing a | on the result of
+ the previous operation on every source register and starting with 0, the
+ result is either 0 if all the source registers contained 0, and 1
+ otherwise. Let [tmp_res] be this number; then, the result of [notbool] is
+ simply [tmp_res ^ 1]. *)
+
+let translate_notbool destrs srcrs start_lbl dest_lbl def = match destrs with
+ | [] -> add_graph start_lbl (RTL.St_skip dest_lbl) def
+ | destr :: destrs ->
+ (* [destr] will be set to either 0 or 1 (depending on [srcrs]), the
+ remaining destination registers [destrs] will be set to 0. *)
+ let (def, tmpr) = fresh_reg def in
+ let (def, tmp_srcrs) = fresh_regs def (List.length srcrs) in
+ let save_srcrs = translate_move tmp_srcrs srcrs in
+ let prologue = translate_cst (AST.Cst_int 0) (destr :: destrs) in
+ let f tmp_srcr =
+ [RTL.St_clear_carry start_lbl ;
+ RTL.St_int (tmpr, 0, start_lbl) ;
+ RTL.St_op2 (I8051.Sub, tmpr, tmpr, tmp_srcr, start_lbl) ;
+ RTL.St_int (tmpr, 0, start_lbl) ;
+ RTL.St_op2 (I8051.Addc, tmpr, tmpr, tmpr, start_lbl) ;
+ RTL.St_op2 (I8051.Or, destr, destr, tmpr, start_lbl)] in
+ let insts = List.flatten (List.map f tmp_srcrs) in
+ let epilogue =
+ [RTL.St_int (tmpr, 1, start_lbl) ;
+ RTL.St_op2 (I8051.Xor, destr, destr, tmpr, start_lbl)] in
+ add_translates
+ [save_srcrs ; prologue ; adds_graph insts ; adds_graph epilogue]
+ start_lbl dest_lbl def
+
+
+let translate_op1 op1 destrs srcrs start_lbl dest_lbl def = match op1 with
+
+ | AST.Op_cast ((src_size, src_sign), dest_size) ->
+ translate_cast src_size src_sign dest_size destrs srcrs start_lbl dest_lbl
+ def
+
+ | AST.Op_negint ->
+ translate_negint destrs srcrs start_lbl dest_lbl def
+
+ | AST.Op_notbool ->
+ translate_notbool destrs srcrs start_lbl dest_lbl def
+
+ | AST.Op_notint ->
+ let f destr srcr = RTL.St_op1 (I8051.Cmpl, destr, srcr, start_lbl) in
+ let l = List.map2 f destrs srcrs in
+ adds_graph l start_lbl dest_lbl def
+
+ | AST.Op_ptrofint | AST.Op_intofptr | AST.Op_id ->
+ translate_move destrs srcrs start_lbl dest_lbl def
+
+
+(** Apply a binary operation. The sources and destination registers may not have
+ the same size. When they do not, zero registers will be considered if
+ needed. Considers given a temporary register [tmpr] that plays the role of
+ the zero register. The destination registers can be one of the sources
+ registers. *)
+
+let translate_op_ tmpr op destrs srcrs1 srcrs2 start_lbl dest_lbl def =
+ (* The next few instructions allows to decompose the sources and destination
+ registers in sub-lists of the same size, and creating the remainings at
+ the same time. *)
+ let ((srcrs1_common, srcrs1_rest), (srcrs2_common, srcrs2_rest)) =
+ MiscPottier.reduce srcrs1 srcrs2 in
+ let srcrs_rest = choose_rest srcrs1_rest srcrs2_rest in
+ let ((destrs_common, destrs_rest), _) =
+ MiscPottier.reduce destrs srcrs1_common in
+ (* srcrs1_common and srcrs2_common have the same size, which is exactly the
+ one of the shortest list between srcrs1 and srcrs2. destrs_common and
+ destrs_rest are either destrs and empty if destrs is bigger than
+ srcrs1_common (and thus srcrs2_common), or destrs_common has the size of
+ srcrs1_common (and srcrs2_common) and destrs_rest is the remainings of
+ destrs. *)
+ let ((destrs_cted, destrs_rest), (srcrs_cted, _)) =
+ MiscPottier.reduce destrs_rest srcrs_rest in
+ (* destrs_cted is either empty or is the remainings of destrs that has the
+ same size of the remainings between the srcrs1 and srcrs2 when removed the
+ number of elements of the size of the shortest one. destrs_rest are the
+ remainings, if any. *)
+ let insts_init =
+ [RTL.St_clear_carry start_lbl ;
+ RTL.St_int (tmpr, 0, start_lbl)] in
+ let f_op destr srcr1 srcr2 =
+ RTL.St_op2 (op, destr, srcr1, srcr2, start_lbl) in
+ let insts_op =
+ MiscPottier.map3 f_op destrs_common srcrs1_common srcrs2_common in
+ let f_op_cted destr srcr =
+ RTL.St_op2 (op, destr, srcr, tmpr, start_lbl) in
+ let insts_op_cted = List.map2 f_op_cted destrs_cted srcrs_cted in
+ let f_rest destr =
+ RTL.St_op2 (op, destr, tmpr, tmpr, start_lbl) in
+ let insts_rest = List.map f_rest destrs_rest in
+ adds_graph (insts_init @ insts_op @ insts_op_cted @ insts_rest)
+ start_lbl dest_lbl def
+
+(** Same as [translate_op], but creates the zero register. *)
+
+let translate_op op destrs srcrs1 srcrs2 start_lbl dest_lbl def =
+ let (def, tmpr) = fresh_reg def in
+ translate_op_ tmpr op destrs srcrs1 srcrs2 start_lbl dest_lbl def
+
+
+(** Multiply a list of registers (list significant bits first) by a
+ register. The multiplication in 8051 of two registers is two registers: the
+ least and most significant bits of the result. When pultiplying a list of
+ registers with one register, we need to propagate the most significant bits
+ of an operation to the next one for addition. Example:
+
+ (i1 i2) * j = res11 (res12 + res21)
+
+ where (res11, res12) = i1 * j and (res21, res22) = i2 * j. The result is
+ truncated by just forgetting about res22. *)
+
+(* [dummy] is used to discard the most significant bits *)
+
+let rec translate_mul1 dummy tmpr destrs srcrs1 srcr2 start_lbl =
+ match destrs, srcrs1 with
+ | [], _ -> adds_graph [RTL.St_skip start_lbl] start_lbl
+ | [destr], [] ->
+ (* if there are no source register left, and only one destination
+ register, simply add the carry bit of a potential previous addition *)
+ adds_graph [RTL.St_int (tmpr, 0, start_lbl) ;
+ RTL.St_op2 (I8051.Addc, destr, destr, tmpr, start_lbl)]
+ start_lbl
+ | destr1 :: destr2 :: _, [] ->
+ (* if there are no source register left, but at least two destination
+ registers, adding the carry of the potential previous addition
+ may lead to another carry that needs to be propagated *)
+ add_translates
+ [adds_graph [RTL.St_int (tmpr, 0, start_lbl) ;
+ RTL.St_op2 (I8051.Addc, destr1, destr1, tmpr, start_lbl) ;
+ RTL.St_op2 (I8051.Addc, destr2, tmpr, tmpr, start_lbl)]]
+ start_lbl
+ | [destr], srcr1 :: _ ->
+ (* if there are at least one source register, but only one destination
+ register, discard the most significant bits of the multiplication *)
+ adds_graph
+ [RTL.St_opaccs (I8051.Mul, tmpr, dummy, srcr2, srcr1, start_lbl) ;
+ RTL.St_op2 (I8051.Addc, destr, destr, tmpr, start_lbl)]
+ start_lbl
+ | destr1 :: destr2 :: destrs, srcr1 :: srcrs1 ->
+ (* if there are at least one source register, and at least two destination
+ registers, the first destination register should hold the most
+ significant bits of the previous atomic multiplication. We need to add
+ to it the least significant bits of the current operation, and store
+ the most significant bits in the next destination register for the next
+ multiplication. *)
+ add_translates
+ [adds_graph
+ [RTL.St_opaccs
+ (I8051.Mul, tmpr, destr2, srcr2, srcr1, start_lbl) ;
+ RTL.St_op2 (I8051.Addc, destr1, destr1, tmpr, start_lbl)] ;
+ translate_mul1 dummy tmpr (destr2 :: destrs) srcrs1 srcr2]
+ start_lbl
+
+(** Multiply the ith register of some source registers. The registers up to the
+ ith of the result should be set to 0, and the multiplication really starts
+ at the next one. The result of this operation is then added to the current
+ result of the full multiplication. *)
+
+let translate_muli
+ dummy tmpr destrs tmp_destrs srcrs1 dummy_lbl i translates srcr2i =
+ let (tmp_destrs1, tmp_destrs2) = MiscPottier.split tmp_destrs i in
+ translates @
+ (match tmp_destrs2 with
+ | [] -> []
+ | tmp_destr2 :: tmp_destrs2 ->
+ [adds_graph [RTL.St_clear_carry dummy_lbl] ;
+ translate_cst (AST.Cst_int 0) [tmpr] ;
+ translate_cst (AST.Cst_int 0) tmp_destrs ;
+ translate_mul1 dummy tmpr (tmp_destr2 :: tmp_destrs2) srcrs1 srcr2i ;
+ translate_cst (AST.Cst_int 0) tmp_destrs1 ;
+ adds_graph [RTL.St_clear_carry dummy_lbl] ;
+ translate_op I8051.Addc destrs destrs tmp_destrs])
+
+(** Multiplication, school-style:
+
+ i1n ... i11 * j1m ... j11 =
+ i1n ... i11 * j11 +
+ i1n ... i12 0 * j12 +
+ i1n ... i13 0 0 * j13 +
+ ... *)
+
+let translate_mul destrs srcrs1 srcrs2 start_lbl dest_lbl def =
+ (* dummy will be used to discard some unused results *)
+ let (def, dummy) = fresh_reg def in
+ let (def, tmpr) = fresh_reg def in
+ (* One line of the multiplication is stored in tmp_destrs. The result of the
+ full multiplication is accumulated in destrs. *)
+ let (def, tmp_destrs) = fresh_regs def (List.length destrs) in
+ (* Source registers are copied into fresh source registers to avoid
+ overwriting if one of them is also the destination registers. *)
+ let (def, fresh_srcrs1) = fresh_regs def (List.length srcrs1) in
+ let (def, fresh_srcrs2) = fresh_regs def (List.length srcrs2) in
+ let insts_init =
+ [translate_move fresh_srcrs1 srcrs1 ;
+ translate_move fresh_srcrs2 srcrs2 ;
+ translate_cst (AST.Cst_int 0) destrs] in
+ let f = translate_muli dummy tmpr destrs tmp_destrs fresh_srcrs1 start_lbl in
+ let insts_mul = MiscPottier.foldi f [] fresh_srcrs2 in
+ add_translates (insts_init @ insts_mul) start_lbl dest_lbl def
+
+
+(** The 8051 performs division and modulo in a single operation. Depending on
+ the one we need (boolean [order]), we discard the other. *)
+
+let translate_divumodu8 order destrs srcr1 srcr2 start_lbl dest_lbl def =
+ match destrs with
+ | [] -> add_graph start_lbl (RTL.St_skip dest_lbl) def
+ | destr :: destrs ->
+ let (def, dummy) = fresh_reg def in
+ let (destr1, destr2) = if order then (destr, dummy) else (dummy, destr) in
+ let inst_div =
+ adds_graph [RTL.St_opaccs (I8051.DivuModu, destr1, destr2,
+ srcr1, srcr2, start_lbl)] in
+ let insts_rest = translate_cst (AST.Cst_int 0) destrs in
+ add_translates [inst_div ; insts_rest] start_lbl dest_lbl def
+
+
+(** Only the first register of [destrs] will be used, the others will be set to
+ 0. We compare in order the registers of both source registers and accumulate
+ the results in the first register of [destrs], with a | and initially set to
+ 0. Two registers are equal if and only if substracting one with the other
+ and substracting the other with the one both lead to no carry. If one of the
+ source registers is bigger than the other, we compare the remainings with
+ 0. We first copy the source registers into fresh ones, in case the
+ destination registers share some source registers. Example:
+
+ srcr11 ... srcr1n != srcr21 ... srcr2m =
+ carry(srcr11 - srcr21) | carry (srcr21 - srcr11) |
+ carry(srcr12 - srcr22) | carry (srcr22 - srcr12) |
+ ... *)
+
+let translate_ne destrs srcrs1 srcrs2 start_lbl dest_lbl def =
+ match destrs with
+ | [] -> add_graph start_lbl (RTL.St_skip dest_lbl) def
+ | destr :: destrs ->
+ let (def, dummy) = fresh_reg def in
+ let (def, tmp_zero) = fresh_reg def in
+ let (def, tmp_srcrs1) = fresh_regs def (List.length srcrs1) in
+ let save_srcrs1 = translate_move tmp_srcrs1 srcrs1 in
+ let (def, tmp_srcrs2) = fresh_regs def (List.length srcrs2) in
+ let save_srcrs2 = translate_move tmp_srcrs2 srcrs2 in
+ let ((common1, rest1), (common2, rest2)) =
+ MiscPottier.reduce tmp_srcrs1 tmp_srcrs2 in
+ let rest = choose_rest rest1 rest2 in
+ let inits =
+ [RTL.St_int (destr, 0, start_lbl) ;
+ RTL.St_int (tmp_zero, 0, start_lbl)] in
+ let f tmp_srcr1 tmp_srcr2 =
+ [RTL.St_clear_carry start_lbl ;
+ RTL.St_op2 (I8051.Sub, dummy, tmp_srcr1, tmp_srcr2, start_lbl) ;
+ RTL.St_op2 (I8051.Or, destr, destr, tmp_zero, start_lbl) ;
+ RTL.St_op2 (I8051.Sub, dummy, tmp_srcr2, tmp_srcr1, start_lbl) ;
+ RTL.St_op2 (I8051.Or, destr, destr, tmp_zero, start_lbl)] in
+ let insts_common = List.flatten (List.map2 f common1 common2) in
+ let insts_rest = List.flatten (List.map (f tmp_zero) rest) in
+ let insts = inits @ insts_common @ insts_rest in
+ let epilogue = translate_cst (AST.Cst_int 0) destrs in
+ add_translates [save_srcrs1 ; save_srcrs2 ; adds_graph insts ; epilogue]
+ start_lbl dest_lbl def
+
+
+(** Are two given registers equal? We substract the one with the other, and then
+ the other with the one. They are equal if and only if both carry are 0,
+ i.e., a bitwise 'or' on the carries is 1 if and only if they are
+ different. We simply do a bitwise xor with this result and 1 to have our
+ answer:
+
+ r1 == r2 = (carry(r1 - r2) | carry(r2 - r1)) ^ 1 *)
+
+let translate_eq_reg
+ tmp_zero tmp_one tmpr1 tmpr2 destr dummy_lbl (srcr1, srcr2) =
+ [RTL.St_clear_carry dummy_lbl ;
+ RTL.St_op2 (I8051.Sub, tmpr1, srcr1, srcr2, dummy_lbl) ;
+ RTL.St_op2 (I8051.Addc, tmpr1, tmp_zero, tmp_zero, dummy_lbl) ;
+ RTL.St_clear_carry dummy_lbl ;
+ RTL.St_op2 (I8051.Sub, tmpr2, srcr2, srcr1, dummy_lbl) ;
+ RTL.St_op2 (I8051.Addc, tmpr2, tmp_zero, tmp_zero, dummy_lbl) ;
+ RTL.St_op2 (I8051.Or, tmpr1, tmpr1, tmpr2, dummy_lbl) ;
+ RTL.St_op2 (I8051.Xor, tmpr1, tmpr1, tmp_one, dummy_lbl) ;
+ RTL.St_op2 (I8051.And, destr, destr, tmpr1, dummy_lbl)]
+
+let translate_eq_list tmp_zero tmp_one tmpr1 tmpr2 destr leq dummy_lbl =
+ let f = translate_eq_reg tmp_zero tmp_one tmpr1 tmpr2 destr dummy_lbl in
+ (RTL.St_int (destr, 1, dummy_lbl)) :: (List.flatten (List.map f leq))
+
+(** Translation of unsigned LT: we proceed by successively comparing the source
+ registers most significant bits first (if one of the two source lists is
+ smaller than the other, we complete it with zeros). At each step, a register
+ ([tmpr3]) holds 1 if the previous registers are all equal, and 0
+ otherwise. The result of the comparison is 1 if there is a step where all
+ the previous registers are equal and the first current register is lower
+ than the second (which is checked by substracting the second to the first
+ and fetching the carry). *)
+
+let translate_atom
+ tmp_zero tmp_one tmpr1 tmpr2 tmpr3 destr dummy_lbl leq srcr1 srcr2 =
+ (translate_eq_list tmp_zero tmp_one tmpr1 tmpr2 tmpr3 leq dummy_lbl) @
+ [RTL.St_clear_carry dummy_lbl ;
+ RTL.St_op2 (I8051.Sub, tmpr1, srcr1, srcr2, dummy_lbl) ;
+ RTL.St_op2 (I8051.Addc, tmpr1, tmp_zero, tmp_zero, dummy_lbl) ;
+ RTL.St_op2 (I8051.And, tmpr3, tmpr3, tmpr1, dummy_lbl) ;
+ RTL.St_op2 (I8051.Or, destr, destr, tmpr3, dummy_lbl)]
+
+let translate_lt_main tmp_zero tmp_one tmpr1 tmpr2 tmpr3 destr dummy_lbl
+ srcrs1 srcrs2 =
+ let f (insts, leq) srcr1 srcr2 =
+ let added_insts =
+ translate_atom tmp_zero tmp_one tmpr1 tmpr2 tmpr3 destr dummy_lbl leq
+ srcr1 srcr2 in
+ (insts @ added_insts, leq @ [(srcr1, srcr2)]) in
+ fst (List.fold_left2 f ([], []) srcrs1 srcrs2)
+
+let translate_lt destrs srcrs1 srcrs2 start_lbl dest_lbl def =
+ match destrs with
+ | [] -> add_graph start_lbl (RTL.St_skip dest_lbl) def
+ | _ ->
+ let (def, tmp_destrs) = fresh_regs def (List.length destrs) in
+ let tmp_destr = List.hd tmp_destrs in
+ let (def, tmp_zero) = fresh_reg def in
+ let (def, tmp_one) = fresh_reg def in
+ let (def, tmpr1) = fresh_reg def in
+ let (def, tmpr2) = fresh_reg def in
+ let (def, tmpr3) = fresh_reg def in
+ let (srcrs1, srcrs2, added) = complete_regs def srcrs1 srcrs2 in
+ let srcrs1 = List.rev srcrs1 in
+ let srcrs2 = List.rev srcrs2 in
+ let insts_init =
+ [translate_cst (AST.Cst_int 0) tmp_destrs ;
+ translate_cst (AST.Cst_int 0) added ;
+ adds_graph [RTL.St_int (tmp_zero, 0, start_lbl) ;
+ RTL.St_int (tmp_one, 1, start_lbl)]] in
+ let insts_main =
+ translate_lt_main tmp_zero tmp_one tmpr1 tmpr2 tmpr3 tmp_destr start_lbl
+ srcrs1 srcrs2 in
+ let insts_main = [adds_graph insts_main] in
+ let insts_exit = [translate_move destrs tmp_destrs] in
+ add_translates (insts_init @ insts_main @ insts_exit )
+ start_lbl dest_lbl def
+
+
+(** Translation of signed LT: exactly unsigned LT when the signed bit is
+ changed: positive numbers become greater than the half bound as unsigned,
+ negative numbers become between 0 and the half bound as unsigned. The sign
+ bit is changed with a bitwise xor between the register holding the bit sign
+ (the most significant register, i.e. the last register in the list of
+ registers) and 10000000. *)
+
+let add_128_to_last tmp_128 rs start_lbl = match rs with
+ | [] -> adds_graph [] start_lbl
+ | _ ->
+ let r = MiscPottier.last rs in
+ adds_graph [RTL.St_op2 (I8051.Xor, r, r, tmp_128, start_lbl)] start_lbl
+
+let translate_lts destrs srcrs1 srcrs2 start_lbl dest_lbl def =
+ let (def, tmp_srcrs1) = fresh_regs def (List.length srcrs1) in
+ let (def, tmp_srcrs2) = fresh_regs def (List.length srcrs2) in
+ let (def, tmp_128) = fresh_reg def in
+ add_translates
+ [translate_move tmp_srcrs1 srcrs1 ;
+ translate_move tmp_srcrs2 srcrs2 ;
+ adds_graph [RTL.St_int (tmp_128, 128, start_lbl)] ;
+ add_128_to_last tmp_128 tmp_srcrs1 ;
+ add_128_to_last tmp_128 tmp_srcrs2 ;
+ translate_lt destrs tmp_srcrs1 tmp_srcrs2]
+ start_lbl dest_lbl def
+
+
+let rec translate_op2 op2 destrs srcrs1 srcrs2 start_lbl dest_lbl def =
+ match op2 with
+
+ | AST.Op_add | AST.Op_addp ->
+ translate_op I8051.Addc destrs srcrs1 srcrs2 start_lbl dest_lbl def
+
+ | AST.Op_sub | AST.Op_subp | AST.Op_subpp ->
+ translate_op I8051.Sub destrs srcrs1 srcrs2 start_lbl dest_lbl def
+
+ | AST.Op_mul ->
+ translate_mul destrs srcrs1 srcrs2 start_lbl dest_lbl def
+
+ | AST.Op_divu when List.length srcrs1 = 1 && List.length srcrs2 = 1 ->
+ translate_divumodu8 true destrs (List.hd srcrs1) (List.hd srcrs2)
+ start_lbl dest_lbl def
+
+ | AST.Op_modu when List.length srcrs1 = 1 && List.length srcrs2 = 1 ->
+ translate_divumodu8 false destrs (List.hd srcrs1) (List.hd srcrs2)
+ start_lbl dest_lbl def
+
+ | AST.Op_and ->
+ translate_op I8051.And destrs srcrs1 srcrs2 start_lbl dest_lbl def
+
+ | AST.Op_or ->
+ translate_op I8051.Or destrs srcrs1 srcrs2 start_lbl dest_lbl def
+
+ | AST.Op_xor ->
+ translate_op I8051.Xor destrs srcrs1 srcrs2 start_lbl dest_lbl def
+
+ | AST.Op_cmp AST.Cmp_eq
+ | AST.Op_cmpu AST.Cmp_eq
+ | AST.Op_cmpp AST.Cmp_eq ->
+ add_translates
+ [translate_op2 (AST.Op_cmpu AST.Cmp_ne) destrs srcrs1 srcrs2 ;
+ translate_op1 AST.Op_notbool destrs destrs]
+ start_lbl dest_lbl def
+
+ | AST.Op_cmp AST.Cmp_ne
+ | AST.Op_cmpu AST.Cmp_ne
+ | AST.Op_cmpp AST.Cmp_ne ->
+ translate_ne destrs srcrs1 srcrs2 start_lbl dest_lbl def
+
+ | AST.Op_cmp AST.Cmp_lt ->
+ translate_lts destrs srcrs1 srcrs2 start_lbl dest_lbl def
+
+ | AST.Op_cmpu AST.Cmp_lt | AST.Op_cmpp AST.Cmp_lt ->
+ translate_lt destrs srcrs1 srcrs2 start_lbl dest_lbl def
+
+ | AST.Op_cmp AST.Cmp_le ->
+ add_translates
+ [translate_op2 (AST.Op_cmp AST.Cmp_lt) destrs srcrs2 srcrs1 ;
+ translate_op1 AST.Op_notbool destrs destrs]
+ start_lbl dest_lbl def
+
+ | AST.Op_cmpu AST.Cmp_le ->
+ add_translates
+ [translate_op2 (AST.Op_cmpu AST.Cmp_lt) destrs srcrs2 srcrs1 ;
+ translate_op1 AST.Op_notbool destrs destrs]
+ start_lbl dest_lbl def
+
+ | AST.Op_cmpp AST.Cmp_le ->
+ add_translates
+ [translate_op2 (AST.Op_cmpp AST.Cmp_lt) destrs srcrs2 srcrs1 ;
+ translate_op1 AST.Op_notbool destrs destrs]
+ start_lbl dest_lbl def
+
+ | AST.Op_cmp AST.Cmp_gt ->
+ translate_op2 (AST.Op_cmp AST.Cmp_lt)
+ destrs srcrs2 srcrs1 start_lbl dest_lbl def
+
+ | AST.Op_cmpu AST.Cmp_gt ->
+ translate_op2 (AST.Op_cmpu AST.Cmp_lt)
+ destrs srcrs2 srcrs1 start_lbl dest_lbl def
+
+ | AST.Op_cmpp AST.Cmp_gt ->
+ translate_op2 (AST.Op_cmpp AST.Cmp_lt)
+ destrs srcrs2 srcrs1 start_lbl dest_lbl def
+
+ | AST.Op_cmp AST.Cmp_ge ->
+ add_translates
+ [translate_op2 (AST.Op_cmp AST.Cmp_lt) destrs srcrs1 srcrs2 ;
+ translate_op1 AST.Op_notbool destrs destrs]
+ start_lbl dest_lbl def
+
+ | AST.Op_cmpu AST.Cmp_ge ->
+ add_translates
+ [translate_op2 (AST.Op_cmpu AST.Cmp_lt) destrs srcrs1 srcrs2 ;
+ translate_op1 AST.Op_notbool destrs destrs]
+ start_lbl dest_lbl def
+
+ | AST.Op_cmpp AST.Cmp_ge ->
+ add_translates
+ [translate_op2 (AST.Op_cmpp AST.Cmp_lt) destrs srcrs1 srcrs2 ;
+ translate_op1 AST.Op_notbool destrs destrs]
+ start_lbl dest_lbl def
+
+ | AST.Op_div | AST.Op_divu | AST.Op_modu | AST.Op_mod | AST.Op_shl
+ | AST.Op_shr | AST.Op_shru ->
+ (* Unsupported, should have been replaced by a runtime function. *)
+ assert false
+
+
+(** The RTL.St_cond construction is based on a single register. We accumulate
+ with a bitwise or the value of the source registers. In the end, the result
+ is 0 if and only if all registers contained 0. *)
+
+let translate_cond srcrs start_lbl lbl_true lbl_false def =
+ let (def, tmpr) = fresh_reg def in
+ let tmp_lbl = fresh_label def in
+ let init = RTL.St_int (tmpr, 0, start_lbl) in
+ let f srcr = RTL.St_op2 (I8051.Or, tmpr, tmpr, srcr, start_lbl) in
+ let def = adds_graph (init :: (List.map f srcrs)) start_lbl tmp_lbl def in
+ add_graph tmp_lbl (RTL.St_cond (tmpr, lbl_true, lbl_false)) def
+
+
+(** Loading or storing may ask to load or store several memory cells. We
+ consider the base address shifted by successive offsets until every data has
+ been loaded or stored. *)
+
+let translate_load addr destrs start_lbl dest_lbl def =
+ let (def, save_addr) = fresh_regs def (List.length addr) in
+ let (def, tmp_addr) = fresh_regs def (List.length addr) in
+ let (tmp_addr1, tmp_addr2) = make_addr tmp_addr in
+ let (def, tmpr) = fresh_reg def in
+ let insts_save_addr = translate_move save_addr addr in
+ let f (translates, off) r =
+ let translates =
+ translates @
+ [adds_graph [RTL.St_int (tmpr, off, start_lbl)] ;
+ translate_op2 AST.Op_addp tmp_addr save_addr [tmpr] ;
+ adds_graph [RTL.St_load (r, tmp_addr1, tmp_addr2, dest_lbl)]] in
+ (translates, off + Driver.TargetArch.int_size) in
+ let (translates, _) = List.fold_left f ([], 0) destrs in
+ add_translates (insts_save_addr :: translates) start_lbl dest_lbl def
+
+
+let translate_store addr srcrs start_lbl dest_lbl def =
+ let (def, tmp_addr) = fresh_regs def (List.length addr) in
+ let (tmp_addr1, tmp_addr2) = make_addr tmp_addr in
+ let (def, tmpr) = fresh_reg def in
+ let f (translates, off) srcr =
+ let translates =
+ translates @
+ [adds_graph [RTL.St_int (tmpr, off, start_lbl)] ;
+ translate_op2 AST.Op_addp tmp_addr addr [tmpr] ;
+ adds_graph [RTL.St_store (tmp_addr1, tmp_addr2, srcr, dest_lbl)]] in
+ (translates, off + Driver.TargetArch.int_size) in
+ let (translates, _) = List.fold_left f ([], 0) srcrs in
+ add_translates translates start_lbl dest_lbl def
+
+
+let translate_stmt lenv lbl stmt def = match stmt with
+
+ | RTLabs.St_skip lbl' ->
+ add_graph lbl (RTL.St_skip lbl') def
+
+ | RTLabs.St_cost (cost_lbl, lbl') ->
+ add_graph lbl (RTL.St_cost (cost_lbl, lbl')) def
+
+ | RTLabs.St_cst (destr, cst, lbl') ->
+ translate_cst cst (find_local_env destr lenv) lbl lbl' def
+
+ | RTLabs.St_op1 (op1, destr, srcr, lbl') ->
+ translate_op1 op1 (find_local_env destr lenv) (find_local_env srcr lenv)
+ lbl lbl' def
+
+ | RTLabs.St_op2 (op2, destr, srcr1, srcr2, lbl') ->
+ translate_op2 op2 (find_local_env destr lenv)
+ (find_local_env srcr1 lenv) (find_local_env srcr2 lenv) lbl lbl' def
+
+ | RTLabs.St_load (_, addr, destr, lbl') ->
+ translate_load (find_local_env addr lenv) (find_local_env destr lenv)
+ lbl lbl' def
+
+ | RTLabs.St_store (_, addr, srcr, lbl') ->
+ translate_store (find_local_env addr lenv) (find_local_env srcr lenv)
+ lbl lbl' def
+
+ | RTLabs.St_call_id (f, args, None, _, lbl') ->
+ add_graph lbl (RTL.St_call_id (f, rtl_args args lenv, [], lbl')) def
+
+ | RTLabs.St_call_id (f, args, Some retr, _, lbl') ->
+ add_graph lbl (RTL.St_call_id (f, rtl_args args lenv,
+ find_local_env retr lenv, lbl')) def
+
+ | RTLabs.St_call_ptr (f, args, None, _, lbl') ->
+ let (f1, f2) = find_and_addr f lenv in
+ add_graph lbl (RTL.St_call_ptr (f1, f2, rtl_args args lenv, [], lbl')) def
+
+ | RTLabs.St_call_ptr (f, args, Some retr, _, lbl') ->
+ let (f1, f2) = find_and_addr f lenv in
+ add_graph lbl
+ (RTL.St_call_ptr
+ (f1, f2, rtl_args args lenv, find_local_env retr lenv, lbl')) def
+
+ | RTLabs.St_tailcall_id (f, args, _) ->
+ add_graph lbl (RTL.St_tailcall_id (f, rtl_args args lenv)) def
+
+ | RTLabs.St_tailcall_ptr (f, args, _) ->
+ let (f1, f2) = find_and_addr f lenv in
+ add_graph lbl (RTL.St_tailcall_ptr (f1, f2, rtl_args args lenv)) def
+
+ | RTLabs.St_cond (r, lbl_true, lbl_false) ->
+ translate_cond (find_local_env r lenv) lbl lbl_true lbl_false def
+
+ | RTLabs.St_jumptable _ ->
+ error "Jump tables not supported yet."
+
+ | RTLabs.St_return None ->
+ add_graph lbl (RTL.St_return []) def
+
+ | RTLabs.St_return (Some r) ->
+ add_graph lbl (RTL.St_return (find_local_env r lenv)) def
+
+
+let translate_internal def =
+ let runiverse = def.RTLabs.f_runiverse in
+ let lenv =
+ initialize_local_env runiverse
+ (def.RTLabs.f_params @ def.RTLabs.f_locals) def.RTLabs.f_result in
+ let set_of_list l = List.fold_right Register.Set.add l Register.Set.empty in
+ let params = map_list_local_env lenv (List.map fst def.RTLabs.f_params) in
+ let locals = map_list_local_env lenv (List.map fst def.RTLabs.f_locals) in
+ let locals = set_of_list locals in
+ let result = match def.RTLabs.f_result with
+ | None -> []
+ | Some (r, _) -> find_local_env r lenv in
+ let res =
+ { RTL.f_luniverse = def.RTLabs.f_luniverse ;
+ RTL.f_runiverse = runiverse ;
+ RTL.f_result = result ;
+ RTL.f_params = params ;
+ RTL.f_locals = locals ;
+ RTL.f_stacksize = concrete_size def.RTLabs.f_stacksize ;
+ RTL.f_graph = Label.Map.empty ;
+ RTL.f_entry = def.RTLabs.f_entry ;
+ RTL.f_exit = def.RTLabs.f_exit } in
+ Label.Map.fold (translate_stmt lenv) def.RTLabs.f_graph res
+
+
+let translate_fun_def = function
+ | RTLabs.F_int def -> RTL.F_int (translate_internal def)
+ | RTLabs.F_ext def -> RTL.F_ext def
+
+
+(* Add global initializations *)
+
+let sum_offsets =
+ let f res off = res + (concrete_offset off) in
+ List.fold_left f 0
+
+let assign_data addr1 addr2 addr1' addr2' off_r data_r tmpr def (offset, data) =
+ if offset < 256 then
+ let def =
+ generates_graph
+ [RTL.St_store (addr1', addr2', data_r, Label.dummy)] def in
+ let start_lbl = fresh_label def in
+ let dest_lbl = def.RTL.f_entry in
+ let def =
+ translate_op_ tmpr I8051.Addc
+ [addr1' ; addr2'] [addr1 ; addr2] [off_r] start_lbl dest_lbl def in
+ let def = change_entry def start_lbl in
+ generates_graph
+ [RTL.St_int (off_r, offset, Label.dummy) ;
+ RTL.St_int (data_r, data, Label.dummy)] def
+ else error ("offset too big to fit in a register when initializing globals.")
+
+let assign_datas
+ addr1 addr2 addr1' addr2' off_r data_r tmpr x def (offsets, data) =
+ let base_offset = sum_offsets offsets in
+ let (data, quantity) = match data with
+ | AST.Data_int8 i -> (i, 1)
+ | AST.Data_int16 i -> (i, 2)
+ | AST.Data_int32 i -> (i, 4)
+ | AST.Data_float32 f | AST.Data_float64 f -> error_float () in
+ let data = IntValue.Int32.of_int data in
+ let datas = IntValue.Int32.break data quantity in
+ let datas = List.map IntValue.Int8.to_int datas in
+ let added_offs = MiscPottier.make 0 (List.length datas) in
+ let offs = MiscPottier.mapi (fun i _ -> base_offset + i) added_offs in
+ assert (List.length offs = List.length datas) ;
+ let offs_datas = List.combine offs datas in
+ let def =
+ List.fold_left (assign_data addr1 addr2 addr1' addr2' off_r data_r tmpr)
+ def offs_datas in
+ generates_graph [RTL.St_addr (addr1, addr2, x, Label.dummy)] def
+
+let add_global_initializations_def globals def =
+ let (def, addr1, addr2, addr1', addr2', off_r, data_r, tmpr) =
+ match fresh_regs def 7 with
+ | (def, [addr1 ; addr2 ; addr1' ; addr2' ; off_r ; data_r ; tmpr]) ->
+ (def, addr1, addr2, addr1', addr2', off_r, data_r, tmpr)
+ | _ ->
+ (* should be impossible: [fresh_regs _ 7] returns 7 regs *)
+ assert false in
+ let f def (x, size, datas_opt) = match datas_opt with
+ | None -> def
+ | Some datas ->
+ let offsets = Memory.all_offsets size in
+ if List.length offsets <> List.length datas then
+ error "bad global initialization style."
+ else
+ let offs_datas = List.combine offsets datas in
+ List.fold_left
+ (assign_datas addr1 addr2 addr1' addr2' off_r data_r tmpr x)
+ def offs_datas in
+ List.fold_left f def globals
+
+let add_global_initializations_funct globals = function
+ | RTL.F_int def ->
+ let def = add_global_initializations_def globals def in
+ RTL.F_int def
+ | def -> def
+
+(* [add_global_initializations p] moves the initializations of the globals of
+ [p] to the beginning of the main function, if any. *)
+
+let add_global_initializations globals main functs = match main with
+ | None -> functs
+ | Some main ->
+ let main_def = List.assoc main functs in
+ let main_def = add_global_initializations_funct globals main_def in
+ MiscPottier.update_list_assoc main main_def functs
+
+
+let translate p =
+ let f_global (id, size, _) = (id, concrete_size size) in
+ let f_funct (id, fun_def) = (id, translate_fun_def fun_def) in
+ let functs = List.map f_funct p.RTLabs.functs in
+ let functs = add_global_initializations p.RTLabs.vars p.RTLabs.main functs in
+ { RTL.vars = List.map f_global p.RTLabs.vars ;
+ RTL.functs = functs ;
+ RTL.main = p.RTLabs.main }
--- /dev/null
+
+(** This module provides a translation of [RTLabs] programs to [RTL]
+ programs. *)
+
+(** Most of the work consists in the instruction selection. We target the 8051
+ processor, which has addresses coded on two machine words. *)
+
+val translate : RTLabs.program -> RTL.program
--- /dev/null
+open Options
+open Misc.Timed
+
+(** Parse the command line. *)
+let input_files =
+ if not (Options.is_web_mode ()) then
+ OptionsParsing.results ()
+ else
+ []
+
+(** For each input file of the source language:
+
+ 1. Parse.
+
+ 2. Add runtime functions.
+
+ 3. Labelize.
+
+ 4. Compile to the target language.
+ (And keep track of annotations if required).
+
+ 5. Annotate the input program with collected costs.
+
+ 6. Save the annotated input program.
+
+ Optionnally, we can interpret the intermediate programs
+ if {!Options.interpretation_requested}.
+*)
+let process ?(step=fun step over -> ()) source =
+ (** Set source and target languages. *)
+ let src_language = Options.get_source_language () in
+ let tgt_language = Options.get_target_language () in
+
+ let next_step =
+ let nb_step = 10 in
+ let c = ref 0 in
+ fun () -> incr c; step !c nb_step
+ in
+
+ (** These variables are related to the lustre mode of the compiler. *)
+ let is_lustre_file = Options.is_lustre_file () in
+ let remove_lustre_externals = Options.is_remove_lustre_externals () in
+
+ (** Parse. *)
+ let input_ast =
+ profile "Parsing"
+ (Languages.parse ~is_lustre_file ~remove_lustre_externals src_language)
+ source
+ in
+
+ next_step ();
+
+ (** Embed the runtime functions in the abstract syntax tree. *)
+ let input_ast = Languages.add_runtime input_ast in
+
+ (** Labelling pass. *)
+ let input_ast =
+ profile "Labelling"
+ Languages.labelize input_ast
+ in
+
+ next_step ();
+
+ (** Compilation. *)
+ let target_asts =
+ (** If debugging is enabled, the compilation function returns all
+ the intermediate programs. *)
+ profile "Compilation"
+ (Languages.compile
+ (Options.is_debug_enabled ())
+ src_language tgt_language)
+ input_ast
+ in
+
+ next_step ();
+
+ let final_ast, intermediate_asts = Misc.ListExt.cut_last target_asts in
+
+ (** Instrument the source file with cost annotations. *)
+ let (annotated_input_ast, cost_id, cost_incr, extern_cost_variables) =
+ profile "Annotation"
+ (Languages.annotate input_ast)
+ final_ast
+ in
+
+ (** Instrument the source file with cost annotations. *)
+ let (annotated_input_ast, stack_id, stack_max_id,
+ stack_incr, extern_stack_variables) =
+ profile "Annotation Stack"
+ Languages.annotate_stack_size cost_incr annotated_input_ast
+ in
+
+ next_step ();
+
+ (** Combine the output asts. *)
+ let output = (target_asts, annotated_input_ast) in
+
+ (** Finally save these output if we are not in a web mode. *)
+ let _ =
+ if not (Options.is_web_mode ()) then
+ let filename = match source with `Filename f -> f | _ -> assert false in
+ let (exact_output, output_filename) = match Options.get_output_files () with
+ | None -> (false, filename)
+ | Some filename' -> (true, filename') in
+ let save ?(suffix="") ast =
+ Languages.save
+ (Options.is_asm_pretty ()) exact_output output_filename suffix ast
+ in
+ begin
+ save final_ast;
+ save ~suffix:"-instrumented" annotated_input_ast;
+ Languages.save_cost exact_output output_filename cost_id cost_incr
+ extern_cost_variables;
+ Languages.save_stack
+ exact_output output_filename
+ stack_id stack_max_id stack_incr extern_stack_variables;
+ if Options.is_debug_enabled () then
+ List.iter save intermediate_asts;
+ end;
+
+ (** Interpret all the intermediate ASTs if requested. *)
+ if Options.interpretations_requested () then
+ begin
+ Printf.printf "Interpret\n%!" ;
+ let asts = target_asts in
+ let debug = Options.is_debug_enabled () in
+ let label_traces = List.map (Languages.interpret debug) asts in
+ Misc.IOExt.eprintf "Checking execution traces...%!";
+ Checker.same_traces (List.combine asts label_traces);
+ Misc.IOExt.eprintf "OK.\n%!";
+ end;
+
+ (** Interpret the final AST if requested. *)
+ if Options.interpretation_requested () then
+ ignore (Languages.interpret (Options.is_debug_enabled ()) final_ast)
+ in
+ (** Return the output ASTs. *)
+ output
+
+let lustre_test (filename : string) =
+ let lustre_test = match Options.get_lustre_test () with
+ | None -> assert false (* do not use on this argument *)
+ | Some lustre_test -> lustre_test in
+ let lustre_test_cases = Options.get_lustre_test_cases () in
+ let lustre_test_cycles = Options.get_lustre_test_cycles () in
+ let lustre_test_min_int = Options.get_lustre_test_min_int () in
+ let lustre_test_max_int = Options.get_lustre_test_max_int () in
+ let src_language = Languages.Clight in
+ let tgt_language = Languages.Clight in
+ let input_ast = Languages.parse src_language (`Filename filename) in
+ let input_ast =
+ Languages.add_lustre_main lustre_test lustre_test_cases lustre_test_cycles
+ lustre_test_min_int lustre_test_max_int input_ast in
+ let (exact_output, output_filename) = match Options.get_output_files () with
+ | None -> (false, filename)
+ | Some filename' -> (true, filename')
+ in
+ let save ast =
+ Languages.save
+ (Options.is_asm_pretty ()) exact_output output_filename "" ast in
+ let target_asts =
+ Languages.compile false src_language tgt_language input_ast
+ in
+ let final_ast, _ = Misc.ListExt.cut_last target_asts in
+ save input_ast ;
+ save final_ast
+
+let _ =
+ Misc.Timed.set_profiling_flag (Options.is_debug_enabled () || Options.is_web_mode ());
+ if not (Options.is_web_mode ()) then
+ begin
+ set_now (fun () -> 0.); (* Unix.gettimeofday () *. 1000.); *)
+ if Options.is_dev_test_enabled () then
+ Dev_test.do_dev_test input_files
+ else
+ if Options.get_lustre_test () <> None then
+ List.iter lustre_test input_files
+ else
+ ignore (List.map process (List.map (fun f -> `Filename f) input_files))
+ end
--- /dev/null
+(** This module realizes the compiler as a command line program
+ if {!Options.web_mode} is disabled. Otherwise, the compiler can
+ be used as an API.
+
+ @author Yann Regis-Gianas
+*)
+
+val process : ?step:(int -> int -> unit) -> Languages.source -> Languages.ast list * Languages.ast
+
--- /dev/null
+(* let installation_path = "http://www.pps.jussieu.fr/~yrg/cerco" *)
+
+let installation_path =
+ "http://0.0.0.0:8000"
+
+let inputs = [
+(* For the moment:
+ Webify.Direct ("Scratch",
+ (fun () -> "/* Type your source code here in C. */"));
+*)
+ Webify.Url (installation_path ^ "/cerco_input.xml")
+]
+
+let processor step (title, contents) =
+ let to_output title a =
+ let lang = Languages.to_string (Languages.language_of_ast a) in
+ ("["
+ ^ title
+ ^ lang
+ ^ "]",
+ (Misc.Timed.profile (Printf.sprintf "Print %s" lang) Languages.print a))
+ in
+ let terminal title s = ("[" ^ title ^ "]", s) in
+ let (intermediate_asts, annotated_ast) =
+ Acc.process ~step (`Source (title, contents))
+ in
+ let intermediate_asts =
+ snd (Misc.ListExt.cut_last intermediate_asts)
+ in
+ let pasts =
+ to_output "Annotated " annotated_ast
+ :: List.map (to_output "") intermediate_asts
+ in
+ let (out, err) = Misc.IOExt.get_buffers () in
+ let terminals = [
+ terminal "Standard output" out;
+ terminal "Standard error" err
+ ]
+ in
+ pasts @ terminals
+
+let now () : float =
+ let date = jsnew Js.date_now () in
+ Js.to_float (date##getTime ())
+
+let _ =
+ Options.set_web_mode ();
+ Misc.Timed.set_profiling_flag true;
+ Misc.Timed.set_now now;
+ Misc.IOExt.set_buffered_mode ();
+ Webify.from_function inputs processor
+
+
--- /dev/null
+
+
+let error_prefix = "Clight Stack Size Annotator"
+let error = Error.global_error error_prefix
+
+
+let stack_id_prefix = "__stack_size"
+let stack_max_id_prefix = "__stack_size_max"
+let stack_incr_prefix = "__stack_size_incr"
+
+
+let fun_stack_size = Hashtbl.create 10
+
+let add_stack_size s i =
+ Hashtbl.add fun_stack_size s i
+
+let get_stack_size s =
+ try
+ Hashtbl.find fun_stack_size s
+ with Not_found ->
+ Printf.eprintf
+ "get_stack_size: the function %s has not a stack size associated\n%!"
+ s;
+ exit 1
+
+(* Instrumentation *)
+
+let int_typ = Clight.Tint (Clight.I32, AST.Signed)
+
+let const_int i = Clight.Expr (Clight.Econst_int i, int_typ)
+
+(* Instrument a statement. *)
+
+let rec instrument_body stack_incr stack_size stmt = match stmt with
+ | Clight.Sskip | Clight.Sbreak | Clight.Scontinue
+ | Clight.Sgoto _ ->
+ stmt
+ | Clight.Sassign (e1, e2) -> Clight.Sassign (e1, e2)
+ | Clight.Scall (eopt, f, args) -> stmt
+ | Clight.Ssequence (s1, s2) ->
+ Clight.Ssequence (instrument_body stack_incr stack_size s1,
+ instrument_body stack_incr stack_size s2)
+ | Clight.Sifthenelse (e, s1, s2) ->
+ let s1' = instrument_body stack_incr stack_size s1 in
+ let s2' = instrument_body stack_incr stack_size s2 in
+ Clight.Sifthenelse (e, s1', s2')
+ | Clight.Swhile (e, s) ->
+ let s' = instrument_body stack_incr stack_size s in
+ Clight.Swhile (e, s')
+ | Clight.Sdowhile (e, s) ->
+ let s' = instrument_body stack_incr stack_size s in
+ Clight.Sdowhile (e, s')
+ | Clight.Sfor (s1, e, s2, s3) ->
+ let s1' = instrument_body stack_incr stack_size s1 in
+ let s2' = instrument_body stack_incr stack_size s2 in
+ let s3' = instrument_body stack_incr stack_size s3 in
+ Clight.Sfor (s1', e, s2', s3')
+ | Clight.Sreturn _ ->
+ let fun_typ = Clight.Tfunction ([int_typ], Clight.Tvoid) in
+ let f = Clight.Expr (Clight.Evar stack_incr, fun_typ) in
+ let ss = Clight.Expr (Clight.Econst_int stack_size, int_typ) in
+ let args = [Clight.Expr (Clight.Eunop(Clight.Oneg,ss),int_typ)] in
+ Clight.Ssequence (Clight.Scall (None, f, args), stmt)
+ | Clight.Sswitch (e, ls) ->
+ let ls' = instrument_ls stack_incr stack_size ls in
+ Clight.Sswitch (e, ls')
+ | Clight.Slabel (lbl, s) ->
+ let s' = instrument_body stack_incr stack_size s in
+ Clight.Slabel (lbl, s')
+ | Clight.Scost (lbl, s) ->
+ (* Keep the cost label in the code. *)
+ let s' = instrument_body stack_incr stack_size s in
+ Clight.Scost (lbl, s')
+ (*
+ instrument_body stack_incr s
+ *)
+and instrument_ls stack_incr stack_size = function
+ | Clight.LSdefault s ->
+ let s' = instrument_body stack_incr stack_size s in
+ Clight.LSdefault s'
+ | Clight.LScase (i, s, ls) ->
+ let s' = instrument_body stack_incr stack_size s in
+ let ls' = instrument_ls stack_incr stack_size ls in
+ Clight.LScase (i, s', ls')
+
+(* Instrument a function. *)
+
+let instrument_funct stack_incr (id, def) =
+ let def = match def with
+ | Clight.Internal def ->
+ let stack_size = get_stack_size id in
+ let body = instrument_body stack_incr
+ stack_size def.Clight.fn_body in
+ let body =
+ let fun_typ = Clight.Tfunction ([int_typ], Clight.Tvoid) in
+ let f = Clight.Expr (Clight.Evar stack_incr, fun_typ) in
+ let args = [Clight.Expr (Clight.Econst_int stack_size, int_typ)] in
+ Clight.Ssequence (Clight.Scall (None, f, args), body) in
+ Clight.Internal { def with Clight.fn_body = body }
+ | Clight.External _ -> def
+ in
+ (id, def)
+
+(* This is the declaration of the cost variable. *)
+
+let add_stack_decl stack_id =
+ let init = [Clight.Init_int32 0] in
+ ((stack_id, init), int_typ)
+
+(* This is the definition of the increment cost function. *)
+
+let stack_incr_def stack_id_max stack_id stack_incr =
+ let int_var x = Clight.Expr (Clight.Evar x, int_typ) in
+ let param = "incr" in
+ let cost = int_var stack_id in
+ let cost_max = int_var stack_id_max in
+ let increment = int_var param in
+ let stack_increment =
+ Clight.Expr (Clight.Ebinop (Clight.Oadd, cost, increment), int_typ) in
+ let stmt1 = Clight.Sassign (cost, stack_increment) in
+ let stack_max =
+ Clight.Expr (
+ Clight.Econdition(
+ Clight.Expr (Clight.Ebinop (Clight.Olt, cost_max, cost), int_typ),
+ cost,cost_max), int_typ) in
+ let stmt2 = Clight.Sassign (cost_max, stack_max) in
+ let cfun =
+ { Clight.fn_return = Clight.Tvoid ;
+ Clight.fn_params = [(param, int_typ)] ;
+ Clight.fn_vars = [] ;
+ Clight.fn_body = Clight.Ssequence(stmt1,stmt2) } in
+ (stack_incr, Clight.Internal cfun)
+
+(* Create a fresh uninitialized cost variable for each external function. This
+ will be used by the Cost plug-in of the Frama-C platform. *)
+
+let extern_stack_variables make_unique functs =
+ let prefix = "_stack_of_" in
+ let f (decls, map) (_, def) = match def with
+ | Clight.Internal _ -> (decls, map)
+ | Clight.External (id, _, _) ->
+ let new_var = make_unique (prefix ^ id) in
+ (decls @ [add_stack_decl new_var], StringTools.Map.add id new_var map) in
+ List.fold_left f ([], StringTools.Map.empty) functs
+
+let save_tmp tmp_file s =
+ let cout = open_out tmp_file in
+ output_string cout s ;
+ flush cout ;
+ close_out cout
+
+(** [instrument prog stack_map] instruments the program [prog]. First a fresh
+ global variable --- the so-called cost variable --- is added to the program.
+ Then, each cost label in the program is replaced by an increment of the cost
+ variable, following the mapping [stack_map]. The function also returns the
+ name of the cost variable and the name of the cost increment function. *)
+
+let instrument cost_incr p =
+
+ (* Create a fresh 'cost' variable. *)
+ let names = ClightAnnotator.names p in
+ let make_unique = StringTools.make_unique names in
+ let stack_id = make_unique stack_id_prefix in
+ let stack_max_id = make_unique stack_max_id_prefix in
+ let stack_decl = add_stack_decl stack_id in
+ let stack_max_decl = add_stack_decl stack_max_id in
+
+ (* Create a fresh uninitialized global variable for each extern function. *)
+ let (extern_stack_decls, extern_stack_variables) =
+ extern_stack_variables make_unique p.Clight.prog_funct in
+
+ (* Define an increment function for the cost variable. *)
+ let stack_incr =
+ StringTools.Gen.fresh_prefix (StringTools.Set.add stack_id names)
+ stack_incr_prefix in
+ let stack_incr_def = stack_incr_def stack_max_id stack_id stack_incr in
+
+ (* Instrument each function *)
+ let prog_funct =
+ List.map (fun ((id,_) as a) ->
+ if id = cost_incr then a else instrument_funct stack_incr a)
+ p.Clight.prog_funct in
+
+ (* Glue all this together. *)
+ let prog_vars = stack_decl :: stack_max_decl
+ :: extern_stack_decls @ p.Clight.prog_vars in
+ let prog_funct = stack_incr_def :: prog_funct in
+ let p' =
+ { p with Clight.prog_vars = prog_vars ; Clight.prog_funct = prog_funct } in
+
+ (* Save the resulted program. Then re-parse it.
+ Indeed, the instrumentation may add side-effects in expressions, which is
+ not Clight compliant. Re-parsing the result with CIL will remove these
+ side-effects in expressions to obtain a Clight program. *)
+ let output = ClightPrinter.print_program p' in
+ let res = ClightParser.process (`Source ("annotated", output)) in
+ (res, stack_id, stack_max_id, stack_incr, extern_stack_variables)
--- /dev/null
+let same_traces (traces : ((Languages.ast * AST.trace) list)) =
+ let compare_trace trace1 trace2 =
+ let occs_trace1 = Misc.ListExt.multi_set_of_list trace1
+ and occs_trace2 = Misc.ListExt.multi_set_of_list trace2 in
+ Misc.ListExt.assoc_diff occs_trace1 occs_trace2
+ in
+ let check_trace (_, (_, trace1)) (_, (_, trace2)) =
+ compare_trace trace1 trace2 = []
+ in
+ let print_trace lang1 lang2 ds =
+ let string_of_value = function
+ | None -> "is not present"
+ | Some v -> Printf.sprintf "appears %d times" v
+ in
+ let sentence (k, (v1, v2)) =
+ Printf.sprintf " Label %s %s in language `%s' \
+ whereas it %s in language `%s'."
+ k (string_of_value v1) lang1 (string_of_value v2) lang2
+ in
+ String.concat "\n" (List.map sentence ds)
+ in
+ match Misc.ListExt.transitive_forall2 check_trace traces with
+ | None -> ()
+ | Some ((ast1, (res1, trace1)), (ast2, (res2, trace2))) ->
+ let lang1 = Languages.to_string (Languages.language_of_ast ast1)
+ and lang2 = Languages.to_string (Languages.language_of_ast ast2) in
+ let diff = compare_trace trace1 trace2 in
+ Error.global_error "during trace comparison"
+ (Printf.sprintf
+ "The traces of two intermediate programs differ:\n%s"
+ (print_trace lang1 lang2 diff))
--- /dev/null
+(** This module offers functions for dynamic verification of invariants. *)
+
+(** [same_traces ts] checks that the collected execution traces are
+ identical (modulo permutation). *)
+val same_traces : (Languages.ast * AST.trace) list -> unit
--- /dev/null
+(** This module defines the abstract syntax tree of [Clight].
+
+ This is a (quasi-)direct translation of the Coq definition that
+ can be found in the CompCert development. *)
+
+open AST
+
+(** ** Types *)
+
+type intsize = I8 | I16 | I32
+
+type floatsize = F32 | F64
+
+(** The syntax of type expressions. Some points to note:
+ - Array types [Tarray n] carry the size [n] of the array.
+ Arrays with unknown sizes are represented by pointer types.
+ - Function types [Tfunction targs tres] specify the number and types
+ of the function arguments (list [targs]), and the type of the
+ function result ([tres]). Variadic functions and old-style unprototyped
+ functions are not supported.
+ - In C, struct and union types are named and compared by name.
+ This enables the definition of recursive struct types such as
+ {[
+ struct s1 { int n; struct * s1 next; };
+ ]}
+ Note that recursion within types must go through a pointer type.
+ For instance, the following is not allowed in C.
+ {[
+ struct s2 { int n; struct s2 next; };
+ ]}
+ In Clight, struct and union types [Tstruct id fields] and
+ [Tunion id fields] are compared by structure: the [fields]
+ argument gives the names and types of the members. The AST_common.identifier
+ [id] is a local name which can be used in conjuction with the
+ [Tcomp_ptr] constructor to express recursive types. [Tcomp_ptr id]
+ stands for a pointer type to the nearest enclosing [Tstruct]
+ or [Tunion] type named [id]. For instance. the structure [s1]
+ defined above in C is expressed by
+ {[
+ Tstruct "s1" (Fcons "n" (Tint I32 Signed)
+ (Fcons "next" (Tcomp_ptr "s1")
+ Fnil))
+ ]}
+ Note that the incorrect structure [s2] above cannot be expressed at
+ all, since [Tcomp_ptr] lets us refer to a pointer to an enclosing
+ structure or union, but not to the structure or union directly.
+ *)
+
+type ctype =
+ | Tvoid (**r the [void] type *)
+ | Tint of intsize*signedness (**r integer types *)
+ | Tfloat of floatsize (**r floating-point types *)
+ | Tpointer of ctype (**r pointer types ([*ty]) *)
+ | Tarray of ctype*int (**r array types ([ty[len]]) *)
+ | Tfunction of ctype list*ctype (**r function types *)
+ | Tstruct of ident*(ident*ctype) list
+ (**r struct types *)
+ | Tunion of ident*(ident*ctype) list
+ (**r union types *)
+ | Tcomp_ptr of ident (**r pointer to named struct or union *)
+
+(** ** Expressions *)
+
+(** Arithmetic and logical operators. *)
+
+type unary_operation =
+ | Onotbool (**r boolean negation ([!] in C) *)
+ | Onotint (**r integer complement ([~] in C) *)
+ | Oneg (**r opposite (unary [-]) *)
+
+type binary_operation =
+ | Oadd (**r addition (binary [+]) *)
+ | Osub (**r subtraction (binary [-]) *)
+ | Omul (**r multiplication (binary [*]) *)
+ | Odiv (**r division ([/]) *)
+ | Omod (**r remainder ([%]) *)
+ | Oand (**r bitwise and ([&]) *)
+ | Oor (**r bitwise or ([|]) *)
+ | Oxor (**r bitwise xor ([^]) *)
+ | Oshl (**r left shift ([<<]) *)
+ | Oshr (**r right shift ([>>]) *)
+ | Oeq (**r comparison ([==]) *)
+ | One (**r comparison ([!=]) *)
+ | Olt (**r comparison ([<]) *)
+ | Ogt (**r comparison ([>]) *)
+ | Ole (**r comparison ([<=]) *)
+ | Oge (**r comparison ([>=]) *)
+
+(** Clight expressions are a large subset of those of C.
+ The main omissions are string literals and assignment operators
+ ([=], [+=], [++], etc). In Clight, assignment is a statement,
+ not an expression.
+
+ All expressions are annotated with their types. An expression
+ (type [expr]) is therefore a pair of a type and an expression
+ description (type [expr_descr]).
+ *)
+
+type expr =
+ | Expr of expr_descr*ctype
+
+ and expr_descr =
+ | Econst_int of int (**r integer literal *)
+ | Econst_float of float (**r float literal *)
+ | Evar of ident (**r variable *)
+ | Ederef of expr (**r pointer dereference (unary [*]) *)
+ | Eaddrof of expr (**r address-of operator ([&]) *)
+ | Eunop of unary_operation*expr (**r unary operation *)
+ | Ebinop of binary_operation*expr*expr (**r binary operation *)
+ | Ecast of ctype*expr (**r type cast ([(ty) e]) *)
+ | Econdition of expr*expr*expr (**r conditional ([e1 ? e2 : e3]) *)
+ | Eandbool of expr*expr (**r sequential and ([&&]) *)
+ | Eorbool of expr*expr (**r sequential or ([||]) *)
+ | Esizeof of ctype (**r size of a type *)
+ | Efield of expr*ident (**r access to a member of a struct or union *)
+
+ (** The following constructors are used by the annotation process only. *)
+
+ | Ecost of CostLabel.t*expr (**r cost label. *)
+ | Ecall of ident * expr * expr
+
+
+(** ** Statements *)
+
+(** Clight statements include all C statements.
+ Only structured forms of [switch] are supported; moreover,
+ the [default] case must occur last. Blocks and block-scoped declarations
+ are not supported. *)
+
+type label = Label.t
+
+type statement =
+ | Sskip (**r do nothing *)
+ | Sassign of expr*expr (**r assignment [lvalue = rvalue] *)
+ | Scall of expr option*expr*expr list (**r function call *)
+ | Ssequence of statement*statement (**r sequence *)
+ | Sifthenelse of expr*statement*statement (**r conditional *)
+ | Swhile of expr*statement (**r [while] loop *)
+ | Sdowhile of expr*statement (**r [do] loop *)
+ | Sfor of statement*expr*statement*statement (**r [for] loop *)
+ | Sbreak (**r [break] statement *)
+ | Scontinue (**r [continue] statement *)
+ | Sreturn of expr option (**r [return] statement *)
+ | Sswitch of expr*labeled_statements (**r [switch] statement *)
+ | Slabel of label*statement
+ | Sgoto of label
+ | Scost of CostLabel.t * statement
+
+and labeled_statements = (**r cases of a [switch] *)
+ | LSdefault of statement
+ | LScase of int*statement*labeled_statements
+
+(** ** Functions *)
+
+(** A function definition is composed of its return type ([fn_return]),
+ the names and types of its parameters ([fn_params]), the names
+ and types of its local variables ([fn_vars]), and the body of the
+ function (a statement, [fn_body]). *)
+
+type cfunction = {
+ fn_return : ctype ;
+ fn_params : (ident*ctype) list ;
+ fn_vars : (ident * ctype) list ;
+ fn_body : statement
+}
+
+(** Functions can either be defined ([Internal]) or declared as
+ external functions ([External]). *)
+
+type fundef =
+ | Internal of cfunction
+ | External of ident*ctype list*ctype
+
+(** ** Programs *)
+
+(** A program is a collection of named functions, plus a collection
+ of named global variables, carrying their types and optional initialization
+ data. See module [AST] for more details. *)
+
+type init_data =
+ | Init_int8 of int
+ | Init_int16 of int
+ | Init_int32 of int
+ | Init_float32 of float
+ | Init_float64 of float
+ | Init_space of int
+ | Init_addrof of ident*int (**r address of symbol + offset *)
+
+type program = {
+ prog_funct: (ident * fundef) list ;
+ prog_main: ident option;
+ prog_vars: ((ident * init_data list) * ctype) list
+}
--- /dev/null
+
+(** This module performs a transformation of a [Clight] program with potentially
+ 32 and 16 bits integers to an equivalent [Clight] program that only uses 8
+ bits integers.
+
+ The main changes are: defining two types that represent 32 and 16 bits
+ integers with a structure of 8 bits integers, making the substitution,
+ replacing primitive integer operations on 32 and 16 bits integers with new
+ functions emulating them on the new types, and finally defining a global
+ variable for each 32 and 16 bits integer constant, which is then replaced by
+ its associated variable. *)
+
+
+let error_prefix = "Clight32 to Clight8"
+let error s = Error.global_error error_prefix s
+
+
+let cint32s = Clight.Tint (Clight.I32, AST.Signed)
+let cint32u = Clight.Tint (Clight.I32, AST.Unsigned)
+let cint8s = Clight.Tint (Clight.I8, AST.Signed)
+let cint8u = Clight.Tint (Clight.I8, AST.Unsigned)
+
+
+(* Change the main so that it returns a 8 bits integer. Indeed, 32 bits integers
+ will be replaced by structures, and returning a structure from the main is
+ not Clight compliant. *)
+
+let main_ret_type = function
+ | Clight.Tint (_, AST.Signed) -> cint8s
+ | Clight.Tint (_, AST.Unsigned) -> cint8u
+ | _ -> error "The main should return an integer which is not the case."
+
+let f_ctype ctype _ = ctype
+let f_expr e _ _ = e
+let f_expr_descr ed _ _ = ed
+
+let f_stmt ret_type stmt sub_exprs_res sub_stmts_res =
+ match stmt, sub_exprs_res with
+ | Clight.Sreturn (Some _), e :: _ ->
+ let e' = Clight.Expr (Clight.Ecast (ret_type, e), ret_type) in
+ Clight.Sreturn (Some e')
+ | _ -> ClightFold.statement_fill_subs stmt sub_exprs_res sub_stmts_res
+
+let body_returns ret_type =
+ ClightFold.statement f_ctype f_expr f_expr_descr (f_stmt ret_type)
+
+let fundef_returns_char = function
+ | Clight.Internal cfun ->
+ let ret_type = main_ret_type cfun.Clight.fn_return in
+ let body = body_returns ret_type cfun.Clight.fn_body in
+ Clight.Internal {cfun with Clight.fn_return = ret_type ;
+ Clight.fn_body = body }
+ | Clight.External _ as fundef -> fundef
+
+let main_returns_char p = match p.Clight.prog_main with
+ | None -> p
+ | Some main ->
+ let main_def = List.assoc main p.Clight.prog_funct in
+ let main_def = fundef_returns_char main_def in
+ let prog_funct =
+ MiscPottier.update_list_assoc main main_def p.Clight.prog_funct in
+ { p with Clight.prog_funct = prog_funct }
+
+
+(* Replacement *)
+
+let seq =
+ List.fold_left
+ (fun stmt1 stmt2 -> Clight.Ssequence (stmt1, stmt2))
+ Clight.Sskip
+
+let is_complex = function
+ | Clight.Tstruct _ | Clight.Tunion _ -> true
+ | _ -> false
+
+let is_subst_complex type_substitutions res_type =
+ if List.mem_assoc res_type type_substitutions then
+ is_complex (List.assoc res_type type_substitutions)
+ else false
+
+let addrof_with_type e ctype =
+ let ctype = Clight.Tpointer ctype in
+ (Clight.Expr (Clight.Eaddrof e, ctype), ctype)
+
+let address_if_subst_complex type_substitutions =
+ let f l (e, ctype) =
+ let arg_and_type =
+ if is_subst_complex type_substitutions ctype then addrof_with_type e ctype
+ else (e, ctype) in
+ l @ [arg_and_type] in
+ List.fold_left f []
+
+let make_call_struct tmpe res_type f_var args args_types =
+ let (res_e, res_type) = addrof_with_type tmpe res_type in
+ let f_type = Clight.Tfunction (res_type :: args_types, Clight.Tvoid) in
+ let f = Clight.Expr (f_var, f_type) in
+ Clight.Scall (None, f, res_e :: args)
+
+let make_call_wo_struct tmpe res_type f_var args args_types =
+ let f_type = Clight.Tfunction (args_types, res_type) in
+ let f = Clight.Expr (f_var, f_type) in
+ Clight.Scall (Some tmpe, f, args)
+
+let make_call type_substitutions tmp f_id args_with_types res_type =
+ let tmpe = Clight.Expr (Clight.Evar tmp, res_type) in
+ let args_with_types =
+ address_if_subst_complex type_substitutions args_with_types in
+ let (args, args_types) = List.split args_with_types in
+ let f_var = Clight.Evar f_id in
+ let call =
+ if is_subst_complex type_substitutions res_type then make_call_struct
+ else make_call_wo_struct in
+ (tmpe, call tmpe res_type f_var args args_types)
+
+let call fresh replaced type_substitutions replacement_assoc
+ args added_stmt added_tmps ret_type =
+ let tmp = fresh () in
+ let replacement_fun_name = List.assoc replaced replacement_assoc in
+ let (tmpe, call) =
+ make_call type_substitutions tmp replacement_fun_name args ret_type in
+ let stmt = seq (added_stmt @ [call]) in
+ (tmpe, stmt, added_tmps @ [(tmp, ret_type)])
+
+let replace_ident replacement_assoc x t =
+ let new_name = match t with
+ | Clight.Tfunction _
+ when List.mem_assoc (Runtime.Fun x) replacement_assoc ->
+ let replacement_fun_name = List.assoc (Runtime.Fun x) replacement_assoc in
+ replacement_fun_name
+ | _ -> x in
+ (Clight.Expr (Clight.Evar new_name, t), Clight.Sskip, [])
+
+let replace_expression fresh type_substitutions replacement_assoc e =
+
+ let rec aux (Clight.Expr (ed, t) as e) =
+ let expr ed = Clight.Expr (ed, t) in
+ match ed with
+
+ | Clight.Econst_int _ | Clight.Econst_float _ | Clight.Esizeof _ ->
+ (e, Clight.Sskip, [])
+
+ | Clight.Evar x -> replace_ident replacement_assoc x t
+
+ | Clight.Ederef e' ->
+ let (e', stmt, tmps) = aux e' in
+ (expr (Clight.Ederef e'), stmt, tmps)
+
+ | Clight.Eaddrof e' ->
+ let (e', stmt, tmps) = aux e' in
+ (expr (Clight.Eaddrof e'), stmt, tmps)
+
+ | Clight.Eunop (unop, (Clight.Expr (ed', t') as e'))
+ when List.mem_assoc (Runtime.Unary (unop, t')) replacement_assoc ->
+ let (e', stmt, tmps) = aux e' in
+ call fresh (Runtime.Unary (unop, t'))
+ type_substitutions replacement_assoc [(e', t')]
+ [stmt] tmps t
+
+ | Clight.Eunop (unop, e') ->
+ let (e', stmt, tmps) = aux e' in
+ (expr (Clight.Eunop (unop, e')), stmt, tmps)
+
+ | Clight.Ebinop (binop,
+ (Clight.Expr (ed1, t1) as e1),
+ (Clight.Expr (ed2, t2) as e2))
+ when
+ List.mem_assoc (Runtime.Binary (binop, t1, t2)) replacement_assoc ->
+ let (e1, stmt1, tmps1) = aux e1 in
+ let (e2, stmt2, tmps2) = aux e2 in
+ call fresh (Runtime.Binary (binop, t1, t2))
+ type_substitutions replacement_assoc
+ [(e1, t1) ; (e2, t2)] [stmt1 ; stmt2] (tmps1 @ tmps2) t
+
+ | Clight.Ebinop (binop, e1, e2) ->
+ let (e1, stmt1, tmps1) = aux e1 in
+ let (e2, stmt2, tmps2) = aux e2 in
+ let stmt = seq [stmt1 ; stmt2] in
+ (expr (Clight.Ebinop (binop, e1, e2)), stmt, tmps1 @ tmps2)
+
+ | Clight.Ecast (t, (Clight.Expr (_, t') as e'))
+ when List.mem_assoc (Runtime.Cast (t, t')) replacement_assoc ->
+ let (e', stmt, tmps) = aux e' in
+ call fresh (Runtime.Cast (t, t'))
+ type_substitutions replacement_assoc [(e', t')] [stmt]
+ tmps t
+
+ | Clight.Ecast (t', e') ->
+ let (e', stmt, tmps) = aux e' in
+ (expr (Clight.Ecast (t', e')), stmt, tmps)
+
+ | Clight.Econdition (e1, e2, e3) ->
+ let (e1, stmt1, tmps1) = aux e1 in
+ let (e2, stmt2, tmps2) = aux e2 in
+ let (e3, stmt3, tmps3) = aux e3 in
+ let stmt = seq [stmt1 ; stmt2 ; stmt3] in
+ (expr (Clight.Econdition (e1, e2, e3)), stmt, tmps1 @ tmps2 @ tmps3)
+
+ | Clight.Eandbool (e1, e2) ->
+ let (e1, stmt1, tmps1) = aux e1 in
+ let (e2, stmt2, tmps2) = aux e2 in
+ let stmt = seq [stmt1 ; stmt2] in
+ (expr (Clight.Eandbool (e1, e2)), stmt, tmps1 @ tmps2)
+
+ | Clight.Eorbool (e1, e2) ->
+ let (e1, stmt1, tmps1) = aux e1 in
+ let (e2, stmt2, tmps2) = aux e2 in
+ let stmt = seq [stmt1 ; stmt2] in
+ (expr (Clight.Eorbool (e1, e2)), stmt, tmps1 @ tmps2)
+
+ | Clight.Efield (e', field) ->
+ let (e', stmt, tmps) = aux e' in
+ (expr (Clight.Efield (e', field)), stmt, tmps)
+
+ | Clight.Ecost (lbl, e') ->
+ let (e', stmt, tmps) = aux e' in
+ (expr (Clight.Ecost (lbl, e')), stmt, tmps)
+
+ | Clight.Ecall (id, e1, e2) ->
+ let (e1, stmt1, tmps1) = aux e1 in
+ let (e2, stmt2, tmps2) = aux e2 in
+ let stmt = seq [stmt1 ; stmt2] in
+ (expr (Clight.Ecall (id, e1, e2)), stmt, tmps1 @ tmps2)
+
+ in
+ aux e
+
+
+let replace_expression_list fresh type_substitutions replacement_assoc =
+ let f (l, stmt, tmps) e =
+ let (e', stmt', tmps') =
+ replace_expression fresh type_substitutions replacement_assoc e in
+ (l @ [e'], seq [stmt ; stmt'], tmps @ tmps') in
+ List.fold_left f ([], Clight.Sskip, [])
+
+
+let replace_statement fresh type_substitutions replacement_assoc =
+ let aux_exp =
+ replace_expression fresh type_substitutions replacement_assoc in
+ let aux_exp_list =
+ replace_expression_list fresh type_substitutions replacement_assoc in
+
+ let rec aux = function
+
+ | Clight.Sskip | Clight.Sbreak | Clight.Scontinue | Clight.Sgoto _
+ | Clight.Sreturn None
+ as stmt -> (stmt, [])
+
+ | Clight.Slabel (lbl, stmt) ->
+ let (stmt', tmps) = aux stmt in
+ (Clight.Slabel (lbl, stmt'), tmps)
+
+ | Clight.Scost (lbl, stmt) ->
+ let (stmt', tmps) = aux stmt in
+ (Clight.Scost (lbl, stmt'), tmps)
+
+ | Clight.Sassign (e1, e2) ->
+ let (e1', stmt1, tmps1) = aux_exp e1 in
+ let (e2', stmt2, tmps2) = aux_exp e2 in
+ let stmt = seq [stmt1 ; stmt2 ; Clight.Sassign (e1', e2')] in
+ (stmt, tmps1 @ tmps2)
+
+ | Clight.Scall (None, f, args) ->
+ let (f', stmt1, tmps1) = aux_exp f in
+ let (args', stmt2, tmps2) = aux_exp_list args in
+ let stmt = seq [stmt1 ; stmt2 ; Clight.Scall (None, f', args')] in
+ (stmt, tmps1 @ tmps2)
+
+ | Clight.Scall (Some e, f, args) ->
+ let (e', stmt1, tmps1) = aux_exp e in
+ let (f', stmt2, tmps2) = aux_exp f in
+ let (args', stmt3, tmps3) = aux_exp_list args in
+ let stmt = seq [stmt1 ; stmt2 ; stmt3 ;
+ Clight.Scall (Some e', f', args')] in
+ (stmt, tmps1 @ tmps2 @ tmps3)
+
+ | Clight.Sifthenelse (e, stmt1, stmt2) ->
+ let (e', stmte, tmpse) = aux_exp e in
+ let (stmt1', tmps1) = aux stmt1 in
+ let (stmt2', tmps2) = aux stmt2 in
+ let stmt = seq [stmte ; Clight.Sifthenelse (e', stmt1', stmt2')] in
+ (stmt, tmpse @ tmps1 @ tmps2)
+
+ | Clight.Swhile (e, stmt) ->
+ let (e', stmte, tmpse) = aux_exp e in
+ let (stmt', tmps) = aux stmt in
+ let stmt = seq [stmte ; Clight.Swhile (e', seq [stmt' ; stmte])] in
+ (stmt, tmpse @ tmps)
+
+ | Clight.Sdowhile (e, stmt) ->
+ let (e', stmte, tmpse) = aux_exp e in
+ let (stmt', tmps) = aux stmt in
+ let stmt = seq [Clight.Sdowhile (e', seq [stmt' ; stmte])] in
+ (stmt, tmpse @ tmps)
+
+ | Clight.Sfor (stmt1, e, stmt2, stmt3) ->
+ let (e', stmte, tmpse) = aux_exp e in
+ let (stmt1', tmps1) = aux stmt1 in
+ let (stmt2', tmps2) = aux stmt2 in
+ let (stmt3', tmps3) = aux stmt3 in
+ let stmt = seq [stmt1' ; stmte ;
+ Clight.Swhile (e', seq [stmt3' ; stmt2' ; stmte])] in
+ (stmt, tmpse @ tmps1 @ tmps2 @ tmps3)
+
+ | Clight.Sswitch (e, lbl_stmts) ->
+ let (e', stmte, tmpse) = aux_exp e in
+ let (lbl_stmts', tmps) = aux_lbl_stmts lbl_stmts in
+ let stmt = seq [stmte ; Clight.Sswitch (e', lbl_stmts')] in
+ (stmt, tmpse @ tmps)
+
+ | Clight.Sreturn (Some e) ->
+ let (e', stmte, tmpse) = aux_exp e in
+ let stmt = seq [stmte ; Clight.Sreturn (Some e')] in
+ (stmt, tmpse)
+
+ | Clight.Ssequence (stmt1, stmt2) ->
+ let (stmt1', tmps1) = aux stmt1 in
+ let (stmt2', tmps2) = aux stmt2 in
+ let stmt = seq [stmt1' ; stmt2'] in
+ (stmt, tmps1 @ tmps2)
+
+ and aux_lbl_stmts = function
+
+ | Clight.LSdefault stmt ->
+ let (stmt', tmps) = aux stmt in
+ (Clight.LSdefault stmt', tmps)
+
+ | Clight.LScase (i, stmt, lbl_stmts) ->
+ let (stmt', tmps1) = aux stmt in
+ let (lbl_stmts', tmps2) = aux_lbl_stmts lbl_stmts in
+ (Clight.LScase (i, stmt', lbl_stmts'), tmps1 @ tmps2)
+
+ in
+
+ aux
+
+
+let f_ctype type_substitutions ctype sub_ctypes_res = match ctype with
+ | _ when List.mem_assoc ctype type_substitutions ->
+ List.assoc ctype type_substitutions
+ | _ -> ClightFold.ctype_fill_subs ctype sub_ctypes_res
+
+let replace_ctype type_substitutions =
+ ClightFold.ctype (f_ctype type_substitutions)
+
+let f_expr = ClightFold.expr_fill_subs
+
+let f_expr_descr = ClightFold.expr_descr_fill_subs
+
+let f_stmt = ClightFold.statement_fill_subs
+
+let statement_replace_ctype type_substitutions =
+ ClightFold.statement (f_ctype type_substitutions) f_expr f_expr_descr f_stmt
+
+
+let replace_internal fresh type_substitutions replacement_assoc def =
+ let (new_body, tmps) =
+ replace_statement fresh type_substitutions replacement_assoc
+ def.Clight.fn_body in
+ let new_body = statement_replace_ctype type_substitutions new_body in
+ let f (x, t) = (x, replace_ctype type_substitutions t) in
+ let params = List.map f def.Clight.fn_params in
+ let vars = List.map f (def.Clight.fn_vars @ tmps) in
+ { Clight.fn_return = replace_ctype type_substitutions def.Clight.fn_return ;
+ Clight.fn_params = params ;
+ Clight.fn_vars = vars ;
+ Clight.fn_body = new_body }
+
+let replace_funct fresh type_substitutions replacement_assoc (id, fundef) =
+ let fundef' = match fundef with
+ | Clight.Internal def ->
+ Clight.Internal
+ (replace_internal fresh type_substitutions replacement_assoc def)
+ | _ -> fundef in
+ (id, fundef')
+
+let replace fresh type_substitutions replacement_assoc p =
+ let prog_funct =
+ List.map (replace_funct fresh type_substitutions replacement_assoc)
+ p.Clight.prog_funct in
+ { p with Clight.prog_funct = prog_funct }
+
+
+(* The constant replacement replaces each 32 bits and 16 bits integer constant
+ by a global variable of the same value. They will be replaced by the
+ appropriate structural value by the global replacement that comes
+ afterwards. *)
+
+module CstMap =
+ Map.Make
+ (struct
+ type t = (int * Clight.intsize * Clight.ctype)
+ let compare = Pervasives.compare
+ end)
+
+let f_subs fresh replace subs map =
+ let f (l, map) x =
+ let (x, map) = replace fresh map x in
+ (l @ [x], map) in
+ List.fold_left f ([], map) subs
+
+let rec replace_constant_expr fresh map (Clight.Expr (ed, t) as e) =
+ match ed, t with
+ | Clight.Econst_int i, Clight.Tint (Clight.I8, _) ->
+ (e, map)
+ | Clight.Econst_int i, Clight.Tint (size, _)
+ when CstMap.mem (i, size, t) map ->
+ let id = CstMap.find (i, size, t) map in
+ (Clight.Expr (Clight.Evar id, t), map)
+ | Clight.Econst_int i, Clight.Tint (size, _) ->
+ let id = fresh () in
+ let map = CstMap.add (i, size, t) id map in
+ let id = CstMap.find (i, size, t) map in
+ (Clight.Expr (Clight.Evar id, t), map)
+ | _ ->
+ let (sub_ctypes, sub_exprs) = ClightFold.expr_descr_subs ed in
+ let (sub_exprs, map) = f_subs fresh replace_constant_expr sub_exprs map in
+ let ed = ClightFold.expr_descr_fill_subs ed sub_ctypes sub_exprs in
+ (Clight.Expr (ed, t), map)
+
+let rec replace_constant_stmt fresh map stmt =
+ let (sub_exprs, sub_stmts) = ClightFold.statement_subs stmt in
+ let (sub_exprs, map) =
+ f_subs fresh replace_constant_expr sub_exprs map in
+ let (sub_stmts, map) =
+ f_subs fresh replace_constant_stmt sub_stmts map in
+ (ClightFold.statement_fill_subs stmt sub_exprs sub_stmts, map)
+
+let replace_constant_fundef fresh (functs, map) (id, fundef) =
+ match fundef with
+ | Clight.Internal cfun ->
+ let (body, map) = replace_constant_stmt fresh map cfun.Clight.fn_body in
+ let fundef = Clight.Internal { cfun with Clight.fn_body = body } in
+ (functs @ [(id, fundef)], map)
+ | Clight.External _ -> (functs @ [(id, fundef)], map)
+
+let init_datas i size =
+ [match size with
+ | Clight.I8 -> Clight.Init_int8 i
+ | Clight.I16 -> Clight.Init_int16 i
+ | Clight.I32 -> Clight.Init_int32 i]
+
+let globals_of_map map =
+ let f (i, size, t) id l = l @ [((id, init_datas i size), t)] in
+ CstMap.fold f map []
+
+let replace_constant p =
+ let tmp_universe = ClightAnnotator.fresh_universe "_cst" p in
+ let fresh () = StringTools.Gen.fresh tmp_universe in
+ let (functs, map) =
+ List.fold_left (replace_constant_fundef fresh)
+ ([], CstMap.empty) p.Clight.prog_funct in
+ let csts = globals_of_map map in
+ { p with
+ Clight.prog_funct = functs ; Clight.prog_vars = p.Clight.prog_vars @ csts }
+
+
+(* Globals replacement *)
+
+let expand_int size i =
+ let i = Big_int.big_int_of_int i in
+ let i =
+ if Big_int.ge_big_int i Big_int.zero_big_int then i
+ else Big_int.add_big_int i (Big_int.power_int_positive_int 2 size) in
+ let bound = Big_int.power_int_positive_int 2 8 in
+ let rec aux n i =
+ if n >= size then []
+ else
+ let (next, chunk) = Big_int.quomod_big_int i bound in
+ chunk :: (aux (n+1) next) in
+ List.map (fun i -> Clight.Init_int8 (Big_int.int_of_big_int i)) (aux 0 i)
+
+let expand_init_data = function
+ | Clight.Init_int16 i -> expand_int 2 i
+ | Clight.Init_int32 i -> expand_int 4 i
+ | init_data -> [init_data]
+
+let expand_init_datas init_datas =
+ List.flatten (List.map expand_init_data init_datas)
+
+let replace_global type_substitutions ((id, init_datas), t) =
+ let init_datas = expand_init_datas init_datas in
+ ((id, init_datas), replace_ctype type_substitutions t)
+
+let replace_globals type_substitutions p =
+ let vars = List.map (replace_global type_substitutions) p.Clight.prog_vars in
+ { p with Clight.prog_vars = vars }
+
+
+(* Unsupported operations by the 8051. *)
+
+(* 8 bits signed division *)
+
+let divs_fun s _ =
+ "signed char " ^ s ^ " (signed char x, signed char y) {\n" ^
+ " unsigned char x1 = (unsigned char) x;\n" ^
+ " unsigned char y1 = (unsigned char) y;\n" ^
+ " signed char sign = 1;\n" ^
+ " if (x < 0) { x1 = (unsigned char) (-x); sign = -sign; }\n" ^
+ " if (y < 0) { y1 = (unsigned char) (-y); sign = -sign; }\n" ^
+ " return (sign * ((signed char) (x1/y1)));\n" ^
+ "}\n\n"
+
+let divs =
+ (Runtime.Binary (Clight.Odiv, cint8s, cint8s), "_divs", [], divs_fun, [])
+
+
+(* 8 bits signed modulo *)
+
+let mods_fun s _ =
+ "signed char " ^ s ^ " (signed char x, signed char y) {\n" ^
+ " return (x - (x/y) * y);\n" ^
+ "}\n\n"
+
+let mods =
+ (Runtime.Binary (Clight.Omod, cint8s, cint8s), "_mods", [], mods_fun,
+ [Runtime.Binary (Clight.Odiv, cint8s, cint8s)])
+
+
+(* Shifts *)
+
+let sh_fun signedness op s _ =
+ signedness ^ " char " ^ s ^ " (" ^ signedness ^ " char x, " ^
+ signedness ^ " char y) {\n" ^
+ " " ^ signedness ^ " char res = x, i;\n" ^
+ " for (i = 0 ; i < y ; i++) res = res " ^ op ^ " 2;\n" ^
+ " return res;\n" ^
+ "}\n\n"
+
+(* 8 bits shifts left *)
+
+let shls_fun = sh_fun "signed" "*"
+
+let shls =
+ (Runtime.Binary (Clight.Oshl, cint8s, cint8s), "_shls", [], shls_fun, [])
+
+let shlu_fun s _ =
+ "unsigned char " ^ s ^ " (unsigned char x, unsigned char y) {\n" ^
+ " return ((unsigned char) ((signed char) x << (signed char) y));\n" ^
+ "}\n\n"
+
+let shlu =
+ (Runtime.Binary (Clight.Oshl, cint8u, cint8u), "_shlu", [], shlu_fun,
+ [Runtime.Binary (Clight.Oshl, cint8s, cint8s)])
+
+(* 8 bits shifts right *)
+
+let shrs_fun s _ =
+ "signed char " ^ s ^ " (signed char x, signed char y) {\n" ^
+ " signed char res = x, i;\n" ^
+ " for (i = 0 ; i < y ; i++) {\n" ^
+ " res = ((unsigned char) res) / 2;\n" ^
+ " res = res + ((signed char) 128);\n" ^
+ " }\n" ^
+ " return res;\n" ^
+ "}\n\n"
+
+let shrs =
+ (Runtime.Binary (Clight.Oshr, cint8s, cint8s), "_shrs", [], shrs_fun, [])
+
+let shru_fun = sh_fun "unsigned" "/"
+
+let shru =
+ (Runtime.Binary (Clight.Oshr, cint8u, cint8u), "_shru", [], shru_fun, [])
+
+
+(* int32 *)
+
+let struct_int32 name fields = match fields with
+ | lolo :: lohi :: hilo :: hihi :: _ ->
+ Clight.Tstruct
+ (name,
+ [(lolo, cint8u) ; (lohi, cint8u) ; (hilo, cint8u) ; (hihi, cint8u)])
+ | _ -> error ("bad field names when defining type " ^ name ^ ".")
+
+let struct_int32_name = "struct _int32_"
+
+let new_int32 int32 =
+ let lolo = "lolo" in
+ let lohi = "lohi" in
+ let hilo = "hilo" in
+ let hihi = "hihi" in
+ (int32, struct_int32_name, [lolo ; lohi ; hilo ; hihi], struct_int32)
+
+let int32s = new_int32 (Clight.Tint (Clight.I32, AST.Signed))
+let int32u = new_int32 (Clight.Tint (Clight.I32, AST.Unsigned))
+
+(* 32 bits operations *)
+
+(* 32 bits equality *)
+
+let eq_int32s_fun s l =
+ let (int32, lolo, lohi, hilo, hihi) = match l with
+ | (int32, lolo :: lohi :: hilo :: hihi :: _) :: _ ->
+ (int32, lolo, lohi, hilo, hihi)
+ | _ -> error ("new type definition not coherent in function " ^ s ^ ".") in
+ int32 ^ " " ^ s ^ " (" ^ int32 ^ " x, " ^ int32 ^ " y) {\n" ^
+ " " ^ int32 ^ " res;\n" ^
+ " res." ^ lolo ^ " = 1;\n" ^
+ " if (x." ^ lolo ^ " != y." ^ lolo ^ ") res." ^ lolo ^ " = 0;\n" ^
+ " if (x." ^ lohi ^ " != y." ^ lohi ^ ") res." ^ lolo ^ " = 0;\n" ^
+ " if (x." ^ hilo ^ " != y." ^ hilo ^ ") res." ^ lolo ^ " = 0;\n" ^
+ " if (x." ^ hihi ^ " != y." ^ hihi ^ ") res." ^ lolo ^ " = 0;\n" ^
+ " res." ^ lohi ^ " = 0;\n" ^
+ " res." ^ hilo ^ " = 0;\n" ^
+ " res." ^ hihi ^ " = 0;\n" ^
+ " return (res);\n" ^
+ "}\n\n"
+
+let eq32s =
+ (Runtime.Binary (Clight.Oeq, cint32s, cint32s), "eq_int32s",
+ [struct_int32_name], eq_int32s_fun, [])
+
+(* 32 bits casts *)
+
+let int32s_to_int8s_fun s l =
+ let (int32, lolo, lohi, hilo, hihi) = match l with
+ | (int32, lolo :: lohi :: hilo :: hihi :: _) :: _ ->
+ (int32, lolo, lohi, hilo, hihi)
+ | _ -> error ("new type definition not coherent in function " ^ s ^ ".") in
+ "signed char " ^ s ^ " (" ^ int32 ^ " x) {\n" ^
+ " return ((signed char) x." ^ lolo ^ ");\n" ^
+ "}\n\n"
+
+let int32s_to_int8s =
+ (Runtime.Cast (cint8s, cint32s), "int32s_to_int8s", [struct_int32_name],
+ int32s_to_int8s_fun, [])
+
+
+(* int16 *)
+
+let struct_int16 name fields = match fields with
+ | lo :: hi :: _ ->
+ Clight.Tstruct (name, [(lo, cint8u) ; (hi, cint8u)])
+ | _ -> error ("bad field names when defining type " ^ name ^ ".")
+
+let struct_int16_name = "struct _int16_"
+
+let new_int16 int16 =
+ let lo = "lo" in
+ let hi = "hi" in
+ (int16, struct_int16_name, [lo ; hi], struct_int16)
+
+let int16s = new_int16 (Clight.Tint (Clight.I16, AST.Signed))
+let int16u = new_int16 (Clight.Tint (Clight.I16, AST.Unsigned))
+
+
+(* int32 and int16 *)
+
+let int32_and_int16_types = [int32s ; int32u ; int16s ; int16u]
+let int32_and_int16_replacements = [eq32s ; int32s_to_int8s]
+
+let unsupported = [divs ; mods ; shls ; shlu ; shrs ; shru]
+
+let save_and_parse p =
+ ClightParser.process (`Source ("32to8", ClightPrinter.print_program p))
+
+let add_replacements p new_types replacements =
+ let p = ClightCasts.simplify p in
+ let (p, type_substitutions, replacement_assoc) =
+ Runtime.add p new_types replacements in
+ let p = ClightCasts.simplify p in
+ let tmp_universe = ClightAnnotator.fresh_universe "_tmp" p in
+ let fresh () = StringTools.Gen.fresh tmp_universe in
+ let p = replace fresh type_substitutions replacement_assoc p in
+ let p = replace_globals type_substitutions p in
+ (* Printf.printf "%s\n%!" (ClightPrinter.print_program p) ; *)
+ let p = save_and_parse p in
+ ClightCasts.simplify p
+
+let translate p =
+ let p = main_returns_char p in
+ let p = replace_constant p in
+ let p =
+ add_replacements p int32_and_int16_types int32_and_int16_replacements in
+ add_replacements p [] unsupported
--- /dev/null
+
+(** This module performs a transformation of a [Clight] program with potentially
+ 32 and 16 bits integers to an equivalent [Clight] program that only uses 8
+ bits integers.
+
+ The main changes are: defining two types that represent 32 and 16 bits
+ integers with a structure of 8 bits integers, making the substitution,
+ replacing primitive integer operations on 32 and 16 bits integers with new
+ functions emulating them on the new types, and finally defining a global
+ variable for each 32 and 16 bits integer constant, which is then replaced by
+ its associated variable. *)
+
+val translate : Clight.program -> Clight.program
--- /dev/null
+(* This module provides an annotation function for Clight programs
+ when given the cost associated to each cost labels of the
+ program. *)
+
+
+let error_prefix = "Clight Annotator"
+let error = Error.global_error error_prefix
+
+
+let cost_id_prefix = "__cost"
+let cost_incr_prefix = "__cost_incr"
+
+
+(* Program var and fun names, cost labels and labels *)
+
+let string_set_of_list l =
+ List.fold_left (fun res s -> StringTools.Set.add s res)
+ StringTools.Set.empty l
+
+let triple_union
+ (names1, cost_labels1, user_labels1)
+ (names2, cost_labels2, user_labels2) =
+ (StringTools.Set.union names1 names2,
+ CostLabel.Set.union cost_labels1 cost_labels2,
+ Label.Set.union user_labels1 user_labels2)
+
+let empty_triple = (StringTools.Set.empty, CostLabel.Set.empty, Label.Set.empty)
+
+let name_singleton id =
+ (StringTools.Set.singleton id, CostLabel.Set.empty, Label.Set.empty)
+
+let cost_label_singleton cost_lbl =
+ (StringTools.Set.empty, CostLabel.Set.singleton cost_lbl, Label.Set.empty)
+
+let label_singleton lbl =
+ (StringTools.Set.empty, CostLabel.Set.empty, Label.Set.singleton lbl)
+
+let list_union l = List.fold_left triple_union empty_triple l
+
+let f_ctype ctype sub_ctypes_res =
+ let res = match ctype with
+ | Clight.Tstruct (id, fields) | Clight.Tunion (id, fields) ->
+ (string_set_of_list (id :: (List.map fst fields)),
+ CostLabel.Set.empty, Label.Set.empty)
+ | Clight.Tcomp_ptr id -> name_singleton id
+ | _ -> empty_triple in
+ list_union (res :: sub_ctypes_res)
+
+let f_expr _ sub_ctypes_res sub_expr_descrs_res =
+ list_union (sub_ctypes_res @ sub_expr_descrs_res)
+
+let f_expr_descr ed sub_ctypes_res sub_exprs_res =
+ let res = match ed with
+ | Clight.Evar id | Clight.Efield (_, id) | Clight.Ecall (id, _, _) ->
+ name_singleton id
+ | Clight.Ecost (cost_lbl, _) -> cost_label_singleton cost_lbl
+ | _ -> empty_triple in
+ list_union (res :: (sub_ctypes_res @ sub_exprs_res))
+
+let f_stmt stmt sub_exprs_res sub_stmts_res =
+ let stmt_res = match stmt with
+ | Clight.Slabel (lbl, _) | Clight.Sgoto lbl -> label_singleton lbl
+ | Clight.Scost (cost_lbl, _) -> cost_label_singleton cost_lbl
+ | _ -> empty_triple in
+ list_union (stmt_res :: (sub_exprs_res @ sub_stmts_res))
+
+let body_idents = ClightFold.statement f_ctype f_expr f_expr_descr f_stmt
+
+let prog_idents p =
+ let def_idents = function
+ | Clight.Internal def ->
+ let vars =
+ string_set_of_list
+ (List.map fst (def.Clight.fn_params @ def.Clight.fn_vars)) in
+ let (names, cost_labels, user_labels) =
+ body_idents def.Clight.fn_body in
+ (StringTools.Set.union vars names, cost_labels, user_labels)
+ | Clight.External (id, _, _) ->
+ (StringTools.Set.singleton id, CostLabel.Set.empty, Label.Set.empty) in
+ let fun_idents (id, f_def) =
+ let (names, cost_labels, user_labels) = def_idents f_def in
+ (StringTools.Set.add id names, cost_labels, user_labels) in
+ let f idents def = triple_union idents (fun_idents def) in
+ List.fold_left f empty_triple p.Clight.prog_funct
+
+let names p =
+ let (names, _, _) = prog_idents p in names
+let cost_labels p =
+ let (_, cost_labels, _) = prog_idents p in cost_labels
+let user_labels p =
+ let (_, _, user_labels) = prog_idents p in user_labels
+
+let all_labels p =
+ let (_, cost_labels, user_labels) = prog_idents p in
+ let all =
+ CostLabel.Set.fold (fun lbl lbls -> StringTools.Set.add lbl lbls)
+ cost_labels StringTools.Set.empty in
+ Label.Set.fold (fun lbl lbls -> StringTools.Set.add lbl lbls) user_labels all
+
+let all_idents p =
+ let (names, cost_labels, user_labels) = prog_idents p in
+ let to_string_set fold set =
+ fold (fun lbl idents -> StringTools.Set.add lbl idents) set
+ StringTools.Set.empty in
+ let cost_labels = to_string_set CostLabel.Set.fold cost_labels in
+ let user_labels = to_string_set Label.Set.fold user_labels in
+ StringTools.Set.union names (StringTools.Set.union cost_labels user_labels)
+
+let fresh_ident base p =
+ StringTools.Gen.fresh_prefix (all_idents p) base
+
+let fresh_universe base p =
+ let universe = fresh_ident base p in
+ StringTools.Gen.new_universe universe
+
+let make_fresh base p =
+ let universe = fresh_universe base p in
+ (fun () -> StringTools.Gen.fresh universe)
+
+
+(* Instrumentation *)
+
+let int_typ = Clight.Tint (Clight.I32, AST.Signed)
+
+let const_int i = Clight.Expr (Clight.Econst_int i, int_typ)
+
+(* Instrument an expression. *)
+
+let rec instrument_expr cost_mapping cost_incr e =
+ let Clight.Expr (e, t) = e in
+ match e with
+ | Clight.Ecost (lbl, e)
+ when CostLabel.Map.mem lbl cost_mapping &&
+ CostLabel.Map.find lbl cost_mapping = 0 ->
+ e
+ | _ ->
+ let e' = instrument_expr_descr cost_mapping cost_incr e in
+ Clight.Expr (e', t)
+and instrument_expr_descr cost_mapping cost_incr e = match e with
+ | Clight.Econst_int _ | Clight.Econst_float _ | Clight.Evar _
+ | Clight.Esizeof _ -> e
+ | Clight.Ederef e ->
+ let e' = instrument_expr cost_mapping cost_incr e in
+ Clight.Ederef e'
+ | Clight.Eaddrof e ->
+ let e' = instrument_expr cost_mapping cost_incr e in
+ Clight.Eaddrof e'
+ | Clight.Eunop (op, e) ->
+ let e' = instrument_expr cost_mapping cost_incr e in
+ Clight.Eunop (op, e')
+ | Clight.Ebinop (op, e1, e2) ->
+ let e1' = instrument_expr cost_mapping cost_incr e1 in
+ let e2' = instrument_expr cost_mapping cost_incr e2 in
+ Clight.Ebinop (op, e1', e2')
+ | Clight.Ecast (t, e) ->
+ let e' = instrument_expr cost_mapping cost_incr e in
+ Clight.Ecast (t, e')
+ | Clight.Econdition (e1, e2, e3) ->
+ let e1' = instrument_expr cost_mapping cost_incr e1 in
+ let e2' = instrument_expr cost_mapping cost_incr e2 in
+ let e3' = instrument_expr cost_mapping cost_incr e3 in
+ Clight.Econdition (e1', e2', e3')
+ | Clight.Eandbool (e1, e2) ->
+ let e1' = instrument_expr cost_mapping cost_incr e1 in
+ let e2' = instrument_expr cost_mapping cost_incr e2 in
+ Clight.Eandbool (e1', e2')
+ | Clight.Eorbool (e1, e2) ->
+ let e1' = instrument_expr cost_mapping cost_incr e1 in
+ let e2' = instrument_expr cost_mapping cost_incr e2 in
+ Clight.Eorbool (e1', e2')
+ | Clight.Efield (e, x) ->
+ let e' = instrument_expr cost_mapping cost_incr e in
+ Clight.Efield (e', x)
+ | Clight.Ecost (lbl, e) when CostLabel.Map.mem lbl cost_mapping ->
+ let e' = instrument_expr cost_mapping cost_incr e in
+ let incr = CostLabel.Map.find lbl cost_mapping in
+ if incr = 0 then let Clight.Expr (e'', _) = e' in e''
+ else Clight.Ecall (cost_incr, const_int incr, e')
+ | Clight.Ecost (_, e) ->
+ let Clight.Expr (e', _) = instrument_expr cost_mapping cost_incr e in
+ e'
+ | Clight.Ecall (x, e1, e2) -> assert false (* Should not happen. *)
+
+(* Instrument a statement. *)
+
+let rec instrument_body cost_mapping cost_incr stmt = match stmt with
+ | Clight.Sskip | Clight.Sbreak | Clight.Scontinue | Clight.Sreturn None
+ | Clight.Sgoto _ ->
+ stmt
+ | Clight.Sassign (e1, e2) ->
+ let e1' = instrument_expr cost_mapping cost_incr e1 in
+ let e2' = instrument_expr cost_mapping cost_incr e2 in
+ Clight.Sassign (e1', e2')
+ | Clight.Scall (eopt, f, args) ->
+ let eopt' = match eopt with
+ | None -> None
+ | Some e -> Some (instrument_expr cost_mapping cost_incr e) in
+ let f' = instrument_expr cost_mapping cost_incr f in
+ let args' = List.map (instrument_expr cost_mapping cost_incr) args in
+ Clight.Scall (eopt', f', args')
+ | Clight.Ssequence (s1, s2) ->
+ Clight.Ssequence (instrument_body cost_mapping cost_incr s1,
+ instrument_body cost_mapping cost_incr s2)
+ | Clight.Sifthenelse (e, s1, s2) ->
+ let e' = instrument_expr cost_mapping cost_incr e in
+ let s1' = instrument_body cost_mapping cost_incr s1 in
+ let s2' = instrument_body cost_mapping cost_incr s2 in
+ Clight.Sifthenelse (e', s1', s2')
+ | Clight.Swhile (e, s) ->
+ let e' = instrument_expr cost_mapping cost_incr e in
+ let s' = instrument_body cost_mapping cost_incr s in
+ Clight.Swhile (e', s')
+ | Clight.Sdowhile (e, s) ->
+ let e' = instrument_expr cost_mapping cost_incr e in
+ let s' = instrument_body cost_mapping cost_incr s in
+ Clight.Sdowhile (e', s')
+ | Clight.Sfor (s1, e, s2, s3) ->
+ let s1' = instrument_body cost_mapping cost_incr s1 in
+ let e' = instrument_expr cost_mapping cost_incr e in
+ let s2' = instrument_body cost_mapping cost_incr s2 in
+ let s3' = instrument_body cost_mapping cost_incr s3 in
+ Clight.Sfor (s1', e', s2', s3')
+ | Clight.Sreturn (Some e) ->
+ let e' = instrument_expr cost_mapping cost_incr e in
+ Clight.Sreturn (Some e')
+ | Clight.Sswitch (e, ls) ->
+ let e' = instrument_expr cost_mapping cost_incr e in
+ let ls' = instrument_ls cost_mapping cost_incr ls in
+ Clight.Sswitch (e', ls')
+ | Clight.Slabel (lbl, s) ->
+ let s' = instrument_body cost_mapping cost_incr s in
+ Clight.Slabel (lbl, s')
+ | Clight.Scost (lbl, s) when CostLabel.Map.mem lbl cost_mapping ->
+ (* Keep the cost label in the code. *)
+ let s' = instrument_body cost_mapping cost_incr s in
+ let incr = CostLabel.Map.find lbl cost_mapping in
+ let fun_typ = Clight.Tfunction ([int_typ], Clight.Tvoid) in
+ let f = Clight.Expr (Clight.Evar cost_incr, fun_typ) in
+ let args = [Clight.Expr (Clight.Econst_int incr, int_typ)] in
+ Clight.Scost (lbl, Clight.Ssequence (Clight.Scall (None, f, args), s'))
+ (*
+ let s' = instrument_body cost_mapping cost_incr s in
+ let incr = CostLabel.Map.find lbl cost_mapping in
+ if incr = 0 then s'
+ else
+ let fun_typ = Clight.Tfunction ([int_typ], Clight.Tvoid) in
+ let f = Clight.Expr (Clight.Evar cost_incr, fun_typ) in
+ let args = [Clight.Expr (Clight.Econst_int incr, int_typ)] in
+ Clight.Ssequence (Clight.Scall (None, f, args), s')
+ *)
+ | Clight.Scost (lbl, s) ->
+ (* Keep the cost label in the code and show the increment of 0. *)
+ let s' = instrument_body cost_mapping cost_incr s in
+ let fun_typ = Clight.Tfunction ([int_typ], Clight.Tvoid) in
+ let f = Clight.Expr (Clight.Evar cost_incr, fun_typ) in
+ let args = [Clight.Expr (Clight.Econst_int 0, int_typ)] in
+ Clight.Scost (lbl, Clight.Ssequence (Clight.Scall (None, f, args), s'))
+ (*
+ instrument_body cost_mapping cost_incr s
+ *)
+and instrument_ls cost_mapping cost_incr = function
+ | Clight.LSdefault s ->
+ let s' = instrument_body cost_mapping cost_incr s in
+ Clight.LSdefault s'
+ | Clight.LScase (i, s, ls) ->
+ let s' = instrument_body cost_mapping cost_incr s in
+ let ls' = instrument_ls cost_mapping cost_incr ls in
+ Clight.LScase (i, s', ls')
+
+(* Instrument a function. *)
+
+let instrument_funct cost_mapping cost_incr (id, def) =
+ let def = match def with
+ | Clight.Internal def ->
+ let body = instrument_body cost_mapping cost_incr def.Clight.fn_body in
+ Clight.Internal { def with Clight.fn_body = body }
+ | Clight.External _ -> def
+ in
+ (id, def)
+
+(* This is the declaration of the cost variable. *)
+
+let cost_decl cost_id =
+ let init = [Clight.Init_int32 0] in
+ ((cost_id, init), int_typ)
+
+(* This is the definition of the increment cost function. *)
+
+let cost_incr_def cost_id cost_incr =
+ let int_var x = Clight.Expr (Clight.Evar x, int_typ) in
+ let param = "incr" in
+ let cost = int_var cost_id in
+ let increment = int_var param in
+ let cost_increment =
+ Clight.Expr (Clight.Ebinop (Clight.Oadd, cost, increment), int_typ) in
+ let stmt = Clight.Sassign (cost, cost_increment) in
+ let cfun =
+ { Clight.fn_return = Clight.Tvoid ;
+ Clight.fn_params = [(param, int_typ)] ;
+ Clight.fn_vars = [] ;
+ Clight.fn_body = stmt } in
+ (cost_incr, Clight.Internal cfun)
+
+(* Create a fresh uninitialized cost variable for each external function. This
+ will be used by the Cost plug-in of the Frama-C platform. *)
+
+let extern_cost_variables make_unique functs =
+ let prefix = "_cost_of_" in
+ let f (decls, map) (_, def) = match def with
+ | Clight.Internal _ -> (decls, map)
+ | Clight.External (id, _, _) ->
+ let new_var = make_unique (prefix ^ id) in
+ (decls @ [cost_decl new_var], StringTools.Map.add id new_var map) in
+ List.fold_left f ([], StringTools.Map.empty) functs
+
+let save_tmp tmp_file s =
+ let cout = open_out tmp_file in
+ output_string cout s ;
+ flush cout ;
+ close_out cout
+
+(** [instrument prog cost_map] instruments the program [prog]. First a fresh
+ global variable --- the so-called cost variable --- is added to the program.
+ Then, each cost label in the program is replaced by an increment of the cost
+ variable, following the mapping [cost_map]. The function also returns the
+ name of the cost variable and the name of the cost increment function. *)
+
+let instrument p cost_mapping =
+
+ (* Create a fresh 'cost' variable. *)
+ let names = names p in
+ let make_unique = StringTools.make_unique names in
+ let cost_id = make_unique cost_id_prefix in
+ let cost_decl = cost_decl cost_id in
+
+ (* Create a fresh uninitialized global variable for each extern function. *)
+ let (extern_cost_decls, extern_cost_variables) =
+ extern_cost_variables make_unique p.Clight.prog_funct in
+
+ (* Define an increment function for the cost variable. *)
+ let cost_incr =
+ StringTools.Gen.fresh_prefix (StringTools.Set.add cost_id names)
+ cost_incr_prefix in
+ let cost_incr_def = cost_incr_def cost_id cost_incr in
+
+ (* Instrument each function *)
+ let prog_funct =
+ List.map (instrument_funct cost_mapping cost_incr) p.Clight.prog_funct in
+
+ (* Glue all this together. *)
+ let prog_vars = cost_decl :: extern_cost_decls @ p.Clight.prog_vars in
+ let prog_funct = cost_incr_def :: prog_funct in
+ let p' =
+ { p with Clight.prog_vars = prog_vars ; Clight.prog_funct = prog_funct } in
+
+ (* Save the resulted program. Then re-parse it.
+ Indeed, the instrumentation may add side-effects in expressions, which is
+ not Clight compliant. Re-parsing the result with CIL will remove these
+ side-effects in expressions to obtain a Clight program. *)
+ let output = ClightPrinter.print_program p' in
+ let res = ClightParser.process (`Source ("annotated", output)) in
+ (res, cost_id, cost_incr, extern_cost_variables)
--- /dev/null
+
+(** This module defines the instrumentation of a [Clight] program. *)
+
+(** [instrument prog cost_map] instruments the program [prog]. First a fresh
+ global variable --- the so-called cost variable --- is added to the program.
+ Then, each cost label in the program is replaced by an increment of the cost
+ variable, following the mapping [cost_map]. The function also returns the
+ name of the cost variable, the name of the cost increment function, and a
+ fresh uninitialized global (cost) variable associated to each extern
+ function. *)
+
+val instrument : Clight.program -> int CostLabel.Map.t ->
+ Clight.program * string * string * string StringTools.Map.t
+
+val cost_labels : Clight.program -> CostLabel.Set.t
+val user_labels : Clight.program -> Label.Set.t
+val all_labels : Clight.program -> StringTools.Set.t
+val all_idents : Clight.program -> StringTools.Set.t
+
+val fresh_ident : string (* base *) -> Clight.program -> string
+
+val fresh_universe :
+ string (* prefix *) -> Clight.program -> StringTools.Gen.universe
+
+val make_fresh :
+ string (* prefix *) -> Clight.program -> (unit -> string)
+
+
+(** utils *)
+val names : Clight.program -> StringTools.Set.t
--- /dev/null
+
+(** [simplify p] removes unnecessary casts in the Clight program [p].
+
+ Example: [(char) ((int)x + (int)y)] where [x] and [y] are of type [char]
+ will be transformed into [x + y]. Primitive operations are thus supposed to
+ be polymorphic, but working only on homogene types. *)
+
+
+let error_prefix = "Clight casts simplification"
+let error = Error.global_error error_prefix
+let error_float () = error "float not supported."
+
+
+(* Int sizes *)
+
+let int_of_intsize = function
+ | Clight.I8 -> 8
+ | Clight.I16 -> 16
+ | Clight.I32 -> 32
+
+let intsize_of_int = function
+ | i when i <= 8 -> Clight.I8
+ | i when i <= 16 -> Clight.I16
+ | _ -> Clight.I32
+
+let op_intsize_no_cast op size1 size2 =
+ op (int_of_intsize size1) (int_of_intsize size2)
+
+let cmp_intsize cmp size1 size2 = op_intsize_no_cast cmp size1 size2
+
+let op_intsize op size1 size2 =
+ intsize_of_int (op_intsize_no_cast op size1 size2)
+
+let max_intsize size1 size2 = op_intsize max size1 size2
+
+let intsize_union size1 size2 = op_intsize (+) size1 size2
+
+let pow2 = MiscPottier.pow 2
+
+let belongs_to_int_type size sign i = match size, sign with
+ | Clight.I8, AST.Unsigned -> 0 <= i && i <= (pow2 8) - 1
+ | Clight.I8, AST.Signed -> -(pow2 7) <= i && i <= (pow2 7) - 1
+ | Clight.I16, AST.Unsigned -> 0 <= i && i <= (pow2 16) - 1
+ | Clight.I16, AST.Signed -> -(pow2 15) <= i && i <= (pow2 15) - 1
+ | Clight.I32, AST.Unsigned -> 0 <= i
+ | Clight.I32, AST.Signed ->
+ let pow2_30 = pow2 30 in
+ (-(pow2_30 + pow2_30)) <= i &&
+ i <= ((pow2_30 - 1) + pow2_30) (* = 2^31 - 1 *)
+
+let smallest_int_type i =
+ let (size, sign) = match i with
+ | _ when belongs_to_int_type Clight.I8 AST.Signed i ->
+ (Clight.I8, AST.Signed)
+ | _ when belongs_to_int_type Clight.I8 AST.Unsigned i ->
+ (Clight.I8, AST.Unsigned)
+ | _ when belongs_to_int_type Clight.I16 AST.Signed i ->
+ (Clight.I16, AST.Signed)
+ | _ when belongs_to_int_type Clight.I16 AST.Unsigned i ->
+ (Clight.I16, AST.Unsigned)
+ | _ when belongs_to_int_type Clight.I32 AST.Unsigned i ->
+ (Clight.I32, AST.Unsigned)
+ | _ ->
+ (Clight.I32, AST.Signed) in
+ Clight.Tint (size, sign)
+
+let le_int_type size1 sign1 size2 sign2 = match sign1, sign2 with
+ | AST.Unsigned, AST.Signed -> cmp_intsize (<) size1 size2
+ | AST.Signed, AST.Unsigned -> false
+ | _ -> cmp_intsize (<=) size1 size2
+
+let int_type_union size1 sign1 size2 sign2 =
+ if sign1 = sign2 then (max_intsize size1 size2, sign1)
+ else (intsize_union size1 size2, AST.Signed)
+
+
+(* C types *)
+
+let type_of_expr (Clight.Expr (_, t)) = t
+
+let cast_if_needed t (Clight.Expr (ed, t') as e) = match t, ed with
+ | _ when t = t' -> e
+ | Clight.Tint (size, sign), Clight.Econst_int i
+ when belongs_to_int_type size sign i ->
+ Clight.Expr (Clight.Econst_int i, t)
+ | _ -> Clight.Expr (Clight.Ecast (t, e), t)
+
+let cast_if_needed_opt opt_t e = match opt_t with
+ | None -> e
+ | Some t -> cast_if_needed t e
+
+let is_int_type = function
+ | Clight.Tint _ -> true
+ | _ -> false
+
+let le_ctype t1 t2 = match t1, t2 with
+ | Clight.Tint (size1, sign1), Clight.Tint (size2, sign2) ->
+ le_int_type size1 sign1 size2 sign2
+ | _ -> t1 = t2
+
+let ctype_union t1 t2 = match t1, t2 with
+ | Clight.Tint (size1, sign1), Clight.Tint (size2, sign2) ->
+ let (size, sign) = int_type_union size1 sign1 size2 sign2 in
+ Clight.Tint (size, sign)
+ | _ -> assert false (* only use on int types *)
+
+let belongs_to_ctype t i = match t with
+ | Clight.Tint (size, sign) -> belongs_to_int_type size sign i
+ | _ -> false
+
+
+(* Simplification *)
+
+let rec is_const_int (Clight.Expr (ed, _)) = match ed with
+ | Clight.Econst_int _ -> true
+ | Clight.Ecast (_, e) | Clight.Ecost (_, e) -> is_const_int e
+ | _ -> false
+
+let rec simplify_bool_op f_bool target_t e1 e2 =
+ let (e1', e2', t') = simplify_and_same_type target_t e1 e2 in
+ Clight.Expr (f_bool e1' e2', t')
+
+and simplify_and_same_type target_t e1 e2 = match target_t with
+
+ | None when is_const_int e1 && is_const_int e2 ->
+ let e1' = simplify_expr target_t e1 in
+ let t1 = type_of_expr e1' in
+ let e2' = simplify_expr target_t e2 in
+ let t2 = type_of_expr e2' in
+ if is_int_type t1 && is_int_type t2 then
+ let t = ctype_union t1 t2 in
+ let e1' = cast_if_needed t e1' in
+ let e2' = cast_if_needed t e2' in
+ (e1', e2', t)
+ else (e1, e2, type_of_expr e1)
+
+ | None when is_const_int e1 ->
+ let e2 = simplify_expr target_t e2 in
+ let t2 = type_of_expr e2 in
+ let e1 = simplify_expr (Some t2) e1 in
+ (e1, e2, t2)
+
+ | None when is_const_int e2 ->
+ let e1 = simplify_expr target_t e1 in
+ let t1 = type_of_expr e1 in
+ let e2 = simplify_expr (Some t1) e2 in
+ (e1, e2, t1)
+
+ | _ ->
+ let e1' = simplify_expr target_t e1 in
+ let t1 = type_of_expr e1' in
+ let e2' = simplify_expr target_t e2 in
+ let t2 = type_of_expr e2' in
+ if t1 = t2 then (e1', e2', t1)
+ else (e1, e2, type_of_expr e1)
+
+and simplify_expr target_t (Clight.Expr (ed, t) as e) = match target_t, ed with
+
+ | None, Clight.Econst_int i ->
+ let t' = smallest_int_type i in
+ Clight.Expr (ed, t')
+
+ | Some t', Clight.Econst_int i when belongs_to_ctype t' i ->
+ Clight.Expr (ed, t')
+
+ | Some t', Clight.Econst_int _ -> cast_if_needed t' e
+
+ | _, Clight.Evar _ -> cast_if_needed_opt target_t e
+
+ | _, Clight.Esizeof _ ->
+ let i = Driver.TargetArch.int_size * 8 in
+ let t = smallest_int_type i in
+ cast_if_needed_opt target_t (Clight.Expr (ed, t))
+
+ | _, Clight.Econst_float _ -> error_float ()
+
+ | _, Clight.Ederef e ->
+ let e' = simplify_expr (Some (Clight.Tpointer t)) e in
+ cast_if_needed_opt target_t (Clight.Expr (Clight.Ederef e', t))
+
+ | _, Clight.Eaddrof e ->
+ let e' = simplify_expr None e in
+ let e' =
+ Clight.Expr (Clight.Eaddrof e', Clight.Tpointer (type_of_expr e')) in
+ cast_if_needed_opt target_t e'
+
+ | _, Clight.Eunop (unop, e) ->
+ let e' = simplify_expr target_t e in
+ Clight.Expr (Clight.Eunop (unop, e'), type_of_expr e')
+
+ (* Particular case: shifts. The first argument will always be casted to int by
+ CIL (except for unsigned int, treated in another pattern). *)
+ (* TODO: is above really true?! *)
+ (* [(_) e1 >> e2], when [e1] and [e2] simplified have the same type, is
+ simplified to [e1 >> e2] (and respectively with [<<]). *)
+ | _, Clight.Ebinop ((Clight.Oshl | Clight.Oshr) as binop,
+ Clight.Expr (Clight.Ecast (_, e1), _), e2) ->
+ let e1 = simplify_expr target_t e1 in
+ let t1 = type_of_expr e1 in
+ let e2 = simplify_expr target_t e2 in
+ let t2 = type_of_expr e2 in
+ if t1 = t2 then Clight.Expr (Clight.Ebinop (binop, e1, e2), t1)
+ else cast_if_needed_opt target_t e
+
+ | _, Clight.Ebinop (binop, e1, e2)
+ when is_int_type (type_of_expr e1) && is_int_type (type_of_expr e2) ->
+ let (e1, e2, t) = simplify_and_same_type target_t e1 e2 in
+ cast_if_needed_opt target_t (Clight.Expr (Clight.Ebinop (binop, e1, e2), t))
+
+ | _, Clight.Ebinop (binop, e1, e2) ->
+ let e1' = cast_if_needed (type_of_expr e1) (simplify_expr None e1) in
+ let e2' = cast_if_needed (type_of_expr e2) (simplify_expr None e2) in
+ Clight.Expr (Clight.Ebinop (binop, e1', e2'), t)
+
+ | _, Clight.Ecast (_, e) -> simplify_expr target_t e
+
+ | _, Clight.Econdition (e1, e2, e3) ->
+ let e1' = simplify_expr None e1 in
+ let (e2', e3', t') = simplify_and_same_type target_t e2 e3 in
+ Clight.Expr (Clight.Econdition (e1', e2', e3'), t')
+
+ | _, Clight.Eandbool (e1, e2) ->
+ simplify_bool_op (fun e1' e2' -> Clight.Eandbool (e1', e2')) target_t e1 e2
+
+ | _, Clight.Eorbool (e1, e2) ->
+ simplify_bool_op (fun e1' e2' -> Clight.Eorbool (e1', e2')) target_t e1 e2
+
+ | _, Clight.Efield (e, field) ->
+ let e' = simplify_expr (Some (type_of_expr e)) e in
+ cast_if_needed_opt target_t (Clight.Expr (Clight.Efield (e', field), t))
+
+ | _, Clight.Ecost (lbl, e) ->
+ let e' = simplify_expr target_t e in
+ Clight.Expr (Clight.Ecost (lbl, e'), type_of_expr e')
+
+ | _, Clight.Ecall _ ->
+ assert false (* should be impossible *)
+
+
+let f_ctype ctype _ = ctype
+
+let f_expr e _ _ = e
+
+let f_expr_descr e _ _ = e
+
+let f_statement stmt _ sub_stmts_res =
+ let f_expr b e =
+ simplify_expr (if b then Some (type_of_expr e) else None) e in
+ let f_exprs b = List.map (f_expr b) in
+ let f_sub_exprs = match stmt with
+ | Clight.Sassign _ | Clight.Scall _ | Clight.Sreturn _ -> f_exprs true
+ | _ -> f_exprs false in
+ let sub_exprs = f_sub_exprs (ClightFold.statement_sub_exprs stmt) in
+ ClightFold.statement_fill_subs stmt sub_exprs sub_stmts_res
+
+let simplify_stmt = ClightFold.statement f_ctype f_expr f_expr_descr f_statement
+
+let simplify_funct (id, fundef) =
+ let fundef' = match fundef with
+ | Clight.Internal cfun ->
+ Clight.Internal
+ { cfun with Clight.fn_body = simplify_stmt cfun.Clight.fn_body }
+ | _ -> fundef in
+ (id, fundef')
+
+let simplify p =
+ { p with Clight.prog_funct = List.map simplify_funct p.Clight.prog_funct }
+
+(* TODO: restore above, but buggy with
+ (unsigned int) (-x) -> - ((unsigned int) x) *)
+
+(*
+let simplify p = p
+*)
--- /dev/null
+
+(** [simplify p] removes unnecessary casts in the Clight program [p].
+
+ Example: [(char) ((int)x + (int)y)] where [x] and [y] are of type [char]
+ will be transformed into [x + y]. Primitive operations are thus supposed to
+ be polymorphic, but working only on homogene types. *)
+
+val simplify : Clight.program -> Clight.program
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Command-line flags *)
+
+let prepro_options = ref ([]: string list)
+let linker_options = ref ([]: string list)
+let exe_name = ref "a.out"
+let option_flonglong = ref true
+let option_fstruct_passing = ref false
+let option_fstruct_assign = ref false
+let option_fbitfields = ref false
+let option_fvararg_calls = ref true
+let option_fmadd = ref false
+let option_dparse = ref false
+let option_dclight = ref false
+let option_dasm = ref false
+let option_E = ref false
+let option_S = ref false
+let option_c = ref false
+let option_v = ref false
--- /dev/null
+
+(** This module provides folding functions over the constructors of the
+ [Clight]'s AST. *)
+
+
+let ctype_subs = function
+ | Clight.Tvoid | Clight.Tint _ | Clight.Tfloat _ | Clight.Tcomp_ptr _ -> []
+ | Clight.Tpointer ctype | Clight.Tarray (ctype, _) -> [ctype]
+ | Clight.Tfunction (args, res) -> args @ [res]
+ | Clight.Tstruct (_, fields) | Clight.Tunion (_, fields) ->
+ List.map snd fields
+
+let ctype_fill_subs ctype sub_ctypes = match ctype, sub_ctypes with
+ | Clight.Tvoid, _ | Clight.Tint _, _ | Clight.Tfloat _, _
+ | Clight.Tcomp_ptr _, _ -> ctype
+ | Clight.Tpointer _, ctype :: _ -> Clight.Tpointer ctype
+ | Clight.Tarray (_, size), ctype :: _ -> Clight.Tarray (ctype, size)
+ | Clight.Tfunction _, _ ->
+ let (args, res) = MiscPottier.split_last sub_ctypes in
+ Clight.Tfunction (args, res)
+ | Clight.Tstruct (name, fields), _ ->
+ let fields = List.map2 (fun (x, _) ctype -> (x, ctype)) fields sub_ctypes in
+ Clight.Tstruct (name, fields)
+ | Clight.Tunion (name, fields), _ ->
+ let fields = List.map2 (fun (x, _) ctype -> (x, ctype)) fields sub_ctypes in
+ Clight.Tunion (name, fields)
+ | _ -> assert false (* wrong arguments, do not use on these values *)
+
+let rec ctype f t =
+ let sub_ctypes_res = List.map (ctype f) (ctype_subs t) in
+ f t sub_ctypes_res
+
+
+let expr_subs = function
+ | Clight.Expr (expr_descr, ctype) -> ([ctype], [expr_descr])
+
+let expr_descr_subs = function
+ | Clight.Econst_int _ | Clight.Econst_float _ | Clight.Evar _ -> ([], [])
+ | Clight.Ederef e | Clight.Eaddrof e | Clight.Eunop (_, e)
+ | Clight.Efield (e, _) -> ([], [e])
+ | Clight.Ebinop (_, e1, e2) | Clight.Eandbool (e1, e2)
+ | Clight.Eorbool (e1, e2) -> ([], [e1 ; e2])
+ | Clight.Ecast (ctype, e) -> ([ctype], [e])
+ | Clight.Econdition (e1, e2, e3) -> ([], [e1 ; e2 ; e3])
+ | Clight.Esizeof ctype -> ([ctype], [])
+ | Clight.Ecost (_, e) -> ([], [e])
+ | Clight.Ecall (_, e1, e2) -> ([], [e1 ; e2])
+
+let expr_fill_subs e sub_ctypes sub_expr_descrs =
+ match e, sub_ctypes, sub_expr_descrs with
+ | Clight.Expr _, ctype :: _, expr_descr :: _ ->
+ Clight.Expr (expr_descr, ctype)
+ | _ -> assert false (* wrong arguments, do not use on these values *)
+
+let expr_descr_fill_subs e sub_ctypes sub_exprs =
+ match e, sub_ctypes, sub_exprs with
+ | Clight.Econst_int _, _, _ | Clight.Econst_float _, _, _
+ | Clight.Evar _, _, _ -> e
+ | Clight.Ederef _, _, e :: _ -> Clight.Ederef e
+ | Clight.Eaddrof _, _, e :: _ -> Clight.Eaddrof e
+ | Clight.Eunop (unop, _), _, e :: _ -> Clight.Eunop (unop, e)
+ | Clight.Ebinop (binop, _, _), _, e1 :: e2 :: _ ->
+ Clight.Ebinop (binop, e1, e2)
+ | Clight.Ecast _, ctype :: _, e :: _ -> Clight.Ecast (ctype, e)
+ | Clight.Econdition _, _, e1 :: e2 :: e3 :: _ ->
+ Clight.Econdition (e1, e2, e3)
+ | Clight.Eandbool (_, _), _, e1 :: e2 :: _ ->
+ Clight.Eandbool (e1, e2)
+ | Clight.Eorbool (_, _), _, e1 :: e2 :: _ ->
+ Clight.Eorbool (e1, e2)
+ | Clight.Esizeof _, ctype :: _, _ -> Clight.Esizeof ctype
+ | Clight.Efield (_, field_name), _, e :: _ -> Clight.Efield (e, field_name)
+ | Clight.Ecost (lbl, _), _, e :: _ -> Clight.Ecost (lbl, e)
+ | Clight.Ecall (id, _, _), _, e1 :: e2 :: _ -> Clight.Ecall (id, e1, e2)
+ | _ -> assert false (* wrong arguments, do not use on these values *)
+
+let expr_fill_exprs (Clight.Expr (ed, t)) exprs =
+ let (sub_ctypes, _) = expr_descr_subs ed in
+ let ed = expr_descr_fill_subs ed sub_ctypes exprs in
+ Clight.Expr (ed, t)
+
+let rec expr f_ctype f_expr f_expr_descr e =
+ let (sub_ctypes, sub_expr_descrs) = expr_subs e in
+ let sub_expr_descrs_res =
+ List.map (expr_descr f_ctype f_expr f_expr_descr) sub_expr_descrs in
+ let sub_ctypes_res = List.map (ctype f_ctype) sub_ctypes in
+ f_expr e sub_ctypes_res sub_expr_descrs_res
+
+and expr_descr f_ctype f_expr f_expr_descr e =
+ let (sub_ctypes, sub_exprs) = expr_descr_subs e in
+ let sub_exprs_res =
+ List.map (expr f_ctype f_expr f_expr_descr) sub_exprs in
+ let sub_ctypes_res = List.map (ctype f_ctype) sub_ctypes in
+ f_expr_descr e sub_ctypes_res sub_exprs_res
+
+
+let expr_subs2 e =
+ let (_, expr_descrs) = expr_subs e in
+ let l = List.map expr_descr_subs expr_descrs in
+ List.flatten (List.map snd l)
+
+let rec expr2 f e = f e (List.map (expr2 f) (expr_subs2 e))
+
+
+let rec labeled_statements_subs = function
+ | Clight.LSdefault stmt -> [stmt]
+ | Clight.LScase (_, stmt, lbl_stmts) ->
+ stmt :: (labeled_statements_subs lbl_stmts)
+
+let statement_subs = function
+ | Clight.Sskip | Clight.Sbreak | Clight.Scontinue | Clight.Sreturn None
+ | Clight.Sgoto _ -> ([], [])
+ | Clight.Sassign (e1, e2) -> ([e1 ; e2], [])
+ | Clight.Scall (None, e, args) -> (e :: args, [])
+ | Clight.Scall (Some e1, e2, args) -> (e1 :: e2 :: args, [])
+ | Clight.Ssequence (stmt1, stmt2) -> ([], [stmt1 ; stmt2])
+ | Clight.Sifthenelse (e, stmt1, stmt2) -> ([e], [stmt1 ; stmt2])
+ | Clight.Swhile (e, stmt) | Clight.Sdowhile (e, stmt) -> ([e], [stmt])
+ | Clight.Sfor (stmt1, e, stmt2, stmt3) -> ([e], [stmt1 ; stmt2 ; stmt3])
+ | Clight.Sreturn (Some e) -> ([e], [])
+ | Clight.Sswitch (e, lbl_stmts) -> ([e], labeled_statements_subs lbl_stmts)
+ | Clight.Slabel (_, stmt) | Clight.Scost (_, stmt) -> ([], [stmt])
+
+let statement_sub_exprs stmt = fst (statement_subs stmt)
+
+let rec labeled_statements_fill_subs lbl_stmts sub_statements =
+ match lbl_stmts, sub_statements with
+ | Clight.LSdefault _, stmt :: _ -> Clight.LSdefault stmt
+ | Clight.LScase (i, _, lbl_stmts), stmt :: sub_statements ->
+ Clight.LScase (i, stmt,
+ labeled_statements_fill_subs lbl_stmts sub_statements)
+ | _ -> assert false (* wrong arguments, do not use on these values *)
+
+let statement_fill_subs statement sub_exprs sub_statements =
+ match statement, sub_exprs, sub_statements with
+ | Clight.Sskip, _, _ | Clight.Sbreak, _, _ | Clight.Scontinue, _, _
+ | Clight.Sreturn None, _, _ | Clight.Sgoto _, _, _ -> statement
+ | Clight.Sassign _, e1 :: e2 :: _, _ -> Clight.Sassign (e1, e2)
+ | Clight.Scall (None, _, _), e :: args, _ ->
+ Clight.Scall (None, e, args)
+ | Clight.Scall (Some _, _, _), e1 :: e2 :: args, _ ->
+ Clight.Scall (Some e1, e2, args)
+ | Clight.Ssequence _, _, stmt1 :: stmt2 :: _ ->
+ Clight.Ssequence (stmt1, stmt2)
+ | Clight.Sifthenelse _, e :: _, stmt1 :: stmt2 :: _ ->
+ Clight.Sifthenelse (e, stmt1, stmt2)
+ | Clight.Swhile _, e :: _, stmt :: _ ->
+ Clight.Swhile (e, stmt)
+ | Clight.Sdowhile _, e :: _, stmt :: _ ->
+ Clight.Sdowhile (e, stmt)
+ | Clight.Sfor _, e :: _, stmt1 :: stmt2 :: stmt3 :: _ ->
+ Clight.Sfor (stmt1, e, stmt2, stmt3)
+ | Clight.Sreturn (Some _), e :: _, _ -> Clight.Sreturn (Some e)
+ | Clight.Sswitch (_, lbl_stmts), e :: _, _ ->
+ Clight.Sswitch (e, labeled_statements_fill_subs lbl_stmts sub_statements)
+ | Clight.Slabel (lbl, _), _, stmt :: _ -> Clight.Slabel (lbl, stmt)
+ | Clight.Scost (lbl, _), _, stmt :: _ -> Clight.Scost (lbl, stmt)
+ | _ -> assert false (* wrong arguments, do not use on these values *)
+
+let rec statement f_ctype f_expr f_expr_descr f_statement stmt =
+ let (sub_exprs, sub_stmts) = statement_subs stmt in
+ let sub_exprs_res = List.map (expr f_ctype f_expr f_expr_descr) sub_exprs in
+ let sub_stmts_res =
+ List.map (statement f_ctype f_expr f_expr_descr f_statement) sub_stmts in
+ f_statement stmt sub_exprs_res sub_stmts_res
+
+let rec statement2 f_expr f_statement stmt =
+ let (sub_exprs, sub_stmts) = statement_subs stmt in
+ let sub_exprs_res = List.map (expr2 f_expr) sub_exprs in
+ let sub_stmts_res = List.map (statement2 f_expr f_statement) sub_stmts in
+ f_statement stmt sub_exprs_res sub_stmts_res
--- /dev/null
+
+(** This module provides folding functions over the constructors of the
+ [Clight]'s AST. *)
+
+val ctype_fill_subs : Clight.ctype -> Clight.ctype list -> Clight.ctype
+
+val ctype : (Clight.ctype -> 'a list -> 'a) -> Clight.ctype -> 'a
+
+val expr_fill_subs :
+ Clight.expr -> Clight.ctype list -> Clight.expr_descr list ->
+ Clight.expr
+
+val expr_fill_exprs :
+ Clight.expr -> Clight.expr list -> Clight.expr
+
+val expr :
+ (Clight.ctype -> 'a list -> 'a) ->
+ (Clight.expr -> 'a list -> 'b list -> 'c) ->
+ (Clight.expr_descr -> 'a list -> 'c list -> 'b) ->
+ Clight.expr ->
+ 'c
+
+val expr2 :
+ (Clight.expr -> 'a list -> 'a) -> Clight.expr -> 'a
+
+val expr_descr_subs :
+ Clight.expr_descr -> Clight.ctype list * Clight.expr list
+
+val expr_descr_fill_subs :
+ Clight.expr_descr -> Clight.ctype list -> Clight.expr list ->
+ Clight.expr_descr
+
+val expr_descr :
+ (Clight.ctype -> 'a list -> 'a) ->
+ (Clight.expr -> 'a list -> 'b list -> 'c) ->
+ (Clight.expr_descr -> 'a list -> 'c list -> 'b) ->
+ Clight.expr_descr ->
+ 'b
+
+val statement_subs :
+ Clight.statement ->
+ (Clight.expr list * Clight.statement list)
+
+val statement_sub_exprs : Clight.statement -> Clight.expr list
+
+val statement_fill_subs :
+ Clight.statement -> Clight.expr list -> Clight.statement list ->
+ Clight.statement
+
+val statement :
+ (Clight.ctype -> 'a list -> 'a) ->
+ (Clight.expr -> 'a list -> 'b list -> 'c) ->
+ (Clight.expr_descr -> 'a list -> 'c list -> 'b) ->
+ (Clight.statement -> 'c list -> 'd list -> 'd) ->
+ Clight.statement ->
+ 'd
+
+val statement2 :
+ (Clight.expr -> 'a list -> 'a) ->
+ (Clight.statement -> 'a list -> 'b list -> 'b) ->
+ Clight.statement ->
+ 'b
--- /dev/null
+open Printf
+
+open Cparser
+open Cparser.C
+open Cparser.Env
+
+open Clight
+
+(** Extract the type part of a type-annotated Clight expression. *)
+
+let typeof e = match e with Expr(_,te) -> te
+
+(** Natural alignment of a type, in bytes. *)
+let rec alignof = function
+ | Tvoid -> 1
+ | Tint (I8,_) -> 1
+ | Tint (I16,_) -> 2
+ | Tint (I32,_) -> 4
+ | Tfloat F32 -> 4
+ | Tfloat F64 -> 8
+ | Tpointer _ -> 4
+ | Tarray (t',n) -> alignof t'
+ | Tfunction (_,_) -> 1
+ | Tstruct (_,fld) -> alignof_fields fld
+ | Tunion (_,fld) -> alignof_fields fld
+ | Tcomp_ptr _ -> 4
+and alignof_fields = function
+ | [] -> 1
+ | (id,t)::f' -> max (alignof t) (alignof_fields f')
+
+(** Size of a type, in bytes. *)
+
+let align n amount =
+ ((n + amount - 1) / amount) * amount
+
+let rec sizeof t =
+ match t with
+ | Tvoid -> 1
+ | Tint (I8,_) -> 1
+ | Tint (I16,_) -> 2
+ | Tint (I32,_) -> 4
+ | Tfloat F32 -> 4
+ | Tfloat F64 -> 8
+ | Tpointer _ -> 4
+ | Tarray (t',n) -> sizeof t' * max 1 n
+ | Tfunction (_,_) -> 1
+ | Tstruct (_,fld) -> align (max 1 (sizeof_struct fld 0)) (alignof t)
+ | Tunion (_,fld) -> align (max 1 (sizeof_union fld)) (alignof t)
+ | Tcomp_ptr _ -> 4
+and sizeof_struct fld pos =
+ match fld with
+ | [] -> pos
+ | (id,t)::fld' -> sizeof_struct fld' (align pos (alignof t) + sizeof t)
+and sizeof_union = function
+ | [] -> 0
+ | (id,t)::fld' -> max (sizeof t) (sizeof_union fld')
+
+(** Record the declarations of global variables and associate them
+ with the corresponding atom. *)
+
+let decl_atom : (AST.ident, Env.t * C.decl) Hashtbl.t = Hashtbl.create 103
+
+(** Hooks -- overriden in machine-dependent CPragmas module *)
+
+let process_pragma_hook = ref (fun (s: string) -> false)
+let define_variable_hook = ref (fun (id: AST.ident) (d: C.decl) -> ())
+let define_function_hook = ref (fun (id: AST.ident) (d: C.decl) -> ())
+let define_stringlit_hook = ref (fun (id: AST.ident) -> ())
+
+(** ** Error handling *)
+
+let currentLocation = ref Cutil.no_loc
+
+let updateLoc l = currentLocation := l
+
+let numErrors = ref 0
+
+let error msg =
+ incr numErrors;
+ eprintf "%aError: %s\n" Cutil.printloc !currentLocation msg
+
+let unsupported msg =
+ incr numErrors;
+ eprintf "%aUnsupported feature: %s\n" Cutil.printloc !currentLocation msg
+
+let warning msg =
+ eprintf "%aWarning: %s\n" Cutil.printloc !currentLocation msg
+
+
+(** ** Functions used to handle string literals *)
+
+let stringNum = ref 0 (* number of next global for string literals *)
+let stringTable = Hashtbl.create 47
+
+let name_for_string_literal env s =
+ try
+ Hashtbl.find stringTable s
+ with Not_found ->
+ incr stringNum;
+ let name = Printf.sprintf "__stringlit_%d" !stringNum in
+ let id = name in
+ Hashtbl.add decl_atom id
+ (env, (C.Storage_static,
+ Env.fresh_ident name,
+ C.TPtr(C.TInt(C.IChar,[C.AConst]),[]),
+ None));
+ !define_stringlit_hook id;
+ Hashtbl.add stringTable s id;
+ id
+
+let typeStringLiteral s =
+ Tarray(Tint(I8, AST.Unsigned), String.length s + 1)
+
+let global_for_string s id =
+ let init = ref [] in
+ let add_char c =
+ init :=
+ Init_int8(Char.code c)
+ :: !init in
+ add_char '\000';
+ for i = String.length s - 1 downto 0 do add_char s.[i] done;
+ ((id, !init), typeStringLiteral s)
+
+let globals_for_strings globs =
+ Hashtbl.fold
+ (fun s id l -> global_for_string s id :: l)
+ stringTable globs
+
+(** ** Handling of stubs for variadic functions *)
+
+let stub_function_table = Hashtbl.create 47
+
+let register_stub_function name tres targs =
+ let rec letters_of_type = function
+ | [] -> []
+ | Tfloat(_)::tl -> "f" :: letters_of_type tl
+ | _::tl -> "i" :: letters_of_type tl in
+ let stub_name =
+ name ^ "$" ^ String.concat "" (letters_of_type targs) in
+ try
+ (stub_name, Hashtbl.find stub_function_table stub_name)
+ with Not_found ->
+ let rec types_of_types = function
+ | [] -> []
+ | Tfloat(_)::tl -> Tfloat(F64)::(types_of_types tl)
+ | _::tl -> Tpointer(Tvoid)::(types_of_types tl) in
+ let stub_type = Tfunction (types_of_types targs, tres) in
+ Hashtbl.add stub_function_table stub_name stub_type;
+ (stub_name, stub_type)
+
+let declare_stub_function stub_name stub_type =
+ match stub_type with
+ | Tfunction(targs, tres) ->
+ (stub_name,
+ External(stub_name, targs, tres))
+ | _ -> assert false
+
+let declare_stub_functions k =
+ Hashtbl.fold
+ (fun n i k -> declare_stub_function n i :: k)
+ stub_function_table k
+
+(** ** Translation functions *)
+
+(** Constants *)
+
+let convertInt n = Int64.to_int n
+
+(** Types *)
+
+let convertIkind = function
+ | C.IBool -> unsupported "'_Bool' type"; (AST.Unsigned, I8)
+ | C.IChar -> (AST.Unsigned, I8)
+ | C.ISChar -> (AST.Signed, I8)
+ | C.IUChar -> (AST.Unsigned, I8)
+ | C.IInt -> (AST.Signed, I32)
+ | C.IUInt -> (AST.Unsigned, I32)
+ | C.IShort -> (AST.Signed, I16)
+ | C.IUShort -> (AST.Unsigned, I16)
+ | C.ILong -> (AST.Signed, I32)
+ | C.IULong -> (AST.Unsigned, I32)
+ | C.ILongLong ->
+ if not !ClightFlags.option_flonglong then unsupported "'long long' type";
+ (AST.Signed, I32)
+ | C.IULongLong ->
+ if not !ClightFlags.option_flonglong then unsupported "'unsigned long long' type";
+ (AST.Unsigned, I32)
+
+let convertFkind = function
+ | C.FFloat -> F32
+ | C.FDouble -> F64
+ | C.FLongDouble ->
+ if not !ClightFlags.option_flonglong then unsupported "'long double' type";
+ F64
+
+let convertTyp env t =
+
+ let rec convertTyp seen t =
+ match Cutil.unroll env t with
+ | C.TVoid a -> Tvoid
+ | C.TInt(ik, a) ->
+ let (sg, sz) = convertIkind ik in Tint(sz, sg)
+ | C.TFloat(fk, a) ->
+ Tfloat(convertFkind fk)
+ | C.TPtr(C.TStruct(id, _), _) when List.mem id seen ->
+ Tcomp_ptr("struct " ^ id.name)
+ | C.TPtr(C.TUnion(id, _), _) when List.mem id seen ->
+ Tcomp_ptr("union " ^ id.name)
+ | C.TPtr(ty, a) ->
+ Tpointer(convertTyp seen ty)
+ | C.TArray(ty, None, a) ->
+ (* Cparser verified that the type ty[] occurs only in
+ contexts that are safe for Clight, so just treat as ty[0]. *)
+ (* warning "array type of unspecified size"; *)
+ Tarray(convertTyp seen ty, 0)
+ | C.TArray(ty, Some sz, a) ->
+ Tarray(convertTyp seen ty, convertInt sz )
+ | C.TFun(tres, targs, va, a) ->
+ if va then unsupported "variadic function type";
+ if Cutil.is_composite_type env tres then
+ unsupported "return type is a struct or union";
+ Tfunction(begin match targs with
+ | None -> warning "un-prototyped function type"; []
+ | Some tl -> convertParams seen tl
+ end,
+ convertTyp seen tres)
+ | C.TNamed _ ->
+ assert false
+ | C.TStruct(id, a) ->
+ let flds =
+ try
+ convertFields (id :: seen) (Env.find_struct env id)
+ with Env.Error e ->
+ error (Env.error_message e); [] in
+ Tstruct("struct " ^ id.name, flds)
+ | C.TUnion(id, a) ->
+ let flds =
+ try
+ convertFields (id :: seen) (Env.find_union env id)
+ with Env.Error e ->
+ error (Env.error_message e); [] in
+ Tunion("union " ^ id.name, flds)
+
+ and convertParams seen = function
+ | [] -> []
+ | (id, ty) :: rem ->
+ if Cutil.is_composite_type env ty then
+ unsupported "function parameter of struct or union type";
+ (convertTyp seen ty)::(convertParams seen rem)
+
+ and convertFields seen ci =
+ convertFieldList seen ci.Env.ci_members
+
+ and convertFieldList seen = function
+ | [] -> []
+ | f :: fl ->
+ if f.fld_bitfield <> None then
+ unsupported "bit field in struct or union";
+ (f.fld_name, convertTyp seen f.fld_typ)::(
+ convertFieldList seen fl)
+
+ in convertTyp [] t
+
+let rec convertTypList env = function
+ | [] -> []
+ | t1 :: tl -> (convertTyp env t1 )::( convertTypList env tl)
+
+(** Expressions *)
+
+let ezero = Expr(Econst_int(0), Tint(I32, AST.Signed))
+
+let rec convertExpr env e =
+ let ty = convertTyp env e.etyp in
+ match e.edesc with
+ | C.EConst(C.CInt(i, _, _)) ->
+ Expr(Econst_int( convertInt i), ty)
+ | C.EConst(C.CFloat(f, _, _)) ->
+ Expr(Econst_float f, ty)
+ | C.EConst(C.CStr s) ->
+ Expr(Evar(name_for_string_literal env s), typeStringLiteral s)
+ | C.EConst(C.CWStr s) ->
+ unsupported "wide string literal"; ezero
+ | C.EConst(C.CEnum(id, i)) ->
+ Expr(Econst_int(convertInt i), ty)
+
+ | C.ESizeof ty1 ->
+ Expr(Esizeof(convertTyp env ty1), ty)
+ | C.EVar id ->
+ Expr(Evar(id.name), ty)
+
+ | C.EUnop(C.Oderef, e1) ->
+ Expr(Ederef(convertExpr env e1), ty)
+ | C.EUnop(C.Oaddrof, e1) ->
+ Expr(Eaddrof(convertExpr env e1), ty)
+ | C.EUnop(C.Odot id, e1) ->
+ Expr(Efield(convertExpr env e1, id), ty)
+ | C.EUnop(C.Oarrow id, e1) ->
+ let e1' = convertExpr env e1 in
+ let ty1 =
+ match typeof e1' with
+ | Tpointer t -> t
+ | _ -> error ("wrong type for ->" ^ id ^ " access"); Tvoid in
+ Expr(Efield(Expr(Ederef(convertExpr env e1), ty1),
+ id), ty)
+ | C.EUnop(C.Oplus, e1) ->
+ convertExpr env e1
+ | C.EUnop(C.Ominus, e1) ->
+ Expr(Eunop(Oneg, convertExpr env e1), ty)
+ | C.EUnop(C.Olognot, e1) ->
+ Expr(Eunop(Onotbool, convertExpr env e1), ty)
+ | C.EUnop(C.Onot, e1) ->
+ Expr(Eunop(Onotint, convertExpr env e1), ty)
+ | C.EUnop(_, _) ->
+ unsupported "pre/post increment/decrement operator"; ezero
+
+ | C.EBinop(C.Oindex, e1, e2, _) ->
+ Expr(Ederef(Expr(Ebinop(Oadd, convertExpr env e1, convertExpr env e2),
+ Tpointer ty)), ty)
+ | C.EBinop(C.Ologand, e1, e2, _) ->
+ Expr(Eandbool(convertExpr env e1, convertExpr env e2), ty)
+ | C.EBinop(C.Ologor, e1, e2, _) ->
+ Expr(Eorbool(convertExpr env e1, convertExpr env e2), ty)
+ | C.EBinop(op, e1, e2, _) ->
+ let op' =
+ match op with
+ | C.Oadd -> Oadd
+ | C.Osub -> Osub
+ | C.Omul -> Omul
+ | C.Odiv -> Odiv
+ | C.Omod -> Omod
+ | C.Oand -> Oand
+ | C.Oor -> Oor
+ | C.Oxor -> Oxor
+ | C.Oshl -> Oshl
+ | C.Oshr -> Oshr
+ | C.Oeq -> Oeq
+ | C.One -> One
+ | C.Olt -> Olt
+ | C.Ogt -> Ogt
+ | C.Ole -> Ole
+ | C.Oge -> Oge
+ | C.Ocomma -> unsupported "sequence operator"; Oadd
+ | _ -> unsupported "assignment operator"; Oadd in
+ Expr(Ebinop(op', convertExpr env e1, convertExpr env e2), ty)
+ | C.EConditional(e1, e2, e3) ->
+ Expr(Econdition(convertExpr env e1, convertExpr env e2, convertExpr env e3), ty)
+ | C.ECast(ty1, e1) ->
+ Expr(Ecast(convertTyp env ty1, convertExpr env e1), ty)
+ | C.ECall _ ->
+ unsupported "function call within expression"; ezero
+
+(* Function calls *)
+
+let rec projFunType env ty =
+ match Cutil.unroll env ty with
+ | TFun(res, args, vararg, attr) -> Some(res, vararg)
+ | TPtr(ty', attr) -> projFunType env ty'
+ | _ -> None
+
+let convertFuncall env lhs fn args =
+ match projFunType env fn.etyp with
+ | None ->
+ error "wrong type for function part of a call"; Sskip
+ | Some(res, false) ->
+ (* Non-variadic function *)
+ Scall(lhs, convertExpr env fn, List.map (convertExpr env) args)
+ | Some(res, true) ->
+ (* Variadic function: generate a call to a stub function with
+ the appropriate number and types of arguments. Works only if
+ the function expression e is a global variable. *)
+ let fun_name =
+ match fn with
+ | {edesc = C.EVar id} when !ClightFlags.option_fvararg_calls ->
+ (*warning "emulating call to variadic function"; *)
+ id.name
+ | _ ->
+ unsupported "call to variadic function";
+ "<error>" in
+ let targs = convertTypList env (List.map (fun e -> e.etyp) args) in
+ let tres = convertTyp env res in
+ let (stub_fun_name, stub_fun_typ) =
+ register_stub_function fun_name tres targs in
+ Scall(lhs,
+ Expr(Evar( stub_fun_name), stub_fun_typ),
+ List.map (convertExpr env) args)
+
+(* Handling of volatile *)
+
+let is_volatile_access env e =
+ List.mem C.AVolatile (Cutil.attributes_of_type env e.etyp)
+ && Cutil.is_lvalue env e
+
+let volatile_fun_suffix_type ty =
+ match ty with
+ | Tint(I8, AST.Unsigned) -> ("int8unsigned", ty)
+ | Tint(I8, AST.Signed) -> ("int8signed", ty)
+ | Tint(I16, AST.Unsigned) -> ("int16unsigned", ty)
+ | Tint(I16, AST.Signed) -> ("int16signed", ty)
+ | Tint(I32, _) -> ("int32", Tint(I32, AST.Signed))
+ | Tfloat F32 -> ("float32", ty)
+ | Tfloat F64 -> ("float64", ty)
+ | Tpointer _ | Tarray _ | Tfunction _ | Tcomp_ptr _ ->
+ ("pointer", Tpointer Tvoid)
+ | _ ->
+ unsupported "operation on volatile struct or union"; ("", Tvoid)
+
+let volatile_read_fun ty =
+ let (suffix, ty') = volatile_fun_suffix_type ty in
+ Expr(Evar( ("__builtin_volatile_read_" ^ suffix)),
+ Tfunction((Tpointer Tvoid)::[], ty'))
+
+let volatile_write_fun ty =
+ let (suffix, ty') = volatile_fun_suffix_type ty in
+ Expr(Evar( ("__builtin_volatile_write_" ^ suffix)),
+ Tfunction((Tpointer Tvoid)::(ty'::[]), Tvoid))
+
+(* Toplevel expression, argument of an Sdo *)
+
+let convertTopExpr env e =
+ match e.edesc with
+ | C.EBinop(C.Oassign, lhs, {edesc = C.ECall(fn, args)}, _) ->
+ convertFuncall env (Some (convertExpr env lhs)) fn args
+ | C.EBinop(C.Oassign, lhs, rhs, _) ->
+ if Cutil.is_composite_type env lhs.etyp then
+ unsupported "assignment between structs or between unions";
+ let lhs' = convertExpr env lhs
+ and rhs' = convertExpr env rhs in
+ begin match (is_volatile_access env lhs, is_volatile_access env rhs) with
+ | true, true -> (* should not happen *)
+ unsupported "volatile-to-volatile assignment";
+ Sskip
+ | false, true -> (* volatile read *)
+ Scall(Some lhs',
+ volatile_read_fun (typeof rhs'),
+ [ Expr (Eaddrof rhs', Tpointer (typeof rhs')) ])
+ | true, false -> (* volatile write *)
+ Scall(None,
+ volatile_write_fun (typeof lhs'),
+ [ Expr(Eaddrof lhs', Tpointer (typeof lhs')); rhs' ])
+ | false, false -> (* regular assignment *)
+ Sassign(convertExpr env lhs, convertExpr env rhs)
+ end
+ | C.ECall(fn, args) ->
+ convertFuncall env None fn args
+ | _ ->
+ unsupported "illegal toplevel expression"; Sskip
+
+(* Separate the cases of a switch statement body *)
+
+type switchlabel =
+ | Case of C.exp
+ | Default
+
+type switchbody =
+ | Label of switchlabel
+ | Stmt of C.stmt
+
+let rec flattenSwitch = function
+ | {sdesc = C.Sseq(s1, s2)} ->
+ flattenSwitch s1 @ flattenSwitch s2
+ | {sdesc = C.Slabeled(C.Scase e, s1)} ->
+ Label(Case e) :: flattenSwitch s1
+ | {sdesc = C.Slabeled(C.Sdefault, s1)} ->
+ Label Default :: flattenSwitch s1
+ | s ->
+ [Stmt s]
+
+let rec groupSwitch = function
+ | [] ->
+ (Cutil.sskip, [])
+ | Label case :: rem ->
+ let (fst, cases) = groupSwitch rem in
+ (Cutil.sskip, (case, fst) :: cases)
+ | Stmt s :: rem ->
+ let (fst, cases) = groupSwitch rem in
+ (Cutil.sseq s.sloc s fst, cases)
+
+(* Statement *)
+
+let rec convertStmt env s =
+ updateLoc s.sloc;
+ match s.sdesc with
+ | C.Sskip ->
+ Sskip
+ | C.Sdo e ->
+ convertTopExpr env e
+ | C.Sseq(s1, s2) ->
+ Ssequence(convertStmt env s1, convertStmt env s2)
+ | C.Sif(e, s1, s2) ->
+ Sifthenelse(convertExpr env e, convertStmt env s1, convertStmt env s2)
+ | C.Swhile(e, s1) ->
+ Swhile(convertExpr env e, convertStmt env s1)
+ | C.Sdowhile(s1, e) ->
+ Sdowhile(convertExpr env e, convertStmt env s1)
+ | C.Sfor(s1, e, s2, s3) ->
+ Sfor(convertStmt env s1, convertExpr env e, convertStmt env s2,
+ convertStmt env s3)
+ | C.Sbreak ->
+ Sbreak
+ | C.Scontinue ->
+ Scontinue
+ | C.Sswitch(e, s1) ->
+ let (init, cases) = groupSwitch (flattenSwitch s1) in
+ if cases = [] then
+ unsupported "ill-formed 'switch' statement";
+ if init.sdesc <> C.Sskip then
+ warning "ignored code at beginning of 'switch'";
+ Sswitch(convertExpr env e, convertSwitch env cases)
+ | C.Slabeled(C.Slabel lbl, s1) ->
+ Slabel( lbl, convertStmt env s1)
+ | C.Slabeled(C.Scase _, _) ->
+ unsupported "'case' outside of 'switch'"; Sskip
+ | C.Slabeled(C.Sdefault, _) ->
+ unsupported "'default' outside of 'switch'"; Sskip
+ | C.Sgoto lbl ->
+ Sgoto( lbl)
+ | C.Sreturn None ->
+ Sreturn None
+ | C.Sreturn(Some e) ->
+ Sreturn(Some(convertExpr env e))
+ | C.Sblock _ ->
+ unsupported "nested blocks"; Sskip
+ | C.Sdecl _ ->
+ unsupported "inner declarations"; Sskip
+
+and convertSwitch env = function
+ | [] ->
+ LSdefault Sskip
+ | [Default, s] ->
+ LSdefault (convertStmt env s)
+ | (Default, s) :: _ ->
+ updateLoc s.sloc;
+ unsupported "'default' case must occur last";
+ LSdefault Sskip
+ | (Case e, s) :: rem ->
+ updateLoc s.sloc;
+ let v =
+ match Ceval.integer_expr env e with
+ | None -> unsupported "'case' label is not a compile-time integer"; 0L
+ | Some v -> v in
+ LScase(convertInt v,
+ convertStmt env s,
+ convertSwitch env rem)
+
+(** Function definitions *)
+
+let convertFundef env fd =
+ if Cutil.is_composite_type env fd.fd_ret then
+ unsupported "function returning a struct or union";
+ let ret =
+ convertTyp env fd.fd_ret in
+ let params =
+ List.map
+ (fun (id, ty) ->
+ if Cutil.is_composite_type env ty then
+ unsupported "function parameter of struct or union type";
+ ( id.name, convertTyp env ty))
+ fd.fd_params in
+ let vars =
+ List.map
+ (fun (sto, id, ty, init) ->
+ if sto = Storage_extern || sto = Storage_static then
+ unsupported "'static' or 'extern' local variable";
+ if init <> None then
+ unsupported "initialized local variable";
+ ( id.name, convertTyp env ty))
+ fd.fd_locals in
+ let body' = convertStmt env fd.fd_body in
+ let id' = fd.fd_name.name in
+ let decl =
+ (fd.fd_storage, fd.fd_name, Cutil.fundef_typ fd, None) in
+ Hashtbl.add decl_atom id' (env, decl);
+ !define_function_hook id' decl;
+ (id',
+ Internal {fn_return = ret; fn_params = params;
+ fn_vars = vars; fn_body = body'})
+
+(** External function declaration *)
+
+let convertFundecl env (sto, id, ty, optinit) =
+ match convertTyp env ty with
+ | Tfunction(args, res) ->
+ let id' = id.name in
+ (id', External(id', args, res))
+ | _ ->
+ assert false
+
+(** Initializers *)
+
+let init_data_of_string s =
+ let id = ref [] in
+ let enter_char c =
+ let n = (Char.code c) in
+ id := Init_int8 n :: !id in
+ enter_char '\000';
+ for i = String.length s - 1 downto 0 do enter_char s.[i] done;
+ !id
+
+let convertInit env ty init =
+
+ let k = ref []
+ and pos = ref 0 in
+ let emit size datum =
+ k := datum :: !k;
+ pos := !pos + size in
+ let emit_space size =
+ emit size (Init_space size) in
+ let align size =
+ let n = !pos land (size - 1) in
+ if n > 0 then emit_space (size - n) in
+ let check_align size =
+ assert (!pos land (size - 1) = 0) in
+
+ let rec reduceInitExpr = function
+ | { edesc = C.EVar id; etyp = ty } ->
+ begin match Cutil.unroll env ty with
+ | C.TArray _ | C.TFun _ -> Some id
+ | _ -> None
+ end
+ | {edesc = C.EUnop(C.Oaddrof, {edesc = C.EVar id})} -> Some id
+ | {edesc = C.ECast(ty, e)} -> reduceInitExpr e
+ | _ -> None in
+
+ let rec cvtInit ty = function
+ | Init_single e ->
+ begin match reduceInitExpr e with
+ | Some id ->
+ check_align 4;
+ emit 4 (Init_addrof( id.name, 0))
+ | None ->
+ match Ceval.constant_expr env ty e with
+ | Some(C.CInt(v, ik, _)) ->
+ begin match convertIkind ik with
+ | (_, I8) ->
+ emit 1 (Init_int8(convertInt v))
+ | (_, I16) ->
+ check_align 2;
+ emit 2 (Init_int16(convertInt v))
+ | (_, I32) ->
+ check_align 4;
+ emit 4 (Init_int32(convertInt v))
+ end
+ | Some(C.CFloat(v, fk, _)) ->
+ begin match convertFkind fk with
+ | F32 ->
+ check_align 4;
+ emit 4 (Init_float32 v)
+ | F64 ->
+ check_align 8;
+ emit 8 (Init_float64 v)
+ end
+ | Some(C.CStr s) ->
+ check_align 4;
+ let id = name_for_string_literal env s in
+ emit 4 (Init_addrof(id, 0))
+ | Some(C.CWStr _) ->
+ unsupported "wide character strings"
+ | Some(C.CEnum _) ->
+ error "enum tag after constant folding"
+ | None ->
+ error "initializer is not a compile-time constant"
+ end
+ | Init_array il ->
+ let ty_elt =
+ match Cutil.unroll env ty with
+ | C.TArray(t, _, _) -> t
+ | _ -> error "array type expected in initializer"; C.TVoid [] in
+ List.iter (cvtInit ty_elt) il
+ | Init_struct(_, flds) ->
+ cvtPadToSizeof ty (fun () -> List.iter cvtFieldInit flds)
+ | Init_union(_, fld, i) ->
+ cvtPadToSizeof ty (fun () -> cvtFieldInit (fld,i))
+
+ and cvtFieldInit (fld, i) =
+ let ty' = convertTyp env fld.fld_typ in
+ let al = alignof ty' in
+ align al;
+ cvtInit fld.fld_typ i
+
+ and cvtPadToSizeof ty fn =
+ let ty' = convertTyp env ty in
+ let sz = sizeof ty' in
+ let pos0 = !pos in
+ fn();
+ let pos1 = !pos in
+ assert (pos1 <= pos0 + sz);
+ if pos1 < pos0 + sz then emit_space (pos0 + sz - pos1)
+
+ in cvtInit ty init; List.rev !k
+
+(** Global variable *)
+
+let convertGlobvar env (sto, id, ty, optinit as decl) =
+ let id' = id.name in
+ let ty' = convertTyp env ty in
+ let init' =
+ match optinit with
+ | None ->
+ if sto = C.Storage_extern then [] else [Init_space(sizeof ty')]
+ | Some i ->
+ convertInit env ty i in
+ Hashtbl.add decl_atom id' (env, decl);
+ !define_variable_hook id' decl;
+ ((id', init'), ty')
+
+(** Convert a list of global declarations.
+ Result is a pair [(funs, vars)] where [funs] are
+ the function definitions (internal and external)
+ and [vars] the variable declarations. *)
+
+let rec convertGlobdecls env funs vars gl =
+ match gl with
+ | [] -> (List.rev funs, List.rev vars)
+ | g :: gl' ->
+ updateLoc g.gloc;
+ match g.gdesc with
+ | C.Gdecl((sto, id, ty, optinit) as d) ->
+ (* Prototyped functions become external declarations.
+ Variadic functions are skipped.
+ Other types become variable declarations. *)
+ begin match Cutil.unroll env ty with
+ | TFun(_, Some _, false, _) ->
+ convertGlobdecls env (convertFundecl env d :: funs) vars gl'
+ | TFun(_, None, false, _) ->
+ error "function declaration without prototype";
+ convertGlobdecls env funs vars gl'
+ | TFun(_, _, true, _) ->
+ convertGlobdecls env funs vars gl'
+ | _ ->
+ convertGlobdecls env funs (convertGlobvar env d :: vars) gl'
+ end
+ | C.Gfundef fd ->
+ convertGlobdecls env (convertFundef env fd :: funs) vars gl'
+ | C.Gcompositedecl _ | C.Gcompositedef _
+ | C.Gtypedef _ | C.Genumdef _ ->
+ (* typedefs are unrolled, structs are expanded inline, and
+ enum tags are folded. So we just skip their declarations. *)
+ convertGlobdecls env funs vars gl'
+ | C.Gpragma s ->
+ if not (!process_pragma_hook s) then
+ warning ("'#pragma " ^ s ^ "' directive ignored");
+ convertGlobdecls env funs vars gl'
+
+(** Build environment of typedefs and structs *)
+
+let rec translEnv env = function
+ | [] -> env
+ | g :: gl ->
+ let env' =
+ match g.gdesc with
+ | C.Gcompositedecl(su, id) ->
+ Env.add_composite env id (Cutil.composite_info_decl env su)
+ | C.Gcompositedef(su, id, fld) ->
+ Env.add_composite env id (Cutil.composite_info_def env su fld)
+ | C.Gtypedef(id, ty) ->
+ Env.add_typedef env id ty
+ | _ ->
+ env in
+ translEnv env' gl
+
+(** Eliminate forward declarations of globals that are defined later. *)
+
+module IdentSet = Set.Make(struct type t = C.ident let compare = compare end)
+
+let cleanupGlobals p =
+
+ let rec clean defs accu = function
+ | [] -> accu
+ | g :: gl ->
+ updateLoc g.gloc;
+ match g.gdesc with
+ | C.Gdecl(sto, id, ty, None) ->
+ if IdentSet.mem id defs
+ then clean defs accu gl
+ else clean (IdentSet.add id defs) (g :: accu) gl
+ | C.Gdecl(_, id, ty, _) ->
+ if IdentSet.mem id defs then
+ error ("multiple definitions of " ^ id.name);
+ clean (IdentSet.add id defs) (g :: accu) gl
+ | C.Gfundef fd ->
+ if IdentSet.mem fd.fd_name defs then
+ error ("multiple definitions of " ^ fd.fd_name.name);
+ clean (IdentSet.add fd.fd_name defs) (g :: accu) gl
+ | _ ->
+ clean defs (g :: accu) gl
+
+ in clean IdentSet.empty [] (List.rev p)
+
+(** Convert a [C.program] into a [Csyntax.program] *)
+
+let convertProgram p =
+ numErrors := 0;
+ stringNum := 0;
+ Hashtbl.clear decl_atom;
+ Hashtbl.clear stringTable;
+ Hashtbl.clear stub_function_table;
+ (* Hack: externals are problematic for Cerco. TODO *)
+ let p = (* Builtins.declarations() @ *) p in
+ try
+ let (funs1, vars1) =
+ convertGlobdecls (translEnv Env.empty p) [] [] (cleanupGlobals p) in
+ let funs2 = declare_stub_functions funs1 in
+ let main = if List.mem_assoc "main" funs2 then Some "main" else None in
+ let vars2 = globals_for_strings vars1 in
+ if !numErrors > 0
+ then None
+ else Some { prog_funct = funs2;
+ prog_vars = vars2;
+ prog_main = main }
+ with Env.Error msg ->
+ error (Env.error_message msg); None
+
+(** ** Extracting information about global variables from their atom *)
+
+let rec type_is_readonly env t =
+ let a = Cutil.attributes_of_type env t in
+ if List.mem C.AVolatile a then false else
+ if List.mem C.AConst a then true else
+ match Cutil.unroll env t with
+ | C.TArray(t', _, _) -> type_is_readonly env t'
+ | _ -> false
+
+let atom_is_static a =
+ try
+ let (env, (sto, id, ty, init)) = Hashtbl.find decl_atom a in
+ sto = C.Storage_static
+ with Not_found ->
+ false
+
+let atom_is_readonly a =
+ try
+ let (env, (sto, id, ty, init)) = Hashtbl.find decl_atom a in
+ type_is_readonly env ty
+ with Not_found ->
+ false
+
+let atom_sizeof a =
+ try
+ let (env, (sto, id, ty, init)) = Hashtbl.find decl_atom a in
+ Cutil.sizeof env ty
+ with Not_found ->
+ None
+
+let atom_alignof a =
+ try
+ let (env, (sto, id, ty, init)) = Hashtbl.find decl_atom a in
+ Cutil.alignof env ty
+ with Not_found ->
+ None
+
+(** ** The builtin environment *)
+
+open Builtins
+
+let builtins_generic = {
+ typedefs = [
+ (* keeps GCC-specific headers happy, harmless for others *)
+ "__builtin_va_list", C.TPtr(C.TVoid [], [])
+ ];
+ functions = [
+ (* The volatile read/volatile write functions *)
+ "__builtin_volatile_read_int8unsigned",
+ (TInt(IUChar, []), [TPtr(TVoid [], [])], false);
+ "__builtin_volatile_read_int8signed",
+ (TInt(ISChar, []), [TPtr(TVoid [], [])], false);
+ "__builtin_volatile_read_int16unsigned",
+ (TInt(IUShort, []), [TPtr(TVoid [], [])], false);
+ "__builtin_volatile_read_int16signed",
+ (TInt(IShort, []), [TPtr(TVoid [], [])], false);
+ "__builtin_volatile_read_int32",
+ (TInt(IInt, []), [TPtr(TVoid [], [])], false);
+ "__builtin_volatile_read_float32",
+ (TFloat(FFloat, []), [TPtr(TVoid [], [])], false);
+ "__builtin_volatile_read_float64",
+ (TFloat(FDouble, []), [TPtr(TVoid [], [])], false);
+ "__builtin_volatile_read_pointer",
+ (TPtr(TVoid [], []), [TPtr(TVoid [], [])], false);
+ "__builtin_volatile_write_int8unsigned",
+ (TVoid [], [TPtr(TVoid [], []); TInt(IUChar, [])], false);
+ "__builtin_volatile_write_int8signed",
+ (TVoid [], [TPtr(TVoid [], []); TInt(ISChar, [])], false);
+ "__builtin_volatile_write_int16unsigned",
+ (TVoid [], [TPtr(TVoid [], []); TInt(IUShort, [])], false);
+ "__builtin_volatile_write_int16signed",
+ (TVoid [], [TPtr(TVoid [], []); TInt(IShort, [])], false);
+ "__builtin_volatile_write_int32",
+ (TVoid [], [TPtr(TVoid [], []); TInt(IInt, [])], false);
+ "__builtin_volatile_write_float32",
+ (TVoid [], [TPtr(TVoid [], []); TFloat(FFloat, [])], false);
+ "__builtin_volatile_write_float64",
+ (TVoid [], [TPtr(TVoid [], []); TFloat(FDouble, [])], false);
+ "__builtin_volatile_write_pointer",
+ (TVoid [], [TPtr(TVoid [], []); TPtr(TVoid [], [])], false)
+ ]
+}
+
+(* Add processor-dependent builtins *)
+
+let builtins =
+ { typedefs = builtins_generic.typedefs @ CBuiltins.builtins.typedefs;
+ functions = builtins_generic.functions @ CBuiltins.builtins.functions
+ }
--- /dev/null
+module Mem = Driver.ClightMemory
+module Value = Driver.ClightMemory.Value
+module LocalEnv = Map.Make(String)
+type localEnv = Value.address LocalEnv.t
+type memory = Clight.fundef Mem.memory
+
+open Clight
+open AST
+
+
+let error_prefix = "Clight interpret"
+let error s = Error.global_error error_prefix s
+let warning s = Error.warning error_prefix s
+let error_float () = error "float not supported."
+
+
+(* Helpers *)
+
+let value_of_address = List.hd
+let address_of_value v = [v]
+
+
+(* State of execution *)
+
+type continuation =
+ | Kstop
+ | Kseq of statement*continuation
+ | Kwhile of expr*statement*continuation
+ | Kdowhile of expr*statement*continuation
+ | Kfor2 of expr*statement*statement*continuation
+ | Kfor3 of expr*statement*statement*continuation
+ | Kswitch of continuation
+ | Kcall of (Value.address*ctype) option*cfunction*localEnv*continuation
+
+type state =
+ | State of cfunction*statement*continuation*localEnv*memory
+ | Callstate of fundef*Value.t list*continuation*memory
+ | Returnstate of Value.t*continuation*memory
+
+let string_of_unop = function
+ | Onotbool -> "!"
+ | Onotint -> "~"
+ | Oneg -> "-"
+
+let string_of_binop = function
+ | Oadd -> "+"
+ | Osub -> "-"
+ | Omul -> "*"
+ | Odiv -> "/"
+ | Omod -> "%"
+ | Oand -> "&"
+ | Oor -> "|"
+ | Oxor -> "^"
+ | Oshl -> "<<"
+ | Oshr -> ">>"
+ | Oeq -> "=="
+ | One -> "!="
+ | Olt -> "<"
+ | Ogt -> ">"
+ | Ole -> "<="
+ | Oge -> ">="
+
+let string_of_signedness = function
+ | Signed -> "signed"
+ | Unsigned -> "unsigned"
+
+let string_of_sized_int = function
+ | I8 -> "char"
+ | I16 -> "short"
+ | I32 -> "int"
+
+let rec string_of_ctype = function
+ | Tvoid -> "void"
+ | Tint (size, sign) ->
+ (string_of_signedness sign) ^ " " ^ (string_of_sized_int size)
+ | Tfloat _ -> error_float ()
+ | Tpointer ty -> (string_of_ctype ty) ^ "*"
+ | Tarray (ty, _) -> (string_of_ctype ty) ^ "[]"
+ | Tfunction _ -> assert false (* do not cast to a function type *)
+ | Tstruct (id, _)
+ | Tunion (id, _) -> id
+ | Tcomp_ptr id -> id ^ "*"
+
+let rec string_of_expr (Expr (e, _)) = string_of_expr_descr e
+and string_of_expr_descr = function
+ | Econst_int i -> string_of_int i
+ | Econst_float _ -> error_float ()
+ | Evar x -> x
+ | Ederef e -> "*(" ^ (string_of_expr e) ^ ")"
+ | Eaddrof e -> "&(" ^ (string_of_expr e) ^ ")"
+ | Eunop (unop, e) -> (string_of_unop unop) ^ "(" ^ (string_of_expr e) ^ ")"
+ | Ebinop (binop, e1, e2) ->
+ "(" ^ (string_of_expr e1) ^ ")" ^ (string_of_binop binop) ^
+ "(" ^ (string_of_expr e2) ^ ")"
+ | Ecast (ty, e) ->
+ "(" ^ (string_of_ctype ty) ^ ") (" ^ (string_of_expr e) ^ ")"
+ | Econdition (e1, e2, e3) ->
+ "(" ^ (string_of_expr e1) ^ ") ? (" ^ (string_of_expr e2) ^
+ ") : (" ^ (string_of_expr e3) ^ ")"
+ | Eandbool (e1, e2) ->
+ "(" ^ (string_of_expr e1) ^ ") && (" ^ (string_of_expr e2) ^ ")"
+ | Eorbool (e1, e2) ->
+ "(" ^ (string_of_expr e1) ^ ") || (" ^ (string_of_expr e2) ^ ")"
+ | Esizeof ty -> "sizeof(" ^ (string_of_ctype ty) ^ ")"
+ | Efield (e, field) -> "(" ^ (string_of_expr e) ^ ")." ^ field
+ | Ecost (cost_lbl, e) -> "/* " ^ cost_lbl ^ " */ " ^ (string_of_expr e)
+ | Ecall (f, arg, e) ->
+ "(" ^ f ^ "(" ^ (string_of_expr arg) ^ "), " ^ (string_of_expr e) ^ ")"
+
+let string_of_args args =
+ "(" ^ (MiscPottier.string_of_list ", " string_of_expr args) ^ ")"
+
+let rec string_of_statement = function
+ | Sskip -> "skip"
+ | Sassign (e1, e2) -> (string_of_expr e1) ^ " = " ^ (string_of_expr e2)
+ | Scall (None, f, args) -> (string_of_expr f) ^ (string_of_args args)
+ | Scall (Some e, f, args) ->
+ (string_of_expr e) ^ " = " ^ (string_of_expr f) ^ (string_of_args args)
+ | Ssequence _ -> "sequence"
+ | Sifthenelse (e, _, _) -> "if (" ^ (string_of_expr e) ^ ")"
+ | Swhile (e, _) -> "while (" ^ (string_of_expr e) ^ ")"
+ | Sdowhile _ -> "dowhile"
+ | Sfor (s, _, _, _) -> "for (" ^ (string_of_statement s) ^ "; ...)"
+ | Sbreak -> "break"
+ | Scontinue -> "continue"
+ | Sreturn None -> "return"
+ | Sreturn (Some e) -> "return (" ^ (string_of_expr e) ^ ")"
+ | Sswitch (e, _) -> "switch (" ^ (string_of_expr e) ^ ")"
+ | Slabel (lbl, _) -> "label " ^ lbl
+ | Sgoto lbl -> "goto " ^ lbl
+ | Scost (lbl, _) -> "cost " ^ lbl
+
+let string_of_local_env lenv =
+ let f x addr s =
+ s ^ x ^ " = " ^ (Value.to_string (value_of_address addr)) ^ " " in
+ LocalEnv.fold f lenv ""
+
+let print_state = function
+ | State (_, stmt, _, lenv, mem) ->
+ Printf.printf "Local environment:\n%s\n\nMemory:%s\nRegular state: %s\n\n%!"
+ (string_of_local_env lenv)
+ (Mem.to_string mem)
+ (string_of_statement stmt)
+ | Callstate (_, args, _, mem) ->
+ Printf.printf "Memory:%s\nCall state\n\nArguments:\n%s\n\n%!"
+ (Mem.to_string mem)
+ (MiscPottier.string_of_list " " Value.to_string args)
+ | Returnstate (v, _, mem) ->
+ Printf.printf "Memory:%s\nReturn state: %s\n\n%!"
+ (Mem.to_string mem)
+ (Value.to_string v)
+
+
+(* Continuations and labels *)
+
+let rec call_cont = function
+ | Kseq (_,k) | Kwhile (_,_,k) | Kdowhile (_,_,k)
+ | Kfor2 (_,_,_,k) | Kfor3 (_,_,_,k) | Kswitch k -> call_cont k
+ | k -> k
+
+let rec seq_of_labeled_statement = function
+ | LSdefault s -> s
+ | LScase (c,s,sl') -> Ssequence (s,(seq_of_labeled_statement sl'))
+
+let rec find_label1 lbl s k = match s with
+ | Ssequence (s1,s2) ->
+ (match find_label1 lbl s1 (Kseq (s2,k)) with
+ | Some sk -> Some sk
+ | None -> find_label1 lbl s2 k
+ )
+ | Sifthenelse (a,s1,s2) ->
+ (match find_label1 lbl s1 k with
+ | Some sk -> Some sk
+ | None -> find_label1 lbl s2 k
+ )
+ | Swhile (a,s1) -> find_label1 lbl s1 (Kwhile(a,s1,k))
+ | Sdowhile (a,s1) -> find_label1 lbl s1 (Kdowhile(a,s1,k))
+ | Sfor (a1,a2,a3,s1) ->
+ (match find_label1 lbl a1 (Kseq ((Sfor(Sskip,a2,a3,s1)),k)) with
+ | Some sk -> Some sk
+ | None ->
+ (match find_label1 lbl s1 (Kfor2(a2,a3,s1,k)) with
+ | Some sk -> Some sk
+ | None -> find_label1 lbl a3 (Kfor3(a2,a3,s1,k))
+ ))
+ | Sswitch (e,sl) -> find_label_ls lbl sl (Kswitch k)
+ | Slabel (lbl',s') -> if lbl=lbl' then Some(s', k) else find_label1 lbl s' k
+ | Scost (_,s') -> find_label1 lbl s' k
+ | Sskip | Sassign (_,_) | Scall (_,_,_) | Sbreak
+ | Scontinue | Sreturn _ | Sgoto _ -> None
+
+and find_label_ls lbl sl k = match sl with
+ | LSdefault s -> find_label1 lbl s k
+ | LScase (_,s,sl') ->
+ (match find_label1 lbl s (Kseq((seq_of_labeled_statement sl'),k)) with
+ | Some sk -> Some sk
+ | None -> find_label_ls lbl sl' k
+ )
+
+let find_label lbl s k = match find_label1 lbl s k with
+ | Some res -> res
+ | _ -> assert false (* should be impossible *)
+
+let rec select_switch i = function
+ | LSdefault d -> LSdefault d
+ | LScase (c,s,sl') when c=i-> LScase (c,s,sl')
+ | LScase (_,_,sl') -> select_switch i sl'
+
+
+(* ctype functions *)
+
+let sizeof ctype = Mem.concrete_size (ClightToCminor.sizeof_ctype ctype)
+
+let size_of_ctype = function
+ | Tint (I8, _) -> 1
+ | Tint (I16, _) -> 2
+ | Tint (I32, _) -> 4
+ | Tfloat _ -> error_float ()
+ | Tcomp_ptr _
+ | Tpointer _
+ | Tarray _
+ | Tstruct _
+ | Tunion _ -> Mem.ptr_size
+ | _ -> assert false (* do not use on these arguments *)
+
+let is_function_type = function
+ | Tfunction _ -> true
+ | _ -> false
+
+let is_array_type = function
+ | Tarray _ -> true
+ | _ -> false
+
+let is_complex_type = function
+ | Tstruct _ | Tunion _ -> true
+ | _ -> false
+
+let is_big_type t = (is_array_type t) || (is_complex_type t)
+
+let dest_type = function
+ | Tpointer ty | Tarray (ty, _) -> ty
+ | _ -> assert false (* do not use on these arguments *)
+
+
+(* Global and local environment management *)
+
+let find_local x lenv =
+ if LocalEnv.mem x lenv then LocalEnv.find x lenv
+ else error ("Unknown local variable " ^ x ^ ".")
+
+let find_global x mem =
+ if Mem.mem_global mem x then Mem.find_global mem x
+ else error ("Unknown global variable " ^ x ^ ".")
+
+let find_symbol lenv mem x =
+ if LocalEnv.mem x lenv then LocalEnv.find x lenv
+ else
+ if Mem.mem_global mem x then Mem.find_global mem x
+ else error ("Unknown variable " ^ x ^ ".")
+
+let find_fundef f mem =
+ let addr = Mem.find_global mem f in
+ Mem.find_fun_def mem addr
+
+
+(* Interpret *)
+
+let byte_of_intsize = function
+ | I8 -> 1
+ | I16 -> 2
+ | I32 -> 4
+
+let choose_cast sign n m v =
+ let f = match sign with
+ | Signed -> Value.sign_ext
+ | Unsigned -> Value.zero_ext in
+ f v n m
+
+let eval_cast = function
+ (* Cast Integer *)
+ | (v,Tint(isize,sign),Tint(isize',_)) ->
+ choose_cast sign (byte_of_intsize isize) (byte_of_intsize isize') v
+ | (v,_,_) -> v
+
+let to_int32 (v, t) = eval_cast (v, t, Tint (I32, Signed))
+
+let eval_unop ret_ctype ((_, t) as e) op =
+ let v = to_int32 e in
+ let v = match op with
+ | Onotbool -> Value.notbool v
+ | Onotint -> Value.notint v
+ | Oneg -> Value.negint v in
+ eval_cast (v, t, ret_ctype)
+
+let eval_add (v1,t1) (v2,t2) = match t1, t2 with
+ | Tpointer ty, Tint _ | Tarray (ty, _), Tint _ ->
+ let v = Value.mul (Value.of_int (sizeof ty)) v2 in
+ Value.add v1 v
+ | Tint _, Tpointer ty | Tint _, Tarray (ty, _) ->
+ let v = Value.mul (Value.of_int (sizeof ty)) v1 in
+ Value.add v2 v
+ | _ -> Value.add v1 v2
+
+let eval_sub (v1,t1) (v2,t2) = match t1, t2 with
+ | Tpointer ty, Tint _ | Tarray (ty, _), Tint _ ->
+ let v = Value.mul (Value.of_int (sizeof ty)) v2 in
+ Value.sub v1 v
+ | _ -> Value.sub v1 v2
+
+let choose_sign op_signed op_unsigned v1 v2 t =
+ let op = match t with
+ | Tint (_, Signed) -> op_signed
+ | Tint (_, Unsigned) -> op_unsigned
+ | _ -> op_unsigned in
+ op v1 v2
+
+let eval_binop ret_ctype ((_, t1) as e1) ((_, t2) as e2) op =
+ let v1 = to_int32 e1 in
+ let v2 = to_int32 e2 in
+ let e1 = (v1, t1) in
+ let e2 = (v2, t2) in
+ let v = match op with
+ | Oadd -> eval_add e1 e2
+ | Osub -> eval_sub e1 e2
+ | Omul -> Value.mul v1 v2
+ | Odiv -> choose_sign Value.div Value.divu v1 v2 t1
+ | Omod -> choose_sign Value.modulo Value.modulou v1 v2 t1
+ | Oand -> Value.and_op v1 v2
+ | Oor -> Value.or_op v1 v2
+ | Oxor -> Value.xor v1 v2
+ | Oshl-> Value.shl v1 v2
+ | Oshr-> Value.shr v1 v2
+ | Oeq -> choose_sign Value.cmp_eq Value.cmp_eq_u v1 v2 t1
+ | One -> choose_sign Value.cmp_ne Value.cmp_ne_u v1 v2 t1
+ | Olt -> choose_sign Value.cmp_lt Value.cmp_lt_u v1 v2 t1
+ | Ole -> choose_sign Value.cmp_le Value.cmp_le_u v1 v2 t1
+ | Ogt -> choose_sign Value.cmp_gt Value.cmp_gt_u v1 v2 t1
+ | Oge -> choose_sign Value.cmp_ge Value.cmp_ge_u v1 v2 t1 in
+ eval_cast (v, t1, ret_ctype)
+
+let rec get_offset_struct v size id fields =
+ let offsets = fst (Mem.concrete_offsets_size size) in
+ let fields = List.combine (List.map fst fields) offsets in
+ let off = Value.of_int (List.assoc id fields) in
+ Value.add v off
+
+let get_offset v id = function
+ | Tstruct (_, fields) as t ->
+ let size = ClightToCminor.sizeof_ctype t in
+ get_offset_struct v size id fields
+ | Tunion _ -> v
+ | _ -> assert false (* do not use on these arguments *)
+
+let is_true (v, _) = Value.is_true v
+let is_false (v, _) = Value.is_false v
+
+let rec eval_expr localenv m (Expr (ee, tt)) =
+ match ee with
+ | Econst_int i ->
+ let v = eval_cast (Value.of_int i, Tint(I32, Signed), tt) in
+ ((v, tt),[])
+ | Econst_float _ -> error_float ()
+ | Evar id when is_function_type tt || is_big_type tt ->
+ let v = value_of_address (find_symbol localenv m id) in
+ ((v, tt), [])
+ | Evar id ->
+ let addr = find_symbol localenv m id in
+ let v = Mem.load m (size_of_ctype tt) addr in
+ ((v, tt), [])
+ | Ederef e when is_function_type tt || is_big_type tt ->
+ let ((v1,_),l1) = eval_expr localenv m e in
+ ((v1,tt),l1)
+ | Ederef e ->
+ let ((v1,_),l1) = eval_expr localenv m e in
+ let addr = address_of_value v1 in
+ let v = Mem.load m (size_of_ctype tt) addr in
+ ((v,tt),l1)
+ | Eaddrof exp ->
+ let ((addr,_),l) = eval_lvalue localenv m exp in
+ ((value_of_address addr,tt),l)
+ | Ebinop (op,exp1,exp2) ->
+ let (v1,l1) = eval_expr localenv m exp1 in
+ let (v2,l2) = eval_expr localenv m exp2 in
+ ((eval_binop tt v1 v2 op,tt),l1@l2)
+ | Eunop (op,exp) ->
+ let (e1,l1) = eval_expr localenv m exp in
+ ((eval_unop tt e1 op,tt),l1)
+ | Econdition (e1,e2,e3) ->
+ let (v1,l1) = eval_expr localenv m e1 in
+ if is_true v1 then let (v2,l2) = eval_expr localenv m e2 in (v2,l1@l2)
+ else
+ if is_false v1 then let (v3,l3) = eval_expr localenv m e3 in (v3,l1@l3)
+ else (v1,l1)
+ | Eandbool (e1,e2) ->
+ let (v1,l1) = eval_expr localenv m e1 in
+ if is_true v1 then let (v2,l2) = eval_expr localenv m e2 in (v2,l1@l2)
+ else (v1,l1)
+ | Eorbool (e1,e2) ->
+ let (v1,l1) = eval_expr localenv m e1 in
+ if is_false v1 then let (v2,l2) = eval_expr localenv m e2 in (v2,l1@l2)
+ else (v1,l1)
+ | Esizeof cty -> ((Value.of_int (sizeof cty),tt),[])
+ | Efield (e1,id) ->
+ let ((v1,t1),l1) = eval_expr localenv m e1 in
+ let addr = address_of_value (get_offset v1 id t1) in
+ ((Mem.load m (size_of_ctype tt) addr, tt), l1)
+ | Ecost (lbl,e1) ->
+ let (v1,l1) = eval_expr localenv m e1 in
+ (v1,lbl::l1)
+ | Ecall _ -> assert false (* only used by the annotation process *)
+ | Ecast (cty,exp) ->
+ let ((v,ty),l1) = eval_expr localenv m exp in
+ ((eval_cast (v,ty,cty),tt),l1)
+
+and eval_lvalue localenv m (Expr (e,t)) = match e with
+ | Econst_int _ | Econst_float _ | Eaddrof _ | Eunop (_,_) | Ebinop (_,_,_)
+ | Ecast (_,_) | Econdition (_,_,_) | Eandbool (_,_) | Eorbool (_,_)
+ | Esizeof _ -> assert false (*Not allowed in left side of assignement*)
+ | Evar id -> ((find_symbol localenv m id,t),[])
+ | Ederef ee ->
+ let ((v,_),l1) = eval_expr localenv m ee in
+ ((address_of_value v,t),l1)
+ | Efield (ee,id) ->
+ let ((v,tt),l1) = eval_expr localenv m ee in
+ let v' = get_offset v id tt in
+ ((address_of_value v', t), l1)
+ | Ecost (lbl,ee) ->
+ let (v,l) = eval_lvalue localenv m ee in
+ (v,lbl::l)
+ | Ecall _ -> assert false (* only used in the annotation process *)
+
+let eval_exprlist lenv mem es =
+ let f (vs, cost_lbls) e =
+ let ((v, _), cost_lbls') = eval_expr lenv mem e in
+ (vs @ [v], cost_lbls @ cost_lbls') in
+ List.fold_left f ([], []) es
+
+
+let bind (mem, lenv) (x, ty) v =
+ let (mem, addr) = Mem.alloc mem (sizeof ty) in
+ let mem = Mem.store mem (sizeof ty) addr v in
+ let lenv = LocalEnv.add x addr lenv in
+ (mem, lenv)
+
+let bind_var (mem, lenv) (x, ty) = bind (mem, lenv) (x, ty) Value.undef
+
+let init_fun_env mem params args vars =
+ let lenv = LocalEnv.empty in
+ let (mem, lenv) =
+ try List.fold_left2 bind (mem, lenv) params args
+ with Invalid_argument _ -> error "wrong size of arguments." in
+ List.fold_left bind_var (mem, lenv) vars
+
+let assign m v ty ptr = Mem.store m (size_of_ctype ty) ptr v
+
+
+let free_local_env mem lenv =
+ let f _ addr mem = Mem.free mem addr in
+ LocalEnv.fold f lenv mem
+
+let condition v a_true a_false =
+ if Value.is_false v then a_false
+ else if Value.is_true v then a_true
+ else error "undefined condition guard value."
+
+let eval_stmt f k e m s = match s, k with
+ | Sskip, Kseq(s,k) -> (State(f,s,k,e,m),[])
+ | Sskip, Kwhile(a,s,k) -> (State(f,Swhile(a,s),k,e,m),[])
+ | Sskip, Kdowhile(a,s,k) ->
+ let ((v1, _),l1) = eval_expr e m a in
+ let a_false = (State(f,Sskip,k,e,m),l1) in
+ let a_true = (State(f,Sdowhile(a,s),k,e,m),l1) in
+ condition v1 a_true a_false
+ | Sskip, Kfor3(a2,a3,s,k) -> (State(f,Sfor(Sskip,a2,a3,s),k,e,m),[])
+ | Sskip, Kfor2(a2,a3,s,k) -> (State(f,a3,Kfor3(a2,a3,s,k),e,m),[])
+ | Sskip, Kswitch k -> (State(f,Sskip,k,e,m),[])
+ | Sskip, Kcall _ ->
+ let m' = free_local_env m e in
+ (Returnstate(Value.undef,k,m'),[])
+ | Sassign(a1, a2), _ ->
+ let ((v1,t1),l1) = (eval_lvalue e m a1) in
+ let ((v2,t2),l2) = eval_expr e m a2 in
+ (State(f,Sskip,k,e,assign m v2 t1 v1),l1@l2)
+ | Scall(None,a,al), _ ->
+ let ((v1,_),l1) = eval_expr e m a in
+ let fd = Mem.find_fun_def m (address_of_value v1) in
+ let (vargs,l2) = eval_exprlist e m al in
+ (Callstate(fd,vargs,Kcall(None,f,e,k),m),l1@l2)
+ | Scall(Some lhs,a,al), _ ->
+ let ((v1,_),l1) = eval_expr e m a in
+ let fd = Mem.find_fun_def m (address_of_value v1) in
+ let (vargs,l2) = eval_exprlist e m al in
+ let (vt3,l3) = eval_lvalue e m lhs in
+ (Callstate(fd,vargs,Kcall(Some vt3,f,e,k),m),l1@l2@l3)
+ | Ssequence(s1,s2), _ -> (State(f,s1,Kseq(s2,k),e,m),[])
+ | Sifthenelse(a,s1,s2), _ ->
+ let ((v1,_),l1) = eval_expr e m a in
+ let a_true = (State(f,s1,k,e,m),l1) in
+ let a_false = (State(f,s2,k,e,m),l1) in
+ condition v1 a_true a_false
+ | Swhile(a,s), _ ->
+ let ((v1,_),l1) = eval_expr e m a in
+ let a_false = (State(f,Sskip,k,e,m),l1) in
+ let a_true = (State(f,s,Kwhile(a,s,k),e,m),l1) in
+ condition v1 a_true a_false
+ | Sdowhile(a,s), _ -> (State(f,s,Kdowhile(a,s,k),e,m),[])
+ | Sfor(Sskip,a2,a3,s), _ ->
+ let ((v1,_),l1) = eval_expr e m a2 in
+ let a_false = (State(f,Sskip,k,e,m),l1) in
+ let a_true = (State(f,s,Kfor2(a2,a3,s,k),e,m),l1) in
+ condition v1 a_true a_false
+ | Sfor(a1,a2,a3,s), _ -> (State(f,a1,Kseq(Sfor(Sskip,a2,a3,s),k),e,m),[])
+ | Sbreak, Kseq(s,k) -> (State(f,Sbreak,k,e,m),[])
+ | Sbreak, Kwhile(_,_,k) -> (State(f,Sskip,k,e,m),[])
+ | Sbreak, Kdowhile(_,_,k) -> (State(f,Sskip,k,e,m),[])
+ | Sbreak, Kfor2(_,_,_,k) -> (State(f,Sskip,k,e,m),[])
+ | Sbreak, Kswitch k -> (State(f,Sskip,k,e,m),[])
+ | Scontinue, Kseq(_,k) -> (State(f,Scontinue,k,e,m),[])
+ | Scontinue, Kwhile(a,s,k) -> (State(f,Swhile(a,s),k,e,m),[])
+ | Scontinue, Kdowhile(a,s,k) ->
+ let ((v1,_),l1) = eval_expr e m a in
+ let a_false = (State(f,Sskip,k,e,m),l1) in
+ let a_true = (State(f,Sdowhile(a,s),k,e,m),l1) in
+ condition v1 a_true a_false
+ | Scontinue, Kfor2(a2,a3,s,k) -> (State(f,a3,Kfor3(a2,a3,s,k),e,m),[])
+ | Scontinue, Kswitch k -> (State(f,Scontinue,k,e,m),[])
+ | Sreturn None, _ ->
+ let m' = free_local_env m e in
+ (Returnstate(Value.undef,(call_cont k),m'),[])
+ | Sreturn (Some a), _ ->
+ let ((v1,_),l1) = eval_expr e m a in
+ let m' = free_local_env m e in
+ (Returnstate(v1,call_cont k,m'),l1)
+ | Sswitch(a,sl), _ ->
+ let ((v,_),l) = eval_expr e m a in
+ let n = Value.to_int v in
+ (State(f,(seq_of_labeled_statement (select_switch n sl)),Kswitch k,e,m),l)
+ | Slabel(lbl,s), _ -> (State(f,s,k,e,m),[])
+ | Scost(lbl,s), _ -> (State(f,s,k,e,m),[lbl])
+ | Sgoto lbl, _ ->
+ let (s', k') = find_label lbl f.fn_body (call_cont k) in
+ (State(f,s',k',e,m),[])
+ | _ -> assert false (* should be impossible *)
+
+
+module InterpretExternal = Primitive.Interpret (Mem)
+
+let interpret_external k mem f args =
+ let (mem', v) = match InterpretExternal.t mem f args with
+ | (mem', InterpretExternal.V vs) ->
+ let v = if List.length vs = 0 then Value.undef else List.hd vs in
+ (mem', v)
+ | (mem', InterpretExternal.A addr) -> (mem', value_of_address addr) in
+ Returnstate (v, k, mem')
+
+let step_call args cont mem = function
+ | Internal f ->
+ let (mem', e) = init_fun_env mem f.fn_params args f.fn_vars in
+ State (f, f.fn_body, cont, e, mem')
+ | External(id,targs,tres) when List.length targs = List.length args ->
+ interpret_external cont mem id args
+ | External(id,_,_) ->
+ error ("wrong size of arguments when calling external " ^ id ^ ".")
+
+let step = function
+ | State(f,stmt,k,e,m) -> eval_stmt f k e m stmt
+ | Callstate(fun_def,vargs,k,m) -> (step_call vargs k m fun_def,[])
+ | Returnstate(v,Kcall(None,f,e,k),m) -> (State(f,Sskip,k,e,m),[])
+ | Returnstate(v,Kcall((Some(vv, ty)),f,e,k),m) ->
+ let m' = assign m v ty vv in
+ (State(f,Sskip,k,e,m'),[])
+ | _ -> error "state malformation."
+
+
+let data_of_init_data = function
+ | Init_int8 i -> Data_int8 i
+ | Init_int16 i -> Data_int16 i
+ | Init_int32 i -> Data_int32 i
+ | Init_float32 f -> error_float ()
+ | Init_float64 f -> error_float ()
+ | Init_space i -> error "bad global initialization style."
+ | Init_addrof (x,off) -> assert false (* TODO: need the size of [x]'s cells *)
+
+let datas_of_init_datas = function
+ | [Init_space _] -> None
+ | l -> Some (List.map data_of_init_data l)
+
+let init_mem prog =
+ let f_var mem ((x, init_datas), ty) =
+ Mem.add_var mem x (ClightToCminor.sizeof_ctype ty)
+ (datas_of_init_datas init_datas) in
+ let mem = List.fold_left f_var Mem.empty prog.prog_vars in
+ let f_fun_def mem (f, def) = Mem.add_fun_def mem f def in
+ List.fold_left f_fun_def mem prog.prog_funct
+
+let compute_result v =
+ if Value.is_int v then IntValue.Int32.cast (Value.to_int_repr v)
+ else IntValue.Int32.zero
+
+let rec exec debug trace (state, l) =
+ let cost_labels = l @ trace in
+ let print_and_return_result res =
+ if debug then Printf.printf "Result = %s\n%!"
+ (IntValue.Int32.to_string res) ;
+ (res, cost_labels) in
+ if debug then print_state state ;
+ match state with
+ | Returnstate(v,Kstop,_) -> (* Explicit return in main *)
+ print_and_return_result (compute_result v)
+ | State(_,Sskip,Kstop,_,_) -> (* Implicit return in main *)
+ print_and_return_result IntValue.Int32.zero
+ | state -> exec debug cost_labels (step state)
+
+let interpret debug prog =
+ Printf.printf "*** Clight interpret ***\n%!" ;
+ match prog.prog_main with
+ | None -> (IntValue.Int32.zero, [])
+ | Some main ->
+ let mem = init_mem prog in
+ let first_state = (Callstate (find_fundef main mem,[],Kstop,mem),[]) in
+ exec debug [] first_state
--- /dev/null
+(** This module provides a function to interpret a [Clight] program
+ and return the trace of cost labels encountered. This function
+ can also print debug informations. *)
+
+(** [interpret debug p] returns the trace of execution of program [p]. *)
+
+val interpret: bool -> Clight.program -> AST.trace
--- /dev/null
+
+(** This module defines the labelling of a [Clight] program. *)
+
+open Clight
+open CostLabel
+
+
+(* Add a cost label in front of a statement. *)
+
+let add_starting_cost_label cost_universe stmt =
+ Clight.Scost (CostLabel.Gen.fresh cost_universe, stmt)
+
+(* Add a cost label at the end of a statement. *)
+
+let add_ending_cost_label cost_universe stmt =
+ Clight.Ssequence (stmt, add_starting_cost_label cost_universe Clight.Sskip)
+
+
+let int_type = Tint (I32, AST.Signed)
+let const_int i = Expr (Econst_int i, int_type)
+
+
+let typeof e = let Expr (_,t) = e in t
+
+
+let add_cost_label_e cost_universe e =
+ Expr (Ecost (CostLabel.Gen.fresh cost_universe, e), typeof e)
+
+
+(* Add cost labels to an expression. *)
+
+let rec add_cost_labels_e cost_universe = function
+ | Expr (exp,cty) -> Expr (add_cost_labels_expr cost_universe exp,cty)
+
+and add_cost_labels_expr cost_universe exp = match exp with
+ | Econst_int _ | Econst_float _ | Evar _ | Esizeof _ -> exp
+ | Ederef e -> Ederef (add_cost_labels_e cost_universe e)
+ | Eaddrof e -> Eaddrof (add_cost_labels_e cost_universe e)
+ | Eunop (op,e) -> Eunop (op,(add_cost_labels_e cost_universe e))
+ | Ebinop (op,e1,e2) ->
+ Ebinop (op,
+ add_cost_labels_e cost_universe e1,
+ add_cost_labels_e cost_universe e2)
+ | Ecast (t,e) -> Ecast (t, add_cost_labels_e cost_universe e)
+ | Eandbool (e1,e2) ->
+ let e1' = add_cost_labels_e cost_universe e1 in
+ let e2' = add_cost_labels_e cost_universe e2 in
+ let b1 = add_cost_label_e cost_universe (const_int 1) in
+ let b2 = add_cost_label_e cost_universe (const_int 0) in
+ let e2' = Expr (Econdition (e2', b1, b2), int_type) in
+ let e2' = add_cost_label_e cost_universe e2' in
+ let e3' = add_cost_label_e cost_universe (const_int 0) in
+ Econdition (e1', e2', e3')
+ | Eorbool (e1,e2) ->
+ let e1' = add_cost_labels_e cost_universe e1 in
+ let e2' = add_cost_label_e cost_universe (const_int 1) in
+ let e3' = add_cost_labels_e cost_universe e2 in
+ let b1 = add_cost_label_e cost_universe (const_int 1) in
+ let b2 = add_cost_label_e cost_universe (const_int 0) in
+ let e3' = Expr (Econdition (e3', b1, b2), int_type) in
+ let e3' = add_cost_label_e cost_universe e3' in
+ Econdition (e1', e2', e3')
+ | Efield (e,id) -> Efield (add_cost_labels_e cost_universe e,id)
+ | Econdition (e1,e2,e3) ->
+ let e1' = add_cost_labels_e cost_universe e1 in
+ let e2' = add_cost_labels_e cost_universe e2 in
+ let e2' = add_cost_label_e cost_universe e2' in
+ let e3' = add_cost_labels_e cost_universe e3 in
+ let e3' = add_cost_label_e cost_universe e3' in
+ Econdition (e1', e2', e3')
+ | Ecost (_,_) | Ecall _ -> assert false (* Should not happen *)
+
+let add_cost_labels_opt cost_universe = function
+ | None -> None
+ | Some e -> Some (add_cost_labels_e cost_universe e)
+
+let add_cost_labels_lst cost_universe l =
+ List.map (add_cost_labels_e cost_universe) l
+
+
+(* Add cost labels to a statement. *)
+
+let rec add_cost_labels_st cost_universe = function
+ | Sskip -> Sskip
+ | Sassign (e1,e2) ->
+ Sassign (add_cost_labels_e cost_universe e1,
+ add_cost_labels_e cost_universe e2)
+ | Scall (e1,e2,lst) ->
+ Scall (add_cost_labels_opt cost_universe e1,
+ add_cost_labels_e cost_universe e2,
+ add_cost_labels_lst cost_universe lst)
+ | Ssequence (s1,s2) ->
+ Ssequence (add_cost_labels_st cost_universe s1,
+ add_cost_labels_st cost_universe s2)
+ | Sifthenelse (e,s1,s2) ->
+ let s1' = add_cost_labels_st cost_universe s1 in
+ let s1' = add_starting_cost_label cost_universe s1' in
+ let s2' = add_cost_labels_st cost_universe s2 in
+ let s2' = add_starting_cost_label cost_universe s2' in
+ Sifthenelse (add_cost_labels_e cost_universe e, s1', s2')
+ | Swhile (e,s) ->
+ let s' = add_cost_labels_st cost_universe s in
+ let s' = add_starting_cost_label cost_universe s' in
+ add_ending_cost_label cost_universe
+ (Swhile (add_cost_labels_e cost_universe e, s'))
+ | Sdowhile (e,s) ->
+ let s = add_cost_labels_st cost_universe s in
+ let s' = add_starting_cost_label cost_universe s in
+ add_ending_cost_label cost_universe
+ (Sdowhile (add_cost_labels_e cost_universe e, s'))
+ | Sfor (s1,e,s2,s3) ->
+ let s1' = add_cost_labels_st cost_universe s1 in
+ let s2' = add_cost_labels_st cost_universe s2 in
+ let s3' = add_cost_labels_st cost_universe s3 in
+ let s3' = add_starting_cost_label cost_universe s3' in
+ add_ending_cost_label cost_universe
+ (Sfor (s1', add_cost_labels_e cost_universe e, s2', s3'))
+ | Sreturn e -> Sreturn (add_cost_labels_opt cost_universe e)
+ | Sswitch (e,ls) ->
+ Sswitch (add_cost_labels_e cost_universe e,
+ add_cost_labels_ls cost_universe ls)
+ | Slabel (lbl,s) ->
+ let s' = add_cost_labels_st cost_universe s in
+ let s' = add_starting_cost_label cost_universe s' in
+ Slabel (lbl,s')
+ | Scost (_,_) -> assert false
+ | _ as stmt -> stmt
+
+and add_cost_labels_ls cost_universe = function
+ | LSdefault s ->
+ let s' = add_cost_labels_st cost_universe s in
+ let s' = add_starting_cost_label cost_universe s' in
+ LSdefault s'
+ | LScase (i,s,ls) ->
+ let s' = add_cost_labels_st cost_universe s in
+ let s' = add_starting_cost_label cost_universe s' in
+ LScase (i, s', add_cost_labels_ls cost_universe ls)
+
+
+(* Add cost labels to a function. *)
+
+let add_cost_labels_f cost_universe = function
+ | (id,Internal fd) -> (id,Internal {
+ fn_return = fd.fn_return ;
+ fn_params = fd.fn_params ;
+ fn_vars = fd.fn_vars ;
+ fn_body = add_starting_cost_label cost_universe
+ (add_cost_labels_st cost_universe fd.fn_body)
+ })
+ | (id,External (a,b,c)) -> (id,External (a,b,c))
+
+
+(** [add_cost_labels prog] inserts some labels to enable
+ cost annotation. *)
+
+let add_cost_labels p =
+ let labs = ClightAnnotator.all_labels p in
+ let labs = StringTools.Set.fold CostLabel.Set.add labs CostLabel.Set.empty in
+ let cost_prefix = CostLabel.Gen.fresh_prefix labs "__cost" in
+ let cost_universe = CostLabel.Gen.new_universe cost_prefix in
+ {
+ prog_funct = List.map (add_cost_labels_f cost_universe) p.prog_funct;
+ prog_main = p.prog_main;
+ prog_vars = p.prog_vars
+ }
--- /dev/null
+(** This module defines the labelling of a [Clight] program. *)
+
+(** [add_cost_labels prog] inserts some labels to enable
+ cost annotation.
+
+ The labelling of a function proceeds as follows:
+
+ - A label is added at the beginning of the function.
+
+ - For each branching instruction in the function, a cost label is added at
+ the beginning of each branch. The concerned instructions are:
+ - ternary expressions (includind boolean 'and' and 'or' operators that are
+ transformed at this point);
+ - conditionals;
+ - loops;
+ - switches.
+
+ - For each label instruction in the function, a cost label is added after
+ the label, in order to capture loops potentially created by gotos.
+*)
+
+val add_cost_labels : Clight.program -> Clight.program
--- /dev/null
+
+
+let f_expr set locals e sub_exprs_res =
+ let e_res = match e with
+ | Clight.Expr (Clight.Evar id, _) ->
+ StringTools.Set.mem id set && not (List.mem id locals)
+ | _ -> false in
+ List.fold_left (||) false (e_res :: sub_exprs_res)
+
+let f_stmt _ sub_exprs_res sub_stmts_res =
+ List.fold_left (||) false (sub_exprs_res @ sub_stmts_res)
+
+let references_stmt set locals stmt =
+ ClightFold.statement2 (f_expr set locals) f_stmt stmt
+
+let references_funct set (id, def) = match def with
+ | Clight.Internal def ->
+ let locals = List.map fst (def.Clight.fn_params @ def.Clight.fn_vars) in
+ if references_stmt set locals def.Clight.fn_body then
+ StringTools.Set.add id set
+ else set
+ | _ -> set
+
+let references set p =
+ List.fold_left references_funct set p.Clight.prog_funct
+
+
+let unsupported_functions p =
+ let rec fixpoint set =
+ let set' = references set p in
+ if StringTools.Set.equal set set' then set
+ else fixpoint set' in
+ fixpoint (StringTools.Set.of_list ["calloc" ; "memcpy"])
+
+
+let remove_functions functions p =
+ let f (id, _) = not (StringTools.Set.mem id functions) in
+ let functs = List.filter f p.Clight.prog_funct in
+ { p with Clight.prog_funct = functs }
+
+
+let simplify p =
+ let unsupported = unsupported_functions p in
+ remove_functions unsupported p
--- /dev/null
+
+(** [simplify p] removes in the Clight program [p] references to external
+ functions generated by the Lustre compiler and that we do not know of. *)
+
+val simplify : Clight.program -> Clight.program
--- /dev/null
+
+let error_prefix = "Clight-Lustre main"
+let error s = Error.global_error error_prefix s
+
+
+let extract_info lustre_test =
+ let error () = error ("bad format of file " ^ lustre_test) in
+ try
+ let ic = open_in lustre_test in
+ let step_fun = input_line ic in
+ let step_cost = input_line ic in
+ let cost_var = input_line ic in
+ let cost_incr = input_line ic in
+ let rec aux_external_costs () =
+ try
+ let s = input_line ic in
+ if s = "" then StringTools.Map.empty
+ else
+ if String.contains s ' ' then
+ let i = String.index s ' ' in
+ let extern_name = String.sub s 0 i in
+ let cost = String.sub s (i+1) ((String.length s) - (i+1)) in
+ StringTools.Map.add extern_name cost (aux_external_costs ())
+ else error ()
+ with End_of_file -> error () in
+ let rec aux_inputs () =
+ try
+ let s = input_line ic in
+ if s = "" then []
+ else s :: (aux_inputs ())
+ with End_of_file -> error () in
+ let rec aux_booleans () =
+ try
+ let s = input_line ic in
+ s :: (aux_booleans ())
+ with End_of_file -> [] in
+ let external_costs = aux_external_costs () in
+ let inputs = aux_inputs () in
+ let booleans = aux_booleans () in
+ (booleans, inputs, step_fun, step_cost,
+ cost_var, cost_incr, external_costs)
+ with Sys_error _ | End_of_file -> error ()
+
+
+let define_void_external cost_incr arg_types ret_type cost_var =
+ let fresh = StringTools.make_fresh StringTools.Set.empty "x" in
+ let fn_return = ret_type in
+ let fn_params = List.map (fun t -> (fresh (), t)) arg_types in
+ let fn_vars = [] in
+ let int_type = Clight.Tint (Clight.I32, AST.Signed) in
+ let f_type = Clight.Tfunction ([int_type], Clight.Tvoid) in
+ let f = Clight.Expr (Clight.Evar cost_incr, f_type) in
+ let args = [Clight.Expr (Clight.Evar cost_var, int_type)] in
+ let fn_body = Clight.Scall (None, f, args) in
+ { Clight.fn_return = fn_return ; Clight.fn_params = fn_params ;
+ Clight.fn_vars = fn_vars ; Clight.fn_body = fn_body }
+
+let define_void_externals_funct cost_incr external_costs (id, def) =
+ let def' = match def with
+ | Clight.External (_, args, Clight.Tvoid)
+ when StringTools.Map.mem id external_costs ->
+ Clight.Internal
+ (define_void_external cost_incr args Clight.Tvoid
+ (StringTools.Map.find id external_costs))
+ | _ -> def in
+ (id, def')
+
+let define_void_externals cost_incr external_costs p =
+ let prog_funct =
+ List.map
+ (define_void_externals_funct cost_incr external_costs)
+ p.Clight.prog_funct in
+ { p with Clight.prog_funct = prog_funct }
+
+
+let get_struct_arg fun_name p =
+ let error () =
+ error ("could not fetch the structure of the context of function " ^
+ fun_name ^ ".") in
+ if List.mem_assoc fun_name p.Clight.prog_funct then
+ match List.assoc fun_name p.Clight.prog_funct with
+ | Clight.Internal def when List.length def.Clight.fn_params = 1 ->
+ (match snd (List.hd def.Clight.fn_params) with
+ | Clight.Tpointer (Clight.Tstruct (struct_name, fields)) ->
+ (struct_name, fields)
+ | _ -> error ())
+ | _ -> error ()
+ else error ()
+
+let first_init_field ctx (id, t) = match t with
+ | Clight.Tint _ -> ctx ^ "." ^ id ^ " = 0;\n"
+ | _ when id = "client_data" -> ""
+ | _ -> error ("unsupported type " ^ (ClightPrinter.string_of_ctype t) ^ ".")
+
+let init_fields ctx fields =
+ let f res field = res ^ (first_init_field ctx field) in
+ List.fold_left f "" fields
+
+let init_field
+ lustre_test_min_int lustre_test_max_int booleans inputs ctx (id, t) =
+ let lustre_full_range = (lustre_test_max_int - lustre_test_min_int) + 1 in
+ match t with
+ | Clight.Tint _ when List.mem id inputs && List.mem id booleans ->
+ ctx ^ "." ^ id ^ " = rand_bool();\n"
+ | Clight.Tint _ when List.mem id inputs ->
+ ctx ^ "." ^ id ^ " = rand_int(" ^ (string_of_int lustre_full_range) ^
+ ") - " ^ (string_of_int lustre_test_min_int) ^ ";\n"
+ | _ when id = "client_data" || not (List.mem id inputs) -> ""
+ | _ -> error ("unsupported type " ^ (ClightPrinter.string_of_ctype t) ^ ".")
+
+let main_fields
+ lustre_test_min_int lustre_test_max_int booleans inputs ctx fields =
+ let f res field =
+ res ^
+ (init_field
+ lustre_test_min_int lustre_test_max_int booleans inputs ctx field) in
+ List.fold_left f "" fields
+
+let main_def
+ lustre_test_cases lustre_test_cycles lustre_test_min_int lustre_test_max_int
+ (struct_name, fields) booleans inputs step_fun step_cost cost_var =
+ let ctx = "ctx" in
+ let reset_fun = Str.global_replace (Str.regexp "_step") "_reset" step_fun in
+ let big_init = init_fields ctx fields in
+ let init_inputs =
+ main_fields lustre_test_min_int lustre_test_max_int booleans inputs ctx
+ fields in
+
+ "int main () {\n" ^
+ (* Initializations *)
+ " " ^ struct_name ^ " " ^ ctx ^ ";\n" ^
+ " int wcet = " ^ step_cost ^ ";\n" ^
+ " int old_cost;\n" ^
+ " int et = 0;\n" ^
+ " int min = -1, max = -1, nb_cycles = 0\n;" ^
+ " int i_case, i_cycle;\n" ^
+
+ (* Body *)
+ big_init ^
+ " for (i_case = 0 ; i_case < " ^ (string_of_int lustre_test_cases) ^
+ " ; i_case++) {\n" ^
+ " old_cost = " ^ cost_var ^ ";\n" ^
+ " " ^ reset_fun ^ "(&" ^ ctx ^ ");\n" ^
+ " " ^ cost_var ^ " = old_cost;\n" ^
+ " for (i_cycle = 0 ; i_cycle < " ^ (string_of_int lustre_test_cycles) ^
+ " ; i_cycle++) {\n" ^
+ init_inputs ^
+ " old_cost = " ^ cost_var ^ ";\n" ^
+ " " ^ step_fun ^ "(&" ^ ctx ^ ");\n" ^
+ " et = " ^ cost_var ^ " - old_cost;\n" ^
+ " if ((min == -1) || (et < min)) min = et;\n" ^
+ " if ((max == -1) || (et > max)) max = et;\n" ^
+ " nb_cycles++;\n" ^
+ " }\n" ^
+ " }\n" ^
+
+ (* Printing the results *)
+ " print_sint(wcet);\n" ^
+ " newline();\n" ^
+ " print_sint(min);\n" ^
+ " newline();\n" ^
+ " print_sint(max);\n" ^
+ " newline();\n" ^
+ " if (nb_cycles == 0) print_sint(-1);\n" ^
+ " else print_sint(" ^ cost_var ^ "/nb_cycles);\n" ^
+ " newline();\n" ^
+ " return(0);\n" ^
+ "}\n"
+
+let add_main_def
+ lustre_test_cases lustre_test_cycles lustre_test_min_int
+ lustre_test_max_int booleans inputs step_fun step_cost cost_var p =
+ let tmp_file = Filename.temp_file "lustre_add_main" ".c" in
+ try
+ let struct_arg = get_struct_arg step_fun p in
+ let s =
+ (ClightPrinter.print_program p) ^
+ (main_def
+ lustre_test_cases lustre_test_cycles lustre_test_min_int
+ lustre_test_max_int struct_arg booleans inputs
+ step_fun step_cost cost_var) in
+ let oc = open_out tmp_file in
+ output_string oc s ;
+ close_out oc ;
+ ClightParser.process (`Filename tmp_file)
+ with Sys_error _ ->
+ error ("could not save temporary file " ^ tmp_file ^ " with main.")
+
+
+let add lustre_test lustre_test_cases lustre_test_cycles
+ lustre_test_min_int lustre_test_max_int p =
+ let (booleans, inputs, step_fun, step_cost,
+ cost_var, cost_incr, external_costs) =
+ extract_info lustre_test in
+ let p = define_void_externals cost_incr external_costs p in
+ add_main_def lustre_test_cases lustre_test_cycles lustre_test_min_int
+ lustre_test_max_int booleans inputs step_fun step_cost cost_var p
--- /dev/null
+
+(** [add_lustre_main lustre_test lustre_test_cases lustre_test_cycles
+ lustre_test_min_int lustre_test_max_int ast] adds a main function that tests
+ a Lustre step function to a Clight AST. The file [lustre_test] contains
+ CerCo information (e.g. the name of the cost variable). The integer
+ [lustre_test_cases] is the number of test cases that are performed, and the
+ integer [lustre_test_cycles] is the number of cycles per test
+ case. [lustre_test_min_int] (resp. [lustre_test_max_int]) is the minimum
+ (resp. maximum) integer value randomly generated during testing, and. *)
+
+val add : string -> int -> int -> int -> int -> Clight.program -> Clight.program
--- /dev/null
+
+let process_filename ?is_lustre_file ?remove_lustre_externals file =
+ let temp_dir = Filename.dirname file in
+ let tmp_file1 = Filename.temp_file ~temp_dir "cparser1" ".c"
+ and tmp_file2 = Filename.temp_file ~temp_dir "cparser2" ".i"
+ and prepro_opts = [] in
+
+ (* Add CerCo's primitives *)
+ let _ =
+ try
+ let oc = open_out tmp_file1 in
+ if is_lustre_file = Some true || remove_lustre_externals = Some true then
+ output_string oc "#include<string.h>";
+ output_string oc Primitive.prototypes ;
+ close_out oc
+ with Sys_error _ -> failwith "Error adding primitive prototypes." in
+ let rc = Sys.command
+ (Printf.sprintf "cat %s >> %s"
+ (Filename.quote file) (Filename.quote tmp_file1)) in
+ if rc <> 0 then (
+ Misc.SysExt.safe_remove tmp_file1;
+ failwith "Error adding primitive prototypes."
+ );
+
+ (* Preprocessing *)
+ Cparser.Builtins.set Cparser.GCC.builtins;
+ let rc = Sys.command
+ (Printf.sprintf "gcc -E -U__GNUC__ %s %s > %s"
+ (String.concat " " (List.map Filename.quote prepro_opts))
+ (Filename.quote tmp_file1) (Filename.quote tmp_file2)) in
+ if rc <> 0 then (
+ Misc.SysExt.safe_remove tmp_file1;
+ Misc.SysExt.safe_remove tmp_file2;
+ failwith "Error calling gcc."
+ );
+
+ (* C to Cil *)
+ let ic = open_in tmp_file2 in
+ let lexbuf = Lexing.from_channel ic in
+ lexbuf.Lexing.lex_curr_p <- { lexbuf.Lexing.lex_curr_p with Lexing.pos_fname = tmp_file2 };
+ let r = Cparser.Parse.preprocessed_file "CSf" file lexbuf in
+ close_in ic;
+ match r with
+ | None -> failwith "Error during C parsing."
+ | Some p ->
+ (* Cil to Clight *)
+ (match ClightFromC.convertProgram p with
+ | None -> failwith "Error during C to Clight pass."
+ | Some(pp) ->
+ Misc.SysExt.safe_remove tmp_file1;
+ Misc.SysExt.safe_remove tmp_file2;
+ if remove_lustre_externals = Some true then ClightLustre.simplify pp
+ else pp)
+
+let process_source name contents =
+ let lexbuf = Lexing.from_string contents in
+ let r = Cparser.Parse.preprocessed_file "CSf" name lexbuf in
+ match r with
+ | None -> failwith "Error during C parsing."
+ | Some p ->
+ (* Cil to Clight *)
+ (match ClightFromC.convertProgram p with
+ | None -> failwith "Error during C to Clight pass."
+ | Some (pp) ->
+ pp)
+
+let process ?is_lustre_file ?remove_lustre_externals = function
+ | `Filename file ->
+ process_filename ?is_lustre_file ?remove_lustre_externals file
+ | `Source (name, contents) ->
+ process_source name contents
+
--- /dev/null
+
+(** This module implements a parser for [C] based on [gcc] and
+ [CIL]. *)
+
+(** [process ?is_lustre_file ?remove_lustre_externals filename] parses the
+ contents of [filename] to obtain an abstract syntax tree that represents a
+ Clight program. *)
+val process :
+ ?is_lustre_file:bool -> ?remove_lustre_externals:bool ->
+ [`Filename of string | `Source of string * string] -> Clight.program
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(** Pretty-printer for Csyntax *)
+
+open Format
+open AST
+open Clight
+
+let name_unop = function
+ | Onotbool -> "!"
+ | Onotint -> "~"
+ | Oneg -> "-"
+
+
+let name_binop = function
+ | Oadd -> "+"
+ | Osub -> "-"
+ | Omul -> "*"
+ | Odiv -> "/"
+ | Omod -> "%"
+ | Oand -> "&"
+ | Oor -> "|"
+ | Oxor -> "^"
+ | Oshl -> "<<"
+ | Oshr -> ">>"
+ | Oeq -> "=="
+ | One -> "!="
+ | Olt -> "<"
+ | Ogt -> ">"
+ | Ole -> "<="
+ | Oge -> ">="
+
+let name_inttype sz sg =
+ match sz, sg with
+ | I8, Signed -> "signed char"
+ | I8, Unsigned -> "unsigned char"
+ | I16, Signed -> "short"
+ | I16, Unsigned -> "unsigned short"
+ | I32, Signed -> "int"
+ | I32, Unsigned -> "unsigned int"
+
+let name_floattype sz =
+ match sz with
+ | F32 -> "float"
+ | F64 -> "double"
+
+(* Collecting the names and fields of structs and unions *)
+
+module StructUnionSet = Set.Make(struct
+ type t = string * (ident*ctype) list
+ let compare (n1, _ : t) (n2, _ : t) = compare n1 n2
+end)
+
+let struct_unions = ref StructUnionSet.empty
+
+let register_struct_union id fld =
+ struct_unions := StructUnionSet.add (id, fld) !struct_unions
+
+(* Declarator (identifier + type) *)
+
+let name_optid id =
+ if id = "" then "" else " " ^ id
+
+let parenthesize_if_pointer id =
+ if String.length id > 0 && id.[0] = '*' then "(" ^ id ^ ")" else id
+
+let rec name_cdecl id ty =
+ match ty with
+ | Tvoid ->
+ "void" ^ name_optid id
+ | Tint(sz, sg) ->
+ name_inttype sz sg ^ name_optid id
+ | Tfloat sz ->
+ name_floattype sz ^ name_optid id
+ | Tpointer t ->
+ name_cdecl ("*" ^ id) t
+ | Tarray(t, n) ->
+ name_cdecl
+ (sprintf "%s[%ld]" (parenthesize_if_pointer id) (Int32.of_int n))
+ t
+ | Tfunction(args, res) ->
+ let b = Buffer.create 20 in
+ if id = ""
+ then Buffer.add_string b "(*)"
+ else Buffer.add_string b (parenthesize_if_pointer id);
+ Buffer.add_char b '(';
+ begin match args with
+ | [] ->
+ Buffer.add_string b "void"
+ | _ ->
+ let rec add_args first = function
+ | [] -> ()
+ | t1::tl ->
+ if not first then Buffer.add_string b ", ";
+ Buffer.add_string b (name_cdecl "" t1);
+ add_args false tl in
+ add_args true args
+ end;
+ Buffer.add_char b ')';
+ name_cdecl (Buffer.contents b) res
+ | Tstruct(name, fld) ->
+ name ^ name_optid id
+ | Tunion(name, fld) ->
+ name ^ name_optid id
+ | Tcomp_ptr name ->
+ name ^ " *" ^ id
+
+(* Type *)
+
+let name_type ty = name_cdecl "" ty
+
+(* Expressions *)
+
+let parenthesis_level (Expr (e, ty)) =
+ match e with
+ | Econst_int _ -> 0
+ | Econst_float _ -> 0
+ | Evar _ -> 0
+ | Eunop(_, _) -> 30
+ | Ederef _ -> 20
+ | Eaddrof _ -> 30
+ | Ebinop(op, _, _) ->
+ begin match op with
+ | Oand | Oor | Oxor -> 75
+ | Oeq | One | Olt | Ogt | Ole | Oge -> 70
+ | Oadd | Osub | Oshl | Oshr -> 60
+ | Omul | Odiv | Omod -> 40
+ end
+ | Ecast _ -> 30
+ | Econdition(_, _, _) -> 80
+ | Eandbool(_, _) -> 80
+ | Eorbool(_, _) -> 80
+ | Esizeof _ -> 20
+ | Efield _ -> 20
+ | Ecost (_,_) -> 20
+ | Ecall (_,_,_) -> 20
+
+let rec print_expr p (Expr (eb, ty) as e) =
+ let level = parenthesis_level e in
+ match eb with
+ | Econst_int n ->
+ fprintf p "%ld" (Int32.of_int n)
+ | Econst_float f ->
+ fprintf p "%F" f
+ | Evar id ->
+ fprintf p "%s" id
+ | Eunop(op, e1) ->
+ fprintf p "%s%a" (name_unop op) print_expr_prec (level, e1)
+ | Ederef (Expr (Ebinop(Oadd, e1, e2), _)) ->
+ fprintf p "@[<hov 2>%a@,[%a]@]"
+ print_expr_prec (level, e1)
+ print_expr_prec (level, e2)
+ | Ederef (Expr (Efield(e1, id), _)) ->
+ fprintf p "%a->%s" print_expr_prec (level, e1) id
+ | Ederef e ->
+ fprintf p "*%a" print_expr_prec (level, e)
+ | Eaddrof e ->
+ fprintf p "&%a" print_expr_prec (level, e)
+ | Ebinop(op, e1, e2) ->
+ fprintf p "@[<hov 0>%a@ %s %a@]"
+ print_expr_prec (level, e1)
+ (name_binop op)
+ print_expr_prec (level, e2)
+ | Ecast(ty, e1) ->
+ fprintf p "@[<hov 2>(%s)@,%a@]"
+ (name_type ty)
+ print_expr_prec (level, e1)
+ | Econdition(e1, e2, e3) ->
+ fprintf p "@[<hov 0>%a@ ? %a@ : %a@]"
+ print_expr_prec (level, e1)
+ print_expr_prec (level, e2)
+ print_expr_prec (level, e3)
+ | Eandbool(e1, e2) ->
+ fprintf p "@[<hov 0>%a@ && %a@]"
+ print_expr_prec (level, e1)
+ print_expr_prec (level, e2)
+ | Eorbool(e1, e2) ->
+ fprintf p "@[<hov 0>%a@ || %a@]"
+ print_expr_prec (level, e1)
+ print_expr_prec (level, e2)
+ | Esizeof ty ->
+ fprintf p "sizeof(%s)" (name_type ty)
+ | Efield(e1, id) ->
+ fprintf p "%a.%s" print_expr_prec (level, e1) id
+ | Ecost (lbl,e1) ->
+ fprintf p "(/* %s */ %a)" lbl print_expr e1
+ | Ecall (f, arg, e) ->
+ fprintf p "(%s(%a), %a)" f print_expr arg print_expr e
+
+and print_expr_prec p (context_prec, e) =
+ let this_prec = parenthesis_level e in
+ if this_prec >= context_prec
+ then fprintf p "(%a)" print_expr e
+ else print_expr p e
+
+let rec print_expr_list p (first, el) =
+ match el with
+ | [] -> ()
+ | e1 :: et ->
+ if not first then fprintf p ",@ ";
+ print_expr p e1;
+ print_expr_list p (false, et)
+
+let rec print_stmt p s =
+ match s with
+ | Sskip ->
+ fprintf p "/*skip*/;"
+ | Sassign(e1, e2) ->
+ fprintf p "@[<hv 2>%a =@ %a;@]" print_expr e1 print_expr e2
+ | Scall(None, e1, el) ->
+ fprintf p "@[<hv 2>%a@,(@[<hov 0>%a@]);@]"
+ print_expr e1
+ print_expr_list (true, el)
+ | Scall(Some lhs, e1, el) ->
+ fprintf p "@[<hv 2>%a =@ %a@,(@[<hov 0>%a@]);@]"
+ print_expr lhs
+ print_expr e1
+ print_expr_list (true, el)
+ | Ssequence(s1, s2) ->
+ fprintf p "%a@ %a" print_stmt s1 print_stmt s2
+ | Sifthenelse(e, s1, Sskip) ->
+ fprintf p "@[<v 2>if (%a) {@ %a@;<0 -2>}@]"
+ print_expr e
+ print_stmt s1
+ | Sifthenelse(e, s1, s2) ->
+ fprintf p "@[<v 2>if (%a) {@ %a@;<0 -2>} else {@ %a@;<0 -2>}@]"
+ print_expr e
+ print_stmt s1
+ print_stmt s2
+ | Swhile(e, s) ->
+ fprintf p "@[<v 2>while (%a) {@ %a@;<0 -2>}@]"
+ print_expr e
+ print_stmt s
+ | Sdowhile(e, s) ->
+ fprintf p "@[<v 2>do {@ %a@;<0 -2>} while(%a);@]"
+ print_stmt s
+ print_expr e
+ | Sfor(s_init, e, s_iter, s_body) ->
+ fprintf p "@[<v 2>for (@[<hv 0>%a;@ %a;@ %a) {@]@ %a@;<0 -2>}@]"
+ print_stmt_for s_init
+ print_expr e
+ print_stmt_for s_iter
+ print_stmt s_body
+ | Sbreak ->
+ fprintf p "break;"
+ | Scontinue ->
+ fprintf p "continue;"
+ | Sswitch(e, cases) ->
+ fprintf p "@[<v 2>switch (%a) {@ %a@;<0 -2>}@]"
+ print_expr e
+ print_cases cases
+ | Sreturn None ->
+ fprintf p "return;"
+ | Sreturn (Some e) ->
+ fprintf p "return %a;" print_expr e
+ | Slabel(lbl, s1) ->
+ fprintf p "%s:@ %a" lbl print_stmt s1
+ | Sgoto lbl ->
+ fprintf p "goto %s;" lbl
+ | Scost (lbl,s1) ->
+ fprintf p "%s:@ %a" lbl print_stmt s1
+
+and print_cases p cases =
+ match cases with
+ | LSdefault Sskip ->
+ ()
+ | LSdefault s ->
+ fprintf p "@[<v 2>default:@ %a@]" print_stmt s
+ | LScase(lbl, Sskip, rem) ->
+ fprintf p "case %ld:@ %a"
+ (Int32.of_int lbl)
+ print_cases rem
+ | LScase(lbl, s, rem) ->
+ fprintf p "@[<v 2>case %ld:@ %a@]@ %a"
+ (Int32.of_int lbl)
+ print_stmt s
+ print_cases rem
+
+and print_stmt_for p s =
+ match s with
+ | Sskip ->
+ fprintf p "/*nothing*/"
+ | Sassign(e1, e2) ->
+ fprintf p "%a = %a" print_expr e1 print_expr e2
+ | Ssequence(s1, s2) ->
+ fprintf p "%a, %a" print_stmt_for s1 print_stmt_for s2
+ | Scall(None, e1, el) ->
+ fprintf p "@[<hv 2>%a@,(@[<hov 0>%a@])@]"
+ print_expr e1
+ print_expr_list (true, el)
+ | Scall(Some lhs, e1, el) ->
+ fprintf p "@[<hv 2>%a =@ %a@,(@[<hov 0>%a@])@]"
+ print_expr lhs
+ print_expr e1
+ print_expr_list (true, el)
+ | _ ->
+ fprintf p "({ %a })" print_stmt s
+
+let name_function_parameters fun_name params =
+ let b = Buffer.create 20 in
+ Buffer.add_string b fun_name;
+ Buffer.add_char b '(';
+ begin match params with
+ | [] ->
+ Buffer.add_string b "void"
+ | _ ->
+ let rec add_params first = function
+ | [] -> ()
+ | (id, ty) :: rem ->
+ if not first then Buffer.add_string b ", ";
+ Buffer.add_string b (name_cdecl id ty);
+ add_params false rem in
+ add_params true params
+ end;
+ Buffer.add_char b ')';
+ Buffer.contents b
+
+let print_function p id f =
+ fprintf p "%s@ "
+ (name_cdecl (name_function_parameters id f.fn_params)
+ f.fn_return);
+ fprintf p "@[<v 2>{@ ";
+ List.iter
+ (fun ((id, ty)) ->
+ fprintf p "%s;@ " (name_cdecl id ty))
+ f.fn_vars;
+ print_stmt p f.fn_body;
+ fprintf p "@;<0 -2>}@]@ @ "
+
+let print_fundef p (id, fd) =
+ match fd with
+ | External(_, args, res) ->
+ fprintf p "extern %s;@ @ "
+ (name_cdecl id (Tfunction(args, res)))
+ | Internal f ->
+ print_function p id f
+
+let string_of_init id =
+ let b = Buffer.create (List.length id) in
+ let add_init = function
+ | Init_int8 n ->
+ if n >= 32 && n <= 126 && n <> Char.code '\"' && n <> Char.code '\\'
+ then Buffer.add_char b (Char.chr n)
+ else Buffer.add_string b (Printf.sprintf "\\%03o" n)
+ | _ ->
+ assert false
+ in List.iter add_init id; Buffer.contents b
+
+let chop_last_nul id =
+ match List.rev id with
+ | Init_int8 0 :: tl -> List.rev tl
+ | _ -> id
+
+let print_init p = function
+ | Init_int8 n -> fprintf p "%ld,@ " (Int32.of_int n)
+ | Init_int16 n -> fprintf p "%ld,@ " (Int32.of_int n)
+ | Init_int32 n -> fprintf p "%ld,@ " (Int32.of_int n)
+ | Init_float32 n -> fprintf p "%F,@ " n
+ | Init_float64 n -> fprintf p "%F,@ " n
+ | Init_space n -> fprintf p "/* skip %ld, */@ " (Int32.of_int n)
+ | Init_addrof(symb, ofs) ->
+ let ofs = Int32.of_int ofs in
+ if ofs = Int32.zero
+ then fprintf p "&%s,@ " symb
+ else fprintf p "(void *)((char *)&%s + %ld),@ " symb ofs
+
+let print_init1 p = function
+ | Init_int8 n -> fprintf p "%ld" (Int32.of_int n)
+ | Init_int16 n -> fprintf p "%ld" (Int32.of_int n)
+ | Init_int32 n -> fprintf p "%ld" (Int32.of_int n)
+ | Init_float32 n -> fprintf p "%F" n
+ | Init_float64 n -> fprintf p "%F" n
+ | Init_space n -> fprintf p "/* skip %ld */" (Int32.of_int n)
+ | Init_addrof(symb, ofs) ->
+ let ofs = Int32.of_int ofs in
+ if ofs = Int32.zero
+ then fprintf p "&%s" symb
+ else fprintf p "(void *)((char *)&%s + %ld)" symb ofs
+
+let match_string_literal s pos =
+ let s_len = String.length s - 1 in
+ let prefix = "__stringlit_" in
+ let len_prefix = String.length prefix in
+ s_len >= len_prefix
+ && String.sub s 0 len_prefix = prefix &&
+ match Misc.LexingExt.lex_num s len_prefix with
+ | None -> false
+ | Some (pos, pos', v) -> pos' = String.length s - 1
+
+let print_globvar p (((id, init), ty)) =
+ match init with
+ | [] ->
+ fprintf p "extern %s;@ @ "
+ (name_cdecl id ty)
+ | [Init_space _] ->
+ fprintf p "%s;@ @ "
+ (name_cdecl id ty)
+ | [init] ->
+ fprintf p "@[<hov 2>%s = %a;@]@ @ "
+ (name_cdecl id ty) print_init1 init
+ | _ ->
+ fprintf p "@[<hov 2>%s = "
+ (name_cdecl id ty);
+ if match_string_literal id 0
+ && List.for_all (function Init_int8 _ -> true | _ -> false) init
+ then
+ fprintf p "\"%s\"" (string_of_init (chop_last_nul init))
+ else begin
+ fprintf p "{@ ";
+ List.iter (print_init p) init;
+ fprintf p "}"
+ end;
+ fprintf p ";@]@ @ "
+
+(* Collect struct and union types *)
+
+let rec collect_type = function
+ | Tvoid -> ()
+ | Tint(sz, sg) -> ()
+ | Tfloat sz -> ()
+ | Tpointer t -> collect_type t
+ | Tarray(t, n) -> collect_type t
+ | Tfunction(args, res) -> collect_type_list args; collect_type res
+ | Tstruct(id, fld) -> register_struct_union id fld; collect_fields fld
+ | Tunion(id, fld) -> register_struct_union id fld; collect_fields fld
+ | Tcomp_ptr _ -> ()
+
+and collect_type_list = function
+ | [] -> ()
+ | hd::tl -> collect_type hd; collect_type_list tl
+
+and collect_fields = function
+ | [] -> ()
+ | (id, hd)::tl -> collect_type hd; collect_fields tl
+
+let rec collect_expr (Expr(ed, ty)) =
+ match ed with
+ | Econst_int n -> ()
+ | Econst_float f -> ()
+ | Evar id -> ()
+ | Eunop(op, e1) -> collect_expr e1
+ | Ederef e -> collect_expr e
+ | Eaddrof e -> collect_expr e
+ | Ebinop(op, e1, e2) -> collect_expr e1; collect_expr e2
+ | Ecast(ty, e1) -> collect_type ty; collect_expr e1
+ | Econdition(e1, e2, e3) -> collect_expr e1; collect_expr e2; collect_expr e3
+ | Eandbool(e1, e2) -> collect_expr e1; collect_expr e2
+ | Eorbool(e1, e2) -> collect_expr e1; collect_expr e2
+ | Esizeof ty -> collect_type ty
+ | Efield(e1, id) -> collect_expr e1
+ | Ecost(_, e) -> collect_expr e
+ | Ecall(_, arg, e) -> collect_expr arg; collect_expr e
+
+let rec collect_expr_list = function
+ | [] -> ()
+ | hd :: tl -> collect_expr hd; collect_expr_list tl
+
+let rec collect_stmt = function
+ | Sskip -> ()
+ | Sassign(e1, e2) -> collect_expr e1; collect_expr e2
+ | Scall(None, e1, el) -> collect_expr e1; collect_expr_list el
+ | Scall(Some lhs, e1, el) -> collect_expr lhs; collect_expr e1; collect_expr_list el
+ | Ssequence(s1, s2) -> collect_stmt s1; collect_stmt s2
+ | Sifthenelse(e, s1, s2) -> collect_expr e; collect_stmt s1; collect_stmt s2
+ | Swhile(e, s) -> collect_expr e; collect_stmt s
+ | Sdowhile(e, s) -> collect_stmt s; collect_expr e
+ | Sfor(s_init, e, s_iter, s_body) ->
+ collect_stmt s_init; collect_expr e;
+ collect_stmt s_iter; collect_stmt s_body
+ | Sbreak -> ()
+ | Scontinue -> ()
+ | Sswitch(e, cases) -> collect_expr e; collect_cases cases
+ | Sreturn None -> ()
+ | Sreturn (Some e) -> collect_expr e
+ | Slabel(lbl, s) -> collect_stmt s
+ | Sgoto lbl -> ()
+ | Scost (_,s1) -> collect_stmt s1
+
+and collect_cases = function
+ | LSdefault s -> collect_stmt s
+ | LScase(lbl, s, rem) -> collect_stmt s; collect_cases rem
+
+let collect_function f =
+ collect_type f.fn_return;
+ List.iter (fun ((id, ty)) -> collect_type ty) f.fn_params;
+ List.iter (fun ((id, ty)) -> collect_type ty) f.fn_vars;
+ collect_stmt f.fn_body
+
+let collect_fundef ((id, fd)) =
+ match fd with
+ | External(_, args, res) -> collect_type_list args; collect_type res
+ | Internal f -> collect_function f
+
+let collect_globvar (((id, init), ty)) =
+ collect_type ty
+
+let collect_program p =
+ List.iter collect_globvar p.prog_vars;
+ List.iter collect_fundef p.prog_funct
+
+let declare_struct_or_union p (name, fld) =
+ fprintf p "%s;@ @ " name
+
+let print_struct_or_union p (name, fld) =
+ fprintf p "@[<v 2>%s {" name;
+ let rec print_fields = function
+ | [] -> ()
+ | (id, ty)::rem ->
+ fprintf p "@ %s;" (name_cdecl id ty);
+ print_fields rem in
+ print_fields fld;
+ fprintf p "@;<0 -2>};@]@ "
+
+let print_program_2 p prog =
+ struct_unions := StructUnionSet.empty;
+ collect_program prog;
+ fprintf p "@[<v 0>";
+ StructUnionSet.iter (declare_struct_or_union p) !struct_unions;
+ StructUnionSet.iter (print_struct_or_union p) !struct_unions;
+ List.iter (print_globvar p) prog.prog_vars;
+ List.iter (print_fundef p) prog.prog_funct;
+ fprintf p "@]@."
+
+let print_program prog =
+ print_program_2 str_formatter prog;
+ flush_str_formatter ()
+
+let string_of_ctype = name_type
+
+let print_expression e =
+ print_expr str_formatter e;
+ flush_str_formatter ()
+
+let print_statement s =
+ print_stmt str_formatter s;
+ flush_str_formatter ()
+
+let print_ctype_prot = name_type
+
+let print_ctype_def = function
+ | Tstruct (name, fld) | Tunion (name, fld) ->
+ let f_fld s (id, t) = s ^ " " ^ (print_ctype_prot t) ^ " " ^ id ^ ";\n" in
+ let s_fld = List.fold_left f_fld "" in
+ name ^ " {\n" ^ (s_fld fld) ^ "};\n"
+ | _ -> "" (* no definition associated to the other types *)
+
+let string_of_unop = name_unop
+
+let string_of_binop = name_binop
--- /dev/null
+(** This module provides functions to print elements of [Clight]
+ programs. *)
+
+val print_program: Clight.program -> string
+
+val print_expression: Clight.expr -> string
+
+val string_of_ctype: Clight.ctype -> string
+
+val print_statement: Clight.statement -> string
+
+val print_ctype_prot: Clight.ctype -> string
+
+val print_ctype_def: Clight.ctype -> string
+
+val string_of_unop : Clight.unary_operation -> string
+
+val string_of_binop : Clight.binary_operation -> string
--- /dev/null
+
+(** This module performs a switch simplification: they are replaced by
+ equivalent if-then-else statements. This is a temporary hack before
+ implementing switch tables. *)
+
+let type_of (Clight.Expr (_, t)) = t
+
+
+let f_expr e _ = e
+
+let f_stmt lbl stmt sub_exprs_res sub_stmts_res =
+ match stmt, sub_stmts_res with
+ | Clight.Sbreak, _ -> Clight.Sgoto lbl
+ | Clight.Swhile _, _ | Clight.Sdowhile _, _
+ | Clight.Sfor _, _ | Clight.Sswitch _, _ -> stmt
+ | _ -> ClightFold.statement_fill_subs stmt sub_exprs_res sub_stmts_res
+
+let replace_undeep_break lbl = ClightFold.statement2 f_expr (f_stmt lbl)
+
+
+let add_starting_lbl fresh stmt =
+ let lbl = fresh () in
+ (lbl, Clight.Slabel (lbl, stmt))
+
+let add_starting_lbl_list fresh stmts = List.map (add_starting_lbl fresh) stmts
+
+let add_ending_goto lbl stmt =
+ Clight.Ssequence (stmt, Clight.Slabel (lbl, Clight.Sskip))
+
+let make_sequence stmts =
+ let f sequence stmt = Clight.Ssequence (sequence, stmt) in
+ List.fold_left f Clight.Sskip stmts
+
+let simplify_switch fresh e cases stmts =
+ let exit_lbl = fresh () in
+ let (lbls, stmts) = List.split (add_starting_lbl_list fresh stmts) in
+ let stmts = List.map (replace_undeep_break exit_lbl) stmts in
+ let rec aux cases lbls = match cases, lbls with
+ | Clight.LSdefault _, lbl :: _ -> [Clight.Sgoto lbl]
+ | Clight.LScase (i, _, cases), lbl :: lbls ->
+ let next_cases = aux cases lbls in
+ let ret_type = Clight.Tint (Clight.I32, AST.Signed) in
+ let cst_i = Clight.Expr (Clight.Econst_int i, type_of e) in
+ let test = Clight.Expr (Clight.Ebinop (Clight.Oeq, e, cst_i), ret_type) in
+ Clight.Sifthenelse (test, Clight.Sgoto lbl, Clight.Sskip) :: next_cases
+ | _ ->
+ (* Do not use on these arguments: wrong list size. *)
+ assert false in
+ add_ending_goto exit_lbl (make_sequence ((aux cases lbls) @ stmts))
+
+let f_expr e _ = e
+
+let f_stmt fresh stmt sub_exprs_res sub_stmts_res =
+ match stmt, sub_stmts_res with
+ | Clight.Sswitch (e, cases), sub_stmts ->
+ simplify_switch fresh e cases sub_stmts
+ | _ -> ClightFold.statement_fill_subs stmt sub_exprs_res sub_stmts_res
+
+let simplify_statement fresh = ClightFold.statement2 f_expr (f_stmt fresh)
+
+let simplify_fundef fresh = function
+ | Clight.Internal cfun ->
+ let fn_body = simplify_statement fresh cfun.Clight.fn_body in
+ Clight.Internal { cfun with Clight.fn_body = fn_body }
+ | fundef -> fundef
+
+let simplify p =
+ let labels = ClightAnnotator.all_labels p in
+ let fresh = StringTools.make_fresh labels "_tmp_switch" in
+ let f (id, fundef) = (id, simplify_fundef fresh fundef) in
+ { p with Clight.prog_funct = List.map f p.Clight.prog_funct }
--- /dev/null
+
+(** This module performs a switch simplification: they are replaced by
+ equivalent if-then-else statements. This is a temporary hack before
+ implementing switch tables. *)
+
+val simplify : Clight.program -> Clight.program
--- /dev/null
+
+
+let error_prefix = "Clight to Cminor"
+let error = Error.global_error error_prefix
+let error_float () = error "float not supported."
+
+
+(* General helpers *)
+
+let clight_type_of (Clight.Expr (_, t)) = t
+
+let cminor_type_of (Cminor.Expr (_, t)) = t
+
+
+(* Translate types *)
+
+let byte_size_of_intsize = function
+ | Clight.I8 -> 1
+ | Clight.I16 -> 2
+ | Clight.I32 -> 4
+
+let sig_type_of_ctype = function
+ | Clight.Tvoid -> assert false (* do not use on this argument *)
+ | Clight.Tint (intsize, sign) ->
+ AST.Sig_int (byte_size_of_intsize intsize, sign)
+ | Clight.Tfloat _ -> error_float ()
+ | Clight.Tfunction _ | Clight.Tstruct _ | Clight.Tunion _
+ | Clight.Tpointer _ | Clight.Tarray _ | Clight.Tcomp_ptr _ -> AST.Sig_ptr
+
+let translate_args_types = List.map sig_type_of_ctype
+
+let type_return_of_ctype = function
+ | Clight.Tvoid -> AST.Type_void
+ | t -> AST.Type_ret (sig_type_of_ctype t)
+
+let quantity_of_sig_type = function
+ | AST.Sig_int (size, _) -> AST.QInt size
+ | AST.Sig_float _ -> error_float ()
+ | AST.Sig_offset -> AST.QOffset
+ | AST.Sig_ptr -> AST.QPtr
+
+let quantity_of_ctype t = quantity_of_sig_type (sig_type_of_ctype t)
+
+let rec sizeof_ctype = function
+ | Clight.Tvoid | Clight.Tfunction _ -> AST.SQ (AST.QInt 1)
+ | Clight.Tfloat _ -> error_float ()
+ | Clight.Tint (size, _) -> AST.SQ (AST.QInt (byte_size_of_intsize size))
+ | Clight.Tpointer _
+ | Clight.Tcomp_ptr _ -> AST.SQ AST.QPtr
+ | Clight.Tarray (t, n) -> AST.SArray (n, sizeof_ctype t)
+ | Clight.Tstruct (_, fields) ->
+ AST.SProd (List.map sizeof_ctype (List.map snd fields))
+ | Clight.Tunion (_, fields) ->
+ AST.SSum (List.map sizeof_ctype (List.map snd fields))
+
+let global_size_of_ctype = sizeof_ctype
+
+
+(** Helpers on abstract sizes and offsets *)
+
+let max_stacksize size1 size2 = match size1, size2 with
+ | AST.SProd l1, AST.SProd l2 when List.length l1 > List.length l2 -> size1
+ | AST.SProd l1, AST.SProd l2 -> size2
+ | _ -> raise (Failure "ClightToCminor.max_stacksize")
+
+(** Hypothesis: [offset1] is a prefix of [offset2] or vice-versa. *)
+let max_offset offset1 offset2 =
+ if List.length offset1 > List.length offset2 then offset1
+ else offset2
+
+let next_depth = function
+ | AST.SProd l -> List.length l
+ | _ -> raise (Failure "ClightToCminor.next_offset")
+
+let add_stack offset =
+ let e1 = Cminor.Expr (Cminor.Cst AST.Cst_stack, AST.Sig_ptr) in
+ let e2 = Cminor.Expr (Cminor.Cst (AST.Cst_offset offset), AST.Sig_offset) in
+ Cminor.Op2 (AST.Op_addp, e1, e2)
+
+let add_stacksize t = function
+ | AST.SProd l -> AST.SProd (l @ [sizeof_ctype t])
+ | _ -> raise (Failure "ClightToCminor.add_stacksize")
+
+let struct_depth field fields =
+ let rec aux i = function
+ | [] -> error ("unknown field " ^ field ^ ".")
+ | (field', t) :: _ when field' = field -> i
+ | (_, t) :: fields -> aux (i+1) fields in
+ aux 0 fields
+
+let struct_offset t field fields =
+ let size = sizeof_ctype t in
+ let depth = struct_depth field fields in
+ let offset = (size, depth) in
+ let t = AST.Sig_offset in
+ Cminor.Expr (Cminor.Cst (AST.Cst_offset offset), t)
+
+
+(** Sort variables: locals, parameters, globals, in stack. *)
+
+type location =
+ | Local
+ | LocalStack of AST.abstract_offset
+ | Param
+ | ParamStack of AST.abstract_offset
+ | Global
+
+(** Below are some helper definitions to ease the manipulation of a translation
+ environment for variables. *)
+
+type var_locations = (location * Clight.ctype) StringTools.Map.t
+
+let empty_var_locs : var_locations = StringTools.Map.empty
+
+let add_var_locs : AST.ident -> (location * Clight.ctype) -> var_locations ->
+ var_locations =
+ StringTools.Map.add
+
+let mem_var_locs : AST.ident -> var_locations -> bool = StringTools.Map.mem
+
+let find_var_locs : AST.ident -> var_locations -> (location * Clight.ctype) =
+ StringTools.Map.find
+
+let fold_var_locs : (AST.ident -> (location * Clight.ctype) -> 'a -> 'a) ->
+ var_locations -> 'a -> 'a =
+ StringTools.Map.fold
+
+
+let is_local_or_param id var_locs = match find_var_locs id var_locs with
+ | (Local, _) | (Param, _) -> true
+ | _ -> false
+
+let get_locals var_locs =
+ let f id (location, ctype) locals =
+ let added = match location with
+ | Local -> [(id, sig_type_of_ctype ctype)]
+ | _ -> [] in
+ locals @ added in
+ fold_var_locs f var_locs []
+
+let get_stacksize var_locs =
+ let f _ (location, _) res = match location with
+ | LocalStack (stacksize, _) | ParamStack (stacksize, _) ->
+ max_stacksize res stacksize
+ | _ -> res in
+ fold_var_locs f var_locs (AST.SProd [])
+
+
+(* Variables of a function that will go in stack: variables of a complex type
+ (array, structure or union) and variables whose address is evaluated. *)
+
+let is_function_ctype = function
+ | Clight.Tfunction _ -> true
+ | _ -> false
+
+let is_scalar_ctype : Clight.ctype -> bool = function
+ | Clight.Tint _ | Clight.Tfloat _ | Clight.Tpointer _ -> true
+ | _ -> false
+
+let is_complex_ctype : Clight.ctype -> bool = function
+ | Clight.Tarray _ | Clight.Tstruct _ | Clight.Tunion _ | Clight.Tfunction _ ->
+ true
+ | _ -> false
+
+let complex_ctype_vars cfun =
+ let f set (x, t) =
+ if is_complex_ctype t then StringTools.Set.add x set else set in
+ (* Because of CIL, parameters should not have a complex type, but let's add
+ them just in case. *)
+ List.fold_left f StringTools.Set.empty
+ (cfun.Clight.fn_params @ cfun.Clight.fn_vars)
+
+let union_list = List.fold_left StringTools.Set.union StringTools.Set.empty
+
+let f_expr (Clight.Expr (ed, _)) sub_exprs_res =
+ let res_ed = match ed with
+ | Clight.Eaddrof (Clight.Expr (Clight.Evar id, _)) ->
+ StringTools.Set.singleton id
+ | _ -> StringTools.Set.empty in
+ union_list (res_ed :: sub_exprs_res)
+
+let f_stmt _ sub_exprs_res sub_stmts_res =
+ union_list (sub_exprs_res @ sub_stmts_res)
+
+let addr_vars_fun cfun = ClightFold.statement2 f_expr f_stmt cfun.Clight.fn_body
+
+let stack_vars cfun =
+ StringTools.Set.union (complex_ctype_vars cfun) (addr_vars_fun cfun)
+
+
+let sort_stacks stack_location vars var_locs =
+ let stacksize = get_stacksize var_locs in
+ let f (current_stacksize, var_locs) (id, t) =
+ let depth = next_depth current_stacksize in
+ let current_stacksize = add_stacksize t current_stacksize in
+ let offset = (current_stacksize, depth) in
+ let var_locs = add_var_locs id (stack_location offset, t) var_locs in
+ (current_stacksize, var_locs) in
+ snd (List.fold_left f (stacksize, var_locs) vars)
+
+let sort_normals normal_location vars var_locs =
+ let f var_locs (id, ctype) =
+ add_var_locs id (normal_location, ctype) var_locs in
+ List.fold_left f var_locs vars
+
+let sort_vars normal_location stack_location_opt stack_vars vars var_locs =
+ let f_stack (x, _) = StringTools.Set.mem x stack_vars in
+ let (f_normal, var_locs) = match stack_location_opt with
+ | None -> ((fun _ -> true), var_locs)
+ | Some stack_location ->
+ ((fun var -> not (f_stack var)),
+ sort_stacks stack_location (List.filter f_stack vars) var_locs) in
+ sort_normals normal_location (List.filter f_normal vars) var_locs
+
+let sort_locals = sort_vars Local (Some (fun offset -> LocalStack offset))
+
+let sort_params = sort_vars Param (Some (fun offset -> ParamStack offset))
+
+let sort_globals stack_vars globals functs var_locs =
+ let globals = List.map (fun ((id, _), ctype) -> (id, ctype)) globals in
+ let f_functs (id, fundef) =
+ let (params, return) = match fundef with
+ | Clight.Internal cfun ->
+ (List.map snd cfun.Clight.fn_params, cfun.Clight.fn_return)
+ | Clight.External (_, params, return) -> (params, return) in
+ (id, Clight.Tfunction (params, return)) in
+ let functs = List.map f_functs functs in
+ let globals = globals @ functs in
+ sort_vars Global None stack_vars globals var_locs
+
+(* The order of insertion in the sorting environment is important: it follows
+ the scope conventions of C. Local variables hide parameters that hide
+ globals. *)
+
+let sort_variables globals functs cfun =
+ let stack_vars = stack_vars cfun in
+ let var_locs = empty_var_locs in
+ let var_locs = sort_globals stack_vars globals functs var_locs in
+ let var_locs = sort_params stack_vars cfun.Clight.fn_params var_locs in
+ let var_locs = sort_locals stack_vars cfun.Clight.fn_vars var_locs in
+ var_locs
+
+
+(* Translate globals *)
+
+let init_to_data = function
+ | [Clight.Init_space _] -> None
+ | l -> Some (List.map (
+ function
+ | Clight.Init_int8 i -> AST.Data_int8 i
+ | Clight.Init_int16 i -> AST.Data_int16 i
+ | Clight.Init_int32 i -> AST.Data_int32 i
+ | Clight.Init_float32 _
+ | Clight.Init_float64 _ -> error_float ()
+ | Clight.Init_space n -> error "bad global initialization style."
+ | Clight.Init_addrof (_,_) -> assert false (*TODO*)
+) l)
+
+let translate_global ((id,lst),t) = (id,global_size_of_ctype t,init_to_data lst)
+
+
+(* Translate expression *)
+
+let translate_unop = function
+ | Clight.Onotbool -> AST.Op_notbool
+ | Clight.Onotint -> AST.Op_notint
+ | Clight.Oneg -> AST.Op_negint
+
+let esizeof_ctype res_type t =
+ Cminor.Expr (Cminor.Cst (AST.Cst_sizeof (sizeof_ctype t)), res_type)
+
+let translate_add res_type ctype1 ctype2 e1 e2 = match ctype1, ctype2 with
+ | Clight.Tint _, Clight.Tint _ ->
+ Cminor.Expr (Cminor.Op2 (AST.Op_add, e1, e2), res_type)
+ | Clight.Tfloat _, Clight.Tfloat _ -> error_float ()
+ | Clight.Tpointer t, Clight.Tint _
+ | Clight.Tarray (t, _), Clight.Tint _ ->
+ let t2 = cminor_type_of e2 in
+ let size = esizeof_ctype t2 t in
+ let index = Cminor.Expr (Cminor.Op2 (AST.Op_mul, e2, size), t2) in
+ Cminor.Expr (Cminor.Op2 (AST.Op_addp, e1, index), res_type)
+ | Clight.Tint _, Clight.Tpointer t
+ | Clight.Tint _, Clight.Tarray (t, _) ->
+ let t1 = cminor_type_of e1 in
+ let size = esizeof_ctype t1 t in
+ let index = Cminor.Expr (Cminor.Op2 (AST.Op_mul, e1, size), t1) in
+ Cminor.Expr (Cminor.Op2 (AST.Op_addp, e2, index), res_type)
+ | _ -> error "type error."
+
+let translate_sub res_type ctype1 ctype2 e1 e2 = match ctype1, ctype2 with
+ | Clight.Tint _, Clight.Tint _ ->
+ Cminor.Expr (Cminor.Op2 (AST.Op_sub, e1, e2), res_type)
+ | Clight.Tfloat _, Clight.Tfloat _ -> error_float ()
+ | Clight.Tpointer t, Clight.Tint _
+ | Clight.Tarray (t, _), Clight.Tint _ ->
+ let t2 = cminor_type_of e2 in
+ let size = esizeof_ctype t2 t in
+ let index = Cminor.Expr (Cminor.Op2 (AST.Op_mul, e2, size), t2) in
+ Cminor.Expr (Cminor.Op2 (AST.Op_subp, e1, index), res_type)
+ | Clight.Tpointer _, Clight.Tpointer _
+ | Clight.Tarray _, Clight.Tpointer _
+ | Clight.Tpointer _, Clight.Tarray _
+ | Clight.Tarray _, Clight.Tarray _ ->
+ Cminor.Expr (Cminor.Op2 (AST.Op_subpp, e1, e2), res_type)
+ | _ -> error "type error."
+
+let is_signed = function
+ | Clight.Tint (_, AST.Signed) -> true
+ | _ -> false
+
+let is_pointer = function
+ | Clight.Tpointer _ | Clight.Tarray _ -> true
+ | _ -> false
+
+let cmp_of_clight_binop = function
+ | Clight.Oeq -> AST.Cmp_eq
+ | Clight.One -> AST.Cmp_ne
+ | Clight.Olt -> AST.Cmp_lt
+ | Clight.Ole -> AST.Cmp_le
+ | Clight.Ogt -> AST.Cmp_gt
+ | Clight.Oge -> AST.Cmp_ge
+ | _ -> assert false (* do not use on these arguments *)
+
+let translate_simple_binop t = function
+ | Clight.Omul -> AST.Op_mul
+ | Clight.Odiv when is_signed t -> AST.Op_div
+ | Clight.Odiv -> AST.Op_divu
+ | Clight.Omod when is_signed t -> AST.Op_mod
+ | Clight.Omod -> AST.Op_modu
+ | Clight.Oand -> AST.Op_and
+ | Clight.Oor -> AST.Op_or
+ | Clight.Oxor -> AST.Op_xor
+ | Clight.Oshl -> AST.Op_shl
+ | Clight.Oshr when is_signed t -> AST.Op_shr
+ | Clight.Oshr -> AST.Op_shru
+ | binop when is_pointer t -> AST.Op_cmpp (cmp_of_clight_binop binop)
+ | binop when is_signed t -> AST.Op_cmp (cmp_of_clight_binop binop)
+ | binop -> AST.Op_cmpu (cmp_of_clight_binop binop)
+
+let translate_binop res_type ctype1 ctype2 e1 e2 binop =
+ match binop with
+ | Clight.Oadd -> translate_add res_type ctype1 ctype2 e1 e2
+ | Clight.Osub -> translate_sub res_type ctype1 ctype2 e1 e2
+ | _ ->
+ let cminor_binop = translate_simple_binop ctype1 binop in
+ Cminor.Expr (Cminor.Op2 (cminor_binop, e1, e2), res_type)
+
+let translate_ident var_locs res_type x =
+ let ed = match find_var_locs x var_locs with
+ | (Local, _) | (Param, _) -> Cminor.Id x
+ | (LocalStack off, t) | (ParamStack off, t) when is_scalar_ctype t ->
+ let addr = Cminor.Expr (add_stack off, AST.Sig_ptr) in
+ Cminor.Mem (quantity_of_ctype t, addr)
+ | (LocalStack off, _) | (ParamStack off, _) ->
+ add_stack off
+ | (Global, t) when is_scalar_ctype t ->
+ let addr = Cminor.Expr (Cminor.Cst (AST.Cst_addrsymbol x), AST.Sig_ptr) in
+ Cminor.Mem (quantity_of_ctype t, addr)
+ | (Global, _) -> Cminor.Cst (AST.Cst_addrsymbol x) in
+ Cminor.Expr (ed, res_type)
+
+let translate_field res_type t e field =
+ let (fields, offset) = match t with
+ | Clight.Tstruct (_, fields) -> (fields, struct_offset t field fields)
+ | Clight.Tunion (_, fields) ->
+ (fields, Cminor.Expr (Cminor.Cst (AST.Cst_int 0), AST.Sig_offset))
+ | _ -> assert false (* type error *) in
+ let addr = Cminor.Expr (Cminor.Op2 (AST.Op_addp, e, offset), AST.Sig_ptr) in
+ let quantity = quantity_of_ctype (List.assoc field fields) in
+ Cminor.Expr (Cminor.Mem (quantity, addr), res_type)
+
+let translate_cast e src_type dest_type =
+ let res_type = sig_type_of_ctype dest_type in
+ match src_type, dest_type with
+ | Clight.Tint (size1, sign1), Clight.Tint (size2, _) ->
+ let t1 = (byte_size_of_intsize size1, sign1) in
+ let t2 = byte_size_of_intsize size2 in
+ Cminor.Expr (Cminor.Op1 (AST.Op_cast (t1, t2), e), res_type)
+ | Clight.Tint _, Clight.Tpointer _
+ | Clight.Tint _, Clight.Tarray _ ->
+ Cminor.Expr (Cminor.Op1 (AST.Op_ptrofint, e), res_type)
+ | Clight.Tpointer _, Clight.Tint _
+ | Clight.Tarray _, Clight.Tint _ ->
+ Cminor.Expr (Cminor.Op1 (AST.Op_intofptr, e), res_type)
+ | _ -> e
+
+let rec f_expr var_locs (Clight.Expr (ed, t)) sub_exprs_res =
+ let t_cminor = sig_type_of_ctype t in
+ let cst_int i t = Cminor.Expr (Cminor.Cst (AST.Cst_int i), t) in
+ match ed, sub_exprs_res with
+
+ | Clight.Econst_int i, _ ->
+ Cminor.Expr (Cminor.Cst (AST.Cst_int i), t_cminor)
+
+ | Clight.Econst_float _, _ -> error_float ()
+
+ | Clight.Evar x, _ when is_function_ctype t ->
+ Cminor.Expr (Cminor.Cst (AST.Cst_addrsymbol x), t_cminor)
+
+ | Clight.Evar x, _ -> translate_ident var_locs t_cminor x
+
+ | Clight.Ederef _, e :: _ when is_scalar_ctype t ->
+ Cminor.Expr (Cminor.Mem (quantity_of_ctype t, e), t_cminor)
+
+ | Clight.Ederef _, e :: _ ->
+ (* When dereferencing something pointing to a struct for instance, the
+ result is the address of the struct. *)
+ e
+
+ | Clight.Eaddrof e, _ -> translate_addrof var_locs e
+
+ | Clight.Eunop (unop, _), e :: _ ->
+ Cminor.Expr (Cminor.Op1 (translate_unop unop, e), t_cminor)
+
+ | Clight.Ebinop (binop, e1, e2), e1' :: e2' :: _ ->
+ translate_binop t_cminor (clight_type_of e1) (clight_type_of e2) e1' e2'
+ binop
+
+ | Clight.Ecast (t, Clight.Expr (_, t')), e :: _ -> translate_cast e t' t
+
+ | Clight.Econdition _, e1 :: e2 :: e3 :: _ ->
+ Cminor.Expr (Cminor.Cond (e1, e2, e3), t_cminor)
+
+ | Clight.Eandbool _, e1 :: e2 :: _ ->
+ let zero = cst_int 0 t_cminor in
+ let one = cst_int 1 t_cminor in
+ let e2_cond = Cminor.Expr (Cminor.Cond (e2, one, zero), t_cminor) in
+ Cminor.Expr (Cminor.Cond (e1, e2_cond, zero), t_cminor)
+
+ | Clight.Eorbool _, e1 :: e2 :: _ ->
+ let zero = cst_int 0 t_cminor in
+ let one = cst_int 1 t_cminor in
+ let e2_cond = Cminor.Expr (Cminor.Cond (e2, one, zero), t_cminor) in
+ Cminor.Expr (Cminor.Cond (e1, one, e2_cond), t_cminor)
+
+ | Clight.Esizeof t, _ -> esizeof_ctype t_cminor t
+
+ | Clight.Ecost (lbl, _), e :: _ ->
+ Cminor.Expr (Cminor.Exp_cost (lbl, e), t_cminor)
+
+ | Clight.Ecall _, _ -> assert false (* only for annotations *)
+
+ | Clight.Efield (Clight.Expr (_, t), field), e :: _ ->
+ translate_field t_cminor t e field
+
+ | _ -> assert false (* wrong number of arguments *)
+
+and translate_addrof_ident res_type var_locs id =
+ assert (mem_var_locs id var_locs) ;
+ match find_var_locs id var_locs with
+ | (Local, _) | (Param, _) -> assert false (* location error *)
+ | (LocalStack off, _) | (ParamStack off, _) ->
+ Cminor.Expr (add_stack off, res_type)
+ | (Global, _) ->
+ Cminor.Expr (Cminor.Cst (AST.Cst_addrsymbol id), res_type)
+
+and translate_addrof_field res_type t field e =
+ let (fields, offset) = match t with
+ | Clight.Tstruct (_, fields) -> (fields, struct_offset t field fields)
+ | Clight.Tunion (_, fields) ->
+ (fields, Cminor.Expr (Cminor.Cst (AST.Cst_int 0), AST.Sig_offset))
+ | _ -> assert false (* type error *) in
+ Cminor.Expr (Cminor.Op2 (AST.Op_addp, e, offset), res_type)
+
+and translate_addrof var_locs (Clight.Expr (ed, _)) =
+ let res_type = AST.Sig_ptr in
+ match ed with
+
+ | Clight.Evar id -> translate_addrof_ident res_type var_locs id
+
+ | Clight.Ederef e -> translate_expr var_locs e
+
+ | Clight.Efield ((Clight.Expr (_, t) as e), field) ->
+ let e = translate_expr var_locs e in
+ translate_addrof_field res_type t field e
+
+ | _ -> assert false (* not a lvalue *)
+
+and translate_expr var_locs e = ClightFold.expr2 (f_expr var_locs) e
+
+
+(* Translate statement *)
+
+let assign var_locs (Clight.Expr (ed, t) as e_res_clight) e_arg_cminor =
+ match ed with
+ | Clight.Evar id when is_local_or_param id var_locs ->
+ Cminor.St_assign (id, e_arg_cminor)
+ | _ ->
+ let quantity = quantity_of_ctype t in
+ let addr = translate_addrof var_locs e_res_clight in
+ Cminor.St_store (quantity, addr, e_arg_cminor)
+
+let call_sig ret_type args =
+ { AST.args = List.map cminor_type_of args ;
+ AST.res = ret_type }
+
+let f_stmt fresh var_locs stmt sub_exprs_res sub_stmts_res =
+ let (tmps, sub_stmts_res) = List.split sub_stmts_res in
+ let tmps = List.flatten tmps in
+
+ let (added_tmps, stmt) = match stmt, sub_exprs_res, sub_stmts_res with
+
+ | Clight.Sskip, _, _ -> ([], Cminor.St_skip)
+
+ | Clight.Sassign (e1, _), _ :: e2 :: _, _ ->
+ ([], assign var_locs e1 e2)
+
+ | Clight.Scall (None, _, _), f :: args, _ ->
+ ([], Cminor.St_call (None, f, args, call_sig AST.Type_void args))
+
+ | Clight.Scall (Some e, _, _), _ :: f :: args, _ ->
+ let t = sig_type_of_ctype (clight_type_of e) in
+ let tmp = fresh () in
+ let tmpe = Cminor.Expr (Cminor.Id tmp, t) in
+ let stmt_call =
+ Cminor.St_call (Some tmp, f, args, call_sig (AST.Type_ret t) args) in
+ let stmt_assign = assign var_locs e tmpe in
+ ([(tmp, t)], Cminor.St_seq (stmt_call, stmt_assign))
+
+ | Clight.Swhile _, e :: _, stmt :: _ ->
+ let econd =
+ Cminor.Expr (Cminor.Op1 (AST.Op_notbool, e), cminor_type_of e) in
+ let scond =
+ Cminor.St_ifthenelse (econd, Cminor.St_exit 0, Cminor.St_skip) in
+ ([],
+ Cminor.St_block (Cminor.St_loop (Cminor.St_seq (scond,
+ Cminor.St_block stmt))))
+
+ | Clight.Sdowhile _, e :: _, stmt :: _ ->
+ let econd =
+ Cminor.Expr (Cminor.Op1 (AST.Op_notbool, e), cminor_type_of e) in
+ let scond =
+ Cminor.St_ifthenelse (econd, Cminor.St_exit 0, Cminor.St_skip) in
+ ([],
+ Cminor.St_block (Cminor.St_loop (Cminor.St_seq (Cminor.St_block stmt,
+ scond))))
+
+ | Clight.Sfor _, e :: _, stmt1 :: stmt2 :: stmt3 :: _ ->
+ let econd =
+ Cminor.Expr (Cminor.Op1 (AST.Op_notbool, e), cminor_type_of e) in
+ let scond =
+ Cminor.St_ifthenelse (econd, Cminor.St_exit 0, Cminor.St_skip) in
+ let body = Cminor.St_seq (Cminor.St_block stmt3, stmt2) in
+ ([],
+ Cminor.St_seq (stmt1,
+ Cminor.St_block
+ (Cminor.St_loop (Cminor.St_seq (scond, body)))))
+
+ | Clight.Sifthenelse _, e :: _, stmt1 :: stmt2 :: _ ->
+ ([], Cminor.St_ifthenelse (e, stmt1, stmt2))
+
+ | Clight.Ssequence _, _, stmt1 :: stmt2 :: _ ->
+ ([], Cminor.St_seq (stmt1, stmt2))
+
+ | Clight.Sbreak, _, _ -> ([], Cminor.St_exit 1)
+
+ | Clight.Scontinue, _, _ -> ([], Cminor.St_exit 0)
+
+ | Clight.Sswitch _, _, _ ->
+ (* Should not appear because of switch transformation performed
+ beforehand. *)
+ assert false
+
+ | Clight.Sreturn None, _, _ -> ([], Cminor.St_return None)
+
+ | Clight.Sreturn (Some _), e :: _, _ -> ([], Cminor.St_return (Some e))
+
+ | Clight.Slabel (lbl, _), _, stmt :: _ -> ([], Cminor.St_label (lbl, stmt))
+
+ | Clight.Sgoto lbl, _, _ -> ([], Cminor.St_goto lbl)
+
+ | Clight.Scost (lbl, _), _, stmt :: _ -> ([], Cminor.St_cost (lbl, stmt))
+
+ | _ -> assert false (* type error *) in
+
+ (tmps @ added_tmps, stmt)
+
+let translate_statement fresh var_locs =
+ ClightFold.statement2 (f_expr var_locs) (f_stmt fresh var_locs)
+
+
+(* Translate functions and programs *)
+
+let add_stack_parameter_initialization x t off body =
+ let addr = Cminor.Expr (add_stack off, AST.Sig_ptr) in
+ let e = Cminor.Expr (Cminor.Id x, sig_type_of_ctype t) in
+ let stmt = Cminor.St_store (quantity_of_ctype t, addr, e) in
+ Cminor.St_seq (stmt, body)
+
+let add_stack_parameters_initialization var_locs body =
+ let f x (location, t) body = match location with
+ | ParamStack offset -> add_stack_parameter_initialization x t offset body
+ | _ -> body in
+ fold_var_locs f var_locs body
+
+let translate_internal fresh globals functs cfun =
+ let var_locs = sort_variables globals functs cfun in
+ let params =
+ List.map (fun (x, t) -> (x, sig_type_of_ctype t)) cfun.Clight.fn_params in
+ let (tmps, body) = translate_statement fresh var_locs cfun.Clight.fn_body in
+ let body = add_stack_parameters_initialization var_locs body in
+ { Cminor.f_return = type_return_of_ctype cfun.Clight.fn_return ;
+ Cminor.f_params = params ;
+ Cminor.f_vars = (get_locals var_locs) @ tmps ;
+ Cminor.f_stacksize = get_stacksize var_locs ;
+ Cminor.f_body = body }
+
+let translate_external id params return =
+ { AST.ef_tag = id ;
+ AST.ef_sig = { AST.args = translate_args_types params ;
+ AST.res = type_return_of_ctype return } }
+
+let translate_funct fresh globals functs (id, def) =
+ let def = match def with
+ | Clight.Internal ff ->
+ Cminor.F_int (translate_internal fresh globals functs ff)
+ | Clight.External (i,p,r) -> Cminor.F_ext (translate_external i p r) in
+ (id, def)
+
+let translate p =
+ let fresh = ClightAnnotator.make_fresh "_tmp" p in
+ let translate_funct =
+ translate_funct fresh p.Clight.prog_vars p.Clight.prog_funct in
+ { Cminor.vars = List.map translate_global p.Clight.prog_vars ;
+ Cminor.functs = List.map translate_funct p.Clight.prog_funct ;
+ Cminor.main = p.Clight.prog_main }
--- /dev/null
+(** This module translates a {!Clight} program into a {!Cminor}
+ program. *)
+
+val sizeof_ctype : Clight.ctype -> AST.abstract_size
+
+(** [translate cp] compiles a Clight program into a Cminor program. *)
+(* Translation simplifies control structures and explicits memory operations *)
+
+val translate : Clight.program -> Cminor.program
--- /dev/null
+
+open Clight
+
+
+(* TODO: Alignment constraints? *)
+let rec size_of_ctype = function
+ | Tvoid -> 0
+ | Tint (I8,_) -> 1
+ | Tint (I16,_) -> 2
+ | Tint (I32,_) -> 4
+ | Tfloat _ -> assert false (* Not supported *)
+ | Tpointer (sp,_) -> Memory.size_of_region sp
+ | Tarray (sp,t,s) -> s*(size_of_ctype t)
+ | Tfunction (_,_) -> assert false (* Not supported *)
+ | Tstruct (_,lst) ->
+ List.fold_left (fun n (_,ty) -> n + (size_of_ctype ty)) 0 lst
+ | Tunion (_,lst) ->
+ List.fold_left
+ (fun n (_,ty) ->
+ let sz = (size_of_ctype ty) in (if n>sz then n else sz)
+ ) 0 lst
+ | Tcomp_ptr (sp,_) -> Memory.size_of_region sp
+
+
+let rec memory_q_of_ctype = function
+ | Tvoid -> assert false
+ | Tint (I8,Signed) -> Memory.MQ_int8signed
+ | Tint (I8,Unsigned) -> Memory.MQ_int8unsigned
+ | Tint (I16,Signed) -> Memory.MQ_int16signed
+ | Tint (I16,Unsigned) -> Memory.MQ_int16unsigned
+ | Tint (I32,Signed) -> Memory.MQ_int32
+ | Tint (I32,Unsigned) -> assert false (* Not supported *)
+ | Tfloat _ -> assert false (* Not supported *)
+ | Tpointer (sp,_) -> Memory.mq_of_region sp
+ | Tarray (sp,c,s) -> Memory.mq_of_region sp
+ | Tfunction (_,_) -> assert false (* should not happen thanks to CIL *)
+ | Tstruct (_,_) -> assert false (* should not happen thanks to CIL *)
+ | Tunion (_,_) -> assert false (* should not happen thanks to CIL *)
+ | Tcomp_ptr (sp,_) -> Memory.mq_of_region sp
+
+
+let is_int_type = function
+ | Tint (_,_) -> true
+ | _ -> false
+
+let is_float_type = function
+ | Tfloat _ -> true
+ | _ -> false
+
+let is_pointer_type = function
+ | Tpointer _ | Tarray _ | Tcomp_ptr _ -> true
+ | _ -> false
+
+let is_stack_type = function
+ | Tarray _ | Tstruct _ | Tunion _ -> true
+ | _ -> false
+
+let is_struct = function
+ | Tstruct _ | Tunion _ -> true
+ | _ -> false
+
+let is_ptr_to_struct = function
+ | Tpointer (_,t) when is_struct t -> true
+ | Tcomp_ptr _ -> true
+ | _ -> false
+
+let is_function = function
+ | Tfunction _ -> true
+ | _ -> false
+
+let region_of_pointer_type = function
+ | Tpointer (sp,_) | Tarray (sp,_,_) | Tcomp_ptr (sp,_) -> sp
+ | _ -> assert false (* do not use on those arguments *)
--- /dev/null
+
+val size_of_ctype : Clight.ctype -> int
+
+val memory_q_of_ctype : Clight.ctype -> Memory.memory_q
+
+val is_int_type : Clight.ctype -> bool
+val is_float_type : Clight.ctype -> bool
+val is_pointer_type : Clight.ctype -> bool
+val is_stack_type : Clight.ctype -> bool
+val is_struct : Clight.ctype -> bool
+val is_ptr_to_struct : Clight.ctype -> bool
+val is_function : Clight.ctype -> bool
+
+val region_of_pointer_type : Clight.ctype -> AST.region
--- /dev/null
+
+(** This module adds runtime functions in a [Clight] program. These functions
+ implement unsupported functions by the target architecture that introduce a
+ branch. We need to define them at the [Clight] level in order to have a
+ correct labelling. *)
+
+
+let error_prefix = "Adding runtime functions"
+let error = Error.global_error error_prefix
+
+let add_program p s =
+ let output = s ^ (ClightPrinter.print_program p) in
+ ClightParser.process (`Source ("add_program", output))
+
+type operation =
+ | Unary of Clight.unary_operation * Clight.ctype
+ | Binary of Clight.binary_operation * Clight.ctype * Clight.ctype
+ | Cast of Clight.ctype (* destination type *) * Clight.ctype (* source type *)
+ | Fun of string (* name of the function *)
+
+type op_replacement =
+ (* operation to be replaced *)
+ operation *
+ (* base name of the replacement function *)
+ string *
+ (* C definition of the replacement function, provided a name for the
+ function *)
+ (string -> string) *
+ (* dependencies *)
+ operation list
+
+let string_of_operation = function
+ | Unary (unop, ctype) ->
+ (ClightPrinter.string_of_unop unop) ^ "(" ^
+ (ClightPrinter.string_of_ctype ctype) ^ ")"
+ | Binary (binop, ctype1, ctype2) ->
+ (ClightPrinter.string_of_binop binop) ^ "(" ^
+ (ClightPrinter.string_of_ctype ctype1) ^ ", " ^
+ (ClightPrinter.string_of_ctype ctype1) ^ ")"
+ | Cast (ctype1, ctype2) ->
+ "Cast " ^ (ClightPrinter.string_of_ctype ctype1) ^ " " ^
+ (ClightPrinter.string_of_ctype ctype2)
+ | Fun fun_name -> "Fun " ^ fun_name
+
+let string_of_op_replacement (replaced, base_name, c_def, _) =
+ Printf.sprintf "Replaced: %s\n%s\n"
+ (string_of_operation replaced) (c_def base_name)
+
+module CtypeSet =
+ Set.Make (struct type t = Clight.ctype let compare = Pervasives.compare end)
+
+
+let deps op replacements =
+ let f res (op', _, _, deps) = if op' = op then deps else res in
+ List.fold_left f [] replacements
+
+
+(* Filter used operations only *)
+
+module OperationSet =
+ Set.Make (struct type t = operation let compare = Pervasives.compare end)
+
+let union_list l = List.fold_left OperationSet.union OperationSet.empty l
+
+let f_ctype ctype _ = ctype
+
+let f_expr e _ sub_expr_descrs_res =
+ let res_e = match e with
+ | Clight.Expr (Clight.Evar x, Clight.Tfunction _) ->
+ OperationSet.singleton (Fun x)
+ | _ -> OperationSet.empty in
+ union_list (res_e :: sub_expr_descrs_res)
+
+let f_expr_descr ed _ sub_exprs_res =
+ let res_ed = match ed with
+ | Clight.Eunop (unop, Clight.Expr (_, t)) ->
+ OperationSet.singleton (Unary (unop, t))
+ | Clight.Ebinop (binop, Clight.Expr (_, t1), Clight.Expr (_, t2)) ->
+ OperationSet.singleton (Binary (binop, t1, t2))
+ | Clight.Ecast (t, Clight.Expr (_, t')) ->
+ OperationSet.singleton (Cast (t, t'))
+ | _ -> OperationSet.empty in
+ union_list (res_ed :: sub_exprs_res)
+
+let f_stmt _ sub_exprs_res sub_stmts_res =
+ OperationSet.union (union_list sub_exprs_res) (union_list sub_stmts_res)
+
+let used_ops_stmt = ClightFold.statement f_ctype f_expr f_expr_descr f_stmt
+
+let used_ops_fundef = function
+ | Clight.Internal cfun -> used_ops_stmt cfun.Clight.fn_body
+ | Clight.External _ -> OperationSet.empty
+
+let used_ops p =
+ let f ops (_, fundef) = OperationSet.union ops (used_ops_fundef fundef) in
+ List.fold_left f OperationSet.empty p.Clight.prog_funct
+
+
+let mem_replacements op =
+ let f res (op', _, _, _) = res || (op' = op) in
+ List.fold_left f false
+
+let rec fix equal next x =
+ let y = next x in
+ if equal x y then x
+ else fix equal next y
+
+let needed_replacements used_ops replacements =
+ let f op = mem_replacements op replacements in
+ let reduced_used_ops = OperationSet.filter f used_ops in
+ let next_ops ops =
+ let add ops op = OperationSet.add op ops in
+ let f op next_ops = List.fold_left add next_ops (deps op replacements) in
+ OperationSet.fold f ops ops in
+ let needed_ops = fix OperationSet.equal next_ops reduced_used_ops in
+ let f (op, _, _, _) = OperationSet.mem op needed_ops in
+ List.filter f replacements
+
+
+let map_fresh_name unique map base_name =
+ if StringTools.Map.mem base_name map then
+ (map, StringTools.Map.find base_name map)
+ else
+ let fresh_name = unique base_name in
+ (StringTools.Map.add base_name fresh_name map, fresh_name)
+
+let fresh_replacements unique replacements =
+ let f (map, l) (op, base_name, new_fun, deps) =
+ let (map, fresh_name) = map_fresh_name unique map base_name in
+ (map, l @ [(op, fresh_name, new_fun fresh_name, deps)]) in
+ snd (List.fold_left f (StringTools.Map.empty, []) replacements)
+
+
+let add_replacements replacements p =
+ let f_replacements s (_, _, new_fun, _) = s ^ "\n" ^ new_fun in
+ let added_string = List.fold_left f_replacements "" replacements in
+ add_program p added_string
+
+
+let make_replacement_assoc = List.map (fun (op, name, _, _) -> (op, name))
+
+
+let add p replacements =
+ let used_ops = used_ops p in
+ let needed_replacements = needed_replacements used_ops replacements in
+ let unique = StringTools.make_unique (ClightAnnotator.all_idents p) in
+ let replacements = fresh_replacements unique needed_replacements in
+ let p = add_replacements replacements p in
+ (p, make_replacement_assoc replacements)
+
+
+(* Replacement *)
+
+let seq =
+ List.fold_left
+ (fun stmt1 stmt2 ->
+ if stmt1 = Clight.Sskip then stmt2
+ else
+ if stmt2 = Clight.Sskip then stmt1
+ else Clight.Ssequence (stmt1, stmt2))
+ Clight.Sskip
+
+let f_ctype ctype _ = ctype
+
+let call fresh replaced replacement_assoc args ret_type =
+ let tmp = fresh () in
+ let replacement_fun_name = List.assoc replaced replacement_assoc in
+ let tmpe = Clight.Expr (Clight.Evar tmp, ret_type) in
+ let (args, args_types) = List.split args in
+ let f_type = Clight.Tfunction (args_types, ret_type) in
+ let f = Clight.Expr (Clight.Evar replacement_fun_name, f_type) in
+ let call = Clight.Scall (Some tmpe, f, args) in
+ (tmpe, call, [(tmp, ret_type)])
+
+let replace_ident replacement_assoc x t =
+ let new_name = match t with
+ | Clight.Tfunction _
+ when List.mem_assoc (Fun x) replacement_assoc ->
+ let replacement_fun_name = List.assoc (Fun x) replacement_assoc in
+ replacement_fun_name
+ | _ -> x in
+ (Clight.Expr (Clight.Evar new_name, t), Clight.Sskip, [])
+
+let f_expr fresh replacement_assoc e _ _ =
+
+ let f (Clight.Expr (ed, t) as e) sub_exprs_res =
+ let f_sub_exprs (es, stmt, tmps) (e, stmt', tmps') =
+ (es @ [e], seq [stmt ; stmt'], tmps @ tmps') in
+ let (sub_exprs, stmt1, tmps1) =
+ List.fold_left f_sub_exprs ([], Clight.Sskip, []) sub_exprs_res in
+ let (e, stmt2, tmps2) = match ed, sub_exprs with
+ | Clight.Evar x, _ -> replace_ident replacement_assoc x t
+ | Clight.Eunop (unop, Clight.Expr (_, t')), e' :: _
+ when List.mem_assoc (Unary (unop, t')) replacement_assoc ->
+ call fresh (Unary (unop, t')) replacement_assoc [(e', t')] t
+ | Clight.Ebinop (binop, Clight.Expr (_, t1), Clight.Expr (_, t2)),
+ e1 :: e2 :: _
+ when List.mem_assoc (Binary (binop, t1, t2)) replacement_assoc ->
+ call fresh (Binary (binop, t1, t2)) replacement_assoc
+ [(e1, t1) ; (e2, t2)] t
+ | Clight.Ecast (t, Clight.Expr (_, t')), e' :: _
+ when List.mem_assoc (Cast (t, t')) replacement_assoc ->
+ call fresh (Cast (t, t')) replacement_assoc [(e', t')] t
+ | _ -> (e, Clight.Sskip, []) in
+ (ClightFold.expr_fill_exprs e sub_exprs,
+ seq [stmt1 ; stmt2],
+ tmps1 @ tmps2) in
+
+ ClightFold.expr2 f e
+
+let f_expr_descr ed _ _ _ = ed
+
+let f_stmt stmt sub_exprs_res sub_stmts_res =
+ let f_sub_exprs (es, stmt, tmps) (e, stmt', tmps') =
+ (es @ [e], seq [stmt ; stmt'], tmps @ tmps') in
+ let (sub_exprs, added_stmt, tmps1) =
+ List.fold_left f_sub_exprs ([], Clight.Sskip, []) sub_exprs_res in
+ let f_sub_stmts (stmts, tmps) (stmt, tmps') =
+ (stmts @ [stmt], tmps @ tmps') in
+ let (sub_stmts, tmps2) = List.fold_left f_sub_stmts ([], []) sub_stmts_res in
+ let stmt' = ClightFold.statement_fill_subs stmt sub_exprs sub_stmts in
+ (seq [added_stmt ; stmt'], tmps1 @ tmps2)
+
+let replace_statement fresh replacement_assoc =
+ ClightFold.statement f_ctype (f_expr fresh replacement_assoc)
+ f_expr_descr f_stmt
+
+let replace_internal fresh replacement_assoc def =
+ let (new_body, tmps) =
+ replace_statement fresh replacement_assoc def.Clight.fn_body in
+ { def with
+ Clight.fn_vars = def.Clight.fn_vars @ tmps ; Clight.fn_body = new_body }
+
+let replace_funct fresh replacement_assoc (id, fundef) =
+ let fundef' = match fundef with
+ | Clight.Internal def ->
+ Clight.Internal (replace_internal fresh replacement_assoc def)
+ | _ -> fundef in
+ (id, fundef')
+
+let replace fresh replacement_assoc p =
+ let prog_funct =
+ List.map (replace_funct fresh replacement_assoc) p.Clight.prog_funct in
+ { p with Clight.prog_funct = prog_funct }
+
+
+let save_and_parse p =
+ try
+ ClightParser.process (`Source ("replaced", ClightPrinter.print_program p))
+ with Sys_error _ -> failwith "Error reparsing Clight8 transformation."
+
+let add_replacements p replacements =
+ let p = ClightCasts.simplify p in
+ let (p, replacement_assoc) = add p replacements in
+ let p = ClightCasts.simplify p in
+ let tmp_universe = ClightAnnotator.fresh_universe "_tmp" p in
+ let fresh () = StringTools.Gen.fresh tmp_universe in
+ let p = replace fresh replacement_assoc p in
+ let p = save_and_parse p in
+ ClightCasts.simplify p
+
+
+(* Unsupported operations by the 8051. *)
+
+let cint size sign = Clight.Tint (size, sign)
+
+let cints size = cint size AST.Signed
+let cintu size = cint size AST.Unsigned
+
+let cint8s = cints Clight.I8
+let cint8u = cintu Clight.I8
+let cint16s = cints Clight.I16
+let cint16u = cintu Clight.I16
+let cint32s = cints Clight.I32
+let cint32u = cintu Clight.I32
+
+let byte_size_of_intsize = function
+ | Clight.I8 -> 1
+ | Clight.I16 -> 2
+ | Clight.I32 -> 4
+
+let bit_size_of_intsize size = (byte_size_of_intsize size) * 8
+
+let string_of_intsize size = string_of_int (bit_size_of_intsize size)
+
+let ctype_of_intsize = function
+ | Clight.I8 -> "char"
+ | Clight.I16 -> "short"
+ | Clight.I32 -> "int"
+
+
+(* Unsigned divisions and modulos *)
+
+let divumodu_fun res t s =
+ "unsigned " ^ t ^ " " ^ s ^ " (unsigned " ^ t ^ " x, unsigned " ^ t ^ " y)" ^
+ "{\n" ^
+ " unsigned " ^ t ^ " quo = 0;\n" ^
+ " unsigned " ^ t ^ " rem = x;\n" ^
+ " while (rem >= y) {\n" ^
+ " quo = quo + 1;\n" ^
+ " rem = rem - y;\n" ^
+ " }\n" ^
+ " return (" ^ res ^ ");\n" ^
+ "}\n\n"
+
+let divumodu op sizes sizec t =
+ let (prefix, res) = match op with
+ | Clight.Odiv -> ("div", "quo")
+ | Clight.Omod -> ("mod", "rem")
+ | _ -> assert false (* do not use on these arguments *) in
+ let cu = cintu sizec in
+ (Binary (op, cu, cu), "_" ^ prefix ^ sizes ^ "u", divumodu_fun res t, [])
+
+let divu = divumodu Clight.Odiv
+let modu = divumodu Clight.Omod
+
+
+(* Unsigned divisions *)
+
+(* 16 bits unsigned division *)
+
+let div16u = divu "16" Clight.I16 "short"
+
+(* 32 bits unsigned division *)
+
+let div32u = divu "32" Clight.I32 "int"
+
+(* Signed divisions *)
+
+let divs_fun t s =
+ "signed " ^ t ^ " " ^ s ^ " (signed " ^ t ^ " x, signed " ^ t ^ " y) {\n" ^
+ " unsigned " ^ t ^ " x1 = (unsigned " ^ t ^ ") x;\n" ^
+ " unsigned " ^ t ^ " y1 = (unsigned " ^ t ^ ") y;\n" ^
+ " signed " ^ t ^ " sign = 1;\n" ^
+ " if (x < 0) { x1 = (unsigned " ^ t ^ ") (-x); sign = -sign; }\n" ^
+ " if (y < 0) { y1 = (unsigned " ^ t ^ ") (-y); sign = -sign; }\n" ^
+ " unsigned " ^ t ^ " res = (x1/y1);\n" ^
+ " return (sign * ((signed " ^ t ^ ") res));\n" ^
+ "}\n\n"
+
+let divs sizes sizec t =
+ let cs = cints sizec in
+ let cu = cintu sizec in
+ (Binary (Clight.Odiv, cs, cs), "_div" ^ sizes ^ "s", divs_fun t,
+ [Binary (Clight.Odiv, cu, cu)])
+
+(* 8 bits signed division *)
+
+let div8s = divs "8" Clight.I8 "char"
+
+(* 16 bits signed division *)
+
+let div16s = divs "16" Clight.I16 "short"
+
+(* 32 bits signed division *)
+
+let div32s = divs "32" Clight.I32 "int"
+
+
+(* Unsigned modulos *)
+
+(* 16 bits unsigned modulo *)
+
+let mod16u = modu "16" Clight.I16 "short"
+
+(* 32 bits unsigned modulo *)
+
+let mod32u = modu "32" Clight.I32 "int"
+
+(* Signed modulos *)
+
+let mods_fun t s =
+ "signed " ^ t ^ " " ^ s ^ " (signed " ^ t ^ " x, signed " ^ t ^ " y) {\n" ^
+ " return (x - (x/y) * y);\n" ^
+ "}\n\n"
+
+let mods size ct t =
+ (Binary (Clight.Omod, ct, ct), "_mod" ^ size ^ "s", mods_fun t,
+ [Binary (Clight.Odiv, ct, ct)])
+
+(* 8 bits signed modulo *)
+
+let mod8s = mods "8" cint8s "char"
+
+(* 16 bits signed modulo *)
+
+let mod16s = mods "16" cint16s "short"
+
+(* 32 bits signed modulo *)
+
+let mod32s = mods "32" cint32s "int"
+
+
+(* Shifts *)
+
+let sh_fun op t s =
+ t ^ " " ^ s ^ " (" ^ t ^ " x, " ^ t ^ " y) {\n" ^
+ " " ^ t ^ " res = x, i;\n" ^
+ " for (i = 0 ; i < y ; i++) res = res " ^ op ^ " 2;\n" ^
+ " return res;\n" ^
+ "}\n\n"
+
+let sh cop sop direction deps size sign =
+ let sizes = string_of_intsize size in
+ let ct = Clight.Tint (size, sign) in
+ let (short_sign, long_sign) = match sign with
+ | AST.Signed -> ("s", "signed ")
+ | AST.Unsigned -> ("u", "unsigned ") in
+ let t = long_sign ^ (ctype_of_intsize size) in
+ (Binary (cop, ct, ct), "_sh" ^ direction ^ sizes ^ short_sign,
+ sh_fun sop t, deps)
+
+
+(* Shift lefts *)
+
+let shl = sh Clight.Oshl "*" "l" []
+
+(* Signed shift lefts *)
+
+(* 8 bits signed shift left *)
+
+let shl8s = shl Clight.I8 AST.Signed
+
+(* 16 bits signed shift left *)
+
+let shl16s = shl Clight.I16 AST.Signed
+
+(* 32 bits signed shift left *)
+
+let shl32s = shl Clight.I32 AST.Signed
+
+(* Unsigned shift lefts *)
+
+(* 8 bits unsigned shift left *)
+
+let shl8u = shl Clight.I8 AST.Unsigned
+
+(* 16 bits unsigned shift left *)
+
+let shl16u = shl Clight.I16 AST.Unsigned
+
+(* 32 bits unsigned shift left *)
+
+let shl32u = shl Clight.I32 AST.Unsigned
+
+
+(* Shift rights *)
+
+(* Signed shift rights *)
+
+let shrs_fun size t s =
+ "signed " ^ t ^ " " ^ s ^ " (signed " ^ t ^ " x, signed " ^ t ^ " y) {\n" ^
+ " unsigned " ^ t ^ " x1, y1, to_add, res, i;\n" ^
+ " if (y < 0) return 0;\n" ^
+ " x1 = x; y1 = y; to_add = 1; res = x1;" ^
+ " for (i = 0 ; i < " ^ size ^ " ; i++) to_add = to_add * 2;\n" ^
+ " to_add = to_add & x1;\n" ^
+ " for (i = 0 ; i < y1 ; i++) res = (res / 2) + to_add;\n" ^
+ " return ((signed " ^ t ^ ") res);\n" ^
+ "}\n\n"
+
+let shrs size =
+ let sizes = string_of_int (bit_size_of_intsize size) in
+ let op_sizes = string_of_int ((bit_size_of_intsize size) - 1) in
+ let t = ctype_of_intsize size in
+ let ct = Clight.Tint (size, AST.Signed) in
+ let ctdep = Clight.Tint (size, AST.Unsigned) in
+ (Binary (Clight.Oshr, ct, ct), "_shr" ^ sizes ^ "s", shrs_fun op_sizes t,
+ [Binary (Clight.Odiv, ctdep, ctdep)])
+
+(* 8 bits signed shift right *)
+
+let shr8s = shrs Clight.I8
+
+(* 16 bits signed shift right *)
+
+let shr16s = shrs Clight.I16
+
+(* 32 bits signed shift right *)
+
+let shr32s = shrs Clight.I32
+
+(* Unsigned shift rights *)
+
+let shru size =
+ let t_dep = Clight.Tint (size, AST.Unsigned) in
+ sh Clight.Oshr "/" "r" [Binary (Clight.Odiv, t_dep, t_dep)] size AST.Unsigned
+
+(* 8 bits unsigned shift right *)
+
+let shr8u = shru Clight.I8
+
+(* 16 bits unsigned shift right *)
+
+let shr16u = shru Clight.I16
+
+(* 32 bits unsigned shift right *)
+
+let shr32u = shru Clight.I32
+
+
+let unsupported =
+ [div16u ; div32u ; div8s ; div16s ; div32s ;
+ mod16u ; mod32u ; mod8s ; mod16s ; mod32s ;
+ shl8s ; shl16s ; shl32s ; shl8u ; shl16u ; shl32u ;
+ shr8s ; shr16s ; shr32s ; shr8u ; shr16u ; shr32u]
+
+
+let replace_unsupported p = add_replacements p unsupported
--- /dev/null
+
+(** This module adds runtime functions in a [Clight] program. These functions
+ implement unsupported functions by the target architecture that introduce a
+ branch. We need to define them at the [Clight] level in order to have a
+ correct labelling. *)
+
+type operation =
+ | Unary of Clight.unary_operation * Clight.ctype
+ | Binary of Clight.binary_operation * Clight.ctype * Clight.ctype
+ | Cast of Clight.ctype (* destination type *) * Clight.ctype (* source type *)
+ | Fun of string (* name of the function *)
+
+type op_replacement =
+ (* operation to be replaced *)
+ operation *
+ (* base name of the replacement function *)
+ string *
+ (* C definition of the replacement function, provided a name for the
+ function *)
+ (string -> string) *
+ (* dependences *)
+ operation list
+
+val add :
+ Clight.program -> op_replacement list ->
+ (Clight.program * (operation * string) list (* operation association *))
+
+val replace_unsupported : Clight.program -> Clight.program
--- /dev/null
+
+(** This module defines the abstract syntax tree of [Cminor]. *)
+
+(* This file describes the abstract syntax of the Cminor language.
+ Only types are: int8, int16, int32 and void. *)
+
+type etype = AST.sig_type
+
+type expression = Expr of expr_descr * etype
+and expr_descr =
+ | Id of AST.ident
+ | Cst of AST.cst
+ | Op1 of AST.op1 * expression
+ | Op2 of AST.op2 * expression * expression
+ | Mem of AST.quantity * expression (* Memory read *)
+ | Cond of expression * expression * expression (* Ternary expression *)
+ | Exp_cost of CostLabel.t * expression (* Labelled expression *)
+
+type statement =
+ | St_skip
+ | St_assign of AST.ident * expression
+ | St_store of AST.quantity * expression * expression
+
+ (* Function call. Parameters are an optional variable to store the
+ result of the function, the name of the function, the arguments,
+ and finally its signature. *)
+ | St_call of AST.ident option * expression * expression list * AST.signature
+
+ (* Tail call to a function, that is, a call to a function following
+ by a return statement. Parameters are the name of the function,
+ the arguments and its signature. *)
+ | St_tailcall of expression * expression list * AST.signature
+
+ | St_seq of statement * statement
+ | St_ifthenelse of expression * statement * statement
+ | St_loop of statement
+ | St_block of statement
+ | St_exit of int
+
+ (* Switch. Parameters are the expression whose value is switch, a
+ table of cases and their corresponding number of blocks to exit,
+ and the number of block to exit in the default case. *)
+ | St_switch of expression * (int*int) list * int
+
+ | St_return of expression option
+ | St_label of AST.ident * statement
+ | St_goto of string
+ | St_cost of CostLabel.t * statement
+
+
+type internal_function =
+ { f_return : AST.type_return ;
+ f_params : (AST.ident * etype) list ;
+ f_vars : (AST.ident * etype) list ;
+ f_stacksize : AST.abstract_size ;
+ f_body : statement }
+
+type function_def =
+ | F_int of internal_function
+ | F_ext of AST.external_function
+
+(* A program is a list of global variables and their initialization
+ datas, a list of function names and their definition, and the name
+ of the main function. *)
+
+type program =
+ { vars : (AST.ident * AST.abstract_size * AST.data list option) list ;
+ functs : (AST.ident * function_def) list ;
+ main : AST.ident option }
--- /dev/null
+
+let int_size = Driver.CminorMemory.int_size
+
+let funct_vars (id, fun_def) = match fun_def with
+ | Cminor.F_int def ->
+ id :: (List.map fst (def.Cminor.f_params @ def.Cminor.f_vars))
+ | _ -> [id]
+
+let prog_idents p =
+ let vars = List.map (fun (x, _, _) -> x) p.Cminor.vars in
+ let f vars funct = vars @ (funct_vars funct) in
+ let vars = List.fold_left f vars p.Cminor.functs in
+ let f vars var = StringTools.Set.add var vars in
+ List.fold_left f StringTools.Set.empty vars
+
+let fresh_cost_id prefix p =
+ let vars = prog_idents p in
+ StringTools.Gen.fresh_prefix vars prefix
+
+
+(*
+let increment cost_id incr =
+ let cost =
+ Cminor.Expr (Cminor.Cst (AST.Cst_addrsymbol cost_id), AST.Sig_ptr) in
+ let load = Cminor.Expr (Cminor.Mem (Memory.QInt 4, cost), AST.Sig_int 4) in
+ let incr = Cminor.Expr (Cminor.Cst (AST.Cst_int incr), AST.Sig_int 4) in
+ let incr = Cminor.Expr (Cminor.Op2 (AST.Op_add, load, incr), AST.Sig_int 4) in
+ Cminor.St_store (Memory.QInt 4, cost, incr)
+
+
+let f_remove_cost_labels_exp e subexp_res = match e, subexp_res with
+ | Cminor.Id _, _ | Cminor.Cst _, _ -> e
+ | Cminor.Op1 (op, _), [e1] -> Cminor.Op1 (op, e1)
+ | Cminor.Op2 (op, _, _), [e1 ; e2] -> Cminor.Op2 (op, e1, e2)
+ | Cminor.Mem (chunk, _), [e] -> Cminor.Mem (chunk, e)
+ | Cminor.Cond (_, _, _), [e1 ; e2 ; e3] -> Cminor.Cond (e1, e2, e3)
+ | Cminor.Exp_cost _, [e] -> e
+ | _ -> assert false (* wrong number of arguments *)
+
+let remove_cost_labels_exp e =
+ CminorFold.expression f_remove_cost_labels_exp e
+
+let remove_cost_labels_exps exps =
+ List.map remove_cost_labels_exp exps
+
+
+let list_seq l =
+ let f res stmt = Cminor.St_seq (res, stmt) in
+ List.fold_left f Cminor.St_skip l
+
+let f_update_cost_exp costs_mapping cost_id e subexp_res =
+ match e, subexp_res with
+ | Cminor.Cond (e1, _, _), [stmt1 ; stmt2 ; stmt3] ->
+ Cminor.St_seq (stmt1, Cminor.St_ifthenelse (e1, stmt2, stmt3))
+ | Cminor.Exp_cost (lbl, _), [stmt2] ->
+ let incr =
+ if CostLabel.Map.mem lbl costs_mapping then
+ CostLabel.Map.find lbl costs_mapping
+ else 0 in
+ let stmt1 = increment cost_id incr in
+ Cminor.St_seq (stmt1, stmt2)
+ | _ -> list_seq subexp_res
+
+let update_cost_exp costs_mapping cost_id e =
+ CminorFold.expression (f_update_cost_exp costs_mapping cost_id) e
+
+let update_cost_exps costs_mapping cost_id exps =
+ let l = List.map (update_cost_exp costs_mapping cost_id) exps in
+ let f stmt upd = Cminor.St_seq (stmt, upd) in
+ List.fold_left f Cminor.St_skip l
+
+
+let rec instrument_stmt costs_mapping cost_id body = match body with
+ | Cminor.St_skip | Cminor.St_exit _ | Cminor.St_return None -> body
+ | Cminor.St_assign (x, e) ->
+ let upd = update_cost_exp costs_mapping cost_id e in
+ let e = remove_cost_labels_exp e in
+ Cminor.St_seq (upd, Cminor.St_assign (x, e))
+ | Cminor.St_store (chunk, e1, e2) ->
+ let upd = update_cost_exps costs_mapping cost_id [e1 ; e2] in
+ let e1 = remove_cost_labels_exp e1 in
+ let e2 = remove_cost_labels_exp e2 in
+ Cminor.St_seq (upd, Cminor.St_store (chunk, e1, e2))
+ | Cminor.St_call (ox, f, args, sg) ->
+ let upd = update_cost_exps costs_mapping cost_id (f :: args) in
+ let f = remove_cost_labels_exp f in
+ let args = remove_cost_labels_exps args in
+ Cminor.St_seq (upd, Cminor.St_call (ox, f, args, sg))
+ | Cminor.St_tailcall (f, args, sg) ->
+ let upd = update_cost_exps costs_mapping cost_id (f :: args) in
+ let f = remove_cost_labels_exp f in
+ let args = remove_cost_labels_exps args in
+ Cminor.St_seq (upd, Cminor.St_tailcall (f, args, sg))
+ | Cminor.St_seq (stmt1, stmt2) ->
+ let stmt1 = instrument_stmt costs_mapping cost_id stmt1 in
+ let stmt2 = instrument_stmt costs_mapping cost_id stmt2 in
+ Cminor.St_seq (stmt1, stmt2)
+ | Cminor.St_ifthenelse (e, stmt1, stmt2) ->
+ let upd = update_cost_exp costs_mapping cost_id e in
+ let e = remove_cost_labels_exp e in
+ let stmt1 = instrument_stmt costs_mapping cost_id stmt1 in
+ let stmt2 = instrument_stmt costs_mapping cost_id stmt2 in
+ Cminor.St_seq (upd, Cminor.St_ifthenelse (e, stmt1, stmt2))
+ | Cminor.St_loop stmt ->
+ Cminor.St_loop (instrument_stmt costs_mapping cost_id stmt)
+ | Cminor.St_block stmt ->
+ Cminor.St_block (instrument_stmt costs_mapping cost_id stmt)
+ | Cminor.St_switch (e, tbl, dflt) ->
+ let upd = update_cost_exp costs_mapping cost_id e in
+ let e = remove_cost_labels_exp e in
+ Cminor.St_seq (upd, Cminor.St_switch (e, tbl, dflt))
+ | Cminor.St_label (lbl, stmt) ->
+ Cminor.St_label (lbl, instrument_stmt costs_mapping cost_id stmt)
+ | Cminor.St_goto lbl -> body
+ | Cminor.St_return (Some e) ->
+ let upd = update_cost_exp costs_mapping cost_id e in
+ let e = remove_cost_labels_exp e in
+ Cminor.St_seq (upd, Cminor.St_return (Some e))
+ | Cminor.St_cost (lbl, stmt) ->
+ let incr =
+ if CostLabel.Map.mem lbl costs_mapping then
+ CostLabel.Map.find lbl costs_mapping
+ else 0 in
+ let stmt = instrument_stmt costs_mapping cost_id stmt in
+ if incr = 0 then stmt
+ else Cminor.St_seq (increment cost_id incr, stmt)
+
+
+let instrument_function costs_mapping cost_id = function
+ | Cminor.F_int int_def ->
+ let body = instrument_stmt costs_mapping cost_id int_def.Cminor.f_body in
+ let def = { int_def with Cminor.f_body = body} in
+ Cminor.F_int def
+ | def -> def
+
+
+(** [instrument prog cost_map] instruments the program [prog]. First a fresh
+ global variable --- the so-called cost variable --- is added to the program.
+ Then, each cost label in the program is replaced by an increment of the cost
+ variable, following the mapping [cost_map]. The function also returns the
+ name of the cost variable and the name of the cost increment function. *)
+
+let instrument p costs_mapping =
+ let cost_id = fresh_cost_id "_cost" p in
+ let vars = (cost_id, [AST.Data_int32 0]) :: p.Cminor.vars in
+ let f (f_name, f_def) =
+ (f_name, instrument_function costs_mapping cost_id f_def) in
+ let functs = List.map f p.Cminor.functs in
+ ({ Cminor.vars = vars ;
+ Cminor.functs = functs ;
+ Cminor.main = p.Cminor.main },
+ "" (* TODO *),
+ "" (* TODO *))
+*)
+
+
+(* Program cost labels and labels *)
+
+let labels_empty = (CostLabel.Set.empty, Label.Set.empty)
+
+let add_cost_label lbl (cost_label, user_label) =
+ (CostLabel.Set.add lbl cost_label, user_label)
+
+let add_label lbl (cost_label, user_label) =
+ (cost_label, Label.Set.add lbl user_label)
+
+let labels_union (cost_labels1, user_labels1) (cost_labels2, user_labels2) =
+ (CostLabel.Set.union cost_labels1 cost_labels2,
+ Label.Set.union user_labels1 user_labels2)
+
+let labels_union_list l =
+ let f res labels = labels_union res labels in
+ List.fold_left f labels_empty l
+
+let f_exp_labels (Cminor.Expr (ed, _)) subexp_res =
+ let labels1 = labels_union_list subexp_res in
+ let labels2 = match ed with
+ | Cminor.Exp_cost (lbl, _) -> add_cost_label lbl labels_empty
+ | _ -> labels_empty in
+ labels_union labels1 labels2
+
+let f_body_labels stmt subexp_res substmt_res =
+ let labels1 = labels_union_list subexp_res in
+ let labels2 = labels_union_list substmt_res in
+ let labels = labels_union labels1 labels2 in
+ let labels3 = match stmt with
+ | Cminor.St_label (lbl, _) -> add_label lbl labels_empty
+ | Cminor.St_cost (lbl, _) -> add_cost_label lbl labels_empty
+ | _ -> labels_empty in
+ labels_union labels labels3
+
+let body_labels stmt = CminorFold.statement f_exp_labels f_body_labels stmt
+
+let prog_labels p =
+ let f lbls (_, f_def) = match f_def with
+ | Cminor.F_int def ->
+ labels_union lbls (body_labels def.Cminor.f_body)
+ | _ -> lbls in
+ List.fold_left f (CostLabel.Set.empty, Label.Set.empty) p.Cminor.functs
+
+let cost_labels p = fst (prog_labels p)
+let user_labels p = snd (prog_labels p)
+
+let all_labels p =
+ let (cost_labels, user_labels) = prog_labels p in
+ let all =
+ CostLabel.Set.fold (fun lbl lbls -> StringTools.Set.add lbl lbls)
+ cost_labels StringTools.Set.empty in
+ Label.Set.fold (fun lbl lbls -> StringTools.Set.add lbl lbls) user_labels all
--- /dev/null
+
+(** This module defines the instrumentation of a [Cminor] program. *)
+
+(*
+(** [instrument prog cost_map] instruments the program [prog]. First a fresh
+ global variable --- the so-called cost variable --- is added to the program.
+ Then, each cost label in the program is replaced by an increment of the cost
+ variable, following the mapping [cost_map]. The function also returns the
+ name of the cost variable and the name of the cost increment function. *)
+
+val instrument : Cminor.program -> int CostLabel.Map.t ->
+ Cminor.program * string * string
+*)
+
+val cost_labels : Cminor.program -> CostLabel.Set.t
+val user_labels : Cminor.program -> Label.Set.t
+val all_labels : Cminor.program -> StringTools.Set.t
+
+val prog_idents : Cminor.program -> StringTools.Set.t
--- /dev/null
+
+(** This module provides folding functions over the constructors of the
+ [Cminor]'s AST. *)
+
+
+let expression_subs (Cminor.Expr (ed, _)) = match ed with
+ | Cminor.Id _ | Cminor.Cst _ -> []
+ | Cminor.Op1 (_, e) | Cminor.Mem (_, e) | Cminor.Exp_cost (_, e) -> [e]
+ | Cminor.Op2 (_, e1, e2) -> [e1 ; e2]
+ | Cminor.Cond (e1, e2, e3) -> [e1 ; e2 ; e3]
+
+let expression_fill_subs (Cminor.Expr (ed, t)) subs =
+ let ed = match ed, subs with
+ | Cminor.Id _, _ | Cminor.Cst _, _ -> ed
+ | Cminor.Op1 (op1, _), e :: _ -> Cminor.Op1 (op1, e)
+ | Cminor.Op2 (op2, _, _), e1 :: e2 :: _ -> Cminor.Op2 (op2, e1, e2)
+ | Cminor.Mem (size, _), e :: _ -> Cminor.Mem (size, e)
+ | Cminor.Cond _, e1 :: e2 :: e3 :: _ -> Cminor.Cond (e1, e2, e3)
+ | Cminor.Exp_cost (lbl, _), e :: _ -> Cminor.Exp_cost (lbl, e)
+ | _ -> assert false (* wrong parameter size *) in
+ Cminor.Expr (ed, t)
+
+
+(* In [expression f e], [f]'s second argument is the list of
+ [expression]'s results on [e]'s sub-expressions. *)
+
+let rec expression f_expr e =
+ let sub_es_res = List.map (expression f_expr) (expression_subs e) in
+ f_expr e sub_es_res
+
+
+let statement_subs = function
+ | Cminor.St_skip | Cminor.St_exit _ | Cminor.St_return None
+ | Cminor.St_goto _ -> ([], [])
+ | Cminor.St_assign (_, e) | Cminor.St_switch (e, _, _)
+ | Cminor.St_return (Some e) -> ([e], [])
+ | Cminor.St_store (_, e1, e2) ->
+ ([e1 ; e2], [])
+ | Cminor.St_call (_, f, args, _) | Cminor.St_tailcall (f, args, _) ->
+ (f :: args, [])
+ | Cminor.St_seq (stmt1, stmt2) ->
+ ([], [stmt1 ; stmt2])
+ | Cminor.St_ifthenelse (e, stmt1, stmt2) ->
+ ([e], [stmt1 ; stmt2])
+ | Cminor.St_loop stmt | Cminor.St_block stmt
+ | Cminor.St_label (_, stmt) | Cminor.St_cost (_, stmt) ->
+ ([], [stmt])
+
+let statement_fill_subs stmt sub_es sub_stmts =
+ match stmt, sub_es, sub_stmts with
+ | ( Cminor.St_skip | Cminor.St_exit _ | Cminor.St_return None
+ | Cminor.St_goto _), _, _ -> stmt
+ | Cminor.St_assign (x, _), e :: _, _ ->
+ Cminor.St_assign (x, e)
+ | Cminor.St_switch (_, cases, dflt), e :: _, _ ->
+ Cminor.St_switch (e, cases, dflt)
+ | Cminor.St_return _, e :: _, _ ->
+ Cminor.St_return (Some e)
+ | Cminor.St_store (size, _, _), e1 :: e2 :: _, _ ->
+ Cminor.St_store (size, e1, e2)
+ | Cminor.St_call (x_opt, _, _, sg), f :: args, _ ->
+ Cminor.St_call (x_opt, f, args, sg)
+ | Cminor.St_tailcall (_, _, sg), f :: args, _ ->
+ Cminor.St_tailcall (f, args, sg)
+ | Cminor.St_seq _, _, stmt1 :: stmt2 :: _ ->
+ Cminor.St_seq (stmt1, stmt2)
+ | Cminor.St_ifthenelse _, e :: _, stmt1 :: stmt2 :: _ ->
+ Cminor.St_ifthenelse (e, stmt1, stmt2)
+ | Cminor.St_loop _, _, stmt :: _ ->
+ Cminor.St_loop stmt
+ | Cminor.St_block _, _, stmt :: _ ->
+ Cminor.St_block stmt
+ | Cminor.St_label (lbl, _), _, stmt :: _ ->
+ Cminor.St_label (lbl, stmt)
+ | Cminor.St_cost (lbl, _), _, stmt :: _ ->
+ Cminor.St_cost (lbl, stmt)
+ | _ -> assert false (* do not use on these arguments *)
+
+(* In [statement f_expr f_stmt stmt], [f_stmt]'s second argument is the
+ list of [expression f_expr]'s results on [stmt]'s sub-expressions, and
+ [f_stmt]'s third argument is the list of [statement]'s results
+ on [stmt]'s sub-statements. *)
+
+let rec statement f_expr f_stmt stmt =
+ let (sub_es, sub_stmts) = statement_subs stmt in
+ let sub_es_res = List.map (expression f_expr) sub_es in
+ let sub_stmts_res = List.map (statement f_expr f_stmt) sub_stmts in
+ f_stmt stmt sub_es_res sub_stmts_res
--- /dev/null
+
+(** This module provides folding functions over the constructors of the
+ [Cminor]'s AST. *)
+
+val expression_subs : Cminor.expression -> Cminor.expression list
+
+val expression_fill_subs : Cminor.expression -> Cminor.expression list ->
+ Cminor.expression
+
+(* In [expression f e], [f]'s second argument is the list of
+ [expression]'s results on [e]'s sub-expressions. *)
+
+val expression : (Cminor.expression -> 'a list -> 'a) ->
+ Cminor.expression ->
+ 'a
+
+val statement_subs : Cminor.statement ->
+ (Cminor.expression list * Cminor.statement list)
+
+val statement_fill_subs : Cminor.statement ->
+ Cminor.expression list ->
+ Cminor.statement list ->
+ Cminor.statement
+
+(* In [statement f_expr f_stmt stmt], [f_stmt]'s second argument is the
+ list of [expression f_expr]'s results on [stmt]'s sub-expressions, and
+ [f_stmt]'s third argument is the list of [statement]'s results
+ on [stmt]'s sub-statements. *)
+
+val statement : (Cminor.expression -> 'a list -> 'a) ->
+ (Cminor.statement -> 'a list -> 'b list -> 'b) ->
+ Cminor.statement ->
+ 'b
--- /dev/null
+open AST
+open Cminor
+
+module Mem = Driver.CminorMemory
+module Val = Mem.Value
+module LocalEnv = Map.Make(String)
+type local_env = Val.t LocalEnv.t
+type memory = Cminor.function_def Mem.memory
+
+
+let error_prefix = "Cminor interpret"
+let error s = Error.global_error error_prefix s
+let warning s = Error.warning error_prefix s
+let error_float () = error "float not supported."
+
+
+(* Helpers *)
+
+let value_of_address = List.hd
+let address_of_value v = [v]
+
+
+(* State of execution *)
+
+type continuation =
+ Ct_stop
+ | Ct_cont of statement*continuation
+ | Ct_endblock of continuation
+ | Ct_returnto of
+ ident option*internal_function*Val.address*local_env*continuation
+
+type state =
+ State_regular of
+ internal_function*statement*continuation*Val.address*local_env*(function_def Mem.memory)
+ | State_call of function_def*Val.t list*continuation*(function_def Mem.memory)
+ | State_return of Val.t*continuation*(function_def Mem.memory)
+
+let string_of_local_env lenv =
+ let f x v s = s ^ x ^ " = " ^ (Val.to_string v) ^ " " in
+ LocalEnv.fold f lenv ""
+
+let string_of_expr = CminorPrinter.print_expression
+
+let string_of_args args =
+ "(" ^ (MiscPottier.string_of_list ", " string_of_expr args) ^ ")"
+
+let rec string_of_statement = function
+ | St_skip -> "skip"
+ | St_assign (x, e) -> x ^ " = " ^ (string_of_expr e)
+ | St_store (q, e1, e2) ->
+ Printf.sprintf "%s[%s] = %s"
+ (Memory.string_of_quantity q) (string_of_expr e1) (string_of_expr e2)
+ | St_call (None, f, args, _)
+ | St_tailcall (f, args, _) -> (string_of_expr f) ^ (string_of_args args)
+ | St_call (Some x, f, args, _) ->
+ x ^ " = " ^ (string_of_expr f) ^ (string_of_args args)
+ | St_seq _ -> "sequence"
+ | St_ifthenelse (e, _, _) -> "if (" ^ (string_of_expr e) ^ ")"
+ | St_loop _ -> "loop"
+ | St_block _ -> "block"
+ | St_exit n -> "exit " ^ (string_of_int n)
+ | St_switch (e, _, _) -> "switch (" ^ (string_of_expr e) ^ ")"
+ | St_return None -> "return"
+ | St_return (Some e) -> "return (" ^ (string_of_expr e) ^ ")"
+ | St_label (lbl, _) -> "label " ^ lbl
+ | St_goto lbl -> "goto " ^ lbl
+ | St_cost (lbl, _) -> "cost " ^ lbl
+
+let print_state = function
+ | State_regular (_, stmt, _, sp, lenv, mem) ->
+ Printf.printf "Local environment:\n%s\n\nMemory:%s\nStack pointer: %s\n\nRegular state: %s\n\n%!"
+ (string_of_local_env lenv)
+ (Mem.to_string mem)
+ (Val.to_string (value_of_address sp))
+ (string_of_statement stmt)
+ | State_call (_, args, _, mem) ->
+ Printf.printf "Memory:%s\nCall state\n\nArguments:\n%s\n\n%!"
+ (Mem.to_string mem)
+ (MiscPottier.string_of_list " " Val.to_string args)
+ | State_return (v, _, mem) ->
+ Printf.printf "Memory:%s\nReturn state: %s\n\n%!"
+ (Mem.to_string mem)
+ (Val.to_string v)
+
+
+(* Global and local environment management *)
+
+let init_local_env args params vars =
+ let f_param lenv (x, _) v = LocalEnv.add x v lenv in
+ let f_var lenv (x, _) = LocalEnv.add x Val.undef lenv in
+ let lenv = List.fold_left2 f_param LocalEnv.empty params args in
+ List.fold_left f_var lenv vars
+
+let find_fundef f mem =
+ let addr = Mem.find_global mem f in
+ Mem.find_fun_def mem addr
+
+
+(* Expression evaluation *)
+
+module Eval_op (M : Memory.S) = struct
+
+ let concrete_stacksize = M.concrete_size
+
+ let ext_fun_of_sign = function
+ | AST.Signed -> M.Value.sign_ext
+ | AST.Unsigned -> M.Value.zero_ext
+
+ let cast_to_std t v = match t with
+ | AST.Sig_int (size, sign) -> (ext_fun_of_sign sign) v size M.int_size
+ | AST.Sig_float _ -> error_float ()
+ | AST.Sig_offset | AST.Sig_ptr -> v
+
+ let cast_from_std t v = match t with
+ | AST.Sig_int (size, _) -> (ext_fun_of_sign AST.Unsigned) v M.int_size size
+ | AST.Sig_float _ -> error_float ()
+ | AST.Sig_offset | AST.Sig_ptr -> v
+
+ let cst mem sp t = function
+ | Cst_int i -> cast_to_std t (M.Value.of_int i)
+ | Cst_float _ -> error_float ()
+ | Cst_addrsymbol id when M.mem_global mem id ->
+ value_of_address (M.find_global mem id)
+ | Cst_addrsymbol id -> error ("unknown global variable " ^ id ^ ".")
+ | Cst_stack -> value_of_address sp
+ | Cst_offset off -> M.Value.of_int (M.concrete_offset off)
+ | Cst_sizeof t' -> cast_to_std t (M.Value.of_int (M.concrete_size t'))
+
+ let fun_of_op1 = function
+ | Op_cast ((from_size, from_sign), to_size) ->
+ (fun v -> (ext_fun_of_sign from_sign) v from_size to_size)
+ | Op_negint -> M.Value.negint
+ | Op_notbool -> M.Value.notbool
+ | Op_notint -> M.Value.negint
+ | Op_id -> (fun v -> v)
+ | Op_ptrofint
+ | Op_intofptr ->
+ error "conversion between integers and pointers not supported yet."
+
+ let op1 ret_type t op v =
+ cast_from_std ret_type ((fun_of_op1 op) (cast_to_std t v))
+
+ let fun_of_op2 = function
+ | Op_add | Op_addp -> M.Value.add
+ | Op_sub | Op_subp | Op_subpp -> M.Value.sub
+ | Op_mul -> M.Value.mul
+ | Op_div -> M.Value.div
+ | Op_divu -> M.Value.divu
+ | Op_mod -> M.Value.modulo
+ | Op_modu -> M.Value.modulou
+ | Op_and -> M.Value.and_op
+ | Op_or -> M.Value.or_op
+ | Op_xor -> M.Value.xor
+ | Op_shl -> M.Value.shl
+ | Op_shr -> M.Value.shr
+ | Op_shru -> M.Value.shru
+ | Op_cmp Cmp_eq | Op_cmpp Cmp_eq -> M.Value.cmp_eq
+ | Op_cmp Cmp_ne | Op_cmpp Cmp_ne -> M.Value.cmp_ne
+ | Op_cmp Cmp_gt | Op_cmpp Cmp_gt -> M.Value.cmp_gt
+ | Op_cmp Cmp_ge | Op_cmpp Cmp_ge -> M.Value.cmp_ge
+ | Op_cmp Cmp_lt | Op_cmpp Cmp_lt -> M.Value.cmp_lt
+ | Op_cmp Cmp_le | Op_cmpp Cmp_le -> M.Value.cmp_le
+ | Op_cmpu Cmp_eq -> M.Value.cmp_eq_u
+ | Op_cmpu Cmp_ne -> M.Value.cmp_ne_u
+ | Op_cmpu Cmp_gt -> M.Value.cmp_gt_u
+ | Op_cmpu Cmp_ge -> M.Value.cmp_ge_u
+ | Op_cmpu Cmp_lt -> M.Value.cmp_lt_u
+ | Op_cmpu Cmp_le -> M.Value.cmp_le_u
+
+ let op2 ret_type t1 t2 op2 v1 v2 =
+ let v1 = cast_to_std t1 v1 in
+ let v2 = cast_to_std t2 v2 in
+ cast_from_std ret_type ((fun_of_op2 op2) v1 v2)
+end
+
+module Eval = Eval_op (Mem)
+
+let concrete_stacksize = Eval.concrete_stacksize
+let eval_constant = Eval.cst
+let eval_unop = Eval.op1
+let eval_binop = Eval.op2
+
+let type_of_expr (Cminor.Expr (_, t)) = t
+
+let rec eval_expression stack local_env memory (Cminor.Expr (ed, t)) =
+ match ed with
+ | Id x when LocalEnv.mem x local_env -> (LocalEnv.find x local_env,[])
+ | Id x -> error ("unknown local variable " ^ x ^ ".")
+ | Cst(c) -> (eval_constant memory stack t c,[])
+ | Op1(op,arg) ->
+ let (v,l) = eval_expression stack local_env memory arg in
+ (eval_unop t (type_of_expr arg) op v,l)
+ | Op2(op, arg1, arg2) ->
+ let (v1,l1) = eval_expression stack local_env memory arg1 in
+ let (v2,l2) = eval_expression stack local_env memory arg2 in
+ (eval_binop t (type_of_expr arg1) (type_of_expr arg2) op v1 v2,l1@l2)
+ | Mem(q,a) ->
+ let (v,l) = eval_expression stack local_env memory a in
+ (Mem.loadq memory q (address_of_value v),l)
+ | Cond(a1,a2,a3) ->
+ let (v1,l1) = eval_expression stack local_env memory a1 in
+ if Val.is_true v1 then
+ let (v2,l2) = eval_expression stack local_env memory a2 in
+ (v2,l1@l2)
+ else
+ if Val.is_false v1 then
+ let (v3,l3) = eval_expression stack local_env memory a3 in
+ (v3,l1@l3)
+ else error "undefined conditional value."
+ | Exp_cost(lbl,e) ->
+ let (v,l) = eval_expression stack local_env memory e in
+ (v,l@[lbl])
+
+let eval_exprlist sp lenv mem es =
+ let f (vs, cost_lbls) e =
+ let (v, cost_lbls') = eval_expression sp lenv mem e in
+ (vs @ [v], cost_lbls @ cost_lbls') in
+ List.fold_left f ([], []) es
+
+(* State transition *)
+
+let rec callcont = function
+ Ct_stop -> Ct_stop
+ | Ct_cont(_,k) -> callcont k
+ | Ct_endblock(k) -> callcont k
+ | Ct_returnto(a,b,c,d,e) -> Ct_returnto(a,b,c,d,e)
+
+let findlabel lbl st k =
+ let rec fdlbl k = function
+ St_skip -> None
+ | St_assign(_,_) -> None
+ | St_store(_,_,_) -> None
+ | St_call(_,_,_,_) -> None
+ | St_tailcall(_,_,_) -> None
+ | St_seq(s1,s2) ->
+ (match fdlbl (Ct_cont(s2,k)) s1 with
+ None -> fdlbl k s2
+ | Some(v) -> Some(v)
+ )
+ | St_ifthenelse(_,s1,s2) ->
+ (match fdlbl k s1 with
+ None -> fdlbl k s2
+ | Some(v) -> Some(v)
+ )
+ | St_loop(s) -> fdlbl (Ct_cont(St_loop(s),k)) s
+ | St_block(s) -> fdlbl (Ct_endblock(k)) s
+ | St_exit(_) -> None
+ | St_switch(_,_,_) -> None
+ | St_return(_) -> None
+ | St_label(l,s) when l = lbl -> Some((s,k))
+ | St_goto(_) -> None
+ | St_cost (_,s) | St_label (_,s) -> fdlbl k s
+ in match fdlbl k st with
+ None -> assert false (*Wrong label*)
+ | Some(v) -> v
+
+
+let call_state sigma e m f params cont =
+ let (addr,l1) = eval_expression sigma e m f in
+ let fun_def = Mem.find_fun_def m (address_of_value addr) in
+ let (args,l2) = eval_exprlist sigma e m params in
+ (State_call(fun_def,args,cont,m),l1@l2)
+
+let eval_stmt f k sigma e m s = match s, k with
+ | St_skip,Ct_cont(s,k) -> (State_regular(f, s, k, sigma, e, m),[])
+ | St_skip,Ct_endblock(k) -> (State_regular(f, St_skip, k, sigma, e, m),[])
+ | St_skip, (Ct_returnto _ as k) ->
+ (State_return (Val.undef,k,Mem.free m sigma),[])
+ | St_skip,Ct_stop ->
+ (State_return (Val.undef,Ct_stop,Mem.free m sigma),[])
+ | St_assign(x,exp),_ ->
+ let (v,l) = eval_expression sigma e m exp in
+ let e = LocalEnv.add x v e in
+ (State_regular(f, St_skip, k, sigma, e, m),l)
+ | St_store(q,a1,a2),_ ->
+ let (v1,l1) = eval_expression sigma e m a1 in
+ let (v2,l2) = eval_expression sigma e m a2 in
+ let m = Mem.storeq m q (address_of_value v1) v2 in
+ (State_regular(f, St_skip, k, sigma, e, m),l1@l2)
+ | St_call(xopt,f',params,_),_ ->
+ call_state sigma e m f' params (Ct_returnto(xopt,f,sigma,e,k))
+ | St_tailcall(f',params,_),_ ->
+ call_state sigma e m f' params (callcont k)
+ | St_seq(s1,s2),_ -> (State_regular(f, s1, Ct_cont(s2, k), sigma, e, m),[])
+ | St_ifthenelse(exp,s1,s2),_ ->
+ let (v,l) = eval_expression sigma e m exp in
+ let next_stmt =
+ if Val.is_true v then s1
+ else
+ if Val.is_false v then s2
+ else error "undefined conditional value." in
+ (State_regular(f,next_stmt,k,sigma,e,m),l)
+ | St_loop(s),_ -> (State_regular(f,s,Ct_cont((St_loop s),k),sigma,e,m),[])
+ | St_block(s),_ -> (State_regular(f,s,(Ct_endblock k),sigma,e,m),[])
+ | St_exit(n),Ct_cont(s,k) -> (State_regular(f,(St_exit n),k,sigma,e,m),[])
+ | St_exit(0),Ct_endblock(k) -> (State_regular(f,St_skip,k,sigma,e,m),[])
+ | St_exit(n),Ct_endblock(k) ->
+ (State_regular(f,(St_exit (n-1)),k,sigma,e,m),[])
+ | St_label(_,s),_ -> (State_regular(f,s,k,sigma,e,m),[])
+ | St_goto(lbl),_ ->
+ let (s2,k2) = findlabel lbl f.f_body (callcont k) in
+ (State_regular(f,s2,k2,sigma,e,m),[])
+ | St_switch(exp,lst,def),_ ->
+ let (v,l) = eval_expression sigma e m exp in
+ if Val.is_int v then
+ try
+ let i = Val.to_int v in
+ let nb_exit =
+ if List.mem_assoc i lst then List.assoc i lst
+ else def in
+ (State_regular(f, St_exit nb_exit,k, sigma, e, m),l)
+ with _ -> error "int value too big."
+ else error "undefined switch value."
+ | St_return(None),_ ->
+ (State_return (Val.undef,callcont k,Mem.free m sigma),[])
+ | St_return(Some(a)),_ ->
+ let (v,l) = eval_expression sigma e m a in
+ (State_return (v,callcont k,Mem.free m sigma),l)
+ | St_cost(lbl,s),_ -> (State_regular(f,s,k,sigma,e,m),[lbl])
+ | _ -> error "state malformation."
+
+
+module InterpretExternal = Primitive.Interpret (Mem)
+
+let interpret_external k mem f args =
+ let (mem', v) = match InterpretExternal.t mem f args with
+ | (mem', InterpretExternal.V vs) ->
+ let v = if List.length vs = 0 then Val.undef else List.hd vs in
+ (mem', v)
+ | (mem', InterpretExternal.A addr) -> (mem', value_of_address addr) in
+ State_return (v, k, mem')
+
+let step_call vargs k m = function
+ | F_int f ->
+ let (m, sp) = Mem.alloc m (concrete_stacksize f.f_stacksize) in
+ let lenv = init_local_env vargs f.f_params f.f_vars in
+ State_regular(f,f.f_body,k,sp,lenv,m)
+ | F_ext f -> interpret_external k m f.ef_tag vargs
+
+let step = function
+ | State_regular(f,stmt,k,sp,e,m) -> eval_stmt f k sp e m stmt
+ | State_call(fun_def,vargs,k,m) -> (step_call vargs k m fun_def,[])
+ | State_return(v,Ct_returnto(None,f,sigma,e,k),m) ->
+ (State_regular(f,St_skip,k,sigma,e,m),[])
+ | State_return(v,Ct_returnto(Some x,f,sigma,e,k),m) ->
+ let e = LocalEnv.add x v e in
+ (State_regular(f,St_skip,k,sigma,e,m),[])
+ | _ -> error "state malformation."
+
+
+let init_mem prog =
+ let f_var mem (x, size, init_datas) = Mem.add_var mem x size init_datas in
+ let mem = List.fold_left f_var Mem.empty prog.vars in
+ let f_fun_def mem (f, def) = Mem.add_fun_def mem f def in
+ List.fold_left f_fun_def mem prog.functs
+
+let compute_result v =
+ if Val.is_int v then IntValue.Int32.cast (Val.to_int_repr v)
+ else IntValue.Int32.zero
+
+let rec exec debug trace (state, l) =
+ let cost_labels = l @ trace in
+ let print_and_return_result res =
+ if debug then Printf.printf "Result = %s\n%!"
+ (IntValue.Int32.to_string res) ;
+ (res, cost_labels) in
+ if debug then print_state state ;
+ match state with
+ | State_return(v,Ct_stop,_) -> (* Explicit return in main *)
+ print_and_return_result (compute_result v)
+ | State_regular(_,St_skip,Ct_stop,_,_,_) -> (* Implicit return in main *)
+ print_and_return_result IntValue.Int32.zero
+ | state -> exec debug cost_labels (step state)
+
+let interpret debug prog =
+ Printf.printf "*** Cminor interpret ***\n%!" ;
+ match prog.main with
+ | None -> (IntValue.Int32.zero, [])
+ | Some main ->
+ let mem = init_mem prog in
+ let first_state = (State_call (find_fundef main mem,[],Ct_stop,mem),[]) in
+ exec debug [] first_state
--- /dev/null
+(** This module provides a function to interpret a [Cminor] program and
+ return the trace of cost labels encountered. This function can
+ also print debug informations. *)
+
+module Eval_op (M : Memory.S) : sig
+ val concrete_stacksize : AST.abstract_size -> int
+ val cst :
+ 'a M.memory -> M.Value.address -> AST.sig_type -> AST.cst -> M.Value.t
+ val op1 :
+ AST.sig_type (* returned type *) -> AST.sig_type -> AST.op1 -> M.Value.t ->
+ M.Value.t
+ val op2 :
+ AST.sig_type (* returned type *) -> AST.sig_type -> AST.sig_type ->
+ AST.op2 -> M.Value.t -> M.Value.t -> M.Value.t
+end
+
+val interpret : bool -> Cminor.program -> AST.trace
--- /dev/null
+
+(** This module defines the labelling of a [Cminor] program. *)
+
+
+let prefix = "_cost"
+
+
+(* Add a cost label in front of a statement. *)
+
+let add_starting_cost_label cost_universe stmt =
+ Cminor.St_cost (CostLabel.Gen.fresh cost_universe, stmt)
+
+(* Add a cost label at the end of a statement. *)
+
+let add_ending_cost_label cost_universe stmt =
+ Cminor.St_seq (stmt, add_starting_cost_label cost_universe Cminor.St_skip)
+
+
+(* This function adds cost labels to an expression, given the result on its
+ sub-expressions. *)
+
+let f_add_cost_labels_exp cost_universe e subexp_res = match e, subexp_res with
+ | Cminor.Id _, _ | Cminor.Cst _, _ -> e
+ | Cminor.Op1 (op1, _), [e] -> Cminor.Op1 (op1, e)
+ | Cminor.Op2 (op2, _, _), [e1 ; e2] -> Cminor.Op2 (op2, e1, e2)
+ | Cminor.Mem (chunk, _), [e] -> Cminor.Mem (chunk, e)
+ | Cminor.Cond _, [e1 ; e2 ; e3] ->
+ let e2 = Cminor.Exp_cost (CostLabel.Gen.fresh cost_universe, e2) in
+ let e3 = Cminor.Exp_cost (CostLabel.Gen.fresh cost_universe, e3) in
+ Cminor.Cond (e1, e2, e3)
+ | Cminor.Exp_cost (lab, _), [e] -> Cminor.Exp_cost (lab, e)
+ | _ -> assert false (* wrong number of arguments *)
+
+(* This function adds cost labels to a statement, given the result on its
+ sub-expressions and sub-statements. *)
+
+let f_add_cost_labels_body cost_universe stmt subexp_res substmt_res =
+ match stmt, subexp_res, substmt_res with
+ | Cminor.St_skip, _, _ | Cminor.St_exit _, _, _
+ | Cminor.St_goto _, _, _ | Cminor.St_return None, _, _ ->
+ stmt
+ | Cminor.St_assign (x, _), [e], _ ->
+ Cminor.St_assign (x, e)
+ | Cminor.St_store (chunk, _, _), [e1 ; e2], _ ->
+ Cminor.St_store (chunk, e1, e2)
+ | Cminor.St_call (x, _, _, sg), f :: args, _ ->
+ Cminor.St_call (x, f, args, sg)
+ | Cminor.St_tailcall (_, _, sg), f :: args, _ ->
+ Cminor.St_tailcall (f, args, sg)
+ | Cminor.St_seq _, _, [stmt1 ; stmt2] ->
+ Cminor.St_seq (stmt1, stmt2)
+ | Cminor.St_ifthenelse _, [e], [stmt1 ; stmt2] ->
+ let stmt1 = add_starting_cost_label cost_universe stmt1 in
+ let stmt2 = add_starting_cost_label cost_universe stmt2 in
+ Cminor.St_ifthenelse (e, stmt1, stmt2)
+ | Cminor.St_loop _, _, [stmt] ->
+ let stmt = add_starting_cost_label cost_universe stmt in
+ add_ending_cost_label cost_universe (Cminor.St_loop stmt)
+ | Cminor.St_block _, _, [stmt] ->
+ Cminor.St_block stmt
+ | Cminor.St_switch (_, tbl, dflt), [e], _ ->
+ add_ending_cost_label cost_universe (Cminor.St_switch (e, tbl, dflt))
+ | Cminor.St_return _, [e], _ ->
+ Cminor.St_return (Some e)
+ | Cminor.St_label (lab, _), _, [stmt] ->
+ let stmt = add_starting_cost_label cost_universe stmt in
+ Cminor.St_label (lab, stmt)
+ | Cminor.St_cost (lab, _), _, [stmt] ->
+ Cminor.St_cost (lab, stmt)
+ | _ -> assert false (* wrong number of arguments *)
+
+(* Add cost labels to a statement. *)
+
+let add_cost_labels_body cost_universe stmt =
+ CminorFold.statement
+ (f_add_cost_labels_exp cost_universe)
+ (f_add_cost_labels_body cost_universe)
+ stmt
+
+(* Add cost labels to a function definition. *)
+
+let add_cost_labels_functs cost_universe functs (f_id, f_def) =
+ match f_def with
+ | Cminor.F_int def ->
+ let body = add_cost_labels_body cost_universe def.Cminor.f_body in
+ let body = add_starting_cost_label cost_universe body in
+ let def' = { def with Cminor.f_body = body } in
+ functs @ [(f_id, Cminor.F_int def')]
+ | Cminor.F_ext _ -> functs @ [(f_id, f_def)]
+
+(** [add_cost_labels prog] inserts some labels to enable cost annotation. *)
+
+let add_cost_labels prog =
+ let labs = CminorAnnotator.all_labels prog in
+ let labs = StringTools.Set.fold CostLabel.Set.add labs CostLabel.Set.empty in
+ let cost_prefix = CostLabel.Gen.fresh_prefix labs prefix in
+ let cost_universe = CostLabel.Gen.new_universe cost_prefix in
+ let functs =
+ List.fold_left (add_cost_labels_functs cost_universe) []
+ prog.Cminor.functs in
+ { prog with Cminor.functs = functs }
--- /dev/null
+
+(** This module defines the labelling of a [Cminor] program. *)
+
+(** [add_cost_labels prog] inserts some labels to enable
+ cost annotation.
+
+ The labelling of a function proceeds as follows:
+
+ - A label is added at the beginning of the function.
+
+ - For each branching instruction in the function, a cost label is added at
+ the beginning of each branch. The concerned instructions are:
+ - ternary expressions;
+ - conditionals;
+ - loops;
+ - switches.
+
+ - For each label instruction in the function, a cost label is added after
+ the label, in order to capture loops potentially created by gotos.
+*)
+
+val add_cost_labels : Cminor.program -> Cminor.program
--- /dev/null
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU General Public License as published by *)
+(* the Free Software Foundation, either version 2 of the License, or *)
+(* (at your option) any later version. This file is also distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+{
+ open CminorParser
+ exception Error of string
+}
+
+let ret = ['\010']
+let blank = [' ' '\009' '\012' '\013']
+let floatlit =
+ ['0'-'9'] ['0'-'9' '_']*
+ ('.' ['0'-'9' '_']* )?
+ (['e' 'E'] ['+' '-']? ['0'-'9'] ['0'-'9' '_']*)?
+let ident = ['A'-'Z' 'a'-'z' '_'] ['A'-'Z' 'a'-'z' '_' '0'-'9']*
+let intlit = "-"? ( ['0'-'9']+ | "0x" ['0'-'9' 'a'-'f' 'A'-'F']+
+ | "0o" ['0'-'7']+ | "0b" ['0'-'1']+ )
+let stringlit = "\"" [ ^ '"' ] * '"'
+
+rule token = parse
+ | ret { Misc.LexingExt.new_line lexbuf ; token lexbuf }
+ | blank + { token lexbuf }
+ | "/*" { comment lexbuf; token lexbuf }
+ | "absf" { ABSF }
+ | "&" { AMPERSAND }
+ | "&&" { AMPERSANDAMPERSAND }
+ | "!" { BANG }
+ | "!=" { BANGEQUAL }
+ | "!=f" { BANGEQUALF }
+ | "!=u" { BANGEQUALU }
+ | "|" { BAR }
+ | "||" { BARBAR }
+ | "^" { CARET }
+ | "case" { CASE }
+ | ":" { COLON }
+ | "," { COMMA }
+ | "default" { DEFAULT }
+(* | "$" { DOLLAR } *)
+ | "else" { ELSE }
+ | "=" { EQUAL }
+ | "==" { EQUALEQUAL }
+ | "==f" { EQUALEQUALF }
+ | "==u" { EQUALEQUALU }
+ | "exit" { EXIT }
+ | "extern" { EXTERN }
+ | "float" { FLOAT }
+ | "float32" { FLOAT32 }
+ | "float64" { FLOAT64 }
+ | "floatofint" { FLOATOFINT }
+ | "floatofintu" { FLOATOFINTU }
+ | ">" { GREATER }
+ | ">f" { GREATERF }
+ | ">u" { GREATERU }
+ | ">=" { GREATEREQUAL }
+ | ">=f" { GREATEREQUALF }
+ | ">=u" { GREATEREQUALU }
+ | ">>" { GREATERGREATER }
+ | ">>u" { GREATERGREATERU }
+ | "if" { IF }
+(* | "in" { IN } *)
+ | "int" { INT }
+ | "int8" { INT8 }
+ | "int16" { INT16 }
+ | "int32" { INT32 }
+ | "int8sto8" { INT8STO8 }
+ | "int8sto16" { INT8STO16 }
+ | "int8sto32" { INT8STO32 }
+ | "int8uto8" { INT8UTO8 }
+ | "int8uto16" { INT8UTO16 }
+ | "int8uto32" { INT8UTO32 }
+ | "int16sto8" { INT16STO8 }
+ | "int16sto16" { INT16STO16 }
+ | "int16sto32" { INT16STO32 }
+ | "int16uto8" { INT16UTO8 }
+ | "int16uto16" { INT16UTO16 }
+ | "int16uto32" { INT16UTO32 }
+ | "int32sto8" { INT32STO8 }
+ | "int32sto16" { INT32STO16 }
+ | "int32sto32" { INT32STO32 }
+ | "int32uto8" { INT32UTO8 }
+ | "int32uto16" { INT32UTO16 }
+ | "int32uto32" { INT32UTO32 }
+ | "intoffloat" { INTOFFLOAT }
+ | "intuoffloat" { INTUOFFLOAT }
+ | "ptr" { PTR }
+ | "{" { LBRACE }
+(* | "{{" { LBRACELBRACE } *)
+ | "[" { LBRACKET }
+ | "<" { LESS }
+ | "<u" { LESSU }
+ | "<f" { LESSF }
+ | "<=" { LESSEQUAL }
+ | "<=u" { LESSEQUALU }
+ | "<=f" { LESSEQUALF }
+ | "<<" { LESSLESS }
+(* | "let" { LET } *)
+ | "loop" { LOOP }
+ | "(" { LPAREN }
+ | "match" { MATCH }
+ | "-" { MINUS }
+ | "->" { MINUSGREATER }
+ | "-f" { MINUSF }
+ | "%" { PERCENT }
+ | "%u" { PERCENTU }
+ | "+" { PLUS }
+ | "+f" { PLUSF }
+ | "?" { QUESTION }
+ | "}" { RBRACE }
+(* | "}}" { RBRACERBRACE } *)
+ | "]" { RBRACKET }
+ | "return" { RETURN }
+ | ")" { RPAREN }
+ | ";" { SEMICOLON }
+ | "/" { SLASH }
+ | "/f" { SLASHF }
+ | "/u" { SLASHU }
+ | "stack" { STACK }
+ | "*" { STAR }
+ | "*f" { STARF }
+ | "switch" { SWITCH }
+ | "tailcall" { TAILCALL }
+ | "~" { TILDE }
+ | "var" { VAR }
+ | "void" { VOID }
+ | "goto" { GOTO }
+ | "block" { BLOCK }
+ | intlit { INTLIT(int_of_string(Lexing.lexeme lexbuf)) }
+ | floatlit { FLOATLIT(float_of_string(Lexing.lexeme lexbuf)) }
+ | stringlit { let s = Lexing.lexeme lexbuf in
+ STRINGLIT(String.sub s 1 (String.length s - 2)) }
+ | ident { IDENT(Lexing.lexeme lexbuf) }
+ | eof { EOF }
+ | _ { raise(Error("illegal character `" ^ Char.escaped (Lexing.lexeme_char lexbuf 0) ^ "'")) }
+
+and comment = parse
+ "*/" { () }
+ | eof { raise(Error "unterminated comment") }
+ | _ { comment lexbuf }
--- /dev/null
+/* Adapted from Leroy's CompCert */
+/* TODO: check coherence with CminorPrinter */
+
+/* tokens ALLOC, DOLLAR, IN, LET, p_let were unused and have been removed */
+/* precedence levels unused were also removed */
+
+/* *********************************************************************/
+/* */
+/* The Compcert verified compiler */
+/* */
+/* Xavier Leroy, INRIA Paris-Rocquencourt */
+/* */
+/* Copyright Institut National de Recherche en Informatique et en */
+/* Automatique. All rights reserved. This file is distributed */
+/* under the terms of the GNU General Public License as published by */
+/* the Free Software Foundation, either version 2 of the License, or */
+/* (at your option) any later version. This file is also distributed */
+/* under the terms of the INRIA Non-Commercial License Agreement. */
+/* */
+/* *********************************************************************/
+
+%{
+
+ open AST
+ open Cminor
+ open Memory
+
+ let error_prefix = "Cminor parser"
+ let error s = Error.global_error error_prefix s
+ let warning s = Error.warning error_prefix s
+ let error_float () = error "float not supported."
+
+ let uint32 = (4, Unsigned)
+ let int32 = (4, Signed)
+
+ (* Function calls are not allowed in the AST of expressions, but function
+ calls in the AST of statements have a special argument which can be used to
+ store the result of the function call in a side-effect manner.
+ Example: the statement
+ x = y + f(z,g(t));
+ will be transformed into the (simplified syntax) AST statements
+ g(_t1,t)
+ f(_t2,y,_t1);
+ x = y + _t2
+ where _t1 and _t2 are fresh temporary variables. *)
+
+
+ (* Thus, to deal with function calls in expressions, we need to create fresh
+ temporary variables *)
+
+ let temp_counter = ref 0
+ let temporaries = ref []
+
+ let mktemp () =
+ incr temp_counter;
+ let id = Printf.sprintf "_t%d" !temp_counter in
+ temporaries := id :: !temporaries;
+ id
+
+
+ (* Expressions with function calls *)
+
+ type rexpr =
+ | RId of ident
+ | RCst of cst
+ | ROp1 of op1 * rexpr
+ | ROp2 of op2 * rexpr * rexpr
+ | RMem of Memory.quantity * rexpr
+ | RCond of rexpr * rexpr * rexpr
+ | RCall of rexpr * rexpr list * signature
+
+ (* [convert_accu] stores the function calls of expressions with function
+ calls being converted to expressions without function calls *)
+ let convert_accu = ref []
+
+ (* [convert_rexpr rexpr] converts the expression with function calls [rexpr]
+ into an expression without function calls. The function calls in [rexpr]
+ are stored in [convert_accu] *)
+ let rec convert_rexpr = function
+ | RId id -> Id id
+ | RCst c -> Cst c
+ | ROp1 (op, e1) -> Op1 (op, convert_rexpr e1)
+ | ROp2 (op, e1, e2) -> Op2 (op, convert_rexpr e1, convert_rexpr e2)
+ | RMem (chunk, e1) -> Mem (chunk, convert_rexpr e1)
+ | RCond (e1, e2, e3) ->
+ Cond (convert_rexpr e1, convert_rexpr e2, convert_rexpr e3)
+ | RCall(e1, el, sg) ->
+ let c1 = convert_rexpr e1 in
+ let cl = convert_rexpr_list el in
+ let t = mktemp() in
+ convert_accu := St_call (Some t, c1, cl, sg) :: !convert_accu;
+ Id t
+
+ and convert_rexpr_list el = List.map convert_rexpr el
+
+ (* [prepend_seq stmts last] reverses and sequences the list of statements
+ [stmts] and puts [last] at the end *)
+ let rec prepend_seq stmts last =
+ match stmts with
+ | [] -> last
+ | s1 :: sl -> prepend_seq sl (St_seq (s1, last))
+
+ (* [mkeval e] creates the AST statement associated to the Cminor instruction
+ e;
+ where [e] is an expression with possible function calls *)
+ let mkeval e =
+ convert_accu := [];
+ match e with
+ | RCall (e1, el, sg) ->
+ let c1 = convert_rexpr e1 in
+ let cl = convert_rexpr_list el in
+ prepend_seq !convert_accu (St_call (None, c1, cl, sg))
+ | _ ->
+ ignore (convert_rexpr e);
+ prepend_seq !convert_accu St_skip
+
+ (* [mkeval id e] creates the AST statement associated to the Cminor
+ instruction
+ id = e;
+ where [e] is an expression with possible function calls *)
+ let mkassign id e =
+ convert_accu := [];
+ match e with
+ | RCall (e1, el, sg) ->
+ let c1 = convert_rexpr e1 in
+ let cl = convert_rexpr_list el in
+ prepend_seq !convert_accu (St_call (Some id, c1, cl, sg))
+ | _ ->
+ let c = convert_rexpr e in
+ prepend_seq !convert_accu (St_assign (id, c))
+
+ (* [mkstore size e1 e2] creates the AST statement associated to the Cminor
+ instruction
+ size[e1] = e2;
+ where [e1] and [e2] are expressions with possible function calls *)
+ let mkstore size e1 e2 =
+ convert_accu := [];
+ let c1 = convert_rexpr e1 in
+ let c2 = convert_rexpr e2 in
+ prepend_seq !convert_accu (St_store (size, c1, c2))
+
+ (* [mkifthenelse e s1 s2] creates the AST statement associated to the Cminor
+ instruction
+ if (e) { s1 } else { s2 }
+ where [e] is an expression with possible function calls *)
+ let mkifthenelse e s1 s2 =
+ convert_accu := [];
+ let c = convert_rexpr e in
+ prepend_seq !convert_accu (St_ifthenelse (c, s1, s2))
+
+ (* [mkreturn_some e] creates the AST statement associated to the Cminor
+ instruction
+ return e;
+ where [e] is an expression with possible function calls *)
+ let mkreturn_some e =
+ convert_accu := [];
+ let c = convert_rexpr e in
+ prepend_seq !convert_accu (St_return (Some c))
+
+ (* [mkswitch e (cases, dfl)] creates the AST statement associated to the
+ Cminor instruction
+ switch (e) {
+ case i: exit j_i;
+ ...
+ default: exit j_default; }
+ where [e] is an expression with possible function calls *)
+ let mkswitch e (cases, dfl) =
+ convert_accu := [];
+ let c = convert_rexpr e in
+ prepend_seq !convert_accu (St_switch (c, cases, dfl))
+
+ (* The Cminor instruction
+ match (e) {
+ case 0: s0;
+ case 1: s1;
+ case 2: s2; }
+ is syntaxic sugar for the Cminor instruction
+ block {
+ block {
+ block {
+ block {
+ switch (e) {
+ case 0: exit 0;
+ case 1: exit 1;
+ default: exit 2; }
+ } s0; exit 2;
+ } s1; exit 1;
+ } s2;
+ }
+ Note that matches are assumed to be exhaustive *)
+
+ let mkmatch_aux e cases =
+ let ncases = List.length cases in
+ let rec mktable n = function
+ | [] -> assert false
+ | [key, action] -> []
+ | (key, action) :: rem -> (key, n) :: mktable (n+1) rem in
+ let sw =
+ St_switch (e, mktable 0 cases, pred ncases) in
+ let rec mkblocks body n = function
+ | [] -> assert false
+ | [key, action] -> St_block (St_seq (body, action))
+ | (key, action) :: rem ->
+ mkblocks
+ (St_block (St_seq (body, St_seq (action, St_exit n))))
+ (pred n) rem in
+ mkblocks (St_block sw) (pred ncases) cases
+
+ (* [mkmatch e cases] creates the AST statement associated to the Cminor
+ instruction
+ match (e) {
+ case i: s_i;
+ ... }
+ where [e] is an expression with possible function calls *)
+ let mkmatch e cases =
+ convert_accu := [];
+ let c = convert_rexpr e in
+ let s =
+ match cases with
+ | [] -> St_skip (* ??? *)
+ | [key, action] -> action
+ | _ -> mkmatch_aux c cases in
+ prepend_seq !convert_accu s
+
+ (* [mktailcall f [e1;e2;...] sig] creates the AST statement associated to the
+ Cminor instruction
+ tailcall f(e1,e2,...): sig
+ where [e], [e1], [e2], ... are expressions with possible function calls *)
+ let mktailcall e1 el sg =
+ convert_accu := [];
+ let c1 = convert_rexpr e1 in
+ let cl = convert_rexpr_list el in
+ prepend_seq !convert_accu (St_tailcall (c1, cl, sg))
+
+ (* Parse error handler *)
+ let raise_error (_, pos) s = Error.error "parse error" pos (s ^ "\n")
+
+%}
+
+%token ABSF
+%token AMPERSAND
+%token AMPERSANDAMPERSAND
+%token BANG
+%token BANGEQUAL
+%token BANGEQUALF
+%token BANGEQUALU
+%token BAR
+%token BARBAR
+%token CARET
+%token CASE
+%token COLON
+%token COMMA
+%token DEFAULT
+%token ELSE
+%token EQUAL
+%token EQUALEQUAL
+%token EQUALEQUALF
+%token EQUALEQUALU
+%token EOF
+%token EXIT
+%token EXTERN
+%token FLOAT
+%token FLOAT32
+%token FLOAT64
+%token <float> FLOATLIT
+%token FLOATOFINT
+%token FLOATOFINTU
+%token GREATER
+%token GREATERF
+%token GREATERU
+%token GREATEREQUAL
+%token GREATEREQUALF
+%token GREATEREQUALU
+%token GREATERGREATER
+%token GREATERGREATERU
+%token <string> IDENT
+%token IF
+%token INT
+%token INT8
+%token INT16
+%token INT32
+%token INT8STO8
+%token INT8STO16
+%token INT8STO32
+%token INT8UTO8
+%token INT8UTO16
+%token INT8UTO32
+%token INT16STO8
+%token INT16STO16
+%token INT16STO32
+%token INT16UTO8
+%token INT16UTO16
+%token INT16UTO32
+%token INT32STO8
+%token INT32STO16
+%token INT32STO32
+%token INT32UTO8
+%token INT32UTO16
+%token INT32UTO32
+%token <int> INTLIT
+%token INTOFFLOAT
+%token INTUOFFLOAT
+%token LBRACE
+/* %token LBRACELBRACE */
+%token LBRACKET
+%token LESS
+%token LESSU
+%token LESSF
+%token LESSEQUAL
+%token LESSEQUALU
+%token LESSEQUALF
+%token LESSLESS
+%token LOOP
+%token LPAREN
+%token MATCH
+%token MINUS
+%token MINUSF
+%token MINUSGREATER
+%token PERCENT
+%token PERCENTU
+%token PLUS
+%token PLUSF
+%token QUESTION
+%token RBRACE
+/* %token RBRACERBRACE */
+%token RBRACKET
+%token RETURN
+%token RPAREN
+%token SEMICOLON
+%token SLASH
+%token SLASHF
+%token SLASHU
+%token STACK
+%token STAR
+%token STARF
+%token <string> STRINGLIT
+%token SWITCH
+%token TILDE
+%token TAILCALL
+%token VAR
+%token VOID
+%token GOTO BLOCK
+%token PTR
+
+/* Unused */
+/* %token ALLOC DOLLAR IN LET p_let */
+
+/* Precedences from low to high */
+
+/* %left COMMA */
+/* %left p_let */
+/* %right EQUAL */
+%right QUESTION COLON
+%left BARBAR
+%left AMPERSANDAMPERSAND
+%left BAR
+%left CARET
+%left AMPERSAND
+%left EQUALEQUAL BANGEQUAL LESS LESSEQUAL GREATER GREATEREQUAL EQUALEQUALU BANGEQUALU LESSU LESSEQUALU GREATERU GREATEREQUALU EQUALEQUALF BANGEQUALF LESSF LESSEQUALF GREATERF GREATEREQUALF
+%left LESSLESS GREATERGREATER GREATERGREATERU
+%left PLUS PLUSF MINUS MINUSF
+%left STAR SLASH PERCENT STARF SLASHF SLASHU PERCENTU
+%nonassoc BANG TILDE p_uminus ABSF INTOFFLOAT INTUOFFLOAT FLOATOFINT FLOATOFINTU FLOAT32 /* ALLOC */
+%left LPAREN
+
+/* Entry point */
+
+%start program
+%type <Cminor.program> program
+
+%%
+
+%inline position(X): x = X { (x, Position.lex_join $startpos $endpos) }
+
+/* Programs */
+
+program:
+ global_declarations proc_list EOF { { vars = List.rev $1 ;
+ functs = List.rev $2 ;
+ main = Some "main" } }
+;
+
+global_declarations:
+ /* empty */ { [] }
+ | global_declarations global_declaration { $2 :: $1 }
+;
+
+global_declaration:
+ VAR STRINGLIT init_datas { ($2, List.rev $3) }
+ | pos = position(error) { raise_error pos
+ "Global declaration syntax error" }
+;
+
+init_datas:
+ /* empty */ { [] }
+ | init_data { [$1] }
+ | LBRACE init_data_list RBRACE { $2 }
+;
+
+init_data:
+ INTLIT { AST.Data_int32 $1 }
+ | FLOATLIT { AST.Data_float32 $1 }
+ | LPAREN INT8 RPAREN INTLIT { AST.Data_int8 $4 }
+ | LPAREN INT16 RPAREN INTLIT { AST.Data_int16 $4 }
+ | LPAREN INT32 RPAREN INTLIT { AST.Data_int32 $4 }
+ | LPAREN FLOAT32 RPAREN FLOATLIT { AST.Data_float32 $4 }
+ | LPAREN FLOAT64 RPAREN FLOATLIT { AST.Data_float64 $4 }
+ | LBRACKET INTLIT RBRACKET { AST.Data_reserve $2 }
+;
+
+quantity:
+ INTLIT { Memory.QInt $1 }
+ | PTR { Memory.QPtr }
+
+init_data_list:
+ init_data { [$1] }
+ | init_data COMMA init_data_list { $1 :: $3 }
+;
+
+proc_list:
+ /* empty */ { [] }
+ | proc_list proc { $2 :: $1 }
+;
+
+/* Procedures */
+
+proc:
+ STRINGLIT LPAREN parameters RPAREN COLON signature
+ LBRACE
+ stack_declaration
+ var_declarations
+ stmt_list
+ RBRACE
+ { let tmp = !temporaries in
+ temporaries := [];
+ temp_counter := 0;
+ ($1, F_int { f_sig = $6 ;
+ f_params = List.rev $3 ;
+ f_vars = List.rev (tmp @ $9) ;
+ f_ptrs = [] (* TODO *) ;
+ f_stacksize = $8 ;
+ f_body = $10 }) }
+ | EXTERN STRINGLIT COLON signature { ($2, F_ext { ef_tag = $2 ;
+ ef_sig = $4 }) }
+ | pos = position(error) { raise_error pos
+ "Procedure or function declaration syntax error" }
+;
+
+parameters:
+ /* empty */ { [] }
+ | parameter_list { $1 }
+;
+
+parameter_list:
+ IDENT { $1 :: [] }
+ | parameter_list COMMA IDENT { $3 :: $1 }
+ | pos = position(error) { raise_error pos
+ "Parameter declaration syntax error" }
+;
+
+signature:
+ type_ { { args = [] ; res = Type_ret $1 } }
+ | VOID
+ { { args = [] ; res = Type_void } }
+ | type_ MINUSGREATER signature
+ { let s = $3 in {s with args = $1 :: s.args } }
+ | pos = position(error) { raise_error pos "Signature syntax error" }
+;
+
+stack_declaration:
+ /* empty */ { 0 }
+ | STACK INTLIT SEMICOLON { $2 }
+ | pos = position(error) { raise_error pos "Stack declaration syntax error" }
+;
+
+var_declarations:
+ /* empty */ { [] }
+ | var_declarations var_declaration { $2 @ $1 }
+ | pos = position(error) { raise_error pos
+ "Variable declaration syntax error" }
+;
+
+var_declaration:
+ VAR parameter_list SEMICOLON { $2 }
+;
+
+/* Statements */
+
+stmt:
+ expr SEMICOLON { mkeval $1 }
+ | IDENT EQUAL expr SEMICOLON { mkassign $1 $3 }
+ | quantity LBRACKET expr RBRACKET EQUAL expr SEMICOLON
+ { mkstore $1 $3 $6 }
+ | IF LPAREN expr RPAREN stmts ELSE stmts { mkifthenelse $3 $5 $7 }
+ | IF LPAREN expr RPAREN stmts { mkifthenelse $3 $5 St_skip }
+ | LOOP stmts { St_loop $2 }
+ | BLOCK LBRACE stmt_list RBRACE { St_block $3 }
+ | EXIT SEMICOLON { St_exit 0 }
+ | EXIT INTLIT SEMICOLON { St_exit $2 }
+ | RETURN SEMICOLON { St_return None }
+ | RETURN expr SEMICOLON { mkreturn_some $2 }
+ | GOTO IDENT SEMICOLON { St_goto $2 }
+ | IDENT COLON stmt { St_label ($1, $3) }
+ | SWITCH LPAREN expr RPAREN LBRACE switch_cases RBRACE
+ { mkswitch $3 $6 }
+ | MATCH LPAREN expr RPAREN LBRACE match_cases RBRACE
+ { mkmatch $3 $6 }
+ | TAILCALL expr LPAREN expr_list RPAREN COLON signature SEMICOLON
+ { mktailcall $2 $4 $7 }
+;
+
+stmt_list:
+ /* empty */ { St_skip }
+ | stmt stmt_list { St_seq ($1, $2) }
+ | pos = position(error) { raise_error pos "Statement syntax error" }
+;
+
+stmts:
+ LBRACE stmt_list RBRACE { $2 }
+ | stmt { $1 }
+;
+
+switch_cases:
+ DEFAULT COLON EXIT INTLIT SEMICOLON
+ { ([], $4) }
+ | CASE INTLIT COLON EXIT INTLIT SEMICOLON switch_cases
+ { let (cases, dfl) = $7 in (($2, $5) :: cases, dfl) }
+ | pos = position(error) { raise_error pos "Syntax error in switch construct" }
+;
+
+match_cases:
+ /* empty */ { [] }
+ | CASE INTLIT COLON stmt_list match_cases { ($2, $4) :: $5 }
+ | pos = position(error) { raise_error pos "Syntax error in match construct" }
+;
+
+/* Expressions */
+
+expr:
+ LPAREN expr RPAREN { $2 }
+ | IDENT { RId $1 }
+ | INTLIT { RCst (Cst_int $1) }
+ | FLOATLIT { RCst (Cst_float $1) }
+ | STRINGLIT { RCst (Cst_addrsymbol $1) }
+ | AMPERSAND INTLIT { RCst (Cst_stackoffset $2) }
+ | MINUS expr %prec p_uminus { ROp1 (Op_negint int32, $2) }
+ | MINUSF expr %prec p_uminus { error_float () }
+ | ABSF expr { error_float () }
+ | INTOFFLOAT expr { error_float () }
+ | INTUOFFLOAT expr { error_float () }
+ | FLOATOFINT expr { error_float () }
+ | FLOATOFINTU expr { error_float () }
+ | TILDE expr { ROp1 (Op_notint int32, $2) }
+ | BANG expr { ROp1 (Op_notbool, $2) }
+ | INT8STO8 expr { ROp1 (Op_cast ((8, Signed), 8), $2) }
+ | INT8STO16 expr { ROp1 (Op_cast ((8, Signed), 16), $2) }
+ | INT8STO32 expr { ROp1 (Op_cast ((8, Signed), 32), $2) }
+ | INT8UTO8 expr { ROp1 (Op_cast ((8, Unsigned), 8), $2) }
+ | INT8UTO16 expr { ROp1 (Op_cast ((8, Unsigned), 16), $2) }
+ | INT8UTO32 expr { ROp1 (Op_cast ((8, Unsigned), 32), $2) }
+ | INT16STO8 expr { ROp1 (Op_cast ((16, Signed), 16), $2) }
+ | INT16STO16 expr { ROp1 (Op_cast ((16, Signed), 16), $2) }
+ | INT16STO32 expr { ROp1 (Op_cast ((16, Signed), 32), $2) }
+ | INT16UTO8 expr { ROp1 (Op_cast ((16, Unsigned), 8), $2) }
+ | INT16UTO16 expr { ROp1 (Op_cast ((16, Unsigned), 16), $2) }
+ | INT16UTO32 expr { ROp1 (Op_cast ((16, Unsigned), 32), $2) }
+ | INT32STO8 expr { ROp1 (Op_cast ((32, Signed), 8), $2) }
+ | INT32STO16 expr { ROp1 (Op_cast ((32, Signed), 16), $2) }
+ | INT32STO32 expr { ROp1 (Op_cast ((32, Signed), 32), $2) }
+ | INT32UTO8 expr { ROp1 (Op_cast ((32, Unsigned), 8), $2) }
+ | INT32UTO16 expr { ROp1 (Op_cast ((32, Unsigned), 16), $2) }
+ | INT32UTO32 expr { ROp1 (Op_cast ((32, Unsigned), 32), $2) }
+ | FLOAT32 expr { error_float () }
+ | expr PLUS expr { ROp2 (Op_add int32, $1, $3) }
+ | expr MINUS expr { ROp2 (Op_sub int32, $1, $3) }
+ | expr STAR expr { ROp2 (Op_mul int32, $1, $3) }
+ | expr SLASH expr { ROp2 (Op_div int32, $1, $3) }
+ | expr PERCENT expr { ROp2 (Op_mod int32, $1, $3) }
+ | expr SLASHU expr { ROp2 (Op_div uint32, $1, $3) }
+ | expr PERCENTU expr { ROp2 (Op_mod uint32, $1, $3) }
+ | expr AMPERSAND expr { ROp2 (Op_and, $1, $3) }
+ | expr BAR expr { ROp2 (Op_or, $1, $3) }
+ | expr CARET expr { ROp2 (Op_xor, $1, $3) }
+ | expr LESSLESS expr { ROp2 (Op_shl int32, $1, $3) }
+ | expr GREATERGREATER expr { ROp2 (Op_shr int32, $1, $3) }
+ | expr GREATERGREATERU expr { ROp2 (Op_shr uint32, $1, $3) }
+ | expr PLUSF expr { error_float () }
+ | expr MINUSF expr { error_float () }
+ | expr STARF expr { error_float () }
+ | expr SLASHF expr { error_float () }
+ | expr EQUALEQUAL expr { ROp2 (Op_cmp (Cmp_eq, int32), $1, $3) }
+ | expr BANGEQUAL expr { ROp2 (Op_cmp (Cmp_ne, int32), $1, $3) }
+ | expr LESS expr { ROp2 (Op_cmp (Cmp_lt, int32), $1, $3) }
+ | expr LESSEQUAL expr { ROp2 (Op_cmp (Cmp_le, int32), $1, $3) }
+ | expr GREATER expr { ROp2 (Op_cmp (Cmp_gt, int32), $1, $3) }
+ | expr GREATEREQUAL expr { ROp2 (Op_cmp (Cmp_ge, int32), $1, $3) }
+ | expr EQUALEQUALU expr { ROp2 (Op_cmp (Cmp_eq, uint32), $1, $3) }
+ | expr BANGEQUALU expr { ROp2 (Op_cmp (Cmp_ne, uint32), $1, $3) }
+ | expr LESSU expr { ROp2 (Op_cmp (Cmp_lt, uint32), $1, $3) }
+ | expr LESSEQUALU expr { ROp2 (Op_cmp (Cmp_le, uint32), $1, $3) }
+ | expr GREATERU expr { ROp2 (Op_cmp (Cmp_gt, uint32), $1, $3) }
+ | expr GREATEREQUALU expr { ROp2 (Op_cmp (Cmp_ge, uint32), $1, $3) }
+ | expr EQUALEQUALF expr { error_float () }
+ | expr BANGEQUALF expr { error_float () }
+ | expr LESSF expr { error_float () }
+ | expr LESSEQUALF expr { error_float () }
+ | expr GREATERF expr { error_float () }
+ | expr GREATEREQUALF expr { error_float () }
+ | quantity LBRACKET expr RBRACKET { RMem ($1, $3) }
+ | expr AMPERSANDAMPERSAND expr { RCond ($1, $3, RCst (Cst_int 0)) }
+ | expr BARBAR expr { RCond ($1, RCst (Cst_int 1), $3) }
+ | expr QUESTION expr COLON expr { RCond ($1, $3, $5) }
+ | expr LPAREN expr_list RPAREN COLON signature
+ { RCall ($1, $3, $6) }
+ | pos = position(error) { raise_error pos "Expression syntax error" }
+;
+
+expr_list:
+ /* empty */ { [] }
+ | expr_list_1 { $1 }
+;
+
+expr_list_1:
+ expr /* %prec COMMA */ { $1 :: [] }
+ | expr COMMA expr_list_1 { $1 :: $3 }
+;
+
+type_:
+ INT { Sig_int }
+ | FLOAT { Sig_float }
+;
+
--- /dev/null
+open AST
+
+
+let rec print_size = function
+ | AST.SQ q -> Memory.string_of_quantity q
+ | AST.SProd l -> "struct {" ^ (print_size_list l) ^ "}"
+ | AST.SSum l -> "union {" ^ (print_size_list l) ^ "}"
+ | AST.SArray (i, se) ->
+ (print_size se) ^ "[" ^ (string_of_int i) ^ "]"
+and print_size_list l =
+ MiscPottier.string_of_list ", " print_size l
+
+let print_stacksize = print_size
+
+let print_offset (size, depth) =
+ "offset[" ^ (print_size size) ^ ", " ^ (string_of_int depth) ^ "]"
+
+let print_sizeof = print_size
+
+let print_global_size = print_size
+
+let print_data = function
+(*
+ | Data_reserve n -> Printf.sprintf "[%d]" n
+*)
+ | Data_int8 i -> Printf.sprintf "(int8) %d" i
+ | Data_int16 i -> Printf.sprintf "(int16) %d" i
+ | Data_int32 i -> Printf.sprintf "%d" i
+ | Data_float32 f -> Printf.sprintf "%f" f
+ | Data_float64 f -> Printf.sprintf "(float64) %f" f
+
+let print_datas init =
+ let rec aux = function
+ | [] -> ""
+ | [data] -> print_data data
+ | data :: datas -> Printf.sprintf "%s, %s" (print_data data) (aux datas)
+ in
+ Printf.sprintf "{%s}" (aux init)
+
+let print_datas_opt = function
+ | None -> ""
+ | Some init -> " = " ^ (print_datas init)
+
+let print_var (id, size, init_opt) =
+ Printf.sprintf "var \"%s\" : %s%s;\n"
+ id (print_global_size size) (print_datas_opt init_opt)
+
+let print_vars = List.fold_left (fun s v -> s ^ (print_var v)) ""
+
+let print_constant = function
+ | Cst_int i -> string_of_int i
+ | Cst_float f -> string_of_float f
+ | Cst_addrsymbol id -> "\"" ^ id ^ "\""
+ | Cst_stack -> "&0"
+ | Cst_offset off -> "{" ^ (print_offset off) ^ "}"
+ | Cst_sizeof t -> "sizeof (" ^ (print_sizeof t) ^ ")"
+
+let print_cmp = function
+ | Cmp_eq -> "=="
+ | Cmp_ne -> "!="
+ | Cmp_gt -> ">"
+ | Cmp_ge -> ">="
+ | Cmp_lt -> "<"
+ | Cmp_le -> "<="
+
+let print_op1 = function
+ | Op_cast ((src_size, sign), dest_size) ->
+ Printf.sprintf "int%s%sto%s"
+ (Primitive.print_size src_size)
+ (Primitive.print_signedness sign)
+ (Primitive.print_size dest_size)
+ | Op_negint -> "-"
+ | Op_notbool -> "!"
+ | Op_notint -> "~"
+ | Op_id -> ""
+ | Op_intofptr -> "intofptr"
+ | Op_ptrofint -> "ptrofint"
+
+let print_op2 = function
+ | Op_add -> "+"
+ | Op_sub -> "-"
+ | Op_mul -> "*"
+ | Op_div -> "/"
+ | Op_divu -> "/u"
+ | Op_mod -> "%"
+ | Op_modu -> "%u"
+ | Op_and -> "&&"
+ | Op_or -> "||"
+ | Op_xor -> "^"
+ | Op_shl -> "<<"
+ | Op_shr -> ">>"
+ | Op_shru -> ">>u"
+ | Op_cmp cmp -> print_cmp cmp
+ | Op_cmpu cmp -> (print_cmp cmp) ^ "u"
+ | Op_addp -> "+p"
+ | Op_subp -> "-p"
+ | Op_subpp -> "-pp"
+ | Op_cmpp cmp -> (print_cmp cmp) ^ "p"
+
+let rec print_expression (Cminor.Expr (ed, _)) = match ed with
+ | Cminor.Id id -> id
+ | Cminor.Cst cst -> print_constant cst
+ | Cminor.Op1 (op1, e) ->
+ Printf.sprintf "%s %s" (print_op1 op1) (add_parenthesis e)
+ | Cminor.Op2 (op2, e1, e2) ->
+ Printf.sprintf "%s %s %s"
+ (add_parenthesis e1)
+ (print_op2 op2)
+ (add_parenthesis e2)
+ | Cminor.Mem (q, e) ->
+ Printf.sprintf "%s[%s]" (Memory.string_of_quantity q) (print_expression e)
+ | Cminor.Cond (e1, e2, e3) ->
+ Printf.sprintf "%s ? %s : %s"
+ (add_parenthesis e1)
+ (add_parenthesis e2)
+ (add_parenthesis e3)
+ | Cminor.Exp_cost (lab, e) ->
+ Printf.sprintf "/* %s */ %s" lab (print_expression e)
+and add_parenthesis (Cminor.Expr (ed, _) as e) = match ed with
+ | Cminor.Id _ | Cminor.Cst _ | Cminor.Mem _ -> print_expression e
+ | _ -> Printf.sprintf "(%s)" (print_expression e)
+
+
+let print_args =
+ MiscPottier.string_of_list ", " print_expression
+
+let print_decl (x, t) = (Primitive.print_type t) ^ " " ^ x
+
+let print_decls vars =
+ MiscPottier.string_of_list ", " print_decl vars
+
+
+let n_spaces n = String.make n ' '
+
+
+let print_table n =
+ let f s (case, exit) =
+ Printf.sprintf "%s%scase %d: exit %d;\n" s (n_spaces n) case exit
+ in
+ List.fold_left f ""
+
+
+let rec print_body n = function
+ | Cminor.St_skip -> ""
+ | Cminor.St_assign (id, e) ->
+ Printf.sprintf "%s%s = %s;\n" (n_spaces n) id (print_expression e)
+ | Cminor.St_store (q, e1, e2) ->
+ Printf.sprintf "%s%s[%s] = %s;\n"
+ (n_spaces n)
+ (Memory.string_of_quantity q)
+ (print_expression e1)
+ (print_expression e2)
+ | Cminor.St_call (None, f, args, sg) ->
+ Printf.sprintf "%s%s(%s) : %s;\n"
+ (n_spaces n)
+ (print_expression f)
+ (print_args args)
+ (Primitive.print_sig sg)
+ | Cminor.St_call (Some id, f, args, sg) ->
+ Printf.sprintf "%s%s = %s(%s) : %s;\n"
+ (n_spaces n)
+ id
+ (print_expression f)
+ (print_args args)
+ (Primitive.print_sig sg)
+ | Cminor.St_tailcall (f, args, sg) ->
+ Printf.sprintf "%stailcall %s(%s) : %s;\n"
+ (n_spaces n)
+ (print_expression f)
+ (print_args args)
+ (Primitive.print_sig sg)
+ | Cminor.St_seq (s1, s2) -> (print_body n s1) ^ (print_body n s2)
+ | Cminor.St_ifthenelse (e, s1, s2) ->
+ Printf.sprintf "%sif (%s) {\n%s%s}\n%selse {\n%s%s}\n"
+ (n_spaces n)
+ (print_expression e)
+ (print_body (n+2) s1)
+ (n_spaces n)
+ (n_spaces n)
+ (print_body (n+2) s2)
+ (n_spaces n)
+ | Cminor.St_loop s ->
+ Printf.sprintf "%sloop {\n%s%s}\n"
+ (n_spaces n)
+ (print_body (n+2) s)
+ (n_spaces n)
+ | Cminor.St_block s ->
+ Printf.sprintf "%sblock {\n%s%s}\n"
+ (n_spaces n)
+ (print_body (n+2) s)
+ (n_spaces n)
+ | Cminor.St_exit i ->
+ Printf.sprintf "%sexit %d;\n" (n_spaces n) i
+ | Cminor.St_switch (e, tbl, dflt) ->
+ Printf.sprintf "%sswitch (%s) {\n%s%sdefault: exit %d;\n%s}\n"
+ (n_spaces n)
+ (print_expression e)
+ (print_table ( n+2) tbl)
+ (n_spaces (n+2))
+ dflt
+ (n_spaces n)
+ | Cminor.St_return None -> Printf.sprintf "%sreturn;\n" (n_spaces n)
+ | Cminor.St_return (Some e) ->
+ Printf.sprintf "%sreturn %s;\n" (n_spaces n) (print_expression e)
+ | Cminor.St_label (lbl, s) ->
+ Printf.sprintf "%s%s:\n%s" (n_spaces n) lbl (print_body n s)
+ | Cminor.St_goto lbl ->
+ Printf.sprintf "%sgoto %s;\n" (n_spaces n) lbl
+ | Cminor.St_cost (lbl, s) ->
+ Printf.sprintf "%s%s:\n%s"
+ (n_spaces n) lbl (print_body n s)
+
+let print_internal f_name f_def =
+ Printf.sprintf "\"%s\" (%s) : %s {\n\n stack: %s\n\n vars: %s;\n\n%s}\n\n\n"
+ f_name
+ (print_decls f_def.Cminor.f_params)
+ (Primitive.print_type_return f_def.Cminor.f_return)
+ (print_stacksize f_def.Cminor.f_stacksize)
+ (print_decls f_def.Cminor.f_vars)
+ (print_body 2 f_def.Cminor.f_body)
+
+
+let print_external f_name f_def =
+ Printf.sprintf "extern \"%s\" : %s\n\n\n"
+ f_name
+ (Primitive.print_sig f_def.ef_sig)
+
+
+let print_funct (f_name, f_def) = match f_def with
+ | Cminor.F_int f_def -> print_internal f_name f_def
+ | Cminor.F_ext f_def -> print_external f_name f_def
+
+let print_functs = List.fold_left (fun s f -> s ^ (print_funct f)) ""
+
+let print_program p =
+ Printf.sprintf "\n%s\n\n%s"
+ (print_vars p.Cminor.vars)
+ (print_functs p.Cminor.functs)
+
+let string_of_statement s = match s with
+ Cminor.St_skip -> "skip"
+ | Cminor.St_assign(_,_) -> "assign"
+ | Cminor.St_store(_,_,_) -> "store"
+ | Cminor.St_call(_,_,_,_) -> "call"
+ | Cminor.St_tailcall(_,_,_) -> "tailcall"
+ | Cminor.St_seq(_,_) -> "seq"
+ | Cminor.St_ifthenelse(_,_,_) -> "ifthenelse"
+ | Cminor.St_loop(_) -> "loop"
+ | Cminor.St_block(_) -> "block"
+ | Cminor.St_exit(_) -> "exit"
+ | Cminor.St_switch(_,_,_) -> "switch"
+ | Cminor.St_return(_) -> "return"
+ | Cminor.St_label(_,_) -> "label"
+ | Cminor.St_goto(_) -> "goto"
+ | Cminor.St_cost(_,_) -> "cost"
--- /dev/null
+
+(** This module provides functions to print elements of [Cminor]
+ programs. *)
+
+val print_expression : Cminor.expression -> string
+
+val print_body : int (* indentation *) -> Cminor.statement -> string
+
+val string_of_statement : Cminor.statement -> string
+
+val print_program : Cminor.program -> string
+
--- /dev/null
+
+(** This module translates a [Cminor] program into a [RTLabs] program. *)
+
+open Driver
+
+
+let error_prefix = "Cminor to RTLabs"
+let error = Error.global_error error_prefix
+let error_float () = error "float not supported."
+
+
+(* Helper functions *)
+
+let allocate (rtlabs_fun : RTLabs.internal_function) (sig_type : AST.sig_type)
+ : RTLabs.internal_function * Register.t =
+ let r = Register.fresh rtlabs_fun.RTLabs.f_runiverse in
+ let locals = rtlabs_fun.RTLabs.f_locals @ [(r, sig_type)] in
+ let rtlabs_fun =
+ { rtlabs_fun with RTLabs.f_locals = locals } in
+ (rtlabs_fun, r)
+
+let type_of (Cminor.Expr (_, t)) = t
+
+let allocate_expr
+ (rtlabs_fun : RTLabs.internal_function)
+ (e : Cminor.expression)
+ : (RTLabs.internal_function * Register.t) =
+ allocate rtlabs_fun (type_of e)
+
+type local_env = Register.t StringTools.Map.t
+
+let find_local (lenv : local_env) (x : AST.ident) : Register.t =
+ if StringTools.Map.mem x lenv then StringTools.Map.find x lenv
+ else error ("Unknown local \"" ^ x ^ "\".")
+
+let find_olocal (lenv : local_env) (ox : AST.ident option) : Register.t option =
+ match ox with
+ | None -> None
+ | Some x -> Some (find_local lenv x)
+
+let choose_destination
+ (rtlabs_fun : RTLabs.internal_function)
+ (lenv : local_env)
+ (e : Cminor.expression)
+ : RTLabs.internal_function * Register.t =
+ match e with
+ | Cminor.Expr (Cminor.Id x, _) -> (rtlabs_fun, find_local lenv x)
+ | _ -> allocate_expr rtlabs_fun e
+
+let choose_destinations
+ (rtlabs_fun : RTLabs.internal_function)
+ (lenv : local_env)
+ (args : Cminor.expression list)
+ : RTLabs.internal_function * Register.t list =
+ let f (rtlabs_fun, regs) e =
+ let (rtlabs_fun, r) = choose_destination rtlabs_fun lenv e in
+ (rtlabs_fun, regs @ [r]) in
+ List.fold_left f (rtlabs_fun, []) args
+
+let fresh_label (rtlabs_fun : RTLabs.internal_function) : Label.t =
+ Label.Gen.fresh rtlabs_fun.RTLabs.f_luniverse
+
+let change_entry
+ (rtlabs_fun : RTLabs.internal_function)
+ (new_entry : Label.t)
+ : RTLabs.internal_function =
+ { rtlabs_fun with RTLabs.f_entry = new_entry }
+
+
+(* Add a label and its associated instruction at the beginning of a function's
+ graph *)
+let add_graph
+ (rtlabs_fun : RTLabs.internal_function)
+ (lbl : Label.t)
+ (stmt : RTLabs.statement)
+ : RTLabs.internal_function =
+ let graph = Label.Map.add lbl stmt rtlabs_fun.RTLabs.f_graph in
+ let rtlabs_fun = { rtlabs_fun with RTLabs.f_graph = graph } in
+ change_entry rtlabs_fun lbl
+
+
+let generate
+ (rtlabs_fun : RTLabs.internal_function)
+ (stmt : RTLabs.statement)
+ : RTLabs.internal_function =
+ let lbl = fresh_label rtlabs_fun in
+ add_graph rtlabs_fun lbl stmt
+
+
+(*
+(* [addressing e] returns the type of address represented by [e],
+ along with its arguments *)
+
+let addressing (Cminor.Expr (ed, t) : Cminor.expression)
+ : (RTLabs.addressing * Cminor.expression list) =
+ match ed with
+ | Cminor.Cst (AST.Cst_addrsymbol id) -> (RTLabs.Aglobal (id, 0), [])
+ | Cminor.Cst (AST.Cst_stackoffset n) -> (RTLabs.Ainstack n, [])
+ | Cminor.Op2 (AST.Op_addp _,
+ Cminor.Cst (AST.Cst_addrsymbol id),
+ Cminor.Cst (AST.Cst_int n)) ->
+ (RTLabs.Aglobal (id, n), [])
+ | Cminor.Op2 (AST.Op_addp _, e1, Cminor.Cst (AST.Cst_int n)) ->
+ (RTLabs.Aindexed n, [e1])
+ | Cminor.Op2 (AST.Op_addp _,
+ Cminor.Cst (AST.Cst_addrsymbol id),
+ e2) ->
+ (RTLabs.Abased (id, 0), [e2])
+ | Cminor.Op2 (AST.Op_addp _, e1, e2) -> (RTLabs.Aindexed2, [e1 ; e2])
+ | _ -> (RTLabs.Aindexed 0, [e])
+*)
+
+
+(* Translating conditions *)
+
+let rec translate_branch
+ (rtlabs_fun : RTLabs.internal_function)
+ (lenv : local_env)
+ (e : Cminor.expression)
+ (lbl_true : Label.t)
+ (lbl_false : Label.t)
+ : RTLabs.internal_function =
+ let (rtlabs_fun, r) = choose_destination rtlabs_fun lenv e in
+ let stmt = RTLabs.St_cond (r, lbl_true, lbl_false) in
+ let rtlabs_fun = generate rtlabs_fun stmt in
+ translate_expr rtlabs_fun lenv r e
+
+(*
+ let Cminor.Expr (ed, t) = e in
+ match ed with
+
+ | Cminor.Id x ->
+ let stmt =
+ RTLabs.St_cond1 (AST.Op_id, find_local lenv x, lbl_true, lbl_false) in
+ generate rtlabs_fun stmt
+
+ | Cminor.Cst cst ->
+ generate rtlabs_fun (RTLabs.St_condcst (cst, t, lbl_true, lbl_false))
+
+ | Cminor.Op1 (op1, e) ->
+ let (rtlabs_fun, r) = choose_destination rtlabs_fun lenv e in
+ let stmt = RTLabs.St_cond1 (op1, r, lbl_true, lbl_false) in
+ let rtlabs_fun = generate rtlabs_fun stmt in
+ translate_expr rtlabs_fun lenv r e
+
+ | Cminor.Op2 (op2, e1, e2) ->
+ let (rtlabs_fun, r1) = choose_destination rtlabs_fun lenv e1 in
+ let (rtlabs_fun, r2) = choose_destination rtlabs_fun lenv e2 in
+ let stmt = RTLabs.St_cond2 (op2, r1, r2, lbl_true, lbl_false) in
+ let rtlabs_fun = generate rtlabs_fun stmt in
+ translate_exprs rtlabs_fun lenv [r1 ; r2] [e1 ; e2]
+
+ | _ ->
+ let (rtlabs_fun, r) = choose_destination rtlabs_fun lenv e in
+ let stmt = RTLabs.St_cond1 (AST.Op_id, r, lbl_true, lbl_false) in
+ let rtlabs_fun = generate rtlabs_fun stmt in
+ translate_expr rtlabs_fun lenv r e
+*)
+
+(* Translating expressions *)
+
+and translate_expr
+ (rtlabs_fun : RTLabs.internal_function)
+ (lenv : local_env)
+ (destr : Register.t)
+ (e : Cminor.expression)
+ : RTLabs.internal_function =
+ let Cminor.Expr (ed, t) = e in
+ match ed with
+
+ | Cminor.Id x ->
+ let xr = find_local lenv x in
+ (* If the destination and source are the same, just do nothing. *)
+ if Register.equal destr xr then rtlabs_fun
+ else
+ let old_entry = rtlabs_fun.RTLabs.f_entry in
+ let stmt = RTLabs.St_op1 (AST.Op_id, destr, xr, old_entry) in
+ generate rtlabs_fun stmt
+
+ | Cminor.Cst cst ->
+ let old_entry = rtlabs_fun.RTLabs.f_entry in
+ let stmt = RTLabs.St_cst (destr, cst, old_entry) in
+ generate rtlabs_fun stmt
+
+ | Cminor.Op1 (op1, e) ->
+ let (rtlabs_fun, r) = choose_destination rtlabs_fun lenv e in
+ let old_entry = rtlabs_fun.RTLabs.f_entry in
+ let stmt = RTLabs.St_op1 (op1, destr, r, old_entry) in
+ let rtlabs_fun = generate rtlabs_fun stmt in
+ translate_expr rtlabs_fun lenv r e
+
+ | Cminor.Op2 (op2, e1, e2) ->
+ let (rtlabs_fun, r1) = choose_destination rtlabs_fun lenv e1 in
+ let (rtlabs_fun, r2) = choose_destination rtlabs_fun lenv e2 in
+ let old_entry = rtlabs_fun.RTLabs.f_entry in
+ let stmt = RTLabs.St_op2 (op2, destr, r1, r2, old_entry) in
+ let rtlabs_fun = generate rtlabs_fun stmt in
+ translate_exprs rtlabs_fun lenv [r1 ; r2] [e1 ; e2]
+
+ | Cminor.Mem (chunk, e) ->
+ let (rtlabs_fun, r) = choose_destination rtlabs_fun lenv e in
+ let old_entry = rtlabs_fun.RTLabs.f_entry in
+ let stmt = RTLabs.St_load (chunk, r, destr, old_entry) in
+ let rtlabs_fun = generate rtlabs_fun stmt in
+ translate_expr rtlabs_fun lenv r e
+
+ | Cminor.Cond (e1, e2, e3) ->
+ let old_entry = rtlabs_fun.RTLabs.f_entry in
+ let rtlabs_fun = translate_expr rtlabs_fun lenv destr e3 in
+ let lbl_false = rtlabs_fun.RTLabs.f_entry in
+ let rtlabs_fun = change_entry rtlabs_fun old_entry in
+ let rtlabs_fun = translate_expr rtlabs_fun lenv destr e2 in
+ let lbl_true = rtlabs_fun.RTLabs.f_entry in
+ translate_branch rtlabs_fun lenv e1 lbl_true lbl_false
+
+ | Cminor.Exp_cost (lbl, e) ->
+ let rtlabs_fun = translate_expr rtlabs_fun lenv destr e in
+ let old_entry = rtlabs_fun.RTLabs.f_entry in
+ generate rtlabs_fun (RTLabs.St_cost (lbl, old_entry))
+
+and translate_exprs
+ (rtlabs_fun : RTLabs.internal_function)
+ (lenv : local_env)
+ (regs : Register.t list)
+ (args : Cminor.expression list)
+ : RTLabs.internal_function =
+ let f destr e rtlabs_fun = translate_expr rtlabs_fun lenv destr e in
+ List.fold_right2 f regs args rtlabs_fun
+
+
+(*
+(* Switch transformation
+
+ switch (e) {
+ case c0: exit i0;
+ case c1: exit i1;
+ ...
+ default: exit idfl; }
+
+ is translated to
+
+ if (e == c0) exit i0;
+ if (e == c1) exit i1;
+ ...
+ exit idfl; *)
+
+let transform_switch
+ (e : Cminor.expression)
+ (cases : (int * int) list)
+ (dfl : int)
+ : Cminor.statement =
+ let rec aux = function
+ | [] -> Cminor.St_skip
+ | (case, exit) :: cases ->
+ let c =
+ Cminor.Op2 (AST.Op_cmp (AST.Cmp_eq, uint),
+ e, Cminor.Cst (AST.Cst_int case)) in
+ let stmt =
+ Cminor.St_ifthenelse (c, Cminor.St_exit exit, Cminor.St_skip) in
+ Cminor.St_seq (stmt, aux cases)
+ in
+ Cminor.St_seq (aux cases, Cminor.St_exit dfl)
+*)
+
+
+(* Translating statements *)
+
+let rec translate_stmt
+ (rtlabs_fun : RTLabs.internal_function)
+ (lenv : local_env)
+ (exits : Label.t list)
+ (stmt : Cminor.statement)
+ : RTLabs.internal_function =
+ match stmt with
+
+ | Cminor.St_skip -> rtlabs_fun
+
+ | Cminor.St_assign (x, e) ->
+ translate_expr rtlabs_fun lenv (find_local lenv x) e
+
+ | Cminor.St_store (chunk, e1, e2) ->
+ let (rtlabs_fun, addr) = choose_destination rtlabs_fun lenv e1 in
+ let (rtlabs_fun, r) = choose_destination rtlabs_fun lenv e2 in
+ let old_entry = rtlabs_fun.RTLabs.f_entry in
+ let stmt = RTLabs.St_store (chunk, addr, r, old_entry) in
+ let rtlabs_fun = generate rtlabs_fun stmt in
+ translate_exprs rtlabs_fun lenv [addr ; r] [e1 ; e2]
+
+ | Cminor.St_call (oret,
+ Cminor.Expr (Cminor.Cst (AST.Cst_addrsymbol f), _),
+ args, sg) ->
+ let (rtlabs_fun, regs) = choose_destinations rtlabs_fun lenv args in
+ let oretr = find_olocal lenv oret in
+ let old_entry = rtlabs_fun.RTLabs.f_entry in
+ let stmt = RTLabs.St_call_id (f, regs, oretr, sg, old_entry) in
+ let rtlabs_fun = generate rtlabs_fun stmt in
+ translate_exprs rtlabs_fun lenv regs args
+
+ | Cminor.St_call (oret, f, args, sg) ->
+ let (rtlabs_fun, fr) = choose_destination rtlabs_fun lenv f in
+ let (rtlabs_fun, regs) = choose_destinations rtlabs_fun lenv args in
+ let oretr = find_olocal lenv oret in
+ let old_entry = rtlabs_fun.RTLabs.f_entry in
+ let stmt = RTLabs.St_call_ptr (fr, regs, oretr, sg, old_entry) in
+ let rtlabs_fun = generate rtlabs_fun stmt in
+ translate_exprs rtlabs_fun lenv (fr :: regs) (f :: args)
+
+ | Cminor.St_tailcall (Cminor.Expr (Cminor.Cst (AST.Cst_addrsymbol f), _),
+ args, sg) ->
+ let (rtlabs_fun, regs) = choose_destinations rtlabs_fun lenv args in
+ let stmt = RTLabs.St_tailcall_id (f, regs, sg) in
+ let rtlabs_fun = generate rtlabs_fun stmt in
+ translate_exprs rtlabs_fun lenv regs args
+
+ | Cminor.St_tailcall (f, args, sg) ->
+ let (rtlabs_fun, fr) = choose_destination rtlabs_fun lenv f in
+ let (rtlabs_fun, regs) = choose_destinations rtlabs_fun lenv args in
+ let stmt = RTLabs.St_tailcall_ptr (fr, regs, sg) in
+ let rtlabs_fun = generate rtlabs_fun stmt in
+ translate_exprs rtlabs_fun lenv (fr :: regs) (f :: args)
+
+ | Cminor.St_seq (s1, s2) ->
+ let rtlabs_fun = translate_stmt rtlabs_fun lenv exits s2 in
+ translate_stmt rtlabs_fun lenv exits s1
+
+ | Cminor.St_ifthenelse (e, s1, s2) ->
+ let old_entry = rtlabs_fun.RTLabs.f_entry in
+ let rtlabs_fun = translate_stmt rtlabs_fun lenv exits s2 in
+ let lbl_false = rtlabs_fun.RTLabs.f_entry in
+ let rtlabs_fun = change_entry rtlabs_fun old_entry in
+ let rtlabs_fun = translate_stmt rtlabs_fun lenv exits s1 in
+ let lbl_true = rtlabs_fun.RTLabs.f_entry in
+ translate_branch rtlabs_fun lenv e lbl_true lbl_false
+
+ | Cminor.St_loop s ->
+ let loop_start = fresh_label rtlabs_fun in
+ let rtlabs_fun = change_entry rtlabs_fun loop_start in
+ let rtlabs_fun = translate_stmt rtlabs_fun lenv exits s in
+ let old_entry = rtlabs_fun.RTLabs.f_entry in
+ add_graph rtlabs_fun loop_start (RTLabs.St_skip old_entry)
+
+ | Cminor.St_block s ->
+ let old_entry = rtlabs_fun.RTLabs.f_entry in
+ translate_stmt rtlabs_fun lenv (old_entry :: exits) s
+
+ | Cminor.St_exit n ->
+ change_entry rtlabs_fun (List.nth exits n)
+
+ | Cminor.St_return eopt ->
+ let rtlabs_fun = change_entry rtlabs_fun rtlabs_fun.RTLabs.f_exit in
+ (match eopt, rtlabs_fun.RTLabs.f_result with
+ | None, None -> rtlabs_fun
+ | Some e, Some (retr, _) -> translate_expr rtlabs_fun lenv retr e
+ | _ -> assert false (* should be impossible *))
+
+ | Cminor.St_switch (e, cases, dfl) ->
+ assert false (* should have been simplified before *)
+(*
+ let stmt = transform_switch e cases dfl in
+ translate_stmt rtlabs_fun lenv exits stmt
+*)
+
+ | Cminor.St_label (lbl, s) ->
+ let rtlabs_fun = translate_stmt rtlabs_fun lenv exits s in
+ let old_entry = rtlabs_fun.RTLabs.f_entry in
+ add_graph rtlabs_fun lbl (RTLabs.St_skip old_entry)
+
+ | Cminor.St_cost (lbl, s) ->
+ let rtlabs_fun = translate_stmt rtlabs_fun lenv exits s in
+ let old_entry = rtlabs_fun.RTLabs.f_entry in
+ generate rtlabs_fun (RTLabs.St_cost (lbl, old_entry))
+
+ | Cminor.St_goto lbl ->
+ change_entry rtlabs_fun lbl
+
+
+(* Translating function definitions *)
+
+(* The translation consists in the following:
+ - Create a universe of pseudo-register names
+ - Create a universe of label names
+ - Create a local environment; that is, a mapping from local
+ variables to pseudo-registers
+ - Extract the registers representing the formal variables
+ - Extract the registers representing the local variables
+ - Allocate a fresh register to hold the result of the function
+ - Allocate a fresh label representing the exit point
+ - Initialize the graph with a return instruction at the end
+ - Complete the graph according to the function's body.
+ Instructions will be added from end to start following the flow of the
+ function. *)
+
+let translate_internal lbl_prefix f_def =
+
+ (* Register names *)
+ let runiverse = Register.new_universe "%" in
+
+ (* Labels of statements *)
+ let luniverse = Label.Gen.new_universe lbl_prefix in
+
+ (* Local environment *)
+ let add_local lenv (x, _) =
+ StringTools.Map.add x (Register.fresh runiverse) lenv in
+ let lenv = StringTools.Map.empty in
+ let lenv = List.fold_left add_local lenv f_def.Cminor.f_params in
+ let lenv = List.fold_left add_local lenv f_def.Cminor.f_vars in
+
+ let extract vars =
+ let f l (x, t) = l @ [(find_local lenv x, t)] in
+ List.fold_left f [] vars in
+
+ (* Parameter registers *)
+ let params = extract f_def.Cminor.f_params in
+
+ (* Local registers *)
+ let locals = extract f_def.Cminor.f_vars in
+
+ (* [result] is the result of the body, if any. *)
+ let result = match f_def.Cminor.f_return with
+ | AST.Type_void -> None
+ | AST.Type_ret t -> Some (Register.fresh runiverse, t) in
+
+ let locals =
+ locals @ (match result with None -> [] | Some (r, t) -> [(r, t)]) in
+
+ (* Exit label of the graph *)
+ let exit = Label.Gen.fresh luniverse in
+
+ (* The control flow graph: for now, it is only a return instruction at the
+ end. *)
+ let return = match result with
+ | None -> None
+ | Some (retr, _) -> Some retr in
+ let graph = Label.Map.add exit (RTLabs.St_return return) Label.Map.empty in
+
+ let rtlabs_fun =
+ { RTLabs.f_luniverse = luniverse ;
+ RTLabs.f_runiverse = runiverse ;
+ RTLabs.f_result = result ;
+ RTLabs.f_params = params ;
+ RTLabs.f_locals = locals ;
+ RTLabs.f_stacksize = f_def.Cminor.f_stacksize ;
+ RTLabs.f_graph = graph ;
+ RTLabs.f_entry = exit ;
+ RTLabs.f_exit = exit } in
+
+ (* Complete the graph *)
+ translate_stmt rtlabs_fun lenv [] f_def.Cminor.f_body
+
+
+let translate_functions lbls (f_id, f_def) = match f_def with
+ | Cminor.F_int int_def ->
+ let lbl_prefix = StringTools.Gen.fresh_prefix lbls f_id in
+ let def = translate_internal lbl_prefix int_def in
+ (f_id, RTLabs.F_int def)
+ | Cminor.F_ext def -> (f_id, RTLabs.F_ext def)
+
+
+(* Initialization of globals *)
+
+let sum_offsets =
+ let f res off =
+ let cst_off =
+ Cminor.Expr (Cminor.Cst (AST.Cst_offset off), AST.Sig_offset) in
+ Cminor.Expr (Cminor.Op2 (AST.Op_add, res, cst_off), AST.Sig_offset) in
+ List.fold_left f (Cminor.Expr (Cminor.Cst (AST.Cst_int 0), AST.Sig_offset))
+
+let quantity_sig_of_data data =
+ let i = match data with
+ | AST.Data_int8 _ -> 1
+ | AST.Data_int16 _ -> 2
+ | AST.Data_int32 _ -> 4
+ | _ -> assert false (* do not use on these arguments *) in
+ (AST.QInt i, AST.Sig_int (i, AST.Unsigned))
+
+let assign_data x stmt (offsets, data) =
+ let off = sum_offsets offsets in
+ let addr = Cminor.Expr (Cminor.Cst (AST.Cst_addrsymbol x), AST.Sig_ptr) in
+ let e = Cminor.Expr (Cminor.Op2 (AST.Op_addp, addr, off), AST.Sig_ptr) in
+ let stmt' = match data with
+(*
+ | AST.Data_reserve _ -> Cminor.St_skip
+*)
+ | AST.Data_int8 i | AST.Data_int16 i | AST.Data_int32 i ->
+ let (quantity, etype) = quantity_sig_of_data data in
+ let cst = Cminor.Expr (Cminor.Cst (AST.Cst_int i), etype) in
+ Cminor.St_store (quantity, e, cst)
+ | AST.Data_float32 f | AST.Data_float64 f -> error_float () in
+ Cminor.St_seq (stmt, stmt')
+
+let add_global_initializations_body vars body =
+ let f stmt (x, size, datas_opt) = match datas_opt with
+ | None -> Cminor.St_skip
+ | Some datas ->
+ let offsets = Memory.all_offsets size in
+ if List.length offsets <> List.length datas then
+ error "bad global initialization style."
+ else
+ let offs_datas = List.combine offsets datas in
+ List.fold_left (assign_data x) stmt offs_datas in
+ Cminor.St_seq (List.fold_left f Cminor.St_skip vars, body)
+
+let add_global_initializations_funct vars = function
+ | Cminor.F_int def ->
+ let f_body = add_global_initializations_body vars def.Cminor.f_body in
+ Cminor.F_int { def with Cminor.f_body = f_body }
+ | def -> def
+
+(* [add_global_initializations p] moves the initializations of the globals of
+ [p] to the beginning of the main function, if any. *)
+
+let add_global_initializations p = match p.Cminor.main with
+ | None -> p.Cminor.functs
+ | Some main ->
+ let main_def = List.assoc main p.Cminor.functs in
+ let main_def = add_global_initializations_funct p.Cminor.vars main_def in
+ MiscPottier.update_list_assoc main main_def p.Cminor.functs
+
+
+(* Translation of a Cminor program to a RTLabs program. *)
+
+let translate p =
+
+ (* Fetch the labels already used in the program to create new ones. *)
+ let lbls = CminorAnnotator.all_labels p in
+
+ (* The initialization of globals are moved at the beginning of the main. *)
+ let functs = p.Cminor.functs (* add_global_initializations p *) in
+
+(*
+ (* The globals are associated their size. *)
+ let f (id, size, _) = (id, size) in
+*)
+
+ (* Put all this together and translate each function. *)
+ { RTLabs.vars = p.Cminor.vars ;
+ RTLabs.functs = List.map (translate_functions lbls) functs ;
+ RTLabs.main = p.Cminor.main }
--- /dev/null
+
+(** This module translates a [Cminor] program into a [RTLabs] program. *)
+
+(** The main part of the translation is transforming a Cminor program into a
+ control flow graph. This is done from the end of the program and up to the
+ beginning. *)
+
+val translate : Cminor.program -> RTLabs.program
--- /dev/null
+
+(** This file defines some common structures of several languages. *)
+
+(** Types and Signatures *)
+
+type signedness = Signed | Unsigned
+
+type size = int (* in bytes *)
+
+type sig_type =
+ | Sig_int of size * signedness
+ | Sig_float of size * signedness
+ | Sig_offset
+ | Sig_ptr
+
+type type_return = Type_ret of sig_type | Type_void
+
+type signature = { args: sig_type list ; res: type_return }
+
+
+type ident = string (* identifiers for variable and function names *)
+
+type immediate = int (* immediate values for assembler constants and offsets *)
+
+
+(** Memory quantities is the size of what can fit in memory. *)
+
+type quantity =
+ | QInt of size (* concrete size in bytes *)
+ | QOffset (* size of an offset *)
+ | QPtr (* size of a pointer *)
+
+type abstract_size =
+ | SQ of quantity
+ | SProd of abstract_size list
+ | SSum of abstract_size list
+ | SArray of int * abstract_size
+
+type abstract_offset = abstract_size * int (* nth in size *)
+
+
+(** Comparison between integers or floats *)
+
+type cmp = Cmp_eq | Cmp_ne | Cmp_gt | Cmp_ge | Cmp_lt | Cmp_le
+
+(** Constants in high level languages *)
+
+type cst =
+ | Cst_int of int (* integer constant *)
+ | Cst_float of float (* float constant *)
+ | Cst_addrsymbol of ident (* address of a global symbol *)
+ | Cst_stack (* address of the stack *)
+ | Cst_offset of abstract_offset (* offset *)
+ | Cst_sizeof of abstract_size (* size of a type *)
+
+(** Unary operations *)
+
+type op1 =
+ | Op_cast of (size * signedness) * size
+ | Op_negint (**r integer opposite *)
+ | Op_notbool (**r boolean negation *)
+ | Op_notint (**r bitwise complement *)
+ | Op_id (**r identity *)
+ | Op_ptrofint (**r int to pointer *)
+ | Op_intofptr (**r pointer to int *)
+
+(** Binary operations *)
+
+type op2 =
+ | Op_add (**r integer addition *)
+ | Op_sub (**r integer subtraction *)
+ | Op_mul (**r integer multiplication *)
+ | Op_div (**r integer division *)
+ | Op_divu (**r integer unsigned division *)
+ | Op_mod (**r integer modulus *)
+ | Op_modu (**r integer unsigned modulus *)
+ | Op_and (**r bitwise ``and'' *)
+ | Op_or (**r bitwise ``or'' *)
+ | Op_xor (**r bitwise ``xor'' *)
+ | Op_shl (**r left shift *)
+ | Op_shr (**r right shift *)
+ | Op_shru (**r unsigned right shift *)
+ | Op_cmp of cmp (**r integer comparison *)
+ | Op_cmpu of cmp (**r unsigned integer comparison *)
+ | Op_addp (**r addition for a pointer and an integer *)
+ | Op_subp (**r substraction for a pointer and a integer *)
+ | Op_subpp (**r substraction for two pointers *)
+ | Op_cmpp of cmp (**r pointer comparaison *)
+
+(* Datas are used to initialize the value of variables *)
+
+type data =
+(* (* Disabled: needed abstraction. *)
+ | Data_reserve of int (* only reserve some space *)
+*)
+ | Data_int8 of int
+ | Data_int16 of int
+ | Data_int32 of int
+ | Data_float32 of float
+ | Data_float64 of float
+
+type data_size = Byte | HalfWord | Word
+
+(* External functions. *)
+
+type external_function = { ef_tag: ident ; ef_sig: signature }
+
+(* Traces returned by interpreters: result and cost labels are observed. The
+ result is interpreted as an 8 bits integer for coherence between
+ languages. *)
+
+type trace = IntValue.int32 * CostLabel.t list
--- /dev/null
+(* Adapted from Pottier's PP compiler *)
+
+(* A universe is a record, whose address defines the identity of the
+ universe. The integer counter [next] holds the number of the next
+ fresh atom. The [name] field holds the name of the universe. *)
+
+type universe = {
+ mutable next: int;
+ name: string
+ }
+
+let new_universe name = {
+ next = 0;
+ name = name
+}
+
+(* An atom is a pair of a universe and an integer. The latter defines
+ the atom's identity within its universe. *)
+
+type t =
+ universe * int
+
+let fresh u =
+ let id = u.next in
+ u.next <- id + 1;
+ u, id
+
+let equal (u1, id1) (u2, id2) =
+ assert (u1 == u2);
+ ((id1 : int) = (id2 : int))
+
+let compare (u1, id1) (u2, id2) =
+ assert (u1 == u2);
+ compare (id1 : int) (id2 : int)
+
+let flex_compare (u1, id1) (u2, id2) =
+ if String.compare u1.name u2.name = 0 then Pervasives.compare id1 id2
+ else String.compare u1.name u2.name
+
+let flex_equal l1 l2 = flex_compare l1 l2 = 0
+
+let universe_of (u, _) = u
+
+let same_universe (u1, _) (u2, _) = u1 = u2
+
+let ends_with_a_digit s =
+ let n = String.length s in
+ n > 0 && s.[n-1] >= '0' && s.[n-1] <= '9'
+
+(* This function is injective, that is, [u] and [id] can be recovered
+ out of [print (u, id)]. *)
+
+let print (u, id) =
+ Printf.sprintf "%s%s%d" u.name (if ends_with_a_digit u.name then "_" else "") id
+
+(* Added by Nicolas Ayache: more flexible maps and sets where atoms
+ from different universes can coexist. *)
+
+type label_t = t
+
+module OrderedLabel = struct
+ type t = label_t
+ let compare = flex_compare
+end
+
+module FlexSet = Set.Make (OrderedLabel)
+
+module FlexMap = Map.Make (OrderedLabel)
+
+
+module OrderedInt = struct
+ type t = int
+ let compare x1 x2 = x1 - x2
+end
+
+(* We internally rely upon Objective Caml's integer sets and maps. *)
+
+module ISet = Set.Make (OrderedInt)
+module IMap = Map.Make (OrderedInt)
+
+(* Sets. *)
+
+module Set = struct
+
+ (* A set is either empty or a pair of a universe and a (possibly
+ empty) internal set. The fact that we do not require the empty
+ set to be explicitly associated with a universe means that
+ [empty] can be a constant, as opposed to an operation that
+ expects a universe as a parameter. *)
+
+ type elt =
+ t
+
+ type t =
+ | E
+ | U of universe * ISet.t
+
+ let empty =
+ E
+
+ let is_empty = function
+ | E ->
+ true
+ | U (_, s) ->
+ ISet.is_empty s
+
+ let mem (u1, x) = function
+ | E ->
+ false
+ | U (u2, s) ->
+ assert (u1 == u2);
+ (u1 = u2) && (ISet.mem x s)
+
+ let add (u1, x) = function
+ | E ->
+ U (u1, ISet.singleton x)
+ | U (u2, s) ->
+ assert (u1 == u2);
+ U (u1, ISet.add x s)
+
+ let remove (u1, x) = function
+ | E ->
+ E
+ | U (u2, s) ->
+ assert (u1 == u2);
+ (* set can become empty but retains its universe *)
+ U (u1, ISet.remove x s)
+
+ let singleton x =
+ add x empty
+
+ let couple x1 x2 =
+ add x1 (singleton x2)
+
+ let of_list xs =
+ List.fold_right add xs empty
+
+ let union s1 s2 =
+ match s1, s2 with
+ | E, s
+ | s, E ->
+ s
+ | U (u1, s1), U (u2, s2) ->
+ assert (u1 == u2);
+ U (u1, ISet.union s1 s2)
+
+ let inter s1 s2 =
+ match s1, s2 with
+ | E, s
+ | s, E ->
+ E
+ | U (u1, s1), U (u2, s2) ->
+ assert (u1 == u2);
+ U (u1, ISet.inter s1 s2)
+
+ let disjoint s1 s2 =
+ is_empty (inter s1 s2)
+
+ let diff s1 s2 =
+ match s1, s2 with
+ | E, _ ->
+ E
+ | s, E ->
+ s
+ | U (u1, s1), U (u2, s2) ->
+ assert (u1 == u2);
+ U (u1, ISet.diff s1 s2)
+
+ let iter f = function
+ | E ->
+ ()
+ | U (u, s) ->
+ ISet.iter (fun x -> f (u, x)) s
+
+ let fold f s accu =
+ match s with
+ | E ->
+ accu
+ | U (u, s) ->
+ ISet.fold (fun x accu -> f (u, x) accu) s accu
+
+ let choose = function
+ | E ->
+ raise Not_found
+ | U (u, s) ->
+ u, ISet.choose s
+
+ let equal s1 s2 =
+ match s1, s2 with
+ | E, s
+ | s, E ->
+ is_empty s
+ | U (u1, s1), U (u2, s2) ->
+ assert (u1 == u2);
+ ISet.equal s1 s2
+
+ let cardinal = function
+ | E ->
+ 0
+ | U (_, s) ->
+ ISet.cardinal s
+
+ let elements = function
+ | E ->
+ []
+ | U (u, s) ->
+ List.map (fun x -> (u, x)) (ISet.elements s)
+
+ let filter p = function
+ | E ->
+ E
+ | U (u, s) ->
+ U (u, ISet.filter (fun x -> p (u, x)) s)
+
+ let pick s =
+ let x = choose s in
+ let s = remove x s in
+ x, s
+
+ let rec exhaust s accu f =
+ if is_empty s then
+ accu
+ else
+ let x, s = pick s in
+ let s', accu = f x accu in
+ exhaust (union s s') accu f
+
+ open Print
+
+ let print s =
+ seplist comma (fun () x -> print x) () (elements s)
+
+end
+
+(* Maps. *)
+
+module Map = struct
+
+ (* A map is either empty or a pair of a universe and a (possibly
+ empty) internal map. The fact that we do not require the empty
+ map to be explicitly associated with a universe means that
+ [empty] can be a constant, as opposed to an operation that
+ expects a universe as a parameter. *)
+
+ type key =
+ t
+
+ type 'a t =
+ | E
+ | U of universe * 'a IMap.t
+
+ let empty =
+ E
+
+ let is_empty = function
+ | E ->
+ true
+ | U (_, m) ->
+ IMap.is_empty m
+
+ let mem (u1, x) = function
+ | E ->
+ false
+ | U (u2, m) ->
+ assert (u1 == u2);
+ IMap.mem x m
+
+ let add (u1, x) d = function
+ | E ->
+ U (u1, IMap.add x d IMap.empty)
+ | U (u2, m) ->
+ assert (u1 == u2);
+ U (u1, IMap.add x d m)
+
+ let remove (u1, x) = function
+ | E ->
+ E
+ | U (u2, m) ->
+ assert (u1 == u2);
+ U (u1, IMap.remove x m)
+
+ let singleton x d =
+ add x d empty
+
+ let find (u1, x) = function
+ | E ->
+ raise Not_found
+ | U (u2, m) ->
+ assert (u1 == u2);
+ IMap.find x m
+
+ let iter f = function
+ | E ->
+ ()
+ | U (u, m) ->
+ IMap.iter (fun x d -> f (u, x) d) m
+
+ let fold f m accu =
+ match m with
+ | E ->
+ accu
+ | U (u, m) ->
+ IMap.fold (fun x d accu -> f (u, x) d accu) m accu
+
+ let map f = function
+ | E ->
+ E
+ | U (u, m) ->
+ U (u, IMap.map f m)
+
+ let mapi f = function
+ | E ->
+ E
+ | U (u, m) ->
+ U (u, IMap.mapi (fun x d -> f (u, x) d) m)
+
+ let domain = function
+ | E ->
+ Set.E
+ | U (u, m) ->
+ Set.U (u, IMap.fold (fun x _ s ->
+ ISet.add x s
+ ) m ISet.empty
+ )
+
+ let lift f = function
+ | Set.E ->
+ E
+ | Set.U (u, s) ->
+ U (u, ISet.fold (fun x m ->
+ IMap.add x (f (u, x)) m
+ ) s IMap.empty
+ )
+
+
+ let generator u =
+ let m = ref empty in
+ let generate d =
+ let label = fresh u in
+ m := add label d !m;
+ label
+ in
+ m, generate
+
+ let addm m1 m2 =
+ fold add m1 m2
+
+ let restrict p m =
+ fold (fun x d m ->
+ if p x then
+ add x d m
+ else
+ m
+ ) m empty
+
+end
+
+(* An imperative interface to maps. *)
+
+module ImperativeMap = struct
+
+ type key =
+ Map.key
+
+ type 'data t =
+ 'data Map.t ref
+
+ let create () =
+ ref Map.empty
+
+ let clear t =
+ t := Map.empty
+
+ let add k d t =
+ t := Map.add k d !t
+
+ let find k t =
+ Map.find k !t
+
+ let iter f t =
+ Map.iter f !t
+
+end
+
+(* Maps of atoms to sets of atoms. *)
+
+module SetMap = SetMap.MakeHomo(Set)(Map)
--- /dev/null
+
+(* Pasted from Pottier's PP compiler *)
+
+(** This module implements the signature [AtomSig.S]. *)
+
+include AtomSig.S
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(** This signature describes atoms, that is, abstract entities
+ equipped with a fresh element generation operation. *)
+
+module type S = sig
+
+ (* ------------------------------------------------------------------------- *)
+ (* This is the type of atoms. *)
+
+ type t
+
+ (* Atoms do not exist in the ether -- they are taken from universes.
+ Creating a fresh atom requires specifying which universe it
+ should be taken from. Atoms that belong to distinct universes
+ cannot be mixed. *)
+
+ type universe
+
+ (* One can create as many universes as desired. A universe initially
+ contains no atoms. A universe carries a name (a string) that is
+ used when converting atoms to strings. *)
+
+ val new_universe: string -> universe
+
+ (* A universe is populated by creating fresh atoms. The atom produced
+ by [fresh u] is guaranteed to be distinct from all existing atoms
+ in the universe [u]. *)
+
+ val fresh: universe -> t
+
+ (* Comparison of atoms. Only atoms that belong to a common universe
+ can be compared. *)
+
+ val equal: t -> t -> bool
+ val compare: t -> t -> int
+
+ (* Added by Nicolas Ayache: flexible comparison. Atoms from
+ different universes can be compared. *)
+ val flex_compare: t -> t -> int
+ val flex_equal: t -> t -> bool
+
+ (* Added by Nicolas Ayache. *)
+ val universe_of: t -> universe
+ val same_universe: t -> t -> bool
+
+ (* [print a] converts the atom [a] to a string. The string
+ representation is unique within the universe that [a] belongs
+ to. It is globally unique if universe names are unique. *)
+
+ val print: t -> string
+
+ (* ------------------------------------------------------------------------- *)
+
+
+ (* Added by Nicolas Ayache: more flexible maps and sets where atoms
+ from different universes can coexist. *)
+
+ module FlexSet : Set.S with type elt = t
+
+ module FlexMap : Map.S with type key = t
+
+
+ (* Sets of atoms. *)
+
+ module Set : sig
+
+ type elt = t
+
+ (* This is the type of sets of atoms. Every set of atoms is
+ implicitly and permanently associated with a universe, which
+ all members of the set inhabit. *)
+
+ type t
+
+ (* Operations over sets include those defined in Objective Caml's
+ standard [Set] module, with the restriction that operations
+ should never mix atoms, or sets of atoms, that inhabit distinct
+ universes. Consult [Set.S] in Objective Caml's
+ documentation. *)
+
+ val empty: t
+ val is_empty: t -> bool
+ val mem: elt -> t -> bool
+ val add: elt -> t -> t
+ val remove: elt -> t -> t
+ val singleton: elt -> t
+ val union: t -> t -> t
+ val inter: t -> t -> t
+ val diff: t -> t -> t
+ val iter: (elt -> unit) -> t -> unit
+ val fold: (elt -> 'a -> 'a) -> t -> 'a -> 'a
+ val choose: t -> elt
+ val equal: t -> t -> bool
+ val cardinal: t -> int
+ val elements: t -> elt list
+ val filter: (elt -> bool) -> t -> t
+
+ (* [disjoint s1 s2] tells whether the intersection of [s1]
+ and [s2] is empty. *)
+
+ val disjoint: t -> t -> bool
+
+ (* [couple x1 x2] is the set that contains [x1] and [x2]. It
+ can be a singleton set if [x1] and [x2] are equal. *)
+
+ val couple: elt -> elt -> t
+
+ (* [of_list xs] is the set whose members are the elements
+ of the list [xs]. *)
+
+ val of_list: elt list -> t
+
+ (* [pick s] returns a pair of an element [x] of [s] and of the
+ set [remove x s]. It raises [Not_found] if [s] is empty. *)
+
+ val pick: t -> elt * t
+
+ (* [exhaust s accu f] takes an element [x] off the set [s], and
+ applies [f] to [x] and [accu]. This yields a number of new
+ elements, which are added to [s], and a new accumulator [accu].
+ This is repeated until [s] becomes empty, at which point the
+ final value of the accumulator is returned. In short, this is a
+ version of [fold] where the function [f] is allowed to produce
+ new set elements. *)
+
+ val exhaust: t -> 'a -> (elt -> 'a -> t * 'a) -> 'a
+
+ (* [print s] converts the set [s] to a string. *)
+
+ val print: t -> string
+
+ end
+
+ (* ------------------------------------------------------------------------- *)
+ (* Maps over atoms. *)
+
+ module Map : sig
+
+ type key = t
+
+ (* This is the type of maps over atoms. Every map over atoms is
+ implicitly and permanently associated with a universe, which
+ all keys inhabit. *)
+
+ type +'a t
+
+ (* Operations over maps include those defined in Objective Caml's
+ standard [Map] module, with the restriction that operations
+ should never mix atoms, or maps over atoms, that inhabit
+ distinct universes. Consult [Map.S] in Objective Caml's
+ documentation.*)
+
+ val empty: 'a t
+ val is_empty: 'a t -> bool
+ val mem: key -> 'a t -> bool
+ val add: key -> 'a -> 'a t -> 'a t
+ val remove: key -> 'a t -> 'a t
+ val find: key -> 'a t -> 'a
+ val iter: (key -> 'a -> unit) -> 'a t -> unit
+ val fold: (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b
+ val map: ('a -> 'b) -> 'a t -> 'b t
+ val mapi: (key -> 'a -> 'b) -> 'a t -> 'b t
+
+ (* [singleton x d] is the map that maps [x] to [d]. *)
+
+ val singleton: key -> 'a -> 'a t
+
+ (* [addm m1 m2] adds the bindings in the map [m1] to the map [m2],
+ overriding any previous binding if [m1] and [m2] have common
+ keys. *)
+
+ val addm: 'a t -> 'a t -> 'a t
+
+ (* [domain m] is the domain of the map [m]. *)
+
+ val domain: 'a t -> Set.t
+
+ (* [lift f s] lifts the set [s] into a map that maps every
+ member [x] of [s] to [f x]. *)
+
+ val lift: (key -> 'a) -> Set.t -> 'a t
+
+ (* [restrict p m] restricts the domain of the map [m] to those
+ keys that satisfy the predicate [p]. *)
+
+ val restrict: (key -> bool) -> 'a t -> 'a t
+
+ (* [generator u] creates a fresh reference [m] that holds an
+ initially empty map; defines a function [generate] such that
+ [generate d] generates a fresh atom [a], adds a mapping of [m]
+ to [d] to [m], and returns [a]; and returns a pair of [m] and
+ [generate]. *)
+
+ val generator: universe -> 'a t ref * ('a -> key)
+
+ end
+
+ (* ------------------------------------------------------------------------- *)
+ (* An imperative interface to maps. *)
+
+ module ImperativeMap : sig
+ type key = Map.key
+ type 'data t
+ val create: unit -> 'data t
+ val clear: 'data t -> unit
+ val add: key -> 'data -> 'data t -> unit
+ val find: key -> 'data t -> 'data
+ val iter: (key -> 'data -> unit) -> 'data t -> unit
+ end
+
+ (* ------------------------------------------------------------------------- *)
+ (* Maps of atoms to sets of atoms. Consult the definition of
+ [SetMap.Homogeneous] for a list of operations. *)
+
+ module SetMap : SetMap.Homogeneous with type key = t
+ and type item = t
+ and type itemset = Set.t
+ and type t = Set.t Map.t
+
+end
--- /dev/null
+
+include StringTools
+
+let constant_map d x =
+ Set.fold (fun k accu -> Map.add k x accu) d Map.empty
--- /dev/null
+
+(** This module provides functions to manipulate and create fresh cost
+ labels. *)
+
+include StringSig.S
+
+(** [constant_map d x] produces a finite map which associates
+ [x] to every element of the set [d]. *)
+val constant_map : Set.t -> 'a -> 'a Map.t
--- /dev/null
+
+(** Hardware registers. *)
+
+module OrdInt =
+struct
+ type t = int
+ let compare = Pervasives.compare
+end
+
+type t = OrdInt.t
+let eq r1 r2 = OrdInt.compare r1 r2 = 0
+
+module Set = Set.Make(OrdInt)
+
+module Map = Map.Make(OrdInt)
--- /dev/null
+
+(** Hardware registers. *)
+
+type t
+
+val eq : t -> t -> bool
+
+module Set : Set.S
+
+module Map : Map.S
--- /dev/null
+(** This module defines a suited representation for bounded integers. *)
+
+open Big_int
+type t = big_int
+let of_int = big_int_of_int
+let to_int = int_of_big_int
+let compare = compare_big_int
+let to_string = string_of_big_int
+let zero = zero_big_int
+let one = unit_big_int
+let succ = succ_big_int
+let pred = pred_big_int
+let neg = minus_big_int
+let eq = eq_big_int
+let add = add_big_int
+let sub = sub_big_int
+let mul = mult_big_int
+let div = div_big_int
+let modulo = mod_big_int
+let lt = lt_big_int
+let le = le_big_int
+let gt = gt_big_int
+let ge = ge_big_int
+
--- /dev/null
+(** This module defines a suited representation for bounded integers using
+ O'Caml Int64. *)
+
+include Int64
+let from_int_cmp cmp a b = cmp (compare a b) 0
+let eq = from_int_cmp (=)
+let lt = from_int_cmp (<)
+let le = from_int_cmp (<=)
+let gt = from_int_cmp (>)
+let ge = from_int_cmp (>=)
+let modulo = rem
+
--- /dev/null
+
+(** This module defines functions to manipulate bounded integers. They can be
+ used to represent sequences of bits. *)
+
+module Int = IntValueConfig.Int
+
+(* Integers, whatever their size, will be represented using the Big_int
+ module. This allows immediate conversion, and allows the representation of
+ any integer (that fits into memory). *)
+
+type int_repr = Int.t
+let print_int_repr = Int.to_string
+
+
+(* The parameter module. Bounded integers are characterized by the number of
+ bits used to represent them. *)
+
+module type INTTYPE =
+sig
+ val size : int (* in bytes *)
+end
+
+module type FULLINTTYPE =
+sig
+ include INTTYPE
+ type t
+ val of_int : int -> t
+ val to_int : t -> int
+ val compare : t -> t -> int
+ val eq : t -> t -> bool
+ val to_string : t -> string
+ val zero : t
+ val one : t
+ val succ : t -> t
+ val pred : t -> t
+ val neg : t -> t
+ val add : t -> t -> t
+ val sub : t -> t -> t
+ val mul : t -> t -> t
+ val div : t -> t -> t
+ val modulo : t -> t -> t
+ val lt : t -> t -> bool
+ val gt : t -> t -> bool
+ val le : t -> t -> bool
+ val ge : t -> t -> bool
+end
+
+(* The signature provided to manipulate bounded integers. *)
+
+module type S = sig
+
+ type t
+ type repr
+
+ val compare : t -> t -> int
+ val to_string : t -> string
+ val zero : t
+ val one : t
+
+ val to_signed_repr : t -> repr
+ val to_unsigned_repr : t -> repr
+
+ val succ : t -> t
+ val pred : t -> t
+ val add : t -> t -> t
+ (** [add_of i1 i2] returns [true] iff adding [i1] and [i2] overflows. *)
+ val add_of : t -> t -> bool
+ val sub : t -> t -> t
+ (** [sub_uf i1 i2] returns [true] iff substracting [i1] and [i2]
+ underflows. *)
+ val sub_uf : t -> t -> bool
+ val mul : t -> t -> t
+ val div : t -> t -> t
+ val divu : t -> t -> t
+ val modulo : t -> t -> t
+ val modulou : t -> t -> t
+ val eq : t -> t -> bool
+ val neq : t -> t -> bool
+ val lt : t -> t -> bool
+ val ltu : t -> t -> bool
+ val le : t -> t -> bool
+ val leu : t -> t -> bool
+ val gt : t -> t -> bool
+ val gtu : t -> t -> bool
+ val ge : t -> t -> bool
+ val geu : t -> t -> bool
+ val neg : t -> t
+ val lognot : t -> t
+ val logand : t -> t -> t
+ val logor : t -> t -> t
+ val logxor : t -> t -> t
+ val shl : t -> t -> t
+ val shr : t -> t -> t
+ val shrl : t -> t -> t
+ val max : t -> t -> t
+ val maxu : t -> t -> t
+ val min : t -> t -> t
+ val minu : t -> t -> t
+ val cast : repr -> t
+ val of_int : int -> t
+ val to_int : t -> int
+
+ (** [zero_ext n a] performs zero extension on [a] where [n] bits are
+ significant. *)
+ val zero_ext : int -> t -> t
+ (** [sign_ext n a] performs sign extension on [a] where [n] bits are
+ significant. *)
+ val sign_ext : int -> t -> t
+
+ (** [break i n] cuts [i] in [n] parts. In the resulting list, the first
+ element is the low bits, and the last is the high bits (little endian
+ representation). *)
+ val break : t -> int -> t list
+ (** [merge l] creates the integer where the first element of [l] is its low
+ bits, etc, and the last element of [l] is its high bits (little endian
+ representation). *)
+ val merge : t list -> t
+
+end
+
+
+module FullMake (Int : FULLINTTYPE)
+ : S with type t = Int.t and type repr = Int.t =
+struct
+
+ type t = Int.t
+ type repr = Int.t
+
+ let size = Int.size * 8 (* real size, i.e. in bits *)
+
+ let compare = Int.compare
+ let to_string = Int.to_string
+ let zero = Int.zero
+ let one = Int.one
+ let two = Int.succ one
+
+ let rec pow x n =
+ if Int.eq n zero then one
+ else Int.mul x (pow x (Int.pred n))
+
+ (* Integers will all be taken modulo the following value. *)
+ let _mod = pow two (Int.of_int size)
+
+ (* The lower bound (inclusive). *)
+ let lower_bound = zero
+
+ (* The upper bound (inclusive). *)
+ let upper_bound = Int.pred _mod
+
+ (* [cast a] returns a modulo of [a] such that the result fits in the interval
+ of representation. *)
+ let cast a = Int.modulo a _mod
+
+ (* Half bound (exclusive), i.e. upper bound of signed integers. *)
+ let half_bound = pow two (Int.of_int (size-1))
+
+ (* Signed value of [a]. *)
+ let signed a =
+ let a = cast a in
+ if Int.lt a half_bound then a
+ else Int.sub a _mod
+
+ let to_signed_repr a = signed a
+
+ let to_unsigned_repr a = a
+
+ let signed_op op a b = op (signed a) (signed b)
+
+ let succ a = cast (Int.succ a)
+ let pred a = cast (Int.pred a)
+ let add a b = cast (Int.add a b)
+
+ (* [add_of i1 i2] returns [true] iff adding [i1] and [i2] overflows. *)
+ let add_of a b = Int.gt (Int.add a b) upper_bound
+
+ let sub a b = cast (Int.sub a b)
+
+ let cast_op op a b = op (cast a) (cast b)
+
+ let mul a b = cast (Int.mul a b)
+ let div a b = cast (signed_op Int.div a b)
+ let divu = cast_op Int.div
+ let modulo a b = cast (signed_op Int.modulo a b)
+ let modulou = cast_op Int.modulo
+
+ let eq = Int.eq
+ let neq a b = not (eq a b)
+ let lt = signed_op Int.lt
+ let le = signed_op Int.le
+ let gt = signed_op Int.gt
+ let ge = signed_op Int.ge
+ let ltu = cast_op Int.lt
+ let leu = cast_op Int.le
+ let gtu = cast_op Int.gt
+ let geu = cast_op Int.ge
+
+ (* [sub_uf i1 i2] returns [true] iff substracting [i1] and [i2] underflows. *)
+ let sub_uf a b = Int.lt (Int.sub a b) zero
+
+ let of_int i = cast (Int.of_int i)
+ let to_int i = Int.to_int (cast i)
+
+ let neg a = cast (Int.neg a)
+
+ let lognot = sub upper_bound
+
+ let shl a b =
+ let pow = pow two (cast b) in
+ mul a pow
+
+ let shr a b =
+ let a = cast a in
+ let b = cast b in
+ let added =
+ if ltu a half_bound then zero
+ else half_bound in
+ let rec aux acc b =
+ if eq b zero then acc
+ else
+ let cont_acc = add added (divu acc two) in
+ let cont_b = pred b in
+ aux cont_acc cont_b
+ in
+ cast (aux a b)
+
+ let shrl a b =
+ let pow = pow two (cast b) in
+ cast (div (cast a) pow)
+
+ let max a b = if lt a b then b else a
+ let min a b = if gt a b then b else a
+ let maxu a b = if ltu a b then b else a
+ let minu a b = if gtu a b then b else a
+
+ let is_odd a = eq (modulou a two) one
+ (* [to_bits a] returns the list of bits (0 or 1) that [a] represents. *)
+ let to_bits a =
+ let rec aux acc a i =
+ if i >= size then acc
+ else aux ((is_odd a) :: acc) (divu a two) (i+1)
+ in
+ aux [] (cast a) 0
+
+ (* [from_bits bits] returns the integer that the list of bits [bits]
+ represents. *)
+ let from_bits bits =
+ let rec aux acc = function
+ | [] -> acc
+ | b :: bits ->
+ let next_acc = mul acc two in
+ let next_acc = if b then succ next_acc else next_acc in
+ aux next_acc bits
+ in
+ aux zero bits
+
+ (* [binary_log_op f a b] applies the binary boolean operation [f]
+ pointwisely to the bits that [a] and [b] represent. *)
+ let binary_log_op f a b =
+ from_bits (List.map2 f (to_bits a) (to_bits b))
+
+ let xor a b = (a || b) && (not (a && b))
+
+ let logand = binary_log_op (&&)
+ let logor = binary_log_op (||)
+ let logxor = binary_log_op xor
+
+
+ (* [zero_ext n a] performs zero extension on [a] where [n] bits are
+ significant. *)
+ let zero_ext n a =
+ let pow2 = pow two (of_int n) in
+ modulo a pow2
+
+ (* [sign_ext n a] performs sign extension on [a] where [n] bits are
+ significant. *)
+ let sign_ext n a =
+ let a' = zero_ext n a in
+ let pow2 = pow two (of_int (n - 1)) in
+ let sign = divu a pow2 in
+ if is_odd sign then
+ let added = shr half_bound (of_int (n - 1)) in
+ add a' added
+ else a'
+
+
+ (* [break i n] cuts [i] in [n] parts. In the resulting list, the first element
+ is the low bits, and the last is the high bits (little endian
+ representation). *)
+ let break a n =
+ let chunk_size = size / n in
+ let pow2_chunk_size = pow two (of_int chunk_size) in
+ let rec aux acc a i =
+ if i = 0 then acc
+ else
+ let next = Int.div a pow2_chunk_size in
+ let chunk = Int.modulo a pow2_chunk_size in
+ aux ((cast chunk) :: acc) next (i-1)
+ in
+ List.rev (aux [] (cast a) n)
+
+ (* [merge l] creates the integer where the first element of [l] is its low
+ bits, etc, and the last element of [l] is its high bits (little endian
+ representation). *)
+ let merge = function
+ | [] -> zero
+ | al ->
+ let nb_chunks = List.length al in
+ let chunk_size = size / nb_chunks in
+ let pow2_chunk_size = pow two (of_int chunk_size) in
+ let rec aux pow2 = function
+ | [] -> zero
+ | a :: al -> add (mul a pow2) (aux (mul pow2 pow2_chunk_size) al)
+ in
+ aux one al
+
+end
+
+
+module type SRepr = S with type t = int_repr and type repr = int_repr
+
+
+module Make (IntType : INTTYPE) : SRepr =
+ FullMake (struct include IntType include Int end)
+
+
+module Int8 = Make (struct let size = 1 end)
+module Int16 = Make (struct let size = 2 end)
+module Int32 = Make (struct let size = 4 end)
+
+type int8 = Int8.t
+type int16 = Int16.t
+type int32 = Int32.t
--- /dev/null
+
+(** This module defines functions to manipulate bounded integers. They can be
+ used to represent sequences of bits. *)
+
+(* Integers, whatever their size, will be represented using the Big_int
+ module. This allows immediate conversion, and allows the representation of
+ any integer (that fits into memory). *)
+
+type int_repr
+val print_int_repr : int_repr -> string
+
+(* The parameter module. Bounded integers are characterized by the number of
+ bits used to represent them. *)
+
+module type INTTYPE =
+sig
+ val size : int (* in bytes *)
+end
+
+(* The signature provided to manipulate bounded integers. *)
+
+module type S = sig
+
+ type t
+ type repr
+
+ val compare : t -> t -> int
+ val to_string : t -> string
+ val zero : t
+ val one : t
+
+ val to_signed_repr : t -> repr
+ val to_unsigned_repr : t -> repr
+
+ val succ : t -> t
+ val pred : t -> t
+ val add : t -> t -> t
+ (** [add_of i1 i2] returns [true] iff adding [i1] and [i2] overflows. *)
+ val add_of : t -> t -> bool
+ val sub : t -> t -> t
+ (** [sub_uf i1 i2] returns [true] iff substracting [i1] and [i2]
+ underflows. *)
+ val sub_uf : t -> t -> bool
+ val mul : t -> t -> t
+ val div : t -> t -> t
+ val divu : t -> t -> t
+ val modulo : t -> t -> t
+ val modulou : t -> t -> t
+ val eq : t -> t -> bool
+ val neq : t -> t -> bool
+ val lt : t -> t -> bool
+ val ltu : t -> t -> bool
+ val le : t -> t -> bool
+ val leu : t -> t -> bool
+ val gt : t -> t -> bool
+ val gtu : t -> t -> bool
+ val ge : t -> t -> bool
+ val geu : t -> t -> bool
+ val neg : t -> t
+ val lognot : t -> t
+ val logand : t -> t -> t
+ val logor : t -> t -> t
+ val logxor : t -> t -> t
+ val shl : t -> t -> t
+ val shr : t -> t -> t
+ val shrl : t -> t -> t
+ val max : t -> t -> t
+ val maxu : t -> t -> t
+ val min : t -> t -> t
+ val minu : t -> t -> t
+ val cast : repr -> t
+ val of_int : int -> t
+ val to_int : t -> int
+
+ (** [zero_ext n a] performs zero extension on [a] where [n] bits are
+ significant. *)
+ val zero_ext : int -> t -> t
+ (** [sign_ext n a] performs sign extension on [a] where [n] bits are
+ significant. *)
+ val sign_ext : int -> t -> t
+
+ (** [break i n] cuts [i] in [n] parts. In the resulting list, the first
+ element is the low bits, and the last is the high bits (little endian
+ representation). *)
+ val break : t -> int -> t list
+ (** [merge l] creates the integer where the first element of [l] is its low
+ bits, etc, and the last element of [l] is its high bits (little endian
+ representation). *)
+ val merge : t list -> t
+
+end
+
+module type SRepr = S with type t = int_repr and type repr = int_repr
+
+(** The functor to create bounded integers from a size. *)
+
+module Make: functor (IntType: INTTYPE) -> SRepr
+
+module Int8 : SRepr
+module Int16 : SRepr
+module Int32 : SRepr
+
+type int8 = Int8.t
+type int16 = Int16.t
+type int32 = Int32.t
+
+
+(*
+module Int8s : S
+module Int8u : S
+module Int16s : S
+module Int16u : S
+module Int32 : S
+
+(** Unbounded integers. *)
+module Integer : S
+
+type int8s = Int8s.t
+type int8u = Int8u.t
+type int16s = Int16s.t
+type int16u = Int16u.t
+type int32 = Int32.t
+type integer = Integer.t
+*)
--- /dev/null
+
+include StringTools
--- /dev/null
+
+(** This module provides functions to manipulate and create fresh
+ regular labels. *)
+
+include StringSig.S
--- /dev/null
+
+(** This file gives a memory model that can be used by the interpreter
+ of various languages throughout the compilation process and
+ following the memory model of the CompCert compiler. *)
+
+(** In the module, every size is expressed in bytes. *)
+
+
+let error_prefix = "Memory"
+let error s = Error.global_error error_prefix s
+
+
+let string_of_quantity = function
+ | AST.QInt i -> "int" ^ (string_of_int (i*8))
+ | AST.QOffset -> "offset"
+ | AST.QPtr -> "ptr"
+
+
+let size_of_data = function
+(*
+ | AST.Data_reserve n -> n
+*)
+ | AST.Data_int8 _ -> 1
+ | AST.Data_int16 _ -> 2
+ | AST.Data_int32 _ -> 4
+ | AST.Data_float32 _ -> 4
+ | AST.Data_float64 _ -> 8
+
+
+let rec all_offsets size = match size with
+ | AST.SQ _ -> [[]]
+ | AST.SProd sizes ->
+ let fi i offsets = (size, i) :: offsets in
+ let f i size = List.map (fi i) (all_offsets size) in
+ List.flatten (MiscPottier.mapi f sizes)
+ | AST.SSum _ -> [[(size, 0)]]
+ | AST.SArray (n, size') ->
+ let all_offsets = all_offsets size' in
+ let f i = List.map (fun offsets -> (size, i) :: offsets) all_offsets in
+ let rec aux i =
+ if i >= n then []
+ else (f i) @ (aux (i+1)) in
+ aux 0
+
+
+(** This is the signature of the parameter module of the functor. *)
+
+module type DATA_SIZE =
+sig
+ val int_size : int
+ val ptr_size : int
+ val alignment : int option
+end
+
+
+(** This is the signature of the module that provides functions and types to
+ manipulate memories. *)
+
+module type S =
+sig
+
+ val int_size : int
+ val ptr_size : int
+ val alignment : int option
+
+ val size_of_quantity : AST.quantity -> int
+
+ module Value : Value.S
+
+ (* Memory. A memory contains values and function definitions. Since the memory
+ module will be used by the interpreters of the various languages of the
+ compilation chain, the type of memory is polymorphic with the type of
+ function definitions. *)
+
+ type 'fun_def memory
+
+ (* Memory manipulation *)
+
+ val empty : 'fun_def memory
+
+ (** [alloc mem size] allocates a block of [size] bytes in the memory [mem]. It
+ returns the new memory and the address of the beginning of the newly
+ allocated area. *)
+ val alloc : 'fun_def memory -> int -> 'fun_def memory * Value.address
+
+ (* Memory free *)
+
+ val free : 'fun_def memory -> Value.address -> 'fun_def memory
+
+ (* Memory load and store *)
+
+ (** [load mem size addr] reads [size] bytes from address [addr] in memory
+ [mem] and returns the value found. *)
+ val load : 'fun_def memory -> int -> Value.address -> Value.t
+ val loadq : 'fun_def memory -> AST.quantity -> Value.address -> Value.t
+
+ (** [store mem size addr v] writes the [size] first bytes (little endian
+ representation) of value [v] at address [addr] in memory [mem]. *)
+ val store : 'fun_def memory -> int -> Value.address -> Value.t ->
+ 'fun_def memory
+ val storeq : 'fun_def memory -> AST.quantity -> Value.address -> Value.t ->
+ 'fun_def memory
+
+ (* Globals management *)
+
+ (** [add_var mem x offsets init_datas] stores the datas [init_datas] of
+ offsets [offsets] in a new block of memory [mem], and associates the
+ global variable [x] with the address of the block. *)
+ val add_var :
+ 'fun_def memory -> AST.ident -> AST.abstract_size -> AST.data list option ->
+ 'fun_def memory
+
+ (** [add_fun_def mem f def] stores the function definition [def] in a new
+ block of memory [mem], and associates the function name [f] with the
+ address of the block. *)
+ val add_fun_def : 'fun_def memory -> AST.ident -> 'fun_def -> 'fun_def memory
+
+ val mem_global : 'fun_def memory -> AST.ident -> bool
+
+ (** [find_global mem x] returns the address associated with the global symbol
+ [x] in memory [mem]. [x] may be a global variable or the name of a
+ function. *)
+ val find_global : 'fun_def memory -> AST.ident -> Value.address
+
+ (** [find_fun_def mem addr] returns the function definition found at address
+ [addr] in memory [mem]. Raises an error if no function definition is
+ found. *)
+ val find_fun_def : 'fun_def memory -> Value.address -> 'fun_def
+
+
+ (** [align off size] returns the aligned offsets (starting at [off]) of datas
+ of size [size]. *)
+ val align : int (* starting offset *) -> AST.abstract_size (* sizes *) ->
+ (int list (* resulting offsets *) * int (* full size *))
+
+ val concrete_offsets_size : AST.abstract_size -> int list * int
+
+ val concrete_offsets : AST.abstract_size -> int list
+
+ val concrete_size : AST.abstract_size -> int
+
+ val concrete_offset : AST.abstract_offset -> int
+
+(*
+ val size_of_datas : AST.data list -> int
+
+ (** [offsets_of_datas datas] returns the aligned offsets for the datas
+ [datas], starting at offset 0. *)
+ val offsets_of_datas : AST.data list -> (AST.data * int (* offset *)) list
+
+ val alloc_datas : 'fun_def memory -> AST.data list ->
+ ('fun_def memory * Value.address)
+*)
+
+ val to_string : 'fun_def memory -> string
+ val print : 'fun_def memory -> unit
+
+end
+
+
+(** The functor of a memory module. *)
+
+module Make (D : DATA_SIZE) =
+struct
+
+ module Value = Value.Make (D)
+ module Block = Value.Block
+ module Offset = Value.Offset
+
+ let address_of_block_offset b off =
+ Value.of_mem_address (Value.make_mem_address b off)
+
+ let int_size = D.int_size
+ let ptr_size = D.ptr_size
+ let alignment = D.alignment
+
+ let size_of_quantity = function
+ | AST.QInt i -> i
+ | AST.QOffset -> int_size
+ | AST.QPtr -> ptr_size
+
+
+ module OffsetMap = Map.Make (Offset)
+ type offsetMap = Value.chunk OffsetMap.t
+ type offset = Offset.t
+
+ (* Empty cells are interpreted as an undefined byte value. *)
+
+ type contents =
+ { low : offset ; (* inclusive *)
+ high : offset ; (* inclusive *)
+ cells : offsetMap }
+
+ let update_cells contents cells = { contents with cells = cells }
+ let add_cells contents off v =
+ update_cells contents (OffsetMap.add off v contents.cells)
+ let remove_cells contents off =
+ update_cells contents (OffsetMap.remove off contents.cells)
+
+ (* Alignment *)
+
+ let is_multiple n m = m mod n = 0
+
+ (** [align_off off size] returns the offset greater or equal to [off] that is
+ aligned for storing a value of size [size]. *)
+ let align_off off size = match D.alignment with
+ | None -> off
+ | Some alignment when (size <= alignment) && (is_multiple size alignment) ->
+ let size = Offset.of_int size in
+ let rem = Offset.modulou off size in
+ if Offset.eq rem Offset.zero then off
+ else Offset.add off (Offset.sub size rem)
+ | Some alignment ->
+ let size = Offset.of_int alignment in
+ let rem = Offset.modulou off size in
+ if Offset.eq rem Offset.zero then off
+ else Offset.add off (Offset.sub size rem)
+
+ let is_aligned off size = Offset.eq off (align_off off size)
+
+ (** [pad off] returns the offset that is obtained by adding some padding from
+ [off] and such that the result is aligned. *)
+ let pad off = match D.alignment with
+ | None -> off
+ | Some alignment -> align_off off alignment
+
+ (** [pad_size off size] returns the offset that is obtained by adding [size]
+ to the offset [off] and then adding some extra padding such that the
+ result is aligned. *)
+ let pad_size off size =
+ Offset.to_int (pad (Offset.add off (Offset.of_int size)))
+
+
+ (* Contents in memory. The type of function definitions varies from a language
+ to another; thus, it is left generic. *)
+
+ type 'fun_def content =
+ | Contents of contents
+ | Fun_def of 'fun_def
+
+
+ (* The mapping from blocks to contents. *)
+
+ module BlockMap = Map.Make (Block)
+ type 'fun_def blockMap = 'fun_def content BlockMap.t
+ type block = Block.t
+
+ (* The mapping from global identifiers to blocks (negative for function
+ definitions and positive for global variables). *)
+
+ module GlobalMap = Map.Make (String)
+ type globalMap = Value.address GlobalMap.t
+
+ (* The memory.
+ It is a mapping from blocks to contents, a mapping from global identifiers
+ (variables and functions) to pointers, a mapping from (negative) blocks to
+ function definition, the next free positive block and the next free
+ negative block. *)
+
+ type 'fun_def memory =
+ { blocks : 'fun_def blockMap ;
+ addr_of_global : globalMap ;
+ next_block : block ;
+ next_fun_block : block }
+
+ (* Pretty printing *)
+
+ let to_string mem =
+ let i = ref 0 in
+ let string_of_cell off v s =
+ let s' = if !i mod 4 = 0 then (i := 0 ; "\n ") else "" in
+ i := !i+1 ;
+ let sv =
+ if Value.is_undef_byte v then ""
+ else Printf.sprintf "[%s]: %s"
+ (Offset.to_string off) (Value.string_of_chunk v) in
+ Printf.sprintf "%s%s %s" s s' sv in
+ let string_of_cells cells = OffsetMap.fold string_of_cell cells "" in
+ let string_of_block b content s =
+ (Printf.sprintf "%s\nBlock %s: " s (Block.to_string b)) ^
+ (match content with
+ | Contents contents ->
+ i := 0 ;
+ Printf.sprintf "(%s -> %s)%s"
+ (Offset.to_string contents.low)
+ (Offset.to_string contents.high)
+ (string_of_cells contents.cells)
+ | Fun_def _ -> "function definition") in
+ Printf.sprintf "%s\n" (BlockMap.fold string_of_block mem.blocks "")
+
+ let print mem = Printf.printf "%s%!" (to_string mem)
+
+
+ (* Memory manipulation *)
+
+ let empty =
+ { blocks = BlockMap.empty ;
+ addr_of_global = GlobalMap.empty ;
+ next_block = Block.of_int 1 ;
+ next_fun_block = Block.of_int (-1) }
+
+ (* Memory allocation *)
+
+ (** [alloc2 mem low high] allocates in memory [mem] a new block whose readable
+ and writable offsets are the interval [low] (inclusive) [high]
+ (inclusive). *)
+ let alloc2 mem low high =
+ let b = mem.next_block in
+ let contents = { low = low ; high = high ; cells = OffsetMap.empty } in
+ let blocks = BlockMap.add b (Contents contents) mem.blocks in
+ let next_block = Block.succ mem.next_block in
+ let mem' = { mem with blocks = blocks ; next_block = next_block } in
+ (mem', address_of_block_offset b low)
+
+ (** [alloc mem size] allocates a block of [size] bytes in the memory [mem]. It
+ returns the new memory and the address of the beginning of the newly
+ allocated area. *)
+ let alloc mem size =
+ if size = 0 then (mem, Value.null)
+ else alloc2 mem Offset.zero (Offset.of_int (size-1))
+
+
+ (* The 'safe'-prefixed functions below raise an error when the argument is not
+ of the expected form. *)
+
+ let safe_to_address msg vs =
+ if Value.is_mem_address vs then Value.to_mem_address vs
+ else error msg
+
+ let safe_find not_found find a map =
+ try find a map
+ with Not_found -> not_found ()
+
+ let safe_find_err msg = safe_find (fun () -> error msg)
+
+ let safe_find_block msg b mem = safe_find_err msg BlockMap.find b mem.blocks
+
+ let safe_find_contents msg b mem = match safe_find_block msg b mem with
+ | Contents contents -> contents
+ | Fun_def _ -> error msg
+
+ let safe_find_offset msg off contents =
+ if (Offset.leu contents.low off) && (Offset.leu off contents.high) then
+ safe_find (fun () -> Value.undef_byte) OffsetMap.find off contents.cells
+ else error msg
+
+ let memory_find msg mem b off =
+ safe_find_offset msg off (safe_find_contents msg b mem)
+
+
+ (* Memory free *)
+
+ let free mem vs =
+ let addr = safe_to_address "free: invalid memory address." vs in
+ let (b, _) = Value.decompose_mem_address addr in
+ { mem with blocks = BlockMap.remove b mem.blocks }
+
+
+ (* Memory load *)
+
+ (** [load_bytes msg mem b off size] reads [size] bytes from the block [b] and
+ offset [off] in memory [mem] and returns the value found. If an error
+ occurs, [msg] will be printed. *)
+ let load_bytes msg mem b off size =
+ let shift_off n = Offset.add off (Offset.of_int n) in
+ let rec aux n =
+ if n >= size then []
+ else (memory_find msg mem b (shift_off n)) :: (aux (n+1)) in
+ Value.merge (aux 0)
+
+ (** [load mem size addr] reads [size] bytes from address [addr] in memory
+ [mem] and returns the value found. *)
+ let load mem size vs =
+ let msg = "load: invalid memory access." in
+ let addr = safe_to_address msg vs in
+ let (b, off) = Value.decompose_mem_address addr in
+ if not (is_aligned off size) then
+ error "Alignment constraint violated when loading value."
+ else load_bytes msg mem b off size
+
+ let loadq mem q vs = load mem (size_of_quantity q) vs
+
+
+ (* Memory store *)
+
+ (** [store_chunks msg mem size b off chunks] writes the [size] first chunks of
+ list [chunks] at the offset [off] of the block [b] in the memory [mem]. *)
+ let store_chunks msg mem size b off chunks =
+ let shift_off n = Offset.add off (Offset.of_int n) in
+ let f i contents chunk =
+ let off' = shift_off i in
+ if (Offset.leu contents.low off') &&
+ (Offset.leu off' contents.high) then
+ if Value.is_undef_byte chunk then contents
+ else add_cells contents off' chunk
+ else error msg in
+ match safe_find_block msg b mem with
+ | Contents contents ->
+ let contents = MiscPottier.foldi_until size f contents chunks in
+ let blocks = BlockMap.add b (Contents contents) mem.blocks in
+ { mem with blocks = blocks }
+ | _ -> error msg
+
+ (** [store mem size addr v] writes the [size] first bytes (little endian
+ representation) of value [v] at address [addr] in memory [mem]. *)
+ let store mem size vs v =
+ let msg = "store: invalid memory access." in
+ let addr = safe_to_address msg vs in
+ let (b, off) = Value.decompose_mem_address addr in
+ if not (is_aligned off size) then
+ error "Alignment constraint violated when storing value."
+ else store_chunks msg mem size b off (Value.break v)
+
+ let storeq mem q vs v = store mem (size_of_quantity q) vs v
+
+
+ (* Data manipulation *)
+
+ let value_of_data = function
+(*
+ | AST.Data_reserve _ -> Value.undef
+*)
+ | AST.Data_int8 i | AST.Data_int16 i | AST.Data_int32 i -> Value.of_int i
+ | AST.Data_float32 f | AST.Data_float64 f -> error "float not supported."
+
+ type concrete_size =
+ | I of Offset.t
+ | C of concrete_size list
+
+ let rec first_offset = function
+ | I off -> off
+ | C [] -> raise (Failure "Memory.first_offset")
+ | C (csize :: _) -> first_offset csize
+
+ let first_offsets = function
+ | I off -> [off]
+ | C sizes -> List.map first_offset sizes
+
+ let rec all_offsets = function
+ | I off -> [off]
+ | C sizes -> List.flatten (List.map all_offsets sizes)
+
+ let rec full_align off = function
+
+ | AST.SQ q ->
+ let size = size_of_quantity q in
+ let start_off = align_off off size in
+ let diff = Offset.to_int (Offset.sub start_off off) in
+ let full_size = size + diff in
+ (I start_off, full_size)
+
+ | AST.SProd sizes ->
+ let f (l, off) size =
+ let (csize, added_size) = full_align off size in
+ (l @ [csize], Offset.add off (Offset.of_int added_size)) in
+ let start_off = pad off in
+ let (l, end_off) = List.fold_left f ([], start_off) sizes in
+ let end_off = pad end_off in
+ let full_size = Offset.to_int (Offset.sub end_off off) in
+ (C l, full_size)
+
+ | AST.SSum sizes ->
+ let start_off = pad off in
+ let sizes =
+ List.map (fun size -> snd (full_align start_off size)) sizes in
+ let max = Offset.of_int (MiscPottier.max_list sizes) in
+ let end_off = pad (Offset.add start_off max) in
+ let full_size = Offset.to_int (Offset.sub end_off off) in
+ (I start_off, full_size)
+
+ | AST.SArray (n, size) ->
+ let sizes = MiscPottier.make size n in
+ full_align off (AST.SProd sizes)
+
+ let align off size =
+ let (offsets, full_size) = full_align (Offset.of_int off) size in
+ (List.map Offset.to_int (first_offsets offsets), full_size)
+
+ let concrete_offsets_size = align 0
+
+ let concrete_offsets size = fst (concrete_offsets_size size)
+
+ let concrete_size size = snd (concrete_offsets_size size)
+
+ let concrete_offset (size, depth) =
+ let offsets = concrete_offsets size in
+ List.nth offsets depth
+
+
+ (* Globals manipulation *)
+
+ let store_datas_opt mem addr offsets = function
+ | None -> mem
+ | Some datas ->
+ let f mem (offset, data) =
+ let addr = Value.add_address addr offset in
+ store mem (size_of_data data) addr (value_of_data data) in
+ let offsets = all_offsets offsets in
+ if List.length offsets <> List.length datas then
+ error "wrong sizes for global initializations (union type?)."
+ else
+ let offset_datas = List.combine offsets datas in
+ List.fold_left f mem offset_datas
+
+ (** [add_var mem x size init_datas] stores the datas [init_datas] of offsets
+ [size] in a new block of memory [mem], and associates the global variable
+ [x] with the address of the block. *)
+ let add_var mem v_id size datas_opt =
+ let (offsets, size) = full_align Offset.zero size in
+ let (mem, addr) = alloc mem size in
+ let mem = store_datas_opt mem addr offsets datas_opt in
+ let addr_of_global = GlobalMap.add v_id addr mem.addr_of_global in
+ { mem with addr_of_global = addr_of_global }
+
+ (** [add_fun_def mem f def] stores the function definition [def] in a new
+ block of memory [mem], and associates the function name [f] with the
+ address of the block. *)
+ let add_fun_def mem f_id f_def =
+ let b = mem.next_fun_block in
+ let next_fun_block = Block.pred mem.next_fun_block in
+ let vs = address_of_block_offset b Offset.zero in
+ let addr_of_global = GlobalMap.add f_id vs mem.addr_of_global in
+ let blocks = BlockMap.add b (Fun_def f_def) mem.blocks in
+ { mem with blocks = blocks ;
+ addr_of_global = addr_of_global ;
+ next_fun_block = next_fun_block }
+
+ let mem_global mem id = GlobalMap.mem id mem.addr_of_global
+
+ (** [find_global mem x] returns the address associated with the global symbol
+ [x] in memory [mem]. [x] may be a global variable or the name of a
+ function. *)
+ let find_global mem gid =
+ if GlobalMap.mem gid mem.addr_of_global then
+ GlobalMap.find gid mem.addr_of_global
+ else error ("Unknown global \"" ^ gid ^ "\"")
+
+ (** [find_fun_def mem addr] returns the function definition found at address
+ [addr] in memory [mem]. Raises an error if no function definition is
+ found. *)
+ let find_fun_def mem vs =
+ let msg = "Invalid access to a function definition." in
+ let (b, _) = Value.decompose_mem_address (safe_to_address msg vs) in
+ match safe_find_block msg b mem with
+ | Contents _ -> error msg
+ | Fun_def def -> def
+
+end
--- /dev/null
+
+(** This file gives a memory model that can be used by the interpreter
+ of various languages throughout the compilation process and
+ following the memory model of the CompCert compiler. *)
+
+(** In the module, every size is expressed in bytes. *)
+
+
+val string_of_quantity : AST.quantity -> string
+
+val size_of_data : AST.data -> int
+
+val all_offsets : AST.abstract_size -> AST.abstract_offset list list
+
+
+(** This is the signature of the parameter module of the functor. *)
+
+module type DATA_SIZE =
+sig
+ val int_size : int
+ val ptr_size : int
+ val alignment : int option
+end
+
+
+(** This is the signature of the module that provides functions and types to
+ manipulate memories. *)
+
+module type S =
+sig
+
+ val int_size : int
+ val ptr_size : int
+ val alignment : int option
+
+ val size_of_quantity : AST.quantity -> int
+
+ module Value : Value.S
+
+ (* Memory. A memory contains values and function definitions. Since the memory
+ module will be used by the interpreters of the various languages of the
+ compilation chain, the type of memory is polymorphic with the type of
+ function definitions. *)
+
+ type 'fun_def memory
+
+ (* Memory manipulation *)
+
+ val empty : 'fun_def memory
+
+ (** [alloc mem size] allocates a block of [size] bytes in the memory [mem]. It
+ returns the new memory and the address of the beginning of the newly
+ allocated area. *)
+ val alloc : 'fun_def memory -> int -> 'fun_def memory * Value.address
+
+ (* Memory free *)
+
+ val free : 'fun_def memory -> Value.address -> 'fun_def memory
+
+ (* Memory load and store *)
+
+ (** [load mem size addr] reads [size] bytes from address [addr] in memory
+ [mem] and returns the value found. *)
+ val load : 'fun_def memory -> int -> Value.address -> Value.t
+ val loadq : 'fun_def memory -> AST.quantity -> Value.address -> Value.t
+
+ (** [store mem size addr v] writes the [size] first bytes (little endian
+ representation) of value [v] at address [addr] in memory [mem]. *)
+ val store : 'fun_def memory -> int -> Value.address -> Value.t ->
+ 'fun_def memory
+ val storeq : 'fun_def memory -> AST.quantity -> Value.address -> Value.t ->
+ 'fun_def memory
+
+ (* Globals management *)
+
+ (** [add_var mem x offsets init_datas] stores the datas [init_datas] of
+ offsets [offsets] in a new block of memory [mem], and associates the
+ global variable [x] with the address of the block. *)
+ val add_var :
+ 'fun_def memory -> AST.ident -> AST.abstract_size -> AST.data list option ->
+ 'fun_def memory
+
+ (** [add_fun_def mem f def] stores the function definition [def] in a new
+ block of memory [mem], and associates the function name [f] with the
+ address of the block. *)
+ val add_fun_def : 'fun_def memory -> AST.ident -> 'fun_def -> 'fun_def memory
+
+ val mem_global : 'fun_def memory -> AST.ident -> bool
+
+ (** [find_global mem x] returns the address associated with the global symbol
+ [x] in memory [mem]. [x] may be a global variable or the name of a
+ function. *)
+ val find_global : 'fun_def memory -> AST.ident -> Value.address
+
+ (** [find_fun_def mem addr] returns the function definition found at address
+ [addr] in memory [mem]. Raises an error if no function definition is
+ found. *)
+ val find_fun_def : 'fun_def memory -> Value.address -> 'fun_def
+
+
+ (** [align off size] returns the aligned offsets (starting at [off]) of datas
+ of size [size]. *)
+ val align : int (* starting offset *) -> AST.abstract_size (* sizes *) ->
+ (int list (* resulting offsets *) * int (* full size *))
+
+ val concrete_offsets_size : AST.abstract_size -> int list * int
+
+ val concrete_offsets : AST.abstract_size -> int list
+
+ val concrete_size : AST.abstract_size -> int
+
+ val concrete_offset : AST.abstract_offset -> int
+
+(*
+ val size_of_datas : AST.data list -> int
+
+ (** [offsets_of_datas datas] returns the aligned offsets for the datas
+ [datas], starting at offset 0. *)
+ val offsets_of_datas : AST.data list -> (AST.data * int (* offset *)) list
+
+ val alloc_datas : 'fun_def memory -> AST.data list ->
+ ('fun_def memory * Value.address)
+*)
+
+ val to_string : 'fun_def memory -> string
+ val print : 'fun_def memory -> unit
+
+end
+
+
+(** The functor to a memory module. *)
+
+module Make (D : DATA_SIZE) : S
--- /dev/null
+
+(** These are the functions provided by the runtime system. *)
+
+
+let error_prefix = "Primitives"
+let error s = Error.global_error error_prefix s
+let warning s = Error.warning error_prefix s
+
+let print_schar =
+ ("print_schar", "extern void print_schar(signed char);")
+let print_uchar =
+ ("print_uchar", "extern void print_uchar(unsigned char);")
+let print_sshort =
+ ("print_sshort", "extern void print_sshort(signed short);")
+let print_ushort =
+ ("print_ushort", "extern void print_ushort(unsigned short);")
+let print_sint =
+ ("print_sint", "extern void print_sint(signed int);")
+let print_uint =
+ ("print_uint", "extern void print_uint(unsigned int);")
+let scan_int =
+ ("scan_int", "extern int scan_int(void);")
+let alloc =
+ ("alloc", "extern int* alloc(int);")
+let newline =
+ ("newline", "extern void newline(void);")
+let space =
+ ("space", "extern void space(void);")
+let rand_bool =
+ ("rand_bool", "extern int rand_bool(void);")
+let rand_int =
+ ("rand_int", "extern int rand_int(int);")
+
+let ident = fst
+
+let proto = snd
+
+let primitives_list =
+ [print_schar ; print_uchar ; print_sshort ; print_ushort ;
+ print_sint ; print_uint ; scan_int ; alloc ; newline ; space ;
+ rand_bool ; rand_int]
+
+
+let args_byte_size = function
+ | s when s = ident print_schar || s = ident print_uchar -> AST.QInt 1
+ | s when s = ident print_sshort || s = ident print_ushort -> AST.QInt 2
+ | s when s = ident print_sint || s = ident print_uint || s = ident rand_int ->
+ AST.QInt 4
+ | s when s = ident scan_int || s = ident newline || s = ident space ||
+ s = ident rand_bool ->
+ AST.QInt 0
+ | s when s = ident alloc -> AST.QPtr
+ | s -> error ("unknown primitive " ^ s ^ ".")
+
+
+let primitives =
+ List.fold_left (fun res f -> StringTools.Set.add f res) StringTools.Set.empty
+ (List.map ident primitives_list)
+
+let is_primitive f = StringTools.Set.mem f primitives
+
+
+module Interpret (M : Memory.S) = struct
+
+ type res = V of M.Value.t list | A of M.Value.address
+
+ let print_integer_primitives =
+ List.map ident
+ [print_schar ; print_uchar ; print_sshort ; print_ushort ;
+ print_sint ; print_uint]
+
+ let is_print_integer_primitive f = List.mem f print_integer_primitives
+
+ let print_integer_primitive_funs = function
+ | f when f = ident print_schar ->
+ (IntValue.Int8.cast, IntValue.Int8.to_signed_repr)
+ | f when f = ident print_uchar ->
+ (IntValue.Int8.cast, IntValue.Int8.to_unsigned_repr)
+ | f when f = ident print_sshort ->
+ (IntValue.Int16.cast, IntValue.Int16.to_signed_repr)
+ | f when f = ident print_ushort ->
+ (IntValue.Int16.cast, IntValue.Int16.to_unsigned_repr)
+ | f when f = ident print_sint ->
+ (IntValue.Int32.cast, IntValue.Int32.to_signed_repr)
+ | f when f = ident print_uint ->
+ (IntValue.Int32.cast, IntValue.Int32.to_unsigned_repr)
+ | f -> error ("unknown integer printing primitive " ^ f ^ ".")
+
+ let make_int_value vs = IntValue.Int32.merge (List.map M.Value.to_int_repr vs)
+
+ let print_integer f mem vs =
+ let (cast, to_int_repr) = print_integer_primitive_funs f in
+ let i = make_int_value vs in
+ let i = cast i in
+ let i = to_int_repr i in
+ Printf.printf "%s%!" (IntValue.print_int_repr i) ;
+ (mem, V [])
+
+ let are_ints args =
+ let f res v = res && M.Value.is_int v in
+ List.fold_left f true args
+
+ let res_of_int i =
+ let i = IntValue.Int32.of_int i in
+ let is = IntValue.Int32.break i (4 / M.Value.int_size) in
+ List.map M.Value.of_int_repr is
+
+ let t mem f = function
+ | args when is_print_integer_primitive f && are_ints args ->
+ print_integer f mem args
+ | _ when f = ident scan_int ->
+ Printf.printf ": %!" ;
+ (mem, V (res_of_int (int_of_string (read_line ()))))
+ | args when f = ident alloc && are_ints args ->
+ let size = IntValue.Int32.to_int (make_int_value args) in
+ let (mem, addr) = M.alloc mem size in
+ (mem, A addr)
+ | _ when f = ident newline ->
+ Printf.printf "\n%!" ;
+ (mem, V [])
+ | _ when f = ident space ->
+ Printf.printf " %!" ;
+ (mem, V [])
+ | _ when f = ident rand_bool ->
+ (mem, V (res_of_int (Random.int 2)))
+ | args when f = ident rand_int && are_ints args ->
+ let i = IntValue.Int32.to_int (make_int_value args) in
+ (mem, V (res_of_int (Random.int i)))
+ | _ -> error ("unknown primitive " ^ f ^ " or bad arguments.")
+end
+
+
+let print_signedness = function
+ | AST.Signed -> "s"
+ | AST.Unsigned -> "u"
+
+let print_size = string_of_int
+
+let print_type = function
+ | AST.Sig_int (size, sign) ->
+ "int" ^ (print_size size) ^ (print_signedness sign)
+ | AST.Sig_float (size, sign) ->
+ "float" ^ (print_size size) ^ (print_signedness sign)
+ | AST.Sig_offset -> "offset"
+ | AST.Sig_ptr -> "ptr"
+
+let print_type_return = function
+ | AST.Type_ret t -> print_type t
+ | AST.Type_void -> "void"
+
+let rec print_arg_types = function
+ | [] -> ""
+ | t :: ts -> (print_type t) ^ " -> " ^ (print_arg_types ts)
+
+let print_sig sg =
+ Printf.sprintf "%s%s"
+ (print_arg_types sg.AST.args)
+ (print_type_return sg.AST.res)
+
+let prototypes =
+ let f res s = res ^ "\n" ^ s in
+ (List.fold_left f "" (List.map proto primitives_list)) ^ "\n\n"
--- /dev/null
+
+(** These are the functions provided by the runtime system. *)
+
+val primitives : StringTools.Set.t
+
+val is_primitive : string -> bool
+
+(** Available primitives are :
+extern void print_schar(signed char);
+extern void print_uchar(unsigned char);
+extern void print_sshort(signed short);
+extern void print_ushort(unsigned short);
+extern void print_sint(signed int);
+extern void print_uint(unsigned int);
+extern int scan_int(void);
+extern int* alloc(int);
+extern void newline(void);
+extern void space(void);
+(* The following functions only work from Clight to LIN (both included). *)
+extern int rand_bool();
+extern int rand_int(int, int); *)
+
+val args_byte_size : string -> AST.quantity
+
+val print_type : AST.sig_type -> string
+val print_type_return : AST.type_return -> string
+val print_sig : AST.signature -> string
+val print_signedness : AST.signedness -> string
+val print_size : AST.size -> string
+
+module Interpret (M : Memory.S) : sig
+ type res = V of M.Value.t list | A of M.Value.address
+ val t : 'a M.memory -> string -> M.Value.t list -> 'a M.memory * res
+end
+
+val prototypes : string
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+include Atom
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(** This module offers an abstract type of pseudo-registers, used in
+ [RTL] and [ERTL].
+
+ This module really is a copy of module [Atom]. However,
+ [Register.t] is an abstract type -- it is not equal to [Atom.t] or
+ [Label.t]. *)
+
+include AtomSig.S
+
--- /dev/null
+
+(** This module describes the values manipulated by high level
+ languages. *)
+
+
+let error_prefix = "Value"
+let error s = Error.global_error error_prefix s
+
+open IntValue
+
+
+(** The representation of values depends on the size of integers and the size of
+ addresses. *)
+
+(** This is the signature of the parameter module. *)
+
+module type DATA_SIZE =
+sig
+ val int_size : int
+ val ptr_size : int
+end
+
+(** This is the signature of the module that provides types and functions to
+ manipulate values. *)
+
+module type S =
+sig
+
+ val int_size : int
+ val ptr_size : int
+
+ (** The type of values. A value may be: a bounded integer, a chunk of an
+ address (exactly an address when they have the same size as a machine
+ register), or undefined. *)
+ type t
+
+ val compare : t -> t -> int
+ val equal : t -> t -> bool
+ val eq : t -> t -> bool
+ val hash : t -> int
+ val to_string : t -> string
+
+ (* The functions of this module may raise a Failure exception when
+ trying to convert them to their various representation. *)
+
+ val is_int : t -> bool
+ val to_int : t -> int
+ val of_int : int -> t
+
+ val of_int_repr : IntValue.int_repr -> t
+ val to_int_repr : t -> IntValue.int_repr
+
+ val of_bool : bool -> t
+ val to_bool : t -> bool
+
+ val zero : t
+ val val_true : t
+ val val_false : t
+ val is_true : t -> bool
+ val is_false : t -> bool
+ val undef : t
+
+ (** The cast operations below returns the undefined value for non-integer
+ values. For integer values, it will return the integer value that
+ represents the same quantity, but using every bits (sign or zero
+ extension) of an integer value. For example, the function [cast8unsigned]
+ should be read as "cast from an 8 bits unsigned integer". *)
+ val cast8unsigned : t -> t
+ val cast8signed : t -> t
+ val cast16unsigned : t -> t
+ val cast16signed : t -> t
+ val cast32 : t -> t
+
+ (** [zero_ext v n m] performs a zero extension on [v] where [n] bytes are
+ significant to a value where [m] bytes are significant. *)
+ val zero_ext : t -> int -> int -> t
+ (** [sign_ext v n m] performs a sign extension on [v] where [n] bytes are
+ significant to a value where [m] bytes are significant. *)
+ val sign_ext : t -> int -> int -> t
+
+ (** Integer opposite *)
+ val negint : t -> t
+ (** Boolean negation *)
+ val notbool : t -> t
+ (** Bitwise not *)
+ val notint : t -> t
+
+ val succ : t -> t
+ val pred : t -> t
+ val cmpl : t -> t
+
+ (** [add_and_of v1 v2] returns the sum of [v1] and [v2], and whether this sum
+ overflows. *)
+ val add_and_of : t -> t -> (t * t)
+ val add : t -> t -> t
+ (** [add_of v1 v2] returns the [1] value if the sum of [v1] and [v2]
+ overflows, and [0] otherwise. *)
+ val add_of : t -> t -> t
+ (** [sub_and_uf v1 v2] returns the substraction of [v1] and [v2], and whether
+ this substraction underflows. *)
+ val sub_and_uf : t -> t -> (t * t)
+ val sub : t -> t -> t
+ (** [sub_uf v1 v2] returns the [1] value if the substraction of [v1] and [v2]
+ underflows, and [0] otherwise. *)
+ val sub_uf : t -> t -> t
+ val mul : t -> t -> t
+ val div : t -> t -> t
+ val divu : t -> t -> t
+ val modulo : t -> t -> t
+ val modulou : t -> t -> t
+ val and_op : t -> t -> t
+ val or_op : t -> t -> t
+ val xor : t -> t -> t
+ val shl : t -> t -> t
+ val shr : t -> t -> t
+ val shru : t -> t -> t
+
+ (** Signed comparisions *)
+ val cmp_eq : t -> t -> t
+ val cmp_ne : t -> t -> t
+ val cmp_lt : t -> t -> t
+ val cmp_ge : t -> t -> t
+ val cmp_le : t -> t -> t
+ val cmp_gt : t -> t -> t
+
+ (** Unsigned comparisions *)
+ val cmp_eq_u : t -> t -> t
+ val cmp_ne_u : t -> t -> t
+ val cmp_lt_u : t -> t -> t
+ val cmp_ge_u : t -> t -> t
+ val cmp_le_u : t -> t -> t
+ val cmp_gt_u : t -> t -> t
+
+ (** A chunk is a part of a value that has the size of a memory cell. *)
+
+ type chunk
+ val string_of_chunk : chunk -> string
+ val undef_byte : chunk
+ val is_undef_byte : chunk -> bool
+
+ (** [break v] cuts [v] in chunks that each fits into a memory cell. In the
+ resulting list, the first element is the low bits, and the last is the
+ high bits (little endian representation). *)
+ val break : t -> chunk list
+ (** [merge l] creates the value where the first element of [l] is its low
+ bits, etc, and the last element of [l] is its high bits (little endian
+ representation). *)
+ val merge : chunk list -> t
+
+ (** Addresses from the memory point of view. *)
+
+ (** Some architectures have pointers bigger than integers. In this case, only
+ a chunk of pointer can fit into a machine register. Thus, an address is
+ represented by several values (little endian representation). *)
+
+ type address = t list
+ val string_of_address : address -> string
+ val null : address
+
+ (** Addresses from the memory point of view. Only use the functions below in
+ the Memory module.*)
+
+ (** Addresses are represented by a block, i.e. a base address, and an offset
+ from this block. Both blocks and offsets are represented using bounded
+ integers. *)
+ module Block : IntValue.S
+ module Offset : IntValue.S
+
+ type mem_address
+ val string_of_mem_address : mem_address -> string
+
+ val is_mem_address : address -> bool
+
+ val of_mem_address : mem_address -> address
+ val to_mem_address : address -> mem_address
+ val make_mem_address : Block.t -> Offset.t -> mem_address
+ val decompose_mem_address : mem_address -> Block.t * Offset.t
+ val block_of_address : address -> Block.t
+ val offset_of_address : address -> Offset.t
+
+ val change_address_offset : address -> Offset.t -> address
+ val add_address : address -> Offset.t -> address
+ val eq_address : address -> address -> bool
+
+end
+
+
+module Make (D : DATA_SIZE) =
+struct
+
+ let int_size = D.int_size
+ let ptr_size = D.ptr_size
+
+ module BoundedInt = IntValue.Make (struct let size = D.int_size end)
+
+ (* Integer values. *)
+ module ValInt = BoundedInt
+
+ (* Addresses are represented by a block, i.e. a base address, and an offset
+ from this block. Both blocks and offsets are represented using bounded
+ integers. However, values must fit into a machine register. Some
+ architectures, like the 8051, have addresses bigger than registers. Pointer
+ values will only represent a part of a full pointer (or exactly a pointer
+ when addresses fit into a register). *)
+
+ (* Blocks and offsets need [D.ptr_size] bits each to be represented. Indeed,
+ one may allocate 2^[D.ptr_size] blocks of size one byte, or one block of
+ size 2^[D.ptr_size] bytes. *)
+
+ module ValBlock = BoundedInt
+ module ValOffset = BoundedInt
+
+ type t =
+ | Val_int of ValInt.t
+ | Val_ptr of ValBlock.t * ValOffset.t
+ | Val_undef
+
+ let compare a b = match a, b with
+ | Val_int i1, Val_int i2 -> ValInt.compare i1 i2
+ | Val_ptr (b1, off1), Val_ptr (b2, off2) ->
+ let i1 = ValBlock.compare b1 b2 in
+ if i1 = 0 then ValOffset.compare off1 off2
+ else i1
+ | Val_undef, Val_undef -> 0
+ | Val_int _, _ -> 1
+ | _, Val_int _ -> -1
+ | Val_ptr _, _ -> 1
+ | _, Val_ptr _ -> -1
+
+ (*
+ let hash = function
+ | Val_int i -> ValInt.to_int i
+ | Val_float f -> int_of_float f
+ | Val_undef -> 0
+ | Val_ptr (b,o)
+ | Val_ptrh (b,o)
+ | Val_ptrl (b,o) -> ValInt.to_int (ValInt.add b o)
+ *)
+
+ let hash = Hashtbl.hash
+
+ let equal a b = compare a b = 0
+ let eq a b = compare a b = 0
+
+ let to_string = function
+ | Val_int i -> ValInt.to_string i
+ | Val_ptr (b, off) ->
+ "VPtr(" ^ (ValBlock.to_string b) ^ ", " ^ (ValOffset.to_string off) ^ ")"
+ | Val_undef -> "undef"
+
+ let is_int = function
+ | Val_int _ -> true
+ | _ -> false
+
+ let to_int = function
+ | Val_int i -> ValInt.to_int i
+ | _ -> raise (Failure "Value.to_int")
+
+ let of_int i = Val_int (ValInt.of_int i)
+ let one = of_int 1
+
+ let of_int_repr i = Val_int i
+
+ let to_int_repr = function
+ | Val_int i -> i
+ | _ -> raise (Failure "Value.to_int_repr")
+
+ let zero = Val_int ValInt.zero
+ let val_true = Val_int ValInt.one
+ let val_false = Val_int ValInt.zero
+
+ let is_true = function
+ | Val_int i -> ValInt.neq i ValInt.zero
+ | Val_ptr (b, off) ->
+ (ValBlock.neq b ValBlock.zero) || (ValOffset.neq off ValOffset.zero)
+ | _ -> false
+
+ let is_false = function
+ | Val_int i -> ValInt.eq i ValInt.zero
+ | Val_ptr (b, off) ->
+ (ValBlock.eq b ValBlock.zero) && (ValOffset.eq off ValOffset.zero)
+ | _ -> false
+
+ let of_bool = function
+ | true -> val_true
+ | false -> val_false
+
+ let to_bool v =
+ if is_true v then true
+ else
+ if is_false v then false
+ else error "Undefined value."
+
+ let undef = Val_undef
+
+ let cast cast_fun = function
+ | Val_int i -> Val_int (cast_fun i)
+ | _ -> Val_undef
+
+ (** Sign or 0 extensions from various bounded integers. *)
+ let cast8unsigned = cast (ValInt.zero_ext 8)
+ let cast8signed = cast (ValInt.sign_ext 8)
+ let cast16unsigned = cast (ValInt.zero_ext 16)
+ let cast16signed = cast (ValInt.sign_ext 16)
+ let cast32 = cast (ValInt.zero_ext 32)
+
+
+ let unary_int_op f = function
+ | Val_int i -> Val_int (f i)
+ | _ -> Val_undef
+
+ let binary_int_op f v1 v2 = match v1, v2 with
+ | Val_int i1, Val_int i2 -> Val_int (f i1 i2)
+ | _ -> Val_undef
+
+ let negint = unary_int_op ValInt.neg
+
+ let notbool v =
+ if is_true v then val_false
+ else
+ if is_false v then val_true
+ else Val_undef
+
+ let notint = unary_int_op ValInt.lognot
+
+ let cmpl = unary_int_op ValInt.lognot
+
+ (** [add_and_of v1 v2] returns the sum of [v1] and [v2], and whether this sum
+ overflows. *)
+ let add_and_of v1 v2 = match v1, v2 with
+ | Val_int i1, Val_int i2 ->
+ (Val_int (ValInt.add i1 i2), of_bool (ValInt.add_of i1 i2))
+ | Val_int i, Val_ptr (b, off)
+ | Val_ptr (b, off), Val_int i ->
+ let i = ValOffset.cast i in
+ (Val_ptr (b, ValOffset.add off i), of_bool (ValOffset.add_of off i))
+ | _, _ -> (Val_undef, Val_undef)
+
+ let add v1 v2 = fst (add_and_of v1 v2)
+ let add_of v1 v2 = snd (add_and_of v1 v2)
+
+ let succ v = add v (Val_int ValInt.one)
+
+ (** [sub_and_uf v1 v2] returns the substraction of [v1] and [v2], and whether
+ this substraction underflows. *)
+ let sub_and_uf v1 v2 = match v1, v2 with
+ | Val_int i1, Val_int i2 ->
+ (Val_int (ValInt.sub i1 i2), of_bool (ValInt.sub_uf i1 i2))
+ | Val_ptr (b, off), Val_int i ->
+ let i = ValOffset.cast i in
+ (Val_ptr (b, ValOffset.sub off i), of_bool (ValOffset.sub_uf off i))
+ | Val_ptr (b1, off1), Val_ptr (b2, off2) when ValBlock.eq b1 b2 ->
+ (Val_int (ValInt.cast (ValOffset.sub off1 off2)),
+ of_bool (ValOffset.sub_uf off1 off2))
+ | _, _ -> (Val_undef, Val_undef)
+
+ let sub v1 v2 = fst (sub_and_uf v1 v2)
+ let sub_uf v1 v2 = snd (sub_and_uf v1 v2)
+
+ let pred v = sub v (Val_int ValInt.one)
+
+ let mul = binary_int_op ValInt.mul
+
+ let is_zero = function
+ | Val_int i when ValInt.eq i ValInt.zero -> true
+ | _ -> false
+
+ let error_if_zero op v1 v2 =
+ if is_zero v2 then error "Division by zero."
+ else binary_int_op op v1 v2
+
+ let div = error_if_zero ValInt.div
+ let divu = error_if_zero ValInt.divu
+ let modulo = error_if_zero ValInt.modulo
+ let modulou = error_if_zero ValInt.modulou
+
+ let and_op = binary_int_op ValInt.logand
+ let or_op = binary_int_op ValInt.logor
+ let xor = binary_int_op ValInt.logxor
+ let shl = binary_int_op ValInt.shl
+ let shr = binary_int_op ValInt.shr
+ let shru = binary_int_op ValInt.shrl
+
+ let ext sh v n m =
+ let n = n * 8 in
+ let m = m * 8 in
+ let real_size = D.int_size * 8 in
+ let int_sh sh v n = sh v (of_int n) in
+ if n >= m then
+ if m = real_size then v
+ else modulou v (shl one (of_int m))
+ else
+ let v = int_sh shl v (real_size - n) in
+ let v = int_sh sh v (m - n) in
+ int_sh shru v (real_size - m)
+
+ let zero_ext = ext shru
+ let sign_ext = ext shr
+
+ let cmp f_int f_off v1 v2 = match v1, v2 with
+ | Val_int i1, Val_int i2 -> of_bool (f_int i1 i2)
+ | Val_ptr (b1, off1), Val_ptr (b2, off2) when ValBlock.eq b1 b2 ->
+ of_bool (f_off off1 off2)
+ | _ -> Val_undef
+
+ let cmp_eq = cmp ValInt.eq ValOffset.eq
+ let cmp_ne = cmp ValInt.neq ValOffset.neq
+ let cmp_lt = cmp ValInt.lt ValOffset.lt
+ let cmp_ge = cmp ValInt.ge ValOffset.ge
+ let cmp_le = cmp ValInt.le ValOffset.le
+ let cmp_gt = cmp ValInt.gt ValOffset.gt
+
+ let cmp_eq_u = cmp ValInt.eq ValOffset.eq
+ let cmp_ne_u = cmp ValInt.neq ValOffset.neq
+ let cmp_lt_u = cmp ValInt.ltu ValOffset.ltu
+ let cmp_ge_u = cmp ValInt.geu ValOffset.geu
+ let cmp_le_u = cmp ValInt.leu ValOffset.leu
+ let cmp_gt_u = cmp ValInt.gtu ValOffset.gtu
+
+
+ (* The memory is based on byte values. In order to be able to fit a bigger
+ integer or pointer value in memory, we need to be able to break this value
+ into several values of size a byte. An integer will be broken into multiple
+ 8 bits integers. A pointer will be broken into several couples of 8 bits
+ blocks and 8 bits offsets. *)
+
+ module Int8 = IntValue.Int8
+
+ (* 8 bits integers *)
+ module IntChunk = Int8
+ (* 8 bits blocks *)
+ module BlockChunk = Int8
+ (* 8 bits offsets *)
+ module OffsetChunk = Int8
+
+ (** A chunk is a part of a value that has the size of a memory cell. *)
+
+ type chunk =
+ | Byte_int of IntChunk.t
+ | Byte_ptr of BlockChunk.t * OffsetChunk.t
+ | Byte_undef
+
+ let string_of_chunk = function
+ | Byte_int i -> IntChunk.to_string i
+ | Byte_ptr (b, off) ->
+ "BPtr(" ^ (BlockChunk.to_string b) ^ ", " ^
+ (OffsetChunk.to_string off) ^ ")"
+ | Byte_undef -> "Bundef"
+
+ let undef_byte = Byte_undef
+
+ let is_undef_byte = function
+ | Byte_undef -> true
+ | _ -> false
+
+ let break_and_cast break cast x n =
+ let ys = break x n in
+ List.map cast ys
+
+ (** [break v] cuts [v] in chunks that each fits into a memory cell. In the
+ resulting list, the first element is the low bits, and the last is the
+ high bits (little endian representation). *)
+ let break v =
+ let nb_chunks = D.int_size in
+ match v with
+ | Val_ptr (b, off) ->
+ let bbs = break_and_cast ValBlock.break BlockChunk.cast b nb_chunks in
+ let boffs =
+ break_and_cast ValOffset.break OffsetChunk.cast off nb_chunks in
+ List.map2 (fun bb boff -> Byte_ptr (bb, boff)) bbs boffs
+ | Val_int i ->
+ let bis = break_and_cast ValInt.break IntChunk.cast i nb_chunks in
+ List.map (fun i' -> Byte_int i') bis
+ | _ -> MiscPottier.make Byte_undef nb_chunks
+
+ (** [all_are_pointers l] returns [true] iff the values in the list [l] all are
+ pointers. *)
+ let all_are_pointers =
+ let f b v = b && (match v with Byte_ptr _ -> true | _ -> false) in
+ List.fold_left f true
+
+ (** [all_are_integers l] returns [true] iff the values in the list [l] all are
+ integers. *)
+ let all_are_integers =
+ let f b v = b && (match v with Byte_int _ -> true | _ -> false) in
+ List.fold_left f true
+
+ let bblock_of_chunk = function
+ | Byte_ptr (b, _) -> b
+ | _ -> assert false (* do not use on this argument *)
+
+ let boffset_of_chunk = function
+ | Byte_ptr (_, off) -> off
+ | _ -> assert false (* do not use on this argument *)
+
+ let bint_of_chunk = function
+ | Byte_int i -> i
+ | _ -> assert false (* do not use on this argument *)
+
+ let cast_and_merge cast merge transform l =
+ merge (List.map (fun x -> cast (transform x)) l)
+
+ (** [merge l] creates the value where the first element of [l] is its low
+ bits, etc, and the last element of [l] is its high bits (little endian
+ representation). *)
+ let merge = function
+ | l when all_are_pointers l ->
+ let b = cast_and_merge ValBlock.cast ValBlock.merge bblock_of_chunk l in
+ let off =
+ cast_and_merge ValOffset.cast ValOffset.merge boffset_of_chunk l in
+ Val_ptr (b, off)
+ | l when all_are_integers l ->
+ Val_int (cast_and_merge ValInt.cast ValInt.merge bint_of_chunk l)
+ | _ -> Val_undef
+
+
+ (** Addresses from the memory point of view. *)
+
+ (** Some architectures have pointers bigger than integers. In this case, only
+ a chunk of pointer can fit into a machine register. Thus, an address is
+ represented by several values (little endian representation). *)
+
+ type address = t list
+
+ let string_of_address vs =
+ "[" ^ (MiscPottier.string_of_list " " to_string vs) ^ "]"
+
+
+ (** Addresses are represented by a block, i.e. a base address, and an offset
+ from this block. Both blocks and offsets are represented using bounded
+ integers. *)
+
+ let ptr_int_size = max (D.ptr_size / D.int_size) 1
+
+ module Block = IntValue.Make (struct let size = D.ptr_size end)
+ module Offset = IntValue.Make (struct let size = D.ptr_size end)
+
+ type mem_address = Block.t * Offset.t
+
+ let string_of_mem_address (b, off) =
+ Printf.sprintf "(%s, %s)" (Block.to_string b) (Offset.to_string off)
+
+ let is_mem_address =
+ let f b v = b && (match v with | Val_ptr _ -> true | _ -> false) in
+ List.fold_left f true
+
+ let of_mem_address (b, off) =
+ let bs = Block.break b ptr_int_size in
+ let offs = Offset.break off ptr_int_size in
+ let f b off = Val_ptr (ValBlock.cast b, ValOffset.cast off) in
+ List.map2 f bs offs
+
+ let decompose_Val_ptr = function
+ | Val_ptr (b, off) -> (b, off)
+ | _ -> error "Not an address."
+
+ let to_mem_address vs =
+ let (bs, offs) = List.split (List.map decompose_Val_ptr vs) in
+ let b = Block.merge (List.map Block.cast bs) in
+ let off = Offset.merge (List.map Offset.cast offs) in
+ (b, off)
+
+ let make_mem_address b off = (b, off)
+ let decompose_mem_address addr = addr
+ let block_of_address vs = fst (to_mem_address vs)
+ let offset_of_address vs = snd (to_mem_address vs)
+
+ let null = of_mem_address (Block.zero, Offset.zero)
+
+ let change_address_offset vs off =
+ let (b, _) = decompose_mem_address (to_mem_address vs) in
+ of_mem_address (make_mem_address b off)
+
+ let add_address vs off' =
+ let (b, off) = decompose_mem_address (to_mem_address vs) in
+ let off = Offset.add off off' in
+ of_mem_address (make_mem_address b off)
+
+ let eq_address addr1 addr2 =
+ let f b v1 v2 = b && (eq v1 v2) in
+ List.fold_left2 f true addr1 addr2
+
+end
--- /dev/null
+
+(** This module describes the values manipulated by high level languages. *)
+
+(** The representation of values depends on the size of integers and the size of
+ addresses. *)
+
+(** This is the signature of the parameter module. *)
+
+module type DATA_SIZE =
+sig
+ val int_size : int
+ val ptr_size : int
+end
+
+(** This is the signature of the module that provides types and functions to
+ manipulate values. *)
+
+module type S =
+sig
+
+ val int_size : int
+ val ptr_size : int
+
+ (** The type of values. A value may be: a bounded integer, a chunk of an
+ address (exactly an address when they have the same size as a machine
+ register), or undefined. *)
+ type t
+
+ val compare : t -> t -> int
+ val equal : t -> t -> bool
+ val eq : t -> t -> bool
+ val hash : t -> int
+ val to_string : t -> string
+
+ (* The functions of this module may raise a Failure exception when
+ trying to convert them to their various representation. *)
+
+ val is_int : t -> bool
+ val to_int : t -> int
+ val of_int : int -> t
+
+ val of_int_repr : IntValue.int_repr -> t
+ val to_int_repr : t -> IntValue.int_repr
+
+ val of_bool : bool -> t
+ val to_bool : t -> bool
+
+ val zero : t
+ val val_true : t
+ val val_false : t
+ val is_true : t -> bool
+ val is_false : t -> bool
+ val undef : t
+
+ (** The cast operations below returns the undefined value for non-integer
+ values. For integer values, it will return the integer value that
+ represents the same quantity, but using every bits (sign or zero
+ extension) of an integer value. For example, the function [cast8unsigned]
+ should be read as "cast from an 8 bits unsigned integer". *)
+ val cast8unsigned : t -> t
+ val cast8signed : t -> t
+ val cast16unsigned : t -> t
+ val cast16signed : t -> t
+ val cast32 : t -> t
+
+ (** [zero_ext v n m] performs a zero extension on [v] where [n] bytes are
+ significant to a value where [m] bytes are significant. *)
+ val zero_ext : t -> int -> int -> t
+ (** [sign_ext v n m] performs a sign extension on [v] where [n] bytes are
+ significant to a value where [m] bytes are significant. *)
+ val sign_ext : t -> int -> int -> t
+
+ (** Integer opposite *)
+ val negint : t -> t
+ (** Boolean negation *)
+ val notbool : t -> t
+ (** Bitwise not *)
+ val notint : t -> t
+
+ val succ : t -> t
+ val pred : t -> t
+ val cmpl : t -> t
+
+ (** [add_and_of v1 v2] returns the sum of [v1] and [v2], and whether this sum
+ overflows. *)
+ val add_and_of : t -> t -> (t * t)
+ val add : t -> t -> t
+ (** [add_of v1 v2] returns the [1] value if the sum of [v1] and [v2]
+ overflows, and [0] otherwise. *)
+ val add_of : t -> t -> t
+ (** [sub_and_uf v1 v2] returns the substraction of [v1] and [v2], and whether
+ this substraction underflows. *)
+ val sub_and_uf : t -> t -> (t * t)
+ val sub : t -> t -> t
+ (** [sub_uf v1 v2] returns the [1] value if the substraction of [v1] and [v2]
+ underflows, and [0] otherwise. *)
+ val sub_uf : t -> t -> t
+ val mul : t -> t -> t
+ val div : t -> t -> t
+ val divu : t -> t -> t
+ val modulo : t -> t -> t
+ val modulou : t -> t -> t
+ val and_op : t -> t -> t
+ val or_op : t -> t -> t
+ val xor : t -> t -> t
+ val shl : t -> t -> t
+ val shr : t -> t -> t
+ val shru : t -> t -> t
+
+ (** Signed comparisions *)
+ val cmp_eq : t -> t -> t
+ val cmp_ne : t -> t -> t
+ val cmp_lt : t -> t -> t
+ val cmp_ge : t -> t -> t
+ val cmp_le : t -> t -> t
+ val cmp_gt : t -> t -> t
+
+ (** Unsigned comparisions *)
+ val cmp_eq_u : t -> t -> t
+ val cmp_ne_u : t -> t -> t
+ val cmp_lt_u : t -> t -> t
+ val cmp_ge_u : t -> t -> t
+ val cmp_le_u : t -> t -> t
+ val cmp_gt_u : t -> t -> t
+
+ (** A chunk is a part of a value that has the size of a memory cell. *)
+
+ type chunk
+ val string_of_chunk : chunk -> string
+ val undef_byte : chunk
+ val is_undef_byte : chunk -> bool
+
+ (** [break v] cuts [v] in chunks that each fits into a memory cell. In the
+ resulting list, the first element is the low bits, and the last is the
+ high bits (little endian representation). *)
+ val break : t -> chunk list
+ (** [merge l] creates the value where the first element of [l] is its low
+ bits, etc, and the last element of [l] is its high bits (little endian
+ representation). *)
+ val merge : chunk list -> t
+
+ (** Addresses from interpreters point of view. *)
+
+ (** Some architectures have pointers bigger than integers. In this case, only
+ a chunk of pointer can fit into a machine register. Thus, an address is
+ represented by several values (little endian representation). *)
+
+ type address = t list
+ val string_of_address : address -> string
+ val null : address
+
+ (** Addresses from the memory point of view. *)
+
+ (** Addresses are represented by a block, i.e. a base address, and an offset
+ from this block. Both blocks and offsets are represented using bounded
+ integers. *)
+ module Block : IntValue.S
+ module Offset : IntValue.S
+
+ type mem_address
+ val string_of_mem_address : mem_address -> string
+
+ val is_mem_address : address -> bool
+
+ val of_mem_address : mem_address -> address
+ val to_mem_address : address -> mem_address
+ val make_mem_address : Block.t -> Offset.t -> mem_address
+ val decompose_mem_address : mem_address -> Block.t * Offset.t
+ val block_of_address : address -> Block.t
+ val offset_of_address : address -> Offset.t
+
+ val change_address_offset : address -> Offset.t -> address
+ val add_address : address -> Offset.t -> address
+ val eq_address : address -> address -> bool
+
+end
+
+
+(** The functor to create bounded values from a size and a signedness. *)
+
+module Make (D : DATA_SIZE) : S
--- /dev/null
+
+(** A playground function for developers where they can test very specific
+ functionalities not available in the compiler.
+ It is called with the -dev option.
+ [filenames] are the file names given in the command line when calling
+ acc. *)
+
+let do_dev_test (filenames : string list) : unit =
+
+ let main_lbl = "main" in
+ let exit_lbl = "exit" in
+ let lbl = "label" in
+
+ let code =
+ [(* Prelude *)
+ `Call main_lbl ; (* call main *)
+ `Label exit_lbl ; (* when coming back from main, do an infinite
+ jump here *)
+ `Jmp exit_lbl ;
+ (* Main *)
+ `Label main_lbl ;
+ `Mov (`DPTR, lbl) ; (* fetch the address of lbl in DPTR *)
+ (* Push the address of lbl on the stack. *)
+ `PUSH (I8051.reg_addr I8051.dpl) ; (* low bytes first *)
+ `PUSH (I8051.reg_addr I8051.dph) ; (* then high bytes *)
+ `RET ; (* this should jump to lbl, i.e. right below *)
+ `Label lbl ;
+ `RET (* jump to the exit label *)] in
+
+ (* Create a labelled ASM program with the code. *)
+ let prog =
+ { ASM.ppreamble = [] ;
+ ASM.pexit_label = exit_lbl ;
+ ASM.pcode = code ;
+ ASM.phas_main = true } in
+
+ (* Assemble it. *)
+ let prog = Languages.AstASM (ASMInterpret.assembly prog) in
+
+ (* Save the result in a fresh file prefixed by "yop" and whose extension is
+ "hex". *)
+ Languages.save false false "yop" "" prog
+
+(*
+ let f filename =
+ Printf.printf "Processing %s...\n%!" filename ;
+ let target = Languages.RTL in
+ let print = false in
+ let debug = true in
+ let interpret = true in
+ let p = Languages.parse Languages.Clight filename in
+ let p = Languages.add_runtime p in
+ let p = Languages.labelize p in
+ let ps = Languages.compile false Languages.Clight target p in
+ let f f' p = match Languages.language_of_ast p with
+ | l when l = target -> f' p
+ | _ -> ()
+ in
+ let actions =
+ [(print, Languages.save false false filename "") ;
+ (interpret, (fun p -> ignore (Languages.interpret debug p)))] in
+ List.iter (fun (b, f') -> if b then List.iter (f f') ps else ()) actions
+ in
+
+ List.iter f filenames
+*)
--- /dev/null
+
+(** This module defines the target architecture and instanciates the memory
+ functor for each intermediate language. *)
+
+module DataSize32 =
+struct
+ let alignment = Some 4
+ let int_size = 4
+ let ptr_size = 4
+end
+
+(* The target architecture: the Intel 8051. *)
+
+module TargetArch = I8051
+
+module Memory32 = Memory.Make (DataSize32)
+module MemoryTarget = Memory.Make (TargetArch)
+
+module ClightMemory = Memory32
+module CminorMemory = Memory32
+module RTLabsMemory = Memory32
+module RTLMemory = MemoryTarget
+module ERTLMemory = MemoryTarget
+module LTLMemory = MemoryTarget
+module LINMemory = MemoryTarget
--- /dev/null
+
+(** This module defines the target architecture and instanciates the memory
+ functor for each intermediate language. *)
+
+module TargetArch : Arch.S
+
+module ClightMemory : Memory.S
+module CminorMemory : Memory.S
+module RTLabsMemory : Memory.S
+module RTLMemory : Memory.S
+module ERTLMemory : Memory.S
+module LTLMemory : Memory.S
+module LINMemory : Memory.S
--- /dev/null
+type name =
+ | Clight
+ | Cminor
+ | RTLabs
+ | RTL
+ | ERTL
+ | LTL
+ | LIN
+ | ASM
+
+let strings = [
+ "Clight", Clight;
+ "Cminor", Cminor;
+ "RTLabs", RTLabs;
+ "RTL" , RTL;
+ "ERTL" , ERTL;
+ "LTL" , LTL;
+ "LIN" , LIN;
+ "ASM" , ASM;
+]
+
+let from_string s =
+ List.assoc s strings
+
+let to_string l =
+ List.assoc l (Misc.ListExt.inv_assoc strings)
+
+type ast =
+ | AstClight of Clight.program
+ | AstCminor of Cminor.program
+ | AstRTLabs of RTLabs.program
+ | AstRTL of RTL.program
+ | AstERTL of ERTL.program
+ | AstLTL of LTL.program
+ | AstLIN of LIN.program
+ | AstASM of ASM.program
+
+let language_of_ast = function
+ | AstClight _ -> Clight
+ | AstCminor _ -> Cminor
+ | AstRTLabs _ -> RTLabs
+ | AstRTL _ -> RTL
+ | AstERTL _ -> ERTL
+ | AstLTL _ -> LTL
+ | AstLIN _ -> LIN
+ | AstASM _ -> ASM
+
+let extension = function
+ | ASM -> ["s" ; "hex"]
+ | Clight -> ["c"]
+ | language -> [to_string language]
+
+type source = [
+ `Filename of string
+ | `Source of string * string
+]
+
+let parse ?is_lustre_file ?remove_lustre_externals = function
+ | Clight ->
+ fun source ->
+ AstClight
+ (ClightParser.process ?is_lustre_file ?remove_lustre_externals source)
+
+(*
+ | Cminor ->
+ fun filename ->
+ AstCminor
+ (SyntacticAnalysis.process
+ ~lexer_init: (fun filename -> Lexing.from_channel (open_in filename))
+ ~lexer_fun: CminorLexer.token
+ ~parser_fun: CminorParser.program
+ ~input: filename)
+*)
+
+ | _ ->
+ (* FIXME: Will be completed in the next commits. *)
+ assert false
+
+let print = function
+ | AstClight a -> ClightPrinter.print_program a
+ | AstCminor a -> CminorPrinter.print_program a
+ | AstRTLabs a -> RTLabsPrinter.print_program a
+ | AstRTL a -> RTLPrinter.print_program a
+ | AstERTL a -> ERTLPrinter.print_program a
+ | AstLTL a -> LTLPrinter.print_program a
+ | AstLIN a -> LINPrinter.print_program a
+ | AstASM a -> ASMPrinter.print_program a
+
+let labelize = function
+ | AstClight p ->
+ AstClight (ClightLabelling.add_cost_labels p)
+
+(*
+ | AstCminor p ->
+ AstCminor (CminorLabelling.add_cost_labels p)
+*)
+
+ | x ->
+ (* For the other languages, no labelling is defined. *)
+ x
+
+
+let clight_to_cminor = function
+ | AstClight p ->
+ AstCminor (ClightToCminor.translate p)
+ | _ -> assert false
+
+let cminor_to_rtlabs = function
+ | AstCminor p ->
+ AstRTLabs (CminorToRTLabs.translate p)
+ | _ -> assert false
+
+let rtlabs_to_rtl = function
+ | AstRTLabs p ->
+ AstRTL (RTLabsToRTL.translate p)
+ | _ -> assert false
+
+let rtl_to_ertl = function
+ | AstRTL p ->
+ AstERTL (RTLToERTL.translate p)
+ | _ -> assert false
+
+let ertl_to_ltl = function
+ | AstERTL p ->
+ AstLTL (ERTLToLTL.translate p)
+ | _ -> assert false
+
+let ltl_to_lin = function
+ | AstLTL p ->
+ AstLIN (LTLToLIN.translate p)
+ | _ -> assert false
+
+let lin_to_asm = function
+ | AstLIN p ->
+ AstASM (LINToASM.translate p)
+ | _ -> assert false
+
+(* We explicitly denote the compilation chain as a list of
+ passes that must be composed to translate a program
+ from a source language to a target language. *)
+let compilation_chain = [
+ (* Source language | Target language | Compilation function *)
+ Clight, Cminor, clight_to_cminor;
+ Cminor, RTLabs, cminor_to_rtlabs;
+ RTLabs, RTL, rtlabs_to_rtl;
+ RTL, ERTL, rtl_to_ertl;
+ ERTL, LTL, ertl_to_ltl;
+ LTL, LIN, ltl_to_lin;
+ LIN, ASM, lin_to_asm;
+]
+
+let compile debug src tgt =
+ (* Find the maximal suffix of the chain that starts with the
+ language [src]. *)
+ let rec subchain = function
+ | [] ->
+ (* The chain is assumed to be well-formed: such a suffix
+ exists. *)
+ assert false
+ | ((l, _, _) :: _) as chain when l = src -> chain
+ | _ :: chain -> subchain chain
+ in
+ (* Compose the atomic translations to build a compilation function
+ from [src] to [tgt]. Again, we assume that the compilation chain
+ is well-formed. Thus, if we cannot find [tgt] in the compilation
+ chain then the user must have made a mistake to ask for a
+ translation from [src] to [tgt]. *)
+ let rec compose iprogs src tgt chains ast =
+ if src = tgt then List.rev (ast :: iprogs)
+ else
+ match chains with
+ | [] ->
+ Error.global_error "During compilation configuration"
+ (Printf.sprintf "It is not possible to compile from `%s' to `%s'."
+ (to_string src)
+ (to_string tgt))
+
+ | (l1, l2, src_to_l2) :: chain ->
+ assert (l1 = src);
+ let l2_to_tgt = compose iprogs l2 tgt chain in
+ let iprog =
+ Misc.Timed.profile
+ (Printf.sprintf "%s -> %s"
+ (to_string l1)
+ (to_string l2))
+ src_to_l2 ast
+ in
+ ast :: l2_to_tgt iprog
+ in
+ compose [] src tgt (subchain compilation_chain)
+
+
+(** [add_runtime ast] adds runtime functions for the operations not supported by
+ the target processor. *)
+let add_runtime = function
+ | AstClight p ->
+ AstClight (Runtime.replace_unsupported (ClightSwitch.simplify p))
+ | x ->
+ (* For the other languages, no runtime functios are defined. *)
+ x
+
+
+let compute_costs = function
+ | AstClight p ->
+ (* Computing costs on Clight programs cannot be done directly
+ because the control-flow is not explicit. Yet, for
+ incremental construction and test of the compiler, we
+ build a stupid mapping from labels to costs for a Clight
+ program that gives cost 1 to every label. *)
+ CostLabel.constant_map (ClightAnnotator.cost_labels p) 1
+
+ | AstCminor p ->
+ (* Computing costs on Cminor programs cannot be done directly
+ because the control-flow is not explicit. Yet, for
+ incremental construction and test of the compiler, we
+ build a stupid mapping from labels to costs for a Cminor
+ program that gives cost 1 to every label. *)
+ CostLabel.constant_map (CminorAnnotator.cost_labels p) 1
+
+ | AstASM p ->
+ ASMCosts.compute p
+
+ | ast ->
+ Error.warning "during cost computing"
+ (Printf.sprintf
+ "Cost computing is not implemented for language `%s'. Please compile to ASM if you want to annotate the input."
+ (to_string (language_of_ast ast))) ;
+ CostLabel.Map.empty
+
+
+(* FIXME *)
+let instrument costs_mapping = function
+ | AstClight p ->
+ let (p', cost_id, cost_incr, extern_cost_variables) =
+ ClightAnnotator.instrument p costs_mapping in
+ (AstClight p', cost_id, cost_incr, extern_cost_variables)
+(*
+ | AstCminor p ->
+ let (p', cost_id, cost_incr) = CminorAnnotator.instrument p costs_mapping in
+ (AstCminor p', cost_id, cost_incr)
+*)
+ | p ->
+ Error.warning "during instrumentation"
+ (Printf.sprintf
+ "Instrumentation is not implemented for source language `%s'."
+ (to_string (language_of_ast p)));
+ (p, "", "", StringTools.Map.empty)
+
+let annotate input_ast final =
+ let costs_mapping = Misc.Timed.profile "Compute costs" compute_costs final in
+ Misc.Timed.profile "Instrument" (instrument costs_mapping) input_ast
+
+let string_output asm_pretty = function
+ | AstClight p ->
+ [ClightPrinter.print_program p]
+ | AstCminor p ->
+ [CminorPrinter.print_program p]
+ | AstRTLabs p ->
+ [RTLabsPrinter.print_program p]
+ | AstRTL p ->
+ [RTLPrinter.print_program p]
+ | AstERTL p ->
+ [ERTLPrinter.print_program p]
+ | AstLTL p ->
+ [LTLPrinter.print_program p]
+ | AstLIN p ->
+ [LINPrinter.print_program p]
+ | AstASM p ->
+ (if asm_pretty then [Pretty.print_program p]
+ else ["Pretty print not requested"]) @
+ [ASMPrinter.print_program p]
+
+let save asm_pretty exact_output filename suffix ast =
+ let ext_chopped_filename =
+ if exact_output then filename
+ else
+ try Filename.chop_extension filename
+ with Invalid_argument ("Filename.chop_extension") -> filename in
+ let ext_chopped_filename = ext_chopped_filename ^ suffix in
+ let ext_filenames =
+ List.map (fun ext -> ext_chopped_filename ^ "." ^ ext)
+ (extension (language_of_ast ast)) in
+ let output_filenames =
+ if exact_output then ext_filenames
+ else List.map Misc.SysExt.alternative ext_filenames in
+ let output_strings = string_output asm_pretty ast in
+ let f filename s =
+ let cout = open_out filename in
+ output_string cout s;
+ flush cout;
+ close_out cout in
+ List.iter2 f output_filenames output_strings
+
+let save_cost exact_name filename cost_id cost_incr extern_cost_variables =
+ let filename =
+ if exact_name then filename
+ else
+ try Filename.chop_extension filename
+ with Invalid_argument ("Filename.chop_extension") -> filename in
+ let cout = open_out (filename ^ ".cerco") in
+ let f fun_name cost_var =
+ output_string cout (fun_name ^ " " ^ cost_var ^ "\n") in
+ output_string cout (cost_id ^ "\n");
+ output_string cout (cost_incr ^ "\n");
+ StringTools.Map.iter f extern_cost_variables;
+ flush cout;
+ close_out cout
+
+let save_stack exact_name filename stack_id
+ stack_max_id stack_incr extern_stack_variables =
+ let filename =
+ if exact_name then filename
+ else
+ try Filename.chop_extension filename
+ with Invalid_argument ("Filename.chop_extension") -> filename in
+ let cout = open_out (filename ^ ".stack_cerco") in
+ let f fun_name stack_var =
+ output_string cout (fun_name ^ " " ^ stack_var ^ "\n") in
+ output_string cout (stack_id ^ "\n");
+ output_string cout (stack_max_id ^ "\n");
+ output_string cout (stack_incr ^ "\n");
+ StringTools.Map.iter f extern_stack_variables;
+ flush cout;
+ close_out cout
+
+
+let interpret debug = function
+ | AstClight p ->
+ ClightInterpret.interpret debug p
+ | AstCminor p ->
+ CminorInterpret.interpret debug p
+ | AstRTLabs p ->
+ RTLabsInterpret.interpret debug p
+ | AstRTL p ->
+ RTLInterpret.interpret debug p
+ | AstERTL p ->
+ ERTLInterpret.interpret debug p
+ | AstLTL p ->
+ LTLInterpret.interpret debug p
+ | AstLIN p ->
+ LINInterpret.interpret debug p
+ | AstASM p ->
+ ASMInterpret.interpret debug p
+
+let add_lustre_main
+ lustre_test lustre_test_cases lustre_test_cycles
+ lustre_test_min_int lustre_test_max_int = function
+ | AstClight p ->
+ AstClight
+ (ClightLustreMain.add lustre_test lustre_test_cases lustre_test_cycles
+ lustre_test_min_int lustre_test_max_int p)
+ | _ ->
+ Error.global_error "during main generation"
+ "Lustre testing is only available with C programs."
+
+
+
+
+(* FIXME *)
+let annotate_stack_size cost_incr = function
+ | AstClight p ->
+ let (p', stack_id, stack_max_id, stack_incr, extern_stack_variables) =
+ AnnotStackSize.instrument cost_incr p in
+ (AstClight p', stack_id, stack_max_id, stack_incr, extern_stack_variables)
+(*
+ | AstCminor p ->
+ let (p', stack_id, stack_incr) = CminorAnnotator.instrument p costs_mapping in
+ (AstCminor p', stack_id, stack_incr)
+*)
+ | p ->
+ Error.warning "during instrumentation"
+ (Printf.sprintf
+ "Instrumentation is not implemented for source language `%s'."
+ (to_string (language_of_ast p)));
+ (p, "", "", "", StringTools.Map.empty)
--- /dev/null
+(** This module defines the intermediate languages.
+
+ This is a dispatching module that is aware of the whole
+ compilation chain. It can also be used as an homogeneous way to
+ deal with the intermediate languages functionalities.
+*)
+
+
+type name =
+ | Clight
+ | Cminor
+ | RTLabs
+ | RTL
+ | ERTL
+ | LTL
+ | LIN
+ | ASM
+
+(** {2 Abstract syntax trees} *)
+
+(** The types of abstract syntax trees of each language. *)
+type ast =
+ | AstClight of Clight.program
+ | AstCminor of Cminor.program
+ | AstRTLabs of RTLabs.program
+ | AstRTL of RTL.program
+ | AstERTL of ERTL.program
+ | AstLTL of LTL.program
+ | AstLIN of LIN.program
+ | AstASM of ASM.program
+
+(** [language_of_ast ast] returns the programming language of the
+ abstract syntax tree [ast]. *)
+val language_of_ast : ast -> name
+
+(** A source code can be loaded from a file or given in a string. *)
+type source = [
+ `Filename of string
+ | `Source of string * string
+]
+
+(** [parse ?is_lustre_file ?remove_lustre_externals name] returns the parsing
+ function of the language [name]. *)
+val parse : ?is_lustre_file:bool -> ?remove_lustre_externals:bool ->
+ name -> source -> ast
+
+(** [print a] pretty prints an AST. *)
+val print : ast -> string
+
+(** {2 Compilation} *)
+
+(** [compile debug l1 l2] returns the compilation function that
+ translates the language [l1] to the language [l2]. This may be the
+ composition of several compilation functions. If [debug] is
+ [true], all the intermediate programs are inserted in the
+ output. *)
+val compile : bool -> name -> name -> (ast -> ast list)
+
+(** [add_runtime ast] adds runtime functions for the operations not supported by
+ the target processor. *)
+val add_runtime : ast -> ast
+
+(** {2 Annotation}
+
+ Labelling consists in the insertion of so-called "cost labels"
+ which are useful control points in order to compute costs.
+
+ The annotation process first computes cost of constant-time
+ execution path starting from each cost label on the lowest-level
+ language. Then, it instruments the (high-level) source code with
+ these computed costs.
+*)
+
+(** [labelize ast] inserts cost labels in the program [ast]. *)
+val labelize : ast -> ast
+
+(** [annotate input_ast target_ast] inserts cost annotations into the input AST
+ from the (final) target AST. It also returns the name of the cost variable,
+ the name of the cost increment function, and a the name of a fresh
+ uninitialized global variable for each external function. *)
+val annotate : ast -> ast -> (ast * string * string * string StringTools.Map.t)
+
+val annotate_stack_size :
+ string -> ast -> (ast * string * string * string * string StringTools.Map.t)
+
+(** [interpret debug ast] runs the program [ast] from the default initial
+ configuration. This interpretation may emit some cost labels. *)
+val interpret : bool -> ast -> AST.trace
+
+(** {2 Serialization} *)
+
+(** [save asm_pretty exact_output filename suffix input_ast] prints [input_ast]
+ in a file whose name is prefixed by [filename], suffixed by [suffix] and
+ whose extension is deduced from the language of the AST. If [exact_output]
+ is false then the written file will be fresh. If [asm_pretty] is true, then
+ an additional pretty-printed assembly file is output. *)
+val save : bool -> bool -> string -> string -> ast -> unit
+
+(** [save_cost exact_name filename cost_id cost_incr extern_cost_variables]
+ prints the name [cost_id] of the cost variable, then the name [cost_incr] of
+ the cost increment function, and the entries of the mapping
+ [extern_cost_variables] (key first, then binding, seperated by a space) in a
+ separate line in the file prefixed by [filename] and extended with
+ ".cost". If the file already exists, it is overwritten. *)
+val save_cost : bool -> string -> string -> string ->
+ string StringTools.Map.t -> unit
+
+val save_stack : bool -> string -> string -> string -> string ->
+ string StringTools.Map.t -> unit
+
+
+(** [from_string s] parses [s] as an intermediate language name. *)
+val from_string : string -> name
+
+(** [to_string n] prints [n] as a string. *)
+val to_string : name -> string
+
+(** [add_lustre_main lustre_test lustre_test_cases lustre_test_cycles
+ lustre_test_min_int lustre_test_max_int ast] adds a main function that tests
+ a Lustre step function to a Clight AST. The file [lustre_test] contains
+ CerCo information (e.g. the name of the cost variable). The integer
+ [lustre_test_cases] is the number of test cases that are performed, and the
+ integer [lustre_test_cycles] is the number of cycles per test
+ case. [lustre_test_min_int] (resp. [lustre_test_max_int]) is the minimum
+ (resp. maximum) integer value randomly generated during testing, and. *)
+val add_lustre_main : string -> int -> int -> int -> int -> ast -> ast
--- /dev/null
+open Misc.ArgExt
+
+let web_mode = ref false
+let is_web_mode () = !web_mode
+let set_web_mode () = web_mode := true
+
+let default_choice = "default"
+let option_settings_step = "during option settings"
+
+let language_from_string kind default s =
+ try
+ Languages.from_string s
+ with Not_found ->
+ if s = default_choice then
+ default
+ else
+ Error.global_error option_settings_step
+ (Printf.sprintf "`%s' is not a valid %s language." s kind)
+
+let source_language_of_string = language_from_string "source" Languages.Clight
+let source_language = ref (source_language_of_string default_choice)
+let set_source_language s = source_language := source_language_of_string s
+let get_source_language () = !source_language
+
+let target_language_of_string = language_from_string "target" Languages.ASM
+let target_language = ref (target_language_of_string default_choice)
+let set_target_language s = target_language := target_language_of_string s
+let get_target_language () = !target_language
+
+let input_files = ref []
+let add_input_file f = input_files := f :: !input_files
+let input_files () = !input_files
+
+let output_files = ref None
+let set_output_files s = output_files := Some s
+let get_output_files () = !output_files
+
+let annotation_flag = ref false
+let request_annotation = (:=) annotation_flag
+let annotation_requested () = !annotation_flag
+
+let interpretation_flag = ref false
+let request_interpretation = (:=) interpretation_flag
+let interpretation_requested () = !interpretation_flag
+
+let interpretations_flag = ref false
+let request_interpretations = (:=) interpretations_flag
+let interpretations_requested () = !interpretations_flag
+
+let debug_flag = ref false
+let set_debug = (:=) debug_flag
+let is_debug_enabled () = !debug_flag
+
+let asm_pretty_flag = ref false
+let set_asm_pretty = (:=) asm_pretty_flag
+let is_asm_pretty () = !asm_pretty_flag
+
+let lustre_flag = ref false
+let set_lustre_file = (:=) lustre_flag
+let is_lustre_file () = !lustre_flag
+
+let remove_lustre_externals = ref false
+let set_remove_lustre_externals = (:=) remove_lustre_externals
+let is_remove_lustre_externals () = !remove_lustre_externals
+
+let lustre_test = ref None
+let set_lustre_test s = lustre_test := Some s
+let get_lustre_test () = !lustre_test
+
+let lustre_test_cases = ref 100
+let set_lustre_test_cases = (:=) lustre_test_cases
+let get_lustre_test_cases () = !lustre_test_cases
+
+let lustre_test_cycles = ref 100
+let set_lustre_test_cycles = (:=) lustre_test_cycles
+let get_lustre_test_cycles () = !lustre_test_cycles
+
+let lustre_test_min_int = ref (-1000)
+let set_lustre_test_min_int = (:=) lustre_test_min_int
+let get_lustre_test_min_int () = !lustre_test_min_int
+
+let lustre_test_max_int = ref 1000
+let set_lustre_test_max_int = (:=) lustre_test_max_int
+let get_lustre_test_max_int () = !lustre_test_max_int
+
+(*
+let print_result_flag = ref false
+let set_print_result = (:=) print_result_flag
+let is_print_result_enabled () = !print_result_flag
+*)
+
+let dev_test = ref false
+let set_dev_test = (:=) dev_test
+let is_dev_test_enabled () = !dev_test
+
+let options = OptionsParsing.register [
+(*
+ "-s", Arg.String set_source_language,
+ " Choose the source language between:";
+ extra_doc " Clight, Cminor";
+ extra_doc " [default is C]";
+*)
+
+ "-l", Arg.String set_target_language,
+ " Choose the target language between:";
+ extra_doc " Clight, Cminor, RTLabs, RTL, ERTL, LTL, LIN, ASM";
+ extra_doc " [default is ASM]";
+
+ "-a", Arg.Set annotation_flag,
+ " Add cost annotations on the source code.";
+
+ "-i", Arg.Set interpretation_flag,
+ " Interpret the compiled code.";
+
+ "-is", Arg.Set interpretations_flag,
+ " Interpret all the compilation passes.";
+
+ "-d", Arg.Set debug_flag,
+ " Debug mode.";
+ extra_doc " Outputs all the passes up to the target language.";
+ extra_doc " Combined with an interpret option, shows the trace";
+ extra_doc " of execution states.";
+
+ "-o", Arg.String set_output_files,
+ " Prefix of the output files.";
+
+ "-asm-pretty", Arg.Set asm_pretty_flag,
+ " Output a pretty-printed assembly file.";
+
+ "-lustre", Arg.Set lustre_flag,
+ " Input file is a Lustre file.";
+
+ "-remove-lustre-externals", Arg.Set remove_lustre_externals,
+ " Remove Lustre externals.";
+
+ "-lustre-test", Arg.String set_lustre_test,
+ " Input file is a Lustre file, testing requested.";
+
+ "-lustre-test-cases", Arg.Int set_lustre_test_cases,
+ " Set the number of test cases when testing a Lustre";
+ extra_doc " file.";
+ extra_doc " [default is 100]";
+
+ "-lustre-test-cycles", Arg.Int set_lustre_test_cycles,
+ " Set the number of cycles for each case when testing";
+ extra_doc " a Lustre file.";
+ extra_doc " [default is 100]";
+
+ "-lustre-test-min-int", Arg.Int set_lustre_test_min_int,
+ " Random int minimum value when testing a Lustre file.";
+ extra_doc " [default is -1000]";
+
+ "-lustre-test-max-int", Arg.Int set_lustre_test_max_int,
+ " Random int maximum value when testing a Lustre file.";
+ extra_doc " [default is 1000]";
+
+(*
+ "-res", Arg.Set print_result_flag,
+ " Print the result of interpretations.";
+*)
+
+ "-dev", Arg.Set dev_test,
+ " Playground for developers.";
+]
--- /dev/null
+(** This module defines the compiler general options. *)
+
+(** {2 Source language} *)
+val set_source_language : string -> unit
+val get_source_language : unit -> Languages.name
+
+(** {2 Target language} *)
+val set_target_language : string -> unit
+val get_target_language : unit -> Languages.name
+
+(** {2 Interpretation request} *)
+val request_interpretation : bool -> unit
+val interpretation_requested : unit -> bool
+
+(** {2 Interpretation requests} *)
+val request_interpretations : bool -> unit
+val interpretations_requested : unit -> bool
+
+(** {2 Annotation requests} *)
+val request_annotation : bool -> unit
+val annotation_requested : unit -> bool
+
+(** {2 Input files} *)
+val add_input_file : string -> unit
+val input_files : unit -> string list
+
+(** {2 Output files} *)
+val set_output_files : string -> unit
+val get_output_files : unit -> string option
+
+(** {2 Verbose mode} *)
+val is_debug_enabled : unit -> bool
+
+(** {2 Assembly pretty print} *)
+val set_asm_pretty : bool -> unit
+val is_asm_pretty : unit -> bool
+
+(** {2 Lustre file} *)
+val set_lustre_file : bool -> unit
+val is_lustre_file : unit -> bool
+
+(** {2 Remove Lustre externals} *)
+val set_remove_lustre_externals : bool -> unit
+val is_remove_lustre_externals : unit -> bool
+
+(** {2 Lustre file and test requested} *)
+val set_lustre_test : string -> unit
+val get_lustre_test : unit -> string option
+
+(** {2 Lustre file: number of test cases} *)
+val set_lustre_test_cases : int -> unit
+val get_lustre_test_cases : unit -> int
+
+(** {2 Lustre file: number of cycles for each case} *)
+val set_lustre_test_cycles : int -> unit
+val get_lustre_test_cycles : unit -> int
+
+(** {2 Lustre file: random int minimum value} *)
+val set_lustre_test_min_int : int -> unit
+val get_lustre_test_min_int : unit -> int
+
+(** {2 Lustre file: random int maximum value} *)
+val set_lustre_test_max_int : int -> unit
+val get_lustre_test_max_int : unit -> int
+
+(*
+(** {2 Print results requests} *)
+val is_print_result_enabled : unit -> bool
+*)
+
+(** {2 Developers' playground} *)
+val is_dev_test_enabled : unit -> bool
+
+(** {2 Web application} *)
+val set_web_mode : unit -> unit
+val is_web_mode : unit -> bool
--- /dev/null
+(**************************************************************************)
+(* *)
+(* Fix *)
+(* *)
+(* Author: François Pottier, INRIA Paris-Rocquencourt *)
+(* Version: 20091201 *)
+(* *)
+(* The copyright to this code is held by Institut National de Recherche *)
+(* en Informatique et en Automatique (INRIA). All rights reserved. This *)
+(* file is distributed under the license CeCILL-C (see file LICENSE). *)
+(* *)
+(**************************************************************************)
+
+(* -------------------------------------------------------------------------- *)
+
+(* Maps. *)
+
+(* We require imperative maps, that is, maps that can be updated in place.
+ An implementation of persistent maps, such as the one offered by ocaml's
+ standard library, can easily be turned into an implementation of imperative
+ maps, so this is a weak requirement. *)
+
+module type IMPERATIVE_MAPS = sig
+ type key
+ type 'data t
+ val create: unit -> 'data t
+ val clear: 'data t -> unit
+ val add: key -> 'data -> 'data t -> unit
+ val find: key -> 'data t -> 'data
+ val iter: (key -> 'data -> unit) -> 'data t -> unit
+end
+
+(* -------------------------------------------------------------------------- *)
+
+(* Properties. *)
+
+(* Properties must form a partial order, equipped with a least element, and
+ must satisfy the ascending chain condition: every monotone sequence
+ eventually stabilizes. *)
+
+(* [is_maximal] determines whether a property [p] is maximal with respect to
+ the partial order. Only a conservative check is required: in any event, it
+ is permitted for [is_maximal p] to return [false]. If [is_maximal p]
+ returns [true], then [p] must have no upper bound other than itself. In
+ particular, if properties form a lattice, then [p] must be the top
+ element. This feature, not described in the paper, enables a couple of
+ minor optimizations. *)
+
+module type PROPERTY = sig
+ type property
+ val bottom: property
+ val equal: property -> property -> bool
+ val is_maximal: property -> bool
+end
+
+(* -------------------------------------------------------------------------- *)
+
+(* The dynamic dependency graph. *)
+
+(* An edge from [node1] to [node2] means that [node1] depends on [node2], or
+ (equivalently) that [node1] observes [node2]. Then, an update of the
+ current property at [node2] causes a signal to be sent to [node1]. A node
+ can observe itself. *)
+
+(* This module could be placed in a separate file, but is included here in
+ order to make [Fix] self-contained. *)
+
+module Graph : sig
+
+ (* This module provides a data structure for maintaining and modifying
+ a directed graph. Each node is allowed to carry a piece of client
+ data. There are functions for creating a new node, looking up a
+ node's data, looking up a node's predecessors, and setting or
+ clearing a node's successors (all at once). *)
+ type 'data node
+
+ (* [create data] creates a new node, with no incident edges, with
+ client information [data]. Time complexity: constant. *)
+ val create: 'data -> 'data node
+
+ (* [data node] returns the client information associated with
+ the node [node]. Time complexity: constant. *)
+ val data: 'data node -> 'data
+
+ (* [predecessors node] returns a list of [node]'s predecessors.
+ Amortized time complexity: linear in the length of the output
+ list. *)
+ val predecessors: 'data node -> 'data node list
+
+ (* [set_successors src dsts] creates an edge from the node [src] to
+ each of the nodes in the list [dsts]. Duplicate elements in the
+ list [dsts] are removed, so that no duplicate edges are created. It
+ is assumed that [src] initially has no successors. Time complexity:
+ linear in the length of the input list. *)
+ val set_successors: 'data node -> 'data node list -> unit
+
+ (* [clear_successors node] removes all of [node]'s outgoing edges.
+ Time complexity: linear in the number of edges that are removed. *)
+ val clear_successors: 'data node -> unit
+
+ (* That's it. *)
+end
+= struct
+
+ (* Using doubly-linked adjacency lists, one could implement [predecessors]
+ in worst-case linear time with respect to the length of the output list,
+ [set_successors] in worst-case linear time with respect to the length of
+ the input list, and [clear_successors] in worst-case linear time with
+ respect to the number of edges that are removed. We use a simpler
+ implementation, based on singly-linked adjacency lists, with deferred
+ removal of edges. It achieves the same complexity bounds, except
+ [predecessors] only offers an amortized complexity bound. This is good
+ enough for our purposes, and, in practice, is more efficient by a
+ constant factor. This simplification was suggested by Arthur
+ Charguéraud. *)
+
+ type 'data node = {
+
+ (* The client information associated with this node. *)
+
+ data: 'data;
+
+ (* This node's incoming and outgoing edges. *)
+
+ mutable outgoing: 'data edge list;
+ mutable incoming: 'data edge list;
+
+ (* A transient mark, always set to [false], except when checking
+ against duplicate elements in a successor list. *)
+
+ mutable marked: bool;
+
+ }
+
+ and 'data edge = {
+
+ (* This edge's nodes. Edges are symmetric: source and destination
+ are not distinguished. Thus, an edge appears both in the outgoing
+ edge list of its source node and in the incoming edge list of its
+ destination node. This allows edges to be easily marked as
+ destroyed. *)
+
+ node1: 'data node;
+ node2: 'data node;
+
+ (* Edges that are destroyed are marked as such, but are not
+ immediately removed from the adjacency lists. *)
+
+ mutable destroyed: bool;
+
+ }
+
+ let create (data : 'data) : 'data node = {
+ data = data;
+ outgoing = [];
+ incoming = [];
+ marked = false;
+ }
+
+ let data (node : 'data node) : 'data =
+ node.data
+
+ (* [follow src edge] returns the node that is connected to [src]
+ by [edge]. Time complexity: constant. *)
+
+ let follow src edge =
+ if edge.node1 == src then
+ edge.node2
+ else begin
+ assert (edge.node2 == src);
+ edge.node1
+ end
+
+ (* The [predecessors] function removes edges that have been marked
+ destroyed. The cost of removing these has already been paid for,
+ so the amortized time complexity of [predecessors] is linear in
+ the length of the output list. *)
+
+ let predecessors (node : 'data node) : 'data node list =
+ let predecessors = List.filter (fun edge -> not edge.destroyed) node.incoming in
+ node.incoming <- predecessors;
+ List.map (follow node) predecessors
+
+ (* [link src dst] creates a new edge from [src] to [dst], together
+ with its reverse edge. Time complexity: constant. *)
+
+ let link (src : 'data node) (dst : 'data node) : unit =
+ let edge = {
+ node1 = src;
+ node2 = dst;
+ destroyed = false;
+ } in
+ src.outgoing <- edge :: src.outgoing;
+ dst.incoming <- edge :: dst.incoming
+
+ let set_successors (src : 'data node) (dsts : 'data node list) : unit =
+ assert (src.outgoing = []);
+ let rec loop = function
+ | [] ->
+ ()
+ | dst :: dsts ->
+ if dst.marked then
+ loop dsts (* skip duplicate elements *)
+ else begin
+ dst.marked <- true;
+ link src dst;
+ loop dsts;
+ dst.marked <- false
+ end
+ in
+ loop dsts
+
+ let clear_successors (node : 'data node) : unit =
+ List.iter (fun edge ->
+ assert (not edge.destroyed);
+ edge.destroyed <- true;
+ ) node.outgoing;
+ node.outgoing <- []
+
+end
+
+(* -------------------------------------------------------------------------- *)
+
+(* The code is parametric in an implementation of maps over variables and in
+ an implementation of properties. *)
+
+module Make
+ (M : IMPERATIVE_MAPS)
+ (P : PROPERTY)
+= struct
+
+type variable =
+ M.key
+
+type property =
+ P.property
+
+type valuation =
+ variable -> property
+
+type rhs =
+ valuation -> property
+
+type equations =
+ variable -> rhs
+
+(* -------------------------------------------------------------------------- *)
+
+(* Data. *)
+
+(* Each node in the dependency graph carries information about a fixed
+ variable [v]. *)
+
+type node =
+ data Graph.node
+
+and data = {
+
+ (* This is the result of the application of [rhs] to the variable [v]. It
+ must be stored in order to guarantee that this application is performed
+ at most once. *)
+ rhs: rhs;
+
+ (* This is the current property at [v]. It evolves monotonically with
+ time. *)
+ mutable property: property;
+
+ (* That's it! *)
+}
+
+(* [property node] returns the current property at [node]. *)
+
+let property node =
+ (Graph.data node).property
+
+(* -------------------------------------------------------------------------- *)
+
+(* Many definitions must be made within the body of the function [lfp].
+ For greater syntactic convenience, we place them in a local module. *)
+
+let lfp (eqs : equations) : valuation =
+ let module LFP = struct
+
+(* -------------------------------------------------------------------------- *)
+
+(* The workset. *)
+
+(* When the algorithm is inactive, the workset is empty. *)
+
+(* Our workset is based on a Queue, but it could just as well be based on a
+ Stack. A textual replacement is possible. It could also be based on a
+ priority queue, provided a sensible way of assigning priorities could
+ be found. *)
+
+module Workset : sig
+
+ (* [insert node] inserts [node] into the workset. [node] must have no
+ successors. *)
+ val insert: node -> unit
+
+ (* [repeat f] repeatedly applies [f] to a node extracted out of the
+ workset, until the workset becomes empty. [f] is allowed to use
+ [insert]. *)
+ val repeat: (node -> unit) -> unit
+
+ (* That's it! *)
+end
+= struct
+
+ (* Initialize the workset. *)
+
+ let workset =
+ Queue.create()
+
+ let insert node =
+ Queue.push node workset
+
+ let repeat f =
+ while not (Queue.is_empty workset) do
+ f (Queue.pop workset)
+ done
+
+end
+
+(* -------------------------------------------------------------------------- *)
+
+(* Signals. *)
+
+(* A node in the workset has no successors. (It can have predecessors.) In
+ other words, a predecessor (an observer) of some node is never in the
+ workset. Furthermore, a node never appears twice in the workset. *)
+
+(* When a variable broadcasts a signal, all of its predecessors (observers)
+ receive the signal. Any variable that receives the signal loses all of its
+ successors (that is, it ceases to observe anything) and is inserted into
+ the workset. This preserves the above invariant. *)
+
+let signal subject =
+ List.iter (fun observer ->
+ Graph.clear_successors observer;
+ Workset.insert observer
+ ) (Graph.predecessors subject)
+ (* At this point, [subject] has no predecessors. This plays no role in
+ the correctness proof, though. *)
+
+(* -------------------------------------------------------------------------- *)
+
+(* Tables. *)
+
+(* The permanent table maps variables that have reached a fixed point
+ to properties. It persists forever. *)
+
+let permanent : property M.t =
+ M.create()
+
+(* The transient table maps variables that have not yet reached a
+ fixed point to nodes. (A node contains not only a property, but
+ also a memoized right-hand side, and carries edges.) At the
+ beginning of a run, it is empty. It fills up during a run. At the
+ end of a run, it is copied into the permanent table and cleared. *)
+
+let transient : node M.t =
+ M.create()
+
+(* [freeze()] copies the transient table into the permanent table, and
+ empties the transient table. This allows all nodes to be reclaimed
+ by the garbage collector. *)
+
+let freeze () =
+ M.iter (fun v node ->
+ M.add v (property node) permanent
+ ) transient;
+ M.clear transient
+
+(* -------------------------------------------------------------------------- *)
+
+(* Workset processing. *)
+
+
+(* [solve node] re-evaluates the right-hand side at [node]. If this leads to
+ a change, then the current property is updated, and [node] emits a signal
+ towards its observers. *)
+
+(* When [solve node] is invoked, [node] has no subjects. Indeed, when [solve]
+ is invoked by [node_for], [node] is newly created; when [solve] is invoked by
+ [Workset.repeat], [node] has just been extracted out of the workset, and a
+ node in the workset has no subjects. *)
+
+(* [node] must not be in the workset. *)
+
+(* In short, when [solve node] is invoked, [node] is neither awake nor asleep.
+ When [solve node] finishes, [node] is either awake or asleep again. (Chances
+ are, it is asleep, unless it is its own observer; then, it is awakened by the
+ final call to [signal node].) *)
+
+let rec solve (node : node) : unit =
+
+ (* Retrieve the data record carried by this node. *)
+ let data = Graph.data node in
+
+ (* Prepare to compute an updated value at this node. This is done by
+ invoking the client's right-hand side function. *)
+
+ (* The flag [alive] is used to prevent the client from invoking [request]
+ after this interaction phase is over. In theory, this dynamic check seems
+ required in order to argue that [request] behaves like a pure function.
+ In practice, this check is not very useful: only a bizarre client would
+ store a [request] function and invoke it after it has become stale. *)
+ let alive = ref true
+ and subjects = ref [] in
+
+ (* We supply the client with [request], a function that provides access to
+ the current valuation, and dynamically records dependencies. This yields
+ a set of dependencies that is correct by construction. *)
+ let request (v : variable) : property =
+ assert !alive;
+ try
+ M.find v permanent
+ with Not_found ->
+ let subject = node_for v in
+ let p = property subject in
+ if not (P.is_maximal p) then
+ subjects := subject :: !subjects;
+ p
+ in
+
+ (* Give control to the client. *)
+ let new_property = data.rhs request in
+
+ (* From now on, prevent any invocation of this instance of [request]
+ the client. *)
+ alive := false;
+
+ (* At this point, [node] has no subjects, as noted above. Thus, the
+ precondition of [set_successors] is met. We can install [data.subjects]
+ as the new set of subjects for this node. *)
+
+ (* If we have gathered no subjects in the list [data.subjects], then
+ this node must have stabilized. If [new_property] is maximal,
+ then this node must have stabilized. *)
+
+ (* If this node has stabilized, then it need not observe any more, so the
+ call to [set_successors] is skipped. In practice, this seems to be a
+ minor optimization. In the particular case where every node stabilizes at
+ the very first call to [rhs], this means that no edges are ever
+ built. This particular case is unlikely, as it means that we are just
+ doing memoization, not a true fixed point computation. *)
+
+ (* One could go further and note that, if this node has stabilized, then it
+ could immediately be taken out of the transient table and copied into the
+ permanent table. This would have the beneficial effect of allowing the
+ detection of further nodes that have stabilized. Furthermore, it would
+ enforce the property that no node in the transient table has a maximal
+ value, hence the call to [is_maximal] above would become useless. *)
+
+ if not (!subjects = [] || P.is_maximal new_property) then
+ Graph.set_successors node !subjects;
+
+ (* If the updated value differs from the previous value, record
+ the updated value and send a signal to all observers of [node]. *)
+ if not (P.equal data.property new_property) then begin
+ data.property <- new_property;
+ signal node
+ end
+ (* Note that equality of the two values does not imply that this node has
+ stabilized forever. *)
+
+(* -------------------------------------------------------------------------- *)
+
+(* [node_for v] returns the graph node associated with the variable [v]. It is
+ assumed that [v] does not appear in the permanent table. If [v] appears in
+ the transient table, the associated node is returned. Otherwise, [v] is a
+ newly discovered variable: a new node is created on the fly, and the
+ transient table is grown. The new node can either be inserted into the
+ workset (it is then awake) or handled immediately via a recursive call to
+ [solve] (it is then asleep, unless it observes itself). *)
+
+(* The recursive call to [solve node] can be replaced, if desired, by a call
+ to [Workset.insert node]. Using a recursive call to [solve] permits eager
+ top-down discovery of new nodes. This can save a constant factor, because
+ it allows new nodes to move directly from [bottom] to a good first
+ approximation, without sending any signals, since [node] has no observers
+ when [solve node] is invoked. In fact, if the dependency graph is acyclic,
+ the algorithm discovers nodes top-down, performs computation on the way
+ back up, and runs without ever inserting a node into the workset!
+ Unfortunately, this causes the stack to grow as deep as the longest path in
+ the dependency graph, which can blow up the stack. *)
+
+and node_for (v : variable) : node =
+ try
+ M.find v transient
+ with Not_found ->
+ let node = Graph.create { rhs = eqs v; property = P.bottom } in
+ (* Adding this node to the transient table prior to calling [solve]
+ recursively is mandatory, otherwise [solve] might loop, creating
+ an infinite number of nodes for the same variable. *)
+ M.add v node transient;
+ solve node; (* or: Workset.insert node *)
+ node
+
+(* -------------------------------------------------------------------------- *)
+
+(* Invocations of [get] trigger the fixed point computation. *)
+
+(* The flag [inactive] prevents reentrant calls by the client. *)
+
+let inactive =
+ ref true
+
+let get (v : variable) : property =
+ try
+ M.find v permanent
+ with Not_found ->
+ assert !inactive;
+ inactive := false;
+ let node = node_for v in
+ Workset.repeat solve;
+ freeze();
+ inactive := true;
+ property node
+
+(* -------------------------------------------------------------------------- *)
+
+(* Close the local module [LFP]. *)
+
+end
+in LFP.get
+
+end
--- /dev/null
+
+(** This module provides a generic algorithm to compute the least
+ solution of a system of monotonic equations. *)
+
+(**************************************************************************)
+(* *)
+(* Fix *)
+(* *)
+(* Author: François Pottier, INRIA Paris-Rocquencourt *)
+(* Version: 20091201 *)
+(* *)
+(* The copyright to this code is held by Institut National de Recherche *)
+(* en Informatique et en Automatique (INRIA). All rights reserved. This *)
+(* file is distributed under the license CeCILL-C (see file LICENSE). *)
+(* *)
+(**************************************************************************)
+
+(* This code is described in the paper ``Lazy Least Fixed Points in ML''. *)
+
+(* -------------------------------------------------------------------------- *)
+
+(* Maps. *)
+
+(* We require imperative maps, that is, maps that can be updated in place.
+ An implementation of persistent maps, such as the one offered by ocaml's
+ standard library, can easily be turned into an implementation of imperative
+ maps, so this is a weak requirement. *)
+
+module type IMPERATIVE_MAPS = sig
+ type key
+ type 'data t
+ val create: unit -> 'data t
+ val clear: 'data t -> unit
+ val add: key -> 'data -> 'data t -> unit
+ val find: key -> 'data t -> 'data
+ val iter: (key -> 'data -> unit) -> 'data t -> unit
+end
+
+(* -------------------------------------------------------------------------- *)
+
+(* Properties. *)
+
+(* Properties must form a partial order, equipped with a least element, and
+ must satisfy the ascending chain condition: every monotone sequence
+ eventually stabilizes. *)
+
+(* [is_maximal] determines whether a property [p] is maximal with respect to
+ the partial order. Only a conservative check is required: in any event, it
+ is permitted for [is_maximal p] to return [false]. If [is_maximal p]
+ returns [true], then [p] must have no upper bound other than itself. In
+ particular, if properties form a lattice, then [p] must be the top
+ element. This feature, not described in the paper, enables a couple of
+ minor optimizations. *)
+
+module type PROPERTY = sig
+ type property
+ val bottom: property
+ val equal: property -> property -> bool
+ val is_maximal: property -> bool
+end
+
+(* -------------------------------------------------------------------------- *)
+
+(* The code is parametric in an implementation of maps over variables and in
+ an implementation of properties. *)
+
+module Make
+ (M : IMPERATIVE_MAPS)
+ (P : PROPERTY)
+ : sig
+ type variable = M.key
+ type property = P.property
+
+ (* A valuation is a mapping of variables to properties. *)
+ type valuation = variable -> property
+
+ (* A right-hand side, when supplied with a valuation that gives
+ meaning to its free variables, evaluates to a property. More
+ precisely, a right-hand side is a monotone function of
+ valuations to properties. *)
+ type rhs = valuation -> property
+
+ (* A system of equations is a mapping of variables to right-hand
+ sides. *)
+ type equations = variable -> rhs
+
+ (* [lfp eqs] produces the least solution of the system of monotone
+ equations [eqs]. *)
+
+ (* It is guaranteed that, for each variable [v], the application [eqs v] is
+ performed at most once (whereas the right-hand side produced by this
+ application is, in general, evaluated multiple times). This guarantee can
+ be used to perform costly pre-computation, or memory allocation, when [eqs]
+ is applied to its first argument. *)
+
+ (* When [lfp] is applied to a system of equations [eqs], it performs no
+ actual computation. It produces a valuation, [get], which represents
+ the least solution of the system of equations. The actual fixed point
+ computation takes place, on demand, when [get] is applied. *)
+ val lfp: equations -> valuation
+ end
+
--- /dev/null
+
+module type OrderedType = sig
+ type t
+ val compare : t -> t -> int
+end
+
+
+module type S = sig
+
+ type a
+ type b
+ type t
+
+ val empty : t
+ val is_empty : t -> bool
+
+ val add1 : a -> b -> t -> t
+ val add2 : b -> a -> t -> t
+
+ val find1 : a -> t -> b
+ val find2 : b -> t -> a
+
+ val remove1 : a -> t -> t
+ val remove2 : b -> t -> t
+
+ val mem1 : a -> t -> bool
+ val mem2 : b -> t -> bool
+
+ val iter1 : (a -> b -> unit) -> t -> unit
+ val iter2 : (b -> a -> unit) -> t -> unit
+
+ val fold1 : (a -> b -> 'c -> 'c) -> t -> 'c -> 'c
+ val fold2 : (b -> a -> 'c -> 'c) -> t -> 'c -> 'c
+
+ val compare1 : (b -> b -> int) -> t -> t -> int
+ val compare2 : (a -> a -> int) -> t -> t -> int
+
+ val equal1 : (b -> b -> bool) -> t -> t -> bool
+ val equal2 : (a -> a -> bool) -> t -> t -> bool
+
+end
+
+
+module Make (O1 : OrderedType) (O2 : OrderedType) : S
+ with type a = O1.t and type b = O2.t = struct
+
+ module Map1 = Map.Make (O1)
+ module Map2 = Map.Make (O2)
+
+ type a = O1.t
+ type b = O2.t
+ type t = O2.t Map1.t * O1.t Map2.t
+
+ let eq1 a1 a2 = O1.compare a1 a2 = 0
+ let eq2 b1 b2 = O2.compare b1 b2 = 0
+
+ let empty = (Map1.empty, Map2.empty)
+ let is_empty (a_b, _) = Map1.is_empty a_b
+
+ let add1 a b (a_b, b_a) = (Map1.add a b a_b, Map2.add b a b_a)
+ let add2 b a (a_b, b_a) = (Map1.add a b a_b, Map2.add b a b_a)
+
+ let find1 a (a_b, _) = Map1.find a a_b
+ let find2 b (_, b_a) = Map2.find b b_a
+
+ let remove1 a (a_b, b_a) =
+ let f b' a' b_a' = if eq1 a' a then b_a' else Map2.add b' a' b_a' in
+ (Map1.remove a a_b, Map2.fold f b_a Map2.empty)
+
+ let remove2 b (a_b, b_a) =
+ let f a' b' a_b' = if eq2 b' b then a_b' else Map1.add a' b' a_b' in
+ (Map1.fold f a_b Map1.empty, Map2.remove b b_a)
+
+ let mem1 a (a_b, _) = Map1.mem a a_b
+ let mem2 b (_, b_a) = Map2.mem b b_a
+
+ let iter1 f (a_b, _) = Map1.iter f a_b
+ let iter2 f (_, b_a) = Map2.iter f b_a
+
+ let fold1 f (a_b, _) c = Map1.fold f a_b c
+ let fold2 f (_, b_a) c = Map2.fold f b_a c
+
+ let compare1 f (a_b1, _) (a_b2, _) = Map1.compare f a_b1 a_b2
+ let compare2 f (_, b_a1) (_, b_a2) = Map2.compare f b_a1 b_a2
+
+ let equal1 f (a_b1, _) (a_b2, _) = Map1.equal f a_b1 a_b2
+ let equal2 f (_, b_a1) (_, b_a2) = Map2.equal f b_a1 b_a2
+
+end
--- /dev/null
+(** This module implements a bi-directional finite map.
+*)
+
+module type OrderedType = sig
+ type t
+ val compare : t -> t -> int
+end
+
+module type S = sig
+
+ type a
+ type b
+ type t
+
+ val empty : t
+ val is_empty : t -> bool
+
+ val add1 : a -> b -> t -> t
+ val add2 : b -> a -> t -> t
+
+ val find1 : a -> t -> b
+ val find2 : b -> t -> a
+
+ val remove1 : a -> t -> t
+ val remove2 : b -> t -> t
+
+ val mem1 : a -> t -> bool
+ val mem2 : b -> t -> bool
+
+ val iter1 : (a -> b -> unit) -> t -> unit
+ val iter2 : (b -> a -> unit) -> t -> unit
+
+ val fold1 : (a -> b -> 'c -> 'c) -> t -> 'c -> 'c
+ val fold2 : (b -> a -> 'c -> 'c) -> t -> 'c -> 'c
+
+ val compare1 : (b -> b -> int) -> t -> t -> int
+ val compare2 : (a -> a -> int) -> t -> t -> int
+
+ val equal1 : (b -> b -> bool) -> t -> t -> bool
+ val equal2 : (a -> a -> bool) -> t -> t -> bool
+
+end
+
+module Make (O1 : OrderedType) (O2 : OrderedType) : S with type a = O1.t and
+ type b = O2.t
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+open ERTL
+open Interference
+open Printf
+
+(* ------------------------------------------------------------------------- *)
+(* Decisions. *)
+
+(* A decision is of the form either [Spill] -- the vertex could
+ not be colored and should be spilled into a stack slot -- or
+ [Color] -- the vertex was assigned a hardware register. *)
+
+type decision =
+ | Spill
+ | Color of I8051.register
+
+(* [print_decision] turns a decision into a string. *)
+
+let print_decision = function
+ | Spill ->
+ "spilled"
+ | Color hwr ->
+ Printf.sprintf "colored $%s" (I8051.print_register hwr)
+
+(* ------------------------------------------------------------------------- *)
+(* Colorings. *)
+
+(* A coloring is a partial function of graph vertices to decisions.
+ Vertices that are not in the domain of the coloring are waiting for
+ a decision to be made. *)
+
+type coloring =
+ decision Vertex.Map.t
+
+(* ------------------------------------------------------------------------- *)
+(* Sets of colors. *)
+
+module ColorSet =
+ I8051.RegisterSet
+
+(* [add_color coloring r colors] returns the union of the set [colors] with
+ the element [color], if the vertex [r] was assigned color [color], and
+ returns [colors] if [r] was spilled. *)
+
+let add_color coloring r colors =
+ match Vertex.Map.find r coloring with
+ | Spill ->
+ colors
+ | Color color ->
+ ColorSet.add color colors
+
+(* These are the colors that we work with. *)
+
+let colors : ColorSet.t =
+ I8051.allocatable
+
+(* This is the number of available colors. *)
+
+let k : int =
+ ColorSet.cardinal colors
+
+(* ------------------------------------------------------------------------- *)
+(* Choices of colors. *)
+
+(* [forbidden_colors graph coloring v] is the set of colors that cannot be
+ assigned to [v] considering [coloring], a coloring of every vertex in
+ [graph] except [v]. *)
+(* This takes into account [v]'s possible interferences with hardware
+ registers, which are viewed as forbidden colors. *)
+
+let forbidden_colors graph coloring v =
+ Vertex.Set.fold (add_color coloring) (ipp graph v) (iph graph v)
+
+(* ------------------------------------------------------------------------- *)
+(* Low and high vertices. *)
+
+(* A vertex is low (or insignificant) if its degree is less than [k].
+ It is high (or significant) otherwise. *)
+
+let high graph v =
+ degree graph v >= k
+
+(* [high_neighbors graph v] is the set of all high neighbors of [v]. *)
+
+let high_neighbors graph v =
+ Vertex.Set.filter (high graph) (ipp graph v)
+
+(* ------------------------------------------------------------------------- *)
+(* George's conservative coalescing criterion. *)
+
+(* According to this criterion, two vertices [a] and [b] can be
+ coalesced, suppressing [a] and keeping [b], if the following
+ two conditions hold:
+
+ 1. (pseudo-registers) every high neighbor of [a] is a neighbor of [b];
+ 2. (hardware registers) every hardware register that interferes with
+ [a] also interferes with [b].
+
+ This means that, after all low vertices have been removed, any color that
+ is suitable for [b] is also suitable for [a]. *)
+
+let georgepp graph (a, b) =
+ Vertex.Set.subset (high_neighbors graph a) (ipp graph b) &&
+ I8051.RegisterSet.subset (iph graph a) (iph graph b)
+
+(* According to this criterion, a vertex [a] and a hardware register
+ [c] can be coalesced (that is, [a] can be assigned color [c]) if
+ every high neighbor of [a] interferes with [c]. *)
+
+let georgeph graph (a, c) =
+ Vertex.Set.fold (fun neighbor accu ->
+ accu &&
+ I8051.RegisterSet.mem c (iph graph neighbor)
+ ) (high_neighbors graph a) true
+
+(* ------------------------------------------------------------------------- *)
+(* Here is the coloring algorithm. *)
+
+module Color (G : sig
+
+ val graph: graph
+ val uses: Register.t -> int
+ val verbose: bool
+
+end) = struct
+
+ (* The cost function heuristically evaluates how much it might cost
+ to spill vertex [v]. Here, the cost is the ratio of the number of
+ uses of the pseudo-registers represented by [v] by the degree of
+ [v]. One could also take into account the number of nested loops
+ that the uses appear within, but that is not done here. *)
+
+ let cost graph v =
+ let uses =
+ Register.Set.fold (fun r uses ->
+ G.uses r + uses
+ ) (registers graph v) 0
+ in
+ (float_of_int uses) /. (float_of_int (degree graph v))
+
+ (* The algorithm maintains a transformed graph as it runs. It is
+ obtained from the original graph by removing, coalescing, and
+ freezing vertices. *)
+
+ (* Each of the functions that follow returns a coloring of the graph
+ that it is passed. These functions correspond to the various
+ states of the algorithm (simplification, coalescing, freezing,
+ spilling, selection). The function [simplification] is the
+ initial state. *)
+
+ (* [simplification] removes non-move-related nodes of low degree. *)
+
+ let rec simplification graph : coloring =
+
+ match lowest_non_move_related graph with
+
+ | Some (v, d) when d < k ->
+
+ (* We found a non-move-related node [v] of low degree. Color
+ the rest of the graph, then color [v]. This is what I call
+ selection. *)
+
+ if G.verbose then
+ printf "Simplifying low vertex: %s.\n%!" (print_vertex graph v);
+
+ selection graph v
+
+ | _ ->
+
+ (* There are no non-move-related nodes of low degree.
+ Could not simplify further. Start coalescing. *)
+
+ coalescing graph
+
+ (* [coalescing] looks for a preference edge that can be collapsed.
+ It is called after [simplification], so it is known, at this
+ point, that all nodes of low degree are move-related. *)
+
+ and coalescing graph : coloring =
+
+ (* Find a preference edge between two vertices that passes
+ George's criterion.
+
+ [pppick] examines all preference edges in the graph, so its use
+ is inefficient. It would be more efficient instead to examine
+ only areas of the graph that have changed recently. More
+ precisely, it is useless to re-examine a preference edge that
+ did not pass George's criterion the last time it was examined
+ and whose neighborhood has not been modified by simplification,
+ coalescing or freezing. Indeed, in that case, and with a
+ sufficiently large definition of ``neighborhood'', this edge is
+ guaranteed to again fail George's criterion. It would be
+ possible to modify the [Interference.graph] data structure so
+ as to keep track of which neighborhoods have been modified and
+ provide a specialized, more efficient version of [pppick]. This
+ is not done here. *)
+
+ match pppick graph (georgepp graph) with
+
+ | Some (a, b) ->
+
+ if G.verbose then
+ printf "Coalescing %s with %s.\n%!" (print_vertex graph a) (print_vertex graph b);
+
+ (* Coalesce [a] with [b] and color the remaining graph. *)
+
+ let coloring = simplification (coalesce graph a b) in
+
+ (* Assign [a] the same color as [b]. *)
+
+ Vertex.Map.add a (Vertex.Map.find b coloring) coloring
+
+ | None ->
+
+ (* Find a preference edge between a vertex and a hardware
+ register that passes George's criterion. Like [pppick],
+ [phpick] is slow. *)
+
+ match phpick graph (georgeph graph) with
+
+ | Some (a, c) ->
+
+ if G.verbose then
+ printf "Coalescing %s with $%s.\n%!" (print_vertex graph a) (I8051.print_register c);
+
+ (* Coalesce [a] with [c] and color the remaining graph. *)
+
+ let coloring = simplification (coalesceh graph a c) in
+
+ (* Assign [a] the color [c]. *)
+
+ Vertex.Map.add a (Color c) coloring
+
+ | None ->
+
+ (* Could not coalesce further. Start freezing. *)
+
+ freezing graph
+
+ (* [freezing] begins after [simplification] and [coalescing] are
+ finished, so it is known, at this point, that all nodes of low
+ degree are move-related and no coalescing is possible. [freezing]
+ looks for a node of low degree (which must be move-related) and
+ removes the preference edges that it carries. This potentially
+ opens new opportunities for simplification and coalescing. *)
+
+ and freezing graph : coloring =
+
+ match lowest graph with
+
+ | Some (v, d) when d < k ->
+
+ (* We found a move-related node [v] of low degree.
+ Freeze it and start over. *)
+
+ if G.verbose then
+ printf "Freezing low vertex: %s.\n%!" (print_vertex graph v);
+
+ simplification (freeze graph v)
+
+ | _ ->
+
+ (* Could not freeze further. Start spilling. *)
+
+ spilling graph
+
+ (* [spilling] begins after [simplification], [coalescing], and
+ [freezing] are finished, so it is known, at this point, that
+ there are no nodes of low degree.
+
+ Thus, we are facing a potential spill. However, we do optimistic
+ coloring: we do not spill a vertex right away, but proceed
+ normally, just as if we were doing simplification. So, we pick a
+ vertex [v], remove it, and check whether a color can be assigned
+ to [v] only after coloring what remains of the graph.
+
+ It is crucial to pick a vertex that has few uses in the code. It
+ would also be good to pick one that has high degree, as this will
+ help color the rest of the graph. Thus, we pick a vertex that has
+ minimum cost, where the cost is obtained as the ratio of the
+ number of uses of the pseudo-registers represented by this vertex
+ in the code by the degree of the vertex. One could also take into
+ account the number of nested loops that the uses appear within,
+ but that is not done here.
+
+ The use of [minimum] is inefficient, because this function
+ examines all vertices in the graph. It would be possible to
+ augment the [Interference.graph] data structure so as to keep
+ track of the cost associated with each vertex and provide
+ efficient access to a minimum cost vertex. This is not done
+ here. *)
+
+ and spilling graph : coloring =
+
+ match minimum (cost graph) graph with
+ | Some v ->
+
+ if G.verbose then
+ printf "Spilling high vertex: %s.\n%!" (print_vertex graph v);
+
+ selection graph v
+
+ | None ->
+
+ (* The graph is empty. Return an empty coloring. *)
+
+ Vertex.Map.empty
+
+ (* [selection] removes the vertex [v] from the graph, colors the
+ remaining graph, then selects a color for [v].
+
+ If [v] is low, that is, if [v] has degree less than [k], then at
+ least one color must still be available for [v], regardless of
+ how the remaining graph was colored.
+
+ If [v] was a potential spill, then it is not certain that a color
+ is still available. If one is, though, then we are rewarded for
+ being optimistic. If none is, then [v] becomes an actual
+ spill. *)
+
+ and selection graph v : coloring =
+
+ (* Remove [v] from the graph and color what remains. *)
+
+ let coloring = simplification (remove graph v) in
+
+ (* Determine which colors are allowed. *)
+
+ let allowed = ColorSet.diff colors (forbidden_colors graph coloring v) in
+
+ (* Make a decision.
+
+ We pick a color randomly among those that are allowed. One could
+ attempt to use biased coloring, that is, to pick a color that seems
+ desirable (or not undesirable) according to the preference edges
+ found in the initial graph. But that is probably not worth the
+ trouble. *)
+
+ let decision =
+ try
+ Color (ColorSet.choose allowed)
+ with Not_found ->
+ Spill
+ in
+
+ if G.verbose then
+ printf "Decision concerning %s: %s.\n%!" (print_vertex graph v) (print_decision decision);
+
+ (* Record our decision and return. *)
+
+ Vertex.Map.add v decision coloring
+
+ (* Run the algorithm. *)
+
+ let coloring =
+ simplification G.graph
+
+end
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(** This module performs graph coloring. It is used for register
+ allocation. *)
+
+(* A coloring is a partial function of graph vertices to decisions,
+ where a decision is of the form either [Spill] -- the vertex could
+ not be colored and should be spilled into a stack slot -- or
+ [Color] -- the vertex was assigned a hardware register. Vertices
+ that are not in the domain of the coloring are waiting for a
+ decision to be made. *)
+
+type decision =
+ | Spill
+ | Color of I8051.register
+
+type coloring =
+ decision Interference.Vertex.Map.t
+
+(* Here is the coloring algorithm. Out of an interference graph, it
+ produces a coloring. The client should provide information about
+ the number of uses of each pseudo-register; the higher the number,
+ the more undesirable it is to spill that pseudo-register. If the
+ [verbose] flag is set, the algorithm prints information messages to
+ the standard output channel. *)
+
+module Color (G : sig
+
+ val graph: Interference.graph
+ val uses: Register.t -> int
+ val verbose: bool
+
+end) : sig
+
+ val coloring: coloring
+
+end
+
--- /dev/null
+
+type t = { buffer : Buffer.t ; formatter : Format.formatter }
+
+let buffer eformat = eformat.buffer
+let formatter eformat = eformat.formatter
+
+let make buffer formatter = { buffer ; formatter }
+
+let create () =
+ let buffer = Buffer.create 512 in
+ let formatter = Format.formatter_of_buffer buffer in
+ make buffer formatter
+
+let printf eformat = Format.fprintf (formatter eformat)
+
+let get eformat =
+ printf eformat "@?" ;
+ Buffer.contents (buffer eformat)
--- /dev/null
+
+type t
+
+val create : unit -> t
+val get : t -> string
+val printf : t -> ('a, Format.formatter, unit) format -> 'a
--- /dev/null
+let exit_flag = ref true
+
+let exit_if_error () = exit_flag := true
+
+let resume_if_error () = exit_flag := false
+
+exception Error of Position.t list * string
+
+let print_error positions msg =
+ Printf.sprintf "%s%s"
+ (String.concat "\n"
+ (List.map (fun p -> Position.string_of_pos p ^": ") positions))
+ msg
+
+let error_alert positions msg =
+ if !exit_flag then (
+ output_string stderr (print_error positions msg);
+ exit 1
+ )
+ else raise (Error (positions, msg))
+
+let global_error kind msg =
+ error_alert [] (Printf.sprintf "Global Error (%s):\n %s\n" kind msg)
+
+let error kind pos msg =
+ error_alert [pos] (Printf.sprintf "Error (%s):\n %s\n" kind msg)
+
+let error2 kind pos1 pos2 msg =
+ error_alert [pos1; pos2] (Printf.sprintf "Error (%s):\n %s\n" kind msg)
+
+let warning kind msg =
+ let mem_flag = !exit_flag in
+ exit_flag := false;
+ (try
+ error_alert [] (Printf.sprintf "Warning (%s):\n %s\n" kind msg)
+ with Error (positions, msg) ->
+ output_string stderr (print_error positions msg));
+ exit_flag := mem_flag
--- /dev/null
+(** This module provides a uniform way of reporting (located) error message. *)
+
+(** [exit_if_error ()] forces the program to stop if an error is encountered.
+ (This is the default behavior.) *)
+val exit_if_error: unit -> unit
+
+(** [resume_if_error ()] makes the program throw the exception {!Error}
+ if an error is encountered. *)
+val resume_if_error: unit -> unit
+
+exception Error of Position.t list * string
+
+(** [print_error positions msg] formats an error message. *)
+val print_error : Position.t list -> string -> string
+
+(** [error k p msg] prints [msg] with [k] as a message prefix and stops
+ the program. *)
+val error : string -> Position.t -> string -> 'a
+
+(** [error2 k p1 p2 msg] prints two positions instead of one. *)
+val error2 : string -> Position.t -> Position.t -> string -> 'a
+
+(** [global_error k msg] prints [msg] with [k] as a message prefix and stops
+ the program. *)
+val global_error : string -> string -> 'a
+
+(** [warning k msg] prints [msg] with [k] as a message prefix, but do
+ not stop the program. *)
+val warning : string -> string -> unit
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(* This module implements a data structure for interference graphs.
+ It provides functions that help construct, transform and inspect
+ interference graphs. *)
+
+(* ------------------------------------------------------------------------- *)
+
+(* Vertices are represented as integers. We need sets of vertices, maps over
+ vertices, maps of vertices to nonempty sets of vertices, maps of vertices
+ to nonempty sets of hardware registers, and priority sets over vertices. *)
+
+module Vertex = struct
+
+ module V = struct
+ type t = int
+ let compare = compare
+ end
+
+ include V
+
+ module Set = Set.Make(V)
+
+ module Map = MyMap.Make(V)
+
+end
+
+module VertexSetMap =
+ SetMap.MakeHomo(Vertex.Set)(Vertex.Map)
+
+module I8051RegisterSetMap =
+ SetMap.MakeHetero(I8051.RegisterSet)(Vertex.Map)
+
+module PrioritySet =
+ PrioritySet.Make(Vertex)
+
+(* ------------------------------------------------------------------------- *)
+
+(* Each vertex maps to a set of pseudo-registers, which initially is a
+ singleton set, but can grow due to coalescing. Conversely, each
+ pseudo-register maps to a single vertex. *)
+
+module RegMap : sig
+
+ type t
+
+ (* [empty] is the empty map. *)
+
+ val empty: t
+
+ (* [forward] maps a vertex to a set of pseudo-registers. *)
+
+ val forward: Vertex.t -> t -> Register.Set.t
+
+ (* [backward] maps a pseudo-register to a vertex. *)
+
+ val backward: Register.t -> t -> Vertex.t
+
+ (* [add r v m] adds a relation between pseudo-register [r] and
+ vertex [v], both of which are assumed fresh. *)
+
+ val add: Register.t -> Vertex.t -> t -> t
+
+ (* [fold f m accu] folds over all vertices. *)
+
+ val fold: (Vertex.t -> Register.Set.t -> 'a -> 'a) -> t -> 'a -> 'a
+
+ (* [coalesce x y m] coalesces vertices [x] and [y]. Vertex [x] is
+ removed and the pseudo-registers associated with it become
+ associated with [y] instead. *)
+
+ val coalesce: Vertex.t -> Vertex.t -> t -> t
+
+ (* [remove x m] removes vertex [x]. The pseudo-registers associated
+ with [x] disappear. *)
+
+ val remove: Vertex.t -> t -> t
+
+ (* [restrict] keeps only those vertices that satisfy predicate [p]. *)
+
+ val restrict: (Vertex.t -> bool) -> t -> t
+
+end = struct
+
+ type t = {
+ forward: Register.Set.t Vertex.Map.t;
+ backward: Vertex.t Register.Map.t
+ }
+
+ let empty = {
+ forward = Vertex.Map.empty;
+ backward = Register.Map.empty
+ }
+
+ let forward v m =
+ Vertex.Map.find v m.forward
+
+ let backward r m =
+ try
+ Register.Map.find r m.backward
+ with Not_found ->
+ assert false (* bad pseudo-register *)
+
+ let add r v m = {
+ forward = Vertex.Map.add v (Register.Set.singleton r) m.forward;
+ backward = Register.Map.add r v m.backward
+ }
+
+ let fold f m accu =
+ Vertex.Map.fold f m.forward accu
+
+ let coalesce x y m =
+ let rx, forward = Vertex.Map.find_remove x m.forward in
+ let forward = Vertex.Map.update y (Register.Set.union rx) forward in
+ let backward =
+ Register.Set.fold (fun r backward ->
+ Register.Map.add r y backward
+ ) rx m.backward
+ in
+ {
+ forward = forward;
+ backward = backward
+ }
+
+ let remove x m =
+ let rx, forward = Vertex.Map.find_remove x m.forward in
+ let backward = Register.Set.fold Register.Map.remove rx m.backward in
+ {
+ forward = forward;
+ backward = backward
+ }
+
+ let restrict p m = {
+ forward = Vertex.Map.restrict p m.forward;
+ backward = Register.Map.restrict (fun r -> p (backward r m)) m.backward
+ }
+
+end
+
+(* ------------------------------------------------------------------------- *)
+
+(* Graphs. *)
+
+type graph = {
+
+ (* A two-way correspondence between vertices and pseudo-registers.
+ This data structure is also used to keep a record of the set of
+ all vertices. *)
+
+ regmap: RegMap.t;
+
+ (* Interference edges between two vertices: ``these two vertices
+ cannot receive the same color''. *)
+
+ ivv: VertexSetMap.t;
+
+ (* Interference edges between a vertex and a hardware register:
+ ``this vertex cannot receive this color''. *)
+
+ ivh: I8051RegisterSetMap.t;
+
+ (* Preference edges between two vertices: ``these two vertices
+ should preferably receive the same color''. *)
+
+ pvv: VertexSetMap.t;
+
+ (* Preference edges between a vertex and a hardware register:
+ ``this vertex should preferably receive this color''. *)
+
+ pvh: I8051RegisterSetMap.t;
+
+ (* The degree of each vertex [v], that is, the number of vertices
+ and hardware registers that [v] interferes with, is recorded at
+ all times. We use a ``priority set'' so as to be able to
+ efficiently find a vertex of minimum degree. *)
+
+ degree: PrioritySet.t;
+
+ (* The degree of each *non-move-related* vertex [v]. This
+ information is partially redundant with the [degree] field
+ above. It is nevertheless required in order to be able to
+ efficiently find a *non-move-related* vertex of minimum
+ degree. *)
+
+ nmr: PrioritySet.t;
+
+ }
+
+(* ------------------------------------------------------------------------- *)
+
+(* Our graphs are made up of two subgraphs: the subgraph formed by the
+ interference edges alone and the one formed by the preference edges
+ alone.
+
+ In order to allow more code sharing, we define functions that allow
+ dealing with a single subgraph at a time. They provide operations
+ such as inspecting the neighbors of a vertex, adding edges,
+ removing edges, coalescing two vertices, removing a vertex, etc.
+
+ We first define functions that deal with a ``generic'' subgraph,
+ then (via inheritance) specialize them to deal with the
+ interference subgraph and the preference subgraph with their
+ specific features. *)
+
+class virtual subgraph = object (self)
+
+ (* These methods provide access to the fields of the [graph] data
+ structure that define the subgraph of interest. All data is
+ stored in the [graph] data structure. The object [self] has no
+ state and holds no data. *)
+
+ method virtual getvv: graph -> VertexSetMap.t
+ method virtual setvv: graph -> VertexSetMap.t -> graph
+ method virtual getvh: graph -> I8051RegisterSetMap.t
+ method virtual setvh: graph -> I8051RegisterSetMap.t -> graph
+
+ (* Accessing the neighbors of a vertex and testing whether edges
+ exist. *)
+
+ method neighborsv graph v =
+ VertexSetMap.find v (self#getvv graph)
+
+ method existsvv graph v1 v2 =
+ Vertex.Set.mem v1 (self#neighborsv graph v2)
+
+ method neighborsh graph v =
+ I8051RegisterSetMap.find v (self#getvh graph)
+
+ method existsvh graph v h =
+ I8051.RegisterSet.mem h (self#neighborsh graph v)
+
+ (* [degree graph v] is the degree of vertex [v] with respect to the
+ subgraph. *)
+
+ method degree graph v =
+ Vertex.Set.cardinal (self#neighborsv graph v) + I8051.RegisterSet.cardinal (self#neighborsh graph v)
+
+ (* [hwregs graph] is the set of all hardware registers mentioned in
+ the subgraph. *)
+
+ method hwregs graph =
+ let union _ = I8051.RegisterSet.union in
+ Vertex.Map.fold union (self#getvh graph) I8051.RegisterSet.empty
+
+ (* [iter graph fvv fvh] iterates over all edges in the subgraph.
+ Vertex-to-vertex edges are presented only once. *)
+
+ method iter graph fvv fvh =
+ Vertex.Map.iter (fun vertex neighbors ->
+ Vertex.Set.iter (fun neighbor ->
+ if vertex < neighbor then
+ fvv vertex neighbor
+ ) neighbors
+ ) (self#getvv graph);
+ Vertex.Map.iter (fun vertex neighbors ->
+ I8051.RegisterSet.iter (fun neighbor ->
+ fvh vertex neighbor
+ ) neighbors
+ ) (self#getvh graph)
+
+ (* [mkvv graph v1 v2] adds an edge between vertices [v1] and [v2]. *)
+
+ method mkvv graph v1 v2 =
+ if v1 = v2 then
+ graph (* avoid creating self-edge *)
+ else if self#existsvv graph v1 v2 then
+ graph (* avoid re-adding an existing edge *)
+ else
+ self#mkvvi graph v1 v2
+
+ method mkvvi graph v1 v2 =
+ self#setvv graph (VertexSetMap.mkbiedge v1 v2 (self#getvv graph))
+
+ (* [rmvv graph v1 v2] removes an edge between vertices [v1] and [v2].
+ [rmvvifx] removes an edge if it exists. *)
+
+ method rmvv graph v1 v2 =
+ assert (self#existsvv graph v1 v2);
+ self#setvv graph (VertexSetMap.rmbiedge v1 v2 (self#getvv graph))
+
+ method rmvvifx graph v1 v2 =
+ if self#existsvv graph v1 v2 then
+ self#rmvv graph v1 v2
+ else
+ graph
+
+ (* [mkvh graph v h] adds an edge between vertex [v] and hardware
+ register [h]. *)
+
+ method mkvh graph v h =
+ if self#existsvh graph v h then
+ graph (* avoid re-adding an existing edge *)
+ else
+ self#mkvhi graph v h
+
+ method mkvhi graph v h =
+ self#setvh graph (I8051RegisterSetMap.update v (I8051.RegisterSet.add h) (self#getvh graph))
+
+ (* [rmvh v h] removes an edge between vertex [v] and hardware
+ register [h]. [rmvhifx] removes an edge if it exists. *)
+
+ method rmvh graph v h =
+ assert (self#existsvh graph v h);
+ self#setvh graph (I8051RegisterSetMap.update v (I8051.RegisterSet.remove h) (self#getvh graph))
+
+ method rmvhifx graph v h =
+ if self#existsvh graph v h then
+ self#rmvh graph v h
+ else
+ graph
+
+ (* [coalesce graph x y] turns every neighbor [w] or [h] of [x] into
+ a neighbor of [y] instead. [w] ranges over both vertices and
+ hardware registers. *)
+
+ method coalesce graph x y =
+ let graph =
+ Vertex.Set.fold (fun w graph ->
+ self#mkvv (self#rmvv graph x w) y w
+ ) (self#neighborsv graph x) graph
+ in
+ let graph =
+ I8051.RegisterSet.fold (fun h graph ->
+ self#mkvh (self#rmvh graph x h) y h
+ ) (self#neighborsh graph x) graph
+ in
+ graph
+
+ (* [coalesceh graph x h] turns every neighbor [w] of [x] into a
+ neighbor of [h] instead. [w] ranges over both vertices and
+ hardware registers. Edges between two hardware registers are not
+ recorded. *)
+
+ method coalesceh graph x h =
+ let graph =
+ Vertex.Set.fold (fun w graph ->
+ self#mkvh (self#rmvv graph x w) w h
+ ) (self#neighborsv graph x) graph
+ in
+ let graph =
+ I8051.RegisterSet.fold (fun k graph ->
+ self#rmvh graph x k
+ ) (self#neighborsh graph x) graph
+ in
+ graph
+
+ (* [remove graph x] removes all edges carried by vertex [x]. *)
+
+ method remove graph x =
+ let graph =
+ Vertex.Set.fold (fun w graph ->
+ self#rmvv graph x w
+ ) (self#neighborsv graph x) graph
+ in
+ let graph =
+ I8051.RegisterSet.fold (fun h graph ->
+ self#rmvh graph x h
+ ) (self#neighborsh graph x) graph
+ in
+ graph
+
+end
+
+(* ------------------------------------------------------------------------- *)
+
+(* The interference subgraph.
+
+ This is a subgraph with the following specific features: (1) the
+ degree of every vertex is recorded in the [degree] field of the
+ [graph] data structure; (2) the degree of every non-move-related
+ vertex is recorded in the [nmr] field of the [graph] data
+ structure; (3) creating an edge in the interference subgraph
+ automatically destroys a corresponding edge in the preference
+ subgraph. *)
+
+class interference (preference : preference Lazy.t) = object (self)
+
+ inherit subgraph as super
+
+ method getvv graph = graph.ivv
+ method setvv graph m = { graph with ivv = m }
+ method getvh graph = graph.ivh
+ method setvh graph m = { graph with ivh = m }
+
+ (* Override the edge creation and destruction methods. *)
+
+ method mkvvi graph v1 v2 =
+ let graph = super#mkvvi graph v1 v2 in
+ let graph = (Lazy.force preference)#rmvvifx graph v1 v2 in (* do not constrain an existing preference edge *)
+ { graph with
+ degree = PrioritySet.increment v1 1 (PrioritySet.increment v2 1 graph.degree);
+ nmr = PrioritySet.incrementifx v1 1 (PrioritySet.incrementifx v2 1 graph.nmr);
+ }
+
+ method rmvv graph v1 v2 =
+ let graph = super#rmvv graph v1 v2 in
+ { graph with
+ degree = PrioritySet.increment v1 (-1) (PrioritySet.increment v2 (-1) graph.degree);
+ nmr = PrioritySet.incrementifx v1 (-1) (PrioritySet.incrementifx v2 (-1) graph.nmr);
+ }
+
+ method mkvhi graph v h =
+ let graph = super#mkvhi graph v h in
+ let graph = (Lazy.force preference)#rmvhifx graph v h in (* do not constrain an existing preference edge *)
+ { graph with
+ degree = PrioritySet.increment v 1 graph.degree;
+ nmr = PrioritySet.incrementifx v 1 graph.nmr;
+ }
+
+ method rmvh graph v h =
+ let graph = super#rmvh graph v h in
+ { graph with
+ degree = PrioritySet.increment v (-1) graph.degree;
+ nmr = PrioritySet.incrementifx v (-1) graph.nmr;
+ }
+
+end
+
+(* ------------------------------------------------------------------------- *)
+
+(* The preference subgraph.
+
+ This is a subgraph with the following specific features: (1) an
+ edge in the preference subgraph cannot be created if a
+ corresponding edge exists in the interference subgraph; (2) adding
+ an edge can make a vertex move-related, which requires taking that
+ vertex out of the [nmr] set; conversely, removing an edge can make
+ a vertex non-move-related, which requires adding that vertex to the
+ [nmr] set. *)
+
+and preference (interference : interference Lazy.t) = object (self)
+
+ inherit subgraph as super
+
+ method getvv graph = graph.pvv
+ method setvv graph m = { graph with pvv = m }
+ method getvh graph = graph.pvh
+ method setvh graph m = { graph with pvh = m }
+
+ (* [nmr graph v] tells whether vertex [v] is non-move-related. *)
+
+ method nmr graph v =
+ Vertex.Set.is_empty (self#neighborsv graph v) &&
+ I8051.RegisterSet.is_empty (self#neighborsh graph v)
+
+ (* [mkcheck graph v] moves [v] out of the [nmr] set if [v] is
+ non-move-related. *)
+
+ method mkcheck graph v =
+ if self#nmr graph v then
+ { graph with
+ nmr = PrioritySet.remove v graph.nmr }
+ else
+ graph
+
+ (* Override the edge creation methods. *)
+
+ method mkvvi graph v1 v2 =
+ if (Lazy.force interference)#existsvv graph v1 v2 then
+ graph (* avoid creating constrained preference edge *)
+ else
+ let graph = self#mkcheck graph v1 in
+ let graph = self#mkcheck graph v2 in
+ super#mkvvi graph v1 v2
+
+ method mkvhi graph v h =
+ if (Lazy.force interference)#existsvh graph v h then
+ graph (* avoid creating constrained preference edge *)
+ else
+ let graph = self#mkcheck graph v in
+ super#mkvhi graph v h
+
+ (* [rmcheck graph v] moves [v] into the [nmr] set if [v] is
+ non-move-related. *)
+
+ method rmcheck graph v =
+ if self#nmr graph v then
+ { graph with
+ nmr = PrioritySet.add v (PrioritySet.priority v graph.degree) graph.nmr
+ }
+ else
+ graph
+
+ (* Override the edge destruction methods. *)
+
+ method rmvv graph v1 v2 =
+ let graph = super#rmvv graph v1 v2 in
+ let graph = self#rmcheck graph v1 in
+ let graph = self#rmcheck graph v2 in
+ graph
+
+ method rmvh graph v h =
+ let graph = super#rmvh graph v h in
+ let graph = self#rmcheck graph v in
+ graph
+
+end
+
+(* ------------------------------------------------------------------------- *)
+
+(* Because the interference and preference subgraphs are mutually
+ referential, a recursive definition is required. It is made
+ somewhat inelegant by Objective Caml's insistence on using the
+ [Lazy] mechanism. *)
+
+let rec interference = lazy (new interference preference)
+ and preference = lazy (new preference interference)
+let interference = Lazy.force interference
+let preference = Lazy.force preference
+
+(* ------------------------------------------------------------------------- *)
+
+(* Inspecting interference graphs. *)
+
+(* [ipp graph v] is the set of vertices that the vertex [v] interferes
+ with. *)
+
+let ipp graph v =
+ interference#neighborsv graph v
+
+(* [iph graph v] is the set of hardware registers that the vertex [v]
+ interferes with. *)
+
+let iph graph v =
+ interference#neighborsh graph v
+
+(* [ppp graph v] is the set of vertices that should preferably be
+ assigned the same color as the vertex [v]. *)
+
+let ppp graph v =
+ preference#neighborsv graph v
+
+(* [pph graph v] is the set of hardware registers that [v] should
+ preferably be assigned. *)
+
+let pph graph v =
+ preference#neighborsh graph v
+
+(* [degree graph v] is the degree of the vertex [v], that is, the number
+ of vertices and hardware registers that [v] interferes with. *)
+
+let degree graph v =
+ PrioritySet.priority v graph.degree
+
+(* [lowest graph] returns [Some (v, d)], where the vertex [v] has
+ minimum degree [d], or returns [None] if the graph is empty. *)
+
+let lowest graph =
+ PrioritySet.lowest graph.degree
+
+(* [lowest_non_move_related graph] returns [Some (v, d)], where the
+ vertex [v] has minimum degree [d] among the vertices that are not
+ move-related, or returns [None] if all vertices are move-related. A
+ vertex is move-related if it carries a preference edge. *)
+
+let lowest_non_move_related graph =
+ PrioritySet.lowest graph.nmr
+
+(* [fold f graph accu] folds over all vertices. *)
+
+let fold f graph accu =
+ RegMap.fold (fun v _ accu -> f v accu) graph.regmap accu
+
+(* [minimum f graph] returns a vertex [v] such that the value of [f x]
+ is minimal. The values returned by [f] are compared using Objective
+ Caml's generic comparison operator [<]. If the graph is empty,
+ [None] is returned. *)
+
+let minimum f graph =
+ match
+ fold (fun w accu ->
+ let dw = f w in
+ match accu with
+ | None ->
+ Some (dw, w)
+ | Some (dv, v) ->
+ if dw < dv then
+ Some (dw, w)
+ else
+ accu
+ ) graph None
+ with
+ | None ->
+ None
+ | Some (_, v) ->
+ Some v
+
+(* [pppick graph p] returns an arbitrary preference edge that
+ satisfies the predicate [p], if the graph contains one. *)
+
+type ppedge =
+ Vertex.t * Vertex.t
+
+let pppick graph p =
+ VertexSetMap.pick graph.pvv p
+
+(* [phpick graph p] returns an arbitrary preference edge that
+ satisfies the predicate [p], if the graph contains one. *)
+
+type phedge =
+ Vertex.t * I8051.register
+
+let phpick graph p =
+ I8051RegisterSetMap.pick graph.pvh p
+
+(* ------------------------------------------------------------------------- *)
+
+(* Constructing interference graphs. *)
+
+(* [create regs] creates an interference graph whose vertices are
+ the pseudo-registers [regs] and that does not have any edges. *)
+
+let create regs =
+ let (_ : int), regmap, degree =
+ Register.Set.fold (fun r (v, regmap, degree) ->
+ v+1,
+ RegMap.add r v regmap,
+ PrioritySet.add v 0 degree
+ ) regs (0, RegMap.empty, PrioritySet.empty)
+ in
+ {
+ regmap = regmap;
+ ivv = Vertex.Map.empty;
+ ivh = Vertex.Map.empty;
+ pvv = Vertex.Map.empty;
+ pvh = Vertex.Map.empty;
+ degree = degree;
+ nmr = degree
+ }
+
+(* [lookup graph r] returns the graph vertex associated with
+ pseudo-register [r]. *)
+
+let lookup graph r =
+ RegMap.backward r graph.regmap
+
+(* Conversely, [registers graph v] returns the set of pseudo-registers
+ associated with vertex [v]. *)
+
+let registers graph v =
+ RegMap.forward v graph.regmap
+
+(* [mkipp graph regs1 regs2] adds interference edges between all pairs
+ of pseudo-registers [r1] and [r2], where [r1] ranges over [regs1],
+ [r2] ranges over [regs2], and [r1] and [r2] are distinct. *)
+
+let mkipp graph regs1 regs2 =
+ Register.Set.fold (fun r1 graph ->
+ let v1 = lookup graph r1 in
+ Register.Set.fold (fun r2 graph ->
+ interference#mkvv graph v1 (lookup graph r2)
+ ) regs2 graph
+ ) regs1 graph
+
+(* [mkiph graph regs hwregs] adds interference edges between all pairs
+ of a pseudo-register [r] and a hardware register [hwr], where [r]
+ ranges over [regs] and [hwr] ranges over [hwregs]. *)
+
+let mkiph graph regs hwregs =
+ Register.Set.fold (fun r graph ->
+ let v = lookup graph r in
+ I8051.RegisterSet.fold (fun h graph ->
+ interference#mkvh graph v h
+ ) hwregs graph
+ ) regs graph
+
+(* [mki graph regs1 regs2] adds interference edges between all pairs
+ of (pseudo- or hardware) registers [r1] and [r2], where [r1] ranges
+ over [regs1], [r2] ranges over [regs2], and [r1] and [r2] are
+ distinct. *)
+
+let mki graph (regs1, hwregs1) (regs2, hwregs2) =
+ let graph = mkipp graph regs1 regs2 in
+ let graph = mkiph graph regs1 hwregs2 in
+ let graph = mkiph graph regs2 hwregs1 in
+ graph
+
+(* [mkppp graph r1 r2] adds a preference edge between the
+ pseudo-registers [r1] and [r2]. *)
+
+let mkppp graph r1 r2 =
+ let v1 = lookup graph r1
+ and v2 = lookup graph r2 in
+ let graph = preference#mkvv graph v1 v2 in
+ graph
+
+(* [mkpph graph r h] adds a preference edge between the
+ pseudo-register [r] and the hardware register [h]. *)
+
+let mkpph graph r h =
+ let v = lookup graph r in
+ let graph = preference#mkvh graph v h in
+ graph
+
+(* ------------------------------------------------------------------------- *)
+
+(* Displaying interference graphs. *)
+
+open Printf
+
+let hwregs graph =
+ I8051.RegisterSet.union (interference#hwregs graph) (preference#hwregs graph)
+
+let print_vertex graph v =
+ Register.Set.print (registers graph v)
+
+let print f graph =
+
+ fprintf f "graph G {\n";
+(* fprintf f "size=\"6, 3\";\n"; (* in inches *)*)
+ fprintf f "orientation = landscape;\n";
+ fprintf f "rankdir = LR;\n";
+ fprintf f "ratio = compress;\n\n"; (* compress or fill or auto *)
+
+ RegMap.fold (fun vertex regs () ->
+ fprintf f "r%d [ label=\"%s\" ] ;\n" vertex (Register.Set.print regs)
+ ) graph.regmap ();
+
+ I8051.RegisterSet.iter (fun hwr ->
+ let name = I8051.print_register hwr in
+ fprintf f "hwr%s [ label=\"$%s\" ] ;\n" name name
+ ) (hwregs graph);
+
+ interference#iter graph
+ (fun vertex neighbor ->
+ fprintf f "r%d -- r%d ;\n" vertex neighbor)
+ (fun vertex neighbor ->
+ fprintf f "r%d -- hwr%s ;\n" vertex (I8051.print_register neighbor));
+
+ preference#iter graph
+ (fun vertex neighbor ->
+ fprintf f "r%d -- r%d [ style = dashed ] ;\n" vertex neighbor)
+ (fun vertex neighbor ->
+ fprintf f "r%d -- hwr%s [ style = dashed ] ;\n" vertex (I8051.print_register neighbor));
+
+ fprintf f "\n}\n"
+
+(* ------------------------------------------------------------------------- *)
+
+(* Coalescing. *)
+
+(* [coalesce graph v1 v2] is a new graph where the vertices [v1] and [v2]
+ are coalesced. The new coalesced vertex is known under the name [v2]. *)
+
+let coalesce graph x y =
+
+ assert (x <> y); (* attempt to coalesce one vertex with itself *)
+ assert (not (interference#existsvv graph x y)); (* attempt to coalesce two interfering vertices *)
+
+ (* Perform coalescing in the two subgraphs. *)
+
+ let graph = interference#coalesce graph x y in
+ let graph = preference#coalesce graph x y in
+
+ (* Remove [x] from all tables. *)
+
+ {
+ graph with
+ regmap = RegMap.coalesce x y graph.regmap;
+ ivh = Vertex.Map.remove x graph.ivh;
+ pvh = Vertex.Map.remove x graph.pvh;
+ degree = PrioritySet.remove x graph.degree;
+ nmr = PrioritySet.remove x graph.nmr;
+ }
+
+(* [coalesceh graph v h] coalesces the vertex [v] with the hardware register
+ [h]. This produces a new graph where [v] no longer exists and all edges
+ leading to [v] are replaced with edges leading to [h]. *)
+
+let coalesceh graph x h =
+
+ assert (not (interference#existsvh graph x h)); (* attempt to coalesce interfering entities *)
+
+ (* Perform coalescing in the two subgraphs. *)
+
+ let graph = interference#coalesceh graph x h in
+ let graph = preference#coalesceh graph x h in
+
+ (* Remove [x] from all tables. *)
+
+ {
+ graph with
+ regmap = RegMap.remove x graph.regmap;
+ ivh = Vertex.Map.remove x graph.ivh;
+ pvh = Vertex.Map.remove x graph.pvh;
+ degree = PrioritySet.remove x graph.degree;
+ nmr = PrioritySet.remove x graph.nmr;
+ }
+
+(* ------------------------------------------------------------------------- *)
+
+(* [freeze graph x] is a new graph where all preference edges carried
+ by [x] are removed. *)
+
+let freeze graph x =
+ preference#remove graph x
+
+(* ------------------------------------------------------------------------- *)
+
+(* Removal. *)
+
+(* [remove graph v] is a new graph where vertex [v] is removed. *)
+
+let remove graph v =
+
+ (* Remove all edges carried by [v]. *)
+
+ let graph = interference#remove graph v in
+ let graph = preference#remove graph v in
+
+ (* Remove [v] from all tables. *)
+
+ {
+ graph with
+ regmap = RegMap.remove v graph.regmap;
+ degree = PrioritySet.remove v graph.degree;
+ nmr = PrioritySet.remove v graph.nmr;
+ }
+
+(* ------------------------------------------------------------------------- *)
+
+(* [mkdeg graph] recomputes degree information from scratch. *)
+
+let mkdeg graph =
+ let degree, nmr =
+ fold (fun v (degree, nmr) ->
+ let d = interference#degree graph v in
+ PrioritySet.add v d degree,
+ if preference#nmr graph v then PrioritySet.add v d nmr else nmr
+ ) graph (PrioritySet.empty, PrioritySet.empty)
+ in
+ { graph with
+ degree = degree;
+ nmr = nmr;
+ }
+
+(* [restrict graph p] is a new graph where only those vertices that
+ satisfy predicate [p] are kept. The same effect could be obtained
+ by repeated application of [remove], but [restrict] is likely to be
+ more efficient if many vertices are removed. *)
+
+let restrict graph p =
+ mkdeg {
+ graph with
+ regmap = RegMap.restrict p graph.regmap;
+ ivv = VertexSetMap.restrict p graph.ivv;
+ ivh = Vertex.Map.restrict p graph.ivh;
+ pvv = VertexSetMap.restrict p graph.pvv;
+ pvh = Vertex.Map.restrict p graph.pvh;
+ }
+
+(* [droph graph] is a new graph where all information concerning hardware
+ registers has been dropped. *)
+
+let droph graph =
+ mkdeg {
+ graph with
+ ivh = Vertex.Map.empty;
+ pvh = Vertex.Map.empty;
+ }
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(** This module implements a data structure for interference graphs.
+ It provides functions that help construct, transform and inspect
+ interference graphs. *)
+
+(* Interference graphs record two kinds of edges: interference edges
+ (``these two vertices cannot receive the same color'') and
+ preference edges (``these two vertices should preferably receive
+ the same color''). Furthermore, each kind of edge can relate either
+ two pseudo-registers or one pseudo-register and one hardware
+ register. Thus, an interference graph keeps track of four kinds of
+ relationships.
+
+ This module automatically maintains the invariant that two vertices
+ [x] and [y] cannot be related by both an interference edge and a
+ preference edge. When such a situation appears (for instance,
+ because of coalescing), the preference edge is automatically
+ removed. *)
+
+type graph
+
+(* The vertices of an interference graph initially correspond to
+ pseudo-registers. However, interference graphs support coalescing,
+ which means that a new graph can be constructed by coalescing two
+ vertices in an existing graph. As a result, in general, the vertices
+ of an interference graph correspond to sets of pseudo-registers. *)
+
+(* ------------------------------------------------------------------------- *)
+
+(* Operations over vertices: sets of vertices, maps over vertices. *)
+
+module Vertex : sig
+
+ type t
+
+ (* The usual operations on sets, see [Set.S] in Objective Caml's
+ documentation. *)
+
+ module Set : Set.S with type elt = t
+
+ (* The usual operations on maps, see [Map.S] in Objective Caml's
+ documentation. One slight difference is that [find] expects
+ the key to be present in the map -- it will fail otherwise. *)
+
+ module Map : MyMap.S with type key = t
+
+end
+
+(* ------------------------------------------------------------------------- *)
+
+(* Building interference graphs. *)
+
+(* [create regs] creates an interference graph whose vertices are
+ the pseudo-registers [regs] and that does not have any edges. *)
+
+val create: Register.Set.t -> graph
+
+(* [mki graph regs1 regs2] adds interference edges between all pairs
+ of (pseudo- or hardware) registers [r1] and [r2], where [r1] ranges
+ over [regs1], [r2] ranges over [regs2], and [r1] and [r2] are
+ distinct. *)
+
+val mki: graph ->
+ Register.Set.t * I8051.RegisterSet.t ->
+ Register.Set.t * I8051.RegisterSet.t ->
+ graph
+
+(* [mkiph graph regs hwregs] adds interference edges between all pairs
+ of a pseudo-register [r] and a hardware register [hwr], where [r]
+ ranges over [regs] and [hwr] ranges over [hwregs]. *)
+
+val mkiph: graph -> Register.Set.t -> I8051.RegisterSet.t -> graph
+
+(* [mkppp graph r1 r2] adds a preference edge between the
+ pseudo-registers [r1] and [r2]. *)
+
+val mkppp: graph -> Register.t -> Register.t -> graph
+
+(* [mkpph graph r h] adds a preference edge between the
+ pseudo-register [r] and the hardware register [h]. *)
+
+val mkpph: graph -> Register.t -> I8051.register -> graph
+
+(* ------------------------------------------------------------------------- *)
+
+(* Transforming interference graphs. *)
+
+(* [coalesce graph v1 v2] is a new graph where the vertices [v1] and
+ [v2] are coalesced. [v1] and [v2] must not interfere. The new
+ coalesced vertex is known under the name [v2]. *)
+
+val coalesce: graph -> Vertex.t -> Vertex.t -> graph
+
+(* [coalesceh graph v h] coalesces the vertex [v] with the hardware register
+ [h]. This produces a new graph where [v] no longer exists and all edges
+ leading to [v] are replaced with edges leading to [h]. *)
+
+val coalesceh: graph -> Vertex.t -> I8051.register -> graph
+
+(* [remove graph v] is a new graph where vertex [v] is removed. *)
+
+val remove: graph -> Vertex.t -> graph
+
+(* [freeze graph x] is a new graph where all preference edges carried
+ by [x] are removed. *)
+
+val freeze: graph -> Vertex.t -> graph
+
+(* [restrict graph p] is a new graph where only those vertices that
+ satisfy predicate [p] are kept. *)
+
+val restrict: graph -> (Vertex.t -> bool) -> graph
+
+(* [droph graph] is a new graph where all information concerning hardware
+ registers has been dropped. *)
+
+val droph: graph -> graph
+
+(* ------------------------------------------------------------------------- *)
+
+(* Inspecting interference graphs. *)
+
+(* [lookup graph r] returns the graph vertex associated with
+ pseudo-register [r]. *)
+
+val lookup: graph -> Register.t -> Vertex.t
+
+(* Conversely, [registers graph v] returns the set of pseudo-registers
+ associated with vertex [v]. *)
+
+val registers: graph -> Vertex.t -> Register.Set.t
+
+(* [degree graph v] is the degree of the vertex [v], that is, the number
+ of vertices and hardware registers that [v] interferes with. *)
+
+val degree: graph -> Vertex.t -> int
+
+(* [lowest graph] returns [Some (v, d)], where the vertex [v] has
+ minimum degree [d], or returns [None] if the graph is empty. *)
+
+val lowest: graph -> (Vertex.t * int) option
+
+(* [lowest_non_move_related graph] returns [Some (v, d)], where the
+ vertex [v] has minimum degree [d] among the vertices that are not
+ move-related, or returns [None] if all vertices are move-related. A
+ vertex is move-related if it carries a preference edge. *)
+
+val lowest_non_move_related: graph -> (Vertex.t * int) option
+
+(* [minimum f graph] returns a vertex [v] such that the value of [f x]
+ is minimal. The values returned by [f] are compared using Objective
+ Caml's generic comparison operator [<]. If the graph is empty,
+ [None] is returned. *)
+
+val minimum: (Vertex.t -> 'a) -> graph -> Vertex.t option
+
+(* [fold f graph accu] folds over all vertices. *)
+
+val fold: (Vertex.t -> 'a -> 'a) -> graph -> 'a -> 'a
+
+(* [ipp graph v] is the set of vertices that the vertex [v] interferes
+ with. *)
+
+val ipp: graph -> Vertex.t -> Vertex.Set.t
+
+(* [iph graph v] is the set of hardware registers that the vertex [v]
+ interferes with. *)
+
+val iph: graph -> Vertex.t -> I8051.RegisterSet.t
+
+(* [ppp graph v] is the set of vertices that should preferably be
+ assigned the same color as the vertex [v]. *)
+
+val ppp: graph -> Vertex.t -> Vertex.Set.t
+
+(* [pph graph v] is the set of hardware registers that [v] should
+ preferably be assigned. *)
+
+val pph: graph -> Vertex.t -> I8051.RegisterSet.t
+
+(* [pppick graph p] returns an arbitrary preference edge that
+ satisfies the predicate [p], if the graph contains one. *)
+
+type ppedge =
+ Vertex.t * Vertex.t
+
+val pppick: graph -> (ppedge -> bool) -> ppedge option
+
+(* [phpick graph p] returns an arbitrary preference edge that
+ satisfies the predicate [p], if the graph contains one. *)
+
+type phedge =
+ Vertex.t * I8051.register
+
+val phpick: graph -> (phedge -> bool) -> phedge option
+
+(* ------------------------------------------------------------------------- *)
+
+(* Displaying interference graphs. *)
+
+(* [print_vertex graph v] produces a string representation of the
+ vertex [v]. *)
+
+val print_vertex: graph -> Vertex.t -> string
+
+(* [print f graph] prints a representation of the interference graph
+ [graph] in [dot] format to the output channel [f]. Interference
+ edges are drawn as plain lines; preference edges are drawn as
+ dotted lines. *)
+
+val print: out_channel -> graph -> unit
+
--- /dev/null
+module LexingExt = struct
+
+ open Lexing
+
+ let new_line lexbuf =
+ lexbuf.lex_curr_p <- {
+ lexbuf.lex_curr_p with
+ pos_bol = 0;
+ pos_lnum = lexbuf.lex_curr_p.pos_lnum + 1
+ }
+
+ let lex_num s pos =
+ let rec num i =
+ if s.[i] >= '0' && s.[i] <= '9' then
+ num (i + 1)
+ else
+ i
+ in
+ let pos' = num pos in
+ if pos = pos' then
+ None
+ else
+ Some (pos, pos', int_of_string (String.sub s pos (pos' - pos)))
+
+end
+
+module ListExt = struct
+
+ let inv_assoc l = List.map (fun (x, y) -> (y, x)) l
+
+ exception EmptyList
+
+ let last l = try List.hd (List.rev l) with _ -> raise EmptyList
+
+ let cut_last l =
+ let rec aux l = function
+ | [] -> raise EmptyList
+ | [ x ] -> (x, List.rev l)
+ | x :: xs -> aux (x :: l) xs
+ in
+ aux [] l
+
+ let multi_set_of_list l =
+ let h = Hashtbl.create 13 in
+ let incr_occ x =
+ let o = try Hashtbl.find h x with Not_found -> 0 in
+ Hashtbl.replace h x (o + 1)
+ in
+ List.iter incr_occ l;
+ Hashtbl.fold (fun k v accu -> (k, v) :: accu) h []
+
+ let hashtbl_of_assoc l =
+ let h = Hashtbl.create 13 in
+ List.iter (fun (k, v) -> Hashtbl.add h k v) l;
+ h
+
+ exception Conflict
+ let assoc_union l1 l2 =
+ let h1 = hashtbl_of_assoc l1 in
+ l1
+ @ List.filter
+ (fun (k, v1) ->
+ try
+ let v2 = Hashtbl.find h1 k in
+ if v1 <> v2 then raise Conflict;
+ false
+ with _ -> true) l2
+
+ let assoc_diff l1 l2 =
+ let h1 = hashtbl_of_assoc l1 in
+ let h2 = hashtbl_of_assoc l2 in
+ let diff h1 h2 f =
+ Hashtbl.fold
+ (fun k v1 accu ->
+ let v2 =
+ try Some (Hashtbl.find h2 k)
+ with Not_found -> None
+ in
+ if Some v1 <> v2 then
+ if f then
+ (k, (Some v1, v2)) :: accu
+ else
+ (k, (v2, Some v1)) :: accu
+ else
+ accu)
+ h1 []
+ in
+ let d1 = diff h1 h2 true in
+ let d2 = diff h2 h1 false in
+ try assoc_union d1 d2
+ with Conflict -> assert false
+
+ let transitive_forall2 p l =
+ let rec aux = function
+ | [] -> None
+ | [x] -> None
+ | x1 :: ((x2 :: _) as xs) ->
+ if not (p x1 x2) then Some (x1, x2) else aux xs
+ in
+ aux l
+
+ let repeat init n f =
+ let rec aux accu vs i =
+ if i = 0 then (accu, vs) else
+ let (accu, v) = f accu i in
+ aux accu (v :: vs) (pred i)
+ in
+ assert (n >= 0);
+ aux init [] n
+
+end
+
+module ArgExt = struct
+
+ let extra_doc s = "", Arg.Unit ignore, s
+
+end
+
+module SysExt = struct
+
+ let safe_remove name =
+ try Sys.remove name with Sys_error _ -> ()
+
+ let rec alternative name =
+ let split name =
+ match LexingExt.lex_num name 0 with
+ | None -> None
+ | Some (start, stop, num) ->
+ let len = String.length name in
+ Some (num, String.sub name (stop+1) (len - stop - 1))
+ in
+ if not (Sys.file_exists name) then
+ name
+ else
+ let dirname = Filename.dirname name in
+ let filename = Filename.basename name in
+ let filename =
+ match split filename with
+ | None ->
+ "01-" ^ filename
+ | Some (i, name) ->
+ Printf.sprintf "%02d-%s" (i + 1) name
+ in
+ alternative (Filename.concat dirname filename)
+
+end
+
+module IOExt = struct
+
+ let stdout_buffer = Buffer.create 13
+ let stdout_formatter = Format.formatter_of_buffer stdout_buffer
+ let stderr_buffer = Buffer.create 13
+ let stderr_formatter = Format.formatter_of_buffer stderr_buffer
+ let enable_buffering = ref false
+
+ let printf fmt =
+ if !enable_buffering then
+ Format.fprintf stdout_formatter fmt
+ else
+ Format.printf fmt
+
+ let eprintf fmt =
+ if !enable_buffering then
+ Format.fprintf stderr_formatter fmt
+ else
+ Format.eprintf fmt
+
+ let get_buffers () =
+ let out =
+ (Buffer.contents stdout_buffer, Buffer.contents stderr_buffer)
+ in
+ Buffer.clear stdout_buffer;
+ Buffer.clear stderr_buffer;
+ out
+
+ let set_buffered_mode () =
+ enable_buffering := true
+
+end
+
+module Timed = struct
+
+ let time now print_date f =
+ fun x ->
+ let start_date = now () in
+ let y = f x in
+ let stop_date = now () in
+ print_date start_date stop_date;
+ y
+
+ let get_now = ref (fun () -> 0.)
+
+ let set_now now = get_now := now
+
+ let enable_profiling = ref false
+
+ let set_profiling_flag t = enable_profiling := t
+
+ let profile title f =
+ let print_date start stop =
+ IOExt.eprintf "[%05.0fms] %s\n" (stop -. start) title
+ in
+ if !enable_profiling then
+ time !get_now print_date f
+ else
+ f
+
+end
--- /dev/null
+(** This module extends the standard library of Objective Caml. *)
+
+module LexingExt : sig
+
+ (** [new_line lexbuf] update lexbuf to increment its line
+ counter. *)
+ val new_line : Lexing.lexbuf -> unit
+
+ val lex_num : string -> int -> (int * int * int) option
+
+end
+
+module ListExt : sig
+
+ (** [inv_assoc l] inverses a bijective associative list [l]. *)
+ val inv_assoc : ('a * 'b) list -> ('b * 'a) list
+
+ exception EmptyList
+
+ (** [last l] returns the last element of a list.
+ Raise [EmptyList] if there is no such thing in [l]. *)
+ val last : 'a list -> 'a
+
+ (** [cut_last l] returns the last element of a list [l] and the
+ elements that come before it in [l].
+ Raise [EmptyList] if there is no such thing in [l]. *)
+ val cut_last : 'a list -> 'a * 'a list
+
+ (** [multi_set_of_list l] returns an associative list that
+ relates every element of [l] to its frequency in [l]. *)
+ val multi_set_of_list : 'a list -> ('a * int) list
+
+ (** [hashtbl_of_assoc l] converts an associative list into
+ an hash table. *)
+ val hashtbl_of_assoc : ('a * 'b) list -> ('a, 'b) Hashtbl.t
+
+ (** [assoc_diff l1 l2] returns the difference between two
+ associative lists. *)
+ val assoc_diff : ('a * 'b) list -> ('a * 'b) list
+ -> ('a * ('b option * 'b option)) list
+
+ (** [transitive_forall2 p l] checks that the binary predicate [p] is
+ true between each successive elements of [l]. If this is false,
+ the function returns the first pair of elements that falsify [p]. *)
+ val transitive_forall2 : ('a -> 'a -> bool) -> 'a list -> ('a * 'a) option
+
+ (** [repeat init n f] computes [f 0; ...; f n] threading an
+ accumulator along the way from [n] to [0]. *)
+ val repeat : 'b -> int -> ('b -> int -> 'b * 'a) -> 'b * 'a list
+
+end
+
+module ArgExt : sig
+
+ (** [extra_doc s] adds an extra line of documentation for an
+ Arg.spec row. *)
+ val extra_doc : string -> (Arg.key * Arg.spec * Arg.doc)
+
+end
+
+module SysExt : sig
+
+ (** [safe_remove filename] deletes a file named [filename],
+ but do not crash if a system error happens. (For instance,
+ if the file does not exist.) *)
+ val safe_remove : string -> unit
+
+ (** [alternative filename] finds an alternative name different
+ from [filename] that is not already used. *)
+ val alternative : string -> string
+
+end
+
+module IOExt : sig
+
+ (** Buffered printf-based IO. *)
+ val printf : ('a, Format.formatter, unit) Pervasives.format -> 'a
+ val eprintf : ('a, Format.formatter, unit) Pervasives.format -> 'a
+ val set_buffered_mode : unit -> unit
+ val get_buffers : unit -> string * string
+
+end
+
+module Timed : sig
+
+ val time :
+ (unit -> 'date) -> ('date -> 'date -> unit)
+ -> ('a -> 'b) -> ('a -> 'b)
+
+ val set_now : (unit -> float) -> unit
+
+ val set_profiling_flag : bool -> unit
+
+ val profile : string -> ('a -> 'b) -> 'a -> 'b
+
+end
--- /dev/null
+
+let rec map3 f al bl cl =
+ let f' ((a, b), c) = f a b c in
+ List.map f' (List.combine (List.combine al bl) cl)
+
+let rec max_list = function
+ | [] -> raise (Invalid_argument "MiscPottier.max_list")
+ | [a] -> a
+ | a :: l -> max a (max_list l)
+
+let rec reduce l1 l2 = match l1, l2 with
+ | [], _ -> (([], []), ([], l2))
+ | _, [] -> (([], l1), ([], []))
+ | a :: l1, b :: l2 ->
+ let ((common1, rest1), (common2, rest2)) = reduce l1 l2 in
+ ((a :: common1, rest1), (b :: common2, rest2))
+
+let pow a b =
+ if b < 0 then raise (Invalid_argument "MiscPottier.pow2")
+ else
+ let rec aux = function
+ | 0 -> 1
+ | i -> a * aux (i-1) in
+ aux b
+
+let rec make a n =
+ if n = 0 then []
+ else a :: (make a (n-1))
+
+let index_of x =
+ let rec aux i = function
+ | [] -> raise Not_found
+ | y :: l -> if y = x then i else aux (i+1) l
+ in
+ aux 0
+
+let rec remove_n_first n =
+ let rec aux i = function
+ | [] -> []
+ | l when i = n -> l
+ | _ :: l -> aux (i+1) l in
+ aux 0
+
+let foldi_from_until n m f a l =
+ let rec aux i res = function
+ | [] -> res
+ | _ when i >= m -> res
+ | e :: l -> aux (i+1) (f i res e) l in
+ aux 0 a (remove_n_first n l)
+
+let foldi_from n f a l = foldi_from_until n (List.length l) f a l
+
+let foldi_until m f a l = foldi_from_until 0 m f a l
+
+let foldi f a l = foldi_from_until 0 (List.length l) f a l
+
+let pos e l =
+ let f i res e' = if e' = e then Some i else res in
+ match foldi f None l with
+ | None -> raise Not_found
+ | Some i -> i
+
+let iteri f l =
+ let rec aux i = function
+ | [] -> ()
+ | e :: l -> f i e ; aux (i+1) l
+ in
+ aux 0 l
+
+let mapi f l =
+ let rec aux i = function
+ | [] -> []
+ | e :: l -> (f i e) :: (aux (i+1) l)
+ in
+ aux 0 l
+
+let rec last = function
+ | [] -> raise Not_found
+ | [a] -> a
+ | _ :: l -> last l
+
+(* [split a i] splits the list a in two lists: one with the elements
+ up until the [i]th (exclusive) and one with the rest. *)
+
+let rec split l i =
+ if i = 0 then ([], l)
+ else
+ let (l1, l2) = split (List.tl l) (i-1) in
+ ((List.hd l) :: l1, l2)
+
+(* [split_last l] returns the list [l] without its last element and its last
+ element. Raises Invalid_argument "MiscPottier.split_last" if the list is
+ empty. *)
+
+let split_last l = match split l ((List.length l) - 1) with
+ | l', last :: _ -> (l', last)
+ | _ -> raise (Invalid_argument "MiscPottier.split_last")
+
+let rec update_list_assoc a b = function
+ | [] -> []
+ | (a', b') :: l ->
+ if a' = a then (a, b) :: l else (a', b') :: (update_list_assoc a b l)
+
+(* Pasted from Pottier's PP compiler *)
+
+let rec combine xs1 xs2 =
+ match xs1, xs2 with
+ | [], _
+ | _, [] ->
+ []
+ | x1 :: xs1, x2 :: xs2 ->
+ (x1, x2) :: combine xs1 xs2
+
+let rec subtract xs1 xs2 =
+ match xs1, xs2 with
+ | [], _ ->
+ []
+ | _, [] ->
+ xs1
+ | _ :: xs1, _ :: xs2 ->
+ subtract xs1 xs2
+
+let mirror l =
+ List.map (fun (x, y) -> (y, x)) l
+
+let length l =
+ Int32.of_int (List.length l)
+
+let rec prefix k l =
+ match k, l with
+ | 0, _
+ | _, [] ->
+ []
+ | _, x :: xs ->
+ x :: prefix (k - 1) xs
+
+let memoize f =
+ let table = Hashtbl.create 131 in
+ fun key ->
+ try
+ Hashtbl.find table key
+ with Not_found ->
+ let data = f key in
+ Hashtbl.add table key data;
+ data
+
+let filter_map filter map =
+ let rec aux = function
+ | [] -> []
+ | e :: l -> (if filter e then [map e] else []) @ (aux l)
+ in
+ aux
+
+let string_of_list sep f =
+ let rec aux = function
+ | [] -> ""
+ | [e] -> f e
+ | e :: l -> (f e) ^ sep ^ (aux l)
+ in
+ aux
--- /dev/null
+
+(** This module provides some additional functions on lists or arithmetics. *)
+
+(* raises Not_found *)
+val pos : 'a -> 'a list -> int
+
+val reduce : 'a list -> 'b list -> ('a list * 'a list) * ('b list * 'b list)
+
+(* raise Failure "MiscPottier.map3" if the list arguments are not of the same
+ size. *)
+val map3 : ('a -> 'b -> 'c -> 'd) -> 'a list -> 'b list -> 'c list -> 'd list
+
+val max_list : 'a list -> 'a
+
+val pow : int -> int -> int
+
+val make: 'a -> int -> 'a list
+
+val index_of : 'a -> 'a list -> int
+
+val foldi_until : int -> (int -> 'a -> 'b -> 'a) -> 'a -> 'b list -> 'a
+
+val foldi : (int -> 'a -> 'b -> 'a) -> 'a -> 'b list -> 'a
+
+val iteri : (int -> 'a -> unit) -> 'a list -> unit
+
+val mapi : (int -> 'a -> 'b) -> 'a list -> 'b list
+
+(* Raises Not_found if the list is empty. *)
+val last : 'a list -> 'a
+
+(* [split l i] splits the list [l] in two lists: one with the elements
+ up until the [i]th (exclusive) and one with the rest. *)
+val split: 'a list -> int -> ('a list * 'a list)
+
+(* [split_last l] returns the list [l] without its last element and its last
+ element. Raises Invalid_argument "MiscPottier.split_last" if the list is
+ empty. *)
+val split_last : 'a list -> ('a list * 'a)
+
+val update_list_assoc: 'a -> 'b -> ('a * 'b) list -> ('a * 'b) list
+
+(* Pasted from Pottier's PP compiler *)
+
+(* [combine] turns a pair of lists into a list of pairs. It never
+ fails: the length of the output list is the minimum of the lengths
+ of the input lists. *)
+
+val combine: 'a list -> 'b list -> ('a * 'b) list
+
+(* [subtract xs1 xs2] returns the list [xs1] deprived of as many
+ elements as there are in the list [xs2]. *)
+
+val subtract: 'a list -> 'b list -> 'a list
+
+(* [mirror] reverses the order of the pair components in a list
+ of pairs. *)
+
+val mirror: ('a * 'b) list -> ('b * 'a) list
+
+(* [length l] is the length of the list [l]. *)
+
+val length: 'a list -> int32
+
+(* [prefix k xs] returns the prefix of length [k] of the list [xs].
+ If [xs] has length less than [k], [xs] is returned. *)
+
+val prefix: int -> 'a list -> 'a list
+
+(* [memoize f] produces a memoizing version of the function [f].
+ It requires the domain of [f] to support generic equality. *)
+
+val memoize: ('a -> 'b) -> ('a -> 'b)
+
+(* [filter_map filter map l] returns the list [l] where elements satisfying the
+ [filter] function have been replaced by their application to the [map]
+ function. Elements that do not satisfy [filter] are not in the result
+ list. *)
+
+val filter_map: ('a -> bool) -> ('a -> 'b) -> 'a list -> 'b list
+
+(* [string_of_list sep f l] returns the string obtained by applying [f] to each
+ element of [l] and separating their output with [sep]. *)
+
+val string_of_list: string -> ('a -> string) -> 'a list -> string
--- /dev/null
+(***********************************************************************)
+(* *)
+(* Objective Caml *)
+(* *)
+(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
+(* *)
+(* Copyright 1996 Institut National de Recherche en Informatique et *)
+(* en Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU Library General Public License, with *)
+(* the special exception on linking described in file ../LICENSE. *)
+(* *)
+(***********************************************************************)
+
+(* $Id: myMap.ml,v 1.3 2006/02/17 16:19:52 pottier Exp $ *)
+
+module type OrderedType =
+ sig
+ type t
+ val compare: t -> t -> int
+ end
+
+module type S =
+ sig
+ type key
+ type +'a t
+ val empty: 'a t
+ val is_empty: 'a t -> bool
+ val add: key -> 'a -> 'a t -> 'a t
+ val find: key -> 'a t -> 'a
+ val remove: key -> 'a t -> 'a t
+ val mem: key -> 'a t -> bool
+ val iter: (key -> 'a -> unit) -> 'a t -> unit
+ val map: ('a -> 'b) -> 'a t -> 'b t
+ val mapi: (key -> 'a -> 'b) -> 'a t -> 'b t
+ val fold: (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b
+ val compare: ('a -> 'a -> int) -> 'a t -> 'a t -> int
+ val equal: ('a -> 'a -> bool) -> 'a t -> 'a t -> bool
+ type interval = key option * key option
+ val split: interval -> 'a t -> 'a t
+ val minimum: 'a t -> key * 'a
+ val find_remove: key -> 'a t -> 'a * 'a t
+ val update: key -> ('a -> 'a) -> 'a t -> 'a t
+ val restrict: (key -> bool) -> 'a t -> 'a t
+ end
+
+module Make(Ord: OrderedType) = struct
+
+ type key = Ord.t
+
+ type 'a t =
+ Empty
+ | Node of 'a t * key * 'a * 'a t * int
+
+ let height = function
+ Empty -> 0
+ | Node(_,_,_,_,h) -> h
+
+ let create l x d r =
+ let hl = height l and hr = height r in
+ Node(l, x, d, r, (if hl >= hr then hl + 1 else hr + 1))
+
+ let bal l x d r =
+ let hl = match l with Empty -> 0 | Node(_,_,_,_,h) -> h in
+ let hr = match r with Empty -> 0 | Node(_,_,_,_,h) -> h in
+ if hl > hr + 2 then begin
+ match l with
+ Empty -> invalid_arg "Map.bal"
+ | Node(ll, lv, ld, lr, _) ->
+ if height ll >= height lr then
+ create ll lv ld (create lr x d r)
+ else begin
+ match lr with
+ Empty -> invalid_arg "Map.bal"
+ | Node(lrl, lrv, lrd, lrr, _)->
+ create (create ll lv ld lrl) lrv lrd (create lrr x d r)
+ end
+ end else if hr > hl + 2 then begin
+ match r with
+ Empty -> invalid_arg "Map.bal"
+ | Node(rl, rv, rd, rr, _) ->
+ if height rr >= height rl then
+ create (create l x d rl) rv rd rr
+ else begin
+ match rl with
+ Empty -> invalid_arg "Map.bal"
+ | Node(rll, rlv, rld, rlr, _) ->
+ create (create l x d rll) rlv rld (create rlr rv rd rr)
+ end
+ end else
+ Node(l, x, d, r, (if hl >= hr then hl + 1 else hr + 1))
+
+ let empty = Empty
+
+ let is_empty = function Empty -> true | _ -> false
+
+ let rec add x data = function
+ Empty ->
+ Node(Empty, x, data, Empty, 1)
+ | Node(l, v, d, r, h) ->
+ let c = Ord.compare x v in
+ if c = 0 then
+ Node(l, x, data, r, h)
+ else if c < 0 then
+ bal (add x data l) v d r
+ else
+ bal l v d (add x data r)
+
+ (* Same as create and bal, but no assumptions are made on the
+ relative heights of l and r. *)
+
+ let rec join l v d r =
+ match (l, r) with
+ (Empty, _) -> add v d r
+ | (_, Empty) -> add v d l
+ | (Node(ll, lv, ld, lr, lh), Node(rl, rv, rd, rr, rh)) ->
+ if lh > rh + 2 then bal ll lv ld (join lr v d r) else
+ if rh > lh + 2 then bal (join l v d rl) rv rd rr else
+ create l v d r
+
+ let rec find x = function
+ Empty ->
+ raise Not_found
+ | Node(l, v, d, r, _) ->
+ let c = Ord.compare x v in
+ if c = 0 then d
+ else find x (if c < 0 then l else r)
+
+ let rec mem x = function
+ Empty ->
+ false
+ | Node(l, v, d, r, _) ->
+ let c = Ord.compare x v in
+ c = 0 || mem x (if c < 0 then l else r)
+
+ let rec min_binding = function
+ Empty -> raise Not_found
+ | Node(Empty, x, d, r, _) -> (x, d)
+ | Node(l, x, d, r, _) -> min_binding l
+
+ let rec remove_min_binding = function
+ Empty -> invalid_arg "Map.remove_min_elt"
+ | Node(Empty, x, d, r, _) -> r
+ | Node(l, x, d, r, _) -> bal (remove_min_binding l) x d r
+
+ let merge t1 t2 =
+ match (t1, t2) with
+ (Empty, t) -> t
+ | (t, Empty) -> t
+ | (_, _) ->
+ let (x, d) = min_binding t2 in
+ bal t1 x d (remove_min_binding t2)
+
+ let rec remove x = function
+ Empty ->
+ Empty
+ | Node(l, v, d, r, h) ->
+ let c = Ord.compare x v in
+ if c = 0 then
+ merge l r
+ else if c < 0 then
+ bal (remove x l) v d r
+ else
+ bal l v d (remove x r)
+
+ let rec iter f = function
+ Empty -> ()
+ | Node(l, v, d, r, _) ->
+ iter f l; f v d; iter f r
+
+ let rec map f = function
+ Empty -> Empty
+ | Node(l, v, d, r, h) -> Node(map f l, v, f d, map f r, h)
+
+ let rec mapi f = function
+ Empty -> Empty
+ | Node(l, v, d, r, h) -> Node(mapi f l, v, f v d, mapi f r, h)
+
+ let rec fold f m accu =
+ match m with
+ Empty -> accu
+ | Node(l, v, d, r, _) ->
+ fold f r (f v d (fold f l accu))
+
+ type 'a enumeration = End | More of key * 'a * 'a t * 'a enumeration
+
+ let rec cons_enum m e =
+ match m with
+ Empty -> e
+ | Node(l, v, d, r, _) -> cons_enum l (More(v, d, r, e))
+
+ let compare cmp m1 m2 =
+ let rec compare_aux e1 e2 =
+ match (e1, e2) with
+ (End, End) -> 0
+ | (End, _) -> -1
+ | (_, End) -> 1
+ | (More(v1, d1, r1, e1), More(v2, d2, r2, e2)) ->
+ let c = Ord.compare v1 v2 in
+ if c <> 0 then c else
+ let c = cmp d1 d2 in
+ if c <> 0 then c else
+ compare_aux (cons_enum r1 e1) (cons_enum r2 e2)
+ in compare_aux (cons_enum m1 End) (cons_enum m2 End)
+
+ let equal cmp m1 m2 =
+ let rec equal_aux e1 e2 =
+ match (e1, e2) with
+ (End, End) -> true
+ | (End, _) -> false
+ | (_, End) -> false
+ | (More(v1, d1, r1, e1), More(v2, d2, r2, e2)) ->
+ Ord.compare v1 v2 = 0 && cmp d1 d2 &&
+ equal_aux (cons_enum r1 e1) (cons_enum r2 e2)
+ in equal_aux (cons_enum m1 End) (cons_enum m2 End)
+
+ (* Intervals for splitting. An interval consists of a lower bound
+ and an upper bound, each of which can be absent. A key is
+ considered to lie within the interval if it is both greater than
+ (or equal to) the lower bound (if present) and less than (or
+ equal to) the upper bound (if present). *)
+
+ type interval =
+ key option * key option
+
+ (* Splitting. split interval m returns a new map consisting of
+ all bindings in m whose keys are within interval. *)
+
+ let rec split ((lo, hi) as interval) = function
+ Empty ->
+ Empty
+ | Node(l, v, d, r, _) ->
+ let clo = Ord.compare v lo in
+ if clo < 0 then
+ (* v < lo *)
+ split interval r
+ else if clo = 0 then
+ (* v = lo *)
+ add v d (splithi hi r)
+ else
+ (* v > lo *)
+ let chi = Ord.compare v hi in
+ if chi < 0 then
+ (* v < hi *)
+ join (splitlo lo l) v d (splithi hi r)
+ else if chi = 0 then
+ (* v = hi *)
+ add v d (splitlo lo l)
+ else
+ (* v > hi *)
+ split interval l
+
+ and splitlo lo = function
+ Empty ->
+ Empty
+ | Node(l, v, d, r, _) ->
+ let c = Ord.compare v lo in
+ if c < 0 then
+ (* v < lo *)
+ splitlo lo r
+ else if c = 0 then
+ (* v = lo *)
+ add v d r
+ else
+ (* v > lo *)
+ join (splitlo lo l) v d r
+
+ and splithi hi = function
+ Empty ->
+ Empty
+ | Node(l, v, d, r, _) ->
+ let c = Ord.compare v hi in
+ if c < 0 then
+ (* v < hi *)
+ join l v d (splithi hi r)
+ else if c = 0 then
+ (* v = hi *)
+ add v d l
+ else
+ (* v > hi *)
+ splithi hi l
+
+ (* Splitting. This is the public entry point. *)
+
+ let split interval m =
+ match interval with
+ | None, None ->
+ m
+ | Some lo, None ->
+ splitlo lo m
+ | None, Some hi ->
+ splithi hi m
+ | Some lo, Some hi ->
+ split (lo, hi) m
+
+ (* Finding the minimum key in a map. *)
+
+ let rec minimum key data m =
+ match m with
+ | Empty ->
+ (key, data)
+ | Node (l, k, d, _, _) ->
+ minimum k d l
+
+ let minimum = function
+ | Empty ->
+ raise Not_found
+ | Node (l, k, d, _, _) ->
+ minimum k d l
+
+ (* Finding an element and removing it in one single traversal. *)
+
+ let find_remove x m =
+ let data = ref None in
+ let rec remove = function
+ | Empty ->
+ raise Not_found
+ | Node(l, v, d, r, h) ->
+ let c = Ord.compare x v in
+ if c = 0 then begin
+ data := Some d;
+ merge l r
+ end
+ else if c < 0 then
+ bal (remove l) v d r
+ else
+ bal l v d (remove r)
+ in
+ let m = remove m in
+ match !data with
+ | None ->
+ assert false
+ | Some d ->
+ d, m
+
+ (* Updating the data associated with an element in one single traversal. *)
+
+ exception Unmodified
+
+ let rec update x f m =
+ let rec update = function
+ | Empty ->
+ assert false
+ | Node(l, v, d, r, h) ->
+ let c = Ord.compare x v in
+ if c = 0 then
+ let d' = f d in
+ if d == d' then
+ raise Unmodified
+ else
+ Node (l, v, d', r, h)
+ else if c < 0 then
+ Node (update l, v, d, r, h)
+ else
+ Node (l, v, d, update r, h)
+ in
+ try
+ update m
+ with Unmodified ->
+ m
+
+ (* Restricting the domain of a map. *)
+
+ let restrict p m =
+ fold (fun x d m ->
+ if p x then
+ add x d m
+ else
+ m
+ ) m empty
+
+
+end
--- /dev/null
+(***********************************************************************)
+(* *)
+(* Objective Caml *)
+(* *)
+(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
+(* *)
+(* Copyright 1996 Institut National de Recherche en Informatique et *)
+(* en Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the GNU Library General Public License, with *)
+(* the special exception on linking described in file ../LICENSE. *)
+(* *)
+(***********************************************************************)
+
+(* $Id: myMap.mli,v 1.3 2006/02/17 16:19:52 pottier Exp $ *)
+
+(** Association tables over ordered types.
+
+ This module implements applicative association tables, also known as
+ finite maps or dictionaries, given a total ordering function
+ over the keys.
+ All operations over maps are purely applicative (no side-effects).
+ The implementation uses balanced binary trees, and therefore searching
+ and insertion take time logarithmic in the size of the map.
+*)
+
+module type OrderedType =
+ sig
+ type t
+ (** The type of the map keys. *)
+ val compare : t -> t -> int
+ (** A total ordering function over the keys.
+ This is a two-argument function [f] such that
+ [f e1 e2] is zero if the keys [e1] and [e2] are equal,
+ [f e1 e2] is strictly negative if [e1] is smaller than [e2],
+ and [f e1 e2] is strictly positive if [e1] is greater than [e2].
+ Example: a suitable ordering function is the generic structural
+ comparison function {!Pervasives.compare}. *)
+ end
+(** Input signature of the functor {!Map.Make}. *)
+
+module type S =
+ sig
+ type key
+ (** The type of the map keys. *)
+
+ type (+'a) t
+ (** The type of maps from type [key] to type ['a]. *)
+
+ val empty: 'a t
+ (** The empty map. *)
+
+ val is_empty: 'a t -> bool
+ (** Test whether a map is empty or not. *)
+
+ val add: key -> 'a -> 'a t -> 'a t
+ (** [add x y m] returns a map containing the same bindings as
+ [m], plus a binding of [x] to [y]. If [x] was already bound
+ in [m], its previous binding disappears. *)
+
+ val find: key -> 'a t -> 'a
+ (** [find x m] returns the current binding of [x] in [m],
+ or raises [Not_found] if no such binding exists. *)
+
+ val remove: key -> 'a t -> 'a t
+ (** [remove x m] returns a map containing the same bindings as
+ [m], except for [x] which is unbound in the returned map. *)
+
+ val mem: key -> 'a t -> bool
+ (** [mem x m] returns [true] if [m] contains a binding for [x],
+ and [false] otherwise. *)
+
+ val iter: (key -> 'a -> unit) -> 'a t -> unit
+ (** [iter f m] applies [f] to all bindings in map [m].
+ [f] receives the key as first argument, and the associated value
+ as second argument. The bindings are passed to [f] in increasing
+ order with respect to the ordering over the type of the keys.
+ Only current bindings are presented to [f]:
+ bindings hidden by more recent bindings are not passed to [f]. *)
+
+ val map: ('a -> 'b) -> 'a t -> 'b t
+ (** [map f m] returns a map with same domain as [m], where the
+ associated value [a] of all bindings of [m] has been
+ replaced by the result of the application of [f] to [a].
+ The bindings are passed to [f] in increasing order
+ with respect to the ordering over the type of the keys. *)
+
+ val mapi: (key -> 'a -> 'b) -> 'a t -> 'b t
+ (** Same as {!Map.S.map}, but the function receives as arguments both the
+ key and the associated value for each binding of the map. *)
+
+ val fold: (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b
+ (** [fold f m a] computes [(f kN dN ... (f k1 d1 a)...)],
+ where [k1 ... kN] are the keys of all bindings in [m]
+ (in increasing order), and [d1 ... dN] are the associated data. *)
+
+ val compare: ('a -> 'a -> int) -> 'a t -> 'a t -> int
+ (** Total ordering between maps. The first argument is a total ordering
+ used to compare data associated with equal keys in the two maps. *)
+
+ val equal: ('a -> 'a -> bool) -> 'a t -> 'a t -> bool
+ (** [equal cmp m1 m2] tests whether the maps [m1] and [m2] are
+ equal, that is, contain equal keys and associate them with
+ equal data. [cmp] is the equality predicate used to compare
+ the data associated with the keys. *)
+
+ type interval =
+ key option * key option
+ (** A type of key intervals. An interval consists of a lower bound
+ and an upper bound, each of which can be absent. A key is
+ considered to lie within the interval if it is both greater than
+ (or equal to) the lower bound (if present) and less than (or
+ equal to) the upper bound (if present). *)
+
+ val split: interval -> 'a t -> 'a t
+ (* [split interval m] is a map that consists of all bindings in [m]
+ whose keys lie within [interval]. *)
+
+ val minimum: 'a t -> key * 'a
+ (* [minimum m] returns the binding that corresponds to the minimum
+ (smallest) key within the map [m]. If [m] is empty, [Not_found]
+ is raised. *)
+
+ val find_remove: key -> 'a t -> 'a * 'a t
+ (** [find_remove x m] returns a pair of the current binding of [x]
+ in [m], and a map containing the same bindings as [m], except
+ for [x] which is unbound in the returned map. [Not_found] is
+ raised if no binding for [x] exists. *)
+
+ val update: key -> ('a -> 'a) -> 'a t -> 'a t
+ (** If [m] maps [x] to [d], then [update x f m] maps [x] to [f d]
+ and coincides with [m] elsewhere. A binding for [x] in [m]
+ must exist. *)
+
+ val restrict: (key -> bool) -> 'a t -> 'a t
+ (** [restrict p m] is the restriction of the map [m] to only
+ the keys that satisfy predicate [p]. *)
+
+ end
+(** Output signature of the functor {!Map.Make}. *)
+
+module Make (Ord : OrderedType) : S with type key = Ord.t
+(** Functor building an implementation of the map structure
+ given a totally ordered type. *)
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+let map f = function
+ | None ->
+ None
+ | Some x ->
+ Some (f x)
+
+let iter f = function
+ | None ->
+ ()
+ | Some x ->
+ f x
+
+let fold f o accu =
+ match o with
+ | None ->
+ accu
+ | Some x ->
+ f x accu
+
+let print printer () = function
+ | None ->
+ ""
+ | Some x ->
+ printer () x
+
--- /dev/null
+
+(** This module provides some functions to manipulate values of type
+ [option]. *)
+
+(* Pasted from Pottier's PP compiler *)
+
+open PrintPottier
+
+val map: ('a -> 'b) -> 'a option -> 'b option
+val iter: ('a -> unit) -> 'a option -> unit
+val fold: ('a -> 'b -> 'b) -> 'a option -> 'b -> 'b
+val print: 'a printer -> 'a option printer
--- /dev/null
+let options = ref []
+
+let register o =
+ options := o @ !options
+
+let results () =
+ let usage_msg =
+ "Usage: "
+ ^ (Filename.basename Sys.executable_name)
+ ^ " [options] file..."
+ in
+ let extra_arguments = ref [] in
+ Arg.parse (Arg.align !options)
+ (fun s -> extra_arguments := s :: !extra_arguments)
+ usage_msg;
+ !extra_arguments
--- /dev/null
+open Lexing
+
+type t =
+ {
+ start_p : Lexing.position;
+ end_p : Lexing.position
+ }
+
+type position = t
+
+type 'a located =
+ {
+ value : 'a;
+ position : t;
+ }
+
+let value { value = v } =
+ v
+
+let position { position = p } =
+ p
+
+let destruct p =
+ (p.value, p.position)
+
+let with_pos p v =
+ {
+ value = v;
+ position = p;
+ }
+
+let with_poss p1 p2 v =
+ with_pos { start_p = p1; end_p = p2 } v
+
+let map f v =
+ {
+ value = f v.value;
+ position = v.position;
+ }
+
+let iter f { value = v } =
+ f v
+
+let mapd f v =
+ let w1, w2 = f v.value in
+ let pos = v.position in
+ ({ value = w1; position = pos }, { value = w2; position = pos })
+
+let dummy =
+ {
+ start_p = Lexing.dummy_pos;
+ end_p = Lexing.dummy_pos
+ }
+
+let unknown_pos v =
+ {
+ value = v;
+ position = dummy
+ }
+
+let start_of_position p = p.start_p
+
+let end_of_position p = p.end_p
+
+let filename_of_position p =
+ p.start_p.Lexing.pos_fname
+
+let line p =
+ p.pos_lnum
+
+let column p =
+ p.pos_cnum - p.pos_bol
+
+let characters p1 p2 =
+ (column p1, p2.pos_cnum - p1.pos_bol) (* intentionally [p1.pos_bol] *)
+
+let join x1 x2 =
+ {
+ start_p = if x1 = dummy then x2.start_p else x1.start_p;
+ end_p = if x2 = dummy then x1.end_p else x2.end_p
+ }
+
+let lex_join x1 x2 =
+ {
+ start_p = x1;
+ end_p = x2
+ }
+
+let join_located l1 l2 f =
+ {
+ value = f l1.value l2.value;
+ position = join l1.position l2.position;
+ }
+
+let string_of_lex_pos p =
+ let c = p.pos_cnum - p.pos_bol in
+ (string_of_int p.pos_lnum)^":"^(string_of_int c)
+
+let string_of_pos p =
+ let filename = filename_of_position p in
+ let l = line p.start_p in
+ let c1, c2 = characters p.start_p p.end_p in
+ if filename = "" then
+ Printf.sprintf "Line %d, characters %d-%d" l c1 c2
+ else
+ Printf.sprintf "File \"%s\", line %d, characters %d-%d" filename l c1 c2
+
+let pos_or_undef = function
+ | None -> dummy
+ | Some x -> x
+
+let cpos lexbuf =
+ {
+ start_p = Lexing.lexeme_start_p lexbuf;
+ end_p = Lexing.lexeme_end_p lexbuf;
+ }
+
+let with_cpos lexbuf v =
+ with_pos (cpos lexbuf) v
+
+let string_of_cpos lexbuf =
+ string_of_pos (cpos lexbuf)
+
+let joinf f t1 t2 =
+ join (f t1) (f t2)
+
+let ljoinf f =
+ List.fold_left (fun p t -> join p (f t)) dummy
+
+let join_located_list ls f =
+ {
+ value = f (List.map (fun l -> l.value) ls);
+ position = ljoinf (fun x -> x.position) ls
+ }
--- /dev/null
+(** Extension of standard library's positions. *)
+
+(** {2 Extended lexing positions} *)
+
+(** Abstract type for pairs of positions in the lexing stream. *)
+type t
+type position = t
+
+(** Decoration of a value with a position. *)
+type 'a located =
+ {
+ value : 'a;
+ position : t;
+ }
+
+(** [value dv] returns the raw value that underlies the
+ decorated value [dv]. *)
+val value: 'a located -> 'a
+
+(** [position dv] returns the position that decorates the
+ decorated value [dv]. *)
+val position: 'a located -> t
+
+(** [destruct dv] returns the couple of position and value
+ of a decorated value [dv]. *)
+val destruct: 'a located -> 'a * t
+
+(** [with_pos p v] decorates [v] with a position [p]. *)
+val with_pos : t -> 'a -> 'a located
+
+(** [with_cpos p v] decorates [v] with a lexical position [p]. *)
+val with_cpos: Lexing.lexbuf -> 'a -> 'a located
+
+(** [with_poss start stop v] decorates [v] with a position [(start, stop)]. *)
+val with_poss : Lexing.position -> Lexing.position -> 'a -> 'a located
+
+(** [unknown_pos x] decorates [v] with an unknown position. *)
+val unknown_pos : 'a -> 'a located
+
+(** This value is used when an object does not come from a particular
+ input location. *)
+val dummy: t
+
+(** [map f v] extends the decoration from [v] to [f v]. *)
+val map: ('a -> 'b) -> 'a located -> 'b located
+
+(** [iter f dv] applies [f] to the value inside [dv]. *)
+val iter: ('a -> unit) -> 'a located -> unit
+
+(** [mapd f v] extends the decoration from [v] to both members of the pair
+ [f v]. *)
+val mapd: ('a -> 'b1 * 'b2) -> 'a located -> 'b1 located * 'b2 located
+
+(** {2 Accessors} *)
+
+(** [column p] returns the number of characters from the
+ beginning of the line of the Lexing.position [p]. *)
+val column : Lexing.position -> int
+
+(** [column p] returns the line number of to the Lexing.position [p]. *)
+val line : Lexing.position -> int
+
+(** [characters p1 p2] returns the character interval
+ between [p1] and [p2] assuming they are located in the same
+ line. *)
+val characters : Lexing.position -> Lexing.position -> int * int
+
+(** [start_of_position p] returns the beginning of a position [p]. *)
+val start_of_position: t -> Lexing.position
+
+(** [end_of_position p] returns the end of a position [p]. *)
+val end_of_position: t -> Lexing.position
+
+(** [filename_of_position p] returns the filename of a position [p]. *)
+val filename_of_position: t -> string
+
+(** {2 Position handling} *)
+
+(** [join p1 p2] returns a position that starts where [p1]
+ starts and stops where [p2] stops. *)
+val join : t -> t -> t
+
+(** [lex_join l1 l2] returns a position that starts at [l1] and stops
+ at [l2]. *)
+val lex_join : Lexing.position -> Lexing.position -> t
+
+(** [string_of_lex_pos p] returns a string representation for
+ the lexing position [p]. *)
+val string_of_lex_pos : Lexing.position -> string
+
+(** [string_of_pos p] returns the standard (Emacs-like) representation
+ of the position [p]. *)
+val string_of_pos : t -> string
+
+(** [pos_or_undef po] is the identity function except if po = None,
+ in that case, it returns [undefined_position]. *)
+val pos_or_undef : t option -> t
+
+(** {2 Interaction with the lexer runtime} *)
+
+(** [cpos lexbuf] returns the current position of the lexer. *)
+val cpos : Lexing.lexbuf -> t
+
+(** [string_of_cpos p] returns a string representation of
+ the lexer's current position. *)
+val string_of_cpos : Lexing.lexbuf -> string
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+open Printf
+
+type punctuation =
+ unit -> string
+
+type 'a printer =
+ unit -> 'a -> string
+
+(* ------------------------------------------------------------------------- *)
+
+(* Newlines and indentation. *)
+
+let maxindent =
+ 120
+
+let whitespace =
+ String.make maxindent ' '
+
+let indentation =
+ ref 0
+
+let nl () =
+ "\n" ^ String.sub whitespace 0 !indentation
+
+let indent ofs producer () x =
+ let old_indentation = !indentation in
+ let new_indentation = old_indentation + ofs in
+ if new_indentation <= maxindent then
+ indentation := new_indentation;
+ let result = sprintf "%t%a" nl producer x in
+ indentation := old_indentation;
+ result
+
+(* ------------------------------------------------------------------------- *)
+
+(* Lists. *)
+
+let rec list elem () xs =
+ match xs with
+ | [] ->
+ ""
+ | x :: xs ->
+ sprintf "%a%a" elem x (list elem) xs
+
+let rec preclist delim elem () xs =
+ match xs with
+ | [] ->
+ ""
+ | x :: xs ->
+ sprintf "%t%a%a" delim elem x (preclist delim elem) xs
+
+let rec termlist delim elem () xs =
+ match xs with
+ | [] ->
+ ""
+ | x :: xs ->
+ sprintf "%a%t%a" elem x delim (termlist delim elem) xs
+
+let seplist sep elem () xs =
+ match xs with
+ | [] ->
+ ""
+ | x :: xs ->
+ sprintf "%a%a" elem x (preclist sep elem) xs
+
+let annlist announcement list () xs =
+ match xs with
+ | [] ->
+ ""
+ | _ :: _ ->
+ sprintf "%t%a" announcement list xs
+
+(* ------------------------------------------------------------------------- *)
+
+(* Punctuation. *)
+
+let space () =
+ sprintf " "
+
+let comma () =
+ sprintf ", "
+
+let semicolon () =
+ sprintf "; "
+
+let var () =
+ sprintf "var "
+
+let seminl () =
+ sprintf "%t%t" semicolon nl
+
+let nlspace k () =
+ sprintf "%t%s" nl (String.make k ' ')
+
+let nlnl () =
+ sprintf "%t%t" nl nl
+
+(* ------------------------------------------------------------------------- *)
+
+(* [atmost n delimiter stop] normally prints a [delimiter], except that,
+ every [n] calls, it prints a [stop] in addition. *)
+
+let atmost n (delimiter : punctuation) (stop : punctuation) : punctuation =
+ let i =
+ ref 0
+ in
+ function () ->
+ incr i;
+ delimiter() ^
+ if !i = n then begin
+ i := 0;
+ stop()
+ end
+ else
+ ""
+
+(* ------------------------------------------------------------------------- *)
+
+(* Tables. *)
+
+let width column =
+ List.fold_left (fun width x ->
+ max width (String.length x)
+ ) 0 column
+
+let pad width x =
+ let y = String.make width ' ' in
+ String.blit x 0 y 0 (String.length x);
+ y
+
+let pad column =
+ List.map (pad (width column)) column
+
+let rec zipcat column1 column2 =
+ List.fold_right2 (fun x1 x2 column ->
+ (x1 ^ x2) :: column
+ ) column1 column2 []
+
+let catenate columns =
+ match columns with
+ | [] ->
+ []
+ | column :: columns ->
+ List.fold_left (fun table column ->
+ zipcat table (pad column)
+ ) (pad column) columns
+
+let transposerev lines =
+ match lines with
+ | [] ->
+ []
+ | line :: lines ->
+ List.fold_left (fun columns line ->
+ List.fold_right2 (fun x column columns ->
+ (x :: column) :: columns
+ ) line columns []
+ ) (List.map (fun x -> [ x ]) line) lines
+
+(* ------------------------------------------------------------------------- *)
+
+(* Conditional. *)
+
+let showif flag printer x =
+ if flag then begin
+ Printf.fprintf stdout "%s%!" (sprintf "%a" printer x);
+ x
+ end
+ else
+ x
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(** This module provides printing utilities. *)
+
+type punctuation =
+ unit -> string
+
+type 'a printer =
+ unit -> 'a -> string
+
+(* [nl] prints a newline character and a certain amount of
+ whitespace that reflects the current indentation level. *)
+
+val nl: punctuation
+
+(* [indent ofs] transforms a printer into another printer
+ that indents material [ofs] characters to the right. *)
+
+val indent: int -> 'a printer -> 'a printer
+
+(* [list] prints a list without any delimiters. *)
+
+val list: 'a printer -> 'a list printer
+
+(* [preclist] prints a list where a delimiter precedes every
+ element. *)
+
+val preclist: punctuation -> 'a printer -> 'a list printer
+
+(* [termlist] prints a list where a delimiter terminates every
+ element. *)
+
+val termlist: punctuation -> 'a printer -> 'a list printer
+
+(* [seplist] prints a list where a separator separates every two
+ consecutive elements. *)
+
+val seplist: punctuation -> 'a printer -> 'a list printer
+
+(* [annlist] prints nothing if its list argument is empty, and prints
+ an announcement followed by the list if the list is nonempty. *)
+
+val annlist: punctuation -> 'a list printer -> 'a list printer
+
+(* Punctuation. *)
+
+val space: punctuation
+val comma: punctuation
+val semicolon: punctuation
+val var: punctuation
+val seminl: punctuation
+val nlspace: int -> punctuation
+val nlnl: punctuation
+
+(* [atmost n delimiter stop] normally prints a [delimiter], except that,
+ every [n] calls, it prints a [stop] in addition. *)
+
+val atmost: int -> punctuation -> punctuation -> punctuation
+
+(* [catenate] turns a list of columns into a single column, adding
+ padding (whitespace) to enforce alignment. *)
+
+val catenate: string list list -> string list
+
+(* [transposerev] turns a reversed list of lines into a list of columns. *)
+
+val transposerev: string list list -> string list list
+
+(* [showif flag printer x] displays [x] on standard output using
+ [printer] when [flag] is set. It returns [x]. *)
+
+val showif: bool -> 'a printer -> 'a -> 'a
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+open PrintPottier
+
+let print_graph instruction successors () (graph, entry) =
+
+ (* Print instructions in depth-first order; this is a
+ rather natural and readable order. *)
+
+ let rec visit (visited, lines) l =
+ if Label.Set.mem l visited then
+ visited, lines
+ else
+ let visited = Label.Set.add l visited in
+ let i = Label.Map.find l graph in
+ let lines = instruction l i :: lines in
+ List.fold_left visit (visited, lines) (successors i)
+ in
+ let _, lines = visit (Label.Set.empty, []) entry in
+ String.concat "\n" (catenate (transposerev lines))
+
--- /dev/null
+
+(** This module provides a function to print Control Flow Graphs. *)
+
+(* Pasted from Pottier's PP compiler *)
+
+open PrintPottier
+
+val print_graph:
+ (Label.t -> 'instruction -> string list) -> (* prints instruction [i] at label [l] *)
+ ('instruction -> Label.t list) -> (* provides succcessors of instruction [i] *)
+ ('instruction Label.Map.t * Label.t) printer (* control flow graph and entry point printer *)
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+open Printf
+
+type punctuation =
+ unit -> string
+
+type 'a printer =
+ unit -> 'a -> string
+
+(* ------------------------------------------------------------------------- *)
+
+(* Newlines and indentation. *)
+
+let maxindent =
+ 120
+
+let whitespace =
+ String.make maxindent ' '
+
+let indentation =
+ ref 0
+
+let nl () =
+ "\n" ^ String.sub whitespace 0 !indentation
+
+let indent ofs producer () x =
+ let old_indentation = !indentation in
+ let new_indentation = old_indentation + ofs in
+ if new_indentation <= maxindent then
+ indentation := new_indentation;
+ let result = sprintf "%t%a" nl producer x in
+ indentation := old_indentation;
+ result
+
+(* ------------------------------------------------------------------------- *)
+
+(* Lists. *)
+
+let rec list elem () xs =
+ match xs with
+ | [] ->
+ ""
+ | x :: xs ->
+ sprintf "%a%a" elem x (list elem) xs
+
+let rec preclist delim elem () xs =
+ match xs with
+ | [] ->
+ ""
+ | x :: xs ->
+ sprintf "%t%a%a" delim elem x (preclist delim elem) xs
+
+let rec termlist delim elem () xs =
+ match xs with
+ | [] ->
+ ""
+ | x :: xs ->
+ sprintf "%a%t%a" elem x delim (termlist delim elem) xs
+
+let seplist sep elem () xs =
+ match xs with
+ | [] ->
+ ""
+ | x :: xs ->
+ sprintf "%a%a" elem x (preclist sep elem) xs
+
+let annlist announcement list () xs =
+ match xs with
+ | [] ->
+ ""
+ | _ :: _ ->
+ sprintf "%t%a" announcement list xs
+
+(* ------------------------------------------------------------------------- *)
+
+(* Punctuation. *)
+
+let space () =
+ sprintf " "
+
+let comma () =
+ sprintf ", "
+
+let semicolon () =
+ sprintf "; "
+
+let var () =
+ sprintf "var "
+
+let seminl () =
+ sprintf "%t%t" semicolon nl
+
+let nlspace k () =
+ sprintf "%t%s" nl (String.make k ' ')
+
+let nlnl () =
+ sprintf "%t%t" nl nl
+
+(* ------------------------------------------------------------------------- *)
+
+(* [atmost n delimiter stop] normally prints a [delimiter], except that,
+ every [n] calls, it prints a [stop] in addition. *)
+
+let atmost n (delimiter : punctuation) (stop : punctuation) : punctuation =
+ let i =
+ ref 0
+ in
+ function () ->
+ incr i;
+ delimiter() ^
+ if !i = n then begin
+ i := 0;
+ stop()
+ end
+ else
+ ""
+
+(* ------------------------------------------------------------------------- *)
+
+(* Tables. *)
+
+let width column =
+ List.fold_left (fun width x ->
+ max width (String.length x)
+ ) 0 column
+
+let pad width x =
+ let y = String.make width ' ' in
+ String.blit x 0 y 0 (String.length x);
+ y
+
+let pad column =
+ List.map (pad (width column)) column
+
+let rec zipcat column1 column2 =
+ List.fold_right2 (fun x1 x2 column ->
+ (x1 ^ x2) :: column
+ ) column1 column2 []
+
+let catenate columns =
+ match columns with
+ | [] ->
+ []
+ | column :: columns ->
+ List.fold_left (fun table column ->
+ zipcat table (pad column)
+ ) (pad column) columns
+
+let transposerev lines =
+ match lines with
+ | [] ->
+ []
+ | line :: lines ->
+ List.fold_left (fun columns line ->
+ List.fold_right2 (fun x column columns ->
+ (x :: column) :: columns
+ ) line columns []
+ ) (List.map (fun x -> [ x ]) line) lines
+
+(* ------------------------------------------------------------------------- *)
+
+(* Conditional. *)
+
+let showif flag printer x =
+ if flag then begin
+ Printf.fprintf stdout "%s%!" (sprintf "%a" printer x);
+ x
+ end
+ else
+ x
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(** This module provides printing utilities. *)
+
+type punctuation =
+ unit -> string
+
+type 'a printer =
+ unit -> 'a -> string
+
+(* [nl] prints a newline character and a certain amount of
+ whitespace that reflects the current indentation level. *)
+
+val nl: punctuation
+
+(* [indent ofs] transforms a printer into another printer
+ that indents material [ofs] characters to the right. *)
+
+val indent: int -> 'a printer -> 'a printer
+
+(* [list] prints a list without any delimiters. *)
+
+val list: 'a printer -> 'a list printer
+
+(* [preclist] prints a list where a delimiter precedes every
+ element. *)
+
+val preclist: punctuation -> 'a printer -> 'a list printer
+
+(* [termlist] prints a list where a delimiter terminates every
+ element. *)
+
+val termlist: punctuation -> 'a printer -> 'a list printer
+
+(* [seplist] prints a list where a separator separates every two
+ consecutive elements. *)
+
+val seplist: punctuation -> 'a printer -> 'a list printer
+
+(* [annlist] prints nothing if its list argument is empty, and prints
+ an announcement followed by the list if the list is nonempty. *)
+
+val annlist: punctuation -> 'a list printer -> 'a list printer
+
+(* Punctuation. *)
+
+val space: punctuation
+val comma: punctuation
+val semicolon: punctuation
+val var: punctuation
+val seminl: punctuation
+val nlspace: int -> punctuation
+val nlnl: punctuation
+
+(* [atmost n delimiter stop] normally prints a [delimiter], except that,
+ every [n] calls, it prints a [stop] in addition. *)
+
+val atmost: int -> punctuation -> punctuation -> punctuation
+
+(* [catenate] turns a list of columns into a single column, adding
+ padding (whitespace) to enforce alignment. *)
+
+val catenate: string list list -> string list
+
+(* [transposerev] turns a reversed list of lines into a list of columns. *)
+
+val transposerev: string list list -> string list list
+
+(* [showif flag printer x] displays [x] on standard output using
+ [printer] when [flag] is set. It returns [x]. *)
+
+val showif: bool -> 'a printer -> 'a -> 'a
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(* This module offers sets of elements where each element carries an
+ integer priority. All operations execute in logarithmic time with
+ respect to the number of elements in the set. *)
+
+module Make (X : Set.OrderedType)
+= struct
+
+ (* First, define normal sets and maps. *)
+
+ module Set = Set.Make(X)
+
+ module Map = MyMap.Make(X)
+
+ (* Next, define maps of integers to nonempty sets of elements. *)
+
+ module IntMap = struct
+
+ module M = MyMap.Make (struct
+ type t = int
+ let compare = compare
+ end)
+
+ include M
+
+ module H = SetMap.MakeHetero(Set)(M)
+
+ let update = H.update
+
+ end
+
+ (* Now, define priority sets. *)
+
+ type t = {
+
+ (* A mapping of elements to priorities. *)
+
+ priority: int Map.t;
+
+ (* A mapping of priorities to sets of elements. By convention, a
+ priority has no entry in this table if that entry would be an
+ empty set of elements. This allows finding the
+ lowest-priority element in logarithmic time. *)
+
+ level: Set.t IntMap.t
+
+ }
+
+ (* [empty] is the empty set. *)
+
+ let empty =
+ {
+ priority = Map.empty;
+ level = IntMap.empty
+ }
+
+ (* [priority x s] looks up the priority of element [x]. *)
+
+ let priority x s =
+ try
+ Map.find x s.priority
+ with Not_found ->
+ assert false
+
+ (* [add x p s] inserts element [x] with priority [p]. *)
+
+ let add x p s =
+ assert (not (Map.mem x s.priority));
+ {
+ priority = Map.add x p s.priority;
+ level = IntMap.update p (Set.add x) s.level
+ }
+
+ (* [remove x s] removes element [x]. *)
+
+ let remove x s =
+ let p, priority =
+ try
+ Map.find_remove x s.priority
+ with Not_found ->
+ assert false
+ in
+ let level =
+ IntMap.update p (function xs ->
+ assert (Set.mem x xs);
+ Set.remove x xs
+ ) s.level
+ in
+ {
+ priority = priority;
+ level = level
+ }
+
+ (* [change x p s] changes the priority of element [x] to [p]. *)
+
+ let change x p1 s =
+ let p0 = priority x s in
+ if p0 = p1 then
+ s
+ else
+ {
+ priority = Map.add x p1 s.priority; (* overriding previous entry *)
+ level = IntMap.update p1 (Set.add x) (IntMap.update p0 (Set.remove x) s.level)
+ }
+
+ (* [increment x d s] increases the priority of element [x] by [d]. *)
+
+ let increment x d s =
+ change x (priority x s + d) s
+
+ (* [incrementifx x p s] increases the priority of element [x] by [d]
+ if [x] is a member of the priority set. *)
+
+ let incrementifx x d s =
+ if Map.mem x s.priority then
+ increment x d s
+ else
+ s
+
+ (* [lowest s] returns [Some (x, p)], where element [x] has minimum
+ priority [p] among all elements of [s]. It returns [None] if [s]
+ is empty. *)
+
+ let lowest s =
+ try
+ let p, xs = IntMap.minimum s.level in (* can fail if set is empty *)
+ try
+ Some (Set.choose xs, p) (* cannot fail *)
+ with Not_found ->
+ assert false
+ with Not_found ->
+ None
+
+ (* [fold f s accu] fold over the set [s]. Elements are presented
+ to [f] in increasing order of priority. *)
+
+ let fold f s accu =
+ IntMap.fold (fun p xs accu ->
+ Set.fold (fun x accu ->
+ f x p accu
+ ) xs accu
+ ) s.level accu
+
+end
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(** This module offers sets of elements where each element carries an
+ integer priority. All operations execute in logarithmic time with
+ respect to the number of elements in the set. *)
+
+module Make (X : Set.OrderedType) : sig
+
+ (* This is the type of priority sets. *)
+
+ type t
+
+ (* [empty] is the empty set. *)
+
+ val empty: t
+
+ (* [add x p s] inserts element [x] with priority [p]. *)
+
+ val add: X.t -> int -> t -> t
+
+ (* [remove x s] removes element [x]. *)
+
+ val remove: X.t -> t -> t
+
+ (* [change x p s] changes the priority of element [x] to [p]. *)
+
+ val change: X.t -> int -> t -> t
+
+ (* [increment x d s] increases the priority of element [x] by [d]. *)
+
+ val increment: X.t -> int -> t -> t
+
+ (* [incrementifx x p s] increases the priority of element [x] by [d]
+ if [x] is a member of the priority set. *)
+
+ val incrementifx: X.t -> int -> t -> t
+
+ (* [priority x s] looks up the priority of element [x]. *)
+
+ val priority: X.t -> t -> int
+
+ (* [lowest s] returns [Some (x, p)], where element [x] has minimum
+ priority [p] among all elements of [s]. It returns [None] if [s]
+ is empty. *)
+
+ val lowest: t -> (X.t * int) option
+
+ (* [fold f s accu] fold over the set [s]. Elements are presented
+ to [f] in increasing order of priority. *)
+
+ val fold: (X.t -> int -> 'a -> 'a) -> t -> 'a -> 'a
+
+end
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(* This signature defines a few operations over maps of keys to
+ nonempty sets of items. Keys and items can have distinct types,
+ hence the name [Heterogeneous].
+
+ These maps can be used to represent directed bipartite graphs whose
+ source vertices are keys and whose target vertices are items. Each
+ key is mapped to the set of its successors. *)
+
+module type Heterogeneous = sig
+
+ (* These are the types of keys, items, and sets of items. *)
+
+ type key
+ type item
+ type itemset
+
+ (* This is the type of maps of keys to sets of items. *)
+
+ type t
+
+ (* [find x m] is the item set associated with key [x] in map [m], if
+ such an association is defined; it is the empty set otherwise. *)
+
+ val find: key -> t -> itemset
+
+ (* [add x is m] extends [m] with a binding of [x] to the item set
+ [is], if [is] is nonempty. If [is] is empty, it removes [x] from
+ [m]. *)
+
+ val add: key -> itemset -> t -> t
+
+ (* [update x f m] is [add x (f (find x m)) m]. *)
+
+ val update: key -> (itemset -> itemset) -> t -> t
+
+ (* [mkedge x i m] extends [m] with a binding of [x] to the union of
+ the set [m x] and the singleton [i], where [m x] is taken to be
+ empty if undefined. In terms of graphs, [mkedge x i m] extends
+ the graph [m] with an edge of [x] to [i]. *)
+
+ val mkedge: key -> item -> t -> t
+
+ (* [rmedge x i m] extends [m] with a binding of [x] to the
+ difference of the set [m x] and the singleton [i], where the
+ binding is considered undefined if that difference is empty. In
+ terms of graphs, [rmedge x i m] removes an edge of [x] to [i]
+ to the graph [m]. *)
+
+ val rmedge: key -> item -> t -> t
+
+ (* [iter] and [fold] iterate over all edges in the graph. *)
+
+ val iter: (key * item -> unit) -> t -> unit
+ val fold: (key * item -> 'a -> 'a) -> t -> 'a -> 'a
+
+ (* [pick m p] returns an arbitrary edge that satisfies predicate
+ [p], if the graph contains one. *)
+
+ val pick: t -> (key * item -> bool) -> (key * item) option
+
+end
+
+(* This functor offers an implementation of [Heterogeneous] out of
+ standard implementations of sets and maps. *)
+
+module MakeHetero
+ (Set : sig
+ type elt
+ type t
+ val empty: t
+ val is_empty: t -> bool
+ val add: elt -> t -> t
+ val remove: elt -> t -> t
+ val fold: (elt -> 'a -> 'a) -> t -> 'a -> 'a
+ end)
+ (Map : sig
+ type key
+ type 'a t
+ val add: key -> 'a -> 'a t -> 'a t
+ val find: key -> 'a t -> 'a
+ val remove: key -> 'a t -> 'a t
+ val fold: (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b
+ end)
+= struct
+
+ type key = Map.key
+ type item = Set.elt
+ type itemset = Set.t
+ type t = Set.t Map.t
+
+ let find x m =
+ try
+ Map.find x m
+ with Not_found ->
+ Set.empty
+
+ let add x is m =
+ if Set.is_empty is then
+ Map.remove x m
+ else
+ Map.add x is m
+
+ let update x f m =
+ add x (f (find x m)) m
+
+ let mkedge x i m =
+ update x (Set.add i) m
+
+ let rmedge x i m =
+ update x (Set.remove i) m
+
+ let fold f m accu =
+ Map.fold (fun source targets accu ->
+ Set.fold (fun target accu ->
+ f (source, target) accu
+ ) targets accu
+ ) m accu
+
+ let iter f m =
+ fold (fun edge () -> f edge) m ()
+
+ exception Picked of (key * item)
+
+ let pick m p =
+ try
+ iter (fun edge ->
+ if p edge then
+ raise (Picked edge)
+ ) m;
+ None
+ with Picked edge ->
+ Some edge
+
+end
+
+(* This signature defines a few common operations over maps of keys
+ to sets of keys -- that is, keys and items have the same type,
+ hence the name [Homogeneous].
+
+ These maps can be used to represent general directed graphs. *)
+
+module type Homogeneous = sig
+
+ include Heterogeneous (* [key] and [item] intended to be equal *)
+
+ (* [mkbiedge x1 x2 m] is [mkedge x1 x2 (mkedge x2 x1 m)]. *)
+
+ val mkbiedge: key -> key -> t -> t
+
+ (* [rmbiedge x1 x2 m] is [rmedge x1 x2 (rmedge x2 x1 m)]. *)
+
+ val rmbiedge: key -> key -> t -> t
+
+ (* [reverse m] is the reverse of graph [m]. *)
+
+ val reverse: t -> t
+
+ (* [restrict m] is the graph obtained by keeping only the vertices
+ that satisfy predicate [p]. *)
+
+ val restrict: (key -> bool) -> t -> t
+
+end
+
+module MakeHomo
+ (Set : sig
+ type elt
+ type t
+ val empty: t
+ val is_empty: t -> bool
+ val add: elt -> t -> t
+ val remove: elt -> t -> t
+ val fold: (elt -> 'a -> 'a) -> t -> 'a -> 'a
+ val filter: (elt -> bool) -> t -> t
+ end)
+ (Map : sig
+ type key = Set.elt
+ type 'a t
+ val empty: 'a t
+ val add: key -> 'a -> 'a t -> 'a t
+ val find: key -> 'a t -> 'a
+ val remove: key -> 'a t -> 'a t
+ val fold: (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b
+ end)
+= struct
+
+ include MakeHetero(Set)(Map)
+
+ let symmetric transform x1 x2 m =
+ transform x1 x2 (transform x2 x1 m)
+
+ let mkbiedge =
+ symmetric mkedge
+
+ let rmbiedge =
+ symmetric rmedge
+
+ let reverse m =
+ Map.fold (fun source targets predecessors ->
+ Set.fold (fun target predecessors ->
+
+ (* We have a direct edge from [source] to [target]. Thus, we
+ record the existence of a reverse edge from [target] to
+ [source]. *)
+
+ mkedge target source predecessors
+
+ ) targets predecessors
+ ) m Map.empty
+
+ let restrict p m =
+ Map.fold (fun source targets m ->
+ if p source then
+ let targets = Set.filter p targets in
+ if Set.is_empty targets then
+ m
+ else
+ Map.add source targets m
+ else
+ m
+ ) m Map.empty
+
+end
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(** This signature defines a few operations over maps of keys to
+ nonempty sets of items. Keys and items can have distinct types,
+ hence the name [Heterogeneous].
+
+ These maps can be used to represent directed bipartite graphs whose
+ source vertices are keys and whose target vertices are items. Each
+ key is mapped to the set of its successors. *)
+
+module type Heterogeneous = sig
+
+ (* These are the types of keys, items, and sets of items. *)
+
+ type key
+ type item
+ type itemset
+
+ (* This is the type of maps of keys to sets of items. *)
+
+ type t
+
+ (* [find x m] is the item set associated with key [x] in map [m], if
+ such an association is defined; it is the empty set otherwise. *)
+
+ val find: key -> t -> itemset
+
+ (* [add x is m] extends [m] with a binding of [x] to the item set
+ [is], if [is] is nonempty. If [is] is empty, it removes [x] from
+ [m]. *)
+
+ val add: key -> itemset -> t -> t
+
+ (* [update x f m] is [add x (f (find x m)) m]. *)
+
+ val update: key -> (itemset -> itemset) -> t -> t
+
+ (* [mkedge x i m] extends [m] with a binding of [x] to the union of
+ the set [m x] and the singleton [i], where [m x] is taken to be
+ empty if undefined. In terms of graphs, [mkedge x i m] extends
+ the graph [m] with an edge of [x] to [i]. *)
+
+ val mkedge: key -> item -> t -> t
+
+ (* [rmedge x i m] extends [m] with a binding of [x] to the
+ difference of the set [m x] and the singleton [i], where the
+ binding is considered undefined if that difference is empty. In
+ terms of graphs, [rmedge x i m] removes an edge of [x] to [i]
+ to the graph [m]. *)
+
+ val rmedge: key -> item -> t -> t
+
+ (* [iter] and [fold] iterate over all edges in the graph. *)
+
+ val iter: (key * item -> unit) -> t -> unit
+ val fold: (key * item -> 'a -> 'a) -> t -> 'a -> 'a
+
+ (* [pick m p] returns an arbitrary edge that satisfies predicate
+ [p], if the graph contains one. *)
+
+ val pick: t -> (key * item -> bool) -> (key * item) option
+
+end
+
+(* This functor offers an implementation of [Heterogeneous] out of
+ standard implementations of sets and maps. *)
+
+module MakeHetero
+ (Set : sig
+ type elt
+ type t
+ val empty: t
+ val is_empty: t -> bool
+ val add: elt -> t -> t
+ val remove: elt -> t -> t
+ val fold: (elt -> 'a -> 'a) -> t -> 'a -> 'a
+ end)
+ (Map : sig
+ type key
+ type 'a t
+ val add: key -> 'a -> 'a t -> 'a t
+ val find: key -> 'a t -> 'a
+ val remove: key -> 'a t -> 'a t
+ val fold: (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b
+ end)
+ : Heterogeneous with type key = Map.key
+ and type item = Set.elt
+ and type itemset = Set.t
+ and type t = Set.t Map.t
+
+(* This signature defines a few common operations over maps of keys
+ to sets of keys -- that is, keys and items have the same type,
+ hence the name [Homogeneous].
+
+ These maps can be used to represent general directed graphs. *)
+
+module type Homogeneous = sig
+
+ include Heterogeneous (* [key] and [item] intended to be equal *)
+
+ (* [mkbiedge x1 x2 m] is [mkedge x1 x2 (mkedge x2 x1 m)]. *)
+
+ val mkbiedge: key -> key -> t -> t
+
+ (* [rmbiedge x1 x2 m] is [rmedge x1 x2 (rmedge x2 x1 m)]. *)
+
+ val rmbiedge: key -> key -> t -> t
+
+ (* [reverse m] is the reverse of graph [m]. *)
+
+ val reverse: t -> t
+
+ (* [restrict m] is the graph obtained by keeping only the vertices
+ that satisfy predicate [p]. *)
+
+ val restrict: (key -> bool) -> t -> t
+
+end
+
+module MakeHomo
+ (Set : sig
+ type elt
+ type t
+ val empty: t
+ val is_empty: t -> bool
+ val add: elt -> t -> t
+ val remove: elt -> t -> t
+ val fold: (elt -> 'a -> 'a) -> t -> 'a -> 'a
+ val filter: (elt -> bool) -> t -> t
+ end)
+ (Map : sig
+ type key = Set.elt
+ type 'a t
+ val empty: 'a t
+ val add: key -> 'a -> 'a t -> 'a t
+ val find: key -> 'a t -> 'a
+ val remove: key -> 'a t -> 'a t
+ val fold: (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b
+ end)
+ : Homogeneous with type key = Set.elt
+ and type item = Set.elt
+ and type itemset = Set.t
+ and type t = Set.t Map.t
+
--- /dev/null
+
+(** The module type declares functions to manipulate and create fresh
+ strings. *)
+
+module type S = sig
+
+ type t = string
+
+ val compare : t -> t -> int
+
+ module Set : sig
+ include Set.S with type elt = t
+ val of_list : elt list -> t
+ val unionl : t list -> t
+ end
+
+ module Map : Map.S with type key = t
+
+ module Gen : sig
+ type universe
+ val fresh_prefix : Set.t -> string -> string
+ val new_universe : string -> universe
+ val fresh : universe -> string
+ end
+
+ val make_unique : Set.t -> (string -> string)
+ val make_fresh : Set.t -> string -> (unit -> string)
+
+ val dummy : t
+
+end
--- /dev/null
+
+(** FIXME: document here *)
+
+type t = string
+
+let compare = String.compare
+
+
+module Set = struct
+ include Set.Make (String)
+ let of_list l =
+ let f res e = add e res in
+ List.fold_left f empty l
+ let unionl l = List.fold_left union empty l
+end
+
+
+module Map = Map.Make (String)
+
+
+module Gen = struct
+
+ type universe = { prefix : string ; mutable next : int }
+
+ let added_suffix = "_"
+
+ let is_prefix prefix s =
+ let l = String.length prefix in
+ (String.length s >= l) && (String.sub s 0 l = prefix)
+
+ let has_prefix set prefix =
+ let f s b = b || (is_prefix prefix s) in
+ Set.fold f set false
+
+ let fresh_prefix set prefix =
+ let rec aux prefix =
+ if has_prefix set prefix then aux (prefix ^ added_suffix)
+ else prefix in
+ aux prefix
+
+
+ let new_universe s = { prefix = s ; next = 0 }
+
+ let fresh u =
+ let s = u.prefix ^ (string_of_int u.next) in
+ u.next <- u.next + 1 ;
+ s
+
+end
+
+let make_unique set =
+ let set_ref = ref set in
+ let unique s =
+ let res = Gen.fresh_prefix !set_ref s in
+ set_ref := Set.add res !set_ref ;
+ res in
+ unique
+
+let make_fresh set prefix =
+ let fresh_prefix = Gen.fresh_prefix set prefix in
+ let universe = Gen.new_universe fresh_prefix in
+ (fun () -> Gen.fresh universe)
+
+let dummy = ""
--- /dev/null
+
+(** This module provides functions to manipulate and create fresh
+ strings. *)
+
+include StringSig.S
--- /dev/null
+exception ParsingError
+
+type 'token with_pos = 'token * Lexing.position * Lexing.position
+
+let parsing_step = "during parsing"
+
+let process ~lexer_init ~lexer_fun ~parser_fun ~input =
+ parser_fun lexer_fun (lexer_init input)
+
+let process ~lexer_init ~lexer_fun ~parser_fun ~input = try
+ process ~lexer_init ~lexer_fun ~parser_fun ~input
+with Sys_error msg ->
+ Error.global_error parsing_step msg
+
--- /dev/null
+(** This module provides a general gluing function between lexers and
+ parsers. *)
+
+(** [process init lex parse input] initialized a lexing buffer using
+ [init input] and make [lex] and [parse] communicate through it
+ to produce an abstract syntax tree. *)
+val process :
+ lexer_init : ('a -> 'lexbuf) ->
+ lexer_fun : ('lexbuf -> 'token) ->
+ parser_fun : (('lexbuf -> 'token) -> 'lexbuf -> 'ast) ->
+ input : 'a ->
+ 'ast
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(** This module implements a simple and efficient union/find algorithm.
+ See Robert E. Tarjan, ``Efficiency of a Good But Not Linear Set
+ Union Algorithm'', JACM 22(2), 1975. *)
+
+(** The abstraction defined by this module is a set of points,
+ partitioned into equivalence classes. With each equivalence class,
+ a piece of information, of abstract type ['a], is associated; we
+ call it a descriptor.
+
+ A point is implemented as a cell, whose (mutable) contents consist
+ of a single link to either information about the equivalence class,
+ or another point. Thus, points form a graph, which must be acyclic,
+ and whose connected components are the equivalence classes. In
+ every equivalence class, exactly one point has no outgoing edge,
+ and carries information about the class instead. It is the class's
+ representative element.
+
+ Information about a class consists of an integer weight (the number
+ of elements in the class) and of the class's descriptor. *)
+type 'a point = {
+ mutable link: 'a link
+ }
+
+and 'a link =
+ | Info of 'a info
+ | Link of 'a point
+
+and 'a info = {
+ mutable weight: int;
+ mutable descriptor: 'a
+ }
+
+(** [fresh desc] creates a fresh point and returns it. It forms an
+ equivalence class of its own, whose descriptor is [desc]. *)
+let fresh desc = {
+ link = Info { weight = 1; descriptor = desc }
+}
+
+(** [repr point] returns the representative element of [point]'s
+ equivalence class. It is found by starting at [point] and following
+ the links. For efficiency, the function performs path compression
+ at the same time. *)
+let rec repr point =
+ match point.link with
+ | Link point' ->
+ let point'' = repr point' in
+ if point'' != point' then
+
+ (* [point''] is [point']'s representative element. Because we
+ just invoked [repr point'], [point'.link] must be [Link
+ point'']. We write this value into [point.link], thus
+ performing path compression. Note that this function never
+ performs memory allocation. *)
+
+ point.link <- point'.link;
+ point''
+ | Info _ ->
+ point
+
+(** [find point] returns the descriptor associated with [point]'s
+ equivalence class. *)
+let rec find point =
+
+ (* By not calling [repr] immediately, we optimize the common cases
+ where the path starting at [point] has length 0 or 1, at the
+ expense of the general case. *)
+
+ match point.link with
+ | Info info
+ | Link { link = Info info } ->
+ info.descriptor
+ | Link { link = Link _ } ->
+ find (repr point)
+
+let rec change point v =
+ match point.link with
+ | Info info
+ | Link { link = Info info } ->
+ info.descriptor <- v
+ | Link { link = Link _ } ->
+ change (repr point) v
+
+(** [union point1 point2] merges the equivalence classes associated
+ with [point1] and [point2] (which must be distinct) into a single
+ class whose descriptor is that originally associated with [point2].
+
+ The fact that [point1] and [point2] do not originally belong to the
+ same class guarantees that we do not create a cycle in the graph.
+
+ The weights are used to determine whether [point1] should be made
+ to point to [point2], or vice-versa. By making the representative
+ of the smaller class point to that of the larger class, we
+ guarantee that paths remain of logarithmic length (not accounting
+ for path compression, which makes them yet smaller). *)
+let union point1 point2 =
+ let point1 = repr point1
+ and point2 = repr point2 in
+ assert (point1 != point2);
+ match point1.link, point2.link with
+ | Info info1, Info info2 ->
+ let weight1 = info1.weight
+ and weight2 = info2.weight in
+ if weight1 >= weight2 then begin
+ point2.link <- Link point1;
+ info1.weight <- weight1 + weight2;
+ info1.descriptor <- info2.descriptor
+ end
+ else begin
+ point1.link <- Link point2;
+ info2.weight <- weight1 + weight2
+ end
+ | _, _ ->
+ assert false (* [repr] guarantees that [link] matches [Info _]. *)
+
+(** [equivalent point1 point2] tells whether [point1] and [point2]
+ belong to the same equivalence class. *)
+let equivalent point1 point2 =
+ repr point1 == repr point2
+
+(** [eunion point1 point2] is identical to [union], except it does
+ nothing if [point1] and [point2] are already equivalent. *)
+let eunion point1 point2 =
+ if not (equivalent point1 point2) then
+ union point1 point2
+
+(** [redundant] maps all members of an equivalence class, but one, to
+ [true]. *)
+let redundant = function
+ | { link = Link _ } ->
+ true
+ | { link = Info _ } ->
+ false
+
--- /dev/null
+(* Pasted from Pottier's PP compiler *)
+
+(** This module implements a simple and efficient union/find algorithm.
+ See Robert E. Tarjan, ``Efficiency of a Good But Not Linear Set
+ Union Algorithm'', JACM 22(2), 1975. *)
+
+(** The abstraction defined by this module is a set of points,
+ partitioned into equivalence classes. With each equivalence class,
+ a piece of information, of abstract type ['a], is associated; we
+ call it a descriptor. *)
+type 'a point
+
+(** [fresh desc] creates a fresh point and returns it. It forms an
+ equivalence class of its own, whose descriptor is [desc]. *)
+val fresh: 'a -> 'a point
+
+(** [find point] returns the descriptor associated with [point]'s
+ equivalence class. *)
+val find: 'a point -> 'a
+
+(** [union point1 point2] merges the equivalence classes associated
+ with [point1] and [point2] (which must be distinct) into a single
+ class whose descriptor is that originally associated with [point2]. *)
+val union: 'a point -> 'a point -> unit
+
+(** [equivalent point1 point2] tells whether [point1] and [point2]
+ belong to the same equivalence class. *)
+val equivalent: 'a point -> 'a point -> bool
+
+(** [eunion point1 point2] is identical to [union], except it does
+ nothing if [point1] and [point2] are already equivalent. *)
+val eunion: 'a point -> 'a point -> unit
+
+(** [redundant] maps all members of an equivalence class, but one, to
+ [true]. *)
+val redundant: 'a point -> bool
+
+(** [change p d] updates the descriptor of [p] to [d]. *)
+val change: 'a point -> 'a -> unit
--- /dev/null
+open Dom
+open Dom_html
+open Js
+open Firebug
+open Goog
+
+let msgbox s =
+ console##log (s)
+
+type input =
+ | Direct of string * (unit -> string)
+ | Url of string
+
+let children_of_node node =
+ let c = ref [] in
+ for i = 0 to node##childNodes##length - 1 do
+ let node = Js.Opt.get (node##childNodes##item (i)) (fun _ -> assert false) in
+ match node##nodeType with
+ | Dom.DOCUMENT | Dom.DOCUMENT_FRAGMENT | Dom.ELEMENT | Dom.CDATA_SECTION ->
+ c := node :: !c
+ | _ -> ()
+ done;
+ List.rev !c
+
+let contents_of_node (node : node Js.t) =
+ let c = ref [] in
+ match node##nodeType with
+ | Dom.CDATA_SECTION ->
+ let t = Js.Opt.get (Dom.CoerceTo.text (node :> node Js.t)) (fun _ -> assert false) in
+ t##data
+ | _ ->
+ for i = 0 to node##childNodes##length - 1 do
+ let node = Js.Opt.get (node##childNodes##item (i)) (fun _ -> assert false) in
+ match node##nodeType with
+ | Dom.TEXT | Dom.CDATA_SECTION ->
+ c := node :: !c
+ | _ -> ()
+ done;
+ Js.Opt.get ((List.hd !c)##nodeValue) (fun _ -> Js.string "Error")
+
+let (>>=) = Lwt.bind
+
+let http_get url =
+ XmlHttpRequest.get url >>= fun r ->
+ let cod = r.XmlHttpRequest.code in
+ let msg = r.XmlHttpRequest.content_xml () in
+ if cod = 0 || cod = 200
+ then Lwt.return msg
+ else fst (Lwt.wait ())
+
+let load_input_from_url url =
+ let extract_inputs frame =
+ match frame with
+ | None ->
+ Dom_html.window##alert (Js.string "Loading of examples failed.");
+ []
+ | Some inputs_doc ->
+ let inputs_root = List.hd (children_of_node inputs_doc) in
+ let inputs_nodes = children_of_node inputs_root in
+ let inputs = List.map (fun n ->
+ msgbox n;
+ let data = children_of_node n in
+ msgbox data;
+ let get i = Js.to_string (contents_of_node (List.nth data i)) in
+ (get 0, fun () -> get 1))
+ inputs_nodes
+ in
+ inputs
+ in
+ Lwt.catch (fun () -> http_get url
+ >>= (fun frame ->
+ Lwt.return (extract_inputs frame)))
+ (function _ ->
+ Lwt.return []
+ )
+
+type output = (string * string)
+
+let impossible _ = assert false
+
+let ccs s = Goog.Ui.ControlContent.string (Js.string s)
+
+let add_item s (m : Goog.Ui.menu Js.t) =
+ m##addItem (Goog.Tools.Union.i1 jsnew Goog.Ui.menuItem (ccs s, Js.null, Js.null))
+
+let get_element s =
+ Js.Opt.get
+ (Dom_html.document##getElementById (s))
+ (fun _ -> Dom_html.window##alert (s); assert false)
+
+let new_tab tabbar label =
+ let tab = jsnew Ui.tab (Ui.ControlContent.string label, Js.null, Js.null) in
+ Ui.Component.addChild tabbar tab (Js.some Js._true);
+ tab
+
+let new_button toolbar label onclick =
+ let button =
+ jsnew Ui.toolbarButton
+ (Ui.ControlContent.string (Js.string label),
+ Js.null,
+ Js.null)
+ in
+ Ui.Component.addChild toolbar button (Js.some Js._true);
+ ignore
+ (Events.listen
+ (Tools.Union.i1 button)
+ (Js.string "action")
+ (Js.wrap_callback (fun _ -> onclick ()))
+ Js.null)
+
+let new_menu toolbar label entries onchange =
+ let menu = jsnew Goog.Ui.menu (Js.null, Js.null) in
+ List.iter (fun s -> add_item s menu) entries;
+ let menu_button =
+ jsnew Ui.toolbarMenuButton
+ (Ui.ControlContent.string (Js.string label),
+ Js.some menu,
+ Js.null,
+ Js.null)
+ in
+ ignore
+ (Events.listen
+ (Tools.Union.i1 menu_button)
+ (Js.string "action")
+ (Js.wrap_callback (fun e ->
+ let get x : Goog.Ui.menuItem Js.t =
+ Js.Unsafe.coerce (Js.Optdef.get x (fun _ -> assert false))
+ in
+ onchange ((get (e##target))##getCaption ())))
+ Js.null);
+
+ Ui.Component.addChild toolbar menu_button (Js.some Js._true);
+ menu
+
+type input_interface = {
+ get_input : unit -> Js.js_string Js.t * Js.js_string Js.t;
+ new_output_tabs : (Js.js_string Js.t * Js.js_string Js.t) list -> unit;
+ clear_output_tabs : unit -> unit;
+ close : unit -> unit
+}
+
+let input_interfaces : (Js.js_string Js.t, input_interface) Hashtbl.t =
+ Hashtbl.create 13
+
+let fresh_name n =
+ let rec aux i =
+ let name = if i = 0 then n else (n##concat (Js.string (string_of_int i))) in
+ if Hashtbl.mem input_interfaces name then
+ aux (i + 1)
+ else
+ name
+ in
+ aux 0
+
+let new_input (tabbar : Ui.tabBar Js.t) choice (contents : Js.js_string Js.t) =
+
+ let choice = fresh_name choice in
+
+ let tab_contents = get_element ((Js.string "maintabbar_content")) in
+
+ let source_label = choice##concat (Js.string "_source") in
+ let content_label = choice##concat (Js.string "_contents") in
+
+ let tab = new_tab tabbar choice in
+ let tab_frame = Dom_html.createDiv (Dom_html.document) in
+ let subtab_frame = Dom_html.createDiv (Dom_html.document) in
+ let contents_tab_frame = Dom_html.createDiv (Dom_html.document) in
+ let clear_tab_frame = Dom_html.createDiv (Dom_html.document) in
+ let subtabs =
+ jsnew Ui.tabBar (
+ Js.some (Ui.TabBar.location_pre_of_location Ui.TabBar.BOTTOM),
+ Js.null,
+ Js.null)
+ in
+ contents_tab_frame##className <- Js.string "goog-tab-content";
+ contents_tab_frame##id <- content_label;
+ subtab_frame##className
+ <- Js.string "goog-tab-bar goog-tab-bar-start";
+ clear_tab_frame##className <- Js.string "goog-tab-bar-clear";
+
+ subtabs##decorate ((subtab_frame :> Dom_html.element Js.t));
+ ignore (tab_frame##appendChild ((subtab_frame :> Dom.node Js.t)));
+ ignore (tab_frame##appendChild ((contents_tab_frame :> Dom.node Js.t)));
+ ignore (tab_frame##appendChild ((clear_tab_frame :> Dom.node Js.t)));
+
+ (* Source code editor. *)
+ let text = Dom_html.createTextarea (Dom_html.document) in
+ text##className <- Js.string "editor";
+ text##value <- contents;
+
+ let change_tab_content node =
+ if contents_tab_frame##hasChildNodes () = _true then
+ ignore (contents_tab_frame##removeChild
+ (Js.Opt.get contents_tab_frame##firstChild impossible));
+ ignore (contents_tab_frame##appendChild (node))
+ in
+
+ let input_tab = new_tab subtabs source_label in
+ ignore
+ (Events.listen
+ (Tools.Union.i1 input_tab)
+ (Js.string "select")
+ (Js.wrap_callback (fun e -> change_tab_content ((text :> Dom.node Js.t))))
+ Js.null);
+
+ ignore
+ (Events.listen
+ (Tools.Union.i1 tab)
+ (Js.string "select")
+ (Js.wrap_callback (fun e ->
+ if tab_contents##hasChildNodes () = _true then
+ ignore (tab_contents##removeChild
+ (Js.Opt.get tab_contents##firstChild impossible));
+ ignore (tab_contents##appendChild ((tab_frame :> Dom.node Js.t)))))
+ Js.null);
+
+ tabbar##setSelectedTab (Js.some tab);
+ subtabs##setSelectedTab (Js.some input_tab);
+
+ let get_input () =
+ (choice, text##value)
+ in
+
+ let output_tabs = ref [] in
+
+ let new_output_tabs outputs =
+ let new_output_tab (title, value) =
+ let output_tab = new_tab subtabs (choice##concat (title)) in
+ let output_frame = Dom_html.createDiv (Dom_html.document) in
+ output_tabs := output_tab :: !output_tabs;
+ let text = Dom_html.createTextarea (Dom_html.document) in
+ text##className <- Js.string "editor";
+ text##value <- value;
+ ignore (output_frame##appendChild ((text :> Dom.node Js.t)));
+ ignore
+ (Events.listen
+ (Tools.Union.i1 output_tab)
+ (Js.string "select")
+ (Js.wrap_callback (fun e ->
+ change_tab_content ((output_frame :> Dom.node Js.t))))
+ Js.null)
+ in
+ List.iter new_output_tab outputs
+ in
+
+ let clear_output_tabs () =
+ List.iter (fun tab ->
+ ignore (subtabs##removeChild (Goog.Tools.Union.i2 tab, Js.some Js._true)))
+ !output_tabs;
+ output_tabs := []
+ in
+
+ let close () =
+ Hashtbl.remove input_interfaces choice;
+ ignore (contents_tab_frame##removeChild ((text :> Dom.node Js.t)));
+ subtabs##disposeInternal ();
+ ignore (tabbar##removeChild (Goog.Tools.Union.i2 tab, Js.some Js._true))
+ in
+ Hashtbl.add input_interfaces choice
+ {
+ get_input = get_input;
+ new_output_tabs = new_output_tabs;
+ clear_output_tabs = clear_output_tabs;
+ close = close;
+ }
+
+let help_message =
+"
+<p>
+Please be aware of the limited computational power of JavaScript. Your O'Caml
+program will run 10 times slower than a natively compiled one.
+</p>
+<ul>
+<li>
+Use <code>Create from...</code> to load
+a predefined input. This should create a tab in the
+interface for this specific instance of the input. You
+can freely edit this input in the text area.
+</li>
+<li>
+Use <code>Run</code> to process the input. This should create
+a set of tabs to store the outputs. You can use
+<code>Run</code> several times: the outputs will be refreshed
+if the input has changed.
+</li>
+<li>
+Use <code>Close</code> to dispose the input instance corresponding
+to the selected tab. Be aware that you will lost your local modifications.
+</li>
+<li>
+Use <code>Help</code> to open this dialog box.
+</li>
+</ul>
+"
+
+type processor_function =
+ (int -> int -> unit) -> (** Tick *)
+ (string * string) ->
+ output list
+
+let processing_queue_updated = Lwt_condition.create ()
+let q = Queue.create ()
+let push_processing f =
+ Queue.push f q; Lwt_condition.signal processing_queue_updated ()
+let next_processing () = (Queue.take q) ()
+
+let make_layout, add_inputs, register_processor =
+ let menu_ref = ref (Obj.magic 0) in
+ let inputs_ref : (Js.js_string Js.t * (unit -> Js.js_string Js.t)) list ref = ref [] in
+ let processor_ref : processor_function ref =
+ ref (fun tick s -> [])
+ in
+ let make_layout () =
+ let pbar = jsnew Ui.progressBar () in
+ let elt = get_element (Js.string "progressbar") in
+ let elt_txt = get_element (Js.string "progressbarin") in
+ pbar##setMaximum (100.);
+ pbar##setMinimum (0.);
+ pbar##setValue (0.);
+ pbar##decorateInternal (elt);
+
+ let toolbar = jsnew Ui.toolbar (Js.null, Js.null, Js.null) in
+ let tabbar =
+ jsnew Ui.tabBar (Js.some (Ui.TabBar.location_pre_of_location Ui.TabBar.START), Js.null, Js.null)
+ in
+
+ let get_selected_input () =
+ try
+ let tab = (Js.Opt.get (tabbar##getSelectedTab ()) impossible) in
+ let caption = (Js.Opt.get (tab##getCaption ()) impossible) in
+ Some (caption)
+ with _ -> None
+ in
+ menu_ref :=
+ new_menu toolbar " Create from ..." []
+ (fun choice ->
+ try
+ let choice = Js.Opt.get choice (fun _ -> assert false) in
+ let contents = (List.assoc choice !inputs_ref) () in
+ new_input tabbar choice contents
+ with _ -> assert false);
+
+ new_button toolbar "Run" (fun () ->
+ match get_selected_input () with
+ | None ->
+ Firebug.console##log (Js.string "Nothing to run!")
+
+ | Some selected_input ->
+ let run () =
+ Firebug.console##log ((Js.string "Process the source named ")##concat (selected_input));
+
+ let interface =
+ try
+ Hashtbl.find input_interfaces selected_input
+ with Not_found -> assert false
+ in
+ interface.clear_output_tabs ();
+ let tick =
+ fun step over ->
+ let v = 100. *. float_of_int step /. float_of_int over in
+ Firebug.console##log ((Js.string ("Step " ^ string_of_int step ^ " " ^ string_of_float v)));
+ pbar##setValue (v);
+ elt_txt##innerHTML <- Js.string (string_of_float v ^ "%")
+ in
+ let outputs =
+ try
+ let title, contents = interface.get_input () in
+ !processor_ref tick (Js.to_string title, Js.to_string contents)
+ with exn ->
+ [("Error", Printexc.to_string exn)]
+ in
+ interface.new_output_tabs
+ (List.map (fun (t, o) -> (Js.string t, Js.string o)) outputs);
+ Lwt.return ()
+ in
+ push_processing run
+ );
+
+ new_button toolbar "Close" (fun () ->
+ match get_selected_input () with
+ | None ->
+ Firebug.console##log (Js.string "Nothing to close!")
+ | Some selected_input ->
+ Firebug.console##log ((Js.string "Closing ")##concat (selected_input));
+ let interface =
+ try
+ Hashtbl.find input_interfaces selected_input
+ with Not_found -> assert false
+ in
+ interface.close ()
+ );
+
+ new_button toolbar "Help" (fun () ->
+ let dialog = jsnew Ui.dialog (Js.null, Js.null, Js.null) in
+ dialog##setContent (Js.string help_message);
+ dialog##setVisible (Js._true)
+ );
+
+ tabbar##decorate (get_element (Js.string "maintabbar"));
+ toolbar##render (Js.some (get_element (Js.string "maintoolbar")))
+ in
+ let add_inputs inputs =
+ List.iter (fun (s, _) -> add_item s !menu_ref) inputs;
+ inputs_ref := List.map (fun (k, v) -> (Js.string k, fun () -> Js.string (v ()))) inputs
+ in
+ let register_processor p =
+ processor_ref := p
+ in
+ make_layout, add_inputs, register_processor
+
+let loaded = ref Js._false
+
+let rec load = function
+ | [] ->
+ Lwt.return []
+ | Direct (title, contents) :: is ->
+ load is
+ >>= (fun is -> Lwt.return ((title, contents) :: is))
+ | Url url :: is ->
+ load_input_from_url url
+ >>= (fun url_is ->
+ load is
+ >>= (fun is -> Lwt.return (url_is @ is)))
+
+let from_function inputs processor =
+ let start _ =
+ let rec wait_for_processing () =
+ Lwt_condition.wait processing_queue_updated
+ >>= next_processing
+ >>= wait_for_processing
+ in
+ Lwt_js.sleep 0.2
+ >>= (fun () -> load inputs)
+ >>= fun inputs -> begin
+ make_layout ();
+ add_inputs inputs;
+ register_processor processor;
+ Firebug.console##log (Js.string "Loaded!");
+ Lwt.return ()
+ end
+ >>= wait_for_processing
+ in
+ Dom_html.window##onload <- Dom_html.handler (fun _ -> ignore (start ()); Js._false)
+
--- /dev/null
+(** This module turns a function into a web application. *)
+
+(** An input is characterized by a title and a function that
+ returns the input contents if called. *)
+type input =
+ | Direct of string * (unit -> string)
+ | Url of string
+
+(** An output is a title and some contents. *)
+type output = (string * string)
+
+(** Given a list of input choices and a function that turns these
+ inputs into output, [from_function] produces an interactive
+ web application. *)
+type processor_function =
+ (int -> int -> unit) -> (** Step n over m. *)
+ (string * string) ->
+ output list
+
+val from_function : input list -> processor_function -> unit
+
+
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wtraditional" } */
+
+int
+x (b)
+{
+ return
+ 4294967295U /* { dg-warning "width of integer|traditional C rejects" } */
+ / (unsigned long) b;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wtraditional" } */
+
+int
+x (b)
+{
+ return
+ 4294967295U /* { dg-warning "width of integer|traditional C rejects" } */
+ / (unsigned long) b;
+}
--- /dev/null
+:1000000000E506758212C39582F506E50775830043
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F075E0E3
+:10004000092506F58275E0003507F583E517F0759B
+:10005000E0082506F58275E0003507F583E516F022
+:1000600075E0072506F58275E0003507F583E5158F
+:10007000F075E0062506F58275E0003507F583E5A5
+:1000800014F075E0052506F58275E0003507F58367
+:10009000E513F075E0042506F58275E0003507F5F7
+:1000A00083E512F075E0032506F58275E00035075B
+:1000B000F583E511F075E0022506F58275E000355F
+:1000C00007F583E510F0E51FF500E51EF501E51DD8
+:1000D000F509E51CF50AE51AF515E519F513750F8F
+:1000E00000751000751100751200E500F516E501A8
+:1000F000F514E509F50DE50AF50E750C0075170008
+:10010000751900751A00750B00750A01750001C399
+:10011000E518F5F0E50E95F0F509E50BF5F0E50BC2
+:1001200035F0F509E509F5F0E50055F0F500E500D5
+:10013000F5F0E50C45F0F50C750001C3E518F5F098
+:10014000E50E95F0F509E50BF5F0E50B35F0F50951
+:10015000E50EF5F0E51895F0F501E50BF5F0E50B8A
+:1001600035F0F501E501F5F0E50945F0F509E50A99
+:10017000F5F0E50965F0F509E509F5F0E50055F05C
+:10018000F500C3E513F5F0E50D95F0F509E50BF580
+:10019000F0E50B35F0F509E509F5F0E50055F0F56A
+:1001A00000E500F5F0E50C45F0F50C750001C3E540
+:1001B00018F5F0E50E95F0F509E50BF5F0E50B35D2
+:1001C000F0F509E50EF5F0E51895F0F501E50BF50C
+:1001D000F0E50B35F0F501E501F5F0E50945F0F541
+:1001E00009E50AF5F0E50965F0F509E509F5F0E539
+:1001F0000055F0F500C3E513F5F0E50D95F0F509B0
+:10020000E50BF5F0E50B35F0F509E50DF5F0E51337
+:1002100095F0F501E50BF5F0E50B35F0F501E5019D
+:10022000F5F0E50945F0F509E50AF5F0E50965F0B1
+:10023000F509E509F5F0E50055F0F500C3E515F51C
+:10024000F0E51495F0F509E50BF5F0E50B35F0F563
+:1002500009E509F5F0E50055F0F500E500F5F0E5F4
+:100260000C45F0F50C750001C3E518F5F0E50E95A9
+:10027000F0F509E50BF5F0E50B35F0F509E50EF5C0
+:10028000F0E51895F0F501E50BF5F0E50B35F0F527
+:1002900001E501F5F0E50945F0F509E50AF5F0E5B8
+:1002A0000965F0F509E509F5F0E50055F0F500C33D
+:1002B000E513F5F0E50D95F0F509E50BF5F0E50B27
+:1002C00035F0F509E50DF5F0E51395F0F501E50BD1
+:1002D000F5F0E50B35F0F501E501F5F0E50945F040
+:1002E000F509E50AF5F0E50965F0F509E509F5F028
+:1002F000E50055F0F500C3E515F5F0E51495F0F5CA
+:1003000009E50BF5F0E50B35F0F509E514F5F0E539
+:100310001595F0F501E50BF5F0E50B35F0F501E588
+:1003200001F5F0E50945F0F509E50AF5F0E509659F
+:10033000F0F509E509F5F0E50055F0F500C3E51B1A
+:10034000F5F0E51695F0F509E50BF5F0E50B35F060
+:10035000F509E509F5F0E50055F0F500E500F5F0E3
+:10036000E50C45F0F50CE517F500E519F501E51A82
+:10037000F509E50CF50B750C01C3750A00E50BF5E5
+:10038000F0E50A95F0F50A750A00E50AF5F0E50AC8
+:1003900035F0F50AE50AF5F0E50C65F0F50CC375E6
+:1003A0000A00E500F5F0E50A95F0F50A750A00E5A2
+:1003B0000AF5F0E50A35F0F50AE50AF5F0E50C6511
+:1003C000F0F50CC3750A00E501F5F0E50A95F0F5C6
+:1003D0000A750A00E50AF5F0E50A35F0F50AE50ABE
+:1003E000F5F0E50C65F0F50CC3750A00E509F5F0CC
+:1003F000E50A95F0F50A750A00E50AF5F0E50A3513
+:10040000F0F50AE50AF5F0E50C65F0F50C7500006D
+:10041000750100750900E500F50BE501F50A7501A8
+:1004200001C3750000E50CF5F0E50095F0F50075E9
+:100430000000E500F5F0E50035F0F500E500F5F029
+:10044000E50165F0F501C3750000E50BF5F0E50089
+:1004500095F0F500750000E500F5F0E50035F0F5E4
+:1004600000E500F5F0E50165F0F501C3750000E574
+:100470000AF5F0E50095F0F500750000E500F5F0EF
+:10048000E50035F0F500E500F5F0E50165F0F50172
+:10049000C3750000E509F5F0E50095F0F50075007D
+:1004A00000E500F5F0E50035F0F500E500F5F0E5D4
+:1004B0000165F0F501750900750A00750B007500FE
+:1004C00000E501F5F0E50045F0F500E509F5F0E59A
+:1004D0000045F0F500E50AF5F0E50045F0F500E52A
+:1004E0000BF5F0E50045F0F500E500700280030231
+:1004F000055700750001750100750900750A00C3F4
+:10050000750B00E500F5F0E50F35F0F50FE501F5A9
+:10051000F0E51035F0F510E509F5F0E51135F0F5E9
+:1005200011E50AF5F0E51235F0F512C3E51BF5F01B
+:10053000E51695F0F516E515F5F0E51495F0F514CA
+:10054000E513F5F0E50D95F0F50DE518F5F0E50E80
+:1005500095F0F50E0200FA00E50FF502E510F5033F
+:10056000E511F504E512F50575E0092506F5827536
+:10057000E0003507F583E0F51775E0082506F582FC
+:1005800075E0003507F583E0F51675E0072506F5FB
+:100590008275E0003507F583E0F51575E006250660
+:1005A000F58275E0003507F583E0F51475E0052563
+:1005B00006F58275E0003507F583E0F51375E00474
+:1005C0002506F58275E0003507F583E0F51275E044
+:1005D000032506F58275E0003507F583E0F5117512
+:1005E000E0022506F58275E0003507F583E0F51099
+:1005F00075E0002506F58275E0003507F583E0F526
+:1006000008E508C0E075E0012506F58275E00035D3
+:1006100007F583E0F508E508C0E075E0122506F56A
+:100620000675E0003507F507E502F582E503F58379
+:10063000E504F500E505F5012200E506758206C32F
+:100640009582F506E5077583009583F507D0E0F5FB
+:100650000875E0012506F58275E0003507F583E5AC
+:1006600008F0D0E0F50875E0002506F58275E00099
+:100670003507F583E508F0750A0175000075090076
+:10068000750100E50AF4F50AE500F4F500E509F462
+:10069000F509E501F4F501D3750B00E50BF5F0E57F
+:1006A0000A35F0F50AE50BF5F0E50035F0F500E563
+:1006B0000BF5F0E50935F0F509E50BF5F0E5013549
+:1006C000F0F501E51FF51BE51EF51AE51DF519E529
+:1006D0001CF518E50AF51FE500F51EE509F51DE511
+:1006E00001F51C120000E582F502E583F503E50043
+:1006F000F504E501F505E502F500E503F501E5047E
+:10070000F509E505F50AE500F502E501F503E5095A
+:10071000F504E50AF50575E0002506F58275E000AB
+:100720003507F583E0F508E508C0E075E00125062A
+:10073000F58275E0003507F583E0F508E508C0E0CF
+:1007400075E0062506F50675E0003507F507E502B4
+:10075000F582E503F583E504F500E505F5012200E2
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* GCC should allow struct S to be in a register. */
+/* { dg-do compile } */
+
+struct S { volatile int field; };
+int f (register struct S arg); /* { dg-bogus "volatile field" "with arg" } */
+int g (register struct S); /* { dg-bogus "volatile field" "no arg" } */
--- /dev/null
+/* GCC should allow struct S to be in a register. */
+/* { dg-do compile } */
+
+struct S { volatile int field; };
+int f (register struct S arg); /* { dg-bogus "volatile field" "with arg" } */
+int g (register struct S); /* { dg-bogus "volatile field" "no arg" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile }
+ { dg-options "-Werror" } */
+
+unsigned long long x = -(unsigned long long)(-(long long)
+ (((unsigned long long)0 - 1) >> 1) - 1);
--- /dev/null
+/* { dg-do compile }
+ { dg-options "-Werror" } */
+
+unsigned long long x = -(unsigned long long)(-(long long)
+ (((unsigned long long)0 - 1) >> 1) - 1);
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile }*/
+/* { dg-options "-O2" } */
+
+char *const f(void)
+{
+ char *const line = "/dev/ptyXX";
+ line[8] = 1;
+ return line;
+}
--- /dev/null
+/* { dg-do compile }*/
+/* { dg-options "-O2" } */
+
+char *const f(void)
+{
+ char *const line = "/dev/ptyXX";
+ line[8] = 1;
+ return line;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-W -Wall -Werror" } */
+
+static inline int unused_fn(int dummyarg)
+{
+ return dummyarg*dummyarg;
+}
+
+int main()
+{
+ return 0;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-W -Wall -Werror" } */
+
+static inline int unused_fn(int dummyarg)
+{
+ return dummyarg*dummyarg;
+}
+
+int main()
+{
+ return 0;
+}
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501750900750A00750B18
+:1000200000750C00E509F502E50AF503E50BF5049A
+:10003000E50CF505E501C0E0E500C0E0E502F5826C
+:10004000E503F583E504F500E505F5012200000070
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+# -*- Makefile -*-
+.PHONY: prepare-check check clean prepare-expected expected all
+
+all-generic: check
+
+-include ../../Makefile.local
+
+IN_EXT=c
+OUT_EXT=hex
+OPTIONS=$(shell if test -f options; then cat options; else echo ""; fi)
+PROGRAM=../../$(TARGET) -is $(OPTIONS)
+
+# Compute the set of input files.
+INPUTS=$(shell find . -name "*.$(IN_EXT)" | sed "s/-annotated.c/.c/g" | uniq)
+
+OUTPUTS=$(INPUTS:$(IN_EXT)=$(OUT_EXT))
+
+# We run the compiler in debugging mode on each input file.
+# This will produce an $(OUTEXT) file as well as a lot of
+# files that contain execution traces. We check that these
+# traces are the ones that are expected.
+%.$(OUT_EXT): %.$(IN_EXT) ../../$(TARGET)
+ @ echo ----------------------------------------\
+ --------------------------------------
+ @ echo -n Checking $* ...
+ @ (($(PROGRAM) $< 2> $*.log 1> $*.log && (echo OK | tee -a ok-counter)) \
+ || (echo "KO"; echo " ($*.log for details)" | tee -a ko-counter))
+ @ for i in `ls $** | grep -v expected | grep -v log`; do \
+ if [ ! -e $$i.expected ]; then \
+ echo No reference to compare to.; \
+ if [ x`cat generate` = x1 ]; then \
+ echo "Current output becomes expected behavior, as asked."; \
+ cp $$i $$i.expected; \
+ fi; \
+ elif diff -u $$i $$i.expected 2> /dev/null 1> /dev/null; then \
+ echo " [OK] $$i" | tee -a ok-counter; \
+ else \
+ echo " [KO] $$i" | tee -a ko-counter; \
+ fi; \
+ done
+
+prepare-check:
+ @ rm --force ok-counter ko-counter
+ @ touch ok-counter
+ @ touch ko-counter
+
+check: clean prepare-check $(OUTPUTS)
+ @ cat ok-counter ko-counter > total-counter
+ @ echo ----------------------------------------\
+ --------------------------------------
+ @ echo ----------------------------------------\
+ --------------------------------------
+ @ echo Total: \
+ `wc -l ok-counter | cut -f1 -d' '` \
+ /`wc -l total-counter | cut -f1 -d' '`
+ @ echo ----------------------------------------\
+ --------------------------------------
+
+prepare-expected:
+ @ GENERATE=1
+ @ export GENERATE
+ @ echo You asked for overwriting of the expected outputs.
+ @ echo -n "Are you sure? [Y/N] "
+ @ read R; if [ $$R = "Y" ]; then \
+ echo 1 > generate; \
+ else \
+ echo 0 > generate; \
+ fi
+
+expected: clean prepare-expected check
+
+clean:
+ rm --force *.hex *.s *.cerco *.Clight *.Cminor *.RTLabs *.RTL *.ERTL *.LTL *.LIN *.log *-annotated.c
--- /dev/null
+// { dg-do compile }
+// { dg-options "-Wstrict-aliasing=2 -fstrict-aliasing" }
+
+struct foo {
+ char c;
+ char d;
+ short s;
+ int i;
+} bar;
+
+int
+sub1 (long long int foobar)
+{
+ struct foo *tmp = (struct foo *) &foobar; // { dg-warning "type-punned pointer might" "" }
+ return tmp->i;
+}
--- /dev/null
+// { dg-do compile }
+// { dg-options "-Wstrict-aliasing=2 -fstrict-aliasing" }
+
+struct foo {
+ char c;
+ char d;
+ short s;
+ int i;
+} bar;
+
+int
+sub1 (long long int foobar)
+{
+ struct foo *tmp = (struct foo *) &foobar; // { dg-warning "type-punned pointer might" "" }
+ return tmp->i;
+}
--- /dev/null
+:1000000000E506758208C39582F506E5077583004D
+:100010009583F507D0E0F518D0E0F519E512F50B5A
+:10002000E511F50FE506F50AE507F501750900C3C9
+:10003000750000E509F5F0E50A35F0F509E500F58C
+:10004000F0E50135F0F50A750100C3750000E50122
+:10005000F5F0E50935F0F501E500F5F0E50A35F0D4
+:10006000F500E51FF503E500F502E501F582E5027F
+:10007000F583E503F0750101C3750000E501F5F0B6
+:10008000E50935F0F501E500F5F0E50A35F0F50094
+:10009000E51EF503E500F502E501F582E502F583CD
+:1000A000E503F0750102C3750000E501F5F0E5090F
+:1000B00035F0F501E500F5F0E50A35F0F500E51D50
+:1000C000F503E500F502E501F582E502F583E503B8
+:1000D000F0750103C3750000E501F5F0E50935F0A1
+:1000E000F501E500F5F0E50A35F0F500E51CF5034E
+:1000F000E500F502E501F582E502F583E503F0E5AB
+:1001000006F509E507F50A750100C3750000E5016C
+:10011000F5F0E50935F0F501E500F5F0E50A35F013
+:10012000F50A750904C3750000E509F5F0E5013528
+:10013000F0F501E500F5F0E50A35F0F500E501F52B
+:1001400009E500F50A750100C3750000E501F5F049
+:10015000E50935F0F501E500F5F0E50A35F0F500C3
+:10016000E500F502E501F582E502F583E0F50C75A1
+:100170000101C3750000E501F5F0E50935F0F50171
+:10018000E500F5F0E50A35F0F500E500F502E501DA
+:10019000F582E502F583E0F50D750102C3750000F7
+:1001A000E501F5F0E50935F0F501E500F5F0E50AC2
+:1001B00035F0F500E500F502E501F582E502F5838D
+:1001C000E0F50E750103C3750000E501F5F0E509E2
+:1001D00035F0F501E500F5F0E50A35F0F500E5004C
+:1001E000F502E501F582E502F583E0F500E50CF5A1
+:1001F00002E50DF503E50EF504E500F505E50BF563
+:1002000012E50FF511E519C0E0E518C0E075E0084A
+:100210002506F50675E0003507F507E502F582E5E8
+:1002200003F583E504F500E505F501220000000073
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+// { dg-do compile }
+// { dg-options "-Wstrict-aliasing=2 -fstrict-aliasing" }
+
+struct s {
+ char *p;
+};
+
+void
+func(struct s *ptr)
+{
+ *(void **)&ptr->p = 0; /* { dg-warning "type-punned pointer" } */
+}
--- /dev/null
+// { dg-do compile }
+// { dg-options "-Wstrict-aliasing=2 -fstrict-aliasing" }
+
+struct s {
+ char *p;
+};
+
+void
+func(struct s *ptr)
+{
+ *(void **)&ptr->p = 0; /* { dg-warning "type-punned pointer" } */
+}
--- /dev/null
+:1000000000E506758202C39582F506E50775830053
+:100010009583F507D0E0F50ED0E0F50FE510F50D6E
+:10002000E51EF500750900C3750100E509F5F0E569
+:100030001F35F0F50BE501F5F0E50035F0F50C7531
+:100040000900750A00750100C3750000E501F5F0AF
+:10005000E50B35F0F501E500F5F0E50C35F0F500C0
+:10006000E509F503E500F502E501F582E502F58312
+:10007000E503F0750101C3750000E501F5F0E50B3E
+:1000800035F0F501E500F5F0E50C35F0F500E50A91
+:10009000F503E500F502E501F582E502F583E503E8
+:1000A000F0750000E500F502E500F503E500F50454
+:1000B000E500F505E50DF510E50FC0E0E50EC0E043
+:1000C00075E0022506F50675E0003507F507E5023F
+:1000D000F582E503F583E504F500E505F501220069
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR java/10145
+ Test that requesting an alignment of 1 does not increase the alignment
+ of a long long field.
+
+ { dg-do run }
+ { dg-options "" }
+*/
+
+extern void abort (void);
+
+struct A
+{
+ char c;
+ long long i;
+};
+
+struct B
+{
+ char c;
+ long long i __attribute ((__aligned__ (1)));
+};
+
+int main ()
+{
+ if (sizeof (struct A) != sizeof (struct B))
+ abort ();
+ return 0;
+}
--- /dev/null
+/* PR java/10145
+ Test that requesting an alignment of 1 does not increase the alignment
+ of a long long field.
+
+ { dg-do run }
+ { dg-options "" }
+*/
+
+extern void abort (void);
+
+struct A
+{
+ char c;
+ long long i;
+};
+
+struct B
+{
+ char c;
+ long long i __attribute ((__aligned__ (1)));
+};
+
+int main ()
+{
+ if (sizeof (struct A) != sizeof (struct B))
+ abort ();
+ return 0;
+}
--- /dev/null
+:1000000075812F7506FF7507FF12001002000C00A6
+:1000100000E506758202C39582F506E50775830043
+:100020009583F507D0E0F50875E0012506F58275A2
+:10003000E0003507F583E508F0D0E0F50875E0004D
+:100040002506F58275E0003507F583E508F0750BA8
+:1000500005750C00750D00750E0075000575010025
+:10006000750900750A00750F00C3E500F5F0E50B92
+:1000700095F0F500E500F5F0E50F45F0F50FC3E567
+:1000800001F5F0E50C95F0F500E500F5F0E50F451C
+:10009000F0F50FC3E509F5F0E50D95F0F500E50085
+:1000A000F5F0E50F45F0F50FC3E50AF5F0E50E951F
+:1000B000F0F500E500F5F0E50F45F0F50F750100EE
+:1000C000750900750A00750000E50FF5F0E50045BB
+:1000D000F0F500E501F5F0E50045F0F500E509F57E
+:1000E000F0E50045F0F500E50AF5F0E50045F0F52E
+:1000F00000E50070028003020160007500007501D8
+:1001000000750900750A00E500F502E501F503E553
+:1001100009F504E50AF50575E0002506F58275E0A8
+:10012000003507F583E0F508E508C0E075E0012536
+:1001300006F58275E0003507F583E0F508E508C0AF
+:10014000E075E0022506F50675E0003507F507E5E0
+:1001500002F582E503F583E504F500E505F50122E6
+:10016000000200FB00000000000000000000000092
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Winline -O2" } */
+inline __attribute__ ((always_inline)) void t(void); /* { dg-error "body not available" "" } */
+void
+q(void)
+{
+ t(); /* { dg-error "called from here" "" } */
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Winline -O2" } */
+inline __attribute__ ((always_inline)) void t(void); /* { dg-error "body not available" "" } */
+void
+q(void)
+{
+ t(); /* { dg-error "called from here" "" } */
+}
--- /dev/null
+:100000000000E506758202C39582F506E507758353
+:10001000009583F507D0E0F50875E0012506F58227
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000002506F58275E0003507F583E508F075C3
+:100040000000E500F502E500F503E500F504E50034
+:10005000F50575E0002506F58275E0003507F583A6
+:10006000E0F508E508C0E075E0012506F58275E0D9
+:10007000003507F583E0F508E508C0E075E00225E6
+:1000800006F50675E0003507F507E502F582E5039C
+:10009000F583E504F500E505F50122000000000008
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Winline -O2" } */
+inline __attribute__ ((always_inline)) void
+q2(void)
+{ /* { dg-error "recursive" "" } */
+ q2(); /* { dg-error "called from here" "" } */
+ q2(); /* { dg-error "called from here" "" } */
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Winline -O2" } */
+inline __attribute__ ((always_inline)) void
+q2(void)
+{ /* { dg-error "recursive" "" } */
+ q2(); /* { dg-error "called from here" "" } */
+ q2(); /* { dg-error "called from here" "" } */
+}
--- /dev/null
+:1000000000E506758202C39582F506E50775830053
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F0120026
+:1000400000120000750000E500F502E500F503E58B
+:1000500000F504E500F50575E0002506F58275E07C
+:10006000003507F583E0F508E508C0E075E00125F7
+:1000700006F58275E0003507F583E0F508E508C070
+:10008000E075E0022506F50675E0003507F507E5A1
+:1000900002F582E503F583E504F500E505F50122A7
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-options "-std=gnu89 -fms-extensions" } */
+/* Enabling Microsoft mode makes all of the tests equivalent. Checked vs
+ Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
+ */
+
+struct A { char a; };
+
+struct B {
+ struct A;
+ char b;
+};
+char testB[sizeof(struct B) == 2 * sizeof(struct A) ? 1 : -1];
+
+struct C {
+ struct D { char d; };
+ char c;
+};
+char testC[sizeof(struct C) == 2 * sizeof(struct A) ? 1 : -1];
+char testD[sizeof(struct D) == sizeof(struct A) ? 1 : -1];
+
+struct E {
+ struct { char z; };
+ char e;
+};
+char testE[sizeof(struct E) == 2 * sizeof(struct A) ? 1 : -1];
+
+typedef struct A typedef_A;
+struct F {
+ typedef_A;
+ char f;
+};
+char testF[sizeof(struct F) == 2 * sizeof(struct A) ? 1 : -1];
--- /dev/null
+/* { dg-options "-std=gnu89 -fms-extensions" } */
+/* Enabling Microsoft mode makes all of the tests equivalent. Checked vs
+ Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
+ */
+
+struct A { char a; };
+
+struct B {
+ struct A;
+ char b;
+};
+char testB[sizeof(struct B) == 2 * sizeof(struct A) ? 1 : -1];
+
+struct C {
+ struct D { char d; };
+ char c;
+};
+char testC[sizeof(struct C) == 2 * sizeof(struct A) ? 1 : -1];
+char testD[sizeof(struct D) == sizeof(struct A) ? 1 : -1];
+
+struct E {
+ struct { char z; };
+ char e;
+};
+char testE[sizeof(struct E) == 2 * sizeof(struct A) ? 1 : -1];
+
+typedef struct A typedef_A;
+struct F {
+ typedef_A;
+ char f;
+};
+char testF[sizeof(struct F) == 2 * sizeof(struct A) ? 1 : -1];
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test anonymous structures with type qualifiers. Bug 8420. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89" } */
+
+struct s {
+ struct { int a; };
+ const struct { int b; };
+ struct { int c; } volatile;
+};
--- /dev/null
+/* Test anonymous structures with type qualifiers. Bug 8420. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89" } */
+
+struct s {
+ struct { int a; };
+ const struct { int b; };
+ struct { int c; } volatile;
+};
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test bad warning for anonymous int in structure. Bug 17189. */
+/* { dg-do compile } */
+/* { dg-options "-std=c99 -pedantic-errors" } */
+
+struct Foo { int; }; /* { dg-bogus "unnamed" } */
+/* { dg-error "error: declaration does not declare anything" "int;" { target *-*-* } 5 } */
+/* { dg-error "error: struct has no members" "no members" { target *-*-* } 5 } */
--- /dev/null
+/* Test bad warning for anonymous int in structure. Bug 17189. */
+/* { dg-do compile } */
+/* { dg-options "-std=c99 -pedantic-errors" } */
+
+struct Foo { int; }; /* { dg-bogus "unnamed" } */
+/* { dg-error "error: declaration does not declare anything" "int;" { target *-*-* } 5 } */
+/* { dg-error "error: struct has no members" "no members" { target *-*-* } 5 } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostics for structure member with no type specifier or
+ declarator. Test with no special options. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct s {
+ int a;
+ const;
+};
+/* { dg-warning "warning: useless type qualifier in empty declaration" "empty" { target *-*-* } 9 } */
+/* { dg-warning "warning: empty declaration" "empty 2" { target *-*-* } 9 } */
--- /dev/null
+/* Test diagnostics for structure member with no type specifier or
+ declarator. Test with no special options. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct s {
+ int a;
+ const;
+};
+/* { dg-warning "warning: useless type qualifier in empty declaration" "empty" { target *-*-* } 9 } */
+/* { dg-warning "warning: empty declaration" "empty 2" { target *-*-* } 9 } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostics for structure member with no type specifier or
+ declarator. Test with -pedantic. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic" } */
+
+struct s {
+ int a;
+ const; /* { dg-warning "warning: ISO C forbids member declarations with no members" } */
+};
--- /dev/null
+/* Test diagnostics for structure member with no type specifier or
+ declarator. Test with -pedantic. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic" } */
+
+struct s {
+ int a;
+ const; /* { dg-warning "warning: ISO C forbids member declarations with no members" } */
+};
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostics for structure member with no type specifier or
+ declarator. Test with -pedantic-errors. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors" } */
+
+struct s {
+ int a;
+ const; /* { dg-error "error: ISO C forbids member declarations with no members" } */
+};
--- /dev/null
+/* Test diagnostics for structure member with no type specifier or
+ declarator. Test with -pedantic-errors. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors" } */
+
+struct s {
+ int a;
+ const; /* { dg-error "error: ISO C forbids member declarations with no members" } */
+};
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Verify that hardware multiply is preferred on XScale. */
+/* { dg-do compile } */
+/* { dg-options "-mcpu=xscale -O2" } */
+/* { dg-require-effective-target arm32 } */
+
+/* Brett Gaines' test case. */
+unsigned BCPL(unsigned) __attribute__ ((naked));
+unsigned BCPL(unsigned seed)
+{
+ /* Best code would be:
+ ldr r1, =2147001325
+ ldr r2, =715136305
+ mla r0, r1, r0, r2
+ mov pc, lr */
+
+ return seed * 2147001325U + 715136305U;
+}
+
+/* { dg-final { scan-assembler "mla\[ ].*" } } */
--- /dev/null
+/* Verify that hardware multiply is preferred on XScale. */
+/* { dg-do compile } */
+/* { dg-options "-mcpu=xscale -O2" } */
+/* { dg-require-effective-target arm32 } */
+
+/* Brett Gaines' test case. */
+unsigned BCPL(unsigned) __attribute__ ((naked));
+unsigned BCPL(unsigned seed)
+{
+ /* Best code would be:
+ ldr r1, =2147001325
+ ldr r2, =715136305
+ mla r0, r1, r0, r2
+ mov pc, lr */
+
+ return seed * 2147001325U + 715136305U;
+}
+
+/* { dg-final { scan-assembler "mla\[ ].*" } } */
--- /dev/null
+:1000000000E50675820AC39582F506E5077583004B
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F0E5173C
+:10004000F518E516F519E515F51AE514F51B75E033
+:10005000052506F58275E0003507F583E513F07593
+:10006000E0042506F58275E0003507F583E512F01A
+:1000700075E0032506F58275E0003507F583E51187
+:10008000F075E0022506F58275E0003507F583E599
+:1000900010F0E51FF500E51EF501E51DF509E51C6D
+:1000A000F517750D13750C5C750B07750A00E50DDA
+:1000B000F4F50DE50CF4F50EE50BF4F50FE50AF497
+:1000C000F514D3750A00E50AF5F0E50D35F0F50DE8
+:1000D000E50AF5F0E50E35F0F50EE50AF5F0E50F69
+:1000E00035F0F50FE50AF5F0E51435F0F514E50106
+:1000F000F515E509F51675100075110075120075F6
+:100100001300C3750100E500F5F0E50DA4F50CE55D
+:1001100000F5F0E50DA4E5F0F509E50CF5F0E501D5
+:1001200035F0F501E515F5F0E50DA4F50CE515F54F
+:10013000F0E50DA4E5F0F50AE50CF5F0E50935F07C
+:10014000F509E516F5F0E50DA4F50CE516F5F0E575
+:100150000DA4E5F0F50BE50CF5F0E50A35F0F50A30
+:10016000E517F5F0E50DA4F50CE517F5F0E50DA4A0
+:10017000E5F0F50DE50CF5F0E50B35F0F50BC3C337
+:10018000750C00E501F5F0E51035F0F510E509F521
+:10019000F0E51135F0F511E50AF5F0E51235F0F569
+:1001A00012E50BF5F0E51335F0F513C3750900E51D
+:1001B00000F5F0E50EA4F50CE500F5F0E50EA4E57C
+:1001C000F0F50AE50CF5F0E50935F0F509E515F56A
+:1001D000F0E50EA4F50CE515F5F0E50EA4E5F0F557
+:1001E0000BE50CF5F0E50A35F0F50AE516F5F0E556
+:1001F0000EA4F50CE516F5F0E50EA4E5F0F50DE519
+:100200000CF5F0E50B35F0F50B750100C3C3750C6B
+:1002100000E501F5F0E51035F0F510E509F5F0E53C
+:100220001135F0F511E50AF5F0E51235F0F512E5B6
+:100230000BF5F0E51335F0F513C3750A00E500F58D
+:10024000F0E50FA4F50CE500F5F0E50FA4E5F0F5F9
+:100250000BE50CF5F0E50A35F0F50AE515F5F0E5E6
+:100260000FA4F50CE515F5F0E50FA4E5F0F50DE5A7
+:100270000CF5F0E50B35F0F50B750100750900C3C1
+:10028000C3750C00E501F5F0E51035F0F510E50952
+:10029000F5F0E51135F0F511E50AF5F0E51235F068
+:1002A000F512E50BF5F0E51335F0F513C3750B000A
+:1002B000E500F5F0E514A4F50CE500F5F0E514A46F
+:1002C000E5F0F50DE50CF5F0E50B35F0F50B7501F6
+:1002D00000750900750A00C3C3750000E501F5F05B
+:1002E000E51035F0F510E509F5F0E51135F0F511FB
+:1002F000E50AF5F0E51235F0F512E50BF5F0E5133A
+:1003000035F0F51375013175091D750AA0750B2AB5
+:10031000C3750000E501F5F0E51035F0F500E509DD
+:10032000F5F0E51135F0F501E50AF5F0E51235F0E7
+:10033000F509E50BF5F0E51335F0F50AE500F502F2
+:10034000E501F503E509F504E50AF505E518F517F6
+:10035000E519F516E51AF515E51BF51475E0052503
+:1003600006F58275E0003507F583E0F51375E004C6
+:100370002506F58275E0003507F583E0F51275E096
+:10038000032506F58275E0003507F583E0F5117564
+:10039000E0022506F58275E0003507F583E0F510EB
+:1003A00075E0002506F58275E0003507F583E0F578
+:1003B00008E508C0E075E0012506F58275E0003526
+:1003C00007F583E0F508E508C0E075E00A2506F5C5
+:1003D0000675E0003507F507E502F582E503F583CC
+:1003E000E504F500E505F50122000000000000002D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Verify that mov is preferred on XScale for loading a 1 byte constant. */
+/* { dg-do compile { target xscale-*-* } } */
+/* { dg-options "-mcpu=xscale -O" } */
+
+unsigned load1(void) __attribute__ ((naked));
+unsigned load1(void)
+{
+ /* Best code would be:
+ mov r0, =17
+ mov pc, lr */
+
+ return 17;
+}
+
+/* { dg-final { scan-assembler "mov\[ ].*17" } } */
--- /dev/null
+/* Verify that mov is preferred on XScale for loading a 1 byte constant. */
+/* { dg-do compile { target xscale-*-* } } */
+/* { dg-options "-mcpu=xscale -O" } */
+
+unsigned load1(void) __attribute__ ((naked));
+unsigned load1(void)
+{
+ /* Best code would be:
+ mov r0, =17
+ mov pc, lr */
+
+ return 17;
+}
+
+/* { dg-final { scan-assembler "mov\[ ].*17" } } */
--- /dev/null
+:1000000000D0E0F500D0E0F501750911750A007522
+:100010000B00750C00E509F502E50AF503E50BF5A3
+:1000200004E50CF505E501C0E0E500C0E0E502F5FA
+:1000300082E503F583E504F500E505F501220000FE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Verify that mov is preferred on XScale for loading a 2 byte constant. */
+/* { dg-do compile } */
+/* { dg-options "-mcpu=xscale -O" } */
+/* { dg-require-effective-target arm32 } */
+
+unsigned load2(void) __attribute__ ((naked));
+unsigned load2(void)
+{
+ /* Best code would be:
+ mov r0, =272
+ add r0, r0, =1
+ mov pc, lr */
+
+ return 273;
+}
+
+/* { dg-final { scan-assembler "mov\[ ].*272" } } */
--- /dev/null
+/* Verify that mov is preferred on XScale for loading a 2 byte constant. */
+/* { dg-do compile } */
+/* { dg-options "-mcpu=xscale -O" } */
+/* { dg-require-effective-target arm32 } */
+
+unsigned load2(void) __attribute__ ((naked));
+unsigned load2(void)
+{
+ /* Best code would be:
+ mov r0, =272
+ add r0, r0, =1
+ mov pc, lr */
+
+ return 273;
+}
+
+/* { dg-final { scan-assembler "mov\[ ].*272" } } */
--- /dev/null
+:1000000000D0E0F500D0E0F501750911750A017521
+:100010000B00750C00E509F502E50AF503E50BF5A3
+:1000200004E50CF505E501C0E0E500C0E0E502F5FA
+:1000300082E503F583E504F500E505F501220000FE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Verify that ldr is preferred on XScale for loading a 3 or 4 byte constant. */
+/* { dg-do compile { target xscale-*-* } } */
+/* { dg-options "-mcpu=xscale -O" } */
+
+unsigned load4(void) __attribute__ ((naked));
+unsigned load4(void)
+{
+ /* Best code would be:
+ ldr r0, =65809
+ mov pc, lr */
+
+ return 65809;
+}
+
+/* { dg-final { scan-assembler "ldr\[ ].*" } } */
--- /dev/null
+/* Verify that ldr is preferred on XScale for loading a 3 or 4 byte constant. */
+/* { dg-do compile { target xscale-*-* } } */
+/* { dg-options "-mcpu=xscale -O" } */
+
+unsigned load4(void) __attribute__ ((naked));
+unsigned load4(void)
+{
+ /* Best code would be:
+ ldr r0, =65809
+ mov pc, lr */
+
+ return 65809;
+}
+
+/* { dg-final { scan-assembler "ldr\[ ].*" } } */
--- /dev/null
+:1000000000D0E0F500D0E0F501750911750A017521
+:100010000B01750C00E509F502E50AF503E50BF5A2
+:1000200004E50CF505E501C0E0E500C0E0E502F5FA
+:1000300082E503F583E504F500E505F501220000FE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Simplified from ncurses 5.0's pad.c
+ by Alexandre Oliva <oliva@lsd.ic.unicamp.br>
+
+ Copyright (C) 1999 Free Software Foundation */
+
+/* { dg-do compile } */
+
+extern char foo[1];
+char foo[] = "";
+
+int
+bar()
+{
+ return foo[0];
+}
--- /dev/null
+/* Simplified from ncurses 5.0's pad.c
+ by Alexandre Oliva <oliva@lsd.ic.unicamp.br>
+
+ Copyright (C) 1999 Free Software Foundation */
+
+/* { dg-do compile } */
+
+extern char foo[1];
+char foo[] = "";
+
+int
+bar()
+{
+ return foo[0];
+}
--- /dev/null
+:1000000000D0E0F51AD0E0F51BE511F518E510F584
+:1000100019900000E582F510900000E583F5117558
+:100020000000750100750C01750D00750E00750F4F
+:1000300000C3750900E500F5F0E50CA4F50BE5003B
+:10004000F5F0E50CA4E5F0F50AE50BF5F0E509356A
+:10005000F0F509E501F5F0E50CA4F50BE501F5F087
+:10006000E50CA4E5F0F501E50BF5F0E50A35F0F552
+:100070000AC3C3750100E509F5F0E50E35F0F50E8C
+:10008000E50AF5F0E50F35F0F50FC3750A00E50058
+:10009000F5F0E50DA4F50BE500F5F0E50DA4E5F0B0
+:1000A000F501E50BF5F0E50A35F0F50A750900C331
+:1000B000C3750000E509F5F0E50E35F0F50EE50A2B
+:1000C000F5F0E50F35F0F50FC3750900750A00C3AB
+:1000D000C3750000E509F5F0E50E35F0F50EE50A0B
+:1000E000F5F0E50F35F0F50FC3750900750A00C38B
+:1000F000C3750000E509F5F0E50E35F0F50EE50AEB
+:10010000F5F0E50F35F0F50FC3750000E50EF5F0DD
+:10011000E51035F0F500E50FF5F0E51135F0F501E6
+:10012000E500F509E501F50A750100C3750000E574
+:1001300001F5F0E50935F0F501E500F5F0E50A35E2
+:10014000F0F500E500F502E501F582E502F583E052
+:10015000F501750000E500F509E500F50AE501F592
+:1001600002E509F503E50AF504E500F505E518F5EE
+:1001700011E519F510E51BC0E0E51AC0E0E502F550
+:1001800082E503F583E504F500E505F501220000AD
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test that pointers to arrays of differently qualified types aren't
+ permitted in conditional expressions, and that qualifiers aren't
+ lost in forming composite types. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+typedef const char T[1];
+typedef const char T2[1];
+typedef volatile char U[1];
+T *p;
+T2 *p2;
+U *q;
+void *f(void) { return 1 ? p : q; } /* { dg-warning "warning: pointer type mismatch in conditional expression" } */
+T *g(void) { return 1 ? p : p2; }
--- /dev/null
+/* Test that pointers to arrays of differently qualified types aren't
+ permitted in conditional expressions, and that qualifiers aren't
+ lost in forming composite types. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+typedef const char T[1];
+typedef const char T2[1];
+typedef volatile char U[1];
+T *p;
+T2 *p2;
+U *q;
+void *f(void) { return 1 ? p : q; } /* { dg-warning "warning: pointer type mismatch in conditional expression" } */
+T *g(void) { return 1 ? p : p2; }
--- /dev/null
+:1000000000D0E0F50CD0E0F50D7501017509007523
+:100010000A00750B00750000E501F5F0E50045F0FC
+:10002000F500E509F5F0E50045F0F500E50AF5F025
+:10003000E50045F0F500E50BF5F0E50045F0F500CD
+:10004000E500700280030200D800900004E582F50C
+:1000500009900004E583F50A750100C3750000E509
+:1000600001F5F0E50935F0F501E500F5F0E50A35B3
+:10007000F0F500E500F502E501F582E502F583E023
+:10008000F50B750101C3750000E501F5F0E50935D3
+:10009000F0F501E500F5F0E50A35F0F500E500F5CD
+:1000A00002E501F582E502F583E0F501750000E562
+:1000B0000BF502E501F503E500F504E500F505E5BE
+:1000C0000DC0E0E50CC0E0E502F582E503F583E54F
+:1000D00004F500E505F5012200900000E582F50930
+:1000E000900000E583F50A750100C3750000E50185
+:1000F000F5F0E50935F0F501E500F5F0E50A35F034
+:10010000F500E500F502E501F582E502F583E0F58D
+:100110000B750101C3750000E501F5F0E50935F047
+:10012000F501E500F5F0E50A35F0F500E500F5022A
+:10013000E501F582E502F583E0F5010200AC00D0AF
+:10014000E0F50CD0E0F50D750101750900750A00A8
+:10015000750B00750000E501F5F0E50045F0F500D0
+:10016000E509F5F0E50045F0F500E50AF5F0E500F4
+:1001700045F0F500E50BF5F0E50045F0F500E5008C
+:100180007002800302021600900002E582F50990D9
+:100190000002E583F50A750100C3750000E501F56D
+:1001A000F0E50935F0F501E500F5F0E50A35F0F583
+:1001B00000E500F502E501F582E502F583E0F50BC7
+:1001C000750101C3750000E501F5F0E50935F0F5AD
+:1001D00001E500F5F0E50A35F0F500E500F502E58A
+:1001E00001F582E502F583E0F501750000E50BF508
+:1001F00002E501F503E500F504E500F505E50DC0B0
+:10020000E0E50CC0E0E502F582E503F583E504F5E1
+:1002100000E505F5012200900000E582F509900057
+:1002200000E583F50A750100C3750000E501F5F0EE
+:10023000E50935F0F501E500F5F0E50A35F0F500E2
+:10024000E500F502E501F582E502F583E0F50B75C1
+:100250000101C3750000E501F5F0E50935F0F50190
+:10026000E500F5F0E50A35F0F500E500F502E501F9
+:10027000F582E502F583E0F5010201EA00000000E5
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Origin: <hp@bitrange.com>
+ Make sure we do not get spurious '*' characters in section names or
+ elsewhere, with asm-specified names. */
+/* { dg-do compile } */
+/* { dg-options "-w -ffunction-sections -fdata-sections" } */
+
+void foo (void) asm ("_bar");
+void foo (void) {}
+
+extern int foobar asm ("_baz");
+int foobar = 3;
+
+/* { dg-final { scan-assembler-not "\\*_bar" } } */
+/* { dg-final { scan-assembler-not "\\*_baz" } } */
--- /dev/null
+/* Origin: <hp@bitrange.com>
+ Make sure we do not get spurious '*' characters in section names or
+ elsewhere, with asm-specified names. */
+/* { dg-do compile } */
+/* { dg-options "-w -ffunction-sections -fdata-sections" } */
+
+void foo (void) asm ("_bar");
+void foo (void) {}
+
+extern int foobar asm ("_baz");
+int foobar = 3;
+
+/* { dg-final { scan-assembler-not "\\*_bar" } } */
+/* { dg-final { scan-assembler-not "\\*_baz" } } */
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostics for bad type conversion when inlining unprototyped
+ functions: should not be errors with -pedantic-errors. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-O3 -std=c99 -pedantic-errors" } */
+
+/* This is valid to execute, so maybe shouldn't warn at all. */
+static inline void f0(x) signed char *x; { }
+void g0(unsigned char *x) { f0(x); } /* { dg-warning "warning: pointer targets in passing argument 1 of 'f0' differ in signedness" } */
+
+/* This is undefined on execution but still must compile. */
+static inline void f1(x) int *x; { }
+void g1(unsigned int *x) { f1(x); } /* { dg-warning "warning: pointer targets in passing argument 1 of 'f1' differ in signedness" } */
--- /dev/null
+/* Test diagnostics for bad type conversion when inlining unprototyped
+ functions: should not be errors with -pedantic-errors. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-O3 -std=c99 -pedantic-errors" } */
+
+/* This is valid to execute, so maybe shouldn't warn at all. */
+static inline void f0(x) signed char *x; { }
+void g0(unsigned char *x) { f0(x); } /* { dg-warning "warning: pointer targets in passing argument 1 of 'f0' differ in signedness" } */
+
+/* This is undefined on execution but still must compile. */
+static inline void f1(x) int *x; { }
+void g1(unsigned int *x) { f1(x); } /* { dg-warning "warning: pointer targets in passing argument 1 of 'f1' differ in signedness" } */
--- /dev/null
+:1000000000E506758202C39582F506E50775830053
+:100010009583F507D0E0F500D0E0F501750900E51E
+:1000200009F502E509F503E509F504E509F505E536
+:1000300001C0E0E500C0E075E0022506F50675E0C8
+:10004000003507F507E502F582E503F583E504F5DC
+:1000500000E505F5012200E506758204C39582F5E9
+:1000600006E5077583009583F507D0E0F50875E090
+:10007000012506F58275E0003507F583E508F0D027
+:10008000E0F50875E0002506F58275E0003507F516
+:1000900083E508F0120000750000E500F502E500B8
+:1000A000F503E500F504E500F50575E0002506F526
+:1000B0008275E0003507F583E0F508E508C0E075D6
+:1000C000E0012506F58275E0003507F583E0F508C7
+:1000D000E508C0E075E0042506F50675E000350783
+:1000E000F507E502F582E503F583E504F500E5058E
+:1000F000F5012200E506758202C39582F506E50743
+:100100007583009583F507D0E0F500D0E0F5017523
+:100110000900E509F502E509F503E509F504E50936
+:10012000F505E501C0E0E500C0E075E0022506F553
+:100130000675E0003507F507E502F582E503F5836E
+:10014000E504F500E505F5012200E506758204C326
+:100150009582F506E5077583009583F507D0E0F5F0
+:100160000875E0012506F58275E0003507F583E5A1
+:1001700008F0D0E0F50875E0002506F58275E0008E
+:100180003507F583E508F01200F3750000E500F58A
+:1001900002E500F503E500F504E500F50575E0006E
+:1001A0002506F58275E0003507F583E0F508E508DA
+:1001B000C0E075E0012506F58275E0003507F5839E
+:1001C000E0F508E508C0E075E0042506F50675E0F1
+:1001D000003507F507E502F582E503F583E504F54B
+:1001E00000E505F50122000000000000000000000D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test always_inline attribute, which forces inlining of functions
+ even at no optimization. */
+/* Origin: Aldy Hernandez <aldyh@redhat.com>. */
+/* { dg-do compile } */
+/* { dg-options "-O0" } */
+
+static inline int sabrina (void) __attribute__((always_inline));
+
+static inline int sabrina (void)
+{
+ return 13;
+}
+
+int bar (void)
+{
+ return sabrina () + 68;
+}
+
+/* { dg-final { scan-assembler-not "sabrina" } } */
--- /dev/null
+/* Test always_inline attribute, which forces inlining of functions
+ even at no optimization. */
+/* Origin: Aldy Hernandez <aldyh@redhat.com>. */
+/* { dg-do compile } */
+/* { dg-options "-O0" } */
+
+static inline int sabrina (void) __attribute__((always_inline));
+
+static inline int sabrina (void)
+{
+ return 13;
+}
+
+int bar (void)
+{
+ return sabrina () + 68;
+}
+
+/* { dg-final { scan-assembler-not "sabrina" } } */
--- /dev/null
+:1000000000D0E0F500D0E0F50175090D750A007526
+:100010000B00750C00E509F502E50AF503E50BF5A3
+:1000200004E50CF505E501C0E0E500C0E0E502F5FA
+:1000300082E503F583E504F500E505F5012200E519
+:1000400006758202C39582F506E5077583009583E0
+:10005000F507D0E0F50875E0012506F58275E000AA
+:100060003507F583E508F0D0E0F50875E0002506D2
+:10007000F58275E0003507F583E508F0120000E52C
+:1000800082F502E583F503E500F504E501F505E5F4
+:1000900002F50BE503F50CE504F50DE505F50E7528
+:1000A0000044750100750900750A00C3750F00E56D
+:1000B00000F5F0E50B35F0F500E501F5F0E50C3560
+:1000C000F0F501E509F5F0E50D35F0F509E50AF57E
+:1000D000F0E50E35F0F50AE500F502E501F503E57A
+:1000E00009F504E50AF50575E0002506F58275E0D9
+:1000F000003507F583E0F508E508C0E075E0012567
+:1001000006F58275E0003507F583E0F508E508C0DF
+:10011000E075E0022506F50675E0003507F507E510
+:1001200002F582E503F583E504F500E505F5012216
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+#define CONCAT_(A,B) A ## B
+#define CONCAT(A,B) CONCAT_(A,B)
+
+#define ATTR __attribute__((AT))
+#define ATSYM(suf) CONCAT (AT, CONCAT_ (_, suf))
+
+#define AT noinline
+
+typedef int ATSYM(type) ATTR; /* { dg-warning "attribute ignored" "" } */
+
+typedef int (*ATSYM(fntype))(void) ATTR; /* { dg-warning "attribute ignored" "" } */
+
+struct ATSYM(struct) {
+ char dummy ATTR; /* { dg-warning "attribute ignored" "" } */
+} ATTR; /* { dg-warning "does not apply to types" "" } */
+
+int ATSYM(var) ATTR; /* { dg-warning "attribute ignored" "" } */
+
+int ATSYM(fn_knrarg) (arg)
+ int arg ATTR; /* { dg-warning "attribute ignored" "" } */
+{ return 0; }
+
+int ATSYM(fn_isoarg) (int arg ATTR) { return 0; } /* { dg-warning "attribute ignored" "" } */
+
+int ATSYM(fn_vars) (void) {
+ static int svar ATTR; /* { dg-warning "attribute ignored" "" } */
+ auto int lvar ATTR; /* { dg-warning "attribute ignored" "" } */
+ return 0;
+}
+
+
+#undef AT
+#define AT used
+
+typedef int ATSYM(type) ATTR; /* { dg-warning "attribute ignored" "" } */
+
+typedef int (*ATSYM(fntype))(void) ATTR; /* { dg-warning "attribute ignored" "" } */
+
+struct ATSYM(struct) {
+ char dummy ATTR; /* { dg-warning "attribute ignored" "" } */
+} ATTR; /* { dg-warning "does not apply to types" "" } */
+
+int ATSYM(var) ATTR;
+
+int ATSYM(fn_knrarg) (arg)
+ int arg ATTR; /* { dg-warning "attribute ignored" "" } */
+{ return 0; }
+
+int ATSYM(fn_isoarg) (int arg ATTR) { return 0; } /* { dg-warning "attribute ignored" "" } */
+
+int ATSYM(fn_vars) (void) {
+ static int svar ATTR;
+ auto int lvar ATTR; /* { dg-warning "attribute ignored" "" } */
+ return 0;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+#define CONCAT_(A,B) A ## B
+#define CONCAT(A,B) CONCAT_(A,B)
+
+#define ATTR __attribute__((AT))
+#define ATSYM(suf) CONCAT (AT, CONCAT_ (_, suf))
+
+#define AT noinline
+
+typedef int ATSYM(type) ATTR; /* { dg-warning "attribute ignored" "" } */
+
+typedef int (*ATSYM(fntype))(void) ATTR; /* { dg-warning "attribute ignored" "" } */
+
+struct ATSYM(struct) {
+ char dummy ATTR; /* { dg-warning "attribute ignored" "" } */
+} ATTR; /* { dg-warning "does not apply to types" "" } */
+
+int ATSYM(var) ATTR; /* { dg-warning "attribute ignored" "" } */
+
+int ATSYM(fn_knrarg) (arg)
+ int arg ATTR; /* { dg-warning "attribute ignored" "" } */
+{ return 0; }
+
+int ATSYM(fn_isoarg) (int arg ATTR) { return 0; } /* { dg-warning "attribute ignored" "" } */
+
+int ATSYM(fn_vars) (void) {
+ static int svar ATTR; /* { dg-warning "attribute ignored" "" } */
+ auto int lvar ATTR; /* { dg-warning "attribute ignored" "" } */
+ return 0;
+}
+
+
+#undef AT
+#define AT used
+
+typedef int ATSYM(type) ATTR; /* { dg-warning "attribute ignored" "" } */
+
+typedef int (*ATSYM(fntype))(void) ATTR; /* { dg-warning "attribute ignored" "" } */
+
+struct ATSYM(struct) {
+ char dummy ATTR; /* { dg-warning "attribute ignored" "" } */
+} ATTR; /* { dg-warning "does not apply to types" "" } */
+
+int ATSYM(var) ATTR;
+
+int ATSYM(fn_knrarg) (arg)
+ int arg ATTR; /* { dg-warning "attribute ignored" "" } */
+{ return 0; }
+
+int ATSYM(fn_isoarg) (int arg ATTR) { return 0; } /* { dg-warning "attribute ignored" "" } */
+
+int ATSYM(fn_vars) (void) {
+ static int svar ATTR;
+ auto int lvar ATTR; /* { dg-warning "attribute ignored" "" } */
+ return 0;
+}
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F500D0E0F501750900758E
+:100020000A00750B00750C00E509F502E50AF503F9
+:10003000E50BF504E50CF505E501C0E0E500C0E0E1
+:1000400075E0042506F50675E0003507F507E502BD
+:10005000F582E503F583E504F500E505F5012200E9
+:10006000E506758204C39582F506E507758300955C
+:1000700083F507D0E0F500D0E0F501750900750AB9
+:1000800000750B00750C00E509F502E50AF503E5BE
+:100090000BF504E50CF505E501C0E0E500C0E075F1
+:1000A000E0042506F50675E0003507F507E502F5DD
+:1000B00082E503F583E504F500E505F5012200D0AE
+:1000C000E0F500D0E0F501750900750A00750B0038
+:1000D000750C00E509F502E50AF503E50BF504E505
+:1000E0000CF505E501C0E0E500C0E0E502F582E5BC
+:1000F00003F583E504F500E505F5012200E5067545
+:100100008204C39582F506E5077583009583F5079C
+:10011000D0E0F500D0E0F501750900750A00750B17
+:1001200000750C00E509F502E50AF503E50BF50499
+:10013000E50CF505E501C0E0E500C0E075E004254B
+:1001400006F50675E0003507F507E502F582E503DB
+:10015000F583E504F500E505F5012200E506758265
+:1001600004C39582F506E5077583009583F507D0EE
+:10017000E0F500D0E0F501750900750A00750B0087
+:10018000750C00E509F502E50AF503E50BF504E554
+:100190000CF505E501C0E0E500C0E075E0042506CA
+:1001A000F50675E0003507F507E502F582E503F58C
+:1001B00083E504F500E505F5012200D0E0F500D067
+:1001C000E0F501750900750A00750B00750C00E576
+:1001D00009F502E50AF503E50BF504E50CF505E57F
+:1001E00001C0E0E500C0E0E502F582E503F583E546
+:1001F00004F500E505F50122000000000000000004
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target sh-*-* sh[1234ble]*-*-*} } */
+/* { dg-options "-O" } */
+/* Check that trapa / interrput_handler attributes can paired in
+ either order. */
+void h0() __attribute__ ((trap_exit (4))) __attribute__ ((interrupt_handler));
+void h1() __attribute__ ((interrupt_handler)) __attribute__ ((trap_exit (5)));
+
+void foo ()
+{
+}
+
+void h0 () {}
+/* { dg-final { scan-assembler "trapa\[ \t\]\[ \t\]*#4"} } */
+/* { dg-final { scan-assembler-times "trapa" 1} } */
+
+void delay(int a)
+{
+}
+int main()
+{
+ return 0;
+}
+
--- /dev/null
+/* { dg-do compile { target sh-*-* sh[1234ble]*-*-*} } */
+/* { dg-options "-O" } */
+/* Check that trapa / interrput_handler attributes can paired in
+ either order. */
+void h0() __attribute__ ((trap_exit (4))) __attribute__ ((interrupt_handler));
+void h1() __attribute__ ((interrupt_handler)) __attribute__ ((trap_exit (5)));
+
+void foo ()
+{
+}
+
+void h0 () {}
+/* { dg-final { scan-assembler "trapa\[ \t\]\[ \t\]*#4"} } */
+/* { dg-final { scan-assembler-times "trapa" 1} } */
+
+void delay(int a)
+{
+}
+int main()
+{
+ return 0;
+}
+
--- /dev/null
+:1000000075812F7506FF7507FF1200CF02000C00E7
+:10001000D0E0F500D0E0F501750900E509F502E54D
+:1000200009F503E509F504E509F505E501C0E0E595
+:1000300000C0E0E502F582E503F583E504F500E59F
+:1000400005F5012200D0E0F500D0E0F501750900CA
+:10005000E509F502E509F503E509F504E509F50506
+:10006000E501C0E0E500C0E0E502F582E503F583C7
+:10007000E504F500E505F5012200E506758204C3F7
+:100080009582F506E5077583009583F507D0E0F5C1
+:1000900000D0E0F501750900E509F502E509F50371
+:1000A000E509F504E509F505E501C0E0E500C0E076
+:1000B00075E0042506F50675E0003507F507E5024D
+:1000C000F582E503F583E504F500E505F501220079
+:1000D000D0E0F500D0E0F501750900750A00750B58
+:1000E00000750C00E509F502E50AF503E50BF504DA
+:1000F000E50CF505E501C0E0E500C0E0E502F582AC
+:10010000E503F583E504F500E505F50122000000AF
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR c/17384 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+typedef struct __attribute__((mode(SI))) {
+ unsigned INT0 :1,
+ RES0 :1,
+ :6,
+ INT1 :1,
+ RES1 :1,
+ :6,
+ :16;
+} MCR; /* { dg-error "inappropriate type" } */
--- /dev/null
+/* PR c/17384 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+typedef struct __attribute__((mode(SI))) {
+ unsigned INT0 :1,
+ RES0 :1,
+ :6,
+ INT1 :1,
+ RES1 :1,
+ :6,
+ :16;
+} MCR; /* { dg-error "inappropriate type" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall -O2" } */
+
+static int xyzzy __attribute__((__used__)) = 1;
+
+void foo()
+{
+ int x __attribute__((__used__)); /* { dg-warning "attribute ignored|unused variable" } */
+}
+
+/* { dg-final { scan-assembler "xyzzy" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall -O2" } */
+
+static int xyzzy __attribute__((__used__)) = 1;
+
+void foo()
+{
+ int x __attribute__((__used__)); /* { dg-warning "attribute ignored|unused variable" } */
+}
+
+/* { dg-final { scan-assembler "xyzzy" } } */
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+static void function_declaration_before(void) __attribute__((__used__));
+
+static void function_declaration_before(void) {}
+
+static void function_declaration_after(void) {}
+
+static void function_declaration_after(void) __attribute__((__used__));
+
+/* { dg-final { scan-assembler "function_declaration_before" } } */
+/* { dg-final { scan-assembler "function_declaration_after" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+static void function_declaration_before(void) __attribute__((__used__));
+
+static void function_declaration_before(void) {}
+
+static void function_declaration_after(void) {}
+
+static void function_declaration_after(void) __attribute__((__used__));
+
+/* { dg-final { scan-assembler "function_declaration_before" } } */
+/* { dg-final { scan-assembler "function_declaration_after" } } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+int uv4;
+int uv5;
+int uv7;
+int uv8;
+void uf4 (void) {}
+void uf5 (void) {}
+void uf7 (void) {}
+void uf8 (void) {}
--- /dev/null
+int uv4;
+int uv5;
+int uv7;
+int uv8;
+void uf4 (void) {}
+void uf5 (void) {}
+void uf7 (void) {}
+void uf8 (void) {}
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F5012200D0E0F500D0E0F5017509F5
+:1000400000E509F502E509F503E509F504E509F51B
+:1000500005E501C0E0E500C0E0E502F582E503F555
+:1000600083E504F500E505F5012200D0E0F500D0B8
+:10007000E0F501750900E509F502E509F503E50973
+:10008000F504E509F505E501C0E0E500C0E0E5029D
+:10009000F582E503F583E504F500E505F5012200A9
+:1000A000D0E0F500D0E0F501750900E509F502E5BD
+:1000B00009F503E509F504E509F505E501C0E0E505
+:1000C00000C0E0E502F582E503F583E504F500E50F
+:1000D00005F5012200000000000000000000000003
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for rejection of sizeof on bit-fields. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct { int a : 1; } x;
+
+int r = sizeof (x.a); /* { dg-error "error: 'sizeof' applied to a bit-field" } */
--- /dev/null
+/* Test for rejection of sizeof on bit-fields. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct { int a : 1; } x;
+
+int r = sizeof (x.a); /* { dg-error "error: 'sizeof' applied to a bit-field" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for non-integer bit-field widths. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+enum e { E, F };
+struct s {
+ int a : (void *)4; /* { dg-error "error: bit-field 'a' width not an integer constant" } */
+ int b : (enum e)F;
+ int c : (_Bool)1;
+};
--- /dev/null
+/* Test for non-integer bit-field widths. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+enum e { E, F };
+struct s {
+ int a : (void *)4; /* { dg-error "error: bit-field 'a' width not an integer constant" } */
+ int b : (enum e)F;
+ int c : (_Bool)1;
+};
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-options "" } */
+#include <limits.h>
+
+struct s
+{
+ int i1 : sizeof (int) * CHAR_BIT;
+ int i2 : sizeof (int) * CHAR_BIT;
+ int i3 : sizeof (int) * CHAR_BIT;
+ int i4 : sizeof (int) * CHAR_BIT;
+};
+
+int f[sizeof (struct s) != sizeof (int) * 4 ? -1 : 1];
--- /dev/null
+/* { dg-options "" } */
+#include <limits.h>
+
+struct s
+{
+ int i1 : sizeof (int) * CHAR_BIT;
+ int i2 : sizeof (int) * CHAR_BIT;
+ int i3 : sizeof (int) * CHAR_BIT;
+ int i4 : sizeof (int) * CHAR_BIT;
+};
+
+int f[sizeof (struct s) != sizeof (int) * 4 ? -1 : 1];
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-options "" } */
+#include <limits.h>
+
+struct s
+{
+ int i1 : sizeof (int) * CHAR_BIT;
+ int i2 : sizeof (int) * CHAR_BIT;
+ int i3 : sizeof (int) * CHAR_BIT;
+ int i4 : sizeof (int) * CHAR_BIT;
+ int i5 : sizeof (int) * CHAR_BIT;
+ int i6 : sizeof (int) * CHAR_BIT;
+ int i7 : sizeof (int) * CHAR_BIT;
+ int i8 : sizeof (int) * CHAR_BIT;
+};
+
+int f[sizeof (struct s) != sizeof (int) * 8 ? -1 : 1];
--- /dev/null
+/* { dg-options "" } */
+#include <limits.h>
+
+struct s
+{
+ int i1 : sizeof (int) * CHAR_BIT;
+ int i2 : sizeof (int) * CHAR_BIT;
+ int i3 : sizeof (int) * CHAR_BIT;
+ int i4 : sizeof (int) * CHAR_BIT;
+ int i5 : sizeof (int) * CHAR_BIT;
+ int i6 : sizeof (int) * CHAR_BIT;
+ int i7 : sizeof (int) * CHAR_BIT;
+ int i8 : sizeof (int) * CHAR_BIT;
+};
+
+int f[sizeof (struct s) != sizeof (int) * 8 ? -1 : 1];
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* The strstr call is expanded to just "s", which should not result in a
+ warning about discarding qualifiers in an assignment. */
+/* { dg-do compile } */
+extern char * strstr (const char *s1, const char * s2);
+void foo(const char *s){
+ char * cp;
+ cp = strstr(s, "");
+}
--- /dev/null
+/* The strstr call is expanded to just "s", which should not result in a
+ warning about discarding qualifiers in an assignment. */
+/* { dg-do compile } */
+extern char * strstr (const char *s1, const char * s2);
+void foo(const char *s){
+ char * cp;
+ cp = strstr(s, "");
+}
--- /dev/null
+:100000000000E506758204C39582F506E507758351
+:10001000009583F507D0E0F50875E0012506F58227
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000002506F58275E0003507F583E508F090A8
+:100040000000E582F51D900000E583F51C750000B9
+:10005000E500F502E500F503E500F504E500F5052A
+:1000600075E0002506F58275E0003507F583E0F5BB
+:1000700008E508C0E075E0012506F58275E0003569
+:1000800007F583E0F508E508C0E075E0042506F50E
+:100090000675E0003507F507E502F582E503F5830F
+:1000A000E504F500E505F501220000000000000070
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test that nan functions are not built-in in C90 mode. Bug 14635. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=c89" } */
+
+int nan, nanf, nanl, nans, nansf, nansl;
--- /dev/null
+/* Test that nan functions are not built-in in C90 mode. Bug 14635. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=c89" } */
+
+int nan, nanf, nanl, nans, nansf, nansl;
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for non-lvalue arrays: test that the unary '&' operator is not
+ allowed on them, for both C90 and C99. */
+
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+struct s { char c[1]; };
+
+extern struct s foo (void);
+struct s a, b, c;
+int d;
+
+void
+bar (void)
+{
+ &((foo ()).c); /* { dg-bogus "warning" "warning in place of error" } */
+ &((d ? b : c).c); /* { dg-bogus "warning" "warning in place of error" } */
+ &((d, b).c); /* { dg-bogus "warning" "warning in place of error" } */
+ &((a = b).c); /* { dg-bogus "warning" "warning in place of error" } */
+}
+/* { dg-error "lvalue" "bad address-of" { target *-*-* } 17 }
+ { dg-error "lvalue" "bad address-of" { target *-*-* } 18 }
+ { dg-error "lvalue" "bad address-of" { target *-*-* } 19 }
+ { dg-error "lvalue" "bad address-of" { target *-*-* } 20 }
+*/
--- /dev/null
+/* Test for non-lvalue arrays: test that the unary '&' operator is not
+ allowed on them, for both C90 and C99. */
+
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+struct s { char c[1]; };
+
+extern struct s foo (void);
+struct s a, b, c;
+int d;
+
+void
+bar (void)
+{
+ &((foo ()).c); /* { dg-bogus "warning" "warning in place of error" } */
+ &((d ? b : c).c); /* { dg-bogus "warning" "warning in place of error" } */
+ &((d, b).c); /* { dg-bogus "warning" "warning in place of error" } */
+ &((a = b).c); /* { dg-bogus "warning" "warning in place of error" } */
+}
+/* { dg-error "lvalue" "bad address-of" { target *-*-* } 17 }
+ { dg-error "lvalue" "bad address-of" { target *-*-* } 18 }
+ { dg-error "lvalue" "bad address-of" { target *-*-* } 19 }
+ { dg-error "lvalue" "bad address-of" { target *-*-* } 20 }
+*/
--- /dev/null
+:100000000000E506758208C39582F506E50775834D
+:10001000009583F507D0E0F50875E0032506F58225
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000022506F58275E0003507F583E508F075C1
+:10004000E0072506F58275E0003507F583E513F036
+:1000500075E0062506F58275E0003507F583E512A3
+:10006000F075E0052506F58275E0003507F583E5B6
+:1000700011F075E0042506F58275E0003507F5837B
+:10008000E510F0E506F509E507F50A750101C37508
+:100090000000E501F5F0E50935F0F501E500F5F0C2
+:1000A000E50A35F0F500E501F51FE500F51EE5066A
+:1000B000F509E507F50A750100C3750000E501F5CE
+:1000C000F0E50935F0F501E500F5F0E50A35F0F564
+:1000D0000A750900C3750000E509F5F0E50135F082
+:1000E000F501E500F5F0E50A35F0F500E501F50963
+:1000F000E500F50A750100C3750000E501F5F0E5BE
+:100100000935F0F501E500F5F0E50A35F0F500E513
+:1001100000F502E501F582E502F583E0F5117501D0
+:1001200001C3750000E501F5F0E50935F0F501E5DD
+:1001300000F5F0E50A35F0F500E500F502E501F51A
+:1001400082E502F583E0F501750900750A00750E78
+:1001500001750F00751000750000C3750B00E509EF
+:10016000F5F0E50EA4F50DE509F5F0E50EA4E5F0D2
+:10017000F50CE50DF5F0E50B35F0F50BE50AF5F0BE
+:10018000E50EA4F50DE50AF5F0E50EA4E5F0F50A97
+:10019000E50DF5F0E50C35F0F50CC3C3750A00E587
+:1001A0000BF5F0E51035F0F510E50CF5F0E5003550
+:1001B000F0F500C3750C00E509F5F0E50FA4F50DA9
+:1001C000E509F5F0E50FA4E5F0F50AE50DF5F0E534
+:1001D0000C35F0F50C750B00C3C3750900E50BF584
+:1001E000F0E51035F0F510E50CF5F0E50035F0F52B
+:1001F00000C3750B00750C00C3C3750900E50BF552
+:10020000F0E51035F0F510E50CF5F0E50035F0F50A
+:1002100000C3750B00750C00C3C3750900E50BF531
+:10022000F0E51035F0F510E50CF5F0E50035F0F5EA
+:1002300000C3750900E510F5F0E51135F0F512E59C
+:1002400000F5F0E50135F0F513900001E582F509C0
+:10025000900001E583F50A750100C3750000E50112
+:10026000F5F0E50935F0F501E500F5F0E50A35F0C2
+:10027000F500E501F509E500F50A750100C3750013
+:1002800000E501F5F0E50935F0F501E500F5F0E5EB
+:100290000A35F0F500E500F502E501F582E502F525
+:1002A00083E0F510750101C3750000E501F5F0E587
+:1002B0000935F0F501E500F5F0E50A35F0F500E562
+:1002C00000F502E501F582E502F583E0F511750020
+:1002D00000750100750C01750D00750E00750F009D
+:1002E000C3750900E500F5F0E50CA4F50BE500F594
+:1002F000F0E50CA4E5F0F50AE50BF5F0E50935F0BD
+:10030000F509E501F5F0E50CA4F50BE501F5F0E5DF
+:100310000CA4E5F0F501E50BF5F0E50A35F0F50A7A
+:10032000C3C3750100E509F5F0E50E35F0F50EE5FE
+:100330000AF5F0E50F35F0F50FC3750A00E500F595
+:10034000F0E50DA4F50BE500F5F0E50DA4E5F0F5FD
+:1003500001E50BF5F0E50A35F0F50A750900C3C3B0
+:10036000750000E509F5F0E50E35F0F50EE50AF546
+:10037000F0E50F35F0F50FC3750900750A00C3C32A
+:10038000750000E509F5F0E50E35F0F50EE50AF526
+:10039000F0E50F35F0F50FC3750900750A00C3C30A
+:1003A000750000E509F5F0E50E35F0F50EE50AF506
+:1003B000F0E50F35F0F50FC3750000E50EF5F0E53B
+:1003C0001035F0F500E50FF5F0E51135F0F501E534
+:1003D00000F509E501F50A750100C3750000E501A6
+:1003E000F5F0E50935F0F501E500F5F0E50A35F041
+:1003F000F500E500F502E501F582E502F583E0F59B
+:1004000009750100C3750000E501F5F0E51235F04E
+:10041000F501E500F5F0E51335F0F500E509F50324
+:10042000E500F502E501F582E502F583E503F090CC
+:100430000000E582F509900000E583F50A750100EA
+:10044000C3750000E501F5F0E50935F0F501E500BB
+:10045000F5F0E50A35F0F500E501F509E500F50AE6
+:10046000750100C3750000E501F5F0E50935F0F50B
+:1004700001E500F5F0E50A35F0F500E500F502E5E7
+:1004800001F582E502F583E0F511750101C3750000
+:1004900000E501F5F0E50935F0F501E500F5F0E5D9
+:1004A0000A35F0F500E500F502E501F582E502F513
+:1004B00083E0F501750900750A00750E01750F00DE
+:1004C000751000750000C3750B00E509F5F0E50E29
+:1004D000A4F50DE509F5F0E50EA4E5F0F50CE50D44
+:1004E000F5F0E50B35F0F50BE50AF5F0E50EA4F5B2
+:1004F0000DE50AF5F0E50EA4E5F0F50AE50DF5F0D9
+:10050000E50C35F0F50CC3C3750A00E50BF5F0E515
+:100510001035F0F510E50CF5F0E50035F0F500C309
+:10052000750C00E509F5F0E50FA4F50DE509F5F00A
+:10053000E50FA4E5F0F50AE50DF5F0E50C35F0F56D
+:100540000C750B00C3C3750900E50BF5F0E510351C
+:10055000F0F510E50CF5F0E50035F0F500C3750B8E
+:1005600000750C00C3C3750900E50BF5F0E5103507
+:10057000F0F510E50CF5F0E50035F0F500C3750B6E
+:1005800000750C00C3C3750900E50BF5F0E51035E7
+:10059000F0F510E50CF5F0E50035F0F500C3750950
+:1005A00000E510F5F0E51135F0F512E500F5F0E5A0
+:1005B0000135F0F513E506F509E507F50A750100C3
+:1005C000C3750000E501F5F0E50935F0F501E5003A
+:1005D000F5F0E50A35F0F50A750900C3750000E588
+:1005E00009F5F0E50135F0F501E500F5F0E50A352E
+:1005F000F0F500E501F509E500F50A750100C375A0
+:100600000000E501F5F0E50935F0F501E500F5F04C
+:10061000E50A35F0F500E500F502E501F582E502B1
+:10062000F583E0F510750101C3750000E501F5F0F3
+:10063000E50935F0F501E500F5F0E50A35F0F500DE
+:10064000E500F502E501F582E502F583E0F51175B7
+:100650000000750100750C01750D00750E00750F19
+:1006600000C3750900E500F5F0E50CA4F50BE50005
+:10067000F5F0E50CA4E5F0F50AE50BF5F0E5093534
+:10068000F0F509E501F5F0E50CA4F50BE501F5F051
+:10069000E50CA4E5F0F501E50BF5F0E50A35F0F51C
+:1006A0000AC3C3750100E509F5F0E50E35F0F50E56
+:1006B000E50AF5F0E50F35F0F50FC3750A00E50022
+:1006C000F5F0E50DA4F50BE500F5F0E50DA4E5F07A
+:1006D000F501E50BF5F0E50A35F0F50A750900C3FB
+:1006E000C3750000E509F5F0E50E35F0F50EE50AF5
+:1006F000F5F0E50F35F0F50FC3750900750A00C375
+:10070000C3750000E509F5F0E50E35F0F50EE50AD4
+:10071000F5F0E50F35F0F50FC3750900750A00C354
+:10072000C3750000E509F5F0E50E35F0F50EE50AB4
+:10073000F5F0E50F35F0F50FC3750000E50EF5F0A7
+:10074000E51035F0F500E50FF5F0E51135F0F501B0
+:10075000E500F509E501F50A750100C3750000E53E
+:1007600001F5F0E50935F0F501E500F5F0E50A35AC
+:10077000F0F500E500F502E501F582E502F583E01C
+:10078000F509750100C3750000E501F5F0E51235C6
+:10079000F0F501E500F5F0E51335F0F500E509F5B4
+:1007A00003E500F502E501F582E502F583E503F0D6
+:1007B000750000E500F502E500F503E500F504E548
+:1007C00000F50575E0072506F58275E0003507F5AB
+:1007D00083E0F51375E0062506F58275E000350720
+:1007E000F583E0F51275E0052506F58275E0003524
+:1007F00007F583E0F51175E0042506F58275E00044
+:100800003507F583E0F51075E0022506F58275E001
+:10081000003507F583E0F508E508C0E075E003253D
+:1008200006F58275E0003507F583E0F508E508C0B8
+:10083000E075E0082506F50675E0003507F507E5E3
+:1008400002F582E503F583E504F500E505F50122EF
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR c/12446 */
+/* Origin: Keith Thompson <kst@cts.com> */
+
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+
+struct s { char c[1]; };
+
+extern struct s foo(void);
+
+void bar(void)
+{
+ char *ptr = foo().c; /* { dg-bogus "warning" "warning in place of error" } */
+}
+/* { dg-error "non-lvalue" "array not decaying to lvalue" { target *-*-* } 14 } */
--- /dev/null
+/* PR c/12446 */
+/* Origin: Keith Thompson <kst@cts.com> */
+
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+
+struct s { char c[1]; };
+
+extern struct s foo(void);
+
+void bar(void)
+{
+ char *ptr = foo().c; /* { dg-bogus "warning" "warning in place of error" } */
+}
+/* { dg-error "non-lvalue" "array not decaying to lvalue" { target *-*-* } 14 } */
--- /dev/null
+:100000000000E506758203C39582F506E507758352
+:10001000009583F507D0E0F50875E0022506F58226
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000012506F58275E0003507F583E508F0E552
+:1000400006F509E507F50A750100C3750000E5012D
+:10005000F5F0E50935F0F501E500F5F0E50A35F0D4
+:10006000F500E501F51FE500F51EC3C3C3C3750028
+:1000700000E500F502E500F503E500F504E500F50F
+:100080000575E0012506F58275E0003507F583E08A
+:10009000F508E508C0E075E0022506F58275E00088
+:1000A0003507F583E0F508E508C0E075E0032506AF
+:1000B000F50675E0003507F507E502F582E503F57D
+:1000C00083E504F500E505F50122000000000000CD
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for non-lvalue arrays: test that C90 does not allow them in
+ conditional expressions, while in C99 they decay and are
+ allowed. */
+
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+struct s { char c[1]; };
+struct s a, b, c;
+int d;
+int e;
+
+void
+bar (void)
+{
+ /* In C90, the non-lvalue arrays do not decay to pointers, and
+ 6.3.15 does not permit conditional expressions between arrays.
+ In C99, they decay to pointers. */
+ (e ? (d ? b : c).c : (e ? b : c).c); /* { dg-bogus "warning" "warning in place of error" } */
+}
+
+/* { dg-error "array" "bad conditional" { target *-*-* } 20 } */
--- /dev/null
+/* Test for non-lvalue arrays: test that C90 does not allow them in
+ conditional expressions, while in C99 they decay and are
+ allowed. */
+
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+struct s { char c[1]; };
+struct s a, b, c;
+int d;
+int e;
+
+void
+bar (void)
+{
+ /* In C90, the non-lvalue arrays do not decay to pointers, and
+ 6.3.15 does not permit conditional expressions between arrays.
+ In C99, they decay to pointers. */
+ (e ? (d ? b : c).c : (e ? b : c).c); /* { dg-bogus "warning" "warning in place of error" } */
+}
+
+/* { dg-error "array" "bad conditional" { target *-*-* } 20 } */
--- /dev/null
+:1000000000D0E0F518D0E0F519E511F50EE510F592
+:100010000F900007E582F509900007E583F50A7562
+:100020000100C3750000E501F5F0E50935F0F501C3
+:10003000E500F5F0E50A35F0F500E500F502E5012B
+:10004000F582E502F583E0F50B750101C37500004B
+:10005000E501F5F0E50935F0F501E500F5F0E50A13
+:1000600035F0F500E500F502E501F582E502F583DE
+:10007000E0F50C750102C3750000E501F5F0E50936
+:1000800035F0F501E500F5F0E50A35F0F500E5009D
+:10009000F502E501F582E502F583E0F50D75010352
+:1000A000C3750000E501F5F0E50935F0F501E5005F
+:1000B000F5F0E50A35F0F500E500F502E501F58219
+:1000C000E502F583E0F501750000E50BF5F0E500CC
+:1000D00045F0F500E50CF5F0E50045F0F500E50D1F
+:1000E000F5F0E50045F0F500E501F5F0E50045F037
+:1000F000F500E5007002800302013000750000E5A4
+:1001000000F502E500F503E500F504E500F505E579
+:100110000EF511E50FF510E519C0E0E518C0E0E5B2
+:1001200002F582E503F583E504F500E505F5012216
+:10013000000200FC000000000000000000000000C1
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+extern const char *const a[];
+extern const char *const a[];
+extern const char *const a[];
--- /dev/null
+extern const char *const a[];
+extern const char *const a[];
+extern const char *const a[];
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+extern int (*const a)[];
+extern int (*const a)[10];
+extern int (*const a)[];
--- /dev/null
+extern int (*const a)[];
+extern int (*const a)[10];
+extern int (*const a)[];
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for constraints on constant expressions. In C90 it is clear that
+ certain constructs are not permitted in unevaluated parts of an
+ expression (except in sizeof); in C99 it might fall within implementation
+ latitude.
+*/
+/* Origin: Joseph Myers <jsm28@cam.ac.uk>; inspired by
+ http://deja.com/getdoc.xp?AN=524271595&fmt=text by Peter Seebach.
+*/
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+extern int bar (void);
+
+void
+foo (void)
+{
+ int i;
+ static int j = (1 ? 0 : (i = 2)); /* { dg-error "initial" "assignment" { xfail *-*-* } } */
+ static int k = (1 ? 0 : ++i); /* { dg-error "initial" "increment" { xfail *-*-* } } */
+ static int l = (1 ? 0 : --i); /* { dg-error "initial" "decrement" { xfail *-*-* } } */
+ static int m = (1 ? 0 : bar ()); /* { dg-error "initial" "function call" { xfail *-*-* } } */
+ static int n = (1 ? 0 : (2, 3)); /* { dg-error "initial" "comma" { xfail *-*-* } } */
+}
--- /dev/null
+/* Test for constraints on constant expressions. In C90 it is clear that
+ certain constructs are not permitted in unevaluated parts of an
+ expression (except in sizeof); in C99 it might fall within implementation
+ latitude.
+*/
+/* Origin: Joseph Myers <jsm28@cam.ac.uk>; inspired by
+ http://deja.com/getdoc.xp?AN=524271595&fmt=text by Peter Seebach.
+*/
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+extern int bar (void);
+
+void
+foo (void)
+{
+ int i;
+ static int j = (1 ? 0 : (i = 2)); /* { dg-error "initial" "assignment" { xfail *-*-* } } */
+ static int k = (1 ? 0 : ++i); /* { dg-error "initial" "increment" { xfail *-*-* } } */
+ static int l = (1 ? 0 : --i); /* { dg-error "initial" "decrement" { xfail *-*-* } } */
+ static int m = (1 ? 0 : bar ()); /* { dg-error "initial" "function call" { xfail *-*-* } } */
+ static int n = (1 ? 0 : (2, 3)); /* { dg-error "initial" "comma" { xfail *-*-* } } */
+}
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+typedef const int CI;
+const const int c1; /* { dg-error "duplicate" } */
+const CI c2; /* { dg-error "duplicate" } */
+const CI *c3; /* { dg-error "duplicate" } */
+
+typedef volatile int VI;
+volatile volatile int v1; /* { dg-error "duplicate" } */
+volatile VI v2; /* { dg-error "duplicate" } */
+volatile VI *v3; /* { dg-error "duplicate" } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+typedef const int CI;
+const const int c1; /* { dg-error "duplicate" } */
+const CI c2; /* { dg-error "duplicate" } */
+const CI *c3; /* { dg-error "duplicate" } */
+
+typedef volatile int VI;
+volatile volatile int v1; /* { dg-error "duplicate" } */
+volatile VI v2; /* { dg-error "duplicate" } */
+volatile VI *v3; /* { dg-error "duplicate" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for commas at end of enums: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+enum foo { bar, }; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "comma at end" "enum comma error" { target *-*-* } 6 } */
--- /dev/null
+/* Test for commas at end of enums: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+enum foo { bar, }; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "comma at end" "enum comma error" { target *-*-* } 6 } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for flexible array members. Test for rejection in C90 mode. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+struct flex { int a; int b[]; }; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "ISO C90" "flexible array members not in C90" { target *-*-* } 6 } */
--- /dev/null
+/* Test for flexible array members. Test for rejection in C90 mode. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+struct flex { int a; int b[]; }; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "ISO C90" "flexible array members not in C90" { target *-*-* } 6 } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for idempotent type qualifiers: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+typedef const int cint;
+const cint foo; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "duplicate" "duplicate type qualifier error" { target *-*-* } 7 } */
--- /dev/null
+/* Test for idempotent type qualifiers: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+typedef const int cint;
+const cint foo; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "duplicate" "duplicate type qualifier error" { target *-*-* } 7 } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for idempotent type qualifiers: in C99 only. Test "const const". */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+const const int foo; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "duplicate" "duplicate type qualifier error" { target *-*-* } 6 } */
--- /dev/null
+/* Test for idempotent type qualifiers: in C99 only. Test "const const". */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+const const int foo; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "duplicate" "duplicate type qualifier error" { target *-*-* } 6 } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for idempotent type qualifiers: in C99 only. Test duplicate
+ type qualifiers with array element types. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+typedef const int cia[2];
+const cia a; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "duplicate" "duplicate type qualifier error" { target *-*-* } 8 } */
+const cia b[2]; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "duplicate" "duplicate type qualifier error" { target *-*-* } 10 } */
--- /dev/null
+/* Test for idempotent type qualifiers: in C99 only. Test duplicate
+ type qualifiers with array element types. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+typedef const int cia[2];
+const cia a; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "duplicate" "duplicate type qualifier error" { target *-*-* } 8 } */
+const cia b[2]; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "duplicate" "duplicate type qualifier error" { target *-*-* } 10 } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for implicit int: in C90 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+extern foo;
+
+bar (void) { }
--- /dev/null
+/* Test for implicit int: in C90 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+extern foo;
+
+bar (void) { }
--- /dev/null
+:1000000000D0E0F500D0E0F501E509F502E509F5DD
+:1000100003E509F504E509F505E501C0E0E500C0E3
+:10002000E0E502F582E503F583E504F500E505F575
+:10003000012200000000000000000000000000009D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for implicit int: in C90 only. Function parameters in old-style
+ function definition.
+*/
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+void foo (a) { }
--- /dev/null
+/* Test for implicit int: in C90 only. Function parameters in old-style
+ function definition.
+*/
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+void foo (a) { }
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F500D0E0F501750900E51E
+:1000200009F502E509F503E509F504E509F505E536
+:1000300001C0E0E500C0E075E0042506F50675E0C6
+:10004000003507F507E502F582E503F583E504F5DC
+:1000500000E505F50122000000000000000000009E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for long long: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+long long foo; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "long long" "long long not in C90" { target *-*-* } 6 } */
--- /dev/null
+/* Test for long long: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+long long foo; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "long long" "long long not in C90" { target *-*-* } 6 } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for C99 mixed declarations and code: not in C90. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+void
+foo (void)
+{
+ int i;
+ i = 0;
+ int j; /* { dg-bogus "warning" "warning in place of error" } */
+ /* { dg-error "mix|parse" "mixed declarations and code not in C90" { target *-*-* } 11 } */
+}
--- /dev/null
+/* Test for C99 mixed declarations and code: not in C90. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+void
+foo (void)
+{
+ int i;
+ i = 0;
+ int j; /* { dg-bogus "warning" "warning in place of error" } */
+ /* { dg-error "mix|parse" "mixed declarations and code not in C90" { target *-*-* } 11 } */
+}
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for restrict: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+char *restrict foo; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "parse error|syntax error|expected|no type" "restrict not in C90" { target *-*-* } 6 } */
--- /dev/null
+/* Test for restrict: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+char *restrict foo; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "parse error|syntax error|expected|no type" "restrict not in C90" { target *-*-* } 6 } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* It is a constraint violation for a static function to be declared
+ but not defined if it is used except in a sizeof expression. The
+ use of the function simply being unevaluated is not enough. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-O2 -std=iso9899:1990 -pedantic-errors" } */
+
+/* Constraint violation (trivial case, where function is used). */
+static void f0(void); /* { dg-error "used but never defined" } */
+void g0(void) { f0(); }
+
+/* Constraint violation. */
+static void f1(void); /* { dg-error "used but never defined" } */
+void g1(void) { if (0) { f1(); } }
+
+/* Constraint violation. */
+static int f2(void); /* { dg-error "used but never defined" } */
+void g2(void) { 0 ? f2() : 0; }
+
+/* OK. */
+static int f3(void);
+void g3(void) { sizeof(f3()); }
--- /dev/null
+/* It is a constraint violation for a static function to be declared
+ but not defined if it is used except in a sizeof expression. The
+ use of the function simply being unevaluated is not enough. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-O2 -std=iso9899:1990 -pedantic-errors" } */
+
+/* Constraint violation (trivial case, where function is used). */
+static void f0(void); /* { dg-error "used but never defined" } */
+void g0(void) { f0(); }
+
+/* Constraint violation. */
+static void f1(void); /* { dg-error "used but never defined" } */
+void g1(void) { if (0) { f1(); } }
+
+/* Constraint violation. */
+static int f2(void); /* { dg-error "used but never defined" } */
+void g2(void) { 0 ? f2() : 0; }
+
+/* OK. */
+static int f3(void);
+void g3(void) { sizeof(f3()); }
--- /dev/null
+:100000000000E506758202C39582F506E507758353
+:10001000009583F507D0E0F50875E0012506F58227
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000002506F58275E0003507F583E508F075C3
+:100040000000E500F502E500F503E500F504E50034
+:10005000F50575E0002506F58275E0003507F583A6
+:10006000E0F508E508C0E075E0012506F58275E0D9
+:10007000003507F583E0F508E508C0E075E00225E6
+:1000800006F50675E0003507F507E502F582E5039C
+:10009000F583E504F500E505F501220000E50675A8
+:1000A0008202C39582F506E5077583009583F507FF
+:1000B000D0E0F50875E0012506F58275E00035070A
+:1000C000F583E508F0D0E0F50875E0002506F58237
+:1000D00075E0003507F583E508F075010075090046
+:1000E000750A00750B00750000E501F5F0E50045A7
+:1000F000F0F500E509F5F0E50045F0F500E50AF555
+:10010000F0E50045F0F500E50BF5F0E50045F0F50C
+:1001100000E5007002800302017700750000E50031
+:10012000F502E500F503E500F504E500F50575E0E9
+:10013000002506F58275E0003507F583E0F508E552
+:1001400008C0E075E0012506F58275E0003507F589
+:1001500083E0F508E508C0E075E0022506F50675C0
+:10016000E0003507F507E502F582E503F583E504D0
+:10017000F500E505F501220002011B0000E506750A
+:100180008202C39582F506E5077583009583F5071E
+:10019000D0E0F50875E0012506F58275E000350729
+:1001A000F583E508F0D0E0F50875E0002506F58256
+:1001B00075E0003507F583E508F075010075090065
+:1001C000750A00750B00750000E501F5F0E50045C6
+:1001D000F0F500E509F5F0E50045F0F500E50AF574
+:1001E000F0E50045F0F500E50BF5F0E50045F0F52C
+:1001F00000E5007002800302025700750000E50070
+:10020000F502E500F503E500F504E500F50575E008
+:10021000002506F58275E0003507F583E0F508E571
+:1002200008C0E075E0012506F58275E0003507F5A8
+:1002300083E0F508E508C0E075E0022506F50675DF
+:10024000E0003507F507E502F582E503F583E504EF
+:10025000F500E505F50122000201FB00D0E0F50004
+:10026000D0E0F501750900E509F502E509F503E5BA
+:1002700009F504E509F505E501C0E0E500C0E0E5A4
+:1002800002F582E503F583E504F500E505F50122B5
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for non-lvalue arrays decaying to pointers: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+struct s { char c[1]; };
+
+extern struct s foo (void);
+
+void
+bar (void)
+{
+ char *t;
+ (foo ()).c[0]; /* { dg-bogus "non-lvalue" "array not decaying to lvalue" } */
+ t = (foo ()).c; /* { dg-bogus "non-lvalue" "array not decaying to lvalue" } */
+ (foo ()).c + 1; /* { dg-bogus "non-lvalue" "array not decaying to lvalue" } */
+}
--- /dev/null
+/* Test for non-lvalue arrays decaying to pointers: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+struct s { char c[1]; };
+
+extern struct s foo (void);
+
+void
+bar (void)
+{
+ char *t;
+ (foo ()).c[0]; /* { dg-bogus "non-lvalue" "array not decaying to lvalue" } */
+ t = (foo ()).c; /* { dg-bogus "non-lvalue" "array not decaying to lvalue" } */
+ (foo ()).c + 1; /* { dg-bogus "non-lvalue" "array not decaying to lvalue" } */
+}
--- /dev/null
+:100000000000E506758205C39582F506E507758350
+:10001000009583F507D0E0F50875E0042506F58224
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000032506F58275E0003507F583E508F0E550
+:1000400006F509E507F50A750102C3750000E5012B
+:10005000F5F0E50935F0F501E500F5F0E50A35F0D4
+:10006000F500E501F51FE500F51EE506F509E507D4
+:10007000F50A750101C3750000E501F5F0E50935E4
+:10008000F0F501E500F5F0E50A35F0F500E501F5DC
+:100090001FE500F51EC3C3C3C3E506F509E507F573
+:1000A0000A750100C3750000E501F5F0E50935F0BA
+:1000B000F501E500F5F0E50A35F0F500E501F51F7D
+:1000C000E500F51E750000E500F502E500F503E525
+:1000D00000F504E500F50575E0032506F58275E0F9
+:1000E000003507F583E0F508E508C0E075E0042574
+:1000F00006F58275E0003507F583E0F508E508C0F0
+:10010000E075E0052506F50675E0003507F507E51D
+:1001100002F582E503F583E504F500E505F5012226
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for non-lvalue arrays: test that the unary '&' operator is not
+ allowed on them, for both C90 and C99. */
+
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+struct s { char c[1]; };
+
+extern struct s foo (void);
+struct s a, b, c;
+int d;
+
+void
+bar (void)
+{
+ &((foo ()).c); /* { dg-bogus "warning" "warning in place of error" } */
+ &((d ? b : c).c); /* { dg-bogus "warning" "warning in place of error" } */
+ &((d, b).c); /* { dg-bogus "warning" "warning in place of error" } */
+ &((a = b).c); /* { dg-bogus "warning" "warning in place of error" } */
+}
+/* { dg-error "lvalue" "bad address-of" { target *-*-* } 17 }
+ { dg-error "lvalue" "bad address-of" { target *-*-* } 18 }
+ { dg-error "lvalue" "bad address-of" { target *-*-* } 19 }
+ { dg-error "lvalue" "bad address-of" { target *-*-* } 20 }
+*/
--- /dev/null
+/* Test for non-lvalue arrays: test that the unary '&' operator is not
+ allowed on them, for both C90 and C99. */
+
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+struct s { char c[1]; };
+
+extern struct s foo (void);
+struct s a, b, c;
+int d;
+
+void
+bar (void)
+{
+ &((foo ()).c); /* { dg-bogus "warning" "warning in place of error" } */
+ &((d ? b : c).c); /* { dg-bogus "warning" "warning in place of error" } */
+ &((d, b).c); /* { dg-bogus "warning" "warning in place of error" } */
+ &((a = b).c); /* { dg-bogus "warning" "warning in place of error" } */
+}
+/* { dg-error "lvalue" "bad address-of" { target *-*-* } 17 }
+ { dg-error "lvalue" "bad address-of" { target *-*-* } 18 }
+ { dg-error "lvalue" "bad address-of" { target *-*-* } 19 }
+ { dg-error "lvalue" "bad address-of" { target *-*-* } 20 }
+*/
--- /dev/null
+:100000000000E506758208C39582F506E50775834D
+:10001000009583F507D0E0F50875E0032506F58225
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000022506F58275E0003507F583E508F075C1
+:10004000E0072506F58275E0003507F583E513F036
+:1000500075E0062506F58275E0003507F583E512A3
+:10006000F075E0052506F58275E0003507F583E5B6
+:1000700011F075E0042506F58275E0003507F5837B
+:10008000E510F0E506F509E507F50A750101C37508
+:100090000000E501F5F0E50935F0F501E500F5F0C2
+:1000A000E50A35F0F500E501F51FE500F51EE5066A
+:1000B000F509E507F50A750100C3750000E501F5CE
+:1000C000F0E50935F0F501E500F5F0E50A35F0F564
+:1000D0000A750900C3750000E509F5F0E50135F082
+:1000E000F501E500F5F0E50A35F0F500E501F50963
+:1000F000E500F50A750100C3750000E501F5F0E5BE
+:100100000935F0F501E500F5F0E50A35F0F500E513
+:1001100000F502E501F582E502F583E0F5117501D0
+:1001200001C3750000E501F5F0E50935F0F501E5DD
+:1001300000F5F0E50A35F0F500E500F502E501F51A
+:1001400082E502F583E0F501750900750A00750E78
+:1001500001750F00751000750000C3750B00E509EF
+:10016000F5F0E50EA4F50DE509F5F0E50EA4E5F0D2
+:10017000F50CE50DF5F0E50B35F0F50BE50AF5F0BE
+:10018000E50EA4F50DE50AF5F0E50EA4E5F0F50A97
+:10019000E50DF5F0E50C35F0F50CC3C3750A00E587
+:1001A0000BF5F0E51035F0F510E50CF5F0E5003550
+:1001B000F0F500C3750C00E509F5F0E50FA4F50DA9
+:1001C000E509F5F0E50FA4E5F0F50AE50DF5F0E534
+:1001D0000C35F0F50C750B00C3C3750900E50BF584
+:1001E000F0E51035F0F510E50CF5F0E50035F0F52B
+:1001F00000C3750B00750C00C3C3750900E50BF552
+:10020000F0E51035F0F510E50CF5F0E50035F0F50A
+:1002100000C3750B00750C00C3C3750900E50BF531
+:10022000F0E51035F0F510E50CF5F0E50035F0F5EA
+:1002300000C3750900E510F5F0E51135F0F512E59C
+:1002400000F5F0E50135F0F513900001E582F509C0
+:10025000900001E583F50A750100C3750000E50112
+:10026000F5F0E50935F0F501E500F5F0E50A35F0C2
+:10027000F500E501F509E500F50A750100C3750013
+:1002800000E501F5F0E50935F0F501E500F5F0E5EB
+:100290000A35F0F500E500F502E501F582E502F525
+:1002A00083E0F510750101C3750000E501F5F0E587
+:1002B0000935F0F501E500F5F0E50A35F0F500E562
+:1002C00000F502E501F582E502F583E0F511750020
+:1002D00000750100750C01750D00750E00750F009D
+:1002E000C3750900E500F5F0E50CA4F50BE500F594
+:1002F000F0E50CA4E5F0F50AE50BF5F0E50935F0BD
+:10030000F509E501F5F0E50CA4F50BE501F5F0E5DF
+:100310000CA4E5F0F501E50BF5F0E50A35F0F50A7A
+:10032000C3C3750100E509F5F0E50E35F0F50EE5FE
+:100330000AF5F0E50F35F0F50FC3750A00E500F595
+:10034000F0E50DA4F50BE500F5F0E50DA4E5F0F5FD
+:1003500001E50BF5F0E50A35F0F50A750900C3C3B0
+:10036000750000E509F5F0E50E35F0F50EE50AF546
+:10037000F0E50F35F0F50FC3750900750A00C3C32A
+:10038000750000E509F5F0E50E35F0F50EE50AF526
+:10039000F0E50F35F0F50FC3750900750A00C3C30A
+:1003A000750000E509F5F0E50E35F0F50EE50AF506
+:1003B000F0E50F35F0F50FC3750000E50EF5F0E53B
+:1003C0001035F0F500E50FF5F0E51135F0F501E534
+:1003D00000F509E501F50A750100C3750000E501A6
+:1003E000F5F0E50935F0F501E500F5F0E50A35F041
+:1003F000F500E500F502E501F582E502F583E0F59B
+:1004000009750100C3750000E501F5F0E51235F04E
+:10041000F501E500F5F0E51335F0F500E509F50324
+:10042000E500F502E501F582E502F583E503F090CC
+:100430000000E582F509900000E583F50A750100EA
+:10044000C3750000E501F5F0E50935F0F501E500BB
+:10045000F5F0E50A35F0F500E501F509E500F50AE6
+:10046000750100C3750000E501F5F0E50935F0F50B
+:1004700001E500F5F0E50A35F0F500E500F502E5E7
+:1004800001F582E502F583E0F511750101C3750000
+:1004900000E501F5F0E50935F0F501E500F5F0E5D9
+:1004A0000A35F0F500E500F502E501F582E502F513
+:1004B00083E0F501750900750A00750E01750F00DE
+:1004C000751000750000C3750B00E509F5F0E50E29
+:1004D000A4F50DE509F5F0E50EA4E5F0F50CE50D44
+:1004E000F5F0E50B35F0F50BE50AF5F0E50EA4F5B2
+:1004F0000DE50AF5F0E50EA4E5F0F50AE50DF5F0D9
+:10050000E50C35F0F50CC3C3750A00E50BF5F0E515
+:100510001035F0F510E50CF5F0E50035F0F500C309
+:10052000750C00E509F5F0E50FA4F50DE509F5F00A
+:10053000E50FA4E5F0F50AE50DF5F0E50C35F0F56D
+:100540000C750B00C3C3750900E50BF5F0E510351C
+:10055000F0F510E50CF5F0E50035F0F500C3750B8E
+:1005600000750C00C3C3750900E50BF5F0E5103507
+:10057000F0F510E50CF5F0E50035F0F500C3750B6E
+:1005800000750C00C3C3750900E50BF5F0E51035E7
+:10059000F0F510E50CF5F0E50035F0F500C3750950
+:1005A00000E510F5F0E51135F0F512E500F5F0E5A0
+:1005B0000135F0F513E506F509E507F50A750100C3
+:1005C000C3750000E501F5F0E50935F0F501E5003A
+:1005D000F5F0E50A35F0F50A750900C3750000E588
+:1005E00009F5F0E50135F0F501E500F5F0E50A352E
+:1005F000F0F500E501F509E500F50A750100C375A0
+:100600000000E501F5F0E50935F0F501E500F5F04C
+:10061000E50A35F0F500E500F502E501F582E502B1
+:10062000F583E0F510750101C3750000E501F5F0F3
+:10063000E50935F0F501E500F5F0E50A35F0F500DE
+:10064000E500F502E501F582E502F583E0F51175B7
+:100650000000750100750C01750D00750E00750F19
+:1006600000C3750900E500F5F0E50CA4F50BE50005
+:10067000F5F0E50CA4E5F0F50AE50BF5F0E5093534
+:10068000F0F509E501F5F0E50CA4F50BE501F5F051
+:10069000E50CA4E5F0F501E50BF5F0E50A35F0F51C
+:1006A0000AC3C3750100E509F5F0E50E35F0F50E56
+:1006B000E50AF5F0E50F35F0F50FC3750A00E50022
+:1006C000F5F0E50DA4F50BE500F5F0E50DA4E5F07A
+:1006D000F501E50BF5F0E50A35F0F50A750900C3FB
+:1006E000C3750000E509F5F0E50E35F0F50EE50AF5
+:1006F000F5F0E50F35F0F50FC3750900750A00C375
+:10070000C3750000E509F5F0E50E35F0F50EE50AD4
+:10071000F5F0E50F35F0F50FC3750900750A00C354
+:10072000C3750000E509F5F0E50E35F0F50EE50AB4
+:10073000F5F0E50F35F0F50FC3750000E50EF5F0A7
+:10074000E51035F0F500E50FF5F0E51135F0F501B0
+:10075000E500F509E501F50A750100C3750000E53E
+:1007600001F5F0E50935F0F501E500F5F0E50A35AC
+:10077000F0F500E500F502E501F582E502F583E01C
+:10078000F509750100C3750000E501F5F0E51235C6
+:10079000F0F501E500F5F0E51335F0F500E509F5B4
+:1007A00003E500F502E501F582E502F583E503F0D6
+:1007B000750000E500F502E500F503E500F504E548
+:1007C00000F50575E0072506F58275E0003507F5AB
+:1007D00083E0F51375E0062506F58275E000350720
+:1007E000F583E0F51275E0052506F58275E0003524
+:1007F00007F583E0F51175E0042506F58275E00044
+:100800003507F583E0F51075E0022506F58275E001
+:10081000003507F583E0F508E508C0E075E003253D
+:1008200006F58275E0003507F583E0F508E508C0B8
+:10083000E075E0082506F50675E0003507F507E5E3
+:1008400002F582E503F583E504F500E505F50122EF
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR c/12446 */
+/* Origin: Keith Thompson <kst@cts.com> */
+
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+
+struct s { char c[1]; };
+
+extern struct s foo(void);
+
+void bar(void)
+{
+ char *ptr = foo().c; /* { dg-bogus "non-lvalue" "array not decaying to lvalue" } */
+}
--- /dev/null
+/* PR c/12446 */
+/* Origin: Keith Thompson <kst@cts.com> */
+
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+
+struct s { char c[1]; };
+
+extern struct s foo(void);
+
+void bar(void)
+{
+ char *ptr = foo().c; /* { dg-bogus "non-lvalue" "array not decaying to lvalue" } */
+}
--- /dev/null
+:100000000000E506758203C39582F506E507758352
+:10001000009583F507D0E0F50875E0022506F58226
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000012506F58275E0003507F583E508F0E552
+:1000400006F509E507F50A750100C3750000E5012D
+:10005000F5F0E50935F0F501E500F5F0E50A35F0D4
+:10006000F500E501F51FE500F51EC3C3C3C3750028
+:1000700000E500F502E500F503E500F504E500F50F
+:100080000575E0012506F58275E0003507F583E08A
+:10009000F508E508C0E075E0022506F58275E00088
+:1000A0003507F583E0F508E508C0E075E0032506AF
+:1000B000F50675E0003507F507E502F582E503F57D
+:1000C00083E504F500E505F50122000000000000CD
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for non-lvalue arrays: test that C90 does not allow them in
+ conditional expressions, while in C99 they decay and are
+ allowed. */
+
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+struct s { char c[1]; };
+struct s a, b, c;
+int d;
+int e;
+
+void
+bar (void)
+{
+ /* In C90, the non-lvalue arrays do not decay to pointers, and
+ 6.3.15 does not permit conditional expressions between arrays.
+ In C99, they decay to pointers. */
+ (e ? (d ? b : c).c : (e ? b : c).c);
+}
--- /dev/null
+/* Test for non-lvalue arrays: test that C90 does not allow them in
+ conditional expressions, while in C99 they decay and are
+ allowed. */
+
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+struct s { char c[1]; };
+struct s a, b, c;
+int d;
+int e;
+
+void
+bar (void)
+{
+ /* In C90, the non-lvalue arrays do not decay to pointers, and
+ 6.3.15 does not permit conditional expressions between arrays.
+ In C99, they decay to pointers. */
+ (e ? (d ? b : c).c : (e ? b : c).c);
+}
--- /dev/null
+:1000000000D0E0F518D0E0F519E511F50EE510F592
+:100010000F900007E582F509900007E583F50A7562
+:100020000100C3750000E501F5F0E50935F0F501C3
+:10003000E500F5F0E50A35F0F500E500F502E5012B
+:10004000F582E502F583E0F50B750101C37500004B
+:10005000E501F5F0E50935F0F501E500F5F0E50A13
+:1000600035F0F500E500F502E501F582E502F583DE
+:10007000E0F50C750102C3750000E501F5F0E50936
+:1000800035F0F501E500F5F0E50A35F0F500E5009D
+:10009000F502E501F582E502F583E0F50D75010352
+:1000A000C3750000E501F5F0E50935F0F501E5005F
+:1000B000F5F0E50A35F0F500E500F502E501F58219
+:1000C000E502F583E0F501750000E50BF5F0E500CC
+:1000D00045F0F500E50CF5F0E50045F0F500E50D1F
+:1000E000F5F0E50045F0F500E501F5F0E50045F037
+:1000F000F500E5007002800302013000750000E5A4
+:1001000000F502E500F503E500F504E500F505E579
+:100110000EF511E50FF510E519C0E0E518C0E0E5B2
+:1001200002F582E503F583E504F500E505F5012216
+:10013000000200FC000000000000000000000000C1
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for arrays of incomplete and function types: a constraint violation
+ in C99 only, though undefined (DR#047) before.
+*/
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+typedef void func (void);
+struct s;
+
+extern int a[][]; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "array" "\[\]\[\] var" { target *-*-* } 11 } */
+
+void f (int [][]); /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "array" "\[\]\[\] arg" { target *-*-* } 14 } */
+
+extern struct s b[]; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "array" "struct \[\] var" { target *-*-* } 17 } */
+
+void g (struct s []); /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "array" "struct \[\] arg" { target *-*-* } 20 } */
+
+extern func c[]; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "array" "func \[\] var" { target *-*-* } 23 } */
+
+void h (func []); /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "array" "func \[\] arg" { target *-*-* } 26 } */
--- /dev/null
+/* Test for arrays of incomplete and function types: a constraint violation
+ in C99 only, though undefined (DR#047) before.
+*/
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+typedef void func (void);
+struct s;
+
+extern int a[][]; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "array" "\[\]\[\] var" { target *-*-* } 11 } */
+
+void f (int [][]); /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "array" "\[\]\[\] arg" { target *-*-* } 14 } */
+
+extern struct s b[]; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "array" "struct \[\] var" { target *-*-* } 17 } */
+
+void g (struct s []); /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "array" "struct \[\] arg" { target *-*-* } 20 } */
+
+extern func c[]; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "array" "func \[\] var" { target *-*-* } 23 } */
+
+void h (func []); /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "array" "func \[\] arg" { target *-*-* } 26 } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for constraints on constant expressions. In C90 it is clear that
+ certain constructs are not permitted in unevaluated parts of an
+ expression (except in sizeof); in C99 it might fall within implementation
+ latitude; and if the operands are suitable, diagnostics should not be
+ issued.
+*/
+/* Origin: Joseph Myers <jsm28@cam.ac.uk>; inspired by
+ http://deja.com/getdoc.xp?AN=524271595&fmt=text by Peter Seebach.
+*/
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+/* The comma operator is in a subexpression that is not evaluated, so OK
+ by C99. In C90 a diagnostic is required since it is not in a sizeof.
+*/
+int i = (1 ? 0 : (2, 3));
--- /dev/null
+/* Test for constraints on constant expressions. In C90 it is clear that
+ certain constructs are not permitted in unevaluated parts of an
+ expression (except in sizeof); in C99 it might fall within implementation
+ latitude; and if the operands are suitable, diagnostics should not be
+ issued.
+*/
+/* Origin: Joseph Myers <jsm28@cam.ac.uk>; inspired by
+ http://deja.com/getdoc.xp?AN=524271595&fmt=text by Peter Seebach.
+*/
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+/* The comma operator is in a subexpression that is not evaluated, so OK
+ by C99. In C90 a diagnostic is required since it is not in a sizeof.
+*/
+int i = (1 ? 0 : (2, 3));
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+typedef const int CI;
+const const int c1; /* { dg-bogus "duplicate" } */
+const CI c2; /* { dg-bogus "duplicate" } */
+const CI *c3; /* { dg-bogus "duplicate" } */
+
+typedef volatile int VI;
+volatile volatile int v1; /* { dg-bogus "duplicate" } */
+volatile VI v2; /* { dg-bogus "duplicate" } */
+volatile VI *v3; /* { dg-bogus "duplicate" } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+typedef const int CI;
+const const int c1; /* { dg-bogus "duplicate" } */
+const CI c2; /* { dg-bogus "duplicate" } */
+const CI *c3; /* { dg-bogus "duplicate" } */
+
+typedef volatile int VI;
+volatile volatile int v1; /* { dg-bogus "duplicate" } */
+volatile VI v2; /* { dg-bogus "duplicate" } */
+volatile VI *v3; /* { dg-bogus "duplicate" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for commas at end of enums: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+enum foo { bar, };
--- /dev/null
+/* Test for commas at end of enums: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+enum foo { bar, };
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for flexible array members. Test for where structures with
+ such members may not occur. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+struct flex { int a; int b[]; };
+union rf1 { struct flex a; int b; };
+union rf2 { int a; struct flex b; };
+union rf3 { int a; union rf1 b; };
+union rf4 { union rf2 a; int b; };
+
+/* The above structure and unions may not be members of structures or
+ elements of arrays (6.7.2.1#2). */
+
+struct t0 { struct flex a; }; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "struct in struct" { target *-*-* } 16 } */
+struct t1 { union rf1 a; }; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "union in struct" { target *-*-* } 18 } */
+struct t2 { union rf2 a; }; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "union in struct" { target *-*-* } 20 } */
+struct t3 { union rf3 a; }; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "recursive union in struct" { target *-*-* } 22 } */
+struct t4 { union rf4 a; }; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "recursive union in struct" { target *-*-* } 24 } */
+
+void f0 (struct flex[]); /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "struct in array" { target *-*-* } 27 } */
+void f1 (union rf1[]); /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "union in array" { target *-*-* } 29 } */
+void f2 (union rf2[]); /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "union in array" { target *-*-* } 31 } */
+void f3 (union rf3[]); /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "recursive union in array" { target *-*-* } 33 } */
+void f4 (union rf4[]); /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "recursive union in array" { target *-*-* } 35 } */
+
+struct flex a0[1]; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "struct in array" { target *-*-* } 38 } */
+union rf1 a1[1]; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "union in array" { target *-*-* } 40 } */
+union rf2 a2[1]; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "union in array" { target *-*-* } 42 } */
+union rf3 a3[1]; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "recursive union in array" { target *-*-* } 44 } */
+union rf4 a4[1]; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "recursive union in array" { target *-*-* } 46 } */
--- /dev/null
+/* Test for flexible array members. Test for where structures with
+ such members may not occur. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+struct flex { int a; int b[]; };
+union rf1 { struct flex a; int b; };
+union rf2 { int a; struct flex b; };
+union rf3 { int a; union rf1 b; };
+union rf4 { union rf2 a; int b; };
+
+/* The above structure and unions may not be members of structures or
+ elements of arrays (6.7.2.1#2). */
+
+struct t0 { struct flex a; }; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "struct in struct" { target *-*-* } 16 } */
+struct t1 { union rf1 a; }; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "union in struct" { target *-*-* } 18 } */
+struct t2 { union rf2 a; }; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "union in struct" { target *-*-* } 20 } */
+struct t3 { union rf3 a; }; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "recursive union in struct" { target *-*-* } 22 } */
+struct t4 { union rf4 a; }; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "recursive union in struct" { target *-*-* } 24 } */
+
+void f0 (struct flex[]); /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "struct in array" { target *-*-* } 27 } */
+void f1 (union rf1[]); /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "union in array" { target *-*-* } 29 } */
+void f2 (union rf2[]); /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "union in array" { target *-*-* } 31 } */
+void f3 (union rf3[]); /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "recursive union in array" { target *-*-* } 33 } */
+void f4 (union rf4[]); /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "recursive union in array" { target *-*-* } 35 } */
+
+struct flex a0[1]; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "struct in array" { target *-*-* } 38 } */
+union rf1 a1[1]; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "union in array" { target *-*-* } 40 } */
+union rf2 a2[1]; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "union in array" { target *-*-* } 42 } */
+union rf3 a3[1]; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "recursive union in array" { target *-*-* } 44 } */
+union rf4 a4[1]; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "invalid use of structure" "recursive union in array" { target *-*-* } 46 } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for C99 __func__: not a string constant. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+void
+foo (void)
+{
+ __func__ "foo"; /* { dg-error "parse error|syntax error|expected" "before string constant" } */
+}
--- /dev/null
+/* Test for C99 __func__: not a string constant. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+void
+foo (void)
+{
+ __func__ "foo"; /* { dg-error "parse error|syntax error|expected" "before string constant" } */
+}
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for idempotent type qualifiers: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+typedef const int cint;
+const cint foo; /* { dg-bogus "duplicate" "duplicate type qualifier error" } */
--- /dev/null
+/* Test for idempotent type qualifiers: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+typedef const int cint;
+const cint foo; /* { dg-bogus "duplicate" "duplicate type qualifier error" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for idempotent type qualifiers: in C99 only. Test "const const". */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+const const int foo; /* { dg-bogus "duplicate" "duplicate type qualifier error" } */
--- /dev/null
+/* Test for idempotent type qualifiers: in C99 only. Test "const const". */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+const const int foo; /* { dg-bogus "duplicate" "duplicate type qualifier error" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for idempotent type qualifiers: in C99 only. Test duplicate
+ type qualifiers with array element types. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+typedef const int cia[2];
+const cia a; /* { dg-bogus "duplicate" "duplicate type qualifier warning" } */
+const cia b[2]; /* { dg-bogus "duplicate" "duplicate type qualifier warning" } */
--- /dev/null
+/* Test for idempotent type qualifiers: in C99 only. Test duplicate
+ type qualifiers with array element types. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+typedef const int cia[2];
+const cia a; /* { dg-bogus "duplicate" "duplicate type qualifier warning" } */
+const cia b[2]; /* { dg-bogus "duplicate" "duplicate type qualifier warning" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for implicit int: in C90 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+extern foo; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "type defaults" "C99 implicit int error" { target *-*-* } 6 } */
+bar (void) { } /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "return type defaults" "C99 implicit int error" { target *-*-* } 8 } */
--- /dev/null
+/* Test for implicit int: in C90 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+extern foo; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "type defaults" "C99 implicit int error" { target *-*-* } 6 } */
+bar (void) { } /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "return type defaults" "C99 implicit int error" { target *-*-* } 8 } */
--- /dev/null
+:1000000000D0E0F500D0E0F501E509F502E509F5DD
+:1000100003E509F504E509F505E501C0E0E500C0E3
+:10002000E0E502F582E503F583E504F500E505F575
+:10003000012200000000000000000000000000009D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for implicit int: in C90 only. Function parameters in old-style
+ function definition.
+*/
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+void foo (a) { } /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "defaults" "C99 implicit int parameter error" { target *-*-* } 8 } */
--- /dev/null
+/* Test for implicit int: in C90 only. Function parameters in old-style
+ function definition.
+*/
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+void foo (a) { } /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "defaults" "C99 implicit int parameter error" { target *-*-* } 8 } */
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F500D0E0F501750900E51E
+:1000200009F502E509F503E509F504E509F505E536
+:1000300001C0E0E500C0E075E0042506F50675E0C6
+:10004000003507F507E502F582E503F583E504F5DC
+:1000500000E505F50122000000000000000000009E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for long long: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+long long foo; /* { dg-bogus "long long" "bogus long long error" } */
--- /dev/null
+/* Test for long long: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+long long foo; /* { dg-bogus "long long" "bogus long long error" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for implicit return 0 from main in C99. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do run } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors -Wreturn-type -O -fhosted" } */
+
+int
+main (void)
+{
+} /* { dg-bogus "control reaches end" "missing implicit return" } */
--- /dev/null
+/* Test for implicit return 0 from main in C99. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do run } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors -Wreturn-type -O -fhosted" } */
+
+int
+main (void)
+{
+} /* { dg-bogus "control reaches end" "missing implicit return" } */
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501E509F502E509F503CA
+:10002000E509F504E509F505E501C0E0E500C0E0F6
+:10003000E502F582E503F583E504F500E505F50144
+:10004000220000000000000000000000000000008E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for restrict: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+char *restrict foo;
+
+/* The following are constraint violations and should be rejected. */
+
+int restrict bar; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "restrict" "restrict constraint violation" { target *-*-* } 10 } */
+
+typedef void (*fp) (void);
+
+fp restrict baz; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "restrict" "restrict constraint violation" { target *-*-* } 15 } */
+
+void quux (int restrict a[3]); /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "restrict" "restrict constraint violation" { target *-*-* } 18 } */
--- /dev/null
+/* Test for restrict: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+char *restrict foo;
+
+/* The following are constraint violations and should be rejected. */
+
+int restrict bar; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "restrict" "restrict constraint violation" { target *-*-* } 10 } */
+
+typedef void (*fp) (void);
+
+fp restrict baz; /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "restrict" "restrict constraint violation" { target *-*-* } 15 } */
+
+void quux (int restrict a[3]); /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "restrict" "restrict constraint violation" { target *-*-* } 18 } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for restrict: in C99 only. Test handling of arrays of restricted
+ pointers. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+typedef int *ipa[2];
+
+int *restrict x[2];
+restrict ipa y;
+
+void f(int *restrict a[2], restrict ipa b, int *restrict c[restrict]);
--- /dev/null
+/* Test for restrict: in C99 only. Test handling of arrays of restricted
+ pointers. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+typedef int *ipa[2];
+
+int *restrict x[2];
+restrict ipa y;
+
+void f(int *restrict a[2], restrict ipa b, int *restrict c[restrict]);
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for handling of tags. A struct defined in an inner scope does
+ not match one declared in an outer scope. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+struct s;
+struct t { struct s *p; } x;
+
+void
+f (void)
+{
+ /* This is a different struct s from the outer one. */
+ struct s { int a; } y;
+ x.p = &y; /* { dg-error "incompatible" } */
+}
--- /dev/null
+/* Test for handling of tags. A struct defined in an inner scope does
+ not match one declared in an outer scope. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+struct s;
+struct t { struct s *p; } x;
+
+void
+f (void)
+{
+ /* This is a different struct s from the outer one. */
+ struct s { int a; } y;
+ x.p = &y; /* { dg-error "incompatible" } */
+}
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F50ED0E0F50FE510F50D6E
+:10002000900000E582F50A900000E583F50175096E
+:1000300000C3750000E509F5F0E50A35F0F50BE5BC
+:1000400000F5F0E50135F0F50CE506F50AE507F5F4
+:1000500001750900C3750000E509F5F0E50A35F002
+:10006000F509E500F5F0E50135F0F50A750100C385
+:10007000750000E501F5F0E50B35F0F501E500F55B
+:10008000F0E50C35F0F500E509F503E500F502E5CE
+:1000900001F582E502F583E503F0750101C3750002
+:1000A00000E501F5F0E50B35F0F501E500F5F0E5CB
+:1000B0000C35F0F500E50AF503E500F502E501F57C
+:1000C00082E502F583E503F0750000E500F502E541
+:1000D00000F503E500F504E500F505E50DF510E58F
+:1000E0000FC0E0E50EC0E075E0042506F50675E0FA
+:1000F000003507F507E502F582E503F583E504F52C
+:1001000000E505F5012200000000000000000000ED
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Incorrect `cast discards `const'' warnings. There should be warnings
+ in bad_cast and bad_assign; bad_assign gets the correct warning, but
+ good_cast may get the warning instead of bad_cast.
+ gcc 2.7.2.3 passes, egcs-1.1.2 and egcs-ss-19990428 fail.
+ http://gcc.gnu.org/ml/gcc-bugs/1998-08/msg00645.html */
+/* { dg-do compile } */
+/* { dg-options "-Wcast-qual" } */
+void
+good_cast(const void *bar)
+{
+ (char *const *)bar; /* { dg-bogus "cast discards" "discarding `const' warning" } */
+}
+
+void
+bad_cast(const void *bar)
+{
+ (const char **)bar; /* { dg-warning "cast discards" "discarding `const' warning" } */
+}
+
+void
+good_assign(const void *bar)
+{
+ char *const *foo = bar; /* { dg-bogus "initialization discards" "discarding `const' warning" } */
+}
+
+void
+bad_assign(const void *bar)
+{
+ const char **foo = bar; /* { dg-warning "initialization discards" "discarding `const' warning" } */
+}
--- /dev/null
+/* Incorrect `cast discards `const'' warnings. There should be warnings
+ in bad_cast and bad_assign; bad_assign gets the correct warning, but
+ good_cast may get the warning instead of bad_cast.
+ gcc 2.7.2.3 passes, egcs-1.1.2 and egcs-ss-19990428 fail.
+ http://gcc.gnu.org/ml/gcc-bugs/1998-08/msg00645.html */
+/* { dg-do compile } */
+/* { dg-options "-Wcast-qual" } */
+void
+good_cast(const void *bar)
+{
+ (char *const *)bar; /* { dg-bogus "cast discards" "discarding `const' warning" } */
+}
+
+void
+bad_cast(const void *bar)
+{
+ (const char **)bar; /* { dg-warning "cast discards" "discarding `const' warning" } */
+}
+
+void
+good_assign(const void *bar)
+{
+ char *const *foo = bar; /* { dg-bogus "initialization discards" "discarding `const' warning" } */
+}
+
+void
+bad_assign(const void *bar)
+{
+ const char **foo = bar; /* { dg-warning "initialization discards" "discarding `const' warning" } */
+}
--- /dev/null
+:1000000000E506758202C39582F506E50775830053
+:100010009583F507D0E0F500D0E0F501750900E51E
+:1000200009F502E509F503E509F504E509F505E536
+:1000300001C0E0E500C0E075E0022506F50675E0C8
+:10004000003507F507E502F582E503F583E504F5DC
+:1000500000E505F5012200E506758202C39582F5EB
+:1000600006E5077583009583F507D0E0F500D0E03D
+:10007000F501750900E509F502E509F503E509F55E
+:1000800004E509F505E501C0E0E500C0E075E00222
+:100090002506F50675E0003507F507E502F582E56A
+:1000A00003F583E504F500E505F5012200E5067595
+:1000B0008202C39582F506E5077583009583F507EF
+:1000C000D0E0F500D0E0F501750900E509F502E59D
+:1000D00009F503E509F504E509F505E501C0E0E5E5
+:1000E00000C0E075E0022506F50675E0003507F56D
+:1000F00007E502F582E503F583E504F500E505F57E
+:10010000012200E506758202C39582F506E50775B2
+:1001100083009583F507D0E0F500D0E0F50175097F
+:1001200000E509F502E509F503E509F504E509F53A
+:1001300005E501C0E0E500C0E075E0022506F50632
+:1001400075E0003507F507E502F582E503F583E57F
+:1001500004F500E505F501220000000000000000A4
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "" } */
+/* Verify that the cleanup handler receives the proper contents
+ of the variable. */
+
+extern void exit(int);
+extern void abort(void);
+
+static int expected;
+
+static void
+handler(int *p)
+{
+ if (*p != expected)
+ abort ();
+}
+
+static void __attribute__((noinline))
+bar(void)
+{
+}
+
+static void doit(int x, int y)
+{
+ int r __attribute__((cleanup (handler)));
+ if (x < y)
+ {
+ r = 0;
+ return;
+ }
+
+ bar();
+ r = x + y;
+}
+
+int main()
+{
+ expected = 0;
+ doit (1, 2);
+
+ expected = 3;
+ doit (2, 1);
+
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "" } */
+/* Verify that the cleanup handler receives the proper contents
+ of the variable. */
+
+extern void exit(int);
+extern void abort(void);
+
+static int expected;
+
+static void
+handler(int *p)
+{
+ if (*p != expected)
+ abort ();
+}
+
+static void __attribute__((noinline))
+bar(void)
+{
+}
+
+static void doit(int x, int y)
+{
+ int r __attribute__((cleanup (handler)));
+ if (x < y)
+ {
+ r = 0;
+ return;
+ }
+
+ bar();
+ r = x + y;
+}
+
+int main()
+{
+ expected = 0;
+ doit (1, 2);
+
+ expected = 3;
+ doit (2, 1);
+
+ return 0;
+}
--- /dev/null
+:1000000075812F7506FF7507FF1204E602000C00CC
+:10001000D0E0F500D0E0F501750900E509F502E54D
+:1000200009F503E509F504E509F505E501C0E0E595
+:1000300000C0E0E502F582E503F583E504F500E59F
+:1000400005F5012200E506758212C39582F506E5E5
+:10005000077583009583F507D0E0F50875E0012565
+:1000600006F58275E0003507F583E508F0D0E0F588
+:100070000875E0002506F58275E0003507F583E593
+:1000800008F075E0092506F58275E0003507F5836F
+:10009000E517F075E0082506F58275E0003507F5EF
+:1000A00083E516F075E0072506F58275E000350753
+:1000B000F583E515F075E0062506F58275E0003557
+:1000C00007F583E514F075E0052506F58275E00077
+:1000D0003507F583E513F075E0042506F58275E034
+:1000E000003507F583E512F075E0032506F5827506
+:1000F000E0003507F583E511F075E0022506F5828D
+:1001000075E0003507F583E510F0E51DF50BE51CFE
+:10011000F50CE51BF500E51AF501E519F509E518FB
+:10012000F50AE51FF517E51EF515E50BF512E50CCB
+:10013000F513E500F516E501F514E509F510E50AF6
+:10014000F511750080E500F5F0E51325F0F513E5F0
+:1001500000F5F0E51125F0F511750C00750D007531
+:100160000E00750F00750B00750A01750001C3E5DF
+:1001700011F5F0E51395F0F509E50BF5F0E50B3514
+:10018000F0F509E509F5F0E50055F0F500E500F5B5
+:10019000F0E50C45F0F50C750001C3E511F5F0E54F
+:1001A0001395F0F509E50BF5F0E50B35F0F509E5EC
+:1001B00013F5F0E51195F0F501E50BF5F0E50B35DC
+:1001C000F0F501E501F5F0E50945F0F509E50AF579
+:1001D000F0E50965F0F509E509F5F0E50055F0F5FC
+:1001E00000C3E510F5F0E51295F0F509E50BF5F023
+:1001F000E50B35F0F509E509F5F0E50055F0F500FA
+:10020000E500F5F0E50C45F0F50C750001C3E511CE
+:10021000F5F0E51395F0F509E50BF5F0E50B35F094
+:10022000F509E513F5F0E51195F0F501E50BF5F0AD
+:10023000E50B35F0F501E501F5F0E50945F0F509C7
+:10024000E50AF5F0E50965F0F509E509F5F0E500E1
+:1002500055F0F500C3E510F5F0E51295F0F509E568
+:100260000BF5F0E50B35F0F509E512F5F0E5109525
+:10027000F0F501E50BF5F0E50B35F0F501E501F5DD
+:10028000F0E50945F0F509E50AF5F0E50965F0F551
+:1002900009E509F5F0E50055F0F500C3E514F5F0C2
+:1002A000E51595F0F509E50BF5F0E50B35F0F509E9
+:1002B000E509F5F0E50055F0F500E500F5F0E50C91
+:1002C00045F0F50C750001C3E511F5F0E51395F067
+:1002D000F509E50BF5F0E50B35F0F509E513F5F05B
+:1002E000E51195F0F501E50BF5F0E50B35F0F501BD
+:1002F000E501F5F0E50945F0F509E50AF5F0E50950
+:1003000065F0F509E509F5F0E50055F0F500C3E500
+:1003100010F5F0E51295F0F509E50BF5F0E50B3574
+:10032000F0F509E512F5F0E51095F0F501E50BF5AE
+:10033000F0E50B35F0F501E501F5F0E50945F0F5DF
+:1003400009E50AF5F0E50965F0F509E509F5F0E5D7
+:100350000055F0F500C3E514F5F0E51595F0F50945
+:10036000E50BF5F0E50B35F0F509E515F5F0E514CD
+:1003700095F0F501E50BF5F0E50B35F0F501E5013C
+:10038000F5F0E50945F0F509E50AF5F0E50965F050
+:10039000F509E509F5F0E50055F0F500C3E516F5BA
+:1003A000F0E51795F0F509E50BF5F0E50B35F0F5FF
+:1003B00009E509F5F0E50055F0F500E500F5F0E593
+:1003C0000C45F0F50C750000E50CF5F0E50045F086
+:1003D000F500E50DF5F0E50045F0F500E50EF5F06A
+:1003E000E50045F0F500E50FF5F0E50045F0F50016
+:1003F000E500700280030204E20012000FC37500E2
+:1004000000E500F502E500F503E500F504E500F57B
+:100410000575E0092506F58275E0003507F583E0EE
+:10042000F51775E0082506F58275E0003507F583B8
+:10043000E0F51675E0072506F58275E0003507F54D
+:1004400083E0F51575E0062506F58275E0003507B1
+:10045000F583E0F51475E0052506F58275E00035B5
+:1004600007F583E0F51375E0042506F58275E000D5
+:100470003507F583E0F51275E0032506F58275E092
+:10048000003507F583E0F51175E0022506F5827564
+:10049000E0003507F583E0F51075E0002506F582EC
+:1004A00075E0003507F583E0F508E508C0E075E084
+:1004B000012506F58275E0003507F583E0F508E5CE
+:1004C00008C0E075E0122506F50675E0003507F571
+:1004D00007E502F582E503F583E504F500E505F59A
+:1004E0000122000203FE00E506758202C39582F533
+:1004F00006E5077583009583F507D0E0F50875E0FC
+:10050000012506F58275E0003507F583E508F0D092
+:10051000E0F50875E0002506F58275E0003507F581
+:1005200083E508F0900000E582F50D900000E5837A
+:10053000F50E750900750A00750B00750C00750144
+:1005400000C3750000E501F5F0E50D35F0F501E5B6
+:1005500000F5F0E50E35F0F500E509F503E500F5E9
+:1005600002E501F582E502F583E503F0750101C3BB
+:10057000750000E501F5F0E50D35F0F501E500F554
+:10058000F0E50E35F0F500E50AF503E500F502E5C6
+:1005900001F582E502F583E503F0750102C37500FC
+:1005A00000E501F5F0E50D35F0F501E500F5F0E5C4
+:1005B0000E35F0F500E50BF503E500F502E501F574
+:1005C00082E502F583E503F0750103C3750000E5DC
+:1005D00001F5F0E50D35F0F501E500F5F0E50E3536
+:1005E000F0F500E50CF503E500F502E501F582E51F
+:1005F00002F583E503F0751F01751E00751D00757A
+:100600001C00751B02751A00751900751800120080
+:1006100044900000E582F50D900000E583F50E752D
+:100620000903750A00750B00750C00750100C37590
+:100630000000E501F5F0E50D35F0F501E500F5F018
+:10064000E50E35F0F500E509F503E500F502E501F5
+:10065000F582E502F583E503F0750101C37500003D
+:10066000E501F5F0E50D35F0F501E500F5F0E50EF5
+:1006700035F0F500E50AF503E500F502E501F58240
+:10068000E502F583E503F0750102C3750000E5019D
+:10069000F5F0E50D35F0F501E500F5F0E50E35F086
+:1006A000F500E50BF503E500F502E501F582E5024D
+:1006B000F583E503F0750103C3750000E501F5F06E
+:1006C000E50D35F0F501E500F5F0E50E35F0F50046
+:1006D000E50CF503E500F502E501F582E502F58399
+:1006E000E503F0751F02751E00751D00751C007571
+:1006F0001B01751A00751900751800120044750069
+:1007000000750100750900750A00E500F502E501B4
+:10071000F503E509F504E50AF50575E0002506F59C
+:100720008275E0003507F583E0F508E508C0E0755F
+:10073000E0012506F58275E0003507F583E0F50850
+:10074000E508C0E075E0022506F50675E00035070E
+:10075000F507E502F582E503F583E504F500E50517
+:10076000F501220000000000000000000000000071
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O" } */
+/* Verify that a cleanup marked "inline" gets inlined. */
+
+static inline void xyzzy(void *p __attribute__((unused)))
+{
+}
+
+void doit(void)
+{
+ int x __attribute__((cleanup (xyzzy)));
+}
+
+/* { dg-final { scan-assembler-not "xyzzy" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O" } */
+/* Verify that a cleanup marked "inline" gets inlined. */
+
+static inline void xyzzy(void *p __attribute__((unused)))
+{
+}
+
+void doit(void)
+{
+ int x __attribute__((cleanup (xyzzy)));
+}
+
+/* { dg-final { scan-assembler-not "xyzzy" } } */
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* When merging a nonprototype definition of a function with a prior
+ prototype declaration, the composite type of the return types must
+ be formed rather than just copying the function type. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+
+typedef int a[];
+typedef int a5[5];
+typedef int a10[10];
+
+a *f1 ();
+a5 *f1 () { return 0; }
+
+a *f2 (void);
+a5 *f2 () { return 0; }
+
+a *f3 ();
+a5 *f3 (void) { return 0; }
+
+a *f4 (void);
+a5 *f4 (void) { return 0; }
+
+void
+g (void)
+{
+ a10 *x;
+ x = f1 (); /* { dg-error "incompatible" "f1" } */
+ x = f2 (); /* { dg-error "incompatible" "f2" } */
+ x = f3 (); /* { dg-error "incompatible" "f3" } */
+ x = f4 (); /* { dg-error "incompatible" "f4" } */
+}
--- /dev/null
+/* When merging a nonprototype definition of a function with a prior
+ prototype declaration, the composite type of the return types must
+ be formed rather than just copying the function type. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+
+typedef int a[];
+typedef int a5[5];
+typedef int a10[10];
+
+a *f1 ();
+a5 *f1 () { return 0; }
+
+a *f2 (void);
+a5 *f2 () { return 0; }
+
+a *f3 ();
+a5 *f3 (void) { return 0; }
+
+a *f4 (void);
+a5 *f4 (void) { return 0; }
+
+void
+g (void)
+{
+ a10 *x;
+ x = f1 (); /* { dg-error "incompatible" "f1" } */
+ x = f2 (); /* { dg-error "incompatible" "f2" } */
+ x = f3 (); /* { dg-error "incompatible" "f3" } */
+ x = f4 (); /* { dg-error "incompatible" "f4" } */
+}
--- /dev/null
+:1000000000D0E0F500D0E0F501750900750A007533
+:100010000B00E509F502E50AF503E50BF504E50B30
+:10002000F505E501C0E0E500C0E0E502F582E50385
+:10003000F583E504F500E505F5012200D0E0F500C3
+:10004000D0E0F501750900750A00750B00E509F5AA
+:1000500002E50AF503E50BF504E50BF505E501C03E
+:10006000E0E500C0E0E502F582E503F583E504F58F
+:1000700000E505F5012200D0E0F500D0E0F50175BE
+:100080000900750A00750B00E509F502E50AF5039C
+:10009000E50BF504E50BF505E501C0E0E500C0E082
+:1000A000E502F582E503F583E504F500E505F501D4
+:1000B0002200D0E0F500D0E0F501750900750A00D6
+:1000C000750B00E509F502E50AF503E50BF504E516
+:1000D0000BF505E501C0E0E500C0E0E502F582E5CD
+:1000E00003F583E504F500E505F5012200E5067555
+:1000F0008202C39582F506E5077583009583F507AF
+:10010000D0E0F50875E0012506F58275E0003507B9
+:10011000F583E508F0D0E0F50875E0002506F582E6
+:1001200075E0003507F583E508F012000012003B8A
+:100130001200761200B1750000E500F502E500F549
+:1001400003E500F504E500F50575E0002506F582F8
+:1001500075E0003507F583E0F508E508C0E075E0D7
+:10016000012506F58275E0003507F583E0F508E521
+:1001700008C0E075E0022506F50675E0003507F5D4
+:1001800007E502F582E503F583E504F500E505F5ED
+:10019000012200000000000000000000000000003C
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for a bogus warning on comparison between signed and unsigned.
+ This was inspired by code in gcc. This testcase is identical to
+ compare9.c except that we use -fno-short-enums here and expect a
+ warning from case 4. */
+
+/* { dg-do compile } */
+/* { dg-options "-fno-short-enums -Wsign-compare" } */
+
+int tf = 1;
+
+/* This enumeration has an explicit negative value and is therefore signed. */
+enum mm1
+{
+ VOID, SI, DI, MAX = -1
+};
+
+/* This enumeration fits entirely in a signed int, but is unsigned anyway. */
+enum mm2
+{
+ VOID2, SI2, DI2, MAX2
+};
+
+int f(enum mm1 x)
+{
+ return x == (tf?DI:SI); /* { dg-bogus "signed and unsigned" "case 1" } */
+}
+
+int g(enum mm1 x)
+{
+ return x == (tf?DI:-1); /* { dg-bogus "signed and unsigned" "case 2" } */
+}
+
+int h(enum mm2 x)
+{
+ return x == (tf?DI2:SI2); /* { dg-bogus "signed and unsigned" "case 3" } */
+}
+
+int i(enum mm2 x)
+{
+ return x == (tf?DI2:-1); /* { dg-warning "signed and unsigned" "case 4" } */
+}
--- /dev/null
+/* Test for a bogus warning on comparison between signed and unsigned.
+ This was inspired by code in gcc. This testcase is identical to
+ compare9.c except that we use -fno-short-enums here and expect a
+ warning from case 4. */
+
+/* { dg-do compile } */
+/* { dg-options "-fno-short-enums -Wsign-compare" } */
+
+int tf = 1;
+
+/* This enumeration has an explicit negative value and is therefore signed. */
+enum mm1
+{
+ VOID, SI, DI, MAX = -1
+};
+
+/* This enumeration fits entirely in a signed int, but is unsigned anyway. */
+enum mm2
+{
+ VOID2, SI2, DI2, MAX2
+};
+
+int f(enum mm1 x)
+{
+ return x == (tf?DI:SI); /* { dg-bogus "signed and unsigned" "case 1" } */
+}
+
+int g(enum mm1 x)
+{
+ return x == (tf?DI:-1); /* { dg-bogus "signed and unsigned" "case 2" } */
+}
+
+int h(enum mm2 x)
+{
+ return x == (tf?DI2:SI2); /* { dg-bogus "signed and unsigned" "case 3" } */
+}
+
+int i(enum mm2 x)
+{
+ return x == (tf?DI2:-1); /* { dg-warning "signed and unsigned" "case 4" } */
+}
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F518D0E0F519E515F50E54
+:10002000E514F50F900000E582F509900000E583E6
+:10003000F50A750100C3750000E501F5F0E5093525
+:10004000F0F501E500F5F0E50A35F0F500E500F51D
+:1000500002E501F582E502F583E0F50B750101C3C8
+:10006000750000E501F5F0E50935F0F501E500F56D
+:10007000F0E50A35F0F500E500F502E501F582E569
+:1000800002F583E0F50C750102C3750000E501F58A
+:10009000F0E50935F0F501E500F5F0E50A35F0F594
+:1000A00000E500F502E501F582E502F583E0F50DD6
+:1000B000750103C3750000E501F5F0E50935F0F5BC
+:1000C00001E500F5F0E50A35F0F500E500F502E59B
+:1000D00001F582E502F583E0F501750000E50BF519
+:1000E000F0E50045F0F500E50CF5F0E50045F0F52C
+:1000F00000E50DF5F0E50045F0F500E501F5F0E56A
+:100100000045F0F500E5007002800302025E007514
+:100110000001750100750900750A00750B00C3E543
+:1001200000F5F0E51F95F0F500E500F5F0E50B456D
+:10013000F0F50BC3E501F5F0E51E95F0F500E500DF
+:10014000F5F0E50B45F0F50BC3E509F5F0E51D9578
+:10015000F0F500E500F5F0E50B45F0F50BC3E50A19
+:10016000F5F0E51C95F0F500E500F5F0E50B45F040
+:10017000F50B750100750900750A00E50BF50075B2
+:100180000B01C3750C00E500F5F0E50C95F0F50CDE
+:10019000750C00E50CF5F0E50C35F0F50CE50CF50B
+:1001A000F0E50B65F0F50BC3750C00E501F5F0E526
+:1001B0000C95F0F50C750C00E50CF5F0E50C35F040
+:1001C000F50CE50CF5F0E50B65F0F50BC3750C00CF
+:1001D000E509F5F0E50C95F0F50C750C00E50CF56E
+:1001E000F0E50C35F0F50CE50CF5F0E50B65F0F5F8
+:1001F0000BC3750C00E50AF5F0E50C95F0F50C75F0
+:100200000C00E50CF5F0E50C35F0F50CE50CF5F01F
+:10021000E50B65F0F50B750100750900750A00E541
+:100220000BF502E501F503E509F504E50AF505E539
+:100230000EF515E50FF514E519C0E0E518C0E075F9
+:10024000E0042506F50675E0003507F507E502F53B
+:1002500082E503F583E504F500E505F50122007567
+:100260000002750100750900750A0002011B00E516
+:1002700006758204C39582F506E5077583009583AC
+:10028000F507D0E0F518D0E0F519E515F50EE51401
+:10029000F50F900000E582F509900000E583F50A6E
+:1002A000750100C3750000E501F5F0E50935F0F5CD
+:1002B00001E500F5F0E50A35F0F500E500F502E5A9
+:1002C00001F582E502F583E0F50B750101C37500C8
+:1002D00000E501F5F0E50935F0F501E500F5F0E59B
+:1002E0000A35F0F500E500F502E501F582E502F5D5
+:1002F00083E0F50C750102C3750000E501F5F0E53A
+:100300000935F0F501E500F5F0E50A35F0F500E511
+:1003100000F502E501F582E502F583E0F50D7501D2
+:1003200003C3750000E501F5F0E50935F0F501E5D9
+:1003300000F5F0E50A35F0F500E500F502E501F518
+:1003400082E502F583E0F501750000E50BF5F0E5C7
+:100350000045F0F500E50CF5F0E50045F0F500E5A9
+:100360000DF5F0E50045F0F500E501F5F0E5004597
+:10037000F0F500E5007002800302050C0075000135
+:10038000750100750900750A00E500F4F500E50146
+:10039000F4F501E509F4F509E50AF4F50AD3750B5E
+:1003A00000E50BF5F0E50035F0F500E50BF5F0E5BF
+:1003B0000135F0F501E50BF5F0E50935F0F509E556
+:1003C0000BF5F0E50A35F0F50A750B00C3E500F50D
+:1003D000F0E51F95F0F500E500F5F0E50B45F0F5CB
+:1003E0000BC3E501F5F0E51E95F0F500E500F5F02D
+:1003F000E50B45F0F50BC3E509F5F0E51D95F0F5C6
+:1004000000E500F5F0E50B45F0F50BC3E50AF5F066
+:10041000E51C95F0F500E500F5F0E50B45F0F50B72
+:10042000750100750900750A00E50BF500750B01F3
+:10043000C3750C00E500F5F0E50C95F0F50C750CB6
+:1004400000E50CF5F0E50C35F0F50CE50CF5F0E504
+:100450000B65F0F50BC3750C00E501F5F0E50C95A7
+:10046000F0F50C750C00E50CF5F0E50C35F0F50C2D
+:10047000E50CF5F0E50B65F0F50BC3750C00E5092F
+:10048000F5F0E50C95F0F50C750C00E50CF5F0E5D4
+:100490000C35F0F50CE50CF5F0E50B65F0F50BC34C
+:1004A000750C00E50AF5F0E50C95F0F50C750C00FF
+:1004B000E50CF5F0E50C35F0F50CE50CF5F0E50B89
+:1004C00065F0F50B750100750900750A00E50BF57F
+:1004D00002E501F503E509F504E50AF505E50EF584
+:1004E00015E50FF514E519C0E0E518C0E075E00466
+:1004F0002506F50675E0003507F507E502F582E506
+:1005000003F583E504F500E505F501220075000219
+:10051000750100750900750A000203C900E506753A
+:100520008204C39582F506E5077583009583F50778
+:10053000D0E0F518D0E0F519E515F50EE514F50F46
+:10054000900000E582F509900000E583F50A750149
+:1005500000C3750000E501F5F0E50935F0F501E5AA
+:1005600000F5F0E50A35F0F500E500F502E501F5E6
+:1005700082E502F583E0F50B750101C3750000E526
+:1005800001F5F0E50935F0F501E500F5F0E50A358E
+:10059000F0F500E500F502E501F582E502F583E0FE
+:1005A000F50C750102C3750000E501F5F0E50935AC
+:1005B000F0F501E500F5F0E50A35F0F500E500F5A8
+:1005C00002E501F582E502F583E0F50D750103C34F
+:1005D000750000E501F5F0E50935F0F501E500F5F8
+:1005E000F0E50A35F0F500E500F502E501F582E5F4
+:1005F00002F583E0F501750000E50BF5F0E5004537
+:10060000F0F500E50CF5F0E50045F0F500E50DF539
+:10061000F0E50045F0F500E501F5F0E50045F0F501
+:1006200000E5007002800302077A00750001750181
+:1006300000750900750A00750B00C3E500F5F0E5CB
+:100640001F95F0F500E500F5F0E50B45F0F50BC35F
+:10065000E501F5F0E51E95F0F500E500F5F0E50B98
+:1006600045F0F50BC3E509F5F0E51D95F0F500E55E
+:1006700000F5F0E50B45F0F50BC3E50AF5F0E51CD8
+:1006800095F0F500E500F5F0E50B45F0F50B75018B
+:1006900000750900750A00E50BF500750B01C375BF
+:1006A0000C00E500F5F0E50C95F0F50C750C00E597
+:1006B0000CF5F0E50C35F0F50CE50CF5F0E50B6507
+:1006C000F0F50BC3750C00E501F5F0E50C95F0F5C0
+:1006D0000C750C00E50CF5F0E50C35F0F50CE50CAF
+:1006E000F5F0E50B65F0F50BC3750C00E509F5F0C9
+:1006F000E50C95F0F50C750C00E50CF5F0E50C3506
+:10070000F0F50CE50CF5F0E50B65F0F50BC3750C99
+:1007100000E50AF5F0E50C95F0F50C750C00E50C1C
+:10072000F5F0E50C35F0F50CE50CF5F0E50B65F0B2
+:10073000F50B750100750900750A00E50BF502E57A
+:1007400001F503E509F504E50AF505E50EF515E5FE
+:100750000FF514E519C0E0E518C0E075E0042506C2
+:10076000F50675E0003507F507E502F582E503F5C6
+:1007700083E504F500E505F5012200750002750129
+:1007800000750900750A0002063700E50675820447
+:10079000C39582F506E5077583009583F507D0E0DC
+:1007A000F518D0E0F519E515F50EE514F50F9000F4
+:1007B00000E582F509900000E583F50A750100C3A4
+:1007C000750000E501F5F0E50935F0F501E500F506
+:1007D000F0E50A35F0F500E500F502E501F582E502
+:1007E00002F583E0F50B750101C3750000E501F525
+:1007F000F0E50935F0F501E500F5F0E50A35F0F52D
+:1008000000E500F502E501F582E502F583E0F50C6F
+:10081000750102C3750000E501F5F0E50935F0F555
+:1008200001E500F5F0E50A35F0F500E500F502E533
+:1008300001F582E502F583E0F50D750103C375004E
+:1008400000E501F5F0E50935F0F501E500F5F0E525
+:100850000A35F0F500E500F502E501F582E502F55F
+:1008600083E0F501750000E50BF5F0E50045F0F5D6
+:1008700000E50CF5F0E50045F0F500E50DF5F0E5D7
+:100880000045F0F500E501F5F0E50045F0F500E57F
+:100890000070028003020A280075000175010075CE
+:1008A0000900750A00E500F4F500E501F4F501E53D
+:1008B00009F4F509E50AF4F50AD3750B00E50BF523
+:1008C000F0E50035F0F500E50BF5F0E50135F0F564
+:1008D00001E50BF5F0E50935F0F509E50BF5F0E577
+:1008E0000A35F0F50A750B00C3E500F5F0E51F9534
+:1008F000F0F500E500F5F0E50B45F0F50BC3E5017B
+:10090000F5F0E51E95F0F500E500F5F0E50B45F096
+:10091000F50BC3E509F5F0E51D95F0F500E500F5EB
+:10092000F0E50B45F0F50BC3E50AF5F0E51C95F095
+:10093000F500E500F5F0E50B45F0F50B75010075E8
+:100940000900750A00E50BF500750B01C3750C0075
+:10095000E500F5F0E50C95F0F50C750C00E50CF5EF
+:10096000F0E50C35F0F50CE50CF5F0E50B65F0F570
+:100970000BC3750C00E501F5F0E50C95F0F50C7571
+:100980000C00E50CF5F0E50C35F0F50CE50CF5F098
+:10099000E50B65F0F50BC3750C00E509F5F0E50C0A
+:1009A00095F0F50C750C00E50CF5F0E50C35F0F55F
+:1009B0000CE50CF5F0E50B65F0F50BC3750C00E5E7
+:1009C0000AF5F0E50C95F0F50C750C00E50CF5F06A
+:1009D000E50C35F0F50CE50CF5F0E50B65F0F50BE5
+:1009E000750100750900750A00E50BF502E501F5D2
+:1009F00003E509F504E50AF505E50EF515E50FF53E
+:100A000014E519C0E0E518C0E075E0042506F50618
+:100A100075E0003507F507E502F582E503F583E5A6
+:100A200004F500E505F50122007500027501007569
+:100A30000900750A000208E500000000000000003F
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for a bogus warning on comparison between signed and unsigned.
+ This was inspired by code in gcc. */
+
+/* { dg-do compile } */
+/* { dg-options "-Wsign-compare" } */
+
+int tf = 1;
+
+void f(int x, unsigned int y)
+{
+ /* Test comparing conditional expressions containing truth values.
+ This can occur explicitly, or e.g. when (foo?2:(bar?1:0)) is
+ optimized into (foo?2:(bar!=0)). */
+ x > (tf?64:(tf!=x)); /* { dg-bogus "signed and unsigned" "case 1" } */
+ y > (tf?64:(tf!=x)); /* { dg-bogus "signed and unsigned" "case 2" } */
+ x > (tf?(tf!=x):64); /* { dg-bogus "signed and unsigned" "case 3" } */
+ y > (tf?(tf!=x):64); /* { dg-bogus "signed and unsigned" "case 4" } */
+
+ x > (tf?64:(tf==x)); /* { dg-bogus "signed and unsigned" "case 5" } */
+ y > (tf?64:(tf==x)); /* { dg-bogus "signed and unsigned" "case 6" } */
+ x > (tf?(tf==x):64); /* { dg-bogus "signed and unsigned" "case 7" } */
+ y > (tf?(tf==x):64); /* { dg-bogus "signed and unsigned" "case 8" } */
+
+ x > (tf?64:(tf>x)); /* { dg-bogus "signed and unsigned" "case 9" } */
+ y > (tf?64:(tf>x)); /* { dg-bogus "signed and unsigned" "case 10" } */
+ x > (tf?(tf>x):64); /* { dg-bogus "signed and unsigned" "case 11" } */
+ y > (tf?(tf>x):64); /* { dg-bogus "signed and unsigned" "case 12" } */
+
+ x < (tf?64:(tf<x)); /* { dg-bogus "signed and unsigned" "case 13" } */
+ y < (tf?64:(tf<x)); /* { dg-bogus "signed and unsigned" "case 14" } */
+ x < (tf?(tf<x):64); /* { dg-bogus "signed and unsigned" "case 15" } */
+ y < (tf?(tf<x):64); /* { dg-bogus "signed and unsigned" "case 16" } */
+
+ x > (tf?64:(tf>=x)); /* { dg-bogus "signed and unsigned" "case 17" } */
+ y > (tf?64:(tf>=x)); /* { dg-bogus "signed and unsigned" "case 18" } */
+ x > (tf?(tf>=x):64); /* { dg-bogus "signed and unsigned" "case 19" } */
+ y > (tf?(tf>=x):64); /* { dg-bogus "signed and unsigned" "case 20" } */
+
+ x > (tf?64:(tf<=x)); /* { dg-bogus "signed and unsigned" "case 21" } */
+ y > (tf?64:(tf<=x)); /* { dg-bogus "signed and unsigned" "case 22" } */
+ x > (tf?(tf<=x):64); /* { dg-bogus "signed and unsigned" "case 23" } */
+ y > (tf?(tf<=x):64); /* { dg-bogus "signed and unsigned" "case 24" } */
+
+ x > (tf?64:(tf&&x)); /* { dg-bogus "signed and unsigned" "case 25" } */
+ y > (tf?64:(tf&&x)); /* { dg-bogus "signed and unsigned" "case 26" } */
+ x > (tf?(tf&&x):64); /* { dg-bogus "signed and unsigned" "case 27" } */
+ y > (tf?(tf&&x):64); /* { dg-bogus "signed and unsigned" "case 28" } */
+
+ x > (tf?64:(tf||x)); /* { dg-bogus "signed and unsigned" "case 29" } */
+ y > (tf?64:(tf||x)); /* { dg-bogus "signed and unsigned" "case 30" } */
+ x > (tf?(tf||x):64); /* { dg-bogus "signed and unsigned" "case 31" } */
+ y > (tf?(tf||x):64); /* { dg-bogus "signed and unsigned" "case 32" } */
+
+ x > (tf?64:(!tf)); /* { dg-bogus "signed and unsigned" "case 33" } */
+ y > (tf?64:(!tf)); /* { dg-bogus "signed and unsigned" "case 34" } */
+ x > (tf?(!tf):64); /* { dg-bogus "signed and unsigned" "case 35" } */
+ y > (tf?(!tf):64); /* { dg-bogus "signed and unsigned" "case 36" } */
+
+}
--- /dev/null
+/* Test for a bogus warning on comparison between signed and unsigned.
+ This was inspired by code in gcc. */
+
+/* { dg-do compile } */
+/* { dg-options "-Wsign-compare" } */
+
+int tf = 1;
+
+void f(int x, unsigned int y)
+{
+ /* Test comparing conditional expressions containing truth values.
+ This can occur explicitly, or e.g. when (foo?2:(bar?1:0)) is
+ optimized into (foo?2:(bar!=0)). */
+ x > (tf?64:(tf!=x)); /* { dg-bogus "signed and unsigned" "case 1" } */
+ y > (tf?64:(tf!=x)); /* { dg-bogus "signed and unsigned" "case 2" } */
+ x > (tf?(tf!=x):64); /* { dg-bogus "signed and unsigned" "case 3" } */
+ y > (tf?(tf!=x):64); /* { dg-bogus "signed and unsigned" "case 4" } */
+
+ x > (tf?64:(tf==x)); /* { dg-bogus "signed and unsigned" "case 5" } */
+ y > (tf?64:(tf==x)); /* { dg-bogus "signed and unsigned" "case 6" } */
+ x > (tf?(tf==x):64); /* { dg-bogus "signed and unsigned" "case 7" } */
+ y > (tf?(tf==x):64); /* { dg-bogus "signed and unsigned" "case 8" } */
+
+ x > (tf?64:(tf>x)); /* { dg-bogus "signed and unsigned" "case 9" } */
+ y > (tf?64:(tf>x)); /* { dg-bogus "signed and unsigned" "case 10" } */
+ x > (tf?(tf>x):64); /* { dg-bogus "signed and unsigned" "case 11" } */
+ y > (tf?(tf>x):64); /* { dg-bogus "signed and unsigned" "case 12" } */
+
+ x < (tf?64:(tf<x)); /* { dg-bogus "signed and unsigned" "case 13" } */
+ y < (tf?64:(tf<x)); /* { dg-bogus "signed and unsigned" "case 14" } */
+ x < (tf?(tf<x):64); /* { dg-bogus "signed and unsigned" "case 15" } */
+ y < (tf?(tf<x):64); /* { dg-bogus "signed and unsigned" "case 16" } */
+
+ x > (tf?64:(tf>=x)); /* { dg-bogus "signed and unsigned" "case 17" } */
+ y > (tf?64:(tf>=x)); /* { dg-bogus "signed and unsigned" "case 18" } */
+ x > (tf?(tf>=x):64); /* { dg-bogus "signed and unsigned" "case 19" } */
+ y > (tf?(tf>=x):64); /* { dg-bogus "signed and unsigned" "case 20" } */
+
+ x > (tf?64:(tf<=x)); /* { dg-bogus "signed and unsigned" "case 21" } */
+ y > (tf?64:(tf<=x)); /* { dg-bogus "signed and unsigned" "case 22" } */
+ x > (tf?(tf<=x):64); /* { dg-bogus "signed and unsigned" "case 23" } */
+ y > (tf?(tf<=x):64); /* { dg-bogus "signed and unsigned" "case 24" } */
+
+ x > (tf?64:(tf&&x)); /* { dg-bogus "signed and unsigned" "case 25" } */
+ y > (tf?64:(tf&&x)); /* { dg-bogus "signed and unsigned" "case 26" } */
+ x > (tf?(tf&&x):64); /* { dg-bogus "signed and unsigned" "case 27" } */
+ y > (tf?(tf&&x):64); /* { dg-bogus "signed and unsigned" "case 28" } */
+
+ x > (tf?64:(tf||x)); /* { dg-bogus "signed and unsigned" "case 29" } */
+ y > (tf?64:(tf||x)); /* { dg-bogus "signed and unsigned" "case 30" } */
+ x > (tf?(tf||x):64); /* { dg-bogus "signed and unsigned" "case 31" } */
+ y > (tf?(tf||x):64); /* { dg-bogus "signed and unsigned" "case 32" } */
+
+ x > (tf?64:(!tf)); /* { dg-bogus "signed and unsigned" "case 33" } */
+ y > (tf?64:(!tf)); /* { dg-bogus "signed and unsigned" "case 34" } */
+ x > (tf?(!tf):64); /* { dg-bogus "signed and unsigned" "case 35" } */
+ y > (tf?(!tf):64); /* { dg-bogus "signed and unsigned" "case 36" } */
+
+}
--- /dev/null
+:1000000000E506758208C39582F506E5077583004D
+:100010009583F507D0E0F500D0E0F501750900E51E
+:1000200009F502E509F503E509F504E509F505E536
+:1000300001C0E0E500C0E075E0082506F50675E0C2
+:10004000003507F507E502F582E503F583E504F5DC
+:1000500000E505F50122000000000000000000009E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for a bogus warning on comparison between signed and unsigned.
+ Origin: Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 8/21/2001. */
+
+/* { dg-do compile } */
+/* { dg-options "-Wsign-compare" } */
+
+extern void bar(void);
+
+int foo(int x, int y, unsigned u)
+{
+ /* A *_DIV_EXPR is non-negative if both operands are. */
+
+ if (u < ((x=-22)/33)) /* { dg-warning "signed and unsigned" "DIV_EXPR" } */
+ return x;
+
+ if (u < ((x=22)/33))
+ return x;
+
+ if (u < ((x=22)/(y=33)))
+ return x;
+
+ if (u < (((x&0x10000)?128:64) / ((y&0x10000)?8:4)))
+ return x;
+
+
+ /* A *_MOD_EXPR is non-negative if the first operand is. */
+
+ if (u < ((x=-22)%33)) /* { dg-warning "signed and unsigned" "MOD_EXPR" } */
+ return x;
+
+ if (u < ((x=22)%-33))
+ return x;
+
+ if (u < ((x==y)%-33))
+ return x;
+
+ if (u < (((x=22)/33)%-33))
+ return x;
+
+ return 0;
+}
--- /dev/null
+/* Test for a bogus warning on comparison between signed and unsigned.
+ Origin: Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 8/21/2001. */
+
+/* { dg-do compile } */
+/* { dg-options "-Wsign-compare" } */
+
+extern void bar(void);
+
+int foo(int x, int y, unsigned u)
+{
+ /* A *_DIV_EXPR is non-negative if both operands are. */
+
+ if (u < ((x=-22)/33)) /* { dg-warning "signed and unsigned" "DIV_EXPR" } */
+ return x;
+
+ if (u < ((x=22)/33))
+ return x;
+
+ if (u < ((x=22)/(y=33)))
+ return x;
+
+ if (u < (((x&0x10000)?128:64) / ((y&0x10000)?8:4)))
+ return x;
+
+
+ /* A *_MOD_EXPR is non-negative if the first operand is. */
+
+ if (u < ((x=-22)%33)) /* { dg-warning "signed and unsigned" "MOD_EXPR" } */
+ return x;
+
+ if (u < ((x=22)%-33))
+ return x;
+
+ if (u < ((x==y)%-33))
+ return x;
+
+ if (u < (((x=22)/33)%-33))
+ return x;
+
+ return 0;
+}
--- /dev/null
+:1000000000E506758212C39582F506E50775830043
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F075E0E3
+:10004000092506F58275E0003507F583E517F0759B
+:10005000E0082506F58275E0003507F583E516F022
+:1000600075E0072506F58275E0003507F583E5158F
+:10007000F075E0062506F58275E0003507F583E5A5
+:1000800014F075E0052506F58275E0003507F58367
+:10009000E513F075E0042506F58275E0003507F5F7
+:1000A00083E512F075E0032506F58275E00035075B
+:1000B000F583E511F075E0022506F58275E000355F
+:1000C00007F583E510F0E51FF500E51EF501E51DD8
+:1000D000F509E51CF50AE51AF515E519F513750F8F
+:1000E00000751000751100751200E500F516E501A8
+:1000F000F514E509F50DE50AF50E750C0075170008
+:10010000751900751A00750B00750A01750001C399
+:10011000E518F5F0E50E95F0F509E50BF5F0E50BC2
+:1001200035F0F509E509F5F0E50055F0F500E500D5
+:10013000F5F0E50C45F0F50C750001C3E518F5F098
+:10014000E50E95F0F509E50BF5F0E50B35F0F50951
+:10015000E50EF5F0E51895F0F501E50BF5F0E50B8A
+:1001600035F0F501E501F5F0E50945F0F509E50A99
+:10017000F5F0E50965F0F509E509F5F0E50055F05C
+:10018000F500C3E513F5F0E50D95F0F509E50BF580
+:10019000F0E50B35F0F509E509F5F0E50055F0F56A
+:1001A00000E500F5F0E50C45F0F50C750001C3E540
+:1001B00018F5F0E50E95F0F509E50BF5F0E50B35D2
+:1001C000F0F509E50EF5F0E51895F0F501E50BF50C
+:1001D000F0E50B35F0F501E501F5F0E50945F0F541
+:1001E00009E50AF5F0E50965F0F509E509F5F0E539
+:1001F0000055F0F500C3E513F5F0E50D95F0F509B0
+:10020000E50BF5F0E50B35F0F509E50DF5F0E51337
+:1002100095F0F501E50BF5F0E50B35F0F501E5019D
+:10022000F5F0E50945F0F509E50AF5F0E50965F0B1
+:10023000F509E509F5F0E50055F0F500C3E515F51C
+:10024000F0E51495F0F509E50BF5F0E50B35F0F563
+:1002500009E509F5F0E50055F0F500E500F5F0E5F4
+:100260000C45F0F50C750001C3E518F5F0E50E95A9
+:10027000F0F509E50BF5F0E50B35F0F509E50EF5C0
+:10028000F0E51895F0F501E50BF5F0E50B35F0F527
+:1002900001E501F5F0E50945F0F509E50AF5F0E5B8
+:1002A0000965F0F509E509F5F0E50055F0F500C33D
+:1002B000E513F5F0E50D95F0F509E50BF5F0E50B27
+:1002C00035F0F509E50DF5F0E51395F0F501E50BD1
+:1002D000F5F0E50B35F0F501E501F5F0E50945F040
+:1002E000F509E50AF5F0E50965F0F509E509F5F028
+:1002F000E50055F0F500C3E515F5F0E51495F0F5CA
+:1003000009E50BF5F0E50B35F0F509E514F5F0E539
+:100310001595F0F501E50BF5F0E50B35F0F501E588
+:1003200001F5F0E50945F0F509E50AF5F0E509659F
+:10033000F0F509E509F5F0E50055F0F500C3E51B1A
+:10034000F5F0E51695F0F509E50BF5F0E50B35F060
+:10035000F509E509F5F0E50055F0F500E500F5F0E3
+:10036000E50C45F0F50CE517F500E519F501E51A82
+:10037000F509E50CF50B750C01C3750A00E50BF5E5
+:10038000F0E50A95F0F50A750A00E50AF5F0E50AC8
+:1003900035F0F50AE50AF5F0E50C65F0F50CC375E6
+:1003A0000A00E500F5F0E50A95F0F50A750A00E5A2
+:1003B0000AF5F0E50A35F0F50AE50AF5F0E50C6511
+:1003C000F0F50CC3750A00E501F5F0E50A95F0F5C6
+:1003D0000A750A00E50AF5F0E50A35F0F50AE50ABE
+:1003E000F5F0E50C65F0F50CC3750A00E509F5F0CC
+:1003F000E50A95F0F50A750A00E50AF5F0E50A3513
+:10040000F0F50AE50AF5F0E50C65F0F50C7500006D
+:10041000750100750900E500F50BE501F50A7501A8
+:1004200001C3750000E50CF5F0E50095F0F50075E9
+:100430000000E500F5F0E50035F0F500E500F5F029
+:10044000E50165F0F501C3750000E50BF5F0E50089
+:1004500095F0F500750000E500F5F0E50035F0F5E4
+:1004600000E500F5F0E50165F0F501C3750000E574
+:100470000AF5F0E50095F0F500750000E500F5F0EF
+:10048000E50035F0F500E500F5F0E50165F0F50172
+:10049000C3750000E509F5F0E50095F0F50075007D
+:1004A00000E500F5F0E50035F0F500E500F5F0E5D4
+:1004B0000165F0F501750900750A00750B007500FE
+:1004C00000E501F5F0E50045F0F500E509F5F0E59A
+:1004D0000045F0F500E50AF5F0E50045F0F500E52A
+:1004E0000BF5F0E50045F0F500E500700280030231
+:1004F000055700750001750100750900750A00C3F4
+:10050000750B00E500F5F0E50F35F0F50FE501F5A9
+:10051000F0E51035F0F510E509F5F0E51135F0F5E9
+:1005200011E50AF5F0E51235F0F512C3E51BF5F01B
+:10053000E51695F0F516E515F5F0E51495F0F514CA
+:10054000E513F5F0E50D95F0F50DE518F5F0E50E80
+:1005500095F0F50E0200FA00E50FF502E510F5033F
+:10056000E511F504E512F50575E0092506F5827536
+:10057000E0003507F583E0F51775E0082506F582FC
+:1005800075E0003507F583E0F51675E0072506F5FB
+:100590008275E0003507F583E0F51575E006250660
+:1005A000F58275E0003507F583E0F51475E0052563
+:1005B00006F58275E0003507F583E0F51375E00474
+:1005C0002506F58275E0003507F583E0F51275E044
+:1005D000032506F58275E0003507F583E0F5117512
+:1005E000E0022506F58275E0003507F583E0F51099
+:1005F00075E0002506F58275E0003507F583E0F526
+:1006000008E508C0E075E0012506F58275E00035D3
+:1006100007F583E0F508E508C0E075E0122506F56A
+:100620000675E0003507F507E502F582E503F58379
+:10063000E504F500E505F5012200E506758217C31E
+:100640009582F506E5077583009583F507D0E0F5FB
+:100650000875E0062506F58275E0003507F583E5A7
+:1006600008F0D0E0F50875E0052506F58275E00094
+:100670003507F583E508F075E00E2506F58275E08F
+:10068000003507F583E517F075E00D2506F5827551
+:10069000E0003507F583E516F075E00C2506F582D8
+:1006A00075E0003507F583E515F075E00B2506F5D7
+:1006B0008275E0003507F583E514F075E00A25063C
+:1006C000F58275E0003507F583E513F075E009253F
+:1006D00006F58275E0003507F583E512F075E00850
+:1006E0002506F58275E0003507F583E511F075E024
+:1006F000072506F58275E0003507F583E510F0E57E
+:100700001FF511E51BF512E51AF513E519F514753A
+:10071000E0042506F58275E0003507F583E511F064
+:1007200075E0032506F58275E0003507F583E51EC3
+:10073000F075E0022506F58275E0003507F583E5E2
+:100740001DF075E0012506F58275E0003507F5839B
+:10075000E51CF07515017516007517007508007514
+:10076000E0002506F58275E0003507F583E508F021
+:10077000751900750D00750E00750F00E51CF5105C
+:10078000750080E500F5F0E51025F0F510E500F5C1
+:10079000F0E50F25F0F50F750C00751A00751B00BC
+:1007A000751F00750B00750A01750001C3E50FF593
+:1007B000F0E51095F0F509E50BF5F0E50B35F0F5F2
+:1007C00009E509F5F0E50055F0F500E500F5F0E57F
+:1007D0000C45F0F50C750001C3E50FF5F0E510953B
+:1007E000F0F509E50BF5F0E50B35F0F509E510F549
+:1007F000F0E50F95F0F501E50BF5F0E50B35F0F5BB
+:1008000001E501F5F0E50945F0F509E50AF5F0E542
+:100810000965F0F509E509F5F0E50055F0F500C3C7
+:10082000E50EF5F0E51D95F0F509E50BF5F0E50BA6
+:1008300035F0F509E509F5F0E50055F0F500E500BE
+:10084000F5F0E50C45F0F50C750001C3E50FF5F08A
+:10085000E51095F0F509E50BF5F0E50B35F0F50938
+:10086000E510F5F0E50F95F0F501E50BF5F0E50B7A
+:1008700035F0F501E501F5F0E50945F0F509E50A82
+:10088000F5F0E50965F0F509E509F5F0E50055F045
+:10089000F500C3E50EF5F0E51D95F0F509E50BF55E
+:1008A000F0E50B35F0F509E51DF5F0E50E95F0F5F1
+:1008B00001E50BF5F0E50B35F0F501E501F5F0E5A7
+:1008C0000945F0F509E50AF5F0E50965F0F509E5F2
+:1008D00009F5F0E50055F0F500C3E50DF5F0E51E6E
+:1008E00095F0F509E50BF5F0E50B35F0F509E509AF
+:1008F000F5F0E50055F0F500E500F5F0E50C45F004
+:10090000F50C750001C3E50FF5F0E51095F0F5095C
+:10091000E50BF5F0E50B35F0F509E510F5F0E50F21
+:1009200095F0F501E50BF5F0E50B35F0F501E50186
+:10093000F5F0E50945F0F509E50AF5F0E50965F09A
+:10094000F509E509F5F0E50055F0F500C3E50EF50C
+:10095000F0E51D95F0F509E50BF5F0E50B35F0F543
+:1009600009E51DF5F0E50E95F0F501E50BF5F0E56F
+:100970000B35F0F501E501F5F0E50945F0F509E580
+:100980000AF5F0E50965F0F509E509F5F0E500552A
+:10099000F0F500C3E50DF5F0E51E95F0F509E50B62
+:1009A000F5F0E50B35F0F509E51EF5F0E50D95F0F0
+:1009B000F501E50BF5F0E50B35F0F501E501F5F096
+:1009C000E50945F0F509E50AF5F0E50965F0F509F1
+:1009D000E509F5F0E50055F0F500C3E519F5F0E59A
+:1009E0001195F0F509E50BF5F0E50B35F0F509E5A6
+:1009F00009F5F0E50055F0F500E500F5F0E50C45EA
+:100A0000F0F50CE51AF501E51BF509E51FF50A758A
+:100A10000000E50CF5F0E50045F0F500E501F5F026
+:100A2000E50045F0F500E509F5F0E50045F0F500D5
+:100A3000E50AF5F0E50045F0F500E50070028003F9
+:100A400002116B00751900750D00750E00750F0011
+:100A5000E512F51BE513F51AE514F510E518F51187
+:100A6000750080E500F5F0E51125F0F511E500F5DC
+:100A7000F0E50F25F0F50F750C00751C00751D00D5
+:100A8000751E00750B00750A01750001C3E50FF5B1
+:100A9000F0E51195F0F509E50BF5F0E50B35F0F50E
+:100AA00009E509F5F0E50055F0F500E500F5F0E59C
+:100AB0000C45F0F50C750001C3E50FF5F0E5119557
+:100AC000F0F509E50BF5F0E50B35F0F509E511F565
+:100AD000F0E50F95F0F501E50BF5F0E50B35F0F5D8
+:100AE00001E501F5F0E50945F0F509E50AF5F0E560
+:100AF0000965F0F509E509F5F0E50055F0F500C3E5
+:100B0000E50EF5F0E51095F0F509E50BF5F0E50BD0
+:100B100035F0F509E509F5F0E50055F0F500E500DB
+:100B2000F5F0E50C45F0F50C750001C3E50FF5F0A7
+:100B3000E51195F0F509E50BF5F0E50B35F0F50954
+:100B4000E511F5F0E50F95F0F501E50BF5F0E50B96
+:100B500035F0F501E501F5F0E50945F0F509E50A9F
+:100B6000F5F0E50965F0F509E509F5F0E50055F062
+:100B7000F500C3E50EF5F0E51095F0F509E50BF588
+:100B8000F0E50B35F0F509E510F5F0E50E95F0F51B
+:100B900001E50BF5F0E50B35F0F501E501F5F0E5C4
+:100BA0000945F0F509E50AF5F0E50965F0F509E50F
+:100BB00009F5F0E50055F0F500C3E50DF5F0E51A8F
+:100BC00095F0F509E50BF5F0E50B35F0F509E509CC
+:100BD000F5F0E50055F0F500E500F5F0E50C45F021
+:100BE000F50C750001C3E50FF5F0E51195F0F50979
+:100BF000E50BF5F0E50B35F0F509E511F5F0E50F3E
+:100C000095F0F501E50BF5F0E50B35F0F501E501A3
+:100C1000F5F0E50945F0F509E50AF5F0E50965F0B7
+:100C2000F509E509F5F0E50055F0F500C3E50EF529
+:100C3000F0E51095F0F509E50BF5F0E50B35F0F56D
+:100C400009E510F5F0E50E95F0F501E50BF5F0E599
+:100C50000B35F0F501E501F5F0E50945F0F509E59D
+:100C60000AF5F0E50965F0F509E509F5F0E5005547
+:100C7000F0F500C3E50DF5F0E51A95F0F509E50B83
+:100C8000F5F0E50B35F0F509E51AF5F0E50D95F011
+:100C9000F501E50BF5F0E50B35F0F501E501F5F0B3
+:100CA000E50945F0F509E50AF5F0E50965F0F5090E
+:100CB000E509F5F0E50055F0F500C3E519F5F0E5B7
+:100CC0001B95F0F509E50BF5F0E50B35F0F509E5B9
+:100CD00009F5F0E50055F0F500E500F5F0E50C4507
+:100CE000F0F50CE51CF501E51DF509E51EF50A75A5
+:100CF0000000E50CF5F0E50045F0F500E501F5F044
+:100D0000E50045F0F500E509F5F0E50045F0F500F2
+:100D1000E50AF5F0E50045F0F500E5007002800316
+:100D20000210A30075E0042506F58275E000350782
+:100D3000F583E0F51F75E0032506F58275E00035C3
+:100D400007F583E0F51E75E0022506F58275E000E3
+:100D50003507F583E0F51D75E0012506F58275E0A0
+:100D6000003507F583E0F51CE512F51BE513F51AD0
+:100D7000E514F519120000E582F502E583F503E5B7
+:100D800000F504E501F505E502F511E503F512E5C9
+:100D900004F513E505F514E515F500E516F515E57B
+:100DA00017F51675E0002506F58275E0003507F5A4
+:100DB00083E0F517750D00750E00750F00751000B6
+:100DC000C3750100E500F5F0E511A4F50CE500F5AB
+:100DD000F0E511A4E5F0F509E50CF5F0E50135F0D5
+:100DE000F501E515F5F0E511A4F50CE515F5F0E5CF
+:100DF00011A4E5F0F50AE50CF5F0E50935F0F50983
+:100E0000E516F5F0E511A4F50CE516F5F0E511A4ED
+:100E1000E5F0F50BE50CF5F0E50A35F0F50AE51718
+:100E2000F5F0E511A4F50CE517F5F0E511A4E5F0F2
+:100E3000F511E50CF5F0E50B35F0F50BC3C3750CBA
+:100E400000E501F5F0E50D35F0F50DE509F5F0E506
+:100E50000E35F0F50EE50AF5F0E50F35F0F50FE586
+:100E60000BF5F0E51035F0F510C3750900E500F558
+:100E7000F0E512A4F50CE500F5F0E512A4E5F0F5B7
+:100E80000AE50CF5F0E50935F0F509E515F5F0E5AD
+:100E900012A4F50CE515F5F0E512A4E5F0F50BE567
+:100EA0000CF5F0E50A35F0F50AE516F5F0E512A4C3
+:100EB000F50CE516F5F0E512A4E5F0F511E50CF5F5
+:100EC000F0E50B35F0F50B750100C3C3750C00E5BB
+:100ED00001F5F0E50D35F0F50DE509F5F0E50E3518
+:100EE000F0F50EE50AF5F0E50F35F0F50FE50BF539
+:100EF000F0E51035F0F510C3750A00E500F5F0E5F2
+:100F000013A4F50CE500F5F0E513A4E5F0F50BE509
+:100F10000CF5F0E50A35F0F50AE515F5F0E513A452
+:100F2000F50CE515F5F0E513A4E5F0F511E50CF584
+:100F3000F0E50B35F0F50B750100750900C3C375BD
+:100F40000C00E501F5F0E50D35F0F50DE509F5F0DE
+:100F5000E50E35F0F50EE50AF5F0E50F35F0F50F85
+:100F6000E50BF5F0E51035F0F510C3750B00E50065
+:100F7000F5F0E514A4F50CE500F5F0E514A4E5F0B2
+:100F8000F511E50CF5F0E50B35F0F50B7501007585
+:100F90000900750A00C3C3750000E501F5F0E50D11
+:100FA00035F0F50DE509F5F0E50E35F0F50EE50A3D
+:100FB000F5F0E50F35F0F50FE50BF5F0E51035F040
+:100FC000F510E50DF502E50EF503E50FF504E51066
+:100FD000F50575E00E2506F58275E0003507F58309
+:100FE000E0F51775E00D2506F58275E0003507F58B
+:100FF00083E0F51675E00C2506F58275E0003507EF
+:10100000F583E0F51575E00B2506F58275E00035F2
+:1010100007F583E0F51475E00A2506F58275E00012
+:101020003507F583E0F51375E0092506F58275E0CF
+:10103000003507F583E0F51275E0082506F58275A1
+:10104000E0003507F583E0F51175E0072506F58228
+:1010500075E0003507F583E0F51075E0052506F528
+:101060008275E0003507F583E0F508E508C0E07516
+:10107000E0062506F58275E0003507F583E0F50802
+:10108000E508C0E075E0172506F50675E0003507B0
+:10109000F507E502F582E503F583E504F500E505CE
+:1010A000F5012200E512F4F512E513F4F513E51449
+:1010B000F4F514E518F4F518D3750000E500F5F023
+:1010C000E51235F0F512E500F5F0E51335F0F5130E
+:1010D000E500F5F0E51435F0F514E500F5F0E51858
+:1010E00035F0F518E515F4F515E516F4F516E517E0
+:1010F000F4F51775E0002506F58275E0003507F573
+:1011000083E0F508E508F4F50875E0002506F582AA
+:1011100075E0003507F583E508F0D3750000E500BC
+:10112000F5F0E51535F0F515E500F5F0E51635F0C7
+:10113000F516E500F5F0E51735F0F517E500F5F0E3
+:1011400075E0002506F58275E0003507F583E0F5CA
+:1011500008E50835F0F50875E0002506F58275E02C
+:10116000003507F583E508F0020D2400E511F4F5DC
+:1011700000E51EF4F501E51DF4F509E51CF4F50B99
+:10118000D3750A00E50AF5F0E50035F0F500E50A4B
+:10119000F5F0E50135F0F501E50AF5F0E50935F082
+:1011A000F509E50AF5F0E50B35F0F50B75E00425DA
+:1011B00006F58275E0003507F583E500F075E0037C
+:1011C0002506F58275E0003507F583E501F075E049
+:1011D000022506F58275E0003507F583E509F0750F
+:1011E000E0012506F58275E0003507F583E50BF093
+:1011F000E515F4F515E516F4F516E517F4F517758C
+:10120000E0002506F58275E0003507F583E0F50876
+:10121000E508F4F50875E0002506F58275E000356F
+:1012200007F583E508F0D3750000E500F5F0E51556
+:1012300035F0F515E500F5F0E51635F0F516E500A5
+:10124000F5F0E51735F0F517E500F5F075E0002548
+:1012500006F58275E0003507F583E0F508E5083509
+:10126000F0F50875E0002506F58275E0003507F514
+:1012700083E508F0020A4400E506758216C39582EC
+:10128000F506E5077583009583F507D0E0F5087549
+:10129000E0052506F58275E0003507F583E508F0E1
+:1012A000D0E0F50875E0042506F58275E000350705
+:1012B000F583E508F075E00D2506F58275E000354B
+:1012C00007F583E517F075E00C2506F58275E0005B
+:1012D0003507F583E516F075E00B2506F58275E018
+:1012E000003507F583E515F075E00A2506F58275EA
+:1012F000E0003507F583E514F075E0092506F58271
+:1013000075E0003507F583E513F075E0082506F56F
+:101310008275E0003507F583E512F075E0072506D4
+:10132000F58275E0003507F583E511F075E00625D7
+:1013300006F58275E0003507F583E510F075E003EA
+:101340002506F58275E0003507F583E51FF075E0A9
+:10135000022506F58275E0003507F583E51EF07578
+:10136000E0012506F58275E0003507F583E51DF0FF
+:1013700075E0002506F58275E0003507F583E51C6C
+:10138000F0E51BF514E51AF515E519F516E518F560
+:101390001775E0032506F58275E0003507F583E053
+:1013A000F51F75E0022506F58275E0003507F58327
+:1013B000E0F51E75E0012506F58275E0003507F5BC
+:1013C00083E0F51D75E0002506F58275E000350720
+:1013D000F583E0F51CE514F51BE515F51AE516F5A2
+:1013E00019E517F518120639E582F502E583F503CC
+:1013F000E500F504E501F505E502F500E503F50175
+:10140000E504F509E505F50A75100075110075127A
+:1014100000751300C3750B00E500F5F0E514A4F5A5
+:101420000FE500F5F0E514A4E5F0F50CE50FF5F097
+:10143000E50B35F0F50BE501F5F0E514A4F50FE546
+:1014400001F5F0E514A4E5F0F50DE50FF5F0E50C78
+:1014500035F0F50CE509F5F0E514A4F50FE509F50F
+:10146000F0E514A4E5F0F50EE50FF5F0E50D35F027
+:10147000F50DE50AF5F0E514A4F50FE50AF5F0E53C
+:1014800014A4E5F0F50AE50FF5F0E50E35F0F50EDC
+:10149000C3C3750A00E50BF5F0E51035F0F510E56E
+:1014A0000CF5F0E51135F0F511E50DF5F0E5123527
+:1014B000F0F512E50EF5F0E51335F0F513C3750CF4
+:1014C00000E500F5F0E515A4F50FE500F5F0E515EC
+:1014D000A4E5F0F50DE50FF5F0E50C35F0F50CE5BC
+:1014E00001F5F0E515A4F50FE501F5F0E515A4E526
+:1014F000F0F50EE50FF5F0E50D35F0F50DE509F524
+:10150000F0E515A4F50FE509F5F0E515A4E5F0F50E
+:101510000AE50FF5F0E50E35F0F50E750B00C3C3C7
+:10152000750900E50BF5F0E51035F0F510E50CF563
+:10153000F0E51135F0F511E50DF5F0E51235F0F5B2
+:1015400012E50EF5F0E51335F0F513C3750D00E562
+:1015500000F5F0E516A4F50FE500F5F0E516A4E5B5
+:10156000F0F50EE50FF5F0E50D35F0F50DE501F5BB
+:10157000F0E516A4F50FE501F5F0E516A4E5F0F5A4
+:101580000AE50FF5F0E50E35F0F50E750B00750C5C
+:1015900000C3C3750100E50BF5F0E51035F0F5105B
+:1015A000E50CF5F0E51135F0F511E50DF5F0E51276
+:1015B00035F0F512E50EF5F0E51335F0F513C375CA
+:1015C0000E00E500F5F0E517A4F50FE500F5F0E5F0
+:1015D00017A4E5F0F50AE50FF5F0E50E35F0F50E88
+:1015E000750B00750C00750D00C3C3750000E50B8D
+:1015F000F5F0E51035F0F510E50CF5F0E51135F0F6
+:10160000F511E50DF5F0E51235F0F512E50EF5F002
+:10161000E51335F0F513C3E510F5F075E003250685
+:10162000F58275E0003507F583E0F508E50895F0EB
+:10163000F500E511F5F075E0022506F58275E0008C
+:101640003507F583E0F508E50895F0F501E512F5B5
+:10165000F075E0012506F58275E0003507F583E0B9
+:10166000F508E50895F0F509E513F5F075E00025B6
+:1016700006F58275E0003507F583E0F508E5089585
+:10168000F0F50AE500F502E501F503E509F504E5E5
+:101690000AF50575E00D2506F58275E0003507F5BC
+:1016A00083E0F51775E00C2506F58275E000350737
+:1016B000F583E0F51675E00B2506F58275E000353B
+:1016C00007F583E0F51575E00A2506F58275E0005B
+:1016D0003507F583E0F51475E0092506F58275E018
+:1016E000003507F583E0F51375E0082506F58275EA
+:1016F000E0003507F583E0F51275E0072506F58271
+:1017000075E0003507F583E0F51175E0062506F56F
+:101710008275E0003507F583E0F51075E0042506D5
+:10172000F58275E0003507F583E0F508E508C0E0CF
+:1017300075E0052506F58275E0003507F583E0F5CF
+:1017400008E508C0E075E0162506F50675E00035E9
+:1017500007F507E502F582E503F583E504F500E505
+:1017600005F5012200E50675821FC39582F506E5A1
+:10177000077583009583F507D0E0F50875E00A2525
+:1017800006F58275E0003507F583E508F0D0E0F551
+:101790000875E0092506F58275E0003507F583E553
+:1017A00008F075E0122506F58275E0003507F5832F
+:1017B000E517F075E0112506F58275E0003507F5AF
+:1017C00083E516F075E0102506F58275E000350713
+:1017D000F583E515F075E00F2506F58275E0003517
+:1017E00007F583E514F075E00E2506F58275E00037
+:1017F0003507F583E513F075E00D2506F58275E0F4
+:10180000003507F583E512F075E00C2506F58275C5
+:10181000E0003507F583E511F075E00B2506F5824C
+:1018200075E0003507F583E510F075091F750001B7
+:10183000E500F5F0E50995F0F509E506F500E500A8
+:10184000F5F0E50925F0F509750100E507F500E576
+:1018500000F5F0E50135F0F501E501F502E509F5E2
+:1018600082E502F583E0F50875E0042506F582754A
+:10187000E0003507F583E508F075091F750002E5FE
+:1018800000F5F0E50995F0F509E506F500E500F548
+:10189000F0E50925F0F509750100E507F500E5001B
+:1018A000F5F0E50135F0F501E501F502E509F58210
+:1018B000E502F583E0F51675091F750003E500F5EF
+:1018C000F0E50995F0F509E506F500E500F5F0E528
+:1018D0000925F0F509750100E507F500E500F5F0CB
+:1018E000E50135F0F501E501F502E509F582E502CE
+:1018F000F583E0F51575091F750004E500F5F0E5C1
+:101900000995F0F509E506F500E500F5F0E509258E
+:10191000F0F509750100E507F500E500F5F0E501D2
+:1019200035F0F501E501F502E509F582E502F583FB
+:10193000E0F510750A16750900750100750000E5DF
+:101940000AF4F511E509F4F512E501F4F513E500E3
+:10195000F4F514D3750000E500F5F0E51135F0F568
+:1019600011E500F5F0E51235F0F512E500F5F0E5CA
+:101970001335F0F513E500F5F0E51435F0F51475C1
+:101980001B21751A00751900751800E511F51FE582
+:1019900012F51EE513F51DE514F51C120639E58256
+:1019A000F502E583F503E500F504E501F505E5023B
+:1019B000F517E503F50EE504F50CE505F50D750BDA
+:1019C00000751800751900751A00750A00750F0169
+:1019D000750001C3E50DF5F0E51095F0F509E50A90
+:1019E000F5F0E50A35F0F509E509F5F0E50055F003
+:1019F000F500E500F5F0E50B45F0F50B750001C3CA
+:101A0000E50DF5F0E51095F0F509E50AF5F0E50AC4
+:101A100035F0F509E510F5F0E50D95F0F501E50A6D
+:101A2000F5F0E50A35F0F501E501F5F0E50945F0D9
+:101A3000F509E50FF5F0E50965F0F509E509F5F0BB
+:101A4000E50055F0F500C3E50CF5F0E51595F0F56A
+:101A500009E50AF5F0E50A35F0F509E509F5F0E5DF
+:101A60000055F0F500E500F5F0E50B45F0F50B75D8
+:101A70000001C3E50DF5F0E51095F0F509E50AF56F
+:101A8000F0E50A35F0F509E510F5F0E50D95F0F50E
+:101A900001E50AF5F0E50A35F0F501E501F5F0E5B7
+:101AA0000945F0F509E50FF5F0E50965F0F509E5FB
+:101AB00009F5F0E50055F0F500C3E50CF5F0E51586
+:101AC00095F0F509E50AF5F0E50A35F0F509E515B3
+:101AD000F5F0E50C95F0F501E50AF5F0E50A35F0CD
+:101AE000F501E501F5F0E50945F0F509E50FF5F03B
+:101AF000E50965F0F509E509F5F0E50055F0F500B3
+:101B0000C3E50EF5F0E51695F0F509E50AF5F0E503
+:101B10000A35F0F509E509F5F0E50055F0F500E5C1
+:101B200000F5F0E50B45F0F50B750001C3E50DF58B
+:101B3000F0E51095F0F509E50AF5F0E50A35F0F560
+:101B400009E510F5F0E50D95F0F501E50AF5F0E58C
+:101B50000A35F0F501E501F5F0E50945F0F509E58F
+:101B60000FF5F0E50965F0F509E509F5F0E5005533
+:101B7000F0F500C3E50CF5F0E51595F0F509E50A7B
+:101B8000F5F0E50A35F0F509E515F5F0E50C95F009
+:101B9000F501E50AF5F0E50A35F0F501E501F5F0A6
+:101BA000E50945F0F509E50FF5F0E50965F0F509FA
+:101BB000E509F5F0E50055F0F500C3E50EF5F0E5B3
+:101BC0001695F0F509E50AF5F0E50A35F0F509E5B1
+:101BD00016F5F0E50E95F0F501E50AF5F0E50A35A4
+:101BE000F0F501E501F5F0E50945F0F509E50FF53A
+:101BF000F0E50965F0F509E509F5F0E50055F0F5C2
+:101C000000C3E517F5F075E0042506F58275E000E0
+:101C10003507F583E0F508E50895F0F509E50AF5DF
+:101C2000F0E50A35F0F509E509F5F0E50055F0F5C0
+:101C300000E500F5F0E50B45F0F50B750000E50B50
+:101C4000F5F0E50045F0F500E518F5F0E50045F0A4
+:101C5000F500E519F5F0E50045F0F500E51AF5F0B9
+:101C6000E50045F0F500E5007002800302368700CC
+:101C7000751116751200751300751400751B21750A
+:101C80001A00751900751800E511F51FE512F51E0B
+:101C9000E513F51DE514F51C120639E582F502E59C
+:101CA00083F503E500F504E501F505E502F517E523
+:101CB00003F50EE504F50CE505F50D750B0075183B
+:101CC00000751900751A00750A00750F017500017D
+:101CD000C3E50DF5F0E51095F0F509E50AF5F0E539
+:101CE0000A35F0F509E509F5F0E50055F0F500E5F0
+:101CF00000F5F0E50B45F0F50B750001C3E50DF5BA
+:101D0000F0E51095F0F509E50AF5F0E50A35F0F58E
+:101D100009E510F5F0E50D95F0F501E50AF5F0E5BA
+:101D20000A35F0F501E501F5F0E50945F0F509E5BD
+:101D30000FF5F0E50965F0F509E509F5F0E5005561
+:101D4000F0F500C3E50CF5F0E51595F0F509E50AA9
+:101D5000F5F0E50A35F0F509E509F5F0E50055F08F
+:101D6000F500E500F5F0E50B45F0F50B750001C356
+:101D7000E50DF5F0E51095F0F509E50AF5F0E50A51
+:101D800035F0F509E510F5F0E50D95F0F501E50AFA
+:101D9000F5F0E50A35F0F501E501F5F0E50945F066
+:101DA000F509E50FF5F0E50965F0F509E509F5F048
+:101DB000E50055F0F500C3E50CF5F0E51595F0F5F7
+:101DC00009E50AF5F0E50A35F0F509E515F5F0E560
+:101DD0000C95F0F501E50AF5F0E50A35F0F501E5B9
+:101DE00001F5F0E50945F0F509E50FF5F0E50965C0
+:101DF000F0F509E509F5F0E50055F0F500C3E50E4D
+:101E0000F5F0E51695F0F509E50AF5F0E50A35F087
+:101E1000F509E509F5F0E50055F0F500E500F5F008
+:101E2000E50B45F0F50B750001C3E50DF5F0E51088
+:101E300095F0F509E50AF5F0E50A35F0F509E51044
+:101E4000F5F0E50D95F0F501E50AF5F0E50A35F058
+:101E5000F501E501F5F0E50945F0F509E50FF5F0C7
+:101E6000E50965F0F509E509F5F0E50055F0F5003F
+:101E7000C3E50CF5F0E51595F0F509E50AF5F0E593
+:101E80000A35F0F509E515F5F0E50C95F0F501E5F5
+:101E90000AF5F0E50A35F0F501E501F5F0E509454B
+:101EA000F0F509E50FF5F0E50965F0F509E509F547
+:101EB000F0E50055F0F500C3E50EF5F0E51695F0F8
+:101EC000F509E50AF5F0E50A35F0F509E516F5F04E
+:101ED000E50E95F0F501E50AF5F0E50A35F0F501B6
+:101EE000E501F5F0E50945F0F509E50FF5F0E5093F
+:101EF00065F0F509E509F5F0E50055F0F500C3E5F5
+:101F000017F5F075E0042506F58275E0003507F554
+:101F100083E0F508E50895F0F509E50AF5F0E50A2E
+:101F200035F0F509E509F5F0E50055F0F500E500B7
+:101F3000F5F0E50B45F0F50B750000E50BF5F0E568
+:101F40000045F0F500E518F5F0E50045F0F500E591
+:101F500019F5F0E50045F0F500E51AF5F0E5004566
+:101F6000F0F500E50070028003023683007511165B
+:101F700075120075130075140075082175E00825A9
+:101F800006F58275E0003507F583E508F075080071
+:101F900075E0072506F58275E0003507F583E5084D
+:101FA000F075080075E0062506F58275E000350736
+:101FB000F583E508F075080075E0052506F58275DE
+:101FC000E0003507F583E508F0E511F51FE512F5AA
+:101FD0001EE513F51DE514F51C75E0082506F582D0
+:101FE00075E0003507F583E0F51B75E0072506F57C
+:101FF0008275E0003507F583E0F51A75E0062506E1
+:10200000F58275E0003507F583E0F51975E00525E3
+:1020100006F58275E0003507F583E0F518120639FC
+:10202000E582F502E583F503E500F504E501F50534
+:10203000E502F517E503F50EE504F50CE505F50DEC
+:10204000750B00751800751900751A00750A007572
+:102050000F01750001C3E50DF5F0E51095F0F509E8
+:10206000E50AF5F0E50A35F0F509E509F5F0E500D2
+:1020700055F0F500E500F5F0E50B45F0F50B7500C2
+:1020800001C3E50DF5F0E51095F0F509E50AF5F069
+:10209000E50A35F0F509E510F5F0E50D95F0F501E7
+:1020A000E50AF5F0E50A35F0F501E501F5F0E50999
+:1020B00045F0F509E50FF5F0E50965F0F509E509E5
+:1020C000F5F0E50055F0F500C3E50CF5F0E51595E4
+:1020D000F0F509E50AF5F0E50A35F0F509E509F549
+:1020E000F0E50055F0F500E500F5F0E50B45F0F5FD
+:1020F0000B750001C3E50DF5F0E51095F0F509E568
+:102100000AF5F0E50A35F0F509E510F5F0E50D956D
+:10211000F0F501E50AF5F0E50A35F0F501E501F520
+:10212000F0E50945F0F509E50FF5F0E50965F0F58D
+:1021300009E509F5F0E50055F0F500C3E50CF5F00B
+:10214000E51595F0F509E50AF5F0E50A35F0F5092C
+:10215000E515F5F0E50C95F0F501E50AF5F0E50A71
+:1021600035F0F501E501F5F0E50945F0F509E50F74
+:10217000F5F0E50965F0F509E509F5F0E50055F03C
+:10218000F500C3E50EF5F0E51695F0F509E50AF55D
+:10219000F0E50A35F0F509E509F5F0E50055F0F54B
+:1021A00000E500F5F0E50B45F0F50B750001C3E522
+:1021B0000DF5F0E51095F0F509E50AF5F0E50A35BD
+:1021C000F0F509E510F5F0E50D95F0F501E50AF5F6
+:1021D000F0E50A35F0F501E501F5F0E50945F0F522
+:1021E00009E50FF5F0E50965F0F509E509F5F0E514
+:1021F0000055F0F500C3E50CF5F0E51595F0F5098F
+:10220000E50AF5F0E50A35F0F509E515F5F0E50C18
+:1022100095F0F501E50AF5F0E50A35F0F501E5017F
+:10222000F5F0E50945F0F509E50FF5F0E50965F08C
+:10223000F509E509F5F0E50055F0F500C3E50EF503
+:10224000F0E51695F0F509E50AF5F0E50A35F0F543
+:1022500009E516F5F0E50E95F0F501E50AF5F0E56E
+:102260000A35F0F501E501F5F0E50945F0F509E578
+:102270000FF5F0E50965F0F509E509F5F0E500551C
+:10228000F0F500C3E517F5F075E0042506F5827555
+:10229000E0003507F583E0F508E50895F0F509E578
+:1022A0000AF5F0E50A35F0F509E509F5F0E5005520
+:1022B000F0F500E500F5F0E50B45F0F50B750000D5
+:1022C000E50BF5F0E50045F0F500E518F5F0E50063
+:1022D00045F0F500E519F5F0E50045F0F500E51AE3
+:1022E000F5F0E50045F0F500E500700280030236E8
+:1022F0007F00750000750100750901750A00C3E5CE
+:1023000000F5F0E51155F0F500E501F5F0E51255A1
+:10231000F0F501E509F5F0E51355F0F509E50AF5E5
+:10232000F0E51455F0F50B750A00E500F5F0E50A47
+:1023300045F0F50AE501F5F0E50A45F0F50AE5098D
+:10234000F5F0E50A45F0F50AE50BF5F0E50A45F08C
+:10235000F50AE50A7002800302366F00751F4075AA
+:102360001E00751D00751C007500007501007509C3
+:1023700001750B00C3E500F5F075E0082506F58250
+:1023800075E0003507F583E0F508E50855F0F50C34
+:10239000E501F5F075E0072506F58275E0003507E3
+:1023A000F583E0F508E50855F0F50AE509F5F0755F
+:1023B000E0062506F58275E0003507F583E0F508AF
+:1023C000E50855F0F501E50BF5F075E0052506F596
+:1023D0008275E0003507F583E0F508E50855F0F56E
+:1023E00009750000E50CF5F0E50045F0F500E50A9B
+:1023F000F5F0E50045F0F500E501F5F0E50045F004
+:10240000F500E509F5F0E50045F0F500E50070029E
+:10241000800302365F00751B04751A00751900757C
+:102420001800120639E582F502E583F503E500F5AB
+:1024300004E501F505E502F517E503F50EE504F5FC
+:102440000CE505F50D750B00751800751900751A6A
+:1024500000750A00750F01750001C3E50DF5F0E583
+:102460001095F0F509E50AF5F0E50A35F0F509E50E
+:1024700009F5F0E50055F0F500E500F5F0E50B4550
+:10248000F0F50B750001C3E50DF5F0E51095F0F5DD
+:1024900009E50AF5F0E50A35F0F509E510F5F0E58E
+:1024A0000D95F0F501E50AF5F0E50A35F0F501E5E1
+:1024B00001F5F0E50945F0F509E50FF5F0E50965E9
+:1024C000F0F509E509F5F0E50055F0F500C3E50C78
+:1024D000F5F0E51595F0F509E50AF5F0E50A35F0B2
+:1024E000F509E509F5F0E50055F0F500E500F5F032
+:1024F000E50B45F0F50B750001C3E50DF5F0E510B2
+:1025000095F0F509E50AF5F0E50A35F0F509E5106D
+:10251000F5F0E50D95F0F501E50AF5F0E50A35F081
+:10252000F501E501F5F0E50945F0F509E50FF5F0F0
+:10253000E50965F0F509E509F5F0E50055F0F50068
+:10254000C3E50CF5F0E51595F0F509E50AF5F0E5BC
+:102550000A35F0F509E515F5F0E50C95F0F501E51E
+:102560000AF5F0E50A35F0F501E501F5F0E5094574
+:10257000F0F509E50FF5F0E50965F0F509E509F570
+:10258000F0E50055F0F500C3E50EF5F0E51695F021
+:10259000F509E50AF5F0E50A35F0F509E509F5F084
+:1025A000E50055F0F500E500F5F0E50B45F0F50B1D
+:1025B000750001C3E50DF5F0E51095F0F509E50AA4
+:1025C000F5F0E50A35F0F509E510F5F0E50D95F0C3
+:1025D000F501E50AF5F0E50A35F0F501E501F5F05C
+:1025E000E50945F0F509E50FF5F0E50965F0F509B0
+:1025F000E509F5F0E50055F0F500C3E50CF5F0E56B
+:102600001595F0F509E50AF5F0E50A35F0F509E567
+:1026100015F5F0E50C95F0F501E50AF5F0E50A355C
+:10262000F0F501E501F5F0E50945F0F509E50FF5EF
+:10263000F0E50965F0F509E509F5F0E50055F0F577
+:1026400000C3E50EF5F0E51695F0F509E50AF5F09D
+:10265000E50A35F0F509E516F5F0E50E95F0F5011A
+:10266000E50AF5F0E50A35F0F501E501F5F0E509D3
+:1026700045F0F509E50FF5F0E50965F0F509E5091F
+:10268000F5F0E50055F0F500C3E517F5F075E00449
+:102690002506F58275E0003507F583E0F508E508C5
+:1026A00095F0F509E50AF5F0E50A35F0F509E509D3
+:1026B000F5F0E50055F0F500E500F5F0E50B45F027
+:1026C000F50B750000E50BF5F0E50045F0F500E5CC
+:1026D00018F5F0E50045F0F500E519F5F0E50045E1
+:1026E000F0F500E51AF5F0E50045F0F500E50070BD
+:1026F00002800302365B00750A1675090075010039
+:10270000750000E50AF4F511E509F4F512E501F4A8
+:10271000F513E500F4F514D3750000E500F5F0E5D8
+:102720001135F0F511E500F5F0E51235F0F512E59B
+:1027300000F5F0E51335F0F513E500F5F0E5143597
+:10274000F0F514751B21751A00751900751800E550
+:1027500011F51FE512F51EE513F51DE514F51C1224
+:102760001277E582F502E583F503E500F504E5015E
+:10277000F505E502F517E503F50EE504F50CE505AD
+:10278000F50D750B00751800751900751A00750A9E
+:1027900000750F01750001C3E50DF5F0E51095F02A
+:1027A000F509E50AF5F0E50A35F0F509E509F5F072
+:1027B000E50055F0F500E500F5F0E50B45F0F50B0B
+:1027C000750001C3E50DF5F0E51095F0F509E50A92
+:1027D000F5F0E50A35F0F509E510F5F0E50D95F0B1
+:1027E000F501E50AF5F0E50A35F0F501E501F5F04A
+:1027F000E50945F0F509E50FF5F0E50965F0F5099E
+:10280000E509F5F0E50055F0F500C3E50CF5F0E558
+:102810001595F0F509E50AF5F0E50A35F0F509E555
+:1028200009F5F0E50055F0F500E500F5F0E50B459C
+:10283000F0F50B750001C3E50DF5F0E51095F0F529
+:1028400009E50AF5F0E50A35F0F509E510F5F0E5DA
+:102850000D95F0F501E50AF5F0E50A35F0F501E52D
+:1028600001F5F0E50945F0F509E50FF5F0E5096535
+:10287000F0F509E509F5F0E50055F0F500C3E50CC4
+:10288000F5F0E51595F0F509E50AF5F0E50A35F0FE
+:10289000F509E515F5F0E50C95F0F501E50AF5F01B
+:1028A000E50A35F0F501E501F5F0E50945F0F50932
+:1028B000E50FF5F0E50965F0F509E509F5F0E50046
+:1028C00055F0F500C3E50EF5F0E51695F0F509E5D0
+:1028D0000AF5F0E50A35F0F509E509F5F0E50055EA
+:1028E000F0F500E500F5F0E50B45F0F50B7500019E
+:1028F000C3E50DF5F0E51095F0F509E50AF5F0E50D
+:102900000A35F0F509E510F5F0E50D95F0F501E56E
+:102910000AF5F0E50A35F0F501E501F5F0E50945C0
+:10292000F0F509E50FF5F0E50965F0F509E509F5BC
+:10293000F0E50055F0F500C3E50CF5F0E51595F070
+:10294000F509E50AF5F0E50A35F0F509E515F5F0C4
+:10295000E50C95F0F501E50AF5F0E50A35F0F5012D
+:10296000E501F5F0E50945F0F509E50FF5F0E509B4
+:1029700065F0F509E509F5F0E50055F0F500C3E56A
+:102980000EF5F0E51695F0F509E50AF5F0E50A35DE
+:10299000F0F509E516F5F0E50E95F0F501E50AF517
+:1029A000F0E50A35F0F501E501F5F0E50945F0F54A
+:1029B00009E50FF5F0E50965F0F509E509F5F0E53C
+:1029C0000055F0F500C3E517F5F075E0042506F5B0
+:1029D0008275E0003507F583E0F508E50895F0F528
+:1029E00009E50AF5F0E50A35F0F509E509F5F0E540
+:1029F0000055F0F500E500F5F0E50B45F0F50B7539
+:102A00000000E50BF5F0E50045F0F500E518F5F000
+:102A1000E50045F0F500E519F5F0E50045F0F500B5
+:102A2000E51AF5F0E50045F0F500E50070028003D9
+:102A300002365700751116751200751300751400D3
+:102A4000750A21750900750100750000E50AF4F5A5
+:102A50001BE509F4F51AE501F4F519E500F4F5189C
+:102A6000D3750000E500F5F0E51B35F0F51BE5003A
+:102A7000F5F0E51A35F0F51AE500F5F0E51935F051
+:102A8000F519E500F5F0E51835F0F518E511F51F35
+:102A9000E512F51EE513F51DE514F51C121277E598
+:102AA00082F502E583F503E500F504E501F505E5AA
+:102AB00002F517E503F50EE504F50CE505F50D75D2
+:102AC0000B00751800751900751A00750A00750F4E
+:102AD00001750001C3E50DF5F0E51095F0F509E588
+:102AE0000AF5F0E50A35F0F509E509F5F0E50055D8
+:102AF000F0F500E500F5F0E50B45F0F50B7500018C
+:102B0000C3E50DF5F0E51095F0F509E50AF5F0E5FA
+:102B10000A35F0F509E510F5F0E50D95F0F501E55C
+:102B20000AF5F0E50A35F0F501E501F5F0E50945AE
+:102B3000F0F509E50FF5F0E50965F0F509E509F5AA
+:102B4000F0E50055F0F500C3E50CF5F0E51595F05E
+:102B5000F509E50AF5F0E50A35F0F509E509F5F0BE
+:102B6000E50055F0F500E500F5F0E50B45F0F50B57
+:102B7000750001C3E50DF5F0E51095F0F509E50ADE
+:102B8000F5F0E50A35F0F509E510F5F0E50D95F0FD
+:102B9000F501E50AF5F0E50A35F0F501E501F5F096
+:102BA000E50945F0F509E50FF5F0E50965F0F509EA
+:102BB000E509F5F0E50055F0F500C3E50CF5F0E5A5
+:102BC0001595F0F509E50AF5F0E50A35F0F509E5A2
+:102BD00015F5F0E50C95F0F501E50AF5F0E50A3597
+:102BE000F0F501E501F5F0E50945F0F509E50FF52A
+:102BF000F0E50965F0F509E509F5F0E50055F0F5B2
+:102C000000C3E50EF5F0E51695F0F509E50AF5F0D7
+:102C1000E50A35F0F509E509F5F0E50055F0F500B0
+:102C2000E500F5F0E50B45F0F50B750001C3E50D8A
+:102C3000F5F0E51095F0F509E50AF5F0E50A35F04F
+:102C4000F509E510F5F0E50D95F0F501E50AF5F06B
+:102C5000E50A35F0F501E501F5F0E50945F0F5097E
+:102C6000E50FF5F0E50965F0F509E509F5F0E50092
+:102C700055F0F500C3E50CF5F0E51595F0F509E51F
+:102C80000AF5F0E50A35F0F509E515F5F0E50C95DE
+:102C9000F0F501E50AF5F0E50A35F0F501E501F595
+:102CA000F0E50945F0F509E50FF5F0E50965F0F502
+:102CB00009E509F5F0E50055F0F500C3E50EF5F07E
+:102CC000E51695F0F509E50AF5F0E50A35F0F509A0
+:102CD000E516F5F0E50E95F0F501E50AF5F0E50AE3
+:102CE00035F0F501E501F5F0E50945F0F509E50FE9
+:102CF000F5F0E50965F0F509E509F5F0E50055F0B1
+:102D0000F500C3E517F5F075E0042506F58275E0DA
+:102D1000003507F583E0F508E50895F0F509E50AC3
+:102D2000F5F0E50A35F0F509E509F5F0E50055F0AF
+:102D3000F500E500F5F0E50B45F0F50B750000E555
+:102D40000BF5F0E50045F0F500E518F5F0E5004578
+:102D5000F0F500E519F5F0E50045F0F500E51AF5A8
+:102D6000F0E50045F0F500E50070028003023653FF
+:102D70000075E0082506F58275E0003507F583E06B
+:102D8000F50075E0072506F58275E0003507F58347
+:102D9000E0F50175E0062506F58275E0003507F5DA
+:102DA00083E0F50975E0052506F58275E000350735
+:102DB000F583E0F50A751F00C3E500F5F0E5119510
+:102DC000F0F500E500F5F0E51F45F0F51FC3E5015E
+:102DD000F5F0E51295F0F500E500F5F0E51F45F09A
+:102DE000F51FC3E509F5F0E51395F0F500E500F5ED
+:102DF000F0E51F45F0F51FC3E50AF5F0E51495F081
+:102E0000F500E500F5F0E51F45F0F51F751E0075AE
+:102E10001D00751C00E51FF500751F01C37501003D
+:102E2000E500F5F0E50195F0F501750100E501F526
+:102E3000F0E50135F0F501E501F5F0E51F65F0F588
+:102E40001FC3750100E51EF5F0E50195F0F501756C
+:102E50000100E501F5F0E50135F0F501E501F5F0DA
+:102E6000E51F65F0F51FC3750100E51DF5F0E501EF
+:102E700095F0F501750100E501F5F0E50135F0F596
+:102E800001E501F5F0E51F65F0F51FC3750100E5EB
+:102E90001CF5F0E50195F0F501750100E501F5F08F
+:102EA000E50135F0F501E501F5F0E51F65F0F51FE9
+:102EB000751E00751D00751C0075092175010075D2
+:102EC0000000750A00E509F4F51BE501F4F501E5DC
+:102ED00000F4F509E50AF4F50AD3750000E500F5FC
+:102EE000F0E51B35F0F51BE500F5F0E50135F0F5F3
+:102EF00001E500F5F0E50935F0F509E500F5F0E547
+:102F00000A35F0F50AE501F51AE509F519E50AF5BE
+:102F100018121277E582F502E583F503E500F50462
+:102F2000E501F505E502F517E503F50EE504F50CF9
+:102F3000E505F50D750B00751800751900751A007B
+:102F4000750A00750F01750001C3E50DF5F0E51078
+:102F500095F0F509E50AF5F0E50A35F0F509E5091A
+:102F6000F5F0E50055F0F500E500F5F0E50B45F06E
+:102F7000F50B750001C3E50DF5F0E51095F0F509C9
+:102F8000E50AF5F0E50A35F0F509E510F5F0E50D8F
+:102F900095F0F501E50AF5F0E50A35F0F501E501F2
+:102FA000F5F0E50945F0F509E50FF5F0E50965F0FF
+:102FB000F509E509F5F0E50055F0F500C3E50CF578
+:102FC000F0E51595F0F509E50AF5F0E50A35F0F5B7
+:102FD00009E509F5F0E50055F0F500E500F5F0E547
+:102FE0000B45F0F50B750001C3E50DF5F0E5109507
+:102FF000F0F509E50AF5F0E50A35F0F509E510F513
+:10300000F0E50D95F0F501E50AF5F0E50A35F0F586
+:1030100001E501F5F0E50945F0F509E50FF5F0E505
+:103020000965F0F509E509F5F0E50055F0F500C38F
+:10303000E50CF5F0E51595F0F509E50AF5F0E50A7A
+:1030400035F0F509E515F5F0E50C95F0F501E50A23
+:10305000F5F0E50A35F0F501E501F5F0E50945F093
+:10306000F509E50FF5F0E50965F0F509E509F5F075
+:10307000E50055F0F500C3E50EF5F0E51695F0F521
+:1030800009E50AF5F0E50A35F0F509E509F5F0E599
+:103090000055F0F500E500F5F0E50B45F0F50B7592
+:1030A0000001C3E50DF5F0E51095F0F509E50AF529
+:1030B000F0E50A35F0F509E510F5F0E50D95F0F5C8
+:1030C00001E50AF5F0E50A35F0F501E501F5F0E571
+:1030D0000945F0F509E50FF5F0E50965F0F509E5B5
+:1030E00009F5F0E50055F0F500C3E50CF5F0E51540
+:1030F00095F0F509E50AF5F0E50A35F0F509E5156D
+:10310000F5F0E50C95F0F501E50AF5F0E50A35F086
+:10311000F501E501F5F0E50945F0F509E50FF5F0F4
+:10312000E50965F0F509E509F5F0E50055F0F5006C
+:10313000C3E50EF5F0E51695F0F509E50AF5F0E5BD
+:103140000A35F0F509E516F5F0E50E95F0F501E51F
+:103150000AF5F0E50A35F0F501E501F5F0E5094578
+:10316000F0F509E50FF5F0E50965F0F509E509F574
+:10317000F0E50055F0F500C3E517F5F075E004251E
+:1031800006F58275E0003507F583E0F508E508955A
+:10319000F0F509E50AF5F0E50A35F0F509E509F578
+:1031A000F0E50055F0F500E500F5F0E50B45F0F52C
+:1031B0000B750000E50BF5F0E50045F0F500E518AE
+:1031C000F5F0E50045F0F500E519F5F0E50045F00E
+:1031D000F500E51AF5F0E50045F0F500E5007002B0
+:1031E000800302364F0075111675120075130075B5
+:1031F0001400751B21751A00751900751800E5116A
+:10320000F51FE512F51EE513F51DE514F51C120674
+:1032100039E582F502E583F503E500F504E501F5FE
+:1032200005E502F51FE503F51EE504F51DE505F5C9
+:103230001C750921750100750000750A00E509F487
+:10324000F51BE501F4F501E500F4F509E50AF4F5EF
+:103250000AD3750000E500F5F0E51B35F0F51BE538
+:1032600000F5F0E50135F0F501E500F5F0E509358B
+:10327000F0F509E500F5F0E50A35F0F50AE501F5A8
+:103280001AE509F519E50AF518121277E582F50233
+:10329000E583F503E500F504E501F505E502F5171D
+:1032A000E503F50EE504F50CE505F50D750B007568
+:1032B0001800751900751A00750A00750F01750060
+:1032C00001C3E50DF5F0E51095F0F509E50AF5F017
+:1032D000E50A35F0F509E509F5F0E50055F0F500EA
+:1032E000E500F5F0E50B45F0F50B750001C3E50DC4
+:1032F000F5F0E51095F0F509E50AF5F0E50A35F089
+:10330000F509E510F5F0E50D95F0F501E50AF5F0A4
+:10331000E50A35F0F501E501F5F0E50945F0F509B7
+:10332000E50FF5F0E50965F0F509E509F5F0E500CB
+:1033300055F0F500C3E50CF5F0E51595F0F509E558
+:103340000AF5F0E50A35F0F509E509F5F0E500556F
+:10335000F0F500E500F5F0E50B45F0F50B75000123
+:10336000C3E50DF5F0E51095F0F509E50AF5F0E592
+:103370000A35F0F509E510F5F0E50D95F0F501E5F4
+:103380000AF5F0E50A35F0F501E501F5F0E5094546
+:10339000F0F509E50FF5F0E50965F0F509E509F542
+:1033A000F0E50055F0F500C3E50CF5F0E51595F0F6
+:1033B000F509E50AF5F0E50A35F0F509E515F5F04A
+:1033C000E50C95F0F501E50AF5F0E50A35F0F501B3
+:1033D000E501F5F0E50945F0F509E50FF5F0E5093A
+:1033E00065F0F509E509F5F0E50055F0F500C3E5F0
+:1033F0000EF5F0E51695F0F509E50AF5F0E50A3564
+:10340000F0F509E509F5F0E50055F0F500E500F502
+:10341000F0E50B45F0F50B750001C3E50DF5F0E5A2
+:103420001095F0F509E50AF5F0E50A35F0F509E53E
+:1034300010F5F0E50D95F0F501E50AF5F0E50A3532
+:10344000F0F501E501F5F0E50945F0F509E50FF5C1
+:10345000F0E50965F0F509E509F5F0E50055F0F549
+:1034600000C3E50CF5F0E51595F0F509E50AF5F072
+:10347000E50A35F0F509E515F5F0E50C95F0F501EF
+:10348000E50AF5F0E50A35F0F501E501F5F0E509A5
+:1034900045F0F509E50FF5F0E50965F0F509E509F1
+:1034A000F5F0E50055F0F500C3E50EF5F0E51695ED
+:1034B000F0F509E50AF5F0E50A35F0F509E516F548
+:1034C000F0E50E95F0F501E50AF5F0E50A35F0F5C1
+:1034D00001E501F5F0E50945F0F509E50FF5F0E541
+:1034E0000965F0F509E509F5F0E50055F0F500C3CB
+:1034F000E517F5F075E0042506F58275E00035075F
+:10350000F583E0F508E50895F0F509E50AF5F0E53D
+:103510000A35F0F509E509F5F0E50055F0F500E5A7
+:1035200000F5F0E50B45F0F50B750000E50BF5F047
+:10353000E50045F0F500E518F5F0E50045F0F5008B
+:10354000E519F5F0E50045F0F500E51AF5F0E500C0
+:1035500045F0F500E5007002800302364B0075115E
+:1035600000751200751300751400E511F502E512DF
+:10357000F503E513F504E514F50575E0122506F5E8
+:103580008275E0003507F583E0F51775E011250633
+:10359000F58275E0003507F583E0F51675E0102536
+:1035A00006F58275E0003507F583E0F51575E00F47
+:1035B0002506F58275E0003507F583E0F51475E022
+:1035C0000E2506F58275E0003507F583E0F51375E5
+:1035D000E00D2506F58275E0003507F583E0F5126C
+:1035E00075E00C2506F58275E0003507F583E0F5FA
+:1035F0001175E00B2506F58275E0003507F583E0CF
+:10360000F51075E0092506F58275E0003507F583AC
+:10361000E0F508E508C0E075E00A2506F58275E0EA
+:10362000003507F583E0F508E508C0E075E01F25E3
+:1036300006F50675E0003507F507E502F582E503B6
+:10364000F583E504F500E505F501220002356A0081
+:1036500002356A0002356A0002356A0002356A00E6
+:10366000751B08751A0075190075180002242200D0
+:10367000751F80751E00751D00751C0002236800F3
+:1036800002356A0002356A0002356A000000000057
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR c/2098 */
+/* Test for a warning on comparison on out-of-range data. */
+/* { dg-do compile { xfail c4x-*-* } } */
+/* { dg-options "-Wall" } */
+
+signed char sc;
+unsigned char uc;
+
+void foo()
+{
+ if (sc == 10000) return; /* { dg-warning "always false" "signed" } */
+ if (uc == 10000) return; /* { dg-warning "always false" "unsigned" } */
+}
--- /dev/null
+/* PR c/2098 */
+/* Test for a warning on comparison on out-of-range data. */
+/* { dg-do compile { xfail c4x-*-* } } */
+/* { dg-options "-Wall" } */
+
+signed char sc;
+unsigned char uc;
+
+void foo()
+{
+ if (sc == 10000) return; /* { dg-warning "always false" "signed" } */
+ if (uc == 10000) return; /* { dg-warning "always false" "unsigned" } */
+}
--- /dev/null
+:1000000000D0E0F518D0E0F519900000E582F50980
+:10001000900000E583F50A750100C3750000E50155
+:10002000F5F0E50935F0F501E500F5F0E50A35F004
+:10003000F500E500F502E501F582E502F583E0F55E
+:100040000B750080E50BF5F0E50055F0F50EE500C9
+:10005000F5F0E50E84F50E7500FFE500F5F0E50E10
+:10006000A4F50EE50EF50CE50EF50D750010750105
+:1000700027750900750A00750F00C3E500F5F0E566
+:100080000B95F0F500E500F5F0E50F45F0F50FC331
+:10009000E501F5F0E50C95F0F500E500F5F0E50F6C
+:1000A00045F0F50FC3E509F5F0E50D95F0F500E530
+:1000B00000F5F0E50F45F0F50FC3E50AF5F0E50EA4
+:1000C00095F0F500E500F5F0E50F45F0F50F750149
+:1000D00000750900750A00E50FF500750F01C3757D
+:1000E0000B00E500F5F0E50B95F0F50B750B00E561
+:1000F0000BF5F0E50B35F0F50BE50BF5F0E50F65CD
+:10010000F0F50FC3750B00E501F5F0E50B95F0F583
+:100110000B750B00E50BF5F0E50B35F0F50BE50B7A
+:10012000F5F0E50F65F0F50FC3750B00E509F5F087
+:10013000E50B95F0F50B750B00E50BF5F0E50B35D0
+:10014000F0F50BE50BF5F0E50F65F0F50FC3750B5A
+:1001500000E50AF5F0E50B95F0F50B750B00E50BE6
+:10016000F5F0E50B35F0F50BE50BF5F0E50F65F077
+:10017000F50F750100750900750A00750000E50F9F
+:10018000F5F0E50045F0F500E501F5F0E50045F096
+:10019000F500E509F5F0E50045F0F500E50AF5F0B4
+:1001A000E50045F0F500E5007002800302036800F9
+:1001B000900001E582F509900001E583F50A7501DB
+:1001C00000C3750000E501F5F0E50935F0F501E53E
+:1001D00000F5F0E50A35F0F500E500F502E501F57A
+:1001E00082E502F583E0F50B750E00E50EF50CE5F2
+:1001F0000EF50D750010750127750900750A00755B
+:100200000F00C3E500F5F0E50B95F0F500E500F50E
+:10021000F0E50F45F0F50FC3E501F5F0E50C95F0BD
+:10022000F500E500F5F0E50F45F0F50FC3E509F53C
+:10023000F0E50D95F0F500E500F5F0E50F45F0F57A
+:100240000FC3E50AF5F0E50E95F0F500E500F5F0D1
+:10025000E50F45F0F50F750100750900750A00E519
+:100260000FF500750F01C3750B00E500F5F0E50B08
+:1002700095F0F50B750B00E50BF5F0E50B35F0F59A
+:100280000BE50BF5F0E50F65F0F50FC3750B00E519
+:1002900001F5F0E50B95F0F50B750B00E50BF5F0AE
+:1002A000E50B35F0F50BE50BF5F0E50F65F0F50F17
+:1002B000C3750B00E509F5F0E50B95F0F50B750B33
+:1002C00000E50BF5F0E50B35F0F50BE50BF5F0E58A
+:1002D0000F65F0F50FC3750B00E50AF5F0E50B951A
+:1002E000F0F50B750B00E50BF5F0E50B35F0F50BB4
+:1002F000E50BF5F0E50F65F0F50F750100750900E8
+:10030000750A00750000E50FF5F0E50045F0F50011
+:10031000E501F5F0E50045F0F500E509F5F0E5004B
+:1003200045F0F500E50AF5F0E50045F0F500E500DB
+:100330007002800302036400750000E500F502E529
+:1003400000F503E500F504E500F505E519C0E0E575
+:1003500018C0E0E502F582E503F583E504F500E564
+:1003600005F50122000203380002033800000000F6
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* -Wall is not supposed to trigger -Wsign-compare for C. PR 10604.
+ See also g++.dg/warn/compare1.C. */
+
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+int f(unsigned a, int b)
+{
+ return a < b; /* { dg-bogus "signed and unsigned" } */
+}
--- /dev/null
+/* -Wall is not supposed to trigger -Wsign-compare for C. PR 10604.
+ See also g++.dg/warn/compare1.C. */
+
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+int f(unsigned a, int b)
+{
+ return a < b; /* { dg-bogus "signed and unsigned" } */
+}
--- /dev/null
+:1000000000E50675820FC39582F506E50775830046
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F075E0E3
+:10004000062506F58275E0003507F583E514F075A1
+:10005000E0052506F58275E0003507F583E513F028
+:1000600075E0042506F58275E0003507F583E51295
+:10007000F075E0032506F58275E0003507F583E5A8
+:1000800011F075E0022506F58275E0003507F5836D
+:10009000E510F0E51FF514E51EF512E51BF500E58A
+:1000A0001AF501E519F509E500F513E501F511E586
+:1000B00009F510750C00750D00750E00750F0075B3
+:1000C0000B00750A01750001C3E518F5F0E51C95F4
+:1000D000F0F509E50BF5F0E50B35F0F509E509F567
+:1000E000F0E50055F0F500E500F5F0E50C45F0F51C
+:1000F0000C750001C3E518F5F0E51C95F0F509E570
+:100100000BF5F0E50B35F0F509E51CF5F0E5189574
+:10011000F0F501E50BF5F0E50B35F0F501E501F53E
+:10012000F0E50945F0F509E50AF5F0E50965F0F5B2
+:1001300009E509F5F0E50055F0F500C3E510F5F027
+:10014000E51D95F0F509E50BF5F0E50B35F0F50942
+:10015000E509F5F0E50055F0F500E500F5F0E50CF2
+:1001600045F0F50C750001C3E518F5F0E51C95F0B8
+:10017000F509E50BF5F0E50B35F0F509E51CF5F0B3
+:10018000E51895F0F501E50BF5F0E50B35F0F50117
+:10019000E501F5F0E50945F0F509E50AF5F0E509B1
+:1001A00065F0F509E509F5F0E50055F0F500C3E562
+:1001B00010F5F0E51D95F0F509E50BF5F0E50B35CB
+:1001C000F0F509E51DF5F0E51095F0F501E50BF505
+:1001D000F0E50B35F0F501E501F5F0E50945F0F541
+:1001E00009E50AF5F0E50965F0F509E509F5F0E539
+:1001F0000055F0F500C3E511F5F0E51295F0F509AD
+:10020000E50BF5F0E50B35F0F509E509F5F0E5004E
+:1002100055F0F500E500F5F0E50C45F0F50C75003E
+:1002200001C3E518F5F0E51C95F0F509E50BF5F0CF
+:10023000E50B35F0F509E51CF5F0E51895F0F5014D
+:10024000E50BF5F0E50B35F0F501E501F5F0E50915
+:1002500045F0F509E50AF5F0E50965F0F509E50968
+:10026000F5F0E50055F0F500C3E510F5F0E51D9556
+:10027000F0F509E50BF5F0E50B35F0F509E51DF5B1
+:10028000F0E51095F0F501E50BF5F0E50B35F0F52F
+:1002900001E501F5F0E50945F0F509E50AF5F0E5B8
+:1002A0000965F0F509E509F5F0E50055F0F500C33D
+:1002B000E511F5F0E51295F0F509E50BF5F0E50B24
+:1002C00035F0F509E512F5F0E51195F0F501E50BCE
+:1002D000F5F0E50B35F0F501E501F5F0E50945F040
+:1002E000F509E50AF5F0E50965F0F509E509F5F028
+:1002F000E50055F0F500C3E513F5F0E51495F0F5CC
+:1003000009E50BF5F0E50B35F0F509E509F5F0E544
+:100310000055F0F500E500F5F0E50C45F0F50CE5CD
+:100320000CF502E50DF503E50EF504E50FF5057591
+:10033000E0062506F58275E0003507F583E0F51443
+:1003400075E0052506F58275E0003507F583E0F5D3
+:100350001375E0042506F58275E0003507F583E0A6
+:10036000F51275E0032506F58275E0003507F58383
+:10037000E0F51175E0022506F58275E0003507F518
+:1003800083E0F51075E0002506F58275E00035077D
+:10039000F583E0F508E508C0E075E0012506F58283
+:1003A00075E0003507F583E0F508E508C0E075E085
+:1003B0000F2506F50675E0003507F507E502F5821D
+:1003C000E503F583E504F500E505F50122000000ED
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wsign-compare" } */
+
+int
+f(unsigned short a1, unsigned short a2, unsigned int b)
+{
+ return ((a1+a2)|5) > b ? 2 : 3; /* { dg-bogus "signed and unsigned" } */
+}
+
+int
+g(unsigned short a1, unsigned short a2, unsigned int b)
+{
+ return ((a1+a2)&5) > b ? 2 : 3; /* { dg-bogus "signed and unsigned" } */
+}
+
+int
+h(unsigned short a1, unsigned short a2, unsigned int b)
+{
+ return ((a1+a2)^5) > b ? 2 : 3; /* { dg-bogus "signed and unsigned" } */
+}
+
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wsign-compare" } */
+
+int
+f(unsigned short a1, unsigned short a2, unsigned int b)
+{
+ return ((a1+a2)|5) > b ? 2 : 3; /* { dg-bogus "signed and unsigned" } */
+}
+
+int
+g(unsigned short a1, unsigned short a2, unsigned int b)
+{
+ return ((a1+a2)&5) > b ? 2 : 3; /* { dg-bogus "signed and unsigned" } */
+}
+
+int
+h(unsigned short a1, unsigned short a2, unsigned int b)
+{
+ return ((a1+a2)^5) > b ? 2 : 3; /* { dg-bogus "signed and unsigned" } */
+}
+
--- /dev/null
+:1000000000E506758210C39582F506E50775830045
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F075E0E3
+:10004000072506F58275E0003507F583E515F0759F
+:10005000E0062506F58275E0003507F583E514F026
+:1000600075E0052506F58275E0003507F583E51393
+:10007000F075E0042506F58275E0003507F583E5A7
+:1000800012F075E0032506F58275E0003507F5836B
+:10009000E511F075E0022506F58275E0003507F5FB
+:1000A00083E510F0E51FF500E51EF501E51DF509F6
+:1000B000E51CF50AE51BF515E51AF513750C00E5C9
+:1000C0000CF50B750F00E50FF50EC3750D00E50976
+:1000D000F5F0E50035F0F500E50AF5F0E50135F05D
+:1000E000F501E50EF5F0E50B35F0F509E50FF5F056
+:1000F000E50C35F0F50E750A05750B00750C0075ED
+:100100000D00C3E50AF5F0E50045F0F500E50BF557
+:10011000F0E50145F0F501E50CF5F0E50945F0F5F0
+:1001200009E50DF5F0E50E45F0F50AE500F514E5F5
+:1001300001F512E509F510E50AF511750C00750DCC
+:1001400000750E00750F00750B00750A0175000132
+:10015000C3E511F5F0E51895F0F509E50BF5F0E5C7
+:100160000B35F0F509E509F5F0E50055F0F500E58A
+:1001700000F5F0E50C45F0F50C750001C3E511F54F
+:10018000F0E51895F0F509E50BF5F0E50B35F0F520
+:1001900009E518F5F0E51195F0F501E50BF5F0E549
+:1001A0000B35F0F501E501F5F0E50945F0F509E558
+:1001B0000AF5F0E50965F0F509E509F5F0E5005502
+:1001C000F0F500C3E510F5F0E51995F0F509E50B3C
+:1001D000F5F0E50B35F0F509E509F5F0E50055F02A
+:1001E000F500E500F5F0E50C45F0F50C750001C3F0
+:1001F000E511F5F0E51895F0F509E50BF5F0E50BDF
+:1002000035F0F509E518F5F0E51195F0F501E50B88
+:10021000F5F0E50B35F0F501E501F5F0E50945F000
+:10022000F509E50AF5F0E50965F0F509E509F5F0E8
+:10023000E50055F0F500C3E510F5F0E51995F0F58A
+:1002400009E50BF5F0E50B35F0F509E519F5F0E5F5
+:100250001095F0F501E50BF5F0E50B35F0F501E54E
+:1002600001F5F0E50945F0F509E50AF5F0E5096560
+:10027000F0F509E509F5F0E50055F0F500C3E512E4
+:10028000F5F0E51395F0F509E50BF5F0E50B35F024
+:10029000F509E509F5F0E50055F0F500E500F5F0A4
+:1002A000E50C45F0F50C750001C3E511F5F0E51816
+:1002B00095F0F509E50BF5F0E50B35F0F509E518D6
+:1002C000F5F0E51195F0F501E50BF5F0E50B35F0EE
+:1002D000F501E501F5F0E50945F0F509E50AF5F068
+:1002E000E50965F0F509E509F5F0E50055F0F500DB
+:1002F000C3E510F5F0E51995F0F509E50BF5F0E526
+:100300000B35F0F509E519F5F0E51095F0F501E587
+:100310000BF5F0E50B35F0F501E501F5F0E50945E4
+:10032000F0F509E50AF5F0E50965F0F509E509F5E7
+:10033000F0E50055F0F500C3E512F5F0E51395F092
+:10034000F509E50BF5F0E50B35F0F509E513F5F0EA
+:10035000E51295F0F501E50BF5F0E50B35F0F5014B
+:10036000E501F5F0E50945F0F509E50AF5F0E509DF
+:1003700065F0F509E509F5F0E50055F0F500C3E590
+:1003800014F5F0E51595F0F509E50BF5F0E50B35FD
+:10039000F0F509E509F5F0E50055F0F500E500F5A3
+:1003A000F0E50C45F0F50C750000E50CF5F0E50006
+:1003B00045F0F500E50DF5F0E50045F0F500E50E3A
+:1003C000F5F0E50045F0F500E50FF5F0E50045F046
+:1003D000F500E500700280030204A70075000375B4
+:1003E0000100750900750A00E500F502E501F50355
+:1003F000E509F504E50AF50575E0072506F58275BA
+:10040000E0003507F583E0F51575E0062506F58271
+:1004100075E0003507F583E0F51475E0052506F570
+:100420008275E0003507F583E0F51375E0042506D5
+:10043000F58275E0003507F583E0F51275E00325D8
+:1004400006F58275E0003507F583E0F51175E002E9
+:100450002506F58275E0003507F583E0F51075E0B7
+:10046000002506F58275E0003507F583E0F508E51F
+:1004700008C0E075E0012506F58275E0003507F556
+:1004800083E0F508E508C0E075E0102506F506757F
+:10049000E0003507F507E502F582E503F583E5049D
+:1004A000F500E505F50122007500027501007509EA
+:1004B00000750A000203E800E506758210C3958204
+:1004C000F506E5077583009583F507D0E0F5087517
+:1004D000E0012506F58275E0003507F583E508F0B3
+:1004E000D0E0F50875E0002506F58275E0003507D7
+:1004F000F583E508F075E0072506F58275E000351F
+:1005000007F583E515F075E0062506F58275E00030
+:100510003507F583E514F075E0052506F58275E0ED
+:10052000003507F583E513F075E0042506F58275BF
+:10053000E0003507F583E512F075E0032506F58246
+:1005400075E0003507F583E511F075E0022506F545
+:100550008275E0003507F583E510F0E51FF500E54D
+:100560001EF501E51DF509E51CF50AE51BF515E588
+:100570001AF513750C00E50CF50B750F00E50FF57A
+:100580000EC3750D00E509F5F0E50035F0F500E561
+:100590000AF5F0E50135F0F501E50EF5F0E50B356E
+:1005A000F0F509E50FF5F0E50C35F0F50E750A05E7
+:1005B000750B00750C00750D00C3E50AF5F0E5003C
+:1005C00055F0F500E50BF5F0E50155F0F501E50C0A
+:1005D000F5F0E50955F0F509E50DF5F0E50E55F0F6
+:1005E000F50AE500F514E501F512E509F510E50A4F
+:1005F000F511750C00750D00750E00750F00750B6B
+:1006000000750A01750001C3E511F5F0E51895F0D4
+:10061000F509E50BF5F0E50B35F0F509E509F5F021
+:10062000E50055F0F500E500F5F0E50C45F0F50CBA
+:10063000750001C3E511F5F0E51895F0F509E50B36
+:10064000F5F0E50B35F0F509E518F5F0E51195F055
+:10065000F501E50BF5F0E50B35F0F501E501F5F0F9
+:10066000E50945F0F509E50AF5F0E50965F0F50954
+:10067000E509F5F0E50055F0F500C3E510F5F0E506
+:100680001995F0F509E50BF5F0E50B35F0F509E501
+:1006900009F5F0E50055F0F500E500F5F0E50C454D
+:1006A000F0F50C750001C3E511F5F0E51895F0F5CE
+:1006B00009E50BF5F0E50B35F0F509E518F5F0E582
+:1006C0001195F0F501E50BF5F0E50B35F0F501E5D9
+:1006D00001F5F0E50945F0F509E50AF5F0E50965EC
+:1006E000F0F509E509F5F0E50055F0F500C3E51072
+:1006F000F5F0E51995F0F509E50BF5F0E50B35F0AA
+:10070000F509E519F5F0E51095F0F501E50BF5F0C3
+:10071000E50B35F0F501E501F5F0E50945F0F509E2
+:10072000E50AF5F0E50965F0F509E509F5F0E500FC
+:1007300055F0F500C3E512F5F0E51395F0F509E580
+:100740000BF5F0E50B35F0F509E509F5F0E5005599
+:10075000F0F500E500F5F0E50C45F0F50C7500014D
+:10076000C3E511F5F0E51895F0F509E50BF5F0E5B1
+:100770000B35F0F509E518F5F0E51195F0F501E513
+:100780000BF5F0E50B35F0F501E501F5F0E5094570
+:10079000F0F509E50AF5F0E50965F0F509E509F573
+:1007A000F0E50055F0F500C3E510F5F0E51995F01A
+:1007B000F509E50BF5F0E50B35F0F509E519F5F070
+:1007C000E51095F0F501E50BF5F0E50B35F0F501D9
+:1007D000E501F5F0E50945F0F509E50AF5F0E5096B
+:1007E00065F0F509E509F5F0E50055F0F500C3E51C
+:1007F00012F5F0E51395F0F509E50BF5F0E50B358D
+:10080000F0F509E513F5F0E51295F0F501E50BF5C6
+:10081000F0E50B35F0F501E501F5F0E50945F0F5FA
+:1008200009E50AF5F0E50965F0F509E509F5F0E5F2
+:100830000055F0F500C3E514F5F0E51595F0F50960
+:10084000E50BF5F0E50B35F0F509E509F5F0E50008
+:1008500055F0F500E500F5F0E50C45F0F50C7500F8
+:1008600000E50CF5F0E50045F0F500E50DF5F0E5E7
+:100870000045F0F500E50EF5F0E50045F0F500E582
+:100880000FF5F0E50045F0F500E500700280030289
+:10089000095E00750003750100750900750A00E521
+:1008A00000F502E501F503E509F504E50AF505752E
+:1008B000E0072506F58275E0003507F583E0F515BC
+:1008C00075E0062506F58275E0003507F583E0F54D
+:1008D0001475E0052506F58275E0003507F583E01F
+:1008E000F51375E0042506F58275E0003507F583FC
+:1008F000E0F51275E0032506F58275E0003507F591
+:1009000083E0F51175E0022506F58275E0003507F4
+:10091000F583E0F51075E0002506F58275E00035F9
+:1009200007F583E0F508E508C0E075E0012506F568
+:100930008275E0003507F583E0F508E508C0E0754D
+:10094000E0102506F50675E0003507F507E502F528
+:1009500082E503F583E504F500E505F50122007560
+:100960000002750100750900750A0002089F00E584
+:1009700006758210C39582F506E507758300958399
+:10098000F507D0E0F50875E0012506F58275E00071
+:100990003507F583E508F0D0E0F50875E000250699
+:1009A000F58275E0003507F583E508F075E0072569
+:1009B00006F58275E0003507F583E515F075E0066C
+:1009C0002506F58275E0003507F583E514F075E03E
+:1009D000052506F58275E0003507F583E513F0750A
+:1009E000E0042506F58275E0003507F583E512F091
+:1009F00075E0032506F58275E0003507F583E511FE
+:100A0000F075E0022506F58275E0003507F583E50F
+:100A100010F0E51FF500E51EF501E51DF509E51CE3
+:100A2000F50AE51BF515E51AF513750C00E50CF54F
+:100A30000B750F00E50FF50EC3750D00E509F5F018
+:100A4000E50035F0F500E50AF5F0E50135F0F501D2
+:100A5000E50EF5F0E50B35F0F509E50FF5F0E50CE1
+:100A600035F0F50E750A05750B00750C00750D0057
+:100A7000C3E50AF5F0E50065F0F500E50BF5F0E5F6
+:100A80000165F0F501E50CF5F0E50965F0F509E51E
+:100A90000DF5F0E50E65F0F50AE500F514E501F554
+:100AA00012E509F510E50AF511750C00750D0075D4
+:100AB0000E00750F00750B00750A01750001C3E586
+:100AC00011F5F0E51895F0F509E50BF5F0E50B35B6
+:100AD000F0F509E509F5F0E50055F0F500E500F55C
+:100AE000F0E50C45F0F50C750001C3E511F5F0E5F6
+:100AF0001895F0F509E50BF5F0E50B35F0F509E58E
+:100B000018F5F0E51195F0F501E50BF5F0E50B357D
+:100B1000F0F501E501F5F0E50945F0F509E50AF51F
+:100B2000F0E50965F0F509E509F5F0E50055F0F5A2
+:100B300000C3E510F5F0E51995F0F509E50BF5F0C2
+:100B4000E50B35F0F509E509F5F0E50055F0F500A0
+:100B5000E500F5F0E50C45F0F50C750001C3E51175
+:100B6000F5F0E51895F0F509E50BF5F0E50B35F036
+:100B7000F509E518F5F0E51195F0F501E50BF5F04F
+:100B8000E50B35F0F501E501F5F0E50945F0F5096E
+:100B9000E50AF5F0E50965F0F509E509F5F0E50088
+:100BA00055F0F500C3E510F5F0E51995F0F509E508
+:100BB0000BF5F0E50B35F0F509E519F5F0E51095C5
+:100BC000F0F501E50BF5F0E50B35F0F501E501F584
+:100BD000F0E50945F0F509E50AF5F0E50965F0F5F8
+:100BE00009E509F5F0E50055F0F500C3E512F5F06B
+:100BF000E51395F0F509E50BF5F0E50B35F0F50992
+:100C0000E509F5F0E50055F0F500E500F5F0E50C37
+:100C100045F0F50C750001C3E511F5F0E51895F008
+:100C2000F509E50BF5F0E50B35F0F509E518F5F0FC
+:100C3000E51195F0F501E50BF5F0E50B35F0F50163
+:100C4000E501F5F0E50945F0F509E50AF5F0E509F6
+:100C500065F0F509E509F5F0E50055F0F500C3E5A7
+:100C600010F5F0E51995F0F509E50BF5F0E50B3514
+:100C7000F0F509E519F5F0E51095F0F501E50BF54E
+:100C8000F0E50B35F0F501E501F5F0E50945F0F586
+:100C900009E50AF5F0E50965F0F509E509F5F0E57E
+:100CA0000055F0F500C3E512F5F0E51395F0F509F0
+:100CB000E50BF5F0E50B35F0F509E513F5F0E51278
+:100CC00095F0F501E50BF5F0E50B35F0F501E501E3
+:100CD000F5F0E50945F0F509E50AF5F0E50965F0F7
+:100CE000F509E509F5F0E50055F0F500C3E514F563
+:100CF000F0E51595F0F509E50BF5F0E50B35F0F5A8
+:100D000009E509F5F0E50055F0F500E500F5F0E539
+:100D10000C45F0F50C750000E50CF5F0E50045F02C
+:100D2000F500E50DF5F0E50045F0F500E50EF5F010
+:100D3000E50045F0F500E50FF5F0E50045F0F500BC
+:100D4000E50070028003020E1500750003750100B6
+:100D5000750900750A00E500F502E501F503E509EE
+:100D6000F504E50AF50575E0072506F58275E0004E
+:100D70003507F583E0F51575E0062506F58275E083
+:100D8000003507F583E0F51475E0052506F5827555
+:100D9000E0003507F583E0F51375E0042506F582DC
+:100DA00075E0003507F583E0F51275E0032506F5DB
+:100DB0008275E0003507F583E0F51175E002250640
+:100DC000F58275E0003507F583E0F51075E0002544
+:100DD00006F58275E0003507F583E0F508E508C003
+:100DE000E075E0012506F58275E0003507F583E042
+:100DF000F508E508C0E075E0102506F50675E00089
+:100E00003507F507E502F582E503F583E504F5000E
+:100E1000E505F501220075000275010075090075F0
+:100E20000A00020D56000000000000000000000053
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for a bogus warning on comparison between signed and unsigned.
+ This was inspired by code in gcc. This testcase is identical to
+ compare1.c except that we use -fshort-enums here and do not expect
+ a warning from case 4. */
+
+/* { dg-do compile } */
+/* { dg-options "-fshort-enums -Wsign-compare" } */
+
+int tf = 1;
+
+/* This enumeration has an explicit negative value and is therefore signed. */
+enum mm1
+{
+ VOID, SI, DI, MAX = -1
+};
+
+/* This enumeration fits entirely in a signed int, but is unsigned anyway. */
+enum mm2
+{
+ VOID2, SI2, DI2, MAX2
+};
+
+int f(enum mm1 x)
+{
+ return x == (tf?DI:SI); /* { dg-bogus "signed and unsigned" "case 1" } */
+}
+
+int g(enum mm1 x)
+{
+ return x == (tf?DI:-1); /* { dg-bogus "signed and unsigned" "case 2" } */
+}
+
+int h(enum mm2 x)
+{
+ return x == (tf?DI2:SI2); /* { dg-bogus "signed and unsigned" "case 3" } */
+}
+
+int i(enum mm2 x)
+{
+ return x == (tf?DI2:-1); /* { dg-bogus "signed and unsigned" "case 4" } */
+}
--- /dev/null
+/* Test for a bogus warning on comparison between signed and unsigned.
+ This was inspired by code in gcc. This testcase is identical to
+ compare1.c except that we use -fshort-enums here and do not expect
+ a warning from case 4. */
+
+/* { dg-do compile } */
+/* { dg-options "-fshort-enums -Wsign-compare" } */
+
+int tf = 1;
+
+/* This enumeration has an explicit negative value and is therefore signed. */
+enum mm1
+{
+ VOID, SI, DI, MAX = -1
+};
+
+/* This enumeration fits entirely in a signed int, but is unsigned anyway. */
+enum mm2
+{
+ VOID2, SI2, DI2, MAX2
+};
+
+int f(enum mm1 x)
+{
+ return x == (tf?DI:SI); /* { dg-bogus "signed and unsigned" "case 1" } */
+}
+
+int g(enum mm1 x)
+{
+ return x == (tf?DI:-1); /* { dg-bogus "signed and unsigned" "case 2" } */
+}
+
+int h(enum mm2 x)
+{
+ return x == (tf?DI2:SI2); /* { dg-bogus "signed and unsigned" "case 3" } */
+}
+
+int i(enum mm2 x)
+{
+ return x == (tf?DI2:-1); /* { dg-bogus "signed and unsigned" "case 4" } */
+}
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F518D0E0F519E515F50E54
+:10002000E514F50F900000E582F509900000E583E6
+:10003000F50A750100C3750000E501F5F0E5093525
+:10004000F0F501E500F5F0E50A35F0F500E500F51D
+:1000500002E501F582E502F583E0F50B750101C3C8
+:10006000750000E501F5F0E50935F0F501E500F56D
+:10007000F0E50A35F0F500E500F502E501F582E569
+:1000800002F583E0F50C750102C3750000E501F58A
+:10009000F0E50935F0F501E500F5F0E50A35F0F594
+:1000A00000E500F502E501F582E502F583E0F50DD6
+:1000B000750103C3750000E501F5F0E50935F0F5BC
+:1000C00001E500F5F0E50A35F0F500E500F502E59B
+:1000D00001F582E502F583E0F501750000E50BF519
+:1000E000F0E50045F0F500E50CF5F0E50045F0F52C
+:1000F00000E50DF5F0E50045F0F500E501F5F0E56A
+:100100000045F0F500E5007002800302025E007514
+:100110000001750100750900750A00750B00C3E543
+:1001200000F5F0E51F95F0F500E500F5F0E50B456D
+:10013000F0F50BC3E501F5F0E51E95F0F500E500DF
+:10014000F5F0E50B45F0F50BC3E509F5F0E51D9578
+:10015000F0F500E500F5F0E50B45F0F50BC3E50A19
+:10016000F5F0E51C95F0F500E500F5F0E50B45F040
+:10017000F50B750100750900750A00E50BF50075B2
+:100180000B01C3750C00E500F5F0E50C95F0F50CDE
+:10019000750C00E50CF5F0E50C35F0F50CE50CF50B
+:1001A000F0E50B65F0F50BC3750C00E501F5F0E526
+:1001B0000C95F0F50C750C00E50CF5F0E50C35F040
+:1001C000F50CE50CF5F0E50B65F0F50BC3750C00CF
+:1001D000E509F5F0E50C95F0F50C750C00E50CF56E
+:1001E000F0E50C35F0F50CE50CF5F0E50B65F0F5F8
+:1001F0000BC3750C00E50AF5F0E50C95F0F50C75F0
+:100200000C00E50CF5F0E50C35F0F50CE50CF5F01F
+:10021000E50B65F0F50B750100750900750A00E541
+:100220000BF502E501F503E509F504E50AF505E539
+:100230000EF515E50FF514E519C0E0E518C0E075F9
+:10024000E0042506F50675E0003507F507E502F53B
+:1002500082E503F583E504F500E505F50122007567
+:100260000002750100750900750A0002011B00E516
+:1002700006758204C39582F506E5077583009583AC
+:10028000F507D0E0F518D0E0F519E515F50EE51401
+:10029000F50F900000E582F509900000E583F50A6E
+:1002A000750100C3750000E501F5F0E50935F0F5CD
+:1002B00001E500F5F0E50A35F0F500E500F502E5A9
+:1002C00001F582E502F583E0F50B750101C37500C8
+:1002D00000E501F5F0E50935F0F501E500F5F0E59B
+:1002E0000A35F0F500E500F502E501F582E502F5D5
+:1002F00083E0F50C750102C3750000E501F5F0E53A
+:100300000935F0F501E500F5F0E50A35F0F500E511
+:1003100000F502E501F582E502F583E0F50D7501D2
+:1003200003C3750000E501F5F0E50935F0F501E5D9
+:1003300000F5F0E50A35F0F500E500F502E501F518
+:1003400082E502F583E0F501750000E50BF5F0E5C7
+:100350000045F0F500E50CF5F0E50045F0F500E5A9
+:100360000DF5F0E50045F0F500E501F5F0E5004597
+:10037000F0F500E5007002800302050C0075000135
+:10038000750100750900750A00E500F4F500E50146
+:10039000F4F501E509F4F509E50AF4F50AD3750B5E
+:1003A00000E50BF5F0E50035F0F500E50BF5F0E5BF
+:1003B0000135F0F501E50BF5F0E50935F0F509E556
+:1003C0000BF5F0E50A35F0F50A750B00C3E500F50D
+:1003D000F0E51F95F0F500E500F5F0E50B45F0F5CB
+:1003E0000BC3E501F5F0E51E95F0F500E500F5F02D
+:1003F000E50B45F0F50BC3E509F5F0E51D95F0F5C6
+:1004000000E500F5F0E50B45F0F50BC3E50AF5F066
+:10041000E51C95F0F500E500F5F0E50B45F0F50B72
+:10042000750100750900750A00E50BF500750B01F3
+:10043000C3750C00E500F5F0E50C95F0F50C750CB6
+:1004400000E50CF5F0E50C35F0F50CE50CF5F0E504
+:100450000B65F0F50BC3750C00E501F5F0E50C95A7
+:10046000F0F50C750C00E50CF5F0E50C35F0F50C2D
+:10047000E50CF5F0E50B65F0F50BC3750C00E5092F
+:10048000F5F0E50C95F0F50C750C00E50CF5F0E5D4
+:100490000C35F0F50CE50CF5F0E50B65F0F50BC34C
+:1004A000750C00E50AF5F0E50C95F0F50C750C00FF
+:1004B000E50CF5F0E50C35F0F50CE50CF5F0E50B89
+:1004C00065F0F50B750100750900750A00E50BF57F
+:1004D00002E501F503E509F504E50AF505E50EF584
+:1004E00015E50FF514E519C0E0E518C0E075E00466
+:1004F0002506F50675E0003507F507E502F582E506
+:1005000003F583E504F500E505F501220075000219
+:10051000750100750900750A000203C900E506753A
+:100520008204C39582F506E5077583009583F50778
+:10053000D0E0F518D0E0F519E515F50EE514F50F46
+:10054000900000E582F509900000E583F50A750149
+:1005500000C3750000E501F5F0E50935F0F501E5AA
+:1005600000F5F0E50A35F0F500E500F502E501F5E6
+:1005700082E502F583E0F50B750101C3750000E526
+:1005800001F5F0E50935F0F501E500F5F0E50A358E
+:10059000F0F500E500F502E501F582E502F583E0FE
+:1005A000F50C750102C3750000E501F5F0E50935AC
+:1005B000F0F501E500F5F0E50A35F0F500E500F5A8
+:1005C00002E501F582E502F583E0F50D750103C34F
+:1005D000750000E501F5F0E50935F0F501E500F5F8
+:1005E000F0E50A35F0F500E500F502E501F582E5F4
+:1005F00002F583E0F501750000E50BF5F0E5004537
+:10060000F0F500E50CF5F0E50045F0F500E50DF539
+:10061000F0E50045F0F500E501F5F0E50045F0F501
+:1006200000E5007002800302077A00750001750181
+:1006300000750900750A00750B00C3E500F5F0E5CB
+:100640001F95F0F500E500F5F0E50B45F0F50BC35F
+:10065000E501F5F0E51E95F0F500E500F5F0E50B98
+:1006600045F0F50BC3E509F5F0E51D95F0F500E55E
+:1006700000F5F0E50B45F0F50BC3E50AF5F0E51CD8
+:1006800095F0F500E500F5F0E50B45F0F50B75018B
+:1006900000750900750A00E50BF500750B01C375BF
+:1006A0000C00E500F5F0E50C95F0F50C750C00E597
+:1006B0000CF5F0E50C35F0F50CE50CF5F0E50B6507
+:1006C000F0F50BC3750C00E501F5F0E50C95F0F5C0
+:1006D0000C750C00E50CF5F0E50C35F0F50CE50CAF
+:1006E000F5F0E50B65F0F50BC3750C00E509F5F0C9
+:1006F000E50C95F0F50C750C00E50CF5F0E50C3506
+:10070000F0F50CE50CF5F0E50B65F0F50BC3750C99
+:1007100000E50AF5F0E50C95F0F50C750C00E50C1C
+:10072000F5F0E50C35F0F50CE50CF5F0E50B65F0B2
+:10073000F50B750100750900750A00E50BF502E57A
+:1007400001F503E509F504E50AF505E50EF515E5FE
+:100750000FF514E519C0E0E518C0E075E0042506C2
+:10076000F50675E0003507F507E502F582E503F5C6
+:1007700083E504F500E505F5012200750002750129
+:1007800000750900750A0002063700E50675820447
+:10079000C39582F506E5077583009583F507D0E0DC
+:1007A000F518D0E0F519E515F50EE514F50F9000F4
+:1007B00000E582F509900000E583F50A750100C3A4
+:1007C000750000E501F5F0E50935F0F501E500F506
+:1007D000F0E50A35F0F500E500F502E501F582E502
+:1007E00002F583E0F50B750101C3750000E501F525
+:1007F000F0E50935F0F501E500F5F0E50A35F0F52D
+:1008000000E500F502E501F582E502F583E0F50C6F
+:10081000750102C3750000E501F5F0E50935F0F555
+:1008200001E500F5F0E50A35F0F500E500F502E533
+:1008300001F582E502F583E0F50D750103C375004E
+:1008400000E501F5F0E50935F0F501E500F5F0E525
+:100850000A35F0F500E500F502E501F582E502F55F
+:1008600083E0F501750000E50BF5F0E50045F0F5D6
+:1008700000E50CF5F0E50045F0F500E50DF5F0E5D7
+:100880000045F0F500E501F5F0E50045F0F500E57F
+:100890000070028003020A280075000175010075CE
+:1008A0000900750A00E500F4F500E501F4F501E53D
+:1008B00009F4F509E50AF4F50AD3750B00E50BF523
+:1008C000F0E50035F0F500E50BF5F0E50135F0F564
+:1008D00001E50BF5F0E50935F0F509E50BF5F0E577
+:1008E0000A35F0F50A750B00C3E500F5F0E51F9534
+:1008F000F0F500E500F5F0E50B45F0F50BC3E5017B
+:10090000F5F0E51E95F0F500E500F5F0E50B45F096
+:10091000F50BC3E509F5F0E51D95F0F500E500F5EB
+:10092000F0E50B45F0F50BC3E50AF5F0E51C95F095
+:10093000F500E500F5F0E50B45F0F50B75010075E8
+:100940000900750A00E50BF500750B01C3750C0075
+:10095000E500F5F0E50C95F0F50C750C00E50CF5EF
+:10096000F0E50C35F0F50CE50CF5F0E50B65F0F570
+:100970000BC3750C00E501F5F0E50C95F0F50C7571
+:100980000C00E50CF5F0E50C35F0F50CE50CF5F098
+:10099000E50B65F0F50BC3750C00E509F5F0E50C0A
+:1009A00095F0F50C750C00E50CF5F0E50C35F0F55F
+:1009B0000CE50CF5F0E50B65F0F50BC3750C00E5E7
+:1009C0000AF5F0E50C95F0F50C750C00E50CF5F06A
+:1009D000E50C35F0F50CE50CF5F0E50B65F0F50BE5
+:1009E000750100750900750A00E50BF502E501F5D2
+:1009F00003E509F504E50AF505E50EF515E50FF53E
+:100A000014E519C0E0E518C0E075E0042506F50618
+:100A100075E0003507F507E502F582E503F583E5A6
+:100A200004F500E505F50122007500027501007569
+:100A30000900750A000208E500000000000000003F
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Copyright (C) 2001 Free Software Foundation, Inc. */
+
+/* { dg-do compile } */
+
+/* Test we output an error for concatenation of artificial strings.
+
+ Neil Booth, 10 Dec 2001. */
+
+void foo ()
+{
+ char s1[] = __FUNCTION__"."; /* { dg-error "(parse|syntax|expected|invalid|array)" } */
+ char s2[] = __PRETTY_FUNCTION__".";/* { dg-error "(parse|syntax|expected|invalid|array)" } */
+ char s3[] = "."__FUNCTION__; /* { dg-error "(parse|syntax|expected|invalid)" } */
+ char s4[] = "."__PRETTY_FUNCTION__;/* { dg-error "(parse|syntax|expected|invalid)" } */
+ char s5[] = ".""."; /* No error. */
+}
--- /dev/null
+/* Copyright (C) 2001 Free Software Foundation, Inc. */
+
+/* { dg-do compile } */
+
+/* Test we output an error for concatenation of artificial strings.
+
+ Neil Booth, 10 Dec 2001. */
+
+void foo ()
+{
+ char s1[] = __FUNCTION__"."; /* { dg-error "(parse|syntax|expected|invalid|array)" } */
+ char s2[] = __PRETTY_FUNCTION__".";/* { dg-error "(parse|syntax|expected|invalid|array)" } */
+ char s3[] = "."__FUNCTION__; /* { dg-error "(parse|syntax|expected|invalid)" } */
+ char s4[] = "."__PRETTY_FUNCTION__;/* { dg-error "(parse|syntax|expected|invalid)" } */
+ char s5[] = ".""."; /* No error. */
+}
--- /dev/null
+:1000000000E506758217C39582F506E5077583003E
+:100010009583F507D0E0F51AD0E0F51BE511F5184A
+:10002000E510F519E506F50AE507F501750900C3C0
+:10003000750000E509F5F0E50A35F0F510E500F585
+:10004000F0E50135F0F511750000750100750C0142
+:10005000750D00750E00750F00C3750900E500F5FC
+:10006000F0E50CA4F50BE500F5F0E50CA4E5F0F5E2
+:100070000AE50BF5F0E50935F0F509E501F5F0E5E0
+:100080000CA4F50BE501F5F0E50CA4E5F0F501E5B0
+:100090000BF5F0E50A35F0F50AC3C3750100E50973
+:1000A000F5F0E50E35F0F50EE50AF5F0E50F35F063
+:1000B000F50FC3750A00E500F5F0E50DA4F50BE5B5
+:1000C00000F5F0E50DA4E5F0F501E50BF5F0E50A26
+:1000D00035F0F50A750900C3C3750000E509F5F0B0
+:1000E000E50E35F0F50EE50AF5F0E50F35F0F50F04
+:1000F000C3750900750A00C3C3750000E509F5F072
+:10010000E50E35F0F50EE50AF5F0E50F35F0F50FE3
+:10011000C3750900750A00C3C3750000E509F5F051
+:10012000E50E35F0F50EE50AF5F0E50F35F0F50FC3
+:10013000C3750000E50EF5F0E51035F0F500E50FAC
+:10014000F5F0E51135F0F50B750A66750900C37514
+:100150000100E509F5F0E50035F0F500E501F5F001
+:10016000E50B35F0F501E50AF503E501F502E500DB
+:10017000F582E502F583E503F0E506F50AE507F506
+:1001800001750900C3750000E509F5F0E50A35F0D1
+:10019000F510E500F5F0E50135F0F5117500017594
+:1001A0000100750C01750D00750E00750F00C3750B
+:1001B0000900E500F5F0E50CA4F50BE500F5F0E528
+:1001C0000CA4E5F0F50AE50BF5F0E50935F0F509C5
+:1001D000E501F5F0E50CA4F50BE501F5F0E50CA45F
+:1001E000E5F0F501E50BF5F0E50A35F0F50AC3C3D6
+:1001F000750100E509F5F0E50E35F0F50EE50AF5B7
+:10020000F0E50F35F0F50FC3750A00E500F5F0E5F0
+:100210000DA4F50BE500F5F0E50DA4E5F0F501E51D
+:100220000BF5F0E50A35F0F50A750900C3C3750052
+:1002300000E509F5F0E50E35F0F50EE50AF5F0E517
+:100240000F35F0F50FC3750900750A00C3C37500BB
+:1002500000E509F5F0E50E35F0F50EE50AF5F0E5F7
+:100260000F35F0F50FC3750900750A00C3C375009B
+:1002700000E509F5F0E50E35F0F50EE50AF5F0E5D7
+:100280000F35F0F50FC3750000E50EF5F0E51035FC
+:10029000F0F500E50FF5F0E51135F0F50B750A6F97
+:1002A000750900C3750100E509F5F0E50035F0F5C5
+:1002B00000E501F5F0E50B35F0F501E50AF503E59C
+:1002C00001F502E500F582E502F583E503F0E506B8
+:1002D000F50AE507F501750900C3750000E509F5A4
+:1002E000F0E50A35F0F510E500F5F0E50135F0F53B
+:1002F00011750002750100750C01750D00750E0079
+:10030000750F00C3750900E500F5F0E50CA4F50BC9
+:10031000E500F5F0E50CA4E5F0F50AE50BF5F0E5F0
+:100320000935F0F509E501F5F0E50CA4F50BE5015B
+:10033000F5F0E50CA4E5F0F501E50BF5F0E50A357F
+:10034000F0F50AC3C3750100E509F5F0E50E35F0D7
+:10035000F50EE50AF5F0E50F35F0F50FC3750A0067
+:10036000E500F5F0E50DA4F50BE500F5F0E50DA4CD
+:10037000E5F0F501E50BF5F0E50A35F0F50A75094C
+:1003800000C3C3750000E509F5F0E50E35F0F50E84
+:10039000E50AF5F0E50F35F0F50FC3750900750AAC
+:1003A00000C3C3750000E509F5F0E50E35F0F50E64
+:1003B000E50AF5F0E50F35F0F50FC3750900750A8C
+:1003C00000C3C3750000E509F5F0E50E35F0F50E44
+:1003D000E50AF5F0E50F35F0F50FC3750000E50E01
+:1003E000F5F0E51035F0F500E50FF5F0E51135F025
+:1003F000F50B750A6F750900C3750100E509F5F085
+:10040000E50035F0F500E501F5F0E50B35F0F50117
+:10041000E50AF503E501F502E500F582E502F5835D
+:10042000E503F0E506F50AE507F501750900C37572
+:100430000000E509F5F0E50A35F0F510E500F5F006
+:10044000E50135F0F511750003750100750C0175B6
+:100450000D00750E00750F00C3750900E500F5F07D
+:10046000E50CA4F50BE500F5F0E50CA4E5F0F50AC4
+:10047000E50BF5F0E50935F0F509E501F5F0E50CDA
+:10048000A4F50BE501F5F0E50CA4E5F0F501E50BAD
+:10049000F5F0E50A35F0F50AC3C3750100E509F585
+:1004A000F0E50E35F0F50EE50AF5F0E50F35F0F55F
+:1004B0000FC3750A00E500F5F0E50DA4F50BE500A6
+:1004C000F5F0E50DA4E5F0F501E50BF5F0E50A35ED
+:1004D000F0F50A750900C3C3750000E509F5F0E5FC
+:1004E0000E35F0F50EE50AF5F0E50F35F0F50FC322
+:1004F000750900750A00C3C3750000E509F5F0E54C
+:100500000E35F0F50EE50AF5F0E50F35F0F50FC301
+:10051000750900750A00C3C3750000E509F5F0E52B
+:100520000E35F0F50EE50AF5F0E50F35F0F50FC3E1
+:10053000750000E50EF5F0E51035F0F500E50FF576
+:10054000F0E51135F0F50B750A2E750900C375013C
+:1005500000E509F5F0E50035F0F500E501F5F0E519
+:100560000B35F0F501E50AF503E501F502E500F5C7
+:1005700082E502F583E503F0E506F50AE507F501F6
+:10058000750900C3750000E509F5F0E50A35F0F5D9
+:1005900010E500F5F0E50135F0F511750004750181
+:1005A00000750C01750D00750E00750F00C37509FF
+:1005B00000E500F5F0E50CA4F50BE500F5F0E50C21
+:1005C000A4E5F0F50AE50BF5F0E50935F0F509E5E8
+:1005D00001F5F0E50CA4F50BE501F5F0E50CA4E55B
+:1005E000F0F501E50BF5F0E50A35F0F50AC3C37542
+:1005F0000100E509F5F0E50E35F0F50EE50AF5F038
+:10060000E50F35F0F50FC3750A00E500F5F0E50DCF
+:10061000A4F50BE500F5F0E50DA4E5F0F501E50B1B
+:10062000F5F0E50A35F0F50A750900C3C375000059
+:10063000E509F5F0E50E35F0F50EE50AF5F0E50F04
+:1006400035F0F50FC3750900750A00C3C3750000C6
+:10065000E509F5F0E50E35F0F50EE50AF5F0E50FE4
+:1006600035F0F50FC3750900750A00C3C3750000A6
+:10067000E509F5F0E50E35F0F50EE50AF5F0E50FC4
+:1006800035F0F50FC3750000E50EF5F0E51035F017
+:10069000F500E50FF5F0E51135F0F50B750A00757D
+:1006A0000900C3750100E509F5F0E50035F0F50036
+:1006B000E501F5F0E50B35F0F501E50AF503E50197
+:1006C000F502E500F582E502F583E503F0E506F5C0
+:1006D0000AE507F501750905C3750000E509F5F0A0
+:1006E000E50A35F0F510E500F5F0E50135F0F51116
+:1006F000750000750100750C01750D00750E007513
+:100700000F00C3750900E500F5F0E50CA4F50BE555
+:1007100000F5F0E50CA4E5F0F50AE50BF5F0E509C8
+:1007200035F0F509E501F5F0E50CA4F50BE501F56B
+:10073000F0E50CA4E5F0F501E50BF5F0E50A35F080
+:10074000F50AC3C3750100E509F5F0E50E35F0F5CE
+:100750000EE50AF5F0E50F35F0F50FC3750A00E573
+:1007600000F5F0E50DA4F50BE500F5F0E50DA4E5C9
+:10077000F0F501E50BF5F0E50A35F0F50A7509002D
+:10078000C3C3750000E509F5F0E50E35F0F50EE59B
+:100790000AF5F0E50F35F0F50FC3750900750A008D
+:1007A000C3C3750000E509F5F0E50E35F0F50EE57B
+:1007B0000AF5F0E50F35F0F50FC3750900750A006D
+:1007C000C3C3750000E509F5F0E50E35F0F50EE55B
+:1007D0000AF5F0E50F35F0F50FC3750000E50EF5ED
+:1007E000F0E51035F0F500E50FF5F0E51135F0F521
+:1007F0000B750A66750900C3750100E509F5F0E59A
+:100800000035F0F500E501F5F0E50B35F0F501E513
+:100810000AF503E501F502E500F582E502F583E559
+:1008200003F0E506F50AE507F501750905C375004E
+:1008300000E509F5F0E50A35F0F510E500F5F0E51D
+:100840000135F0F511750001750100750C01750D8C
+:1008500000750E00750F00C3750900E500F5F0E5A1
+:100860000CA4F50BE500F5F0E50CA4E5F0F50AE5C0
+:100870000BF5F0E50935F0F509E501F5F0E50CA417
+:10088000F50BE501F5F0E50CA4E5F0F501E50BF558
+:10089000F0E50A35F0F50AC3C3750100E509F5F086
+:1008A000E50E35F0F50EE50AF5F0E50F35F0F50F3C
+:1008B000C3750A00E500F5F0E50DA4F50BE500F5BC
+:1008C000F0E50DA4E5F0F501E50BF5F0E50A35F0EE
+:1008D000F50A750900C3C3750000E509F5F0E50EDA
+:1008E00035F0F50EE50AF5F0E50F35F0F50FC375B7
+:1008F0000900750A00C3C3750000E509F5F0E50EAF
+:1009000035F0F50EE50AF5F0E50F35F0F50FC37596
+:100910000900750A00C3C3750000E509F5F0E50E8E
+:1009200035F0F50EE50AF5F0E50F35F0F50FC37576
+:100930000000E50EF5F0E51035F0F500E50FF5F0F7
+:10094000E51135F0F50B750A6F750900C3750100E7
+:10095000E509F5F0E50035F0F500E501F5F0E50B0A
+:1009600035F0F501E50AF503E501F502E500F5824C
+:10097000E502F583E503F0E506F50AE507F50175FF
+:100980000905C3750000E509F5F0E50A35F0F51035
+:10099000E500F5F0E50135F0F5117500027501008F
+:1009A000750C01750D00750E00750F00C3750900FB
+:1009B000E500F5F0E50CA4F50BE500F5F0E50CA479
+:1009C000E5F0F50AE50BF5F0E50935F0F509E50187
+:1009D000F5F0E50CA4F50BE501F5F0E50CA4E5F068
+:1009E000F501E50BF5F0E50A35F0F50AC3C375012D
+:1009F00000E509F5F0E50E35F0F50EE50AF5F0E550
+:100A00000F35F0F50FC3750A00E500F5F0E50DA40C
+:100A1000F50BE500F5F0E50DA4E5F0F501E50BF5C6
+:100A2000F0E50A35F0F50A750900C3C3750000E565
+:100A300009F5F0E50E35F0F50EE50AF5F0E50F35B0
+:100A4000F0F50FC3750900750A00C3C3750000E512
+:100A500009F5F0E50E35F0F50EE50AF5F0E50F3590
+:100A6000F0F50FC3750900750A00C3C3750000E5F2
+:100A700009F5F0E50E35F0F50EE50AF5F0E50F3570
+:100A8000F0F50FC3750000E50EF5F0E51035F0F553
+:100A900000E50FF5F0E51135F0F50B750A6F7509F6
+:100AA00000C3750100E509F5F0E50035F0F500E556
+:100AB00001F5F0E50B35F0F501E50AF503E501F583
+:100AC00002E500F582E502F583E503F0E506F50AA7
+:100AD000E507F501750905C3750000E509F5F0E5C1
+:100AE0000A35F0F510E500F5F0E50135F0F5117582
+:100AF0000003750100750C01750D00750E00750F72
+:100B000000C3750900E500F5F0E50CA4F50BE50060
+:100B1000F5F0E50CA4E5F0F50AE50BF5F0E509358F
+:100B2000F0F509E501F5F0E50CA4F50BE501F5F0AC
+:100B3000E50CA4E5F0F501E50BF5F0E50A35F0F577
+:100B40000AC3C3750100E509F5F0E50E35F0F50EB1
+:100B5000E50AF5F0E50F35F0F50FC3750A00E5007D
+:100B6000F5F0E50DA4F50BE500F5F0E50DA4E5F0D5
+:100B7000F501E50BF5F0E50A35F0F50A750900C356
+:100B8000C3750000E509F5F0E50E35F0F50EE50A50
+:100B9000F5F0E50F35F0F50FC3750900750A00C3D0
+:100BA000C3750000E509F5F0E50E35F0F50EE50A30
+:100BB000F5F0E50F35F0F50FC3750900750A00C3B0
+:100BC000C3750000E509F5F0E50E35F0F50EE50A10
+:100BD000F5F0E50F35F0F50FC3750000E50EF5F003
+:100BE000E51035F0F500E50FF5F0E51135F0F50B02
+:100BF000750A2E750900C3750100E509F5F0E500D9
+:100C000035F0F500E501F5F0E50B35F0F501E50A05
+:100C1000F503E501F502E500F582E502F583E5035C
+:100C2000F0E506F50AE507F501750905C37500004D
+:100C3000E509F5F0E50A35F0F510E500F5F0E50118
+:100C400035F0F511750004750100750C01750D0086
+:100C5000750E00750F00C3750900E500F5F0E50C91
+:100C6000A4F50BE500F5F0E50CA4E5F0F50AE50BBD
+:100C7000F5F0E50935F0F509E501F5F0E50CA4F529
+:100C80000BE501F5F0E50CA4E5F0F501E50BF5F059
+:100C9000E50A35F0F50AC3C3750100E509F5F0E58D
+:100CA0000E35F0F50EE50AF5F0E50F35F0F50FC35A
+:100CB000750A00E500F5F0E50DA4F50BE500F5F08B
+:100CC000E50DA4E5F0F501E50BF5F0E50A35F0F5E5
+:100CD0000A750900C3C3750000E509F5F0E50E3596
+:100CE000F0F50EE50AF5F0E50F35F0F50FC37509DF
+:100CF00000750A00C3C3750000E509F5F0E50E357F
+:100D0000F0F50EE50AF5F0E50F35F0F50FC37509BE
+:100D100000750A00C3C3750000E509F5F0E50E355E
+:100D2000F0F50EE50AF5F0E50F35F0F50FC37500A7
+:100D300000E50EF5F0E51035F0F500E50FF5F0E50E
+:100D40001135F0F50B750A00750900C3750100E552
+:100D500009F5F0E50035F0F500E501F5F0E50B35B6
+:100D6000F0F501E50AF503E501F502E500F582E598
+:100D700002F583E503F0E506F50AE507F5017509D7
+:100D80000AC3750000E509F5F0E50A35F0F510E550
+:100D900000F5F0E50135F0F51175000075010075FD
+:100DA0000C01750D00750E00750F00C3750900E587
+:100DB00000F5F0E50CA4F50BE500F5F0E50CA4E575
+:100DC000F0F50AE50BF5F0E50935F0F509E501F573
+:100DD000F0E50CA4F50BE501F5F0E50CA4E5F0F564
+:100DE00001E50BF5F0E50A35F0F50AC3C37501001E
+:100DF000E509F5F0E50E35F0F50EE50AF5F0E50F3D
+:100E000035F0F50FC3750A00E500F5F0E50DA4F522
+:100E10000BE500F5F0E50DA4E5F0F501E50BF5F0C7
+:100E2000E50A35F0F50A750900C3C3750000E50948
+:100E3000F5F0E50E35F0F50EE50AF5F0E50F35F0C5
+:100E4000F50FC3750900750A00C3C3750000E509F5
+:100E5000F5F0E50E35F0F50EE50AF5F0E50F35F0A5
+:100E6000F50FC3750900750A00C3C3750000E509D5
+:100E7000F5F0E50E35F0F50EE50AF5F0E50F35F085
+:100E8000F50FC3750000E50EF5F0E51035F0F5003F
+:100E9000E50FF5F0E51135F0F50B750A2E75090033
+:100EA000C3750100E509F5F0E50035F0F500E50151
+:100EB000F5F0E50B35F0F501E50AF503E501F5027E
+:100EC000E500F582E502F583E503F0E506F50AE5C0
+:100ED00007F50175090AC3750000E509F5F0E50A93
+:100EE00035F0F510E500F5F0E50135F0F511750088
+:100EF00001750100750C01750D00750E00750F0070
+:100F0000C3750900E500F5F0E50CA4F50BE500F567
+:100F1000F0E50CA4E5F0F50AE50BF5F0E50935F090
+:100F2000F509E501F5F0E50CA4F50BE501F5F0E5B3
+:100F30000CA4E5F0F501E50BF5F0E50A35F0F50A4E
+:100F4000C3C3750100E509F5F0E50E35F0F50EE5D2
+:100F50000AF5F0E50F35F0F50FC3750A00E500F569
+:100F6000F0E50DA4F50BE500F5F0E50DA4E5F0F5D1
+:100F700001E50BF5F0E50A35F0F50A750900C3C384
+:100F8000750000E509F5F0E50E35F0F50EE50AF51A
+:100F9000F0E50F35F0F50FC3750900750A00C3C3FE
+:100FA000750000E509F5F0E50E35F0F50EE50AF5FA
+:100FB000F0E50F35F0F50FC3750900750A00C3C3DE
+:100FC000750000E509F5F0E50E35F0F50EE50AF5DA
+:100FD000F0E50F35F0F50FC3750000E50EF5F0E50F
+:100FE0001035F0F500E50FF5F0E51135F0F50B756E
+:100FF0000A66750900C3750100E509F5F0E50035DD
+:10100000F0F500E501F5F0E50B35F0F501E50AF541
+:1010100003E501F502E500F582E502F583E503F05D
+:10102000E506F50AE507F50175090AC3750000E54F
+:1010300009F5F0E50A35F0F510E500F5F0E50135C4
+:10104000F0F511750002750100750C01750D007544
+:101050000E00750F00C3750900E500F5F0E50CA45E
+:10106000F50BE500F5F0E50CA4E5F0F50AE50BF568
+:10107000F0E50935F0F509E501F5F0E50CA4F50B0F
+:10108000E501F5F0E50CA4E5F0F501E50BF5F0E57B
+:101090000A35F0F50AC3C3750100E509F5F0E50E60
+:1010A00035F0F50EE50AF5F0E50F35F0F50FC375EF
+:1010B0000A00E500F5F0E50DA4F50BE500F5F0E517
+:1010C0000DA4E5F0F501E50BF5F0E50A35F0F50ABC
+:1010D000750900C3C3750000E509F5F0E50E35F0AC
+:1010E000F50EE50AF5F0E50F35F0F50FC3750900CB
+:1010F000750A00C3C3750000E509F5F0E50E35F08B
+:10110000F50EE50AF5F0E50F35F0F50FC3750900AA
+:10111000750A00C3C3750000E509F5F0E50E35F06A
+:10112000F50EE50AF5F0E50F35F0F50FC375000093
+:10113000E50EF5F0E51035F0F500E50FF5F0E511F9
+:1011400035F0F50B750A6F750900C3750100E509E7
+:10115000F5F0E50035F0F500E501F5F0E50B35F0CB
+:10116000F501E50AF503E501F502E500F582E50282
+:10117000F583E503F0E506F50AE507F50175090ACB
+:10118000C3750000E509F5F0E50A35F0F510E50056
+:10119000F5F0E50135F0F511750003750100750CEA
+:1011A00001750D00750E00750F00C3750900E5008F
+:1011B000F5F0E50CA4F50BE500F5F0E50CA4E5F081
+:1011C000F50AE50BF5F0E50935F0F509E501F5F06F
+:1011D000E50CA4F50BE501F5F0E50CA4E5F0F5014F
+:1011E000E50BF5F0E50A35F0F50AC3C3750100E536
+:1011F00009F5F0E50E35F0F50EE50AF5F0E50F35E9
+:10120000F0F50FC3750A00E500F5F0E50DA4F50B48
+:10121000E500F5F0E50DA4E5F0F501E50BF5F0E5E9
+:101220000A35F0F50A750900C3C3750000E509F534
+:10123000F0E50E35F0F50EE50AF5F0E50F35F0F5C1
+:101240000FC3750900750A00C3C3750000E509F5F1
+:10125000F0E50E35F0F50EE50AF5F0E50F35F0F5A1
+:101260000FC3750900750A00C3C3750000E509F5D1
+:10127000F0E50E35F0F50EE50AF5F0E50F35F0F581
+:101280000FC3750000E50EF5F0E51035F0F500E54B
+:101290000FF5F0E51135F0F50B750A6F750900C310
+:1012A000750100E509F5F0E50035F0F500E501F51B
+:1012B000F0E50B35F0F501E50AF503E501F502E58A
+:1012C00000F582E502F583E503F0E506F50AE5079A
+:1012D000F50175090AC3750000E509F5F0E50A3561
+:1012E000F0F510E500F5F0E50135F0F511750004B5
+:1012F000750100750C01750D00750E00750F00C3AA
+:10130000750900E500F5F0E50CA4F50BE500F5F036
+:10131000E50CA4E5F0F50AE50BF5F0E50935F0F587
+:1013200009E501F5F0E50CA4F50BE501F5F0E50C98
+:10133000A4E5F0F501E50BF5F0E50A35F0F50AC393
+:10134000C3750100E509F5F0E50E35F0F50EE50A87
+:10135000F5F0E50F35F0F50FC3750A00E500F5F07F
+:10136000E50DA4F50BE500F5F0E50DA4E5F0F501BC
+:10137000E50BF5F0E50A35F0F50A750900C3C3750C
+:101380000000E509F5F0E50E35F0F50EE50AF5F09B
+:10139000E50F35F0F50FC3750900750A00C3C37575
+:1013A0000000E509F5F0E50E35F0F50EE50AF5F07B
+:1013B000E50F35F0F50FC3750900750A00C3C37555
+:1013C0000000E509F5F0E50E35F0F50EE50AF5F05B
+:1013D000E50F35F0F50FC3750000E50EF5F0E510EB
+:1013E00035F0F500E50FF5F0E51135F0F50B750A70
+:1013F00000750900C3750100E509F5F0E50035F059
+:10140000F500E501F5F0E50B35F0F501E50AF5032A
+:10141000E501F502E500F582E502F583E503F0E577
+:1014200006F50AE507F50175090FC3750000E50922
+:10143000F5F0E50A35F0F510E500F5F0E50135F0D9
+:10144000F511750000750100750C01750D00750E24
+:1014500000750F00C3750900E500F5F0E50CA4F573
+:101460000BE500F5F0E50CA4E5F0F50AE50BF5F069
+:10147000E50935F0F509E501F5F0E50CA4F50BE516
+:1014800001F5F0E50CA4E5F0F501E50BF5F0E50A52
+:1014900035F0F50AC3C3750100E509F5F0E50E3531
+:1014A000F0F50EE50AF5F0E50F35F0F50FC3750A16
+:1014B00000E500F5F0E50DA4F50BE500F5F0E50D10
+:1014C000A4E5F0F501E50BF5F0E50A35F0F50A7550
+:1014D0000900C3C3750000E509F5F0E50E35F0F528
+:1014E0000EE50AF5F0E50F35F0F50FC37509007547
+:1014F0000A00C3C3750000E509F5F0E50E35F0F507
+:101500000EE50AF5F0E50F35F0F50FC37509007526
+:101510000A00C3C3750000E509F5F0E50E35F0F5E6
+:101520000EE50AF5F0E50F35F0F50FC3750000E59F
+:101530000EF5F0E51035F0F500E50FF5F0E51135A5
+:10154000F0F50B750A2E750900C3750100E509F564
+:10155000F0E50035F0F500E501F5F0E50B35F0F5C7
+:1015600001E50AF503E501F502E500F582E502F57E
+:1015700083E503F0E506F50AE507F50175090FC3F4
+:10158000750000E509F5F0E50A35F0F510E500F520
+:10159000F0E50135F0F511750001750100750C01DC
+:1015A000750D00750E00750F00C3750900E500F597
+:1015B000F0E50CA4F50BE500F5F0E50CA4E5F0F57D
+:1015C0000AE50BF5F0E50935F0F509E501F5F0E57B
+:1015D0000CA4F50BE501F5F0E50CA4E5F0F501E54B
+:1015E0000BF5F0E50A35F0F50AC3C3750100E5090E
+:1015F000F5F0E50E35F0F50EE50AF5F0E50F35F0FE
+:10160000F50FC3750A00E500F5F0E50DA4F50BE54F
+:1016100000F5F0E50DA4E5F0F501E50BF5F0E50AC0
+:1016200035F0F50A750900C3C3750000E509F5F04A
+:10163000E50E35F0F50EE50AF5F0E50F35F0F50F9E
+:10164000C3750900750A00C3C3750000E509F5F00C
+:10165000E50E35F0F50EE50AF5F0E50F35F0F50F7E
+:10166000C3750900750A00C3C3750000E509F5F0EC
+:10167000E50E35F0F50EE50AF5F0E50F35F0F50F5E
+:10168000C3750000E50EF5F0E51035F0F500E50F47
+:10169000F5F0E51135F0F50B750A66750900C375AF
+:1016A0000100E509F5F0E50035F0F500E501F5F09C
+:1016B000E50B35F0F501E50AF503E501F502E50076
+:1016C000F582E502F583E503F0E506F50AE507F5A1
+:1016D0000175090FC3750000E509F5F0E50A35F05D
+:1016E000F510E500F5F0E50135F0F511750002752E
+:1016F0000100750C01750D00750E00750F00C375A6
+:101700000900E500F5F0E50CA4F50BE500F5F0E5C2
+:101710000CA4E5F0F50AE50BF5F0E50935F0F5095F
+:10172000E501F5F0E50CA4F50BE501F5F0E50CA4F9
+:10173000E5F0F501E50BF5F0E50A35F0F50AC3C370
+:10174000750100E509F5F0E50E35F0F50EE50AF551
+:10175000F0E50F35F0F50FC3750A00E500F5F0E58B
+:101760000DA4F50BE500F5F0E50DA4E5F0F501E5B8
+:101770000BF5F0E50A35F0F50A750900C3C37500ED
+:1017800000E509F5F0E50E35F0F50EE50AF5F0E5B2
+:101790000F35F0F50FC3750900750A00C3C3750056
+:1017A00000E509F5F0E50E35F0F50EE50AF5F0E592
+:1017B0000F35F0F50FC3750900750A00C3C3750036
+:1017C00000E509F5F0E50E35F0F50EE50AF5F0E572
+:1017D0000F35F0F50FC3750000E50EF5F0E5103597
+:1017E000F0F500E50FF5F0E51135F0F50B750A6F32
+:1017F000750900C3750100E509F5F0E50035F0F560
+:1018000000E501F5F0E50B35F0F501E50AF503E536
+:1018100001F502E500F582E502F583E503F0E50652
+:10182000F50AE507F50175090FC3750000E509F52F
+:10183000F0E50A35F0F510E500F5F0E50135F0F5D5
+:1018400011750003750100750C01750D00750E0012
+:10185000750F00C3750900E500F5F0E50CA4F50B64
+:10186000E500F5F0E50CA4E5F0F50AE50BF5F0E58B
+:101870000935F0F509E501F5F0E50CA4F50BE501F6
+:10188000F5F0E50CA4E5F0F501E50BF5F0E50A351A
+:10189000F0F50AC3C3750100E509F5F0E50E35F072
+:1018A000F50EE50AF5F0E50F35F0F50FC3750A0002
+:1018B000E500F5F0E50DA4F50BE500F5F0E50DA468
+:1018C000E5F0F501E50BF5F0E50A35F0F50A7509E7
+:1018D00000C3C3750000E509F5F0E50E35F0F50E1F
+:1018E000E50AF5F0E50F35F0F50FC3750900750A47
+:1018F00000C3C3750000E509F5F0E50E35F0F50EFF
+:10190000E50AF5F0E50F35F0F50FC3750900750A26
+:1019100000C3C3750000E509F5F0E50E35F0F50EDE
+:10192000E50AF5F0E50F35F0F50FC3750000E50E9B
+:10193000F5F0E51035F0F500E50FF5F0E51135F0BF
+:10194000F50B750A6F750900C3750100E509F5F01F
+:10195000E50035F0F500E501F5F0E50B35F0F501B2
+:10196000E50AF503E501F502E500F582E502F583F8
+:10197000E503F0E506F50AE507F50175090FC375FE
+:101980000000E509F5F0E50A35F0F510E500F5F0A1
+:10199000E50135F0F511750004750100750C017550
+:1019A0000D00750E00750F00C3750900E500F5F018
+:1019B000E50CA4F50BE500F5F0E50CA4E5F0F50A5F
+:1019C000E50BF5F0E50935F0F509E501F5F0E50C75
+:1019D000A4F50BE501F5F0E50CA4E5F0F501E50B48
+:1019E000F5F0E50A35F0F50AC3C3750100E509F520
+:1019F000F0E50E35F0F50EE50AF5F0E50F35F0F5FA
+:101A00000FC3750A00E500F5F0E50DA4F50BE50040
+:101A1000F5F0E50DA4E5F0F501E50BF5F0E50A3587
+:101A2000F0F50A750900C3C3750000E509F5F0E596
+:101A30000E35F0F50EE50AF5F0E50F35F0F50FC3BC
+:101A4000750900750A00C3C3750000E509F5F0E5E6
+:101A50000E35F0F50EE50AF5F0E50F35F0F50FC39C
+:101A6000750900750A00C3C3750000E509F5F0E5C6
+:101A70000E35F0F50EE50AF5F0E50F35F0F50FC37C
+:101A8000750000E50EF5F0E51035F0F500E50FF511
+:101A9000F0E51135F0F50B750A00750900C3750105
+:101AA00000E509F5F0E50035F0F500E501F5F0E5B4
+:101AB0000B35F0F501E50AF503E501F502E500F562
+:101AC00082E502F583E503F0E506F50AE507F50191
+:101AD000750914C3750000E509F5F0E50A35F0F560
+:101AE00010E500F5F0E50135F0F511750000750120
+:101AF00000750C01750D00750E00750F00C375099A
+:101B000000E500F5F0E50CA4F50BE500F5F0E50CBB
+:101B1000A4E5F0F50AE50BF5F0E50935F0F509E582
+:101B200001F5F0E50CA4F50BE501F5F0E50CA4E5F5
+:101B3000F0F501E50BF5F0E50A35F0F50AC3C375DC
+:101B40000100E509F5F0E50E35F0F50EE50AF5F0D2
+:101B5000E50F35F0F50FC3750A00E500F5F0E50D6A
+:101B6000A4F50BE500F5F0E50DA4E5F0F501E50BB6
+:101B7000F5F0E50A35F0F50A750900C3C3750000F4
+:101B8000E509F5F0E50E35F0F50EE50AF5F0E50F9F
+:101B900035F0F50FC3750900750A00C3C375000061
+:101BA000E509F5F0E50E35F0F50EE50AF5F0E50F7F
+:101BB00035F0F50FC3750900750A00C3C375000041
+:101BC000E509F5F0E50E35F0F50EE50AF5F0E50F5F
+:101BD00035F0F50FC3750000E50EF5F0E51035F0B2
+:101BE000F500E50FF5F0E51135F0F50B750A2E75EA
+:101BF0000900C3750100E509F5F0E50035F0F500D1
+:101C0000E501F5F0E50B35F0F501E50AF503E50131
+:101C1000F502E500F582E502F583E503F0E506F55A
+:101C20000AE507F501750914C3750000E509F5F02B
+:101C3000E50A35F0F510E500F5F0E50135F0F511B0
+:101C4000750001750100750C01750D00750E0075AC
+:101C50000F00C3750900E500F5F0E50CA4F50BE5F0
+:101C600000F5F0E50CA4E5F0F50AE50BF5F0E50963
+:101C700035F0F509E501F5F0E50CA4F50BE501F506
+:101C8000F0E50CA4E5F0F501E50BF5F0E50A35F01B
+:101C9000F50AC3C3750100E509F5F0E50E35F0F569
+:101CA0000EE50AF5F0E50F35F0F50FC3750A00E50E
+:101CB00000F5F0E50DA4F50BE500F5F0E50DA4E564
+:101CC000F0F501E50BF5F0E50A35F0F50A750900C8
+:101CD000C3C3750000E509F5F0E50E35F0F50EE536
+:101CE0000AF5F0E50F35F0F50FC3750900750A0028
+:101CF000C3C3750000E509F5F0E50E35F0F50EE516
+:101D00000AF5F0E50F35F0F50FC3750900750A0007
+:101D1000C3C3750000E509F5F0E50E35F0F50EE5F5
+:101D20000AF5F0E50F35F0F50FC3750000E50EF587
+:101D3000F0E51035F0F500E50FF5F0E51135F0F5BB
+:101D40000B750A2E750900C3750100E509F5F0E56C
+:101D50000035F0F500E501F5F0E50B35F0F501E5AE
+:101D60000AF503E501F502E500F582E502F583E5F4
+:101D700003F0E506F50AE507F501750914C37500DA
+:101D800000E509F5F0E50A35F0F510E500F5F0E5B8
+:101D90000135F0F511750002750100750C01750D26
+:101DA00000750E00750F00C3750900E500F5F0E53C
+:101DB0000CA4F50BE500F5F0E50CA4E5F0F50AE55B
+:101DC0000BF5F0E50935F0F509E501F5F0E50CA4B2
+:101DD000F50BE501F5F0E50CA4E5F0F501E50BF5F3
+:101DE000F0E50A35F0F50AC3C3750100E509F5F021
+:101DF000E50E35F0F50EE50AF5F0E50F35F0F50FD7
+:101E0000C3750A00E500F5F0E50DA4F50BE500F556
+:101E1000F0E50DA4E5F0F501E50BF5F0E50A35F088
+:101E2000F50A750900C3C3750000E509F5F0E50E74
+:101E300035F0F50EE50AF5F0E50F35F0F50FC37551
+:101E40000900750A00C3C3750000E509F5F0E50E49
+:101E500035F0F50EE50AF5F0E50F35F0F50FC37531
+:101E60000900750A00C3C3750000E509F5F0E50E29
+:101E700035F0F50EE50AF5F0E50F35F0F50FC37511
+:101E80000000E50EF5F0E51035F0F500E50FF5F092
+:101E9000E51135F0F50B750A00750900C3750100F1
+:101EA000E509F5F0E50035F0F500E501F5F0E50BA5
+:101EB00035F0F501E50AF503E501F502E500F582E7
+:101EC000E502F583E503F0750000E500F502E500A5
+:101ED000F503E500F504E500F505E518F511E5194C
+:101EE000F510E51BC0E0E51AC0E075E0172506F522
+:101EF0000675E0003507F507E502F582E503F58391
+:101F0000E504F500E505F5012200000000000000F1
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR c/3581 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+/* Intended as a compile-time test for string literal concatenation.
+ The fact that the string isn't actually used in the resulting program
+ should allow this to compile for any target. */
+
+#define e0 "a"
+#define e1 e0 e0 e0 e0 e0 e0 e0 e0 e0 e0
+#define e2 e1 e1 e1 e1 e1 e1 e1 e1 e1 e1
+#define e3 e2 e2 e2 e2 e2 e2 e2 e2 e2 e2
+#define e4 e3 e3 e3 e3 e3 e3 e3 e3 e3 e3
+#define e5 e4 e4 e4 e4 e4 e4 e4 e4 e4 e4
+
+void foo() { (void)(e5); }
--- /dev/null
+/* PR c/3581 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+/* Intended as a compile-time test for string literal concatenation.
+ The fact that the string isn't actually used in the resulting program
+ should allow this to compile for any target. */
+
+#define e0 "a"
+#define e1 e0 e0 e0 e0 e0 e0 e0 e0 e0 e0
+#define e2 e1 e1 e1 e1 e1 e1 e1 e1 e1 e1
+#define e3 e2 e2 e2 e2 e2 e2 e2 e2 e2 e2
+#define e4 e3 e3 e3 e3 e3 e3 e3 e3 e3 e3
+#define e5 e4 e4 e4 e4 e4 e4 e4 e4 e4 e4
+
+void foo() { (void)(e5); }
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-m64 -O1 -static" } */
+typedef unsigned long long uint64_t;
+
+static int
+match(name, pat)
+ uint64_t *name, *pat;
+{
+ int ok=0, negate_range;
+ uint64_t c, k;
+
+ c = *pat++;
+ switch (c & 0xffffffffffULL) {
+ case ((uint64_t)(('[')|0x8000000000ULL)):
+ if ((negate_range = ((*pat & 0xffffffffffULL) == ((uint64_t)(('!')|0x8000000000ULL)) )) != '\0')
+ ++pat;
+ while (((c = *pat++) & 0xffffffffffULL) )
+ if ((*pat & 0xffffffffffULL) == ((uint64_t)(('-')|0x8000000000ULL)))
+ {
+ pat += 2;
+ }
+
+ if (ok == negate_range)
+ return(0);
+ break;
+ }
+ return(*name == '\0');
+}
+
--- /dev/null
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-m64 -O1 -static" } */
+typedef unsigned long long uint64_t;
+
+static int
+match(name, pat)
+ uint64_t *name, *pat;
+{
+ int ok=0, negate_range;
+ uint64_t c, k;
+
+ c = *pat++;
+ switch (c & 0xffffffffffULL) {
+ case ((uint64_t)(('[')|0x8000000000ULL)):
+ if ((negate_range = ((*pat & 0xffffffffffULL) == ((uint64_t)(('!')|0x8000000000ULL)) )) != '\0')
+ ++pat;
+ while (((c = *pat++) & 0xffffffffffULL) )
+ if ((*pat & 0xffffffffffULL) == ((uint64_t)(('-')|0x8000000000ULL)))
+ {
+ pat += 2;
+ }
+
+ if (ok == negate_range)
+ return(0);
+ break;
+ }
+ return(*name == '\0');
+}
+
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* The string constant in this test case should be emitted exactly once. */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler-times "hi there" 1 } } */
+
+static inline int returns_23() { return 23; }
+
+const char *test1(void) { if (returns_23()) return 0; return "hi there"; }
+const char *test2(void) { return "hi there"; }
+const char *test3(void) { return "hi there"; }
--- /dev/null
+/* The string constant in this test case should be emitted exactly once. */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler-times "hi there" 1 } } */
+
+static inline int returns_23() { return 23; }
+
+const char *test1(void) { if (returns_23()) return 0; return "hi there"; }
+const char *test2(void) { return "hi there"; }
+const char *test3(void) { return "hi there"; }
--- /dev/null
+/* PR middle-end/19100 */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+void abort (void);
+
+int test (int v)
+{
+ return ((signed char) (v ? 0x100 : 0)) ? 17 : 18;
+}
+
+int main()
+{
+ if (test (2) != 18)
+ abort ();
+ return 0;
+}
+
--- /dev/null
+/* PR middle-end/19100 */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+void abort (void);
+
+int test (int v)
+{
+ return ((signed char) (v ? 0x100 : 0)) ? 17 : 18;
+}
+
+int main()
+{
+ if (test (2) != 18)
+ abort ();
+ return 0;
+}
+
--- /dev/null
+:1000000075812F7506FF7507FF1200D502000C00E1
+:1000100000E506758204C39582F506E50775830041
+:100020009583F507D0E0F500D0E0F509750100E50E
+:100030001FF5F0E50145F0F501E51EF5F0E5014598
+:10004000F0F501E51DF5F0E50145F0F501E51CF5DC
+:10005000F0E50145F0F501E501700280030200CEF4
+:1000600000750100750A00E501F5F0E50A45F0F5B7
+:100070000AE50A700280030200BE00750112750ACB
+:1000800000750B00750C00E501F502E50AF503E5C6
+:100090000BF504E50CF505E509C0E0E500C0E075E9
+:1000A000E0042506F50675E0003507F507E502F5DD
+:1000B00082E503F583E504F500E505F50122007509
+:1000C0000111750A00750B00750C000200870075A0
+:1000D000010002006400E506758202C39582F50600
+:1000E000E5077583009583F507D0E0F50875E00115
+:1000F0002506F58275E0003507F583E508F0D0E0C8
+:10010000F50875E0002506F58275E0003507F583F2
+:10011000E508F0751F02751E00751D00751C0012A4
+:100120000010E582F502E583F503E500F504E5013D
+:10013000F505E502F50BE503F50CE504F50DE50520
+:10014000F50E750012750100750900750A00750F2E
+:1001500000C3E500F5F0E50B95F0F500E500F5F0DE
+:10016000E50F45F0F50FC3E501F5F0E50C95F0F569
+:1001700000E500F5F0E50F45F0F50FC3E509F5F0F2
+:10018000E50D95F0F500E500F5F0E50F45F0F50F0C
+:10019000C3E50AF5F0E50E95F0F500E500F5F0E5AC
+:1001A0000F45F0F50F750100750900750A0075001F
+:1001B00000E50FF5F0E50045F0F500E501F5F0E5A7
+:1001C0000045F0F500E509F5F0E50045F0F500E53E
+:1001D0000AF5F0E50045F0F500E500700280030245
+:1001E000024800750000750100750900750A00E5F8
+:1001F00000F502E501F503E509F504E50AF50575E5
+:10020000E0002506F58275E0003507F583E0F50886
+:10021000E508C0E075E0012506F58275E0003507C8
+:10022000F583E0F508E508C0E075E0022506F5066F
+:1002300075E0003507F507E502F582E503F583E58E
+:1002400004F500E505F50122000201E300000000CD
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target cris-*-* } } */
+/* { dg-final { scan-assembler-not "and.d " } } */
+/* { dg-final { scan-assembler-not "move.d " } } */
+/* { dg-final { scan-assembler "cLear.b" } } */
+/* { dg-final { scan-assembler "movu.b" } } */
+/* { dg-final { scan-assembler "and.b" } } */
+/* { dg-final { scan-assembler "movu.w" } } */
+/* { dg-final { scan-assembler "and.w" } } */
+/* { dg-final { scan-assembler "andq" } } */
+/* { dg-options "-O2" } */
+
+/* Test the "andu" peephole2 trivially, memory operand. */
+
+int
+clearb (int x, int *y)
+{
+ return *y & 0xff00;
+}
+
+int
+andb (int x, int *y)
+{
+ return *y & 0x3f;
+}
+
+int
+andw (int x, int *y)
+{
+ return *y & 0xfff;
+}
+
+int
+andq (int x, int *y)
+{
+ return *y & 0xf0;
+}
+
+int
+andq2 (int x, int *y)
+{
+ return *y & 0xfff0;
+}
--- /dev/null
+/* { dg-do compile { target cris-*-* } } */
+/* { dg-final { scan-assembler-not "and.d " } } */
+/* { dg-final { scan-assembler-not "move.d " } } */
+/* { dg-final { scan-assembler "cLear.b" } } */
+/* { dg-final { scan-assembler "movu.b" } } */
+/* { dg-final { scan-assembler "and.b" } } */
+/* { dg-final { scan-assembler "movu.w" } } */
+/* { dg-final { scan-assembler "and.w" } } */
+/* { dg-final { scan-assembler "andq" } } */
+/* { dg-options "-O2" } */
+
+/* Test the "andu" peephole2 trivially, memory operand. */
+
+int
+clearb (int x, int *y)
+{
+ return *y & 0xff00;
+}
+
+int
+andb (int x, int *y)
+{
+ return *y & 0x3f;
+}
+
+int
+andw (int x, int *y)
+{
+ return *y & 0xfff;
+}
+
+int
+andq (int x, int *y)
+{
+ return *y & 0xf0;
+}
+
+int
+andq2 (int x, int *y)
+{
+ return *y & 0xfff0;
+}
--- /dev/null
+:1000000000E506758206C39582F506E5077583004F
+:100010009583F507D0E0F518D0E0F519E512F50F56
+:10002000E51BF501E51AF500E501F50A750900C3C0
+:10003000750100E509F5F0E50A35F0F509E501F58A
+:10004000F0E50035F0F501E501F502E509F582E599
+:1000500002F583E0F50B750901C3750100E509F5AB
+:10006000F0E50A35F0F509E501F5F0E50035F0F5C4
+:1000700001E501F502E509F582E502F583E0F50CFD
+:10008000750902C3750100E509F5F0E50A35F0F5DB
+:1000900009E501F5F0E50035F0F501E501F502E5CA
+:1000A00009F582E502F583E0F50D750903C37501D5
+:1000B00000E509F5F0E50A35F0F509E501F5F0E5AB
+:1000C0000035F0F501E501F502E509F582E502F5F7
+:1000D00083E0F50E7500007501FF750900750A00D3
+:1000E000C3E500F5F0E50B55F0F500E501F5F0E5A9
+:1000F0000C55F0F501E509F5F0E50D55F0F509E5CC
+:100100000AF5F0E50E55F0F50AE500F502E501F512
+:1001100003E509F504E50AF505E50FF512E519C053
+:10012000E0E518C0E075E0062506F50675E0003547
+:1001300007F507E502F582E503F583E504F500E53B
+:1001400005F5012200E506758206C39582F506E5F0
+:10015000077583009583F507D0E0F518D0E0F51911
+:10016000E512F50FE51BF501E51AF500E501F50AC5
+:10017000750900C3750100E509F5F0E50A35F0F5EC
+:1001800009E501F5F0E50035F0F501E501F502E5D9
+:1001900009F582E502F583E0F50B750901C37501E8
+:1001A00000E509F5F0E50A35F0F509E501F5F0E5BA
+:1001B0000035F0F501E501F502E509F582E502F506
+:1001C00083E0F50C750902C3750100E509F5F0E55A
+:1001D0000A35F0F509E501F5F0E50035F0F501E542
+:1001E00001F502E509F582E502F583E0F50D7509F3
+:1001F00003C3750100E509F5F0E50A35F0F509E5F9
+:1002000001F5F0E50035F0F501E501F502E509F548
+:1002100082E502F583E0F50E75003F750100750972
+:1002200000750A00C3E500F5F0E50B55F0F500E5B3
+:1002300001F5F0E50C55F0F501E509F5F0E50D5592
+:10024000F0F509E50AF5F0E50E55F0F50AE500F5DB
+:1002500002E501F503E509F504E50AF505E50FF505
+:1002600012E519C0E0E518C0E075E0062506F506C0
+:1002700075E0003507F507E502F582E503F583E54E
+:1002800004F500E505F5012200E506758206C39533
+:1002900082F506E5077583009583F507D0E0F5182C
+:1002A000D0E0F519E512F50FE51BF501E51AF500AB
+:1002B000E501F50A750900C3750100E509F5F0E5EA
+:1002C0000A35F0F509E501F5F0E50035F0F501E551
+:1002D00001F502E509F582E502F583E0F50B750904
+:1002E00001C3750100E509F5F0E50A35F0F509E50A
+:1002F00001F5F0E50035F0F501E501F502E509F558
+:1003000082E502F583E0F50C750902C3750100E58D
+:1003100009F5F0E50A35F0F509E501F5F0E50035F8
+:10032000F0F501E501F502E509F582E502F583E066
+:10033000F50D750903C3750100E509F5F0E50A350A
+:10034000F0F509E501F5F0E50035F0F501E501F519
+:1003500002E509F582E502F583E0F50E7500FF750B
+:10036000010F750900750A00C3E500F5F0E50B55AE
+:10037000F0F500E501F5F0E50C55F0F501E509F5BE
+:10038000F0E50D55F0F509E50AF5F0E50E55F0F547
+:100390000AE500F502E501F503E509F504E50AF5CE
+:1003A00005E50FF512E519C0E0E518C0E075E006B7
+:1003B0002506F50675E0003507F507E502F582E547
+:1003C00003F583E504F500E505F5012200E5067572
+:1003D0008206C39582F506E5077583009583F507C8
+:1003E000D0E0F518D0E0F519E512F50FE51BF501A1
+:1003F000E51AF500E501F50A750900C3750100E588
+:1004000009F5F0E50A35F0F509E501F5F0E5003507
+:10041000F0F501E501F502E509F582E502F583E075
+:10042000F50B750901C3750100E509F5F0E50A351D
+:10043000F0F509E501F5F0E50035F0F501E501F528
+:1004400002E509F582E502F583E0F50C750902C3C2
+:10045000750100E509F5F0E50A35F0F509E501F566
+:10046000F0E50035F0F501E501F502E509F582E575
+:1004700002F583E0F50D750903C3750100E509F583
+:10048000F0E50A35F0F509E501F5F0E50035F0F5A0
+:1004900001E501F502E509F582E502F583E0F50ED7
+:1004A0007500F0750100750900750A00C3E500F5D7
+:1004B000F0E50B55F0F500E501F5F0E50C55F0F52C
+:1004C00001E509F5F0E50D55F0F509E50AF5F0E56A
+:1004D0000E55F0F50AE500F502E501F503E509F52D
+:1004E00004E50AF505E50FF512E519C0E0E518C0C9
+:1004F000E075E0062506F50675E0003507F507E529
+:1005000002F582E503F583E504F500E505F5012232
+:1005100000E506758206C39582F506E5077583003A
+:100520009583F507D0E0F518D0E0F519E512F50F41
+:10053000E51BF501E51AF500E501F50A750900C3AB
+:10054000750100E509F5F0E50A35F0F509E501F575
+:10055000F0E50035F0F501E501F502E509F582E584
+:1005600002F583E0F50B750901C3750100E509F596
+:10057000F0E50A35F0F509E501F5F0E50035F0F5AF
+:1005800001E501F502E509F582E502F583E0F50CE8
+:10059000750902C3750100E509F5F0E50A35F0F5C6
+:1005A00009E501F5F0E50035F0F501E501F502E5B5
+:1005B00009F582E502F583E0F50D750903C37501C0
+:1005C00000E509F5F0E50A35F0F509E501F5F0E596
+:1005D0000035F0F501E501F502E509F582E502F5E2
+:1005E00083E0F50E7500F07501FF750900750A00CE
+:1005F000C3E500F5F0E50B55F0F500E501F5F0E594
+:100600000C55F0F501E509F5F0E50D55F0F509E5B6
+:100610000AF5F0E50E55F0F50AE500F502E501F5FD
+:1006200003E509F504E50AF505E50FF512E519C03E
+:10063000E0E518C0E075E0062506F50675E0003532
+:1006400007F507E502F582E503F583E504F500E526
+:1006500005F501220000000000000000000000007D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target cris-*-* } } */
+/* { dg-final { scan-assembler "movu.w \\\$r10,\\\$r" } } */
+/* { dg-final { scan-assembler "and.w 2047,\\\$r" } } */
+/* { dg-final { scan-assembler-not "move.d \\\$r10,\\\$r" } } */
+/* { dg-final { scan-assembler "movu.b \\\$r10,\\\$r" } } */
+/* { dg-final { scan-assembler "and.b 95,\\\$r" } } */
+/* { dg-final { scan-assembler "andq -2,\\\$r" } } */
+/* { dg-options "-O2" } */
+
+/* Test the "andu" peephole2 trivially, register operand. */
+
+unsigned int
+and_peep2_hi (unsigned int y, unsigned int *x)
+{
+ *x = y & 0x7ff;
+ return y;
+}
+
+unsigned int
+and_peep2_qi (unsigned int y, unsigned int *x)
+{
+ *x = y & 0x5f;
+ return y;
+}
+
+
+unsigned int
+and_peep2_q (unsigned int y, unsigned int *x)
+{
+ *x = y & 0xfe;
+ return y;
+}
--- /dev/null
+/* { dg-do compile { target cris-*-* } } */
+/* { dg-final { scan-assembler "movu.w \\\$r10,\\\$r" } } */
+/* { dg-final { scan-assembler "and.w 2047,\\\$r" } } */
+/* { dg-final { scan-assembler-not "move.d \\\$r10,\\\$r" } } */
+/* { dg-final { scan-assembler "movu.b \\\$r10,\\\$r" } } */
+/* { dg-final { scan-assembler "and.b 95,\\\$r" } } */
+/* { dg-final { scan-assembler "andq -2,\\\$r" } } */
+/* { dg-options "-O2" } */
+
+/* Test the "andu" peephole2 trivially, register operand. */
+
+unsigned int
+and_peep2_hi (unsigned int y, unsigned int *x)
+{
+ *x = y & 0x7ff;
+ return y;
+}
+
+unsigned int
+and_peep2_qi (unsigned int y, unsigned int *x)
+{
+ *x = y & 0x5f;
+ return y;
+}
+
+
+unsigned int
+and_peep2_q (unsigned int y, unsigned int *x)
+{
+ *x = y & 0xfe;
+ return y;
+}
--- /dev/null
+:1000000000E506758206C39582F506E5077583004F
+:100010009583F507D0E0F518D0E0F519E516F50D54
+:10002000E515F50EE514F50F7509FF750A0775015D
+:1000300000750000C3E509F5F0E51F55F0F509E589
+:100040000AF5F0E51E55F0F50AE501F5F0E51D5558
+:10005000F0F50BE500F5F0E51C55F0F50C75010029
+:10006000C3750000E501F5F0E51B35F0F501E5008D
+:10007000F5F0E51A35F0F500E509F503E500F502C0
+:10008000E501F582E502F583E503F0750101C3752D
+:100090000000E501F5F0E51B35F0F501E500F5F0B0
+:1000A000E51A35F0F500E50AF503E500F502E5018E
+:1000B000F582E502F583E503F0750102C3750000E2
+:1000C000E501F5F0E51B35F0F501E500F5F0E51A81
+:1000D00035F0F500E50BF503E500F502E501F582E5
+:1000E000E502F583E503F0750103C3750000E50142
+:1000F000F5F0E51B35F0F501E500F5F0E51A35F012
+:10010000F500E50CF503E500F502E501F582E502F1
+:10011000F583E503F0E51FF502E51EF503E51DF5A2
+:1001200004E51CF505E50DF516E50EF515E50FF5ED
+:1001300014E519C0E0E518C0E075E0062506F506EF
+:1001400075E0003507F507E502F582E503F583E57F
+:1001500004F500E505F5012200E506758206C39564
+:1001600082F506E5077583009583F507D0E0F5185D
+:10017000D0E0F519E516F50DE515F50EE514F50FCA
+:1001800075095F750A00750100750000C3E509F582
+:10019000F0E51F55F0F509E50AF5F0E51E55F0F517
+:1001A0000AE501F5F0E51D55F0F50BE500F5F0E584
+:1001B0001C55F0F50C750100C3750000E501F5F064
+:1001C000E51B35F0F501E500F5F0E51A35F0F50031
+:1001D000E509F503E500F502E501F582E502F583A1
+:1001E000E503F0750101C3750000E501F5F0E51BBD
+:1001F00035F0F501E500F5F0E51A35F0F500E50A12
+:10020000F503E500F502E501F582E502F583E50376
+:10021000F0750102C3750000E501F5F0E51B35F04E
+:10022000F501E500F5F0E51A35F0F500E50BF5030D
+:10023000E500F502E501F582E502F583E503F075D9
+:100240000103C3750000E501F5F0E51B35F0F5018C
+:10025000E500F5F0E51A35F0F500E50CF503E500ED
+:10026000F502E501F582E502F583E503F0E51FF50A
+:1002700002E51EF503E51DF504E51CF505E50DF5A4
+:1002800016E50EF515E50FF514E519C0E0E518C003
+:10029000E075E0062506F50675E0003507F507E58B
+:1002A00002F582E503F583E504F500E505F5012295
+:1002B00000E506758206C39582F506E5077583009D
+:1002C0009583F507D0E0F518D0E0F519E516F50DA2
+:1002D000E515F50EE514F50F7509FE750A007501B3
+:1002E00000750000C3E509F5F0E51F55F0F509E5D7
+:1002F0000AF5F0E51E55F0F50AE501F5F0E51D55A6
+:10030000F0F50BE500F5F0E51C55F0F50C75010076
+:10031000C3750000E501F5F0E51B35F0F501E500DA
+:10032000F5F0E51A35F0F500E509F503E500F5020D
+:10033000E501F582E502F583E503F0750101C3757A
+:100340000000E501F5F0E51B35F0F501E500F5F0FD
+:10035000E51A35F0F500E50AF503E500F502E501DB
+:10036000F582E502F583E503F0750102C37500002F
+:10037000E501F5F0E51B35F0F501E500F5F0E51ACE
+:1003800035F0F500E50BF503E500F502E501F58232
+:10039000E502F583E503F0750103C3750000E5018F
+:1003A000F5F0E51B35F0F501E500F5F0E51A35F05F
+:1003B000F500E50CF503E500F502E501F582E5023F
+:1003C000F583E503F0E51FF502E51EF503E51DF5F0
+:1003D00004E51CF505E50DF516E50EF515E50FF53B
+:1003E00014E519C0E0E518C0E075E0062506F5063D
+:1003F00075E0003507F507E502F582E503F583E5CD
+:1004000004F500E505F501220000000000000000F1
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target cris-*-* } } */
+/* { dg-final { scan-assembler "and.w " } } */
+/* { dg-final { scan-assembler "and.b " } } */
+/* { dg-final { scan-assembler-not "and.d" } } */
+/* { dg-options "-O2" } */
+
+/* Test the "asrandb", "asrandw", "lsrandb" and "lsrandw" peephole2:s
+ trivially. */
+
+unsigned int
+andwlsr (unsigned int x)
+{
+ return (x >> 17) & 0x7ff;
+}
+
+unsigned int
+andblsr (unsigned int x)
+{
+ return (x >> 25) & 0x5f;
+}
+
+int
+andwasr (int x)
+{
+ return (x >> 17) & 0x7ff;
+}
+
+int
+andbasr (int x)
+{
+ return (x >> 25) & 0x5f;
+}
--- /dev/null
+/* { dg-do compile { target cris-*-* } } */
+/* { dg-final { scan-assembler "and.w " } } */
+/* { dg-final { scan-assembler "and.b " } } */
+/* { dg-final { scan-assembler-not "and.d" } } */
+/* { dg-options "-O2" } */
+
+/* Test the "asrandb", "asrandw", "lsrandb" and "lsrandw" peephole2:s
+ trivially. */
+
+unsigned int
+andwlsr (unsigned int x)
+{
+ return (x >> 17) & 0x7ff;
+}
+
+unsigned int
+andblsr (unsigned int x)
+{
+ return (x >> 25) & 0x5f;
+}
+
+int
+andwasr (int x)
+{
+ return (x >> 17) & 0x7ff;
+}
+
+int
+andbasr (int x)
+{
+ return (x >> 25) & 0x5f;
+}
--- /dev/null
+/* { dg-do compile { target cris-*-* } } */
+/* { dg-final { scan-assembler "and.w -137," } } */
+/* { dg-final { scan-assembler "and.b -64," } } */
+/* { dg-final { scan-assembler "and.w -139," } } */
+/* { dg-final { scan-assembler "and.b -63," } } */
+/* { dg-final { scan-assembler-not "and.d" } } */
+/* { dg-options "-O2" } */
+
+/* PR target/17984. Test-case based on
+ testsuite/gcc.dg/cris-peep2-xsrand.c. */
+
+unsigned int
+andwlsr (unsigned int x)
+{
+ return (x >> 16) & 0xff77;
+}
+
+unsigned int
+andblsr (unsigned int x)
+{
+ return (x >> 24) & 0xc0;
+}
+
+int
+andwasr (int x)
+{
+ return (x >> 16) & 0xff75;
+}
+
+int
+andbasr (int x)
+{
+ return (x >> 24) & 0xc1;
+}
--- /dev/null
+/* { dg-do compile { target cris-*-* } } */
+/* { dg-final { scan-assembler "and.w -137," } } */
+/* { dg-final { scan-assembler "and.b -64," } } */
+/* { dg-final { scan-assembler "and.w -139," } } */
+/* { dg-final { scan-assembler "and.b -63," } } */
+/* { dg-final { scan-assembler-not "and.d" } } */
+/* { dg-options "-O2" } */
+
+/* PR target/17984. Test-case based on
+ testsuite/gcc.dg/cris-peep2-xsrand.c. */
+
+unsigned int
+andwlsr (unsigned int x)
+{
+ return (x >> 16) & 0xff77;
+}
+
+unsigned int
+andblsr (unsigned int x)
+{
+ return (x >> 24) & 0xc0;
+}
+
+int
+andwasr (int x)
+{
+ return (x >> 16) & 0xff75;
+}
+
+int
+andbasr (int x)
+{
+ return (x >> 24) & 0xc1;
+}
--- /dev/null
+/* Test dead code strip support. */
+/* Contributed by Devang Patel <dpatel@apple.com> */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-g -fno-eliminate-unused-debug-symbols" } */
+
+int
+main ()
+{
+ return 0;
+}
+
+/* { dg-final { scan-assembler ".stabd.46,0,0" } } */
+/* { dg-final { scan-assembler ".stabd.78,0,0" } } */
+
--- /dev/null
+/* Test dead code strip support. */
+/* Contributed by Devang Patel <dpatel@apple.com> */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-g -fno-eliminate-unused-debug-symbols" } */
+
+int
+main ()
+{
+ return 0;
+}
+
+/* { dg-final { scan-assembler ".stabd.46,0,0" } } */
+/* { dg-final { scan-assembler ".stabd.78,0,0" } } */
+
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501750900750A00750B18
+:1000200000750C00E509F502E50AF503E50BF5049A
+:10003000E50CF505E501C0E0E500C0E0E502F5826C
+:10004000E503F583E504F500E505F5012200000070
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test dead code strip support. */
+/* Contributed by Devang Patel <dpatel@apple.com> */
+
+/* { dg-do compile { target *-*-darwin* } } */
+
+const char my_version_string[] __attribute__((__used__))
+ = "Do not remove this string\n";
+
+ static int
+ __attribute__((__used__))
+ static_debug_routine()
+{
+ int i;
+ i = 42;
+}
+
+int
+main ()
+{
+ return 0;
+}
+
+/* { dg-final { scan-assembler ".no_dead_strip _my_version_string" } } */
+/* { dg-final { scan-assembler ".no_dead_strip _static_debug_routine" } } */
--- /dev/null
+/* Test dead code strip support. */
+/* Contributed by Devang Patel <dpatel@apple.com> */
+
+/* { dg-do compile { target *-*-darwin* } } */
+
+const char my_version_string[] __attribute__((__used__))
+ = "Do not remove this string\n";
+
+ static int
+ __attribute__((__used__))
+ static_debug_routine()
+{
+ int i;
+ i = 42;
+}
+
+int
+main ()
+{
+ return 0;
+}
+
+/* { dg-final { scan-assembler ".no_dead_strip _my_version_string" } } */
+/* { dg-final { scan-assembler ".no_dead_strip _static_debug_routine" } } */
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F50CD0E0F50D900000E582F50A90F7
+:100020000000E583F50B750900750100C37500003C
+:10003000E501F5F0E50935F0F500C3750100E500CF
+:10004000F5F0E50A35F0F500E501F5F0E50B35F0E2
+:10005000F50B750A44750900C3750100E509F5F053
+:10006000E50035F0F500E501F5F0E50B35F0F501BB
+:10007000E50AF503E501F502E500F582E502F58301
+:10008000E503F0900000E582F50A900000E583F5B5
+:100090000B750900750101C3750000E501F5F0E578
+:1000A0000935F0F500C3750100E500F5F0E50A3506
+:1000B000F0F500E501F5F0E50B35F0F50B750A6F8D
+:1000C000750900C3750100E509F5F0E50035F0F5A7
+:1000D00000E501F5F0E50B35F0F501E50AF503E57E
+:1000E00001F502E500F582E502F583E503F09000F5
+:1000F00000E582F50A900000E583F50B75090075AF
+:100100000102C3750000E501F5F0E50935F0F500E1
+:10011000C3750100E500F5F0E50A35F0F500E501ED
+:10012000F5F0E50B35F0F50B750A20750900C37580
+:100130000100E509F5F0E50035F0F500E501F5F021
+:10014000E50B35F0F501E50AF503E501F502E500FB
+:10015000F582E502F583E503F0900000E582F50AFB
+:10016000900000E583F50B750900750103C3750068
+:1001700000E501F5F0E50935F0F500C3750100E58E
+:1001800000F5F0E50A35F0F500E501F5F0E50B3591
+:10019000F0F50B750A6E750900C3750100E509F5E8
+:1001A000F0E50035F0F500E501F5F0E50B35F0F58B
+:1001B00001E50AF503E501F502E500F582E502F542
+:1001C00083E503F0900000E582F50A900000E583E6
+:1001D000F50B750900750104C3750000E501F5F024
+:1001E000E50935F0F500C3750100E500F5F0E50A15
+:1001F00035F0F500E501F5F0E50B35F0F50B750A86
+:100200006F750900C3750100E509F5F0E50035F0EB
+:10021000F500E501F5F0E50B35F0F501E50AF5032C
+:10022000E501F502E500F582E502F583E503F090CE
+:100230000000E582F50A900000E583F50B750900E2
+:10024000750105C3750000E501F5F0E50935F0F528
+:1002500000C3750100E500F5F0E50A35F0F500E5AD
+:1002600001F5F0E50B35F0F50B750A74750900C35F
+:10027000750100E509F5F0E50035F0F500E501F55B
+:10028000F0E50B35F0F501E50AF503E501F502E5CA
+:1002900000F582E502F583E503F0900000E582F5C4
+:1002A0000A900000E583F50B750900750106C3751A
+:1002B0000000E501F5F0E50935F0F500C375010032
+:1002C000E500F5F0E50A35F0F500E501F5F0E50BA0
+:1002D00035F0F50B750A20750900C3750100E509B5
+:1002E000F5F0E50035F0F500E501F5F0E50B35F04A
+:1002F000F501E50AF503E501F502E500F582E50201
+:10030000F583E503F0900000E582F50A900000E532
+:1003100083F50B750900750107C3750000E501F54C
+:10032000F0E50935F0F500C3750100E500F5F0E5ED
+:100330000A35F0F500E501F5F0E50B35F0F50B7544
+:100340000A72750900C3750100E509F5F0E500358D
+:10035000F0F500E501F5F0E50B35F0F501E50AF5FE
+:1003600003E501F502E500F582E502F583E503F01A
+:10037000900000E582F50A900000E583F50B750911
+:1003800000750108C3750000E501F5F0E50935F0D9
+:10039000F500C3750100E500F5F0E50A35F0F5005C
+:1003A000E501F5F0E50B35F0F50B750A657509000B
+:1003B000C3750100E509F5F0E50035F0F500E5014C
+:1003C000F5F0E50B35F0F501E50AF503E501F50279
+:1003D000E500F582E502F583E503F0900000E58293
+:1003E000F50A900000E583F50B750900750109C356
+:1003F000750000E501F5F0E50935F0F500C375017C
+:1004000000E500F5F0E50A35F0F500E501F5F0E569
+:100410000B35F0F50B750A6D750900C3750100E524
+:1004200009F5F0E50035F0F500E501F5F0E50B35EF
+:10043000F0F501E50AF503E501F502E500F582E5D1
+:1004400002F583E503F0900000E582F50A900000D4
+:10045000E583F50B75090075010AC3750000E50118
+:10046000F5F0E50935F0F500C3750100E500F5F09C
+:10047000E50A35F0F500E501F5F0E50B35F0F50B93
+:10048000750A6F750900C3750100E509F5F0E5000F
+:1004900035F0F500E501F5F0E50B35F0F501E50A7D
+:1004A000F503E501F502E500F582E502F583E503D4
+:1004B000F0900000E582F50A900000E583F50B75E9
+:1004C000090075010BC3750000E501F5F0E509357C
+:1004D000F0F500C3750100E500F5F0E50A35F0F52B
+:1004E00000E501F5F0E50B35F0F50B750A767509B9
+:1004F00000C3750100E509F5F0E50035F0F500E50C
+:1005000001F5F0E50B35F0F501E50AF503E501F538
+:1005100002E500F582E502F583E503F0900000E5D1
+:1005200082F50A900000E583F50B75090075010C52
+:10053000C3750000E501F5F0E50935F0F500C37578
+:100540000100E500F5F0E50A35F0F500E501F5F00C
+:10055000E50B35F0F50B750A65750900C3750100EB
+:10056000E509F5F0E50035F0F500E501F5F0E50BFE
+:1005700035F0F501E50AF503E501F502E500F58240
+:10058000E502F583E503F0900000E582F50A9000AE
+:1005900000E583F50B75090075010DC3750000E5D5
+:1005A00001F5F0E50935F0F500C3750100E500F54A
+:1005B000F0E50A35F0F500E501F5F0E50B35F0F56D
+:1005C0000B750A20750900C3750100E509F5F0E512
+:1005D0000035F0F500E501F5F0E50B35F0F501E546
+:1005E0000AF503E501F502E500F582E502F583E58C
+:1005F00003F0900000E582F50A900000E583F50B1A
+:1006000075090075010EC3750000E501F5F0E509F7
+:1006100035F0F500C3750100E500F5F0E50A35F0A9
+:10062000F500E501F5F0E50B35F0F50B750A74758D
+:100630000900C3750100E509F5F0E50035F0F500A6
+:10064000E501F5F0E50B35F0F501E50AF503E50107
+:10065000F502E500F582E502F583E503F090000080
+:10066000E582F50A900000E583F50B750900750138
+:100670000FC3750000E501F5F0E50935F0F500C39D
+:10068000750100E500F5F0E50A35F0F500E501F546
+:10069000F0E50B35F0F50B750A68750900C37501B7
+:1006A00000E509F5F0E50035F0F500E501F5F0E5C8
+:1006B0000B35F0F501E50AF503E501F502E500F576
+:1006C00082E502F583E503F0900000E582F50A90EB
+:1006D0000000E583F50B750900750110C375000076
+:1006E000E501F5F0E50935F0F500C3750100E50019
+:1006F000F5F0E50A35F0F500E501F5F0E50B35F02C
+:10070000F50B750A69750900C3750100E509F5F077
+:10071000E50035F0F500E501F5F0E50B35F0F50104
+:10072000E50AF503E501F502E500F582E502F5834A
+:10073000E503F0900000E582F50A900000E583F5FE
+:100740000B750900750111C3750000E501F5F0E5B1
+:100750000935F0F500C3750100E500F5F0E50A354F
+:10076000F0F500E501F5F0E50B35F0F50B750A73D2
+:10077000750900C3750100E509F5F0E50035F0F5F0
+:1007800000E501F5F0E50B35F0F501E50AF503E5C7
+:1007900001F502E500F582E502F583E503F090003E
+:1007A00000E582F50A900000E583F50B75090075F8
+:1007B0000112C3750000E501F5F0E50935F0F5001B
+:1007C000C3750100E500F5F0E50A35F0F500E50137
+:1007D000F5F0E50B35F0F50B750A20750900C375CA
+:1007E0000100E509F5F0E50035F0F500E501F5F06B
+:1007F000E50B35F0F501E50AF503E501F502E50045
+:10080000F582E502F583E503F0900000E582F50A44
+:10081000900000E583F50B750900750113C37500A1
+:1008200000E501F5F0E50935F0F500C3750100E5D7
+:1008300000F5F0E50A35F0F500E501F5F0E50B35DA
+:10084000F0F50B750A73750900C3750100E509F52C
+:10085000F0E50035F0F500E501F5F0E50B35F0F5D4
+:1008600001E50AF503E501F502E500F582E502F58B
+:1008700083E503F0900000E582F50A900000E5832F
+:10088000F50B750900750114C3750000E501F5F05D
+:10089000E50935F0F500C3750100E500F5F0E50A5E
+:1008A00035F0F500E501F5F0E50B35F0F50B750ACF
+:1008B00074750900C3750100E509F5F0E50035F030
+:1008C000F500E501F5F0E50B35F0F501E50AF50376
+:1008D000E501F502E500F582E502F583E503F09018
+:1008E0000000E582F50A900000E583F50B7509002C
+:1008F000750115C3750000E501F5F0E50935F0F562
+:1009000000C3750100E500F5F0E50A35F0F500E5F6
+:1009100001F5F0E50B35F0F50B750A72750900C3AA
+:10092000750100E509F5F0E50035F0F500E501F5A4
+:10093000F0E50B35F0F501E50AF503E501F502E513
+:1009400000F582E502F583E503F0900000E582F50D
+:100950000A900000E583F50B750900750116C37553
+:100960000000E501F5F0E50935F0F500C37501007B
+:10097000E500F5F0E50A35F0F500E501F5F0E50BE9
+:1009800035F0F50B750A69750900C3750100E509B5
+:10099000F5F0E50035F0F500E501F5F0E50B35F093
+:1009A000F501E50AF503E501F502E500F582E5024A
+:1009B000F583E503F0900000E582F50A900000E57C
+:1009C00083F50B750900750117C3750000E501F586
+:1009D000F0E50935F0F500C3750100E500F5F0E537
+:1009E0000A35F0F500E501F5F0E50B35F0F50B758E
+:1009F0000A6E750900C3750100E509F5F0E50035DB
+:100A0000F0F500E501F5F0E50B35F0F501E50AF547
+:100A100003E501F502E500F582E502F583E503F063
+:100A2000900000E582F50A900000E583F50B75095A
+:100A300000750118C3750000E501F5F0E50935F012
+:100A4000F500C3750100E500F5F0E50A35F0F500A5
+:100A5000E501F5F0E50B35F0F50B750A6775090052
+:100A6000C3750100E509F5F0E50035F0F500E50195
+:100A7000F5F0E50B35F0F501E50AF503E501F502C2
+:100A8000E500F582E502F583E503F0900000E582DC
+:100A9000F50A900000E583F50B750900750119C38F
+:100AA000750000E501F5F0E50935F0F500C37501C5
+:100AB00000E500F5F0E50A35F0F500E501F5F0E5B3
+:100AC0000B35F0F50B750A0A750900C3750100E5D1
+:100AD00009F5F0E50035F0F500E501F5F0E50B3539
+:100AE000F0F501E50AF503E501F502E500F582E51B
+:100AF00002F583E503F0900000E582F50A9000001E
+:100B0000E583F50B75090075011AC3750000E50151
+:100B1000F5F0E50935F0F500C3750100E500F5F0E5
+:100B2000E50A35F0F500E501F5F0E50B35F0F50BDC
+:100B3000750A00750900C3750100E509F5F0E500C7
+:100B400035F0F500E501F5F0E50B35F0F501E50AC6
+:100B5000F503E501F502E500F582E502F583E5031D
+:100B6000F0750000750100750900750A00E500F5D3
+:100B700002E501F503E509F504E50AF505E50DC013
+:100B8000E0E50CC0E0E502F582E503F583E504F558
+:100B900000E505F501220000000000000000000053
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test Darwin linker option -all_load. */
+/* Developed by Devang Patel <dpatel@apple.com>. */
+
+/* { dg-options "-all_load" } */
+/* { dg-do link { target *-*-darwin* } } */
+
+int main()
+{
+ return 0;
+}
+
--- /dev/null
+/* Test Darwin linker option -all_load. */
+/* Developed by Devang Patel <dpatel@apple.com>. */
+
+/* { dg-options "-all_load" } */
+/* { dg-do link { target *-*-darwin* } } */
+
+int main()
+{
+ return 0;
+}
+
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501750900750A00750B18
+:1000200000750C00E509F502E50AF503E50BF5049A
+:10003000E50CF505E501C0E0E500C0E0E502F5826C
+:10004000E503F583E504F500E505F5012200000070
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test Darwin linker option -bind_at_load. */
+/* Developed by Devang Patel <dpatel@apple.com>. */
+
+/* { dg-options "-bind_at_load" } */
+/* { dg-do link { target powerpc-*-darwin* } } */
+
+int main()
+{
+ return 0;
+}
+
--- /dev/null
+/* Test Darwin linker option -bind_at_load. */
+/* Developed by Devang Patel <dpatel@apple.com>. */
+
+/* { dg-options "-bind_at_load" } */
+/* { dg-do link { target powerpc-*-darwin* } } */
+
+int main()
+{
+ return 0;
+}
+
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501750900750A00750B18
+:1000200000750C00E509F502E50AF503E50BF5049A
+:10003000E50CF505E501C0E0E500C0E0E502F5826C
+:10004000E503F583E504F500E505F5012200000070
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test -dead_strip support. */
+/* Contributed by Devang Patel <dpatel@apple.com> */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-dead_strip" } */
+
+
+int
+main ()
+{
+ return 0;
+}
+
--- /dev/null
+/* Test -dead_strip support. */
+/* Contributed by Devang Patel <dpatel@apple.com> */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-dead_strip" } */
+
+
+int
+main ()
+{
+ return 0;
+}
+
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501750900750A00750B18
+:1000200000750C00E509F502E50AF503E50BF5049A
+:10003000E50CF505E501C0E0E500C0E0E502F5826C
+:10004000E503F583E504F500E505F5012200000070
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test -no_dead_strip_inits_and_terms support. */
+/* Contributed by Devang Patel <dpatel@apple.com> */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-no_dead_strip_inits_and_terms" } */
+
+int
+main ()
+{
+ return 0;
+}
+
--- /dev/null
+/* Test -no_dead_strip_inits_and_terms support. */
+/* Contributed by Devang Patel <dpatel@apple.com> */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-no_dead_strip_inits_and_terms" } */
+
+int
+main ()
+{
+ return 0;
+}
+
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501750900750A00750B18
+:1000200000750C00E509F502E50AF503E50BF5049A
+:10003000E50CF505E501C0E0E500C0E0E502F5826C
+:10004000E503F583E504F500E505F5012200000070
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test -segaddr. */
+/* Contributed by Devang Patel <dpatel@apple.com> */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-segaddr __DATA 4000" } */
+
+
+int
+main ()
+{
+ return 0;
+}
+
--- /dev/null
+/* Test -segaddr. */
+/* Contributed by Devang Patel <dpatel@apple.com> */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-segaddr __DATA 4000" } */
+
+
+int
+main ()
+{
+ return 0;
+}
+
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501750900750A00750B18
+:1000200000750C00E509F502E50AF503E50BF5049A
+:10003000E50CF505E501C0E0E500C0E0E502F5826C
+:10004000E503F583E504F500E505F5012200000070
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test -segs_read_only_addr. */
+/* Contributed by Devang Patel <dpatel@apple.com> */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-segs_read_only_addr 4000 -dynamiclib" } */
+
+
+int
+main ()
+{
+ return 0;
+}
+
--- /dev/null
+/* Test -segs_read_only_addr. */
+/* Contributed by Devang Patel <dpatel@apple.com> */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-segs_read_only_addr 4000 -dynamiclib" } */
+
+
+int
+main ()
+{
+ return 0;
+}
+
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501750900750A00750B18
+:1000200000750C00E509F502E50AF503E50BF5049A
+:10003000E50CF505E501C0E0E500C0E0E502F5826C
+:10004000E503F583E504F500E505F5012200000070
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test -segs_read_write_addr. */
+/* Contributed by Devang Patel <dpatel@apple.com> */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-segs_read_only_addr 4000 -segs_read_write_addr 8000 -dynamiclib" } */
+
+
+int
+main ()
+{
+ return 0;
+}
+
--- /dev/null
+/* Test -segs_read_write_addr. */
+/* Contributed by Devang Patel <dpatel@apple.com> */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-segs_read_only_addr 4000 -segs_read_write_addr 8000 -dynamiclib" } */
+
+
+int
+main ()
+{
+ return 0;
+}
+
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501750900750A00750B18
+:1000200000750C00E509F502E50AF503E50BF5049A
+:10003000E50CF505E501C0E0E500C0E0E502F5826C
+:10004000E503F583E504F500E505F5012200000070
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+
+/* Test Darwin linker option -arch_errors_fatal. */
+/* Developed by Devang Patel <dpatel@apple.com>. */
+
+/* { dg-options "-arch_errors_fatal" } */
+/* { dg-do link { target *-*-darwin* } } */
+
+int main()
+{
+ return 0;
+}
+
--- /dev/null
+
+/* Test Darwin linker option -arch_errors_fatal. */
+/* Developed by Devang Patel <dpatel@apple.com>. */
+
+/* { dg-options "-arch_errors_fatal" } */
+/* { dg-do link { target *-*-darwin* } } */
+
+int main()
+{
+ return 0;
+}
+
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501750900750A00750B18
+:1000200000750C00E509F502E50AF503E50BF5049A
+:10003000E50CF505E501C0E0E500C0E0E502F5826C
+:10004000E503F583E504F500E505F5012200000070
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test Darwin linker option -bundle. */
+/* Developed by Devang Patel <dpatel@apple.com>. */
+
+/* { dg-options "-bundle" } */
+/* { dg-do link { target powerpc-*-darwin* } } */
+
+int main()
+{
+ return 0;
+}
+
--- /dev/null
+/* Test Darwin linker option -bundle. */
+/* Developed by Devang Patel <dpatel@apple.com>. */
+
+/* { dg-options "-bundle" } */
+/* { dg-do link { target powerpc-*-darwin* } } */
+
+int main()
+{
+ return 0;
+}
+
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501750900750A00750B18
+:1000200000750C00E509F502E50AF503E50BF5049A
+:10003000E50CF505E501C0E0E500C0E0E502F5826C
+:10004000E503F583E504F500E505F5012200000070
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test Darwin linker option -dynamic. */
+/* Developed by Devang Patel <dpatel@apple.com>. */
+
+/* { dg-options "-dynamic" } */
+/* { dg-do link { target *-*-darwin* } } */
+
+int main()
+{
+ return 0;
+}
+
--- /dev/null
+/* Test Darwin linker option -dynamic. */
+/* Developed by Devang Patel <dpatel@apple.com>. */
+
+/* { dg-options "-dynamic" } */
+/* { dg-do link { target *-*-darwin* } } */
+
+int main()
+{
+ return 0;
+}
+
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501750900750A00750B18
+:1000200000750C00E509F502E50AF503E50BF5049A
+:10003000E50CF505E501C0E0E500C0E0E502F5826C
+:10004000E503F583E504F500E505F5012200000070
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test Darwin linker option -nofixprebinding. */
+/* Developed by Devang Patel <dpatel@apple.com>. */
+
+/* { dg-options "-nofixprebinding" } */
+/* { dg-do link { target *-*-darwin* } } */
+
+int main()
+{
+ return 0;
+}
+
--- /dev/null
+/* Test Darwin linker option -nofixprebinding. */
+/* Developed by Devang Patel <dpatel@apple.com>. */
+
+/* { dg-options "-nofixprebinding" } */
+/* { dg-do link { target *-*-darwin* } } */
+
+int main()
+{
+ return 0;
+}
+
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501750900750A00750B18
+:1000200000750C00E509F502E50AF503E50BF5049A
+:10003000E50CF505E501C0E0E500C0E0E502F5826C
+:10004000E503F583E504F500E505F5012200000070
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Basic test of the -mmacosx-version-min option. */
+
+/* { dg-options "-mmacosx-version-min=10.1" } */
+/* { dg-do link { target *-*-darwin* } } */
+
+int main()
+{
+ return 0;
+}
+
--- /dev/null
+/* Basic test of the -mmacosx-version-min option. */
+
+/* { dg-options "-mmacosx-version-min=10.1" } */
+/* { dg-do link { target *-*-darwin* } } */
+
+int main()
+{
+ return 0;
+}
+
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501750900750A00750B18
+:1000200000750C00E509F502E50AF503E50BF5049A
+:10003000E50CF505E501C0E0E500C0E0E502F5826C
+:10004000E503F583E504F500E505F5012200000070
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-require-weak "" } */
+/* { dg-options "-fno-common" } */
+
+/* { dg-final { scan-assembler "weak_reference _a" } } */
+/* { dg-final { scan-assembler-not "weak_\[a-z \t\]*_b" } } */
+
+extern void a (void) __attribute__((weak_import));
+extern void b (void) __attribute__((weak_import));
+
+void b(void)
+{
+ a();
+}
--- /dev/null
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-require-weak "" } */
+/* { dg-options "-fno-common" } */
+
+/* { dg-final { scan-assembler "weak_reference _a" } } */
+/* { dg-final { scan-assembler-not "weak_\[a-z \t\]*_b" } } */
+
+extern void a (void) __attribute__((weak_import));
+extern void b (void) __attribute__((weak_import));
+
+void b(void)
+{
+ a();
+}
--- /dev/null
+:100000000000E506758202C39582F506E507758353
+:10001000009583F507D0E0F50875E0012506F58227
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000002506F58275E0003507F583E508F075C3
+:100040000000E500F502E500F503E500F504E50034
+:10005000F50575E0002506F58275E0003507F583A6
+:10006000E0F508E508C0E075E0012506F58275E0D9
+:10007000003507F583E0F508E508C0E075E00225E6
+:1000800006F50675E0003507F507E502F582E5039C
+:10009000F583E504F500E505F50122000000000008
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Redeclaration of parameters is an error. PR 13728. */
+/* { dg-do compile } */
+
+void f (int fred, /* { dg-error "previous definition" "" } */
+ int fred); /* { dg-error "redefinition of parameter" "" } */
+
+void f2 (int fred, /* { dg-error "previous definition" "" } */
+ int fred) /* { dg-error "redefinition of parameter" "" } */
+{
+}
--- /dev/null
+/* Redeclaration of parameters is an error. PR 13728. */
+/* { dg-do compile } */
+
+void f (int fred, /* { dg-error "previous definition" "" } */
+ int fred); /* { dg-error "redefinition of parameter" "" } */
+
+void f2 (int fred, /* { dg-error "previous definition" "" } */
+ int fred) /* { dg-error "redefinition of parameter" "" } */
+{
+}
--- /dev/null
+:1000000000E506758208C39582F506E5077583004D
+:100010009583F507D0E0F500D0E0F501750900E51E
+:1000200009F502E509F503E509F504E509F505E536
+:1000300001C0E0E500C0E075E0082506F50675E0C2
+:10004000003507F507E502F582E503F583E504F5DC
+:1000500000E505F50122000000000000000000009E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+
+extern int var;
+
+int foo1(void)
+{
+ extern int var;
+
+ var += 1;
+}
+
+int foo2(void)
+{
+ var += 1;
+}
--- /dev/null
+/* { dg-do compile } */
+
+extern int var;
+
+int foo1(void)
+{
+ extern int var;
+
+ var += 1;
+}
+
+int foo2(void)
+{
+ var += 1;
+}
--- /dev/null
+:1000000000D0E0F519D0E0F51AE510F518900000E1
+:10001000E582F50F900000E583F510900000E58281
+:10002000F509900000E583F50A750100C37500002D
+:10003000E501F5F0E50935F0F501E500F5F0E50A33
+:1000400035F0F500E500F502E501F582E502F583FE
+:10005000E0F50B750101C3750000E501F5F0E50958
+:1000600035F0F501E500F5F0E50A35F0F500E500BD
+:10007000F502E501F582E502F583E0F50C75010274
+:10008000C3750000E501F5F0E50935F0F501E5007F
+:10009000F5F0E50A35F0F500E500F502E501F58239
+:1000A000E502F583E0F50D750103C3750000E50178
+:1000B000F5F0E50935F0F501E500F5F0E50A35F074
+:1000C000F500E500F502E501F582E502F583E0F5CE
+:1000D0000E750001750100750900750A00C3751BD6
+:1000E00000E500F5F0E50B35F0F500E501F5F0E58C
+:1000F0000C35F0F501E509F5F0E50D35F0F509E50C
+:100100000AF5F0E50E35F0F50C750B00C3750A0025
+:10011000E50BF5F0E50F35F0F50BE50AF5F0E51028
+:1001200035F0F50AE500F503E50AF502E50BF58281
+:10013000E502F583E503F0750B01C3750000E50BDF
+:10014000F5F0E50F35F0F50BE500F5F0E51035F0CD
+:10015000F50AE501F503E50AF502E50BF582E5028E
+:10016000F583E503F0750B02C3750000E50BF5F0B0
+:10017000E50F35F0F50BE500F5F0E51035F0F50A83
+:10018000E509F503E50AF502E50BF582E502F583DD
+:10019000E503F0750B03C3750000E50BF5F0E50F03
+:1001A00035F0F50BE500F5F0E51035F0F50AE50C56
+:1001B000F503E50AF502E50BF582E502F583E503B3
+:1001C000F0E51CF502E51CF503E51CF504E51CF55E
+:1001D00005E518F510E51AC0E0E519C0E0E502F5FF
+:1001E00082E503F583E504F500E505F5012200D07D
+:1001F000E0F519D0E0F51AE510F518900000E58259
+:10020000F50F900000E583F510900000E582F509F8
+:10021000900000E583F50A750100C3750000E50153
+:10022000F5F0E50935F0F501E500F5F0E50A35F002
+:10023000F500E500F502E501F582E502F583E0F55C
+:100240000B750101C3750000E501F5F0E50935F016
+:10025000F501E500F5F0E50A35F0F500E500F502F9
+:10026000E501F582E502F583E0F50C750102C37541
+:100270000000E501F5F0E50935F0F501E500F5F0E0
+:10028000E50A35F0F500E500F502E501F582E50245
+:10029000F583E0F50D750103C3750000E501F5F088
+:1002A000E50935F0F501E500F5F0E50A35F0F50072
+:1002B000E500F502E501F582E502F583E0F50E754E
+:1002C0000001750100750900750A00C3751B00E582
+:1002D00000F5F0E50B35F0F500E501F5F0E50C353E
+:1002E000F0F501E509F5F0E50D35F0F509E50AF55C
+:1002F000F0E50E35F0F50C750B00C3750A00E50B43
+:10030000F5F0E50F35F0F50BE50AF5F0E51035F001
+:10031000F50AE500F503E50AF502E50BF582E502CD
+:10032000F583E503F0750B01C3750000E50BF5F0EF
+:10033000E50F35F0F50BE500F5F0E51035F0F50AC1
+:10034000E501F503E50AF502E50BF582E502F58323
+:10035000E503F0750B02C3750000E50BF5F0E50F42
+:1003600035F0F50BE500F5F0E51035F0F50AE50997
+:10037000F503E50AF502E50BF582E502F583E503F1
+:10038000F0750B03C3750000E50BF5F0E50F35F0D4
+:10039000F50BE500F5F0E51035F0F50AE50CF50391
+:1003A000E50AF502E50BF582E502F583E503F0E5E4
+:1003B0001CF502E51CF503E51CF504E51CF505E557
+:1003C00018F510E51AC0E0E519C0E0E502F582E590
+:1003D00003F583E504F500E505F5012200000000C2
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test type qualifier in empty declaration: OK but useless. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors" } */
+
+const struct foo; /* { dg-warning "warning: useless type qualifier in empty declaration" } */
--- /dev/null
+/* Test type qualifier in empty declaration: OK but useless. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors" } */
+
+const struct foo; /* { dg-warning "warning: useless type qualifier in empty declaration" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test declaration specifiers. Test cases that used to be handled in
+ a loop in grokdeclarator. Pedantic cases. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89 -pedantic" } */
+
+/* These should all be diagnosed, but only once, not for every
+ identifier declared. */
+
+const const int x0, /* { dg-warning "duplicate" } */
+x1;
+
+long long x2, /* { dg-warning "long long" } */
+x3;
--- /dev/null
+/* Test declaration specifiers. Test cases that used to be handled in
+ a loop in grokdeclarator. Pedantic cases. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89 -pedantic" } */
+
+/* These should all be diagnosed, but only once, not for every
+ identifier declared. */
+
+const const int x0, /* { dg-warning "duplicate" } */
+x1;
+
+long long x2, /* { dg-warning "long long" } */
+x3;
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test declaration specifiers. Test diagnosis of storage class
+ specifiers not at start. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-W" } */
+
+static int x0;
+int static x1; /* { dg-warning "not at beginning" } */
+
+extern int x2;
+int extern x3; /* { dg-warning "not at beginning" } */
+
+typedef int x4;
+int typedef x5; /* { dg-warning "not at beginning" } */
+
+void g (int);
+
+void
+f (void)
+{
+ auto int x6 = 0;
+ int auto x7 = 0; /* { dg-warning "not at beginning" } */
+ register int x8 = 0;
+ int register x9 = 0; /* { dg-warning "not at beginning" } */
+ g (x6 + x7 + x8 + x9);
+}
+
+const static int x10; /* { dg-warning "not at beginning" } */
+
+/* Attributes are OK before storage class specifiers, since some
+ attributes are like such specifiers themselves. */
+
+__attribute__((format(printf, 1, 2))) static void h (const char *, ...);
+__attribute__((format(printf, 1, 2))) void static i (const char *, ...); /* { dg-warning "not at beginning" } */
--- /dev/null
+/* Test declaration specifiers. Test diagnosis of storage class
+ specifiers not at start. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-W" } */
+
+static int x0;
+int static x1; /* { dg-warning "not at beginning" } */
+
+extern int x2;
+int extern x3; /* { dg-warning "not at beginning" } */
+
+typedef int x4;
+int typedef x5; /* { dg-warning "not at beginning" } */
+
+void g (int);
+
+void
+f (void)
+{
+ auto int x6 = 0;
+ int auto x7 = 0; /* { dg-warning "not at beginning" } */
+ register int x8 = 0;
+ int register x9 = 0; /* { dg-warning "not at beginning" } */
+ g (x6 + x7 + x8 + x9);
+}
+
+const static int x10; /* { dg-warning "not at beginning" } */
+
+/* Attributes are OK before storage class specifiers, since some
+ attributes are like such specifiers themselves. */
+
+__attribute__((format(printf, 1, 2))) static void h (const char *, ...);
+__attribute__((format(printf, 1, 2))) void static i (const char *, ...); /* { dg-warning "not at beginning" } */
--- /dev/null
+:100000000000E506758209C39582F506E50775834C
+:10001000009583F507D0E0F50875E0012506F58227
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000002506F58275E0003507F583E508F075C3
+:10004000E0082506F58275E0003507F583E516F032
+:1000500075E0072506F58275E0003507F583E5159F
+:10006000F075E0062506F58275E0003507F583E5B5
+:1000700014F075E0052506F58275E0003507F58377
+:10008000E513F075E0042506F58275E0003507F507
+:1000900083E512F075E0032506F58275E00035076B
+:1000A000F583E511F075E0022506F58275E000356F
+:1000B00007F583E510F075130075140075150075CC
+:1000C0001600750F00751000751100751200750B84
+:1000D00000750C00750D00750E00750000750100AF
+:1000E000750900750A00C3751800E50FF5F0E513F2
+:1000F00035F0F50FE510F5F0E51435F0F510E511E4
+:10010000F5F0E51535F0F511E512F5F0E51635F0E9
+:10011000F513C3751200E50BF5F0E50F35F0F50B9F
+:10012000E50CF5F0E51035F0F50CE50DF5F0E51111
+:1001300035F0F50DE50EF5F0E51335F0F50FC37567
+:100140000E00E500F5F0E50B35F0F500E501F5F002
+:10015000E50C35F0F501E509F5F0E50D35F0F509AB
+:10016000E50AF5F0E50F35F0F50AE500F51FE501C4
+:10017000F51EE509F51DE50AF51C750000E500F51D
+:1001800002E500F503E500F504E500F50575E00876
+:100190002506F58275E0003507F583E0F51675E074
+:1001A000072506F58275E0003507F583E0F515753E
+:1001B000E0062506F58275E0003507F583E0F514C5
+:1001C00075E0052506F58275E0003507F583E0F555
+:1001D0001375E0042506F58275E0003507F583E028
+:1001E000F51275E0032506F58275E0003507F58305
+:1001F000E0F51175E0022506F58275E0003507F59A
+:1002000083E0F51075E0002506F58275E0003507FE
+:10021000F583E0F508E508C0E075E0012506F58204
+:1002200075E0003507F583E0F508E508C0E075E006
+:10023000092506F50675E0003507F507E502F582A4
+:10024000E503F583E504F500E505F501220000006E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test __attribute__((deprecated)). Test merging with multiple
+ declarations. Bug 7425. */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+void func(void);
+void func(void) __attribute__((deprecated));
+
+void f(void) {
+ func(); /* { dg-warning "'func' is deprecated" } */
+}
--- /dev/null
+/* Test __attribute__((deprecated)). Test merging with multiple
+ declarations. Bug 7425. */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+void func(void);
+void func(void) __attribute__((deprecated));
+
+void f(void) {
+ func(); /* { dg-warning "'func' is deprecated" } */
+}
--- /dev/null
+:100000000000E506758202C39582F506E507758353
+:10001000009583F507D0E0F50875E0012506F58227
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000002506F58275E0003507F583E508F075C3
+:100040000000E500F502E500F503E500F504E50034
+:10005000F50575E0002506F58275E0003507F583A6
+:10006000E0F508E508C0E075E0012506F58275E0D9
+:10007000003507F583E0F508E508C0E075E00225E6
+:1000800006F50675E0003507F507E502F582E5039C
+:10009000F583E504F500E505F50122000000000008
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* These dllimport and dllexport appearing for a symbol.
+ The desired behavior is that if both dllimport
+ and dllexport appear (in either order) the result is dllexport.
+
+ Microsoft's MSVC 2.0 allows dllimport followed by dllexport for variables,
+ but does not allow dllexport followed by dllimport.
+
+ In C, it's ok to redeclare a variable so this works for variables
+ and functions. In C++, it only works for functions. */
+
+/* { dg-require-dll "" } */
+
+__declspec (dllimport) int foo1 ();
+__declspec (dllexport) int foo1 (); /* { dg-warning "previous dllimport ignored" } */
+__declspec (dllexport) int foo2 ();
+__declspec (dllimport) int foo2 (); /* { dg-warning "dllimport ignored" } */
+
+__declspec (dllimport) int bar1;
+__declspec (dllexport) int bar1; /* { dg-warning "previous dllimport ignored" } */
+
+__declspec (dllexport) int bar2;
+__declspec (dllimport) int bar2; /* { dg-warning "dllimport ignored" } */
--- /dev/null
+/* These dllimport and dllexport appearing for a symbol.
+ The desired behavior is that if both dllimport
+ and dllexport appear (in either order) the result is dllexport.
+
+ Microsoft's MSVC 2.0 allows dllimport followed by dllexport for variables,
+ but does not allow dllexport followed by dllimport.
+
+ In C, it's ok to redeclare a variable so this works for variables
+ and functions. In C++, it only works for functions. */
+
+/* { dg-require-dll "" } */
+
+__declspec (dllimport) int foo1 ();
+__declspec (dllexport) int foo1 (); /* { dg-warning "previous dllimport ignored" } */
+__declspec (dllexport) int foo2 ();
+__declspec (dllimport) int foo2 (); /* { dg-warning "dllimport ignored" } */
+
+__declspec (dllimport) int bar1;
+__declspec (dllexport) int bar1; /* { dg-warning "previous dllimport ignored" } */
+
+__declspec (dllexport) int bar2;
+__declspec (dllimport) int bar2; /* { dg-warning "dllimport ignored" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target arm*-*-pe* } } */
+/* { dg-do compile { target i?86-pc-cygwin } } */
+/* { dg-do compile { target i?86-pc-mingw* } } */
+
+__declspec (dllimport) int foo1;
+int foo1; /* { dg-warning "redeclared without dllimport" } */
+
+__declspec (dllimport) int foo2;
+int foo2 = 5; /* { dg-warning "redeclared without dllimport" } */
+
+int f () { return foo1 + foo2; }
+
+/* FIXME: We should scan the output of nm for this case. */
+/* { dg-final { scan-assembler "(foo2:.*\.comm\[ \t_\]*foo1)" } } */
+/* { dg-final { scan-assembler-not "(__imp_|_imp__)" } } */
--- /dev/null
+/* { dg-do compile { target arm*-*-pe* } } */
+/* { dg-do compile { target i?86-pc-cygwin } } */
+/* { dg-do compile { target i?86-pc-mingw* } } */
+
+__declspec (dllimport) int foo1;
+int foo1; /* { dg-warning "redeclared without dllimport" } */
+
+__declspec (dllimport) int foo2;
+int foo2 = 5; /* { dg-warning "redeclared without dllimport" } */
+
+int f () { return foo1 + foo2; }
+
+/* FIXME: We should scan the output of nm for this case. */
+/* { dg-final { scan-assembler "(foo2:.*\.comm\[ \t_\]*foo1)" } } */
+/* { dg-final { scan-assembler-not "(__imp_|_imp__)" } } */
--- /dev/null
+:1000000000D0E0F51AD0E0F51BE511F518E510F584
+:1000100019900000E582F509900000E583F50A7566
+:100020000100C3750000E501F5F0E50935F0F501C3
+:10003000E500F5F0E50A35F0F500E500F502E5012B
+:10004000F582E502F583E0F50E750101C375000048
+:10005000E501F5F0E50935F0F501E500F5F0E50A13
+:1000600035F0F500E500F502E501F582E502F583DE
+:10007000E0F50F750102C3750000E501F5F0E50933
+:1000800035F0F501E500F5F0E50A35F0F500E5009D
+:10009000F502E501F582E502F583E0F5107501034F
+:1000A000C3750000E501F5F0E50935F0F501E5005F
+:1000B000F5F0E50A35F0F500E500F502E501F58219
+:1000C000E502F583E0F511900004E582F509900062
+:1000D00004E583F50A750100C3750000E501F5F03C
+:1000E000E50935F0F501E500F5F0E50A35F0F50034
+:1000F000E500F502E501F582E502F583E0F50B7513
+:100100000101C3750000E501F5F0E50935F0F501E1
+:10011000E500F5F0E50A35F0F500E500F502E5014A
+:10012000F582E502F583E0F50C750102C375000068
+:10013000E501F5F0E50935F0F501E500F5F0E50A32
+:1001400035F0F500E500F502E501F582E502F583FD
+:10015000E0F50D750103C3750000E501F5F0E50953
+:1001600035F0F501E500F5F0E50A35F0F500E500BC
+:10017000F502E501F582E502F583E0F500C37501BE
+:1001800000E50BF5F0E50E35F0F501E50CF5F0E5D1
+:100190000F35F0F509E50DF5F0E51035F0F50AE558
+:1001A00000F5F0E51135F0F500E501F502E509F59A
+:1001B00003E50AF504E500F505E518F511E519F57F
+:1001C00010E51BC0E0E51AC0E0E502F582E503F5A5
+:1001D00083E504F500E505F50122000000000000BC
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Copyright (C) 2003 Free Software Foundation, Inc. */
+
+/* { dg-do compile } */
+/* { dg-options -fno-dollars-in-identifiers } */
+
+/* Test that -fno-dollars-in-identifiers is honoured.
+ Neil Booth, 17 May 2003. */
+
+int foobar$; /* { dg-error "stray '\\$'" } */
--- /dev/null
+/* Copyright (C) 2003 Free Software Foundation, Inc. */
+
+/* { dg-do compile } */
+/* { dg-options -fno-dollars-in-identifiers } */
+
+/* Test that -fno-dollars-in-identifiers is honoured.
+ Neil Booth, 17 May 2003. */
+
+int foobar$; /* { dg-error "stray '\\$'" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+extern void exit (int);
+unsigned global_iters=0;
+
+void bi_reverse(int len)
+{
+ do {
+ global_iters++;
+ } while (--len > 0);
+}
+
+int main()
+{
+ bi_reverse(5);
+ if (global_iters != 5)
+ exit (1);
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+extern void exit (int);
+unsigned global_iters=0;
+
+void bi_reverse(int len)
+{
+ do {
+ global_iters++;
+ } while (--len > 0);
+}
+
+int main()
+{
+ bi_reverse(5);
+ if (global_iters != 5)
+ exit (1);
+ return 0;
+}
--- /dev/null
+:1000000075812F7506FF7507FF12073702000C0078
+:1000100000E50675820EC39582F506E50775830037
+:100020009583F507D0E0F50875E0012506F58275A2
+:10003000E0003507F583E508F0D0E0F50875E0004D
+:100040002506F58275E0003507F583E508F075E0D3
+:10005000092506F58275E0003507F583E517F0758B
+:10006000E0082506F58275E0003507F583E516F012
+:1000700075E0072506F58275E0003507F583E5157F
+:10008000F075E0062506F58275E0003507F583E595
+:1000900014F075E0052506F58275E0003507F58357
+:1000A000E513F075E0042506F58275E0003507F5E7
+:1000B00083E512F075E0032506F58275E00035074B
+:1000C000F583E511F075E0022506F58275E000354F
+:1000D00007F583E510F0E51FF518E51EF517E51D9A
+:1000E000F516E51CF515750C01750D00750E0075FE
+:1000F0000F00750101C3750000E50CF5F0E50095F2
+:10010000F0F500750000E500F5F0E50035F0F500CC
+:10011000E500F5F0E50165F0F501C3750000E50DBA
+:10012000F5F0E50095F0F500750000E500F5F0E567
+:100130000035F0F500E500F5F0E50165F0F501C3E7
+:10014000750000E50EF5F0E50095F0F5007500008E
+:10015000E500F5F0E50035F0F500E500F5F0E50126
+:1001600065F0F501C3750000E50FF5F0E50095F0C9
+:10017000F500750000E500F5F0E50035F0F500E567
+:1001800000F5F0E50165F0F501750900750A0075E7
+:100190000B00750000E501F5F0E50045F0F500E520
+:1001A00009F5F0E50045F0F500E50AF5F0E5004554
+:1001B000F0F500E50BF5F0E50045F0F500E5007021
+:1001C00002800302065200900000E582F50E9000C6
+:1001D00000E583F50F900000E582F509900000E549
+:1001E00083F50A750100C3750000E501F5F0E50926
+:1001F00035F0F501E500F5F0E50A35F0F500E5002C
+:10020000F502E501F582E502F583E0F50B750101E4
+:10021000C3750000E501F5F0E50935F0F501E500ED
+:10022000F5F0E50A35F0F500E500F502E501F582A7
+:10023000E502F583E0F50C750102C3750000E501E8
+:10024000F5F0E50935F0F501E500F5F0E50A35F0E2
+:10025000F500E500F502E501F582E502F583E0F53C
+:100260000D750103C3750000E501F5F0E50935F0F2
+:10027000F501E500F5F0E50A35F0F500E500F502D9
+:10028000E501F582E502F583E0F5107500017501E1
+:1002900000750900750A00C3751100E500F5F0E569
+:1002A0000B35F0F500E501F5F0E50C35F0F501E56D
+:1002B00009F5F0E50D35F0F509E50AF5F0E510353D
+:1002C000F0F50C750B00C3750A00E50BF5F0E50EB3
+:1002D00035F0F50BE50AF5F0E50F35F0F50AE50028
+:1002E000F503E50AF502E50BF582E502F583E50382
+:1002F000F0750B01C3750000E50BF5F0E50E35F068
+:10030000F50BE500F5F0E50F35F0F50AE501F5032D
+:10031000E50AF502E50BF582E502F583E503F075E4
+:100320000B02C3750000E50BF5F0E50E35F0F50B9B
+:10033000E500F5F0E50F35F0F50AE509F503E50A06
+:10034000F502E50BF582E502F583E503F0750B0395
+:10035000C3750000E50BF5F0E50E35F0F50BE50093
+:10036000F5F0E50F35F0F50AE50CF503E50AF502C1
+:10037000E50BF582E502F583E503F07500017501F3
+:1003800000750900750A00C3E500F5F0E51895F061
+:10039000F518E501F5F0E51795F0F517E509F5F025
+:1003A000E51695F0F516E50AF5F0E51595F0F51565
+:1003B000751A00751400751200751300E518F51B09
+:1003C000E517F519E516F510E515F511750080E549
+:1003D00000F5F0E51325F0F513E500F5F0E511253E
+:1003E000F0F511750C00750D00750E00750F007598
+:1003F0000B00750A01750001C3E511F5F0E51395D1
+:10040000F0F509E50BF5F0E50B35F0F509E509F533
+:10041000F0E50055F0F500E500F5F0E50C45F0F5E8
+:100420000C750001C3E511F5F0E51395F0F509E54C
+:100430000BF5F0E50B35F0F509E513F5F0E5119551
+:10044000F0F501E50BF5F0E50B35F0F501E501F50B
+:10045000F0E50945F0F509E50AF5F0E50965F0F57F
+:1004600009E509F5F0E50055F0F500C3E510F5F0F4
+:10047000E51295F0F509E50BF5F0E50B35F0F5091A
+:10048000E509F5F0E50055F0F500E500F5F0E50CBF
+:1004900045F0F50C750001C3E511F5F0E51395F095
+:1004A000F509E50BF5F0E50B35F0F509E513F5F089
+:1004B000E51195F0F501E50BF5F0E50B35F0F501EB
+:1004C000E501F5F0E50945F0F509E50AF5F0E5097E
+:1004D00065F0F509E509F5F0E50055F0F500C3E52F
+:1004E00010F5F0E51295F0F509E50BF5F0E50B35A3
+:1004F000F0F509E512F5F0E51095F0F501E50BF5DD
+:10050000F0E50B35F0F501E501F5F0E50945F0F50D
+:1005100009E50AF5F0E50965F0F509E509F5F0E505
+:100520000055F0F500C3E519F5F0E51495F0F5096F
+:10053000E50BF5F0E50B35F0F509E509F5F0E5001B
+:1005400055F0F500E500F5F0E50C45F0F50C75000B
+:1005500001C3E511F5F0E51395F0F509E50BF5F0AC
+:10056000E50B35F0F509E513F5F0E51195F0F5012A
+:10057000E50BF5F0E50B35F0F501E501F5F0E509E2
+:1005800045F0F509E50AF5F0E50965F0F509E50935
+:10059000F5F0E50055F0F500C3E510F5F0E512952E
+:1005A000F0F509E50BF5F0E50B35F0F509E512F589
+:1005B000F0E51095F0F501E50BF5F0E50B35F0F5FC
+:1005C00001E501F5F0E50945F0F509E50AF5F0E585
+:1005D0000965F0F509E509F5F0E50055F0F500C30A
+:1005E000E519F5F0E51495F0F509E50BF5F0E50BE7
+:1005F00035F0F509E514F5F0E51995F0F501E50B91
+:10060000F5F0E50B35F0F501E501F5F0E50945F00C
+:10061000F509E50AF5F0E50965F0F509E509F5F0F4
+:10062000E50055F0F500C3E51BF5F0E51A95F0F58A
+:1006300009E50BF5F0E50B35F0F509E509F5F0E511
+:100640000055F0F500E500F5F0E50C45F0F50C027D
+:1006500000F200750000E500F502E500F503E50095
+:10066000F504E500F50575E0092506F58275E0005D
+:100670003507F583E0F51775E0082506F58275E086
+:10068000003507F583E0F51675E0072506F5827558
+:10069000E0003507F583E0F51575E0062506F582DF
+:1006A00075E0003507F583E0F51475E0052506F5DE
+:1006B0008275E0003507F583E0F51375E004250643
+:1006C000F58275E0003507F583E0F51275E0032546
+:1006D00006F58275E0003507F583E0F51175E00257
+:1006E0002506F58275E0003507F583E0F51075E025
+:1006F000002506F58275E0003507F583E0F508E58D
+:1007000008C0E075E0012506F58275E0003507F5C3
+:1007100083E0F508E508C0E075E00E2506F50675EE
+:10072000E0003507F507E502F582E503F583E5040A
+:10073000F500E505F5012200E506758202C3958204
+:10074000F506E5077583009583F507D0E0F5087594
+:10075000E0012506F58275E0003507F583E508F030
+:10076000D0E0F50875E0002506F58275E000350754
+:10077000F583E508F0900000E582F50A900000E5B9
+:1007800083F501750900C3750000E509F5F0E50A78
+:1007900035F0F50DE500F5F0E50135F0F50E7509DC
+:1007A00000750A00750B00750C00750100C375001B
+:1007B00000E501F5F0E50D35F0F501E500F5F0E5B2
+:1007C0000E35F0F500E509F503E500F502E501F564
+:1007D00082E502F583E503F0750101C3750000E5CC
+:1007E00001F5F0E50D35F0F501E500F5F0E50E3524
+:1007F000F0F500E50AF503E500F502E501F582E50F
+:1008000002F583E503F0750102C3750000E501F50B
+:10081000F0E50D35F0F501E500F5F0E50E35F0F504
+:1008200000E50BF503E500F502E501F582E502F5CB
+:1008300083E503F0750103C3750000E501F5F0E5FC
+:100840000D35F0F501E500F5F0E50E35F0F500E5C4
+:100850000CF503E500F502E501F582E502F583E517
+:1008600003F0751F05751E00751D00751C00120034
+:1008700010900000E582F509900000E583F50A7507
+:100880000100C3750000E501F5F0E50935F0F5015B
+:10089000E500F5F0E50A35F0F500E500F502E501C3
+:1008A000F582E502F583E0F50B750101C3750000E3
+:1008B000E501F5F0E50935F0F501E500F5F0E50AAB
+:1008C00035F0F500E500F502E501F582E502F58376
+:1008D000E0F50C750102C3750000E501F5F0E509CE
+:1008E00035F0F501E500F5F0E50A35F0F500E50035
+:1008F000F502E501F582E502F583E0F50D750103EA
+:10090000C3750000E501F5F0E50935F0F501E500F6
+:10091000F5F0E50A35F0F500E500F502E501F582B0
+:10092000E502F583E0F50E75000575010075090017
+:10093000750A00750F00C3E500F5F0E50B95F0F5BD
+:1009400000E500F5F0E50F45F0F50FC3E501F5F022
+:10095000E50C95F0F500E500F5F0E50F45F0F50F35
+:10096000C3E509F5F0E50D95F0F500E500F5F0E5D6
+:100970000F45F0F50FC3E50AF5F0E50E95F0F5002B
+:10098000E500F5F0E50F45F0F50F7501007509007C
+:10099000750A00750000E50FF5F0E50045F0F5007B
+:1009A000E501F5F0E50045F0F500E509F5F0E500B5
+:1009B00045F0F500E50AF5F0E50045F0F500E50045
+:1009C00070028003020A2D00750000750100750990
+:1009D00000750A00E500F502E501F503E509F504F7
+:1009E000E50AF50575E0002506F58275E000350796
+:1009F000F583E0F508E508C0E075E0012506F5821D
+:100A000075E0003507F583E0F508E508C0E075E01E
+:100A1000022506F50675E0003507F507E502F582C3
+:100A2000E503F583E504F500E505F5012200751FF2
+:100A300001751E00751D00751C000209C80000002C
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostic for an empty source file. Test with no special
+ options. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
--- /dev/null
+/* Test diagnostic for an empty source file. Test with no special
+ options. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostic for an empty source file. Test with -pedantic. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic" } */
+
+/* { dg-warning "warning: ISO C forbids an empty source file" "empty" { target *-*-* } 1 } */
--- /dev/null
+/* Test diagnostic for an empty source file. Test with -pedantic. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic" } */
+
+/* { dg-warning "warning: ISO C forbids an empty source file" "empty" { target *-*-* } 1 } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostic for an empty source file. Test with
+ -pedantic-errors. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors" } */
+
+/* { dg-error "error: ISO C forbids an empty source file" "empty" { target *-*-* } 1 } */
--- /dev/null
+/* Test diagnostic for an empty source file. Test with
+ -pedantic-errors. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors" } */
+
+/* { dg-error "error: ISO C forbids an empty source file" "empty" { target *-*-* } 1 } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-options "-fshort-enums" } */
+/* Check that "-fshort-enums" packs enumeration tyes into a minimal
+ number of bytes.. */
+
+enum e { e_1 };
+
+extern int i[sizeof (enum e)];
+int i[1];
--- /dev/null
+/* { dg-options "-fshort-enums" } */
+/* Check that "-fshort-enums" packs enumeration tyes into a minimal
+ number of bytes.. */
+
+enum e { e_1 };
+
+extern int i[sizeof (enum e)];
+int i[1];
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for non-integer enum values. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+enum e { E, F };
+enum e2 {
+ E1 = (void *)4, /* { dg-error "error: enumerator value for 'E1' is not an integer constant" } */
+ E2 = (enum e)F,
+ E3 = (_Bool)1
+};
--- /dev/null
+/* Test for non-integer enum values. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+enum e { E, F };
+enum e2 {
+ E1 = (void *)4, /* { dg-error "error: enumerator value for 'E1' is not an integer constant" } */
+ E2 = (enum e)F,
+ E3 = (_Bool)1
+};
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostic for extra semicolon outside a function. Test with
+ no special options. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+;
--- /dev/null
+/* Test diagnostic for extra semicolon outside a function. Test with
+ no special options. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+;
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostic for extra semicolon outside a function. Test with
+ -pedantic. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic" } */
+
+; /* { dg-warning "warning: ISO C does not allow extra ';' outside of a function" } */
--- /dev/null
+/* Test diagnostic for extra semicolon outside a function. Test with
+ -pedantic. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic" } */
+
+; /* { dg-warning "warning: ISO C does not allow extra ';' outside of a function" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostic for extra semicolon outside a function. Test with
+ -pedantic-errors. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors" } */
+
+; /* { dg-error "error: ISO C does not allow extra ';' outside of a function" } */
--- /dev/null
+/* Test diagnostic for extra semicolon outside a function. Test with
+ -pedantic-errors. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors" } */
+
+; /* { dg-error "error: ISO C does not allow extra ';' outside of a function" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR middle-end/15486 */
+/* Origin: Jonathan Larmour <jifl-bugzilla@jifvik.org> */
+
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-fdata-sections" } */
+
+int x;
+
+/* { dg-final { scan-assembler "comm" } } */
--- /dev/null
+/* PR middle-end/15486 */
+/* Origin: Jonathan Larmour <jifl-bugzilla@jifvik.org> */
+
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-fdata-sections" } */
+
+int x;
+
+/* { dg-final { scan-assembler "comm" } } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O1 -fwrapv" } */
+#define ABS(x) (x > 0 ? x : -x)
+int f (int a, int b) {
+ if ((ABS(a) | b) != 0) return 1;
+ else return 0;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O1 -fwrapv" } */
+#define ABS(x) (x > 0 ? x : -x)
+int f (int a, int b) {
+ if ((ABS(a) | b) != 0) return 1;
+ else return 0;
+}
--- /dev/null
+:1000000000E506758212C39582F506E50775830043
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F075E0E3
+:10004000092506F58275E0003507F583E517F0759B
+:10005000E0082506F58275E0003507F583E516F022
+:1000600075E0072506F58275E0003507F583E5158F
+:10007000F075E0062506F58275E0003507F583E5A5
+:1000800014F075E0052506F58275E0003507F58367
+:10009000E513F075E0042506F58275E0003507F5F7
+:1000A00083E512F075E0032506F58275E00035075B
+:1000B000F583E511F075E0022506F58275E000355F
+:1000C00007F583E510F0E51AF517E519F516E518BB
+:1000D000F515751400751000750E00750F00E51C00
+:1000E000F50D750080E500F5F0E50F25F0F50FE55D
+:1000F00000F5F0E50D25F0F50D750C007511007596
+:100100001200751300750B00750A01750001C3E537
+:100110000DF5F0E50F95F0F509E50BF5F0E50B357C
+:10012000F0F509E509F5F0E50055F0F500E500F515
+:10013000F0E50C45F0F50C750001C3E50DF5F0E5B3
+:100140000F95F0F509E50BF5F0E50B35F0F509E550
+:100150000FF5F0E50D95F0F501E50BF5F0E50B3544
+:10016000F0F501E501F5F0E50945F0F509E50AF5D9
+:10017000F0E50965F0F509E509F5F0E50055F0F55C
+:1001800000C3E51DF5F0E50E95F0F509E50BF5F07A
+:10019000E50B35F0F509E509F5F0E50055F0F5005A
+:1001A000E500F5F0E50C45F0F50C750001C3E50D33
+:1001B000F5F0E50F95F0F509E50BF5F0E50B35F0F9
+:1001C000F509E50FF5F0E50D95F0F501E50BF5F016
+:1001D000E50B35F0F501E501F5F0E50945F0F50928
+:1001E000E50AF5F0E50965F0F509E509F5F0E50042
+:1001F00055F0F500C3E51DF5F0E50E95F0F509E5C0
+:100200000BF5F0E50B35F0F509E50EF5F0E51D957C
+:10021000F0F501E50BF5F0E50B35F0F501E501F53D
+:10022000F0E50945F0F509E50AF5F0E50965F0F5B1
+:1002300009E509F5F0E50055F0F500C3E51EF5F018
+:10024000E51095F0F509E50BF5F0E50B35F0F5094E
+:10025000E509F5F0E50055F0F500E500F5F0E50CF1
+:1002600045F0F50C750001C3E50DF5F0E50F95F0CF
+:10027000F509E50BF5F0E50B35F0F509E50FF5F0BF
+:10028000E50D95F0F501E50BF5F0E50B35F0F50121
+:10029000E501F5F0E50945F0F509E50AF5F0E509B0
+:1002A00065F0F509E509F5F0E50055F0F500C3E561
+:1002B0001DF5F0E50E95F0F509E50BF5F0E50B35CC
+:1002C000F0F509E50EF5F0E51D95F0F501E50BF506
+:1002D000F0E50B35F0F501E501F5F0E50945F0F540
+:1002E00009E50AF5F0E50965F0F509E509F5F0E538
+:1002F0000055F0F500C3E51EF5F0E51095F0F509A1
+:10030000E50BF5F0E50B35F0F509E510F5F0E51E28
+:1003100095F0F501E50BF5F0E50B35F0F501E5019C
+:10032000F5F0E50945F0F509E50AF5F0E50965F0B0
+:10033000F509E509F5F0E50055F0F500C3E51FF511
+:10034000F0E51495F0F509E50BF5F0E50B35F0F562
+:1003500009E509F5F0E50055F0F500E500F5F0E5F3
+:100360000C45F0F50C750000E50CF5F0E50045F0E6
+:10037000F500E511F5F0E50045F0F500E512F5F0C2
+:10038000E50045F0F500E513F5F0E50045F0F50072
+:10039000E500700280030205A100E51FF4F51FE5EA
+:1003A0001EF4F51EE51DF4F51DE51CF4F51CD375D2
+:1003B0000000E500F5F0E51F35F0F51FE500F5F06C
+:1003C000E51E35F0F51EE500F5F0E51D35F0F51DEF
+:1003D000E500F5F0E51C35F0F51CC3E51BF5F0E58F
+:1003E0001F45F0F500E517F5F0E51E45F0F501E5D0
+:1003F00016F5F0E51D45F0F509E515F5F0E51C45A8
+:10040000F0F50E750A00750B00750C00750D007582
+:100410000F00C3E50AF5F0E50095F0F500E500F5FD
+:10042000F0E50F45F0F50FC3E50BF5F0E50195F0AC
+:10043000F500E500F5F0E50F45F0F50FC3E50CF527
+:10044000F0E50995F0F500E500F5F0E50F45F0F56C
+:100450000FC3E50DF5F0E50E95F0F500E500F5F0BC
+:10046000E50F45F0F50F750100750900750A007577
+:100470000000E50FF5F0E50045F0F500E501F5F0C9
+:10048000E50045F0F500E509F5F0E50045F0F5007B
+:10049000E50AF5F0E50045F0F500E500700280039F
+:1004A00002059100750000750100750900750A00CC
+:1004B000E500F502E501F503E509F504E50AF505B2
+:1004C00075E0092506F58275E0003507F583E0F54E
+:1004D0001775E0082506F58275E0003507F583E01D
+:1004E000F51675E0072506F58275E0003507F583FA
+:1004F000E0F51575E0062506F58275E0003507F58F
+:1005000083E0F51475E0052506F58275E0003507F2
+:10051000F583E0F51375E0042506F58275E00035F6
+:1005200007F583E0F51275E0032506F58275E00016
+:100530003507F583E0F51175E0022506F58275E0D3
+:10054000003507F583E0F51075E0002506F58275A6
+:10055000E0003507F583E0F508E508C0E075E00147
+:100560002506F58275E0003507F583E0F508E50816
+:10057000C0E075E0122506F50675E0003507F507C1
+:10058000E502F582E503F583E504F500E505F501EF
+:100590002200750001750100750900750A0002044A
+:1005A000B0000203DA0000000000000000000000BC
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple -fwrapv" } */
+#define ABS(x) (x > 0 ? x : -x)
+int f (int a) {
+ return ABS (ABS(a));
+}
+
+/* { dg-final { scan-tree-dump-times "ABS" 1 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple -fwrapv" } */
+#define ABS(x) (x > 0 ? x : -x)
+int f (int a) {
+ return ABS (ABS(a));
+}
+
+/* { dg-final { scan-tree-dump-times "ABS" 1 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
--- /dev/null
+:1000000000E50675820AC39582F506E5077583004B
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F0E5173C
+:10004000F518E516F519E515F51AE514F51B75E033
+:10005000052506F58275E0003507F583E513F07593
+:10006000E0042506F58275E0003507F583E512F01A
+:1000700075E0032506F58275E0003507F583E51187
+:10008000F075E0022506F58275E0003507F583E599
+:1000900010F0751400751000750E00750F00E51C4A
+:1000A000F50D750080E500F5F0E50F25F0F50FE59D
+:1000B00000F5F0E50D25F0F50D750C0075110075D6
+:1000C0001200751300750B00750A01750001C3E578
+:1000D0000DF5F0E50F95F0F509E50BF5F0E50B35BD
+:1000E000F0F509E509F5F0E50055F0F500E500F556
+:1000F000F0E50C45F0F50C750001C3E50DF5F0E5F4
+:100100000F95F0F509E50BF5F0E50B35F0F509E590
+:100110000FF5F0E50D95F0F501E50BF5F0E50B3584
+:10012000F0F501E501F5F0E50945F0F509E50AF519
+:10013000F0E50965F0F509E509F5F0E50055F0F59C
+:1001400000C3E51DF5F0E50E95F0F509E50BF5F0BA
+:10015000E50B35F0F509E509F5F0E50055F0F5009A
+:10016000E500F5F0E50C45F0F50C750001C3E50D73
+:10017000F5F0E50F95F0F509E50BF5F0E50B35F039
+:10018000F509E50FF5F0E50D95F0F501E50BF5F056
+:10019000E50B35F0F501E501F5F0E50945F0F50968
+:1001A000E50AF5F0E50965F0F509E509F5F0E50082
+:1001B00055F0F500C3E51DF5F0E50E95F0F509E500
+:1001C0000BF5F0E50B35F0F509E50EF5F0E51D95BD
+:1001D000F0F501E50BF5F0E50B35F0F501E501F57E
+:1001E000F0E50945F0F509E50AF5F0E50965F0F5F2
+:1001F00009E509F5F0E50055F0F500C3E51EF5F059
+:10020000E51095F0F509E50BF5F0E50B35F0F5098E
+:10021000E509F5F0E50055F0F500E500F5F0E50C31
+:1002200045F0F50C750001C3E50DF5F0E50F95F00F
+:10023000F509E50BF5F0E50B35F0F509E50FF5F0FF
+:10024000E50D95F0F501E50BF5F0E50B35F0F50161
+:10025000E501F5F0E50945F0F509E50AF5F0E509F0
+:1002600065F0F509E509F5F0E50055F0F500C3E5A1
+:100270001DF5F0E50E95F0F509E50BF5F0E50B350C
+:10028000F0F509E50EF5F0E51D95F0F501E50BF546
+:10029000F0E50B35F0F501E501F5F0E50945F0F580
+:1002A00009E50AF5F0E50965F0F509E509F5F0E578
+:1002B0000055F0F500C3E51EF5F0E51095F0F509E1
+:1002C000E50BF5F0E50B35F0F509E510F5F0E51E69
+:1002D00095F0F501E50BF5F0E50B35F0F501E501DD
+:1002E000F5F0E50945F0F509E50AF5F0E50965F0F1
+:1002F000F509E509F5F0E50055F0F500C3E51FF552
+:10030000F0E51495F0F509E50BF5F0E50B35F0F5A2
+:1003100009E509F5F0E50055F0F500E500F5F0E533
+:100320000C45F0F50C750000E50CF5F0E50045F026
+:10033000F500E511F5F0E50045F0F500E512F5F002
+:10034000E50045F0F500E513F5F0E50045F0F500B2
+:10035000E50070028003020D6700E51FF4F512E569
+:100360001EF4F50CE51DF4F50DE51CF4F50ED37542
+:100370000000E500F5F0E51235F0F512E500F5F0C6
+:10038000E50C35F0F50CE500F5F0E50D35F0F50D73
+:10039000E500F5F0E50E35F0F50E75170075130064
+:1003A000751000750F00750080E500F5F0E50F256C
+:1003B000F0F50FE500F5F0E50E25F0F50E750B00F4
+:1003C000751400751500751600750A007511017514
+:1003D0000001C3E50EF5F0E50F95F0F509E50AF526
+:1003E000F0E50A35F0F509E509F5F0E50055F0F519
+:1003F00000E500F5F0E50B45F0F50B750001C3E5F0
+:100400000EF5F0E50F95F0F509E50AF5F0E50A358A
+:10041000F0F509E50FF5F0E50E95F0F501E50AF5C3
+:10042000F0E50A35F0F501E501F5F0E50945F0F5EF
+:1004300009E511F5F0E50965F0F509E509F5F0E5DF
+:100440000055F0F500C3E50DF5F0E51095F0F50960
+:10045000E50AF5F0E50A35F0F509E509F5F0E500FE
+:1004600055F0F500E500F5F0E50B45F0F50B7500EE
+:1004700001C3E50EF5F0E50F95F0F509E50AF5F095
+:10048000E50A35F0F509E50FF5F0E50E95F0F50113
+:10049000E50AF5F0E50A35F0F501E501F5F0E509C5
+:1004A00045F0F509E511F5F0E50965F0F509E5090F
+:1004B000F5F0E50055F0F500C3E50DF5F0E5109514
+:1004C000F0F509E50AF5F0E50A35F0F509E510F56E
+:1004D000F0E50D95F0F501E50AF5F0E50A35F0F5E2
+:1004E00001E501F5F0E50945F0F509E511F5F0E55F
+:1004F0000965F0F509E509F5F0E50055F0F500C3EB
+:10050000E50CF5F0E51395F0F509E50AF5F0E50AD7
+:1005100035F0F509E509F5F0E50055F0F500E500E1
+:10052000F5F0E50B45F0F50B750001C3E50EF5F0B0
+:10053000E50F95F0F509E50AF5F0E50A35F0F5095E
+:10054000E50FF5F0E50E95F0F501E50AF5F0E50AA1
+:1005500035F0F501E501F5F0E50945F0F509E5119E
+:10056000F5F0E50965F0F509E509F5F0E50055F068
+:10057000F500C3E50DF5F0E51095F0F509E50AF590
+:10058000F0E50A35F0F509E510F5F0E50D95F0F523
+:1005900001E50AF5F0E50A35F0F501E501F5F0E5CC
+:1005A0000945F0F509E511F5F0E50965F0F509E50E
+:1005B00009F5F0E50055F0F500C3E50CF5F0E5139D
+:1005C00095F0F509E50AF5F0E50A35F0F509E513CA
+:1005D000F5F0E50C95F0F501E50AF5F0E50A35F0E2
+:1005E000F501E501F5F0E50945F0F509E511F5F04E
+:1005F000E50965F0F509E509F5F0E50055F0F500C8
+:10060000C3E512F5F0E51795F0F509E50AF5F0E513
+:100610000A35F0F509E509F5F0E50055F0F500E5D6
+:1006200000F5F0E50B45F0F50B750000E50BF5F076
+:10063000E50045F0F500E514F5F0E50045F0F500BE
+:10064000E515F5F0E50045F0F500E516F5F0E500F7
+:1006500045F0F500E50070028003020A57007514AA
+:1006600000751000750E00750F00E51CF50D750086
+:1006700080E500F5F0E50F25F0F50FE500F5F0E574
+:100680000D25F0F50D750C00751100751200751330
+:1006900000750B00750A01750001C3E50DF5F0E565
+:1006A0000F95F0F509E50BF5F0E50B35F0F509E5EB
+:1006B00009F5F0E50055F0F500E500F5F0E50C452D
+:1006C000F0F50C750001C3E50DF5F0E50F95F0F5BB
+:1006D00009E50BF5F0E50B35F0F509E50FF5F0E56B
+:1006E0000D95F0F501E50BF5F0E50B35F0F501E5BD
+:1006F00001F5F0E50945F0F509E50AF5F0E50965CC
+:10070000F0F509E509F5F0E50055F0F500C3E51D44
+:10071000F5F0E50E95F0F509E50BF5F0E50B35F094
+:10072000F509E509F5F0E50055F0F500E500F5F00F
+:10073000E50C45F0F50C750001C3E50DF5F0E50F8E
+:1007400095F0F509E50BF5F0E50B35F0F509E50F4A
+:10075000F5F0E50D95F0F501E50BF5F0E50B35F05D
+:10076000F501E501F5F0E50945F0F509E50AF5F0D3
+:10077000E50965F0F509E509F5F0E50055F0F50046
+:10078000C3E51DF5F0E50E95F0F509E50BF5F0E58F
+:100790000B35F0F509E50EF5F0E51D95F0F501E5F1
+:1007A0000BF5F0E50B35F0F501E501F5F0E5094550
+:1007B000F0F509E50AF5F0E50965F0F509E509F553
+:1007C000F0E50055F0F500C3E51EF5F0E51095F0F5
+:1007D000F509E50BF5F0E50B35F0F509E509F5F060
+:1007E000E50055F0F500E500F5F0E50C45F0F50CF9
+:1007F000750001C3E50DF5F0E50F95F0F509E50B82
+:10080000F5F0E50B35F0F509E50FF5F0E50D95F0A0
+:10081000F501E50BF5F0E50B35F0F501E501F5F037
+:10082000E50945F0F509E50AF5F0E50965F0F50992
+:10083000E509F5F0E50055F0F500C3E51DF5F0E537
+:100840000E95F0F509E50BF5F0E50B35F0F509E54A
+:100850000EF5F0E51D95F0F501E50BF5F0E50B352E
+:10086000F0F501E501F5F0E50945F0F509E50AF5D2
+:10087000F0E50965F0F509E509F5F0E50055F0F555
+:1008800000C3E51EF5F0E51095F0F509E50BF5F070
+:10089000E50B35F0F509E510F5F0E51E95F0F501ED
+:1008A000E50BF5F0E50B35F0F501E501F5F0E509AF
+:1008B00045F0F509E50AF5F0E50965F0F509E50902
+:1008C000F5F0E50055F0F500C3E51FF5F0E51495EA
+:1008D000F0F509E50BF5F0E50B35F0F509E509F55F
+:1008E000F0E50055F0F500E500F5F0E50C45F0F514
+:1008F0000C750000E50CF5F0E50045F0F500E5119C
+:10090000F5F0E50045F0F500E512F5F0E50045F0FD
+:10091000F500E513F5F0E50045F0F500E50070029F
+:100920008003020A5300E51FF4F51FE51EF4F51ECF
+:10093000E51DF4F51DE51CF4F51CD3750000E5007C
+:10094000F5F0E51F35F0F51FE500F5F0E51E35F093
+:10095000F51EE500F5F0E51D35F0F51DE500F5F0B7
+:10096000E51C35F0F51CE51FF4F51FE51EF4F51E3A
+:10097000E51DF4F51DE51CF4F51CD3750000E5003C
+:10098000F5F0E51F35F0F51FE500F5F0E51E35F053
+:10099000F51EE500F5F0E51D35F0F51DE500F5F077
+:1009A000E51C35F0F51CE51FF502E51EF503E51D18
+:1009B000F504E51CF505E518F517E519F516E51A32
+:1009C000F515E51BF51475E0052506F58275E000C3
+:1009D0003507F583E0F51375E0042506F58275E02B
+:1009E000003507F583E0F51275E0032506F58275FD
+:1009F000E0003507F583E0F51175E0022506F58284
+:100A000075E0003507F583E0F51075E0002506F583
+:100A10008275E0003507F583E0F508E508C0E0756C
+:100A2000E0012506F58275E0003507F583E0F5085D
+:100A3000E508C0E075E00A2506F50675E000350713
+:100A4000F507E502F582E503F583E504F500E50524
+:100A5000F501220002096600751400751000750E7C
+:100A600000750F00E51CF50D750080E500F5F0E55B
+:100A70000F25F0F50FE500F5F0E50D25F0F50D7506
+:100A80000C00751100751200751300750B00750AC6
+:100A900001750001C3E50DF5F0E50F95F0F509E5E9
+:100AA0000BF5F0E50B35F0F509E509F5F0E5005536
+:100AB000F0F500E500F5F0E50C45F0F50C750001EA
+:100AC000C3E50DF5F0E50F95F0F509E50BF5F0E55B
+:100AD0000B35F0F509E50FF5F0E50D95F0F501E5BD
+:100AE0000BF5F0E50B35F0F501E501F5F0E509450D
+:100AF000F0F509E50AF5F0E50965F0F509E509F510
+:100B0000F0E50055F0F500C3E51DF5F0E50E95F0B4
+:100B1000F509E50BF5F0E50B35F0F509E509F5F01C
+:100B2000E50055F0F500E500F5F0E50C45F0F50CB5
+:100B3000750001C3E50DF5F0E50F95F0F509E50B3E
+:100B4000F5F0E50B35F0F509E50FF5F0E50D95F05D
+:100B5000F501E50BF5F0E50B35F0F501E501F5F0F4
+:100B6000E50945F0F509E50AF5F0E50965F0F5094F
+:100B7000E509F5F0E50055F0F500C3E51DF5F0E5F4
+:100B80000E95F0F509E50BF5F0E50B35F0F509E507
+:100B90000EF5F0E51D95F0F501E50BF5F0E50B35EB
+:100BA000F0F501E501F5F0E50945F0F509E50AF58F
+:100BB000F0E50965F0F509E509F5F0E50055F0F512
+:100BC00000C3E51EF5F0E51095F0F509E50BF5F02D
+:100BD000E50B35F0F509E509F5F0E50055F0F50010
+:100BE000E500F5F0E50C45F0F50C750001C3E50DE9
+:100BF000F5F0E50F95F0F509E50BF5F0E50B35F0AF
+:100C0000F509E50FF5F0E50D95F0F501E50BF5F0CB
+:100C1000E50B35F0F501E501F5F0E50945F0F509DD
+:100C2000E50AF5F0E50965F0F509E509F5F0E500F7
+:100C300055F0F500C3E51DF5F0E50E95F0F509E575
+:100C40000BF5F0E50B35F0F509E50EF5F0E51D9532
+:100C5000F0F501E50BF5F0E50B35F0F501E501F5F3
+:100C6000F0E50945F0F509E50AF5F0E50965F0F567
+:100C700009E509F5F0E50055F0F500C3E51EF5F0CE
+:100C8000E51095F0F509E50BF5F0E50B35F0F50904
+:100C9000E510F5F0E51E95F0F501E50BF5F0E50B37
+:100CA00035F0F501E501F5F0E50945F0F509E50A4E
+:100CB000F5F0E50965F0F509E509F5F0E50055F011
+:100CC000F500C3E51FF5F0E51495F0F509E50BF522
+:100CD000F0E50B35F0F509E509F5F0E50055F0F51F
+:100CE00000E500F5F0E50C45F0F50C750000E50CAD
+:100CF000F5F0E50045F0F500E511F5F0E50045F00B
+:100D0000F500E512F5F0E50045F0F500E513F5F026
+:100D1000E50045F0F500E50070028003020D630078
+:100D2000E51FF4F51FE51EF4F51EE51DF4F51DE5C0
+:100D30001CF4F51CD3750000E500F5F0E51F35F057
+:100D4000F51FE500F5F0E51E35F0F51EE500F5F0C0
+:100D5000E51D35F0F51DE500F5F0E51C35F0F51C59
+:100D60000209A6000209A600E51FF512E51EF50C12
+:100D7000E51DF50DE51CF50E02039A0000000000CC
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+#define ABS(x) (x > 0 ? x : -x)
+
+unsigned int f (unsigned int a) {
+ /* (unsigned)-8 is not a power of 2. */
+ return a % -8;
+}
+
+int g (int b) {
+ return ABS (b) % -8;
+}
+
+int h (int c) {
+ return ABS (c) % 8;
+}
+
+unsigned int k (unsigned int d) {
+ return d % 8;
+}
+
+/* { dg-final { scan-tree-dump "a % (4294967288|0fffffff8)" "gimple" } } */
+/* { dg-final { scan-tree-dump-times " & 7" 3 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+#define ABS(x) (x > 0 ? x : -x)
+
+unsigned int f (unsigned int a) {
+ /* (unsigned)-8 is not a power of 2. */
+ return a % -8;
+}
+
+int g (int b) {
+ return ABS (b) % -8;
+}
+
+int h (int c) {
+ return ABS (c) % 8;
+}
+
+unsigned int k (unsigned int d) {
+ return d % 8;
+}
+
+/* { dg-final { scan-tree-dump "a % (4294967288|0fffffff8)" "gimple" } } */
+/* { dg-final { scan-tree-dump-times " & 7" 3 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
--- /dev/null
+:1000000000E506758212C39582F506E50775830043
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F075E0E3
+:10004000092506F58275E0003507F583E517F0759B
+:10005000E0082506F58275E0003507F583E516F022
+:1000600075E0072506F58275E0003507F583E5158F
+:10007000F075E0062506F58275E0003507F583E5A5
+:1000800014F075E0052506F58275E0003507F58367
+:10009000E513F075E0042506F58275E0003507F5F7
+:1000A00083E512F075E0032506F58275E00035075B
+:1000B000F583E511F075E0022506F58275E000355F
+:1000C00007F583E510F0E51FF500E51EF501E51DD8
+:1000D000F509E51CF50AE51AF515E519F513750F8F
+:1000E00000751000751100751200E500F516E501A8
+:1000F000F514E509F50DE50AF50E750C0075170008
+:10010000751900751A00750B00750A01750001C399
+:10011000E518F5F0E50E95F0F509E50BF5F0E50BC2
+:1001200035F0F509E509F5F0E50055F0F500E500D5
+:10013000F5F0E50C45F0F50C750001C3E518F5F098
+:10014000E50E95F0F509E50BF5F0E50B35F0F50951
+:10015000E50EF5F0E51895F0F501E50BF5F0E50B8A
+:1001600035F0F501E501F5F0E50945F0F509E50A99
+:10017000F5F0E50965F0F509E509F5F0E50055F05C
+:10018000F500C3E513F5F0E50D95F0F509E50BF580
+:10019000F0E50B35F0F509E509F5F0E50055F0F56A
+:1001A00000E500F5F0E50C45F0F50C750001C3E540
+:1001B00018F5F0E50E95F0F509E50BF5F0E50B35D2
+:1001C000F0F509E50EF5F0E51895F0F501E50BF50C
+:1001D000F0E50B35F0F501E501F5F0E50945F0F541
+:1001E00009E50AF5F0E50965F0F509E509F5F0E539
+:1001F0000055F0F500C3E513F5F0E50D95F0F509B0
+:10020000E50BF5F0E50B35F0F509E50DF5F0E51337
+:1002100095F0F501E50BF5F0E50B35F0F501E5019D
+:10022000F5F0E50945F0F509E50AF5F0E50965F0B1
+:10023000F509E509F5F0E50055F0F500C3E515F51C
+:10024000F0E51495F0F509E50BF5F0E50B35F0F563
+:1002500009E509F5F0E50055F0F500E500F5F0E5F4
+:100260000C45F0F50C750001C3E518F5F0E50E95A9
+:10027000F0F509E50BF5F0E50B35F0F509E50EF5C0
+:10028000F0E51895F0F501E50BF5F0E50B35F0F527
+:1002900001E501F5F0E50945F0F509E50AF5F0E5B8
+:1002A0000965F0F509E509F5F0E50055F0F500C33D
+:1002B000E513F5F0E50D95F0F509E50BF5F0E50B27
+:1002C00035F0F509E50DF5F0E51395F0F501E50BD1
+:1002D000F5F0E50B35F0F501E501F5F0E50945F040
+:1002E000F509E50AF5F0E50965F0F509E509F5F028
+:1002F000E50055F0F500C3E515F5F0E51495F0F5CA
+:1003000009E50BF5F0E50B35F0F509E514F5F0E539
+:100310001595F0F501E50BF5F0E50B35F0F501E588
+:1003200001F5F0E50945F0F509E50AF5F0E509659F
+:10033000F0F509E509F5F0E50055F0F500C3E51B1A
+:10034000F5F0E51695F0F509E50BF5F0E50B35F060
+:10035000F509E509F5F0E50055F0F500E500F5F0E3
+:10036000E50C45F0F50CE517F500E519F501E51A82
+:10037000F509E50CF50B750C01C3750A00E50BF5E5
+:10038000F0E50A95F0F50A750A00E50AF5F0E50AC8
+:1003900035F0F50AE50AF5F0E50C65F0F50CC375E6
+:1003A0000A00E500F5F0E50A95F0F50A750A00E5A2
+:1003B0000AF5F0E50A35F0F50AE50AF5F0E50C6511
+:1003C000F0F50CC3750A00E501F5F0E50A95F0F5C6
+:1003D0000A750A00E50AF5F0E50A35F0F50AE50ABE
+:1003E000F5F0E50C65F0F50CC3750A00E509F5F0CC
+:1003F000E50A95F0F50A750A00E50AF5F0E50A3513
+:10040000F0F50AE50AF5F0E50C65F0F50C7500006D
+:10041000750100750900E500F50BE501F50A7501A8
+:1004200001C3750000E50CF5F0E50095F0F50075E9
+:100430000000E500F5F0E50035F0F500E500F5F029
+:10044000E50165F0F501C3750000E50BF5F0E50089
+:1004500095F0F500750000E500F5F0E50035F0F5E4
+:1004600000E500F5F0E50165F0F501C3750000E574
+:100470000AF5F0E50095F0F500750000E500F5F0EF
+:10048000E50035F0F500E500F5F0E50165F0F50172
+:10049000C3750000E509F5F0E50095F0F50075007D
+:1004A00000E500F5F0E50035F0F500E500F5F0E5D4
+:1004B0000165F0F501750900750A00750B007500FE
+:1004C00000E501F5F0E50045F0F500E509F5F0E59A
+:1004D0000045F0F500E50AF5F0E50045F0F500E52A
+:1004E0000BF5F0E50045F0F500E500700280030231
+:1004F000055700750001750100750900750A00C3F4
+:10050000750B00E500F5F0E50F35F0F50FE501F5A9
+:10051000F0E51035F0F510E509F5F0E51135F0F5E9
+:1005200011E50AF5F0E51235F0F512C3E51BF5F01B
+:10053000E51695F0F516E515F5F0E51495F0F514CA
+:10054000E513F5F0E50D95F0F50DE518F5F0E50E80
+:1005500095F0F50E0200FA00E50FF502E510F5033F
+:10056000E511F504E512F50575E0092506F5827536
+:10057000E0003507F583E0F51775E0082506F582FC
+:1005800075E0003507F583E0F51675E0072506F5FB
+:100590008275E0003507F583E0F51575E006250660
+:1005A000F58275E0003507F583E0F51475E0052563
+:1005B00006F58275E0003507F583E0F51375E00474
+:1005C0002506F58275E0003507F583E0F51275E044
+:1005D000032506F58275E0003507F583E0F5117512
+:1005E000E0022506F58275E0003507F583E0F51099
+:1005F00075E0002506F58275E0003507F583E0F526
+:1006000008E508C0E075E0012506F58275E00035D3
+:1006100007F583E0F508E508C0E075E0122506F56A
+:100620000675E0003507F507E502F582E503F58379
+:10063000E504F500E505F5012200E506758217C31E
+:100640009582F506E5077583009583F507D0E0F5FB
+:100650000875E0062506F58275E0003507F583E5A7
+:1006600008F0D0E0F50875E0052506F58275E00094
+:100670003507F583E508F075E00E2506F58275E08F
+:10068000003507F583E517F075E00D2506F5827551
+:10069000E0003507F583E516F075E00C2506F582D8
+:1006A00075E0003507F583E515F075E00B2506F5D7
+:1006B0008275E0003507F583E514F075E00A25063C
+:1006C000F58275E0003507F583E513F075E009253F
+:1006D00006F58275E0003507F583E512F075E00850
+:1006E0002506F58275E0003507F583E511F075E024
+:1006F000072506F58275E0003507F583E510F0E57E
+:100700001FF511E51BF512E51AF513E519F514753A
+:10071000E0042506F58275E0003507F583E511F064
+:1007200075E0032506F58275E0003507F583E51EC3
+:10073000F075E0022506F58275E0003507F583E5E2
+:100740001DF075E0012506F58275E0003507F5839B
+:10075000E51CF07515017516007517007508007514
+:10076000E0002506F58275E0003507F583E508F021
+:10077000751900750D00750E00750F00E51CF5105C
+:10078000750080E500F5F0E51025F0F510E500F5C1
+:10079000F0E50F25F0F50F750C00751A00751B00BC
+:1007A000751F00750B00750A01750001C3E50FF593
+:1007B000F0E51095F0F509E50BF5F0E50B35F0F5F2
+:1007C00009E509F5F0E50055F0F500E500F5F0E57F
+:1007D0000C45F0F50C750001C3E50FF5F0E510953B
+:1007E000F0F509E50BF5F0E50B35F0F509E510F549
+:1007F000F0E50F95F0F501E50BF5F0E50B35F0F5BB
+:1008000001E501F5F0E50945F0F509E50AF5F0E542
+:100810000965F0F509E509F5F0E50055F0F500C3C7
+:10082000E50EF5F0E51D95F0F509E50BF5F0E50BA6
+:1008300035F0F509E509F5F0E50055F0F500E500BE
+:10084000F5F0E50C45F0F50C750001C3E50FF5F08A
+:10085000E51095F0F509E50BF5F0E50B35F0F50938
+:10086000E510F5F0E50F95F0F501E50BF5F0E50B7A
+:1008700035F0F501E501F5F0E50945F0F509E50A82
+:10088000F5F0E50965F0F509E509F5F0E50055F045
+:10089000F500C3E50EF5F0E51D95F0F509E50BF55E
+:1008A000F0E50B35F0F509E51DF5F0E50E95F0F5F1
+:1008B00001E50BF5F0E50B35F0F501E501F5F0E5A7
+:1008C0000945F0F509E50AF5F0E50965F0F509E5F2
+:1008D00009F5F0E50055F0F500C3E50DF5F0E51E6E
+:1008E00095F0F509E50BF5F0E50B35F0F509E509AF
+:1008F000F5F0E50055F0F500E500F5F0E50C45F004
+:10090000F50C750001C3E50FF5F0E51095F0F5095C
+:10091000E50BF5F0E50B35F0F509E510F5F0E50F21
+:1009200095F0F501E50BF5F0E50B35F0F501E50186
+:10093000F5F0E50945F0F509E50AF5F0E50965F09A
+:10094000F509E509F5F0E50055F0F500C3E50EF50C
+:10095000F0E51D95F0F509E50BF5F0E50B35F0F543
+:1009600009E51DF5F0E50E95F0F501E50BF5F0E56F
+:100970000B35F0F501E501F5F0E50945F0F509E580
+:100980000AF5F0E50965F0F509E509F5F0E500552A
+:10099000F0F500C3E50DF5F0E51E95F0F509E50B62
+:1009A000F5F0E50B35F0F509E51EF5F0E50D95F0F0
+:1009B000F501E50BF5F0E50B35F0F501E501F5F096
+:1009C000E50945F0F509E50AF5F0E50965F0F509F1
+:1009D000E509F5F0E50055F0F500C3E519F5F0E59A
+:1009E0001195F0F509E50BF5F0E50B35F0F509E5A6
+:1009F00009F5F0E50055F0F500E500F5F0E50C45EA
+:100A0000F0F50CE51AF501E51BF509E51FF50A758A
+:100A10000000E50CF5F0E50045F0F500E501F5F026
+:100A2000E50045F0F500E509F5F0E50045F0F500D5
+:100A3000E50AF5F0E50045F0F500E50070028003F9
+:100A400002116B00751900750D00750E00750F0011
+:100A5000E512F51BE513F51AE514F510E518F51187
+:100A6000750080E500F5F0E51125F0F511E500F5DC
+:100A7000F0E50F25F0F50F750C00751C00751D00D5
+:100A8000751E00750B00750A01750001C3E50FF5B1
+:100A9000F0E51195F0F509E50BF5F0E50B35F0F50E
+:100AA00009E509F5F0E50055F0F500E500F5F0E59C
+:100AB0000C45F0F50C750001C3E50FF5F0E5119557
+:100AC000F0F509E50BF5F0E50B35F0F509E511F565
+:100AD000F0E50F95F0F501E50BF5F0E50B35F0F5D8
+:100AE00001E501F5F0E50945F0F509E50AF5F0E560
+:100AF0000965F0F509E509F5F0E50055F0F500C3E5
+:100B0000E50EF5F0E51095F0F509E50BF5F0E50BD0
+:100B100035F0F509E509F5F0E50055F0F500E500DB
+:100B2000F5F0E50C45F0F50C750001C3E50FF5F0A7
+:100B3000E51195F0F509E50BF5F0E50B35F0F50954
+:100B4000E511F5F0E50F95F0F501E50BF5F0E50B96
+:100B500035F0F501E501F5F0E50945F0F509E50A9F
+:100B6000F5F0E50965F0F509E509F5F0E50055F062
+:100B7000F500C3E50EF5F0E51095F0F509E50BF588
+:100B8000F0E50B35F0F509E510F5F0E50E95F0F51B
+:100B900001E50BF5F0E50B35F0F501E501F5F0E5C4
+:100BA0000945F0F509E50AF5F0E50965F0F509E50F
+:100BB00009F5F0E50055F0F500C3E50DF5F0E51A8F
+:100BC00095F0F509E50BF5F0E50B35F0F509E509CC
+:100BD000F5F0E50055F0F500E500F5F0E50C45F021
+:100BE000F50C750001C3E50FF5F0E51195F0F50979
+:100BF000E50BF5F0E50B35F0F509E511F5F0E50F3E
+:100C000095F0F501E50BF5F0E50B35F0F501E501A3
+:100C1000F5F0E50945F0F509E50AF5F0E50965F0B7
+:100C2000F509E509F5F0E50055F0F500C3E50EF529
+:100C3000F0E51095F0F509E50BF5F0E50B35F0F56D
+:100C400009E510F5F0E50E95F0F501E50BF5F0E599
+:100C50000B35F0F501E501F5F0E50945F0F509E59D
+:100C60000AF5F0E50965F0F509E509F5F0E5005547
+:100C7000F0F500C3E50DF5F0E51A95F0F509E50B83
+:100C8000F5F0E50B35F0F509E51AF5F0E50D95F011
+:100C9000F501E50BF5F0E50B35F0F501E501F5F0B3
+:100CA000E50945F0F509E50AF5F0E50965F0F5090E
+:100CB000E509F5F0E50055F0F500C3E519F5F0E5B7
+:100CC0001B95F0F509E50BF5F0E50B35F0F509E5B9
+:100CD00009F5F0E50055F0F500E500F5F0E50C4507
+:100CE000F0F50CE51CF501E51DF509E51EF50A75A5
+:100CF0000000E50CF5F0E50045F0F500E501F5F044
+:100D0000E50045F0F500E509F5F0E50045F0F500F2
+:100D1000E50AF5F0E50045F0F500E5007002800316
+:100D20000210A30075E0042506F58275E000350782
+:100D3000F583E0F51F75E0032506F58275E00035C3
+:100D400007F583E0F51E75E0022506F58275E000E3
+:100D50003507F583E0F51D75E0012506F58275E0A0
+:100D6000003507F583E0F51CE512F51BE513F51AD0
+:100D7000E514F519120000E582F502E583F503E5B7
+:100D800000F504E501F505E502F511E503F512E5C9
+:100D900004F513E505F514E515F500E516F515E57B
+:100DA00017F51675E0002506F58275E0003507F5A4
+:100DB00083E0F517750D00750E00750F00751000B6
+:100DC000C3750100E500F5F0E511A4F50CE500F5AB
+:100DD000F0E511A4E5F0F509E50CF5F0E50135F0D5
+:100DE000F501E515F5F0E511A4F50CE515F5F0E5CF
+:100DF00011A4E5F0F50AE50CF5F0E50935F0F50983
+:100E0000E516F5F0E511A4F50CE516F5F0E511A4ED
+:100E1000E5F0F50BE50CF5F0E50A35F0F50AE51718
+:100E2000F5F0E511A4F50CE517F5F0E511A4E5F0F2
+:100E3000F511E50CF5F0E50B35F0F50BC3C3750CBA
+:100E400000E501F5F0E50D35F0F50DE509F5F0E506
+:100E50000E35F0F50EE50AF5F0E50F35F0F50FE586
+:100E60000BF5F0E51035F0F510C3750900E500F558
+:100E7000F0E512A4F50CE500F5F0E512A4E5F0F5B7
+:100E80000AE50CF5F0E50935F0F509E515F5F0E5AD
+:100E900012A4F50CE515F5F0E512A4E5F0F50BE567
+:100EA0000CF5F0E50A35F0F50AE516F5F0E512A4C3
+:100EB000F50CE516F5F0E512A4E5F0F511E50CF5F5
+:100EC000F0E50B35F0F50B750100C3C3750C00E5BB
+:100ED00001F5F0E50D35F0F50DE509F5F0E50E3518
+:100EE000F0F50EE50AF5F0E50F35F0F50FE50BF539
+:100EF000F0E51035F0F510C3750A00E500F5F0E5F2
+:100F000013A4F50CE500F5F0E513A4E5F0F50BE509
+:100F10000CF5F0E50A35F0F50AE515F5F0E513A452
+:100F2000F50CE515F5F0E513A4E5F0F511E50CF584
+:100F3000F0E50B35F0F50B750100750900C3C375BD
+:100F40000C00E501F5F0E50D35F0F50DE509F5F0DE
+:100F5000E50E35F0F50EE50AF5F0E50F35F0F50F85
+:100F6000E50BF5F0E51035F0F510C3750B00E50065
+:100F7000F5F0E514A4F50CE500F5F0E514A4E5F0B2
+:100F8000F511E50CF5F0E50B35F0F50B7501007585
+:100F90000900750A00C3C3750000E501F5F0E50D11
+:100FA00035F0F50DE509F5F0E50E35F0F50EE50A3D
+:100FB000F5F0E50F35F0F50FE50BF5F0E51035F040
+:100FC000F510E50DF502E50EF503E50FF504E51066
+:100FD000F50575E00E2506F58275E0003507F58309
+:100FE000E0F51775E00D2506F58275E0003507F58B
+:100FF00083E0F51675E00C2506F58275E0003507EF
+:10100000F583E0F51575E00B2506F58275E00035F2
+:1010100007F583E0F51475E00A2506F58275E00012
+:101020003507F583E0F51375E0092506F58275E0CF
+:10103000003507F583E0F51275E0082506F58275A1
+:10104000E0003507F583E0F51175E0072506F58228
+:1010500075E0003507F583E0F51075E0052506F528
+:101060008275E0003507F583E0F508E508C0E07516
+:10107000E0062506F58275E0003507F583E0F50802
+:10108000E508C0E075E0172506F50675E0003507B0
+:10109000F507E502F582E503F583E504F500E505CE
+:1010A000F5012200E512F4F512E513F4F513E51449
+:1010B000F4F514E518F4F518D3750000E500F5F023
+:1010C000E51235F0F512E500F5F0E51335F0F5130E
+:1010D000E500F5F0E51435F0F514E500F5F0E51858
+:1010E00035F0F518E515F4F515E516F4F516E517E0
+:1010F000F4F51775E0002506F58275E0003507F573
+:1011000083E0F508E508F4F50875E0002506F582AA
+:1011100075E0003507F583E508F0D3750000E500BC
+:10112000F5F0E51535F0F515E500F5F0E51635F0C7
+:10113000F516E500F5F0E51735F0F517E500F5F0E3
+:1011400075E0002506F58275E0003507F583E0F5CA
+:1011500008E50835F0F50875E0002506F58275E02C
+:10116000003507F583E508F0020D2400E511F4F5DC
+:1011700000E51EF4F501E51DF4F509E51CF4F50B99
+:10118000D3750A00E50AF5F0E50035F0F500E50A4B
+:10119000F5F0E50135F0F501E50AF5F0E50935F082
+:1011A000F509E50AF5F0E50B35F0F50B75E00425DA
+:1011B00006F58275E0003507F583E500F075E0037C
+:1011C0002506F58275E0003507F583E501F075E049
+:1011D000022506F58275E0003507F583E509F0750F
+:1011E000E0012506F58275E0003507F583E50BF093
+:1011F000E515F4F515E516F4F516E517F4F517758C
+:10120000E0002506F58275E0003507F583E0F50876
+:10121000E508F4F50875E0002506F58275E000356F
+:1012200007F583E508F0D3750000E500F5F0E51556
+:1012300035F0F515E500F5F0E51635F0F516E500A5
+:10124000F5F0E51735F0F517E500F5F075E0002548
+:1012500006F58275E0003507F583E0F508E5083509
+:10126000F0F50875E0002506F58275E0003507F514
+:1012700083E508F0020A4400E506758211C39582F1
+:10128000F506E5077583009583F507D0E0F5087549
+:10129000E0012506F58275E0003507F583E508F0E5
+:1012A000D0E0F50875E0002506F58275E000350709
+:1012B000F583E508F075E0082506F58275E0003550
+:1012C00007F583E516F075E0072506F58275E00061
+:1012D0003507F583E515F075E0062506F58275E01E
+:1012E000003507F583E514F075E0052506F58275F0
+:1012F000E0003507F583E513F075E0042506F58277
+:1013000075E0003507F583E512F075E0032506F575
+:101310008275E0003507F583E511F075E0022506DA
+:10132000F58275E0003507F583E510F0E51FF5005F
+:10133000E51EF501E51DF509E51CF50AE51BF516A9
+:10134000E51AF515E519F513E500F50FE501F510BA
+:10135000E509F511E50AF512750C00750D00751417
+:1013600000750E00750B00750A01750001C3E518C4
+:10137000F5F0E51295F0F509E50BF5F0E50B35F024
+:10138000F509E509F5F0E50055F0F500E500F5F0A3
+:10139000E50C45F0F50C750001C3E518F5F0E51214
+:1013A00095F0F509E50BF5F0E50B35F0F509E512DB
+:1013B000F5F0E51895F0F501E50BF5F0E50B35F0E6
+:1013C000F501E501F5F0E50945F0F509E50AF5F067
+:1013D000E50965F0F509E509F5F0E50055F0F500DA
+:1013E000C3E513F5F0E51195F0F509E50BF5F0E52A
+:1013F0000B35F0F509E509F5F0E50055F0F500E5E8
+:1014000000F5F0E50C45F0F50C750001C3E518F5A5
+:10141000F0E51295F0F509E50BF5F0E50B35F0F583
+:1014200009E512F5F0E51895F0F501E50BF5F0E5A5
+:101430000B35F0F501E501F5F0E50945F0F509E5B5
+:101440000AF5F0E50965F0F509E509F5F0E500555F
+:10145000F0F500C3E513F5F0E51195F0F509E50B9E
+:10146000F5F0E50B35F0F509E511F5F0E51395F02C
+:10147000F501E50BF5F0E50B35F0F501E501F5F0CB
+:10148000E50945F0F509E50AF5F0E50965F0F50926
+:10149000E509F5F0E50055F0F500C3E515F5F0E5D3
+:1014A0001095F0F509E50BF5F0E50B35F0F509E5DC
+:1014B00009F5F0E50055F0F500E500F5F0E50C451F
+:1014C000F0F50C750001C3E518F5F0E51295F0F59F
+:1014D00009E50BF5F0E50B35F0F509E512F5F0E55A
+:1014E0001895F0F501E50BF5F0E50B35F0F501E5A4
+:1014F00001F5F0E50945F0F509E50AF5F0E50965BE
+:10150000F0F509E509F5F0E50055F0F500C3E51340
+:10151000F5F0E51195F0F509E50BF5F0E50B35F083
+:10152000F509E511F5F0E51395F0F501E50BF5F09A
+:10153000E50B35F0F501E501F5F0E50945F0F509B4
+:10154000E50AF5F0E50965F0F509E509F5F0E500CE
+:1015500055F0F500C3E515F5F0E51095F0F509E552
+:101560000BF5F0E50B35F0F509E510F5F0E515950F
+:10157000F0F501E50BF5F0E50B35F0F501E501F5CA
+:10158000F0E50945F0F509E50AF5F0E50965F0F53E
+:1015900009E509F5F0E50055F0F500C3E516F5F0AD
+:1015A000E50F95F0F509E50BF5F0E50B35F0F509DC
+:1015B000E509F5F0E50055F0F500E500F5F0E50C7E
+:1015C00045F0F50CE50CF500E514F501750C01C3CB
+:1015D000750900E500F5F0E50995F0F509750900D4
+:1015E000E509F5F0E50935F0F509E509F5F0E50C53
+:1015F00065F0F50CC3750900E50DF5F0E50995F00A
+:10160000F509750900E509F5F0E50935F0F509E595
+:1016100009F5F0E50C65F0F50CC3750900E501F579
+:10162000F0E50995F0F509750900E509F5F0E5091A
+:1016300035F0F509E509F5F0E50C65F0F50CC37535
+:101640000900E50EF5F0E50995F0F509750900E5E5
+:1016500009F5F0E50935F0F509E509F5F0E50C6562
+:10166000F0F50C750D00751400750E00E50DF50014
+:10167000E514F501E50EF509750B01C3750A00E5E2
+:101680000CF5F0E50A95F0F50A750A00E50AF5F0A3
+:10169000E50A35F0F50AE50AF5F0E50B65F0F50B1E
+:1016A000C3750A00E500F5F0E50A95F0F50A750A3C
+:1016B00000E50AF5F0E50A35F0F50AE50AF5F0E58A
+:1016C0000B65F0F50BC3750A00E501F5F0E50A9529
+:1016D000F0F50A750A00E50AF5F0E50A35F0F50AB5
+:1016E000E50AF5F0E50B65F0F50BC3750A00E509B1
+:1016F000F5F0E50A95F0F50A750A00E50AF5F0E55A
+:101700000A35F0F50AE50AF5F0E50B65F0F50B751D
+:101710000100750900750A00750000E50BF5F0E59C
+:101720000045F0F500E501F5F0E50045F0F500E5D0
+:1017300009F5F0E50045F0F500E50AF5F0E50045AE
+:10174000F0F500E5007002800302177A00C3C3E5DC
+:1017500016F5F0E50F95F0F50FE515F5F0E51095A8
+:10176000F0F510E513F5F0E51195F0F511E518F534
+:10177000F0E51295F0F51202135800E50FF502E5B9
+:1017800010F503E511F504E512F50575E0082506E9
+:10179000F58275E0003507F583E0F51675E007255D
+:1017A00006F58275E0003507F583E0F51575E0066E
+:1017B0002506F58275E0003507F583E0F51475E040
+:1017C000052506F58275E0003507F583E0F513750C
+:1017D000E0042506F58275E0003507F583E0F51293
+:1017E00075E0032506F58275E0003507F583E0F521
+:1017F0001175E0022506F58275E0003507F583E0F6
+:10180000F51075E0002506F58275E0003507F583D3
+:10181000E0F508E508C0E075E0012506F58275E011
+:10182000003507F583E0F508E508C0E075E011250F
+:1018300006F50675E0003507F507E502F582E503D4
+:10184000F583E504F500E505F5012200E50675825E
+:1018500016C39582F506E5077583009583F507D0D5
+:10186000E0F50875E0052506F58275E0003507F519
+:1018700083E508F0D0E0F50875E0042506F58275EB
+:10188000E0003507F583E508F075E00D2506F582E3
+:1018900075E0003507F583E517F075E00C2506F5D2
+:1018A0008275E0003507F583E516F075E00B250637
+:1018B000F58275E0003507F583E515F075E00A253A
+:1018C00006F58275E0003507F583E514F075E0094B
+:1018D0002506F58275E0003507F583E513F075E020
+:1018E000082506F58275E0003507F583E512F075E9
+:1018F000E0072506F58275E0003507F583E511F070
+:1019000075E0062506F58275E0003507F583E510DC
+:10191000F075E0032506F58275E0003507F583E5EF
+:101920001FF075E0022506F58275E0003507F583A6
+:10193000E51EF075E0012506F58275E0003507F536
+:1019400083E51DF075E0002506F58275E00035079A
+:10195000F583E51CF0E51BF514E51AF515E519F519
+:1019600016E518F51775E0032506F58275E00035D4
+:1019700007F583E0F51F75E0022506F58275E000A6
+:101980003507F583E0F51E75E0012506F58275E063
+:10199000003507F583E0F51D75E0002506F5827535
+:1019A000E0003507F583E0F51CE514F51BE515F5BA
+:1019B0001AE516F519E517F518120639E582F5024C
+:1019C000E583F503E500F504E501F505E502F5001D
+:1019D000E503F501E504F509E505F50A751000755F
+:1019E0001100751200751300C3750B00E500F5F0CA
+:1019F000E514A4F50FE500F5F0E514A4E5F0F50C09
+:101A0000E50FF5F0E50B35F0F50BE501F5F0E51424
+:101A1000A4F50FE501F5F0E514A4E5F0F50DE50FEB
+:101A2000F5F0E50C35F0F50CE509F5F0E514A4F555
+:101A30000FE509F5F0E514A4E5F0F50EE50FF5F076
+:101A4000E50D35F0F50DE50AF5F0E514A4F50FE523
+:101A50000AF5F0E514A4E5F0F50AE50FF5F0E50E5A
+:101A600035F0F50EC3C3750A00E50BF5F0E510354A
+:101A7000F0F510E50CF5F0E51135F0F511E50DF593
+:101A8000F0E51235F0F512E50EF5F0E51335F0F559
+:101A900013C3750C00E500F5F0E515A4F50FE5009E
+:101AA000F5F0E515A4E5F0F50DE50FF5F0E50C35DD
+:101AB000F0F50CE501F5F0E515A4F50FE501F5F0FD
+:101AC000E515A4E5F0F50EE50FF5F0E50D35F0F5BB
+:101AD0000DE509F5F0E515A4F50FE509F5F0E515B7
+:101AE000A4E5F0F50AE50FF5F0E50E35F0F50E7515
+:101AF0000B00C3C3750900E50BF5F0E51035F0F5F3
+:101B000010E50CF5F0E51135F0F511E50DF5F0E512
+:101B10001235F0F512E50EF5F0E51335F0F513C3C7
+:101B2000750D00E500F5F0E516A4F50FE500F5F0FC
+:101B3000E516A4E5F0F50EE50FF5F0E50D35F0F549
+:101B40000DE501F5F0E516A4F50FE501F5F0E51654
+:101B5000A4E5F0F50AE50FF5F0E50E35F0F50E75A4
+:101B60000B00750C00C3C3750100E50BF5F0E51023
+:101B700035F0F510E50CF5F0E51135F0F511E50D52
+:101B8000F5F0E51235F0F512E50EF5F0E51335F058
+:101B9000F513C3750E00E500F5F0E517A4F50FE5A4
+:101BA00000F5F0E517A4E5F0F50AE50FF5F0E50E10
+:101BB00035F0F50E750B00750C00750D00C3C3757F
+:101BC0000000E50BF5F0E51035F0F510E50CF5F04B
+:101BD000E51135F0F511E50DF5F0E51235F0F512EA
+:101BE000E50EF5F0E51335F0F513C3E510F5F075E6
+:101BF000E0032506F58275E0003507F583E0F5087A
+:101C0000E50895F0F500E511F5F075E0022506F51B
+:101C10008275E0003507F583E0F508E50895F0F5F5
+:101C200001E512F5F075E0012506F58275E0003555
+:101C300007F583E0F508E50895F0F509E513F5F0FB
+:101C400075E0002506F58275E0003507F583E0F5BF
+:101C500008E50895F0F50AE500F502E501F503E56C
+:101C600009F504E50AF50575E00D2506F58275E030
+:101C7000003507F583E0F51775E00C2506F582754C
+:101C8000E0003507F583E0F51675E00B2506F582D3
+:101C900075E0003507F583E0F51575E00A2506F5D2
+:101CA0008275E0003507F583E0F51475E009250637
+:101CB000F58275E0003507F583E0F51375E008253A
+:101CC00006F58275E0003507F583E0F51275E0074B
+:101CD0002506F58275E0003507F583E0F51175E01E
+:101CE000062506F58275E0003507F583E0F51075E9
+:101CF000E0042506F58275E0003507F583E0F50878
+:101D0000E508C0E075E0052506F58275E0003507B9
+:101D1000F583E0F508E508C0E075E0162506F50650
+:101D200075E0003507F507E502F582E503F583E583
+:101D300004F500E505F5012200E506758206C39568
+:101D400082F506E5077583009583F507D0E0F50871
+:101D500075E0012506F58275E0003507F583E50895
+:101D6000F0D0E0F50875E0002506F58275E0003555
+:101D700007F583E508F0750108750000750A007520
+:101D80000900E501F4F501E500F4F500E50AF4F5D4
+:101D900019E509F4F518D3750900E509F5F0E50131
+:101DA00035F0F501E509F5F0E50035F0F500E50958
+:101DB000F5F0E51935F0F519E509F5F0E51835F018
+:101DC000F518E501F51BE500F51A121277E582F525
+:101DD00002E583F503E500F504E501F505E502F507
+:101DE00000E503F501E504F509E505F50AE500F56B
+:101DF00002E501F503E509F504E50AF50575E000DE
+:101E00002506F58275E0003507F583E0F508E5085D
+:101E1000C0E075E0012506F58275E0003507F58321
+:101E2000E0F508E508C0E075E0062506F50675E072
+:101E3000003507F507E502F582E503F583E504F5CE
+:101E400000E505F5012200E50675820CC39582F5D3
+:101E500006E5077583009583F507D0E0F50875E082
+:101E6000012506F58275E0003507F583E508F0D019
+:101E7000E0F50875E0002506F58275E0003507F508
+:101E800083E508F075E0072506F58275E000350763
+:101E9000F583E515F075E0062506F58275E0003559
+:101EA00007F583E514F075E0052506F58275E00079
+:101EB0003507F583E513F075E0042506F58275E036
+:101EC000003507F583E512F075E0032506F5827508
+:101ED000E0003507F583E511F075E0022506F5828F
+:101EE00075E0003507F583E510F0E51CF515751470
+:101EF00000750E00750F00751000E515F50D7500E5
+:101F000080E500F5F0E51025F0F510E500F5F0E5C9
+:101F10000D25F0F50D750C00751100751200751387
+:101F200000750B00750A01750001C3E50DF5F0E5BC
+:101F30001095F0F509E50BF5F0E50B35F0F509E541
+:101F400009F5F0E50055F0F500E500F5F0E50C4584
+:101F5000F0F50C750001C3E50DF5F0E51095F0F511
+:101F600009E50BF5F0E50B35F0F509E510F5F0E5C1
+:101F70000D95F0F501E50BF5F0E50B35F0F501E514
+:101F800001F5F0E50945F0F509E50AF5F0E5096523
+:101F9000F0F509E509F5F0E50055F0F500C3E51D9C
+:101FA000F5F0E50F95F0F509E50BF5F0E50B35F0EB
+:101FB000F509E509F5F0E50055F0F500E500F5F067
+:101FC000E50C45F0F50C750001C3E50DF5F0E510E5
+:101FD00095F0F509E50BF5F0E50B35F0F509E510A1
+:101FE000F5F0E50D95F0F501E50BF5F0E50B35F0B5
+:101FF000F501E501F5F0E50945F0F509E50AF5F02B
+:10200000E50965F0F509E509F5F0E50055F0F5009D
+:10201000C3E51DF5F0E50F95F0F509E50BF5F0E5E5
+:102020000B35F0F509E50FF5F0E51D95F0F501E547
+:102030000BF5F0E50B35F0F501E501F5F0E50945A7
+:10204000F0F509E50AF5F0E50965F0F509E509F5AA
+:10205000F0E50055F0F500C3E51EF5F0E50E95F04E
+:10206000F509E50BF5F0E50B35F0F509E509F5F0B7
+:10207000E50055F0F500E500F5F0E50C45F0F50C50
+:10208000750001C3E50DF5F0E51095F0F509E50BD8
+:10209000F5F0E50B35F0F509E510F5F0E50D95F0F7
+:1020A000F501E50BF5F0E50B35F0F501E501F5F08F
+:1020B000E50945F0F509E50AF5F0E50965F0F509EA
+:1020C000E509F5F0E50055F0F500C3E51DF5F0E58F
+:1020D0000F95F0F509E50BF5F0E50B35F0F509E5A1
+:1020E0000FF5F0E51D95F0F501E50BF5F0E50B3585
+:1020F000F0F501E501F5F0E50945F0F509E50AF52A
+:10210000F0E50965F0F509E509F5F0E50055F0F5AC
+:1021100000C3E51EF5F0E50E95F0F509E50BF5F0C9
+:10212000E50B35F0F509E50EF5F0E51E95F0F50146
+:10213000E50BF5F0E50B35F0F501E501F5F0E50906
+:1021400045F0F509E50AF5F0E50965F0F509E50959
+:10215000F5F0E50055F0F500C3E51FF5F0E5149541
+:10216000F0F509E50BF5F0E50B35F0F509E509F5B6
+:10217000F0E50055F0F500E500F5F0E50C45F0F56B
+:102180000C750000E50CF5F0E50045F0F500E511F3
+:10219000F5F0E50045F0F500E512F5F0E50045F055
+:1021A000F500E513F5F0E50045F0F500E5007002F7
+:1021B000800302233000E51FF4F500E51EF4F5016D
+:1021C000E51DF4F509E515F4F51CD3750A00E50ADB
+:1021D000F5F0E50035F0F500E50AF5F0E50135F03C
+:1021E000F501E50AF5F0E50935F0F509E50AF5F040
+:1021F000E51C35F0F51C750D08750C00750B0075A8
+:102200000A00E50DF4F51BE50CF4F51AE50BF4F501
+:1022100019E50AF4F518D3750A00E50AF5F0E51B8F
+:1022200035F0F51BE50AF5F0E51A35F0F51AE50A83
+:10223000F5F0E51935F0F519E50AF5F0E51835F092
+:10224000F518E500F51FE501F51EE509F51D121865
+:102250004BE582F502E583F503E500F504E501F5BC
+:1022600005E502F500E503F501E504F509E505F5E9
+:102270000AE500F502E501F503E509F504E50AF5CF
+:102280000575E0072506F58275E0003507F583E062
+:10229000F51575E0062506F58275E0003507F5832E
+:1022A000E0F51475E0052506F58275E0003507F5C3
+:1022B00083E0F51375E0042506F58275E000350727
+:1022C000F583E0F51275E0032506F58275E000352B
+:1022D00007F583E0F51175E0022506F58275E0004B
+:1022E0003507F583E0F51075E0002506F58275E009
+:1022F000003507F583E0F508E508C0E075E0012545
+:1023000006F58275E0003507F583E0F508E508C0BD
+:10231000E075E00C2506F50675E0003507F507E5E4
+:1023200002F582E503F583E504F500E505F50122F4
+:1023300000E51FF500E51EF501E51DF509E515F5BC
+:102340001C0221F600E50675820CC39582F506E5B0
+:10235000077583009583F507D0E0F50875E0012542
+:1023600006F58275E0003507F583E508F0D0E0F565
+:102370000875E0002506F58275E0003507F583E570
+:1023800008F075E0072506F58275E0003507F5834E
+:10239000E515F075E0062506F58275E0003507F5D0
+:1023A00083E514F075E0052506F58275E000350734
+:1023B000F583E513F075E0042506F58275E0003538
+:1023C00007F583E512F075E0032506F58275E00058
+:1023D0003507F583E511F075E0022506F58275E015
+:1023E000003507F583E510F0E51CF515751400754B
+:1023F0000E00750F00751000E515F50D750080E5F0
+:1024000000F5F0E51025F0F510E500F5F0E50D25F7
+:10241000F0F50D750C00751100751200751300753F
+:102420000B00750A01750001C3E50DF5F0E5109587
+:10243000F0F509E50BF5F0E50B35F0F509E509F5E3
+:10244000F0E50055F0F500E500F5F0E50C45F0F598
+:102450000C750001C3E50DF5F0E51095F0F509E503
+:102460000BF5F0E50B35F0F509E510F5F0E50D9508
+:10247000F0F501E50BF5F0E50B35F0F501E501F5BB
+:10248000F0E50945F0F509E50AF5F0E50965F0F52F
+:1024900009E509F5F0E50055F0F500C3E51DF5F097
+:1024A000E50F95F0F509E50BF5F0E50B35F0F509CD
+:1024B000E509F5F0E50055F0F500E500F5F0E50C6F
+:1024C00045F0F50C750001C3E50DF5F0E51095F04C
+:1024D000F509E50BF5F0E50B35F0F509E510F5F03C
+:1024E000E50D95F0F501E50BF5F0E50B35F0F5019F
+:1024F000E501F5F0E50945F0F509E50AF5F0E5092E
+:1025000065F0F509E509F5F0E50055F0F500C3E5DE
+:102510001DF5F0E50F95F0F509E50BF5F0E50B3548
+:10252000F0F509E50FF5F0E51D95F0F501E50BF582
+:10253000F0E50B35F0F501E501F5F0E50945F0F5BD
+:1025400009E50AF5F0E50965F0F509E509F5F0E5B5
+:102550000055F0F500C3E51EF5F0E50E95F0F50920
+:10256000E50BF5F0E50B35F0F509E509F5F0E500CB
+:1025700055F0F500E500F5F0E50C45F0F50C7500BB
+:1025800001C3E50DF5F0E51095F0F509E50BF5F063
+:10259000E50B35F0F509E510F5F0E50D95F0F501E1
+:1025A000E50BF5F0E50B35F0F501E501F5F0E50992
+:1025B00045F0F509E50AF5F0E50965F0F509E509E5
+:1025C000F5F0E50055F0F500C3E51DF5F0E50F95D4
+:1025D000F0F509E50BF5F0E50B35F0F509E50FF53C
+:1025E000F0E51D95F0F501E50BF5F0E50B35F0F59F
+:1025F00001E501F5F0E50945F0F509E50AF5F0E535
+:102600000965F0F509E509F5F0E50055F0F500C3B9
+:10261000E51EF5F0E50E95F0F509E50BF5F0E50B97
+:1026200035F0F509E50EF5F0E51E95F0F501E50B41
+:10263000F5F0E50B35F0F501E501F5F0E50945F0BC
+:10264000F509E50AF5F0E50965F0F509E509F5F0A4
+:10265000E50055F0F500C3E51FF5F0E51495F0F53C
+:1026600009E50BF5F0E50B35F0F509E509F5F0E5C1
+:102670000055F0F500E500F5F0E50C45F0F50C75BA
+:102680000000E50CF5F0E50045F0F500E511F5F08A
+:10269000E50045F0F500E512F5F0E50045F0F50040
+:1026A000E513F5F0E50045F0F500E5007002800364
+:1026B0000227EE00E51FF4F500E51EF4F501E51D27
+:1026C000F4F509E515F4F51CD3750A00E50AF5F0F3
+:1026D000E50035F0F500E50AF5F0E50135F0F50126
+:1026E000E50AF5F0E50935F0F509E50AF5F0E51C30
+:1026F00035F0F51C751B08751A0075190075180062
+:10270000E500F51FE501F51EE509F51D12184BE57D
+:1027100082F502E583F503E500F504E501F505E53D
+:1027200002F500E503F501E504F509E505F50AE51F
+:1027300000F502E501F503E509F504E50AF505757F
+:10274000E0072506F58275E0003507F583E0F5150D
+:1027500075E0062506F58275E0003507F583E0F59E
+:102760001475E0052506F58275E0003507F583E070
+:10277000F51375E0042506F58275E0003507F5834D
+:10278000E0F51275E0032506F58275E0003507F5E2
+:1027900083E0F51175E0022506F58275E000350746
+:1027A000F583E0F51075E0002506F58275E000354B
+:1027B00007F583E0F508E508C0E075E0012506F5BA
+:1027C0008275E0003507F583E0F508E508C0E0759F
+:1027D000E00C2506F50675E0003507F507E502F57E
+:1027E00082E503F583E504F500E505F5012200E542
+:1027F0001FF500E51EF501E51DF509E515F51C02BF
+:1028000026F400E506758206C39582F506E5077590
+:1028100083009583F507D0E0F50875E0012506F5FE
+:102820008275E0003507F583E508F0D0E0F508751E
+:10283000E0002506F58275E0003507F583E508F030
+:10284000751B08751A00751900751800121277E5C6
+:1028500082F502E583F503E500F504E501F505E5FC
+:1028600002F500E503F501E504F509E505F50AE5DE
+:1028700000F502E501F503E509F504E50AF505753E
+:10288000E0002506F58275E0003507F583E0F508E0
+:10289000E508C0E075E0012506F58275E000350722
+:1028A000F583E0F508E508C0E075E0062506F506C5
+:1028B00075E0003507F507E502F582E503F583E5E8
+:1028C00004F500E505F5012200000000000000000D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+int f (int a, int b) {
+ return ~a ^ ~b;
+}
+
+unsigned int g (unsigned int a, unsigned int b) {
+ return ~a ^ ~b;
+}
+/* { dg-final { scan-tree-dump-times "a \\^ b" 2 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+int f (int a, int b) {
+ return ~a ^ ~b;
+}
+
+unsigned int g (unsigned int a, unsigned int b) {
+ return ~a ^ ~b;
+}
+/* { dg-final { scan-tree-dump-times "a \\^ b" 2 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
--- /dev/null
+:1000000000E50675820AC39582F506E5077583004B
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F0E51241
+:10004000F50FE51FF4F500E51EF4F501E51DF4F5E7
+:1000500009E51CF4F50AE51BF4F50BE51AF4F50CBB
+:10006000E519F4F50DE518F4F50EC3E50BF5F0E52B
+:100070000065F0F500E50CF5F0E50165F0F501E54A
+:100080000DF5F0E50965F0F509E50EF5F0E50A6511
+:10009000F0F50AE500F502E501F503E509F504E5EB
+:1000A0000AF505E50FF51275E0002506F58275E005
+:1000B000003507F583E0F508E508C0E075E00125A7
+:1000C00006F58275E0003507F583E0F508E508C020
+:1000D000E075E00A2506F50675E0003507F507E549
+:1000E00002F582E503F583E504F500E505F5012257
+:1000F00000E50675820AC39582F506E5077583005B
+:100100009583F507D0E0F50875E0012506F58275C1
+:10011000E0003507F583E508F0D0E0F50875E0006C
+:100120002506F58275E0003507F583E508F0E51250
+:10013000F50FE51FF4F500E51EF4F501E51DF4F5F6
+:1001400009E51CF4F50AE51BF4F50BE51AF4F50CCA
+:10015000E519F4F50DE518F4F50EC3E50BF5F0E53A
+:100160000065F0F500E50CF5F0E50165F0F501E559
+:100170000DF5F0E50965F0F509E50EF5F0E50A6520
+:10018000F0F50AE500F502E501F503E509F504E5FA
+:100190000AF505E50FF51275E0002506F58275E014
+:1001A000003507F583E0F508E508C0E075E00125B6
+:1001B00006F58275E0003507F583E0F508E508C02F
+:1001C000E075E00A2506F50675E0003507F507E558
+:1001D00002F582E503F583E504F500E505F5012266
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+int f (int a, int b) {
+ return ~(a ^ -(b + 1));
+}
+
+int g (int a, int b) {
+ return b ^ a;
+}
+
+unsigned int h (unsigned int a, unsigned int b) {
+ return ~(-(b + 1) ^ a);
+}
+
+/* { dg-final { scan-tree-dump-times "b \\^ a" 3 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+int f (int a, int b) {
+ return ~(a ^ -(b + 1));
+}
+
+int g (int a, int b) {
+ return b ^ a;
+}
+
+unsigned int h (unsigned int a, unsigned int b) {
+ return ~(-(b + 1) ^ a);
+}
+
+/* { dg-final { scan-tree-dump-times "b \\^ a" 3 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
--- /dev/null
+:1000000000E50675820AC39582F506E5077583004B
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F0E5163D
+:10004000F50BE515F50CE514F50DE513F50F750049
+:1000500001750100750900750A00C3750E00E50001
+:10006000F5F0E51B35F0F500E501F5F0E51A35F0A2
+:10007000F501E509F5F0E51935F0F509E50AF5F0C2
+:10008000E51835F0F50AE500F4F500E501F4F501B1
+:10009000E509F4F509E50AF4F50ED3750A00E50A59
+:1000A000F5F0E50035F0F500E50AF5F0E50135F08D
+:1000B000F501E50AF5F0E50935F0F509E50AF5F091
+:1000C000E50E35F0F50EC3E500F5F0E51F65F0F53A
+:1000D00000E501F5F0E51E65F0F501E509F5F0E54F
+:1000E0001D65F0F509E50EF5F0E51C65F0F50AE58E
+:1000F00000F4F500E501F4F501E509F4F509E50A78
+:10010000F4F50AE500F502E501F503E509F504E576
+:100110000AF505E50BF516E50CF515E50DF514E505
+:100120000FF51375E0002506F58275E0003507F53B
+:1001300083E0F508E508C0E075E0012506F5827565
+:10014000E0003507F583E0F508E508C0E075E00A52
+:100150002506F50675E0003507F507E502F582E5A9
+:1001600003F583E504F500E505F5012200E50675D4
+:100170008208C39582F506E5077583009583F50728
+:10018000D0E0F50AD0E0F50CE510F501C3E51FF568
+:10019000F0E51B65F0F500E51EF5F0E51A65F0F5F4
+:1001A00009E51DF5F0E51965F0F50BE51CF5F0E541
+:1001B0001865F0F50DE500F502E509F503E50BF529
+:1001C00004E50DF505E501F510E50CC0E0E50AC014
+:1001D000E075E0082506F50675E0003507F507E54A
+:1001E00002F582E503F583E504F500E505F5012256
+:1001F00000E50675820AC39582F506E5077583005A
+:100200009583F507D0E0F50875E0012506F58275C0
+:10021000E0003507F583E508F0D0E0F50875E0006B
+:100220002506F58275E0003507F583E508F0E5164B
+:10023000F50BE515F50CE514F50DE513F50F750057
+:1002400001750100750900750A00C3750E00E5000F
+:10025000F5F0E51B35F0F500E501F5F0E51A35F0B0
+:10026000F501E509F5F0E51935F0F509E50AF5F0D0
+:10027000E51835F0F50AE500F4F500E501F4F501BF
+:10028000E509F4F509E50AF4F50ED3750A00E50A67
+:10029000F5F0E50035F0F500E50AF5F0E50135F09B
+:1002A000F501E50AF5F0E50935F0F509E50AF5F09F
+:1002B000E50E35F0F50EC3E51FF5F0E50065F0F548
+:1002C00000E51EF5F0E50165F0F501E51DF5F0E549
+:1002D0000965F0F509E51CF5F0E50E65F0F50AE5B0
+:1002E00000F4F500E501F4F501E509F4F509E50A86
+:1002F000F4F50AE500F502E501F503E509F504E585
+:100300000AF505E50BF516E50CF515E50DF514E513
+:100310000FF51375E0002506F58275E0003507F549
+:1003200083E0F508E508C0E075E0012506F5827573
+:10033000E0003507F583E0F508E508C0E075E00A60
+:100340002506F50675E0003507F507E502F582E5B7
+:1003500003F583E504F500E505F501220000000042
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Copyright (C) 2004 Free Software Foundation.
+
+ PR other/15526
+ Verify correct overflow checking with -ftrapv.
+
+ Written by Falk Hueffner, 20th May 2004. */
+
+/* { dg-do run } */
+/* { dg-options "-ftrapv" } */
+
+__attribute__((noinline)) int
+mulv(int a, int b)
+{
+ return a * b;
+}
+
+int
+main()
+{
+ int tmp;
+ tmp=mulv( 0, 0);
+ tmp=mulv( 0, -1);
+ tmp=mulv(-1, 0);
+ tmp=mulv(-1, -1);
+ return 0;
+}
--- /dev/null
+/* Copyright (C) 2004 Free Software Foundation.
+
+ PR other/15526
+ Verify correct overflow checking with -ftrapv.
+
+ Written by Falk Hueffner, 20th May 2004. */
+
+/* { dg-do run } */
+/* { dg-options "-ftrapv" } */
+
+__attribute__((noinline)) int
+mulv(int a, int b)
+{
+ return a * b;
+}
+
+int
+main()
+{
+ int tmp;
+ tmp=mulv( 0, 0);
+ tmp=mulv( 0, -1);
+ tmp=mulv(-1, 0);
+ tmp=mulv(-1, -1);
+ return 0;
+}
--- /dev/null
+:1000000075812F7506FF7507FF1203A002000C0013
+:10001000E506758210C39582F506E50775830095A0
+:1000200083F507D0E0F50875E0012506F58275E057
+:10003000003507F583E508F0D0E0F50875E0002508
+:1000400006F58275E0003507F583E508F075E007F1
+:100050002506F58275E0003507F583E515F075E0B6
+:10006000062506F58275E0003507F583E514F07581
+:10007000E0052506F58275E0003507F583E513F008
+:1000800075E0042506F58275E0003507F583E51275
+:10009000F075E0032506F58275E0003507F583E588
+:1000A00011F075E0022506F58275E0003507F5834D
+:1000B000E510F0E51FF500E51EF501E51DF509E584
+:1000C0001CF50AE519F512E518F515E509F513E52E
+:1000D0000AF514750E00750F00751000751100C338
+:1000E000750900E500F5F0E51BA4F50DE500F5F058
+:1000F000E51BA4E5F0F50AE50DF5F0E50935F0F5A9
+:1001000009E501F5F0E51BA4F50DE501F5F0E51BAA
+:10011000A4E5F0F50BE50DF5F0E50A35F0F50AE597
+:1001200013F5F0E51BA4F50DE513F5F0E51BA4E5CB
+:10013000F0F50CE50DF5F0E50B35F0F50BE514F5F4
+:10014000F0E51BA4F50DE514F5F0E51BA4E5F0F5CD
+:1001500014E50DF5F0E50C35F0F50CC3C3750D0095
+:10016000E509F5F0E50E35F0F50EE50AF5F0E50FD9
+:1001700035F0F50FE50BF5F0E51035F0F510E50C71
+:10018000F5F0E51135F0F511C3750A00E500F5F05D
+:10019000E51AA4F50DE500F5F0E51AA4E5F0F50B78
+:1001A000E50DF5F0E50A35F0F50AE501F5F0E51A9B
+:1001B000A4F50DE501F5F0E51AA4E5F0F50CE50D63
+:1001C000F5F0E50B35F0F50BE513F5F0E51AA4F5C0
+:1001D0000DE513F5F0E51AA4E5F0F514E50DF5F0DD
+:1001E000E50C35F0F50C750900C3C3750D00E50984
+:1001F000F5F0E50E35F0F50EE50AF5F0E50F35F012
+:10020000F50FE50BF5F0E51035F0F510E50CF5F020
+:10021000E51135F0F511C3750B00E500F5F0E512B9
+:10022000A4F50DE500F5F0E512A4E5F0F50CE50DFB
+:10023000F5F0E50B35F0F50BE501F5F0E512A4F569
+:100240000DE501F5F0E512A4E5F0F514E50DF5F086
+:10025000E50C35F0F50C750900750A00C3C375018E
+:1002600000E509F5F0E50E35F0F50EE50AF5F0E5E7
+:100270000F35F0F50FE50BF5F0E51035F0F510E56D
+:100280000CF5F0E51135F0F511C3750C00E500F53E
+:10029000F0E515A4F50DE500F5F0E515A4E5F0F59C
+:1002A00014E50DF5F0E50C35F0F50C750900750A4F
+:1002B00000750B00C3C3750000E509F5F0E50E35C8
+:1002C000F0F50EE50AF5F0E50F35F0F50FE50BF565
+:1002D000F0E51035F0F510E50CF5F0E51135F0F529
+:1002E00011E50EF502E50FF503E510F504E511F54E
+:1002F0000575E0072506F58275E0003507F583E012
+:10030000F51575E0062506F58275E0003507F583DD
+:10031000E0F51475E0052506F58275E0003507F572
+:1003200083E0F51375E0042506F58275E0003507D6
+:10033000F583E0F51275E0032506F58275E00035DA
+:1003400007F583E0F51175E0022506F58275E000FA
+:100350003507F583E0F51075E0002506F58275E0B8
+:10036000003507F583E0F508E508C0E075E00125F4
+:1003700006F58275E0003507F583E0F508E508C06D
+:10038000E075E0102506F50675E0003507F507E590
+:1003900002F582E503F583E504F500E505F50122A4
+:1003A00000E506758202C39582F506E507758300B0
+:1003B0009583F507D0E0F50875E0012506F582750F
+:1003C000E0003507F583E508F0D0E0F50875E000BA
+:1003D0002506F58275E0003507F583E508F0751F01
+:1003E00000751E00751D00751C00751B00751A0038
+:1003F00075190075180012000F751F00751E007525
+:100400001D00751C00750A01750900750100750055
+:1004100000E50AF4F51BE509F4F51AE501F4F51910
+:10042000E500F4F518D3750000E500F5F0E51B359F
+:10043000F0F51BE500F5F0E51A35F0F51AE500F5E5
+:10044000F0E51935F0F519E500F5F0E51835F0F5AA
+:100450001812000F750A017509007501007500007A
+:10046000E50AF4F51FE509F4F51EE501F4F51DE5CF
+:1004700000F4F51CD3750000E500F5F0E51F35F03C
+:10048000F51FE500F5F0E51E35F0F51EE500F5F089
+:10049000E51D35F0F51DE500F5F0E51C35F0F51C22
+:1004A000751B00751A0075190075180012000F757C
+:1004B0000A01750900750100750000E50AF4F51FD1
+:1004C000E509F4F51EE501F4F51DE500F4F51CD38E
+:1004D000750000E500F5F0E51F35F0F51FE500F5C6
+:1004E000F0E51E35F0F51EE500F5F0E51D35F0F5FB
+:1004F0001DE500F5F0E51C35F0F51C750A017509E0
+:1005000000750100750000E50AF4F51BE509F4F536
+:100510001AE501F4F519E500F4F518D3750000E5C6
+:1005200000F5F0E51B35F0F51BE500F5F0E51A35B3
+:10053000F0F51AE500F5F0E51935F0F519E500F5E7
+:10054000F0E51835F0F51812000F75000075010080
+:10055000750900750A00E500F502E501F503E509F6
+:10056000F504E50AF50575E0002506F58275E0005D
+:100570003507F583E0F508E508C0E075E0012506DC
+:10058000F58275E0003507F583E0F508E508C0E081
+:1005900075E0022506F50675E0003507F507E5026A
+:1005A000F582E503F583E504F500E505F501220094
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* The declarator in a function definition should be able to take the
+ form of an attributed function declarator, not just a plain
+ function declarator. This was formerly allowed by some of the code
+ but then the wrong constraint checks were made because other code
+ didn't recognise the declarator as being that of the function
+ definition. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk>. */
+
+int (__attribute__((const)) x) (a, b)
+ int a;
+ int b;
+{
+ return a + b;
+}
--- /dev/null
+/* The declarator in a function definition should be able to take the
+ form of an attributed function declarator, not just a plain
+ function declarator. This was formerly allowed by some of the code
+ but then the wrong constraint checks were made because other code
+ didn't recognise the declarator as being that of the function
+ definition. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk>. */
+
+int (__attribute__((const)) x) (a, b)
+ int a;
+ int b;
+{
+ return a + b;
+}
--- /dev/null
+:1000000000E506758208C39582F506E5077583004D
+:100010009583F507D0E0F50CD0E0F50EE511F5017C
+:10002000E510F50AC3750000E51BF5F0E51F35F096
+:10003000F500E51AF5F0E51E35F0F509E519F5F0DE
+:10004000E51D35F0F50BE518F5F0E51C35F0F50D7F
+:10005000E500F502E509F503E50BF504E50DF50509
+:10006000E501F511E50AF510E50EC0E0E50CC0E08C
+:1000700075E0082506F50675E0003507F507E50289
+:10008000F582E503F583E504F500E505F5012200B9
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test ICE on defining function with a name previously declared as a
+ nonfunction. Bug 28299 from Bernhard Fischer <aldot@gcc.gnu.org>.
+ Reduced testcase from Volker Reichelt <reichelt@gcc.gnu.org>. */
+
+/* { dg-do compile } */
+/* { dg-options "-Wmissing-prototypes" } */
+
+int foo;
+/* { dg-error "previous declaration" "previous declaration" { target *-*-* } 8 } */
+void foo () {} /* { dg-error "redeclared as different kind of symbol" } */
+/* { dg-warning "no previous prototype" "no previous prototype" { target *-*-* } 10 } */
--- /dev/null
+/* Test ICE on defining function with a name previously declared as a
+ nonfunction. Bug 28299 from Bernhard Fischer <aldot@gcc.gnu.org>.
+ Reduced testcase from Volker Reichelt <reichelt@gcc.gnu.org>. */
+
+/* { dg-do compile } */
+/* { dg-options "-Wmissing-prototypes" } */
+
+int foo;
+/* { dg-error "previous declaration" "previous declaration" { target *-*-* } 8 } */
+void foo () {} /* { dg-error "redeclared as different kind of symbol" } */
+/* { dg-warning "no previous prototype" "no previous prototype" { target *-*-* } 10 } */
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR 17594 */
+/* { dg-do compile } */
+/* { dg-options "-funroll-loops-all" } */
+/* { dg-error "unrecognized command line option \"-funroll-loops-all\"" "" { target *-*-* } 0 } */
--- /dev/null
+/* PR 17594 */
+/* { dg-do compile } */
+/* { dg-options "-funroll-loops-all" } */
+/* { dg-error "unrecognized command line option \"-funroll-loops-all\"" "" { target *-*-* } 0 } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89 -Werror" } */
+
+typedef const int CI;
+const const int c1; /* { dg-bogus "duplicate" } */
+const CI c2; /* { dg-bogus "duplicate" } */
+const CI *c3; /* { dg-bogus "duplicate" } */
+
+typedef volatile int VI;
+volatile volatile int v1; /* { dg-bogus "duplicate" } */
+volatile VI v2; /* { dg-bogus "duplicate" } */
+volatile VI *v3; /* { dg-bogus "duplicate" } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89 -Werror" } */
+
+typedef const int CI;
+const const int c1; /* { dg-bogus "duplicate" } */
+const CI c2; /* { dg-bogus "duplicate" } */
+const CI *c3; /* { dg-bogus "duplicate" } */
+
+typedef volatile int VI;
+volatile volatile int v1; /* { dg-bogus "duplicate" } */
+volatile VI v2; /* { dg-bogus "duplicate" } */
+volatile VI *v3; /* { dg-bogus "duplicate" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Make sure that the H8 backend does not generate a non-atomic stack
+ adjustment. */
+/* { dg-do compile { target h8300-*-* } } */
+/* { dg-options "" } */
+
+void foo (short, short, short, short, short, short);
+
+void
+bar ()
+{
+ foo (0, 0, 0, 0, 0, 0);
+}
+
+/* { dg-final { scan-assembler-not "addx" } } */
--- /dev/null
+/* Make sure that the H8 backend does not generate a non-atomic stack
+ adjustment. */
+/* { dg-do compile { target h8300-*-* } } */
+/* { dg-options "" } */
+
+void foo (short, short, short, short, short, short);
+
+void
+bar ()
+{
+ foo (0, 0, 0, 0, 0, 0);
+}
+
+/* { dg-final { scan-assembler-not "addx" } } */
--- /dev/null
+:100000000000E506758202C39582F506E507758353
+:10001000009583F507D0E0F50875E0012506F58227
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000002506F58275E0003507F583E508F075C3
+:100040001F00751E00751D00751C00751B00751ABC
+:1000500000751900751800750C00750D00750A0003
+:10006000750B00750901E506F500C3E509F5F0E536
+:100070000095F0F509E507F500750100E501F5F0DB
+:10008000E50095F0F501E50CF503E501F502E5095C
+:10009000F582E502F583E503F0750902E506F50052
+:1000A000C3E509F5F0E50095F0F509E507F50075FC
+:1000B0000100E501F5F0E50095F0F501E50DF5032A
+:1000C000E501F502E509F582E502F583E503F07542
+:1000D0000903E506F500C3E509F5F0E50095F0F53F
+:1000E00009E507F500750100E501F5F0E50095F07B
+:1000F000F501E50AF503E501F502E509F582E502FA
+:10010000F583E503F0750904E506F500C3E509F597
+:10011000F0E50095F0F509E507F500750100E5014A
+:10012000F5F0E50095F0F501E50BF503E501F502C5
+:10013000E509F582E502F583E503F0750000E500C9
+:10014000F502E500F503E500F504E500F50575E0C9
+:10015000002506F58275E0003507F583E0F508E532
+:1001600008C0E075E0012506F58275E0003507F569
+:1001700083E0F508E508C0E075E0022506F50675A0
+:10018000E0003507F507E502F582E503F583E504B0
+:10019000F500E505F5012200000000000000000068
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostics for empty bodies in if / else. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-Wextra" } */
+
+void
+f (int x)
+{
+ if (x)
+ ; /* { dg-warning "warning: empty body in an if-statement" } */
+ if (x)
+ ; /* By design we don't warn in this case. */
+ else
+ (void)0;
+ if (x)
+ (void)0;
+ else
+ ; /* { dg-warning "warning: empty body in an else-statement" } */
+ if (x)
+ (void)0;
+ else
+ (void)0;
+}
--- /dev/null
+/* Test diagnostics for empty bodies in if / else. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-Wextra" } */
+
+void
+f (int x)
+{
+ if (x)
+ ; /* { dg-warning "warning: empty body in an if-statement" } */
+ if (x)
+ ; /* By design we don't warn in this case. */
+ else
+ (void)0;
+ if (x)
+ (void)0;
+ else
+ ; /* { dg-warning "warning: empty body in an else-statement" } */
+ if (x)
+ (void)0;
+ else
+ (void)0;
+}
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F500D0E0F509750100E51E
+:100020001FF5F0E50145F0F501E51EF5F0E50145A8
+:10003000F0F501E51DF5F0E50145F0F501E51CF5EC
+:10004000F0E50145F0F501E501700280030201369B
+:1000500000750100E51FF5F0E50145F0F501E51E2D
+:10006000F5F0E50145F0F501E51DF5F0E50145F098
+:10007000F501E51CF5F0E50145F0F501E50170023B
+:10008000800302013200750100E51FF5F0E501452E
+:10009000F0F501E51EF5F0E50145F0F501E51DF58A
+:1000A000F0E50145F0F501E51CF5F0E50145F0F559
+:1000B00001E5017002800302012E00750100E51FB9
+:1000C000F5F0E50145F0F501E51EF5F0E50145F037
+:1000D000F501E51DF5F0E50145F0F501E51CF5F04C
+:1000E000E50145F0F501E5017002800302012A00F7
+:1000F000750100E501F502E501F503E501F504E50B
+:1001000001F505E509C0E0E500C0E075E00425065D
+:10011000F50675E0003507F507E502F582E503F51C
+:1001200083E504F500E505F50122000200F0000278
+:1001300000BB000200860002005100000000000029
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Verify that DECL_INLINE gets copied between DECLs properly. */
+/* { dg-do compile } */
+/* { dg-options "-O1" } */
+/* { dg-final { if [ istarget hppa*-*-* ] { scan-assembler-not "xyzzy?,%r" } else { scan-assembler-not "xyzzy" } } } */
+
+/* Test that declaration followed by definition inlines. */
+static inline int xyzzy0 (int);
+static int xyzzy0 (int x) { return x; }
+int test0 (void)
+{
+ return xyzzy0 (5);
+}
+
+/* Test that definition following declaration inlines. */
+static int xyzzy1 (int);
+static inline int xyzzy1 (int x) { return x; }
+int test1 (void)
+{
+ return xyzzy1 (5);
+}
+
+/* Test that redeclaration inside a function body inlines. */
+extern inline int xyzzy2 (int x) { return x; }
+int test2 (void)
+{
+ extern int xyzzy2 (int);
+ return xyzzy2 (5);
+}
--- /dev/null
+/* Verify that DECL_INLINE gets copied between DECLs properly. */
+/* { dg-do compile } */
+/* { dg-options "-O1" } */
+/* { dg-final { if [ istarget hppa*-*-* ] { scan-assembler-not "xyzzy?,%r" } else { scan-assembler-not "xyzzy" } } } */
+
+/* Test that declaration followed by definition inlines. */
+static inline int xyzzy0 (int);
+static int xyzzy0 (int x) { return x; }
+int test0 (void)
+{
+ return xyzzy0 (5);
+}
+
+/* Test that definition following declaration inlines. */
+static int xyzzy1 (int);
+static inline int xyzzy1 (int x) { return x; }
+int test1 (void)
+{
+ return xyzzy1 (5);
+}
+
+/* Test that redeclaration inside a function body inlines. */
+extern inline int xyzzy2 (int x) { return x; }
+int test2 (void)
+{
+ extern int xyzzy2 (int);
+ return xyzzy2 (5);
+}
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F500D0E0F501E51FF50286
+:10002000E51EF503E51DF504E51CF505E501C0E059
+:10003000E500C0E075E0042506F50675E00035072B
+:10004000F507E502F582E503F583E504F500E5052E
+:10005000F5012200E506758202C39582F506E507E3
+:100060007583009583F507D0E0F50875E001250656
+:10007000F58275E0003507F583E508F0D0E0F50876
+:1000800075E0002506F58275E0003507F583E50883
+:10009000F0751F05751E00751D00751C001200000F
+:1000A000E582F502E583F503E500F504E501F505D4
+:1000B000E502F500E503F501E504F509E505F50AB6
+:1000C000E500F502E501F503E509F504E50AF505A6
+:1000D00075E0002506F58275E0003507F583E0F54B
+:1000E00008E508C0E075E0012506F58275E00035F9
+:1000F00007F583E0F508E508C0E075E0022506F5A0
+:100100000675E0003507F507E502F582E503F5839E
+:10011000E504F500E505F5012200E506758204C356
+:100120009582F506E5077583009583F507D0E0F520
+:1001300000D0E0F501E51FF502E51EF503E51DF52C
+:1001400004E51CF505E501C0E0E500C0E075E0044C
+:100150002506F50675E0003507F507E502F582E5A9
+:1001600003F583E504F500E505F5012200E50675D4
+:100170008202C39582F506E5077583009583F5072E
+:10018000D0E0F50875E0012506F58275E000350739
+:10019000F583E508F0D0E0F50875E0002506F58266
+:1001A00075E0003507F583E508F0751F05751E003D
+:1001B000751D00751C00120119E582F502E583F535
+:1001C00003E500F504E501F505E502F500E503F5B5
+:1001D00001E504F509E505F50AE500F502E501F597
+:1001E00003E509F504E50AF50575E0002506F58245
+:1001F00075E0003507F583E0F508E508C0E075E037
+:10020000012506F58275E0003507F583E0F508E580
+:1002100008C0E075E0022506F50675E0003507F533
+:1002200007E502F582E503F583E504F500E505F54C
+:1002300001220000E506758202C39582F506E507F6
+:100240007583009583F507D0E0F50875E001250674
+:10025000F58275E0003507F583E508F0D0E0F50894
+:1002600075E0002506F58275E0003507F583E508A1
+:10027000F0751F05751E00751D00751C00E582F5E3
+:1002800002E583F503E500F504E501F505E502F572
+:1002900000E503F501E504F509E505F50AE500F5D6
+:1002A00002E501F503E509F504E50AF50575E00049
+:1002B0002506F58275E0003507F583E0F508E508C9
+:1002C000C0E075E0012506F58275E0003507F5838D
+:1002D000E0F508E508C0E075E0022506F50675E0E2
+:1002E000003507F507E502F582E503F583E504F53A
+:1002F00000E505F5012200000000000000000000FC
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test inline main, gnu99 mode, freestanding, -pedantic-errors. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -ffreestanding -pedantic-errors" } */
+
+inline int main (void);
--- /dev/null
+/* Test inline main, gnu99 mode, freestanding, -pedantic-errors. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -ffreestanding -pedantic-errors" } */
+
+inline int main (void);
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test __attribute__((gnu_inline)). */
+/* { dg-do compile } */
+/* { dg-options "-std=c99" } */
+/* { dg-final { scan-assembler "func1" } } */
+/* { dg-final { scan-assembler-not "func2" } } */
+/* { dg-final { scan-assembler "func3" } } */
+/* { dg-final { scan-assembler "func4" } } */
+
+#if __STDC_VERSION__ >= 199901L
+# define inline __attribute__((gnu_inline)) inline
+#endif
+
+extern inline int func1 (void) { return 0; }
+inline int func1 (void) { return 1; }
+
+extern int func2 (void);
+extern inline int func2 (void) { return 2; }
+
+inline int func3 (void);
+inline int func3 (void) { return 3; }
+
+extern int func4 (void);
+extern inline int func4 (void) { return 4; }
+int func4 (void) { return 5; }
--- /dev/null
+/* Test __attribute__((gnu_inline)). */
+/* { dg-do compile } */
+/* { dg-options "-std=c99" } */
+/* { dg-final { scan-assembler "func1" } } */
+/* { dg-final { scan-assembler-not "func2" } } */
+/* { dg-final { scan-assembler "func3" } } */
+/* { dg-final { scan-assembler "func4" } } */
+
+#if __STDC_VERSION__ >= 199901L
+# define inline __attribute__((gnu_inline)) inline
+#endif
+
+extern inline int func1 (void) { return 0; }
+inline int func1 (void) { return 1; }
+
+extern int func2 (void);
+extern inline int func2 (void) { return 2; }
+
+inline int func3 (void);
+inline int func3 (void) { return 3; }
+
+extern int func4 (void);
+extern inline int func4 (void) { return 4; }
+int func4 (void) { return 5; }
--- /dev/null
+:1000000000D0E0F500D0E0F501750901750A007532
+:100010000B00750C00E509F502E50AF503E50BF5A3
+:1000200004E50CF505E501C0E0E500C0E0E502F5FA
+:1000300082E503F583E504F500E505F5012200D02E
+:10004000E0F500D0E0F501750903750A00750B00B5
+:10005000750C00E509F502E50AF503E50BF504E585
+:100060000CF505E501C0E0E500C0E0E502F582E53C
+:1000700003F583E504F500E505F5012200D0E0F580
+:1000800000D0E0F501750905750A00750B00750CC7
+:1000900000E509F502E50AF503E50BF504E50CF5C5
+:1000A00005E501C0E0E500C0E0E502F582E503F505
+:1000B00083E504F500E505F50122000000000000DD
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test -fgnu89-extern-inline. */
+/* { dg-do compile } */
+/* { dg-options "-std=c99 -fgnu89-inline" } */
+/* { dg-final { scan-assembler "func1" } } */
+/* { dg-final { scan-assembler-not "func2" } } */
+/* { dg-final { scan-assembler "func3" } } */
+/* { dg-final { scan-assembler "func4" } } */
+
+#ifndef __GNUC_GNU_INLINE__
+#error __GNUC_GNU_INLINE__ is not defined
+#endif
+
+#ifdef __GNUC_STDC_INLINE__
+#error __GNUC_STDC_INLINE__ is defined
+#endif
+
+extern inline int func1 (void) { return 0; }
+inline int func1 (void) { return 1; }
+
+extern int func2 (void);
+extern inline int func2 (void) { return 2; }
+
+inline int func3 (void);
+inline int func3 (void) { return 3; }
+
+extern int func4 (void);
+extern inline int func4 (void) { return 4; }
+int func4 (void) { return 5; }
--- /dev/null
+/* Test -fgnu89-extern-inline. */
+/* { dg-do compile } */
+/* { dg-options "-std=c99 -fgnu89-inline" } */
+/* { dg-final { scan-assembler "func1" } } */
+/* { dg-final { scan-assembler-not "func2" } } */
+/* { dg-final { scan-assembler "func3" } } */
+/* { dg-final { scan-assembler "func4" } } */
+
+#ifndef __GNUC_GNU_INLINE__
+#error __GNUC_GNU_INLINE__ is not defined
+#endif
+
+#ifdef __GNUC_STDC_INLINE__
+#error __GNUC_STDC_INLINE__ is defined
+#endif
+
+extern inline int func1 (void) { return 0; }
+inline int func1 (void) { return 1; }
+
+extern int func2 (void);
+extern inline int func2 (void) { return 2; }
+
+inline int func3 (void);
+inline int func3 (void) { return 3; }
+
+extern int func4 (void);
+extern inline int func4 (void) { return 4; }
+int func4 (void) { return 5; }
--- /dev/null
+:1000000000D0E0F500D0E0F501750901750A007532
+:100010000B00750C00E509F502E50AF503E50BF5A3
+:1000200004E50CF505E501C0E0E500C0E0E502F5FA
+:1000300082E503F583E504F500E505F5012200D02E
+:10004000E0F500D0E0F501750903750A00750B00B5
+:10005000750C00E509F502E50AF503E50BF504E585
+:100060000CF505E501C0E0E500C0E0E502F582E53C
+:1000700003F583E504F500E505F5012200D0E0F580
+:1000800000D0E0F501750905750A00750B00750CC7
+:1000900000E509F502E50AF503E50BF504E50CF5C5
+:1000A00005E501C0E0E500C0E0E502F582E503F505
+:1000B00083E504F500E505F50122000000000000DD
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test -fgnu89-extern-inline. */
+/* { dg-do compile } */
+/* { dg-options "-fgnu89-inline" } */
+/* { dg-final { scan-assembler "func1" } } */
+/* { dg-final { scan-assembler-not "func2" } } */
+/* { dg-final { scan-assembler "func3" } } */
+/* { dg-final { scan-assembler "func4" } } */
+
+#ifndef __GNUC_GNU_INLINE__
+#error __GNUC_GNU_INLINE__ is not defined
+#endif
+
+#ifdef __GNUC_STDC_INLINE__
+#error __GNUC_STDC_INLINE__ is defined
+#endif
+
+extern inline int func1 (void) { return 0; }
+inline int func1 (void) { return 1; }
+
+extern int func2 (void);
+extern inline int func2 (void) { return 2; }
+
+inline int func3 (void);
+inline int func3 (void) { return 3; }
+
+extern int func4 (void);
+extern inline int func4 (void) { return 4; }
+int func4 (void) { return 5; }
--- /dev/null
+/* Test -fgnu89-extern-inline. */
+/* { dg-do compile } */
+/* { dg-options "-fgnu89-inline" } */
+/* { dg-final { scan-assembler "func1" } } */
+/* { dg-final { scan-assembler-not "func2" } } */
+/* { dg-final { scan-assembler "func3" } } */
+/* { dg-final { scan-assembler "func4" } } */
+
+#ifndef __GNUC_GNU_INLINE__
+#error __GNUC_GNU_INLINE__ is not defined
+#endif
+
+#ifdef __GNUC_STDC_INLINE__
+#error __GNUC_STDC_INLINE__ is defined
+#endif
+
+extern inline int func1 (void) { return 0; }
+inline int func1 (void) { return 1; }
+
+extern int func2 (void);
+extern inline int func2 (void) { return 2; }
+
+inline int func3 (void);
+inline int func3 (void) { return 3; }
+
+extern int func4 (void);
+extern inline int func4 (void) { return 4; }
+int func4 (void) { return 5; }
--- /dev/null
+:1000000000D0E0F500D0E0F501750901750A007532
+:100010000B00750C00E509F502E50AF503E50BF5A3
+:1000200004E50CF505E501C0E0E500C0E0E502F5FA
+:1000300082E503F583E504F500E505F5012200D02E
+:10004000E0F500D0E0F501750903750A00750B00B5
+:10005000750C00E509F502E50AF503E50BF504E585
+:100060000CF505E501C0E0E500C0E0E502F582E53C
+:1000700003F583E504F500E505F5012200D0E0F580
+:1000800000D0E0F501750905750A00750B00750CC7
+:1000900000E509F502E50AF503E50BF504E50CF5C5
+:1000A00005E501C0E0E500C0E0E502F582E503F505
+:1000B00083E504F500E505F50122000000000000DD
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Ensure that we continue to consider FOO local, even though
+ it has been deferred. */
+/* { dg-do compile { target fpic } } */
+/* { dg-options "-O3 -finline-limit=0 -fpic" } */
+
+static int foo(void)
+{
+ return 3;
+}
+
+int bar(void)
+{
+ /* Call twice to avoid bypassing the limit for functions called once. */
+ return foo() + foo() + 1;
+}
+
+/* { dg-final { scan-assembler-not "jsr" { target alpha*-*-* } } } */
+/* { dg-final { scan-assembler-not "PLT" { target i?86-*-* x86_64-*-* } } } */
+/* { dg-final { scan-assembler-not "plt" { target powerpc*-*-* } } } */
--- /dev/null
+/* Ensure that we continue to consider FOO local, even though
+ it has been deferred. */
+/* { dg-do compile { target fpic } } */
+/* { dg-options "-O3 -finline-limit=0 -fpic" } */
+
+static int foo(void)
+{
+ return 3;
+}
+
+int bar(void)
+{
+ /* Call twice to avoid bypassing the limit for functions called once. */
+ return foo() + foo() + 1;
+}
+
+/* { dg-final { scan-assembler-not "jsr" { target alpha*-*-* } } } */
+/* { dg-final { scan-assembler-not "PLT" { target i?86-*-* x86_64-*-* } } } */
+/* { dg-final { scan-assembler-not "plt" { target powerpc*-*-* } } } */
--- /dev/null
+:1000000000D0E0F500D0E0F501750903750A007530
+:100010000B00750C00E509F502E50AF503E50BF5A3
+:1000200004E50CF505E501C0E0E500C0E0E502F5FA
+:1000300082E503F583E504F500E505F5012200E519
+:1000400006758206C39582F506E5077583009583DC
+:10005000F507D0E0F50875E0012506F58275E000AA
+:100060003507F583E508F0D0E0F50875E0002506D2
+:10007000F58275E0003507F583E508F075E00525A4
+:1000800006F58275E0003507F583E513F075E004A9
+:100090002506F58275E0003507F583E512F075E079
+:1000A000032506F58275E0003507F583E511F07547
+:1000B000E0022506F58275E0003507F583E510F0CE
+:1000C000120000E582F502E583F503E500F504E59D
+:1000D00001F505E502F510E503F511E504F512E576
+:1000E00005F513120000E582F502E583F503E5004E
+:1000F000F504E501F505E502F50BE503F501E50479
+:10010000F509E505F50AC3750000E50BF5F0E51006
+:1001100035F0F500E501F5F0E51135F0F501E509FB
+:10012000F5F0E51235F0F509E50AF5F0E51335F0DF
+:10013000F50F750B01750C00750D00750E00C3757C
+:100140000A00E50BF5F0E50035F0F500E50CF5F0FB
+:10015000E50135F0F501E50DF5F0E50935F0F509B6
+:10016000E50EF5F0E50F35F0F50AE500F502E501DD
+:10017000F503E509F504E50AF50575E0052506F53D
+:100180008275E0003507F583E0F51375E004250678
+:10019000F58275E0003507F583E0F51275E003257B
+:1001A00006F58275E0003507F583E0F51175E0028C
+:1001B0002506F58275E0003507F583E0F51075E05A
+:1001C000002506F58275E0003507F583E0F508E5C2
+:1001D00008C0E075E0012506F58275E0003507F5F9
+:1001E00083E0F508E508C0E075E0062506F506752C
+:1001F000E0003507F507E502F582E503F583E50440
+:10020000F500E505F50122000000000000000000F7
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test -fno-gnu89-inline. */
+/* { dg-do compile } */
+/* { dg-options "-fno-gnu89-inline" } */
+/* { dg-error "is not supported" "" { target *-*-* } 0 } */
--- /dev/null
+/* Test -fno-gnu89-inline. */
+/* { dg-do compile } */
+/* { dg-options "-fno-gnu89-inline" } */
+/* { dg-error "is not supported" "" { target *-*-* } 0 } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler-not "big_static_inline" } } */
+
+extern void f(void);
+static inline void big_static_inline(void)
+{
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler-not "big_static_inline" } } */
+
+extern void f(void);
+static inline void big_static_inline(void)
+{
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+ f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+}
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR middle-end/13448 */
+
+/* { dg-options "-O3" } */
+
+void funct (const int n)
+{
+ n++; /* { dg-error "" } */
+}
+
+int main () {
+ funct (1);
+ return 0;
+}
--- /dev/null
+/* PR middle-end/13448 */
+
+/* { dg-options "-O3" } */
+
+void funct (const int n)
+{
+ n++; /* { dg-error "" } */
+}
+
+int main () {
+ funct (1);
+ return 0;
+}
--- /dev/null
+:1000000075812F7506FF7507FF12006602000C0050
+:10001000E506758204C39582F506E50775830095AC
+:1000200083F507D0E0F500D0E0F501C3750900E5E0
+:1000300009F502E509F503E509F504E509F505E526
+:1000400001C0E0E500C0E075E0042506F50675E0B6
+:10005000003507F507E502F582E503F583E504F5CC
+:1000600000E505F5012200E506758202C39582F5DB
+:1000700006E5077583009583F507D0E0F50875E080
+:10008000012506F58275E0003507F583E508F0D017
+:10009000E0F50875E0002506F58275E0003507F506
+:1000A00083E508F0751F01751E00751D00751C00A5
+:1000B00012000F750000750100750900750A00E552
+:1000C00000F502E501F503E509F504E50AF5057516
+:1000D000E0002506F58275E0003507F583E0F508B8
+:1000E000E508C0E075E0012506F58275E0003507FA
+:1000F000F583E0F508E508C0E075E0022506F506A1
+:1001000075E0003507F507E502F582E503F583E5BF
+:1001100004F500E505F501220000000000000000E4
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test duplicate inline, gnu89 mode. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89" } */
+
+inline inline void f (void) {}
--- /dev/null
+/* Test duplicate inline, gnu89 mode. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89" } */
+
+inline inline void f (void) {}
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test duplicate inline, gnu99 mode. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -fgnu89-inline" } */
+
+inline inline void f (void) {}
--- /dev/null
+/* Test duplicate inline, gnu99 mode. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -fgnu89-inline" } */
+
+inline inline void f (void) {}
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test inline main, gnu99 mode, hosted. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -fhosted" } */
+
+inline int main (void); /* { dg-warning "warning: cannot inline function 'main'" } */
--- /dev/null
+/* Test inline main, gnu99 mode, hosted. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -fhosted" } */
+
+inline int main (void); /* { dg-warning "warning: cannot inline function 'main'" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test inline main, gnu99 mode, hosted, -pedantic-errors. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -fhosted -pedantic-errors" } */
+
+inline int main (void); /* { dg-error "error: cannot inline function 'main'" } */
--- /dev/null
+/* Test inline main, gnu99 mode, hosted, -pedantic-errors. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -fhosted -pedantic-errors" } */
+
+inline int main (void); /* { dg-error "error: cannot inline function 'main'" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test if we inline memcpy even with -Os, when the user requested it. */
+/* Don't name this test with memcpy in its name, otherwise the scan-assembler
+ would be confused. */
+/* { dg-do compile { target i?86-*-linux* x86_64-*-linux* } } */
+/* { dg-options "-Os -minline-all-stringops" } */
+/* { dg-final { scan-assembler-not "memcpy" } } */
+char f(int i)
+{
+ char *ram_split[] = { "5:3", "3:1", "1:1", "3:5" };
+ return ram_split[i][0];
+}
--- /dev/null
+/* Test if we inline memcpy even with -Os, when the user requested it. */
+/* Don't name this test with memcpy in its name, otherwise the scan-assembler
+ would be confused. */
+/* { dg-do compile { target i?86-*-linux* x86_64-*-linux* } } */
+/* { dg-options "-Os -minline-all-stringops" } */
+/* { dg-final { scan-assembler-not "memcpy" } } */
+char f(int i)
+{
+ char *ram_split[] = { "5:3", "3:1", "1:1", "3:5" };
+ return ram_split[i][0];
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall -std=gnu89" } */
+/* This test is expected to fail with an error for the redefinition of foo.
+ This violates the constraint of 6.9#3 (no more than one external definition
+ of an identifier with internal linkage in the same translation unit). */
+static inline int foo(void) { return 1; } /* { dg-error "previous definition of" } */
+static inline int foo(void) { return 0; } /* { dg-error "redefinition of" } */
+
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall -std=gnu89" } */
+/* This test is expected to fail with an error for the redefinition of foo.
+ This violates the constraint of 6.9#3 (no more than one external definition
+ of an identifier with internal linkage in the same translation unit). */
+static inline int foo(void) { return 1; } /* { dg-error "previous definition of" } */
+static inline int foo(void) { return 0; } /* { dg-error "redefinition of" } */
+
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall -std=gnu89" } */
+/* This test should compile successfully. */
+extern inline int foo (void) { return 0; }
+inline int foo (void) { return 1; }
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall -std=gnu89" } */
+/* This test should compile successfully. */
+extern inline int foo (void) { return 0; }
+inline int foo (void) { return 1; }
--- /dev/null
+:1000000000D0E0F500D0E0F501750901750A007532
+:100010000B00750C00E509F502E50AF503E50BF5A3
+:1000200004E50CF505E501C0E0E500C0E0E502F5FA
+:1000300082E503F583E504F500E505F501220000FE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall -std=gnu89" } */
+/* This testcase should fail since we're redefining foo in the same
+ translation unit. */
+int foo (void) { return 2; } /* { dg-error "previous definition of" } */
+extern inline int foo (void) { return 1; } /* { dg-error "redefinition of" } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall -std=gnu89" } */
+/* This testcase should fail since we're redefining foo in the same
+ translation unit. */
+int foo (void) { return 2; } /* { dg-error "previous definition of" } */
+extern inline int foo (void) { return 1; } /* { dg-error "redefinition of" } */
--- /dev/null
+:1000000000D0E0F500D0E0F501750902750A007531
+:100010000B00750C00E509F502E50AF503E50BF5A3
+:1000200004E50CF505E501C0E0E500C0E0E502F5FA
+:1000300082E503F583E504F500E505F501220000FE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall -std=gnu89" } */
+/* This testcase should fail since we're redefining foo in the same
+ translation unit. */
+extern inline int foo (void) { return 2; } /* { dg-error "previous definition of" } */
+extern inline int foo (void) { return 1; } /* { dg-error "redefinition of" } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall -std=gnu89" } */
+/* This testcase should fail since we're redefining foo in the same
+ translation unit. */
+extern inline int foo (void) { return 2; } /* { dg-error "previous definition of" } */
+extern inline int foo (void) { return 1; } /* { dg-error "redefinition of" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-final { scan-assembler-not {foo[1-9]\.[0-9]} } } */
+
+/* Check that we don't get .0 suffixes on static variables when not using
+ intermodule analysis. */
+
+static int foo1;
+static int foo2 = 1;
+
+static void foo5(void) { }
+static void foo6(void);
+static void foo6(void) { }
+static void foo7(void);
+void foo7(void) { }
+
+void foo9(void)
+{
+ foo1 = 2;
+ foo2 = 3;
+ foo5();
+ foo6();
+ foo7();
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-final { scan-assembler-not {foo[1-9]\.[0-9]} } } */
+
+/* Check that we don't get .0 suffixes on static variables when not using
+ intermodule analysis. */
+
+static int foo1;
+static int foo2 = 1;
+
+static void foo5(void) { }
+static void foo6(void);
+static void foo6(void) { }
+static void foo7(void);
+void foo7(void) { }
+
+void foo9(void)
+{
+ foo1 = 2;
+ foo2 = 3;
+ foo5();
+ foo6();
+ foo7();
+}
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F5012200D0E0F500D0E0F5017509F5
+:1000400000E509F502E509F503E509F504E509F51B
+:1000500005E501C0E0E500C0E0E502F582E503F555
+:1000600083E504F500E505F5012200D0E0F500D0B8
+:10007000E0F501750900E509F502E509F503E50973
+:10008000F504E509F505E501C0E0E500C0E0E5029D
+:10009000F582E503F583E504F500E505F5012200A9
+:1000A000E506758202C39582F506E507758300951E
+:1000B00083F507D0E0F50875E0012506F58275E0C7
+:1000C000003507F583E508F0D0E0F50875E0002578
+:1000D00006F58275E0003507F583E508F09000002D
+:1000E000E582F50D900000E583F50E750902750AAD
+:1000F00000750B00750C00750100C3750000E5016B
+:10010000F5F0E50D35F0F501E500F5F0E50E35F01B
+:10011000F500E509F503E500F502E501F582E502E4
+:10012000F583E503F0750101C3750000E501F5F005
+:10013000E50D35F0F501E500F5F0E50E35F0F500DB
+:10014000E50AF503E500F502E501F582E502F58330
+:10015000E503F0750102C3750000E501F5F0E50D5A
+:1001600035F0F501E500F5F0E50E35F0F500E50BAD
+:10017000F503E500F502E501F582E502F583E50307
+:10018000F0750103C3750000E501F5F0E50D35F0EC
+:10019000F501E500F5F0E50E35F0F500E50CF503A9
+:1001A000E500F502E501F582E502F583E503F0904F
+:1001B0000004E582F50D900004E583F50E75090352
+:1001C000750A00750B00750C00750100C375000001
+:1001D000E501F5F0E50D35F0F501E500F5F0E50E8A
+:1001E00035F0F500E509F503E500F502E501F582D6
+:1001F000E502F583E503F0750101C3750000E50133
+:10020000F5F0E50D35F0F501E500F5F0E50E35F01A
+:10021000F500E50AF503E500F502E501F582E502E2
+:10022000F583E503F0750102C3750000E501F5F003
+:10023000E50D35F0F501E500F5F0E50E35F0F500DA
+:10024000E50BF503E500F502E501F582E502F5832E
+:10025000E503F0750103C3750000E501F5F0E50D58
+:1002600035F0F501E500F5F0E50E35F0F500E50CAB
+:10027000F503E500F502E501F582E502F583E50306
+:10028000F012000012003512006A750000E500F55A
+:1002900002E500F503E500F504E500F50575E0006D
+:1002A0002506F58275E0003507F583E0F508E508D9
+:1002B000C0E075E0012506F58275E0003507F5839D
+:1002C000E0F508E508C0E075E0022506F50675E0F2
+:1002D000003507F507E502F582E503F583E504F54A
+:1002E00000E505F50122000000000000000000000C
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+/* { dg-error "" "" { target *-*-solaris2.5.1 mips*-*-elf* *arm*-*-*elf* xscale*-*-elf* xtensa-*-elf* } 0 } */
+
+/* Compile with -Wall to get a warning if built-in and system intmax_t don't
+ match. */
+
+#include <inttypes.h>
+
+__INTMAX_TYPE__ __im_t__;
+__UINTMAX_TYPE__ __uim_t__;
+intmax_t *im_t_p;
+uintmax_t *uim_t_p;
+
+void
+imt (void)
+{
+ im_t_p = &__im_t__;
+}
+
+void
+uimt (void)
+{
+ uim_t_p = &__uim_t__;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+/* { dg-error "" "" { target *-*-solaris2.5.1 mips*-*-elf* *arm*-*-*elf* xscale*-*-elf* xtensa-*-elf* } 0 } */
+
+/* Compile with -Wall to get a warning if built-in and system intmax_t don't
+ match. */
+
+#include <inttypes.h>
+
+__INTMAX_TYPE__ __im_t__;
+__UINTMAX_TYPE__ __uim_t__;
+intmax_t *im_t_p;
+uintmax_t *uim_t_p;
+
+void
+imt (void)
+{
+ im_t_p = &__im_t__;
+}
+
+void
+uimt (void)
+{
+ uim_t_p = &__uim_t__;
+}
--- /dev/null
+:1000000000D0E0F50ED0E0F50FE510F50D900008FA
+:10001000E582F50B900008E583F50C900000E58281
+:10002000F509900000E583F50A750100C37500002D
+:10003000E501F5F0E50B35F0F501E500F5F0E50C2F
+:1000400035F0F500E509F503E500F502E501F58277
+:10005000E502F583E503F0750101C3750000E501D4
+:10006000F5F0E50B35F0F501E500F5F0E50C35F0C0
+:10007000F500E50AF503E500F502E501F582E50284
+:10008000F583E503F0750000E500F502E500F503F2
+:10009000E500F504E500F505E50DF510E50FC0E018
+:1000A000E50EC0E0E502F582E503F583E504F50021
+:1000B000E505F5012200D0E0F50ED0E0F50FE510E2
+:1000C000F50D90000AE582F50B90000AE583F50C2A
+:1000D000900004E582F509900004E583F50A7501B6
+:1000E00000C3750000E501F5F0E50B35F0F501E51D
+:1000F00000F5F0E50C35F0F500E509F503E500F550
+:1001000002E501F582E502F583E503F0750101C31F
+:10011000750000E501F5F0E50B35F0F501E500F5BA
+:10012000F0E50C35F0F500E50AF503E500F502E52C
+:1001300001F582E502F583E503F0750000E500F5C1
+:1001400002E500F503E500F504E500F505E50DF52C
+:1001500010E50FC0E0E50EC0E0E502F582E503F52D
+:1001600083E504F500E505F501220000000000002C
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target h8300-*-* } } */
+/* { dg-options "-ms -mn" } */
+
+void f(void) __attribute__((interrupt_handler));
+void g(void) { }
+void f(void) { g(); }
--- /dev/null
+/* { dg-do compile { target h8300-*-* } } */
+/* { dg-options "-ms -mn" } */
+
+void f(void) __attribute__((interrupt_handler));
+void g(void) { }
+void f(void) { g(); }
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F5012200E506758202C39582F50605
+:10004000E5077583009583F507D0E0F50875E001B5
+:100050002506F58275E0003507F583E508F0D0E068
+:10006000F50875E0002506F58275E0003507F58393
+:10007000E508F0120000750000E500F502E500F566
+:1000800003E500F504E500F50575E0002506F582B9
+:1000900075E0003507F583E0F508E508C0E075E098
+:1000A000012506F58275E0003507F583E0F508E5E2
+:1000B00008C0E075E0022506F50675E0003507F595
+:1000C00007E502F582E503F583E504F500E505F5AE
+:1000D00001220000000000000000000000000000FD
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test that labels at ends of compound statements are hard errors. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+void f(void) { g: } /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "label|parse|syntax" "label at end of compound statement" { target *-*-* } 6 } */
--- /dev/null
+/* Test that labels at ends of compound statements are hard errors. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+void f(void) { g: } /* { dg-bogus "warning" "warning in place of error" } */
+/* { dg-error "label|parse|syntax" "label at end of compound statement" { target *-*-* } 6 } */
--- /dev/null
+:1000000000D0E0F500D0E0F50100750900E509F544
+:1000100002E509F503E509F504E509F505E501C083
+:10002000E0E500C0E0E502F582E503F583E504F5CF
+:1000300000E505F5012200000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* This is allowed, with the effect that the 'extern' declaration at block
+ scope refers to the same object as the 'static' declaration at file scope.
+
+ C90 6.1.2.2 [as corrected by TC1], C99 6.2.2:
+
+ For an identifier declared with the storage-class specifier
+ extern in a scope in which a prior declaration of that
+ identifier is visible, if the prior declaration specifies
+ internal or external linkage, the linkage of the identifier at
+ the later daclaration is the same as the linkage specified at
+ the prior declaration. If no prior declaration is visible,
+ or if the prior declaration specifies no linkage, then the
+ identifer has external linkage.
+
+ This is PR 14366. */
+
+static int i;
+
+extern int i;
+
+static void f() {
+ extern int i;
+}
--- /dev/null
+/* This is allowed, with the effect that the 'extern' declaration at block
+ scope refers to the same object as the 'static' declaration at file scope.
+
+ C90 6.1.2.2 [as corrected by TC1], C99 6.2.2:
+
+ For an identifier declared with the storage-class specifier
+ extern in a scope in which a prior declaration of that
+ identifier is visible, if the prior declaration specifies
+ internal or external linkage, the linkage of the identifier at
+ the later daclaration is the same as the linkage specified at
+ the prior declaration. If no prior declaration is visible,
+ or if the prior declaration specifies no linkage, then the
+ identifer has external linkage.
+
+ This is PR 14366. */
+
+static int i;
+
+extern int i;
+
+static void f() {
+ extern int i;
+}
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR c/16180 */
+/* { dg-options "-O2" } */
+
+extern int b;
+int foo (int a)
+{
+ if (a)
+ {
+ b = 0;
+ for(;;)
+ goto L;
+ }
+ L:
+ for(;;)
+ return 0;
+}
--- /dev/null
+/* PR c/16180 */
+/* { dg-options "-O2" } */
+
+extern int b;
+int foo (int a)
+{
+ if (a)
+ {
+ b = 0;
+ for(;;)
+ goto L;
+ }
+ L:
+ for(;;)
+ return 0;
+}
--- /dev/null
+:1000000000E506758205C39582F506E50775830050
+:100010009583F507D0E0F51BD0E0F50875E00025E5
+:1000200006F58275E0003507F583E508F0E512F581
+:1000300018E511F519E510F51AE51FF500E51EF5AF
+:1000400001E51DF50DE51CF50E750F00E500F5F059
+:10005000E50F45F0F50FE501F5F0E50F45F0F50F7B
+:10006000E50DF5F0E50F45F0F50FE50EF5F0E50FC0
+:1000700045F0F50FE50F700280030201C400007522
+:100080000001750100750D00750E00751001C37536
+:100090000F00E500F5F0E50F95F0F50F750F00E5A1
+:1000A0000FF5F0E50F35F0F50FE50FF5F0E510650C
+:1000B000F0F510C3750F00E501F5F0E50F95F0F5CB
+:1000C0000F750F00E50FF5F0E50F35F0F50FE50FB3
+:1000D000F5F0E51065F0F510C3750F00E50DF5F0CE
+:1000E000E50F95F0F50F750F00E50FF5F0E50F350D
+:1000F000F0F50FE50FF5F0E51065F0F510C3750F9D
+:1001000000E50EF5F0E50F95F0F50F750F00E50F22
+:10011000F5F0E50F35F0F50FE50FF5F0E51065F0BA
+:10012000F510750100750D00750E00750000E510E5
+:10013000F5F0E50045F0F500E501F5F0E50045F0E6
+:10014000F500E50DF5F0E50045F0F500E50EF5F0FC
+:10015000E50045F0F500E500700280030201C000F3
+:10016000750900750A00750B00750C00E509F502AC
+:10017000E50AF503E50BF504E50CF505E518F512C0
+:10018000E519F511E51AF51075E0002506F58275FB
+:10019000E0003507F583E0F508E508C0E0E51BC0A1
+:1001A000E075E0052506F50675E0003507F507E57D
+:1001B00002F582E503F583E504F500E505F5012286
+:1001C0000002016C00900000E582F511900000E54E
+:1001D00083F512750D00750E00750F007510007512
+:1001E0000100C3750000E501F5F0E51135F0F501FA
+:1001F000E500F5F0E51235F0F500E50DF503E50055
+:10020000F502E501F582E502F583E503F0750101EC
+:10021000C3750000E501F5F0E51135F0F501E500E5
+:10022000F5F0E51235F0F500E50EF503E500F50211
+:10023000E501F582E502F583E503F0750102C3757A
+:100240000000E501F5F0E51135F0F501E500F5F008
+:10025000E51235F0F500E50FF503E500F502E501DF
+:10026000F582E502F583E503F0750103C37500002F
+:10027000E501F5F0E51135F0F501E500F5F0E512E1
+:1002800035F0F500E510F503E500F502E501F5822E
+:10029000E502F583E503F0750001750100750D00B9
+:1002A000750E00751001C3750F00E500F5F0E50F40
+:1002B00095F0F50F750F00E50FF5F0E50F35F0F54A
+:1002C0000FE50FF5F0E51065F0F510C3750F00E5CB
+:1002D00001F5F0E50F95F0F50F750F00E50FF5F05E
+:1002E000E50F35F0F50FE50FF5F0E51065F0F510C9
+:1002F000C3750F00E50DF5F0E50F95F0F50F750FDF
+:1003000000E50FF5F0E50F35F0F50FE50FF5F0E539
+:100310001065F0F510C3750F00E50EF5F0E50F95CB
+:10032000F0F50F750F00E50FF5F0E50F35F0F50F5F
+:10033000E50FF5F0E51065F0F510750100750D009D
+:10034000750E00750000E510F5F0E50045F0F500CC
+:10035000E501F5F0E50045F0F500E50DF5F0E50007
+:1003600045F0F500E50EF5F0E50045F0F500E50097
+:100370007002800302037B0002007E0002007E0008
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* m-un-1.c: "un" for "uninitialized" */
+
+/*
+From: Jim Wilson <wilson@cygnus.com>
+Date: Wed, 6 Jul 1994 13:11:47 -0700
+To: dje@cygnus.com
+Subject: Re: devo/gcc ChangeLog.fsf stmt.c
+Cc: cvs-gcc@cygnus.com, tege@cygnus.com
+
+ How about a test case? :-)
+
+Compile with -O -Wall and the broken compiler gives you:
+tmp.c:6: warning: `k' might be used uninitialized in this function
+The fixed compiler (and gcc 2.5.8) gives no warning.
+
+This happens to fix a performance regression in the code generated for
+while loops, but that is presumably much much harder to test for.
+*/
+
+/* { dg-do compile } */
+/* { dg-options "-O -Wall" } */
+
+int
+sub ()
+{
+ int i = 0;
+ int j = 0;
+ int k; /* { dg-bogus "`k' might be used uninitialized" "uninitialized warning regression" } */
+
+ while (i == 0 && j == 0)
+ {
+ k = 10;
+ i = sub ();
+ }
+
+ return k;
+}
--- /dev/null
+/* m-un-1.c: "un" for "uninitialized" */
+
+/*
+From: Jim Wilson <wilson@cygnus.com>
+Date: Wed, 6 Jul 1994 13:11:47 -0700
+To: dje@cygnus.com
+Subject: Re: devo/gcc ChangeLog.fsf stmt.c
+Cc: cvs-gcc@cygnus.com, tege@cygnus.com
+
+ How about a test case? :-)
+
+Compile with -O -Wall and the broken compiler gives you:
+tmp.c:6: warning: `k' might be used uninitialized in this function
+The fixed compiler (and gcc 2.5.8) gives no warning.
+
+This happens to fix a performance regression in the code generated for
+while loops, but that is presumably much much harder to test for.
+*/
+
+/* { dg-do compile } */
+/* { dg-options "-O -Wall" } */
+
+int
+sub ()
+{
+ int i = 0;
+ int j = 0;
+ int k; /* { dg-bogus "`k' might be used uninitialized" "uninitialized warning regression" } */
+
+ while (i == 0 && j == 0)
+ {
+ k = 10;
+ i = sub ();
+ }
+
+ return k;
+}
--- /dev/null
+:1000000000E50675820AC39582F506E5077583004B
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F075E0E3
+:10004000092506F58275E0003507F583E517F0759B
+:10005000E0082506F58275E0003507F583E516F022
+:1000600075E0072506F58275E0003507F583E5158F
+:10007000F075E0062506F58275E0003507F583E5A5
+:1000800014F075E0052506F58275E0003507F58367
+:10009000E513F075E0042506F58275E0003507F5F7
+:1000A00083E512F075E0032506F58275E00035075B
+:1000B000F583E511F075E0022506F58275E000355F
+:1000C00007F583E510F0750B00750C00750D0075D4
+:1000D0000E00751400751500751600751700750073
+:1000E00000750100750900750A00750F00C3E50071
+:1000F000F5F0E50B95F0F500E500F5F0E50F45F0BE
+:10010000F50FC3E501F5F0E50C95F0F500E500F518
+:10011000F0E50F45F0F50FC3E509F5F0E50D95F0B5
+:10012000F500E500F5F0E50F45F0F50FC3E50AF53C
+:10013000F0E50E95F0F500E500F5F0E50F45F0F57A
+:100140000F750100750900750A00E50FF500750FC0
+:1001500001C3750B00E500F5F0E50B95F0F50B75A7
+:100160000B00E50BF5F0E50B35F0F50BE50BF5F0C5
+:10017000E50F65F0F50FC3750B00E501F5F0E50B34
+:1001800095F0F50B750B00E50BF5F0E50B35F0F58B
+:100190000BE50BF5F0E50F65F0F50FC3750B00E50A
+:1001A00009F5F0E50B95F0F50B750B00E50BF5F097
+:1001B000E50B35F0F50BE50BF5F0E50F65F0F50F08
+:1001C000C3750B00E50AF5F0E50B95F0F50B750B23
+:1001D00000E50BF5F0E50B35F0F50BE50BF5F0E57B
+:1001E0000F65F0F50F750100750900750A007500BF
+:1001F00000E50FF5F0E50045F0F500E501F5F0E567
+:100200000045F0F500E509F5F0E50045F0F500E5FD
+:100210000AF5F0E50045F0F500E500700280030204
+:10022000041800750000750100750900750A007555
+:100230000C01C3750B00E500F5F0E50B95F0F50B2F
+:10024000750B00E50BF5F0E50B35F0F50BE50BF55F
+:10025000F0E50C65F0F50CC3750B00E501F5F0E574
+:100260000B95F0F50B750B00E50BF5F0E50B35F094
+:10027000F50BE50BF5F0E50C65F0F50CC3750B001F
+:10028000E509F5F0E50B95F0F50B750B00E50BF5C1
+:10029000F0E50B35F0F50BE50BF5F0E50C65F0F549
+:1002A0000CC3750B00E50AF5F0E50B95F0F50B7541
+:1002B0000B00E50BF5F0E50B35F0F50BE50BF5F074
+:1002C000E50C65F0F50C750100750900750A0075FF
+:1002D0000000E50CF5F0E50045F0F500E501F5F06E
+:1002E000E50045F0F500E509F5F0E50045F0F5001D
+:1002F000E50AF5F0E50045F0F500E5007002800341
+:100300000203360075100A7511007512007513008E
+:10031000120000E582F502E583F503E500F504E54A
+:1003200001F505E502F50BE503F50CE504F50DE532
+:1003300005F50E0200DE00E510F502E511F503E516
+:1003400012F504E513F50575E0092506F58275E05B
+:10035000003507F583E0F51775E0082506F5827589
+:10036000E0003507F583E0F51675E0072506F58210
+:1003700075E0003507F583E0F51575E0062506F50F
+:100380008275E0003507F583E0F51475E005250674
+:10039000F58275E0003507F583E0F51375E0042577
+:1003A00006F58275E0003507F583E0F51275E00388
+:1003B0002506F58275E0003507F583E0F51175E057
+:1003C000022506F58275E0003507F583E0F5107526
+:1003D000E0002506F58275E0003507F583E0F508B5
+:1003E000E508C0E075E0012506F58275E0003507F7
+:1003F000F583E0F508E508C0E075E00A2506F50696
+:1004000075E0003507F507E502F582E503F583E5BC
+:1004100004F500E505F50122007500007501007581
+:100420000900750A00750C00C3E500F5F0E51495A8
+:10043000F0F500E500F5F0E50C45F0F50CC3E5013D
+:10044000F5F0E51595F0F500E500F5F0E50C45F063
+:10045000F50CC3E509F5F0E51695F0F500E500F5B6
+:10046000F0E50C45F0F50CC3E50AF5F0E51795F05D
+:10047000F500E500F5F0E50C45F0F50C75010075AB
+:100480000900750A00E50CF500750C01C3750B0039
+:10049000E500F5F0E50B95F0F50B750B00E50BF5B8
+:1004A000F0E50B35F0F50BE50BF5F0E50C65F0F537
+:1004B0000CC3750B00E501F5F0E50B95F0F50B7538
+:1004C0000B00E50BF5F0E50B35F0F50BE50BF5F062
+:1004D000E50C65F0F50CC3750B00E509F5F0E50BCF
+:1004E00095F0F50B750B00E50BF5F0E50B35F0F528
+:1004F0000BE50BF5F0E50C65F0F50CC3750B00E5AD
+:100500000AF5F0E50B95F0F50B750B00E50BF5F032
+:10051000E50B35F0F50BE50BF5F0E50C65F0F50CAA
+:10052000750100750900750A00750000E50CF5F00D
+:10053000E50045F0F500E501F5F0E50045F0F500D2
+:10054000E509F5F0E50045F0F500E50AF5F0E50010
+:1005500045F0F500E5007002800302056D007500AE
+:1005600000750100750900750A0002022F00750070
+:1005700001750100750900750A0002022F000000D4
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-w -O2 -fmerge-all-constants" } */
+
+const char str1[36] = "0123456789abcdefghijklmnopqrstuvwxyz";
+const char str2[38] = "0123456789abcdefghijklmnopqrstuvwxyz";
+const char str3[10] = "0123456789abcdefghijklmnopqrstuvwxyz";
+
+/* { dg-final { scan-assembler-not "\.rodata\.str" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-w -O2 -fmerge-all-constants" } */
+
+const char str1[36] = "0123456789abcdefghijklmnopqrstuvwxyz";
+const char str2[38] = "0123456789abcdefghijklmnopqrstuvwxyz";
+const char str3[10] = "0123456789abcdefghijklmnopqrstuvwxyz";
+
+/* { dg-final { scan-assembler-not "\.rodata\.str" } } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnosis of nested tag redefinitions. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct s0 {
+ struct s0 { int a; } x; /* { dg-error "error: nested redefinition of 'struct s0'" } */
+};
+
+struct s1 {
+ const struct s1 { int b; } x; /* { dg-error "error: nested redefinition of 'struct s1'" } */
+};
+
+struct s2 {
+ struct s2 { int c; } *x; /* { dg-error "error: nested redefinition of 'struct s2'" } */
+};
+
+struct s3 {
+ struct s4 {
+ struct s5 {
+ struct s3 { int a; } **x; /* { dg-error "error: nested redefinition of 'struct s3'" } */
+ } y;
+ } z;
+};
+
+struct s6;
+struct s6 { struct s6 *p; };
+
+union u0 {
+ union u0 { int c; } *x; /* { dg-error "error: nested redefinition of 'union u0'" } */
+};
+
+enum e0 {
+ E0 = sizeof(enum e0 { E1 }) /* { dg-error "error: nested redefinition of 'enum e0'" } */
+};
+
+enum e1 {
+ E2 = sizeof(enum e2 { E2 }), /* { dg-error "error: redeclaration of enumerator 'E2'" } */
+ /* { dg-error "previous definition" "previous E2" { target *-*-* } 38 } */
+ E3
+};
+
+enum e3;
+enum e3 { E4 = 0 };
--- /dev/null
+/* Test diagnosis of nested tag redefinitions. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct s0 {
+ struct s0 { int a; } x; /* { dg-error "error: nested redefinition of 'struct s0'" } */
+};
+
+struct s1 {
+ const struct s1 { int b; } x; /* { dg-error "error: nested redefinition of 'struct s1'" } */
+};
+
+struct s2 {
+ struct s2 { int c; } *x; /* { dg-error "error: nested redefinition of 'struct s2'" } */
+};
+
+struct s3 {
+ struct s4 {
+ struct s5 {
+ struct s3 { int a; } **x; /* { dg-error "error: nested redefinition of 'struct s3'" } */
+ } y;
+ } z;
+};
+
+struct s6;
+struct s6 { struct s6 *p; };
+
+union u0 {
+ union u0 { int c; } *x; /* { dg-error "error: nested redefinition of 'union u0'" } */
+};
+
+enum e0 {
+ E0 = sizeof(enum e0 { E1 }) /* { dg-error "error: nested redefinition of 'enum e0'" } */
+};
+
+enum e1 {
+ E2 = sizeof(enum e2 { E2 }), /* { dg-error "error: redeclaration of enumerator 'E2'" } */
+ /* { dg-error "previous definition" "previous E2" { target *-*-* } 38 } */
+ E3
+};
+
+enum e3;
+enum e3 { E4 = 0 };
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for the "nonnull" function attribute. */
+/* Origin: Jason Thorpe <thorpej@wasabisystems.com> */
+/* { dg-do compile } */
+/* { dg-options "-Wnonnull" } */
+
+#include <stddef.h>
+
+extern void func1 (char *, char *, int) __attribute__((nonnull));
+
+extern void func2 (char *, char *) __attribute__((nonnull(1)));
+
+extern void func3 (char *, int, char *, int)
+ __attribute__((nonnull(1,3)));
+
+extern void func4 (char *, char *) __attribute__((nonnull(1)))
+ __attribute__((nonnull(2)));
+
+void
+foo (int i1, int i2, int i3, char *cp1, char *cp2, char *cp3)
+{
+ func1(cp1, cp2, i1);
+
+ func1(NULL, cp2, i1); /* { dg-warning "null" "null with argless nonnull 1" } */
+ func1(cp1, NULL, i1); /* { dg-warning "null" "null with argless nonnull 2" } */
+ func1(cp1, cp2, 0);
+
+ func2(cp1, NULL);
+ func2(NULL, cp1); /* { dg-warning "null" "null with single explicit nonnull" } */
+
+ func3(NULL, i2, cp3, i3); /* { dg-warning "null" "null with explicit nonnull 1" } */
+ func3(cp3, i2, NULL, i3); /* { dg-warning "null" "null with explicit nonnull 3" } */
+
+ func1(i1 ? cp1 : NULL, cp2, i3); /* { dg-warning "null" "null with cond expr rhs" } */
+ func1(i1 ? NULL : cp1, cp2, i3); /* { dg-warning "null" "null with cond expr lhs" } */
+ func1(i1 ? (i2 ? cp1 : NULL) : cp2, cp3, i3); /* { dg-warning "null" "null with nested cond expr" } */
+
+ func4(NULL, cp1); /* { dg-warning "null" "null with multiple attributes 1" } */
+ func4(cp1, NULL); /* { dg-warning "null" "null with multiple attributes 2" } */
+}
--- /dev/null
+/* Test for the "nonnull" function attribute. */
+/* Origin: Jason Thorpe <thorpej@wasabisystems.com> */
+/* { dg-do compile } */
+/* { dg-options "-Wnonnull" } */
+
+#include <stddef.h>
+
+extern void func1 (char *, char *, int) __attribute__((nonnull));
+
+extern void func2 (char *, char *) __attribute__((nonnull(1)));
+
+extern void func3 (char *, int, char *, int)
+ __attribute__((nonnull(1,3)));
+
+extern void func4 (char *, char *) __attribute__((nonnull(1)))
+ __attribute__((nonnull(2)));
+
+void
+foo (int i1, int i2, int i3, char *cp1, char *cp2, char *cp3)
+{
+ func1(cp1, cp2, i1);
+
+ func1(NULL, cp2, i1); /* { dg-warning "null" "null with argless nonnull 1" } */
+ func1(cp1, NULL, i1); /* { dg-warning "null" "null with argless nonnull 2" } */
+ func1(cp1, cp2, 0);
+
+ func2(cp1, NULL);
+ func2(NULL, cp1); /* { dg-warning "null" "null with single explicit nonnull" } */
+
+ func3(NULL, i2, cp3, i3); /* { dg-warning "null" "null with explicit nonnull 1" } */
+ func3(cp3, i2, NULL, i3); /* { dg-warning "null" "null with explicit nonnull 3" } */
+
+ func1(i1 ? cp1 : NULL, cp2, i3); /* { dg-warning "null" "null with cond expr rhs" } */
+ func1(i1 ? NULL : cp1, cp2, i3); /* { dg-warning "null" "null with cond expr lhs" } */
+ func1(i1 ? (i2 ? cp1 : NULL) : cp2, cp3, i3); /* { dg-warning "null" "null with nested cond expr" } */
+
+ func4(NULL, cp1); /* { dg-warning "null" "null with multiple attributes 1" } */
+ func4(cp1, NULL); /* { dg-warning "null" "null with multiple attributes 2" } */
+}
--- /dev/null
+:100000000000000000E506758230C39582F506E524
+:10001000077583009583F507D0E0F50875E0152591
+:1000200006F58275E0003507F583E508F0D0E0F5C8
+:100030000875E0142506F58275E0003507F583E5BF
+:1000400008F075E01D2506F58275E0003507F5839B
+:10005000E517F075E01C2506F58275E0003507F51B
+:1000600083E516F075E01B2506F58275E00035077F
+:10007000F583E515F075E01A2506F58275E0003583
+:1000800007F583E514F075E0192506F58275E000A3
+:100090003507F583E513F075E0182506F58275E060
+:1000A000003507F583E512F075E0172506F5827532
+:1000B000E0003507F583E511F075E0162506F582B9
+:1000C00075E0003507F583E510F0E51FF514E51E32
+:1000D000F515E51DF516E51CF51775E00D2506F57A
+:1000E0008275E0003507F583E51BF075E00C250609
+:1000F000F58275E0003507F583E51AF075E00B250C
+:1001000006F58275E0003507F583E519F075E00A1C
+:100110002506F58275E0003507F583E518F07509C9
+:1001200030750001E500F5F0E50995F0F509E50603
+:10013000F500E500F5F0E50925F0F509750100E5A4
+:1001400007F500E500F5F0E50135F0F501E501F50D
+:1001500002E509F582E502F583E0F50875E0112571
+:1001600006F58275E0003507F583E508F07509307E
+:10017000750002E500F5F0E50995F0F509E506F5ED
+:1001800000E500F5F0E50925F0F509750100E50742
+:10019000F500E500F5F0E50135F0F501E501F502C2
+:1001A000E509F582E502F583E0F50875E01025061E
+:1001B000F58275E0003507F583E508F075093075BF
+:1001C0000003E500F5F0E50995F0F509E506F50011
+:1001D000E500F5F0E50925F0F509750100E507F5FD
+:1001E00000E500F5F0E50135F0F501E501F502E582
+:1001F00009F582E502F583E0F50875E00F2506F5BF
+:100200008275E0003507F583E508F0750930750063
+:1002100004E500F5F0E50995F0F509E506F500E5DA
+:1002200000F5F0E50925F0F509750100E507F50091
+:10023000E500F5F0E50135F0F501E501F502E50928
+:10024000F582E502F583E0F50875E00E2506F582F6
+:1002500075E0003507F583E508F075093075000590
+:10026000E500F5F0E50995F0F509E506F500E5008E
+:10027000F5F0E50925F0F509750100E507F500E55C
+:1002800000F5F0E50135F0F501E501F502E509F5C8
+:1002900082E502F583E0F512750930750006E50088
+:1002A000F5F0E50995F0F509E506F500E500F5F04E
+:1002B000E50925F0F509750100E507F500E500F50C
+:1002C000F0E50135F0F501E501F502E509F582E516
+:1002D00002F583E0F513750930750007E500F5F0C8
+:1002E000E50995F0F509E506F500E500F5F0E50905
+:1002F00025F0F509750100E507F500E500F5F0E5E5
+:100300000135F0F501E501F502E509F582E502F5B3
+:1003100083E0F510750930750008E500F5F0E50992
+:1003200095F0F509E506F500E500F5F0E50925F09D
+:10033000F509750100E507F500E500F5F0E5013583
+:10034000F0F501E501F502E509F582E502F583E046
+:10035000F511750930750009E500F5F0E50995F02E
+:10036000F509E506F500E500F5F0E50925F0F509E4
+:10037000750100E507F500E500F5F0E50135F0F55C
+:1003800001E501F502E509F582E502F583E0F508EE
+:1003900075E0132506F58275E0003507F583E5085D
+:1003A000F075093075000AE500F5F0E50995F0F5FE
+:1003B00009E506F500E500F5F0E50925F0F5097514
+:1003C0000100E507F500E500F5F0E50135F0F50180
+:1003D000E501F502E509F582E502F583E0F508752A
+:1003E000E0122506F58275E0003507F583E508F093
+:1003F000E512F51FE513F51EE510F51DE511F51CD9
+:10040000E514F51BE515F51AE516F519E517F518C8
+:10041000751F00751E00E510F51DE511F51CE514AE
+:10042000F51BE515F51AE516F519E517F518751D0F
+:1004300000751C00E512F51FE513F51EE514F51B0C
+:10044000E515F51AE516F519E517F518751B00758C
+:100450001A00751900751800E512F51FE513F51E51
+:10046000E510F51DE511F51C751D00751C00E51264
+:10047000F51FE513F51E751F00751E00E512F51D2D
+:10048000E513F51C751F00751E0075E00D2506F5BA
+:100490008275E0003507F583E0F51D75E00C250653
+:1004A000F58275E0003507F583E0F51C75E00B2556
+:1004B00006F58275E0003507F583E0F51B75E00A67
+:1004C0002506F58275E0003507F583E0F51A75E03D
+:1004D000132506F58275E0003507F583E0F51975FB
+:1004E000E0122506F58275E0003507F583E0F51882
+:1004F000750901E506F500C3E509F5F0E50095F09D
+:10050000F509E507F500750100E501F5F0E5009551
+:10051000F0F50175E0112506F58275E0003507F567
+:1005200083E0F508E508F503E501F502E509F58244
+:10053000E502F583E503F0750902E506F500C3E57C
+:1005400009F5F0E50095F0F509E507F500750100FE
+:10055000E501F5F0E50095F0F50175E0102506F5EB
+:100560008275E0003507F583E0F508E508F503E559
+:1005700001F502E509F582E502F583E503F0750969
+:1005800003E506F500C3E509F5F0E50095F0F5098A
+:10059000E507F500750100E501F5F0E50095F0F5DA
+:1005A0000175E00F2506F58275E0003507F583E05B
+:1005B000F508E508F503E501F502E509F582E50230
+:1005C000F583E503F0750904E506F500C3E509F5D3
+:1005D000F0E50095F0F509E507F500750100E50186
+:1005E000F5F0E50095F0F50175E00E2506F582754C
+:1005F000E0003507F583E0F508E508F503E501F5CA
+:1006000002E509F582E502F583E503F07519007549
+:10061000180075E0132506F58275E0003507F583AF
+:10062000E0F51F75E0122506F58275E0003507F547
+:1006300083E0F51E75E00D2506F58275E0003507AF
+:10064000F583E0F51D75E00C2506F58275E00035B3
+:1006500007F583E0F51C75E00B2506F58275E000D3
+:100660003507F583E0F51B75E00A2506F58275E090
+:10067000003507F583E0F51A750901E506F500C3B5
+:10068000E509F5F0E50095F0F509E507F5007501D8
+:1006900000E501F5F0E50095F0F50175E01125069E
+:1006A000F58275E0003507F583E0F508E508F50308
+:1006B000E501F502E509F582E502F583E503F0754C
+:1006C0000902E506F500C3E509F5F0E50095F0F54A
+:1006D00009E507F500750100E501F5F0E50095F085
+:1006E000F50175E0102506F58275E0003507F58304
+:1006F000E0F508E508F503E501F502E509F582E511
+:1007000002F583E503F0750903E506F500C3E50985
+:10071000F5F0E50095F0F509E507F500750100E550
+:1007200001F5F0E50095F0F50175E00F2506F5827D
+:1007300075E0003507F583E0F508E508F503E50108
+:10074000F502E509F582E502F583E503F075090494
+:10075000E506F500C3E509F5F0E50095F0F509E5D6
+:1007600007F500750100E501F5F0E50095F0F501EC
+:1007700075E00E2506F58275E0003507F583E0F596
+:1007800008E508F503E501F502E509F582E502F55E
+:1007900083E503F0750000E514F5F0E50045F0F59C
+:1007A00000E515F5F0E50045F0F500E516F5F0E596
+:1007B0000045F0F500E517F5F0E50045F0F500E53A
+:1007C0000070028003020AE000751F00751E00E53C
+:1007D00010F51DE511F51C75E0112506F58275E093
+:1007E000003507F583E0F51B75E0102506F58275E9
+:1007F000E0003507F583E0F51A75E00F2506F58270
+:1008000075E0003507F583E0F51975E00E2506F56E
+:100810008275E0003507F583E0F518750000E514F2
+:10082000F5F0E50045F0F500E515F5F0E50045F0DB
+:10083000F500E516F5F0E50045F0F500E517F5F0F3
+:10084000E50045F0F500E50070028003020AD600DD
+:10085000E512F51FE513F51EE510F51DE511F51C74
+:1008600075E0112506F58275E0003507F583E0F5A2
+:100870001B75E0102506F58275E0003507F583E06D
+:10088000F51A75E00F2506F58275E0003507F5834A
+:10089000E0F51975E00E2506F58275E0003507F5DF
+:1008A00083E0F518750000E514F5F0E50045F0F576
+:1008B00000E515F5F0E50045F0F500E516F5F0E585
+:1008C0000045F0F500E517F5F0E50045F0F500E529
+:1008D0000070028003020A4700E510F51FE511F5DC
+:1008E0001E75E0132506F58275E0003507F583E0F7
+:1008F000F51D75E0122506F58275E0003507F583D4
+:10090000E0F51C75E0112506F58275E0003507F568
+:1009100083E0F51B75E0102506F58275E0003507CC
+:10092000F583E0F51A75E00F2506F58275E00035D0
+:1009300007F583E0F51975E00E2506F58275E000F0
+:100940003507F583E0F518751F00751E00E512F5F3
+:100950001DE513F51C751D00751C00E512F51FE55E
+:1009600013F51E750000E500F502E500F503E5004E
+:10097000F504E500F50575E01D2506F58275E00036
+:100980003507F583E0F51775E01C2506F58275E05F
+:10099000003507F583E0F51675E01B2506F5827531
+:1009A000E0003507F583E0F51575E01A2506F582B8
+:1009B00075E0003507F583E0F51475E0192506F5B7
+:1009C0008275E0003507F583E0F51375E01825061C
+:1009D000F58275E0003507F583E0F51275E017251F
+:1009E00006F58275E0003507F583E0F51175E01630
+:1009F0002506F58275E0003507F583E0F51075E012
+:100A0000142506F58275E0003507F583E0F508E565
+:100A100008C0E075E0152506F58275E0003507F59C
+:100A200083E0F508E508C0E075E0302506F50675B9
+:100A3000E0003507F507E502F582E503F583E504F7
+:100A4000F500E505F501220075000075E00D2506AD
+:100A5000F58275E0003507F583E0F508E508F5F067
+:100A6000E50045F0F50075E00C2506F58275E0001F
+:100A70003507F583E0F508E508F5F0E50045F0F504
+:100A80000075E00B2506F58275E0003507F583E07B
+:100A9000F508E508F5F0E50045F0F50075E00A25F4
+:100AA00006F58275E0003507F583E0F508E508F501
+:100AB000F0E50045F0F500E50070028003020ACA87
+:100AC000007510007511000208D900E512F510E557
+:100AD00013F5110208D900751F00751E0002085891
+:100AE00000E512F51FE513F51E0207CF0000000018
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for the invalid use of the "nonnull" function attribute. */
+/* Origin: Jason Thorpe <thorpej@wasabisystems.com> */
+/* { dg-do compile } */
+
+extern void func1 () __attribute__((nonnull)); /* { dg-error "without arguments" } */
+
+extern void func2 (char *) __attribute__((nonnull(2))); /* { dg-error "out-of-range operand" } */
+
+extern void func3 (char *) __attribute__((nonnull(foo))); /* { dg-error "invalid operand number" } */
+
+extern void func4 (int) __attribute__((nonnull(1))); /* { dg-error "references non-pointer" } */
+
+void
+foo (void)
+{
+}
--- /dev/null
+/* Test for the invalid use of the "nonnull" function attribute. */
+/* Origin: Jason Thorpe <thorpej@wasabisystems.com> */
+/* { dg-do compile } */
+
+extern void func1 () __attribute__((nonnull)); /* { dg-error "without arguments" } */
+
+extern void func2 (char *) __attribute__((nonnull(2))); /* { dg-error "out-of-range operand" } */
+
+extern void func3 (char *) __attribute__((nonnull(foo))); /* { dg-error "invalid operand number" } */
+
+extern void func4 (int) __attribute__((nonnull(1))); /* { dg-error "references non-pointer" } */
+
+void
+foo (void)
+{
+}
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Check for various valid and erroneous "noreturn" cases. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wmissing-noreturn" } */
+
+extern void exit (int);
+
+extern void foo1(void) __attribute__ ((__noreturn__));
+void
+foo1(void)
+{
+} /* { dg-warning "'noreturn' function does return" "detect falling off end of noreturn" } */
+
+extern void foo2(void) __attribute__ ((__noreturn__));
+void
+foo2(void)
+{
+ exit(0);
+} /* { dg-bogus "warning:" "this function should not get any warnings" } */
+
+extern void foo3(void);
+void
+foo3(void)
+{
+} /* { dg-bogus "warning:" "this function should not get any warnings" } */
+
+extern void foo4(void);
+void
+foo4(void)
+{ /* { dg-warning "candidate for attribute 'noreturn'" "detect noreturn candidate" } */
+ exit(0);
+}
+
+extern void foo5(void) __attribute__ ((__noreturn__));
+void
+foo5(void)
+{
+ return; /* { dg-warning "'noreturn' has a 'return' statement" "detect invalid return" } */
+} /* { dg-warning "function does return" "detect return from noreturn" } */
+
+extern void foo6(void);
+void
+foo6(void)
+{
+ return;
+} /* { dg-bogus "warning:" "this function should not get any warnings" } */
+
+extern void foo7(void);
+void
+foo7(void)
+{
+ foo6();
+} /* { dg-bogus "warning:" "this function should not get any warnings" } */
+
+extern void foo8(void) __attribute__ ((__noreturn__));
+void
+foo8(void)
+{
+ foo7();
+} /* { dg-warning "'noreturn' function does return" "detect return from tail call" } */
--- /dev/null
+/* Check for various valid and erroneous "noreturn" cases. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wmissing-noreturn" } */
+
+extern void exit (int);
+
+extern void foo1(void) __attribute__ ((__noreturn__));
+void
+foo1(void)
+{
+} /* { dg-warning "'noreturn' function does return" "detect falling off end of noreturn" } */
+
+extern void foo2(void) __attribute__ ((__noreturn__));
+void
+foo2(void)
+{
+ exit(0);
+} /* { dg-bogus "warning:" "this function should not get any warnings" } */
+
+extern void foo3(void);
+void
+foo3(void)
+{
+} /* { dg-bogus "warning:" "this function should not get any warnings" } */
+
+extern void foo4(void);
+void
+foo4(void)
+{ /* { dg-warning "candidate for attribute 'noreturn'" "detect noreturn candidate" } */
+ exit(0);
+}
+
+extern void foo5(void) __attribute__ ((__noreturn__));
+void
+foo5(void)
+{
+ return; /* { dg-warning "'noreturn' has a 'return' statement" "detect invalid return" } */
+} /* { dg-warning "function does return" "detect return from noreturn" } */
+
+extern void foo6(void);
+void
+foo6(void)
+{
+ return;
+} /* { dg-bogus "warning:" "this function should not get any warnings" } */
+
+extern void foo7(void);
+void
+foo7(void)
+{
+ foo6();
+} /* { dg-bogus "warning:" "this function should not get any warnings" } */
+
+extern void foo8(void) __attribute__ ((__noreturn__));
+void
+foo8(void)
+{
+ foo7();
+} /* { dg-warning "'noreturn' function does return" "detect return from tail call" } */
--- /dev/null
+:100000000000D0E0F500D0E0F501750900E509F544
+:1000100002E509F503E509F504E509F505E501C083
+:10002000E0E500C0E0E502F582E503F583E504F5CF
+:1000300000E505F5012200E506758202C39582F50B
+:1000400006E5077583009583F507D0E0F50875E0B0
+:10005000012506F58275E0003507F583E508F0D047
+:10006000E0F50875E0002506F58275E0003507F536
+:1000700083E508F0751F00751E00751D00751C00D6
+:10008000750000E500F502E500F503E500F504E57F
+:1000900000F50575E0002506F58275E0003507F5E9
+:1000A00083E0F508E508C0E075E0012506F58275F6
+:1000B000E0003507F583E0F508E508C0E075E002EB
+:1000C0002506F50675E0003507F507E502F582E53A
+:1000D00003F583E504F500E505F5012200D0E0F520
+:1000E00000D0E0F501750900E509F502E509F50321
+:1000F000E509F504E509F505E501C0E0E500C0E026
+:10010000E502F582E503F583E504F500E505F50173
+:100110002200E506758202C39582F506E507758320
+:10012000009583F507D0E0F50875E0012506F58216
+:1001300075E0003507F583E508F0D0E0F50875E0D7
+:10014000002506F58275E0003507F583E508F075B2
+:100150001F00751E00751D00751C00750000E50070
+:10016000F502E500F503E500F504E500F50575E0A9
+:10017000002506F58275E0003507F583E0F508E512
+:1001800008C0E075E0012506F58275E0003507F549
+:1001900083E0F508E508C0E075E0022506F5067580
+:1001A000E0003507F507E502F582E503F583E50490
+:1001B000F500E505F5012200D0E0F500D0E0F501FD
+:1001C000750900E509F502E509F503E509F504E51A
+:1001D00009F505E501C0E0E500C0E0E502F582E5CE
+:1001E00003F583E504F500E505F5012200D0E0F50F
+:1001F00000D0E0F501750900E509F502E509F50310
+:10020000E509F504E509F505E501C0E0E500C0E014
+:10021000E502F582E503F583E504F500E505F50162
+:100220002200E506758202C39582F506E50775830F
+:10023000009583F507D0E0F50875E0012506F58205
+:1002400075E0003507F583E508F0D0E0F50875E0C6
+:10025000002506F58275E0003507F583E508F01204
+:1002600001EC750000E500F502E500F503E500F599
+:1002700004E500F50575E0002506F58275E000351A
+:1002800007F583E0F508E508C0E075E0012506F50F
+:100290008275E0003507F583E0F508E508C0E075F4
+:1002A000E0022506F50675E0003507F507E502F5DD
+:1002B00082E503F583E504F500E505F5012200E597
+:1002C00006758202C39582F506E50775830095835E
+:1002D000F507D0E0F50875E0012506F58275E00028
+:1002E0003507F583E508F0D0E0F50875E000250650
+:1002F000F58275E0003507F583E508F012022175F7
+:100300000000E500F502E500F503E500F504E50071
+:10031000F50575E0002506F58275E0003507F583E3
+:10032000E0F508E508C0E075E0012506F58275E016
+:10033000003507F583E0F508E508C0E075E0022523
+:1003400006F50675E0003507F507E502F582E503D9
+:10035000F583E504F500E505F50122000000000045
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Check for invalid "noreturn" warning. */
+/* { dg-do compile } */
+/* { dg-options "-O3 -Wall" } */
+extern void abort (void) __attribute__ ((__noreturn__));
+
+void noreturn (int x) __attribute__ ((__noreturn__));
+
+void
+noreturn (int x)
+{
+ abort ();
+} /* { dg-bogus "does return" "noreturn does return" } */
--- /dev/null
+/* Check for invalid "noreturn" warning. */
+/* { dg-do compile } */
+/* { dg-options "-O3 -Wall" } */
+extern void abort (void) __attribute__ ((__noreturn__));
+
+void noreturn (int x) __attribute__ ((__noreturn__));
+
+void
+noreturn (int x)
+{
+ abort ();
+} /* { dg-bogus "does return" "noreturn does return" } */
--- /dev/null
+:100000000000E506758206C39582F506E50775834F
+:10001000009583F507D0E0F50875E0012506F58227
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000002506F58275E0003507F583E508F075C3
+:100040000000E500F502E500F503E500F504E50034
+:10005000F50575E0002506F58275E0003507F583A6
+:10006000E0F508E508C0E075E0012506F58275E0D9
+:10007000003507F583E0F508E508C0E075E00625E2
+:1000800006F50675E0003507F507E502F582E5039C
+:10009000F583E504F500E505F50122000000000008
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99" } */
+/* Check that 'noreturn' and 'volatile extern' are compatible.
+ The testsuite uses -ansi -pedantic-errors by default, so this has
+ to override. */
+extern void xxx (int) __attribute__((noreturn));
+typedef void voidfn (int);
+__volatile extern voidfn xxx;
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99" } */
+/* Check that 'noreturn' and 'volatile extern' are compatible.
+ The testsuite uses -ansi -pedantic-errors by default, so this has
+ to override. */
+extern void xxx (int) __attribute__((noreturn));
+typedef void voidfn (int);
+__volatile extern voidfn xxx;
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* Check for volatile behaviour. */
+extern int xxx (void);
+volatile extern int xxx (void); /* { dg-error "not compatible" } */
--- /dev/null
+/* { dg-do compile } */
+/* Check for volatile behaviour. */
+extern int xxx (void);
+volatile extern int xxx (void); /* { dg-error "not compatible" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR optimization/13394 */
+/* Origin: Carlo Wood <carlo@gcc.gnu.org> */
+
+/* Verify that a bogus "function does return" warning is not issued
+ in presence of tail recursion within a noreturn function. */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wreturn-type -Wmissing-noreturn" } */
+
+
+void f(void) __attribute__ ((__noreturn__));
+void _exit(int status) __attribute__ ((__noreturn__));
+
+int z = 0;
+
+void g()
+{ /* { dg-warning "possible candidate" } */
+ if (++z > 10)
+ _exit(0);
+ g();
+}
+
+void f()
+{
+ if (++z > 10)
+ _exit(0);
+ f();
+} /* { dg-bogus "does return" } */
+
+int h()
+{ /* { dg-warning "possible candidate" } */
+ if (++z > 10)
+ _exit(0);
+ return h();
+} /* { dg-bogus "end of non-void function" } */
+
+int k()
+{ /* { dg-warning "possible candidate" } */
+ if (++z > 10)
+ _exit(0);
+ k();
+} /* { dg-warning "control reaches" } */
--- /dev/null
+/* PR optimization/13394 */
+/* Origin: Carlo Wood <carlo@gcc.gnu.org> */
+
+/* Verify that a bogus "function does return" warning is not issued
+ in presence of tail recursion within a noreturn function. */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wreturn-type -Wmissing-noreturn" } */
+
+
+void f(void) __attribute__ ((__noreturn__));
+void _exit(int status) __attribute__ ((__noreturn__));
+
+int z = 0;
+
+void g()
+{ /* { dg-warning "possible candidate" } */
+ if (++z > 10)
+ _exit(0);
+ g();
+}
+
+void f()
+{
+ if (++z > 10)
+ _exit(0);
+ f();
+} /* { dg-bogus "does return" } */
+
+int h()
+{ /* { dg-warning "possible candidate" } */
+ if (++z > 10)
+ _exit(0);
+ return h();
+} /* { dg-bogus "end of non-void function" } */
+
+int k()
+{ /* { dg-warning "possible candidate" } */
+ if (++z > 10)
+ _exit(0);
+ k();
+} /* { dg-warning "control reaches" } */
--- /dev/null
+:100000000000E50675820AC39582F506E50775834B
+:10001000009583F507D0E0F50875E0012506F58227
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000002506F58275E0003507F583E508F075C3
+:10004000E0092506F58275E0003507F583E517F030
+:1000500075E0082506F58275E0003507F583E5169D
+:10006000F075E0072506F58275E0003507F583E5B4
+:1000700015F075E0062506F58275E0003507F58375
+:10008000E514F075E0052506F58275E0003507F505
+:1000900083E513F075E0042506F58275E000350769
+:1000A000F583E512F075E0032506F58275E000356D
+:1000B00007F583E511F075E0022506F58275E0008D
+:1000C0003507F583E510F0900000E582F509900012
+:1000D00000E583F50B750100C3750000E501F5F03F
+:1000E000E50935F0F501E500F5F0E50B35F0F50033
+:1000F000E500F502E501F582E502F583E0F50F750F
+:100100000101C3750000E501F5F0E50935F0F501E1
+:10011000E500F5F0E50B35F0F500E500F502E50149
+:10012000F582E502F583E0F50C750102C375000068
+:10013000E501F5F0E50935F0F501E500F5F0E50B31
+:1001400035F0F500E500F502E501F582E502F583FD
+:10015000E0F50A750103C3750000E501F5F0E50956
+:1001600035F0F501E500F5F0E50B35F0F500E500BB
+:10017000F502E501F582E502F583E0F501750E0172
+:10018000750B00750900750000C3750D00E50EF5CF
+:10019000F0E50F35F0F50DE50BF5F0E50C35F0F574
+:1001A0000EE509F5F0E50A35F0F50FE500F5F0E5A7
+:1001B0000135F0F510900000E582F509900000E5AA
+:1001C00083F50A750100C3750000E501F5F0E50946
+:1001D00035F0F501E500F5F0E50A35F0F500E50D3F
+:1001E000F503E500F502E501F582E502F583E50397
+:1001F000F0750101C3750000E501F5F0E50935F082
+:10020000F501E500F5F0E50A35F0F500E50EF5033A
+:10021000E500F502E501F582E502F583E503F075F9
+:100220000102C3750000E501F5F0E50935F0F501BF
+:10023000E500F5F0E50A35F0F500E50FF503E5001A
+:10024000F502E501F582E502F583E503F0750103AA
+:10025000C3750000E501F5F0E50935F0F501E500AD
+:10026000F5F0E50A35F0F500E510F503E500F502D7
+:10027000E501F582E502F583E503F075170A7511CE
+:1002800000751200751300750080E500F5F0E513A8
+:1002900025F0F513E500F5F0E51025F0F510750CE7
+:1002A00000751400751500751600750B00750A01B0
+:1002B000750001C3E510F5F0E51395F0F509E50BC0
+:1002C000F5F0E50B35F0F509E509F5F0E50055F039
+:1002D000F500E500F5F0E50C45F0F50C750001C3FF
+:1002E000E510F5F0E51395F0F509E50BF5F0E50BF4
+:1002F00035F0F509E513F5F0E51095F0F501E50B9E
+:10030000F5F0E50B35F0F501E501F5F0E50945F00F
+:10031000F509E50AF5F0E50965F0F509E509F5F0F7
+:10032000E50055F0F500C3E50FF5F0E51295F0F5A1
+:1003300009E50BF5F0E50B35F0F509E509F5F0E514
+:100340000055F0F500E500F5F0E50C45F0F50C750D
+:100350000001C3E510F5F0E51395F0F509E50BF59F
+:10036000F0E50B35F0F509E513F5F0E51095F0F53E
+:1003700001E50BF5F0E50B35F0F501E501F5F0E5EC
+:100380000945F0F509E50AF5F0E50965F0F509E537
+:1003900009F5F0E50055F0F500C3E50FF5F0E512BD
+:1003A00095F0F509E50BF5F0E50B35F0F509E512EB
+:1003B000F5F0E50F95F0F501E50BF5F0E50B35F0FF
+:1003C000F501E501F5F0E50945F0F509E50AF5F077
+:1003D000E50965F0F509E509F5F0E50055F0F500EA
+:1003E000C3E50EF5F0E51195F0F509E50BF5F0E53F
+:1003F0000B35F0F509E509F5F0E50055F0F500E5F8
+:1004000000F5F0E50C45F0F50C750001C3E510F5BD
+:10041000F0E51395F0F509E50BF5F0E50B35F0F592
+:1004200009E513F5F0E51095F0F501E50BF5F0E5BC
+:100430000B35F0F501E501F5F0E50945F0F509E5C5
+:100440000AF5F0E50965F0F509E509F5F0E500556F
+:10045000F0F500C3E50FF5F0E51295F0F509E50BB1
+:10046000F5F0E50B35F0F509E512F5F0E50F95F03F
+:10047000F501E50BF5F0E50B35F0F501E501F5F0DB
+:10048000E50945F0F509E50AF5F0E50965F0F50936
+:10049000E509F5F0E50055F0F500C3E50EF5F0E5EA
+:1004A0001195F0F509E50BF5F0E50B35F0F509E5EB
+:1004B00011F5F0E50E95F0F501E50BF5F0E50B35DE
+:1004C000F0F501E501F5F0E50945F0F509E50AF576
+:1004D000F0E50965F0F509E509F5F0E50055F0F5F9
+:1004E00000C3E50DF5F0E51795F0F509E50BF5F01E
+:1004F000E50B35F0F509E509F5F0E50055F0F500F7
+:10050000E500F5F0E50C45F0F50C750000E50CF59F
+:10051000F0E50045F0F500E514F5F0E50045F0F5EF
+:1005200000E515F5F0E50045F0F500E516F5F0E518
+:100530000045F0F500E50070028003020626001277
+:100540000001750000E500F502E500F503E500F5A2
+:1005500004E500F50575E0092506F58275E000352E
+:1005600007F583E0F51775E0082506F58275E000CC
+:100570003507F583E0F51675E0072506F58275E089
+:10058000003507F583E0F51575E0062506F582755B
+:10059000E0003507F583E0F51475E0052506F582E2
+:1005A00075E0003507F583E0F51375E0042506F5E1
+:1005B0008275E0003507F583E0F51275E003250646
+:1005C000F58275E0003507F583E0F51175E0022549
+:1005D00006F58275E0003507F583E0F51075E0005B
+:1005E0002506F58275E0003507F583E0F508E50896
+:1005F000C0E075E0012506F58275E0003507F5835A
+:10060000E0F508E508C0E075E00A2506F50675E0A6
+:10061000003507F507E502F582E503F583E504F506
+:1006200000E505F5012200751F00751E00751D000F
+:10063000751C0002053F00E50675820AC39582F528
+:1006400006E5077583009583F507D0E0F50875E0AA
+:10065000012506F58275E0003507F583E508F0D041
+:10066000E0F50875E0002506F58275E0003507F530
+:1006700083E508F075E0092506F58275E000350789
+:10068000F583E517F075E0082506F58275E000357D
+:1006900007F583E516F075E0072506F58275E0009D
+:1006A0003507F583E515F075E0062506F58275E05A
+:1006B000003507F583E514F075E0052506F582752C
+:1006C000E0003507F583E513F075E0042506F582B3
+:1006D00075E0003507F583E512F075E0032506F5B2
+:1006E0008275E0003507F583E511F075E002250617
+:1006F000F58275E0003507F583E510F0900000E520
+:1007000082F509900000E583F50B750100C37500C3
+:1007100000E501F5F0E50935F0F501E500F5F0E556
+:100720000B35F0F500E500F502E501F582E502F58F
+:1007300083E0F50F750101C3750000E501F5F0E5F3
+:100740000935F0F501E500F5F0E50B35F0F500E5CC
+:1007500000F502E501F582E502F583E0F50C75018F
+:1007600002C3750000E501F5F0E50935F0F501E596
+:1007700000F5F0E50B35F0F500E500F502E501F5D3
+:1007800082E502F583E0F50A750103C3750000E513
+:1007900001F5F0E50935F0F501E500F5F0E50B357B
+:1007A000F0F500E500F502E501F582E502F583E0EC
+:1007B000F501750E01750B00750900750000C37514
+:1007C0000D00E50EF5F0E50F35F0F50DE50BF5F054
+:1007D000E50C35F0F50EE509F5F0E50A35F0F50F15
+:1007E000E500F5F0E50135F0F510900000E582F543
+:1007F00009900000E583F50A750100C3750000E566
+:1008000001F5F0E50935F0F501E500F5F0E50A350B
+:10081000F0F500E50DF503E500F502E501F582E5EB
+:1008200002F583E503F0750101C3750000E501F5EC
+:10083000F0E50935F0F501E500F5F0E50A35F0F5EC
+:1008400000E50EF503E500F502E501F582E502F5A8
+:1008500083E503F0750102C3750000E501F5F0E5DD
+:100860000935F0F501E500F5F0E50A35F0F500E5AC
+:100870000FF503E500F502E501F582E502F583E5F4
+:1008800003F0750103C3750000E501F5F0E50935D6
+:10089000F0F501E500F5F0E50A35F0F500E510F5B5
+:1008A00003E500F502E501F582E502F583E503F0D5
+:1008B00075170A751100751200751300750080E533
+:1008C00000F5F0E51325F0F513E500F5F0E510254A
+:1008D000F0F510750C00751400751500751600758F
+:1008E0000B00750A01750001C3E510F5F0E51395DD
+:1008F000F0F509E50BF5F0E50B35F0F509E509F53F
+:10090000F0E50055F0F500E500F5F0E50C45F0F5F3
+:100910000C750001C3E510F5F0E51395F0F509E558
+:100920000BF5F0E50B35F0F509E513F5F0E510955D
+:10093000F0F501E50BF5F0E50B35F0F501E501F516
+:10094000F0E50945F0F509E50AF5F0E50965F0F58A
+:1009500009E509F5F0E50055F0F500C3E50FF5F000
+:10096000E51295F0F509E50BF5F0E50B35F0F50925
+:10097000E509F5F0E50055F0F500E500F5F0E50CCA
+:1009800045F0F50C750001C3E510F5F0E51395F0A1
+:10099000F509E50BF5F0E50B35F0F509E513F5F094
+:1009A000E51095F0F501E50BF5F0E50B35F0F501F7
+:1009B000E501F5F0E50945F0F509E50AF5F0E50989
+:1009C00065F0F509E509F5F0E50055F0F500C3E53A
+:1009D0000FF5F0E51295F0F509E50BF5F0E50B35AF
+:1009E000F0F509E512F5F0E50F95F0F501E50BF5E9
+:1009F000F0E50B35F0F501E501F5F0E50945F0F519
+:100A000009E50AF5F0E50965F0F509E509F5F0E510
+:100A10000055F0F500C3E50EF5F0E51195F0F50988
+:100A2000E50BF5F0E50B35F0F509E509F5F0E50026
+:100A300055F0F500E500F5F0E50C45F0F50C750016
+:100A400001C3E510F5F0E51395F0F509E50BF5F0B8
+:100A5000E50B35F0F509E513F5F0E51095F0F50136
+:100A6000E50BF5F0E50B35F0F501E501F5F0E509ED
+:100A700045F0F509E50AF5F0E50965F0F509E50940
+:100A8000F5F0E50055F0F500C3E50FF5F0E512953A
+:100A9000F0F509E50BF5F0E50B35F0F509E512F594
+:100AA000F0E50F95F0F501E50BF5F0E50B35F0F508
+:100AB00001E501F5F0E50945F0F509E50AF5F0E590
+:100AC0000965F0F509E509F5F0E50055F0F500C315
+:100AD000E50EF5F0E51195F0F509E50BF5F0E50B00
+:100AE00035F0F509E511F5F0E50E95F0F501E50BAA
+:100AF000F5F0E50B35F0F501E501F5F0E50945F018
+:100B0000F509E50AF5F0E50965F0F509E509F5F0FF
+:100B1000E50055F0F500C3E50DF5F0E51795F0F5A6
+:100B200009E50BF5F0E50B35F0F509E509F5F0E51C
+:100B30000055F0F500E500F5F0E50C45F0F50C7515
+:100B40000000E50CF5F0E50045F0F500E514F5F0E2
+:100B5000E50045F0F500E515F5F0E50045F0F50098
+:100B6000E516F5F0E50045F0F500E50070028003BC
+:100B7000020C5B00120636750000E500F502E50088
+:100B8000F503E500F504E500F50575E0092506F532
+:100B90008275E0003507F583E0F51775E008250656
+:100BA000F58275E0003507F583E0F51675E0072559
+:100BB00006F58275E0003507F583E0F51575E0066A
+:100BC0002506F58275E0003507F583E0F51475E03C
+:100BD000052506F58275E0003507F583E0F5137508
+:100BE000E0042506F58275E0003507F583E0F5128F
+:100BF00075E0032506F58275E0003507F583E0F51D
+:100C00001175E0022506F58275E0003507F583E0F1
+:100C1000F51075E0002506F58275E0003507F583CF
+:100C2000E0F508E508C0E075E0012506F58275E00D
+:100C3000003507F583E0F508E508C0E075E00A2512
+:100C400006F50675E0003507F507E502F582E503D0
+:100C5000F583E504F500E505F5012200751F007533
+:100C60001E00751D00751C00020B7400E5067582E0
+:100C70000AC39582F506E5077583009583F507D0CD
+:100C8000E0F50875E0012506F58275E0003507F509
+:100C900083E508F0D0E0F50875E0002506F58275DB
+:100CA000E0003507F583E508F075E0092506F582D3
+:100CB00075E0003507F583E517F075E0082506F5C2
+:100CC0008275E0003507F583E516F075E007250627
+:100CD000F58275E0003507F583E515F075E006252A
+:100CE00006F58275E0003507F583E514F075E0053B
+:100CF0002506F58275E0003507F583E513F075E00C
+:100D0000042506F58275E0003507F583E512F075D8
+:100D1000E0032506F58275E0003507F583E511F05F
+:100D200075E0022506F58275E0003507F583E510CC
+:100D3000F0900000E582F509900000E583F50B7561
+:100D40000100C3750000E501F5F0E50935F0F50196
+:100D5000E500F5F0E50B35F0F500E500F502E501FD
+:100D6000F582E502F583E0F50F750101C37500001A
+:100D7000E501F5F0E50935F0F501E500F5F0E50BE5
+:100D800035F0F500E500F502E501F582E502F583B1
+:100D9000E0F50C750102C3750000E501F5F0E50909
+:100DA00035F0F501E500F5F0E50B35F0F500E5006F
+:100DB000F502E501F582E502F583E0F50A75010328
+:100DC000C3750000E501F5F0E50935F0F501E50032
+:100DD000F5F0E50B35F0F500E500F502E501F582EB
+:100DE000E502F583E0F501750E01750B007509004C
+:100DF000750000C3750D00E50EF5F0E50F35F0F553
+:100E00000DE50BF5F0E50C35F0F50EE509F5F0E52F
+:100E10000A35F0F50FE500F5F0E50135F0F5109035
+:100E20000000E582F509900000E583F50A750100F0
+:100E3000C3750000E501F5F0E50935F0F501E500C1
+:100E4000F5F0E50A35F0F500E50DF503E500F502EE
+:100E5000E501F582E502F583E503F0750101C3754F
+:100E60000000E501F5F0E50935F0F501E500F5F0E4
+:100E7000E50A35F0F500E50EF503E500F502E501BC
+:100E8000F582E502F583E503F0750102C375000004
+:100E9000E501F5F0E50935F0F501E500F5F0E50AC5
+:100EA00035F0F500E50FF503E500F502E501F58203
+:100EB000E502F583E503F0750103C3750000E50164
+:100EC000F5F0E50935F0F501E500F5F0E50A35F056
+:100ED000F500E510F503E500F502E501F582E50210
+:100EE000F583E503F075170A751100751200751387
+:100EF00000750080E500F5F0E51325F0F513E50039
+:100F0000F5F0E51025F0F510750C00751400751559
+:100F100000751600750B00750A01750001C3E51018
+:100F2000F5F0E51395F0F509E50BF5F0E50B35F077
+:100F3000F509E509F5F0E50055F0F500E500F5F0F7
+:100F4000E50C45F0F50C750001C3E510F5F0E5136F
+:100F500095F0F509E50BF5F0E50B35F0F509E5132E
+:100F6000F5F0E51095F0F501E50BF5F0E50B35F042
+:100F7000F501E501F5F0E50945F0F509E50AF5F0BB
+:100F8000E50965F0F509E509F5F0E50055F0F5002E
+:100F9000C3E50FF5F0E51295F0F509E50BF5F0E581
+:100FA0000B35F0F509E509F5F0E50055F0F500E53C
+:100FB00000F5F0E50C45F0F50C750001C3E510F502
+:100FC000F0E51395F0F509E50BF5F0E50B35F0F5D7
+:100FD00009E513F5F0E51095F0F501E50BF5F0E501
+:100FE0000B35F0F501E501F5F0E50945F0F509E50A
+:100FF0000AF5F0E50965F0F509E509F5F0E50055B4
+:10100000F0F500C3E50FF5F0E51295F0F509E50BF5
+:10101000F5F0E50B35F0F509E512F5F0E50F95F083
+:10102000F501E50BF5F0E50B35F0F501E501F5F01F
+:10103000E50945F0F509E50AF5F0E50965F0F5097A
+:10104000E509F5F0E50055F0F500C3E50EF5F0E52E
+:101050001195F0F509E50BF5F0E50B35F0F509E52F
+:1010600009F5F0E50055F0F500E500F5F0E50C4573
+:10107000F0F50C750001C3E510F5F0E51395F0F5FA
+:1010800009E50BF5F0E50B35F0F509E513F5F0E5AD
+:101090001095F0F501E50BF5F0E50B35F0F501E500
+:1010A00001F5F0E50945F0F509E50AF5F0E5096512
+:1010B000F0F509E509F5F0E50055F0F500C3E50F99
+:1010C000F5F0E51295F0F509E50BF5F0E50B35F0D7
+:1010D000F509E512F5F0E50F95F0F501E50BF5F0F2
+:1010E000E50B35F0F501E501F5F0E50945F0F50909
+:1010F000E50AF5F0E50965F0F509E509F5F0E50023
+:1011000055F0F500C3E50EF5F0E51195F0F509E5AC
+:101110000BF5F0E50B35F0F509E511F5F0E50E9569
+:10112000F0F501E50BF5F0E50B35F0F501E501F51E
+:10113000F0E50945F0F509E50AF5F0E50965F0F592
+:1011400009E509F5F0E50055F0F500C3E50DF5F00A
+:10115000E51795F0F509E50BF5F0E50B35F0F50928
+:10116000E509F5F0E50055F0F500E500F5F0E50CD2
+:1011700045F0F50C750000E50CF5F0E50045F0F5DF
+:1011800000E514F5F0E50045F0F500E515F5F0E5AE
+:101190000045F0F500E516F5F0E50045F0F500E551
+:1011A00000700280030212AD00120C6BE582F502A2
+:1011B000E583F503E500F504E501F505E502F50035
+:1011C000E503F501E504F509E505F50AE500F50295
+:1011D000E501F503E509F504E50AF50575E00925DE
+:1011E00006F58275E0003507F583E0F51775E00830
+:1011F0002506F58275E0003507F583E0F51675E004
+:10120000072506F58275E0003507F583E0F51575CD
+:10121000E0062506F58275E0003507F583E0F51454
+:1012200075E0052506F58275E0003507F583E0F5E4
+:101230001375E0042506F58275E0003507F583E0B7
+:10124000F51275E0032506F58275E0003507F58394
+:10125000E0F51175E0022506F58275E0003507F529
+:1012600083E0F51075E0002506F58275E00035078E
+:10127000F583E0F508E508C0E075E0012506F58294
+:1012800075E0003507F583E0F508E508C0E075E096
+:101290000A2506F50675E0003507F507E502F58233
+:1012A000E503F583E504F500E505F5012200751F6A
+:1012B00000751E00751D00751C000211A900E506D1
+:1012C00075820BC39582F506E5077583009583F556
+:1012D00007D0E0F50875E0022506F58275E00035D7
+:1012E00007F583E508F0D0E0F50875E0012506F57F
+:1012F0008275E0003507F583E508F075E00A2506FC
+:10130000F58275E0003507F583E517F075E00925EE
+:1013100006F58275E0003507F583E516F075E008FF
+:101320002506F58275E0003507F583E515F075E0D3
+:10133000072506F58275E0003507F583E514F0759D
+:10134000E0062506F58275E0003507F583E513F024
+:1013500075E0052506F58275E0003507F583E51291
+:10136000F075E0042506F58275E0003507F583E5A4
+:1013700011F075E0032506F58275E0003507F58369
+:10138000E510F0900000E582F509900000E583F596
+:101390000B750100C3750000E501F5F0E50935F0B6
+:1013A000F501E500F5F0E50B35F0F500E500F50297
+:1013B000E501F582E502F583E0F50F750101C375DE
+:1013C0000000E501F5F0E50935F0F501E500F5F07F
+:1013D000E50B35F0F500E500F502E501F582E502E3
+:1013E000F583E0F50C750102C3750000E501F5F029
+:1013F000E50935F0F501E500F5F0E50B35F0F50010
+:10140000E500F502E501F582E502F583E0F50A75F0
+:101410000103C3750000E501F5F0E50935F0F501BC
+:10142000E500F5F0E50B35F0F500E500F502E50126
+:10143000F582E502F583E0F501750E01750B007587
+:101440000900750000C3750D00E50EF5F0E50F35D8
+:10145000F0F50DE50BF5F0E50C35F0F50EE509F5C9
+:10146000F0E50A35F0F50FE500F5F0E50135F0F5AA
+:1014700010900000E582F509900000E583F50A75FB
+:101480000100C3750000E501F5F0E50935F0F5014F
+:10149000E500F5F0E50A35F0F500E50DF503E500AA
+:1014A000F502E501F582E502F583E503F07501013A
+:1014B000C3750000E501F5F0E50935F0F501E5003B
+:1014C000F5F0E50A35F0F500E50EF503E500F50267
+:1014D000E501F582E502F583E503F0750102C375C8
+:1014E0000000E501F5F0E50935F0F501E500F5F05E
+:1014F000E50A35F0F500E50FF503E500F502E50135
+:10150000F582E502F583E503F0750103C37500007C
+:10151000E501F5F0E50935F0F501E500F5F0E50A3E
+:1015200035F0F500E510F503E500F502E501F5827B
+:10153000E502F583E503F075170A751100751200D1
+:10154000751300750080E500F5F0E51325F0F5133F
+:10155000E500F5F0E51025F0F510750C00751400A8
+:10156000751500751600750B00750A01750001C32D
+:10157000E510F5F0E51395F0F509E50BF5F0E50B51
+:1015800035F0F509E509F5F0E50055F0F500E50061
+:10159000F5F0E50C45F0F50C750001C3E510F5F02C
+:1015A000E51395F0F509E50BF5F0E50B35F0F509D8
+:1015B000E513F5F0E51095F0F501E50BF5F0E50B19
+:1015C00035F0F501E501F5F0E50945F0F509E50A25
+:1015D000F5F0E50965F0F509E509F5F0E50055F0E8
+:1015E000F500C3E50FF5F0E51295F0F509E50BF50B
+:1015F000F0E50B35F0F509E509F5F0E50055F0F5F6
+:1016000000E500F5F0E50C45F0F50C750001C3E5CB
+:1016100010F5F0E51395F0F509E50BF5F0E50B3560
+:10162000F0F509E513F5F0E51095F0F501E50BF59A
+:10163000F0E50B35F0F501E501F5F0E50945F0F5CC
+:1016400009E50AF5F0E50965F0F509E509F5F0E5C4
+:101650000055F0F500C3E50FF5F0E51295F0F5093A
+:10166000E50BF5F0E50B35F0F509E512F5F0E50FC2
+:1016700095F0F501E50BF5F0E50B35F0F501E50129
+:10168000F5F0E50945F0F509E50AF5F0E50965F03D
+:10169000F509E509F5F0E50055F0F500C3E50EF5AF
+:1016A000F0E51195F0F509E50BF5F0E50B35F0F5F2
+:1016B00009E509F5F0E50055F0F500E500F5F0E580
+:1016C0000C45F0F50C750001C3E510F5F0E5139538
+:1016D000F0F509E50BF5F0E50B35F0F509E513F547
+:1016E000F0E51095F0F501E50BF5F0E50B35F0F5BB
+:1016F00001E501F5F0E50945F0F509E50AF5F0E544
+:101700000965F0F509E509F5F0E50055F0F500C3C8
+:10171000E50FF5F0E51295F0F509E50BF5F0E50BB1
+:1017200035F0F509E512F5F0E50F95F0F501E50B5B
+:10173000F5F0E50B35F0F501E501F5F0E50945F0CB
+:10174000F509E50AF5F0E50965F0F509E509F5F0B3
+:10175000E50055F0F500C3E50EF5F0E51195F0F55F
+:1017600009E50BF5F0E50B35F0F509E511F5F0E5C8
+:101770000E95F0F501E50BF5F0E50B35F0F501E51B
+:1017800001F5F0E50945F0F509E50AF5F0E509652B
+:10179000F0F509E509F5F0E50055F0F500C3E50DB4
+:1017A000F5F0E51795F0F509E50BF5F0E50B35F0EB
+:1017B000F509E509F5F0E50055F0F500E500F5F06F
+:1017C000E50C45F0F50C750000E50CF5F0E500457D
+:1017D000F0F500E514F5F0E50045F0F500E515F548
+:1017E000F0E50045F0F500E516F5F0E50045F0F50B
+:1017F00000E50070028003021913001212BD75E0AB
+:10180000002506F58275E0003507F583E0F50275E1
+:10181000E0002506F58275E0003507F583E0F50365
+:1018200075E0002506F58275E0003507F583E0F5E3
+:101830000475E0002506F58275E0003507F583E0C4
+:10184000F50575E00A2506F58275E0003507F58394
+:10185000E0F51775E0092506F58275E0003507F516
+:1018600083E0F51675E0082506F58275E00035077A
+:10187000F583E0F51575E0072506F58275E000357E
+:1018800007F583E0F51475E0062506F58275E0009E
+:101890003507F583E0F51375E0052506F58275E05B
+:1018A000003507F583E0F51275E0042506F582752D
+:1018B000E0003507F583E0F51175E0032506F582B4
+:1018C00075E0003507F583E0F51075E0012506F5B4
+:1018D0008275E0003507F583E0F508E508C0E0759E
+:1018E000E0022506F58275E0003507F583E0F5088E
+:1018F000E508C0E075E00B2506F50675E000350744
+:10190000F507E502F582E503F583E504F500E50555
+:10191000F5012200751F00751E00751D00751C0065
+:101920000217FB00000000000000000000000000A3
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR c/13382 */
+/* Origin: Richard Hutchinson <richard.hutchinson@asa.co.uk> */
+
+/* Verify that the null initializer is converted to the right
+ pointer type. */
+
+/* { dg-do compile } */
+/* { dg-options "-O" } */
+
+struct t
+{
+ int aMember;
+};
+
+struct t *const aPointer = 0;
+
+void foo()
+{
+ int anInt = (aPointer == 0) ? 0 : aPointer->aMember;
+}
--- /dev/null
+/* PR c/13382 */
+/* Origin: Richard Hutchinson <richard.hutchinson@asa.co.uk> */
+
+/* Verify that the null initializer is converted to the right
+ pointer type. */
+
+/* { dg-do compile } */
+/* { dg-options "-O" } */
+
+struct t
+{
+ int aMember;
+};
+
+struct t *const aPointer = 0;
+
+void foo()
+{
+ int anInt = (aPointer == 0) ? 0 : aPointer->aMember;
+}
--- /dev/null
+:1000000000D0E0F50ED0E0F50FE510F50D90000002
+:10001000E582F50A900000E583F50B750900C375CC
+:100020000000E509F5F0E50A35F0F509E500F5F021
+:10003000E50B35F0F501E501F502E509F582E5028C
+:10004000F583E0F500750901C3750100E509F5F0D8
+:10005000E50A35F0F509E501F5F0E50B35F0F501B8
+:10006000E501F502E509F582E502F583E0F50A759B
+:100070000100750900750C00C3E501F5F0E5009578
+:10008000F0F500E500F5F0E50C45F0F50CC3E509E9
+:10009000F5F0E50A95F0F500E500F5F0E50C45F022
+:1000A000F50C750100750900750A00E50CF5007581
+:1000B0000C01C3750B00E500F5F0E50B95F0F50BB1
+:1000C000750B00E50BF5F0E50B35F0F50BE50BF5E1
+:1000D000F0E50C65F0F50CC3750B00E501F5F0E5F6
+:1000E0000B95F0F50B750B00E50BF5F0E50B35F016
+:1000F000F50BE50BF5F0E50C65F0F50CC3750B00A1
+:10010000E509F5F0E50B95F0F50B750B00E50BF542
+:10011000F0E50B35F0F50BE50BF5F0E50C65F0F5CA
+:100120000CC3750B00E50AF5F0E50B95F0F50B75C2
+:100130000B00E50BF5F0E50B35F0F50BE50BF5F0F5
+:10014000E50C65F0F50C750100750900750A007580
+:100150000000E50CF5F0E50045F0F500E501F5F0EF
+:10016000E50045F0F500E509F5F0E50045F0F5009E
+:10017000E50AF5F0E50045F0F500E50070028003C2
+:100180000201BB00C3C3C3C3C3C3C3750000E50002
+:10019000F502E500F503E500F504E500F505E50DDC
+:1001A000F510E50FC0E0E50EC0E0E502F582E503DD
+:1001B000F583E504F500E505F501220002018B0059
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for old-style definition followed by prototype declaration.
+ Mismatched qualifiers used to be wrongly forbidden. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+void f1() {}
+void f1(void); /* { dg-warning "warning: prototype for 'f1' follows non-prototype definition" } */
+
+void f2() {} /* { dg-error "error: previous definition of 'f2' was here" } */
+void f2(int); /* { dg-error "error: prototype for 'f2' declares more arguments than previous old-style definition" } */
+
+void f3(a) int a; {} /* { dg-error "error: previous definition of 'f3' was here" } */
+void f3(void); /* { dg-error "error: prototype for 'f3' declares fewer arguments than previous old-style definition" } */
+
+void f4(a) int a; {}
+void f4(int); /* { dg-warning "warning: prototype for 'f4' follows non-prototype definition" } */
+
+void f5(a) int a; {} /* { dg-error "error: previous definition of 'f5' was here" } */
+void f5(int, int); /* { dg-error "error: prototype for 'f5' declares more arguments than previous old-style definition" } */
+
+void f6(a) int a; {} /* { dg-error "error: previous definition of 'f6' was here" } */
+void f6(int, ...); /* { dg-error "error: conflicting types for 'f6'" } */
+
+void f7(a, b) int a, b; {} /* { dg-error "error: previous definition of 'f7' was here" } */
+void f7(int); /* { dg-error "error: prototype for 'f7' declares fewer arguments than previous old-style definition" } */
+
+void f8(a, b) int a, b; {} /* { dg-error "error: previous definition of 'f8' was here" } */
+void f8(int, ...); /* { dg-error "error: conflicting types for 'f8'" } */
+
+void f9(a, b) int a, b; {}
+void f9(int, int); /* { dg-warning "warning: prototype for 'f9' follows non-prototype definition" } */
+
+void f10(a, b) int a, b; {} /* { dg-error "error: previous definition of 'f10' was here" } */
+void f10(int, long); /* { dg-error "error: prototype for 'f10' declares argument 2 with incompatible type" } */
+
+void f11(a, b) int a, b; {} /* { dg-error "error: previous definition of 'f11' was here" } */
+void f11(long, int); /* { dg-error "error: prototype for 'f11' declares argument 1 with incompatible type" } */
+
+void f12(a, b) const int a; volatile int b; {}
+void f12(volatile int, const int); /* { dg-warning "warning: prototype for 'f12' follows non-prototype definition" } */
+
+void f13(a) const int a[2][2]; {} /* { dg-error "error: previous definition of 'f13' was here" } */
+void f13(volatile int [2][2]); /* { dg-error "error: prototype for 'f13' declares argument 1 with incompatible type" } */
--- /dev/null
+/* Test for old-style definition followed by prototype declaration.
+ Mismatched qualifiers used to be wrongly forbidden. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+void f1() {}
+void f1(void); /* { dg-warning "warning: prototype for 'f1' follows non-prototype definition" } */
+
+void f2() {} /* { dg-error "error: previous definition of 'f2' was here" } */
+void f2(int); /* { dg-error "error: prototype for 'f2' declares more arguments than previous old-style definition" } */
+
+void f3(a) int a; {} /* { dg-error "error: previous definition of 'f3' was here" } */
+void f3(void); /* { dg-error "error: prototype for 'f3' declares fewer arguments than previous old-style definition" } */
+
+void f4(a) int a; {}
+void f4(int); /* { dg-warning "warning: prototype for 'f4' follows non-prototype definition" } */
+
+void f5(a) int a; {} /* { dg-error "error: previous definition of 'f5' was here" } */
+void f5(int, int); /* { dg-error "error: prototype for 'f5' declares more arguments than previous old-style definition" } */
+
+void f6(a) int a; {} /* { dg-error "error: previous definition of 'f6' was here" } */
+void f6(int, ...); /* { dg-error "error: conflicting types for 'f6'" } */
+
+void f7(a, b) int a, b; {} /* { dg-error "error: previous definition of 'f7' was here" } */
+void f7(int); /* { dg-error "error: prototype for 'f7' declares fewer arguments than previous old-style definition" } */
+
+void f8(a, b) int a, b; {} /* { dg-error "error: previous definition of 'f8' was here" } */
+void f8(int, ...); /* { dg-error "error: conflicting types for 'f8'" } */
+
+void f9(a, b) int a, b; {}
+void f9(int, int); /* { dg-warning "warning: prototype for 'f9' follows non-prototype definition" } */
+
+void f10(a, b) int a, b; {} /* { dg-error "error: previous definition of 'f10' was here" } */
+void f10(int, long); /* { dg-error "error: prototype for 'f10' declares argument 2 with incompatible type" } */
+
+void f11(a, b) int a, b; {} /* { dg-error "error: previous definition of 'f11' was here" } */
+void f11(long, int); /* { dg-error "error: prototype for 'f11' declares argument 1 with incompatible type" } */
+
+void f12(a, b) const int a; volatile int b; {}
+void f12(volatile int, const int); /* { dg-warning "warning: prototype for 'f12' follows non-prototype definition" } */
+
+void f13(a) const int a[2][2]; {} /* { dg-error "error: previous definition of 'f13' was here" } */
+void f13(volatile int [2][2]); /* { dg-error "error: prototype for 'f13' declares argument 1 with incompatible type" } */
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F5012200D0E0F500D0E0F5017509F5
+:1000400000E509F502E509F503E509F504E509F51B
+:1000500005E501C0E0E500C0E0E502F582E503F555
+:1000600083E504F500E505F5012200E50675820447
+:10007000C39582F506E5077583009583F507D0E003
+:10008000F500D0E0F501750900E509F502E509F58F
+:1000900003E509F504E509F505E501C0E0E500C063
+:1000A000E075E0042506F50675E0003507F507E57F
+:1000B00002F582E503F583E504F500E505F5012287
+:1000C00000E506758204C39582F506E50775830091
+:1000D0009583F507D0E0F500D0E0F501750900E55E
+:1000E00009F502E509F503E509F504E509F505E576
+:1000F00001C0E0E500C0E075E0042506F50675E006
+:10010000003507F507E502F582E503F583E504F51B
+:1001100000E505F5012200E506758204C39582F528
+:1001200006E5077583009583F507D0E0F500D0E07C
+:10013000F501750900E509F502E509F503E509F59D
+:1001400004E509F505E501C0E0E500C0E075E0045F
+:100150002506F50675E0003507F507E502F582E5A9
+:1001600003F583E504F500E505F5012200E50675D4
+:100170008204C39582F506E5077583009583F5072C
+:10018000D0E0F500D0E0F501750900E509F502E5DC
+:1001900009F503E509F504E509F505E501C0E0E524
+:1001A00000C0E075E0042506F50675E0003507F5AA
+:1001B00007E502F582E503F583E504F500E505F5BD
+:1001C000012200E506758208C39582F506E50775EC
+:1001D00083009583F507D0E0F500D0E0F5017509BF
+:1001E00000E509F502E509F503E509F504E509F57A
+:1001F00005E501C0E0E500C0E075E0082506F5066C
+:1002000075E0003507F507E502F582E503F583E5BE
+:1002100004F500E505F5012200E506758208C395A1
+:1002200082F506E5077583009583F507D0E0F500B4
+:10023000D0E0F501750900E509F502E509F503E5EA
+:1002400009F504E509F505E501C0E0E500C0E07544
+:10025000E0082506F50675E0003507F507E502F527
+:1002600082E503F583E504F500E505F5012200E5E7
+:1002700006758208C39582F506E5077583009583A8
+:10028000F507D0E0F500D0E0F501750900E509F5C6
+:1002900002E509F503E509F504E509F505E501C001
+:1002A000E0E500C0E075E0082506F50675E00035DC
+:1002B00007F507E502F582E503F583E504F500E5BA
+:1002C00005F5012200E506758208C39582F506E56D
+:1002D000077583009583F507D0E0F500D0E0F501C0
+:1002E000750900E509F502E509F503E509F504E5F9
+:1002F00009F505E501C0E0E500C0E075E008250668
+:10030000F50675E0003507F507E502F582E503F52A
+:1003100083E504F500E505F5012200E50675820890
+:10032000C39582F506E5077583009583F507D0E050
+:10033000F500D0E0F501750900E509F502E509F5DC
+:1003400003E509F504E509F505E501C0E0E500C0B0
+:10035000E075E0082506F50675E0003507F507E5C8
+:1003600002F582E503F583E504F500E505F50122D4
+:1003700000E506758208C39582F506E507758300DA
+:100380009583F507D0E0F500D0E0F501750900E5AB
+:1003900009F502E509F503E509F504E509F505E5C3
+:1003A00001C0E0E500C0E075E0082506F50675E04F
+:1003B000003507F507E502F582E503F583E504F569
+:1003C00000E505F5012200E506758202C39582F578
+:1003D00006E5077583009583F507D0E0F500D0E0CA
+:1003E000F501750900E509F502E509F503E509F5EB
+:1003F00004E509F505E501C0E0E500C0E075E002AF
+:100400002506F50675E0003507F507E502F582E5F6
+:1004100003F583E504F500E505F501220000000081
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR optimization/13318 */
+/* Origin: <bremner@unb.ca> */
+/* Reduced testcase: Wolfgang Bangerth <bangerth@dealii.org> */
+
+/* Verify that the big multiplier doesn't cause an integer
+ overflow in the loop optimizer. */
+
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+struct S {
+ int key;
+ int rnext,rprev;
+};
+
+void foo(struct S* H)
+{
+ int i, k;
+ for (i=0; i<2; i++){
+ struct S* cell=H+k;
+ cell->key=i*(0xffffffffUL/2);
+ cell->rnext=k+(1-i);
+ cell->rprev=k+(1-i);
+ }
+}
--- /dev/null
+/* PR optimization/13318 */
+/* Origin: <bremner@unb.ca> */
+/* Reduced testcase: Wolfgang Bangerth <bangerth@dealii.org> */
+
+/* Verify that the big multiplier doesn't cause an integer
+ overflow in the loop optimizer. */
+
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+struct S {
+ int key;
+ int rnext,rprev;
+};
+
+void foo(struct S* H)
+{
+ int i, k;
+ for (i=0; i<2; i++){
+ struct S* cell=H+k;
+ cell->key=i*(0xffffffffUL/2);
+ cell->rnext=k+(1-i);
+ cell->rprev=k+(1-i);
+ }
+}
--- /dev/null
+:1000000000E506758212C39582F506E50775830043
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F075E0E3
+:10004000092506F58275E0003507F583E517F0759B
+:10005000E0082506F58275E0003507F583E516F022
+:1000600075E0072506F58275E0003507F583E5158F
+:10007000F075E0062506F58275E0003507F583E5A5
+:1000800014F075E0052506F58275E0003507F58367
+:10009000E513F075E0042506F58275E0003507F5F7
+:1000A00083E512F075E0032506F58275E00035075B
+:1000B000F583E511F075E0022506F58275E000355F
+:1000C00007F583E510F0E51FF500E51EF501E51DD8
+:1000D000F509E51CF50AE51AF515E519F513750F8F
+:1000E00000751000751100751200E500F516E501A8
+:1000F000F514E509F50DE50AF50E750C0075170008
+:10010000751900751A00750B00750A01750001C399
+:10011000E518F5F0E50E95F0F509E50BF5F0E50BC2
+:1001200035F0F509E509F5F0E50055F0F500E500D5
+:10013000F5F0E50C45F0F50C750001C3E518F5F098
+:10014000E50E95F0F509E50BF5F0E50B35F0F50951
+:10015000E50EF5F0E51895F0F501E50BF5F0E50B8A
+:1001600035F0F501E501F5F0E50945F0F509E50A99
+:10017000F5F0E50965F0F509E509F5F0E50055F05C
+:10018000F500C3E513F5F0E50D95F0F509E50BF580
+:10019000F0E50B35F0F509E509F5F0E50055F0F56A
+:1001A00000E500F5F0E50C45F0F50C750001C3E540
+:1001B00018F5F0E50E95F0F509E50BF5F0E50B35D2
+:1001C000F0F509E50EF5F0E51895F0F501E50BF50C
+:1001D000F0E50B35F0F501E501F5F0E50945F0F541
+:1001E00009E50AF5F0E50965F0F509E509F5F0E539
+:1001F0000055F0F500C3E513F5F0E50D95F0F509B0
+:10020000E50BF5F0E50B35F0F509E50DF5F0E51337
+:1002100095F0F501E50BF5F0E50B35F0F501E5019D
+:10022000F5F0E50945F0F509E50AF5F0E50965F0B1
+:10023000F509E509F5F0E50055F0F500C3E515F51C
+:10024000F0E51495F0F509E50BF5F0E50B35F0F563
+:1002500009E509F5F0E50055F0F500E500F5F0E5F4
+:100260000C45F0F50C750001C3E518F5F0E50E95A9
+:10027000F0F509E50BF5F0E50B35F0F509E50EF5C0
+:10028000F0E51895F0F501E50BF5F0E50B35F0F527
+:1002900001E501F5F0E50945F0F509E50AF5F0E5B8
+:1002A0000965F0F509E509F5F0E50055F0F500C33D
+:1002B000E513F5F0E50D95F0F509E50BF5F0E50B27
+:1002C00035F0F509E50DF5F0E51395F0F501E50BD1
+:1002D000F5F0E50B35F0F501E501F5F0E50945F040
+:1002E000F509E50AF5F0E50965F0F509E509F5F028
+:1002F000E50055F0F500C3E515F5F0E51495F0F5CA
+:1003000009E50BF5F0E50B35F0F509E514F5F0E539
+:100310001595F0F501E50BF5F0E50B35F0F501E588
+:1003200001F5F0E50945F0F509E50AF5F0E509659F
+:10033000F0F509E509F5F0E50055F0F500C3E51B1A
+:10034000F5F0E51695F0F509E50BF5F0E50B35F060
+:10035000F509E509F5F0E50055F0F500E500F5F0E3
+:10036000E50C45F0F50CE517F500E519F501E51A82
+:10037000F509E50CF50B750C01C3750A00E50BF5E5
+:10038000F0E50A95F0F50A750A00E50AF5F0E50AC8
+:1003900035F0F50AE50AF5F0E50C65F0F50CC375E6
+:1003A0000A00E500F5F0E50A95F0F50A750A00E5A2
+:1003B0000AF5F0E50A35F0F50AE50AF5F0E50C6511
+:1003C000F0F50CC3750A00E501F5F0E50A95F0F5C6
+:1003D0000A750A00E50AF5F0E50A35F0F50AE50ABE
+:1003E000F5F0E50C65F0F50CC3750A00E509F5F0CC
+:1003F000E50A95F0F50A750A00E50AF5F0E50A3513
+:10040000F0F50AE50AF5F0E50C65F0F50C7500006D
+:10041000750100750900E500F50BE501F50A7501A8
+:1004200001C3750000E50CF5F0E50095F0F50075E9
+:100430000000E500F5F0E50035F0F500E500F5F029
+:10044000E50165F0F501C3750000E50BF5F0E50089
+:1004500095F0F500750000E500F5F0E50035F0F5E4
+:1004600000E500F5F0E50165F0F501C3750000E574
+:100470000AF5F0E50095F0F500750000E500F5F0EF
+:10048000E50035F0F500E500F5F0E50165F0F50172
+:10049000C3750000E509F5F0E50095F0F50075007D
+:1004A00000E500F5F0E50035F0F500E500F5F0E5D4
+:1004B0000165F0F501750900750A00750B007500FE
+:1004C00000E501F5F0E50045F0F500E509F5F0E59A
+:1004D0000045F0F500E50AF5F0E50045F0F500E52A
+:1004E0000BF5F0E50045F0F500E500700280030231
+:1004F000055700750001750100750900750A00C3F4
+:10050000750B00E500F5F0E50F35F0F50FE501F5A9
+:10051000F0E51035F0F510E509F5F0E51135F0F5E9
+:1005200011E50AF5F0E51235F0F512C3E51BF5F01B
+:10053000E51695F0F516E515F5F0E51495F0F514CA
+:10054000E513F5F0E50D95F0F50DE518F5F0E50E80
+:1005500095F0F50E0200FA00E50FF502E510F5033F
+:10056000E511F504E512F50575E0092506F5827536
+:10057000E0003507F583E0F51775E0082506F582FC
+:1005800075E0003507F583E0F51675E0072506F5FB
+:100590008275E0003507F583E0F51575E006250660
+:1005A000F58275E0003507F583E0F51475E0052563
+:1005B00006F58275E0003507F583E0F51375E00474
+:1005C0002506F58275E0003507F583E0F51275E044
+:1005D000032506F58275E0003507F583E0F5117512
+:1005E000E0022506F58275E0003507F583E0F51099
+:1005F00075E0002506F58275E0003507F583E0F526
+:1006000008E508C0E075E0012506F58275E00035D3
+:1006100007F583E0F508E508C0E075E0122506F56A
+:100620000675E0003507F507E502F582E503F58379
+:10063000E504F500E505F5012200E506758214C321
+:100640009582F506E5077583009583F507D0E0F5FB
+:100650000875E0092506F58275E0003507F583E5A4
+:1006600008F0D0E0F50875E0082506F58275E00091
+:100670003507F583E508F075E0112506F58275E08C
+:10068000003507F583E517F075E0102506F582754E
+:10069000E0003507F583E516F075E00F2506F582D5
+:1006A00075E0003507F583E515F075E00E2506F5D4
+:1006B0008275E0003507F583E514F075E00D250639
+:1006C000F58275E0003507F583E513F075E00C253C
+:1006D00006F58275E0003507F583E512F075E00B4D
+:1006E0002506F58275E0003507F583E511F075E024
+:1006F0000A2506F58275E0003507F583E510F075EB
+:10070000E0012506F58275E0003507F583E51FF069
+:1007100075E0002506F58275E0003507F583E51ED6
+:10072000F075080075E0072506F58275E0003507CD
+:10073000F583E508F075160075100075080075E082
+:10074000052506F58275E0003507F583E508F075A7
+:10075000150275140075110075120075E005250667
+:10076000F58275E0003507F583E0F513750080E547
+:1007700000F5F0E51325F0F513E500F5F0E5122599
+:10078000F0F512750C00750D00750E00750F0075F3
+:100790000B00750A01750001C3E512F5F0E513952C
+:1007A000F0F509E50BF5F0E50B35F0F509E509F590
+:1007B000F0E50055F0F500E500F5F0E50C45F0F545
+:1007C0000C750001C3E512F5F0E51395F0F509E5A8
+:1007D0000BF5F0E50B35F0F509E513F5F0E51295AD
+:1007E000F0F501E50BF5F0E50B35F0F501E501F568
+:1007F000F0E50945F0F509E50AF5F0E50965F0F5DC
+:1008000009E509F5F0E50055F0F500C3E511F5F04F
+:10081000E51095F0F509E50BF5F0E50B35F0F50978
+:10082000E509F5F0E50055F0F500E500F5F0E50C1B
+:1008300045F0F50C750001C3E512F5F0E51395F0F0
+:10084000F509E50BF5F0E50B35F0F509E513F5F0E5
+:10085000E51295F0F501E50BF5F0E50B35F0F50146
+:10086000E501F5F0E50945F0F509E50AF5F0E509DA
+:1008700065F0F509E509F5F0E50055F0F500C3E58B
+:1008800011F5F0E51095F0F509E50BF5F0E50B3500
+:10089000F0F509E510F5F0E51195F0F501E50BF53A
+:1008A000F0E50B35F0F501E501F5F0E50945F0F56A
+:1008B00009E50AF5F0E50965F0F509E509F5F0E562
+:1008C0000055F0F500C3E514F5F0E51695F0F509CF
+:1008D000E50BF5F0E50B35F0F509E509F5F0E50078
+:1008E00055F0F500E500F5F0E50C45F0F50C750068
+:1008F00001C3E512F5F0E51395F0F509E50BF5F008
+:10090000E50B35F0F509E513F5F0E51295F0F50185
+:10091000E50BF5F0E50B35F0F501E501F5F0E5093E
+:1009200045F0F509E50AF5F0E50965F0F509E50991
+:10093000F5F0E50055F0F500C3E511F5F0E510958B
+:10094000F0F509E50BF5F0E50B35F0F509E510F5E7
+:10095000F0E51195F0F501E50BF5F0E50B35F0F557
+:1009600001E501F5F0E50945F0F509E50AF5F0E5E1
+:100970000965F0F509E509F5F0E50055F0F500C366
+:10098000E514F5F0E51695F0F509E50BF5F0E50B46
+:1009900035F0F509E516F5F0E51495F0F501E50BF0
+:1009A000F5F0E50B35F0F501E501F5F0E50945F069
+:1009B000F509E50AF5F0E50965F0F509E509F5F051
+:1009C000E50055F0F500C3E515F5F075E0072506DF
+:1009D000F58275E0003507F583E0F508E50895F048
+:1009E000F509E50BF5F0E50B35F0F509E509F5F04E
+:1009F000E50055F0F500E500F5F0E50C45F0F50CE7
+:100A0000750101C3750000E50CF5F0E50095F0F502
+:100A100000750000E500F5F0E50035F0F500E500B3
+:100A2000F5F0E50165F0F501C3750000E50DF5F0A1
+:100A3000E50095F0F500750000E500F5F0E50035FE
+:100A4000F0F500E500F5F0E50165F0F501C375008E
+:100A500000E50EF5F0E50095F0F500750000E50005
+:100A6000F5F0E50035F0F500E500F5F0E50165F09D
+:100A7000F501C3750000E50FF5F0E50095F0F50010
+:100A8000750000E500F5F0E50035F0F500E500F54E
+:100A9000F0E50165F0F501750900750A00750B00B8
+:100AA000750000E501F5F0E50045F0F500E509F514
+:100AB000F0E50045F0F500E50AF5F0E50045F0F554
+:100AC00000E50BF5F0E50045F0F500E5007002806B
+:100AD0000302141000750C0C750D0075E00425065A
+:100AE000F58275E0003507F583E0F501750E0075B8
+:100AF0000000C375090075E0062506F58275E00063
+:100B00003507F583E0F508E508F5F0E50CA4F50BED
+:100B100075E0062506F58275E0003507F583E0F5FA
+:100B200008E508F5F0E50CA4E5F0F50AE50BF5F0AD
+:100B3000E50935F0F509E501F5F0E50CA4F50BE55F
+:100B400001F5F0E50CA4E5F0F501E50BF5F0E50A9B
+:100B500035F0F50AC3C3750100E509F5F0E50E357A
+:100B6000F0F50EE50AF5F0E50035F0F500C3750A7D
+:100B70000075E0062506F58275E0003507F583E08F
+:100B8000F508E508F5F0E50DA4F50B75E00625067A
+:100B9000F58275E0003507F583E0F508E508F5F026
+:100BA000E50DA4E5F0F501E50BF5F0E50A35F0F506
+:100BB0000A750900C3C3750100E509F5F0E50E35B6
+:100BC000F0F50EE50AF5F0E50035F0F500C375091E
+:100BD00000750A00C3C3750100E509F5F0E50E359F
+:100BE000F0F50EE50AF5F0E50035F0F500C37509FE
+:100BF00000750A00C3C3750100E509F5F0E50E357F
+:100C0000F0F50EE50AF5F0E50035F0F500C37501E5
+:100C100000E50EF5F075E0012506F58275E000357A
+:100C200007F583E0F508E50835F0F50875E00325DC
+:100C300006F58275E0003507F583E508F0E500F577
+:100C4000F075E0002506F58275E0003507F583E0D4
+:100C5000F508E50835F0F50875E0022506F582751A
+:100C6000E0003507F583E508F075010175000075B2
+:100C70000A00750900E501F4F501E500F4F500E569
+:100C80000AF4F51DE509F4F51CD3750900E509F52D
+:100C9000F0E50135F0F501E509F5F0E50035F0F591
+:100CA00000E509F5F0E51D35F0F51DE509F5F0E580
+:100CB0001C35F0F51CE501F51FE500F51E751B025E
+:100CC000751A00751900751800120000E582F5020A
+:100CD000E583F503E500F504E501F505E502F51208
+:100CE000E503F513E504F514E505F517750100C3F3
+:100CF000750000E501F5F075E0032506F58275E065
+:100D0000003507F583E0F508E50835F0F519E5004D
+:100D1000F5F075E0022506F58275E0003507F583EC
+:100D2000E0F508E50835F0F51A75E0072506F582C7
+:100D300075E0003507F583E0F500E516F515E510DB
+:100D4000F51875E0052506F58275E0003507F58391
+:100D5000E0F51B750D00750E00750F00751100C3D1
+:100D6000750100E500F5F0E512A4F50CE500F5F0DD
+:100D7000E512A4E5F0F509E50CF5F0E50135F0F52F
+:100D800001E515F5F0E512A4F50CE515F5F0E51211
+:100D9000A4E5F0F50AE50CF5F0E50935F0F509E50F
+:100DA00018F5F0E512A4F50CE518F5F0E512A4E548
+:100DB000F0F50BE50CF5F0E50A35F0F50AE51BF565
+:100DC000F0E512A4F50CE51BF5F0E512A4E5F0F54D
+:100DD00012E50CF5F0E50B35F0F50BC3C3750C000F
+:100DE000E501F5F0E50D35F0F50DE509F5F0E50E59
+:100DF00035F0F50EE50AF5F0E50F35F0F50FE50BEA
+:100E0000F5F0E51135F0F511C3750900E500F5F0D1
+:100E1000E513A4F50CE500F5F0E513A4E5F0F50AFB
+:100E2000E50CF5F0E50935F0F509E515F5F0E51304
+:100E3000A4F50CE515F5F0E513A4E5F0F50BE50CCC
+:100E4000F5F0E50A35F0F50AE518F5F0E513A4F537
+:100E50000CE518F5F0E513A4E5F0F512E50CF5F056
+:100E6000E50B35F0F50B750100C3C3750C00E5010A
+:100E7000F5F0E50D35F0F50DE509F5F0E50E35F089
+:100E8000F50EE50AF5F0E50F35F0F50FE50BF5F099
+:100E9000E51135F0F511C3750A00E500F5F0E5142C
+:100EA000A4F50CE500F5F0E514A4E5F0F50BE50C70
+:100EB000F5F0E50A35F0F50AE515F5F0E514A4F5C9
+:100EC0000CE515F5F0E514A4E5F0F512E50CF5F0E8
+:100ED000E50B35F0F50B750100750900C3C3750C02
+:100EE00000E501F5F0E50D35F0F50DE509F5F0E566
+:100EF0000E35F0F50EE50AF5F0E50F35F0F50FE5E6
+:100F00000BF5F0E51135F0F511C3750B00E500F5B3
+:100F1000F0E517A4F50CE500F5F0E517A4E5F0F50C
+:100F200012E50CF5F0E50B35F0F50B7501007509D0
+:100F300000750A00C3C3750000E501F5F0E50D3545
+:100F4000F0F50DE509F5F0E50E35F0F50EE50AF5DD
+:100F5000F0E50F35F0F50FE50BF5F0E51135F0F59F
+:100F600011750100C3750000E501F5F0E51935F0D4
+:100F7000F501E500F5F0E51A35F0F500E50DF503AE
+:100F8000E500F502E501F582E502F583E503F0757C
+:100F90000101C3750000E501F5F0E51935F0F50133
+:100FA000E500F5F0E51A35F0F500E50EF503E5008E
+:100FB000F502E501F582E502F583E503F07501022E
+:100FC000C3750000E501F5F0E51935F0F501E50020
+:100FD000F5F0E51A35F0F500E50FF503E500F5024B
+:100FE000E501F582E502F583E503F0750103C375BC
+:100FF0000000E501F5F0E51935F0F501E500F5F043
+:10100000E51A35F0F500E511F503E500F502E50117
+:10101000F582E502F583E503F0750104C375000070
+:10102000E501F5F075E0032506F58275E00035076A
+:10103000F583E0F508E50835F0F50DE500F5F07508
+:10104000E0022506F58275E0003507F583E0F50836
+:10105000E50835F0F50E750901750A007501007592
+:101060000000C375E0072506F58275E0003507F539
+:1010700083E0F508E508F5F0E50995F0F509E516D2
+:10108000F5F0E50A95F0F50AE510F5F0E50195F0C3
+:10109000F50175E0052506F58275E0003507F58355
+:1010A000E0F508E508F5F0E50095F0F500C3750BEF
+:1010B00000E509F5F075E0062506F58275E00035D6
+:1010C00007F583E0F508E50835F0F509E50AF5F0E0
+:1010D00075E0042506F58275E0003507F583E0F537
+:1010E00008E50835F0F50AE501F5F075E004250698
+:1010F000F58275E0003507F583E0F508E50835F081
+:10110000F50BE500F5F075E0042506F58275E000C5
+:101110003507F583E0F508E50835F0F50C750100B5
+:10112000C3750000E501F5F0E50D35F0F501E500CA
+:10113000F5F0E50E35F0F500E509F503E500F502FB
+:10114000E501F582E502F583E503F0750101C3755C
+:101150000000E501F5F0E50D35F0F501E500F5F0ED
+:10116000E50E35F0F500E50AF503E500F502E501C9
+:10117000F582E502F583E503F0750102C375000011
+:10118000E501F5F0E50D35F0F501E500F5F0E50ECA
+:1011900035F0F500E50BF503E500F502E501F58214
+:1011A000E502F583E503F0750103C3750000E50171
+:1011B000F5F0E50D35F0F501E500F5F0E50E35F05B
+:1011C000F500E50CF503E500F502E501F582E50221
+:1011D000F583E503F0750008C3750100E500F5F03F
+:1011E00075E0032506F58275E0003507F583E0F527
+:1011F00008E50835F0F500E501F5F075E002250693
+:10120000F58275E0003507F583E0F508E50835F06F
+:10121000F50E750B01750A00750900750100C3759F
+:10122000E0072506F58275E0003507F583E0F5084F
+:10123000E508F5F0E50B95F0F50CE516F5F0E50A97
+:1012400095F0F50BE510F5F0E50995F0F50975E079
+:10125000052506F58275E0003507F583E0F508E51C
+:1012600008F5F0E50195F0F501C3750A00E50CF508
+:10127000F075E0062506F58275E0003507F583E098
+:10128000F508E50835F0F50AE50BF5F075E00425FD
+:1012900006F58275E0003507F583E0F508E50835C9
+:1012A000F0F50BE509F5F075E0042506F58275E02B
+:1012B000003507F583E0F508E50835F0F50CE501A4
+:1012C000F5F075E0042506F58275E0003507F58335
+:1012D000E0F508E50835F0F50D750900C375010066
+:1012E000E509F5F0E50035F0F509E501F5F0E50E65
+:1012F00035F0F501E50AF503E501F502E509F582AA
+:10130000E502F583E503F0750901C3750100E50900
+:10131000F5F0E50035F0F509E501F5F0E50E35F0FD
+:10132000F501E50BF503E501F502E509F582E502B6
+:10133000F583E503F0750902C3750100E509F5F0D1
+:10134000E50035F0F509E501F5F0E50E35F0F501BC
+:10135000E50CF503E501F502E509F582E502F58303
+:10136000E503F0750903C3750100E509F5F0E50033
+:1013700035F0F509E501F5F0E50E35F0F501E50D7F
+:10138000F503E501F502E509F582E502F583E503DC
+:10139000F0750101750900750A00750B00C3750031
+:1013A00000E501F5F075E0072506F58275E00035EA
+:1013B00007F583E0F508E50835F0F50875E0072541
+:1013C00006F58275E0003507F583E508F0E509F5D7
+:1013D000F0E51635F0F516E50AF5F0E51035F0F50F
+:1013E00010E50BF5F075E0052506F58275E0003592
+:1013F00007F583E0F508E50835F0F50875E0052503
+:1014000006F58275E0003507F583E508F002074F21
+:1014100000750000E500F502E500F503E500F504C0
+:10142000E500F50575E0112506F58275E000350744
+:10143000F583E0F51775E0102506F58275E00035B7
+:1014400007F583E0F51675E00F2506F58275E000D7
+:101450003507F583E0F51575E00E2506F58275E094
+:10146000003507F583E0F51475E00D2506F5827566
+:10147000E0003507F583E0F51375E00C2506F582ED
+:1014800075E0003507F583E0F51275E00B2506F5EC
+:101490008275E0003507F583E0F51175E00A250651
+:1014A000F58275E0003507F583E0F51075E0082555
+:1014B00006F58275E0003507F583E0F508E508C01C
+:1014C000E075E0092506F58275E0003507F583E053
+:1014D000F508E508C0E075E0142506F50675E0009E
+:1014E0003507F507E502F582E503F583E504F50028
+:1014F000E505F501220000000000000000000000EA
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Tests for syntax checking of #pragma pack.
+ Contributed by Mike Coleman <mcoleman2@kc.rr.com> */
+
+/* { dg-do compile { target *-*-linux* *-*-cygwin* powerpc*-*-eabi* } } */
+
+#pragma pack(pop) /* { dg-error "without matching" } */
+
+#pragma pack(push)
+#pragma pack(pop) /* reset */
+
+#pragma pack(push, foo, 1)
+#pragma pack(pop, foo, 1) /* { dg-error "malformed" } (/
+#pragma pack(pop) /* reset */
+
+#pragma pack(push, foo, 1)
+#pragma pack(pop, bar) /* { dg-error "without matching" } */
+#pragma pack(pop) /* reset */
+
+#pragma pack(push, foo, 1)
+#pragma pack(pop)
+#pragma pack(pop, foo) /* { dg-error "without matching" } */
+
+#pragma pack(push, foo, 3) /* { dg-error "small power of two" } */
+
+extern int blah; /* prevent "ISO C forbids an empty source file" */
--- /dev/null
+/* Tests for syntax checking of #pragma pack.
+ Contributed by Mike Coleman <mcoleman2@kc.rr.com> */
+
+/* { dg-do compile { target *-*-linux* *-*-cygwin* powerpc*-*-eabi* } } */
+
+#pragma pack(pop) /* { dg-error "without matching" } */
+
+#pragma pack(push)
+#pragma pack(pop) /* reset */
+
+#pragma pack(push, foo, 1)
+#pragma pack(pop, foo, 1) /* { dg-error "malformed" } (/
+#pragma pack(pop) /* reset */
+
+#pragma pack(push, foo, 1)
+#pragma pack(pop, bar) /* { dg-error "without matching" } */
+#pragma pack(pop) /* reset */
+
+#pragma pack(push, foo, 1)
+#pragma pack(pop)
+#pragma pack(pop, foo) /* { dg-error "without matching" } */
+
+#pragma pack(push, foo, 3) /* { dg-error "small power of two" } */
+
+extern int blah; /* prevent "ISO C forbids an empty source file" */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+
+/* Copyright (C) 2003 Free Software Foundation, Inc.
+ Contributed by Nathan Sidwell 15 Jul 2003 <nathan@codesourcery.com> */
+
+/* you should not be able to pack a typedef to a struct, only the
+ underlying struct can be packed. */
+
+/* ok */
+struct u1
+{
+ char field1;
+ short field2;
+ int field3;
+};
+
+/* ok */
+typedef struct p1 {
+ char field1;
+ short field2;
+ int field3;
+} __attribute__ ((packed)) p1_t1;
+
+/* ok */
+typedef struct __attribute__ ((packed)) p2 {
+ char field1;
+ short field2;
+ int field3;
+} p2_t1;
+
+int ary1[sizeof (struct p1) == sizeof (p1_t1) ? 1 : -1];
+int ary2[sizeof (struct p2) == sizeof (p2_t1) ? 1 : -1];
+int ary3[sizeof (struct p1) == sizeof (struct p2) ? 1 : -1];
+
+/* not ok */
+typedef struct u1 __attribute__ ((packed)) u1_t1; /* { dg-warning "attribute ignored" "" }*/
+typedef struct u1 u1_t2 __attribute__ ((packed)); /* { dg-warning "attribute ignored" "" }*/
+
+typedef struct p3 {
+ char field1;
+ short field2;
+ int field3;
+} p3_t1 __attribute__ ((packed)); /* { dg-warning "attribute ignored" "" }*/
+
--- /dev/null
+/* { dg-do compile } */
+
+/* Copyright (C) 2003 Free Software Foundation, Inc.
+ Contributed by Nathan Sidwell 15 Jul 2003 <nathan@codesourcery.com> */
+
+/* you should not be able to pack a typedef to a struct, only the
+ underlying struct can be packed. */
+
+/* ok */
+struct u1
+{
+ char field1;
+ short field2;
+ int field3;
+};
+
+/* ok */
+typedef struct p1 {
+ char field1;
+ short field2;
+ int field3;
+} __attribute__ ((packed)) p1_t1;
+
+/* ok */
+typedef struct __attribute__ ((packed)) p2 {
+ char field1;
+ short field2;
+ int field3;
+} p2_t1;
+
+int ary1[sizeof (struct p1) == sizeof (p1_t1) ? 1 : -1];
+int ary2[sizeof (struct p2) == sizeof (p2_t1) ? 1 : -1];
+int ary3[sizeof (struct p1) == sizeof (struct p2) ? 1 : -1];
+
+/* not ok */
+typedef struct u1 __attribute__ ((packed)) u1_t1; /* { dg-warning "attribute ignored" "" }*/
+typedef struct u1 u1_t2 __attribute__ ((packed)); /* { dg-warning "attribute ignored" "" }*/
+
+typedef struct p3 {
+ char field1;
+ short field2;
+ int field3;
+} p3_t1 __attribute__ ((packed)); /* { dg-warning "attribute ignored" "" }*/
+
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostics for parameter mismatches. Types that can't match
+ (). */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+void f0(); /* { dg-error "error: previous declaration of 'f0' was here" } */
+void f0(int, ...); /* { dg-error "error: conflicting types for 'f0'" } */
+/* { dg-error "note: a parameter list with an ellipsis can't match an empty parameter name list declaration" "note" { target *-*-* } 8 } */
+void f1(int, ...); /* { dg-error "error: previous declaration of 'f1' was here" } */
+void f1(); /* { dg-error "error: conflicting types for 'f1'" } */
+/* { dg-error "note: a parameter list with an ellipsis can't match an empty parameter name list declaration" "note" { target *-*-* } 11 } */
+void f2(); /* { dg-error "error: previous declaration of 'f2' was here" } */
+void f2(char); /* { dg-error "error: conflicting types for 'f2'" } */
+/* { dg-error "note: an argument type that has a default promotion can't match an empty parameter name list declaration" "note" { target *-*-* } 14 } */
+void f3(char); /* { dg-error "error: previous declaration of 'f3' was here" } */
+void f3(); /* { dg-error "error: conflicting types for 'f3'" } */
+/* { dg-error "note: an argument type that has a default promotion can't match an empty parameter name list declaration" "note" { target *-*-* } 17 } */
--- /dev/null
+/* Test diagnostics for parameter mismatches. Types that can't match
+ (). */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+void f0(); /* { dg-error "error: previous declaration of 'f0' was here" } */
+void f0(int, ...); /* { dg-error "error: conflicting types for 'f0'" } */
+/* { dg-error "note: a parameter list with an ellipsis can't match an empty parameter name list declaration" "note" { target *-*-* } 8 } */
+void f1(int, ...); /* { dg-error "error: previous declaration of 'f1' was here" } */
+void f1(); /* { dg-error "error: conflicting types for 'f1'" } */
+/* { dg-error "note: a parameter list with an ellipsis can't match an empty parameter name list declaration" "note" { target *-*-* } 11 } */
+void f2(); /* { dg-error "error: previous declaration of 'f2' was here" } */
+void f2(char); /* { dg-error "error: conflicting types for 'f2'" } */
+/* { dg-error "note: an argument type that has a default promotion can't match an empty parameter name list declaration" "note" { target *-*-* } 14 } */
+void f3(char); /* { dg-error "error: previous declaration of 'f3' was here" } */
+void f3(); /* { dg-error "error: conflicting types for 'f3'" } */
+/* { dg-error "note: an argument type that has a default promotion can't match an empty parameter name list declaration" "note" { target *-*-* } 17 } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Simple test for proper postincrement semantics. */
+/* { dg-do run } */
+
+extern void exit (int);
+
+int i=0;
+int c=0;
+int *f ()
+{
+ ++c;
+ return &i;
+}
+
+int main ()
+{
+ int r;
+ r = (*f())++;
+ if (!(r == 0 && i == 1 && c == 1))
+ exit (1);
+ return 0;
+}
--- /dev/null
+/* Simple test for proper postincrement semantics. */
+/* { dg-do run } */
+
+extern void exit (int);
+
+int i=0;
+int c=0;
+int *f ()
+{
+ ++c;
+ return &i;
+}
+
+int main ()
+{
+ int r;
+ r = (*f())++;
+ if (!(r == 0 && i == 1 && c == 1))
+ exit (1);
+ return 0;
+}
--- /dev/null
+:1000000075812F7506FF7507FF12020F02000C00A5
+:1000100000D0E0F519D0E0F51AE510F518900004CD
+:10002000E582F50F900004E583F510900004E58269
+:10003000F509900004E583F50A750100C375000019
+:10004000E501F5F0E50935F0F501E500F5F0E50A23
+:1000500035F0F500E500F502E501F582E502F583EE
+:10006000E0F50B750101C3750000E501F5F0E50948
+:1000700035F0F501E500F5F0E50A35F0F500E500AD
+:10008000F502E501F582E502F583E0F50C75010264
+:10009000C3750000E501F5F0E50935F0F501E5006F
+:1000A000F5F0E50A35F0F500E500F502E501F58229
+:1000B000E502F583E0F50D750103C3750000E50168
+:1000C000F5F0E50935F0F501E500F5F0E50A35F064
+:1000D000F500E500F502E501F582E502F583E0F5BE
+:1000E0000E750001750100750900750A00C3751BC6
+:1000F00000E500F5F0E50B35F0F500E501F5F0E57C
+:100100000C35F0F501E509F5F0E50D35F0F509E5FB
+:100110000AF5F0E50E35F0F50C750B00C3750A0015
+:10012000E50BF5F0E50F35F0F50BE50AF5F0E51018
+:1001300035F0F50AE500F503E50AF502E50BF58271
+:10014000E502F583E503F0750B01C3750000E50BCF
+:10015000F5F0E50F35F0F50BE500F5F0E51035F0BD
+:10016000F50AE501F503E50AF502E50BF582E5027E
+:10017000F583E503F0750B02C3750000E50BF5F0A0
+:10018000E50F35F0F50BE500F5F0E51035F0F50A73
+:10019000E509F503E50AF502E50BF582E502F583CD
+:1001A000E503F0750B03C3750000E50BF5F0E50FF3
+:1001B00035F0F50BE500F5F0E51035F0F50AE50C46
+:1001C000F503E50AF502E50BF582E502F583E503A3
+:1001D000F0900000E582F501900000E583F50975D7
+:1001E0000000E501F502E509F503E500F504E50089
+:1001F000F505E518F510E51AC0E0E519C0E0E502DF
+:10020000F582E503F583E504F500E505F501220037
+:10021000E506758205C39582F506E50775830095A9
+:1002200083F507D0E0F50875E0012506F58275E055
+:10023000003507F583E508F0D0E0F50875E0002506
+:1002400006F58275E0003507F583E508F075E004F2
+:100250002506F58275E0003507F583E512F075E0B7
+:10026000032506F58275E0003507F583E511F07585
+:10027000E0022506F58275E0003507F583E510F00C
+:10028000900000E582F50A900000E583F50175090C
+:1002900000C3750000E509F5F0E50A35F0F50DE558
+:1002A00000F5F0E50135F0F50E750900750A0075E9
+:1002B0000B00750C00750100C3750000E501F5F039
+:1002C000E50D35F0F501E500F5F0E50E35F0F5004A
+:1002D000E509F503E500F502E501F582E502F583A0
+:1002E000E503F0750101C3750000E501F5F0E50DCA
+:1002F00035F0F501E500F5F0E50E35F0F500E50A1D
+:10030000F503E500F502E501F582E502F583E50375
+:10031000F0750102C3750000E501F5F0E50D35F05B
+:10032000F501E500F5F0E50E35F0F500E50BF50318
+:10033000E500F502E501F582E502F583E503F075D8
+:100340000103C3750000E501F5F0E50D35F0F50199
+:10035000E500F5F0E50E35F0F500E50CF503E500F8
+:10036000F502E501F582E502F583E503F09000046E
+:10037000E582F50A900004E583F501750900C3756F
+:100380000000E509F5F0E50A35F0F50DE500F5F0BA
+:10039000E50135F0F50E750900750A00750B00755D
+:1003A0000C00750100C3750000E501F5F0E50D35A1
+:1003B000F0F501E500F5F0E50E35F0F500E509F59D
+:1003C00003E500F502E501F582E502F583E503F0BA
+:1003D000750101C3750000E501F5F0E50D35F0F597
+:1003E00001E500F5F0E50E35F0F500E50AF503E569
+:1003F00000F502E501F582E502F583E503F07501FC
+:1004000002C3750000E501F5F0E50D35F0F501E5F5
+:1004100000F5F0E50E35F0F500E50BF503E500F528
+:1004200002E501F582E502F583E503F0750103C3FA
+:10043000750000E501F5F0E50D35F0F501E500F595
+:10044000F0E50E35F0F500E50CF503E500F502E505
+:1004500001F582E502F583E503F0120010E582F56F
+:1004600002E583F503E502F511E503F512750100D8
+:10047000C3750000E501F5F0E51135F0F501E50083
+:10048000F5F0E51235F0F500E500F502E501F5823D
+:10049000E502F583E0F50D750101C3750000E50186
+:1004A000F5F0E51135F0F501E500F5F0E51235F070
+:1004B000F500E500F502E501F582E502F583E0F5DA
+:1004C0000E750102C3750000E501F5F0E51135F088
+:1004D000F501E500F5F0E51235F0F500E500F5026F
+:1004E000E501F582E502F583E0F50F750103C375BB
+:1004F0000000E501F5F0E51135F0F501E500F5F056
+:10050000E51235F0F500E500F502E501F582E502BA
+:10051000F583E0F510750B01750A00750100750093
+:1005200000C3750900E50BF5F0E50D35F0F509E5BB
+:100530000AF5F0E50E35F0F50AE501F5F0E50F35C1
+:10054000F0F50BE500F5F0E51035F0F50C75010060
+:10055000C3750000E501F5F0E51135F0F501E500A2
+:10056000F5F0E51235F0F500E509F503E500F502D3
+:10057000E501F582E502F583E503F0750101C37538
+:100580000000E501F5F0E51135F0F501E500F5F0C5
+:10059000E51235F0F500E50AF503E500F502E501A1
+:1005A000F582E502F583E503F0750102C3750000ED
+:1005B000E501F5F0E51135F0F501E500F5F0E5129E
+:1005C00035F0F500E50BF503E500F502E501F582F0
+:1005D000E502F583E503F0750103C3750000E5014D
+:1005E000F5F0E51135F0F501E500F5F0E51235F02F
+:1005F000F500E50CF503E500F502E501F582E502FD
+:10060000F583E503F0750000750100750900750AB2
+:1006100000E50FF50BE510F50C750F00C3E500F5CF
+:10062000F0E50D95F0F500E500F5F0E50F45F0F586
+:100630000FC3E501F5F0E50E95F0F500E500F5F0E6
+:10064000E50F45F0F50FC3E509F5F0E50B95F0F57D
+:1006500000E500F5F0E50F45F0F50FC3E50AF5F00C
+:10066000E50C95F0F500E500F5F0E50F45F0F50F28
+:10067000750100750900750A00E50FF500750F0199
+:10068000C3750B00E500F5F0E50B95F0F50B750B68
+:1006900000E50BF5F0E50B35F0F50BE50BF5F0E5B6
+:1006A0000F65F0F50FC3750B00E501F5F0E50B954F
+:1006B000F0F50B750B00E50BF5F0E50B35F0F50BE0
+:1006C000E50BF5F0E50F65F0F50FC3750B00E509D7
+:1006D000F5F0E50B95F0F50B750B00E50BF5F0E586
+:1006E0000B35F0F50BE50BF5F0E50F65F0F50FC3F5
+:1006F000750B00E50AF5F0E50B95F0F50B750B00B1
+:10070000E50BF5F0E50B35F0F50BE50BF5F0E50F36
+:1007100065F0F50F750100750900750A0075000098
+:10072000E50FF5F0E50045F0F500E501F5F0E50031
+:1007300045F0F500E509F5F0E50045F0F500E50ABE
+:10074000F5F0E50045F0F500E50070028003020BCE
+:100750003700750100750900750A00750B007500FA
+:1007600000E501F5F0E50045F0F500E509F5F0E5F7
+:100770000045F0F500E50AF5F0E50045F0F500E587
+:100780000BF5F0E50045F0F500E50070028003028E
+:10079000091C00750000750100750900750A0075D7
+:1007A0000C01C3750B00E500F5F0E50B95F0F50BBA
+:1007B000750B00E50BF5F0E50B35F0F50BE50BF5EA
+:1007C000F0E50C65F0F50CC3750B00E501F5F0E5FF
+:1007D0000B95F0F50B750B00E50BF5F0E50B35F01F
+:1007E000F50BE50BF5F0E50C65F0F50CC3750B00AA
+:1007F000E509F5F0E50B95F0F50B750B00E50BF54C
+:10080000F0E50B35F0F50BE50BF5F0E50C65F0F5D3
+:100810000CC3750B00E50AF5F0E50B95F0F50B75CB
+:100820000B00E50BF5F0E50B35F0F50BE50BF5F0FE
+:10083000E50C65F0F50C750100750900750A007589
+:100840000000E50CF5F0E50045F0F500E501F5F0F8
+:10085000E50045F0F500E509F5F0E50045F0F500A7
+:10086000E50AF5F0E50045F0F500E50070028003CB
+:1008700002090C00750000750100750900750A0079
+:10088000E500F502E501F503E509F504E50AF505DE
+:1008900075E0042506F58275E0003507F583E0F57F
+:1008A0001275E0032506F58275E0003507F583E053
+:1008B000F51175E0022506F58275E0003507F58330
+:1008C000E0F51075E0002506F58275E0003507F5C6
+:1008D00083E0F508E508C0E075E0012506F58275BE
+:1008E000E0003507F583E0F508E508C0E075E005B0
+:1008F0002506F50675E0003507F507E502F582E502
+:1009000003F583E504F500E505F5012200751F01F7
+:10091000751E00751D00751C00020874009000040F
+:10092000E582F509900004E583F50A750100C375B9
+:100930000000E501F5F0E50935F0F501E500F5F019
+:10094000E50A35F0F500E500F502E501F582E5027E
+:10095000F583E0F50B750101C3750000E501F5F0C5
+:10096000E50935F0F501E500F5F0E50A35F0F500AB
+:10097000E500F502E501F582E502F583E0F50C7589
+:100980000102C3750000E501F5F0E50935F0F50158
+:10099000E500F5F0E50A35F0F500E500F502E501C2
+:1009A000F582E502F583E0F50D750103C3750000DE
+:1009B000E501F5F0E50935F0F501E500F5F0E50AAA
+:1009C00035F0F500E500F502E501F582E502F58375
+:1009D000E0F50E750001750100750900750A0075D6
+:1009E0000F00C3E500F5F0E50B95F0F500E500F527
+:1009F000F0E50F45F0F50FC3E501F5F0E50C95F0D6
+:100A0000F500E500F5F0E50F45F0F50FC3E509F554
+:100A1000F0E50D95F0F500E500F5F0E50F45F0F592
+:100A20000FC3E50AF5F0E50E95F0F500E500F5F0E9
+:100A3000E50F45F0F50F750100750900750A00E531
+:100A40000FF500750F01C3750B00E500F5F0E50B20
+:100A500095F0F50B750B00E50BF5F0E50B35F0F5B2
+:100A60000BE50BF5F0E50F65F0F50FC3750B00E531
+:100A700001F5F0E50B95F0F50B750B00E50BF5F0C6
+:100A8000E50B35F0F50BE50BF5F0E50F65F0F50F2F
+:100A9000C3750B00E509F5F0E50B95F0F50B750B4B
+:100AA00000E50BF5F0E50B35F0F50BE50BF5F0E5A2
+:100AB0000F65F0F50FC3750B00E50AF5F0E50B9532
+:100AC000F0F50B750B00E50BF5F0E50B35F0F50BCC
+:100AD000E50BF5F0E50F65F0F50F75010075090000
+:100AE000750A00750000E50FF5F0E50045F0F5002A
+:100AF000E501F5F0E50045F0F500E509F5F0E50064
+:100B000045F0F500E50AF5F0E50045F0F500E500F3
+:100B100070028003020B2700750000750100750943
+:100B200000750A0002079F00750001750100750934
+:100B300000750A0002079F00900000E582F5099009
+:100B40000000E583F50A750100C3750000E501F5B5
+:100B5000F0E50935F0F501E500F5F0E50A35F0F5C9
+:100B600000E500F502E501F582E502F583E0F50B0D
+:100B7000750101C3750000E501F5F0E50935F0F5F3
+:100B800001E500F5F0E50A35F0F500E500F502E5D0
+:100B900001F582E502F583E0F50C750102C37500ED
+:100BA00000E501F5F0E50935F0F501E500F5F0E5C2
+:100BB0000A35F0F500E500F502E501F582E502F5FC
+:100BC00083E0F50D750103C3750000E501F5F0E55F
+:100BD0000935F0F501E500F5F0E50A35F0F500E539
+:100BE00000F502E501F582E502F583E0F50E7500FA
+:100BF00001750100750900750A00750F00C3E50055
+:100C0000F5F0E50B95F0F500E500F5F0E50F45F0A2
+:100C1000F50FC3E501F5F0E50C95F0F500E500F5FD
+:100C2000F0E50F45F0F50FC3E509F5F0E50D95F09A
+:100C3000F500E500F5F0E50F45F0F50FC3E50AF521
+:100C4000F0E50E95F0F500E500F5F0E50F45F0F55F
+:100C50000F750100750900750A00E50FF500750FA5
+:100C600001C3750B00E500F5F0E50B95F0F50B758C
+:100C70000B00E50BF5F0E50B35F0F50BE50BF5F0AA
+:100C8000E50F65F0F50FC3750B00E501F5F0E50B19
+:100C900095F0F50B750B00E50BF5F0E50B35F0F570
+:100CA0000BE50BF5F0E50F65F0F50FC3750B00E5EF
+:100CB00009F5F0E50B95F0F50B750B00E50BF5F07C
+:100CC000E50B35F0F50BE50BF5F0E50F65F0F50FED
+:100CD000C3750B00E50AF5F0E50B95F0F50B750B08
+:100CE00000E50BF5F0E50B35F0F50BE50BF5F0E560
+:100CF0000F65F0F50F750100750900750A007500A4
+:100D000000E50FF5F0E50045F0F500E501F5F0E54B
+:100D10000045F0F500E509F5F0E50045F0F500E5E2
+:100D20000AF5F0E50045F0F500E5007002800302E9
+:100D30000D4200750100750900750A00750B00026F
+:100D4000075E00750101750900750A00750B000248
+:100D5000075E00000000000000000000000000002E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* -ansi -std=c99 should mean -std=c99, but the specs reordered the
+ options. Bug 11459. */
+/* { dg-do compile } */
+/* { dg-options "-ansi -std=c99 -pedantic" } */
+
+long long i;
--- /dev/null
+/* -ansi -std=c99 should mean -std=c99, but the specs reordered the
+ options. Bug 11459. */
+/* { dg-do compile } */
+/* { dg-options "-ansi -std=c99 -pedantic" } */
+
+long long i;
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR optimization/11864
+ * Reporter: Kazumoto Kojima <kkojima@gcc.gnu.org>
+ * Summary: [3.3/3.4 regression] miscompiles zero extension and test
+ * Description:
+ * gcc-3.3/3.4 -O2 for sh target may miscompile the combination of zero extension
+ * and test if it's zero.
+ *
+ * Testcase tweaked by dank@kegel.com. Not marked as xfail because it's a regression.
+ */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+extern void abort(void);
+
+int val = 0xff00;
+
+int f(void)
+{
+ return val;
+}
+
+unsigned char a[1] = {0,0};
+
+void foo(void)
+{
+ a[0] = f() & 255;
+
+ if (!a[0])
+ a[0] = f() & 255;
+
+ if (!a[0])
+ a[0] = 1 + (f() & 127);
+}
+
+int main()
+{
+ foo();
+ if (!a[0])
+ abort();
+
+ return 0;
+}
--- /dev/null
+/* PR optimization/11864
+ * Reporter: Kazumoto Kojima <kkojima@gcc.gnu.org>
+ * Summary: [3.3/3.4 regression] miscompiles zero extension and test
+ * Description:
+ * gcc-3.3/3.4 -O2 for sh target may miscompile the combination of zero extension
+ * and test if it's zero.
+ *
+ * Testcase tweaked by dank@kegel.com. Not marked as xfail because it's a regression.
+ */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+extern void abort(void);
+
+int val = 0xff00;
+
+int f(void)
+{
+ return val;
+}
+
+unsigned char a[1] = {0,0};
+
+void foo(void)
+{
+ a[0] = f() & 255;
+
+ if (!a[0])
+ a[0] = f() & 255;
+
+ if (!a[0])
+ a[0] = 1 + (f() & 127);
+}
+
+int main()
+{
+ foo();
+ if (!a[0])
+ abort();
+
+ return 0;
+}
--- /dev/null
+:1000000075812F7506FF7507FF12097102000C003C
+:1000100000D0E0F518D0E0F519E511F50EE510F582
+:100020000F900000E582F509900000E583F50A7560
+:100030000100C3750000E501F5F0E50935F0F501B3
+:10004000E500F5F0E50A35F0F500E500F502E5011B
+:10005000F582E502F583E0F50B750101C37500003B
+:10006000E501F5F0E50935F0F501E500F5F0E50A03
+:1000700035F0F500E500F502E501F582E502F583CE
+:10008000E0F50C750102C3750000E501F5F0E50926
+:1000900035F0F501E500F5F0E50A35F0F500E5008D
+:1000A000F502E501F582E502F583E0F50D75010342
+:1000B000C3750000E501F5F0E50935F0F501E5004F
+:1000C000F5F0E50A35F0F500E500F502E501F58209
+:1000D000E502F583E0F500E50BF502E50CF503E537
+:1000E0000DF504E500F505E50EF511E50FF510E554
+:1000F00019C0E0E518C0E0E502F582E503F583E507
+:1001000004F500E505F5012200E506758205C395B5
+:1001100082F506E5077583009583F507D0E0F508BD
+:1001200075E0012506F58275E0003507F583E508E1
+:10013000F0D0E0F50875E0002506F58275E00035A1
+:1001400007F583E508F075E0042506F58275E00003
+:100150003507F583E512F075E0032506F58275E0B5
+:10016000003507F583E511F075E0022506F5827587
+:10017000E0003507F583E510F0120010E582F50286
+:10018000E502F512900004E582F510900004E58385
+:10019000F511750000750100750C01750D00750EE7
+:1001A00000750F00C3750900E500F5F0E50CA4F536
+:1001B0000BE500F5F0E50CA4E5F0F50AE50BF5F02C
+:1001C000E50935F0F509E501F5F0E50CA4F50BE5D9
+:1001D00001F5F0E50CA4E5F0F501E50BF5F0E50A15
+:1001E00035F0F50AC3C3750100E509F5F0E50E35F4
+:1001F000F0F50EE50AF5F0E50F35F0F50FC3750AD9
+:1002000000E500F5F0E50DA4F50BE500F5F0E50DD2
+:10021000A4E5F0F501E50BF5F0E50A35F0F50A7512
+:100220000900C3C3750000E509F5F0E50E35F0F5EA
+:100230000EE50AF5F0E50F35F0F50FC37509007509
+:100240000A00C3C3750000E509F5F0E50E35F0F5C9
+:100250000EE50AF5F0E50F35F0F50FC375090075E9
+:100260000A00C3C3750000E509F5F0E50E35F0F5A9
+:100270000EE50AF5F0E50F35F0F50FC3750000E562
+:100280000EF5F0E51035F0F500E50FF5F0E5113568
+:10029000F0F5017509FFC3E509F5F0E51255F0F534
+:1002A0000B750A00C3750900E50AF5F0E50035F0A5
+:1002B000F500E509F5F0E50135F0F501E50BF5038D
+:1002C000E501F502E500F582E502F583E503F0902E
+:1002D0000004E582F510900004E583F51175000037
+:1002E000750100750C01750D00750E00750F00C3CA
+:1002F000750900E500F5F0E50CA4F50BE500F5F057
+:10030000E50CA4E5F0F50AE50BF5F0E50935F0F5A7
+:1003100009E501F5F0E50CA4F50BE501F5F0E50CB8
+:10032000A4E5F0F501E50BF5F0E50A35F0F50AC3B3
+:10033000C3750100E509F5F0E50E35F0F50EE50AA7
+:10034000F5F0E50F35F0F50FC3750A00E500F5F09F
+:10035000E50DA4F50BE500F5F0E50DA4E5F0F501DC
+:10036000E50BF5F0E50A35F0F50A750900C3C3752C
+:100370000000E509F5F0E50E35F0F50EE50AF5F0BB
+:10038000E50F35F0F50FC3750900750A00C3C37595
+:100390000000E509F5F0E50E35F0F50EE50AF5F09B
+:1003A000E50F35F0F50FC3750900750A00C3C37575
+:1003B0000000E509F5F0E50E35F0F50EE50AF5F07B
+:1003C000E50F35F0F50FC3750000E50EF5F0E5100B
+:1003D00035F0F500E50FF5F0E51135F0F501E50034
+:1003E000F509E501F50A750100C3750000E501F5A1
+:1003F000F0E50935F0F501E500F5F0E50A35F0F531
+:1004000000E500F502E501F582E502F583E0F5017E
+:10041000750001C3750900E501F5F0E50995F0F5F2
+:1004200009750900E509F5F0E50935F0F509E50973
+:10043000F5F0E50065F0F500750900750A00750B2B
+:1004400000750100E500F5F0E50145F0F501E5096D
+:10045000F5F0E50145F0F501E50AF5F0E50145F0B7
+:10046000F501E50BF5F0E50145F0F501E501700258
+:10047000800302081700900004E582F51090000444
+:10048000E583F511750000750100750C01750D000F
+:10049000750E00750F00C3750900E500F5F0E50C59
+:1004A000A4F50BE500F5F0E50CA4E5F0F50AE50B85
+:1004B000F5F0E50935F0F509E501F5F0E50CA4F5F1
+:1004C0000BE501F5F0E50CA4E5F0F501E50BF5F021
+:1004D000E50A35F0F50AC3C3750100E509F5F0E555
+:1004E0000E35F0F50EE50AF5F0E50F35F0F50FC322
+:1004F000750A00E500F5F0E50DA4F50BE500F5F053
+:10050000E50DA4E5F0F501E50BF5F0E50A35F0F5AC
+:100510000A750900C3C3750000E509F5F0E50E355D
+:10052000F0F50EE50AF5F0E50F35F0F50FC37509A6
+:1005300000750A00C3C3750000E509F5F0E50E3546
+:10054000F0F50EE50AF5F0E50F35F0F50FC3750986
+:1005500000750A00C3C3750000E509F5F0E50E3526
+:10056000F0F50EE50AF5F0E50F35F0F50FC375006F
+:1005700000E50EF5F0E51035F0F500E50FF5F0E5D6
+:100580001135F0F501E500F509E501F50A75010001
+:10059000C3750000E501F5F0E50935F0F501E5006A
+:1005A000F5F0E50A35F0F500E500F502E501F58224
+:1005B000E502F583E0F501750001C3750900E50169
+:1005C000F5F0E50995F0F509750900E509F5F0E59F
+:1005D0000935F0F509E509F5F0E50065F0F5007578
+:1005E0000900750A00750B00750100E500F5F0E5DE
+:1005F0000145F0F501E509F5F0E50145F0F501E506
+:100600000AF5F0E50145F0F501E50BF5F0E50145EA
+:10061000F0F501E501700280030206AC00750000F0
+:10062000E500F502E500F503E500F504E500F50554
+:1006300075E0042506F58275E0003507F583E0F5E1
+:100640001275E0032506F58275E0003507F583E0B5
+:10065000F51175E0022506F58275E0003507F58392
+:10066000E0F51075E0002506F58275E0003507F528
+:1006700083E0F508E508C0E075E0012506F5827520
+:10068000E0003507F583E0F508E508C0E075E00512
+:100690002506F50675E0003507F507E502F582E564
+:1006A00003F583E504F500E505F5012200120010CD
+:1006B000E582F502E502F512900004E582F510905E
+:1006C0000004E583F511750000750100750C0175D6
+:1006D0000D00750E00750F00C3750900E500F5F0FB
+:1006E000E50CA4F50BE500F5F0E50CA4E5F0F50A42
+:1006F000E50BF5F0E50935F0F509E501F5F0E50C58
+:10070000A4F50BE501F5F0E50CA4E5F0F501E50B2A
+:10071000F5F0E50A35F0F50AC3C3750100E509F502
+:10072000F0E50E35F0F50EE50AF5F0E50F35F0F5DC
+:100730000FC3750A00E500F5F0E50DA4F50BE50023
+:10074000F5F0E50DA4E5F0F501E50BF5F0E50A356A
+:10075000F0F50A750900C3C3750000E509F5F0E579
+:100760000E35F0F50EE50AF5F0E50F35F0F50FC39F
+:10077000750900750A00C3C3750000E509F5F0E5C9
+:100780000E35F0F50EE50AF5F0E50F35F0F50FC37F
+:10079000750900750A00C3C3750000E509F5F0E5A9
+:1007A0000E35F0F50EE50AF5F0E50F35F0F50FC35F
+:1007B000750000E50EF5F0E51035F0F500E50FF5F4
+:1007C000F0E51135F0F50A75090175017FC3E50102
+:1007D000F5F0E51255F0F50BC3750100E50BF5F0EA
+:1007E000E50935F0F50B750900C3750100E509F55C
+:1007F000F0E50035F0F500E501F5F0E50A35F0F536
+:1008000001E50BF503E501F502E500F582E502F5EA
+:1008100083E503F002061D00120010E582F502E5F3
+:1008200002F512900004E582F510900004E583F5CE
+:1008300011750000750100750C01750D00750E0035
+:10084000750F00C3750900E500F5F0E50CA4F50B84
+:10085000E500F5F0E50CA4E5F0F50AE50BF5F0E5AB
+:100860000935F0F509E501F5F0E50CA4F50BE50116
+:10087000F5F0E50CA4E5F0F501E50BF5F0E50A353A
+:10088000F0F50AC3C3750100E509F5F0E50E35F092
+:10089000F50EE50AF5F0E50F35F0F50FC3750A0022
+:1008A000E500F5F0E50DA4F50BE500F5F0E50DA488
+:1008B000E5F0F501E50BF5F0E50A35F0F50A750907
+:1008C00000C3C3750000E509F5F0E50E35F0F50E3F
+:1008D000E50AF5F0E50F35F0F50FC3750900750A67
+:1008E00000C3C3750000E509F5F0E50E35F0F50E1F
+:1008F000E50AF5F0E50F35F0F50FC3750900750A47
+:1009000000C3C3750000E509F5F0E50E35F0F50EFE
+:10091000E50AF5F0E50F35F0F50FC3750000E50EBB
+:10092000F5F0E51035F0F500E50FF5F0E51135F0DF
+:10093000F5017509FFC3E509F5F0E51255F0F50B72
+:10094000750A00C3750900E50AF5F0E50035F0F514
+:1009500000E509F5F0E50135F0F501E50BF503E5F6
+:1009600001F502E500F582E502F583E503F00204F6
+:100970007600E506758204C39582F506E507758362
+:10098000009583F507D0E0F50875E0012506F582AE
+:1009900075E0003507F583E508F0D0E0F50875E06F
+:1009A000002506F58275E0003507F583E508F0754A
+:1009B000E0032506F58275E0003507F583E511F0C3
+:1009C00075E0022506F58275E0003507F583E51030
+:1009D000F0900000E582F50A900000E583F50175CE
+:1009E0000900C3750000E509F5F0E50A35F0F50DDD
+:1009F000E500F5F0E50135F0F50E750900750AFF23
+:100A0000750B00750C00750100C3750000E501F55C
+:100A1000F0E50D35F0F501E500F5F0E50E35F0F502
+:100A200000E509F503E500F502E501F582E502F5CB
+:100A300083E503F0750101C3750000E501F5F0E5FC
+:100A40000D35F0F501E500F5F0E50E35F0F500E5C2
+:100A50000AF503E500F502E501F582E502F583E517
+:100A600003F0750102C3750000E501F5F0E50D35F1
+:100A7000F0F501E500F5F0E50E35F0F500E50BF5D4
+:100A800003E500F502E501F582E502F583E503F0F3
+:100A9000750103C3750000E501F5F0E50D35F0F5CE
+:100AA00001E500F5F0E50E35F0F500E50CF503E5A0
+:100AB00000F502E501F582E502F583E503F090001B
+:100AC00004E582F50A900004E583F50B75090075CD
+:100AD0000100C3750000E501F5F0E50935F0F5000A
+:100AE000C3750100E500F5F0E50A35F0F500E50114
+:100AF000F5F0E50B35F0F50B750A00750900C375C7
+:100B00000100E509F5F0E50035F0F500E501F5F047
+:100B1000E50B35F0F501E50AF503E501F502E50021
+:100B2000F582E502F583E503F0120108900004E583
+:100B300082F510900004E583F51175000075010041
+:100B4000750C01750D00750E00750F00C375090059
+:100B5000E500F5F0E50CA4F50BE500F5F0E50CA4D7
+:100B6000E5F0F50AE50BF5F0E50935F0F509E501E5
+:100B7000F5F0E50CA4F50BE501F5F0E50CA4E5F0C6
+:100B8000F501E50BF5F0E50A35F0F50AC3C375018B
+:100B900000E509F5F0E50E35F0F50EE50AF5F0E5AE
+:100BA0000F35F0F50FC3750A00E500F5F0E50DA46B
+:100BB000F50BE500F5F0E50DA4E5F0F501E50BF525
+:100BC000F0E50A35F0F50A750900C3C3750000E5C4
+:100BD00009F5F0E50E35F0F50EE50AF5F0E50F350F
+:100BE000F0F50FC3750900750A00C3C3750000E571
+:100BF00009F5F0E50E35F0F50EE50AF5F0E50F35EF
+:100C0000F0F50FC3750900750A00C3C3750000E550
+:100C100009F5F0E50E35F0F50EE50AF5F0E50F35CE
+:100C2000F0F50FC3750000E50EF5F0E51035F0F5B1
+:100C300000E50FF5F0E51135F0F501E500F509E502
+:100C400001F50A750100C3750000E501F5F0E5093D
+:100C500035F0F501E500F5F0E50A35F0F500E500C1
+:100C6000F502E501F582E502F583E0F50175000185
+:100C7000C3750900E501F5F0E50995F0F509750979
+:100C800000E509F5F0E50935F0F509E509F5F0E5C8
+:100C90000065F0F500750900750A00750B00750117
+:100CA00000E500F5F0E50145F0F501E509F5F0E5B1
+:100CB0000145F0F501E50AF5F0E50145F0F501E53E
+:100CC0000BF5F0E50145F0F501E501700280030246
+:100CD0000D5A00750000750100750900750A00E5E0
+:100CE00000F502E501F503E509F504E50AF50575EA
+:100CF000E0032506F58275E0003507F583E0F51180
+:100D000075E0022506F58275E0003507F583E0F50C
+:100D10001075E0002506F58275E0003507F583E0E3
+:100D2000F508E508C0E075E0012506F58275E000EC
+:100D30003507F583E0F508E508C0E075E004250611
+:100D4000F50675E0003507F507E502F582E503F5E0
+:100D500083E504F500E505F5012200020CD300004F
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR c/14092
+ * Origin: bonzini@gnu.org
+ * rejects-valid
+ */
+/* { dg-do compile } */
+
+/* Define this so that we are more portable. The testcase in the
+ PR failed on 64-bit hosts. */
+typedef int __attribute__ ((mode (__pointer__))) intptr_t;
+
+typedef struct _PLCI {
+ unsigned char x;
+ unsigned char buf[1];
+} PLCI;
+
+void nl_ind(PLCI * plci)
+{
+ plci->x = -((intptr_t)(plci->buf)) & 3;
+}
+
--- /dev/null
+/* PR c/14092
+ * Origin: bonzini@gnu.org
+ * rejects-valid
+ */
+/* { dg-do compile } */
+
+/* Define this so that we are more portable. The testcase in the
+ PR failed on 64-bit hosts. */
+typedef int __attribute__ ((mode (__pointer__))) intptr_t;
+
+typedef struct _PLCI {
+ unsigned char x;
+ unsigned char buf[1];
+} PLCI;
+
+void nl_ind(PLCI * plci)
+{
+ plci->x = -((intptr_t)(plci->buf)) & 3;
+}
+
--- /dev/null
+:1000000000E506758202C39582F506E50775830053
+:100010009583F507D0E0F50ED0E0F50FE510F50D6E
+:10002000750000C3750100E500F5F0E51F35F0F53A
+:1000300000E501F5F0E51E35F0F501750A01C3751F
+:100040000900E50AF5F0E51F35F0F50AE509F5F0D8
+:10005000E51E35F0F509E50AF50BE509F50C750A1D
+:1000600000C3750900E50AF5F0E50B35F0F50AE582
+:1000700009F5F0E50C35F0F509E509F502E50AF5B5
+:1000800082E502F583E0F509C3E509F4F50AD375C5
+:100090000900E509F5F0E50A35F0F50A750903C32D
+:1000A000E509F5F0E50A55F0F50B750A00C3750989
+:1000B00000E50AF5F0E50035F0F500E509F5F0E5B5
+:1000C0000135F0F501E50BF503E501F502E500F575
+:1000D00082E502F583E503F0750000E500F502E531
+:1000E00000F503E500F504E500F505E50DF510E57F
+:1000F0000FC0E0E50EC0E075E0022506F50675E0EC
+:10010000003507F507E502F582E503F583E504F51B
+:1001100000E505F5012200000000000000000000DD
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* This used to ICE because there was no null check in
+ check_bitfield_type_and_width. */
+
+struct tree_common
+{
+ enum tree_code code : 8; /* {dg-error "" "" } */
+/* { dg-warning "" "" { target *-*-* } 6 } */
+};
--- /dev/null
+/* This used to ICE because there was no null check in
+ check_bitfield_type_and_width. */
+
+struct tree_common
+{
+ enum tree_code code : 8; /* {dg-error "" "" } */
+/* { dg-warning "" "" { target *-*-* } 6 } */
+};
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+int f (int a) {
+ return (a << 3) << 6;
+}
+
+int g (int b) {
+ return (b >> 5) << 5;
+}
+
+unsigned long long h (unsigned long long c) {
+ return (c << 60) >> 60;
+}
+
+int l (int d) {
+ return (d << 6) >> 6;
+}
+
+/* { dg-final { scan-tree-dump "a << 9" "gimple" } } */
+/* { dg-final { scan-tree-dump "b & -32" "gimple" } } */
+/* { dg-final { scan-tree-dump "c & 15" "gimple" } } */
+/* { dg-final { scan-tree-dump "d << 6" "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+int f (int a) {
+ return (a << 3) << 6;
+}
+
+int g (int b) {
+ return (b >> 5) << 5;
+}
+
+unsigned long long h (unsigned long long c) {
+ return (c << 60) >> 60;
+}
+
+int l (int d) {
+ return (d << 6) >> 6;
+}
+
+/* { dg-final { scan-tree-dump "a << 9" "gimple" } } */
+/* { dg-final { scan-tree-dump "b & -32" "gimple" } } */
+/* { dg-final { scan-tree-dump "c & 15" "gimple" } } */
+/* { dg-final { scan-tree-dump "d << 6" "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+int f (int a) {
+ return (a << 31) << 6;
+}
+
+unsigned int g (unsigned int a) {
+ return (a >> 7) >> 25;
+}
+
+int h (int b) {
+ return (b >> 30) >> 30;
+}
+
+long long j (long long c) {
+ return (c >> 35) << 35;
+}
+/* { dg-final { scan-tree-dump-times "= 0" 2 "gimple" } } */
+/* { dg-final { scan-tree-dump "b >> 31" "gimple" } } */
+/* { dg-final { scan-tree-dump "c & -(34359738368|800000000)" "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+int f (int a) {
+ return (a << 31) << 6;
+}
+
+unsigned int g (unsigned int a) {
+ return (a >> 7) >> 25;
+}
+
+int h (int b) {
+ return (b >> 30) >> 30;
+}
+
+long long j (long long c) {
+ return (c >> 35) << 35;
+}
+/* { dg-final { scan-tree-dump-times "= 0" 2 "gimple" } } */
+/* { dg-final { scan-tree-dump "b >> 31" "gimple" } } */
+/* { dg-final { scan-tree-dump "c & -(34359738368|800000000)" "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
--- /dev/null
+/* { dg-do compile } */
+
+struct foo {
+ int bar;
+};
+
+typedef struct foo* bar;
+void f () __attribute__ ((__malloc__)); /* { dg-warning "ignored" } */
+int g () __attribute__ ((__malloc__)); /* { dg-warning "ignored" } */
+int* h () __attribute__ ((__malloc__));
+void* i () __attribute__ ((__malloc__));
+
+struct foo j () __attribute__ ((__malloc__)); /* { dg-warning "ignored" } */
+struct foo* k () __attribute__ ((__malloc__));
+bar l () __attribute__((malloc));
--- /dev/null
+/* { dg-do compile } */
+
+struct foo {
+ int bar;
+};
+
+typedef struct foo* bar;
+void f () __attribute__ ((__malloc__)); /* { dg-warning "ignored" } */
+int g () __attribute__ ((__malloc__)); /* { dg-warning "ignored" } */
+int* h () __attribute__ ((__malloc__));
+void* i () __attribute__ ((__malloc__));
+
+struct foo j () __attribute__ ((__malloc__)); /* { dg-warning "ignored" } */
+struct foo* k () __attribute__ ((__malloc__));
+bar l () __attribute__((malloc));
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostics for old-style definition not matching prior
+ prototype are present and give correct location for that prototype
+ (bug 15698). Prototype not last declaration. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99" } */
+
+void f();
+void f(int); /* { dg-error "error: prototype declaration" } */
+void f();
+void f(a) long a; {} /* { dg-error "error: argument 'a' doesn't match prototype" } */
--- /dev/null
+/* Test diagnostics for old-style definition not matching prior
+ prototype are present and give correct location for that prototype
+ (bug 15698). Prototype not last declaration. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99" } */
+
+void f();
+void f(int); /* { dg-error "error: prototype declaration" } */
+void f();
+void f(a) long a; {} /* { dg-error "error: argument 'a' doesn't match prototype" } */
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F500D0E0F501750900E51E
+:1000200009F502E509F503E509F504E509F505E536
+:1000300001C0E0E500C0E075E0042506F50675E0C6
+:10004000003507F507E502F582E503F583E504F5DC
+:1000500000E505F50122000000000000000000009E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostics for old-style definition not matching prior
+ prototype are present and give correct location for that prototype
+ (bug 15698). Unprototyped built-in function with user prototype. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99" } */
+
+int isnan(void); /* { dg-error "error: prototype declaration" } */
+int isnan(a) int a; {} /* { dg-error "error: number of arguments doesn't match prototype" } */
--- /dev/null
+/* Test diagnostics for old-style definition not matching prior
+ prototype are present and give correct location for that prototype
+ (bug 15698). Unprototyped built-in function with user prototype. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99" } */
+
+int isnan(void); /* { dg-error "error: prototype declaration" } */
+int isnan(a) int a; {} /* { dg-error "error: number of arguments doesn't match prototype" } */
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F500D0E0F501E509F5029C
+:10002000E509F503E509F504E509F505E501C0E095
+:10003000E500C0E075E0042506F50675E00035072B
+:10004000F507E502F582E503F583E504F500E5052E
+:10005000F501220000000000000000000000000088
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostics for old-style definition not matching prior
+ prototype are present and give correct location for that prototype
+ (bug 15698). Prototyped built-in function, wrong number of
+ arguments. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99" } */
+
+char *strchr(a) const char *a; { return 0; } /* { dg-warning "warning: number of arguments doesn't match built-in prototype" } */
--- /dev/null
+/* Test diagnostics for old-style definition not matching prior
+ prototype are present and give correct location for that prototype
+ (bug 15698). Prototyped built-in function, wrong number of
+ arguments. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99" } */
+
+char *strchr(a) const char *a; { return 0; } /* { dg-warning "warning: number of arguments doesn't match built-in prototype" } */
--- /dev/null
+:1000000000E506758202C39582F506E50775830053
+:100010009583F507D0E0F500D0E0F501750900758E
+:100020000A00750B00E509F502E50AF503E50BF595
+:1000300004E50BF505E501C0E0E500C0E075E00270
+:100040002506F50675E0003507F507E502F582E5BA
+:1000500003F583E504F500E505F501220000000045
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostics for old-style definition not matching prior
+ prototype are present and give correct location for that prototype
+ (bug 15698). Prototyped built-in function, wrong number of
+ arguments, with explicit prototype as well. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99" } */
+
+char *strchr(const char *, int); /* { dg-error "error: prototype declaration" } */
+char *strchr(a) const char *a; { return 0; } /* { dg-error "error: number of arguments doesn't match prototype" } */
--- /dev/null
+/* Test diagnostics for old-style definition not matching prior
+ prototype are present and give correct location for that prototype
+ (bug 15698). Prototyped built-in function, wrong number of
+ arguments, with explicit prototype as well. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99" } */
+
+char *strchr(const char *, int); /* { dg-error "error: prototype declaration" } */
+char *strchr(a) const char *a; { return 0; } /* { dg-error "error: number of arguments doesn't match prototype" } */
--- /dev/null
+:1000000000E506758202C39582F506E50775830053
+:100010009583F507D0E0F500D0E0F501750900758E
+:100020000A00750B00E509F502E50AF503E50BF595
+:1000300004E50BF505E501C0E0E500C0E075E00270
+:100040002506F50675E0003507F507E502F582E5BA
+:1000500003F583E504F500E505F501220000000045
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+int a (int x) {
+ return ~x + 1; /* -x */
+}
+
+int b (int x) {
+ return -x -1; /* ~x */
+}
+
+/* { dg-final { scan-tree-dump "~x;" "optimized" } } */
+/* { dg-final { scan-tree-dump "-x;" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+int a (int x) {
+ return ~x + 1; /* -x */
+}
+
+int b (int x) {
+ return -x -1; /* ~x */
+}
+
+/* { dg-final { scan-tree-dump "~x;" "optimized" } } */
+/* { dg-final { scan-tree-dump "-x;" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F518D0E0F519E512F50F56
+:10002000E51EF500E51DF501E51CF509E51FF4F5F4
+:100030000BE500F4F50CE501F4F50DE509F4F50E1A
+:10004000750001750100750900750A00C37512007D
+:10005000E500F5F0E50B35F0F500E501F5F0E50C10
+:1000600035F0F501E509F5F0E50D35F0F509E50A9E
+:10007000F5F0E50E35F0F50AE500F502E501F503CA
+:10008000E509F504E50AF505E50FF512E519C0E007
+:10009000E518C0E075E0042506F50675E0003507B3
+:1000A000F507E502F582E503F583E504F500E505CE
+:1000B000F5012200E506758204C39582F506E50781
+:1000C0007583009583F507D0E0F518D0E0F519E5C4
+:1000D00012F50FE51EF500E51DF501E51CF509E536
+:1000E0001FF4F50BE500F4F50CE501F4F50DE50959
+:1000F000F4F50ED3750000E500F5F0E50B35F0F5ED
+:100100000BE500F5F0E50C35F0F50CE500F5F0E554
+:100110000D35F0F50DE500F5F0E50E35F0F50E7551
+:100120000001750100750900750A00C3E500F5F0CE
+:10013000E50B95F0F500E501F5F0E50C95F0F5011E
+:10014000E509F5F0E50D95F0F509E50AF5F0E50EA0
+:1001500095F0F50AE500F502E501F503E509F5047A
+:10016000E50AF505E50FF512E519C0E0E518C0E070
+:1001700075E0042506F50675E0003507F507E5028C
+:10018000F582E503F583E504F500E505F5012200B8
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR middle-end/15825 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+unsigned int foo(long long high, int unsigned_p)
+{
+ int i;
+ if (high < 0)
+ if (!unsigned_p)
+ {
+ i = 1;
+ goto t;
+ }
+ i = 0;
+t:
+ return i;
+}
+
--- /dev/null
+/* PR middle-end/15825 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+unsigned int foo(long long high, int unsigned_p)
+{
+ int i;
+ if (high < 0)
+ if (!unsigned_p)
+ {
+ i = 1;
+ goto t;
+ }
+ i = 0;
+t:
+ return i;
+}
+
--- /dev/null
+:1000000000E506758212C39582F506E50775830043
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F075E0E3
+:10004000092506F58275E0003507F583E517F0759B
+:10005000E0082506F58275E0003507F583E516F022
+:1000600075E0072506F58275E0003507F583E5158F
+:10007000F075E0062506F58275E0003507F583E5A5
+:1000800014F075E0052506F58275E0003507F58367
+:10009000E513F075E0042506F58275E0003507F5F7
+:1000A00083E512F075E0032506F58275E00035075B
+:1000B000F583E511F075E0022506F58275E000355F
+:1000C00007F583E510F0E51FF50DE51EF500E51DCC
+:1000D000F501E51CF509E519F517E518F516750C98
+:1000E00000750B00750A00751100E50DF519E500A6
+:1000F000F515E501F512E509F513E50CF518E50B25
+:10010000F514E50AF510750080E500F5F0E5132516
+:10011000F0F513E500F5F0E51125F0F511750C008B
+:10012000750D00750E00750F00750B00750A0175D1
+:100130000001C3E511F5F0E51395F0F509E50BF5C0
+:10014000F0E50B35F0F509E509F5F0E50055F0F5BA
+:1001500000E500F5F0E50C45F0F50C750001C3E590
+:1001600011F5F0E51395F0F509E50BF5F0E50B3524
+:10017000F0F509E513F5F0E51195F0F501E50BF55E
+:10018000F0E50B35F0F501E501F5F0E50945F0F591
+:1001900009E50AF5F0E50965F0F509E509F5F0E589
+:1001A0000055F0F500C3E510F5F0E51295F0F509FE
+:1001B000E50BF5F0E50B35F0F509E509F5F0E5009F
+:1001C00055F0F500E500F5F0E50C45F0F50C75008F
+:1001D00001C3E511F5F0E51395F0F509E50BF5F030
+:1001E000E50B35F0F509E513F5F0E51195F0F501AE
+:1001F000E50BF5F0E50B35F0F501E501F5F0E50966
+:1002000045F0F509E50AF5F0E50965F0F509E509B8
+:10021000F5F0E50055F0F500C3E510F5F0E51295B1
+:10022000F0F509E50BF5F0E50B35F0F509E512F50C
+:10023000F0E51095F0F501E50BF5F0E50B35F0F57F
+:1002400001E501F5F0E50945F0F509E50AF5F0E508
+:100250000965F0F509E509F5F0E50055F0F500C38D
+:10026000E514F5F0E51595F0F509E50BF5F0E50B6E
+:1002700035F0F509E509F5F0E50055F0F500E50084
+:10028000F5F0E50C45F0F50C750001C3E511F5F04E
+:10029000E51395F0F509E50BF5F0E50B35F0F509FB
+:1002A000E513F5F0E51195F0F501E50BF5F0E50B3B
+:1002B00035F0F501E501F5F0E50945F0F509E50A48
+:1002C000F5F0E50965F0F509E509F5F0E50055F00B
+:1002D000F500C3E510F5F0E51295F0F509E50BF52D
+:1002E000F0E50B35F0F509E512F5F0E51095F0F5C0
+:1002F00001E50BF5F0E50B35F0F501E501F5F0E56D
+:100300000945F0F509E50AF5F0E50965F0F509E5B7
+:1003100009F5F0E50055F0F500C3E514F5F0E51535
+:1003200095F0F509E50BF5F0E50B35F0F509E51568
+:10033000F5F0E51495F0F501E50BF5F0E50B35F07A
+:10034000F501E501F5F0E50945F0F509E50AF5F0F7
+:10035000E50965F0F509E509F5F0E50055F0F5006A
+:10036000C3E518F5F0E51995F0F509E50BF5F0E5AD
+:100370000B35F0F509E509F5F0E50055F0F500E578
+:1003800000F5F0E50C45F0F50C750000E50CF5F016
+:10039000E50045F0F500E50DF5F0E50045F0F50068
+:1003A000E50EF5F0E50045F0F500E50FF5F0E500A8
+:1003B00045F0F500E500700280030204AC00750012
+:1003C00000750100750900750A0000E500F502E5F9
+:1003D00001F503E509F504E50AF50575E0092506CB
+:1003E000F58275E0003507F583E0F51775E008251F
+:1003F00006F58275E0003507F583E0F51675E00730
+:100400002506F58275E0003507F583E0F51575E002
+:10041000062506F58275E0003507F583E0F51475CD
+:10042000E0052506F58275E0003507F583E0F51354
+:1004300075E0042506F58275E0003507F583E0F5E3
+:100440001275E0032506F58275E0003507F583E0B7
+:10045000F51175E0022506F58275E0003507F58394
+:10046000E0F51075E0002506F58275E0003507F52A
+:1004700083E0F508E508C0E075E0012506F5827522
+:10048000E0003507F583E0F508E508C0E075E01207
+:100490002506F50675E0003507F507E502F582E566
+:1004A00003F583E504F500E505F50122007501017A
+:1004B000C3750000E51BF5F0E50095F0F50075004B
+:1004C00000E500F5F0E50035F0F500E500F5F0E5B4
+:1004D0000165F0F501C3750000E51AF5F0E500953A
+:1004E000F0F500750000E500F5F0E50035F0F500E9
+:1004F000E500F5F0E50165F0F501C3750000E517CD
+:10050000F5F0E50095F0F500750000E500F5F0E583
+:100510000035F0F500E500F5F0E50165F0F501C303
+:10052000750000E516F5F0E50095F0F500750000A2
+:10053000E500F5F0E50035F0F500E500F5F0E50142
+:1005400065F0F501750900750A00750B007500006E
+:10055000E501F5F0E50045F0F500E509F5F0E50009
+:1005600045F0F500E50AF5F0E50045F0F500E50B8E
+:10057000F5F0E50045F0F500E500700280030205A6
+:1005800085000203BE007500017501007509007544
+:100590000A000203CA000000000000000000000082
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+
+int main ()
+{
+ int R, N = 4;
+ unsigned int A = 2;
+ signed int B = 2;
+ ((B >> N) & 1) ? 1 : 0;
+ ((A >> N) & 1) ? 1 : 0;
+ return 0;
+}
--- /dev/null
+/* { dg-do compile } */
+
+int main ()
+{
+ int R, N = 4;
+ unsigned int A = 2;
+ signed int B = 2;
+ ((B >> N) & 1) ? 1 : 0;
+ ((A >> N) & 1) ? 1 : 0;
+ return 0;
+}
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501750900750A00750B18
+:1000200000750C00E509F502E50AF503E50BF5049A
+:10003000E50CF505E501C0E0E500C0E0E502F5826C
+:10004000E503F583E504F500E505F5012200000070
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-tree-dce" } */
+
+typedef unsigned long long HARD_REG_ELT_TYPE;
+typedef HARD_REG_ELT_TYPE HARD_REG_SET[2];
+static HARD_REG_SET newpat_used_regs;
+int try_combine (void)
+{
+ HARD_REG_ELT_TYPE *scan_tp_ = newpat_used_regs;
+ scan_tp_[0] = 0;
+ scan_tp_[1] = 0;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-tree-dce" } */
+
+typedef unsigned long long HARD_REG_ELT_TYPE;
+typedef HARD_REG_ELT_TYPE HARD_REG_SET[2];
+static HARD_REG_SET newpat_used_regs;
+int try_combine (void)
+{
+ HARD_REG_ELT_TYPE *scan_tp_ = newpat_used_regs;
+ scan_tp_[0] = 0;
+ scan_tp_[1] = 0;
+}
--- /dev/null
+:1000000000D0E0F51AD0E0F51BE511F518E510F584
+:1000100019900000E582F510900000E583F5117558
+:100020000000750100750C04750D00750E00750F4C
+:1000300000C3750900E500F5F0E50CA4F50BE5003B
+:10004000F5F0E50CA4E5F0F50AE50BF5F0E509356A
+:10005000F0F509E501F5F0E50CA4F50BE501F5F087
+:10006000E50CA4E5F0F501E50BF5F0E50A35F0F552
+:100070000AC3C3750100E509F5F0E50E35F0F50E8C
+:10008000E50AF5F0E50F35F0F50FC3750A00E50058
+:10009000F5F0E50DA4F50BE500F5F0E50DA4E5F0B0
+:1000A000F501E50BF5F0E50A35F0F50A750900C331
+:1000B000C3750000E509F5F0E50E35F0F50EE50A2B
+:1000C000F5F0E50F35F0F50FC3750900750A00C3AB
+:1000D000C3750000E509F5F0E50E35F0F50EE50A0B
+:1000E000F5F0E50F35F0F50FC3750900750A00C38B
+:1000F000C3750000E509F5F0E50E35F0F50EE50AEB
+:10010000F5F0E50F35F0F50FC3750000E50EF5F0DD
+:10011000E51035F0F500E50FF5F0E51135F0F50ED9
+:10012000750A00750B00750C00750D00750900C38C
+:10013000750100E509F5F0E50035F0F509E501F593
+:10014000F0E50E35F0F501E50AF503E501F502E508
+:1001500009F582E502F583E503F0750901C3750130
+:1001600000E509F5F0E50035F0F509E501F5F0E504
+:100170000E35F0F501E50BF503E501F502E509F5AE
+:1001800082E502F583E503F0750902C3750100E518
+:1001900009F5F0E50035F0F509E501F5F0E50E3576
+:1001A000F0F501E50CF503E501F502E509F582E559
+:1001B00002F583E503F0750903C3750100E509F550
+:1001C000F0E50035F0F509E501F5F0E50E35F0F55F
+:1001D00001E50DF503E501F502E509F582E502F516
+:1001E00083E503F0750001750100750C04750D00C1
+:1001F000750E00750F00C3750900E500F5F0E50CFC
+:10020000A4F50BE500F5F0E50CA4E5F0F50AE50B27
+:10021000F5F0E50935F0F509E501F5F0E50CA4F593
+:100220000BE501F5F0E50CA4E5F0F501E50BF5F0C3
+:10023000E50A35F0F50AC3C3750100E509F5F0E5F7
+:100240000E35F0F50EE50AF5F0E50F35F0F50FC3C4
+:10025000750A00E500F5F0E50DA4F50BE500F5F0F5
+:10026000E50DA4E5F0F501E50BF5F0E50A35F0F54F
+:100270000A750900C3C3750000E509F5F0E50E3500
+:10028000F0F50EE50AF5F0E50F35F0F50FC3750949
+:1002900000750A00C3C3750000E509F5F0E50E35E9
+:1002A000F0F50EE50AF5F0E50F35F0F50FC3750929
+:1002B00000750A00C3C3750000E509F5F0E50E35C9
+:1002C000F0F50EE50AF5F0E50F35F0F50FC3750012
+:1002D00000E50EF5F0E51035F0F500E50FF5F0E579
+:1002E0001135F0F50E750A00750B00750C00750DD3
+:1002F00000750900C3750100E509F5F0E50035F06A
+:10030000F509E501F5F0E50E35F0F501E50AF5032F
+:10031000E501F502E509F582E502F583E503F075EF
+:100320000901C3750100E509F5F0E50035F0F509AF
+:10033000E501F5F0E50E35F0F501E50BF503E50116
+:10034000F502E509F582E502F583E503F07509029A
+:10035000C3750100E509F5F0E50035F0F509E501A3
+:10036000F5F0E50E35F0F501E50CF503E501F502D4
+:10037000E509F582E502F583E503F0750903C37528
+:100380000100E509F5F0E50035F0F509E501F5F0C6
+:10039000E50E35F0F501E50DF503E501F502E5099A
+:1003A000F582E502F583E503F0E51CF502E51CF5B1
+:1003B00003E51CF504E51CF505E518F511E519F54F
+:1003C00010E51BC0E0E51AC0E0E502F582E503F5A3
+:1003D00083E504F500E505F50122000000000000BA
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR rtl-optimization/17581 */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+void abort (void);
+
+int foo(int x)
+{
+ unsigned long long tmp = 0;
+
+ switch(x) {
+ case 21:
+ tmp |= 1;
+ tmp |= 2;
+ tmp |= 8;
+ break;
+ default:
+ break;
+ }
+
+ return (int)tmp;
+}
+
+int main()
+{
+ if (foo(21) != 11)
+ abort ();
+ return 0;
+}
+
--- /dev/null
+/* PR rtl-optimization/17581 */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+void abort (void);
+
+int foo(int x)
+{
+ unsigned long long tmp = 0;
+
+ switch(x) {
+ case 21:
+ tmp |= 1;
+ tmp |= 2;
+ tmp |= 8;
+ break;
+ default:
+ break;
+ }
+
+ return (int)tmp;
+}
+
+int main()
+{
+ if (foo(21) != 11)
+ abort ();
+ return 0;
+}
+
--- /dev/null
+:1000000075812F7506FF7507FF12027202000C0042
+:1000100000E506758204C39582F506E50775830041
+:100020009583F507D0E0F51AD0E0F51BE511F5183A
+:10003000E510F519750000750100750900750A00D5
+:10004000750B15750C00750D00750E00E51DF50F8F
+:10005000E51CF510751100C3E50BF5F0E51F95F0F3
+:10006000F50BE50BF5F0E51145F0F511C3E50CF5E1
+:10007000F0E51E95F0F50BE50BF5F0E51145F0F513
+:1000800011C3E50DF5F0E50F95F0F50BE50BF5F077
+:10009000E51145F0F511C3E50EF5F0E51095F0F525
+:1000A0000BE50BF5F0E51145F0F511750C00750D3C
+:1000B00000750E00E511F50B751101C3750F00E514
+:1000C0000BF5F0E50F95F0F50F750F00E50FF5F066
+:1000D000E50F35F0F50FE50FF5F0E51165F0F511D9
+:1000E000C3750F00E50CF5F0E50F95F0F50F750FF2
+:1000F00000E50FF5F0E50F35F0F50FE50FF5F0E54C
+:100100001165F0F511C3750F00E50DF5F0E50F95DC
+:10011000F0F50F750F00E50FF5F0E50F35F0F50F71
+:10012000E50FF5F0E51165F0F511C3750F00E50E6B
+:10013000F5F0E50F95F0F50F750F00E50FF5F0E51B
+:100140000F35F0F50FE50FF5F0E51165F0F51175D8
+:100150000C00750D00750E00750B00E511F5F0E54E
+:100160000B45F0F50BE50CF5F0E50B45F0F50BE56F
+:100170000DF5F0E50B45F0F50BE50EF5F0E50B455B
+:10018000F0F50BE50B700280030201CE000000E5E4
+:1001900000F502E501F503E509F504E50AF505E5D5
+:1001A00018F511E519F510E51BC0E0E51AC0E0757A
+:1001B000E0042506F50675E0003507F507E502F5CC
+:1001C00082E503F583E504F500E505F5012200006D
+:1001D000750B01750C00750D00750E00C3E50BF570
+:1001E000F0E50045F0F500E50CF5F0E50145F0F52A
+:1001F00001E50DF5F0E50945F0F509E50EF5F0E549
+:100200000A45F0F50A750B02750C00750D00750EA8
+:1002100000C3E50BF5F0E50045F0F500E50CF5F061
+:10022000E50145F0F501E50DF5F0E50945F0F509C5
+:10023000E50EF5F0E50A45F0F50A750B08750C00BA
+:10024000750D00750E00C3E50BF5F0E50045F0F502
+:1002500000E50CF5F0E50145F0F501E50DF5F0E5FB
+:100260000945F0F509E50EF5F0E50A45F0F50A0255
+:10027000018E00E506758202C39582F506E50775D5
+:1002800083009583F507D0E0F50875E0012506F5B4
+:100290008275E0003507F583E508F0D0E0F50875D4
+:1002A000E0002506F58275E0003507F583E508F0E6
+:1002B000751F15751E00751D00751C00120010E5D8
+:1002C00082F502E583F503E500F504E501F505E5B2
+:1002D00002F50BE503F50CE504F50DE505F50E75E6
+:1002E000000B750100750900750A00750F00C3E564
+:1002F00000F5F0E50B95F0F500E500F5F0E50F45AC
+:10030000F0F50FC3E501F5F0E50C95F0F500E5001B
+:10031000F5F0E50F45F0F50FC3E509F5F0E50D95AE
+:10032000F0F500E500F5F0E50F45F0F50FC3E50A3F
+:10033000F5F0E50E95F0F500E500F5F0E50F45F078
+:10034000F50F750100750900750A00750000E50FCD
+:10035000F5F0E50045F0F500E501F5F0E50045F0C4
+:10036000F500E509F5F0E50045F0F500E50AF5F0E2
+:10037000E50045F0F500E500700280030203E500AA
+:10038000750000750100750900750A00E500F502A9
+:10039000E501F503E509F504E50AF50575E0002535
+:1003A00006F58275E0003507F583E0F508E508C03D
+:1003B000E075E0012506F58275E0003507F583E07C
+:1003C000F508E508C0E075E0022506F50675E000D1
+:1003D0003507F507E502F582E503F583E504F50049
+:1003E000E505F50122000203800000000000000086
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR 17635 */
+/* Contributed by Devang Patel <dpatel@apple.com> */
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-vectorize" } */
+
+void foo(int i)
+{
+ while (1)
+ if (i) ++i;
+}
+
--- /dev/null
+/* PR 17635 */
+/* Contributed by Devang Patel <dpatel@apple.com> */
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-vectorize" } */
+
+void foo(int i)
+{
+ while (1)
+ if (i) ++i;
+}
+
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F518D0E0F519E514F50D56
+:10002000E513F50EE512F50F750001750100750970
+:1000300000750A00750C01C3750B00E500F5F0E5CD
+:100040000B95F0F50B750B00E50BF5F0E50B35F0B6
+:10005000F50BE50BF5F0E50C65F0F50CC3750B0041
+:10006000E501F5F0E50B95F0F50B750B00E50BF5EB
+:10007000F0E50B35F0F50BE50BF5F0E50C65F0F56B
+:100080000CC3750B00E509F5F0E50B95F0F50B7564
+:100090000B00E50BF5F0E50B35F0F50BE50BF5F096
+:1000A000E50C65F0F50CC3750B00E50AF5F0E50B02
+:1000B00095F0F50B750B00E50BF5F0E50B35F0F55C
+:1000C0000BE50BF5F0E50C65F0F50C750100750915
+:1000D00000750A00750000E50CF5F0E50045F0F547
+:1000E00000E501F5F0E50045F0F500E509F5F0E57E
+:1000F0000045F0F500E50AF5F0E50045F0F500E50E
+:10010000007002800302017D00750000E51FF5F01C
+:10011000E50045F0F500E51EF5F0E50045F0F500D9
+:10012000E51DF5F0E50045F0F500E51CF5F0E5000E
+:1001300045F0F500E5007002800302014100020075
+:100140002800750001750100750900750A00C37566
+:100150000B00E500F5F0E51F35F0F51FE501F5F0C2
+:10016000E51E35F0F51EE509F5F0E51D35F0F51D48
+:10017000E50AF5F0E51C35F0F51C020028007500D5
+:1001800000E500F502E500F503E500F504E500F5FE
+:1001900005E50DF514E50EF513E50FF512E519C0AB
+:1001A000E0E518C0E075E0042506F50675E00035C9
+:1001B00007F507E502F582E503F583E504F500E5BB
+:1001C00005F5012200000000000000000000000012
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "--param ggc-min-expand=0 --param ggc-min-heapsize=0" } */
+/* { dg-options "-fno-common --param ggc-min-expand=0 --param ggc-min-heapsize=0" { target hppa*-*-hpux* } } */
+__attribute__ ((vector_size (64))) unsigned char v1, v2, v3;
+void
+vadd (void)
+{
+ v1 = v2 + v3;
+}
+void
+test_add (void)
+{
+ vadd ();
+}
+void
+vsub (void)
+{
+ v1 = v2 - v3;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "--param ggc-min-expand=0 --param ggc-min-heapsize=0" } */
+/* { dg-options "-fno-common --param ggc-min-expand=0 --param ggc-min-heapsize=0" { target hppa*-*-hpux* } } */
+__attribute__ ((vector_size (64))) unsigned char v1, v2, v3;
+void
+vadd (void)
+{
+ v1 = v2 + v3;
+}
+void
+test_add (void)
+{
+ vadd ();
+}
+void
+vsub (void)
+{
+ v1 = v2 - v3;
+}
--- /dev/null
+:1000000000D0E0F518D0E0F519E511F50EE510F592
+:100010000F900000E582F50C900000E583F50D904F
+:100020000001E582F509900001E583F50A750100FC
+:10003000C3750000E501F5F0E50935F0F501E500CF
+:10004000F5F0E50A35F0F500E500F502E501F58289
+:10005000E502F583E0F50B900002E582F5099000DA
+:1000600002E583F50A750100C3750000E501F5F0AE
+:10007000E50935F0F501E500F5F0E50A35F0F500A4
+:10008000E500F502E501F582E502F583E0F500C340
+:10009000750100E500F5F0E50B35F0F50975010097
+:1000A000C3750000E501F5F0E50C35F0F501E5005C
+:1000B000F5F0E50D35F0F500E509F503E500F5028D
+:1000C000E501F582E502F583E503F0750000E50042
+:1000D000F502E500F503E500F504E500F505E50E9C
+:1000E000F511E50FF510E519C0E0E518C0E0E502EF
+:1000F000F582E503F583E504F500E505F501220049
+:10010000E506758202C39582F506E50775830095BD
+:1001100083F507D0E0F50875E0012506F58275E066
+:10012000003507F583E508F0D0E0F50875E0002517
+:1001300006F58275E0003507F583E508F01200004A
+:10014000750000E500F502E500F503E500F504E5BE
+:1001500000F50575E0002506F58275E0003507F528
+:1001600083E0F508E508C0E075E0012506F5827535
+:10017000E0003507F583E0F508E508C0E075E0022A
+:100180002506F50675E0003507F507E502F582E579
+:1001900003F583E504F500E505F5012200D0E0F55F
+:1001A00018D0E0F519E511F50EE510F50F900000F7
+:1001B000E582F50C900000E583F50D900001E582E5
+:1001C000F509900001E583F50A750100C37500008B
+:1001D000E501F5F0E50935F0F501E500F5F0E50A92
+:1001E00035F0F500E500F502E501F582E502F5835D
+:1001F000E0F50B900002E582F509900002E583F539
+:100200000A750100C3750000E501F5F0E50935F058
+:10021000F501E500F5F0E50A35F0F500E500F50239
+:10022000E501F582E502F583E0F500C3E500F5F0B0
+:10023000E50B95F0F509750100C3750000E501F5C2
+:10024000F0E50C35F0F501E500F5F0E50D35F0F5DC
+:1002500000E509F503E500F502E501F582E502F5A3
+:1002600083E503F0750000E500F502E500F503E520
+:1002700000F504E500F505E50EF511E50FF510E5CF
+:1002800019C0E0E518C0E0E502F582E503F583E575
+:1002900004F500E505F50122000000000000000063
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O1" } */
+
+void exit (int);
+
+int main ()
+{
+ int a;
+ volatile int *b = &a;
+ a = 1;
+ if (*b != 1)
+ exit (1);
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O1" } */
+
+void exit (int);
+
+int main ()
+{
+ int a;
+ volatile int *b = &a;
+ a = 1;
+ if (*b != 1)
+ exit (1);
+ return 0;
+}
--- /dev/null
+:1000000075812F7506FF7507FF12001002000C00A6
+:1000100000E506758207C39582F506E5077583003E
+:100020009583F507D0E0F50875E0052506F582759E
+:10003000E0003507F583E508F0D0E0F50875E00449
+:100040002506F58275E0003507F583E508F075E0D3
+:10005000062506F58275E0003507F583E510F0E525
+:1000600006F50AE507F501750900C3750000E50905
+:10007000F5F0E50A35F0F50FE500F5F0E50135F0AE
+:10008000F510E506F50AE507F501750900C37500E9
+:1000900000E509F5F0E50A35F0F50DE500F5F0E5C8
+:1000A0000135F0F50E750901750A00750B00750C28
+:1000B00000750100C3750000E501F5F0E50D35F0B0
+:1000C000F501E500F5F0E50E35F0F500E509F5037D
+:1000D000E500F502E501F582E502F583E503F0753B
+:1000E0000101C3750000E501F5F0E50D35F0F501FE
+:1000F000E500F5F0E50E35F0F500E50AF503E5005D
+:10010000F502E501F582E502F583E503F0750102EC
+:10011000C3750000E501F5F0E50D35F0F501E500EA
+:10012000F5F0E50E35F0F500E50BF503E500F50219
+:10013000E501F582E502F583E503F0750103C3757A
+:100140000000E501F5F0E50D35F0F501E500F5F00D
+:10015000E50E35F0F500E50CF503E500F502E501E7
+:10016000F582E502F583E503F0E50FF500E510F50E
+:1001700001750A00C3750900E50AF5F0E50035F0E0
+:10018000F50AE509F5F0E50135F0F509E509F502AF
+:10019000E50AF582E502F583E0F50B750A01C37502
+:1001A0000900E50AF5F0E50035F0F50AE509F5F096
+:1001B000E50135F0F509E509F502E50AF582E50204
+:1001C000F583E0F50C750A02C3750900E50AF5F040
+:1001D000E50035F0F50AE509F5F0E50135F0F5093A
+:1001E000E509F502E50AF582E502F583E0F50D750E
+:1001F0000A03C3750900E50AF5F0E50035F0F50AD4
+:10020000E509F5F0E50135F0F509E509F502E50A3E
+:10021000F582E502F583E0F50E75000175010075C4
+:100220000900750A00750F00C3E500F5F0E50B95B0
+:10023000F0F500E500F5F0E50F45F0F50FC3E50139
+:10024000F5F0E50C95F0F500E500F5F0E50F45F06B
+:10025000F50FC3E509F5F0E50D95F0F500E500F5BE
+:10026000F0E50F45F0F50FC3E50AF5F0E50E95F062
+:10027000F500E500F5F0E50F45F0F50F75010075A7
+:100280000900750A00750000E50FF5F0E50045F07E
+:10029000F500E501F5F0E50045F0F500E509F5F0BC
+:1002A000E50045F0F500E50AF5F0E50045F0F5005C
+:1002B000E500700280030203300075000075010044
+:1002C000750900750A00E500F502E501F503E50989
+:1002D000F504E50AF50575E0062506F58275E000EA
+:1002E0003507F583E0F51075E0042506F58275E025
+:1002F000003507F583E0F508E508C0E075E0052561
+:1003000006F58275E0003507F583E0F508E508C0DD
+:10031000E075E0072506F50675E0003507F507E509
+:1003200002F582E503F583E504F500E505F5012214
+:1003300000751F01751E00751D00751C000202BAB4
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "" } */
+struct __attribute__ ((visibility("default"))) Foo { int foo; }; /* { dg-warning "attribute ignored on types" } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "" } */
+struct __attribute__ ((visibility("default"))) Foo { int foo; }; /* { dg-warning "attribute ignored on types" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR c/18809 */
+/* Origin: Andrew Pinski <pinskia@gcc.gnu.org> */
+
+/* { dg-do compile } */
+
+void foo(enum E e) {} /* { dg-error "" } */
+void bar() { foo(0); } /* { dg-error "formal" } */
--- /dev/null
+/* PR c/18809 */
+/* Origin: Andrew Pinski <pinskia@gcc.gnu.org> */
+
+/* { dg-do compile } */
+
+void foo(enum E e) {} /* { dg-error "" } */
+void bar() { foo(0); } /* { dg-error "formal" } */
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F500D0E0F501750900E51E
+:1000200009F502E509F503E509F504E509F505E536
+:1000300001C0E0E500C0E075E0042506F50675E0C6
+:10004000003507F507E502F582E503F583E504F5DC
+:1000500000E505F5012200E506758202C39582F5EB
+:1000600006E5077583009583F507D0E0F50875E090
+:10007000012506F58275E0003507F583E508F0D027
+:10008000E0F50875E0002506F58275E0003507F516
+:1000900083E508F0751F00751E00751D00751C00B6
+:1000A000120000750000E500F502E500F503E5002B
+:1000B000F504E500F50575E0002506F58275E0001C
+:1000C0003507F583E0F508E508C0E075E001250691
+:1000D000F58275E0003507F583E0F508E508C0E036
+:1000E00075E0022506F50675E0003507F507E5021F
+:1000F000F582E503F583E504F500E505F501220049
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR middle-end/18921 */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+extern void abort (void);
+
+int foo (int k)
+{
+ unsigned char j = 0;
+ (k ? 0 : j++) == -1;
+ return j;
+}
+
+int main ()
+{
+ if (!foo (0))
+ abort ();
+ return 0;
+}
+
--- /dev/null
+/* PR middle-end/18921 */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+extern void abort (void);
+
+int foo (int k)
+{
+ unsigned char j = 0;
+ (k ? 0 : j++) == -1;
+ return j;
+}
+
+int main ()
+{
+ if (!foo (0))
+ abort ();
+ return 0;
+}
+
--- /dev/null
+:1000000075812F7506FF7507FF1200C302000C00F3
+:1000100000E506758204C39582F506E50775830041
+:100020009583F507D0E0F509D0E0F50A7501007574
+:100030000000E51FF5F0E50045F0F500E51EF5F0E0
+:10004000E50045F0F500E51DF5F0E50045F0F500AB
+:10005000E51CF5F0E50045F0F500E50070028003D1
+:100060000200BF00E501F500750B01C3750100E555
+:100070000BF5F0E50035F0F500E500F50175000041
+:10008000E500F50BE500F50CE501F502E50BF503E0
+:10009000E50CF504E500F505E50AC0E0E509C0E07A
+:1000A00075E0042506F50675E0003507F507E5025D
+:1000B000F582E503F583E504F500E505F501220089
+:1000C00002007D00E506758202C39582F506E5070C
+:1000D0007583009583F507D0E0F50875E0012506E6
+:1000E000F58275E0003507F583E508F0D0E0F50806
+:1000F00075E0002506F58275E0003507F583E50813
+:10010000F0751F00751E00751D00751C0012001093
+:10011000E582F502E583F503E500F504E501F50563
+:10012000E502F500E503F501E504F509E505F50A45
+:10013000750C01C3750B00E500F5F0E50B95F0F5C6
+:100140000B750B00E50BF5F0E50B35F0F50BE50B4A
+:10015000F5F0E50C65F0F50CC3750B00E501F5F065
+:10016000E50B95F0F50B750B00E50BF5F0E50B35A0
+:10017000F0F50BE50BF5F0E50C65F0F50CC3750B30
+:1001800000E509F5F0E50B95F0F50B750B00E50BB7
+:10019000F5F0E50B35F0F50BE50BF5F0E50C65F04A
+:1001A000F50CC3750B00E50AF5F0E50B95F0F50BC2
+:1001B000750B00E50BF5F0E50B35F0F50BE50BF5F0
+:1001C000F0E50C65F0F50C750100750900750A0085
+:1001D000750000E50CF5F0E50045F0F500E501F5EA
+:1001E000F0E50045F0F500E509F5F0E50045F0F52E
+:1001F00000E50AF5F0E50045F0F500E50070028045
+:100200000302026A00750000750100750900750A95
+:1002100000E500F502E501F503E509F504E50AF559
+:100220000575E0002506F58275E0003507F583E0E9
+:10023000F508E508C0E075E0012506F58275E000E7
+:100240003507F583E0F508E508C0E075E00225060E
+:10025000F50675E0003507F507E502F582E503F5DB
+:1002600083E504F500E505F5012200020205000022
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR rtl-optimization/18928 */
+/* { dg-do compile { target fpic } } */
+/* { dg-options "-O2 -fPIC" } */
+
+const char *toHex( unsigned short u )
+{
+ static char hexVal[5];
+ int i = 3;
+ while ( i >= 0 ) {
+ unsigned short hex = (u & 0x000f);
+ if ( hex < 0x0a )
+ hexVal[i] = '0'+hex;
+ else
+ hexVal[i] = 'A'+(hex-0x0a);
+ i--;
+ }
+ hexVal[4] = '\0';
+ return hexVal;
+}
+
--- /dev/null
+/* PR rtl-optimization/18928 */
+/* { dg-do compile { target fpic } } */
+/* { dg-options "-O2 -fPIC" } */
+
+const char *toHex( unsigned short u )
+{
+ static char hexVal[5];
+ int i = 3;
+ while ( i >= 0 ) {
+ unsigned short hex = (u & 0x000f);
+ if ( hex < 0x0a )
+ hexVal[i] = '0'+hex;
+ else
+ hexVal[i] = 'A'+(hex-0x0a);
+ i--;
+ }
+ hexVal[4] = '\0';
+ return hexVal;
+}
+
--- /dev/null
+:1000000000E50675820CC39582F506E50775830049
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F075E0E3
+:10004000092506F58275E0003507F583E517F0759B
+:10005000E0082506F58275E0003507F583E516F022
+:1000600075E0072506F58275E0003507F583E5158F
+:10007000F075E0062506F58275E0003507F583E5A5
+:1000800014F075E0052506F58275E0003507F58367
+:10009000E513F075E0042506F58275E0003507F5F7
+:1000A00083E512F075E0032506F58275E00035075B
+:1000B000F583E511F075E0022506F58275E000355F
+:1000C00007F583E510F0E51FF51DE51EF51C75101D
+:1000D000037511007512007517007518007516006C
+:1000E000750E00750F00E517F513750080E500F536
+:1000F000F0E51325F0F513E500F5F0E50F25F0F533
+:100100000F750B00750C00751500750D00750A0054
+:10011000751401750001C3E50FF5F0E51395F0F5D1
+:1001200009E50AF5F0E50A35F0F509E509F5F0E528
+:100130000055F0F500E500F5F0E50B45F0F50B7521
+:100140000001C3E50FF5F0E51395F0F509E50AF5B3
+:10015000F0E50A35F0F509E513F5F0E50F95F0F552
+:1001600001E50AF5F0E50A35F0F501E501F5F0E500
+:100170000945F0F509E514F5F0E50965F0F509E53F
+:1001800009F5F0E50055F0F500C3E50EF5F0E512D0
+:1001900095F0F509E50AF5F0E50A35F0F509E50908
+:1001A000F5F0E50055F0F500E500F5F0E50B45F05C
+:1001B000F50B750001C3E50FF5F0E51395F0F509B2
+:1001C000E50AF5F0E50A35F0F509E513F5F0E50F78
+:1001D00095F0F501E50AF5F0E50A35F0F501E501E0
+:1001E000F5F0E50945F0F509E514F5F0E50965F0E8
+:1001F000F509E509F5F0E50055F0F500C3E50EF564
+:10020000F0E51295F0F509E50AF5F0E50A35F0F5A7
+:1002100009E512F5F0E50E95F0F501E50AF5F0E5D2
+:100220000A35F0F501E501F5F0E50945F0F509E5D8
+:1002300014F5F0E50965F0F509E509F5F0E5005577
+:10024000F0F500C3E516F5F0E51195F0F509E50ABE
+:10025000F5F0E50A35F0F509E509F5F0E50055F0AA
+:10026000F500E500F5F0E50B45F0F50B750001C371
+:10027000E50FF5F0E51395F0F509E50AF5F0E50A67
+:1002800035F0F509E513F5F0E50F95F0F501E50A10
+:10029000F5F0E50A35F0F501E501F5F0E50945F081
+:1002A000F509E514F5F0E50965F0F509E509F5F05E
+:1002B000E50055F0F500C3E50EF5F0E51295F0F513
+:1002C00009E50AF5F0E50A35F0F509E512F5F0E57E
+:1002D0000E95F0F501E50AF5F0E50A35F0F501E5D2
+:1002E00001F5F0E50945F0F509E514F5F0E50965D6
+:1002F000F0F509E509F5F0E50055F0F500C3E51660
+:10030000F5F0E51195F0F509E50AF5F0E50A35F0A7
+:10031000F509E511F5F0E51695F0F501E50AF5F0BA
+:10032000E50A35F0F501E501F5F0E50945F0F509D7
+:10033000E514F5F0E50965F0F509E509F5F0E500E6
+:1003400055F0F500C3E518F5F0E51095F0F509E571
+:100350000AF5F0E50A35F0F509E509F5F0E500558F
+:10036000F0F500E500F5F0E50B45F0F50BE50BF5D4
+:1003700000E515F501750B01C3750900E500F5F001
+:10038000E50995F0F509750900E509F5F0E5093588
+:10039000F0F509E509F5F0E50B65F0F50BC3750916
+:1003A00000E50CF5F0E50995F0F509750900E5099A
+:1003B000F5F0E50935F0F509E509F5F0E50B65F02F
+:1003C000F50BC3750900E501F5F0E50995F0F509B0
+:1003D000750900E509F5F0E50935F0F509E509F5D8
+:1003E000F0E50B65F0F50BC3750900E50DF5F0E5DB
+:1003F0000995F0F509750900E509F5F0E50935F00D
+:10040000F509E509F5F0E50B65F0F50B750C0075E0
+:100410001500750D00E50CF500E515F501E50DF588
+:1004200009750C01C3750A00E50BF5F0E50A95F0B6
+:10043000F50A750A00E50AF5F0E50A35F0F50AE572
+:100440000AF5F0E50C65F0F50CC3750A00E500F55A
+:10045000F0E50A95F0F50A750A00E50AF5F0E50AF7
+:1004600035F0F50AE50AF5F0E50C65F0F50CC37515
+:100470000A00E501F5F0E50A95F0F50A750A00E5D0
+:100480000AF5F0E50A35F0F50AE50AF5F0E50C6540
+:10049000F0F50CC3750A00E509F5F0E50A95F0F5ED
+:1004A0000A750A00E50AF5F0E50A35F0F50AE50AED
+:1004B000F5F0E50C65F0F50C750100750900750A9D
+:1004C00000750000E50CF5F0E50045F0F500E501EC
+:1004D000F5F0E50045F0F500E509F5F0E50045F03B
+:1004E000F500E50AF5F0E50045F0F500E5007002DD
+:1004F0008003020ABA0075010F750000C3E501F51B
+:10050000F0E51D55F0F513E500F5F0E51C55F0F5A7
+:100510000E750F00E50FF514751B0A751600750CA6
+:1005200000750D00E513F51E750080E500F5F0E59A
+:100530000F25F0F50FE500F5F0E50D25F0F50D754B
+:100540000B00751800751900751A00750A007515ED
+:1005500001750001C3E50DF5F0E50F95F0F509E52E
+:100560000AF5F0E50A35F0F509E509F5F0E500557D
+:10057000F0F500E500F5F0E50B45F0F50B75000131
+:10058000C3E50DF5F0E50F95F0F509E50AF5F0E5A1
+:100590000A35F0F509E50FF5F0E50D95F0F501E503
+:1005A0000AF5F0E50A35F0F501E501F5F0E5094554
+:1005B000F0F509E515F5F0E50965F0F509E509F54A
+:1005C000F0E50055F0F500C3E50CF5F0E51495F005
+:1005D000F509E50AF5F0E50A35F0F509E509F5F064
+:1005E000E50055F0F500E500F5F0E50B45F0F50BFD
+:1005F000750001C3E50DF5F0E50F95F0F509E50A85
+:10060000F5F0E50A35F0F509E50FF5F0E50D95F0A3
+:10061000F501E50AF5F0E50A35F0F501E501F5F03B
+:10062000E50945F0F509E515F5F0E50965F0F50989
+:10063000E509F5F0E50055F0F500C3E50CF5F0E54A
+:100640001495F0F509E50AF5F0E50A35F0F509E548
+:1006500014F5F0E50C95F0F501E50AF5F0E50A353D
+:10066000F0F501E501F5F0E50945F0F509E515F5C9
+:10067000F0E50965F0F509E509F5F0E50055F0F557
+:1006800000C3E516F5F0E50E95F0F509E50AF5F07D
+:10069000E50A35F0F509E509F5F0E50055F0F50056
+:1006A000E500F5F0E50B45F0F50B750001C3E50D30
+:1006B000F5F0E50F95F0F509E50AF5F0E50A35F0F6
+:1006C000F509E50FF5F0E50D95F0F501E50AF5F012
+:1006D000E50A35F0F501E501F5F0E50945F0F50924
+:1006E000E515F5F0E50965F0F509E509F5F0E50032
+:1006F00055F0F500C3E50CF5F0E51495F0F509E5C6
+:100700000AF5F0E50A35F0F509E514F5F0E50C9584
+:10071000F0F501E50AF5F0E50A35F0F501E501F53A
+:10072000F0E50945F0F509E515F5F0E50965F0F5A1
+:1007300009E509F5F0E50055F0F500C3E516F5F01B
+:10074000E50E95F0F509E50AF5F0E50A35F0F5094D
+:10075000E50EF5F0E51695F0F501E50AF5F0E50A88
+:1007600035F0F501E501F5F0E50945F0F509E51588
+:10077000F5F0E50965F0F509E509F5F0E50055F056
+:10078000F500C3E51BF5F0E51E95F0F509E50AF562
+:10079000F0E50A35F0F509E509F5F0E50055F0F565
+:1007A00000E500F5F0E50B45F0F50B750000E50BF5
+:1007B000F5F0E50045F0F500E518F5F0E50045F049
+:1007C000F500E519F5F0E50045F0F500E51AF5F05E
+:1007D000E50045F0F500E5007002800302096E00B7
+:1007E000900000E582F50E900000E583F50F750995
+:1007F00001750B00750C00750D00C3750000E51048
+:10080000F5F0E509A4F50AE510F5F0E509A4E5F031
+:10081000F501E50AF5F0E50035F0F500E511F5F034
+:10082000E509A4F50AE511F5F0E509A4E5F0F509F7
+:10083000E50AF5F0E50135F0F501C3C3750900E5FA
+:1008400000F5F0E50C35F0F50CE501F5F0E50D35BA
+:10085000F0F50DC3750100E510F5F0E50BA4F50A00
+:10086000E510F5F0E50BA4E5F0F509E50AF5F0E58E
+:100870000135F0F501750000C3C3750900E500F509
+:10088000F0E50C35F0F50CE501F5F0E50D35F0F58A
+:100890000DC3750000750100C3C3750900E500F5BF
+:1008A000F0E50C35F0F50CE501F5F0E50D35F0F56A
+:1008B0000DC3750000750100C3C3750900E500F59F
+:1008C000F0E50C35F0F50CE501F5F0E50D35F0F54A
+:1008D0000DC3750000E50CF5F0E50E35F0F500E50B
+:1008E0000DF5F0E50F35F0F509750141750A0AC3FC
+:1008F000E50AF5F0E51395F0F50BC3750A00E50B75
+:10090000F5F0E50135F0F50B750A00C3750100E55A
+:100910000AF5F0E50035F0F500E501F5F0E50935FB
+:10092000F0F501E50BF503E501F502E500F582E5DB
+:1009300002F583E503F07500017501007509007586
+:100940000A00C3E500F5F0E51095F0F510E501F5B6
+:10095000F0E51195F0F511E509F5F0E51295F0F5E2
+:1009600012E50AF5F0E51795F0F5170200DA0090A8
+:100970000000E582F50E900000E583F50F75090192
+:10098000750B00750C00750D00C3750000E510F5C2
+:10099000F0E509A4F50AE510F5F0E509A4E5F0F5A0
+:1009A00001E50AF5F0E50035F0F500E511F5F0E5B3
+:1009B00009A4F50AE511F5F0E509A4E5F0F509E566
+:1009C0000AF5F0E50135F0F501C3C3750900E5004E
+:1009D000F5F0E50C35F0F50CE501F5F0E50D35F039
+:1009E000F50DC3750100E510F5F0E50BA4F50AE57A
+:1009F00010F5F0E50BA4E5F0F509E50AF5F0E501E1
+:100A000035F0F501750000C3C3750900E500F5F088
+:100A1000E50C35F0F50CE501F5F0E50D35F0F50DDB
+:100A2000C3750000750100C3C3750900E500F5F04A
+:100A3000E50C35F0F50CE501F5F0E50D35F0F50DBB
+:100A4000C3750000750100C3C3750900E500F5F02A
+:100A5000E50C35F0F50CE501F5F0E50D35F0F50D9B
+:100A6000C3750000E50CF5F0E50E35F0F500E50D79
+:100A7000F5F0E50F35F0F509750130C3750A00E5AD
+:100A800013F5F0E50135F0F50B750A00C3750100AB
+:100A9000E50AF5F0E50035F0F500E501F5F0E509CA
+:100AA00035F0F501E50BF503E501F502E500F5820A
+:100AB000E502F583E503F002093600900000E582C7
+:100AC000F510900000E583F51175000475010075BF
+:100AD0000C01750D00750E00750F00C3750900E55A
+:100AE00000F5F0E50CA4F50BE500F5F0E50CA4E548
+:100AF000F0F50AE50BF5F0E50935F0F509E501F546
+:100B0000F0E50CA4F50BE501F5F0E50CA4E5F0F536
+:100B100001E50BF5F0E50A35F0F50AC3C3750100F0
+:100B2000E509F5F0E50E35F0F50EE50AF5F0E50F0F
+:100B300035F0F50FC3750A00E500F5F0E50DA4F5F5
+:100B40000BE500F5F0E50DA4E5F0F501E50BF5F09A
+:100B5000E50A35F0F50A750900C3C3750000E5091B
+:100B6000F5F0E50E35F0F50EE50AF5F0E50F35F098
+:100B7000F50FC3750900750A00C3C3750000E509C8
+:100B8000F5F0E50E35F0F50EE50AF5F0E50F35F078
+:100B9000F50FC3750900750A00C3C3750000E509A8
+:100BA000F5F0E50E35F0F50EE50AF5F0E50F35F058
+:100BB000F50FC3750000E50EF5F0E51035F0F50012
+:100BC000E50FF5F0E51135F0F50B750A0075090034
+:100BD000C3750100E509F5F0E50035F0F500E50124
+:100BE000F5F0E50B35F0F501E50AF503E501F50251
+:100BF000E500F582E502F583E503F0900000E5826B
+:100C0000F501900000E583F509750000E501F502A6
+:100C1000E509F503E500F504E500F50575E00925AE
+:100C200006F58275E0003507F583E0F51775E008F5
+:100C30002506F58275E0003507F583E0F51675E0C9
+:100C4000072506F58275E0003507F583E0F5157593
+:100C5000E0062506F58275E0003507F583E0F5141A
+:100C600075E0052506F58275E0003507F583E0F5AA
+:100C70001375E0042506F58275E0003507F583E07D
+:100C8000F51275E0032506F58275E0003507F5835A
+:100C9000E0F51175E0022506F58275E0003507F5EF
+:100CA00083E0F51075E0002506F58275E000350754
+:100CB000F583E0F508E508C0E075E0012506F5825A
+:100CC00075E0003507F583E0F508E508C0E075E05C
+:100CD0000C2506F50675E0003507F507E502F582F7
+:100CE000E503F583E504F500E505F50122000000C4
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR rtl-optimization/20017
+
+ After CSE/GCSE folds a switch statement to an unconditional jump,
+ cfg_cleanup did not remove a dead jump table, confusing the CFG
+ layout code later on. */
+
+/* { dg-do compile } */
+/* { dg-options "-O1" } */
+/* { dg-options "-O1 -march=i386" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
+
+int
+foo (int *buf, int *p)
+{
+ int result;
+ const int *tmp;
+
+ if (*buf)
+ return 1;
+
+ result = 2;
+ *buf = 2;
+ tmp = buf;
+ switch (*tmp)
+ {
+ case 3:
+ case 4:
+ case 6:
+ case 14:
+ return 1;
+
+ case 0:
+ result = *p;
+
+ /* Fall through. */
+ default:
+ if (result)
+ return 1;
+ }
+
+ return 0;
+}
--- /dev/null
+/* PR rtl-optimization/20017
+
+ After CSE/GCSE folds a switch statement to an unconditional jump,
+ cfg_cleanup did not remove a dead jump table, confusing the CFG
+ layout code later on. */
+
+/* { dg-do compile } */
+/* { dg-options "-O1" } */
+/* { dg-options "-O1 -march=i386" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
+
+int
+foo (int *buf, int *p)
+{
+ int result;
+ const int *tmp;
+
+ if (*buf)
+ return 1;
+
+ result = 2;
+ *buf = 2;
+ tmp = buf;
+ switch (*tmp)
+ {
+ case 3:
+ case 4:
+ case 6:
+ case 14:
+ return 1;
+
+ case 0:
+ result = *p;
+
+ /* Fall through. */
+ default:
+ if (result)
+ return 1;
+ }
+
+ return 0;
+}
--- /dev/null
+:1000000000E506758208C39582F506E5077583004D
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F0E5153E
+:10004000F518E514F519E513F51AE512F51B75E039
+:10005000032506F58275E0003507F583E511F07597
+:10006000E0022506F58275E0003507F583E510F01E
+:10007000E51FF500E51EF501750A00C3750900E5E9
+:100080000AF5F0E50035F0F50AE509F5F0E501358A
+:10009000F0F509E509F502E50AF582E502F583E0E8
+:1000A000F50B750A01C3750900E50AF5F0E50035A1
+:1000B000F0F50AE509F5F0E50135F0F509E509F592
+:1000C00002E50AF582E502F583E0F50C750A02C344
+:1000D000750900E50AF5F0E50035F0F50AE509F5E2
+:1000E000F0E50135F0F509E509F502E50AF582E5E7
+:1000F00002F583E0F50D750A03C3750900E50AF5FD
+:10010000F0E50035F0F50AE509F5F0E50135F0F523
+:1001100009E509F502E50AF582E502F583E0F50A4D
+:10012000750900E50BF5F0E50945F0F509E50CF575
+:10013000F0E50945F0F509E50DF5F0E50945F0F5BF
+:1001400009E50AF5F0E50945F0F509E509700280D1
+:1001500003020D81007512027513007514007515E8
+:1001600000750B02750C00750D00750E00750A0008
+:10017000C3750900E50AF5F0E50035F0F50AE50973
+:10018000F5F0E50135F0F509E50BF503E509F502B4
+:10019000E50AF582E502F583E503F0750A01C3750A
+:1001A0000900E50AF5F0E50035F0F50AE509F5F096
+:1001B000E50135F0F509E50CF503E509F502E50A79
+:1001C000F582E502F583E503F0750A02C3750900BF
+:1001D000E50AF5F0E50035F0F50AE509F5F0E50189
+:1001E00035F0F509E50DF503E509F502E50AF582B7
+:1001F000E502F583E503F0750A03C3750900E50A16
+:10020000F5F0E50035F0F50AE509F5F0E50135F022
+:10021000F509E50EF503E509F502E50AF582E502C3
+:10022000F583E503F0E500F510E501F51175010032
+:10023000C3750000E501F5F0E51035F0F501E500C6
+:10024000F5F0E51135F0F500E500F502E501F58280
+:10025000E502F583E0F50B750101C3750000E501CA
+:10026000F5F0E51035F0F501E500F5F0E51135F0B4
+:10027000F500E500F502E501F582E502F583E0F51C
+:100280000C750102C3750000E501F5F0E51035F0CD
+:10029000F501E500F5F0E51135F0F500E500F502B2
+:1002A000E501F582E502F583E0F50D750103C375FF
+:1002B0000000E501F5F0E51035F0F501E500F5F099
+:1002C000E51135F0F500E500F502E501F582E502FE
+:1002D000F583E0F50E750003750100750900750AD8
+:1002E00000750F00C3E500F5F0E50B95F0F500E5AE
+:1002F00000F5F0E50F45F0F50FC3E501F5F0E50C6D
+:1003000095F0F500E500F5F0E50F45F0F50FC3E5D4
+:1003100009F5F0E50D95F0F500E500F5F0E50F4580
+:10032000F0F50FC3E50AF5F0E50E95F0F500E500F0
+:10033000F5F0E50F45F0F50F750100750900750A38
+:1003400000E50FF500750F01C3750B00E500F5F032
+:10035000E50B95F0F50B750B00E50BF5F0E50B35AE
+:10036000F0F50BE50BF5F0E50F65F0F50FC3750B38
+:1003700000E501F5F0E50B95F0F50B750B00E50BCD
+:10038000F5F0E50B35F0F50BE50BF5F0E50F65F055
+:10039000F50FC3750B00E509F5F0E50B95F0F50BCE
+:1003A000750B00E50BF5F0E50B35F0F50BE50BF5FE
+:1003B000F0E50F65F0F50FC3750B00E50AF5F0E504
+:1003C0000B95F0F50B750B00E50BF5F0E50B35F033
+:1003D000F50BE50BF5F0E50F65F0F50F7501007510
+:1003E0000900750A00750000E50FF5F0E50045F01D
+:1003F000F500E501F5F0E50045F0F500E509F5F05B
+:10040000E50045F0F500E50AF5F0E50045F0F500FA
+:10041000E50070028003020D7C00750100C37500C9
+:1004200000E501F5F0E51035F0F501E500F5F0E542
+:100430001135F0F500E500F502E501F582E502F57C
+:1004400083E0F50B750101C3750000E501F5F0E5EA
+:100450001035F0F501E500F5F0E51135F0F500E5B2
+:1004600000F502E501F582E502F583E0F50C750182
+:1004700002C3750000E501F5F0E51035F0F501E582
+:1004800000F5F0E51135F0F500E500F502E501F5C0
+:1004900082E502F583E0F50D750103C3750000E503
+:1004A00001F5F0E51035F0F501E500F5F0E5113561
+:1004B000F0F500E500F502E501F582E502F583E0DF
+:1004C000F50E750004750100750900750A00750FB9
+:1004D00000C3E500F5F0E50B95F0F500E500F5F05B
+:1004E000E50F45F0F50FC3E501F5F0E50C95F0F5E6
+:1004F00000E500F5F0E50F45F0F50FC3E509F5F06F
+:10050000E50D95F0F500E500F5F0E50F45F0F50F88
+:10051000C3E50AF5F0E50E95F0F500E500F5F0E528
+:100520000F45F0F50F750100750900750A00E50F1C
+:10053000F500750F01C3750B00E500F5F0E50B95AF
+:10054000F0F50B750B00E50BF5F0E50B35F0F50B51
+:10055000E50BF5F0E50F65F0F50FC3750B00E50150
+:10056000F5F0E50B95F0F50B750B00E50BF5F0E5F7
+:100570000B35F0F50BE50BF5F0E50F65F0F50FC366
+:10058000750B00E509F5F0E50B95F0F50B750B0023
+:10059000E50BF5F0E50B35F0F50BE50BF5F0E50FA8
+:1005A00065F0F50FC3750B00E50AF5F0E50B95F066
+:1005B000F50B750B00E50BF5F0E50B35F0F50BE5EC
+:1005C0000BF5F0E50F65F0F50F7501007509007585
+:1005D0000A00750000E50FF5F0E50045F0F500E5CF
+:1005E00001F5F0E50045F0F500E509F5F0E5004519
+:1005F000F0F500E50AF5F0E50045F0F500E50070DE
+:10060000028003020D7700750100C3750000E5014B
+:10061000F5F0E51035F0F501E500F5F0E51135F000
+:10062000F500E500F502E501F582E502F583E0F568
+:100630000B750101C3750000E501F5F0E51035F01B
+:10064000F501E500F5F0E51135F0F500E500F502FE
+:10065000E501F582E502F583E0F50C750102C3754D
+:100660000000E501F5F0E51035F0F501E500F5F0E5
+:10067000E51135F0F500E500F502E501F582E5024A
+:10068000F583E0F50D750103C3750000E501F5F094
+:10069000E51035F0F501E500F5F0E51135F0F50070
+:1006A000E500F502E501F582E502F583E0F50E755A
+:1006B0000006750100750900750A00750F00C3E595
+:1006C00000F5F0E50B95F0F500E500F5F0E50F45D8
+:1006D000F0F50FC3E501F5F0E50C95F0F500E50048
+:1006E000F5F0E50F45F0F50FC3E509F5F0E50D95DB
+:1006F000F0F500E500F5F0E50F45F0F50FC3E50A6C
+:10070000F5F0E50E95F0F500E500F5F0E50F45F0A4
+:10071000F50F750100750900750A00E50FF5007504
+:100720000F01C3750B00E500F5F0E50B95F0F50B37
+:10073000750B00E50BF5F0E50B35F0F50BE50BF56A
+:10074000F0E50F65F0F50FC3750B00E501F5F0E579
+:100750000B95F0F50B750B00E50BF5F0E50B35F09F
+:10076000F50BE50BF5F0E50F65F0F50FC3750B0024
+:10077000E509F5F0E50B95F0F50B750B00E50BF5CC
+:10078000F0E50B35F0F50BE50BF5F0E50F65F0F551
+:100790000FC3750B00E50AF5F0E50B95F0F50B7549
+:1007A0000B00E50BF5F0E50B35F0F50BE50BF5F07F
+:1007B000E50F65F0F50F750100750900750A007504
+:1007C0000000E50FF5F0E50045F0F500E501F5F076
+:1007D000E50045F0F500E509F5F0E50045F0F50028
+:1007E000E50AF5F0E50045F0F500E500700280034C
+:1007F000020D7200750100C3750000E501F5F0E51A
+:100800001035F0F501E500F5F0E51135F0F500E5FE
+:1008100000F502E501F582E502F583E0F50B7501CF
+:1008200001C3750000E501F5F0E51035F0F501E5CF
+:1008300000F5F0E51135F0F500E500F502E501F50C
+:1008400082E502F583E0F50C750102C3750000E551
+:1008500001F5F0E51035F0F501E500F5F0E51135AD
+:10086000F0F500E500F502E501F582E502F583E02B
+:10087000F50D750103C3750000E501F5F0E51035D0
+:10088000F0F501E500F5F0E51135F0F500E500F5CE
+:1008900002E501F582E502F583E0F50E75000E75BF
+:1008A0000100750900750A00750F00C3E500F5F039
+:1008B000E50B95F0F500E500F5F0E50F45F0F50FD7
+:1008C000C3E501F5F0E50C95F0F500E500F5F0E580
+:1008D0000F45F0F50FC3E509F5F0E50D95F0F500CE
+:1008E000E500F5F0E50F45F0F50FC3E50AF5F0E595
+:1008F0000E95F0F500E500F5F0E50F45F0F50F7504
+:100900000100750900750A00E50FF500750F01C3B8
+:10091000750B00E500F5F0E50B95F0F50B750B0098
+:10092000E50BF5F0E50B35F0F50BE50BF5F0E50F14
+:1009300065F0F50FC3750B00E501F5F0E50B95F0DB
+:10094000F50B750B00E50BF5F0E50B35F0F50BE558
+:100950000BF5F0E50F65F0F50FC3750B00E509F534
+:10096000F0E50B95F0F50B750B00E50BF5F0E50BDD
+:1009700035F0F50BE50BF5F0E50F65F0F50FC375F8
+:100980000B00E50AF5F0E50B95F0F50B750B00E5AE
+:100990000BF5F0E50B35F0F50BE50BF5F0E50F6524
+:1009A000F0F50F750100750900750A00750000E586
+:1009B0000FF5F0E50045F0F500E501F5F0E500453F
+:1009C000F0F500E509F5F0E50045F0F500E50AF57C
+:1009D000F0E50045F0F500E50070028003020D61CE
+:1009E00000E510F500E511F501750A00C375090071
+:1009F000E50AF5F0E50035F0F50AE509F5F0E50161
+:100A000035F0F509E509F502E50AF582E502F58319
+:100A1000E0F50B750A01C3750900E50AF5F0E5007C
+:100A200035F0F50AE509F5F0E50135F0F509E509D8
+:100A3000F502E50AF582E502F583E0F50C750A0298
+:100A4000C3750900E50AF5F0E50035F0F50AE5099A
+:100A5000F5F0E50135F0F509E509F502E50AF5825D
+:100A6000E502F583E0F50D750A03C3750900E50A93
+:100A7000F5F0E50035F0F50AE509F5F0E50135F0AA
+:100A8000F509E509F502E50AF582E502F583E0F5E9
+:100A90000E750000750100750900750A00750F00DC
+:100AA000C3E500F5F0E50B95F0F500E500F5F0E5A0
+:100AB0000F45F0F50FC3E501F5F0E50C95F0F500F5
+:100AC000E500F5F0E50F45F0F50FC3E509F5F0E5B4
+:100AD0000D95F0F500E500F5F0E50F45F0F50FC3D5
+:100AE000E50AF5F0E50E95F0F500E500F5F0E50F07
+:100AF00045F0F50F750100750900750A00E50FF561
+:100B000000750F01C3750B00E500F5F0E50B95F0DE
+:100B1000F50B750B00E50BF5F0E50B35F0F50BE586
+:100B20000BF5F0E50F65F0F50FC3750B00E501F56A
+:100B3000F0E50B95F0F50B750B00E50BF5F0E50B0B
+:100B400035F0F50BE50BF5F0E50F65F0F50FC37526
+:100B50000B00E509F5F0E50B95F0F50B750B00E5DD
+:100B60000BF5F0E50B35F0F50BE50BF5F0E50F6552
+:100B7000F0F50FC3750B00E50AF5F0E50B95F0F500
+:100B80000B750B00E50BF5F0E50B35F0F50BE50B00
+:100B9000F5F0E50F65F0F50F750100750900750AB0
+:100BA00000750000E50FF5F0E50045F0F500E50102
+:100BB000F5F0E50045F0F500E509F5F0E50045F054
+:100BC000F500E50AF5F0E50045F0F500E5007002F6
+:100BD0008003020CB40000750000E512F5F0E5009A
+:100BE00045F0F500E513F5F0E50045F0F500E514F6
+:100BF000F5F0E50045F0F500E515F5F0E50045F008
+:100C0000F500E50070028003020CA40000750000EE
+:100C1000750100750900750A00E500F502E501F5AA
+:100C200003E509F504E50AF505E518F515E519F5F7
+:100C300014E51AF513E51BF51275E0032506F58298
+:100C400075E0003507F583E0F51175E0022506F53E
+:100C50008275E0003507F583E0F51075E0002506A4
+:100C6000F58275E0003507F583E0F508E508C0E09A
+:100C700075E0012506F58275E0003507F583E0F59E
+:100C800008E508C0E075E0082506F50675E00035C2
+:100C900007F507E502F582E503F583E504F500E5D0
+:100CA00005F5012200750001750100750900750A3E
+:100CB00000020C190000750100C3750000E501F584
+:100CC000F0E51D35F0F501E500F5F0E51C35F0F532
+:100CD00000E500F502E501F582E502F583E0F51295
+:100CE000750101C3750000E501F5F0E51D35F0F56E
+:100CF00001E500F5F0E51C35F0F500E500F502E54D
+:100D000001F582E502F583E0F513750102C3750074
+:100D100000E501F5F0E51D35F0F501E500F5F0E53C
+:100D20001C35F0F500E500F502E501F582E502F578
+:100D300083E0F514750103C3750000E501F5F0E5E6
+:100D40001D35F0F501E500F5F0E51C35F0F500E5A1
+:100D500000F502E501F582E502F583E0F515020BE9
+:100D6000D60000750001750100750900750A0002C2
+:100D70000C190000020D620000020D730000020D4C
+:100D80007800750001750100750900750A00020CF4
+:100D9000190000000000000000000000000000003A
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-dom1" } */
+
+extern int foo (void) __attribute__((pure));
+
+int bar()
+{
+ int a = foo ();
+ a += foo ();
+ return a;
+}
+
+/* Check that we only have one call to foo. */
+/* { dg-final { scan-tree-dump-times "foo" 1 "dom1" } } */
+/* { dg-final { cleanup-tree-dump "dom1" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-dom1" } */
+
+extern int foo (void) __attribute__((pure));
+
+int bar()
+{
+ int a = foo ();
+ a += foo ();
+ return a;
+}
+
+/* Check that we only have one call to foo. */
+/* { dg-final { scan-tree-dump-times "foo" 1 "dom1" } } */
+/* { dg-final { cleanup-tree-dump "dom1" } } */
--- /dev/null
+:100000000000E506758206C39582F506E50775834F
+:10001000009583F507D0E0F50875E0012506F58227
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000002506F58275E0003507F583E508F075C3
+:10004000E0052506F58275E0003507F583E513F038
+:1000500075E0042506F58275E0003507F583E512A5
+:10006000F075E0032506F58275E0003507F583E5B8
+:1000700011F075E0022506F58275E0003507F5837D
+:10008000E510F0E582F502E583F503E500F504E50A
+:1000900001F505E502F510E503F511E504F512E5B6
+:1000A00005F513E582F502E583F503E500F504E5C2
+:1000B00001F505E502F500E503F501E504F509E5BF
+:1000C00005F50AC3750B00E500F5F0E51035F0F510
+:1000D00010E501F5F0E51135F0F511E509F5F0E56C
+:1000E0001235F0F512E50AF5F0E51335F0F513E5F4
+:1000F00010F502E511F503E512F504E513F50575B4
+:10010000E0052506F58275E0003507F583E0F51377
+:1001100075E0042506F58275E0003507F583E0F506
+:100120001275E0032506F58275E0003507F583E0DA
+:10013000F51175E0022506F58275E0003507F583B7
+:10014000E0F51075E0002506F58275E0003507F54D
+:1001500083E0F508E508C0E075E0012506F5827545
+:10016000E0003507F583E0F508E508C0E075E00636
+:100170002506F50675E0003507F507E502F582E589
+:1001800003F583E504F500E505F501220000000014
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+int func_pure (void);
+void func_other (int);
+int global_int;
+int func_pure (void) { return global_int; }
+void func_other (int a)
+{
+ global_int = a + 1;
+}
+int f(void)
+{
+ int a;
+ a = func_pure();
+ func_other (a);
+ a = func_pure (); // We were removing this function call
+ return a;
+}
+void abort (void);
+
+int main(void)
+{
+ global_int = 10;
+ if (f() != 11)
+ abort ();
+ return 0;
+}
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+int func_pure (void);
+void func_other (int);
+int global_int;
+int func_pure (void) { return global_int; }
+void func_other (int a)
+{
+ global_int = a + 1;
+}
+int f(void)
+{
+ int a;
+ a = func_pure();
+ func_other (a);
+ a = func_pure (); // We were removing this function call
+ return a;
+}
+void abort (void);
+
+int main(void)
+{
+ global_int = 10;
+ if (f() != 11)
+ abort ();
+ return 0;
+}
--- /dev/null
+:1000000075812F7506FF7507FF12035402000C005F
+:10001000D0E0F518D0E0F519E511F50EE510F50F73
+:10002000900000E582F509900000E583F50A75016E
+:1000300000C3750000E501F5F0E50935F0F501E5CF
+:1000400000F5F0E50A35F0F500E500F502E501F50B
+:1000500082E502F583E0F50B750101C3750000E54B
+:1000600001F5F0E50935F0F501E500F5F0E50A35B3
+:10007000F0F500E500F502E501F582E502F583E023
+:10008000F50C750102C3750000E501F5F0E50935D1
+:10009000F0F501E500F5F0E50A35F0F500E500F5CD
+:1000A00002E501F582E502F583E0F50D750103C374
+:1000B000750000E501F5F0E50935F0F501E500F51D
+:1000C000F0E50A35F0F500E500F502E501F582E519
+:1000D00002F583E0F500E50BF502E50CF503E50D0F
+:1000E000F504E500F505E50EF511E50FF510E51948
+:1000F000C0E0E518C0E0E502F582E503F583E5041C
+:10010000F500E505F5012200E506758204C3958238
+:10011000F506E5077583009583F507D0E0F519D05E
+:10012000E0F51AE514F50DE513F50EE510F5189058
+:100130000000E582F50B900000E583F50C750001E9
+:10014000750100750900750A00C3750F00E500F51B
+:10015000F0E51F35F0F500E501F5F0E51E35F0F5A9
+:1001600001E509F5F0E51D35F0F509E50AF5F0E5DD
+:100170001C35F0F510750F00C3750A00E50FF5F09A
+:10018000E50B35F0F50FE50AF5F0E50C35F0F50A6D
+:10019000E500F503E50AF502E50FF582E502F583D2
+:1001A000E503F0750F01C3750000E50FF5F0E50BF1
+:1001B00035F0F50FE500F5F0E50C35F0F50AE50151
+:1001C000F503E50AF502E50FF582E502F583E5039F
+:1001D000F0750F02C3750000E50FF5F0E50B35F083
+:1001E000F50FE500F5F0E50C35F0F50AE509F50346
+:1001F000E50AF502E50FF582E502F583E503F07502
+:100200000F03C3750000E50FF5F0E50B35F0F50FB2
+:10021000E500F5F0E50C35F0F50AE510F503E50A23
+:10022000F502E50FF582E502F583E503F0750000C0
+:10023000E500F502E500F503E500F504E500F50548
+:10024000E50DF514E50EF513E518F510E51AC0E017
+:10025000E519C0E075E0042506F50675E0003507F0
+:10026000F507E502F582E503F583E504F500E5050C
+:10027000F5012200E506758202C39582F506E507C1
+:100280007583009583F507D0E0F50875E001250634
+:10029000F58275E0003507F583E508F0D0E0F50854
+:1002A00075E0002506F58275E0003507F583E50861
+:1002B000F012000FE582F502E583F503E500F50491
+:1002C000E501F505E502F51FE503F51EE504F51D5D
+:1002D000E505F51C12010712000FE582F502E58322
+:1002E000F503E500F504E501F505E502F51FE50375
+:1002F000F51EE504F51DE505F51CE51FF502E51EF7
+:10030000F503E51DF504E51CF50575E0002506F58A
+:100310008275E0003507F583E0F508E508C0E07573
+:10032000E0012506F58275E0003507F583E0F50864
+:10033000E508C0E075E0022506F50675E000350722
+:10034000F507E502F582E503F583E504F500E5052B
+:10035000F501220000E506758202C39582F506E5E7
+:10036000077583009583F507D0E0F50875E0012552
+:1003700006F58275E0003507F583E508F0D0E0F575
+:100380000875E0002506F58275E0003507F583E580
+:1003900008F0900000E582F50D900000E583F50E71
+:1003A00075090A750A00750B00750C00750100C30C
+:1003B000750000E501F5F0E50D35F0F501E500F516
+:1003C000F0E50E35F0F500E509F503E500F502E589
+:1003D00001F582E502F583E503F0750101C37500BF
+:1003E00000E501F5F0E50D35F0F501E500F5F0E586
+:1003F0000E35F0F500E50AF503E500F502E501F537
+:1004000082E502F583E503F0750102C3750000E59E
+:1004100001F5F0E50D35F0F501E500F5F0E50E35F7
+:10042000F0F500E50BF503E500F502E501F582E5E1
+:1004300002F583E503F0750103C3750000E501F5DE
+:10044000F0E50D35F0F501E500F5F0E50E35F0F5D8
+:1004500000E50CF503E500F502E501F582E502F59E
+:1004600083E503F0120273E582F502E583F503E507
+:1004700000F504E501F505E502F50BE503F50CE5EE
+:1004800004F50DE505F50E75000B75010075090005
+:10049000750A00750F00C3E500F5F0E50B95F0F562
+:1004A00000E500F5F0E50F45F0F50FC3E501F5F0C7
+:1004B000E50C95F0F500E500F5F0E50F45F0F50FDA
+:1004C000C3E509F5F0E50D95F0F500E500F5F0E57B
+:1004D0000F45F0F50FC3E50AF5F0E50E95F0F500D0
+:1004E000E500F5F0E50F45F0F50F75010075090021
+:1004F000750A00750000E50FF5F0E50045F0F50020
+:10050000E501F5F0E50045F0F500E509F5F0E50059
+:1005100045F0F500E50AF5F0E50045F0F500E500E9
+:100520007002800302058D007500007501007509D9
+:1005300000750A00E500F502E501F503E509F5049B
+:10054000E50AF50575E0002506F58275E00035073A
+:10055000F583E0F508E508C0E075E0012506F582C1
+:1005600075E0003507F583E0F508E508C0E075E0C3
+:10057000022506F50675E0003507F507E502F58268
+:10058000E503F583E504F500E505F5012200020524
+:100590002800000000000000000000000000000033
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+int z (int a) {
+ return a * -1;
+}
+
+int x (int a) {
+ return -1 * a;
+}
+
+int y (int a) {
+ return -(-1 * -a);
+}
+/* { dg-final { scan-tree-dump-times "-a" 3 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+int z (int a) {
+ return a * -1;
+}
+
+int x (int a) {
+ return -1 * a;
+}
+
+int y (int a) {
+ return -(-1 * -a);
+}
+/* { dg-final { scan-tree-dump-times "-a" 3 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
--- /dev/null
+:1000000000E50675820AC39582F506E5077583004B
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F0E5173C
+:10004000F518E516F519E515F51AE514F51B75E033
+:10005000052506F58275E0003507F583E513F07593
+:10006000E0042506F58275E0003507F583E512F01A
+:1000700075E0032506F58275E0003507F583E51187
+:10008000F075E0022506F58275E0003507F583E599
+:1000900010F0E51FF500E51EF501E51DF509E51C6D
+:1000A000F517750D01750C00750B00750A00E50D4F
+:1000B000F4F511E50CF4F512E50BF4F513E50AF48B
+:1000C000F515D3750A00E50AF5F0E51135F0F511DF
+:1000D000E50AF5F0E51235F0F512E50AF5F0E5135D
+:1000E00035F0F513E50AF5F0E51535F0F515E50100
+:1000F000F514E509F516750D00750E00750F007500
+:100100001000C3750100E500F5F0E511A4F50CE55C
+:1001100000F5F0E511A4E5F0F509E50CF5F0E501D1
+:1001200035F0F501E514F5F0E511A4F50CE514F54D
+:10013000F0E511A4E5F0F50AE50CF5F0E50935F078
+:10014000F509E516F5F0E511A4F50CE516F5F0E571
+:1001500011A4E5F0F50BE50CF5F0E50A35F0F50A2C
+:10016000E517F5F0E511A4F50CE517F5F0E511A498
+:10017000E5F0F511E50CF5F0E50B35F0F50BC3C333
+:10018000750C00E501F5F0E50D35F0F50DE509F527
+:10019000F0E50E35F0F50EE50AF5F0E50F35F0F572
+:1001A0000FE50BF5F0E51035F0F510C3750900E526
+:1001B00000F5F0E512A4F50CE500F5F0E512A4E574
+:1001C000F0F50AE50CF5F0E50935F0F509E514F56B
+:1001D000F0E512A4F50CE514F5F0E512A4E5F0F550
+:1001E0000BE50CF5F0E50A35F0F50AE516F5F0E556
+:1001F00012A4F50CE516F5F0E512A4E5F0F511E50D
+:100200000CF5F0E50B35F0F50B750100C3C3750C6B
+:1002100000E501F5F0E50D35F0F50DE509F5F0E542
+:100220000E35F0F50EE50AF5F0E50F35F0F50FE5C2
+:100230000BF5F0E51035F0F510C3750A00E500F593
+:10024000F0E513A4F50CE500F5F0E513A4E5F0F5F1
+:100250000BE50CF5F0E50A35F0F50AE514F5F0E5E7
+:1002600013A4F50CE514F5F0E513A4E5F0F511E59C
+:100270000CF5F0E50B35F0F50B750100750900C3C1
+:10028000C3750C00E501F5F0E50D35F0F50DE50958
+:10029000F5F0E50E35F0F50EE50AF5F0E50F35F071
+:1002A000F50FE50BF5F0E51035F0F510C3750B0013
+:1002B000E500F5F0E515A4F50CE500F5F0E515A46D
+:1002C000E5F0F511E50CF5F0E50B35F0F50B7501F2
+:1002D00000750900750A00C3C3750000E501F5F05B
+:1002E000E50D35F0F50DE509F5F0E50E35F0F50E07
+:1002F000E50AF5F0E50F35F0F50FE50BF5F0E51043
+:1003000035F0F510E50DF502E50EF503E50FF50402
+:10031000E510F505E518F517E519F516E51AF515D3
+:10032000E51BF51475E0052506F58275E000350737
+:10033000F583E0F51375E0042506F58275E00035D8
+:1003400007F583E0F51275E0032506F58275E000F8
+:100350003507F583E0F51175E0022506F58275E0B5
+:10036000003507F583E0F51075E0002506F5827588
+:10037000E0003507F583E0F508E508C0E075E00129
+:100380002506F58275E0003507F583E0F508E508F8
+:10039000C0E075E00A2506F50675E0003507F507AB
+:1003A000E502F582E503F583E504F500E505F501D1
+:1003B0002200E506758209C39582F506E507758377
+:1003C000009583F507D0E0F50875E0012506F58274
+:1003D00075E0003507F583E508F0D0E0F50875E035
+:1003E000002506F58275E0003507F583E508F0E5A0
+:1003F00016F518E515F519E514F51AE513F51B754D
+:10040000E0042506F58275E0003507F583E512F076
+:1004100075E0032506F58275E0003507F583E511E3
+:10042000F075E0022506F58275E0003507F583E5F5
+:1004300010F0E51EF513E51DF515E51CF516750024
+:1004400001750100750900750A00E500F4F500E585
+:1004500001F4F501E509F4F509E50AF4F514D3759D
+:100460000A00E50AF5F0E50035F0F500E50AF5F0DB
+:10047000E50135F0F501E50AF5F0E50935F0F50996
+:10048000E50AF5F0E51435F0F514750F0075100068
+:10049000751100751200C3750A00E500F5F0E51F3F
+:1004A000A4F50EE500F5F0E51FA4E5F0F50BE50E6B
+:1004B000F5F0E50A35F0F50AE501F5F0E51FA4F5DC
+:1004C0000EE501F5F0E51FA4E5F0F50CE50EF5F0FD
+:1004D000E50B35F0F50BE509F5F0E51FA4F50EE5A4
+:1004E00009F5F0E51FA4E5F0F50DE50EF5F0E50CD6
+:1004F00035F0F50CE514F5F0E51FA4F50EE514F55F
+:10050000F0E51FA4E5F0F514E50EF5F0E50D35F086
+:10051000F50DC3C3750E00E50AF5F0E50F35F0F5EE
+:100520000FE50BF5F0E51035F0F510E50CF5F0E50D
+:100530001135F0F511E50DF5F0E51235F0F512C3C2
+:10054000750B00E500F5F0E513A4F50EE500F5F0F8
+:10055000E513A4E5F0F50CE50EF5F0E50B35F0F547
+:100560000BE501F5F0E513A4F50EE501F5F0E51353
+:10057000A4E5F0F50DE50EF5F0E50C35F0F50CE52C
+:1005800009F5F0E513A4F50EE509F5F0E513A4E58A
+:10059000F0F514E50EF5F0E50D35F0F50D750A00F2
+:1005A000C3C3750900E50AF5F0E50F35F0F50FE571
+:1005B0000BF5F0E51035F0F510E50CF5F0E511352B
+:1005C000F0F511E50DF5F0E51235F0F512C3750CF7
+:1005D00000E500F5F0E515A4F50EE500F5F0E515EC
+:1005E000A4E5F0F50DE50EF5F0E50C35F0F50CE5BC
+:1005F00001F5F0E515A4F50EE501F5F0E515A4E526
+:10060000F0F514E50EF5F0E50D35F0F50D750A0081
+:10061000750B00C3C3750100E50AF5F0E50F35F071
+:10062000F50FE50BF5F0E51035F0F510E50CF5F0FC
+:10063000E51135F0F511E50DF5F0E51235F0F5129F
+:10064000C3750D00E500F5F0E516A4F50EE500F51F
+:10065000F0E516A4E5F0F514E50EF5F0E50D35F03E
+:10066000F50D750A00750B00750C00C3C37500000D
+:10067000E50AF5F0E50F35F0F50FE50BF5F0E510BF
+:1006800035F0F510E50CF5F0E51135F0F511E50D57
+:10069000F5F0E51235F0F512E50FF502E510F5037A
+:1006A000E511F504E512F505E518F516E519F5155A
+:1006B000E51AF514E51BF51375E0042506F58275BA
+:1006C000E0003507F583E0F51275E0032506F582B5
+:1006D00075E0003507F583E0F51175E0022506F5B4
+:1006E0008275E0003507F583E0F51075E00025061A
+:1006F000F58275E0003507F583E0F508E508C0E010
+:1007000075E0012506F58275E0003507F583E0F513
+:1007100008E508C0E075E0092506F50675E0003536
+:1007200007F507E502F582E503F583E504F500E545
+:1007300005F5012200E50675820AC39582F506E5F6
+:10074000077583009583F507D0E0F50875E001256E
+:1007500006F58275E0003507F583E508F0D0E0F591
+:100760000875E0002506F58275E0003507F583E59C
+:1007700008F0E517F518E516F519E515F51AE5146D
+:10078000F51B75E0052506F58275E0003507F58354
+:10079000E513F075E0042506F58275E0003507F5F0
+:1007A00083E512F075E0032506F58275E000350754
+:1007B000F583E511F075E0022506F58275E0003558
+:1007C00007F583E510F0E51FF509E51EF50AE51DBF
+:1007D000F50BE51CF50C750001750100750E007533
+:1007E0000D00E500F4F500E501F4F501E50EF4F582
+:1007F00014E50DF4F516D3750D00E50DF5F0E500E3
+:1008000035F0F500E50DF5F0E50135F0F501E50D04
+:10081000F5F0E51435F0F514E50DF5F0E51635F0D5
+:10082000F516E509F4F50EE50AF4F50FE50BF4F518
+:1008300015E50CF4F517D3750900E509F5F0E50E9B
+:1008400035F0F50EE509F5F0E50F35F0F50FE509A2
+:10085000F5F0E51535F0F515E509F5F0E51735F096
+:10086000F517751000751100751200751300C3752A
+:100870000900E500F5F0E50EA4F50DE500F5F0E55D
+:100880000EA4E5F0F50AE50DF5F0E50935F0F509FA
+:10089000E501F5F0E50EA4F50DE501F5F0E50EA492
+:1008A000E5F0F50BE50DF5F0E50A35F0F50AE51490
+:1008B000F5F0E50EA4F50DE514F5F0E50EA4E5F070
+:1008C000F50CE50DF5F0E50B35F0F50BE516F5F05B
+:1008D000E50EA4F50DE516F5F0E50EA4E5F0F50E30
+:1008E000E50DF5F0E50C35F0F50CC3C3750D00E52D
+:1008F00009F5F0E51035F0F510E50AF5F0E51135EC
+:10090000F0F511E50BF5F0E51235F0F512E50CF513
+:10091000F0E51335F0F513C3750A00E500F5F0E5D1
+:100920000FA4F50DE500F5F0E50FA4E5F0F50BE5F6
+:100930000DF5F0E50A35F0F50AE501F5F0E50FA44F
+:10094000F50DE501F5F0E50FA4E5F0F50CE50DF585
+:10095000F0E50B35F0F50BE514F5F0E50FA4F50D1A
+:10096000E514F5F0E50FA4E5F0F50EE50DF5F0E57D
+:100970000C35F0F50C750900C3C3750D00E509F5DC
+:10098000F0E51035F0F510E50AF5F0E51135F0F574
+:1009900011E50BF5F0E51235F0F512E50CF5F0E593
+:1009A0001335F0F513C3750B00E500F5F0E515A45C
+:1009B000F50DE500F5F0E515A4E5F0F50CE50DF510
+:1009C000F0E50B35F0F50BE501F5F0E515A4F50DB7
+:1009D000E501F5F0E515A4E5F0F50EE50DF5F0E51A
+:1009E0000C35F0F50C750900750A00C3C3750100DC
+:1009F000E509F5F0E51035F0F510E50AF5F0E5113B
+:100A000035F0F511E50BF5F0E51235F0F512E50CD2
+:100A1000F5F0E51335F0F513C3750C00E500F5F0BE
+:100A2000E517A4F50DE500F5F0E517A4E5F0F50EE2
+:100A3000E50DF5F0E50C35F0F50C750900750A00CB
+:100A4000750B00C3C3750000E509F5F0E51035F03E
+:100A5000F510E50AF5F0E51135F0F511E50BF5F0C7
+:100A6000E51235F0F512E50CF5F0E51335F0F51368
+:100A7000E510F4F500E511F4F501E512F4F509E5EA
+:100A800013F4F50BD3750A00E50AF5F0E50035F02F
+:100A9000F500E50AF5F0E50135F0F501E50AF5F0B8
+:100AA000E50935F0F509E50AF5F0E50B35F0F50B4C
+:100AB000E500F502E501F503E509F504E50BF505AB
+:100AC000E518F517E519F516E51AF515E51BF51402
+:100AD00075E0052506F58275E0003507F583E0F53C
+:100AE0001375E0042506F58275E0003507F583E00F
+:100AF000F51275E0032506F58275E0003507F583EC
+:100B0000E0F51175E0022506F58275E0003507F580
+:100B100083E0F51075E0002506F58275E0003507E5
+:100B2000F583E0F508E508C0E075E0012506F582EB
+:100B300075E0003507F583E0F508E508C0E075E0ED
+:100B40000A2506F50675E0003507F507E502F5828A
+:100B5000E503F583E504F500E505F5012200000055
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* This used to cause excessive use, or a stack overflow, depending on which
+ came first. */
+void foo (void)
+{
+ int maxstringlen = 1;
+ int limit = 0, maxblock = 0, maxblockrem = 0;
+ maxblockrem = (maxstringlen) % (2147483647 + 1); /* { dg-warning "overflow" } */
+}
--- /dev/null
+/* { dg-do compile } */
+/* This used to cause excessive use, or a stack overflow, depending on which
+ came first. */
+void foo (void)
+{
+ int maxstringlen = 1;
+ int limit = 0, maxblock = 0, maxblockrem = 0;
+ maxblockrem = (maxstringlen) % (2147483647 + 1); /* { dg-warning "overflow" } */
+}
--- /dev/null
+:1000000000E506758212C39582F506E50775830043
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F075E0E3
+:10004000092506F58275E0003507F583E517F0759B
+:10005000E0082506F58275E0003507F583E516F022
+:1000600075E0072506F58275E0003507F583E5158F
+:10007000F075E0062506F58275E0003507F583E5A5
+:1000800014F075E0052506F58275E0003507F58367
+:10009000E513F075E0042506F58275E0003507F5F7
+:1000A00083E512F075E0032506F58275E00035075B
+:1000B000F583E511F075E0022506F58275E000355F
+:1000C00007F583E510F0E51FF500E51EF501E51DD8
+:1000D000F509E51CF50AE51AF515E519F513750F8F
+:1000E00000751000751100751200E500F516E501A8
+:1000F000F514E509F50DE50AF50E750C0075170008
+:10010000751900751A00750B00750A01750001C399
+:10011000E518F5F0E50E95F0F509E50BF5F0E50BC2
+:1001200035F0F509E509F5F0E50055F0F500E500D5
+:10013000F5F0E50C45F0F50C750001C3E518F5F098
+:10014000E50E95F0F509E50BF5F0E50B35F0F50951
+:10015000E50EF5F0E51895F0F501E50BF5F0E50B8A
+:1001600035F0F501E501F5F0E50945F0F509E50A99
+:10017000F5F0E50965F0F509E509F5F0E50055F05C
+:10018000F500C3E513F5F0E50D95F0F509E50BF580
+:10019000F0E50B35F0F509E509F5F0E50055F0F56A
+:1001A00000E500F5F0E50C45F0F50C750001C3E540
+:1001B00018F5F0E50E95F0F509E50BF5F0E50B35D2
+:1001C000F0F509E50EF5F0E51895F0F501E50BF50C
+:1001D000F0E50B35F0F501E501F5F0E50945F0F541
+:1001E00009E50AF5F0E50965F0F509E509F5F0E539
+:1001F0000055F0F500C3E513F5F0E50D95F0F509B0
+:10020000E50BF5F0E50B35F0F509E50DF5F0E51337
+:1002100095F0F501E50BF5F0E50B35F0F501E5019D
+:10022000F5F0E50945F0F509E50AF5F0E50965F0B1
+:10023000F509E509F5F0E50055F0F500C3E515F51C
+:10024000F0E51495F0F509E50BF5F0E50B35F0F563
+:1002500009E509F5F0E50055F0F500E500F5F0E5F4
+:100260000C45F0F50C750001C3E518F5F0E50E95A9
+:10027000F0F509E50BF5F0E50B35F0F509E50EF5C0
+:10028000F0E51895F0F501E50BF5F0E50B35F0F527
+:1002900001E501F5F0E50945F0F509E50AF5F0E5B8
+:1002A0000965F0F509E509F5F0E50055F0F500C33D
+:1002B000E513F5F0E50D95F0F509E50BF5F0E50B27
+:1002C00035F0F509E50DF5F0E51395F0F501E50BD1
+:1002D000F5F0E50B35F0F501E501F5F0E50945F040
+:1002E000F509E50AF5F0E50965F0F509E509F5F028
+:1002F000E50055F0F500C3E515F5F0E51495F0F5CA
+:1003000009E50BF5F0E50B35F0F509E514F5F0E539
+:100310001595F0F501E50BF5F0E50B35F0F501E588
+:1003200001F5F0E50945F0F509E50AF5F0E509659F
+:10033000F0F509E509F5F0E50055F0F500C3E51B1A
+:10034000F5F0E51695F0F509E50BF5F0E50B35F060
+:10035000F509E509F5F0E50055F0F500E500F5F0E3
+:10036000E50C45F0F50CE517F500E519F501E51A82
+:10037000F509E50CF50B750C01C3750A00E50BF5E5
+:10038000F0E50A95F0F50A750A00E50AF5F0E50AC8
+:1003900035F0F50AE50AF5F0E50C65F0F50CC375E6
+:1003A0000A00E500F5F0E50A95F0F50A750A00E5A2
+:1003B0000AF5F0E50A35F0F50AE50AF5F0E50C6511
+:1003C000F0F50CC3750A00E501F5F0E50A95F0F5C6
+:1003D0000A750A00E50AF5F0E50A35F0F50AE50ABE
+:1003E000F5F0E50C65F0F50CC3750A00E509F5F0CC
+:1003F000E50A95F0F50A750A00E50AF5F0E50A3513
+:10040000F0F50AE50AF5F0E50C65F0F50C7500006D
+:10041000750100750900E500F50BE501F50A7501A8
+:1004200001C3750000E50CF5F0E50095F0F50075E9
+:100430000000E500F5F0E50035F0F500E500F5F029
+:10044000E50165F0F501C3750000E50BF5F0E50089
+:1004500095F0F500750000E500F5F0E50035F0F5E4
+:1004600000E500F5F0E50165F0F501C3750000E574
+:100470000AF5F0E50095F0F500750000E500F5F0EF
+:10048000E50035F0F500E500F5F0E50165F0F50172
+:10049000C3750000E509F5F0E50095F0F50075007D
+:1004A00000E500F5F0E50035F0F500E500F5F0E5D4
+:1004B0000165F0F501750900750A00750B007500FE
+:1004C00000E501F5F0E50045F0F500E509F5F0E59A
+:1004D0000045F0F500E50AF5F0E50045F0F500E52A
+:1004E0000BF5F0E50045F0F500E500700280030231
+:1004F000055700750001750100750900750A00C3F4
+:10050000750B00E500F5F0E50F35F0F50FE501F5A9
+:10051000F0E51035F0F510E509F5F0E51135F0F5E9
+:1005200011E50AF5F0E51235F0F512C3E51BF5F01B
+:10053000E51695F0F516E515F5F0E51495F0F514CA
+:10054000E513F5F0E50D95F0F50DE518F5F0E50E80
+:1005500095F0F50E0200FA00E50FF502E510F5033F
+:10056000E511F504E512F50575E0092506F5827536
+:10057000E0003507F583E0F51775E0082506F582FC
+:1005800075E0003507F583E0F51675E0072506F5FB
+:100590008275E0003507F583E0F51575E006250660
+:1005A000F58275E0003507F583E0F51475E0052563
+:1005B00006F58275E0003507F583E0F51375E00474
+:1005C0002506F58275E0003507F583E0F51275E044
+:1005D000032506F58275E0003507F583E0F5117512
+:1005E000E0022506F58275E0003507F583E0F51099
+:1005F00075E0002506F58275E0003507F583E0F526
+:1006000008E508C0E075E0012506F58275E00035D3
+:1006100007F583E0F508E508C0E075E0122506F56A
+:100620000675E0003507F507E502F582E503F58379
+:10063000E504F500E505F5012200E506758217C31E
+:100640009582F506E5077583009583F507D0E0F5FB
+:100650000875E0062506F58275E0003507F583E5A7
+:1006600008F0D0E0F50875E0052506F58275E00094
+:100670003507F583E508F075E00E2506F58275E08F
+:10068000003507F583E517F075E00D2506F5827551
+:10069000E0003507F583E516F075E00C2506F582D8
+:1006A00075E0003507F583E515F075E00B2506F5D7
+:1006B0008275E0003507F583E514F075E00A25063C
+:1006C000F58275E0003507F583E513F075E009253F
+:1006D00006F58275E0003507F583E512F075E00850
+:1006E0002506F58275E0003507F583E511F075E024
+:1006F000072506F58275E0003507F583E510F0E57E
+:100700001FF511E51BF512E51AF513E519F514753A
+:10071000E0042506F58275E0003507F583E511F064
+:1007200075E0032506F58275E0003507F583E51EC3
+:10073000F075E0022506F58275E0003507F583E5E2
+:100740001DF075E0012506F58275E0003507F5839B
+:10075000E51CF07515017516007517007508007514
+:10076000E0002506F58275E0003507F583E508F021
+:10077000751900750D00750E00750F00E51CF5105C
+:10078000750080E500F5F0E51025F0F510E500F5C1
+:10079000F0E50F25F0F50F750C00751A00751B00BC
+:1007A000751F00750B00750A01750001C3E50FF593
+:1007B000F0E51095F0F509E50BF5F0E50B35F0F5F2
+:1007C00009E509F5F0E50055F0F500E500F5F0E57F
+:1007D0000C45F0F50C750001C3E50FF5F0E510953B
+:1007E000F0F509E50BF5F0E50B35F0F509E510F549
+:1007F000F0E50F95F0F501E50BF5F0E50B35F0F5BB
+:1008000001E501F5F0E50945F0F509E50AF5F0E542
+:100810000965F0F509E509F5F0E50055F0F500C3C7
+:10082000E50EF5F0E51D95F0F509E50BF5F0E50BA6
+:1008300035F0F509E509F5F0E50055F0F500E500BE
+:10084000F5F0E50C45F0F50C750001C3E50FF5F08A
+:10085000E51095F0F509E50BF5F0E50B35F0F50938
+:10086000E510F5F0E50F95F0F501E50BF5F0E50B7A
+:1008700035F0F501E501F5F0E50945F0F509E50A82
+:10088000F5F0E50965F0F509E509F5F0E50055F045
+:10089000F500C3E50EF5F0E51D95F0F509E50BF55E
+:1008A000F0E50B35F0F509E51DF5F0E50E95F0F5F1
+:1008B00001E50BF5F0E50B35F0F501E501F5F0E5A7
+:1008C0000945F0F509E50AF5F0E50965F0F509E5F2
+:1008D00009F5F0E50055F0F500C3E50DF5F0E51E6E
+:1008E00095F0F509E50BF5F0E50B35F0F509E509AF
+:1008F000F5F0E50055F0F500E500F5F0E50C45F004
+:10090000F50C750001C3E50FF5F0E51095F0F5095C
+:10091000E50BF5F0E50B35F0F509E510F5F0E50F21
+:1009200095F0F501E50BF5F0E50B35F0F501E50186
+:10093000F5F0E50945F0F509E50AF5F0E50965F09A
+:10094000F509E509F5F0E50055F0F500C3E50EF50C
+:10095000F0E51D95F0F509E50BF5F0E50B35F0F543
+:1009600009E51DF5F0E50E95F0F501E50BF5F0E56F
+:100970000B35F0F501E501F5F0E50945F0F509E580
+:100980000AF5F0E50965F0F509E509F5F0E500552A
+:10099000F0F500C3E50DF5F0E51E95F0F509E50B62
+:1009A000F5F0E50B35F0F509E51EF5F0E50D95F0F0
+:1009B000F501E50BF5F0E50B35F0F501E501F5F096
+:1009C000E50945F0F509E50AF5F0E50965F0F509F1
+:1009D000E509F5F0E50055F0F500C3E519F5F0E59A
+:1009E0001195F0F509E50BF5F0E50B35F0F509E5A6
+:1009F00009F5F0E50055F0F500E500F5F0E50C45EA
+:100A0000F0F50CE51AF501E51BF509E51FF50A758A
+:100A10000000E50CF5F0E50045F0F500E501F5F026
+:100A2000E50045F0F500E509F5F0E50045F0F500D5
+:100A3000E50AF5F0E50045F0F500E50070028003F9
+:100A400002116B00751900750D00750E00750F0011
+:100A5000E512F51BE513F51AE514F510E518F51187
+:100A6000750080E500F5F0E51125F0F511E500F5DC
+:100A7000F0E50F25F0F50F750C00751C00751D00D5
+:100A8000751E00750B00750A01750001C3E50FF5B1
+:100A9000F0E51195F0F509E50BF5F0E50B35F0F50E
+:100AA00009E509F5F0E50055F0F500E500F5F0E59C
+:100AB0000C45F0F50C750001C3E50FF5F0E5119557
+:100AC000F0F509E50BF5F0E50B35F0F509E511F565
+:100AD000F0E50F95F0F501E50BF5F0E50B35F0F5D8
+:100AE00001E501F5F0E50945F0F509E50AF5F0E560
+:100AF0000965F0F509E509F5F0E50055F0F500C3E5
+:100B0000E50EF5F0E51095F0F509E50BF5F0E50BD0
+:100B100035F0F509E509F5F0E50055F0F500E500DB
+:100B2000F5F0E50C45F0F50C750001C3E50FF5F0A7
+:100B3000E51195F0F509E50BF5F0E50B35F0F50954
+:100B4000E511F5F0E50F95F0F501E50BF5F0E50B96
+:100B500035F0F501E501F5F0E50945F0F509E50A9F
+:100B6000F5F0E50965F0F509E509F5F0E50055F062
+:100B7000F500C3E50EF5F0E51095F0F509E50BF588
+:100B8000F0E50B35F0F509E510F5F0E50E95F0F51B
+:100B900001E50BF5F0E50B35F0F501E501F5F0E5C4
+:100BA0000945F0F509E50AF5F0E50965F0F509E50F
+:100BB00009F5F0E50055F0F500C3E50DF5F0E51A8F
+:100BC00095F0F509E50BF5F0E50B35F0F509E509CC
+:100BD000F5F0E50055F0F500E500F5F0E50C45F021
+:100BE000F50C750001C3E50FF5F0E51195F0F50979
+:100BF000E50BF5F0E50B35F0F509E511F5F0E50F3E
+:100C000095F0F501E50BF5F0E50B35F0F501E501A3
+:100C1000F5F0E50945F0F509E50AF5F0E50965F0B7
+:100C2000F509E509F5F0E50055F0F500C3E50EF529
+:100C3000F0E51095F0F509E50BF5F0E50B35F0F56D
+:100C400009E510F5F0E50E95F0F501E50BF5F0E599
+:100C50000B35F0F501E501F5F0E50945F0F509E59D
+:100C60000AF5F0E50965F0F509E509F5F0E5005547
+:100C7000F0F500C3E50DF5F0E51A95F0F509E50B83
+:100C8000F5F0E50B35F0F509E51AF5F0E50D95F011
+:100C9000F501E50BF5F0E50B35F0F501E501F5F0B3
+:100CA000E50945F0F509E50AF5F0E50965F0F5090E
+:100CB000E509F5F0E50055F0F500C3E519F5F0E5B7
+:100CC0001B95F0F509E50BF5F0E50B35F0F509E5B9
+:100CD00009F5F0E50055F0F500E500F5F0E50C4507
+:100CE000F0F50CE51CF501E51DF509E51EF50A75A5
+:100CF0000000E50CF5F0E50045F0F500E501F5F044
+:100D0000E50045F0F500E509F5F0E50045F0F500F2
+:100D1000E50AF5F0E50045F0F500E5007002800316
+:100D20000210A30075E0042506F58275E000350782
+:100D3000F583E0F51F75E0032506F58275E00035C3
+:100D400007F583E0F51E75E0022506F58275E000E3
+:100D50003507F583E0F51D75E0012506F58275E0A0
+:100D6000003507F583E0F51CE512F51BE513F51AD0
+:100D7000E514F519120000E582F502E583F503E5B7
+:100D800000F504E501F505E502F511E503F512E5C9
+:100D900004F513E505F514E515F500E516F515E57B
+:100DA00017F51675E0002506F58275E0003507F5A4
+:100DB00083E0F517750D00750E00750F00751000B6
+:100DC000C3750100E500F5F0E511A4F50CE500F5AB
+:100DD000F0E511A4E5F0F509E50CF5F0E50135F0D5
+:100DE000F501E515F5F0E511A4F50CE515F5F0E5CF
+:100DF00011A4E5F0F50AE50CF5F0E50935F0F50983
+:100E0000E516F5F0E511A4F50CE516F5F0E511A4ED
+:100E1000E5F0F50BE50CF5F0E50A35F0F50AE51718
+:100E2000F5F0E511A4F50CE517F5F0E511A4E5F0F2
+:100E3000F511E50CF5F0E50B35F0F50BC3C3750CBA
+:100E400000E501F5F0E50D35F0F50DE509F5F0E506
+:100E50000E35F0F50EE50AF5F0E50F35F0F50FE586
+:100E60000BF5F0E51035F0F510C3750900E500F558
+:100E7000F0E512A4F50CE500F5F0E512A4E5F0F5B7
+:100E80000AE50CF5F0E50935F0F509E515F5F0E5AD
+:100E900012A4F50CE515F5F0E512A4E5F0F50BE567
+:100EA0000CF5F0E50A35F0F50AE516F5F0E512A4C3
+:100EB000F50CE516F5F0E512A4E5F0F511E50CF5F5
+:100EC000F0E50B35F0F50B750100C3C3750C00E5BB
+:100ED00001F5F0E50D35F0F50DE509F5F0E50E3518
+:100EE000F0F50EE50AF5F0E50F35F0F50FE50BF539
+:100EF000F0E51035F0F510C3750A00E500F5F0E5F2
+:100F000013A4F50CE500F5F0E513A4E5F0F50BE509
+:100F10000CF5F0E50A35F0F50AE515F5F0E513A452
+:100F2000F50CE515F5F0E513A4E5F0F511E50CF584
+:100F3000F0E50B35F0F50B750100750900C3C375BD
+:100F40000C00E501F5F0E50D35F0F50DE509F5F0DE
+:100F5000E50E35F0F50EE50AF5F0E50F35F0F50F85
+:100F6000E50BF5F0E51035F0F510C3750B00E50065
+:100F7000F5F0E514A4F50CE500F5F0E514A4E5F0B2
+:100F8000F511E50CF5F0E50B35F0F50B7501007585
+:100F90000900750A00C3C3750000E501F5F0E50D11
+:100FA00035F0F50DE509F5F0E50E35F0F50EE50A3D
+:100FB000F5F0E50F35F0F50FE50BF5F0E51035F040
+:100FC000F510E50DF502E50EF503E50FF504E51066
+:100FD000F50575E00E2506F58275E0003507F58309
+:100FE000E0F51775E00D2506F58275E0003507F58B
+:100FF00083E0F51675E00C2506F58275E0003507EF
+:10100000F583E0F51575E00B2506F58275E00035F2
+:1010100007F583E0F51475E00A2506F58275E00012
+:101020003507F583E0F51375E0092506F58275E0CF
+:10103000003507F583E0F51275E0082506F58275A1
+:10104000E0003507F583E0F51175E0072506F58228
+:1010500075E0003507F583E0F51075E0052506F528
+:101060008275E0003507F583E0F508E508C0E07516
+:10107000E0062506F58275E0003507F583E0F50802
+:10108000E508C0E075E0172506F50675E0003507B0
+:10109000F507E502F582E503F583E504F500E505CE
+:1010A000F5012200E512F4F512E513F4F513E51449
+:1010B000F4F514E518F4F518D3750000E500F5F023
+:1010C000E51235F0F512E500F5F0E51335F0F5130E
+:1010D000E500F5F0E51435F0F514E500F5F0E51858
+:1010E00035F0F518E515F4F515E516F4F516E517E0
+:1010F000F4F51775E0002506F58275E0003507F573
+:1011000083E0F508E508F4F50875E0002506F582AA
+:1011100075E0003507F583E508F0D3750000E500BC
+:10112000F5F0E51535F0F515E500F5F0E51635F0C7
+:10113000F516E500F5F0E51735F0F517E500F5F0E3
+:1011400075E0002506F58275E0003507F583E0F5CA
+:1011500008E50835F0F50875E0002506F58275E02C
+:10116000003507F583E508F0020D2400E511F4F5DC
+:1011700000E51EF4F501E51DF4F509E51CF4F50B99
+:10118000D3750A00E50AF5F0E50035F0F500E50A4B
+:10119000F5F0E50135F0F501E50AF5F0E50935F082
+:1011A000F509E50AF5F0E50B35F0F50B75E00425DA
+:1011B00006F58275E0003507F583E500F075E0037C
+:1011C0002506F58275E0003507F583E501F075E049
+:1011D000022506F58275E0003507F583E509F0750F
+:1011E000E0012506F58275E0003507F583E50BF093
+:1011F000E515F4F515E516F4F516E517F4F517758C
+:10120000E0002506F58275E0003507F583E0F50876
+:10121000E508F4F50875E0002506F58275E000356F
+:1012200007F583E508F0D3750000E500F5F0E51556
+:1012300035F0F515E500F5F0E51635F0F516E500A5
+:10124000F5F0E51735F0F517E500F5F075E0002548
+:1012500006F58275E0003507F583E0F508E5083509
+:10126000F0F50875E0002506F58275E0003507F514
+:1012700083E508F0020A4400E506758216C39582EC
+:10128000F506E5077583009583F507D0E0F5087549
+:10129000E0052506F58275E0003507F583E508F0E1
+:1012A000D0E0F50875E0042506F58275E000350705
+:1012B000F583E508F075E00D2506F58275E000354B
+:1012C00007F583E517F075E00C2506F58275E0005B
+:1012D0003507F583E516F075E00B2506F58275E018
+:1012E000003507F583E515F075E00A2506F58275EA
+:1012F000E0003507F583E514F075E0092506F58271
+:1013000075E0003507F583E513F075E0082506F56F
+:101310008275E0003507F583E512F075E0072506D4
+:10132000F58275E0003507F583E511F075E00625D7
+:1013300006F58275E0003507F583E510F075E003EA
+:101340002506F58275E0003507F583E51FF075E0A9
+:10135000022506F58275E0003507F583E51EF07578
+:10136000E0012506F58275E0003507F583E51DF0FF
+:1013700075E0002506F58275E0003507F583E51C6C
+:10138000F0E51BF514E51AF515E519F516E518F560
+:101390001775E0032506F58275E0003507F583E053
+:1013A000F51F75E0022506F58275E0003507F58327
+:1013B000E0F51E75E0012506F58275E0003507F5BC
+:1013C00083E0F51D75E0002506F58275E000350720
+:1013D000F583E0F51CE514F51BE515F51AE516F5A2
+:1013E00019E517F518120639E582F502E583F503CC
+:1013F000E500F504E501F505E502F500E503F50175
+:10140000E504F509E505F50A75100075110075127A
+:1014100000751300C3750B00E500F5F0E514A4F5A5
+:101420000FE500F5F0E514A4E5F0F50CE50FF5F097
+:10143000E50B35F0F50BE501F5F0E514A4F50FE546
+:1014400001F5F0E514A4E5F0F50DE50FF5F0E50C78
+:1014500035F0F50CE509F5F0E514A4F50FE509F50F
+:10146000F0E514A4E5F0F50EE50FF5F0E50D35F027
+:10147000F50DE50AF5F0E514A4F50FE50AF5F0E53C
+:1014800014A4E5F0F50AE50FF5F0E50E35F0F50EDC
+:10149000C3C3750A00E50BF5F0E51035F0F510E56E
+:1014A0000CF5F0E51135F0F511E50DF5F0E5123527
+:1014B000F0F512E50EF5F0E51335F0F513C3750CF4
+:1014C00000E500F5F0E515A4F50FE500F5F0E515EC
+:1014D000A4E5F0F50DE50FF5F0E50C35F0F50CE5BC
+:1014E00001F5F0E515A4F50FE501F5F0E515A4E526
+:1014F000F0F50EE50FF5F0E50D35F0F50DE509F524
+:10150000F0E515A4F50FE509F5F0E515A4E5F0F50E
+:101510000AE50FF5F0E50E35F0F50E750B00C3C3C7
+:10152000750900E50BF5F0E51035F0F510E50CF563
+:10153000F0E51135F0F511E50DF5F0E51235F0F5B2
+:1015400012E50EF5F0E51335F0F513C3750D00E562
+:1015500000F5F0E516A4F50FE500F5F0E516A4E5B5
+:10156000F0F50EE50FF5F0E50D35F0F50DE501F5BB
+:10157000F0E516A4F50FE501F5F0E516A4E5F0F5A4
+:101580000AE50FF5F0E50E35F0F50E750B00750C5C
+:1015900000C3C3750100E50BF5F0E51035F0F5105B
+:1015A000E50CF5F0E51135F0F511E50DF5F0E51276
+:1015B00035F0F512E50EF5F0E51335F0F513C375CA
+:1015C0000E00E500F5F0E517A4F50FE500F5F0E5F0
+:1015D00017A4E5F0F50AE50FF5F0E50E35F0F50E88
+:1015E000750B00750C00750D00C3C3750000E50B8D
+:1015F000F5F0E51035F0F510E50CF5F0E51135F0F6
+:10160000F511E50DF5F0E51235F0F512E50EF5F002
+:10161000E51335F0F513C3E510F5F075E003250685
+:10162000F58275E0003507F583E0F508E50895F0EB
+:10163000F500E511F5F075E0022506F58275E0008C
+:101640003507F583E0F508E50895F0F501E512F5B5
+:10165000F075E0012506F58275E0003507F583E0B9
+:10166000F508E50895F0F509E513F5F075E00025B6
+:1016700006F58275E0003507F583E0F508E5089585
+:10168000F0F50AE500F502E501F503E509F504E5E5
+:101690000AF50575E00D2506F58275E0003507F5BC
+:1016A00083E0F51775E00C2506F58275E000350737
+:1016B000F583E0F51675E00B2506F58275E000353B
+:1016C00007F583E0F51575E00A2506F58275E0005B
+:1016D0003507F583E0F51475E0092506F58275E018
+:1016E000003507F583E0F51375E0082506F58275EA
+:1016F000E0003507F583E0F51275E0072506F58271
+:1017000075E0003507F583E0F51175E0062506F56F
+:101710008275E0003507F583E0F51075E0042506D5
+:10172000F58275E0003507F583E0F508E508C0E0CF
+:1017300075E0052506F58275E0003507F583E0F5CF
+:1017400008E508C0E075E0162506F50675E00035E9
+:1017500007F507E502F582E503F583E504F500E505
+:1017600005F5012200E506758202C39582F506E5BE
+:10177000077583009583F507D0E0F50875E001252E
+:1017800006F58275E0003507F583E508F0D0E0F551
+:101790000875E0002506F58275E0003507F583E55C
+:1017A00008F0751F01751E00751D00751C00750A77
+:1017B00001750900750100750000E50AF4F50EE5F4
+:1017C00009F4F50CE501F4F50AE500F4F501D3752B
+:1017D0000000E500F5F0E50E35F0F50EE500F5F05A
+:1017E000E50C35F0F50CE500F5F0E50A35F0F50A05
+:1017F000E500F5F0E50135F0F501750D01750B001B
+:10180000750900750000C3750F00E50DF5F0E50ED4
+:1018100035F0F51BE50BF5F0E50C35F0F51AE509AB
+:10182000F5F0E50A35F0F519E500F5F0E50135F0DC
+:10183000F518121277750000E500F502E500F503D2
+:10184000E500F504E500F50575E0002506F582756F
+:10185000E0003507F583E0F508E508C0E075E00134
+:101860002506F58275E0003507F583E0F508E50803
+:10187000C0E075E0022506F50675E0003507F507BE
+:10188000E502F582E503F583E504F500E505F501DC
+:101890002200000000000000000000000000000026
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Bug 22308: C_TYPE_FIELDS_READONLY not updated on type variants. */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct foo s;
+volatile struct foo t;
+struct foo { const int z; };
+
+void
+bar (void)
+{
+ t = s; /* { dg-error "error: assignment of read-only variable 't'" } */
+}
--- /dev/null
+/* Bug 22308: C_TYPE_FIELDS_READONLY not updated on type variants. */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct foo s;
+volatile struct foo t;
+struct foo { const int z; };
+
+void
+bar (void)
+{
+ t = s; /* { dg-error "error: assignment of read-only variable 't'" } */
+}
--- /dev/null
+:1000000000D0E0F518D0E0F519900004E582F50A7B
+:10001000900004E583F501750900C3750000E5094A
+:10002000F5F0E50A35F0F50EE500F5F0E50135F0FF
+:10003000F50F900000E582F509900000E583F50AD0
+:10004000750100C3750000E501F5F0E50935F0F52F
+:1000500001E500F5F0E50A35F0F500E501F509E503
+:1000600000F50A750100C3750000E501F5F0E5092A
+:1000700035F0F501E500F5F0E50A35F0F500E500AD
+:10008000F502E501F582E502F583E0F50B75010166
+:10009000C3750000E501F5F0E50935F0F501E5006F
+:1000A000F5F0E50A35F0F500E500F502E501F58229
+:1000B000E502F583E0F50C750102C3750000E5016A
+:1000C000F5F0E50935F0F501E500F5F0E50A35F064
+:1000D000F500E500F502E501F582E502F583E0F5BE
+:1000E0000D750103C3750000E501F5F0E50935F074
+:1000F000F501E500F5F0E50A35F0F500E500F5025B
+:10010000E501F582E502F583E0F509750100C375A7
+:100110000000E501F5F0E50E35F0F501E500F5F03C
+:10012000E50F35F0F500E50BF503E500F502E50117
+:10013000F582E502F583E503F0750101C375000062
+:10014000E501F5F0E50E35F0F501E500F5F0E50F18
+:1001500035F0F500E50CF503E500F502E501F58263
+:10016000E502F583E503F0750102C3750000E501C2
+:10017000F5F0E50E35F0F501E500F5F0E50F35F0A9
+:10018000F500E50DF503E500F502E501F582E50270
+:10019000F583E503F0750103C3750000E501F5F093
+:1001A000E50E35F0F501E500F5F0E50F35F0F50069
+:1001B000E509F503E500F502E501F582E502F583C1
+:1001C000E503F0750000E500F502E500F503E50044
+:1001D000F504E500F505E519C0E0E518C0E0E50225
+:1001E000F582E503F583E504F500E505F501220058
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Bug 22311: ICE with -fshort-enums on shortened operations. */
+/* { dg-do compile } */
+/* { dg-options "-fshort-enums" } */
+
+typedef enum { A = 1 } E;
+void f(E e, unsigned char c) { c |= e; }
--- /dev/null
+/* Bug 22311: ICE with -fshort-enums on shortened operations. */
+/* { dg-do compile } */
+/* { dg-options "-fshort-enums" } */
+
+typedef enum { A = 1 } E;
+void f(E e, unsigned char c) { c |= e; }
--- /dev/null
+:1000000000E506758205C39582F506E50775830050
+:100010009583F507D0E0F500D0E0F501C375090040
+:10002000E509F502E509F503E509F504E509F50536
+:10003000E501C0E0E500C0E075E0052506F50675C0
+:10004000E0003507F507E502F582E503F583E504F1
+:10005000F500E505F50122000000000000000000A9
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+int f(int i)
+{
+ int k = 0;
+ if (i == 0)
+ k = i == 0;
+ return k;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+int f(int i)
+{
+ int k = 0;
+ if (i == 0)
+ k = i == 0;
+ return k;
+}
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F519D0E0F51AE510F5184D
+:10002000750C00750D00750E00750F0075000075DC
+:100030000100750900750A00750B00C3E500F5F0B5
+:10004000E51F95F0F500E500F5F0E50B45F0F50B43
+:10005000C3E501F5F0E51E95F0F500E500F5F0E5E6
+:100060000B45F0F50BC3E509F5F0E51D95F0F5003E
+:10007000E500F5F0E50B45F0F50BC3E50AF5F0E515
+:100080001C95F0F500E500F5F0E50B45F0F50B7576
+:100090000000750100750900E50BF510750B01C333
+:1000A000750A00E510F5F0E50A95F0F50A750A0005
+:1000B000E50AF5F0E50A35F0F50AE50AF5F0E50B95
+:1000C00065F0F50BC3750A00E500F5F0E50A95F05B
+:1000D000F50A750A00E50AF5F0E50A35F0F50AE5D6
+:1000E0000AF5F0E50B65F0F50BC3750A00E501F5BF
+:1000F000F0E50A95F0F50A750A00E50AF5F0E50A5B
+:1001000035F0F50AE50AF5F0E50B65F0F50BC3757A
+:100110000A00E509F5F0E50A95F0F50A750A00E52B
+:100120000AF5F0E50A35F0F50AE50AF5F0E50B65A4
+:10013000F0F50B750000750100750900750A00E502
+:100140000BF5F0E50A45F0F50AE500F5F0E50A459E
+:10015000F0F50AE501F5F0E50A45F0F50AE509F5DF
+:10016000F0E50A45F0F50AE50A700280030201ACE9
+:1001700000E50CF502E50DF503E50EF504E50FF5D8
+:1001800005E518F510E51AC0E0E519C0E075E004D2
+:100190002506F50675E0003507F507E502F582E569
+:1001A00003F583E504F500E505F50122007500007F
+:1001B000750100750900750A00750C00C3E500F5AE
+:1001C000F0E51F95F0F500E500F5F0E50C45F0F5DC
+:1001D0000CC3E501F5F0E51E95F0F500E500F5F03E
+:1001E000E50C45F0F50CC3E509F5F0E51D95F0F5D6
+:1001F00000E500F5F0E50C45F0F50CC3E50AF5F077
+:10020000E51C95F0F500E500F5F0E50C45F0F50C82
+:10021000750D00750E00750F00E50CF500750C01ED
+:10022000C3750100E500F5F0E50195F0F5017501F4
+:1002300000E501F5F0E50135F0F501E501F5F0E542
+:100240000C65F0F50CC3750100E50DF5F0E50195C1
+:10025000F0F501750100E501F5F0E50135F0F50176
+:10026000E501F5F0E50C65F0F50CC3750100E50E50
+:10027000F5F0E50195F0F501750100E501F5F0E512
+:100280000135F0F501E501F5F0E50C65F0F50CC37D
+:10029000750100E50FF5F0E50195F0F50175010038
+:1002A000E501F5F0E50135F0F501E501F5F0E50CC6
+:1002B00065F0F50C750D00750E00750F00020171EB
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdelete-null-pointer-checks" } */
+int t(int *a)
+{
+ int i;
+ *a = 1;
+ i = a == 0;
+ return i;
+}
+
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdelete-null-pointer-checks" } */
+int t(int *a)
+{
+ int i;
+ *a = 1;
+ i = a == 0;
+ return i;
+}
+
--- /dev/null
+:1000000000E506758202C39582F506E50775830053
+:100010009583F507D0E0F518D0E0F519E512F50D58
+:10002000E511F50EE510F50F750901750A00750B60
+:1000300000750C00750100C3750000E501F5F0E5E1
+:100040001F35F0F501E500F5F0E51E35F0F500E5AA
+:1000500009F503E500F502E501F582E502F583E522
+:1000600003F0750101C3750000E501F5F0E51F35EA
+:10007000F0F501E500F5F0E51E35F0F500E50AF5CF
+:1000800003E500F502E501F582E502F583E503F0FD
+:10009000750102C3750000E501F5F0E51F35F0F5C7
+:1000A00001E500F5F0E51E35F0F500E50BF503E59B
+:1000B00000F502E501F582E502F583E503F075013F
+:1000C00003C3750000E501F5F0E51F35F0F501E526
+:1000D00000F5F0E51E35F0F500E50CF503E500F55B
+:1000E00002E501F582E502F583E503F07509007587
+:1000F0000A00E51FF500E51EF501750C00C3E509D2
+:10010000F5F0E50095F0F500E500F5F0E50C45F0BB
+:10011000F50CC3E50AF5F0E50195F0F500E500F50D
+:10012000F0E50C45F0F50C750100750900750A0045
+:10013000E50CF500750C01C3750B00E500F5F0E565
+:100140000B95F0F50B750B00E50BF5F0E50B35F0B5
+:10015000F50BE50BF5F0E50C65F0F50CC3750B0040
+:10016000E501F5F0E50B95F0F50B750B00E50BF5EA
+:10017000F0E50B35F0F50BE50BF5F0E50C65F0F56A
+:100180000CC3750B00E509F5F0E50B95F0F50B7563
+:100190000B00E50BF5F0E50B35F0F50BE50BF5F095
+:1001A000E50C65F0F50CC3750B00E50AF5F0E50B01
+:1001B00095F0F50B750B00E50BF5F0E50B35F0F55B
+:1001C0000BE50BF5F0E50C65F0F50C750100750914
+:1001D00000750A00E50CF502E501F503E509F504F3
+:1001E000E50AF505E50DF512E50EF511E50FF5103B
+:1001F000E519C0E0E518C0E075E0022506F50675D2
+:10020000E0003507F507E502F582E503F583E5042F
+:10021000F500E505F50122000000000000000000E7
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+void abort(void) __attribute__((__noreturn__));
+typedef struct {
+ int container;
+} edge_iterator;
+struct ls_expr
+{
+ int index;
+ int stores;
+ struct ls_expr * next;
+};
+struct ls_expr * pre_ldst_mems;
+edge_iterator ei;
+void
+store_motion (void)
+{
+ struct ls_expr * ptr, **prev_next_ptr_ptr;
+ edge_iterator ei1;
+ edge_iterator ei2;
+ int a = ptr != ((void *)0);
+ for (ptr = pre_ldst_mems, prev_next_ptr_ptr = &pre_ldst_mems;
+ ptr != ((void *)0);
+ ptr = *prev_next_ptr_ptr)
+ if (!((ptr)->stores))
+ *prev_next_ptr_ptr = ptr->next;
+ else
+ prev_next_ptr_ptr = &ptr->next;
+
+ for (ptr = pre_ldst_mems; ptr != 0; ptr = ptr->next)
+ ;
+ ei1 = ei;
+ ei2 = ei1;
+ if (!ei2.container)
+ abort ();
+ ei2 = ei1;
+ if (!ei2.container)
+ abort ();
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+void abort(void) __attribute__((__noreturn__));
+typedef struct {
+ int container;
+} edge_iterator;
+struct ls_expr
+{
+ int index;
+ int stores;
+ struct ls_expr * next;
+};
+struct ls_expr * pre_ldst_mems;
+edge_iterator ei;
+void
+store_motion (void)
+{
+ struct ls_expr * ptr, **prev_next_ptr_ptr;
+ edge_iterator ei1;
+ edge_iterator ei2;
+ int a = ptr != ((void *)0);
+ for (ptr = pre_ldst_mems, prev_next_ptr_ptr = &pre_ldst_mems;
+ ptr != ((void *)0);
+ ptr = *prev_next_ptr_ptr)
+ if (!((ptr)->stores))
+ *prev_next_ptr_ptr = ptr->next;
+ else
+ prev_next_ptr_ptr = &ptr->next;
+
+ for (ptr = pre_ldst_mems; ptr != 0; ptr = ptr->next)
+ ;
+ ei1 = ei;
+ ei2 = ei1;
+ if (!ei2.container)
+ abort ();
+ ei2 = ei1;
+ if (!ei2.container)
+ abort ();
+}
--- /dev/null
+:100000000000E50675820CC39582F506E507758349
+:10001000009583F507D0E0F50875E0092506F5821F
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000082506F58275E0003507F583E508F075BB
+:10004000E00B2506F58275E0003507F583E511F034
+:1000500075E00A2506F58275E0003507F583E510A1
+:10006000F0C3C3900000E582F509900000E583F538
+:100070000A750100C3750000E501F5F0E50935F0EA
+:10008000F501E500F5F0E50A35F0F500E500F502CB
+:10009000E501F582E502F583E0F50E750101C37512
+:1000A0000000E501F5F0E50935F0F501E500F5F0B2
+:1000B000E50A35F0F500E500F502E501F582E50217
+:1000C000F583E0F50F900000E582F510900000E563
+:1000D00083F511750100750900750000C3E501F590
+:1000E000F0E50E95F0F501E501F5F0E50045F0F5D8
+:1000F00000C3E509F5F0E50F95F0F501E501F5F030
+:10010000E50045F0F500750100750900750A0075F8
+:100110000C01C3750B00E500F5F0E50B95F0F50B50
+:10012000750B00E50BF5F0E50B35F0F50BE50BF580
+:10013000F0E50C65F0F50CC3750B00E501F5F0E595
+:100140000B95F0F50B750B00E50BF5F0E50B35F0B5
+:10015000F50BE50BF5F0E50C65F0F50CC3750B0040
+:10016000E509F5F0E50B95F0F50B750B00E50BF5E2
+:10017000F0E50B35F0F50BE50BF5F0E50C65F0F56A
+:100180000CC3750B00E50AF5F0E50B95F0F50B7562
+:100190000B00E50BF5F0E50B35F0F50BE50BF5F095
+:1001A000E50C65F0F50C750100750900750A007520
+:1001B0000000E50CF5F0E50045F0F500E501F5F08F
+:1001C000E50045F0F500E509F5F0E50045F0F5003E
+:1001D000E50AF5F0E50045F0F500E5007002800362
+:1001E0000204C500750104C3750000E501F5F0E5E2
+:1001F0000E35F0F509E500F5F0E50F35F0F50A7577
+:100200000100C3750000E501F5F0E50935F0F501E1
+:10021000E500F5F0E50A35F0F500E500F502E50149
+:10022000F582E502F583E0F50B750101C375000069
+:10023000E501F5F0E50935F0F501E500F5F0E50A31
+:1002400035F0F500E500F502E501F582E502F583FC
+:10025000E0F50C750102C3750000E501F5F0E50954
+:1002600035F0F501E500F5F0E50A35F0F500E500BB
+:10027000F502E501F582E502F583E0F50D75010370
+:10028000C3750000E501F5F0E50935F0F501E5007D
+:10029000F5F0E50A35F0F500E500F502E501F58237
+:1002A000E502F583E0F500750901C3750100E50B72
+:1002B000F5F0E50195F0F501750100E501F5F0E5D2
+:1002C0000135F0F501E501F5F0E50965F0F509C343
+:1002D000750100E50CF5F0E50195F0F501750100FB
+:1002E000E501F5F0E50135F0F501E501F5F0E50989
+:1002F00065F0F509C3750100E50DF5F0E50195F030
+:10030000F501750100E501F5F0E50135F0F501E5D0
+:1003100001F5F0E50965F0F509C3750100E500F5A3
+:10032000F0E50195F0F501750100E501F5F0E50155
+:1003300035F0F501E501F5F0E50965F0F509750120
+:1003400000750A00750B00750000E509F5F0E50081
+:1003500045F0F500E501F5F0E50045F0F500E50AAA
+:10036000F5F0E50045F0F500E50BF5F0E50045F0AA
+:10037000F500E500700280030203EE00750108C37A
+:10038000750000E501F5F0E50E35F0F510E500F536
+:10039000F0E50F35F0F511750100C3750000E501BA
+:1003A000F5F0E51035F0F501E500F5F0E51135F073
+:1003B000F500E500F502E501F582E502F583E0F5DB
+:1003C0000E750101C3750000E501F5F0E51035F08B
+:1003D000F501E500F5F0E51135F0F500E500F50271
+:1003E000E501F582E502F583E0F50F0200D3007523
+:1003F0000108C3750000E501F5F0E50E35F0F501E3
+:10040000E500F5F0E50F35F0F500E501F509E5004B
+:10041000F50A750100C3750000E501F5F0E5093541
+:10042000F0F501E500F5F0E50A35F0F500E500F539
+:1004300002E501F582E502F583E0F50B750101C3E4
+:10044000750000E501F5F0E50935F0F501E500F589
+:10045000F0E50A35F0F500E500F502E501F582E585
+:1004600002F583E0F509750100C3750000E501F5AB
+:10047000F0E51035F0F501E500F5F0E51135F0F5A2
+:1004800000E50BF503E500F502E501F582E502F56F
+:1004900083E503F0750101C3750000E501F5F0E5A2
+:1004A0001035F0F501E500F5F0E51135F0F500E562
+:1004B00009F503E500F502E501F582E502F583E5BE
+:1004C00003F002039700900000E582F50990000018
+:1004D000E583F50A750100C3750000E501F5F0E557
+:1004E0000935F0F501E500F5F0E50A35F0F500E530
+:1004F00000F502E501F582E502F583E0F50E7501F0
+:1005000001C3750000E501F5F0E50935F0F501E5F9
+:1005100000F5F0E50A35F0F500E500F502E501F536
+:1005200082E502F583E0F50F75010075090075009D
+:1005300000C3E501F5F0E50E95F0F501E501F5F0F4
+:10054000E50045F0F500C3E509F5F0E50F95F0F598
+:1005500001E501F5F0E50045F0F5007501007509CC
+:1005600000750A00750C01C3750B00E500F5F0E598
+:100570000B95F0F50B750B00E50BF5F0E50B35F081
+:10058000F50BE50BF5F0E50C65F0F50CC3750B000C
+:10059000E501F5F0E50B95F0F50B750B00E50BF5B6
+:1005A000F0E50B35F0F50BE50BF5F0E50C65F0F536
+:1005B0000CC3750B00E509F5F0E50B95F0F50B752F
+:1005C0000B00E50BF5F0E50B35F0F50BE50BF5F061
+:1005D000E50C65F0F50CC3750B00E50AF5F0E50BCD
+:1005E00095F0F50B750B00E50BF5F0E50B35F0F527
+:1005F0000BE50BF5F0E50C65F0F50C7501007509E0
+:1006000000750A00750000E50CF5F0E50045F0F511
+:1006100000E501F5F0E50045F0F500E509F5F0E548
+:100620000045F0F500E50AF5F0E50045F0F500E5D8
+:1006300000700280030206B300750108C375000054
+:10064000E501F5F0E50E35F0F501E500F5F0E50F13
+:1006500035F0F500E501F509E500F50A750100C37F
+:10066000750000E501F5F0E50935F0F501E500F567
+:10067000F0E50A35F0F500E500F502E501F582E563
+:1006800002F583E0F50E750101C3750000E501F583
+:10069000F0E50935F0F501E500F5F0E50A35F0F58E
+:1006A00000E500F502E501F582E502F583E0F50FCE
+:1006B00002052800E506F509E507F50A750100C3FE
+:1006C000750000E501F5F0E50935F0F501E500F507
+:1006D000F0E50A35F0F509750A00C3750000E50A72
+:1006E000F5F0E50135F0F50EE500F5F0E50935F03A
+:1006F000F50F900002E582F509900002E583F50A06
+:10070000750100C3750000E501F5F0E50935F0F568
+:1007100001E500F5F0E50A35F0F500E501F509E53C
+:1007200000F50A750100C3750000E501F5F0E50963
+:1007300035F0F501E500F5F0E50A35F0F500E500E6
+:10074000F502E501F582E502F583E0F50B7501019F
+:10075000C3750000E501F5F0E50935F0F501E500A8
+:10076000F5F0E50A35F0F500E500F502E501F58262
+:10077000E502F583E0F50C750102C3750000E501A3
+:10078000F5F0E50935F0F501E500F5F0E50A35F09D
+:10079000F500E500F502E501F582E502F583E0F5F7
+:1007A0000D750103C3750000E501F5F0E50935F0AD
+:1007B000F501E500F5F0E50A35F0F500E500F50294
+:1007C000E501F582E502F583E0F509750100C375E1
+:1007D0000000E501F5F0E50E35F0F501E500F5F076
+:1007E000E50F35F0F500E50BF503E500F502E50151
+:1007F000F582E502F583E503F0750101C37500009C
+:10080000E501F5F0E50E35F0F501E500F5F0E50F51
+:1008100035F0F500E50CF503E500F502E501F5829C
+:10082000E502F583E503F0750102C3750000E501FB
+:10083000F5F0E50E35F0F501E500F5F0E50F35F0E2
+:10084000F500E50DF503E500F502E501F582E502A9
+:10085000F583E503F0750103C3750000E501F5F0CC
+:10086000E50E35F0F501E500F5F0E50F35F0F500A2
+:10087000E509F503E500F502E501F582E502F583FA
+:10088000E503F0E506F509E507F50A750104C3750A
+:100890000000E501F5F0E50935F0F501E500F5F0BA
+:1008A000E50A35F0F509750A00C3750000E50AF59B
+:1008B000F0E50135F0F50EE500F5F0E50935F0F568
+:1008C0000FE506F509E507F50A750100C375000097
+:1008D000E501F5F0E50935F0F501E500F5F0E50A8B
+:1008E00035F0F50A750900C3750000E509F5F0E576
+:1008F0000135F0F501E500F5F0E50A35F0F500E524
+:1009000001F509E500F50A750100C3750000E50170
+:10091000F5F0E50935F0F501E500F5F0E50A35F00B
+:10092000F500E500F502E501F582E502F583E0F565
+:100930000B750101C3750000E501F5F0E50935F01F
+:10094000F501E500F5F0E50A35F0F500E500F50202
+:10095000E501F582E502F583E0F50C750102C3754A
+:100960000000E501F5F0E50935F0F501E500F5F0E9
+:10097000E50A35F0F500E500F502E501F582E5024E
+:10098000F583E0F50D750103C3750000E501F5F091
+:10099000E50935F0F501E500F5F0E50A35F0F5007B
+:1009A000E500F502E501F582E502F583E0F509755C
+:1009B0000100C3750000E501F5F0E50E35F0F50125
+:1009C000E500F5F0E50F35F0F500E50BF503E50082
+:1009D000F502E501F582E502F583E503F075010115
+:1009E000C3750000E501F5F0E50E35F0F501E50011
+:1009F000F5F0E50F35F0F500E50CF503E500F5023F
+:100A0000E501F582E502F583E503F0750102C375A2
+:100A10000000E501F5F0E50E35F0F501E500F5F033
+:100A2000E50F35F0F500E50DF503E500F502E5010C
+:100A3000F582E502F583E503F0750103C375000057
+:100A4000E501F5F0E50E35F0F501E500F5F0E50F0F
+:100A500035F0F500E509F503E500F502E501F5825D
+:100A6000E502F583E503F0E506F509E507F50A7506
+:100A70000104C3750000E501F5F0E50935F0F50165
+:100A8000E500F5F0E50A35F0F50A750900C37500D3
+:100A900000E509F5F0E50135F0F501E500F5F0E5D3
+:100AA0000A35F0F500E501F509E500F50A750100E4
+:100AB000C3750000E501F5F0E50935F0F501E50045
+:100AC000F5F0E50A35F0F500E500F502E501F582FF
+:100AD000E502F583E0F50B750101C3750000E50142
+:100AE000F5F0E50935F0F501E500F5F0E50A35F03A
+:100AF000F500E500F502E501F582E502F583E0F594
+:100B00000C750102C3750000E501F5F0E50935F04B
+:100B1000F501E500F5F0E50A35F0F500E500F50230
+:100B2000E501F582E502F583E0F50D750103C37576
+:100B30000000E501F5F0E50935F0F501E500F5F017
+:100B4000E50A35F0F500E500F502E501F582E5027C
+:100B5000F583E0F500750901C3750100E50BF5F0BB
+:100B6000E50195F0F501750100E501F5F0E50135C8
+:100B7000F0F501E501F5F0E50965F0F509C375014A
+:100B800000E50CF5F0E50195F0F501750100E501D2
+:100B9000F5F0E50135F0F501E501F5F0E50965F061
+:100BA000F509C3750100E50DF5F0E50195F0F501D6
+:100BB000750100E501F5F0E50135F0F501E501F518
+:100BC000F0E50965F0F509C3750100E500F5F0E50C
+:100BD0000195F0F501750100E501F5F0E50135F04D
+:100BE000F501E501F5F0E50965F0F5097501007518
+:100BF0000A00750B00750000E509F5F0E50045F009
+:100C0000F500E501F5F0E50045F0F500E50AF5F041
+:100C1000E50045F0F500E50BF5F0E50045F0F500E1
+:100C2000E5007002800302105300E506F509E507B0
+:100C3000F50A750104C3750000E501F5F0E5093515
+:100C4000F0F501E500F5F0E50A35F0F509750A0063
+:100C5000C3750000E50AF5F0E50135F0F50EE50095
+:100C6000F5F0E50935F0F50FE506F509E507F50AB4
+:100C7000750100C3750000E501F5F0E50935F0F5F3
+:100C800001E500F5F0E50A35F0F50A750900C375D0
+:100C90000000E509F5F0E50135F0F501E500F5F0B6
+:100CA000E50A35F0F500E501F509E500F50A7501FD
+:100CB00000C3750000E501F5F0E50935F0F501E543
+:100CC00000F5F0E50A35F0F500E500F502E501F57F
+:100CD00082E502F583E0F50B750101C3750000E5BF
+:100CE00001F5F0E50935F0F501E500F5F0E50A3527
+:100CF000F0F500E500F502E501F582E502F583E097
+:100D0000F50C750102C3750000E501F5F0E5093544
+:100D1000F0F501E500F5F0E50A35F0F500E500F540
+:100D200002E501F582E502F583E0F50D750103C3E7
+:100D3000750000E501F5F0E50935F0F501E500F590
+:100D4000F0E50A35F0F500E500F502E501F582E58C
+:100D500002F583E0F509750100C3750000E501F5B2
+:100D6000F0E50E35F0F501E500F5F0E50F35F0F5AD
+:100D700000E50BF503E500F502E501F582E502F576
+:100D800083E503F0750101C3750000E501F5F0E5A9
+:100D90000E35F0F501E500F5F0E50F35F0F500E56D
+:100DA0000CF503E500F502E501F582E502F583E5C2
+:100DB00003F0750102C3750000E501F5F0E50E359D
+:100DC000F0F501E500F5F0E50F35F0F500E50DF57E
+:100DD00003E500F502E501F582E502F583E503F0A0
+:100DE000750103C3750000E501F5F0E50E35F0F57A
+:100DF00001E500F5F0E50F35F0F500E509F503E54F
+:100E000000F502E501F582E502F583E503F0E5066C
+:100E1000F509E507F50A750104C3750000E501F55C
+:100E2000F0E50935F0F501E500F5F0E50A35F0F5F6
+:100E30000A750900C3750000E509F5F0E50135F014
+:100E4000F501E500F5F0E50A35F0F500E501F509F5
+:100E5000E500F50A750100C3750000E501F5F0E550
+:100E60000935F0F501E500F5F0E50A35F0F500E5A6
+:100E700000F502E501F582E502F583E0F50B750169
+:100E800001C3750000E501F5F0E50935F0F501E570
+:100E900000F5F0E50A35F0F500E500F502E501F5AD
+:100EA00082E502F583E0F50C750102C3750000E5EB
+:100EB00001F5F0E50935F0F501E500F5F0E50A3555
+:100EC000F0F500E500F502E501F582E502F583E0C5
+:100ED000F50D750103C3750000E501F5F0E5093571
+:100EE000F0F501E500F5F0E50A35F0F500E500F56F
+:100EF00002E501F582E502F583E0F500750901C31D
+:100F0000750100E50BF5F0E50195F0F501750100BF
+:100F1000E501F5F0E50135F0F501E501F5F0E5094C
+:100F200065F0F509C3750100E50CF5F0E50195F0F4
+:100F3000F501750100E501F5F0E50135F0F501E594
+:100F400001F5F0E50965F0F509C3750100E50DF55A
+:100F5000F0E50195F0F501750100E501F5F0E50119
+:100F600035F0F501E501F5F0E50965F0F509C37522
+:100F70000100E500F5F0E50195F0F501750100E5EA
+:100F800001F5F0E50135F0F501E501F5F0E509655C
+:100F9000F0F509750100750A00750B00750000E594
+:100FA00009F5F0E50045F0F500E501F5F0E500454F
+:100FB000F0F500E50AF5F0E50045F0F500E50BF584
+:100FC000F0E50045F0F500E5007002800302104FE7
+:100FD00000750000E500F502E500F503E500F50405
+:100FE000E500F50575E00B2506F58275E00035078F
+:100FF000F583E0F51175E00A2506F58275E0003508
+:1010000007F583E0F51075E0082506F58275E00028
+:101010003507F583E0F508E508C0E075E009250629
+:10102000F58275E0003507F583E0F508E508C0E0D6
+:1010300075E00C2506F50675E0003507F507E502B5
+:10104000F582E503F583E504F500E505F5012200E9
+:10105000020FD100020C2A00000000000000000076
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* This was an ICE in fold where we tried to fold something like,
+
+ a = 0 == 0 ? 0 : 3988292384
+
+ after doing if-conversion for the vectorizer. Folding "0 == 0"
+ should have been done before calling fold on the whole rhs of
+ the above expression. */
+
+/* { dg-do compile } */
+/* { dg-options "-O3 -ftree-vectorize" } */
+
+static unsigned short int crc_table[256];
+void AC3_encode_init(void)
+{
+ unsigned int c, n, k;
+ for(n=0; n<256; n++)
+ {
+ c = n << 8;
+ for (k = 0; k < 8; k++)
+ {
+ if (c & (1 << 15))
+ c = ((c << 1) & 0xffff) ^ (((1 << 0) | (1 << 2) | (1 << 15) | (1 << 16)) & 0xffff);
+ }
+ crc_table[n] = c;
+ }
+}
--- /dev/null
+/* This was an ICE in fold where we tried to fold something like,
+
+ a = 0 == 0 ? 0 : 3988292384
+
+ after doing if-conversion for the vectorizer. Folding "0 == 0"
+ should have been done before calling fold on the whole rhs of
+ the above expression. */
+
+/* { dg-do compile } */
+/* { dg-options "-O3 -ftree-vectorize" } */
+
+static unsigned short int crc_table[256];
+void AC3_encode_init(void)
+{
+ unsigned int c, n, k;
+ for(n=0; n<256; n++)
+ {
+ c = n << 8;
+ for (k = 0; k < 8; k++)
+ {
+ if (c & (1 << 15))
+ c = ((c << 1) & 0xffff) ^ (((1 << 0) | (1 << 2) | (1 << 15) | (1 << 16)) & 0xffff);
+ }
+ crc_table[n] = c;
+ }
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wextra" } */
+void foo (void)
+{
+ if (0)
+ a: ; /* { dg-warning "empty body in an if-statement" } */
+
+
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wextra" } */
+void foo (void)
+{
+ if (0)
+ a: ; /* { dg-warning "empty body in an if-statement" } */
+
+
+}
--- /dev/null
+:1000000000D0E0F500D0E0F50D750900750A007527
+:100010000B00750C00750100E509F5F0E50145F0F0
+:10002000F501E50AF5F0E50145F0F501E50BF5F020
+:10003000E50145F0F501E50CF5F0E50145F0F501C8
+:10004000E5017002800302007600750100E501F50C
+:1000500002E501F503E501F504E501F505E50DC04F
+:10006000E0E500C0E0E502F582E503F583E504F58F
+:1000700000E505F50122000002004A000000000032
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Regression test for PR middle-end/23584 */
+/* Verify that dereferencing an absolute address inside of a function
+ makes that function impure. */
+
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-ipa-pure-const" } */
+
+int test1 (void)
+{
+ return * (volatile int *) 0x1234;
+}
+
+int test2 (void)
+{
+ int local = * (volatile int *) 0x1234;
+ return local;
+}
+
+/* { dg-final { scan-ipa-dump-not "found to be pure: test1" "pure-const" } } */
+/* { dg-final { scan-ipa-dump-not "found to be pure: test2" "pure-const" } } */
+/* { dg-final { cleanup-ipa-dump "pure-const" } } */
--- /dev/null
+/* Regression test for PR middle-end/23584 */
+/* Verify that dereferencing an absolute address inside of a function
+ makes that function impure. */
+
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-ipa-pure-const" } */
+
+int test1 (void)
+{
+ return * (volatile int *) 0x1234;
+}
+
+int test2 (void)
+{
+ int local = * (volatile int *) 0x1234;
+ return local;
+}
+
+/* { dg-final { scan-ipa-dump-not "found to be pure: test1" "pure-const" } } */
+/* { dg-final { scan-ipa-dump-not "found to be pure: test2" "pure-const" } } */
+/* { dg-final { cleanup-ipa-dump "pure-const" } } */
--- /dev/null
+:1000000000D0E0F518D0E0F519E511F50EE510F592
+:100010000F750934750A12750100C3750000E501FA
+:10002000F5F0E50935F0F501E500F5F0E50A35F004
+:10003000F500E500F502E501F582E502F583E0F55E
+:100040000B750101C3750000E501F5F0E50935F018
+:10005000F501E500F5F0E50A35F0F500E500F502FB
+:10006000E501F582E502F583E0F50C750102C37543
+:100070000000E501F5F0E50935F0F501E500F5F0E2
+:10008000E50A35F0F500E500F502E501F582E50247
+:10009000F583E0F50D750103C3750000E501F5F08A
+:1000A000E50935F0F501E500F5F0E50A35F0F50074
+:1000B000E500F502E501F582E502F583E0F500E5EE
+:1000C0000BF502E50CF503E50DF504E500F505E596
+:1000D0000EF511E50FF510E519C0E0E518C0E0E5F3
+:1000E00002F582E503F583E504F500E505F5012257
+:1000F00000D0E0F518D0E0F519E511F50EE510F5A2
+:100100000F750934750A12750100C3750000E50109
+:10011000F5F0E50935F0F501E500F5F0E50A35F013
+:10012000F500E500F502E501F582E502F583E0F56D
+:100130000B750101C3750000E501F5F0E50935F027
+:10014000F501E500F5F0E50A35F0F500E500F5020A
+:10015000E501F582E502F583E0F50C750102C37552
+:100160000000E501F5F0E50935F0F501E500F5F0F1
+:10017000E50A35F0F500E500F502E501F582E50256
+:10018000F583E0F50D750103C3750000E501F5F099
+:10019000E50935F0F501E500F5F0E50A35F0F50083
+:1001A000E500F502E501F582E502F583E0F500E5FD
+:1001B0000BF502E50CF503E50DF504E500F505E5A5
+:1001C0000EF511E50FF510E519C0E0E518C0E0E502
+:1001D00002F582E503F583E504F500E505F5012266
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test case for PR23625 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-vectorize -ftree-loop-linear" } */
+
+typedef long INT32;
+void find_best_colors ()
+{
+int ic0, ic1, ic2;
+INT32 * bptr;
+INT32 dist1;
+INT32 dist2;
+INT32 xx1;
+for (ic0 = (1<<(5 -3))-1;ic0 >= 0;ic0--)
+{
+ for (ic1 = (1<<(6 -3))-1;ic1 >= 0;ic1--)
+ {
+ dist2 = dist1;
+ for (ic2 = (1<<(5 -3))-1;ic2 >= 0;ic2--)
+ {
+ *bptr = dist2;
+ bptr++;
+ }
+ dist1 += xx1;
+ }
+}
+}
+
--- /dev/null
+/* Test case for PR23625 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-vectorize -ftree-loop-linear" } */
+
+typedef long INT32;
+void find_best_colors ()
+{
+int ic0, ic1, ic2;
+INT32 * bptr;
+INT32 dist1;
+INT32 dist2;
+INT32 xx1;
+for (ic0 = (1<<(5 -3))-1;ic0 >= 0;ic0--)
+{
+ for (ic1 = (1<<(6 -3))-1;ic1 >= 0;ic1--)
+ {
+ dist2 = dist1;
+ for (ic2 = (1<<(5 -3))-1;ic2 >= 0;ic2--)
+ {
+ *bptr = dist2;
+ bptr++;
+ }
+ dist1 += xx1;
+ }
+}
+}
+
--- /dev/null
+:1000000000E506758212C39582F506E50775830043
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F075E0E3
+:10004000092506F58275E0003507F583E517F0759B
+:10005000E0082506F58275E0003507F583E516F022
+:1000600075E0072506F58275E0003507F583E5158F
+:10007000F075E0062506F58275E0003507F583E5A5
+:1000800014F075E0052506F58275E0003507F58367
+:10009000E513F075E0042506F58275E0003507F5F7
+:1000A00083E512F075E0032506F58275E00035075B
+:1000B000F583E511F075E0022506F58275E000355F
+:1000C00007F583E510F0E51FF500E51EF501E51DD8
+:1000D000F509E51CF50AE51BF51EE519F516E51809
+:1000E000F51FE500F50FE501F510E509F511E50A45
+:1000F000F512751900751500751300751D00E51DC5
+:10010000F50EE51FF50D750080E500F5F0E50E250F
+:10011000F0F50EE500F5F0E50D25F0F50D750C0098
+:10012000751400751700751800750B00750A0175B8
+:100130000001C3E50DF5F0E50E95F0F509E50BF5C9
+:10014000F0E50B35F0F509E509F5F0E50055F0F5BA
+:1001500000E500F5F0E50C45F0F50C750001C3E590
+:100160000DF5F0E50E95F0F509E50BF5F0E50B352D
+:10017000F0F509E50EF5F0E50D95F0F501E50BF567
+:10018000F0E50B35F0F501E501F5F0E50945F0F591
+:1001900009E50AF5F0E50965F0F509E509F5F0E589
+:1001A0000055F0F500C3E516F5F0E51395F0F509F7
+:1001B000E50BF5F0E50B35F0F509E509F5F0E5009F
+:1001C00055F0F500E500F5F0E50C45F0F50C75008F
+:1001D00001C3E50DF5F0E50E95F0F509E50BF5F039
+:1001E000E50B35F0F509E50EF5F0E50D95F0F501B7
+:1001F000E50BF5F0E50B35F0F501E501F5F0E50966
+:1002000045F0F509E50AF5F0E50965F0F509E509B8
+:10021000F5F0E50055F0F500C3E516F5F0E51395AA
+:10022000F0F509E50BF5F0E50B35F0F509E513F50B
+:10023000F0E51695F0F501E50BF5F0E50B35F0F579
+:1002400001E501F5F0E50945F0F509E50AF5F0E508
+:100250000965F0F509E509F5F0E50055F0F500C38D
+:10026000E51AF5F0E51595F0F509E50BF5F0E50B68
+:1002700035F0F509E509F5F0E50055F0F500E50084
+:10028000F5F0E50C45F0F50C750001C3E50DF5F052
+:10029000E50E95F0F509E50BF5F0E50B35F0F50900
+:1002A000E50EF5F0E50D95F0F501E50BF5F0E50B44
+:1002B00035F0F501E501F5F0E50945F0F509E50A48
+:1002C000F5F0E50965F0F509E509F5F0E50055F00B
+:1002D000F500C3E516F5F0E51395F0F509E50BF526
+:1002E000F0E50B35F0F509E513F5F0E51695F0F5B9
+:1002F00001E50BF5F0E50B35F0F501E501F5F0E56D
+:100300000945F0F509E50AF5F0E50965F0F509E5B7
+:1003100009F5F0E50055F0F500C3E51AF5F0E5152F
+:1003200095F0F509E50BF5F0E50B35F0F509E51568
+:10033000F5F0E51A95F0F501E50BF5F0E50B35F074
+:10034000F501E501F5F0E50945F0F509E50AF5F0F7
+:10035000E50965F0F509E509F5F0E50055F0F5006A
+:10036000C3E51EF5F0E51995F0F509E50BF5F0E5A7
+:100370000B35F0F509E509F5F0E50055F0F500E578
+:1003800000F5F0E50C45F0F50CE50CF50AE514F583
+:1003900000E517F501E518F509E50AF50C750B01FF
+:1003A000C3750A00E50CF5F0E50A95F0F50A750A43
+:1003B00000E50AF5F0E50A35F0F50AE50AF5F0E59D
+:1003C0000B65F0F50BC3750A00E500F5F0E50A953D
+:1003D000F0F50A750A00E50AF5F0E50A35F0F50AC8
+:1003E000E50AF5F0E50B65F0F50BC3750A00E501CC
+:1003F000F5F0E50A95F0F50A750A00E50AF5F0E56D
+:100400000A35F0F50AE50AF5F0E50B65F0F50BC3E2
+:10041000750A00E509F5F0E50A95F0F50A750A0098
+:10042000E50AF5F0E50A35F0F50AE50AF5F0E50B21
+:1004300065F0F50B750100750900750A007500007F
+:10044000E50BF5F0E50045F0F500E501F5F0E50018
+:1004500045F0F500E509F5F0E50045F0F500E50AA1
+:10046000F5F0E50045F0F500E500700280030206B6
+:10047000D700750D02750E00751700751B00E50F8E
+:10048000F500E510F514E511F518E512F51C750FEA
+:1004900000751000751100751200C3750100E500AC
+:1004A000F5F0E50DA4F50CE500F5F0E50DA4E5F09B
+:1004B000F509E50CF5F0E50135F0F501E514F5F089
+:1004C000E50DA4F50CE514F5F0E50DA4E5F0F50A4D
+:1004D000E50CF5F0E50935F0F509E518F5F0E50D61
+:1004E000A4F50CE518F5F0E50DA4E5F0F50BE50C29
+:1004F000F5F0E50A35F0F50AE51CF5F0E50DA4F593
+:100500000CE51CF5F0E50DA4E5F0F50DE50CF5F0B6
+:10051000E50B35F0F50BC3C3750C00E501F5F0E50F
+:100520000F35F0F50FE509F5F0E51035F0F510E5BC
+:100530000AF5F0E51135F0F511E50BF5F0E51235AA
+:10054000F0F512C3750900E500F5F0E50EA4F50C11
+:10055000E500F5F0E50EA4E5F0F50AE50CF5F0E5AB
+:100560000935F0F509E514F5F0E50EA4F50CE514F0
+:10057000F5F0E50EA4E5F0F50BE50CF5F0E50A3530
+:10058000F0F50AE518F5F0E50EA4F50CE518F5F020
+:10059000E50EA4E5F0F50DE50CF5F0E50B35F0F50D
+:1005A0000B750100C3C3750C00E501F5F0E50F35CF
+:1005B000F0F50FE509F5F0E51035F0F510E50AF571
+:1005C000F0E51135F0F511E50BF5F0E51235F0F534
+:1005D00012C3750A00E500F5F0E517A4F50CE50077
+:1005E000F5F0E517A4E5F0F50BE50CF5F0E50A35B7
+:1005F000F0F50AE514F5F0E517A4F50CE514F5F0AF
+:10060000E517A4E5F0F50DE50CF5F0E50B35F0F593
+:100610000B750100750900C3C3750C00E501F5F009
+:10062000E50F35F0F50FE509F5F0E51035F0F510BB
+:10063000E50AF5F0E51135F0F511E50BF5F0E512F9
+:1006400035F0F512C3750B00E500F5F0E51BA4F5D8
+:100650000CE500F5F0E51BA4E5F0F50DE50CF5F073
+:10066000E50B35F0F50B750100750900750A00C33F
+:10067000C3750000E501F5F0E50F35F0F50FE5096C
+:10068000F5F0E51035F0F510E50AF5F0E51135F077
+:10069000F511E50BF5F0E51235F0F5127500017571
+:1006A0000100750900750A00C3750B00E500F5F03F
+:1006B000E51935F0F519E501F5F0E51535F0F51515
+:1006C000E509F5F0E51335F0F513E50AF5F0E51D5C
+:1006D00035F0F51D0200FE00E50FF502E510F5030B
+:1006E000E511F504E512F50575E0092506F58275B5
+:1006F000E0003507F583E0F51775E0082506F5827B
+:1007000075E0003507F583E0F51675E0072506F579
+:100710008275E0003507F583E0F51575E0062506DE
+:10072000F58275E0003507F583E0F51475E00525E1
+:1007300006F58275E0003507F583E0F51375E004F2
+:100740002506F58275E0003507F583E0F51275E0C2
+:10075000032506F58275E0003507F583E0F5117590
+:10076000E0022506F58275E0003507F583E0F51017
+:1007700075E0002506F58275E0003507F583E0F5A4
+:1007800008E508C0E075E0012506F58275E0003552
+:1007900007F583E0F508E508C0E075E0122506F5E9
+:1007A0000675E0003507F507E502F582E503F583F8
+:1007B000E504F500E505F5012200E506758216C39E
+:1007C0009582F506E5077583009583F507D0E0F57A
+:1007D0000875E00D2506F58275E0003507F583E51F
+:1007E00008F0D0E0F50875E00C2506F58275E0000C
+:1007F0003507F583E508F075E0152506F58275E007
+:10080000003507F583E517F075E0142506F58275C8
+:10081000E0003507F583E516F075E0132506F5824F
+:1008200075E0003507F583E515F075E0122506F54E
+:100830008275E0003507F583E514F075E0112506B3
+:10084000F58275E0003507F583E513F075E01025B6
+:1008500006F58275E0003507F583E512F075E00FC7
+:100860002506F58275E0003507F583E511F075E0A2
+:100870000E2506F58275E0003507F583E510F07565
+:100880001F01751E00751D00751C00750E05750C89
+:1008900000750A00750100750D03750B00750900E0
+:1008A000750000C3E50DF5F0E50E95F0F51BE50BC1
+:1008B000F5F0E50C95F0F51AE509F5F0E50A95F087
+:1008C000F519E500F5F0E50195F0F518120000E5E1
+:1008D00082F502E583F503E500F504E501F505E59C
+:1008E00002F50EE503F50CE504F50AE505F50175DD
+:1008F0000D01750B00750900750000C3E50DF5F0DD
+:10090000E50E95F0F50875E00B2506F58275E0001B
+:100910003507F583E508F0E50BF5F0E50C95F0F506
+:100920000875E00A2506F58275E0003507F583E5D0
+:1009300008F0E509F5F0E50A95F0F516E500F5F0A3
+:10094000E50195F0F50875E0062506F58275E000ED
+:100950003507F583E508F075140075100075110072
+:1009600075120075E0062506F58275E0003507F57D
+:1009700083E0F513750080E500F5F0E51325F0F54B
+:1009800013E500F5F0E51225F0F512750C00750D74
+:1009900000750E00750F00750B00750A01750001DA
+:1009A000C3E512F5F0E51395F0F509E50BF5F0E573
+:1009B0000B35F0F509E509F5F0E50055F0F500E532
+:1009C00000F5F0E50C45F0F50C750001C3E512F5F6
+:1009D000F0E51395F0F509E50BF5F0E50B35F0F5CD
+:1009E00009E513F5F0E51295F0F501E50BF5F0E5F5
+:1009F0000B35F0F501E501F5F0E50945F0F509E500
+:100A00000AF5F0E50965F0F509E509F5F0E50055A9
+:100A1000F0F500C3E511F5F0E51695F0F509E50BE5
+:100A2000F5F0E50B35F0F509E509F5F0E50055F0D1
+:100A3000F500E500F5F0E50C45F0F50C750001C397
+:100A4000E512F5F0E51395F0F509E50BF5F0E50B8A
+:100A500035F0F509E513F5F0E51295F0F501E50B34
+:100A6000F5F0E50B35F0F501E501F5F0E50945F0A8
+:100A7000F509E50AF5F0E50965F0F509E509F5F090
+:100A8000E50055F0F500C3E511F5F0E51695F0F534
+:100A900009E50BF5F0E50B35F0F509E516F5F0E5A0
+:100AA0001195F0F501E50BF5F0E50B35F0F501E5F5
+:100AB00001F5F0E50945F0F509E50AF5F0E5096508
+:100AC000F0F509E509F5F0E50055F0F500C3E5108E
+:100AD000F5F075E00A2506F58275E0003507F58327
+:100AE000E0F508E50895F0F509E50BF5F0E50B35BF
+:100AF000F0F509E509F5F0E50055F0F500E500F53C
+:100B0000F0E50C45F0F50C750001C3E512F5F0E5D4
+:100B10001395F0F509E50BF5F0E50B35F0F509E572
+:100B200013F5F0E51295F0F501E50BF5F0E50B3561
+:100B3000F0F501E501F5F0E50945F0F509E50AF5FF
+:100B4000F0E50965F0F509E509F5F0E50055F0F582
+:100B500000C3E511F5F0E51695F0F509E50BF5F0A4
+:100B6000E50B35F0F509E516F5F0E51195F0F50121
+:100B7000E50BF5F0E50B35F0F501E501F5F0E509DC
+:100B800045F0F509E50AF5F0E50965F0F509E5092F
+:100B9000F5F0E50055F0F500C3E510F5F075E00A55
+:100BA0002506F58275E0003507F583E0F508E508D0
+:100BB00095F0F509E50BF5F0E50B35F0F50975E075
+:100BC0000A2506F58275E0003507F583E0F508E5AE
+:100BD00008F5F0E51095F0F501E50BF5F0E50B35BE
+:100BE000F0F501E501F5F0E50945F0F509E50AF54F
+:100BF000F0E50965F0F509E509F5F0E50055F0F5D2
+:100C000000C3E514F5F075E00B2506F58275E000EC
+:100C10003507F583E0F508E50895F0F509E50BF5EE
+:100C2000F0E50B35F0F509E509F5F0E50055F0F5CF
+:100C300000E500F5F0E50C45F0F50CE50CF500E5F8
+:100C40000EF501750C01C3750900E500F5F0E50925
+:100C500095F0F509750900E509F5F0E50935F0F5B8
+:100C600009E509F5F0E50C65F0F50CC3750900E53B
+:100C70000DF5F0E50995F0F509750900E509F5F0C0
+:100C8000E50935F0F509E509F5F0E50C65F0F50C39
+:100C9000C3750900E501F5F0E50995F0F509750959
+:100CA00000E509F5F0E50935F0F509E509F5F0E5A8
+:100CB0000C65F0F50CC3750900E50FF5F0E5099535
+:100CC000F0F509750900E509F5F0E50935F0F509D4
+:100CD000E509F5F0E50C65F0F50C750D00750E00F5
+:100CE000750F00E50DF500E50EF501E50FF5097549
+:100CF0000B01C3750A00E50CF5F0E50A95F0F50A5D
+:100D0000750A00E50AF5F0E50A35F0F50AE50AF599
+:100D1000F0E50B65F0F50BC3750A00E500F5F0E5AD
+:100D20000A95F0F50A750A00E50AF5F0E50A35F0CE
+:100D3000F50AE50AF5F0E50B65F0F50BC3750A0059
+:100D4000E501F5F0E50A95F0F50A750A00E50AF502
+:100D5000F0E50A35F0F50AE50AF5F0E50B65F0F582
+:100D60000BC3750A00E509F5F0E50A95F0F50A757B
+:100D70000A00E50AF5F0E50A35F0F50AE50AF5F0AE
+:100D8000E50B65F0F50B750100750900750A007536
+:100D90000000E50BF5F0E50045F0F500E501F5F0A4
+:100DA000E50045F0F500E509F5F0E50045F0F50052
+:100DB000E50AF5F0E50045F0F500E5007002800376
+:100DC000021CA300751F01751E00751D00751C0017
+:100DD000750E06750C00750A00750100750D03751A
+:100DE0000B00750900750000C3E50DF5F0E50E95E3
+:100DF000F0F51BE50BF5F0E50C95F0F51AE509F5B6
+:100E0000F0E50A95F0F519E500F5F0E50195F0F546
+:100E100018120000E582F502E583F503E500F5040C
+:100E2000E501F505E502F50EE503F50CE504F50A27
+:100E3000E505F501750D01750B00750900750000DC
+:100E4000C3E50DF5F0E50E95F0F50875E00925060A
+:100E5000F58275E0003507F583E508F0E50BF5F060
+:100E6000E50C95F0F517E509F5F0E50A95F0F514B0
+:100E7000E500F5F0E50195F0F50875E0072506F5C4
+:100E80008275E0003507F583E508F07515007510EB
+:100E90000075110075120075E0072506F58275E0F2
+:100EA000003507F583E0F513750080E500F5F0E502
+:100EB0001325F0F513E500F5F0E51225F0F51275B0
+:100EC0000C00750D00750E00750F00750B00750A8E
+:100ED00001750001C3E512F5F0E51395F0F509E59C
+:100EE0000BF5F0E50B35F0F509E509F5F0E50055F2
+:100EF000F0F500E500F5F0E50C45F0F50C750001A6
+:100F0000C3E512F5F0E51395F0F509E50BF5F0E50D
+:100F10000B35F0F509E513F5F0E51295F0F501E56F
+:100F20000BF5F0E50B35F0F501E501F5F0E50945C8
+:100F3000F0F509E50AF5F0E50965F0F509E509F5CB
+:100F4000F0E50055F0F500C3E511F5F0E51495F076
+:100F5000F509E50BF5F0E50B35F0F509E509F5F0D8
+:100F6000E50055F0F500E500F5F0E50C45F0F50C71
+:100F7000750001C3E512F5F0E51395F0F509E50BF1
+:100F8000F5F0E50B35F0F509E513F5F0E51295F010
+:100F9000F501E50BF5F0E50B35F0F501E501F5F0B0
+:100FA000E50945F0F509E50AF5F0E50965F0F5090B
+:100FB000E509F5F0E50055F0F500C3E511F5F0E5BC
+:100FC0001495F0F509E50BF5F0E50B35F0F509E5BD
+:100FD00014F5F0E51195F0F501E50BF5F0E50B35AD
+:100FE000F0F501E501F5F0E50945F0F509E50AF54B
+:100FF000F0E50965F0F509E509F5F0E50055F0F5CE
+:1010000000C3E510F5F0E51795F0F509E50BF5F0EF
+:10101000E50B35F0F509E509F5F0E50055F0F500CB
+:10102000E500F5F0E50C45F0F50C750001C3E5129F
+:10103000F5F0E51395F0F509E50BF5F0E50B35F066
+:10104000F509E513F5F0E51295F0F501E50BF5F07E
+:10105000E50B35F0F501E501F5F0E50945F0F50999
+:10106000E50AF5F0E50965F0F509E509F5F0E500B3
+:1010700055F0F500C3E511F5F0E51495F0F509E537
+:101080000BF5F0E50B35F0F509E514F5F0E51195F4
+:10109000F0F501E50BF5F0E50B35F0F501E501F5AF
+:1010A000F0E50945F0F509E50AF5F0E50965F0F523
+:1010B00009E509F5F0E50055F0F500C3E510F5F098
+:1010C000E51795F0F509E50BF5F0E50B35F0F509B9
+:1010D000E517F5F0E51095F0F501E50BF5F0E50BFA
+:1010E00035F0F501E501F5F0E50945F0F509E50A0A
+:1010F000F5F0E50965F0F509E509F5F0E50055F0CD
+:10110000F500C3E515F5F075E0092506F58275E0F3
+:10111000003507F583E0F508E50895F0F509E50BDE
+:10112000F5F0E50B35F0F509E509F5F0E50055F0CA
+:10113000F500E500F5F0E50C45F0F50CE50CF500E3
+:10114000E50EF501750C01C3750900E500F5F0E544
+:101150000995F0F509750900E509F5F0E50935F09F
+:10116000F509E509F5F0E50C65F0F50CC375090026
+:10117000E50DF5F0E50995F0F509750900E509F5C6
+:10118000F0E50935F0F509E509F5F0E50C65F0F550
+:101190000CC3750900E501F5F0E50995F0F5097551
+:1011A0000900E509F5F0E50935F0F509E509F5F07F
+:1011B000E50C65F0F50CC3750900E50FF5F0E509E0
+:1011C00095F0F509750900E509F5F0E50935F0F543
+:1011D00009E509F5F0E50C65F0F50C750D00750EE7
+:1011E00000750F00E50DF500E50EF501E50FF509B9
+:1011F000750B01C3750A00E50CF5F0E50A95F0F5ED
+:101200000A750A00E50AF5F0E50A35F0F50AE50A7F
+:10121000F5F0E50B65F0F50BC3750A00E500F5F098
+:10122000E50A95F0F50A750A00E50AF5F0E50A35D4
+:10123000F0F50AE50AF5F0E50B65F0F50BC3750A64
+:1012400000E501F5F0E50A95F0F50A750A00E50AF2
+:10125000F5F0E50A35F0F50AE50AF5F0E50B65F07D
+:10126000F50BC3750A00E509F5F0E50A95F0F50AF6
+:10127000750A00E50AF5F0E50A35F0F50AE50AF524
+:10128000F0E50B65F0F50B750100750900750A00B6
+:10129000750000E50BF5F0E50045F0F500E501F51A
+:1012A000F0E50045F0F500E509F5F0E50045F0F55D
+:1012B00000E50AF5F0E50045F0F500E50070028074
+:1012C00003021C0400751F01751E00750F007510C8
+:1012D00000750E05750C00750A00750100750D038B
+:1012E000750B00750900750000C3E50DF5F0E50EFE
+:1012F00095F0F51BE50BF5F0E50C95F0F51AE50911
+:10130000F5F0E50A95F0F519E500F5F0E50195F041
+:10131000F518E50FF51DE510F51C120000E582F546
+:1013200002E583F503E500F504E501F505E502F5C1
+:101330000EE503F50CE504F50AE505F501750D016B
+:10134000750B00750900750000C3E50DF5F0E50E9D
+:1013500095F0F511E50BF5F0E50C95F0F512E509C2
+:10136000F5F0E50A95F0F513E500F5F0E50195F0E7
+:10137000F518751500750D00750E00750F00E51850
+:10138000F510750080E500F5F0E51025F0F510E5A5
+:1013900000F5F0E50F25F0F50F750C0075190075D7
+:1013A0001A00751B00750B00750A01750001C3E575
+:1013B0000FF5F0E51095F0F509E50BF5F0E50B35C7
+:1013C000F0F509E509F5F0E50055F0F500E500F563
+:1013D000F0E50C45F0F50C750001C3E50FF5F0E5FF
+:1013E0001095F0F509E50BF5F0E50B35F0F509E59D
+:1013F00010F5F0E50F95F0F501E50BF5F0E50B358F
+:10140000F0F501E501F5F0E50945F0F509E50AF526
+:10141000F0E50965F0F509E509F5F0E50055F0F5A9
+:1014200000C3E50EF5F0E51395F0F509E50BF5F0D1
+:10143000E50B35F0F509E509F5F0E50055F0F500A7
+:10144000E500F5F0E50C45F0F50C750001C3E50F7E
+:10145000F5F0E51095F0F509E50BF5F0E50B35F045
+:10146000F509E510F5F0E50F95F0F501E50BF5F060
+:10147000E50B35F0F501E501F5F0E50945F0F50975
+:10148000E50AF5F0E50965F0F509E509F5F0E5008F
+:1014900055F0F500C3E50EF5F0E51395F0F509E517
+:1014A0000BF5F0E50B35F0F509E513F5F0E50E95D4
+:1014B000F0F501E50BF5F0E50B35F0F501E501F58B
+:1014C000F0E50945F0F509E50AF5F0E50965F0F5FF
+:1014D00009E509F5F0E50055F0F500C3E50DF5F077
+:1014E000E51295F0F509E50BF5F0E50B35F0F5099A
+:1014F000E509F5F0E50055F0F500E500F5F0E50C3F
+:1015000045F0F50C750001C3E50FF5F0E51095F019
+:10151000F509E50BF5F0E50B35F0F509E510F5F00B
+:10152000E50F95F0F501E50BF5F0E50B35F0F5016C
+:10153000E501F5F0E50945F0F509E50AF5F0E509FD
+:1015400065F0F509E509F5F0E50055F0F500C3E5AE
+:101550000EF5F0E51395F0F509E50BF5F0E50B3523
+:10156000F0F509E513F5F0E50E95F0F501E50BF55D
+:10157000F0E50B35F0F501E501F5F0E50945F0F58D
+:1015800009E50AF5F0E50965F0F509E509F5F0E585
+:101590000055F0F500C3E50DF5F0E51295F0F509FD
+:1015A000E50BF5F0E50B35F0F509E512F5F0E50D85
+:1015B00095F0F501E50BF5F0E50B35F0F501E501EA
+:1015C000F5F0E50945F0F509E50AF5F0E50965F0FE
+:1015D000F509E509F5F0E50055F0F500C3E515F569
+:1015E000F0E51195F0F509E50BF5F0E50B35F0F5B3
+:1015F00009E509F5F0E50055F0F500E500F5F0E541
+:101600000C45F0F50CE519F50AE51AF500E51BF5B2
+:1016100001E50CF509750C01C3750B00E509F5F042
+:10162000E50B95F0F50B750B00E50BF5F0E50B35CB
+:10163000F0F50BE50BF5F0E50C65F0F50CC3750B5B
+:1016400000E50AF5F0E50B95F0F50B750B00E50BE1
+:10165000F5F0E50B35F0F50BE50BF5F0E50C65F075
+:10166000F50CC3750B00E500F5F0E50B95F0F50BF7
+:10167000750B00E50BF5F0E50B35F0F50BE50BF51B
+:10168000F0E50C65F0F50CC3750B00E501F5F0E530
+:101690000B95F0F50B750B00E50BF5F0E50B35F050
+:1016A000F50BE50BF5F0E50C65F0F50C750A00752A
+:1016B0000000750100E50AF509750B01C3750A0004
+:1016C000E50CF5F0E50A95F0F50A750A00E50AF56E
+:1016D000F0E50A35F0F50AE50AF5F0E50B65F0F5F9
+:1016E0000BC3750A00E509F5F0E50A95F0F50A75F2
+:1016F0000A00E50AF5F0E50A35F0F50AE50AF5F025
+:10170000E50B65F0F50BC3750A00E500F5F0E50A99
+:1017100095F0F50A750A00E50AF5F0E50A35F0F5E9
+:101720000AE50AF5F0E50B65F0F50BC3750A00E56F
+:1017300001F5F0E50A95F0F50A750A00E50AF5F0FD
+:10174000E50A35F0F50AE50AF5F0E50B65F0F50B6D
+:10175000750100750900750A00750000E50BF5F0CC
+:10176000E50045F0F500E501F5F0E50045F0F50090
+:10177000E509F5F0E50045F0F500E50AF5F0E500CE
+:1017800045F0F500E50070028003021A8F00750134
+:1017900000C3750000E501F5F075E0012506F5824E
+:1017A00075E0003507F583E0F508E50835F0F5014B
+:1017B000E500F5F075E0002506F58275E0003507D7
+:1017C000F583E0F508E50835F0F50075E005250638
+:1017D000F58275E0003507F583E0F508E508F503C7
+:1017E000E500F502E501F582E502F583E503F07514
+:1017F0000101C3750000E501F5F075E0012506F56E
+:101800008275E0003507F583E0F508E50835F0F569
+:1018100001E500F5F075E0002506F58275E000357C
+:1018200007F583E0F508E50835F0F50075E00425D7
+:1018300006F58275E0003507F583E0F508E508F563
+:1018400003E500F502E501F582E502F583E503F025
+:10185000750102C3750000E501F5F075E00125068C
+:10186000F58275E0003507F583E0F508E50835F009
+:10187000F501E500F5F075E0002506F58275E0005C
+:101880003507F583E0F508E50835F0F50075E00368
+:101890002506F58275E0003507F583E0F508E508D3
+:1018A000F503E500F502E501F582E502F583E503C0
+:1018B000F0750103C3750000E501F5F075E0012541
+:1018C00006F58275E0003507F583E0F508E5083593
+:1018D000F0F501E500F5F075E0002506F58275E00C
+:1018E000003507F583E0F508E50835F0F50075E00B
+:1018F000022506F58275E0003507F583E0F508E579
+:1019000008F503E500F502E501F582E502F583E55A
+:1019100003F0750001750100750C04750D00750E5E
+:1019200000750F00C3750900E500F5F0E50CA4F59E
+:101930000BE500F5F0E50CA4E5F0F50AE50BF5F094
+:10194000E50935F0F509E501F5F0E50CA4F50BE541
+:1019500001F5F0E50CA4E5F0F501E50BF5F0E50A7D
+:1019600035F0F50AC3C3750100E509F5F0E50E355C
+:10197000F0F50EE50AF5F0E50F35F0F50FC3750A41
+:1019800000E500F5F0E50DA4F50BE500F5F0E50D3B
+:10199000A4E5F0F501E50BF5F0E50A35F0F50A757B
+:1019A0000900C3C3750000E509F5F0E50E35F0F553
+:1019B0000EE50AF5F0E50F35F0F50FC37509007572
+:1019C0000A00C3C3750000E509F5F0E50E35F0F532
+:1019D0000EE50AF5F0E50F35F0F50FC37509007552
+:1019E0000A00C3C3750000E509F5F0E50E35F0F512
+:1019F0000EE50AF5F0E50F35F0F50FC3750000E5CB
+:101A00000EF5F075E0012506F58275E0003507F565
+:101A100083E0F508E50835F0F50875E0012506F5E1
+:101A20008275E0003507F583E508F0E50FF5F07500
+:101A3000E0002506F58275E0003507F583E0F5083E
+:101A4000E50835F0F50875E0002506F58275E0003B
+:101A50003507F583E508F07500017501007509008B
+:101A6000750A00C3E500F5F0E51195F0F511E50103
+:101A7000F5F0E51295F0F512E509F5F0E51395F0AE
+:101A8000F513E50AF5F0E51895F0F5180213720064
+:101A9000C375000075E0082506F58275E00035077E
+:101AA000F583E0F508E508F5F075E0052506F58213
+:101AB00075E0003507F583E0F508E50835F0F50831
+:101AC00075E0052506F58275E0003507F583E50824
+:101AD000F075E0082506F58275E0003507F583E02E
+:101AE000F508E508F5F075E0042506F58275E000D7
+:101AF0003507F583E0F508E50835F0F50875E004ED
+:101B00002506F58275E0003507F583E508F075E0F8
+:101B1000082506F58275E0003507F583E0F508E550
+:101B200008F5F075E0032506F58275E0003507F548
+:101B300083E0F508E50835F0F50875E0032506F5BE
+:101B40008275E0003507F583E508F075E0082506A5
+:101B5000F58275E0003507F583E0F508E508F5F056
+:101B600075E0022506F58275E0003507F583E0F59E
+:101B700008E50835F0F50875E0022506F58275E000
+:101B8000003507F583E508F075000175010075095A
+:101B900000750A00C3E500F5F075E0092506F58239
+:101BA00075E0003507F583E0F508E50895F0F508E0
+:101BB00075E0092506F58275E0003507F583E5082F
+:101BC000F0E501F5F0E51795F0F517E509F5F0E515
+:101BD0001495F0F514E50AF5F075E0072506F58291
+:101BE00075E0003507F583E0F508E50895F0F508A0
+:101BF00075E0072506F58275E0003507F583E508F1
+:101C0000F0020E8B00750001750100750900750A60
+:101C100000C3E500F5F075E00B2506F58275E000E0
+:101C20003507F583E0F508E50895F0F50875E00B54
+:101C30002506F58275E0003507F583E508F0E50136
+:101C4000F5F075E00A2506F58275E0003507F583A5
+:101C5000E0F508E50895F0F50875E00A2506F58237
+:101C600075E0003507F583E508F0E509F5F0E516C0
+:101C700095F0F516E50AF5F075E0062506F582758E
+:101C8000E0003507F583E0F508E50895F0F50875FF
+:101C9000E0062506F58275E0003507F583E508F0D6
+:101CA00002095700750000E500F502E500F503E5BF
+:101CB00000F504E500F50575E0152506F58275E0EB
+:101CC000003507F583E0F51775E0142506F58275F4
+:101CD000E0003507F583E0F51675E0132506F5827B
+:101CE00075E0003507F583E0F51575E0122506F57A
+:101CF0008275E0003507F583E0F51475E0112506DF
+:101D0000F58275E0003507F583E0F51375E01025E1
+:101D100006F58275E0003507F583E0F51275E00FF2
+:101D20002506F58275E0003507F583E0F51175E0CD
+:101D30000E2506F58275E0003507F583E0F5107590
+:101D4000E00C2506F58275E0003507F583E0F5081F
+:101D5000E508C0E075E00D2506F58275E000350761
+:101D6000F583E0F508E508C0E075E0162506F50600
+:101D700075E0003507F507E502F582E503F583E533
+:101D800004F500E505F50122000000000000000058
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target fpic } } */
+/* { dg-options "-O2 -fPIC -funroll-loops" } */
+
+char *
+test (const char *parent, const char *child)
+{
+ static char rtn_path[1024];
+ char *s = rtn_path;
+ char *s_end = rtn_path + sizeof (rtn_path);
+ const char *s2 = child;
+
+ while (*s != '\0')
+ s++;
+ while ((s < s_end) && (*s2 != '\0'))
+ *s++ = *s2++;
+ return (rtn_path);
+}
--- /dev/null
+/* { dg-do compile { target fpic } } */
+/* { dg-options "-O2 -fPIC -funroll-loops" } */
+
+char *
+test (const char *parent, const char *child)
+{
+ static char rtn_path[1024];
+ char *s = rtn_path;
+ char *s_end = rtn_path + sizeof (rtn_path);
+ const char *s2 = child;
+
+ while (*s != '\0')
+ s++;
+ while ((s < s_end) && (*s2 != '\0'))
+ *s++ = *s2++;
+ return (rtn_path);
+}
--- /dev/null
+:1000000000E506758208C39582F506E5077583004D
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F0E5173C
+:10004000F518E516F519E515F51AE514F51BE51390
+:10005000F51EE512F51F75E0032506F58275E00033
+:100060003507F583E511F075E0022506F58275E0A8
+:10007000003507F583E510F0E51DF515E51CF514D1
+:10008000900000E582F512900000E583F5139000E2
+:1000900000E582F510900000E583F511750000750C
+:1000A0000104750C01750D00750E00750F00C37508
+:1000B0000900E500F5F0E50CA4F50BE500F5F0E529
+:1000C0000CA4E5F0F50AE50BF5F0E50935F0F509C6
+:1000D000E501F5F0E50CA4F50BE501F5F0E50CA460
+:1000E000E5F0F501E50BF5F0E50A35F0F50AC3C3D7
+:1000F000750100E509F5F0E50E35F0F50EE50AF5B8
+:10010000F0E50F35F0F50FC3750A00E500F5F0E5F1
+:100110000DA4F50BE500F5F0E50DA4E5F0F501E51E
+:100120000BF5F0E50A35F0F50A750900C3C3750053
+:1001300000E509F5F0E50E35F0F50EE50AF5F0E518
+:100140000F35F0F50FC3750900750A00C3C37500BC
+:1001500000E509F5F0E50E35F0F50EE50AF5F0E5F8
+:100160000F35F0F50FC3750900750A00C3C375009C
+:1001700000E509F5F0E50E35F0F50EE50AF5F0E5D8
+:100180000F35F0F50FC3750000E50EF5F0E51035FD
+:10019000F0F517E50FF5F0E51135F0F516E515F575
+:1001A00000E514F501750A00C3750900E50AF5F0CC
+:1001B000E51235F0F50AE509F5F0E51335F0F50936
+:1001C000E509F502E50AF582E502F583E0F50D752E
+:1001D0001000E510F50EE510F50F750900750A0021
+:1001E000750B00750C00751100C3E509F5F0E50D00
+:1001F00095F0F509E509F5F0E51145F0F511C3E5D0
+:100200000AF5F0E50E95F0F509E509F5F0E511457B
+:10021000F0F511C3E50BF5F0E50F95F0F509E509EB
+:10022000F5F0E51145F0F511C3E50CF5F0E5109595
+:10023000F0F509E509F5F0E51145F0F5117509004E
+:10024000750A00750B00750D01C3750C00E511F5FD
+:10025000F0E50C95F0F50C750C00E50CF5F0E50CEF
+:1002600035F0F50CE50CF5F0E50D65F0F50DC37511
+:100270000C00E509F5F0E50C95F0F50C750C00E5C2
+:100280000CF5F0E50C35F0F50CE50CF5F0E50D6539
+:10029000F0F50DC3750C00E50AF5F0E50C95F0F5E9
+:1002A0000C750C00E50CF5F0E50C35F0F50CE50CE3
+:1002B000F5F0E50D65F0F50DC3750C00E50BF5F0F7
+:1002C000E50C95F0F50C750C00E50CF5F0E50C353A
+:1002D000F0F50CE50CF5F0E50D65F0F50D750A008F
+:1002E000750B00750C00750900E50DF5F0E5094585
+:1002F000F0F509E50AF5F0E50945F0F509E50BF536
+:10030000F0E50945F0F509E50CF5F0E50945F0F5EE
+:1003100009E5097002800302041F00750901750ACE
+:1003200000750E01750F00751000751100C3750B77
+:1003300000E509F5F0E50EA4F50DE509F5F0E50E8B
+:10034000A4E5F0F50CE50DF5F0E50B35F0F50BE562
+:100350000AF5F0E50EA4F50DE50AF5F0E50EA4E5C5
+:10036000F0F50AE50DF5F0E50C35F0F50CC3C375B5
+:100370000A00E50BF5F0E51035F0F510E50CF5F0A9
+:10038000E51135F0F511C3750C00E509F5F0E50F41
+:10039000A4F50DE509F5F0E50FA4E5F0F50AE50D86
+:1003A000F5F0E50C35F0F50C750B00C3C3750900CD
+:1003B000E50BF5F0E51035F0F510E50CF5F0E5117D
+:1003C00035F0F511C3750B00750C00C3C37509003A
+:1003D000E50BF5F0E51035F0F510E50CF5F0E5115D
+:1003E00035F0F511C3750B00750C00C3C37509001A
+:1003F000E50BF5F0E51035F0F510E50CF5F0E5113D
+:1004000035F0F511C3750900E510F5F0E51235F08A
+:10041000F512E511F5F0E51335F0F5130201A5002D
+:10042000750E00750F00751000751100750D0075C3
+:100430000C01750901C3E516F5F0E51395F0F50B10
+:10044000E50DF5F0E50D35F0F50BE50BF5F0E509FB
+:1004500055F0F509E509F5F0E50E45F0F50E7509DD
+:1004600001C3E516F5F0E51395F0F50BE50DF5F094
+:10047000E50D35F0F50BE513F5F0E51695F0F50A09
+:10048000E50DF5F0E50D35F0F50AE50AF5F0E50BBB
+:1004900045F0F50BE50CF5F0E50B65F0F50BE50B1C
+:1004A000F5F0E50955F0F509C3E517F5F0E5129506
+:1004B000F0F50BE50DF5F0E50D35F0F50BE50BF579
+:1004C000F0E50955F0F509E509F5F0E50E45F0F51B
+:1004D0000E750900E50EF5F0E50945F0F509E50FA3
+:1004E000F5F0E50945F0F509E510F5F0E50945F009
+:1004F000F509E511F5F0E50945F0F509E5097002A2
+:1005000080030208F900750900750A00750B007573
+:100510000C00750E01C3750D00E509F5F0E50D95AC
+:10052000F0F50D750D00E50DF5F0E50D35F0F50D67
+:10053000E50DF5F0E50E65F0F50EC3750D00E50A65
+:10054000F5F0E50D95F0F50D750D00E50DF5F0E50F
+:100550000D35F0F50DE50DF5F0E50E65F0F50EC382
+:10056000750D00E50BF5F0E50D95F0F50D750D0039
+:10057000E50DF5F0E50D35F0F50DE50DF5F0E50EC1
+:1005800065F0F50EC3750D00E50CF5F0E50D95F081
+:10059000F50D750D00E50DF5F0E50D35F0F50DE502
+:1005A0000DF5F0E50E65F0F50E750A00750B00759A
+:1005B0000C00750900E50EF5F0E50945F0F509E5D3
+:1005C0000AF5F0E50945F0F509E50BF5F0E5094513
+:1005D000F0F509E50CF5F0E50945F0F509E50970D8
+:1005E00002800302085400E512F514E513F51575B1
+:1005F0000A01750B00750F01751000751100750962
+:1006000000C3750C00E50AF5F0E50FA4F50EE50A48
+:10061000F5F0E50FA4E5F0F50DE50EF5F0E50C3588
+:10062000F0F50CE50BF5F0E50FA4F50EE50BF5F094
+:10063000E50FA4E5F0F50BE50EF5F0E50D35F0F569
+:100640000DC3C3750B00E50CF5F0E51135F0F511A0
+:10065000E50DF5F0E50935F0F509C3750D00E50A7E
+:10066000F5F0E510A4F50EE50AF5F0E510A4E5F0C7
+:10067000F50BE50EF5F0E50D35F0F50D750C00C345
+:10068000C3750A00E50CF5F0E51135F0F511E50D3F
+:10069000F5F0E50935F0F509C3750C00750D00C3DB
+:1006A000C3750A00E50CF5F0E51135F0F511E50D1F
+:1006B000F5F0E50935F0F509C3750C00750D00C3BB
+:1006C000C3750A00E50CF5F0E51135F0F511E50DFF
+:1006D000F5F0E50935F0F509C3750A00E511F5F007
+:1006E000E51435F0F512E509F5F0E51535F0F513EB
+:1006F000E500F510E501F511750001750100750CB7
+:1007000001750D00750E00750F00C3750900E50039
+:10071000F5F0E50CA4F50BE500F5F0E50CA4E5F02B
+:10072000F50AE50BF5F0E50935F0F509E501F5F019
+:10073000E50CA4F50BE501F5F0E50CA4E5F0F501F9
+:10074000E50BF5F0E50A35F0F50AC3C3750100E5E0
+:1007500009F5F0E50E35F0F50EE50AF5F0E50F3593
+:10076000F0F50FC3750A00E500F5F0E50DA4F50BF3
+:10077000E500F5F0E50DA4E5F0F501E50BF5F0E594
+:100780000A35F0F50A750900C3C3750000E509F5DF
+:10079000F0E50E35F0F50EE50AF5F0E50F35F0F56C
+:1007A0000FC3750900750A00C3C3750000E509F59C
+:1007B000F0E50E35F0F50EE50AF5F0E50F35F0F54C
+:1007C0000FC3750900750A00C3C3750000E509F57C
+:1007D000F0E50E35F0F50EE50AF5F0E50F35F0F52C
+:1007E0000FC3750000E50EF5F0E51035F0F500E5F6
+:1007F0000FF5F0E51135F0F501750A00C375090034
+:10080000E50AF5F0E51035F0F50AE509F5F0E51132
+:1008100035F0F509E509F502E50AF582E502F5830B
+:10082000E0F50B750A00C3750900E50AF5F0E5145B
+:1008300035F0F50AE509F5F0E51535F0F509E50BB4
+:10084000F503E509F502E50AF582E502F583E5031E
+:10085000F002042000900000E582F501900000E520
+:1008600083F509750000E501F502E509F503E500EA
+:10087000F504E500F505E518F517E519F516E51A8F
+:10088000F515E51BF514E51EF513E51FF51275E0EA
+:10089000032506F58275E0003507F583E0F511754F
+:1008A000E0022506F58275E0003507F583E0F510D6
+:1008B00075E0002506F58275E0003507F583E0F563
+:1008C00008E508C0E075E0012506F58275E0003511
+:1008D00007F583E0F508E508C0E075E0082506F5B2
+:1008E0000675E0003507F507E502F582E503F583B7
+:1008F000E504F500E505F5012200750A00C3750958
+:1009000000E50AF5F0E50035F0F50AE509F5F0E552
+:100910000135F0F509E509F502E50AF582E502F58C
+:1009200083E0F50D751000E510F50EE510F50F7577
+:100930000900750A00750B00750C00751100C3E500
+:1009400009F5F0E50D95F0F509E509F5F0E5114536
+:10095000F0F511C3E50AF5F0E50E95F0F509E509A6
+:10096000F5F0E51145F0F511C3E50BF5F0E50F9550
+:10097000F0F509E509F5F0E51145F0F511C3E50CD1
+:10098000F5F0E51095F0F509E509F5F0E51145F00C
+:10099000F511750A00750B00750C00750900E5115D
+:1009A000F5F0E50945F0F509E50AF5F0E50945F04A
+:1009B000F509E50BF5F0E50945F0F509E50CF5F06D
+:1009C000E50945F0F509E509700280030209DF0039
+:1009D000750900750A00750B00750C000205120000
+:1009E000750901750A00750B00750C0002051200EF
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target fpic } } */
+/* { dg-options "-O1 -fpic" } */
+extern int *bar (void) __attribute__ ((__pure__));
+extern char *baz;
+void
+foo (void)
+{
+ baz = (char *) bar ();
+}
--- /dev/null
+/* { dg-do compile { target fpic } } */
+/* { dg-options "-O1 -fpic" } */
+extern int *bar (void) __attribute__ ((__pure__));
+extern char *baz;
+void
+foo (void)
+{
+ baz = (char *) bar ();
+}
--- /dev/null
+:100000000000E506758202C39582F506E507758353
+:10001000009583F507D0E0F50875E0012506F58227
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000002506F58275E0003507F583E508F0E553
+:1000400082F502E583F503E502F50BE503F50C9077
+:100050000000E582F509900000E583F50A750100CE
+:10006000C3750000E501F5F0E50935F0F501E5009F
+:10007000F5F0E50A35F0F500E50BF503E500F502CE
+:10008000E501F582E502F583E503F0750101C3752D
+:100090000000E501F5F0E50935F0F501E500F5F0C2
+:1000A000E50A35F0F500E50CF503E500F502E5019C
+:1000B000F582E502F583E503F0750000E500F50241
+:1000C000E500F503E500F504E500F50575E000251C
+:1000D00006F58275E0003507F583E0F508E508C010
+:1000E000E075E0012506F58275E0003507F583E04F
+:1000F000F508E508C0E075E0022506F50675E000A4
+:100100003507F507E502F582E503F583E504F5001B
+:10011000E505F501220000000000000000000000DD
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* This used to ICE on s390 due to a old-loop bug. */
+
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+char *strcpy (char *dest, const char *src);
+
+void test (char *Line, int len)
+{
+ int z;
+
+ for (z = 1; z <= len; z++)
+ if (Line[z - 1])
+ strcpy (Line + z + 1, Line);
+}
+
--- /dev/null
+/* This used to ICE on s390 due to a old-loop bug. */
+
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+char *strcpy (char *dest, const char *src);
+
+void test (char *Line, int len)
+{
+ int z;
+
+ for (z = 1; z <= len; z++)
+ if (Line[z - 1])
+ strcpy (Line + z + 1, Line);
+}
+
--- /dev/null
+:100000000000E506758214C39582F506E507758341
+:10001000009583F507D0E0F50875E0052506F58223
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000042506F58275E0003507F583E508F075BF
+:10004000E00D2506F58275E0003507F583E517F02C
+:1000500075E00C2506F58275E0003507F583E51699
+:10006000F075E00B2506F58275E0003507F583E5B0
+:1000700015F075E00A2506F58275E0003507F58371
+:10008000E514F075E0092506F58275E0003507F501
+:1000900083E513F075E0082506F58275E000350765
+:1000A000F583E512F075E0072506F58275E0003569
+:1000B00007F583E511F075E0062506F58275E00089
+:1000C0003507F583E510F075E0012506F58275E04A
+:1000D000003507F583E51FF075E0002506F582750C
+:1000E000E0003507F583E51EF075E0032506F5828F
+:1000F00075E0003507F583E51DF0E51CF517E51BF8
+:10010000F51575E0022506F58275E0003507F583E3
+:10011000E51AF0751001751100751200751600755D
+:10012000E0022506F58275E0003507F583E0F5135A
+:10013000E516F50F750080E500F5F0E51325F0F5FF
+:1001400013E500F5F0E50F25F0F50F750C00750DC2
+:1001500000751400750E00750B00750A017500011D
+:10016000C3E50FF5F0E51395F0F509E50BF5F0E5BE
+:100170000B35F0F509E509F5F0E50055F0F500E57A
+:1001800000F5F0E50C45F0F50C750001C3E50FF541
+:10019000F0E51395F0F509E50BF5F0E50B35F0F515
+:1001A00009E513F5F0E50F95F0F501E50BF5F0E540
+:1001B0000B35F0F501E501F5F0E50945F0F509E548
+:1001C0000AF5F0E50965F0F509E509F5F0E50055F2
+:1001D000F0F500C3E512F5F0E51595F0F509E50B2E
+:1001E000F5F0E50B35F0F509E509F5F0E50055F01A
+:1001F000F500E500F5F0E50C45F0F50C750001C3E0
+:10020000E50FF5F0E51395F0F509E50BF5F0E50BD5
+:1002100035F0F509E513F5F0E50F95F0F501E50B7F
+:10022000F5F0E50B35F0F501E501F5F0E50945F0F0
+:10023000F509E50AF5F0E50965F0F509E509F5F0D8
+:10024000E50055F0F500C3E512F5F0E51595F0F57C
+:1002500009E50BF5F0E50B35F0F509E515F5F0E5E9
+:100260001295F0F501E50BF5F0E50B35F0F501E53C
+:1002700001F5F0E50945F0F509E50AF5F0E5096550
+:10028000F0F509E509F5F0E50055F0F500C3E511D5
+:10029000F5F0E51795F0F509E50BF5F0E50B35F010
+:1002A000F509E509F5F0E50055F0F500E500F5F094
+:1002B000E50C45F0F50C750001C3E50FF5F0E5130D
+:1002C00095F0F509E50BF5F0E50B35F0F509E513CB
+:1002D000F5F0E50F95F0F501E50BF5F0E50B35F0E0
+:1002E000F501E501F5F0E50945F0F509E50AF5F058
+:1002F000E50965F0F509E509F5F0E50055F0F500CB
+:10030000C3E512F5F0E51595F0F509E50BF5F0E517
+:100310000B35F0F509E515F5F0E51295F0F501E579
+:100320000BF5F0E50B35F0F501E501F5F0E50945D4
+:10033000F0F509E50AF5F0E50965F0F509E509F5D7
+:10034000F0E50055F0F500C3E511F5F0E51795F07F
+:10035000F509E50BF5F0E50B35F0F509E517F5F0D6
+:10036000E51195F0F501E50BF5F0E50B35F0F5013C
+:10037000E501F5F0E50945F0F509E50AF5F0E509CF
+:1003800065F0F509E509F5F0E50055F0F500C3E580
+:1003900010F5F075E0032506F58275E0003507F5E8
+:1003A00083E0F508E50895F0F509E50BF5F0E50BB8
+:1003B00035F0F509E509F5F0E50055F0F500E50043
+:1003C000F5F0E50C45F0F50CE50CF500E514F5014C
+:1003D000750C01C3750900E500F5F0E50995F0F528
+:1003E00009750900E509F5F0E50935F0F509E509B4
+:1003F000F5F0E50C65F0F50CC3750900E50DF5F0B9
+:10040000E50995F0F509750900E509F5F0E5093507
+:10041000F0F509E509F5F0E50C65F0F50CC3750993
+:1004200000E501F5F0E50995F0F509750900E50924
+:10043000F5F0E50935F0F509E509F5F0E50C65F0AD
+:10044000F50CC3750900E50EF5F0E50995F0F50921
+:10045000750900E509F5F0E50935F0F509E509F557
+:10046000F0E50C65F0F50C750D00751400750E00C7
+:10047000E50DF500E514F501E50EF509750B01C371
+:10048000750A00E50CF5F0E50A95F0F50A750A0025
+:10049000E50AF5F0E50A35F0F50AE50AF5F0E50BB1
+:1004A00065F0F50BC3750A00E500F5F0E50A95F077
+:1004B000F50A750A00E50AF5F0E50A35F0F50AE5F2
+:1004C0000AF5F0E50B65F0F50BC3750A00E501F5DB
+:1004D000F0E50A95F0F50A750A00E50AF5F0E50A77
+:1004E00035F0F50AE50AF5F0E50B65F0F50BC37597
+:1004F0000A00E509F5F0E50A95F0F50A750A00E548
+:100500000AF5F0E50A35F0F50AE50AF5F0E50B65C0
+:10051000F0F50B750100750900750A00750000E51E
+:100520000BF5F0E50045F0F500E501F5F0E50045D7
+:10053000F0F500E509F5F0E50045F0F500E50AF510
+:10054000F0E50045F0F500E5007002800302095572
+:1005500000750001750100C3E500F5F0E51095F0A8
+:10056000F500E501F5F0E51195F0F501750C017563
+:100570000D00750E00750F00C3750900E500F5F05C
+:10058000E50CA4F50BE500F5F0E50CA4E5F0F50AA3
+:10059000E50BF5F0E50935F0F509E501F5F0E50CB9
+:1005A000A4F50BE501F5F0E50CA4E5F0F501E50B8C
+:1005B000F5F0E50A35F0F50AC3C3750100E509F564
+:1005C000F0E50E35F0F50EE50AF5F0E50F35F0F53E
+:1005D0000FC3750A00E500F5F0E50DA4F50BE50085
+:1005E000F5F0E50DA4E5F0F501E50BF5F0E50A35CC
+:1005F000F0F50A750900C3C3750000E509F5F0E5DB
+:100600000E35F0F50EE50AF5F0E50F35F0F50FC300
+:10061000750900750A00C3C3750000E509F5F0E52A
+:100620000E35F0F50EE50AF5F0E50F35F0F50FC3E0
+:10063000750900750A00C3C3750000E509F5F0E50A
+:100640000E35F0F50EE50AF5F0E50F35F0F50FC3C0
+:10065000750000E50EF5F075E0012506F58275E000
+:10066000003507F583E0F508E50835F0F500E50FFE
+:10067000F5F075E0002506F58275E0003507F58395
+:10068000E0F508E50835F0F50AE500F50975010023
+:10069000C3750000E501F5F0E50935F0F501E50069
+:1006A000F5F0E50A35F0F500E500F502E501F58223
+:1006B000E502F583E0F501750000E501F5F0E500E0
+:1006C00045F0F500E500700280030207090075019E
+:1006D00001750900750A00750B00C3750000E5017E
+:1006E000F5F0E51035F0F510E509F5F0E51135F018
+:1006F000F511E50AF5F0E51235F0F512E50BF5F028
+:10070000E51635F0F51602011F00750A01750C009B
+:10071000750D00750000C3750100E510F5F0E50AE0
+:10072000A4F50BE510F5F0E50AA4E5F0F509E50BF5
+:10073000F5F0E50135F0F501E511F5F0E50AA4F570
+:100740000BE511F5F0E50AA4E5F0F50AE50BF5F087
+:10075000E50935F0F509C3C3750A00E501F5F0E5D3
+:100760000D35F0F50DE509F5F0E50035F0F500C3C0
+:10077000750900E510F5F0E50CA4F50BE510F5F0B2
+:10078000E50CA4E5F0F50AE50BF5F0E50935F0F523
+:1007900009750100C3C3750A00E501F5F0E50D35E3
+:1007A000F0F50DE509F5F0E50035F0F500C375014C
+:1007B00000750900C3C3750A00E501F5F0E50D35C4
+:1007C000F0F50DE509F5F0E50035F0F500C375012C
+:1007D00000750900C3C3750A00E501F5F0E50D35A4
+:1007E000F0F50DE509F5F0E50035F0F500C375010C
+:1007F00000E50DF5F075E0012506F58275E00035A0
+:1008000007F583E0F508E50835F0F513E500F5F0A8
+:1008100075E0002506F58275E0003507F583E0F503
+:1008200008E50835F0F514750001750100750C0137
+:10083000750D00750E00750F00C3750900E500F514
+:10084000F0E50CA4F50BE500F5F0E50CA4E5F0F5FA
+:100850000AE50BF5F0E50935F0F509E501F5F0E5F8
+:100860000CA4F50BE501F5F0E50CA4E5F0F501E5C8
+:100870000BF5F0E50A35F0F50AC3C3750100E5098B
+:10088000F5F0E50E35F0F50EE50AF5F0E50F35F07B
+:10089000F50FC3750A00E500F5F0E50DA4F50BE5CD
+:1008A00000F5F0E50DA4E5F0F501E50BF5F0E50A3E
+:1008B00035F0F50A750900C3C3750000E509F5F0C8
+:1008C000E50E35F0F50EE50AF5F0E50F35F0F50F1C
+:1008D000C3750900750A00C3C3750000E509F5F08A
+:1008E000E50E35F0F50EE50AF5F0E50F35F0F50FFC
+:1008F000C3750900750A00C3C3750000E509F5F06A
+:10090000E50E35F0F50EE50AF5F0E50F35F0F50FDB
+:10091000C3750000E50EF5F0E51335F0F500E50FC1
+:10092000F5F0E51435F0F501E500F51FE501F51EDC
+:1009300075E0012506F58275E0003507F583E0F5E1
+:100940001D75E0002506F58275E0003507F583E0AA
+:10095000F51C0206CE00750000E500F502E500F585
+:1009600003E500F504E500F50575E00D2506F582C3
+:1009700075E0003507F583E0F51775E00C2506F501
+:100980008275E0003507F583E0F51675E00B250666
+:10099000F58275E0003507F583E0F51575E00A2569
+:1009A00006F58275E0003507F583E0F51475E0097A
+:1009B0002506F58275E0003507F583E0F51375E04F
+:1009C000082506F58275E0003507F583E0F5127518
+:1009D000E0072506F58275E0003507F583E0F5119F
+:1009E00075E0062506F58275E0003507F583E0F52C
+:1009F0001075E0042506F58275E0003507F583E003
+:100A0000F508E508C0E075E0052506F58275E0000B
+:100A10003507F583E0F508E508C0E075E014250624
+:100A2000F50675E0003507F507E502F582E503F503
+:100A300083E504F500E505F5012200000000000053
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+
+/* { dg-do compile { target fpic } } */
+/* { dg-options "-Os -fPIC" } */
+
+void *memset (void *, int, __SIZE_TYPE__);
+void *memcpy (void *, const void *, __SIZE_TYPE__);
+
+char *alloc (int);
+
+char *
+test (int type, int size, char *data, int len)
+{
+ char *block = alloc (size);
+ char *bp = block;
+
+ *bp++ = type;
+ switch (type)
+ {
+ case 0:
+ case 1:
+ memset (bp, type == 0 ? 0x00 : 0xff, size);
+ memcpy (bp, data, len);
+ }
+
+ return block;
+}
+
--- /dev/null
+
+/* { dg-do compile { target fpic } } */
+/* { dg-options "-Os -fPIC" } */
+
+void *memset (void *, int, __SIZE_TYPE__);
+void *memcpy (void *, const void *, __SIZE_TYPE__);
+
+char *alloc (int);
+
+char *
+test (int type, int size, char *data, int len)
+{
+ char *block = alloc (size);
+ char *bp = block;
+
+ *bp++ = type;
+ switch (type)
+ {
+ case 0:
+ case 1:
+ memset (bp, type == 0 ? 0x00 : 0xff, size);
+ memcpy (bp, data, len);
+ }
+
+ return block;
+}
+
--- /dev/null
+:1000000000000000E506758228C39582F506E50725
+:100010007583009583F507D0E0F50875E011250696
+:10002000F58275E0003507F583E508F0D0E0F508C6
+:1000300075E0102506F58275E0003507F583E508C3
+:10004000F075E0192506F58275E0003507F583E5C2
+:1000500017F075E0182506F58275E0003507F58381
+:10006000E516F075E0172506F58275E0003507F511
+:1000700083E515F075E0162506F58275E000350775
+:10008000F583E514F075E0152506F58275E0003579
+:1000900007F583E513F075E0142506F58275E00099
+:1000A0003507F583E512F075E0132506F58275E056
+:1000B000003507F583E511F075E0122506F5827528
+:1000C000E0003507F583E510F0E51FF510E51EF5B6
+:1000D00011E51DF512E51CF51375E0092506F582FD
+:1000E00075E0003507F583E51BF075E0082506F59A
+:1000F0008275E0003507F583E51AF075E0072506FF
+:10010000F58275E0003507F583E519F075E0062501
+:1001100006F58275E0003507F583E518F0750928C6
+:10012000750001E500F5F0E50995F0F509E506F53E
+:1001300000E500F5F0E50925F0F509750100E50792
+:10014000F500E500F5F0E50135F0F501E501F50212
+:10015000E509F582E502F583E0F50875E00B250673
+:10016000F58275E0003507F583E508F07509287517
+:100170000002E500F5F0E50995F0F509E506F50062
+:10018000E500F5F0E50925F0F509750100E507F54D
+:1001900000E500F5F0E50135F0F501E501F502E5D2
+:1001A00009F582E502F583E0F50875E00A2506F514
+:1001B0008275E0003507F583E508F07509287500BC
+:1001C00003E500F5F0E50995F0F509E506F500E52C
+:1001D00000F5F0E50925F0F509750100E507F500E2
+:1001E000E500F5F0E50135F0F501E501F502E50979
+:1001F000F582E502F583E0F50875E00F2506F58246
+:1002000075E0003507F583E508F0750928750004E9
+:10021000E500F5F0E50995F0F509E506F500E500DE
+:10022000F5F0E50925F0F509750100E507F500E5AC
+:1002300000F5F0E50135F0F501E501F502E509F518
+:1002400082E502F583E0F50875E00E2506F5827576
+:10025000E0003507F583E508F0750928750005E528
+:1002600000F5F0E50995F0F509E506F500E500F57E
+:10027000F0E50925F0F509750100E507F500E50051
+:10028000F5F0E50135F0F501E501F502E509F58246
+:10029000E502F583E0F50875E00D2506F58275E0C9
+:1002A000003507F583E508F0750928750006E500B7
+:1002B000F5F0E50995F0F509E506F500E500F5F03E
+:1002C000E50925F0F509750100E507F500E500F5FC
+:1002D000F0E50135F0F501E501F502E509F582E506
+:1002E00002F583E0F50875E00C2506F58275E0005F
+:1002F0003507F583E508F075E0092506F58275E018
+:10030000003507F583E0F51F75E0082506F58275D1
+:10031000E0003507F583E0F51E75E0072506F58258
+:1003200075E0003507F583E0F51D75E0062506F557
+:100330008275E0003507F583E0F51CE582F502E5FE
+:1003400083F503E502F514E503F515E514F517E566
+:1003500015F516E517F518E516F51975000175017F
+:1003600000750C01750D00750E00750F00C3750941
+:1003700000E500F5F0E50CA4F50BE500F5F0E50C63
+:10038000A4E5F0F50AE50BF5F0E50935F0F509E52A
+:1003900001F5F0E50CA4F50BE501F5F0E50CA4E59D
+:1003A000F0F501E50BF5F0E50A35F0F50AC3C37584
+:1003B0000100E509F5F0E50E35F0F50EE50AF5F07A
+:1003C000E50F35F0F50FC3750A00E500F5F0E50D12
+:1003D000A4F50BE500F5F0E50DA4E5F0F501E50B5E
+:1003E000F5F0E50A35F0F50A750900C3C37500009C
+:1003F000E509F5F0E50E35F0F50EE50AF5F0E50F47
+:1004000035F0F50FC3750900750A00C3C375000008
+:10041000E509F5F0E50E35F0F50EE50AF5F0E50F26
+:1004200035F0F50FC3750900750A00C3C3750000E8
+:10043000E509F5F0E50E35F0F50EE50AF5F0E50F06
+:1004400035F0F50FC3750000E50EF5F0E51835F051
+:10045000F517E50FF5F0E51935F0F516750100C350
+:10046000750000E501F5F0E51835F0F501E500F55A
+:10047000F0E51935F0F500E510F503E500F502E5C6
+:1004800001F582E502F583E503F0750000750100D2
+:10049000750900750A00750B00C3E500F5F0E5105D
+:1004A00095F0F500E500F5F0E50B45F0F50BC3E53B
+:1004B00001F5F0E51195F0F500E500F5F0E50B45E7
+:1004C000F0F50BC3E509F5F0E51295F0F500E50050
+:1004D000F5F0E50B45F0F50BC3E50AF5F0E51395EE
+:1004E000F0F500E500F5F0E50B45F0F50B750000C3
+:1004F000750100750900E50BF50C750B01C3750A54
+:1005000000E50CF5F0E50A95F0F50A750A00E50A34
+:10051000F5F0E50A35F0F50AE50AF5F0E50B65F0CA
+:10052000F50BC3750A00E500F5F0E50A95F0F50A4C
+:10053000750A00E50AF5F0E50A35F0F50AE50AF571
+:10054000F0E50B65F0F50BC3750A00E501F5F0E584
+:100550000A95F0F50A750A00E50AF5F0E50A35F0A6
+:10056000F50AE50AF5F0E50B65F0F50BC3750A0031
+:10057000E509F5F0E50A95F0F50A750A00E50AF5D2
+:10058000F0E50A35F0F50AE50AF5F0E50B65F0F55A
+:100590000B750000750100750900750A00E50BF583
+:1005A000F0E50A45F0F50AE500F5F0E50A45F0F555
+:1005B0000AE501F5F0E50A45F0F50AE509F5F0E58B
+:1005C0000A45F0F50AE50A70028003020A86007502
+:1005D0000001750100750900750A00750B00C3E57F
+:1005E00000F5F0E51095F0F500E500F5F0E50B45B8
+:1005F000F0F50BC3E501F5F0E51195F0F500E50028
+:10060000F5F0E50B45F0F50BC3E509F5F0E51295BE
+:10061000F0F500E500F5F0E50B45F0F50BC3E50A54
+:10062000F5F0E51395F0F500E500F5F0E50B45F084
+:10063000F50B750000750100750900E50BF50C75EB
+:100640000B01C3750A00E50CF5F0E50A95F0F50A13
+:10065000750A00E50AF5F0E50A35F0F50AE50AF550
+:10066000F0E50B65F0F50BC3750A00E500F5F0E564
+:100670000A95F0F50A750A00E50AF5F0E50A35F085
+:10068000F50AE50AF5F0E50B65F0F50BC3750A0010
+:10069000E501F5F0E50A95F0F50A750A00E50AF5B9
+:1006A000F0E50A35F0F50AE50AF5F0E50B65F0F539
+:1006B0000BC3750A00E509F5F0E50A95F0F50A7532
+:1006C0000A00E50AF5F0E50A35F0F50AE50AF5F065
+:1006D000E50B65F0F50B75000075010075090075F7
+:1006E0000A00E50BF5F0E50A45F0F50AE500F5F03E
+:1006F000E50A45F0F50AE501F5F0E50A45F0F50AE9
+:10070000E509F5F0E50A45F0F50AE50A700280030F
+:100710000207FA000000750000E514F502E515F582
+:1007200003E500F504E500F50575E0192506F582F9
+:1007300075E0003507F583E0F51775E0182506F537
+:100740008275E0003507F583E0F51675E01725069C
+:10075000F58275E0003507F583E0F51575E016259F
+:1007600006F58275E0003507F583E0F51475E015B0
+:100770002506F58275E0003507F583E0F51375E091
+:10078000142506F58275E0003507F583E0F512754E
+:10079000E0132506F58275E0003507F583E0F511D5
+:1007A00075E0122506F58275E0003507F583E0F562
+:1007B0001075E0102506F58275E0003507F583E039
+:1007C000F508E508C0E075E0112506F58275E00042
+:1007D0003507F583E0F508E508C0E075E028250653
+:1007E000F50675E0003507F507E502F582E503F546
+:1007F00083E504F500E505F50122000075000075AC
+:100800000100750900750A00750B00C3E500F5F0DD
+:10081000E51095F0F500E500F5F0E50B45F0F50B7A
+:10082000C3E501F5F0E51195F0F500E500F5F0E51B
+:100830000B45F0F50BC3E509F5F0E51295F0F50071
+:10084000E500F5F0E50B45F0F50BC3E50AF5F0E53D
+:100850001395F0F500E500F5F0E50B45F0F50B75A7
+:100860000100750900750A00E50BF500750B01C361
+:10087000750C00E500F5F0E50C95F0F50C750C0035
+:10088000E50CF5F0E50C35F0F50CE50CF5F0E50BB5
+:1008900065F0F50BC3750C00E501F5F0E50C95F07E
+:1008A000F50C750C00E50CF5F0E50C35F0F50CE5F4
+:1008B0000CF5F0E50B65F0F50BC3750C00E509F5DB
+:1008C000F0E50C95F0F50C750C00E50CF5F0E50C79
+:1008D00035F0F50CE50CF5F0E50B65F0F50BC3759F
+:1008E0000C00E50AF5F0E50C95F0F50C750C00E54B
+:1008F0000CF5F0E50C35F0F50CE50CF5F0E50B65C5
+:10090000F0F50B750100750900750A00750000E52A
+:100910000BF5F0E50045F0F500E501F5F0E50045E3
+:10092000F0F500E509F5F0E50045F0F500E50AF51C
+:10093000F0E50045F0F500E50070028003020A765C
+:1009400000751DFF751C00751B00751A0075E00908
+:100950002506F58275E0003507F583E0F51975E0A9
+:10096000082506F58275E0003507F583E0F5187572
+:10097000E0072506F58275E0003507F583E0F50A06
+:1009800075E0062506F58275E0003507F583E0F58C
+:100990000BE517F51FE516F51E750901E506F500CF
+:1009A000C3E509F5F0E50095F0F509E507F50075F3
+:1009B0000100E501F5F0E50095F0F501E50AF50324
+:1009C000E501F502E509F582E502F583E503F07539
+:1009D0000902E506F500C3E509F5F0E50095F0F537
+:1009E00009E507F500750100E501F5F0E50095F072
+:1009F000F501E50BF503E501F502E509F582E502F0
+:100A0000F583E503F0E517F51FE516F51E75E00B18
+:100A10002506F58275E0003507F583E0F51D75E0E4
+:100A20000A2506F58275E0003507F583E0F51C75AB
+:100A3000E00F2506F58275E0003507F583E0F51B2C
+:100A400075E00E2506F58275E0003507F583E0F5C3
+:100A50001A75E00D2506F58275E0003507F583E08F
+:100A6000F51975E00C2506F58275E0003507F5836C
+:100A7000E0F51802071400751D00751C00751B00B9
+:100A8000751A0002094D00000207FB00000000007B
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* This used to ICE due to a backend problem on s390. */
+
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+struct rgba
+{
+ unsigned char r;
+ unsigned char g;
+ unsigned char b;
+ unsigned char a;
+};
+
+void g (struct rgba);
+
+void f (void)
+{
+ struct rgba x;
+
+ x.r = 0;
+ x.g = 128;
+ x.b = 128;
+ x.a = 26;
+
+ g (x);
+}
+
--- /dev/null
+/* This used to ICE due to a backend problem on s390. */
+
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+struct rgba
+{
+ unsigned char r;
+ unsigned char g;
+ unsigned char b;
+ unsigned char a;
+};
+
+void g (struct rgba);
+
+void f (void)
+{
+ struct rgba x;
+
+ x.r = 0;
+ x.g = 128;
+ x.b = 128;
+ x.a = 26;
+
+ g (x);
+}
+
--- /dev/null
+:100000000000E506758206C39582F506E50775834F
+:10001000009583F507D0E0F50875E0052506F58223
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000042506F58275E0003507F583E508F0E54F
+:1000400006F509E507F50A750100C3750000E5012D
+:10005000F5F0E50935F0F501E500F5F0E50A35F0D4
+:10006000F509750A00C3750000E50AF5F0E50135EC
+:10007000F0F50AE500F5F0E50935F0F50B75090036
+:10008000750100C3750000E501F5F0E50A35F0F5EE
+:1000900001E500F5F0E50B35F0F500E509F503E5C0
+:1000A00000F502E501F582E502F583E503F0E506DA
+:1000B000F509E507F50A750100C3750000E501F5CE
+:1000C000F0E50935F0F501E500F5F0E50A35F0F564
+:1000D00009750A01C3750000E50AF5F0E50135F080
+:1000E000F50AE500F5F0E50935F0F50B75098075C1
+:1000F0000100C3750000E501F5F0E50A35F0F501F2
+:10010000E500F5F0E50B35F0F500E509F503E50050
+:10011000F502E501F582E502F583E503F0E506F574
+:1001200009E507F50A750100C3750000E501F5F062
+:10013000E50935F0F501E500F5F0E50A35F0F509DA
+:10014000750A02C3750000E50AF5F0E50135F0F522
+:100150000AE500F5F0E50935F0F50B750980750144
+:1001600000C3750000E501F5F0E50A35F0F501E59D
+:1001700000F5F0E50B35F0F500E509F503E500F5D0
+:1001800002E501F582E502F583E503F0E506F509F0
+:10019000E507F50A750100C3750000E501F5F0E516
+:1001A0000935F0F501E500F5F0E50A35F0F50975DA
+:1001B0000A03C3750000E50AF5F0E50135F0F50A1C
+:1001C000E500F5F0E50935F0F50B75091A75010044
+:1001D000C3750000E501F5F0E50A35F0F501E5002D
+:1001E000F5F0E50B35F0F500E509F503E500F5025E
+:1001F000E501F582E502F583E503F0E506F509E59D
+:1002000007F50A750100C3750000E501F5F0E50981
+:1002100035F0F501E500F5F0E50A35F0F500E5010A
+:10022000F51FE500F51E750000E500F502E500F597
+:1002300003E500F504E500F50575E0042506F58203
+:1002400075E0003507F583E0F508E508C0E075E0E6
+:10025000052506F58275E0003507F583E0F508E52C
+:1002600008C0E075E0062506F50675E0003507F5DF
+:1002700007E502F582E503F583E504F500E505F5FC
+:10028000012200000000000000000000000000004B
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target fpic } } */
+/* { dg-options "-O2 -fPIC" } */
+int *block;
+void final(unsigned int j)
+{
+ unsigned int i;
+ unsigned char *data = (unsigned char *)"\0";
+ for (i = 0; i < 8; i++)
+ for (; j + 63 < 1; j += 64)
+ block = (int *) &data[j];
+}
--- /dev/null
+/* { dg-do compile { target fpic } } */
+/* { dg-options "-O2 -fPIC" } */
+int *block;
+void final(unsigned int j)
+{
+ unsigned int i;
+ unsigned char *data = (unsigned char *)"\0";
+ for (i = 0; i < 8; i++)
+ for (; j + 63 < 1; j += 64)
+ block = (int *) &data[j];
+}
--- /dev/null
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-march=i386 -O3 -fomit-frame-pointer" } */
+
+/* For this test case, we used to do an invalid load motion after
+ reload, because we missed autoincrements of the stack pointer. */
+
+extern void exit (int);
+
+static int j;
+
+static void __attribute__((noinline))
+f1 (int a, int b, int c, int d, int e)
+{
+ j = a;
+}
+
+int __attribute__((noinline))
+f2 (int a, int b, int c, int d, int e)
+{
+ if ((b & 0x1111) != 1)
+ f1 (a, b, c, d, e);
+ return 0;
+}
+
+int
+main (void)
+{
+ int tmp = f2 (123, 0, 0, 0, 0);
+ if (j != 123)
+ exit (1);
+ return 0;
+}
+
--- /dev/null
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-march=i386 -O3 -fomit-frame-pointer" } */
+
+/* For this test case, we used to do an invalid load motion after
+ reload, because we missed autoincrements of the stack pointer. */
+
+extern void exit (int);
+
+static int j;
+
+static void __attribute__((noinline))
+f1 (int a, int b, int c, int d, int e)
+{
+ j = a;
+}
+
+int __attribute__((noinline))
+f2 (int a, int b, int c, int d, int e)
+{
+ if ((b & 0x1111) != 1)
+ f1 (a, b, c, d, e);
+ return 0;
+}
+
+int
+main (void)
+{
+ int tmp = f2 (123, 0, 0, 0, 0);
+ if (j != 123)
+ exit (1);
+ return 0;
+}
+
--- /dev/null
+:1000000075812F7506FF7507FF120A7402000C0038
+:1000100000E506758220C39582F506E50775830025
+:100020009583F507D0E0F50ED0E0F50FE512F50B5E
+:10003000E511F50CE510F50D900000E582F509904D
+:100040000000E583F50A750100C3750000E501F5C0
+:10005000F0E50935F0F501E500F5F0E50A35F0F5D4
+:1000600000E51FF503E500F502E501F582E502F57F
+:1000700083E503F0750101C3750000E501F5F0E5C6
+:100080000935F0F501E500F5F0E50A35F0F500E594
+:100090001EF503E500F502E501F582E502F583E5CD
+:1000A00003F0750102C3750000E501F5F0E50935BF
+:1000B000F0F501E500F5F0E50A35F0F500E51DF590
+:1000C00003E500F502E501F582E502F583E503F0BD
+:1000D000750103C3750000E501F5F0E50935F0F59C
+:1000E00001E500F5F0E50A35F0F500E51CF503E55E
+:1000F00000F502E501F582E502F583E503F0750000
+:1001000000E500F502E500F503E500F504E500F57E
+:1001100005E50BF512E50CF511E50DF510E50FC041
+:10012000E0E50EC0E075E0202506F50675E0003537
+:1001300007F507E502F582E503F583E504F500E53B
+:1001400005F5012200E506758232C39582F506E5C4
+:10015000077583009583F507D0E0F50875E0152550
+:1001600006F58275E0003507F583E508F0D0E0F587
+:100170000875E0142506F58275E0003507F583E57E
+:1001800008F075E01D2506F58275E0003507F5835A
+:10019000E517F075E01C2506F58275E0003507F5DA
+:1001A00083E516F075E01B2506F58275E00035073E
+:1001B000F583E515F075E01A2506F58275E0003542
+:1001C00007F583E514F075E0192506F58275E00062
+:1001D0003507F583E513F075E0182506F58275E01F
+:1001E000003507F583E512F075E0172506F58275F1
+:1001F000E0003507F583E511F075E0162506F58278
+:1002000075E0003507F583E510F0E51FF510E51EF4
+:10021000F511E51DF512E51CF513750932750001A0
+:10022000E500F5F0E50995F0F509E506F500E500CE
+:10023000F5F0E50925F0F509750100E507F500E59C
+:1002400000F5F0E50135F0F501E501F502E509F508
+:1002500082E502F583E0F516750932750002E500C6
+:10026000F5F0E50995F0F509E506F500E500F5F08E
+:10027000E50925F0F509750100E507F500E500F54C
+:10028000F0E50135F0F501E501F502E509F582E556
+:1002900002F583E0F517750932750003E500F5F006
+:1002A000E50995F0F509E506F500E500F5F0E50945
+:1002B00025F0F509750100E507F500E500F5F0E525
+:1002C0000135F0F501E501F502E509F582E502F5F4
+:1002D00083E0F50875E00D2506F58275E000350729
+:1002E000F583E508F0750932750004E500F5F0E5E1
+:1002F0000995F0F509E506F500E500F5F0E50925B5
+:10030000F0F509750100E507F500E500F5F0E501F8
+:1003100035F0F501E501F502E509F582E502F58321
+:10032000E0F50875E00C2506F58275E0003507F567
+:1003300083E508F0750932750005E500F5F0E5097B
+:1003400095F0F509E506F500E500F5F0E50925F07D
+:10035000F509750100E507F500E500F5F0E5013563
+:10036000F0F501E501F502E509F582E502F583E026
+:10037000F50875E0112506F58275E0003507F5836F
+:10038000E508F0750932750006E500F5F0E5099518
+:10039000F0F509E506F500E500F5F0E50925F0F5CD
+:1003A00009750100E507F500E500F5F0E50135F018
+:1003B000F501E501F502E509F582E502F583E0F5D1
+:1003C0000875E0102506F58275E0003507F583E530
+:1003D00008F0750932750007E500F5F0E50995F0BC
+:1003E000F509E506F500E500F5F0E50925F0F50964
+:1003F000750100E507F500E500F5F0E50135F0F5DC
+:1004000001E501F502E509F582E502F583E0F5086D
+:1004100075E00F2506F58275E0003507F583E508E0
+:10042000F0750932750008E500F5F0E50995F0F57D
+:1004300009E506F500E500F5F0E50925F0F5097593
+:100440000100E507F500E500F5F0E50135F0F501FF
+:10045000E501F502E509F582E502F583E0F50875A9
+:10046000E00E2506F58275E0003507F583E508F016
+:10047000750932750009E500F5F0E50995F0F50913
+:10048000E506F500E500F5F0E50925F0F50975014B
+:1004900000E507F500E500F5F0E50135F0F501E5CB
+:1004A00001F502E509F582E502F583E0F50875E05E
+:1004B000132506F58275E0003507F583E508F0752C
+:1004C000093275000AE500F5F0E50995F0F509E552
+:1004D00006F500E500F5F0E50925F0F509750100E0
+:1004E000E507F500E500F5F0E50135F0F501E5017A
+:1004F000F502E509F582E502F583E0F50875E012FD
+:100500002506F58275E0003507F583E508F07509E5
+:100510003275000BE500F5F0E50995F0F509E50603
+:10052000F500E500F5F0E50925F0F509750100E5B0
+:1005300007F500E500F5F0E50135F0F501E501F519
+:1005400002E509F582E502F583E0F51475093275D7
+:10055000000CE500F5F0E50995F0F509E506F50074
+:10056000E500F5F0E50925F0F509750100E507F569
+:1005700000E500F5F0E50135F0F501E501F502E5EE
+:1005800009F582E502F583E0F515750A1175091183
+:10059000750100750000C3E50AF5F0E51B55F0F59F
+:1005A0000BE509F5F0E51A55F0F50CE501F5F0E578
+:1005B0001955F0F50DE500F5F0E51855F0F50E7557
+:1005C0000001750100750900750A00750F00C3E58B
+:1005D00000F5F0E50B95F0F500E500F5F0E50F45C9
+:1005E000F0F50FC3E501F5F0E50C95F0F500E50039
+:1005F000F5F0E50F45F0F50FC3E509F5F0E50D95CC
+:10060000F0F500E500F5F0E50F45F0F50FC3E50A5C
+:10061000F5F0E50E95F0F500E500F5F0E50F45F095
+:10062000F50F750100750900750A00750000E50FEA
+:10063000F5F0E50045F0F500E501F5F0E50045F0E1
+:10064000F500E509F5F0E50045F0F500E50AF5F0FF
+:10065000E50045F0F500E5007002800302074D005B
+:10066000750000750100750900750A00E500F502C6
+:10067000E501F503E509F504E50AF50575E01D2535
+:1006800006F58275E0003507F583E0F51775E01C87
+:100690002506F58275E0003507F583E0F51675E06F
+:1006A0001B2506F58275E0003507F583E0F5157525
+:1006B000E01A2506F58275E0003507F583E0F514AC
+:1006C00075E0192506F58275E0003507F583E0F53C
+:1006D0001375E0182506F58275E0003507F583E00F
+:1006E000F51275E0172506F58275E0003507F583EC
+:1006F000E0F51175E0162506F58275E0003507F581
+:1007000083E0F51075E0142506F58275E0003507E5
+:10071000F583E0F508E508C0E075E0152506F582EB
+:1007200075E0003507F583E0F508E508C0E075E001
+:10073000322506F50675E0003507F507E502F58276
+:10074000E503F583E504F500E505F5012200E51074
+:10075000F51FE511F51EE512F51DE513F51C7509EC
+:1007600001E506F500C3E509F5F0E50095F0F509AA
+:10077000E507F500750100E501F5F0E50095F0F5F8
+:1007800001E516F503E501F502E509F582E502F557
+:1007900083E503F0750902E506F500C3E509F5F008
+:1007A000E50095F0F509E507F500750100E501F5AF
+:1007B000F0E50095F0F501E517F503E501F502E533
+:1007C00009F582E502F583E503F0750903E506F511
+:1007D00000C3E509F5F0E50095F0F509E507F5003A
+:1007E000750100E501F5F0E50095F0F50175E00D06
+:1007F0002506F58275E0003507F583E0F508E50884
+:10080000F503E501F502E509F582E502F583E50367
+:10081000F0750904E506F500C3E509F5F0E5009576
+:10082000F0F509E507F500750100E501F5F0E500D3
+:1008300095F0F50175E00C2506F58275E0003507A9
+:10084000F583E0F508E508F503E501F502E509F5AE
+:1008500082E502F583E503F0750905E506F500C3B9
+:10086000E509F5F0E50095F0F509E507F5007501F6
+:1008700000E501F5F0E50095F0F50175E0112506BC
+:10088000F58275E0003507F583E0F508E508F50326
+:10089000E501F502E509F582E502F583E503F0756A
+:1008A0000906E506F500C3E509F5F0E50095F0F564
+:1008B00009E507F500750100E501F5F0E50095F0A3
+:1008C000F50175E0102506F58275E0003507F58322
+:1008D000E0F508E508F503E501F502E509F582E52F
+:1008E00002F583E503F0750907E506F500C3E509A0
+:1008F000F5F0E50095F0F509E507F500750100E56F
+:1009000001F5F0E50095F0F50175E00F2506F5829B
+:1009100075E0003507F583E0F508E508F503E50126
+:10092000F502E509F582E502F583E503F0750908AE
+:10093000E506F500C3E509F5F0E50095F0F509E5F4
+:1009400007F500750100E501F5F0E50095F0F5010A
+:1009500075E00E2506F58275E0003507F583E0F5B4
+:1009600008E508F503E501F502E509F582E502F57C
+:1009700083E503F0750909E506F500C3E509F5F01F
+:10098000E50095F0F509E507F500750100E501F5CD
+:10099000F0E50095F0F50175E0132506F58275E0A8
+:1009A000003507F583E0F508E508F503E501F502F4
+:1009B000E509F582E502F583E503F075090AE50628
+:1009C000F500C3E509F5F0E50095F0F509E507F553
+:1009D00000750100E501F5F0E50095F0F50175E021
+:1009E000122506F58275E0003507F583E0F508E588
+:1009F00008F503E501F502E509F582E502F583E571
+:100A000003F075090BE506F500C3E509F5F0E5000F
+:100A100095F0F509E507F500750100E501F5F0E54C
+:100A20000095F0F501E514F503E501F502E509F59A
+:100A300082E502F583E503F075090CE506F500C3D0
+:100A4000E509F5F0E50095F0F509E507F500750114
+:100A500000E501F5F0E50095F0F501E515F503E594
+:100A600001F502E509F582E502F583E503F01200E0
+:100A70001002066000E506758208C39582F506E55A
+:100A8000077583009583F507D0E0F50875E001252B
+:100A900006F58275E0003507F583E508F0D0E0F54E
+:100AA0000875E0002506F58275E0003507F583E559
+:100AB00008F075E0072506F58275E0003507F58337
+:100AC000E515F075E0062506F58275E0003507F5B9
+:100AD00083E514F075E0052506F58275E00035071D
+:100AE000F583E513F075E0042506F58275E0003521
+:100AF00007F583E512F075E0032506F58275E00041
+:100B00003507F583E511F075E0022506F58275E0FD
+:100B1000003507F583E510F0751F7B751E00751D08
+:100B200000751C00751B00751A00751900751800FA
+:100B3000750C00750D00750E00750F0075100075B1
+:100B40001100751200751300750A00750B007514FD
+:100B500000751500750901E506F500C3E509F5F016
+:100B6000E50095F0F509E507F500750100E501F5EB
+:100B7000F0E50095F0F501E50CF503E501F502E57A
+:100B800009F582E502F583E503F0750902E506F54E
+:100B900000C3E509F5F0E50095F0F509E507F50076
+:100BA000750100E501F5F0E50095F0F501E50DF5BD
+:100BB00003E501F502E509F582E502F583E503F0B9
+:100BC000750903E506F500C3E509F5F0E50095F0C4
+:100BD000F509E507F500750100E501F5F0E500957B
+:100BE000F0F501E50EF503E501F502E509F582E50D
+:100BF00002F583E503F0750904E506F500C3E50990
+:100C0000F5F0E50095F0F509E507F500750100E55B
+:100C100001F5F0E50095F0F501E50FF503E501F5C7
+:100C200002E509F582E502F583E503F0750905E5BE
+:100C300006F500C3E509F5F0E50095F0F509E507CF
+:100C4000F500750100E501F5F0E50095F0F501E529
+:100C500010F503E501F502E509F582E502F583E506
+:100C600003F0750906E506F500C3E509F5F0E500B2
+:100C700095F0F509E507F500750100E501F5F0E5EA
+:100C80000095F0F501E511F503E501F502E509F53B
+:100C900082E502F583E503F0750907E506F500C373
+:100CA000E509F5F0E50095F0F509E507F5007501B2
+:100CB00000E501F5F0E50095F0F501E512F503E535
+:100CC00001F502E509F582E502F583E503F0750912
+:100CD00008E506F500C3E509F5F0E50095F0F5092E
+:100CE000E507F500750100E501F5F0E50095F0F583
+:100CF00001E513F503E501F502E509F582E502F5E5
+:100D000083E503F0750909E506F500C3E509F5F08B
+:100D1000E50095F0F509E507F500750100E501F539
+:100D2000F0E50095F0F501E50AF503E501F502E5CA
+:100D300009F582E502F583E503F075090AE506F594
+:100D400000C3E509F5F0E50095F0F509E507F500C4
+:100D5000750100E501F5F0E50095F0F501E50BF50D
+:100D600003E501F502E509F582E502F583E503F007
+:100D700075090BE506F500C3E509F5F0E50095F00A
+:100D8000F509E507F500750100E501F5F0E50095C9
+:100D9000F0F501E514F503E501F502E509F582E555
+:100DA00002F583E503F075090CE506F500C3E509D6
+:100DB000F5F0E50095F0F509E507F500750100E5AA
+:100DC00001F5F0E50095F0F501E515F503E501F510
+:100DD00002E509F582E502F583E503F0120144908E
+:100DE0000000E582F509900000E583F50A75010031
+:100DF000C3750000E501F5F0E50935F0F501E50002
+:100E0000F5F0E50A35F0F500E500F502E501F582BB
+:100E1000E502F583E0F50B750101C3750000E501FE
+:100E2000F5F0E50935F0F501E500F5F0E50A35F0F6
+:100E3000F500E500F502E501F582E502F583E0F550
+:100E40000C750102C3750000E501F5F0E50935F008
+:100E5000F501E500F5F0E50A35F0F500E500F502ED
+:100E6000E501F582E502F583E0F50D750103C37533
+:100E70000000E501F5F0E50935F0F501E500F5F0D4
+:100E8000E50A35F0F500E500F502E501F582E50239
+:100E9000F583E0F50E75007B750100750900750A94
+:100EA00000750F00C3E500F5F0E50B95F0F500E5E2
+:100EB00000F5F0E50F45F0F50FC3E501F5F0E50CA1
+:100EC00095F0F500E500F5F0E50F45F0F50FC3E509
+:100ED00009F5F0E50D95F0F500E500F5F0E50F45B5
+:100EE000F0F50FC3E50AF5F0E50E95F0F500E50025
+:100EF000F5F0E50F45F0F50F750100750900750A6D
+:100F000000750000E50FF5F0E50045F0F500E5019E
+:100F1000F5F0E50045F0F500E509F5F0E50045F0F0
+:100F2000F500E50AF5F0E50045F0F500E500700292
+:100F3000800302100100750000750100750900753D
+:100F40000A00E500F502E501F503E509F504E50A07
+:100F5000F50575E0072506F58275E0003507F58390
+:100F6000E0F51575E0062506F58275E0003507F514
+:100F700083E0F51475E0052506F58275E000350778
+:100F8000F583E0F51375E0042506F58275E000357C
+:100F900007F583E0F51275E0032506F58275E0009C
+:100FA0003507F583E0F51175E0022506F58275E059
+:100FB000003507F583E0F51075E0002506F582752C
+:100FC000E0003507F583E0F508E508C0E075E001CD
+:100FD0002506F58275E0003507F583E0F508E5089C
+:100FE000C0E075E0082506F50675E0003507F50751
+:100FF000E502F582E503F583E504F500E505F50175
+:101000002200751F01751E00751D00751C00020F62
+:10101000360000000000000000000000000000009A
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR c/25559 */
+/* { dg-do compile } */
+
+#define vs(n) __attribute__((vector_size (n)))
+int vs (-1) a; /* { dg-warning "attribute ignored" } */
+int vs (0) b; /* { dg-error "zero vector size" } */
+int vs (1) c; /* { dg-error "multiple of component size" } */
+int vs (sizeof (int) / 2) d; /* { dg-error "multiple of component size" } */
+int vs (sizeof (int)) e;
+int vs (sizeof (int) * 2) f;
--- /dev/null
+/* PR c/25559 */
+/* { dg-do compile } */
+
+#define vs(n) __attribute__((vector_size (n)))
+int vs (-1) a; /* { dg-warning "attribute ignored" } */
+int vs (0) b; /* { dg-error "zero vector size" } */
+int vs (1) c; /* { dg-error "multiple of component size" } */
+int vs (sizeof (int) / 2) d; /* { dg-error "multiple of component size" } */
+int vs (sizeof (int)) e;
+int vs (sizeof (int) * 2) f;
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O3 -fwhole-program" } */
+/* { dg-final { scan-assembler-not "mystr" } } */
+
+
+extern const char *mystr; /* normally in a header */
+const char *mystr;
+main()
+{
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O3 -fwhole-program" } */
+/* { dg-final { scan-assembler-not "mystr" } } */
+
+
+extern const char *mystr; /* normally in a header */
+const char *mystr;
+main()
+{
+}
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501E509F502E509F503CA
+:10002000E509F504E509F505E501C0E0E500C0E0F6
+:10003000E502F582E503F583E504F500E505F50144
+:10004000220000000000000000000000000000008E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O3 -fwhole-program" } */
+/* { dg-final { scan-assembler "mystr" } } */
+
+
+extern const char *mystr; /* normally in a header */
+const char *mystr __attribute__ ((externally_visible));
+main()
+{
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O3 -fwhole-program" } */
+/* { dg-final { scan-assembler "mystr" } } */
+
+
+extern const char *mystr; /* normally in a header */
+const char *mystr __attribute__ ((externally_visible));
+main()
+{
+}
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501E509F502E509F503CA
+:10002000E509F504E509F505E501C0E0E500C0E0F6
+:10003000E502F582E503F583E504F500E505F50144
+:10004000220000000000000000000000000000008E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do assemble { target i?86-*-* x86_64-*-* } } */
+/* { dg-skip-if "" { "*-*-darwin*" } { "*" } { "" } } */
+/* { dg-options "-std=c99 -x assembler-with-cpp" } */
+
+#ifndef __ASSEMBLER__
+extern int func(void);
+#else
+.global func
+.type func,%function
+.align 4
+func:
+ ret
+.size func,.-func
+#endif
--- /dev/null
+/* { dg-do assemble { target i?86-*-* x86_64-*-* } } */
+/* { dg-skip-if "" { "*-*-darwin*" } { "*" } { "" } } */
+/* { dg-options "-std=c99 -x assembler-with-cpp" } */
+
+#ifndef __ASSEMBLER__
+extern int func(void);
+#else
+.global func
+.type func,%function
+.align 4
+func:
+ ret
+.size func,.-func
+#endif
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR c/26004 */
+/* Bug: the return slot optimization was taking the address of s_3,
+ causing an error. */
+
+struct s_3 { short s[3]; } z_3, s_3;
+struct s_3 add_struct_3 (struct s_3 s){}
+wack_struct_3 (void)
+{
+ int i; register struct s_3 u = z_3;
+ u = add_struct_3 (u);
+}
--- /dev/null
+/* PR c/26004 */
+/* Bug: the return slot optimization was taking the address of s_3,
+ causing an error. */
+
+struct s_3 { short s[3]; } z_3, s_3;
+struct s_3 add_struct_3 (struct s_3 s){}
+wack_struct_3 (void)
+{
+ int i; register struct s_3 u = z_3;
+ u = add_struct_3 (u);
+}
--- /dev/null
+:1000000000E50675820AC39582F506E5077583004B
+:100010009583F507D0E0F51ED0E0F51FE513F51840
+:10002000E512F519E511F51AE510F51BE506F509D8
+:10003000E507F50A750100C3750000E501F5F0E577
+:100040000935F0F501E500F5F0E50A35F0F50A753A
+:100050000900C3750000E509F5F0E50135F0F5018B
+:10006000E500F5F0E50A35F0F500E501F509E500F4
+:10007000F50A750100C3750000E501F5F0E50935E5
+:10008000F0F501E500F5F0E50A35F0F500E500F5DD
+:1000900002E501F582E502F583E0F511750101C382
+:1000A000750000E501F5F0E50935F0F501E500F52D
+:1000B000F0E50A35F0F500E500F502E501F582E529
+:1000C00002F583E0F501750900750A00750E0275E9
+:1000D0000F00751000750000C3750B00E509F5F001
+:1000E000E50EA4F50DE509F5F0E50EA4E5F0F50C37
+:1000F000E50DF5F0E50B35F0F50BE50AF5F0E50E4D
+:10010000A4F50DE50AF5F0E50EA4E5F0F50AE50D18
+:10011000F5F0E50C35F0F50CC3C3750A00E50BF5F9
+:10012000F0E51035F0F510E50CF5F0E50035F0F5EB
+:1001300000C3750C00E509F5F0E50FA4F50DE50920
+:10014000F5F0E50FA4E5F0F50AE50DF5F0E50C3561
+:10015000F0F50C750B00C3C3750900E50BF5F0E570
+:100160001035F0F510E50CF5F0E50035F0F500C3BD
+:10017000750B00750C00C3C3750900E50BF5F0E5C0
+:100180001035F0F510E50CF5F0E50035F0F500C39D
+:10019000750B00750C00C3C3750900E50BF5F0E5A0
+:1001A0001035F0F510E50CF5F0E50035F0F500C37D
+:1001B000750900E510F5F0E51135F0F510E500F5ED
+:1001C000F0E50135F0F511750100C3750000E5019A
+:1001D000F5F0E51D35F0F509E500F5F0E51C35F025
+:1001E000F50A750100C3750000E501F5F0E5093574
+:1001F000F0F501E500F5F0E50A35F0F500E500F56C
+:1002000002E501F582E502F583E0F512750101C30F
+:10021000750000E501F5F0E50935F0F501E500F5BB
+:10022000F0E50A35F0F500E500F502E501F582E5B7
+:1002300002F583E0F513750000750100750C027579
+:100240000D00750E00750F00C3750900E500F5F08F
+:10025000E50CA4F50BE500F5F0E50CA4E5F0F50AD6
+:10026000E50BF5F0E50935F0F509E501F5F0E50CEC
+:10027000A4F50BE501F5F0E50CA4E5F0F501E50BBF
+:10028000F5F0E50A35F0F50AC3C3750100E509F597
+:10029000F0E50E35F0F50EE50AF5F0E50F35F0F571
+:1002A0000FC3750A00E500F5F0E50DA4F50BE500B8
+:1002B000F5F0E50DA4E5F0F501E50BF5F0E50A35FF
+:1002C000F0F50A750900C3C3750000E509F5F0E50E
+:1002D0000E35F0F50EE50AF5F0E50F35F0F50FC334
+:1002E000750900750A00C3C3750000E509F5F0E55E
+:1002F0000E35F0F50EE50AF5F0E50F35F0F50FC314
+:10030000750900750A00C3C3750000E509F5F0E53D
+:100310000E35F0F50EE50AF5F0E50F35F0F50FC3F3
+:10032000750000E50EF5F0E51235F0F500E50FF586
+:10033000F0E51335F0F501E500F509E501F50A757D
+:100340000100C3750000E501F5F0E50935F0F501A0
+:10035000E500F5F0E50A35F0F500E500F502E50108
+:10036000F582E502F583E0F50B750101C375000028
+:10037000E501F5F0E50935F0F501E500F5F0E50AF0
+:1003800035F0F500E500F502E501F582E502F583BB
+:10039000E0F509750100C3750000E501F5F0E51011
+:1003A00035F0F501E500F5F0E51135F0F500E50B68
+:1003B000F503E500F502E501F582E502F583E503C5
+:1003C000F0750101C3750000E501F5F0E51035F0A9
+:1003D000F501E500F5F0E51135F0F500E509F50367
+:1003E000E500F502E501F582E502F583E503F0E5B8
+:1003F00006F509E507F50A750100C3750000E5017A
+:10040000F5F0E50935F0F501E500F5F0E50A35F020
+:10041000F50A750900C3750000E509F5F0E5013539
+:10042000F0F501E500F5F0E50A35F0F500E501F538
+:1004300009E500F50A750100C3750000E501F5F056
+:10044000E50935F0F501E500F5F0E50A35F0F500D0
+:10045000E500F502E501F582E502F583E0F51175A9
+:100460000101C3750000E501F5F0E50935F0F5017E
+:10047000E500F5F0E50A35F0F500E500F502E501E7
+:10048000F582E502F583E0F501750901750A00754D
+:100490000E02750F00751000750000C3750B00E5A6
+:1004A00009F5F0E50EA4F50DE509F5F0E50EA4E576
+:1004B000F0F50CE50DF5F0E50B35F0F50BE50AF57B
+:1004C000F0E50EA4F50DE50AF5F0E50EA4E5F0F56E
+:1004D0000AE50DF5F0E50C35F0F50CC3C3750A001F
+:1004E000E50BF5F0E51035F0F510E50CF5F0E5005D
+:1004F00035F0F500C3750C00E509F5F0E50FA4F53E
+:100500000DE509F5F0E50FA4E5F0F50AE50DF5F0C8
+:10051000E50C35F0F50C750B00C3C3750900E50B50
+:10052000F5F0E51035F0F510E50CF5F0E50035F0E7
+:10053000F500C3750B00750C00C3C3750900E50B0E
+:10054000F5F0E51035F0F510E50CF5F0E50035F0C7
+:10055000F500C3750B00750C00C3C3750900E50BEE
+:10056000F5F0E51035F0F510E50CF5F0E50035F0A7
+:10057000F500C3750900E510F5F0E51135F0F5104B
+:10058000E500F5F0E50135F0F511750100C37500E2
+:1005900000E501F5F0E51D35F0F509E500F5F0E5BC
+:1005A0001C35F0F50A750100C3750000E501F5F092
+:1005B000E50935F0F501E500F5F0E50A35F0F5005F
+:1005C000E500F502E501F582E502F583E0F5127537
+:1005D0000101C3750000E501F5F0E50935F0F5010D
+:1005E000E500F5F0E50A35F0F500E500F502E50176
+:1005F000F582E502F583E0F51375000175010075DC
+:100600000C02750D00750E00750F00C3750900E52D
+:1006100000F5F0E50CA4F50BE500F5F0E50CA4E51C
+:10062000F0F50AE50BF5F0E50935F0F509E501F51A
+:10063000F0E50CA4F50BE501F5F0E50CA4E5F0F50B
+:1006400001E50BF5F0E50A35F0F50AC3C3750100C5
+:10065000E509F5F0E50E35F0F50EE50AF5F0E50FE4
+:1006600035F0F50FC3750A00E500F5F0E50DA4F5CA
+:100670000BE500F5F0E50DA4E5F0F501E50BF5F06F
+:10068000E50A35F0F50A750900C3C3750000E509F0
+:10069000F5F0E50E35F0F50EE50AF5F0E50F35F06D
+:1006A000F50FC3750900750A00C3C3750000E5099D
+:1006B000F5F0E50E35F0F50EE50AF5F0E50F35F04D
+:1006C000F50FC3750900750A00C3C3750000E5097D
+:1006D000F5F0E50E35F0F50EE50AF5F0E50F35F02D
+:1006E000F50FC3750000E50EF5F0E51235F0F500E5
+:1006F000E50FF5F0E51335F0F501E500F509E50145
+:10070000F50A750100C3750000E501F5F0E509354E
+:10071000F0F501E500F5F0E50A35F0F500E500F546
+:1007200002E501F582E502F583E0F50B750101C3F1
+:10073000750000E501F5F0E50935F0F501E500F596
+:10074000F0E50A35F0F500E500F502E501F582E592
+:1007500002F583E0F509750100C3750000E501F5B8
+:10076000F0E51035F0F501E500F5F0E51135F0F5AF
+:1007700000E50BF503E500F502E501F582E502F57C
+:1007800083E503F0750101C3750000E501F5F0E5AF
+:100790001035F0F501E500F5F0E51135F0F500E56F
+:1007A00009F503E500F502E501F582E502F583E5CB
+:1007B00003F0E506F509E507F50A750100C37500C4
+:1007C00000E501F5F0E50935F0F501E500F5F0E5A6
+:1007D0000A35F0F50A750900C3750000E509F5F062
+:1007E000E50135F0F501E500F5F0E50A35F0F50035
+:1007F000E501F509E500F50A750100C3750000E59E
+:1008000001F5F0E50935F0F501E500F5F0E50A350B
+:10081000F0F500E500F502E501F582E502F583E07B
+:10082000F510750101C3750000E501F5F0E5093526
+:10083000F0F501E500F5F0E50A35F0F500E500F525
+:1008400002E501F582E502F583E0F5117500027518
+:100850000100750C02750D00750E00750F00C37553
+:100860000900E500F5F0E50CA4F50BE500F5F0E571
+:100870000CA4E5F0F50AE50BF5F0E50935F0F5090E
+:10088000E501F5F0E50CA4F50BE501F5F0E50CA4A8
+:10089000E5F0F501E50BF5F0E50A35F0F50AC3C31F
+:1008A000750100E509F5F0E50E35F0F50EE50AF500
+:1008B000F0E50F35F0F50FC3750A00E500F5F0E53A
+:1008C0000DA4F50BE500F5F0E50DA4E5F0F501E567
+:1008D0000BF5F0E50A35F0F50A750900C3C375009C
+:1008E00000E509F5F0E50E35F0F50EE50AF5F0E561
+:1008F0000F35F0F50FC3750900750A00C3C3750005
+:1009000000E509F5F0E50E35F0F50EE50AF5F0E540
+:100910000F35F0F50FC3750900750A00C3C37500E4
+:1009200000E509F5F0E50E35F0F50EE50AF5F0E520
+:100930000F35F0F50FC3750000E50EF5F0E5103545
+:10094000F0F500E50FF5F0E51135F0F501750A0059
+:10095000C3750900E50AF5F0E51D35F0F50AE5096E
+:10096000F5F0E51C35F0F509E50AF50BE509F50CA0
+:10097000750A00C3750900E50AF5F0E50B35F0F5D9
+:100980000AE509F5F0E50C35F0F509E509F502E5AC
+:100990000AF582E502F583E0F512750A01C37509CF
+:1009A00000E50AF5F0E50B35F0F50AE509F5F0E5A7
+:1009B0000C35F0F509E509F502E50AF582E502F5E1
+:1009C00083E0F513750902750A00750E02750F00B4
+:1009D000751000751100C3750B00E509F5F0E50E03
+:1009E000A4F50DE509F5F0E50EA4E5F0F50CE50D2F
+:1009F000F5F0E50B35F0F50BE50AF5F0E50EA4F59D
+:100A00000DE50AF5F0E50EA4E5F0F50AE50DF5F0C3
+:100A1000E50C35F0F50CC3C3750A00E50BF5F0E500
+:100A20001035F0F510E50CF5F0E51135F0F511C3D2
+:100A3000750C00E509F5F0E50FA4F50DE509F5F0F5
+:100A4000E50FA4E5F0F50AE50DF5F0E50C35F0F558
+:100A50000C750B00C3C3750900E50BF5F0E5103507
+:100A6000F0F510E50CF5F0E51135F0F511C3750B57
+:100A700000750C00C3C3750900E50BF5F0E51035F2
+:100A8000F0F510E50CF5F0E51135F0F511C3750B37
+:100A900000750C00C3C3750900E50BF5F0E51035D2
+:100AA000F0F510E50CF5F0E51135F0F511C3750919
+:100AB00000E510F5F0E51235F0F509E511F5F0E582
+:100AC0001335F0F50AE509F50BE50AF50C750A0092
+:100AD000C3750900E50AF5F0E50B35F0F50AE509FF
+:100AE000F5F0E50C35F0F509E509F502E50AF582C2
+:100AF000E502F583E0F50D750A01C3750900E50A05
+:100B0000F5F0E50B35F0F50AE509F5F0E50C35F003
+:100B1000F509E509F502E50AF582E502F583E0F558
+:100B20000B750A00C3750900E50AF5F0E50035F01C
+:100B3000F50AE509F5F0E50135F0F509E50DF503F0
+:100B4000E509F502E50AF582E502F583E503F075AE
+:100B50000A01C3750900E50AF5F0E50035F0F50A6C
+:100B6000E509F5F0E50135F0F509E50BF503E509D3
+:100B7000F502E50AF582E502F583E503F07500006C
+:100B8000E500F502E500F503E500F504E500F505EF
+:100B9000E518F513E519F512E51AF511E51BF51041
+:100BA000E51FC0E0E51EC0E075E00A2506F5067504
+:100BB000E0003507F507E502F582E503F583E50476
+:100BC000F500E505F5012200E50675820DC3958265
+:100BD000F506E5077583009583F507D0E0F5087500
+:100BE000E0082506F58275E0003507F583E508F095
+:100BF000D0E0F50875E0072506F58275E0003507B9
+:100C0000F583E508F075E00C2506F58275E0003502
+:100C100007F583E513F075E00B2506F58275E00016
+:100C20003507F583E512F075E00A2506F58275E0D3
+:100C3000003507F583E511F075E0092506F58275A5
+:100C4000E0003507F583E510F0E506F509E507F561
+:100C50000A750100C3750000E501F5F0E50935F0FE
+:100C6000F501E500F5F0E50A35F0F50A750900C370
+:100C7000750000E509F5F0E50135F0F501E500F551
+:100C8000F0E50A35F0F500E501F509E500F50A752E
+:100C90000100C3750000E501F5F0E50935F0F50147
+:100CA000E500F5F0E50A35F0F500E500F502E501AF
+:100CB000F582E502F583E0F511750101C3750000C9
+:100CC000E501F5F0E50935F0F501E500F5F0E50A97
+:100CD00035F0F500E500F502E501F582E502F58362
+:100CE000E0F501750900750A00750E02750F0075B3
+:100CF0001000750000C3750B00E509F5F0E50EA4C2
+:100D0000F50DE509F5F0E50EA4E5F0F50CE50DF5BA
+:100D1000F0E50B35F0F50BE50AF5F0E50EA4F50D61
+:100D2000E50AF5F0E50EA4E5F0F50AE50DF5F0E5C8
+:100D30000C35F0F50CC3C3750A00E50BF5F0E510B2
+:100D400035F0F510E50CF5F0E50035F0F500C3756C
+:100D50000C00E509F5F0E50FA4F50DE509F5F0E562
+:100D60000FA4E5F0F50AE50DF5F0E50C35F0F50C0E
+:100D7000750B00C3C3750900E50BF5F0E51035F000
+:100D8000F510E50CF5F0E50035F0F500C3750B0046
+:100D9000750C00C3C3750900E50BF5F0E51035F0DF
+:100DA000F510E50CF5F0E50035F0F500C3750B0026
+:100DB000750C00C3C3750900E50BF5F0E51035F0BF
+:100DC000F510E50CF5F0E50035F0F500C375090008
+:100DD000E510F5F0E51135F0F512E500F5F0E50167
+:100DE00035F0F513900000E582F509900000E583E9
+:100DF000F50A750100C3750000E501F5F0E5093558
+:100E0000F0F501E500F5F0E50A35F0F500E501F54E
+:100E100009E500F50A750100C3750000E501F5F06C
+:100E2000E50935F0F501E500F5F0E50A35F0F500E6
+:100E3000E500F502E501F582E502F583E0F51075C0
+:100E40000101C3750000E501F5F0E50935F0F50194
+:100E5000E500F5F0E50A35F0F500E500F502E501FD
+:100E6000F582E502F583E0F5117500007501007566
+:100E70000C02750D00750E00750F00C3750900E5B5
+:100E800000F5F0E50CA4F50BE500F5F0E50CA4E5A4
+:100E9000F0F50AE50BF5F0E50935F0F509E501F5A2
+:100EA000F0E50CA4F50BE501F5F0E50CA4E5F0F593
+:100EB00001E50BF5F0E50A35F0F50AC3C37501004D
+:100EC000E509F5F0E50E35F0F50EE50AF5F0E50F6C
+:100ED00035F0F50FC3750A00E500F5F0E50DA4F552
+:100EE0000BE500F5F0E50DA4E5F0F501E50BF5F0F7
+:100EF000E50A35F0F50A750900C3C3750000E50978
+:100F0000F5F0E50E35F0F50EE50AF5F0E50F35F0F4
+:100F1000F50FC3750900750A00C3C3750000E50924
+:100F2000F5F0E50E35F0F50EE50AF5F0E50F35F0D4
+:100F3000F50FC3750900750A00C3C3750000E50904
+:100F4000F5F0E50E35F0F50EE50AF5F0E50F35F0B4
+:100F5000F50FC3750000E50EF5F0E51035F0F5006E
+:100F6000E50FF5F0E51135F0F501E500F509E501CE
+:100F7000F50A750100C3750000E501F5F0E50935D6
+:100F8000F0F501E500F5F0E50A35F0F500E500F5CE
+:100F900002E501F582E502F583E0F50B750101C379
+:100FA000750000E501F5F0E50935F0F501E500F51E
+:100FB000F0E50A35F0F500E500F502E501F582E51A
+:100FC00002F583E0F509750100C3750000E501F540
+:100FD000F0E51235F0F501E500F5F0E51335F0F533
+:100FE00000E50BF503E500F502E501F582E502F504
+:100FF00083E503F0750101C3750000E501F5F0E537
+:101000001235F0F501E500F5F0E51335F0F500E5F2
+:1010100009F503E500F502E501F582E502F583E552
+:1010200003F0E506F509E507F50A750100C375004B
+:1010300000E501F5F0E50935F0F501E500F5F0E52D
+:101040000A35F0F50A750900C3750000E509F5F0E9
+:10105000E50135F0F501E500F5F0E50A35F0F500BC
+:10106000E501F509E500F50A750100C3750000E525
+:1010700001F5F0E50935F0F501E500F5F0E50A3593
+:10108000F0F500E500F502E501F582E502F583E003
+:10109000F511750101C3750000E501F5F0E50935AD
+:1010A000F0F501E500F5F0E50A35F0F500E500F5AD
+:1010B00002E501F582E502F583E0F50175090175A8
+:1010C0000A00750E02750F00751000750000C375DB
+:1010D0000B00E509F5F0E50EA4F50DE509F5F0E5E1
+:1010E0000EA4E5F0F50CE50DF5F0E50B35F0F50B8C
+:1010F000E50AF5F0E50EA4F50DE50AF5F0E50EA418
+:10110000E5F0F50AE50DF5F0E50C35F0F50CC3C397
+:10111000750A00E50BF5F0E51035F0F510E50CF576
+:10112000F0E50035F0F500C3750C00E509F5F0E5D4
+:101130000FA4F50DE509F5F0E50FA4E5F0F50AE5D6
+:101140000DF5F0E50C35F0F50C750B00C3C3750912
+:1011500000E50BF5F0E51035F0F510E50CF5F0E5E0
+:101160000035F0F500C3750B00750C00C3C375099D
+:1011700000E50BF5F0E51035F0F510E50CF5F0E5C0
+:101180000035F0F500C3750B00750C00C3C375097D
+:1011900000E50BF5F0E51035F0F510E50CF5F0E5A0
+:1011A0000035F0F500C3750900E510F5F0E51135DF
+:1011B000F0F512E500F5F0E50135F0F513900000CB
+:1011C000E582F509900000E583F50A750100C37515
+:1011D0000000E501F5F0E50935F0F501E500F5F071
+:1011E000E50A35F0F500E501F509E500F50A7501B8
+:1011F00000C3750000E501F5F0E50935F0F501E5FE
+:1012000000F5F0E50A35F0F500E500F502E501F539
+:1012100082E502F583E0F510750101C3750000E574
+:1012200001F5F0E50935F0F501E500F5F0E50A35E1
+:10123000F0F500E500F502E501F582E502F583E051
+:10124000F511750001750100750C02750D00750E24
+:1012500000750F00C3750900E500F5F0E50CA4F575
+:101260000BE500F5F0E50CA4E5F0F50AE50BF5F06B
+:10127000E50935F0F509E501F5F0E50CA4F50BE518
+:1012800001F5F0E50CA4E5F0F501E50BF5F0E50A54
+:1012900035F0F50AC3C3750100E509F5F0E50E3533
+:1012A000F0F50EE50AF5F0E50F35F0F50FC3750A18
+:1012B00000E500F5F0E50DA4F50BE500F5F0E50D12
+:1012C000A4E5F0F501E50BF5F0E50A35F0F50A7552
+:1012D0000900C3C3750000E509F5F0E50E35F0F52A
+:1012E0000EE50AF5F0E50F35F0F50FC37509007549
+:1012F0000A00C3C3750000E509F5F0E50E35F0F509
+:101300000EE50AF5F0E50F35F0F50FC37509007528
+:101310000A00C3C3750000E509F5F0E50E35F0F5E8
+:101320000EE50AF5F0E50F35F0F50FC3750000E5A1
+:101330000EF5F0E51035F0F500E50FF5F0E51135A7
+:10134000F0F501E500F509E501F50A750100C37541
+:101350000000E501F5F0E50935F0F501E500F5F0EF
+:10136000E50A35F0F500E500F502E501F582E50254
+:10137000F583E0F50B750101C3750000E501F5F09B
+:10138000E50935F0F501E500F5F0E50A35F0F50081
+:10139000E500F502E501F582E502F583E0F5097562
+:1013A0000100C3750000E501F5F0E51235F0F50127
+:1013B000E500F5F0E51335F0F500E50BF503E50084
+:1013C000F502E501F582E502F583E503F07501011B
+:1013D000C3750000E501F5F0E51235F0F501E50013
+:1013E000F5F0E51335F0F500E509F503E500F50244
+:1013F000E501F582E502F583E503F0E506F509E58B
+:1014000007F50A750100C3750000E501F5F0E5096F
+:1014100035F0F501E500F5F0E50A35F0F50A750956
+:1014200000C3750000E509F5F0E50135F0F501E5CB
+:1014300000F5F0E50A35F0F500E501F509E500F500
+:101440000A750100C3750000E501F5F0E50935F006
+:10145000F501E500F5F0E50A35F0F500E500F502E7
+:10146000E501F582E502F583E0F511750101C3752B
+:101470000000E501F5F0E50935F0F501E500F5F0CE
+:10148000E50A35F0F500E500F502E501F582E50233
+:10149000F583E0F501750902750A00750E02750FF6
+:1014A00000751000750000C3750B00E509F5F0E547
+:1014B0000EA4F50DE509F5F0E50EA4E5F0F50CE553
+:1014C0000DF5F0E50B35F0F50BE50AF5F0E50EA4AA
+:1014D000F50DE50AF5F0E50EA4E5F0F50AE50DF5E4
+:1014E000F0E50C35F0F50CC3C3750A00E50BF5F01B
+:1014F000E51035F0F510E50CF5F0E50035F0F500F8
+:10150000C3750C00E509F5F0E50FA4F50DE509F547
+:10151000F0E50FA4E5F0F50AE50DF5F0E50C35F082
+:10152000F50C750B00C3C3750900E50BF5F0E5106C
+:1015300035F0F510E50CF5F0E50035F0F500C37574
+:101540000B00750C00C3C3750900E50BF5F0E51041
+:1015500035F0F510E50CF5F0E50035F0F500C37554
+:101560000B00750C00C3C3750900E50BF5F0E51021
+:1015700035F0F510E50CF5F0E50035F0F500C37534
+:101580000900E510F5F0E51135F0F512E500F5F08C
+:10159000E50135F0F513900000E582F509900000B3
+:1015A000E583F50A750100C3750000E501F5F0E576
+:1015B0000935F0F501E500F5F0E50A35F0F500E54F
+:1015C00001F509E500F50A750100C3750000E501A4
+:1015D000F5F0E50935F0F501E500F5F0E50A35F03F
+:1015E000F500E500F502E501F582E502F583E0F599
+:1015F00010750101C3750000E501F5F0E50935F04E
+:10160000F501E500F5F0E50A35F0F500E500F50235
+:10161000E501F582E502F583E0F51175000275013B
+:1016200000750C02750D00750E00750F00C375096D
+:1016300000E500F5F0E50CA4F50BE500F5F0E50C90
+:10164000A4E5F0F50AE50BF5F0E50935F0F509E557
+:1016500001F5F0E50CA4F50BE501F5F0E50CA4E5CA
+:10166000F0F501E50BF5F0E50A35F0F50AC3C375B1
+:101670000100E509F5F0E50E35F0F50EE50AF5F0A7
+:10168000E50F35F0F50FC3750A00E500F5F0E50D3F
+:10169000A4F50BE500F5F0E50DA4E5F0F501E50B8B
+:1016A000F5F0E50A35F0F50A750900C3C3750000C9
+:1016B000E509F5F0E50E35F0F50EE50AF5F0E50F74
+:1016C00035F0F50FC3750900750A00C3C375000036
+:1016D000E509F5F0E50E35F0F50EE50AF5F0E50F54
+:1016E00035F0F50FC3750900750A00C3C375000016
+:1016F000E509F5F0E50E35F0F50EE50AF5F0E50F34
+:1017000035F0F50FC3750000E50EF5F0E51035F086
+:10171000F500E50FF5F0E51135F0F501E500F50907
+:10172000E501F50A750100C3750000E501F5F0E576
+:101730000935F0F501E500F5F0E50A35F0F500E5CD
+:1017400000F502E501F582E502F583E0F50B750190
+:1017500001C3750000E501F5F0E50935F0F501E597
+:1017600000F5F0E50A35F0F500E500F502E501F5D4
+:1017700082E502F583E0F509750100C3750000E517
+:1017800001F5F0E51235F0F501E500F5F0E513356A
+:10179000F0F500E50BF503E500F502E501F582E55E
+:1017A00002F583E503F0750101C3750000E501F55D
+:1017B000F0E51235F0F501E500F5F0E51335F0F54B
+:1017C00000E509F503E500F502E501F582E502F51E
+:1017D00083E503F0E506F50AE507F501750900C3A1
+:1017E000750000E509F5F0E50A35F0F51FE500F5AF
+:1017F000F0E50135F0F51EE506F50AE507F501759A
+:101800000900C3750000E509F5F0E50A35F0F51D9E
+:10181000E500F5F0E50135F0F51C12000075E00675
+:101820002506F58275E0003507F583E0F50275E0E1
+:10183000062506F58275E0003507F583E0F50375AA
+:10184000E0062506F58275E0003507F583E0F5042E
+:1018500075E0062506F58275E0003507F583E0F5AD
+:101860000575E00C2506F58275E0003507F583E087
+:10187000F51375E00B2506F58275E0003507F58355
+:10188000E0F51275E00A2506F58275E0003507F5EA
+:1018900083E0F51175E0092506F58275E00035074E
+:1018A000F583E0F51075E0072506F58275E0003553
+:1018B00007F583E0F508E508C0E075E0082506F5C2
+:1018C0008275E0003507F583E0F508E508C0E075AE
+:1018D000E00D2506F50675E0003507F507E502F58C
+:1018E00082E503F583E504F500E505F50122000036
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fprofile-generate -fprofile-use" } */
+
+unsigned test (unsigned a, unsigned b)
+{
+ return a / b;
+} /* { dg-warning "execution counts estimated" } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fprofile-generate -fprofile-use" } */
+
+unsigned test (unsigned a, unsigned b)
+{
+ return a / b;
+} /* { dg-warning "execution counts estimated" } */
--- /dev/null
+:1000000000E506758212C39582F506E50775830043
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F075E0E3
+:10004000092506F58275E0003507F583E517F0759B
+:10005000E0082506F58275E0003507F583E516F022
+:1000600075E0072506F58275E0003507F583E5158F
+:10007000F075E0062506F58275E0003507F583E5A5
+:1000800014F075E0052506F58275E0003507F58367
+:10009000E513F075E0042506F58275E0003507F5F7
+:1000A00083E512F075E0032506F58275E00035075B
+:1000B000F583E511F075E0022506F58275E000355F
+:1000C00007F583E510F0E51FF500E51EF501E51DD8
+:1000D000F509E51CF50AE51AF515E519F513750F8F
+:1000E00000751000751100751200E500F516E501A8
+:1000F000F514E509F50DE50AF50E750C0075170008
+:10010000751900751A00750B00750A01750001C399
+:10011000E518F5F0E50E95F0F509E50BF5F0E50BC2
+:1001200035F0F509E509F5F0E50055F0F500E500D5
+:10013000F5F0E50C45F0F50C750001C3E518F5F098
+:10014000E50E95F0F509E50BF5F0E50B35F0F50951
+:10015000E50EF5F0E51895F0F501E50BF5F0E50B8A
+:1001600035F0F501E501F5F0E50945F0F509E50A99
+:10017000F5F0E50965F0F509E509F5F0E50055F05C
+:10018000F500C3E513F5F0E50D95F0F509E50BF580
+:10019000F0E50B35F0F509E509F5F0E50055F0F56A
+:1001A00000E500F5F0E50C45F0F50C750001C3E540
+:1001B00018F5F0E50E95F0F509E50BF5F0E50B35D2
+:1001C000F0F509E50EF5F0E51895F0F501E50BF50C
+:1001D000F0E50B35F0F501E501F5F0E50945F0F541
+:1001E00009E50AF5F0E50965F0F509E509F5F0E539
+:1001F0000055F0F500C3E513F5F0E50D95F0F509B0
+:10020000E50BF5F0E50B35F0F509E50DF5F0E51337
+:1002100095F0F501E50BF5F0E50B35F0F501E5019D
+:10022000F5F0E50945F0F509E50AF5F0E50965F0B1
+:10023000F509E509F5F0E50055F0F500C3E515F51C
+:10024000F0E51495F0F509E50BF5F0E50B35F0F563
+:1002500009E509F5F0E50055F0F500E500F5F0E5F4
+:100260000C45F0F50C750001C3E518F5F0E50E95A9
+:10027000F0F509E50BF5F0E50B35F0F509E50EF5C0
+:10028000F0E51895F0F501E50BF5F0E50B35F0F527
+:1002900001E501F5F0E50945F0F509E50AF5F0E5B8
+:1002A0000965F0F509E509F5F0E50055F0F500C33D
+:1002B000E513F5F0E50D95F0F509E50BF5F0E50B27
+:1002C00035F0F509E50DF5F0E51395F0F501E50BD1
+:1002D000F5F0E50B35F0F501E501F5F0E50945F040
+:1002E000F509E50AF5F0E50965F0F509E509F5F028
+:1002F000E50055F0F500C3E515F5F0E51495F0F5CA
+:1003000009E50BF5F0E50B35F0F509E514F5F0E539
+:100310001595F0F501E50BF5F0E50B35F0F501E588
+:1003200001F5F0E50945F0F509E50AF5F0E509659F
+:10033000F0F509E509F5F0E50055F0F500C3E51B1A
+:10034000F5F0E51695F0F509E50BF5F0E50B35F060
+:10035000F509E509F5F0E50055F0F500E500F5F0E3
+:10036000E50C45F0F50CE517F500E519F501E51A82
+:10037000F509E50CF50B750C01C3750A00E50BF5E5
+:10038000F0E50A95F0F50A750A00E50AF5F0E50AC8
+:1003900035F0F50AE50AF5F0E50C65F0F50CC375E6
+:1003A0000A00E500F5F0E50A95F0F50A750A00E5A2
+:1003B0000AF5F0E50A35F0F50AE50AF5F0E50C6511
+:1003C000F0F50CC3750A00E501F5F0E50A95F0F5C6
+:1003D0000A750A00E50AF5F0E50A35F0F50AE50ABE
+:1003E000F5F0E50C65F0F50CC3750A00E509F5F0CC
+:1003F000E50A95F0F50A750A00E50AF5F0E50A3513
+:10040000F0F50AE50AF5F0E50C65F0F50C7500006D
+:10041000750100750900E500F50BE501F50A7501A8
+:1004200001C3750000E50CF5F0E50095F0F50075E9
+:100430000000E500F5F0E50035F0F500E500F5F029
+:10044000E50165F0F501C3750000E50BF5F0E50089
+:1004500095F0F500750000E500F5F0E50035F0F5E4
+:1004600000E500F5F0E50165F0F501C3750000E574
+:100470000AF5F0E50095F0F500750000E500F5F0EF
+:10048000E50035F0F500E500F5F0E50165F0F50172
+:10049000C3750000E509F5F0E50095F0F50075007D
+:1004A00000E500F5F0E50035F0F500E500F5F0E5D4
+:1004B0000165F0F501750900750A00750B007500FE
+:1004C00000E501F5F0E50045F0F500E509F5F0E59A
+:1004D0000045F0F500E50AF5F0E50045F0F500E52A
+:1004E0000BF5F0E50045F0F500E500700280030231
+:1004F000055700750001750100750900750A00C3F4
+:10050000750B00E500F5F0E50F35F0F50FE501F5A9
+:10051000F0E51035F0F510E509F5F0E51135F0F5E9
+:1005200011E50AF5F0E51235F0F512C3E51BF5F01B
+:10053000E51695F0F516E515F5F0E51495F0F514CA
+:10054000E513F5F0E50D95F0F50DE518F5F0E50E80
+:1005500095F0F50E0200FA00E50FF502E510F5033F
+:10056000E511F504E512F50575E0092506F5827536
+:10057000E0003507F583E0F51775E0082506F582FC
+:1005800075E0003507F583E0F51675E0072506F5FB
+:100590008275E0003507F583E0F51575E006250660
+:1005A000F58275E0003507F583E0F51475E0052563
+:1005B00006F58275E0003507F583E0F51375E00474
+:1005C0002506F58275E0003507F583E0F51275E044
+:1005D000032506F58275E0003507F583E0F5117512
+:1005E000E0022506F58275E0003507F583E0F51099
+:1005F00075E0002506F58275E0003507F583E0F526
+:1006000008E508C0E075E0012506F58275E00035D3
+:1006100007F583E0F508E508C0E075E0122506F56A
+:100620000675E0003507F507E502F582E503F58379
+:10063000E504F500E505F5012200E50675820AC32B
+:100640009582F506E5077583009583F507D0E0F5FB
+:100650000875E0012506F58275E0003507F583E5AC
+:1006600008F0D0E0F50875E0002506F58275E00099
+:100670003507F583E508F0120000E582F502E58311
+:10068000F503E500F504E501F505E502F500E503F0
+:10069000F501E504F509E505F50AE500F502E501D2
+:1006A000F503E509F504E50AF50575E0002506F50D
+:1006B0008275E0003507F583E0F508E508C0E075D0
+:1006C000E0012506F58275E0003507F583E0F508C1
+:1006D000E508C0E075E00A2506F50675E000350777
+:1006E000F507E502F582E503F583E504F500E50588
+:1006F000F5012200000000000000000000000000E2
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+long long foo(int i, int j)
+{
+ return i ? (long long)(!j) : 0;
+}
+
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+long long foo(int i, int j)
+{
+ return i ? (long long)(!j) : 0;
+}
+
--- /dev/null
+:1000000000E50675820AC39582F506E5077583004B
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F0E51241
+:10004000F501E511F509E510F50F750000E51FF55F
+:10005000F0E50045F0F500E51EF5F0E50045F0F5AA
+:1000600000E51DF5F0E50045F0F500E51CF5F0E5CF
+:100070000045F0F500E500700280030200F0007515
+:100080000E00750000750A00750B00E50EF502E51F
+:1000900000F503E50AF504E50BF505E501F512E5C4
+:1000A00009F511E50FF51075E0002506F58275E0FC
+:1000B000003507F583E0F508E508C0E075E00125A7
+:1000C00006F58275E0003507F583E0F508E508C020
+:1000D000E075E00A2506F50675E0003507F507E549
+:1000E00002F582E503F583E504F500E505F5012257
+:1000F00000E51BF500E51AF50AE519F50BE518F51D
+:100100000C750E01C3750D00E500F5F0E50D95F0D9
+:10011000F50D750D00E50DF5F0E50D35F0F50DE586
+:100120000DF5F0E50E65F0F50EC3750D00E50AF569
+:10013000F0E50D95F0F50D750D00E50DF5F0E50D0B
+:1001400035F0F50DE50DF5F0E50E65F0F50EC3752E
+:100150000D00E50BF5F0E50D95F0F50D750D00E5DD
+:100160000DF5F0E50D35F0F50DE50DF5F0E50E6555
+:10017000F0F50EC3750D00E50CF5F0E50D95F0F505
+:100180000D750D00E50DF5F0E50D35F0F50DE50DFE
+:10019000F5F0E50E65F0F50E750000750A00750BBB
+:1001A0000002008B000000000000000000000000C2
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O -ftree-vrp -fwrapv" } */
+
+extern void bar(int);
+void checkgroups(int last, int verbose)
+{
+ int window = 0;
+ int outstanding = 0;
+ while (window < last || outstanding) {
+ while (outstanding < 47 && window < last) {
+ if (window < last) {
+ outstanding++;
+ if (verbose)
+ bar(window);
+ bar(window++);
+ }
+ }
+ if (outstanding > 0)
+ bar(0);
+ }
+}
+
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O -ftree-vrp -fwrapv" } */
+
+extern void bar(int);
+void checkgroups(int last, int verbose)
+{
+ int window = 0;
+ int outstanding = 0;
+ while (window < last || outstanding) {
+ while (outstanding < 47 && window < last) {
+ if (window < last) {
+ outstanding++;
+ if (verbose)
+ bar(window);
+ bar(window++);
+ }
+ }
+ if (outstanding > 0)
+ bar(0);
+ }
+}
+
--- /dev/null
+:100000000000E50675821BC39582F506E50775833A
+:10001000009583F507D0E0F50875E00A2506F5821E
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000092506F58275E0003507F583E508F075BA
+:10004000E0122506F58275E0003507F583E517F027
+:1000500075E0112506F58275E0003507F583E51694
+:10006000F075E0102506F58275E0003507F583E5AB
+:1000700015F075E00F2506F58275E0003507F5836C
+:10008000E514F075E00E2506F58275E0003507F5FC
+:1000900083E513F075E00D2506F58275E000350760
+:1000A000F583E512F075E00C2506F58275E0003564
+:1000B00007F583E511F075E00B2506F58275E00084
+:1000C0003507F583E510F075E0072506F58275E044
+:1000D000003507F583E51FF0E51EF514E51DF51164
+:1000E00075E0002506F58275E0003507F583E51C0F
+:1000F000F075E0042506F58275E0003507F583E527
+:100100001BF075E0032506F58275E0003507F583E1
+:10011000E51AF075E0022506F58275E0003507F571
+:1001200083E519F075E0012506F58275E0003507D5
+:10013000F583E518F0751700751200751000750845
+:100140000075E0062506F58275E0003507F583E5C4
+:1001500008F075080075E0082506F58275E00035A1
+:1001600007F583E508F0751600751300750800752E
+:10017000E0052506F58275E0003507F583E508F012
+:1001800075E0062506F58275E0003507F583E0F594
+:100190000E75E0002506F58275E0003507F583E071
+:1001A000F50D750080E500F5F0E50E25F0F50EE59E
+:1001B00000F5F0E50D25F0F50D750C00750F0075D7
+:1001C0001500751800750B00750A01750001C3E56F
+:1001D0000DF5F0E50E95F0F509E50BF5F0E50B35BD
+:1001E000F0F509E509F5F0E50055F0F500E500F555
+:1001F000F0E50C45F0F50C750001C3E50DF5F0E5F3
+:100200000E95F0F509E50BF5F0E50B35F0F509E590
+:100210000EF5F0E50D95F0F501E50BF5F0E50B3584
+:10022000F0F501E501F5F0E50945F0F509E50AF518
+:10023000F0E50965F0F509E509F5F0E50055F0F59B
+:1002400000C3E511F5F0E51095F0F509E50BF5F0C3
+:10025000E50B35F0F509E509F5F0E50055F0F50099
+:10026000E500F5F0E50C45F0F50C750001C3E50D72
+:10027000F5F0E50E95F0F509E50BF5F0E50B35F039
+:10028000F509E50EF5F0E50D95F0F501E50BF5F056
+:10029000E50B35F0F501E501F5F0E50945F0F50967
+:1002A000E50AF5F0E50965F0F509E509F5F0E50081
+:1002B00055F0F500C3E511F5F0E51095F0F509E509
+:1002C0000BF5F0E50B35F0F509E510F5F0E51195C6
+:1002D000F0F501E50BF5F0E50B35F0F501E501F57D
+:1002E000F0E50945F0F509E50AF5F0E50965F0F5F1
+:1002F00009E509F5F0E50055F0F500C3E514F5F062
+:10030000E51295F0F509E50BF5F0E50B35F0F5098B
+:10031000E509F5F0E50055F0F500E500F5F0E50C30
+:1003200045F0F50C750001C3E50DF5F0E50E95F00F
+:10033000F509E50BF5F0E50B35F0F509E50EF5F0FF
+:10034000E50D95F0F501E50BF5F0E50B35F0F50160
+:10035000E501F5F0E50945F0F509E50AF5F0E509EF
+:1003600065F0F509E509F5F0E50055F0F500C3E5A0
+:1003700011F5F0E51095F0F509E50BF5F0E50B3515
+:10038000F0F509E510F5F0E51195F0F501E50BF54F
+:10039000F0E50B35F0F501E501F5F0E50945F0F57F
+:1003A00009E50AF5F0E50965F0F509E509F5F0E577
+:1003B0000055F0F500C3E514F5F0E51295F0F509E8
+:1003C000E50BF5F0E50B35F0F509E512F5F0E51470
+:1003D00095F0F501E50BF5F0E50B35F0F501E501DC
+:1003E000F5F0E50945F0F509E50AF5F0E50965F0F0
+:1003F000F509E509F5F0E50055F0F500C375E007EE
+:100400002506F58275E0003507F583E0F508E50877
+:10041000F5F0E51795F0F509E50BF5F0E50B35F08E
+:10042000F509E509F5F0E50055F0F500E500F5F012
+:10043000E50C45F0F50C750000E50CF5F0E5004520
+:10044000F0F500E50FF5F0E50045F0F500E515F5F0
+:10045000F0E50045F0F500E518F5F0E50045F0F5AC
+:1004600000E500700280030214D20075000075E000
+:10047000082506F58275E0003507F583E0F508E507
+:1004800008F5F0E50045F0F500E516F5F0E5004566
+:10049000F0F500E513F5F0E50045F0F50075E00531
+:1004A0002506F58275E0003507F583E0F508E508D7
+:1004B000F5F0E50045F0F500E50070028003021458
+:1004C000C200750000750100750900750A00750C01
+:1004D00001C3750B00E500F5F0E50B95F0F50B7524
+:1004E0000B00E50BF5F0E50B35F0F50BE50BF5F042
+:1004F000E50C65F0F50CC3750B00E501F5F0E50BB7
+:1005000095F0F50B750B00E50BF5F0E50B35F0F507
+:100510000BE50BF5F0E50C65F0F50CC3750B00E58C
+:1005200009F5F0E50B95F0F50B750B00E50BF5F013
+:10053000E50B35F0F50BE50BF5F0E50C65F0F50C8A
+:10054000C3750B00E50AF5F0E50B95F0F50B750B9F
+:1005500000E50BF5F0E50B35F0F50BE50BF5F0E5F7
+:100560000C65F0F50C750100750900750A00750041
+:1005700000E50CF5F0E50045F0F500E501F5F0E5E6
+:100580000045F0F500E509F5F0E50045F0F500E57A
+:100590000AF5F0E50045F0F500E500700280030281
+:1005A00013DD00751B2F751500750C00750D00759A
+:1005B000E0052506F58275E0003507F583E0F50EC8
+:1005C000750080E500F5F0E50E25F0F50EE500F587
+:1005D000F0E50D25F0F50D750B0075180075190087
+:1005E000751A00750A00750F01750001C3E50DF558
+:1005F000F0E50E95F0F509E50AF5F0E50A35F0F5B8
+:1006000009E509F5F0E50055F0F500E500F5F0E540
+:100610000B45F0F50B750001C3E50DF5F0E50E9502
+:10062000F0F509E50AF5F0E50A35F0F509E50EF50E
+:10063000F0E50D95F0F501E50AF5F0E50A35F0F580
+:1006400001E501F5F0E50945F0F509E50FF5F0E5FF
+:100650000965F0F509E509F5F0E50055F0F500C389
+:10066000E50CF5F0E51395F0F509E50AF5F0E50A76
+:1006700035F0F509E509F5F0E50055F0F500E50080
+:10068000F5F0E50B45F0F50B750001C3E50DF5F050
+:10069000E50E95F0F509E50AF5F0E50A35F0F509FE
+:1006A000E50EF5F0E50D95F0F501E50AF5F0E50A42
+:1006B00035F0F501E501F5F0E50945F0F509E50F3F
+:1006C000F5F0E50965F0F509E509F5F0E50055F007
+:1006D000F500C3E50CF5F0E51395F0F509E50AF52D
+:1006E000F0E50A35F0F509E513F5F0E50C95F0F5C0
+:1006F00001E50AF5F0E50A35F0F501E501F5F0E56B
+:100700000945F0F509E50FF5F0E50965F0F509E5AE
+:1007100009F5F0E50055F0F500C3E515F5F0E5162F
+:1007200095F0F509E50AF5F0E50A35F0F509E50972
+:10073000F5F0E50055F0F500E500F5F0E50B45F0C6
+:10074000F50B750001C3E50DF5F0E50E95F0F50923
+:10075000E50AF5F0E50A35F0F509E50EF5F0E50DE9
+:1007600095F0F501E50AF5F0E50A35F0F501E5014A
+:10077000F5F0E50945F0F509E50FF5F0E50965F057
+:10078000F509E509F5F0E50055F0F500C3E50CF5D0
+:10079000F0E51395F0F509E50AF5F0E50A35F0F511
+:1007A00009E513F5F0E50C95F0F501E50AF5F0E53E
+:1007B0000A35F0F501E501F5F0E50945F0F509E543
+:1007C0000FF5F0E50965F0F509E509F5F0E50055E7
+:1007D000F0F500C3E515F5F0E51695F0F509E50A25
+:1007E000F5F0E50A35F0F509E516F5F0E51595F0B3
+:1007F000F501E50AF5F0E50A35F0F501E501F5F05A
+:10080000E50945F0F509E50FF5F0E50965F0F509AD
+:10081000E509F5F0E50055F0F500C3E51BF5F075C9
+:10082000E0082506F58275E0003507F583E0F50858
+:10083000E50895F0F509E50AF5F0E50A35F0F50962
+:10084000E509F5F0E50055F0F500E500F5F0E50BFC
+:1008500045F0F50B750000E50BF5F0E50045F0F50A
+:1008600000E518F5F0E50045F0F500E519F5F0E5CF
+:100870000045F0F500E51AF5F0E50045F0F500E576
+:1008800000700280030210D200750000750100752F
+:100890000900750A00750C01C3750B00E500F5F041
+:1008A000E50B95F0F50B750B00E50BF5F0E50B3559
+:1008B000F0F50BE50BF5F0E50C65F0F50CC3750BE9
+:1008C00000E501F5F0E50B95F0F50B750B00E50B78
+:1008D000F5F0E50B35F0F50BE50BF5F0E50C65F003
+:1008E000F50CC3750B00E509F5F0E50B95F0F50B7C
+:1008F000750B00E50BF5F0E50B35F0F50BE50BF5A9
+:10090000F0E50C65F0F50CC3750B00E50AF5F0E5B4
+:100910000B95F0F50B750B00E50BF5F0E50B35F0DD
+:10092000F50BE50BF5F0E50C65F0F50C75010075C0
+:100930000900750A00750000E50CF5F0E50045F0CA
+:10094000F500E501F5F0E50045F0F500E509F5F005
+:10095000E50045F0F500E50AF5F0E50045F0F500A5
+:10096000E50070028003020DD80075E0062506F54B
+:100970008275E0003507F583E0F50E75E000250689
+:10098000F58275E0003507F583E0F50D750080E52B
+:1009900000F5F0E50E25F0F50EE500F5F0E50D2586
+:1009A000F0F50D750C00750F0075150075180075C4
+:1009B0000B00750A01750001C3E50DF5F0E50E9514
+:1009C000F0F509E50BF5F0E50B35F0F509E509F56E
+:1009D000F0E50055F0F500E500F5F0E50C45F0F523
+:1009E0000C750001C3E50DF5F0E50E95F0F509E590
+:1009F0000BF5F0E50B35F0F509E50EF5F0E50D9595
+:100A0000F0F501E50BF5F0E50B35F0F501E501F545
+:100A1000F0E50945F0F509E50AF5F0E50965F0F5B9
+:100A200009E509F5F0E50055F0F500C3E511F5F02D
+:100A3000E51095F0F509E50BF5F0E50B35F0F50956
+:100A4000E509F5F0E50055F0F500E500F5F0E50CF9
+:100A500045F0F50C750001C3E50DF5F0E50E95F0D8
+:100A6000F509E50BF5F0E50B35F0F509E50EF5F0C8
+:100A7000E50D95F0F501E50BF5F0E50B35F0F50129
+:100A8000E501F5F0E50945F0F509E50AF5F0E509B8
+:100A900065F0F509E509F5F0E50055F0F500C3E569
+:100AA00011F5F0E51095F0F509E50BF5F0E50B35DE
+:100AB000F0F509E510F5F0E51195F0F501E50BF518
+:100AC000F0E50B35F0F501E501F5F0E50945F0F548
+:100AD00009E50AF5F0E50965F0F509E509F5F0E540
+:100AE0000055F0F500C3E514F5F0E51295F0F509B1
+:100AF000E50BF5F0E50B35F0F509E509F5F0E50056
+:100B000055F0F500E500F5F0E50C45F0F50C750045
+:100B100001C3E50DF5F0E50E95F0F509E50BF5F0EF
+:100B2000E50B35F0F509E50EF5F0E50D95F0F5016D
+:100B3000E50BF5F0E50B35F0F501E501F5F0E5091C
+:100B400045F0F509E50AF5F0E50965F0F509E5096F
+:100B5000F5F0E50055F0F500C3E511F5F0E5109569
+:100B6000F0F509E50BF5F0E50B35F0F509E510F5C5
+:100B7000F0E51195F0F501E50BF5F0E50B35F0F535
+:100B800001E501F5F0E50945F0F509E50AF5F0E5BF
+:100B90000965F0F509E509F5F0E50055F0F500C344
+:100BA000E514F5F0E51295F0F509E50BF5F0E50B28
+:100BB00035F0F509E512F5F0E51495F0F501E50BD2
+:100BC000F5F0E50B35F0F501E501F5F0E50945F047
+:100BD000F509E50AF5F0E50965F0F509E509F5F02F
+:100BE000E50055F0F500C375E0072506F58275E0D0
+:100BF000003507F583E0F508E508F5F0E51795F011
+:100C0000F509E50BF5F0E50B35F0F509E509F5F02B
+:100C1000E50055F0F500E500F5F0E50C45F0F50CC4
+:100C2000750000E50CF5F0E50045F0F500E50FF581
+:100C3000F0E50045F0F500E515F5F0E50045F0F5C7
+:100C400000E518F5F0E50045F0F500E500700280DC
+:100C500003020C58000205A3007500017501007520
+:100C60000900750A00C3750B00E500F5F075E00892
+:100C70002506F58275E0003507F583E0F508E508FF
+:100C800035F0F50875E0082506F58275E0003507B2
+:100C9000F583E508F0E501F5F0E51635F0F516E524
+:100CA00009F5F0E51335F0F513E50AF5F075E00503
+:100CB0002506F58275E0003507F583E0F508E508BF
+:100CC00035F0F50875E0052506F58275E000350775
+:100CD000F583E508F075000075E0042506F58275DA
+:100CE000E0003507F583E0F508E508F5F0E5004597
+:100CF000F0F50075E0032506F58275E0003507F58F
+:100D000083E0F508E508F5F0E50045F0F50075E04D
+:100D1000022506F58275E0003507F583E0F508E564
+:100D200008F5F0E50045F0F50075E0012506F582CF
+:100D300075E0003507F583E0F508E508F5F0E50016
+:100D400045F0F500E50070028003020DB700E517DD
+:100D5000F51FE512F51EE510F51D75E0062506F5F3
+:100D60008275E0003507F583E0F51C750901750112
+:100D700000750000750A00C3750B00E509F5F0E584
+:100D80001F35F0F517E501F5F0E51E35F0F512E534
+:100D900000F5F0E51D35F0F510E50AF5F0E51C3538
+:100DA000F0F50875E0062506F58275E0003507F5D3
+:100DB00083E508F00205A300E517F51FE512F51E0F
+:100DC000E510F51D75E0062506F58275E00035078E
+:100DD000F583E0F51C020D4E00751B0075150075BE
+:100DE0000D00750E0075E0052506F58275E00035ED
+:100DF00007F583E0F50C750080E500F5F0E50E25BC
+:100E0000F0F50EE500F5F0E50C25F0F50C750B009E
+:100E1000751800751900751A00750A00750F0175AF
+:100E20000001C3E50CF5F0E50E95F0F509E50AF5CE
+:100E3000F0E50A35F0F509E509F5F0E50055F0F5BE
+:100E400000E500F5F0E50B45F0F50B750001C3E595
+:100E50000CF5F0E50E95F0F509E50AF5F0E50A3533
+:100E6000F0F509E50EF5F0E50C95F0F501E50AF56C
+:100E7000F0E50A35F0F501E501F5F0E50945F0F595
+:100E800009E50FF5F0E50965F0F509E509F5F0E587
+:100E90000055F0F500C3E513F5F0E50D95F0F50903
+:100EA000E50AF5F0E50A35F0F509E509F5F0E500A4
+:100EB00055F0F500E500F5F0E50B45F0F50B750094
+:100EC00001C3E50CF5F0E50E95F0F509E50AF5F03E
+:100ED000E50A35F0F509E50EF5F0E50C95F0F501BC
+:100EE000E50AF5F0E50A35F0F501E501F5F0E5096B
+:100EF00045F0F509E50FF5F0E50965F0F509E509B7
+:100F0000F5F0E50055F0F500C3E513F5F0E50D95B6
+:100F1000F0F509E50AF5F0E50A35F0F509E50DF516
+:100F2000F0E51395F0F501E50AF5F0E50A35F0F581
+:100F300001E501F5F0E50945F0F509E50FF5F0E506
+:100F40000965F0F509E509F5F0E50055F0F500C390
+:100F5000E516F5F0E51595F0F509E50AF5F0E50A71
+:100F600035F0F509E509F5F0E50055F0F500E50087
+:100F7000F5F0E50B45F0F50B750001C3E50CF5F058
+:100F8000E50E95F0F509E50AF5F0E50A35F0F50905
+:100F9000E50EF5F0E50C95F0F501E50AF5F0E50A4A
+:100FA00035F0F501E501F5F0E50945F0F509E50F46
+:100FB000F5F0E50965F0F509E509F5F0E50055F00E
+:100FC000F500C3E513F5F0E50D95F0F509E50AF533
+:100FD000F0E50A35F0F509E50DF5F0E51395F0F5C6
+:100FE00001E50AF5F0E50A35F0F501E501F5F0E572
+:100FF0000945F0F509E50FF5F0E50965F0F509E5B6
+:1010000009F5F0E50055F0F500C3E516F5F0E51536
+:1010100095F0F509E50AF5F0E50A35F0F509E5156D
+:10102000F5F0E51695F0F501E50AF5F0E50A35F07D
+:10103000F501E501F5F0E50945F0F509E50FF5F0F5
+:10104000E50965F0F509E509F5F0E50055F0F5006D
+:10105000C375E0082506F58275E0003507F583E0E5
+:10106000F508E508F5F0E51B95F0F509E50AF5F05A
+:10107000E50A35F0F509E509F5F0E50055F0F5006C
+:10108000E500F5F0E50B45F0F50B750000E50BF517
+:10109000F0E50045F0F500E518F5F0E50045F0F560
+:1010A00000E519F5F0E50045F0F500E51AF5F0E585
+:1010B0000045F0F500E500700280030210C2000256
+:1010C000018000751F00751E00751D00751C000253
+:1010D00001800075E0062506F58275E0003507F50C
+:1010E00083E0F50E75E0002506F58275E000350712
+:1010F000F583E0F50D750080E500F5F0E50E25F0CF
+:10110000F50EE500F5F0E50D25F0F50D750C007513
+:101110000F00751500751800750B00750A01750034
+:1011200001C3E50DF5F0E50E95F0F509E50BF5F0D9
+:10113000E50B35F0F509E509F5F0E50055F0F500AA
+:10114000E500F5F0E50C45F0F50C750001C3E50D83
+:10115000F5F0E50E95F0F509E50BF5F0E50B35F04A
+:10116000F509E50EF5F0E50D95F0F501E50BF5F067
+:10117000E50B35F0F501E501F5F0E50945F0F50978
+:10118000E50AF5F0E50965F0F509E509F5F0E50092
+:1011900055F0F500C3E511F5F0E51095F0F509E51A
+:1011A0000BF5F0E50B35F0F509E509F5F0E500552F
+:1011B000F0F500E500F5F0E50C45F0F50C750001E3
+:1011C000C3E50DF5F0E50E95F0F509E50BF5F0E555
+:1011D0000B35F0F509E50EF5F0E50D95F0F501E5B7
+:1011E0000BF5F0E50B35F0F501E501F5F0E5094506
+:1011F000F0F509E50AF5F0E50965F0F509E509F509
+:10120000F0E50055F0F500C3E511F5F0E51095F0B7
+:10121000F509E50BF5F0E50B35F0F509E510F5F00E
+:10122000E51195F0F501E50BF5F0E50B35F0F5016D
+:10123000E501F5F0E50945F0F509E50AF5F0E50900
+:1012400065F0F509E509F5F0E50055F0F500C3E5B1
+:1012500014F5F0E51295F0F509E50BF5F0E50B3521
+:10126000F0F509E509F5F0E50055F0F500E500F5C4
+:10127000F0E50C45F0F50C750001C3E50DF5F0E562
+:101280000E95F0F509E50BF5F0E50B35F0F509E500
+:101290000EF5F0E50D95F0F501E50BF5F0E50B35F4
+:1012A000F0F501E501F5F0E50945F0F509E50AF588
+:1012B000F0E50965F0F509E509F5F0E50055F0F50B
+:1012C00000C3E511F5F0E51095F0F509E50BF5F033
+:1012D000E50B35F0F509E510F5F0E51195F0F501B0
+:1012E000E50BF5F0E50B35F0F501E501F5F0E50965
+:1012F00045F0F509E50AF5F0E50965F0F509E509B8
+:10130000F5F0E50055F0F500C3E514F5F0E51295AC
+:10131000F0F509E50BF5F0E50B35F0F509E512F50B
+:10132000F0E51495F0F501E50BF5F0E50B35F0F57A
+:1013300001E501F5F0E50945F0F509E50AF5F0E507
+:101340000965F0F509E509F5F0E50055F0F500C38C
+:1013500075E0072506F58275E0003507F583E0F5B1
+:1013600008E508F5F0E51795F0F509E50BF5F0E56A
+:101370000B35F0F509E509F5F0E50055F0F500E568
+:1013800000F5F0E50C45F0F50C750000E50CF5F006
+:10139000E50045F0F500E50FF5F0E50045F0F50056
+:1013A000E515F5F0E50045F0F500E518F5F0E50088
+:1013B00045F0F500E500700280030213CD007500D2
+:1013C00000750100750900750A0002089500750096
+:1013D00001750100750900750A0002089500750085
+:1013E00000E500F502E500F503E500F504E500F58C
+:1013F0000575E0122506F58275E0003507F583E0F6
+:10140000F51775E0112506F58275E0003507F583BF
+:10141000E0F51675E0102506F58275E0003507F554
+:1014200083E0F51575E00F2506F58275E0003507B8
+:10143000F583E0F51475E00E2506F58275E00035BC
+:1014400007F583E0F51375E00D2506F58275E000DC
+:101450003507F583E0F51275E00C2506F58275E099
+:10146000003507F583E0F51175E00B2506F582756B
+:10147000E0003507F583E0F51075E0092506F582F3
+:1014800075E0003507F583E0F508E508C0E075E094
+:101490000A2506F58275E0003507F583E0F508E5D5
+:1014A00008C0E075E01B2506F50675E0003507F578
+:1014B00007E502F582E503F583E504F500E505F5AA
+:1014C000012200750001750100750900750A00020E
+:1014D00004CE00750001750100750900750A00024F
+:1014E00004CE00000000000000000000000000002A
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-options "" } */
+typedef long long ll;
+typedef unsigned long long ull;
+
+int global;
+
+#define A(BASE, OP, AMT) \
+ ll BASE ## AMT (ll x) { return x OP AMT; } \
+ ull BASE ## AMT ## u (ull x) { return x OP AMT; }
+
+#define B(BASE, OP) \
+ A (BASE, OP, 1) \
+ A (BASE, OP, 10) \
+ A (BASE, OP, 31) \
+ A (BASE, OP, 33) \
+ A (BASE, OP, 61) \
+ A (BASE, OP, global)
+
+B (left, <<)
+B (right, >>)
+
+/* { dg-final { scan-assembler-not "__\[a-z\]*si3" } } */
--- /dev/null
+/* { dg-options "" } */
+typedef long long ll;
+typedef unsigned long long ull;
+
+int global;
+
+#define A(BASE, OP, AMT) \
+ ll BASE ## AMT (ll x) { return x OP AMT; } \
+ ull BASE ## AMT ## u (ull x) { return x OP AMT; }
+
+#define B(BASE, OP) \
+ A (BASE, OP, 1) \
+ A (BASE, OP, 10) \
+ A (BASE, OP, 31) \
+ A (BASE, OP, 33) \
+ A (BASE, OP, 61) \
+ A (BASE, OP, global)
+
+B (left, <<)
+B (right, >>)
+
+/* { dg-final { scan-assembler-not "__\[a-z\]*si3" } } */
--- /dev/null
+/* PR tree-optimization/29581 */
+/* Origin: gcc.dg/vect/vect-85.c */
+/* { dg-do run } */
+/* { dg-options "-O2 -ftree-loop-linear" } */
+
+extern void exit (int);
+
+#define N 16
+
+int main1 (int *a)
+{
+ int i, j, k;
+ int b[N];
+
+ for (i = 0; i < N; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k = i + N;
+ a[j] = k;
+ }
+ b[i] = k;
+ }
+
+
+ for (j = 0; j < N; j++)
+ if (a[j] != i + N - 1)
+ exit(1);
+
+ for (j = 0; j < N; j++)
+ if (b[j] != j + N)
+ exit(1);
+
+ return 0;
+}
+
+int main (void)
+{
+ int a[N] __attribute__ ((__aligned__(16)));
+
+ int tmp = main1 (a);
+
+ return 0;
+}
--- /dev/null
+/* PR tree-optimization/29581 */
+/* Origin: gcc.dg/vect/vect-85.c */
+/* { dg-do run } */
+/* { dg-options "-O2 -ftree-loop-linear" } */
+
+extern void exit (int);
+
+#define N 16
+
+int main1 (int *a)
+{
+ int i, j, k;
+ int b[N];
+
+ for (i = 0; i < N; i++)
+ {
+ for (j = 0; j < N; j++)
+ {
+ k = i + N;
+ a[j] = k;
+ }
+ b[i] = k;
+ }
+
+
+ for (j = 0; j < N; j++)
+ if (a[j] != i + N - 1)
+ exit(1);
+
+ for (j = 0; j < N; j++)
+ if (b[j] != j + N)
+ exit(1);
+
+ return 0;
+}
+
+int main (void)
+{
+ int a[N] __attribute__ ((__aligned__(16)));
+
+ int tmp = main1 (a);
+
+ return 0;
+}
--- /dev/null
+:1000000075812F7506FF7507FF121B2E02000C006D
+:1000100000E506758250C39582F506E507758300F5
+:100020009583F507D0E0F50875E0452506F582755E
+:10003000E0003507F583E508F0D0E0F50875E04409
+:100040002506F58275E0003507F583E508F075E0D3
+:100050004D2506F58275E0003507F583E517F07547
+:10006000E04C2506F58275E0003507F583E516F0CE
+:1000700075E04B2506F58275E0003507F583E5153B
+:10008000F075E04A2506F58275E0003507F583E551
+:1000900014F075E0492506F58275E0003507F58313
+:1000A000E513F075E0482506F58275E0003507F5A3
+:1000B00083E512F075E0472506F58275E000350707
+:1000C000F583E511F075E0462506F58275E000350B
+:1000D00007F583E510F075E0412506F58275E0002F
+:1000E0003507F583E51FF075E0402506F58275E0DC
+:1000F000003507F583E51EF07513007514007508CB
+:100100000075E0432506F58275E0003507F583E5C7
+:1001100008F075080075E0422506F58275E00035A7
+:1001200007F583E508F0751610751500750F007555
+:10013000100075E0422506F58275E0003507F5836D
+:10014000E0F511750080E500F5F0E51125F0F511F9
+:10015000E500F5F0E51025F0F510750C00750D00C3
+:10016000750E00751200750B00750A01750001C34C
+:10017000E510F5F0E51195F0F509E50BF5F0E50B67
+:1001800035F0F509E509F5F0E50055F0F500E50075
+:10019000F5F0E50C45F0F50C750001C3E510F5F040
+:1001A000E51195F0F509E50BF5F0E50B35F0F509EE
+:1001B000E511F5F0E51095F0F501E50BF5F0E50B2F
+:1001C00035F0F501E501F5F0E50945F0F509E50A39
+:1001D000F5F0E50965F0F509E509F5F0E50055F0FC
+:1001E000F500C3E50FF5F075E0432506F58275E0EF
+:1001F000003507F583E0F508E50895F0F509E50B0E
+:10020000F5F0E50B35F0F509E509F5F0E50055F0F9
+:10021000F500E500F5F0E50C45F0F50C750001C3BF
+:10022000E510F5F0E51195F0F509E50BF5F0E50BB6
+:1002300035F0F509E511F5F0E51095F0F501E50B60
+:10024000F5F0E50B35F0F501E501F5F0E50945F0D0
+:10025000F509E50AF5F0E50965F0F509E509F5F0B8
+:10026000E50055F0F500C3E50FF5F075E043250610
+:10027000F58275E0003507F583E0F508E50895F0AF
+:10028000F509E50BF5F0E50B35F0F50975E04325CB
+:1002900006F58275E0003507F583E0F508E508F519
+:1002A000F0E50F95F0F501E50BF5F0E50B35F0F510
+:1002B00001E501F5F0E50945F0F509E50AF5F0E598
+:1002C0000965F0F509E509F5F0E50055F0F500C31D
+:1002D000E515F5F0E51495F0F509E50BF5F0E50BFE
+:1002E00035F0F509E509F5F0E50055F0F500E50014
+:1002F000F5F0E50C45F0F50C750001C3E510F5F0DF
+:10030000E51195F0F509E50BF5F0E50B35F0F5098C
+:10031000E511F5F0E51095F0F501E50BF5F0E50BCD
+:1003200035F0F501E501F5F0E50945F0F509E50AD7
+:10033000F5F0E50965F0F509E509F5F0E50055F09A
+:10034000F500C3E50FF5F075E0432506F58275E08D
+:10035000003507F583E0F508E50895F0F509E50BAC
+:10036000F5F0E50B35F0F50975E0432506F58275E6
+:10037000E0003507F583E0F508E508F5F0E50F95B1
+:10038000F0F501E50BF5F0E50B35F0F501E501F5CC
+:10039000F0E50945F0F509E50AF5F0E50965F0F540
+:1003A00009E509F5F0E50055F0F500C3E515F5F0B0
+:1003B000E51495F0F509E50BF5F0E50B35F0F509D9
+:1003C000E514F5F0E51595F0F501E50BF5F0E50B15
+:1003D00035F0F501E501F5F0E50945F0F509E50A27
+:1003E000F5F0E50965F0F509E509F5F0E50055F0EA
+:1003F000F500C3E516F5F0E51395F0F509E50BF505
+:10040000F0E50B35F0F509E509F5F0E50055F0F5F7
+:1004100000E500F5F0E50C45F0F50C750101C3753C
+:100420000000E50CF5F0E50095F0F500750000E53D
+:1004300000F5F0E50035F0F500E500F5F0E50165C3
+:10044000F0F501C3750000E50DF5F0E50095F0F558
+:1004500000750000E500F5F0E50035F0F500E50079
+:10046000F5F0E50165F0F501C3750000E50EF5F066
+:10047000E50095F0F500750000E500F5F0E50035C4
+:10048000F0F500E500F5F0E50165F0F501C3750054
+:1004900000E512F5F0E50095F0F500750000E500C7
+:1004A000F5F0E50035F0F500E500F5F0E50165F063
+:1004B000F501750900750A00750B00750000E5016E
+:1004C000F5F0E50045F0F500E509F5F0E50045F04B
+:1004D000F500E50AF5F0E50045F0F500E50BF5F06F
+:1004E000E50045F0F500E50070028003020D2400F0
+:1004F000751000751100751200751500751A1075CC
+:100500001900750C00750D00E515F50E750080E5F8
+:1005100000F5F0E50E25F0F50EE500F5F0E50D250A
+:10052000F0F50D750B007516007517007518007540
+:100530000A00750F01750001C3E50DF5F0E50E9594
+:10054000F0F509E50AF5F0E50A35F0F509E509F5F4
+:10055000F0E50055F0F500E500F5F0E50B45F0F5A8
+:100560000B750001C3E50DF5F0E50E95F0F509E515
+:100570000AF5F0E50A35F0F509E50EF5F0E50D951B
+:10058000F0F501E50AF5F0E50A35F0F501E501F5CC
+:10059000F0E50945F0F509E50FF5F0E50965F0F539
+:1005A00009E509F5F0E50055F0F500C3E50CF5F0B7
+:1005B000E51295F0F509E50AF5F0E50A35F0F509DB
+:1005C000E509F5F0E50055F0F500E500F5F0E50B7F
+:1005D00045F0F50B750001C3E50DF5F0E50E95F05E
+:1005E000F509E50AF5F0E50A35F0F509E50EF5F04F
+:1005F000E50D95F0F501E50AF5F0E50A35F0F501B0
+:10060000E501F5F0E50945F0F509E50FF5F0E50937
+:1006100065F0F509E509F5F0E50055F0F500C3E5ED
+:100620000CF5F0E51295F0F509E50AF5F0E50A3567
+:10063000F0F509E512F5F0E50C95F0F501E50AF5A0
+:10064000F0E50A35F0F501E501F5F0E50945F0F5CD
+:1006500009E50FF5F0E50965F0F509E509F5F0E5BF
+:100660000055F0F500C3E519F5F0E51195F0F50931
+:10067000E50AF5F0E50A35F0F509E509F5F0E500DC
+:1006800055F0F500E500F5F0E50B45F0F50B7500CC
+:1006900001C3E50DF5F0E50E95F0F509E50AF5F075
+:1006A000E50A35F0F509E50EF5F0E50D95F0F501F3
+:1006B000E50AF5F0E50A35F0F501E501F5F0E509A3
+:1006C00045F0F509E50FF5F0E50965F0F509E509EF
+:1006D000F5F0E50055F0F500C3E50CF5F0E51295F1
+:1006E000F0F509E50AF5F0E50A35F0F509E512F54A
+:1006F000F0E50C95F0F501E50AF5F0E50A35F0F5C1
+:1007000001E501F5F0E50945F0F509E50FF5F0E53E
+:100710000965F0F509E509F5F0E50055F0F500C3C8
+:10072000E519F5F0E51195F0F509E50AF5F0E50AAA
+:1007300035F0F509E511F5F0E51995F0F501E50A53
+:10074000F5F0E50A35F0F501E501F5F0E50945F0CC
+:10075000F509E50FF5F0E50965F0F509E509F5F0AE
+:10076000E50055F0F500C3E51AF5F0E51095F0F554
+:1007700009E50AF5F0E50A35F0F509E509F5F0E5D2
+:100780000055F0F500E500F5F0E50B45F0F50B75CB
+:100790000101C3750000E50BF5F0E50095F0F500EB
+:1007A000750000E500F5F0E50035F0F500E500F531
+:1007B000F0E50165F0F501C3750000E516F5F0E51B
+:1007C0000095F0F500750000E500F5F0E50035F066
+:1007D000F500E500F5F0E50165F0F501C3750000F1
+:1007E000E517F5F0E50095F0F500750000E500F57A
+:1007F000F0E50035F0F500E500F5F0E50165F0F510
+:1008000001C3750000E518F5F0E50095F0F50075F9
+:100810000000E500F5F0E50035F0F500E500F5F045
+:10082000E50165F0F501750900750A00750B0075A5
+:100830000000E501F5F0E50045F0F500E509F5F00B
+:10084000E50045F0F500E50AF5F0E50045F0F500B6
+:10085000E50BF5F0E50045F0F500E50070028003DA
+:10086000020ACE00750B10750900750100750000B5
+:10087000C3750A00E50BF5F0E51335F0F51BE50946
+:10088000F5F0E51435F0F51CE501F5F075E04325CC
+:1008900006F58275E0003507F583E0F508E50835D3
+:1008A000F0F51DE500F5F075E0422506F58275E0EE
+:1008B000003507F583E0F508E50835F0F51E750904
+:1008C00004750B00750C00750D00C3750000E51074
+:1008D000F5F0E509A4F50AE510F5F0E509A4E5F061
+:1008E000F501E50AF5F0E50035F0F500E511F5F064
+:1008F000E509A4F50AE511F5F0E509A4E5F0F50927
+:10090000E50AF5F0E50135F0F501C3C3750900E529
+:1009100000F5F0E50C35F0F50CE501F5F0E50D35E9
+:10092000F0F50DC3750100E510F5F0E50BA4F50A2F
+:10093000E510F5F0E50BA4E5F0F509E50AF5F0E5BD
+:100940000135F0F501750000C3C3750900E500F538
+:10095000F0E50C35F0F50CE501F5F0E50D35F0F5B9
+:100960000DC3750000750100C3C3750900E500F5EE
+:10097000F0E50C35F0F50CE501F5F0E50D35F0F599
+:100980000DC3750000750100C3C3750900E500F5CE
+:10099000F0E50C35F0F50CE501F5F0E50D35F0F579
+:1009A0000DC3750000E50CF5F075E0412506F582F4
+:1009B00075E0003507F583E0F508E50835F0F5004A
+:1009C000E50DF5F075E0402506F58275E000350788
+:1009D000F583E0F508E50835F0F50A750900C375FB
+:1009E0000100E509F5F0E50035F0F509E501F5F060
+:1009F000E50A35F0F501E51BF503E501F502E5092A
+:100A0000F582E502F583E503F0750901C375010080
+:100A1000E509F5F0E50035F0F509E501F5F0E50A41
+:100A200035F0F501E51CF503E501F502E509F58270
+:100A3000E502F583E503F0750902C3750100E509D8
+:100A4000F5F0E50035F0F509E501F5F0E50A35F0DA
+:100A5000F501E51DF503E501F502E509F582E5027D
+:100A6000F583E503F0750903C3750100E509F5F0A9
+:100A7000E50035F0F509E501F5F0E50A35F0F50199
+:100A8000E51EF503E501F502E509F582E502F583CA
+:100A9000E503F0750101750900750A00750B00C3C7
+:100AA000750000E501F5F0E51035F0F510E509F504
+:100AB000F0E51135F0F511E50AF5F0E51235F0F540
+:100AC00012E50BF5F0E51535F0F5150204FC00E52F
+:100AD00006F50AE507F501750900C3750000E5098B
+:100AE000F5F0E50A35F0F50EE500F5F0E50135F035
+:100AF000F50F750904750B00750C00750D00C375B5
+:100B00000000E513F5F0E509A4F50AE513F5F0E5B5
+:100B100009A4E5F0F501E50AF5F0E50035F0F5008A
+:100B2000E514F5F0E509A4F50AE514F5F0E509A4E6
+:100B3000E5F0F509E50AF5F0E50135F0F501C3C387
+:100B4000750900E500F5F0E50C35F0F50CE501F56B
+:100B5000F0E50D35F0F50DC3750100E513F5F0E591
+:100B60000BA4F50AE513F5F0E50BA4E5F0F509E5AE
+:100B70000AF5F0E50135F0F501750000C3C375090C
+:100B800000E500F5F0E50C35F0F50CE501F5F0E5D4
+:100B90000D35F0F50DC3750000750100C3C375096F
+:100BA00000E500F5F0E50C35F0F50CE501F5F0E5B4
+:100BB0000D35F0F50DC3750000750100C3C375094F
+:100BC00000E500F5F0E50C35F0F50CE501F5F0E594
+:100BD0000D35F0F50DC3750000E50CF5F0E50E35AB
+:100BE000F0F500E50DF5F0E50F35F0F50A750900B3
+:100BF000C3750100E509F5F0E50035F0F509E501FB
+:100C0000F5F0E50A35F0F501E51BF503E501F50220
+:100C1000E509F582E502F583E503F0750901C37581
+:100C20000100E509F5F0E50035F0F509E501F5F01D
+:100C3000E50A35F0F501E51CF503E501F502E509E6
+:100C4000F582E502F583E503F0750902C37501003D
+:100C5000E509F5F0E50035F0F509E501F5F0E50AFF
+:100C600035F0F501E51DF503E501F502E509F5822D
+:100C7000E502F583E503F0750903C3750100E50995
+:100C8000F5F0E50035F0F509E501F5F0E50A35F098
+:100C9000F501E51EF503E501F502E509F582E5023A
+:100CA000F583E503F0750101750900750A00750B00
+:100CB00000C3750000E501F5F0E51335F0F513E527
+:100CC00009F5F0E51435F0F514E50AF5F075E043A3
+:100CD0002506F58275E0003507F583E0F508E5089F
+:100CE00035F0F50875E0432506F58275E000350717
+:100CF000F583E508F0E50BF5F075E0422506F58291
+:100D000075E0003507F583E0F508E50835F0F508EE
+:100D100075E0422506F58275E0003507F583E508A4
+:100D2000F00201260075100075110075120075158E
+:100D300000751A10751900750C00750D00E515F594
+:100D40000E750080E500F5F0E50E25F0F50EE500E6
+:100D5000F5F0E50D25F0F50D750B0075160075170E
+:100D600000751800750A00750F01750001C3E50DC7
+:100D7000F5F0E50E95F0F509E50AF5F0E50A35F030
+:100D8000F509E509F5F0E50055F0F500E500F5F0A9
+:100D9000E50B45F0F50B750001C3E50DF5F0E50E2B
+:100DA00095F0F509E50AF5F0E50A35F0F509E50EE7
+:100DB000F5F0E50D95F0F501E50AF5F0E50A35F0F9
+:100DC000F501E501F5F0E50945F0F509E50FF5F068
+:100DD000E50965F0F509E509F5F0E50055F0F500E0
+:100DE000C3E50CF5F0E51295F0F509E50AF5F0E537
+:100DF0000A35F0F509E509F5F0E50055F0F500E5EF
+:100E000000F5F0E50B45F0F50B750001C3E50DF5B8
+:100E1000F0E50E95F0F509E50AF5F0E50A35F0F58F
+:100E200009E50EF5F0E50D95F0F501E50AF5F0E5BB
+:100E30000A35F0F501E501F5F0E50945F0F509E5BC
+:100E40000FF5F0E50965F0F509E509F5F0E5005560
+:100E5000F0F500C3E50CF5F0E51295F0F509E50AAB
+:100E6000F5F0E50A35F0F509E512F5F0E50C95F039
+:100E7000F501E50AF5F0E50A35F0F501E501F5F0D3
+:100E8000E50945F0F509E50FF5F0E50965F0F50927
+:100E9000E509F5F0E50055F0F500C3E519F5F0E5D5
+:100EA0001195F0F509E50AF5F0E50A35F0F509E5E3
+:100EB00009F5F0E50055F0F500E500F5F0E50B4526
+:100EC000F0F50B750001C3E50DF5F0E50E95F0F5B5
+:100ED00009E50AF5F0E50A35F0F509E50EF5F0E566
+:100EE0000D95F0F501E50AF5F0E50A35F0F501E5B7
+:100EF00001F5F0E50945F0F509E50FF5F0E50965BF
+:100F0000F0F509E509F5F0E50055F0F500C3E50C4D
+:100F1000F5F0E51295F0F509E50AF5F0E50A35F08A
+:100F2000F509E512F5F0E50C95F0F501E50AF5F0A7
+:100F3000E50A35F0F501E501F5F0E50945F0F509BB
+:100F4000E50FF5F0E50965F0F509E509F5F0E500CF
+:100F500055F0F500C3E519F5F0E51195F0F509E553
+:100F60000AF5F0E50A35F0F509E511F5F0E5199512
+:100F7000F0F501E50AF5F0E50A35F0F501E501F5D2
+:100F8000F0E50945F0F509E50FF5F0E50965F0F53F
+:100F900009E509F5F0E50055F0F500C3E51AF5F0AF
+:100FA000E51095F0F509E50AF5F0E50A35F0F509E3
+:100FB000E509F5F0E50055F0F500E500F5F0E50B85
+:100FC00045F0F50B750101C3750000E50BF5F0E583
+:100FD0000095F0F500750000E500F5F0E50035F04E
+:100FE000F500E500F5F0E50165F0F501C3750000D9
+:100FF000E516F5F0E50095F0F500750000E500F563
+:10100000F0E50035F0F500E500F5F0E50165F0F5F7
+:1010100001C3750000E517F5F0E50095F0F50075E2
+:101020000000E500F5F0E50035F0F500E500F5F02D
+:10103000E50165F0F501C3750000E518F5F0E50080
+:1010400095F0F500750000E500F5F0E50035F0F5E8
+:1010500000E500F5F0E50165F0F501750900750A98
+:1010600000750B00750000E501F5F0E50045F0F5B1
+:1010700000E509F5F0E50045F0F500E50AF5F0E5D5
+:101080000045F0F500E50BF5F0E50045F0F500E56D
+:1010900000700280030213E500750904750B0075EA
+:1010A0000C00750D00C3750000E510F5F0E509A40E
+:1010B000F50AE510F5F0E509A4E5F0F501E50AF516
+:1010C000F0E50035F0F500E511F5F0E509A4F50AC5
+:1010D000E511F5F0E509A4E5F0F509E50AF5F0E517
+:1010E0000135F0F501C3C3750900E500F5F0E50C25
+:1010F00035F0F50CE501F5F0E50D35F0F50DC375AE
+:101100000100E510F5F0E50BA4F50AE510F5F0E5B2
+:101110000BA4E5F0F509E50AF5F0E50135F0F50178
+:10112000750000C3C3750900E500F5F0E50C35F066
+:10113000F50CE501F5F0E50D35F0F50DC375000092
+:10114000750100C3C3750900E500F5F0E50C35F045
+:10115000F50CE501F5F0E50D35F0F50DC375000072
+:10116000750100C3C3750900E500F5F0E50C35F025
+:10117000F50CE501F5F0E50D35F0F50DC375000052
+:10118000E50CF5F075E0412506F58275E0003507C0
+:10119000F583E0F508E50835F0F500E50DF5F075A7
+:1011A000E0402506F58275E0003507F583E0F50897
+:1011B000E50835F0F50AE500F509750100C375008D
+:1011C00000E501F5F0E50935F0F501E500F5F0E59C
+:1011D0000A35F0F500E500F502E501F582E502F5D6
+:1011E00083E0F517750101C3750000E501F5F0E531
+:1011F0000935F0F501E500F5F0E50A35F0F500E513
+:1012000000F502E501F582E502F583E0F5187501C8
+:1012100002C3750000E501F5F0E50935F0F501E5DB
+:1012200000F5F0E50A35F0F500E500F502E501F519
+:1012300082E502F583E0F519750103C3750000E549
+:1012400001F5F0E50935F0F501E500F5F0E50A35C1
+:10125000F0F500E500F502E501F582E502F583E031
+:10126000F50F750A10750900750100750000C3754A
+:101270000B00E50AF5F0E51335F0F50BE509F5F09F
+:10128000E51435F0F50CE501F5F075E0432506F5BC
+:101290008275E0003507F583E0F508E50835F0F5DF
+:1012A0000DE500F5F075E0422506F58275E00035A4
+:1012B00007F583E0F508E50835F0F50E75000175D2
+:1012C0000100750900750A00C3E500F5F0E50B950E
+:1012D000F0F516E501F5F0E50C95F0F50CE509F5EE
+:1012E000F0E50D95F0F500E50AF5F0E50E95F0F561
+:1012F0000AE517F50BE518F50DE519F50EE516F5F8
+:1013000001E50CF509750C00C3E501F5F0E50B9559
+:10131000F0F501E501F5F0E50C45F0F50CC3E50944
+:10132000F5F0E50D95F0F501E501F5F0E50C45F07A
+:10133000F50CC3E500F5F0E50E95F0F501E501F5D6
+:10134000F0E50C45F0F50CC3E50AF5F0E50F95F076
+:10135000F501E501F5F0E50C45F0F50C75010075BA
+:101360000900750A00750000E50CF5F0E50045F090
+:10137000F500E501F5F0E50045F0F500E509F5F0CB
+:10138000E50045F0F500E50AF5F0E50045F0F5006B
+:10139000E500700280030213D50075010175090094
+:1013A000750A00750B00C3750000E501F5F0E51046
+:1013B00035F0F510E509F5F0E51135F0F511E50A20
+:1013C000F5F0E51235F0F512E50BF5F0E51535F021
+:1013D000F515020D3100751F01751E00751D007594
+:1013E0001C0002139A00751000751100751200752B
+:1013F0001500751810751700750D00750E00E515B0
+:10140000F50F750080E500F5F0E50F25F0F50FE527
+:1014100000F5F0E50E25F0F50E750C00751300755E
+:101420001400751600750B00750A01750001C3E5FF
+:101430000EF5F0E50F95F0F509E50BF5F0E50B3548
+:10144000F0F509E509F5F0E50055F0F500E500F5E2
+:10145000F0E50C45F0F50C750001C3E50EF5F0E57F
+:101460000F95F0F509E50BF5F0E50B35F0F509E51D
+:101470000FF5F0E50E95F0F501E50BF5F0E50B3510
+:10148000F0F501E501F5F0E50945F0F509E50AF5A6
+:10149000F0E50965F0F509E509F5F0E50055F0F529
+:1014A00000C3E50DF5F0E51295F0F509E50BF5F053
+:1014B000E50B35F0F509E509F5F0E50055F0F50027
+:1014C000E500F5F0E50C45F0F50C750001C3E50EFF
+:1014D000F5F0E50F95F0F509E50BF5F0E50B35F0C6
+:1014E000F509E50FF5F0E50E95F0F501E50BF5F0E2
+:1014F000E50B35F0F501E501F5F0E50945F0F509F5
+:10150000E50AF5F0E50965F0F509E509F5F0E5000E
+:1015100055F0F500C3E50DF5F0E51295F0F509E598
+:101520000BF5F0E50B35F0F509E512F5F0E50D9555
+:10153000F0F501E50BF5F0E50B35F0F501E501F50A
+:10154000F0E50945F0F509E50AF5F0E50965F0F57E
+:1015500009E509F5F0E50055F0F500C3E517F5F0EC
+:10156000E51195F0F509E50BF5F0E50B35F0F5091A
+:10157000E509F5F0E50055F0F500E500F5F0E50CBE
+:1015800045F0F50C750001C3E50EF5F0E50F95F09B
+:10159000F509E50BF5F0E50B35F0F509E50FF5F08C
+:1015A000E50E95F0F501E50BF5F0E50B35F0F501ED
+:1015B000E501F5F0E50945F0F509E50AF5F0E5097D
+:1015C00065F0F509E509F5F0E50055F0F500C3E52E
+:1015D0000DF5F0E51295F0F509E50BF5F0E50B35A5
+:1015E000F0F509E512F5F0E50D95F0F501E50BF5DF
+:1015F000F0E50B35F0F501E501F5F0E50945F0F50D
+:1016000009E50AF5F0E50965F0F509E509F5F0E504
+:101610000055F0F500C3E517F5F0E51195F0F50973
+:10162000E50BF5F0E50B35F0F509E511F5F0E517FB
+:1016300095F0F501E50BF5F0E50B35F0F501E50169
+:10164000F5F0E50945F0F509E50AF5F0E50965F07D
+:10165000F509E509F5F0E50055F0F500C3E518F5E5
+:10166000F0E51095F0F509E50BF5F0E50B35F0F533
+:1016700009E509F5F0E50055F0F500E500F5F0E5C0
+:101680000C45F0F50C750101C3750000E50CF5F093
+:10169000E50095F0F500750000E500F5F0E5003592
+:1016A000F0F500E500F5F0E50165F0F501C3750022
+:1016B00000E513F5F0E50095F0F500750000E50094
+:1016C000F5F0E50035F0F500E500F5F0E50165F031
+:1016D000F501C3750000E514F5F0E50095F0F5009F
+:1016E000750000E500F5F0E50035F0F500E500F5E2
+:1016F000F0E50165F0F501C3750000E516F5F0E5CC
+:101700000095F0F500750000E500F5F0E50035F016
+:10171000F500E500F5F0E50165F0F50175090075E6
+:101720000A00750B00750000E501F5F0E50045F0D5
+:10173000F500E509F5F0E50045F0F500E50AF5F0FE
+:10174000E50045F0F500E50BF5F0E50045F0F500A6
+:10175000E50070028003021A4000E506F50AE5077D
+:10176000F501750900C3750000E509F5F0E50A35D6
+:10177000F0F50EE500F5F0E50135F0F50F7509041B
+:10178000750B00750C00750D00C3750000E510F5B4
+:10179000F0E509A4F50AE510F5F0E509A4E5F0F592
+:1017A00001E50AF5F0E50035F0F500E511F5F0E5A5
+:1017B00009A4F50AE511F5F0E509A4E5F0F509E558
+:1017C0000AF5F0E50135F0F501C3C3750900E50040
+:1017D000F5F0E50C35F0F50CE501F5F0E50D35F02B
+:1017E000F50DC3750100E510F5F0E50BA4F50AE56C
+:1017F00010F5F0E50BA4E5F0F509E50AF5F0E501D3
+:1018000035F0F501750000C3C3750900E500F5F07A
+:10181000E50C35F0F50CE501F5F0E50D35F0F50DCD
+:10182000C3750000750100C3C3750900E500F5F03C
+:10183000E50C35F0F50CE501F5F0E50D35F0F50DAD
+:10184000C3750000750100C3C3750900E500F5F01C
+:10185000E50C35F0F50CE501F5F0E50D35F0F50D8D
+:10186000C3750000E50CF5F0E50E35F0F500E50D6B
+:10187000F5F0E50F35F0F501E500F509E501F50AAC
+:10188000750100C3750000E501F5F0E50935F0F5D7
+:1018900001E500F5F0E50A35F0F500E500F502E5B3
+:1018A00001F582E502F583E0F50B750101C37500D2
+:1018B00000E501F5F0E50935F0F501E500F5F0E5A5
+:1018C0000A35F0F500E500F502E501F582E502F5DF
+:1018D00083E0F50C750102C3750000E501F5F0E544
+:1018E0000935F0F501E500F5F0E50A35F0F500E51C
+:1018F00000F502E501F582E502F583E0F50D7501DD
+:1019000003C3750000E501F5F0E50935F0F501E5E3
+:1019100000F5F0E50A35F0F500E500F502E501F522
+:1019200082E502F583E0F50E750F1075010075096B
+:1019300000750A00C3750000E50FF5F0E51035F0FD
+:10194000F500E501F5F0E51135F0F501E509F5F0F3
+:10195000E51235F0F509E50AF5F0E51535F0F50A7B
+:10196000750F00C3E500F5F0E50B95F0F500E50017
+:10197000F5F0E50F45F0F50FC3E501F5F0E50C9541
+:10198000F0F500E500F5F0E50F45F0F50FC3E509CA
+:10199000F5F0E50D95F0F500E500F5F0E50F45F003
+:1019A000F50FC3E50AF5F0E50E95F0F500E500F555
+:1019B000F0E50F45F0F50F750100750900750A0097
+:1019C000750000E50FF5F0E50045F0F500E501F5DF
+:1019D000F0E50045F0F500E509F5F0E50045F0F526
+:1019E00000E50AF5F0E50045F0F500E5007002803D
+:1019F00003021A3000750101750900750A00750BA4
+:101A000000C3750000E501F5F0E51035F0F510E5CF
+:101A100009F5F0E51135F0F511E50AF5F0E51235B7
+:101A2000F0F512E50BF5F0E51535F0F5150213F2BA
+:101A300000751F01751E00751D00751C000219F54B
+:101A400000750000750100750900750A00E500F5D4
+:101A500002E501F503E509F504E50AF50575E04D34
+:101A60002506F58275E0003507F583E0F51775E08A
+:101A70004C2506F58275E0003507F583E0F516750F
+:101A8000E04B2506F58275E0003507F583E0F51596
+:101A900075E04A2506F58275E0003507F583E0F527
+:101AA0001475E0492506F58275E0003507F583E0F9
+:101AB000F51375E0482506F58275E0003507F583D6
+:101AC000E0F51275E0472506F58275E0003507F56B
+:101AD00083E0F51175E0462506F58275E0003507CF
+:101AE000F583E0F51075E0442506F58275E00035D4
+:101AF00007F583E0F508E508C0E075E0452506F543
+:101B00008275E0003507F583E0F508E508C0E0756B
+:101B1000E0502506F50675E0003507F507E502F506
+:101B200082E503F583E504F500E505F5012200E50E
+:101B300006758242C39582F506E507758300958395
+:101B4000F507D0E0F50875E0412506F58275E0005F
+:101B50003507F583E508F0D0E0F50875E040250687
+:101B6000F58275E0003507F583E508F0E506F5092F
+:101B7000E507F50A750100C3750000E501F5F0E51C
+:101B80000935F0F501E500F5F0E50A35F0F500E579
+:101B900001F51FE500F51E1200107500007501002B
+:101BA000750900750A00E500F502E501F503E50990
+:101BB000F504E50AF50575E0402506F58275E000B7
+:101BC0003507F583E0F508E508C0E075E041250636
+:101BD000F58275E0003507F583E0F508E508C0E01B
+:101BE00075E0422506F50675E0003507F507E502C4
+:101BF000F582E503F583E504F500E505F50122002E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR tree-optimization/29581 */
+/* Origin: gcc.dg/vect/vect-87.c */
+/* { dg-do run } */
+/* { dg-options "-O2 -ftree-loop-linear" } */
+
+extern void exit (int);
+
+#define N 16
+
+int main1 (int n, int *a)
+{
+ int i, j, k;
+ int b[N];
+
+ for (i = 0; i < n; i++)
+ {
+ for (j = 0; j < n; j++)
+ {
+ k = i + n;
+ a[j] = k;
+ }
+ b[i] = k;
+ }
+
+
+ for (j = 0; j < n; j++)
+ if (a[j] != i + n - 1)
+ exit(1);
+
+ for (j = 0; j < n; j++)
+ if (b[j] != j + n)
+ exit(1);
+
+ return 0;
+}
+
+int main (void)
+{
+ int a[N] __attribute__ ((__aligned__(16)));
+int tmp;
+ tmp=main1 (N, a);
+ tmp=main1 (0, a);
+ tmp=main1 (1, a);
+ tmp=main1 (2, a);
+ tmp=main1 (N-1, a);
+
+ return 0;
+}
--- /dev/null
+/* PR tree-optimization/29581 */
+/* Origin: gcc.dg/vect/vect-87.c */
+/* { dg-do run } */
+/* { dg-options "-O2 -ftree-loop-linear" } */
+
+extern void exit (int);
+
+#define N 16
+
+int main1 (int n, int *a)
+{
+ int i, j, k;
+ int b[N];
+
+ for (i = 0; i < n; i++)
+ {
+ for (j = 0; j < n; j++)
+ {
+ k = i + n;
+ a[j] = k;
+ }
+ b[i] = k;
+ }
+
+
+ for (j = 0; j < n; j++)
+ if (a[j] != i + n - 1)
+ exit(1);
+
+ for (j = 0; j < n; j++)
+ if (b[j] != j + n)
+ exit(1);
+
+ return 0;
+}
+
+int main (void)
+{
+ int a[N] __attribute__ ((__aligned__(16)));
+int tmp;
+ tmp=main1 (N, a);
+ tmp=main1 (0, a);
+ tmp=main1 (1, a);
+ tmp=main1 (2, a);
+ tmp=main1 (N-1, a);
+
+ return 0;
+}
--- /dev/null
+:1000000075812F7506FF7507FF121C1202000C0088
+:1000100000E506758256C39582F506E507758300EF
+:100020009583F507D0E0F50875E0472506F582755C
+:10003000E0003507F583E508F0D0E0F50875E04607
+:100040002506F58275E0003507F583E508F075E0D3
+:100050004F2506F58275E0003507F583E517F07545
+:10006000E04E2506F58275E0003507F583E516F0CC
+:1000700075E04D2506F58275E0003507F583E51539
+:10008000F075E04C2506F58275E0003507F583E54F
+:1000900014F075E04B2506F58275E0003507F58311
+:1000A000E513F075E04A2506F58275E0003507F5A1
+:1000B00083E512F075E0492506F58275E000350705
+:1000C000F583E511F075E0482506F58275E0003509
+:1000D00007F583E510F075E0452506F58275E0002B
+:1000E0003507F583E51FF0E51EF514E51DF51375DD
+:1000F000E0402506F58275E0003507F583E51CF044
+:1001000075E0422506F58275E0003507F583E51BAD
+:10011000F075E0412506F58275E0003507F583E5C9
+:100120001AF075150075160075080075E04425066F
+:10013000F58275E0003507F583E508F07508007570
+:10014000E0432506F58275E0003507F583E508F004
+:1001500075E0432506F58275E0003507F583E0F587
+:100160001075E0402506F58275E0003507F583E05F
+:10017000F50F750080E500F5F0E51025F0F510E5C8
+:1001800000F5F0E50F25F0F50F750C00750D007505
+:100190000E00751100750B00750A01750001C3E5AD
+:1001A0000FF5F0E51095F0F509E50BF5F0E50B35E9
+:1001B000F0F509E509F5F0E50055F0F500E500F585
+:1001C000F0E50C45F0F50C750001C3E50FF5F0E521
+:1001D0001095F0F509E50BF5F0E50B35F0F509E5BF
+:1001E00010F5F0E50F95F0F501E50BF5F0E50B35B1
+:1001F000F0F501E501F5F0E50945F0F509E50AF549
+:10020000F0E50965F0F509E509F5F0E50055F0F5CB
+:1002100000C3E513F5F075E0442506F58275E000AE
+:100220003507F583E0F508E50895F0F509E50BF5E8
+:10023000F0E50B35F0F509E509F5F0E50055F0F5C9
+:1002400000E500F5F0E50C45F0F50C750001C3E59F
+:100250000FF5F0E51095F0F509E50BF5F0E50B3538
+:10026000F0F509E510F5F0E50F95F0F501E50BF572
+:10027000F0E50B35F0F501E501F5F0E50945F0F5A0
+:1002800009E50AF5F0E50965F0F509E509F5F0E598
+:100290000055F0F500C3E513F5F075E0442506F5CB
+:1002A0008275E0003507F583E0F508E50895F0F57F
+:1002B00009E50BF5F0E50B35F0F50975E044250689
+:1002C000F58275E0003507F583E0F508E508F5F0FF
+:1002D000E51395F0F501E50BF5F0E50B35F0F501CB
+:1002E000E501F5F0E50945F0F509E50AF5F0E50960
+:1002F00065F0F509E509F5F0E50055F0F500C3E511
+:1003000014F5F0E51695F0F509E50BF5F0E50B357C
+:10031000F0F509E509F5F0E50055F0F500E500F523
+:10032000F0E50C45F0F50C750001C3E50FF5F0E5BF
+:100330001095F0F509E50BF5F0E50B35F0F509E55D
+:1003400010F5F0E50F95F0F501E50BF5F0E50B354F
+:10035000F0F501E501F5F0E50945F0F509E50AF5E7
+:10036000F0E50965F0F509E509F5F0E50055F0F56A
+:1003700000C3E513F5F075E0442506F58275E0004D
+:100380003507F583E0F508E50895F0F509E50BF587
+:10039000F0E50B35F0F50975E0442506F58275E0CA
+:1003A000003507F583E0F508E508F5F0E51395F06D
+:1003B000F501E50BF5F0E50B35F0F501E501F5F09C
+:1003C000E50945F0F509E50AF5F0E50965F0F509F7
+:1003D000E509F5F0E50055F0F500C3E514F5F0E5A5
+:1003E0001695F0F509E50BF5F0E50B35F0F509E5A7
+:1003F00016F5F0E51495F0F501E50BF5F0E50B3594
+:10040000F0F501E501F5F0E50945F0F509E50AF536
+:10041000F0E50965F0F509E509F5F0E50055F0F5B9
+:1004200000C375E0452506F58275E0003507F583C4
+:10043000E0F508E508F5F0E51595F0F509E50BF5AB
+:10044000F0E50B35F0F509E509F5F0E50055F0F5B7
+:1004500000E500F5F0E50C45F0F50C750101C375FC
+:100460000000E50CF5F0E50095F0F500750000E5FD
+:1004700000F5F0E50035F0F500E500F5F0E5016583
+:10048000F0F501C3750000E50DF5F0E50095F0F518
+:1004900000750000E500F5F0E50035F0F500E50039
+:1004A000F5F0E50165F0F501C3750000E50EF5F026
+:1004B000E50095F0F500750000E500F5F0E5003584
+:1004C000F0F500E500F5F0E50165F0F501C3750014
+:1004D00000E511F5F0E50095F0F500750000E50088
+:1004E000F5F0E50035F0F500E500F5F0E50165F023
+:1004F000F501750900750A00750B00750000E5012E
+:10050000F5F0E50045F0F500E509F5F0E50045F00A
+:10051000F500E50AF5F0E50045F0F500E50BF5F02E
+:10052000E50045F0F500E50070028003020D9C0037
+:10053000751000751100751200751700E517F50D9F
+:1005400075E0402506F58275E0003507F583E0F596
+:100550000C750080E500F5F0E50D25F0F50DE500E2
+:10056000F5F0E50C25F0F50C750B00750F0075180E
+:1005700000751900750A00750E01750001C3E50CC0
+:10058000F5F0E50D95F0F509E50AF5F0E50A35F029
+:10059000F509E509F5F0E50055F0F500E500F5F0A1
+:1005A000E50B45F0F50B750001C3E50CF5F0E50D25
+:1005B00095F0F509E50AF5F0E50A35F0F509E50DE0
+:1005C000F5F0E50C95F0F501E50AF5F0E50A35F0F2
+:1005D000F501E501F5F0E50945F0F509E50EF5F061
+:1005E000E50965F0F509E509F5F0E50055F0F500D8
+:1005F000C3E513F5F0E51295F0F509E50AF5F0E528
+:100600000A35F0F509E509F5F0E50055F0F500E5E6
+:1006100000F5F0E50B45F0F50B750001C3E50CF5B1
+:10062000F0E50D95F0F509E50AF5F0E50A35F0F588
+:1006300009E50DF5F0E50C95F0F501E50AF5F0E5B5
+:100640000A35F0F501E501F5F0E50945F0F509E5B4
+:100650000EF5F0E50965F0F509E509F5F0E5005559
+:10066000F0F500C3E513F5F0E51295F0F509E50A9C
+:10067000F5F0E50A35F0F509E512F5F0E51395F02A
+:10068000F501E50AF5F0E50A35F0F501E501F5F0CB
+:10069000E50945F0F509E50EF5F0E50965F0F50920
+:1006A000E509F5F0E50055F0F500C3E514F5F0E5D2
+:1006B0001195F0F509E50AF5F0E50A35F0F509E5DB
+:1006C00009F5F0E50055F0F500E500F5F0E50B451E
+:1006D000F0F50B750001C3E50CF5F0E50D95F0F5AF
+:1006E00009E50AF5F0E50A35F0F509E50DF5F0E55F
+:1006F0000C95F0F501E50AF5F0E50A35F0F501E5B0
+:1007000001F5F0E50945F0F509E50EF5F0E50965B7
+:10071000F0F509E509F5F0E50055F0F500C3E5133E
+:10072000F5F0E51295F0F509E50AF5F0E50A35F082
+:10073000F509E512F5F0E51395F0F501E50AF5F098
+:10074000E50A35F0F501E501F5F0E50945F0F509B3
+:10075000E50EF5F0E50965F0F509E509F5F0E500C8
+:1007600055F0F500C3E514F5F0E51195F0F509E550
+:100770000AF5F0E50A35F0F509E511F5F0E514950F
+:10078000F0F501E50AF5F0E50A35F0F501E501F5CA
+:10079000F0E50945F0F509E50EF5F0E50965F0F538
+:1007A00009E509F5F0E50055F0F500C375E04525CC
+:1007B00006F58275E0003507F583E0F508E508F5F4
+:1007C000F0E51095F0F509E50AF5F0E50A35F0F5E4
+:1007D00009E509F5F0E50055F0F500E500F5F0E56F
+:1007E0000B45F0F50BE50FF500E518F501E519F5FA
+:1007F0000C750A01C3750900E50BF5F0E50995F0E4
+:10080000F509750900E509F5F0E50935F0F509E5A3
+:1008100009F5F0E50A65F0F50AC3750900E500F58C
+:10082000F0E50995F0F509750900E509F5F0E50928
+:1008300035F0F509E509F5F0E50A65F0F50AC37547
+:100840000900E501F5F0E50995F0F509750900E500
+:1008500009F5F0E50935F0F509E509F5F0E50A6572
+:10086000F0F50AC3750900E50CF5F0E50995F0F51A
+:1008700009750900E509F5F0E50935F0F509E5091F
+:10088000F5F0E50A65F0F50A750100750900750BCC
+:1008900000750000E50AF5F0E50045F0F500E5011A
+:1008A000F5F0E50045F0F500E509F5F0E50045F067
+:1008B000F500E50BF5F0E50045F0F500E500700208
+:1008C0008003020B4600C375000075E0452506F560
+:1008D0008275E0003507F583E0F508E508F5F0E5F9
+:1008E0001535F0F51AE514F5F0E51635F0F51BE5CC
+:1008F00013F5F075E0442506F58275E0003507F53F
+:1009000083E0F508E50835F0F51C75E0402506F5AF
+:100910008275E0003507F583E0F508E508F5F07528
+:10092000E0432506F58275E0003507F583E0F5081C
+:10093000E50835F0F51D750904750B00750C00759B
+:100940000D00C3750000E510F5F0E509A4F50AE512
+:1009500010F5F0E509A4E5F0F501E50AF5F0E5008C
+:1009600035F0F500E511F5F0E509A4F50AE511F516
+:10097000F0E509A4E5F0F509E50AF5F0E50135F043
+:10098000F501C3C3750900E500F5F0E50C35F0F598
+:100990000CE501F5F0E50D35F0F50DC3750100E549
+:1009A00010F5F0E50BA4F50AE510F5F0E50BA4E56C
+:1009B000F0F509E50AF5F0E50135F0F501750000FF
+:1009C000C3C3750900E500F5F0E50C35F0F50CE55D
+:1009D00001F5F0E50D35F0F50DC37500007501006A
+:1009E000C3C3750900E500F5F0E50C35F0F50CE53D
+:1009F00001F5F0E50D35F0F50DC37500007501004A
+:100A0000C3C3750900E500F5F0E50C35F0F50CE51C
+:100A100001F5F0E50D35F0F50DC3750000E50CF5B9
+:100A2000F075E0422506F58275E0003507F583E0B4
+:100A3000F508E50835F0F500E50DF5F075E0412520
+:100A400006F58275E0003507F583E0F508E5083521
+:100A5000F0F50A750100C3750900E501F5F0E50040
+:100A600035F0F501E509F5F0E50A35F0F509E51A87
+:100A7000F503E509F502E501F582E502F583E503F5
+:100A8000F0750101C3750900E501F5F0E50035F0E9
+:100A9000F501E509F5F0E50A35F0F509E51BF50383
+:100AA000E509F502E501F582E502F583E503F07558
+:100AB0000102C3750900E501F5F0E50035F0F50127
+:100AC000E509F5F0E50A35F0F509E51CF503E5095A
+:100AD000F502E501F582E502F583E503F075010312
+:100AE000C3750900E501F5F0E50035F0F501E5090C
+:100AF000F5F0E50A35F0F509E51DF503E509F50220
+:100B0000E501F582E502F583E503F0750001750165
+:100B100000750900750A00C3750B00E500F5F0E5E6
+:100B20001035F0F510E501F5F0E51135F0F511E5BA
+:100B300009F5F0E51235F0F512E50AF5F0E517359F
+:100B4000F0F51702053C00E506F50AE507F5017525
+:100B50000900C3750000E509F5F0E50A35F0F50E6A
+:100B6000E500F5F0E50135F0F50F750904750B00AA
+:100B7000750C00750D00C3750000E515F5F0E5096D
+:100B8000A4F50AE515F5F0E509A4E5F0F501E50A97
+:100B9000F5F0E50035F0F500E516F5F0E509A4F50A
+:100BA0000AE516F5F0E509A4E5F0F509E50AF5F022
+:100BB000E50135F0F501C3C3750900E500F5F0E581
+:100BC0000C35F0F50CE501F5F0E50D35F0F50DC34C
+:100BD000750100E515F5F0E50BA4F50AE515F5F04E
+:100BE000E50BA4E5F0F509E50AF5F0E50135F0F5CA
+:100BF00001750000C3C3750900E500F5F0E50C358B
+:100C0000F0F50CE501F5F0E50D35F0F50DC37500D7
+:100C100000750100C3C3750900E500F5F0E50C356A
+:100C2000F0F50CE501F5F0E50D35F0F50DC37500B7
+:100C300000750100C3C3750900E500F5F0E50C354A
+:100C4000F0F50CE501F5F0E50D35F0F50DC3750097
+:100C500000E50CF5F0E50E35F0F500E50DF5F0E5F5
+:100C60000F35F0F50A750900C3750100E509F5F0C7
+:100C7000E50035F0F509E501F5F0E50A35F0F50197
+:100C8000E51AF503E501F502E509F582E502F583CC
+:100C9000E503F0750901C3750100E509F5F0E5000C
+:100CA00035F0F509E501F5F0E50A35F0F501E51B4C
+:100CB000F503E501F502E509F582E502F583E503B3
+:100CC000F0750902C3750100E509F5F0E50035F09E
+:100CD000F509E501F5F0E50A35F0F501E51CF50348
+:100CE000E501F502E509F582E502F583E503F07516
+:100CF0000903C3750100E509F5F0E50035F0F509D4
+:100D0000E501F5F0E50A35F0F501E51DF503E5012E
+:100D1000F502E509F582E502F583E503F0750101C9
+:100D2000750900750A00750B00C3750000E501F533
+:100D3000F0E51535F0F515E509F5F0E51635F0F5B2
+:100D400016E50AF5F075E0442506F58275E00035F4
+:100D500007F583E0F508E50835F0F50875E044256A
+:100D600006F58275E0003507F583E508F0E50BF53B
+:100D7000F075E0432506F58275E0003507F583E060
+:100D8000F508E50835F0F50875E0432506F58275A8
+:100D9000E0003507F583E508F0020150007510000A
+:100DA000751100751200751700E517F50D75E04017
+:100DB0002506F58275E0003507F583E0F50C750032
+:100DC00080E500F5F0E50D25F0F50DE500F5F0E521
+:100DD0000C25F0F50C750B00750F007518007519D2
+:100DE00000750A00750E01750001C3E50CF5F0E50C
+:100DF0000D95F0F509E50AF5F0E50A35F0F509E598
+:100E000009F5F0E50055F0F500E500F5F0E50B45D6
+:100E1000F0F50B750001C3E50CF5F0E50D95F0F567
+:100E200009E50AF5F0E50A35F0F509E50DF5F0E517
+:100E30000C95F0F501E50AF5F0E50A35F0F501E568
+:100E400001F5F0E50945F0F509E50EF5F0E5096570
+:100E5000F0F509E509F5F0E50055F0F500C3E513F7
+:100E6000F5F0E51295F0F509E50AF5F0E50A35F03B
+:100E7000F509E509F5F0E50055F0F500E500F5F0B8
+:100E8000E50B45F0F50B750001C3E50CF5F0E50D3C
+:100E900095F0F509E50AF5F0E50A35F0F509E50DF7
+:100EA000F5F0E50C95F0F501E50AF5F0E50A35F009
+:100EB000F501E501F5F0E50945F0F509E50EF5F078
+:100EC000E50965F0F509E509F5F0E50055F0F500EF
+:100ED000C3E513F5F0E51295F0F509E50AF5F0E53F
+:100EE0000A35F0F509E512F5F0E51395F0F501E5A1
+:100EF0000AF5F0E50A35F0F501E501F5F0E50945FB
+:100F0000F0F509E50EF5F0E50965F0F509E509F5F7
+:100F1000F0E50055F0F500C3E514F5F0E51195F0A6
+:100F2000F509E50AF5F0E50A35F0F509E509F5F00A
+:100F3000E50055F0F500E500F5F0E50B45F0F50BA3
+:100F4000750001C3E50CF5F0E50D95F0F509E50A2E
+:100F5000F5F0E50A35F0F509E50DF5F0E50C95F04D
+:100F6000F501E50AF5F0E50A35F0F501E501F5F0E2
+:100F7000E50945F0F509E50EF5F0E50965F0F50937
+:100F8000E509F5F0E50055F0F500C3E513F5F0E5EA
+:100F90001295F0F509E50AF5F0E50A35F0F509E5F1
+:100FA00012F5F0E51395F0F501E50AF5F0E50A35DF
+:100FB000F0F501E501F5F0E50945F0F509E50EF577
+:100FC000F0E50965F0F509E509F5F0E50055F0F5FE
+:100FD00000C3E514F5F0E51195F0F509E50AF5F023
+:100FE000E50A35F0F509E511F5F0E51495F0F501A0
+:100FF000E50AF5F0E50A35F0F501E501F5F0E5095A
+:1010000045F0F509E50EF5F0E50965F0F509E509A6
+:10101000F5F0E50055F0F500C375E0452506F582CD
+:1010200075E0003507F583E0F508E508F5F0E51013
+:1010300095F0F509E50AF5F0E50A35F0F509E50959
+:10104000F5F0E50055F0F500E500F5F0E50B45F0AD
+:10105000F50BE50FF500E518F501E519F50C750A36
+:1010600001C3750900E50BF5F0E50995F0F5097583
+:101070000900E509F5F0E50935F0F509E509F5F0B0
+:10108000E50A65F0F50AC3750900E500F5F0E50924
+:1010900095F0F509750900E509F5F0E50935F0F574
+:1010A00009E509F5F0E50A65F0F50AC3750900E5FB
+:1010B00001F5F0E50995F0F509750900E509F5F088
+:1010C000E50935F0F509E509F5F0E50A65F0F50AF9
+:1010D000C3750900E50CF5F0E50995F0F50975090A
+:1010E00000E509F5F0E50935F0F509E509F5F0E564
+:1010F0000A65F0F50A750100750900750B007500A9
+:1011000000E50AF5F0E50045F0F500E501F5F0E54C
+:101110000045F0F500E509F5F0E50045F0F500E5DE
+:101120000BF5F0E50045F0F500E5007002800302E4
+:10113000149900750904750B00750C00750D00C33A
+:10114000750000E510F5F0E509A4F50AE510F5F0E5
+:10115000E509A4E5F0F501E50AF5F0E50035F0F55F
+:1011600000E511F5F0E509A4F50AE511F5F0E5094A
+:10117000A4E5F0F509E50AF5F0E50135F0F501C360
+:10118000C3750900E500F5F0E50C35F0F50CE50157
+:10119000F5F0E50D35F0F50DC3750100E510F5F03E
+:1011A000E50BA4F50AE510F5F0E50BA4E5F0F5096B
+:1011B000E50AF5F0E50135F0F501750000C3C375EA
+:1011C0000900E500F5F0E50C35F0F50CE501F5F06A
+:1011D000E50D35F0F50DC3750000750100C3C3754D
+:1011E0000900E500F5F0E50C35F0F50CE501F5F04A
+:1011F000E50D35F0F50DC3750000750100C3C3752D
+:101200000900E500F5F0E50C35F0F50CE501F5F029
+:10121000E50D35F0F50DC3750000E50CF5F075E052
+:10122000422506F58275E0003507F583E0F508E50F
+:101230000835F0F500E50DF5F075E0412506F5827D
+:1012400075E0003507F583E0F508E50835F0F50AA7
+:10125000E500F509750000C3750100E500F5F0E54E
+:101260000935F0F500E501F5F0E50A35F0F501E5A1
+:1012700001F502E500F582E502F583E0F50F750062
+:1012800001C3750100E500F5F0E50935F0F500E56D
+:1012900001F5F0E50A35F0F501E501F502E500F5A7
+:1012A00082E502F583E0F519750002C3750100E5DA
+:1012B00000F5F0E50935F0F500E501F5F0E50A3552
+:1012C000F0F501E501F502E500F582E502F583E0C0
+:1012D000F51A750003C3750100E500F5F0E5093561
+:1012E000F0F500E501F5F0E50A35F0F501E501F569
+:1012F00002E500F582E502F583E0F518C37500000C
+:1013000075E0452506F58275E0003507F583E0F5C3
+:1013100008E508F5F0E51535F0F50AE514F5F0E512
+:101320001635F0F50BE513F5F075E0442506F5826A
+:1013300075E0003507F583E0F508E50835F0F50CB4
+:1013400075E0402506F58275E0003507F583E0F588
+:1013500008E508F5F075E0432506F58275E00035EF
+:1013600007F583E0F508E50835F0F50E7500017521
+:101370000100750900750D00C3E500F5F0E50A955B
+:10138000F0F50AE501F5F0E50B95F0F501E509F555
+:10139000F0E50C95F0F509E50DF5F0E50E95F0F5A5
+:1013A00000E50FF50DE519F50EE51AF50FE50AF55F
+:1013B0000BE501F50CE509F50A750900C3E50BF528
+:1013C000F0E50D95F0F501E501F5F0E50945F0F5DD
+:1013D00009C3E50CF5F0E50E95F0F501E501F5F032
+:1013E000E50945F0F509C3E50AF5F0E50F95F0F5D7
+:1013F00001E501F5F0E50945F0F509C3E500F5F073
+:10140000E51895F0F501E501F5F0E50945F0F50978
+:10141000750100750A00750B00750000E509F5F00F
+:10142000E50045F0F500E501F5F0E50045F0F500D3
+:10143000E50AF5F0E50045F0F500E50BF5F0E5000F
+:1014400045F0F500E5007002800302148900750084
+:1014500001750100750900750A00C3750B00E500F0
+:10146000F5F0E51035F0F510E501F5F0E51135F092
+:10147000F511E509F5F0E51235F0F512E50AF5F09C
+:10148000E51735F0F517020DA900751F01751E004F
+:10149000751D00751C0002144E00751000751100BA
+:1014A000751200751700E517F50E75E0402506F575
+:1014B0008275E0003507F583E0F50D750080E500E5
+:1014C000F5F0E50E25F0F50EE500F5F0E50D25F05B
+:1014D000F50D750C00750F00751500751600750B70
+:1014E00000750A01750001C3E50DF5F0E50E95F0F4
+:1014F000F509E50BF5F0E50B35F0F509E509F5F033
+:10150000E50055F0F500E500F5F0E50C45F0F50CCB
+:10151000750001C3E50DF5F0E50E95F0F509E50B55
+:10152000F5F0E50B35F0F509E50EF5F0E50D95F074
+:10153000F501E50BF5F0E50B35F0F501E501F5F00A
+:10154000E50945F0F509E50AF5F0E50965F0F50965
+:10155000E509F5F0E50055F0F500C3E513F5F0E514
+:101560001295F0F509E50BF5F0E50B35F0F509E519
+:1015700009F5F0E50055F0F500E500F5F0E50C455E
+:10158000F0F50C750001C3E50DF5F0E50E95F0F5ED
+:1015900009E50BF5F0E50B35F0F509E50EF5F0E59D
+:1015A0000D95F0F501E50BF5F0E50B35F0F501E5EE
+:1015B00001F5F0E50945F0F509E50AF5F0E50965FD
+:1015C000F0F509E509F5F0E50055F0F500C3E51380
+:1015D000F5F0E51295F0F509E50BF5F0E50B35F0C2
+:1015E000F509E512F5F0E51395F0F501E50BF5F0D9
+:1015F000E50B35F0F501E501F5F0E50945F0F509F4
+:10160000E50AF5F0E50965F0F509E509F5F0E5000D
+:1016100055F0F500C3E514F5F0E51195F0F509E591
+:101620000BF5F0E50B35F0F509E509F5F0E50055AA
+:10163000F0F500E500F5F0E50C45F0F50C7500015E
+:10164000C3E50DF5F0E50E95F0F509E50BF5F0E5D0
+:101650000B35F0F509E50EF5F0E50D95F0F501E532
+:101660000BF5F0E50B35F0F501E501F5F0E5094581
+:10167000F0F509E50AF5F0E50965F0F509E509F584
+:10168000F0E50055F0F500C3E513F5F0E51295F02F
+:10169000F509E50BF5F0E50B35F0F509E512F5F088
+:1016A000E51395F0F501E50BF5F0E50B35F0F501E7
+:1016B000E501F5F0E50945F0F509E50AF5F0E5097C
+:1016C00065F0F509E509F5F0E50055F0F500C3E52D
+:1016D00014F5F0E51195F0F509E50BF5F0E50B359E
+:1016E000F0F509E511F5F0E51495F0F501E50BF5D8
+:1016F000F0E50B35F0F501E501F5F0E50945F0F50C
+:1017000009E50AF5F0E50965F0F509E509F5F0E503
+:101710000055F0F500C375E0452506F58275E0003B
+:101720003507F583E0F508E508F5F0E51095F0F5E7
+:1017300009E50BF5F0E50B35F0F509E509F5F0E500
+:101740000055F0F500E500F5F0E50C45F0F50C75F9
+:101750000101C3750000E50CF5F0E50095F0F5001A
+:10176000750000E500F5F0E50035F0F500E500F561
+:10177000F0E50165F0F501C3750000E50FF5F0E552
+:101780000095F0F500750000E500F5F0E50035F096
+:10179000F500E500F5F0E50165F0F501C375000021
+:1017A000E515F5F0E50095F0F500750000E500F5AC
+:1017B000F0E50035F0F500E500F5F0E50165F0F540
+:1017C00001C3750000E516F5F0E50095F0F500752C
+:1017D0000000E500F5F0E50035F0F500E500F5F076
+:1017E000E50165F0F501750900750A00750B0075D6
+:1017F0000000E501F5F0E50045F0F500E509F5F03C
+:10180000E50045F0F500E50AF5F0E50045F0F500E6
+:10181000E50BF5F0E50045F0F500E500700280030A
+:10182000021B2400E506F50AE507F501750900C36A
+:10183000750000E509F5F0E50A35F0F50EE500F56F
+:10184000F0E50135F0F50F750904750B00750C0016
+:10185000750D00C3750000E510F5F0E509A4F50A63
+:10186000E510F5F0E509A4E5F0F501E50AF5F0E588
+:101870000035F0F500E511F5F0E509A4F50AE511EC
+:10188000F5F0E509A4E5F0F509E50AF5F0E501351F
+:10189000F0F501C3C3750900E500F5F0E50C35F07E
+:1018A000F50CE501F5F0E50D35F0F50DC37501001A
+:1018B000E510F5F0E50BA4F50AE510F5F0E50BA44D
+:1018C000E5F0F509E50AF5F0E50135F0F5017500FB
+:1018D00000C3C3750900E500F5F0E50C35F0F50C23
+:1018E000E501F5F0E50D35F0F50DC3750000750166
+:1018F00000C3C3750900E500F5F0E50C35F0F50C03
+:10190000E501F5F0E50D35F0F50DC3750000750145
+:1019100000C3C3750900E500F5F0E50C35F0F50CE2
+:10192000E501F5F0E50D35F0F50DC3750000E50CAA
+:10193000F5F0E50E35F0F500E50DF5F0E50F35F0C5
+:10194000F501E500F509E501F50A750100C375002B
+:1019500000E501F5F0E50935F0F501E500F5F0E504
+:101960000A35F0F500E500F502E501F582E502F53E
+:1019700083E0F50B750101C3750000E501F5F0E5A5
+:101980000935F0F501E500F5F0E50A35F0F500E57B
+:1019900000F502E501F582E502F583E0F50D75013C
+:1019A00002C3750000E501F5F0E50935F0F501E544
+:1019B00000F5F0E50A35F0F500E500F502E501F582
+:1019C00082E502F583E0F50F750103C3750000E5BC
+:1019D00001F5F0E50935F0F501E500F5F0E50A352A
+:1019E000F0F500E500F502E501F582E502F583E09A
+:1019F000F50CC375000075E0452506F58275E0001D
+:101A00003507F583E0F508E508F5F0E51035F0F564
+:101A100000E514F5F0E51135F0F501E513F5F0E515
+:101A20001235F0F50975E0402506F58275E00035C0
+:101A300007F583E0F508E508F5F0E51735F0F50A58
+:101A4000E50DF50E750D00C3E500F5F0E50B95F01D
+:101A5000F500E500F5F0E50D45F0F50DC3E501F500
+:101A6000F0E50E95F0F500E500F5F0E50D45F0F533
+:101A70000DC3E509F5F0E50F95F0F500E500F5F08B
+:101A8000E50D45F0F50DC3E50AF5F0E50C95F0F52B
+:101A900000E500F5F0E50D45F0F50D75010075095F
+:101AA00000750A00750000E50DF5F0E50045F0F55C
+:101AB00000E501F5F0E50045F0F500E509F5F0E594
+:101AC0000045F0F500E50AF5F0E50045F0F500E524
+:101AD0000070028003021B14007501017509007576
+:101AE0000A00750B00C3750000E501F5F0E510353F
+:101AF000F0F510E509F5F0E51135F0F511E50AF519
+:101B0000F0E51235F0F512E50BF5F0E51735F0F5D7
+:101B1000170214A600751F01751E00751D00751CA7
+:101B200000021AD900750000750100750900750AD8
+:101B300000E500F502E501F503E509F504E50AF520
+:101B40000575E04F2506F58275E0003507F583E061
+:101B5000F51775E04E2506F58275E0003507F5832B
+:101B6000E0F51675E04D2506F58275E0003507F5C0
+:101B700083E0F51575E04C2506F58275E000350724
+:101B8000F583E0F51475E04B2506F58275E0003528
+:101B900007F583E0F51375E04A2506F58275E00048
+:101BA0003507F583E0F51275E0492506F58275E005
+:101BB000003507F583E0F51175E0482506F58275D7
+:101BC000E0003507F583E0F51075E0462506F5825F
+:101BD00075E0003507F583E0F508E508C0E075E03D
+:101BE000472506F58275E0003507F583E0F508E541
+:101BF00008C0E075E0562506F50675E0003507F5E6
+:101C000007E502F582E503F583E504F500E505F552
+:101C1000012200E506758242C39582F506E5077547
+:101C200083009583F507D0E0F50875E0412506F5BA
+:101C30008275E0003507F583E508F0D0E0F508751A
+:101C4000E0402506F58275E0003507F583E508F0EC
+:101C5000751F10751E00751D00751C00E506F50A40
+:101C6000E507F501750900C3750000E509F5F0E524
+:101C70000A35F0F51BE500F5F0E50135F0F51A122F
+:101C80000010751F00751E00751D00751C00E5060F
+:101C9000F50AE507F501750900C3750000E509F5CA
+:101CA000F0E50A35F0F51BE500F5F0E50135F0F556
+:101CB0001A120010751F01751E00751D00751C009D
+:101CC000E506F50AE507F501750900C3750000E5AD
+:101CD00009F5F0E50A35F0F51BE500F5F0E501350D
+:101CE000F0F51A120010751F02751E00751D0075A3
+:101CF0001C00E506F50AE507F501750900C3750046
+:101D000000E509F5F0E50A35F0F51BE500F5F0E52D
+:101D10000135F0F51A120010750E10750C00750AD9
+:101D200000750100750D01750B0075090075000047
+:101D3000C3E50DF5F0E50E95F0F51FE50BF5F0E5C3
+:101D40000C95F0F51EE509F5F0E50A95F0F51DE5B1
+:101D500000F5F0E50195F0F51CE506F50AE507F557
+:101D600001750900C3750000E509F5F0E50A35F0D5
+:101D7000F51BE500F5F0E50135F0F51A12001075D8
+:101D80000000750100750900750A00E500F502E51F
+:101D900001F503E509F504E50AF50575E0402506BA
+:101DA000F58275E0003507F583E0F508E508C0E049
+:101DB00075E0412506F58275E0003507F583E0F50D
+:101DC00008E508C0E075E0422506F50675E0003537
+:101DD00007F507E502F582E503F583E504F500E57F
+:101DE00005F50122000000000000000000000000D6
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR tree-optimization/29637 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-vectorize" } */
+
+typedef struct __attribute__ ((aligned (8)))
+{
+ short a, b, c, d;
+} A;
+
+typedef struct
+{
+ A a[24];
+} B;
+
+static const A b = { 0, 0, 1, -1 };
+
+void
+foo (B *x)
+{
+ int i;
+ for (i = 0; i <= 20; i += 4)
+ x->a[i] = b;
+}
--- /dev/null
+/* PR tree-optimization/29637 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-vectorize" } */
+
+typedef struct __attribute__ ((aligned (8)))
+{
+ short a, b, c, d;
+} A;
+
+typedef struct
+{
+ A a[24];
+} B;
+
+static const A b = { 0, 0, 1, -1 };
+
+void
+foo (B *x)
+{
+ int i;
+ for (i = 0; i <= 20; i += 4)
+ x->a[i] = b;
+}
--- /dev/null
+:1000000000E506758209C39582F506E5077583004C
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F0E5173C
+:10004000F51BE516F51CE515F51D75E0062506F50D
+:100050008275E0003507F583E514F075E0052506A7
+:10006000F58275E0003507F583E513F075E00425AA
+:1000700006F58275E0003507F583E512F075E003BB
+:100080002506F58275E0003507F583E511F075E08A
+:10009000022506F58275E0003507F583E510F0E5E9
+:1000A0001FF51AE51EF5197511007512007513007C
+:1000B000751400751814751700750F00751000E59C
+:1000C00014F50E750080E500F5F0E51025F0F5104B
+:1000D000E500F5F0E50E25F0F50E750B00750C004A
+:1000E000751600750D00750A00751501750001C3C0
+:1000F000E50EF5F0E51095F0F509E50AF5F0E50AED
+:1001000035F0F509E509F5F0E50055F0F500E500F5
+:10011000F5F0E50B45F0F50B750001C3E50EF5F0C4
+:10012000E51095F0F509E50AF5F0E50A35F0F50971
+:10013000E510F5F0E50E95F0F501E50AF5F0E50AB4
+:1001400035F0F501E501F5F0E50945F0F509E515AE
+:10015000F5F0E50965F0F509E509F5F0E50055F07C
+:10016000F500C3E513F5F0E50F95F0F509E50AF59F
+:10017000F0E50A35F0F509E509F5F0E50055F0F58B
+:1001800000E500F5F0E50B45F0F50B750001C3E562
+:100190000EF5F0E51095F0F509E50AF5F0E50A35FC
+:1001A000F0F509E510F5F0E50E95F0F501E50AF535
+:1001B000F0E50A35F0F501E501F5F0E50945F0F562
+:1001C00009E515F5F0E50965F0F509E509F5F0E54E
+:1001D0000055F0F500C3E513F5F0E50F95F0F509CE
+:1001E000E50AF5F0E50A35F0F509E50FF5F0E51358
+:1001F00095F0F501E50AF5F0E50A35F0F501E501C0
+:10020000F5F0E50945F0F509E515F5F0E50965F0C6
+:10021000F509E509F5F0E50055F0F500C3E512F53F
+:10022000F0E51795F0F509E50AF5F0E50A35F0F582
+:1002300009E509F5F0E50055F0F500E500F5F0E514
+:100240000B45F0F50B750001C3E50EF5F0E51095D3
+:10025000F0F509E50AF5F0E50A35F0F509E510F5E0
+:10026000F0E50E95F0F501E50AF5F0E50A35F0F553
+:1002700001E501F5F0E50945F0F509E515F5F0E5CD
+:100280000965F0F509E509F5F0E50055F0F500C35D
+:10029000E513F5F0E50F95F0F509E50AF5F0E50A47
+:1002A00035F0F509E50FF5F0E51395F0F501E50AF0
+:1002B000F5F0E50A35F0F501E501F5F0E50945F061
+:1002C000F509E515F5F0E50965F0F509E509F5F03D
+:1002D000E50055F0F500C3E512F5F0E51795F0F5EA
+:1002E00009E50AF5F0E50A35F0F509E517F5F0E559
+:1002F0001295F0F501E50AF5F0E50A35F0F501E5AE
+:1003000001F5F0E50945F0F509E515F5F0E50965B4
+:10031000F0F509E509F5F0E50055F0F500C3E51144
+:10032000F5F0E51895F0F509E50AF5F0E50A35F080
+:10033000F509E509F5F0E50055F0F500E500F5F003
+:10034000E50B45F0F50BE50BF500E516F501750B32
+:1003500001C3750900E500F5F0E50995F0F50975AB
+:100360000900E509F5F0E50935F0F509E509F5F0CD
+:10037000E50B65F0F50BC3750900E50CF5F0E50933
+:1003800095F0F509750900E509F5F0E50935F0F591
+:1003900009E509F5F0E50B65F0F50BC3750900E516
+:1003A00001F5F0E50995F0F509750900E509F5F0A5
+:1003B000E50935F0F509E509F5F0E50B65F0F50B14
+:1003C000C3750900E50DF5F0E50995F0F509750926
+:1003D00000E509F5F0E50935F0F509E509F5F0E581
+:1003E0000B65F0F50B750C00751600750D00E50C2E
+:1003F000F500E516F501E50DF509750C01C3750A63
+:1004000000E50BF5F0E50A95F0F50A750A00E50A36
+:10041000F5F0E50A35F0F50AE50AF5F0E50C65F0CA
+:10042000F50CC3750A00E500F5F0E50A95F0F50A4C
+:10043000750A00E50AF5F0E50A35F0F50AE50AF572
+:10044000F0E50C65F0F50CC3750A00E501F5F0E583
+:100450000A95F0F50A750A00E50AF5F0E50A35F0A7
+:10046000F50AE50AF5F0E50C65F0F50CC3750A0030
+:10047000E509F5F0E50A95F0F50A750A00E50AF5D3
+:10048000F0E50A35F0F50AE50AF5F0E50C65F0F55A
+:100490000C750100750900750A00750000E50CF582
+:1004A000F0E50045F0F500E501F5F0E50045F0F573
+:1004B00000E509F5F0E50045F0F500E50AF5F0E5A1
+:1004C0000045F0F500E50070028003020EA2007501
+:1004D0000100C3750000E501F5F0E51A35F0F509F6
+:1004E000E500F5F0E51935F0F50A750100C3750072
+:1004F00000E501F5F0E50935F0F501E500F5F0E579
+:100500000A35F0F500E500F502E501F582E502F5B2
+:1005100083E0F50E750101C3750000E501F5F0E516
+:100520000935F0F501E500F5F0E50A35F0F500E5EF
+:1005300000F502E501F582E502F583E0F50F7509A6
+:1005400008750B00750C00750D00C3750000E511F2
+:10055000F5F0E509A4F50AE511F5F0E509A4E5F0E3
+:10056000F501E50AF5F0E50035F0F500E512F5F0E6
+:10057000E509A4F50AE512F5F0E509A4E5F0F509A9
+:10058000E50AF5F0E50135F0F501C3C3750900E5AD
+:1005900000F5F0E50C35F0F50CE501F5F0E50D356D
+:1005A000F0F50DC3750100E511F5F0E50BA4F50AB2
+:1005B000E511F5F0E50BA4E5F0F509E50AF5F0E540
+:1005C0000135F0F501750000C3C3750900E500F5BC
+:1005D000F0E50C35F0F50CE501F5F0E50D35F0F53D
+:1005E0000DC3750000750100C3C3750900E500F572
+:1005F000F0E50C35F0F50CE501F5F0E50D35F0F51D
+:100600000DC3750000750100C3C3750900E500F551
+:10061000F0E50C35F0F50CE501F5F0E50D35F0F5FC
+:100620000DC3750000E50CF5F0E50E35F0F500E5BD
+:100630000DF5F0E50F35F0F509750A00C3750100F9
+:10064000E50AF5F0E50035F0F50CE501F5F0E50912
+:1006500035F0F50D900000E582F509900000E58386
+:10066000F50A750100C3750000E501F5F0E50935EF
+:10067000F0F501E500F5F0E50A35F0F500E501F5E6
+:1006800009E500F50A750100C3750000E501F5F004
+:10069000E50935F0F501E500F5F0E50A35F0F5007E
+:1006A000E500F502E501F582E502F583E0F50B755D
+:1006B0000101C3750000E501F5F0E50935F0F5012C
+:1006C000E500F5F0E50A35F0F500E500F502E50195
+:1006D000F582E502F583E0F509750100C3750000B8
+:1006E000E501F5F0E50C35F0F501E500F5F0E50D77
+:1006F00035F0F500E50BF503E500F502E501F582BF
+:10070000E502F583E503F0750101C3750000E5011D
+:10071000F5F0E50C35F0F501E500F5F0E50D35F007
+:10072000F500E509F503E500F502E501F582E502CE
+:10073000F583E503F0750100C3750000E501F5F0F0
+:10074000E51A35F0F509E500F5F0E51935F0F50A9B
+:10075000750100C3750000E501F5F0E50935F0F518
+:1007600001E500F5F0E50A35F0F500E500F502E5F4
+:1007700001F582E502F583E0F50E750101C3750010
+:1007800000E501F5F0E50935F0F501E500F5F0E5E6
+:100790000A35F0F500E500F502E501F582E502F520
+:1007A00083E0F50F750908750B00750C00750D00D9
+:1007B000C3750000E511F5F0E509A4F50AE511F5AA
+:1007C000F0E509A4E5F0F501E50AF5F0E50035F0FE
+:1007D000F500E512F5F0E509A4F50AE512F5F0E5F6
+:1007E00009A4E5F0F509E50AF5F0E50135F0F501B4
+:1007F000C3C3750900E500F5F0E50C35F0F50CE52F
+:1008000001F5F0E50D35F0F50DC3750100E511F5C5
+:10081000F0E50BA4F50AE511F5F0E50BA4E5F0F51C
+:1008200009E50AF5F0E50135F0F501750000C3C3EF
+:10083000750900E500F5F0E50C35F0F50CE501F57E
+:10084000F0E50D35F0F50DC3750000750100C3C36B
+:10085000750900E500F5F0E50C35F0F50CE501F55E
+:10086000F0E50D35F0F50DC3750000750100C3C34B
+:10087000750900E500F5F0E50C35F0F50CE501F53E
+:10088000F0E50D35F0F50DC3750000E50CF5F0E56C
+:100890000E35F0F500E50DF5F0E50F35F0F50975CD
+:1008A0000A02C3750100E50AF5F0E50035F0F50C24
+:1008B000E501F5F0E50935F0F50D900000E582F56C
+:1008C00009900000E583F50A750102C3750000E593
+:1008D00001F5F0E50935F0F501E500F5F0E50A353B
+:1008E000F0F500E501F509E500F50A750100C375AD
+:1008F0000000E501F5F0E50935F0F501E500F5F05A
+:10090000E50A35F0F500E500F502E501F582E502BE
+:10091000F583E0F50B750101C3750000E501F5F005
+:10092000E50935F0F501E500F5F0E50A35F0F500EB
+:10093000E500F502E501F582E502F583E0F50975CC
+:100940000100C3750000E501F5F0E50C35F0F50197
+:10095000E500F5F0E50D35F0F500E50BF503E500F4
+:10096000F502E501F582E502F583E503F075010185
+:10097000C3750000E501F5F0E50C35F0F501E50083
+:10098000F5F0E50D35F0F500E509F503E500F502B4
+:10099000E501F582E502F583E503F0750100C37515
+:1009A0000000E501F5F0E51A35F0F509E500F5F090
+:1009B000E51935F0F50A750100C3750000E501F58C
+:1009C000F0E50935F0F501E500F5F0E50A35F0F55B
+:1009D00000E500F502E501F582E502F583E0F50E9C
+:1009E000750101C3750000E501F5F0E50935F0F585
+:1009F00001E500F5F0E50A35F0F500E500F502E562
+:100A000001F582E502F583E0F50F750908750B0025
+:100A1000750C00750D00C3750000E511F5F0E509D2
+:100A2000A4F50AE511F5F0E509A4E5F0F501E50AFC
+:100A3000F5F0E50035F0F500E512F5F0E509A4F56F
+:100A40000AE512F5F0E509A4E5F0F509E50AF5F087
+:100A5000E50135F0F501C3C3750900E500F5F0E5E2
+:100A60000C35F0F50CE501F5F0E50D35F0F50DC3AD
+:100A7000750100E511F5F0E50BA4F50AE511F5F0B7
+:100A8000E50BA4E5F0F509E50AF5F0E50135F0F52B
+:100A900001750000C3C3750900E500F5F0E50C35EC
+:100AA000F0F50CE501F5F0E50D35F0F50DC3750039
+:100AB00000750100C3C3750900E500F5F0E50C35CC
+:100AC000F0F50CE501F5F0E50D35F0F50DC3750019
+:100AD00000750100C3C3750900E500F5F0E50C35AC
+:100AE000F0F50CE501F5F0E50D35F0F50DC37500F9
+:100AF00000E50CF5F0E50E35F0F500E50DF5F0E557
+:100B00000F35F0F509750A04C3750100E50AF5F023
+:100B1000E50035F0F50CE501F5F0E50935F0F50DEA
+:100B2000900000E582F509900000E583F50A750163
+:100B300004C3750000E501F5F0E50935F0F501E5C0
+:100B400000F5F0E50A35F0F500E501F509E500F5F9
+:100B50000A750100C3750000E501F5F0E50935F0FF
+:100B6000F501E500F5F0E50A35F0F500E500F502E0
+:100B7000E501F582E502F583E0F50B750101C3752A
+:100B80000000E501F5F0E50935F0F501E500F5F0C7
+:100B9000E50A35F0F500E500F502E501F582E5022C
+:100BA000F583E0F509750100C3750000E501F5F076
+:100BB000E50C35F0F501E500F5F0E50D35F0F50053
+:100BC000E50BF503E500F502E501F582E502F583A5
+:100BD000E503F0750101C3750000E501F5F0E50CD2
+:100BE00035F0F501E500F5F0E50D35F0F500E50926
+:100BF000F503E500F502E501F582E502F583E5037D
+:100C0000F0750100C3750000E501F5F0E51A35F057
+:100C1000F509E500F5F0E51935F0F50A750100C3B1
+:100C2000750000E501F5F0E50935F0F501E500F5A1
+:100C3000F0E50A35F0F500E500F502E501F582E59D
+:100C400002F583E0F50E750101C3750000E501F5BD
+:100C5000F0E50935F0F501E500F5F0E50A35F0F5C8
+:100C600000E500F502E501F582E502F583E0F50F08
+:100C7000750908750B00750C00750D00C375000033
+:100C8000E511F5F0E509A4F50AE511F5F0E509A48B
+:100C9000E5F0F501E50AF5F0E50035F0F500E512BF
+:100CA000F5F0E509A4F50AE512F5F0E509A4E5F08B
+:100CB000F509E50AF5F0E50135F0F501C3C375095D
+:100CC00000E500F5F0E50C35F0F50CE501F5F0E593
+:100CD0000D35F0F50DC3750100E511F5F0E50BA438
+:100CE000F50AE511F5F0E50BA4E5F0F509E50AF5DF
+:100CF000F0E50135F0F501750000C3C3750900E5A5
+:100D000000F5F0E50C35F0F50CE501F5F0E50D35F5
+:100D1000F0F50DC3750000750100C3C3750900E54A
+:100D200000F5F0E50C35F0F50CE501F5F0E50D35D5
+:100D3000F0F50DC3750000750100C3C3750900E52A
+:100D400000F5F0E50C35F0F50CE501F5F0E50D35B5
+:100D5000F0F50DC3750000E50CF5F0E50E35F0F586
+:100D600000E50DF5F0E50F35F0F509750A06C375D8
+:100D70000100E50AF5F0E50035F0F50CE501F5F0C8
+:100D8000E50935F0F50D900000E582F509900000C9
+:100D9000E583F50A750106C3750000E501F5F0E588
+:100DA0000935F0F501E500F5F0E50A35F0F500E567
+:100DB00001F509E500F50A750100C3750000E501BC
+:100DC000F5F0E50935F0F501E500F5F0E50A35F057
+:100DD000F500E500F502E501F582E502F583E0F5B1
+:100DE0000B750101C3750000E501F5F0E50935F06B
+:100DF000F501E500F5F0E50A35F0F500E500F5024E
+:100E0000E501F582E502F583E0F509750100C3759A
+:100E10000000E501F5F0E50C35F0F501E500F5F031
+:100E2000E50D35F0F500E50BF503E500F502E5010C
+:100E3000F582E502F583E503F0750101C375000055
+:100E4000E501F5F0E50C35F0F501E500F5F0E50D0F
+:100E500035F0F500E509F503E500F502E501F58259
+:100E6000E502F583E503F0750104750900750A00D4
+:100E7000750B00C3750000E501F5F0E51135F0F5DF
+:100E800011E509F5F0E51235F0F512E50AF5F0E5A2
+:100E90001335F0F513E50BF5F0E51435F0F5140214
+:100EA00000B300750000E500F502E500F503E5007C
+:100EB000F504E500F505E51BF517E51CF516E51D40
+:100EC000F51575E0062506F58275E0003507F58312
+:100ED000E0F51475E0052506F58275E0003507F5A7
+:100EE00083E0F51375E0042506F58275E00035070B
+:100EF000F583E0F51275E0032506F58275E000350F
+:100F000007F583E0F51175E0022506F58275E0002E
+:100F10003507F583E0F51075E0002506F58275E0EC
+:100F2000003507F583E0F508E508C0E075E0012528
+:100F300006F58275E0003507F583E0F508E508C0A1
+:100F4000E075E0092506F50675E0003507F507E5CB
+:100F500002F582E503F583E504F500E505F50122D8
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR c/29736 */
+
+int __attribute__ ((vector_size (8), vector_size (8))) v; /* { dg-error "invalid vector type" } */
+
+extern int __attribute__ ((vector_size (8))) w;
+int __attribute__ ((vector_size (8))) w;
+
+void
+foo ()
+{
+ v = v + v;
+ w = w + w;
+}
--- /dev/null
+/* PR c/29736 */
+
+int __attribute__ ((vector_size (8), vector_size (8))) v; /* { dg-error "invalid vector type" } */
+
+extern int __attribute__ ((vector_size (8))) w;
+int __attribute__ ((vector_size (8))) w;
+
+void
+foo ()
+{
+ v = v + v;
+ w = w + w;
+}
--- /dev/null
+:1000000000D0E0F51CD0E0F51DE513F518E512F57C
+:1000100019E511F51AE510F51B900000E582F512BF
+:10002000900000E583F513900000E582F50990004B
+:1000300000E583F50A750100C3750000E501F5F0E0
+:10004000E50935F0F501E500F5F0E50A35F0F500D4
+:10005000E500F502E501F582E502F583E0F50E75B0
+:100060000101C3750000E501F5F0E50935F0F50182
+:10007000E500F5F0E50A35F0F500E500F502E501EB
+:10008000F582E502F583E0F50F750102C375000006
+:10009000E501F5F0E50935F0F501E500F5F0E50AD3
+:1000A00035F0F500E500F502E501F582E502F5839E
+:1000B000E0F510750103C3750000E501F5F0E509F1
+:1000C00035F0F501E500F5F0E50A35F0F500E5005D
+:1000D000F502E501F582E502F583E0F511900000F7
+:1000E000E582F509900000E583F50A750100C37506
+:1000F0000000E501F5F0E50935F0F501E500F5F062
+:10010000E50A35F0F500E500F502E501F582E502C6
+:10011000F583E0F50B750101C3750000E501F5F00D
+:10012000E50935F0F501E500F5F0E50A35F0F500F3
+:10013000E500F502E501F582E502F583E0F50C75D1
+:100140000102C3750000E501F5F0E50935F0F501A0
+:10015000E500F5F0E50A35F0F500E500F502E5010A
+:10016000F582E502F583E0F50D750103C375000026
+:10017000E501F5F0E50935F0F501E500F5F0E50AF2
+:1001800035F0F500E500F502E501F582E502F583BD
+:10019000E0F501C3750000E50BF5F0E50E35F0F56F
+:1001A00000E50CF5F0E50F35F0F509E50DF5F0E5A6
+:1001B0001035F0F50AE501F5F0E51135F0F50C75AF
+:1001C0000B00C3750100E50BF5F0E51235F0F50BFA
+:1001D000E501F5F0E51335F0F501E500F503E5017E
+:1001E000F502E50BF582E502F583E503F0750B01F9
+:1001F000C3750000E50BF5F0E51235F0F50BE500F1
+:10020000F5F0E51335F0F501E509F503E501F50233
+:10021000E50BF582E502F583E503F0750B02C37586
+:100220000000E50BF5F0E51235F0F50BE500F5F013
+:10023000E51335F0F501E50AF503E501F502E50BF7
+:10024000F582E502F583E503F0750B03C375000045
+:10025000E50BF5F0E51235F0F50BE500F5F0E513EB
+:1002600035F0F501E50CF503E501F502E50BF58246
+:10027000E502F583E503F0900004E582F5129000B5
+:1002800004E583F513900004E582F509900004E588
+:1002900083F50A750100C3750000E501F5F0E50975
+:1002A00035F0F501E500F5F0E50A35F0F500E5007B
+:1002B000F502E501F582E502F583E0F50E75010131
+:1002C000C3750000E501F5F0E50935F0F501E5003D
+:1002D000F5F0E50A35F0F500E500F502E501F582F7
+:1002E000E502F583E0F50F750102C3750000E50135
+:1002F000F5F0E50935F0F501E500F5F0E50A35F032
+:10030000F500E500F502E501F582E502F583E0F58B
+:1003100010750103C3750000E501F5F0E50935F03E
+:10032000F501E500F5F0E50A35F0F500E500F50228
+:10033000E501F582E502F583E0F511900004E58220
+:10034000F509900004E583F50A750100C375000006
+:10035000E501F5F0E50935F0F501E500F5F0E50A10
+:1003600035F0F500E500F502E501F582E502F583DB
+:10037000E0F50B750101C3750000E501F5F0E50935
+:1003800035F0F501E500F5F0E50A35F0F500E5009A
+:10039000F502E501F582E502F583E0F50C75010251
+:1003A000C3750000E501F5F0E50935F0F501E5005C
+:1003B000F5F0E50A35F0F500E500F502E501F58216
+:1003C000E502F583E0F50D750103C3750000E50155
+:1003D000F5F0E50935F0F501E500F5F0E50A35F051
+:1003E000F500E500F502E501F582E502F583E0F5AB
+:1003F00001C3750000E50BF5F0E50E35F0F500E5FD
+:100400000CF5F0E50F35F0F509E50DF5F0E51035E3
+:10041000F0F50AE501F5F0E51135F0F50C750B0086
+:10042000C3750100E50BF5F0E51235F0F50BE501BC
+:10043000F5F0E51335F0F501E500F503E501F5020A
+:10044000E50BF582E502F583E503F0750B01C37555
+:100450000000E50BF5F0E51235F0F50BE500F5F0E1
+:10046000E51335F0F501E509F503E501F502E50BC6
+:10047000F582E502F583E503F0750B02C375000014
+:10048000E50BF5F0E51235F0F50BE500F5F0E513B9
+:1004900035F0F501E50AF503E501F502E50BF58216
+:1004A000E502F583E503F0750B03C3750000E50B6A
+:1004B000F5F0E51235F0F50BE500F5F0E51335F054
+:1004C000F501E50CF503E501F502E50BF582E50222
+:1004D000F583E503F0750000E500F502E500F5039E
+:1004E000E500F504E500F505E518F513E519F51245
+:1004F000E51AF511E51BF510E51DC0E0E51CC0E0AF
+:10050000E502F582E503F583E504F500E505F5016F
+:1005100022000000000000000000000000000000B9
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR middle-end/3074 */
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+void foo()
+{
+ int a;
+ 5 * (a == 1) | (a == 2); /* { dg-warning "no effect" "no effect" } */
+}
+
--- /dev/null
+/* PR middle-end/3074 */
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+void foo()
+{
+ int a;
+ 5 * (a == 1) | (a == 2); /* { dg-warning "no effect" "no effect" } */
+}
+
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Contributed by Joost VandeVondele <jv244@cam.ac.uk> */
+
+/* { dg-do run } */
+/* { dg-require-profiling "-pg" } */
+/* { dg-options "-O2 -pg" } */
+/* { dg-options "-O2 -pg -static" { target hppa*-*-hpux* } } */
+
+extern void abort (void);
+
+int stack_pointer=0;
+
+void
+__attribute__((noinline))
+mystop ()
+{
+ abort ();
+}
+
+void
+__attribute__((noinline))
+add ()
+{
+ if (stack_pointer + 1 > 10)
+ mystop ();
+
+ stack_pointer = stack_pointer + 1;
+}
+
+int main ()
+{
+ add ();
+ return stack_pointer - 1;
+}
--- /dev/null
+/* Contributed by Joost VandeVondele <jv244@cam.ac.uk> */
+
+/* { dg-do run } */
+/* { dg-require-profiling "-pg" } */
+/* { dg-options "-O2 -pg" } */
+/* { dg-options "-O2 -pg -static" { target hppa*-*-hpux* } } */
+
+extern void abort (void);
+
+int stack_pointer=0;
+
+void
+__attribute__((noinline))
+mystop ()
+{
+ abort ();
+}
+
+void
+__attribute__((noinline))
+add ()
+{
+ if (stack_pointer + 1 > 10)
+ mystop ();
+
+ stack_pointer = stack_pointer + 1;
+}
+
+int main ()
+{
+ add ();
+ return stack_pointer - 1;
+}
--- /dev/null
+:1000000075812F7506FF7507FF1207C102000C00EE
+:1000100000E506758202C39582F506E50775830043
+:100020009583F507D0E0F50875E0012506F58275A2
+:10003000E0003507F583E508F0D0E0F50875E0004D
+:100040002506F58275E0003507F583E508F07500B3
+:1000500000E500F502E500F503E500F504E500F52F
+:100060000575E0002506F58275E0003507F583E0AB
+:10007000F508E508C0E075E0012506F58275E000A9
+:100080003507F583E0F508E508C0E075E0022506D0
+:10009000F50675E0003507F507E502F582E503F59D
+:1000A00083E504F500E505F5012200E50675820A01
+:1000B000C39582F506E5077583009583F507D0E0C3
+:1000C000F50875E0012506F58275E0003507F58332
+:1000D000E508F0D0E0F50875E0002506F58275E04A
+:1000E000003507F583E508F075E0092506F582750A
+:1000F000E0003507F583E517F075E0082506F58281
+:1001000075E0003507F583E516F075E0072506F57F
+:100110008275E0003507F583E515F075E0062506E4
+:10012000F58275E0003507F583E514F075E00525E7
+:1001300006F58275E0003507F583E513F075E004F8
+:100140002506F58275E0003507F583E512F075E0C8
+:10015000032506F58275E0003507F583E511F07596
+:10016000E0022506F58275E0003507F583E510F01D
+:10017000900000E582F509900000E583F50B75011C
+:1001800000C3750000E501F5F0E50935F0F501E57E
+:1001900000F5F0E50B35F0F500E500F502E501F5B9
+:1001A00082E502F583E0F50F750101C3750000E5F6
+:1001B00001F5F0E50935F0F501E500F5F0E50B3561
+:1001C000F0F500E500F502E501F582E502F583E0D2
+:1001D000F50C750102C3750000E501F5F0E5093580
+:1001E000F0F501E500F5F0E50B35F0F500E500F57B
+:1001F00002E501F582E502F583E0F50A750103C326
+:10020000750000E501F5F0E50935F0F501E500F5CB
+:10021000F0E50B35F0F500E500F502E501F582E5C6
+:1002200002F583E0F501750E01750B007509007587
+:100230000000C3750D00E50EF5F0E50F35F0F5167D
+:10024000E50BF5F0E50C35F0F50EE509F5F0E50AFE
+:1002500035F0F50FE500F5F0E50135F0F51075170F
+:100260000A751100751200751300750080E500F520
+:10027000F0E51325F0F513E500F5F0E51025F0F5B0
+:1002800010750C00750D00751400751500750B00C8
+:10029000750A01750001C3E510F5F0E51395F0F559
+:1002A00009E50BF5F0E50B35F0F509E509F5F0E5A5
+:1002B0000055F0F500E500F5F0E50C45F0F50C759E
+:1002C0000001C3E510F5F0E51395F0F509E50BF530
+:1002D000F0E50B35F0F509E513F5F0E51095F0F5CF
+:1002E00001E50BF5F0E50B35F0F501E501F5F0E57D
+:1002F0000945F0F509E50AF5F0E50965F0F509E5C8
+:1003000009F5F0E50055F0F500C3E50FF5F0E5124D
+:1003100095F0F509E50BF5F0E50B35F0F509E50984
+:10032000F5F0E50055F0F500E500F5F0E50C45F0D9
+:10033000F50C750001C3E510F5F0E51395F0F5092E
+:10034000E50BF5F0E50B35F0F509E513F5F0E510F3
+:1003500095F0F501E50BF5F0E50B35F0F501E5015C
+:10036000F5F0E50945F0F509E50AF5F0E50965F070
+:10037000F509E509F5F0E50055F0F500C3E50FF5E1
+:10038000F0E51295F0F509E50BF5F0E50B35F0F524
+:1003900009E512F5F0E50F95F0F501E50BF5F0E54F
+:1003A0000B35F0F501E501F5F0E50945F0F509E556
+:1003B0000AF5F0E50965F0F509E509F5F0E5005500
+:1003C000F0F500C3E50EF5F0E51195F0F509E50B44
+:1003D000F5F0E50B35F0F509E509F5F0E50055F028
+:1003E000F500E500F5F0E50C45F0F50C750001C3EE
+:1003F000E510F5F0E51395F0F509E50BF5F0E50BE3
+:1004000035F0F509E513F5F0E51095F0F501E50B8C
+:10041000F5F0E50B35F0F501E501F5F0E50945F0FE
+:10042000F509E50AF5F0E50965F0F509E509F5F0E6
+:10043000E50055F0F500C3E50FF5F0E51295F0F590
+:1004400009E50BF5F0E50B35F0F509E512F5F0E5FA
+:100450000F95F0F501E50BF5F0E50B35F0F501E54D
+:1004600001F5F0E50945F0F509E50AF5F0E509655E
+:10047000F0F509E509F5F0E50055F0F500C3E50EE6
+:10048000F5F0E51195F0F509E50BF5F0E50B35F024
+:10049000F509E511F5F0E50E95F0F501E50BF5F040
+:1004A000E50B35F0F501E501F5F0E50945F0F50955
+:1004B000E50AF5F0E50965F0F509E509F5F0E5006F
+:1004C00055F0F500C3E516F5F0E51795F0F509E5EB
+:1004D0000BF5F0E50B35F0F509E509F5F0E500550C
+:1004E000F0F500E500F5F0E50C45F0F50C750000C1
+:1004F000E50CF5F0E50045F0F500E50DF5F0E5005B
+:1005000045F0F500E514F5F0E50045F0F500E515DA
+:10051000F5F0E50045F0F500E50070028003020704
+:10052000BA00900000E582F510900000E583F51117
+:10053000900000E582F509900000E583F50A750159
+:1005400000C3750000E501F5F0E50935F0F501E5BA
+:1005500000F5F0E50A35F0F500E500F502E501F5F6
+:1005600082E502F583E0F50C750101C3750000E535
+:1005700001F5F0E50935F0F501E500F5F0E50A359E
+:10058000F0F500E500F502E501F582E502F583E00E
+:10059000F50D750102C3750000E501F5F0E50935BB
+:1005A000F0F501E500F5F0E50A35F0F500E500F5B8
+:1005B00002E501F582E502F583E0F50E750103C35E
+:1005C000750000E501F5F0E50935F0F501E500F508
+:1005D000F0E50A35F0F500E500F502E501F582E504
+:1005E00002F583E0F50F750101750900750A0075C4
+:1005F0000B00C3750000E501F5F0E50C35F0F500E2
+:10060000E509F5F0E50D35F0F501E50AF5F0E50E43
+:1006100035F0F509E50BF5F0E50F35F0F50C750B48
+:1006200000C3750A00E50BF5F0E51035F0F50BE5B4
+:100630000AF5F0E51135F0F50AE500F503E50AF5F0
+:1006400002E50BF582E502F583E503F0750B01C3C6
+:10065000750000E50BF5F0E51035F0F50BE500F55C
+:10066000F0E51135F0F50AE501F503E50AF502E5D7
+:100670000BF582E502F583E503F0750B02C3750007
+:1006800000E50BF5F0E51035F0F50BE500F5F0E5CC
+:100690001135F0F50AE509F503E50AF502E50BF574
+:1006A00082E502F583E503F0750B03C3750000E5F1
+:1006B0000BF5F0E51035F0F50BE500F5F0E511353B
+:1006C000F0F50AE50CF503E50AF502E50BF582E520
+:1006D00002F583E503F0750000E500F502E500F59D
+:1006E00003E500F504E500F50575E0092506F5824A
+:1006F00075E0003507F583E0F51775E0082506F588
+:100700008275E0003507F583E0F51675E0072506EC
+:10071000F58275E0003507F583E0F51575E00625EF
+:1007200006F58275E0003507F583E0F51475E00500
+:100730002506F58275E0003507F583E0F51375E0D1
+:10074000042506F58275E0003507F583E0F512759E
+:10075000E0032506F58275E0003507F583E0F51125
+:1007600075E0022506F58275E0003507F583E0F5B2
+:100770001075E0002506F58275E0003507F583E089
+:10078000F508E508C0E075E0012506F58275E00092
+:100790003507F583E0F508E508C0E075E00A2506B1
+:1007A000F50675E0003507F507E502F582E503F586
+:1007B00083E504F500E505F50122001200100205AD
+:1007C0002200E506758202C39582F506E50775836A
+:1007D000009583F507D0E0F50875E0012506F58260
+:1007E00075E0003507F583E508F0D0E0F50875E021
+:1007F000002506F58275E0003507F583E508F090E1
+:100800000000E582F50A900000E583F50175090016
+:10081000C3750000E509F5F0E50A35F0F50DE500D2
+:10082000F5F0E50135F0F50E750900750A00750B58
+:1008300000750C00750100C3750000E501F5F0E5D9
+:100840000D35F0F501E500F5F0E50E35F0F500E5C4
+:1008500009F503E500F502E501F582E502F583E51A
+:1008600003F0750101C3750000E501F5F0E50D35F4
+:10087000F0F501E500F5F0E50E35F0F500E50AF5D7
+:1008800003E500F502E501F582E502F583E503F0F5
+:10089000750102C3750000E501F5F0E50D35F0F5D1
+:1008A00001E500F5F0E50E35F0F500E50BF503E5A3
+:1008B00000F502E501F582E502F583E503F0750137
+:1008C00003C3750000E501F5F0E50D35F0F501E530
+:1008D00000F5F0E50E35F0F500E50CF503E500F563
+:1008E00002E501F582E502F583E503F01200AA9026
+:1008F0000000E582F509900000E583F50A75010026
+:10090000C3750000E501F5F0E50935F0F501E500F6
+:10091000F5F0E50A35F0F500E500F502E501F582B0
+:10092000E502F583E0F50B750101C3750000E501F3
+:10093000F5F0E50935F0F501E500F5F0E50A35F0EB
+:10094000F500E500F502E501F582E502F583E0F545
+:100950000C750102C3750000E501F5F0E50935F0FD
+:10096000F501E500F5F0E50A35F0F500E500F502E2
+:10097000E501F582E502F583E0F50D750103C37528
+:100980000000E501F5F0E50935F0F501E500F5F0C9
+:10099000E50A35F0F500E500F502E501F582E5022E
+:1009A000F583E0F50E750001750100750900750A03
+:1009B00000C3E500F5F0E50B95F0F500E501F5F075
+:1009C000E50C95F0F501E509F5F0E50D95F0F50973
+:1009D000E50AF5F0E50E95F0F50AE500F502E5010A
+:1009E000F503E509F504E50AF50575E0002506F5CA
+:1009F0008275E0003507F583E0F508E508C0E0758D
+:100A0000E0012506F58275E0003507F583E0F5087D
+:100A1000E508C0E075E0022506F50675E00035073B
+:100A2000F507E502F582E503F583E504F500E50544
+:100A3000F50122000000000000000000000000009E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target *-*-osf5* } } */
+
+#pragma extern_prefix /* { dg-warning "malformed" } */
+#pragma extern_prefix foo /* { dg-warning "malformed" } */
+#pragma extern_prefix "foo" 1 /* { dg-warning "junk" } */
+
+int bar; /* silence `ISO C forbids an empty source file' warning */
--- /dev/null
+/* { dg-do compile { target *-*-osf5* } } */
+
+#pragma extern_prefix /* { dg-warning "malformed" } */
+#pragma extern_prefix foo /* { dg-warning "malformed" } */
+#pragma extern_prefix "foo" 1 /* { dg-warning "junk" } */
+
+int bar; /* silence `ISO C forbids an empty source file' warning */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target alpha*-*-osf5* } } */
+/* { dg-final { scan-assembler ",Xfoo" } } */
+
+#pragma extern_prefix "X"
+void foo(void) __attribute__((noreturn));
+void foo(void) __attribute__((noreturn));
+void bar()
+{
+ foo();
+}
--- /dev/null
+/* { dg-do compile { target alpha*-*-osf5* } } */
+/* { dg-final { scan-assembler ",Xfoo" } } */
+
+#pragma extern_prefix "X"
+void foo(void) __attribute__((noreturn));
+void foo(void) __attribute__((noreturn));
+void bar()
+{
+ foo();
+}
--- /dev/null
+:100000000000E506758202C39582F506E507758353
+:10001000009583F507D0E0F50875E0012506F58227
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000002506F58275E0003507F583E508F075C3
+:100040000000E500F502E500F503E500F504E50034
+:10005000F50575E0002506F58275E0003507F583A6
+:10006000E0F508E508C0E075E0012506F58275E0D9
+:10007000003507F583E0F508E508C0E075E00225E6
+:1000800006F50675E0003507F507E502F582E5039C
+:10009000F583E504F500E505F50122000000000008
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target sh-*-* sh[1234ble]*-*-*} } */
+/* { dg-options "-O" } */
+/* This test case will check whether trapa is generated only for isr. */
+#pragma interrupt
+void isr() __attribute__ ((trap_exit (4)));
+void isr()
+{
+}
+void delay(int a)
+{
+}
+int main()
+{
+ return 0;
+}
+
+/* { dg-final { scan-assembler-times "trapa\[ \t\]\[ \t\]*#4" 1} } */
--- /dev/null
+/* { dg-do compile { target sh-*-* sh[1234ble]*-*-*} } */
+/* { dg-options "-O" } */
+/* This test case will check whether trapa is generated only for isr. */
+#pragma interrupt
+void isr() __attribute__ ((trap_exit (4)));
+void isr()
+{
+}
+void delay(int a)
+{
+}
+int main()
+{
+ return 0;
+}
+
+/* { dg-final { scan-assembler-times "trapa\[ \t\]\[ \t\]*#4" 1} } */
--- /dev/null
+:1000000075812F7506FF7507FF12009A02000C001C
+:10001000D0E0F500D0E0F501750900E509F502E54D
+:1000200009F503E509F504E509F505E501C0E0E595
+:1000300000C0E0E502F582E503F583E504F500E59F
+:1000400005F5012200E506758204C39582F506E5F3
+:10005000077583009583F507D0E0F500D0E0F50142
+:10006000750900E509F502E509F503E509F504E57B
+:1000700009F505E501C0E0E500C0E075E0042506EE
+:10008000F50675E0003507F507E502F582E503F5AD
+:1000900083E504F500E505F5012200D0E0F500D088
+:1000A000E0F501750900750A00750B00750C00E597
+:1000B00009F502E50AF503E50BF504E50CF505E5A0
+:1000C00001C0E0E500C0E0E502F582E503F583E567
+:1000D00004F500E505F50122000000000000000025
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target h8300-*-* sh-*-* sh[1234ble]*-*-*} } */
+/* { dg-options "-O" } */
+/* This test case will check whether rte is generated only for isr. */
+#pragma interrupt
+void isr()
+{
+}
+void delay(int a)
+{
+}
+int main()
+{
+ return 0;
+}
+
+/* { dg-final { scan-assembler-times "rte" 1} } */
--- /dev/null
+/* { dg-do compile { target h8300-*-* sh-*-* sh[1234ble]*-*-*} } */
+/* { dg-options "-O" } */
+/* This test case will check whether rte is generated only for isr. */
+#pragma interrupt
+void isr()
+{
+}
+void delay(int a)
+{
+}
+int main()
+{
+ return 0;
+}
+
+/* { dg-final { scan-assembler-times "rte" 1} } */
--- /dev/null
+:1000000075812F7506FF7507FF12009A02000C001C
+:10001000D0E0F500D0E0F501750900E509F502E54D
+:1000200009F503E509F504E509F505E501C0E0E595
+:1000300000C0E0E502F582E503F583E504F500E59F
+:1000400005F5012200E506758204C39582F506E5F3
+:10005000077583009583F507D0E0F500D0E0F50142
+:10006000750900E509F502E509F503E509F504E57B
+:1000700009F505E501C0E0E500C0E075E0042506EE
+:10008000F50675E0003507F507E502F582E503F5AD
+:1000900083E504F500E505F5012200D0E0F500D088
+:1000A000E0F501750900750A00750B00750C00E597
+:1000B00009F502E50AF503E50BF504E50CF505E5A0
+:1000C00001C0E0E500C0E0E502F582E503F583E567
+:1000D00004F500E505F50122000000000000000025
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR c/28286 */
+/* { dg-do compile } */
+
+#pragma pack(0.5) /* { dg-warning "invalid constant" } */
+#pragma pack(push,0.5) /* { dg-warning "invalid constant" } */
+#pragma pack(push,x,0.5) /* { dg-warning "invalid constant" } */
+int i;
--- /dev/null
+/* PR c/28286 */
+/* { dg-do compile } */
+
+#pragma pack(0.5) /* { dg-warning "invalid constant" } */
+#pragma pack(push,0.5) /* { dg-warning "invalid constant" } */
+#pragma pack(push,x,0.5) /* { dg-warning "invalid constant" } */
+int i;
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target *-*-solaris* } } */
+
+#pragma redefine_extname /* { dg-warning "malformed" } */
+#pragma redefine_extname foo /* { dg-warning "malformed" } */
+#pragma redefine_extname foo 1 /* { dg-warning "malformed" } */
+#pragma redefine_extname foo bar 2 /* { dg-warning "junk" } */
+
+int bar; /* silence `ISO C forbids an empty source file' warning */
--- /dev/null
+/* { dg-do compile { target *-*-solaris* } } */
+
+#pragma redefine_extname /* { dg-warning "malformed" } */
+#pragma redefine_extname foo /* { dg-warning "malformed" } */
+#pragma redefine_extname foo 1 /* { dg-warning "malformed" } */
+#pragma redefine_extname foo bar 2 /* { dg-warning "junk" } */
+
+int bar; /* silence `ISO C forbids an empty source file' warning */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR middle-end/23199 */
+/* Testcase by Ralf Menzel <menzel@ls6.cs.uni-dortmund.de> */
+
+/* { dg-do compile } */
+/* { dg-options "-O -fprofile-generate" } */
+
+union rtunion_def
+{
+ struct rtx_def *rt_rtx;
+};
+
+typedef union rtunion_def rtunion;
+
+struct rtx_def
+{
+ unsigned int in_struct : 1;
+ union u {
+ rtunion fld[1];
+ } u;
+};
+
+typedef struct rtx_def *rtx;
+
+static void
+check_annul_list_true_false (int annul_true_p, rtx delay_list)
+{
+ rtx temp;
+ while (1)
+ {
+ temp = delay_list;
+ rtx trial = (((temp)->u.fld[0]).rt_rtx);
+ if ((annul_true_p && (((trial))->in_struct)))
+ return;
+ }
+}
--- /dev/null
+/* PR middle-end/23199 */
+/* Testcase by Ralf Menzel <menzel@ls6.cs.uni-dortmund.de> */
+
+/* { dg-do compile } */
+/* { dg-options "-O -fprofile-generate" } */
+
+union rtunion_def
+{
+ struct rtx_def *rt_rtx;
+};
+
+typedef union rtunion_def rtunion;
+
+struct rtx_def
+{
+ unsigned int in_struct : 1;
+ union u {
+ rtunion fld[1];
+ } u;
+};
+
+typedef struct rtx_def *rtx;
+
+static void
+check_annul_list_true_false (int annul_true_p, rtx delay_list)
+{
+ rtx temp;
+ while (1)
+ {
+ temp = delay_list;
+ rtx trial = (((temp)->u.fld[0]).rt_rtx);
+ if ((annul_true_p && (((trial))->in_struct)))
+ return;
+ }
+}
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Regression test for PR middle-end/23584 */
+/* Verify that dereferencing a volatile element in a struct causes
+ the function not be pure. */
+
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-ipa-pure-const" } */
+
+struct test_a { volatile int a; };
+
+int func_a(struct test_a *a)
+{
+ return a->a;
+}
+
+/* { dg-final { scan-ipa-dump-not "found to be pure: func_a" "pure-const" } } */
+/* { dg-final { cleanup-ipa-dump "pure-const" } } */
--- /dev/null
+/* Regression test for PR middle-end/23584 */
+/* Verify that dereferencing a volatile element in a struct causes
+ the function not be pure. */
+
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-ipa-pure-const" } */
+
+struct test_a { volatile int a; };
+
+int func_a(struct test_a *a)
+{
+ return a->a;
+}
+
+/* { dg-final { scan-ipa-dump-not "found to be pure: func_a" "pure-const" } } */
+/* { dg-final { cleanup-ipa-dump "pure-const" } } */
--- /dev/null
+:1000000000E506758202C39582F506E50775830053
+:100010009583F507D0E0F518D0E0F519E511F50E58
+:10002000E510F50F750100C3750000E501F5F0E579
+:100030001F35F0F501E500F5F0E51E35F0F500E5BA
+:1000400001F509E500F50A750100C3750000E50139
+:10005000F5F0E50935F0F501E500F5F0E50A35F0D4
+:10006000F500E500F502E501F582E502F583E0F52E
+:100070000B750101C3750000E501F5F0E50935F0E8
+:10008000F501E500F5F0E50A35F0F500E500F502CB
+:10009000E501F582E502F583E0F50C750102C37513
+:1000A0000000E501F5F0E50935F0F501E500F5F0B2
+:1000B000E50A35F0F500E500F502E501F582E50217
+:1000C000F583E0F50D750103C3750000E501F5F05A
+:1000D000E50935F0F501E500F5F0E50A35F0F50044
+:1000E000E500F502E501F582E502F583E0F500E5BE
+:1000F0000BF502E50CF503E50DF504E500F505E566
+:100100000EF511E50FF510E519C0E0E518C0E07532
+:10011000E0022506F50675E0003507F507E502F56E
+:1001200082E503F583E504F500E505F5012200000D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for warnings for qualified function return types. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -Wreturn-type" } */
+
+/* Qualifying a function return type makes no sense. */
+
+const int int_fn (void); /* { dg-warning "qualifiers" "int decl" } */
+const int (*int_ptr) (void); /* { dg-warning "qualifiers" "int ptr" } */
+const int int_fn2 (void) { return 0; } /* { dg-warning "qualifiers" "int defn" } */
+
+const void void_fn (void); /* { dg-warning "qualifiers" "void decl" } */
+const void (*void_ptr) (void); /* { dg-warning "qualifiers" "void ptr" } */
+const void void_fn2 (void) { } /* { dg-warning "qualified" "void defn" } */
+
+volatile void vvoid_fn (void); /* { dg-warning "qualifiers" "void decl" } */
+volatile void (*vvoid_ptr) (void); /* { dg-warning "qualifiers" "void ptr" } */
+volatile void vvoid_fn2 (void) { } /* { dg-warning "qualified" "void defn" } */
+
+int *restrict ip_fn (void); /* { dg-warning "qualifiers" "restrict decl" } */
+int *restrict (*ip_ptr) (void); /* { dg-warning "qualifiers" "restrict ptr" } */
+int *restrict ip_fn2 (void) { return (int *)0; }; /* { dg-warning "qualifiers" "restrict defn" } */
--- /dev/null
+/* Test for warnings for qualified function return types. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99 -Wreturn-type" } */
+
+/* Qualifying a function return type makes no sense. */
+
+const int int_fn (void); /* { dg-warning "qualifiers" "int decl" } */
+const int (*int_ptr) (void); /* { dg-warning "qualifiers" "int ptr" } */
+const int int_fn2 (void) { return 0; } /* { dg-warning "qualifiers" "int defn" } */
+
+const void void_fn (void); /* { dg-warning "qualifiers" "void decl" } */
+const void (*void_ptr) (void); /* { dg-warning "qualifiers" "void ptr" } */
+const void void_fn2 (void) { } /* { dg-warning "qualified" "void defn" } */
+
+volatile void vvoid_fn (void); /* { dg-warning "qualifiers" "void decl" } */
+volatile void (*vvoid_ptr) (void); /* { dg-warning "qualifiers" "void ptr" } */
+volatile void vvoid_fn2 (void) { } /* { dg-warning "qualified" "void defn" } */
+
+int *restrict ip_fn (void); /* { dg-warning "qualifiers" "restrict decl" } */
+int *restrict (*ip_ptr) (void); /* { dg-warning "qualifiers" "restrict ptr" } */
+int *restrict ip_fn2 (void) { return (int *)0; }; /* { dg-warning "qualifiers" "restrict defn" } */
--- /dev/null
+:1000000000D0E0F500D0E0F501750900750A007533
+:100010000B00750C00E509F502E50AF503E50BF5A3
+:1000200004E50CF505E501C0E0E500C0E0E502F5FA
+:1000300082E503F583E504F500E505F5012200D02E
+:10004000E0F500D0E0F501750900E509F502E509E4
+:10005000F503E509F504E509F505E501C0E0E5006E
+:10006000C0E0E502F582E503F583E504F500E5056A
+:10007000F5012200D0E0F500D0E0F501750900E5BA
+:1000800009F502E509F503E509F504E509F505E5D6
+:1000900001C0E0E500C0E0E502F582E503F583E597
+:1000A00004F500E505F5012200D0E0F500D0E0F50B
+:1000B00001750900750A00750B00E509F502E50AEE
+:1000C000F503E50BF504E50BF505E501C0E0E500FA
+:1000D000C0E0E502F582E503F583E504F500E505FA
+:1000E000F5012200000000000000000000000000F8
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for warnings for qualified function return types. -pedantic test. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic" } */
+
+/* Qualifying a function return type makes no sense. */
+
+/* The first two of these shouldn't warn (with just -pedantic) as long
+ as the function is not defined. */
+
+volatile void vvoid_fn (void);
+volatile void (*vvoid_ptr) (void);
+volatile void vvoid_fn2 (void) { } /* { dg-warning "qualified" "volatile defn" } */
--- /dev/null
+/* Test for warnings for qualified function return types. -pedantic test. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic" } */
+
+/* Qualifying a function return type makes no sense. */
+
+/* The first two of these shouldn't warn (with just -pedantic) as long
+ as the function is not defined. */
+
+volatile void vvoid_fn (void);
+volatile void (*vvoid_ptr) (void);
+volatile void vvoid_fn2 (void) { } /* { dg-warning "qualified" "volatile defn" } */
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for warnings for qualified function return types. Bug 15052
+ from Olatunji Ruwase (tjruwase at stanfordalumni.org): qualifiers
+ should not be lost when merging declarations. */
+
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+int foo (); /* { dg-error "previous declaration" "different qualifiers" } */
+const int foo () { return 0; } /* { dg-error "conflicting types" "different qualifiers" } */
+
+void bar (void);
+volatile void bar () { } /* { dg-warning "qualified|volatile" "different qualifiers" } */
+
+volatile void baz (void);
+void baz () { } /* { dg-warning "not compatible" "different qualifiers" } */
--- /dev/null
+/* Test for warnings for qualified function return types. Bug 15052
+ from Olatunji Ruwase (tjruwase at stanfordalumni.org): qualifiers
+ should not be lost when merging declarations. */
+
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+int foo (); /* { dg-error "previous declaration" "different qualifiers" } */
+const int foo () { return 0; } /* { dg-error "conflicting types" "different qualifiers" } */
+
+void bar (void);
+volatile void bar () { } /* { dg-warning "qualified|volatile" "different qualifiers" } */
+
+volatile void baz (void);
+void baz () { } /* { dg-warning "not compatible" "different qualifiers" } */
--- /dev/null
+:1000000000D0E0F500D0E0F501750900750A007533
+:100010000B00750C00E509F502E50AF503E50BF5A3
+:1000200004E50CF505E501C0E0E500C0E0E502F5FA
+:1000300082E503F583E504F500E505F5012200D02E
+:10004000E0F500D0E0F501750900E509F502E509E4
+:10005000F503E509F504E509F505E501C0E0E5006E
+:10006000C0E0E502F582E503F583E504F500E5056A
+:10007000F5012200D0E0F500D0E0F501750900E5BA
+:1000800009F502E509F503E509F504E509F505E5D6
+:1000900001C0E0E500C0E0E502F582E503F583E597
+:1000A00004F500E505F50122000000000000000055
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for warnings for qualified function return types. -pedantic
+ test. Only the definition gets a warning for qualified void return
+ types, not other such types within the definition. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic" } */
+
+volatile void (*y)(int);
+
+volatile void (*vvf(int x))(int) { return y; }
--- /dev/null
+/* Test for warnings for qualified function return types. -pedantic
+ test. Only the definition gets a warning for qualified void return
+ types, not other such types within the definition. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic" } */
+
+volatile void (*y)(int);
+
+volatile void (*vvf(int x))(int) { return y; }
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F50CD0E0F50D900000E5F4
+:1000200082F509900000E583F50A750100C37500AB
+:1000300000E501F5F0E50935F0F501E500F5F0E53D
+:100040000A35F0F500E500F502E501F582E502F577
+:1000500083E0F50B750101C3750000E501F5F0E5DE
+:100060000935F0F501E500F5F0E50A35F0F500E5B4
+:1000700000F502E501F582E502F583E0F501750082
+:1000800000E50BF502E501F503E500F504E500F5F3
+:1000900005E50DC0E0E50CC0E075E0042506F506B9
+:1000A00075E0003507F507E502F582E503F583E520
+:1000B00004F500E505F50122000000000000000045
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Some incompatible external linkage declarations were not diagnosed.
+ Bug 21342. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+extern int a[];
+void f(void) { extern int a[10]; } /* { dg-error "error: previous declaration of 'a' was here" } */
+extern int a[5]; /* { dg-error "error: conflicting types for 'a'" } */
--- /dev/null
+/* Some incompatible external linkage declarations were not diagnosed.
+ Bug 21342. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+extern int a[];
+void f(void) { extern int a[10]; } /* { dg-error "error: previous declaration of 'a' was here" } */
+extern int a[5]; /* { dg-error "error: conflicting types for 'a'" } */
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR 21502 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+typedef int IA[];
+typedef int IA5[5];
+typedef int IA10[10];
+typedef IA *IAP;
+typedef IA5 *IA5P;
+typedef IA10 *IA10P;
+extern IAP a[];
+void
+f (void)
+{
+ extern IA5P a[];
+}
+IAP a[] = { 0 }; /* { dg-error "previous definition" } */
+extern IA10P a[]; /* { dg-error "conflicting types" } */
--- /dev/null
+/* PR 21502 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+typedef int IA[];
+typedef int IA5[5];
+typedef int IA10[10];
+typedef IA *IAP;
+typedef IA5 *IA5P;
+typedef IA10 *IA10P;
+extern IAP a[];
+void
+f (void)
+{
+ extern IA5P a[];
+}
+IAP a[] = { 0 }; /* { dg-error "previous definition" } */
+extern IA10P a[]; /* { dg-error "conflicting types" } */
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for multiple declarations and composite types. As in bug
+ 13801. Illustrates how bug causes correct code to be wrongly
+ diagnosed. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+typedef int IA[];
+typedef int A5[5];
+typedef int A10[10];
+
+A10 array10;
+
+A5 *ap;
+void
+f (void)
+{
+ int ap;
+ {
+ extern IA *ap;
+ /* This assignment is valid. */
+ ap = &array10;
+ }
+}
--- /dev/null
+/* Test for multiple declarations and composite types. As in bug
+ 13801. Illustrates how bug causes correct code to be wrongly
+ diagnosed. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+typedef int IA[];
+typedef int A5[5];
+typedef int A10[10];
+
+A10 array10;
+
+A5 *ap;
+void
+f (void)
+{
+ int ap;
+ {
+ extern IA *ap;
+ /* This assignment is valid. */
+ ap = &array10;
+ }
+}
--- /dev/null
+:1000000000D0E0F50ED0E0F50FE510F50D900028DA
+:10001000E582F50B900028E583F50C900000E58261
+:10002000F509900000E583F50A750100C37500002D
+:10003000E501F5F0E50B35F0F501E500F5F0E50C2F
+:1000400035F0F500E509F503E500F502E501F58277
+:10005000E502F583E503F0750101C3750000E501D4
+:10006000F5F0E50B35F0F501E500F5F0E50C35F0C0
+:10007000F500E50AF503E500F502E501F582E50284
+:10008000F583E503F0750000E500F502E500F503F2
+:10009000E500F504E500F505E50DF510E50FC0E018
+:1000A000E50EC0E0E502F582E503F583E504F50021
+:1000B000E505F5012200000000000000000000003E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for multiple declarations and composite types. Diagnosis of
+ completion incompatible with implicit initializer. */
+
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-g" } */
+
+static int x[];
+
+void
+f (void)
+{
+ extern int x[2]; /* { dg-error "completed incompatibly" } */
+}
+
+/* The following is OK. */
+
+static int y[];
+void
+g (void)
+{
+ extern int y[1];
+}
--- /dev/null
+/* Test for multiple declarations and composite types. Diagnosis of
+ completion incompatible with implicit initializer. */
+
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-g" } */
+
+static int x[];
+
+void
+f (void)
+{
+ extern int x[2]; /* { dg-error "completed incompatibly" } */
+}
+
+/* The following is OK. */
+
+static int y[];
+void
+g (void)
+{
+ extern int y[1];
+}
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F5012200D0E0F500D0E0F5017509F5
+:1000400000E509F502E509F503E509F504E509F51B
+:1000500005E501C0E0E500C0E0E502F582E503F555
+:1000600083E504F500E505F501220000000000002D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for multiple declarations and composite types, as in bug
+ 13801. Test types saved from outer scopes are up to date. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+int x[];
+
+void
+f (void)
+{
+ extern int x[];
+}
+
+int x[10];
+
+void
+g (void)
+{
+ int x;
+ {
+ extern int x[10];
+ }
+}
+
+void
+h (void)
+{
+ sizeof (x);
+}
--- /dev/null
+/* Test for multiple declarations and composite types, as in bug
+ 13801. Test types saved from outer scopes are up to date. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+int x[];
+
+void
+f (void)
+{
+ extern int x[];
+}
+
+int x[10];
+
+void
+g (void)
+{
+ int x;
+ {
+ extern int x[10];
+ }
+}
+
+void
+h (void)
+{
+ sizeof (x);
+}
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F5012200D0E0F500D0E0F5017509F5
+:1000400000E509F502E509F503E509F504E509F51B
+:1000500005E501C0E0E500C0E0E502F582E503F555
+:1000600083E504F500E505F5012200D0E0F500D0B8
+:10007000E0F501750900E509F502E509F503E50973
+:10008000F504E509F505E501C0E0E500C0E0E5029D
+:10009000F582E503F583E504F500E505F5012200A9
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test cases of structures with volatile fields declared register:
+ should be allowed unless register name given but explicitly taking
+ the address forbidden. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+
+/* { dg-do compile } */
+
+struct S { volatile int field; };
+
+void
+f (void)
+{
+ register struct S a;
+ register struct S b[2];
+ register struct S c __asm__("nosuchreg"); /* { dg-error "object with volatile field" "explicit reg name" } */
+ &a; /* { dg-warning "address of register" "explicit address" } */
+ b; /* { dg-warning "address of register" "implicit address" } */
+}
--- /dev/null
+/* Test cases of structures with volatile fields declared register:
+ should be allowed unless register name given but explicitly taking
+ the address forbidden. */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+
+/* { dg-do compile } */
+
+struct S { volatile int field; };
+
+void
+f (void)
+{
+ register struct S a;
+ register struct S b[2];
+ register struct S c __asm__("nosuchreg"); /* { dg-error "object with volatile field" "explicit reg name" } */
+ &a; /* { dg-warning "address of register" "explicit address" } */
+ b; /* { dg-warning "address of register" "implicit address" } */
+}
--- /dev/null
+:1000000000E506758210C39582F506E50775830045
+:100010009583F507D0E0F500D0E0F501750900E51E
+:1000200009F502E509F503E509F504E509F505E536
+:1000300001C0E0E500C0E075E0102506F50675E0BA
+:10004000003507F507E502F582E503F583E504F5DC
+:1000500000E505F50122000000000000000000009E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR/18160 */
+
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+
+/* This should yield an error even without -pedantic. */
+/* { dg-options "-ansi" } */
+
+void g(int *);
+
+void f(void)
+{
+ register int x __asm ("eax");
+ g(&x); /* { dg-error "error: address of register variable" } */
+}
--- /dev/null
+/* PR/18160 */
+
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+
+/* This should yield an error even without -pedantic. */
+/* { dg-options "-ansi" } */
+
+void g(int *);
+
+void f(void)
+{
+ register int x __asm ("eax");
+ g(&x); /* { dg-error "error: address of register variable" } */
+}
--- /dev/null
+:100000000000E506758206C39582F506E50775834F
+:10001000009583F507D0E0F50875E0052506F58223
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000042506F58275E0003507F583E508F0E54F
+:1000400006F509E507F50A750100C3750000E5012D
+:10005000F5F0E50935F0F501E500F5F0E50A35F0D4
+:10006000F500E501F51FE500F51E750000E500F55A
+:1000700002E500F503E500F504E500F50575E0048B
+:100080002506F58275E0003507F583E0F508E508FB
+:10009000C0E075E0052506F58275E0003507F583BB
+:1000A000E0F508E508C0E075E0062506F50675E010
+:1000B000003507F507E502F582E503F583E504F56C
+:1000C00000E505F50122000000000000000000002E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR/18160 */
+
+/* { dg-do compile } */
+
+/* This should yield an error even without -pedantic. */
+/* { dg-options "-ansi" } */
+
+void g(int *);
+
+void f(void)
+{
+ register int x;
+ g(&x); /* { dg-error "error: address of register variable" } */
+}
--- /dev/null
+/* PR/18160 */
+
+/* { dg-do compile } */
+
+/* This should yield an error even without -pedantic. */
+/* { dg-options "-ansi" } */
+
+void g(int *);
+
+void f(void)
+{
+ register int x;
+ g(&x); /* { dg-error "error: address of register variable" } */
+}
--- /dev/null
+:100000000000E506758206C39582F506E50775834F
+:10001000009583F507D0E0F50875E0052506F58223
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000042506F58275E0003507F583E508F0E54F
+:1000400006F509E507F50A750100C3750000E5012D
+:10005000F5F0E50935F0F501E500F5F0E50A35F0D4
+:10006000F500E501F51FE500F51E750000E500F55A
+:1000700002E500F503E500F504E500F50575E0048B
+:100080002506F58275E0003507F583E0F508E508FB
+:10009000C0E075E0052506F58275E0003507F583BB
+:1000A000E0F508E508C0E075E0062506F50675E010
+:1000B000003507F507E502F582E503F583E504F56C
+:1000C00000E505F50122000000000000000000002E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Missing warning for falling off the end of a non-void function.
+ egcs-1.1.2 passes, egcs-ss-19990428 fails.
+ http://gcc.gnu.org/ml/gcc-bugs/1999-03n/msg00221.html */
+/* { dg-do compile } */
+/* { dg-options "-O -Wreturn-type" } */
+int
+foo(void)
+{
+} /* { dg-warning "control reaches end of non-void function" "warning for falling off end of non-void function" } */
--- /dev/null
+/* Missing warning for falling off the end of a non-void function.
+ egcs-1.1.2 passes, egcs-ss-19990428 fails.
+ http://gcc.gnu.org/ml/gcc-bugs/1999-03n/msg00221.html */
+/* { dg-do compile } */
+/* { dg-options "-O -Wreturn-type" } */
+int
+foo(void)
+{
+} /* { dg-warning "control reaches end of non-void function" "warning for falling off end of non-void function" } */
--- /dev/null
+:1000000000D0E0F500D0E0F501E509F502E509F5DD
+:1000100003E509F504E509F505E501C0E0E500C0E3
+:10002000E0E502F582E503F583E504F500E505F575
+:10003000012200000000000000000000000000009D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Bogus warnings claiming we fall off the end of a non-void function.
+ By Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 8/27/2000. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wreturn-type" } */
+
+extern void abort (void) __attribute__ ((__noreturn__));
+
+int
+foo1 (int i)
+{
+ if (i)
+ return i;
+
+ abort ();
+} /* { dg-bogus "control reaches end of non-void function" "warning for falling off end of non-void function" } */
+
+__inline__ int
+foo2 (int i)
+{
+ if (i)
+ return i;
+
+ abort ();
+} /* { dg-bogus "control reaches end of non-void function" "warning for falling off end of non-void function" } */
+
+static int
+foo3 (int i)
+{
+ if (i)
+ return i;
+
+ abort ();
+} /* { dg-bogus "control reaches end of non-void function" "warning for falling off end of non-void function" } */
+
+static __inline__ int
+foo4 (int i)
+{
+ if (i)
+ return i;
+
+ abort ();
+} /* { dg-bogus "control reaches end of non-void function" "warning for falling off end of non-void function" } */
+
+int bar (int i)
+{
+ return foo1 (i) + foo2 (i) + foo3 (i) + foo4 (i);
+}
--- /dev/null
+/* Bogus warnings claiming we fall off the end of a non-void function.
+ By Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 8/27/2000. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wreturn-type" } */
+
+extern void abort (void) __attribute__ ((__noreturn__));
+
+int
+foo1 (int i)
+{
+ if (i)
+ return i;
+
+ abort ();
+} /* { dg-bogus "control reaches end of non-void function" "warning for falling off end of non-void function" } */
+
+__inline__ int
+foo2 (int i)
+{
+ if (i)
+ return i;
+
+ abort ();
+} /* { dg-bogus "control reaches end of non-void function" "warning for falling off end of non-void function" } */
+
+static int
+foo3 (int i)
+{
+ if (i)
+ return i;
+
+ abort ();
+} /* { dg-bogus "control reaches end of non-void function" "warning for falling off end of non-void function" } */
+
+static __inline__ int
+foo4 (int i)
+{
+ if (i)
+ return i;
+
+ abort ();
+} /* { dg-bogus "control reaches end of non-void function" "warning for falling off end of non-void function" } */
+
+int bar (int i)
+{
+ return foo1 (i) + foo2 (i) + foo3 (i) + foo4 (i);
+}
--- /dev/null
+:100000000000E50675820AC39582F506E50775834B
+:10001000009583F507D0E0F50875E0012506F58227
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000002506F58275E0003507F583E508F075C3
+:10004000E0052506F58275E0003507F583E513F038
+:1000500075E0042506F58275E0003507F583E512A5
+:10006000F075E0032506F58275E0003507F583E5B8
+:1000700011F075E0022506F58275E0003507F5837D
+:10008000E510F0750000E51FF5F0E50045F0F5001E
+:10009000E51EF5F0E50045F0F500E51DF5F0E5009D
+:1000A00045F0F500E51CF5F0E50045F0F500E5004C
+:1000B0007002800302015500E510F502E511F50319
+:1000C000E512F504E513F50575E0052506F58275DD
+:1000D000E0003507F583E0F51375E0042506F582A9
+:1000E00075E0003507F583E0F51275E0032506F5A8
+:1000F0008275E0003507F583E0F51175E00225060D
+:10010000F58275E0003507F583E0F51075E0002510
+:1001100006F58275E0003507F583E0F508E508C0CF
+:10012000E075E0012506F58275E0003507F583E00E
+:10013000F508E508C0E075E00A2506F50675E0005B
+:100140003507F507E502F582E503F583E504F500DB
+:10015000E505F5012200E51FF510E51EF511E51D89
+:10016000F512E51CF5130200B800E50675820AC316
+:100170009582F506E5077583009583F507D0E0F5D0
+:100180000875E0012506F58275E0003507F583E581
+:1001900008F0D0E0F50875E0002506F58275E0006E
+:1001A0003507F583E508F075E0052506F58275E06D
+:1001B000003507F583E513F075E0042506F5827533
+:1001C000E0003507F583E512F075E0032506F582BA
+:1001D00075E0003507F583E511F075E0022506F5B9
+:1001E0008275E0003507F583E510F0750000E51F26
+:1001F000F5F0E50045F0F500E51EF5F0E50045F009
+:10020000F500E51DF5F0E50045F0F500E51CF5F01D
+:10021000E50045F0F500E500700280030202BD0034
+:10022000E510F502E511F503E512F504E513F50512
+:1002300075E0052506F58275E0003507F583E0F5E4
+:100240001375E0042506F58275E0003507F583E0B7
+:10025000F51275E0032506F58275E0003507F58394
+:10026000E0F51175E0022506F58275E0003507F529
+:1002700083E0F51075E0002506F58275E00035078E
+:10028000F583E0F508E508C0E075E0012506F58294
+:1002900075E0003507F583E0F508E508C0E075E096
+:1002A0000A2506F50675E0003507F507E502F58233
+:1002B000E503F583E504F500E505F5012200E51FFA
+:1002C000F510E51EF511E51DF512E51CF51302020A
+:1002D0002000E50675820AC39582F506E507758359
+:1002E000009583F507D0E0F50875E0012506F58255
+:1002F00075E0003507F583E508F0D0E0F50875E016
+:10030000002506F58275E0003507F583E508F075F0
+:10031000E0052506F58275E0003507F583E513F065
+:1003200075E0042506F58275E0003507F583E512D2
+:10033000F075E0032506F58275E0003507F583E5E5
+:1003400011F075E0022506F58275E0003507F583AA
+:10035000E510F0750000E51FF5F0E50045F0F5004B
+:10036000E51EF5F0E50045F0F500E51DF5F0E500CA
+:1003700045F0F500E51CF5F0E50045F0F500E50079
+:100380007002800302042500E510F502E511F50373
+:10039000E512F504E513F50575E0052506F582750A
+:1003A000E0003507F583E0F51375E0042506F582D6
+:1003B00075E0003507F583E0F51275E0032506F5D5
+:1003C0008275E0003507F583E0F51175E00225063A
+:1003D000F58275E0003507F583E0F51075E000253E
+:1003E00006F58275E0003507F583E0F508E508C0FD
+:1003F000E075E0012506F58275E0003507F583E03C
+:10040000F508E508C0E075E00A2506F50675E00088
+:100410003507F507E502F582E503F583E504F50008
+:10042000E505F5012200E51FF510E51EF511E51DB6
+:10043000F512E51CF51302038800E50675820AC370
+:100440009582F506E5077583009583F507D0E0F5FD
+:100450000875E0012506F58275E0003507F583E5AE
+:1004600008F0D0E0F50875E0002506F58275E0009B
+:100470003507F583E508F075E0052506F58275E09A
+:10048000003507F583E513F075E0042506F5827560
+:10049000E0003507F583E512F075E0032506F582E7
+:1004A00075E0003507F583E511F075E0022506F5E6
+:1004B0008275E0003507F583E510F0750000E51F53
+:1004C000F5F0E50045F0F500E51EF5F0E50045F036
+:1004D000F500E51DF5F0E50045F0F500E51CF5F04B
+:1004E000E50045F0F500E5007002800302058D008F
+:1004F000E510F502E511F503E512F504E513F50540
+:1005000075E0052506F58275E0003507F583E0F511
+:100510001375E0042506F58275E0003507F583E0E4
+:10052000F51275E0032506F58275E0003507F583C1
+:10053000E0F51175E0022506F58275E0003507F556
+:1005400083E0F51075E0002506F58275E0003507BB
+:10055000F583E0F508E508C0E075E0012506F582C1
+:1005600075E0003507F583E0F508E508C0E075E0C3
+:100570000A2506F50675E0003507F507E502F58260
+:10058000E503F583E504F500E505F5012200E51F27
+:10059000F510E51EF511E51DF512E51CF513020435
+:1005A000F000E506758216C39582F506E5077583AA
+:1005B000009583F507D0E0F50875E0092506F5827A
+:1005C00075E0003507F583E508F0D0E0F50875E043
+:1005D000082506F58275E0003507F583E508F07516
+:1005E000E0112506F58275E0003507F583E517F083
+:1005F00075E0102506F58275E0003507F583E516F0
+:10060000F075E00F2506F58275E0003507F583E506
+:1006100015F075E00E2506F58275E0003507F583C7
+:10062000E514F075E00D2506F58275E0003507F557
+:1006300083E513F075E00C2506F58275E0003507BB
+:10064000F583E512F075E00B2506F58275E00035BF
+:1006500007F583E511F075E00A2506F58275E000DF
+:100660003507F583E510F0E51FF510E51EF511E5FA
+:100670001DF512E51CF513E510F51FE511F51EE556
+:1006800012F51DE513F51C120001E582F502E58364
+:10069000F503E500F504E501F50575E0032506F52C
+:1006A0008275E0003507F583E502F075E002250666
+:1006B000F58275E0003507F583E503F075E0012567
+:1006C00006F58275E0003507F583E504F075E00076
+:1006D0002506F58275E0003507F583E505F0E510A0
+:1006E000F51FE511F51EE512F51DE513F51C1201C8
+:1006F00069E582F502E583F503E500F504E501F51A
+:100700000575E0072506F58275E0003507F583E5F8
+:1007100002F075E0062506F58275E0003507F583E1
+:10072000E503F075E0052506F58275E0003507F56F
+:1007300083E504F075E0042506F58275E0003507D1
+:10074000F583E505F0E510F51FE511F51EE512F559
+:100750001DE513F51C1202D1E582F502E583F503D0
+:10076000E500F504E501F505E502F514E503F515E9
+:10077000E504F516E505F517E510F51FE511F51E7D
+:10078000E512F51DE513F51C120439E582F502E5C5
+:1007900083F503E500F504E501F505E502F500E55F
+:1007A00003F501E504F509E505F50AC3750B0075C8
+:1007B000E0072506F58275E0003507F583E0F508CA
+:1007C000E508F5F075E0032506F58275E0003507CC
+:1007D000F583E0F508E50835F0F50C75E00625062B
+:1007E000F58275E0003507F583E0F508E508F5F0DA
+:1007F00075E0022506F58275E0003507F583E0F522
+:1008000008E50835F0F50B75E0052506F58275E07D
+:10081000003507F583E0F508E508F5F075E00125FA
+:1008200006F58275E0003507F583E0F508E5083543
+:10083000F0F50D75E0042506F58275E0003507F545
+:1008400083E0F508E508F5F075E0002506F582750A
+:10085000E0003507F583E0F508E50835F0F50FC34E
+:10086000750E00E514F5F0E50C35F0F50CE515F521
+:10087000F0E50B35F0F50BE516F5F0E50D35F0F587
+:100880000DE517F5F0E50F35F0F50FC3750E00E532
+:1008900000F5F0E50C35F0F500E501F5F0E50B3578
+:1008A000F0F501E509F5F0E50D35F0F509E50AF596
+:1008B000F0E50F35F0F50AE500F502E501F503E591
+:1008C00009F504E50AF50575E0112506F58275E0E0
+:1008D000003507F583E0F51775E0102506F58275FC
+:1008E000E0003507F583E0F51675E00F2506F58283
+:1008F00075E0003507F583E0F51575E00E2506F582
+:100900008275E0003507F583E0F51475E00D2506E6
+:10091000F58275E0003507F583E0F51375E00C25E9
+:1009200006F58275E0003507F583E0F51275E00BFA
+:100930002506F58275E0003507F583E0F51175E0D1
+:100940000A2506F58275E0003507F583E0F5107598
+:10095000E0082506F58275E0003507F583E0F50827
+:10096000E508C0E075E0092506F58275E000350769
+:10097000F583E0F508E508C0E075E0162506F50604
+:1009800075E0003507F507E502F582E503F583E537
+:1009900004F500E505F5012200000000000000005C
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR optimization/7189
+ This was a missing warning caused by a cfg cleanup after sibling
+ call optimization. The return clobber insn was cleaned up and
+ the warning was never issued. */
+/* { dg-do compile } */
+/* { dg-options "-O -foptimize-sibling-calls -Wreturn-type" } */
+
+extern void foo(void);
+
+int
+bar (void)
+{
+ foo();
+} /* { dg-warning "control reaches end of non-void function" "warning for falling off end of non-void function" } */
--- /dev/null
+/* PR optimization/7189
+ This was a missing warning caused by a cfg cleanup after sibling
+ call optimization. The return clobber insn was cleaned up and
+ the warning was never issued. */
+/* { dg-do compile } */
+/* { dg-options "-O -foptimize-sibling-calls -Wreturn-type" } */
+
+extern void foo(void);
+
+int
+bar (void)
+{
+ foo();
+} /* { dg-warning "control reaches end of non-void function" "warning for falling off end of non-void function" } */
--- /dev/null
+:100000000000E506758203C39582F506E507758352
+:10001000009583F507D0E0F50875E0022506F58226
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000012506F58275E0003507F583E508F075C2
+:10004000E0002506F58275E0003507F583E0F5024E
+:1000500075E0002506F58275E0003507F583E0F5CB
+:100060000375E0002506F58275E0003507F583E0AD
+:10007000F50475E0002506F58275E0003507F58387
+:10008000E0F50575E0012506F58275E0003507F518
+:1000900083E0F508E508C0E075E0022506F5827505
+:1000A000E0003507F583E0F508E508C0E075E003FA
+:1000B0002506F50675E0003507F507E502F582E54A
+:1000C00003F583E504F500E505F5012200000000D5
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR optimization/6871 */
+/* Constant variables belong in .rodata, not .bss. */
+/* { dg-final { scan-assembler-not "\.bss" } } */
+
+const int i = 0;
--- /dev/null
+/* PR optimization/6871 */
+/* Constant variables belong in .rodata, not .bss. */
+/* { dg-final { scan-assembler-not "\.bss" } } */
+
+const int i = 0;
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+/* Origin: Aldy Hernandez <aldyh@redhat.com>. */
+/* Purpose: Program to test generic SIMD support. */
+
+typedef int __attribute__((vector_size (16))) v4si;
+typedef int __attribute__((vector_size (8))) v2si;
+
+v4si a, b;
+v2si c, d;
+
+void
+hanneke ()
+{
+ /* Operators on compatible SIMD types. */
+ a %= b; /* { dg-error "invalid operands to binary %" } */
+ c &= d;
+ a |= b;
+ c ^= d;
+ a >>= b; /* { dg-error "invalid operands to binary >>" } */
+ c <<= d; /* { dg-error "invalid operands to binary <<" } */
+ a = +b;
+ c = ~d;
+
+ /* Operators on incompatible SIMD types. */
+ a = b % c; /* { dg-error "invalid operands to binary" } */
+ a = b % c; /* { dg-error "invalid operands to binary" } */
+ d = c & b; /* { dg-error "invalid operands to binary" } */
+ a = b | c; /* { dg-error "invalid operands to binary" } */
+ d = c ^ b; /* { dg-error "invalid operands to binary" } */
+ a = b >> c; /* { dg-error "invalid operands to binary" } */
+ a = b >> c; /* { dg-error "invalid operands to binary" } */
+ d = c << b; /* { dg-error "invalid operands to binary" } */
+ d = c << b; /* { dg-error "invalid operands to binary" } */
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+/* Origin: Aldy Hernandez <aldyh@redhat.com>. */
+/* Purpose: Program to test generic SIMD support. */
+
+typedef int __attribute__((vector_size (16))) v4si;
+typedef int __attribute__((vector_size (8))) v2si;
+
+v4si a, b;
+v2si c, d;
+
+void
+hanneke ()
+{
+ /* Operators on compatible SIMD types. */
+ a %= b; /* { dg-error "invalid operands to binary %" } */
+ c &= d;
+ a |= b;
+ c ^= d;
+ a >>= b; /* { dg-error "invalid operands to binary >>" } */
+ c <<= d; /* { dg-error "invalid operands to binary <<" } */
+ a = +b;
+ c = ~d;
+
+ /* Operators on incompatible SIMD types. */
+ a = b % c; /* { dg-error "invalid operands to binary" } */
+ a = b % c; /* { dg-error "invalid operands to binary" } */
+ d = c & b; /* { dg-error "invalid operands to binary" } */
+ a = b | c; /* { dg-error "invalid operands to binary" } */
+ d = c ^ b; /* { dg-error "invalid operands to binary" } */
+ a = b >> c; /* { dg-error "invalid operands to binary" } */
+ a = b >> c; /* { dg-error "invalid operands to binary" } */
+ d = c << b; /* { dg-error "invalid operands to binary" } */
+ d = c << b; /* { dg-error "invalid operands to binary" } */
+}
--- /dev/null
+:1000000000E506758212C39582F506E50775830043
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F075E0E3
+:10004000092506F58275E0003507F583E517F0759B
+:10005000E0082506F58275E0003507F583E516F022
+:1000600075E0072506F58275E0003507F583E5158F
+:10007000F075E0062506F58275E0003507F583E5A5
+:1000800014F075E0052506F58275E0003507F58367
+:10009000E513F075E0042506F58275E0003507F5F7
+:1000A00083E512F075E0032506F58275E00035075B
+:1000B000F583E511F075E0022506F58275E000355F
+:1000C00007F583E510F0E51FF500E51EF501E51DD8
+:1000D000F509E51CF50AE51AF515E519F513750F8F
+:1000E00000751000751100751200E500F516E501A8
+:1000F000F514E509F50DE50AF50E750C0075170008
+:10010000751900751A00750B00750A01750001C399
+:10011000E518F5F0E50E95F0F509E50BF5F0E50BC2
+:1001200035F0F509E509F5F0E50055F0F500E500D5
+:10013000F5F0E50C45F0F50C750001C3E518F5F098
+:10014000E50E95F0F509E50BF5F0E50B35F0F50951
+:10015000E50EF5F0E51895F0F501E50BF5F0E50B8A
+:1001600035F0F501E501F5F0E50945F0F509E50A99
+:10017000F5F0E50965F0F509E509F5F0E50055F05C
+:10018000F500C3E513F5F0E50D95F0F509E50BF580
+:10019000F0E50B35F0F509E509F5F0E50055F0F56A
+:1001A00000E500F5F0E50C45F0F50C750001C3E540
+:1001B00018F5F0E50E95F0F509E50BF5F0E50B35D2
+:1001C000F0F509E50EF5F0E51895F0F501E50BF50C
+:1001D000F0E50B35F0F501E501F5F0E50945F0F541
+:1001E00009E50AF5F0E50965F0F509E509F5F0E539
+:1001F0000055F0F500C3E513F5F0E50D95F0F509B0
+:10020000E50BF5F0E50B35F0F509E50DF5F0E51337
+:1002100095F0F501E50BF5F0E50B35F0F501E5019D
+:10022000F5F0E50945F0F509E50AF5F0E50965F0B1
+:10023000F509E509F5F0E50055F0F500C3E515F51C
+:10024000F0E51495F0F509E50BF5F0E50B35F0F563
+:1002500009E509F5F0E50055F0F500E500F5F0E5F4
+:100260000C45F0F50C750001C3E518F5F0E50E95A9
+:10027000F0F509E50BF5F0E50B35F0F509E50EF5C0
+:10028000F0E51895F0F501E50BF5F0E50B35F0F527
+:1002900001E501F5F0E50945F0F509E50AF5F0E5B8
+:1002A0000965F0F509E509F5F0E50055F0F500C33D
+:1002B000E513F5F0E50D95F0F509E50BF5F0E50B27
+:1002C00035F0F509E50DF5F0E51395F0F501E50BD1
+:1002D000F5F0E50B35F0F501E501F5F0E50945F040
+:1002E000F509E50AF5F0E50965F0F509E509F5F028
+:1002F000E50055F0F500C3E515F5F0E51495F0F5CA
+:1003000009E50BF5F0E50B35F0F509E514F5F0E539
+:100310001595F0F501E50BF5F0E50B35F0F501E588
+:1003200001F5F0E50945F0F509E50AF5F0E509659F
+:10033000F0F509E509F5F0E50055F0F500C3E51B1A
+:10034000F5F0E51695F0F509E50BF5F0E50B35F060
+:10035000F509E509F5F0E50055F0F500E500F5F0E3
+:10036000E50C45F0F50CE517F500E519F501E51A82
+:10037000F509E50CF50B750C01C3750A00E50BF5E5
+:10038000F0E50A95F0F50A750A00E50AF5F0E50AC8
+:1003900035F0F50AE50AF5F0E50C65F0F50CC375E6
+:1003A0000A00E500F5F0E50A95F0F50A750A00E5A2
+:1003B0000AF5F0E50A35F0F50AE50AF5F0E50C6511
+:1003C000F0F50CC3750A00E501F5F0E50A95F0F5C6
+:1003D0000A750A00E50AF5F0E50A35F0F50AE50ABE
+:1003E000F5F0E50C65F0F50CC3750A00E509F5F0CC
+:1003F000E50A95F0F50A750A00E50AF5F0E50A3513
+:10040000F0F50AE50AF5F0E50C65F0F50C7500006D
+:10041000750100750900E500F50BE501F50A7501A8
+:1004200001C3750000E50CF5F0E50095F0F50075E9
+:100430000000E500F5F0E50035F0F500E500F5F029
+:10044000E50165F0F501C3750000E50BF5F0E50089
+:1004500095F0F500750000E500F5F0E50035F0F5E4
+:1004600000E500F5F0E50165F0F501C3750000E574
+:100470000AF5F0E50095F0F500750000E500F5F0EF
+:10048000E50035F0F500E500F5F0E50165F0F50172
+:10049000C3750000E509F5F0E50095F0F50075007D
+:1004A00000E500F5F0E50035F0F500E500F5F0E5D4
+:1004B0000165F0F501750900750A00750B007500FE
+:1004C00000E501F5F0E50045F0F500E509F5F0E59A
+:1004D0000045F0F500E50AF5F0E50045F0F500E52A
+:1004E0000BF5F0E50045F0F500E500700280030231
+:1004F000055700750001750100750900750A00C3F4
+:10050000750B00E500F5F0E50F35F0F50FE501F5A9
+:10051000F0E51035F0F510E509F5F0E51135F0F5E9
+:1005200011E50AF5F0E51235F0F512C3E51BF5F01B
+:10053000E51695F0F516E515F5F0E51495F0F514CA
+:10054000E513F5F0E50D95F0F50DE518F5F0E50E80
+:1005500095F0F50E0200FA00E50FF502E510F5033F
+:10056000E511F504E512F50575E0092506F5827536
+:10057000E0003507F583E0F51775E0082506F582FC
+:1005800075E0003507F583E0F51675E0072506F5FB
+:100590008275E0003507F583E0F51575E006250660
+:1005A000F58275E0003507F583E0F51475E0052563
+:1005B00006F58275E0003507F583E0F51375E00474
+:1005C0002506F58275E0003507F583E0F51275E044
+:1005D000032506F58275E0003507F583E0F5117512
+:1005E000E0022506F58275E0003507F583E0F51099
+:1005F00075E0002506F58275E0003507F583E0F526
+:1006000008E508C0E075E0012506F58275E00035D3
+:1006100007F583E0F508E508C0E075E0122506F56A
+:100620000675E0003507F507E502F582E503F58379
+:10063000E504F500E505F5012200E506758217C31E
+:100640009582F506E5077583009583F507D0E0F5FB
+:100650000875E0062506F58275E0003507F583E5A7
+:1006600008F0D0E0F50875E0052506F58275E00094
+:100670003507F583E508F075E00E2506F58275E08F
+:10068000003507F583E517F075E00D2506F5827551
+:10069000E0003507F583E516F075E00C2506F582D8
+:1006A00075E0003507F583E515F075E00B2506F5D7
+:1006B0008275E0003507F583E514F075E00A25063C
+:1006C000F58275E0003507F583E513F075E009253F
+:1006D00006F58275E0003507F583E512F075E00850
+:1006E0002506F58275E0003507F583E511F075E024
+:1006F000072506F58275E0003507F583E510F0E57E
+:100700001FF511E51BF512E51AF513E519F514753A
+:10071000E0042506F58275E0003507F583E511F064
+:1007200075E0032506F58275E0003507F583E51EC3
+:10073000F075E0022506F58275E0003507F583E5E2
+:100740001DF075E0012506F58275E0003507F5839B
+:10075000E51CF07515017516007517007508007514
+:10076000E0002506F58275E0003507F583E508F021
+:10077000751900750D00750E00750F00E51CF5105C
+:10078000750080E500F5F0E51025F0F510E500F5C1
+:10079000F0E50F25F0F50F750C00751A00751B00BC
+:1007A000751F00750B00750A01750001C3E50FF593
+:1007B000F0E51095F0F509E50BF5F0E50B35F0F5F2
+:1007C00009E509F5F0E50055F0F500E500F5F0E57F
+:1007D0000C45F0F50C750001C3E50FF5F0E510953B
+:1007E000F0F509E50BF5F0E50B35F0F509E510F549
+:1007F000F0E50F95F0F501E50BF5F0E50B35F0F5BB
+:1008000001E501F5F0E50945F0F509E50AF5F0E542
+:100810000965F0F509E509F5F0E50055F0F500C3C7
+:10082000E50EF5F0E51D95F0F509E50BF5F0E50BA6
+:1008300035F0F509E509F5F0E50055F0F500E500BE
+:10084000F5F0E50C45F0F50C750001C3E50FF5F08A
+:10085000E51095F0F509E50BF5F0E50B35F0F50938
+:10086000E510F5F0E50F95F0F501E50BF5F0E50B7A
+:1008700035F0F501E501F5F0E50945F0F509E50A82
+:10088000F5F0E50965F0F509E509F5F0E50055F045
+:10089000F500C3E50EF5F0E51D95F0F509E50BF55E
+:1008A000F0E50B35F0F509E51DF5F0E50E95F0F5F1
+:1008B00001E50BF5F0E50B35F0F501E501F5F0E5A7
+:1008C0000945F0F509E50AF5F0E50965F0F509E5F2
+:1008D00009F5F0E50055F0F500C3E50DF5F0E51E6E
+:1008E00095F0F509E50BF5F0E50B35F0F509E509AF
+:1008F000F5F0E50055F0F500E500F5F0E50C45F004
+:10090000F50C750001C3E50FF5F0E51095F0F5095C
+:10091000E50BF5F0E50B35F0F509E510F5F0E50F21
+:1009200095F0F501E50BF5F0E50B35F0F501E50186
+:10093000F5F0E50945F0F509E50AF5F0E50965F09A
+:10094000F509E509F5F0E50055F0F500C3E50EF50C
+:10095000F0E51D95F0F509E50BF5F0E50B35F0F543
+:1009600009E51DF5F0E50E95F0F501E50BF5F0E56F
+:100970000B35F0F501E501F5F0E50945F0F509E580
+:100980000AF5F0E50965F0F509E509F5F0E500552A
+:10099000F0F500C3E50DF5F0E51E95F0F509E50B62
+:1009A000F5F0E50B35F0F509E51EF5F0E50D95F0F0
+:1009B000F501E50BF5F0E50B35F0F501E501F5F096
+:1009C000E50945F0F509E50AF5F0E50965F0F509F1
+:1009D000E509F5F0E50055F0F500C3E519F5F0E59A
+:1009E0001195F0F509E50BF5F0E50B35F0F509E5A6
+:1009F00009F5F0E50055F0F500E500F5F0E50C45EA
+:100A0000F0F50CE51AF501E51BF509E51FF50A758A
+:100A10000000E50CF5F0E50045F0F500E501F5F026
+:100A2000E50045F0F500E509F5F0E50045F0F500D5
+:100A3000E50AF5F0E50045F0F500E50070028003F9
+:100A400002116B00751900750D00750E00750F0011
+:100A5000E512F51BE513F51AE514F510E518F51187
+:100A6000750080E500F5F0E51125F0F511E500F5DC
+:100A7000F0E50F25F0F50F750C00751C00751D00D5
+:100A8000751E00750B00750A01750001C3E50FF5B1
+:100A9000F0E51195F0F509E50BF5F0E50B35F0F50E
+:100AA00009E509F5F0E50055F0F500E500F5F0E59C
+:100AB0000C45F0F50C750001C3E50FF5F0E5119557
+:100AC000F0F509E50BF5F0E50B35F0F509E511F565
+:100AD000F0E50F95F0F501E50BF5F0E50B35F0F5D8
+:100AE00001E501F5F0E50945F0F509E50AF5F0E560
+:100AF0000965F0F509E509F5F0E50055F0F500C3E5
+:100B0000E50EF5F0E51095F0F509E50BF5F0E50BD0
+:100B100035F0F509E509F5F0E50055F0F500E500DB
+:100B2000F5F0E50C45F0F50C750001C3E50FF5F0A7
+:100B3000E51195F0F509E50BF5F0E50B35F0F50954
+:100B4000E511F5F0E50F95F0F501E50BF5F0E50B96
+:100B500035F0F501E501F5F0E50945F0F509E50A9F
+:100B6000F5F0E50965F0F509E509F5F0E50055F062
+:100B7000F500C3E50EF5F0E51095F0F509E50BF588
+:100B8000F0E50B35F0F509E510F5F0E50E95F0F51B
+:100B900001E50BF5F0E50B35F0F501E501F5F0E5C4
+:100BA0000945F0F509E50AF5F0E50965F0F509E50F
+:100BB00009F5F0E50055F0F500C3E50DF5F0E51A8F
+:100BC00095F0F509E50BF5F0E50B35F0F509E509CC
+:100BD000F5F0E50055F0F500E500F5F0E50C45F021
+:100BE000F50C750001C3E50FF5F0E51195F0F50979
+:100BF000E50BF5F0E50B35F0F509E511F5F0E50F3E
+:100C000095F0F501E50BF5F0E50B35F0F501E501A3
+:100C1000F5F0E50945F0F509E50AF5F0E50965F0B7
+:100C2000F509E509F5F0E50055F0F500C3E50EF529
+:100C3000F0E51095F0F509E50BF5F0E50B35F0F56D
+:100C400009E510F5F0E50E95F0F501E50BF5F0E599
+:100C50000B35F0F501E501F5F0E50945F0F509E59D
+:100C60000AF5F0E50965F0F509E509F5F0E5005547
+:100C7000F0F500C3E50DF5F0E51A95F0F509E50B83
+:100C8000F5F0E50B35F0F509E51AF5F0E50D95F011
+:100C9000F501E50BF5F0E50B35F0F501E501F5F0B3
+:100CA000E50945F0F509E50AF5F0E50965F0F5090E
+:100CB000E509F5F0E50055F0F500C3E519F5F0E5B7
+:100CC0001B95F0F509E50BF5F0E50B35F0F509E5B9
+:100CD00009F5F0E50055F0F500E500F5F0E50C4507
+:100CE000F0F50CE51CF501E51DF509E51EF50A75A5
+:100CF0000000E50CF5F0E50045F0F500E501F5F044
+:100D0000E50045F0F500E509F5F0E50045F0F500F2
+:100D1000E50AF5F0E50045F0F500E5007002800316
+:100D20000210A30075E0042506F58275E000350782
+:100D3000F583E0F51F75E0032506F58275E00035C3
+:100D400007F583E0F51E75E0022506F58275E000E3
+:100D50003507F583E0F51D75E0012506F58275E0A0
+:100D6000003507F583E0F51CE512F51BE513F51AD0
+:100D7000E514F519120000E582F502E583F503E5B7
+:100D800000F504E501F505E502F511E503F512E5C9
+:100D900004F513E505F514E515F500E516F515E57B
+:100DA00017F51675E0002506F58275E0003507F5A4
+:100DB00083E0F517750D00750E00750F00751000B6
+:100DC000C3750100E500F5F0E511A4F50CE500F5AB
+:100DD000F0E511A4E5F0F509E50CF5F0E50135F0D5
+:100DE000F501E515F5F0E511A4F50CE515F5F0E5CF
+:100DF00011A4E5F0F50AE50CF5F0E50935F0F50983
+:100E0000E516F5F0E511A4F50CE516F5F0E511A4ED
+:100E1000E5F0F50BE50CF5F0E50A35F0F50AE51718
+:100E2000F5F0E511A4F50CE517F5F0E511A4E5F0F2
+:100E3000F511E50CF5F0E50B35F0F50BC3C3750CBA
+:100E400000E501F5F0E50D35F0F50DE509F5F0E506
+:100E50000E35F0F50EE50AF5F0E50F35F0F50FE586
+:100E60000BF5F0E51035F0F510C3750900E500F558
+:100E7000F0E512A4F50CE500F5F0E512A4E5F0F5B7
+:100E80000AE50CF5F0E50935F0F509E515F5F0E5AD
+:100E900012A4F50CE515F5F0E512A4E5F0F50BE567
+:100EA0000CF5F0E50A35F0F50AE516F5F0E512A4C3
+:100EB000F50CE516F5F0E512A4E5F0F511E50CF5F5
+:100EC000F0E50B35F0F50B750100C3C3750C00E5BB
+:100ED00001F5F0E50D35F0F50DE509F5F0E50E3518
+:100EE000F0F50EE50AF5F0E50F35F0F50FE50BF539
+:100EF000F0E51035F0F510C3750A00E500F5F0E5F2
+:100F000013A4F50CE500F5F0E513A4E5F0F50BE509
+:100F10000CF5F0E50A35F0F50AE515F5F0E513A452
+:100F2000F50CE515F5F0E513A4E5F0F511E50CF584
+:100F3000F0E50B35F0F50B750100750900C3C375BD
+:100F40000C00E501F5F0E50D35F0F50DE509F5F0DE
+:100F5000E50E35F0F50EE50AF5F0E50F35F0F50F85
+:100F6000E50BF5F0E51035F0F510C3750B00E50065
+:100F7000F5F0E514A4F50CE500F5F0E514A4E5F0B2
+:100F8000F511E50CF5F0E50B35F0F50B7501007585
+:100F90000900750A00C3C3750000E501F5F0E50D11
+:100FA00035F0F50DE509F5F0E50E35F0F50EE50A3D
+:100FB000F5F0E50F35F0F50FE50BF5F0E51035F040
+:100FC000F510E50DF502E50EF503E50FF504E51066
+:100FD000F50575E00E2506F58275E0003507F58309
+:100FE000E0F51775E00D2506F58275E0003507F58B
+:100FF00083E0F51675E00C2506F58275E0003507EF
+:10100000F583E0F51575E00B2506F58275E00035F2
+:1010100007F583E0F51475E00A2506F58275E00012
+:101020003507F583E0F51375E0092506F58275E0CF
+:10103000003507F583E0F51275E0082506F58275A1
+:10104000E0003507F583E0F51175E0072506F58228
+:1010500075E0003507F583E0F51075E0052506F528
+:101060008275E0003507F583E0F508E508C0E07516
+:10107000E0062506F58275E0003507F583E0F50802
+:10108000E508C0E075E0172506F50675E0003507B0
+:10109000F507E502F582E503F583E504F500E505CE
+:1010A000F5012200E512F4F512E513F4F513E51449
+:1010B000F4F514E518F4F518D3750000E500F5F023
+:1010C000E51235F0F512E500F5F0E51335F0F5130E
+:1010D000E500F5F0E51435F0F514E500F5F0E51858
+:1010E00035F0F518E515F4F515E516F4F516E517E0
+:1010F000F4F51775E0002506F58275E0003507F573
+:1011000083E0F508E508F4F50875E0002506F582AA
+:1011100075E0003507F583E508F0D3750000E500BC
+:10112000F5F0E51535F0F515E500F5F0E51635F0C7
+:10113000F516E500F5F0E51735F0F517E500F5F0E3
+:1011400075E0002506F58275E0003507F583E0F5CA
+:1011500008E50835F0F50875E0002506F58275E02C
+:10116000003507F583E508F0020D2400E511F4F5DC
+:1011700000E51EF4F501E51DF4F509E51CF4F50B99
+:10118000D3750A00E50AF5F0E50035F0F500E50A4B
+:10119000F5F0E50135F0F501E50AF5F0E50935F082
+:1011A000F509E50AF5F0E50B35F0F50B75E00425DA
+:1011B00006F58275E0003507F583E500F075E0037C
+:1011C0002506F58275E0003507F583E501F075E049
+:1011D000022506F58275E0003507F583E509F0750F
+:1011E000E0012506F58275E0003507F583E50BF093
+:1011F000E515F4F515E516F4F516E517F4F517758C
+:10120000E0002506F58275E0003507F583E0F50876
+:10121000E508F4F50875E0002506F58275E000356F
+:1012200007F583E508F0D3750000E500F5F0E51556
+:1012300035F0F515E500F5F0E51635F0F516E500A5
+:10124000F5F0E51735F0F517E500F5F075E0002548
+:1012500006F58275E0003507F583E0F508E5083509
+:10126000F0F50875E0002506F58275E0003507F514
+:1012700083E508F0020A4400E506758216C39582EC
+:10128000F506E5077583009583F507D0E0F5087549
+:10129000E0052506F58275E0003507F583E508F0E1
+:1012A000D0E0F50875E0042506F58275E000350705
+:1012B000F583E508F075E00D2506F58275E000354B
+:1012C00007F583E517F075E00C2506F58275E0005B
+:1012D0003507F583E516F075E00B2506F58275E018
+:1012E000003507F583E515F075E00A2506F58275EA
+:1012F000E0003507F583E514F075E0092506F58271
+:1013000075E0003507F583E513F075E0082506F56F
+:101310008275E0003507F583E512F075E0072506D4
+:10132000F58275E0003507F583E511F075E00625D7
+:1013300006F58275E0003507F583E510F075E003EA
+:101340002506F58275E0003507F583E51FF075E0A9
+:10135000022506F58275E0003507F583E51EF07578
+:10136000E0012506F58275E0003507F583E51DF0FF
+:1013700075E0002506F58275E0003507F583E51C6C
+:10138000F0E51BF514E51AF515E519F516E518F560
+:101390001775E0032506F58275E0003507F583E053
+:1013A000F51F75E0022506F58275E0003507F58327
+:1013B000E0F51E75E0012506F58275E0003507F5BC
+:1013C00083E0F51D75E0002506F58275E000350720
+:1013D000F583E0F51CE514F51BE515F51AE516F5A2
+:1013E00019E517F518120639E582F502E583F503CC
+:1013F000E500F504E501F505E502F500E503F50175
+:10140000E504F509E505F50A75100075110075127A
+:1014100000751300C3750B00E500F5F0E514A4F5A5
+:101420000FE500F5F0E514A4E5F0F50CE50FF5F097
+:10143000E50B35F0F50BE501F5F0E514A4F50FE546
+:1014400001F5F0E514A4E5F0F50DE50FF5F0E50C78
+:1014500035F0F50CE509F5F0E514A4F50FE509F50F
+:10146000F0E514A4E5F0F50EE50FF5F0E50D35F027
+:10147000F50DE50AF5F0E514A4F50FE50AF5F0E53C
+:1014800014A4E5F0F50AE50FF5F0E50E35F0F50EDC
+:10149000C3C3750A00E50BF5F0E51035F0F510E56E
+:1014A0000CF5F0E51135F0F511E50DF5F0E5123527
+:1014B000F0F512E50EF5F0E51335F0F513C3750CF4
+:1014C00000E500F5F0E515A4F50FE500F5F0E515EC
+:1014D000A4E5F0F50DE50FF5F0E50C35F0F50CE5BC
+:1014E00001F5F0E515A4F50FE501F5F0E515A4E526
+:1014F000F0F50EE50FF5F0E50D35F0F50DE509F524
+:10150000F0E515A4F50FE509F5F0E515A4E5F0F50E
+:101510000AE50FF5F0E50E35F0F50E750B00C3C3C7
+:10152000750900E50BF5F0E51035F0F510E50CF563
+:10153000F0E51135F0F511E50DF5F0E51235F0F5B2
+:1015400012E50EF5F0E51335F0F513C3750D00E562
+:1015500000F5F0E516A4F50FE500F5F0E516A4E5B5
+:10156000F0F50EE50FF5F0E50D35F0F50DE501F5BB
+:10157000F0E516A4F50FE501F5F0E516A4E5F0F5A4
+:101580000AE50FF5F0E50E35F0F50E750B00750C5C
+:1015900000C3C3750100E50BF5F0E51035F0F5105B
+:1015A000E50CF5F0E51135F0F511E50DF5F0E51276
+:1015B00035F0F512E50EF5F0E51335F0F513C375CA
+:1015C0000E00E500F5F0E517A4F50FE500F5F0E5F0
+:1015D00017A4E5F0F50AE50FF5F0E50E35F0F50E88
+:1015E000750B00750C00750D00C3C3750000E50B8D
+:1015F000F5F0E51035F0F510E50CF5F0E51135F0F6
+:10160000F511E50DF5F0E51235F0F512E50EF5F002
+:10161000E51335F0F513C3E510F5F075E003250685
+:10162000F58275E0003507F583E0F508E50895F0EB
+:10163000F500E511F5F075E0022506F58275E0008C
+:101640003507F583E0F508E50895F0F501E512F5B5
+:10165000F075E0012506F58275E0003507F583E0B9
+:10166000F508E50895F0F509E513F5F075E00025B6
+:1016700006F58275E0003507F583E0F508E5089585
+:10168000F0F50AE500F502E501F503E509F504E5E5
+:101690000AF50575E00D2506F58275E0003507F5BC
+:1016A00083E0F51775E00C2506F58275E000350737
+:1016B000F583E0F51675E00B2506F58275E000353B
+:1016C00007F583E0F51575E00A2506F58275E0005B
+:1016D0003507F583E0F51475E0092506F58275E018
+:1016E000003507F583E0F51375E0082506F58275EA
+:1016F000E0003507F583E0F51275E0072506F58271
+:1017000075E0003507F583E0F51175E0062506F56F
+:101710008275E0003507F583E0F51075E0042506D5
+:10172000F58275E0003507F583E0F508E508C0E0CF
+:1017300075E0052506F58275E0003507F583E0F5CF
+:1017400008E508C0E075E0162506F50675E00035E9
+:1017500007F507E502F582E503F583E504F500E505
+:1017600005F5012200E506758212C39582F506E5AE
+:10177000077583009583F507D0E0F50875E001252E
+:1017800006F58275E0003507F583E508F0D0E0F551
+:101790000875E0002506F58275E0003507F583E55C
+:1017A00008F075E0092506F58275E0003507F58338
+:1017B000E517F075E0082506F58275E0003507F5B8
+:1017C00083E516F075E0072506F58275E00035071C
+:1017D000F583E515F075E0062506F58275E0003520
+:1017E00007F583E514F075E0052506F58275E00040
+:1017F0003507F583E513F075E0042506F58275E0FD
+:10180000003507F583E512F075E0032506F58275CE
+:10181000E0003507F583E511F075E0022506F58255
+:1018200075E0003507F583E510F0E51FF500E51ECE
+:10183000F501E51DF509E51CF50AE51BF51EE519A1
+:10184000F516E518F51FE500F50FE501F510E509BA
+:10185000F511E50AF5127519007515007513007577
+:101860001D00E51DF50EE51FF50D750080E500F581
+:10187000F0E50E25F0F50EE500F5F0E50D25F0F5A7
+:101880000D750C00751400751700751800750B00A8
+:10189000750A01750001C3E50DF5F0E50E95F0F54B
+:1018A00009E50BF5F0E50B35F0F509E509F5F0E58F
+:1018B0000055F0F500E500F5F0E50C45F0F50C7588
+:1018C0000001C3E50DF5F0E50E95F0F509E50BF522
+:1018D000F0E50B35F0F509E50EF5F0E50D95F0F5C1
+:1018E00001E50BF5F0E50B35F0F501E501F5F0E567
+:1018F0000945F0F509E50AF5F0E50965F0F509E5B2
+:1019000009F5F0E50055F0F500C3E516F5F0E5132F
+:1019100095F0F509E50BF5F0E50B35F0F509E5096E
+:10192000F5F0E50055F0F500E500F5F0E50C45F0C3
+:10193000F50C750001C3E50DF5F0E50E95F0F50920
+:10194000E50BF5F0E50B35F0F509E50EF5F0E50DE5
+:1019500095F0F501E50BF5F0E50B35F0F501E50146
+:10196000F5F0E50945F0F509E50AF5F0E50965F05A
+:10197000F509E509F5F0E50055F0F500C3E516F5C4
+:10198000F0E51395F0F509E50BF5F0E50B35F0F50D
+:1019900009E513F5F0E51695F0F501E50BF5F0E531
+:1019A0000B35F0F501E501F5F0E50945F0F509E540
+:1019B0000AF5F0E50965F0F509E509F5F0E50055EA
+:1019C000F0F500C3E51AF5F0E51595F0F509E50B1E
+:1019D000F5F0E50B35F0F509E509F5F0E50055F012
+:1019E000F500E500F5F0E50C45F0F50C750001C3D8
+:1019F000E50DF5F0E50E95F0F509E50BF5F0E50BD5
+:101A000035F0F509E50EF5F0E50D95F0F501E50B7E
+:101A1000F5F0E50B35F0F501E501F5F0E50945F0E8
+:101A2000F509E50AF5F0E50965F0F509E509F5F0D0
+:101A3000E50055F0F500C3E516F5F0E51395F0F572
+:101A400009E50BF5F0E50B35F0F509E513F5F0E5E3
+:101A50001695F0F501E50BF5F0E50B35F0F501E530
+:101A600001F5F0E50945F0F509E50AF5F0E5096548
+:101A7000F0F509E509F5F0E50055F0F500C3E51AC4
+:101A8000F5F0E51595F0F509E50BF5F0E50B35F00A
+:101A9000F509E515F5F0E51A95F0F501E50BF5F01A
+:101AA000E50B35F0F501E501F5F0E50945F0F5093F
+:101AB000E50AF5F0E50965F0F509E509F5F0E50059
+:101AC00055F0F500C3E51EF5F0E51995F0F509E5CB
+:101AD0000BF5F0E50B35F0F509E509F5F0E50055F6
+:101AE000F0F500E500F5F0E50C45F0F50CE50CF53A
+:101AF0000AE514F500E517F501E518F509E50AF51D
+:101B00000C750B01C3750A00E50CF5F0E50A95F0BC
+:101B1000F50A750A00E50AF5F0E50A35F0F50AE57B
+:101B20000AF5F0E50B65F0F50BC3750A00E500F565
+:101B3000F0E50A95F0F50A750A00E50AF5F0E50A00
+:101B400035F0F50AE50AF5F0E50B65F0F50BC37520
+:101B50000A00E501F5F0E50A95F0F50A750A00E5D9
+:101B60000AF5F0E50A35F0F50AE50AF5F0E50B654A
+:101B7000F0F50BC3750A00E509F5F0E50A95F0F5F7
+:101B80000A750A00E50AF5F0E50A35F0F50AE50AF6
+:101B9000F5F0E50B65F0F50B750100750900750AA8
+:101BA00000750000E50BF5F0E50045F0F500E501F6
+:101BB000F5F0E50045F0F500E509F5F0E50045F044
+:101BC000F500E50AF5F0E50045F0F500E5007002E6
+:101BD0008003021E3B00750D02750E00751700751F
+:101BE0001B00E50FF500E510F514E511F518E512F9
+:101BF000F51C750F00751000751100751200C37586
+:101C00000100E500F5F0E50DA4F50CE500F5F0E5C3
+:101C10000DA4E5F0F509E50CF5F0E50135F0F50169
+:101C2000E514F5F0E50DA4F50CE514F5F0E50DA4CB
+:101C3000E5F0F50AE50CF5F0E50935F0F509E518EC
+:101C4000F5F0E50DA4F50CE518F5F0E50DA4E5F0CB
+:101C5000F50BE50CF5F0E50A35F0F50AE51CF5F0B5
+:101C6000E50DA4F50CE51CF5F0E50DA4E5F0F50D8A
+:101C7000E50CF5F0E50B35F0F50BC3C3750C00E58D
+:101C800001F5F0E50F35F0F50FE509F5F0E5103554
+:101C9000F0F510E50AF5F0E51135F0F511E50BF575
+:101CA000F0E51235F0F512C3750900E500F5F0E531
+:101CB0000EA4F50CE500F5F0E50EA4E5F0F50AE557
+:101CC0000CF5F0E50935F0F509E514F5F0E50EA49D
+:101CD000F50CE514F5F0E50EA4E5F0F50BE50CF5D3
+:101CE000F0E50A35F0F50AE518F5F0E50EA4F50C77
+:101CF000E518F5F0E50EA4E5F0F50DE50CF5F0E5D9
+:101D00000B35F0F50B750100C3C3750C00E501F54B
+:101D1000F0E50F35F0F50FE509F5F0E51035F0F5D4
+:101D200010E50AF5F0E51135F0F511E50BF5F0E5F4
+:101D30001235F0F512C3750A00E500F5F0E517A4B9
+:101D4000F50CE500F5F0E517A4E5F0F50BE50CF56D
+:101D5000F0E50A35F0F50AE514F5F0E517A4F50C01
+:101D6000E514F5F0E517A4E5F0F50DE50CF5F0E563
+:101D70000B35F0F50B750100750900C3C3750C0038
+:101D8000E501F5F0E50F35F0F50FE509F5F0E510A3
+:101D900035F0F510E50AF5F0E51135F0F511E50B34
+:101DA000F5F0E51235F0F512C3750B00E500F5F01E
+:101DB000E51BA4F50CE500F5F0E51BA4E5F0F50D39
+:101DC000E50CF5F0E50B35F0F50B75010075090034
+:101DD000750A00C3C3750000E501F5F0E50F35F0A5
+:101DE000F50FE509F5F0E51035F0F510E50AF5F029
+:101DF000E51135F0F511E50BF5F0E51235F0F512CA
+:101E0000750001750100750900750A00C3750B00A6
+:101E1000E500F5F0E51935F0F519E501F5F0E51502
+:101E200035F0F515E509F5F0E51335F0F513E50A9C
+:101E3000F5F0E51D35F0F51D02186200E50FF5021D
+:101E4000E510F503E511F504E512F50575E0092542
+:101E500006F58275E0003507F583E0F51775E008B3
+:101E60002506F58275E0003507F583E0F51675E087
+:101E7000072506F58275E0003507F583E0F5157551
+:101E8000E0062506F58275E0003507F583E0F514D8
+:101E900075E0052506F58275E0003507F583E0F568
+:101EA0001375E0042506F58275E0003507F583E03B
+:101EB000F51275E0032506F58275E0003507F58318
+:101EC000E0F51175E0022506F58275E0003507F5AD
+:101ED00083E0F51075E0002506F58275E000350712
+:101EE000F583E0F508E508C0E075E0012506F58218
+:101EF00075E0003507F583E0F508E508C0E075E01A
+:101F0000122506F50675E0003507F507E502F582AE
+:101F1000E503F583E504F500E505F5012200E50696
+:101F2000758219C39582F506E5077583009583F5DB
+:101F300007D0E0F50875E0082506F58275E0003564
+:101F400007F583E508F0D0E0F50875E0072506F50C
+:101F50008275E0003507F583E508F075E010250689
+:101F6000F58275E0003507F583E517F075E00F257C
+:101F700006F58275E0003507F583E516F075E00E8D
+:101F80002506F58275E0003507F583E515F075E067
+:101F90000D2506F58275E0003507F583E514F0752B
+:101FA000E00C2506F58275E0003507F583E513F0B2
+:101FB00075E00B2506F58275E0003507F583E5121F
+:101FC000F075E00A2506F58275E0003507F583E532
+:101FD00011F075E0092506F58275E0003507F583F7
+:101FE000E510F0E51DF517E51CF516E518F5157576
+:101FF0001400750D00750E00750F00E515F51075D0
+:102000000080E500F5F0E51025F0F510E500F5F0AD
+:10201000E50F25F0F50F750C0075110075120075B0
+:102020001300750B00750A01750001C3E50FF5F08B
+:10203000E51095F0F509E50BF5F0E50B35F0F50940
+:10204000E509F5F0E50055F0F500E500F5F0E50CE3
+:1020500045F0F50C750001C3E50FF5F0E51095F0BE
+:10206000F509E50BF5F0E50B35F0F509E510F5F0B0
+:10207000E50F95F0F501E50BF5F0E50B35F0F50111
+:10208000E501F5F0E50945F0F509E50AF5F0E509A2
+:1020900065F0F509E509F5F0E50055F0F500C3E553
+:1020A0000EF5F0E51995F0F509E50BF5F0E50B35C2
+:1020B000F0F509E509F5F0E50055F0F500E500F566
+:1020C000F0E50C45F0F50C750001C3E50FF5F0E502
+:1020D0001095F0F509E50BF5F0E50B35F0F509E5A0
+:1020E00010F5F0E50F95F0F501E50BF5F0E50B3592
+:1020F000F0F501E501F5F0E50945F0F509E50AF52A
+:10210000F0E50965F0F509E509F5F0E50055F0F5AC
+:1021100000C3E50EF5F0E51995F0F509E50BF5F0CE
+:10212000E50B35F0F509E519F5F0E50E95F0F5014B
+:10213000E50BF5F0E50B35F0F501E501F5F0E50906
+:1021400045F0F509E50AF5F0E50965F0F509E50959
+:10215000F5F0E50055F0F500C3E50DF5F0E51A954D
+:10216000F0F509E50BF5F0E50B35F0F509E509F5B6
+:10217000F0E50055F0F500E500F5F0E50C45F0F56B
+:102180000C750001C3E50FF5F0E51095F0F509E5D4
+:102190000BF5F0E50B35F0F509E510F5F0E50F95D9
+:1021A000F0F501E50BF5F0E50B35F0F501E501F58E
+:1021B000F0E50945F0F509E50AF5F0E50965F0F502
+:1021C00009E509F5F0E50055F0F500C3E50EF5F079
+:1021D000E51995F0F509E50BF5F0E50B35F0F50996
+:1021E000E519F5F0E50E95F0F501E50BF5F0E50BD9
+:1021F00035F0F501E501F5F0E50945F0F509E50AE9
+:10220000F5F0E50965F0F509E509F5F0E50055F0AB
+:10221000F500C3E50DF5F0E51A95F0F509E50BF5C8
+:10222000F0E50B35F0F509E51AF5F0E50D95F0F55B
+:1022300001E50BF5F0E50B35F0F501E501F5F0E50D
+:102240000945F0F509E50AF5F0E50965F0F509E558
+:1022500009F5F0E50055F0F500C3E514F5F0E51BD0
+:1022600095F0F509E50BF5F0E50B35F0F509E50915
+:10227000F5F0E50055F0F500E500F5F0E50C45F06A
+:10228000F50C750000E50CF5F0E50045F0F500E50E
+:1022900011F5F0E50045F0F500E512F5F0E5004533
+:1022A000F0F500E513F5F0E50045F0F500E5007008
+:1022B00002800302300400E51FF51CE51EF51DE554
+:1022C00017F51FE516F51E75E0032506F58275E086
+:1022D000003507F583E51BF075E0022506F58275EC
+:1022E000E0003507F583E51AF075E0012506F58273
+:1022F00075E0003507F583E519F075E0002506F572
+:102300008275E0003507F583E515F0751301751446
+:102310000075150075120075E0062506F58275E05A
+:10232000003507F583E51FF075E0052506F5827594
+:10233000E0003507F583E51EF075080075E004251B
+:1023400006F58275E0003507F583E508F07516009F
+:1023500075110075100075171F750F00750C00754D
+:102360000D00750B00751800751900751A00750AB7
+:1023700000750E01750001C3E50DF5F0E51095F04F
+:10238000F509E50AF5F0E50A35F0F509E509F5F096
+:10239000E50055F0F500E500F5F0E50B45F0F50B2F
+:1023A000750001C3E50DF5F0E51095F0F509E50AB6
+:1023B000F5F0E50A35F0F509E510F5F0E50D95F0D5
+:1023C000F501E50AF5F0E50A35F0F501E501F5F06E
+:1023D000E50945F0F509E50EF5F0E50965F0F509C3
+:1023E000E509F5F0E50055F0F500C3E50CF5F0E57D
+:1023F0001195F0F509E50AF5F0E50A35F0F509E57E
+:1024000009F5F0E50055F0F500E500F5F0E50B45C0
+:10241000F0F50B750001C3E50DF5F0E51095F0F54D
+:1024200009E50AF5F0E50A35F0F509E510F5F0E5FE
+:102430000D95F0F501E50AF5F0E50A35F0F501E551
+:1024400001F5F0E50945F0F509E50EF5F0E509655A
+:10245000F0F509E509F5F0E50055F0F500C3E50CE8
+:10246000F5F0E51195F0F509E50AF5F0E50A35F026
+:10247000F509E511F5F0E50C95F0F501E50AF5F043
+:10248000E50A35F0F501E501F5F0E50945F0F50956
+:10249000E50EF5F0E50965F0F509E509F5F0E5006B
+:1024A00055F0F500C3E50FF5F0E51695F0F509E5F3
+:1024B0000AF5F0E50A35F0F509E509F5F0E500550E
+:1024C000F0F500E500F5F0E50B45F0F50B750001C2
+:1024D000C3E50DF5F0E51095F0F509E50AF5F0E531
+:1024E0000A35F0F509E510F5F0E50D95F0F501E593
+:1024F0000AF5F0E50A35F0F501E501F5F0E50945E5
+:10250000F0F509E50EF5F0E50965F0F509E509F5E1
+:10251000F0E50055F0F500C3E50CF5F0E51195F098
+:10252000F509E50AF5F0E50A35F0F509E511F5F0EC
+:10253000E50C95F0F501E50AF5F0E50A35F0F50151
+:10254000E501F5F0E50945F0F509E50EF5F0E509D9
+:1025500065F0F509E509F5F0E50055F0F500C3E58E
+:102560000FF5F0E51695F0F509E50AF5F0E50A3501
+:10257000F0F509E516F5F0E50F95F0F501E50AF53A
+:10258000F0E50A35F0F501E501F5F0E50945F0F56E
+:1025900009E50EF5F0E50965F0F509E509F5F0E561
+:1025A0000055F0F500C3E517F5F075E0042506F5D4
+:1025B0008275E0003507F583E0F508E50895F0F54C
+:1025C00009E50AF5F0E50A35F0F509E509F5F0E564
+:1025D0000055F0F500E500F5F0E50B45F0F50BE5ED
+:1025E00018F500E519F501E51AF50C750A01C37532
+:1025F0000900E50BF5F0E50995F0F509750900E529
+:1026000009F5F0E50935F0F509E509F5F0E50A65A4
+:10261000F0F50AC3750900E500F5F0E50995F0F558
+:1026200009750900E509F5F0E50935F0F509E50951
+:10263000F5F0E50A65F0F50AC3750900E501F5F066
+:10264000E50995F0F509750900E509F5F0E50935A5
+:10265000F0F509E509F5F0E50A65F0F50AC3750935
+:1026600000E50CF5F0E50995F0F509750900E509B7
+:10267000F5F0E50935F0F509E509F5F0E50A65F04D
+:10268000F50A750100750900750B00750000E50A73
+:10269000F5F0E50045F0F500E501F5F0E50045F061
+:1026A000F500E509F5F0E50045F0F500E50BF5F07E
+:1026B000E50045F0F500E5007002800302294700BF
+:1026C000750C02750D00750F00751800E513F50EF9
+:1026D000E514F517E515F519E512F51A75130075EA
+:1026E0001400751500751200C3750000E50EF5F0B5
+:1026F000E50CA4F50BE50EF5F0E50CA4E5F0F5010D
+:10270000E50BF5F0E50035F0F500E517F5F0E50C23
+:10271000A4F50BE517F5F0E50CA4E5F0F509E50BDC
+:10272000F5F0E50135F0F501E519F5F0E50CA4F556
+:102730000BE519F5F0E50CA4E5F0F50AE50BF5F06D
+:10274000E50935F0F509E51AF5F0E50CA4F50BE51A
+:102750001AF5F0E50CA4E5F0F50CE50BF5F0E50A4B
+:1027600035F0F50AC3C3750B00E500F5F0E5133548
+:10277000F0F513E501F5F0E51435F0F514E509F58C
+:10278000F0E51535F0F515E50AF5F0E51235F0F54B
+:1027900012C3750100E50EF5F0E50DA4F50BE50E8D
+:1027A000F5F0E50DA4E5F0F509E50BF5F0E50135EB
+:1027B000F0F501E517F5F0E50DA4F50BE517F5F0DB
+:1027C000E50DA4E5F0F50AE50BF5F0E50935F0F5C2
+:1027D00009E519F5F0E50DA4F50BE519F5F0E50DA2
+:1027E000A4E5F0F50CE50BF5F0E50A35F0F50A7512
+:1027F0000000C3C3750B00E500F5F0E51335F0F5F7
+:1028000013E501F5F0E51435F0F514E509F5F0E50B
+:102810001535F0F515E50AF5F0E51235F0F512C3BA
+:10282000750900E50EF5F0E50FA4F50BE50EF5F0E2
+:10283000E50FA4E5F0F50AE50BF5F0E50935F0F54F
+:1028400009E517F5F0E50FA4F50BE517F5F0E50F31
+:10285000A4E5F0F50CE50BF5F0E50A35F0F50A75A1
+:102860000000750100C3C3750B00E500F5F0E5132A
+:1028700035F0F513E501F5F0E51435F0F514E5094B
+:10288000F5F0E51535F0F515E50AF5F0E51235F04A
+:10289000F512C3750A00E50EF5F0E518A4F50BE591
+:1028A0000EF5F0E518A4E5F0F50CE50BF5F0E50AFA
+:1028B00035F0F50A750000750100750900C3C37590
+:1028C0000B00E500F5F0E51335F0F513E501F5F043
+:1028D000E51435F0F514E509F5F0E51535F0F515D5
+:1028E000E50AF5F0E51235F0F51275000175010005
+:1028F000750900750A00C3750B00E500F5F075E079
+:10290000042506F58275E0003507F583E0F508E556
+:102910000835F0F50875E0042506F58275E0003508
+:1029200007F583E508F0E501F5F0E51635F0F51655
+:10293000E509F5F0E51135F0F511E50AF5F0E510DA
+:1029400035F0F51002235600C3E51CF5F0E51355EC
+:10295000F0F513E51DF5F0E51455F0F514E51FF558
+:10296000F0E51555F0F515E51EF5F0E51255F0F515
+:102970001275080075E0042506F58275E00035073C
+:10298000F583E508F0751600751100751000750CDB
+:1029900000750D00750E00750F00750B00750A01AE
+:1029A000750001C375E0002506F58275E000350766
+:1029B000F583E0F508E508F5F0E51095F0F509E593
+:1029C0000BF5F0E50B35F0F509E509F5F0E50055F7
+:1029D000F0F500E500F5F0E50C45F0F50C750001AB
+:1029E000C375E0002506F58275E0003507F583E044
+:1029F000F508E508F5F0E51095F0F509E50BF5F0BB
+:102A0000E50B35F0F509E510F5F075E0002506F564
+:102A10008275E0003507F583E0F508E50895F0F5E7
+:102A200001E50BF5F0E50B35F0F501E501F5F0E515
+:102A30000945F0F509E50AF5F0E50965F0F509E560
+:102A400009F5F0E50055F0F500C375E0012506F540
+:102A50008275E0003507F583E0F508E508F5F0E557
+:102A60001195F0F509E50BF5F0E50B35F0F509E505
+:102A700009F5F0E50055F0F500E500F5F0E50C4549
+:102A8000F0F50C750001C375E0002506F58275E0D0
+:102A9000003507F583E0F508E508F5F0E51095F059
+:102AA000F509E50BF5F0E50B35F0F509E510F5F066
+:102AB00075E0002506F58275E0003507F583E0F541
+:102AC00008E50895F0F501E50BF5F0E50B35F0F5B7
+:102AD00001E501F5F0E50945F0F509E50AF5F0E550
+:102AE0000965F0F509E509F5F0E50055F0F500C3D5
+:102AF00075E0012506F58275E0003507F583E0F500
+:102B000008E508F5F0E51195F0F509E50BF5F0E5B8
+:102B10000B35F0F509E511F5F075E0012506F582B4
+:102B200075E0003507F583E0F508E50895F0F50157
+:102B3000E50BF5F0E50B35F0F501E501F5F0E509FC
+:102B400045F0F509E50AF5F0E50965F0F509E5094F
+:102B5000F5F0E50055F0F500C375E0022506F582B5
+:102B600075E0003507F583E0F508E508F5F0E516B2
+:102B700095F0F509E50BF5F0E50B35F0F509E509FC
+:102B8000F5F0E50055F0F500E500F5F0E50C45F051
+:102B9000F50C750001C375E0002506F58275E000AF
+:102BA0003507F583E0F508E508F5F0E51095F0F553
+:102BB00009E50BF5F0E50B35F0F509E510F5F075D5
+:102BC000E0002506F58275E0003507F583E0F5089D
+:102BD000E50895F0F501E50BF5F0E50B35F0F501AD
+:102BE000E501F5F0E50945F0F509E50AF5F0E50937
+:102BF00065F0F509E509F5F0E50055F0F500C37558
+:102C0000E0012506F58275E0003507F583E0F5085B
+:102C1000E508F5F0E51195F0F509E50BF5F0E50BA4
+:102C200035F0F509E511F5F075E0012506F5827539
+:102C3000E0003507F583E0F508E50895F0F501E5D6
+:102C40000BF5F0E50B35F0F501E501F5F0E509458B
+:102C5000F0F509E50AF5F0E50965F0F509E509F58E
+:102C6000F0E50055F0F500C375E0022506F5827524
+:102C7000E0003507F583E0F508E508F5F0E5169581
+:102C8000F0F509E50BF5F0E50B35F0F509E516F57E
+:102C9000F075E0022506F58275E0003507F583E062
+:102CA000F508E50895F0F501E50BF5F0E50B35F0D5
+:102CB000F501E501F5F0E50945F0F509E50AF5F05E
+:102CC000E50965F0F509E509F5F0E50055F0F500D1
+:102CD000C375E0032506F58275E0003507F583E04E
+:102CE000F508E508F5F075E0042506F58275E000C5
+:102CF0003507F583E0F508E50895F0F509E50BF5EE
+:102D0000F0E50B35F0F509E509F5F0E50055F0F5CE
+:102D100000E500F5F0E50C45F0F50CE50DF500E5F6
+:102D20000EF501E50FF509E500F50BE501F50A756E
+:102D30000101C3750000E50CF5F0E50095F0F50024
+:102D4000750000E500F5F0E50035F0F500E500F56B
+:102D5000F0E50165F0F501C3750000E50BF5F0E560
+:102D60000095F0F500750000E500F5F0E50035F0A0
+:102D7000F500E500F5F0E50165F0F501C37500002B
+:102D8000E50AF5F0E50095F0F500750000E500F5C1
+:102D9000F0E50035F0F500E500F5F0E50165F0F54A
+:102DA00001C3750000E509F5F0E50095F0F5007543
+:102DB0000000E500F5F0E50035F0F500E500F5F080
+:102DC000E50165F0F501750900750A00750B0075E0
+:102DD0000000E501F5F0E50045F0F500E509F5F046
+:102DE000E50045F0F500E50AF5F0E50045F0F500F1
+:102DF000E50BF5F0E50045F0F500E5007002800315
+:102E0000022F0800751B02751A007519007518004D
+:102E1000E51CF51FE51DF51E75E0062506F5827516
+:102E2000E0003507F583E0F51D75E0052506F58220
+:102E300075E0003507F583E0F51C120000E582F52A
+:102E400002E583F503E500F504E501F505E502F586
+:102E50000AE503F509E504F501E505F500C3750B81
+:102E600000E513F5F0E50A35F0F51CE514F5F0E59D
+:102E70000935F0F51DE515F5F0E50135F0F50875B6
+:102E8000E0062506F58275E0003507F583E508F0D4
+:102E9000E512F5F0E50035F0F50875E0052506F5D5
+:102EA0008275E0003507F583E508F07500017501CE
+:102EB00000750900750A00C3750B00E500F5F07593
+:102EC000E0042506F58275E0003507F583E0F50896
+:102ED000E50835F0F50875E0042506F58275E00093
+:102EE0003507F583E508F0E501F5F0E51635F0F571
+:102EF00016E509F5F0E51135F0F511E50AF5F0E50F
+:102F00001035F0F51002298E00E51CF502E51DF5DF
+:102F10000375E0062506F58275E0003507F583E0C8
+:102F2000F50475E0052506F58275E0003507F583A3
+:102F3000E0F50575E0102506F58275E0003507F52A
+:102F400083E0F51775E00F2506F58275E00035077B
+:102F5000F583E0F51675E00E2506F58275E000357F
+:102F600007F583E0F51575E00D2506F58275E0009F
+:102F70003507F583E0F51475E00C2506F58275E05C
+:102F8000003507F583E0F51375E00B2506F582752E
+:102F9000E0003507F583E0F51275E00A2506F582B5
+:102FA00075E0003507F583E0F51175E0092506F5B4
+:102FB0008275E0003507F583E0F51075E00725061A
+:102FC000F58275E0003507F583E0F508E508C0E017
+:102FD00075E0082506F58275E0003507F583E0F514
+:102FE00008E508C0E075E0192506F50675E000352E
+:102FF00007F507E502F582E503F583E504F500E54D
+:1030000005F5012200751C00751D0075080075E0AE
+:10301000062506F58275E0003507F583E508F075AD
+:10302000080075E0052506F58275E0003507F58393
+:10303000E508F0022F0900E506758206C39582F5C2
+:1030400006E5077583009583F507D0E0F50875E080
+:10305000012506F58275E0003507F583E508F0D017
+:10306000E0F50875E0002506F58275E0003507F506
+:1030700083E508F075E0052506F58275E000350763
+:10308000F583E513F075E0042506F58275E000355B
+:1030900007F583E512F075E0032506F58275E0007B
+:1030A0003507F583E511F075E0022506F58275E038
+:1030B000003507F583E510F0900000E582F50990F2
+:1030C0000000E583F50A750100C3750000E501F510
+:1030D000F0E50935F0F501E500F5F0E50A35F0F524
+:1030E00000E500F502E501F582E502F583E0F51F54
+:1030F000750101C3750000E501F5F0E50935F0F54E
+:1031000001E500F5F0E50A35F0F500E500F502E52A
+:1031100001F582E502F583E0F51E750102C3750035
+:1031200000E501F5F0E50935F0F501E500F5F0E51C
+:103130000A35F0F500E500F502E501F582E502F556
+:1031400083E0F51D750103C3750000E501F5F0E5A9
+:103150000935F0F501E500F5F0E50A35F0F500E593
+:1031600000F502E501F582E502F583E0F51C90002B
+:1031700004E582F509900004E583F50A750100C3B2
+:10318000750000E501F5F0E50935F0F501E500F51C
+:10319000F0E50A35F0F500E500F502E501F582E518
+:1031A00002F583E0F51B750101C3750000E501F52B
+:1031B000F0E50935F0F501E500F5F0E50A35F0F543
+:1031C00000E500F502E501F582E502F583E0F51A78
+:1031D000750102C3750000E501F5F0E50935F0F56C
+:1031E00001E500F5F0E50A35F0F500E500F502E54A
+:1031F00001F582E502F583E0F519750103C3750059
+:1032000000E501F5F0E50935F0F501E500F5F0E53B
+:103210000A35F0F500E500F502E501F582E502F575
+:1032200083E0F518121277E582F502E583F503E5F0
+:1032300000F504E501F505E502F50BE503F50CE500
+:1032400004F50DE505F50E900000E582F509900006
+:1032500000E583F50A750100C3750000E501F5F08E
+:10326000E50935F0F501E500F5F0E50A35F0F50082
+:10327000E50BF503E500F502E501F582E502F583CE
+:10328000E503F0750101C3750000E501F5F0E509FE
+:1032900035F0F501E500F5F0E50A35F0F500E50C4F
+:1032A000F503E500F502E501F582E502F583E503A6
+:1032B000F0750102C3750000E501F5F0E50935F090
+:1032C000F501E500F5F0E50A35F0F500E50DF5034B
+:1032D000E500F502E501F582E502F583E503F07509
+:1032E0000103C3750000E501F5F0E50935F0F501CE
+:1032F000E500F5F0E50A35F0F500E50EF503E5002B
+:10330000F502E501F582E502F583E503F09000089A
+:10331000E582F512900008E583F513900008E58238
+:10332000F509900008E583F50A750100C3750000F2
+:10333000E501F5F0E50935F0F501E500F5F0E50A00
+:1033400035F0F500E500F502E501F582E502F583CB
+:10335000E0F50E750101C3750000E501F5F0E50922
+:1033600035F0F501E500F5F0E50A35F0F500E5008A
+:10337000F502E501F582E502F583E0F50F7501023E
+:10338000C3750000E501F5F0E50935F0F501E5004C
+:10339000F5F0E50A35F0F500E500F502E501F58206
+:1033A000E502F583E0F510750103C3750000E50142
+:1033B000F5F0E50935F0F501E500F5F0E50A35F041
+:1033C000F500E500F502E501F582E502F583E0F59B
+:1033D0001190000CE582F50990000CE583F50A7563
+:1033E0000100C3750000E501F5F0E50935F0F501D0
+:1033F000E500F5F0E50A35F0F500E500F502E50138
+:10340000F582E502F583E0F50B750101C375000057
+:10341000E501F5F0E50935F0F501E500F5F0E50A1F
+:1034200035F0F500E500F502E501F582E502F583EA
+:10343000E0F50C750102C3750000E501F5F0E50942
+:1034400035F0F501E500F5F0E50A35F0F500E500A9
+:10345000F502E501F582E502F583E0F50D7501035E
+:10346000C3750000E501F5F0E50935F0F501E5006B
+:10347000F5F0E50A35F0F500E500F502E501F58225
+:10348000E502F583E0F500C3E50BF5F0E50E55F038
+:10349000F501E50CF5F0E50F55F0F509E50DF5F052
+:1034A000E51055F0F50AE500F5F0E51155F0F50CDD
+:1034B000750B00C3750000E50BF5F0E51235F0F56E
+:1034C0000BE500F5F0E51335F0F500E501F503E552
+:1034D00000F502E50BF582E502F583E503F0750BD7
+:1034E00001C3750000E50BF5F0E51235F0F50BE5CD
+:1034F00000F5F0E51335F0F500E509F503E500F515
+:1035000002E50BF582E502F583E503F0750B02C3D6
+:10351000750000E50BF5F0E51235F0F50BE500F56B
+:10352000F0E51335F0F500E50AF503E500F502E5F1
+:103530000BF582E502F583E503F0750B03C3750017
+:1035400000E50BF5F0E51235F0F50BE500F5F0E5DB
+:103550001335F0F500E50CF503E500F502E50BF594
+:1035600082E502F583E503F0900000E582F5129014
+:103570000000E583F513900000E582F50990000056
+:10358000E583F50A750100C3750000E501F5F0E576
+:103590000935F0F501E500F5F0E50A35F0F500E54F
+:1035A00000F502E501F582E502F583E0F50E75010F
+:1035B00001C3750000E501F5F0E50935F0F501E519
+:1035C00000F5F0E50A35F0F500E500F502E501F556
+:1035D00082E502F583E0F50F750102C3750000E591
+:1035E00001F5F0E50935F0F501E500F5F0E50A35FE
+:1035F000F0F500E500F502E501F582E502F583E06E
+:10360000F510750103C3750000E501F5F0E5093516
+:10361000F0F501E500F5F0E50A35F0F500E500F517
+:1036200002E501F582E502F583E0F511900004E57D
+:1036300082F509900004E583F50A750100C3750061
+:1036400000E501F5F0E50935F0F501E500F5F0E5F7
+:103650000A35F0F500E500F502E501F582E502F531
+:1036600083E0F50B750101C3750000E501F5F0E598
+:103670000935F0F501E500F5F0E50A35F0F500E56E
+:1036800000F502E501F582E502F583E0F50C750130
+:1036900002C3750000E501F5F0E50935F0F501E537
+:1036A00000F5F0E50A35F0F500E500F502E501F575
+:1036B00082E502F583E0F50D750103C3750000E5B1
+:1036C00001F5F0E50935F0F501E500F5F0E50A351D
+:1036D000F0F500E500F502E501F582E502F583E08D
+:1036E000F500C3E50BF5F0E50E45F0F501E50CF549
+:1036F000F0E50F45F0F509E50DF5F0E51045F0F5BD
+:103700000AE500F5F0E51145F0F50C750B00C37501
+:103710000000E50BF5F0E51235F0F50BE500F5F0EE
+:10372000E51335F0F500E501F503E500F502E50BDD
+:10373000F582E502F583E503F0750B01C375000022
+:10374000E50BF5F0E51235F0F50BE500F5F0E513C6
+:1037500035F0F500E509F503E500F502E50BF58226
+:10376000E502F583E503F0750B02C3750000E50B78
+:10377000F5F0E51235F0F50BE500F5F0E51335F061
+:10378000F500E50AF503E500F502E50BF582E50233
+:10379000F583E503F0750B03C3750000E50BF5F049
+:1037A000E51235F0F50BE500F5F0E51335F0F50021
+:1037B000E50CF503E500F502E50BF582E502F5837E
+:1037C000E503F0900008E582F512900008E583F526
+:1037D00013900008E582F509900008E583F50A7565
+:1037E0000100C3750000E501F5F0E50935F0F501CC
+:1037F000E500F5F0E50A35F0F500E500F502E50134
+:10380000F582E502F583E0F50E750101C375000050
+:10381000E501F5F0E50935F0F501E500F5F0E50A1B
+:1038200035F0F500E500F502E501F582E502F583E6
+:10383000E0F50F750102C3750000E501F5F0E5093B
+:1038400035F0F501E500F5F0E50A35F0F500E500A5
+:10385000F502E501F582E502F583E0F51075010357
+:10386000C3750000E501F5F0E50935F0F501E50067
+:10387000F5F0E50A35F0F500E500F502E501F58221
+:10388000E502F583E0F51190000CE582F509900062
+:103890000CE583F50A750100C3750000E501F5F03C
+:1038A000E50935F0F501E500F5F0E50A35F0F5003C
+:1038B000E500F502E501F582E502F583E0F50B751B
+:1038C0000101C3750000E501F5F0E50935F0F501EA
+:1038D000E500F5F0E50A35F0F500E500F502E50153
+:1038E000F582E502F583E0F50C750102C375000071
+:1038F000E501F5F0E50935F0F501E500F5F0E50A3B
+:1039000035F0F500E500F502E501F582E502F58305
+:10391000E0F50D750103C3750000E501F5F0E5095B
+:1039200035F0F501E500F5F0E50A35F0F500E500C4
+:10393000F502E501F582E502F583E0F500C3E50B4C
+:10394000F5F0E50E65F0F501E50CF5F0E50F65F035
+:10395000F509E50DF5F0E51065F0F50AE500F5F07F
+:10396000E51165F0F50C750B00C3750000E50BF56E
+:10397000F0E51235F0F50BE500F5F0E51335F0F55F
+:1039800000E501F503E500F502E50BF582E502F53A
+:1039900083E503F0750B01C3750000E50BF5F0E559
+:1039A0001235F0F50BE500F5F0E51335F0F500E51F
+:1039B00009F503E500F502E50BF582E502F583E57F
+:1039C00003F0750B02C3750000E50BF5F0E5123549
+:1039D000F0F50BE500F5F0E51335F0F500E50AF537
+:1039E00003E500F502E50BF582E502F583E503F05A
+:1039F000750B03C3750000E50BF5F0E51235F0F526
+:103A00000BE500F5F0E51335F0F500E50CF503E501
+:103A100000F502E50BF582E502F583E503F0900081
+:103A200000E582F509900000E583F50A750100C301
+:103A3000750000E501F5F0E50935F0F501E500F563
+:103A4000F0E50A35F0F500E500F502E501F582E55F
+:103A500002F583E0F51F750101C3750000E501F56E
+:103A6000F0E50935F0F501E500F5F0E50A35F0F58A
+:103A700000E500F502E501F582E502F583E0F51EBB
+:103A8000750102C3750000E501F5F0E50935F0F5B3
+:103A900001E500F5F0E50A35F0F500E500F502E591
+:103AA00001F582E502F583E0F51D750103C375009C
+:103AB00000E501F5F0E50935F0F501E500F5F0E583
+:103AC0000A35F0F500E500F502E501F582E502F5BD
+:103AD00083E0F51C900004E582F509900004E5837D
+:103AE000F50A750100C3750000E501F5F0E509353B
+:103AF000F0F501E500F5F0E50A35F0F500E500F533
+:103B000002E501F582E502F583E0F51B750101C3CD
+:103B1000750000E501F5F0E50935F0F501E500F582
+:103B2000F0E50A35F0F500E500F502E501F582E57E
+:103B300002F583E0F51A750102C3750000E501F591
+:103B4000F0E50935F0F501E500F5F0E50A35F0F5A9
+:103B500000E500F502E501F582E502F583E0F519DF
+:103B6000750103C3750000E501F5F0E50935F0F5D1
+:103B700001E500F5F0E50A35F0F500E500F502E5B0
+:103B800001F582E502F583E0F518121F1DE582F5C7
+:103B900002E583F503E500F504E501F505E502F529
+:103BA0000BE503F50CE504F50DE505F50E900000B9
+:103BB000E582F509900000E583F50A750100C375FB
+:103BC0000000E501F5F0E50935F0F501E500F5F057
+:103BD000E50A35F0F500E50BF503E500F502E50132
+:103BE000F582E502F583E503F0750101C375000078
+:103BF000E501F5F0E50935F0F501E500F5F0E50A38
+:103C000035F0F500E50CF503E500F502E501F58278
+:103C1000E502F583E503F0750102C3750000E501D7
+:103C2000F5F0E50935F0F501E500F5F0E50A35F0C8
+:103C3000F500E50DF503E500F502E501F582E50285
+:103C4000F583E503F0750103C3750000E501F5F0A8
+:103C5000E50935F0F501E500F5F0E50A35F0F50088
+:103C6000E50EF503E500F502E501F582E502F583D1
+:103C7000E503F0900008E582F509900008E583F57A
+:103C80000A750100C3750000E501F5F0E50935F09E
+:103C9000F501E500F5F0E50A35F0F500E500F5027F
+:103CA000E501F582E502F583E0F51F750101C375B5
+:103CB0000000E501F5F0E50935F0F501E500F5F066
+:103CC000E50A35F0F500E500F502E501F582E502CB
+:103CD000F583E0F51E750102C3750000E501F5F0FE
+:103CE000E50935F0F501E500F5F0E50A35F0F500F8
+:103CF000E500F502E501F582E502F583E0F51D75C5
+:103D00000103C3750000E501F5F0E50935F0F501A3
+:103D1000E500F5F0E50A35F0F500E500F502E5010E
+:103D2000F582E502F583E0F51C90000CE582F509CB
+:103D300090000CE583F50A750100C3750000E501EC
+:103D4000F5F0E50935F0F501E500F5F0E50A35F0A7
+:103D5000F500E500F502E501F582E502F583E0F501
+:103D60001B750101C3750000E501F5F0E50935F0AB
+:103D7000F501E500F5F0E50A35F0F500E500F5029E
+:103D8000E501F582E502F583E0F51A750102C375D8
+:103D90000000E501F5F0E50935F0F501E500F5F085
+:103DA000E50A35F0F500E500F502E501F582E502EA
+:103DB000F583E0F519750103C3750000E501F5F021
+:103DC000E50935F0F501E500F5F0E50A35F0F50017
+:103DD000E500F502E501F582E502F583E0F518124C
+:103DE0001764E582F502E583F503E500F504E501D6
+:103DF000F505E502F50BE503F50CE504F50DE50524
+:103E0000F50E900008E582F509900008E583F50AB3
+:103E1000750100C3750000E501F5F0E50935F0F521
+:103E200001E500F5F0E50A35F0F500E50BF503E5F1
+:103E300000F502E501F582E502F583E503F0750181
+:103E400001C3750000E501F5F0E50935F0F501E580
+:103E500000F5F0E50A35F0F500E50CF503E500F5B1
+:103E600002E501F582E502F583E503F0750102C381
+:103E7000750000E501F5F0E50935F0F501E500F51F
+:103E8000F0E50A35F0F500E50DF503E500F502E58E
+:103E900001F582E502F583E503F0750103C37500C2
+:103EA00000E501F5F0E50935F0F501E500F5F0E58F
+:103EB0000A35F0F500E50EF503E500F502E501F53C
+:103EC00082E502F583E503F0900000E582F50E90AF
+:103ED0000000E583F50F900004E582F509900004E9
+:103EE000E583F50A750100C3750000E501F5F0E50D
+:103EF0000935F0F501E500F5F0E50A35F0F500E5E6
+:103F000000F502E501F582E502F583E0F50B7501A8
+:103F100001C3750000E501F5F0E50935F0F501E5AF
+:103F200000F5F0E50A35F0F500E500F502E501F5EC
+:103F300082E502F583E0F50C750102C3750000E52A
+:103F400001F5F0E50935F0F501E500F5F0E50A3594
+:103F5000F0F500E500F502E501F582E502F583E004
+:103F6000F50D750103C3750000E501F5F0E50935B0
+:103F7000F0F501E500F5F0E50A35F0F500E500F5AE
+:103F800002E501F582E502F583E0F509750100C35C
+:103F9000750000E501F5F0E50E35F0F501E500F5F9
+:103FA000F0E50F35F0F500E50BF503E500F502E56A
+:103FB00001F582E502F583E503F0750101C37500A3
+:103FC00000E501F5F0E50E35F0F501E500F5F0E569
+:103FD0000F35F0F500E50CF503E500F502E501F518
+:103FE00082E502F583E503F0750102C3750000E583
+:103FF00001F5F0E50E35F0F501E500F5F0E50F35DA
+:10400000F0F500E50DF503E500F502E501F582E5C3
+:1040100002F583E503F0750103C3750000E501F5C2
+:10402000F0E50E35F0F501E500F5F0E50F35F0F5BA
+:1040300000E509F503E500F502E501F582E502F585
+:1040400083E503F0900008E582F50E900008E58313
+:10405000F50F90000CE582F50990000CE583F50A58
+:10406000750100C3750000E501F5F0E50935F0F5CF
+:1040700001E500F5F0E50A35F0F500E500F502E5AB
+:1040800001F582E502F583E0F50B750101C37500CA
+:1040900000E501F5F0E50935F0F501E500F5F0E59D
+:1040A0000A35F0F500E500F502E501F582E502F5D7
+:1040B00083E0F50C750102C3750000E501F5F0E53C
+:1040C0000935F0F501E500F5F0E50A35F0F500E514
+:1040D00000F502E501F582E502F583E0F50D7501D5
+:1040E00003C3750000E501F5F0E50935F0F501E5DC
+:1040F00000F5F0E50A35F0F500E500F502E501F51B
+:1041000082E502F583E0F509E50BF4F500E50CF432
+:10411000F501E50DF4F50BE509F4F50C750A00C39E
+:10412000750900E50AF5F0E50E35F0F50AE509F543
+:10413000F0E50F35F0F509E500F503E509F502E5D1
+:104140000AF582E502F583E503F0750A01C37500FF
+:1041500000E50AF5F0E50E35F0F50AE500F5F0E5C5
+:104160000F35F0F509E501F503E509F502E50AF576
+:1041700082E502F583E503F0750A02C3750000E5E8
+:104180000AF5F0E50E35F0F50AE500F5F0E50F3536
+:10419000F0F509E50BF503E509F502E50AF582E519
+:1041A00002F583E503F0750A03C3750000E50AF51F
+:1041B000F0E50E35F0F50AE500F5F0E50F35F0F520
+:1041C00009E50CF503E509F502E50AF582E502F5D6
+:1041D00083E503F0900004E582F509900004E5838F
+:1041E000F50A750100C3750000E501F5F0E5093534
+:1041F000F0F501E500F5F0E50A35F0F500E500F52C
+:1042000002E501F582E502F583E0F51F750101C3C2
+:10421000750000E501F5F0E50935F0F501E500F57B
+:10422000F0E50A35F0F500E500F502E501F582E577
+:1042300002F583E0F51E750102C3750000E501F586
+:10424000F0E50935F0F501E500F5F0E50A35F0F5A2
+:1042500000E500F502E501F582E502F583E0F51DD4
+:10426000750103C3750000E501F5F0E50935F0F5CA
+:1042700001E500F5F0E50A35F0F500E500F502E5A9
+:1042800001F582E502F583E0F51C900008E582F572
+:1042900009900008E583F50A750100C3750000E583
+:1042A00001F5F0E50935F0F501E500F5F0E50A3531
+:1042B000F0F500E500F502E501F582E502F583E0A1
+:1042C000F51B750101C3750000E501F5F0E5093541
+:1042D000F0F501E500F5F0E50A35F0F500E500F54B
+:1042E00002E501F582E502F583E0F51A750102C3E6
+:1042F000750000E501F5F0E50935F0F501E500F59B
+:10430000F0E50A35F0F500E500F502E501F582E596
+:1043100002F583E0F519750103C3750000E501F5A9
+:10432000F0E50935F0F501E500F5F0E50A35F0F5C1
+:1043300000E500F502E501F582E502F583E0F518F8
+:10434000121277E582F502E583F503E500F504E551
+:1043500001F505E502F50BE503F50CE504F50DE5C2
+:1043600005F50E900000E582F509900000E583F563
+:104370000A750100C3750000E501F5F0E50935F0A7
+:10438000F501E500F5F0E50A35F0F500E50BF5037C
+:10439000E500F502E501F582E502F583E503F07538
+:1043A0000101C3750000E501F5F0E50935F0F501FF
+:1043B000E500F5F0E50A35F0F500E50CF503E5005C
+:1043C000F502E501F582E502F583E503F0750102EA
+:1043D000C3750000E501F5F0E50935F0F501E500EC
+:1043E000F5F0E50A35F0F500E50DF503E500F50219
+:1043F000E501F582E502F583E503F0750103C37578
+:104400000000E501F5F0E50935F0F501E500F5F00E
+:10441000E50A35F0F500E50EF503E500F502E501E6
+:10442000F582E502F583E503F0900004E582F509E5
+:10443000900004E583F50A750100C3750000E501ED
+:10444000F5F0E50935F0F501E500F5F0E50A35F0A0
+:10445000F500E500F502E501F582E502F583E0F5FA
+:104460001F750101C3750000E501F5F0E50935F0A0
+:10447000F501E500F5F0E50A35F0F500E500F50297
+:10448000E501F582E502F583E0F51E750102C375CD
+:104490000000E501F5F0E50935F0F501E500F5F07E
+:1044A000E50A35F0F500E500F502E501F582E502E3
+:1044B000F583E0F51D750103C3750000E501F5F016
+:1044C000E50935F0F501E500F5F0E50A35F0F50010
+:1044D000E500F502E501F582E502F583E0F51C90C3
+:1044E0000008E582F509900008E583F50A750100EA
+:1044F000C3750000E501F5F0E50935F0F501E500CB
+:10450000F5F0E50A35F0F500E500F502E501F58284
+:10451000E502F583E0F51B750101C3750000E501B7
+:10452000F5F0E50935F0F501E500F5F0E50A35F0BF
+:10453000F500E500F502E501F582E502F583E0F519
+:104540001A750102C3750000E501F5F0E50935F0C3
+:10455000F501E500F5F0E50A35F0F500E500F502B6
+:10456000E501F582E502F583E0F519750103C375F0
+:104570000000E501F5F0E50935F0F501E500F5F09D
+:10458000E50A35F0F500E500F502E501F582E50202
+:10459000F583E0F518121277E582F502E583F5035D
+:1045A000E500F504E501F505E502F50BE503F50C7D
+:1045B000E504F50DE505F50E900000E582F509909E
+:1045C0000000E583F50A750100C3750000E501F5FB
+:1045D000F0E50935F0F501E500F5F0E50A35F0F50F
+:1045E00000E50BF503E500F502E501F582E502F5CE
+:1045F00083E503F0750101C3750000E501F5F0E501
+:104600000935F0F501E500F5F0E50A35F0F500E5CE
+:104610000CF503E500F502E501F582E502F583E519
+:1046200003F0750102C3750000E501F5F0E50935F9
+:10463000F0F501E500F5F0E50A35F0F500E50DF5DA
+:1046400003E500F502E501F582E502F583E503F0F7
+:10465000750103C3750000E501F5F0E50935F0F5D6
+:1046600001E500F5F0E50A35F0F500E50EF503E5A6
+:1046700000F502E501F582E502F583E503F090001F
+:104680000CE582F51290000CE583F513900008E527
+:1046900082F509900008E583F50A750100C37500ED
+:1046A00000E501F5F0E50935F0F501E500F5F0E587
+:1046B0000A35F0F500E500F502E501F582E502F5C1
+:1046C00083E0F50E750101C3750000E501F5F0E525
+:1046D0000935F0F501E500F5F0E50A35F0F500E5FE
+:1046E00000F502E501F582E502F583E0F50F7501BD
+:1046F00002C3750000E501F5F0E50935F0F501E5C7
+:1047000000F5F0E50A35F0F500E500F502E501F504
+:1047100082E502F583E0F510750103C3750000E53D
+:1047200001F5F0E50935F0F501E500F5F0E50A35AC
+:10473000F0F500E500F502E501F582E502F583E01C
+:10474000F511900004E582F509900004E583F50A6F
+:10475000750100C3750000E501F5F0E50935F0F5D8
+:1047600001E500F5F0E50A35F0F500E500F502E5B4
+:1047700001F582E502F583E0F50B750101C37500D3
+:1047800000E501F5F0E50935F0F501E500F5F0E5A6
+:104790000A35F0F500E500F502E501F582E502F5E0
+:1047A00083E0F50C750102C3750000E501F5F0E545
+:1047B0000935F0F501E500F5F0E50A35F0F500E51D
+:1047C00000F502E501F582E502F583E0F50D7501DE
+:1047D00003C3750000E501F5F0E50935F0F501E5E5
+:1047E00000F5F0E50A35F0F500E500F502E501F524
+:1047F00082E502F583E0F500C3E50BF5F0E50E5523
+:10480000F0F501E50CF5F0E50F55F0F509E50DF5CE
+:10481000F0E51055F0F50AE500F5F0E51155F0F575
+:104820000C750B00C3750000E50BF5F0E51235F0D3
+:10483000F50BE500F5F0E51335F0F500E501F503BE
+:10484000E500F502E50BF582E502F583E503F07579
+:104850000B01C3750000E50BF5F0E51235F0F50B23
+:10486000E500F5F0E51335F0F500E509F503E500A1
+:10487000F502E50BF582E502F583E503F0750B0221
+:10488000C3750000E50BF5F0E51235F0F50BE5001A
+:10489000F5F0E51335F0F500E50AF503E500F5025E
+:1048A000E50BF582E502F583E503F0750B03C375AF
+:1048B0000000E50BF5F0E51235F0F50BE500F5F03D
+:1048C000E51335F0F500E50CF503E500F502E50B21
+:1048D000F582E502F583E503F0900000E582F5122C
+:1048E000900000E583F513900004E582F50990003F
+:1048F00004E583F50A750100C3750000E501F5F0D4
+:10490000E50935F0F501E500F5F0E50A35F0F500CB
+:10491000E500F502E501F582E502F583E0F50E75A7
+:104920000101C3750000E501F5F0E50935F0F50179
+:10493000E500F5F0E50A35F0F500E500F502E501E2
+:10494000F582E502F583E0F50F750102C3750000FD
+:10495000E501F5F0E50935F0F501E500F5F0E50ACA
+:1049600035F0F500E500F502E501F582E502F58395
+:10497000E0F510750103C3750000E501F5F0E509E8
+:1049800035F0F501E500F5F0E50A35F0F500E50054
+:10499000F502E501F582E502F583E0F511900008E6
+:1049A000E582F509900008E583F50A750100C375F5
+:1049B0000000E501F5F0E50935F0F501E500F5F059
+:1049C000E50A35F0F500E500F502E501F582E502BE
+:1049D000F583E0F50B750101C3750000E501F5F005
+:1049E000E50935F0F501E500F5F0E50A35F0F500EB
+:1049F000E500F502E501F582E502F583E0F50C75C9
+:104A00000102C3750000E501F5F0E50935F0F50197
+:104A1000E500F5F0E50A35F0F500E500F502E50101
+:104A2000F582E502F583E0F50D750103C37500001D
+:104A3000E501F5F0E50935F0F501E500F5F0E50AE9
+:104A400035F0F500E500F502E501F582E502F583B4
+:104A5000E0F500C3E50BF5F0E50E45F0F501E50CDA
+:104A6000F5F0E50F45F0F509E50DF5F0E51045F039
+:104A7000F50AE500F5F0E51145F0F50C750B00C3FE
+:104A8000750000E50BF5F0E51235F0F50BE500F5E6
+:104A9000F0E51335F0F500E501F503E500F502E575
+:104AA0000BF582E502F583E503F0750B01C3750094
+:104AB00000E50BF5F0E51235F0F50BE500F5F0E556
+:104AC0001335F0F500E509F503E500F502E50BF512
+:104AD00082E502F583E503F0750B02C3750000E57E
+:104AE0000BF5F0E51235F0F50BE500F5F0E51335C3
+:104AF000F0F500E50AF503E500F502E50BF582E5C2
+:104B000002F583E503F0750B03C3750000E50BF5B3
+:104B1000F0E51235F0F50BE500F5F0E51335F0F5AD
+:104B200000E50CF503E500F502E50BF582E502F57D
+:104B300083E503F090000CE582F51290000CE5830C
+:104B4000F513900008E582F509900008E583F50A61
+:104B5000750100C3750000E501F5F0E50935F0F5D4
+:104B600001E500F5F0E50A35F0F500E500F502E5B0
+:104B700001F582E502F583E0F50E750101C37500CC
+:104B800000E501F5F0E50935F0F501E500F5F0E5A2
+:104B90000A35F0F500E500F502E501F582E502F5DC
+:104BA00083E0F50F750102C3750000E501F5F0E53E
+:104BB0000935F0F501E500F5F0E50A35F0F500E519
+:104BC00000F502E501F582E502F583E0F5107501D7
+:104BD00003C3750000E501F5F0E50935F0F501E5E1
+:104BE00000F5F0E50A35F0F500E500F502E501F520
+:104BF00082E502F583E0F511900004E582F5099065
+:104C00000004E583F50A750100C3750000E501F5B0
+:104C1000F0E50935F0F501E500F5F0E50A35F0F5C8
+:104C200000E500F502E501F582E502F583E0F50B0C
+:104C3000750101C3750000E501F5F0E50935F0F5F2
+:104C400001E500F5F0E50A35F0F500E500F502E5CF
+:104C500001F582E502F583E0F50C750102C37500EC
+:104C600000E501F5F0E50935F0F501E500F5F0E5C1
+:104C70000A35F0F500E500F502E501F582E502F5FB
+:104C800083E0F50D750103C3750000E501F5F0E55E
+:104C90000935F0F501E500F5F0E50A35F0F500E538
+:104CA00000F502E501F582E502F583E0F500C3E5D4
+:104CB0000BF5F0E50E65F0F501E50CF5F0E50F6597
+:104CC000F0F509E50DF5F0E51065F0F50AE500F5FC
+:104CD000F0E51165F0F50C750B00C3750000E50BF0
+:104CE000F5F0E51235F0F50BE500F5F0E51335F0DC
+:104CF000F500E501F503E500F502E50BF582E502B7
+:104D0000F583E503F0750B01C3750000E50BF5F0C5
+:104D1000E51235F0F50BE500F5F0E51335F0F5009B
+:104D2000E509F503E500F502E50BF582E502F583FB
+:104D3000E503F0750B02C3750000E50BF5F0E51215
+:104D400035F0F50BE500F5F0E51335F0F500E50A73
+:104D5000F503E500F502E50BF582E502F583E503D1
+:104D6000F0750B03C3750000E50BF5F0E51235F0A7
+:104D7000F50BE500F5F0E51335F0F500E50CF5036E
+:104D8000E500F502E50BF582E502F583E503F09019
+:104D90000004E582F509900004E583F50A75010039
+:104DA000C3750000E501F5F0E50935F0F501E50012
+:104DB000F5F0E50A35F0F500E500F502E501F582CC
+:104DC000E502F583E0F51F750101C3750000E501FB
+:104DD000F5F0E50935F0F501E500F5F0E50A35F007
+:104DE000F500E500F502E501F582E502F583E0F561
+:104DF0001E750102C3750000E501F5F0E50935F007
+:104E0000F501E500F5F0E50A35F0F500E500F502FD
+:104E1000E501F582E502F583E0F51D750103C37533
+:104E20000000E501F5F0E50935F0F501E500F5F0E4
+:104E3000E50A35F0F500E500F502E501F582E50249
+:104E4000F583E0F51C900008E582F509900008E57F
+:104E500083F50A750100C3750000E501F5F0E50969
+:104E600035F0F501E500F5F0E50A35F0F500E5006F
+:104E7000F502E501F582E502F583E0F51B75010118
+:104E8000C3750000E501F5F0E50935F0F501E50031
+:104E9000F5F0E50A35F0F500E500F502E501F582EB
+:104EA000E502F583E0F51A750102C3750000E5011E
+:104EB000F5F0E50935F0F501E500F5F0E50A35F026
+:104EC000F500E500F502E501F582E502F583E0F580
+:104ED00019750103C3750000E501F5F0E50935F02A
+:104EE000F501E500F5F0E50A35F0F500E500F5021D
+:104EF000E501F582E502F583E0F518121F1DE58254
+:104F0000F502E583F503E500F504E501F505E502A5
+:104F1000F50BE503F50CE504F50DE505F50E900040
+:104F200000E582F509900000E583F50A750100C3EC
+:104F3000750000E501F5F0E50935F0F501E500F54E
+:104F4000F0E50A35F0F500E50BF503E500F502E5BF
+:104F500001F582E502F583E503F0750101C37500F3
+:104F600000E501F5F0E50935F0F501E500F5F0E5BE
+:104F70000A35F0F500E50CF503E500F502E501F56D
+:104F800082E502F583E503F0750102C3750000E5D3
+:104F900001F5F0E50935F0F501E500F5F0E50A3534
+:104FA000F0F500E50DF503E500F502E501F582E514
+:104FB00002F583E503F0750103C3750000E501F513
+:104FC000F0E50935F0F501E500F5F0E50A35F0F515
+:104FD00000E50EF503E500F502E501F582E502F5D1
+:104FE00083E503F0900004E582F509900004E58371
+:104FF000F50A750100C3750000E501F5F0E5093516
+:10500000F0F501E500F5F0E50A35F0F500E500F50D
+:1050100002E501F582E502F583E0F51F750101C3A4
+:10502000750000E501F5F0E50935F0F501E500F55D
+:10503000F0E50A35F0F500E500F502E501F582E559
+:1050400002F583E0F51E750102C3750000E501F568
+:10505000F0E50935F0F501E500F5F0E50A35F0F584
+:1050600000E500F502E501F582E502F583E0F51DB6
+:10507000750103C3750000E501F5F0E50935F0F5AC
+:1050800001E500F5F0E50A35F0F500E500F502E58B
+:1050900001F582E502F583E0F51C900008E582F554
+:1050A00009900008E583F50A750100C3750000E565
+:1050B00001F5F0E50935F0F501E500F5F0E50A3513
+:1050C000F0F500E500F502E501F582E502F583E083
+:1050D000F51B750101C3750000E501F5F0E5093523
+:1050E000F0F501E500F5F0E50A35F0F500E500F52D
+:1050F00002E501F582E502F583E0F51A750102C3C8
+:10510000750000E501F5F0E50935F0F501E500F57C
+:10511000F0E50A35F0F500E500F502E501F582E578
+:1051200002F583E0F519750103C3750000E501F58B
+:10513000F0E50935F0F501E500F5F0E50A35F0F5A3
+:1051400000E500F502E501F582E502F583E0F518DA
+:10515000121F1DE582F502E583F503E500F504E580
+:1051600001F505E502F50BE503F50CE504F50DE5A4
+:1051700005F50E900000E582F509900000E583F545
+:105180000A750100C3750000E501F5F0E50935F089
+:10519000F501E500F5F0E50A35F0F500E50BF5035E
+:1051A000E500F502E501F582E502F583E503F0751A
+:1051B0000101C3750000E501F5F0E50935F0F501E1
+:1051C000E500F5F0E50A35F0F500E50CF503E5003E
+:1051D000F502E501F582E502F583E503F0750102CC
+:1051E000C3750000E501F5F0E50935F0F501E500CE
+:1051F000F5F0E50A35F0F500E50DF503E500F502FB
+:10520000E501F582E502F583E503F0750103C37559
+:105210000000E501F5F0E50935F0F501E500F5F0F0
+:10522000E50A35F0F500E50EF503E500F502E501C8
+:10523000F582E502F583E503F0900008E582F509C3
+:10524000900008E583F50A750100C3750000E501CB
+:10525000F5F0E50935F0F501E500F5F0E50A35F082
+:10526000F500E500F502E501F582E502F583E0F5DC
+:105270001F750101C3750000E501F5F0E50935F082
+:10528000F501E500F5F0E50A35F0F500E500F50279
+:10529000E501F582E502F583E0F51E750102C375AF
+:1052A0000000E501F5F0E50935F0F501E500F5F060
+:1052B000E50A35F0F500E500F502E501F582E502C5
+:1052C000F583E0F51D750103C3750000E501F5F0F8
+:1052D000E50935F0F501E500F5F0E50A35F0F500F2
+:1052E000E500F502E501F582E502F583E0F51C90A5
+:1052F0000004E582F509900004E583F50A750100D4
+:10530000C3750000E501F5F0E50935F0F501E500AC
+:10531000F5F0E50A35F0F500E500F502E501F58266
+:10532000E502F583E0F51B750101C3750000E50199
+:10533000F5F0E50935F0F501E500F5F0E50A35F0A1
+:10534000F500E500F502E501F582E502F583E0F5FB
+:105350001A750102C3750000E501F5F0E50935F0A5
+:10536000F501E500F5F0E50A35F0F500E500F50298
+:10537000E501F582E502F583E0F519750103C375D2
+:105380000000E501F5F0E50935F0F501E500F5F07F
+:10539000E50A35F0F500E500F502E501F582E502E4
+:1053A000F583E0F518121764E582F502E583F5034D
+:1053B000E500F504E501F505E502F50BE503F50C5F
+:1053C000E504F50DE505F50E90000CE582F5099074
+:1053D000000CE583F50A750100C3750000E501F5D1
+:1053E000F0E50935F0F501E500F5F0E50A35F0F5F1
+:1053F00000E50BF503E500F502E501F582E502F5B0
+:1054000083E503F0750101C3750000E501F5F0E5E2
+:105410000935F0F501E500F5F0E50A35F0F500E5B0
+:105420000CF503E500F502E501F582E502F583E5FB
+:1054300003F0750102C3750000E501F5F0E50935DB
+:10544000F0F501E500F5F0E50A35F0F500E50DF5BC
+:1054500003E500F502E501F582E502F583E503F0D9
+:10546000750103C3750000E501F5F0E50935F0F5B8
+:1054700001E500F5F0E50A35F0F500E50EF503E588
+:1054800000F502E501F582E502F583E503F0900001
+:1054900008E582F509900008E583F50A750100C367
+:1054A000750000E501F5F0E50935F0F501E500F5D9
+:1054B000F0E50A35F0F500E500F502E501F582E5D5
+:1054C00002F583E0F51F750101C3750000E501F5E4
+:1054D000F0E50935F0F501E500F5F0E50A35F0F500
+:1054E00000E500F502E501F582E502F583E0F51E31
+:1054F000750102C3750000E501F5F0E50935F0F529
+:1055000001E500F5F0E50A35F0F500E500F502E506
+:1055100001F582E502F583E0F51D750103C3750011
+:1055200000E501F5F0E50935F0F501E500F5F0E5F8
+:105530000A35F0F500E500F502E501F582E502F532
+:1055400083E0F51C900004E582F509900004E583F2
+:10555000F50A750100C3750000E501F5F0E50935B0
+:10556000F0F501E500F5F0E50A35F0F500E500F5A8
+:1055700002E501F582E502F583E0F51B750101C343
+:10558000750000E501F5F0E50935F0F501E500F5F8
+:10559000F0E50A35F0F500E500F502E501F582E5F4
+:1055A00002F583E0F51A750102C3750000E501F507
+:1055B000F0E50935F0F501E500F5F0E50A35F0F51F
+:1055C00000E500F502E501F582E502F583E0F51955
+:1055D000750103C3750000E501F5F0E50935F0F547
+:1055E00001E500F5F0E50A35F0F500E500F502E526
+:1055F00001F582E502F583E0F518121764E582F5FE
+:1056000002E583F503E500F504E501F505E502F59E
+:105610000BE503F50CE504F50DE505F50E90000C22
+:10562000E582F50990000CE583F50A750100C37564
+:105630000000E501F5F0E50935F0F501E500F5F0CC
+:10564000E50A35F0F500E50BF503E500F502E501A7
+:10565000F582E502F583E503F0750101C3750000ED
+:10566000E501F5F0E50935F0F501E500F5F0E50AAD
+:1056700035F0F500E50CF503E500F502E501F582EE
+:10568000E502F583E503F0750102C3750000E5014D
+:10569000F5F0E50935F0F501E500F5F0E50A35F03E
+:1056A000F500E50DF503E500F502E501F582E502FB
+:1056B000F583E503F0750103C3750000E501F5F01E
+:1056C000E50935F0F501E500F5F0E50A35F0F500FE
+:1056D000E50EF503E500F502E501F582E502F58347
+:1056E000E503F0750000E500F502E500F503E500CF
+:1056F000F504E500F50575E0052506F58275E00081
+:105700003507F583E0F51375E0042506F58275E0AD
+:10571000003507F583E0F51275E0032506F582757F
+:10572000E0003507F583E0F51175E0022506F58206
+:1057300075E0003507F583E0F51075E0002506F506
+:105740008275E0003507F583E0F508E508C0E075EF
+:10575000E0012506F58275E0003507F583E0F508E0
+:10576000E508C0E075E0062506F50675E00035079A
+:10577000F507E502F582E503F583E504F500E505A7
+:10578000F501220000000000000000000000000001
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-maltivec" { target powerpc-*-* } } */
+
+__attribute__ ((vector_size (2))) signed char v1, v2, v3;
+void
+one (void)
+{
+ v1 = v2 + v3;
+}
+
+__attribute__ ((vector_size (8))) signed char v4, v5, v6;
+void
+two (void)
+{
+ v4 = v5 + v6;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-maltivec" { target powerpc-*-* } } */
+
+__attribute__ ((vector_size (2))) signed char v1, v2, v3;
+void
+one (void)
+{
+ v1 = v2 + v3;
+}
+
+__attribute__ ((vector_size (8))) signed char v4, v5, v6;
+void
+two (void)
+{
+ v4 = v5 + v6;
+}
--- /dev/null
+:1000000000D0E0F518D0E0F519E511F50EE510F592
+:100010000F900000E582F50C900000E583F50D904F
+:100020000001E582F509900001E583F50A750100FC
+:10003000C3750000E501F5F0E50935F0F501E500CF
+:10004000F5F0E50A35F0F500E500F502E501F58289
+:10005000E502F583E0F50B900002E582F5099000DA
+:1000600002E583F50A750100C3750000E501F5F0AE
+:10007000E50935F0F501E500F5F0E50A35F0F500A4
+:10008000E500F502E501F582E502F583E0F500C340
+:10009000750100E500F5F0E50B35F0F50975010097
+:1000A000C3750000E501F5F0E50C35F0F501E5005C
+:1000B000F5F0E50D35F0F500E509F503E500F5028D
+:1000C000E501F582E502F583E503F0750000E50042
+:1000D000F502E500F503E500F504E500F505E50E9C
+:1000E000F511E50FF510E519C0E0E518C0E0E502EF
+:1000F000F582E503F583E504F500E505F501220049
+:10010000D0E0F518D0E0F519E511F50EE510F50F82
+:10011000900003E582F50C900003E583F50D900057
+:1001200004E582F509900004E583F50A750100C332
+:10013000750000E501F5F0E50935F0F501E500F59C
+:10014000F0E50A35F0F500E500F502E501F582E598
+:1001500002F583E0F50B900005E582F509900005B6
+:10016000E583F50A750100C3750000E501F5F0E5CA
+:100170000935F0F501E500F5F0E50A35F0F500E5A3
+:1001800000F502E501F582E502F583E0F500C375AF
+:100190000100E500F5F0E50B35F0F509750100C348
+:1001A000750000E501F5F0E50C35F0F501E500F529
+:1001B000F0E50D35F0F500E509F503E500F502E59C
+:1001C00001F582E502F583E503F0750000E500F531
+:1001D00002E500F503E500F504E500F505E50EF59B
+:1001E00011E50FF510E519C0E0E518C0E0E502F5EE
+:1001F00082E503F583E504F500E505F5012200003D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR optimization/10876 */
+/* { dg-do compile { target sparc*-*-* } } */
+
+/* Verify that adding the constant 4096 is turned
+ into substracting the constant -4096. */
+
+int foo(int a)
+{
+ return a+4096;
+}
+
+/* { dg-final { scan-assembler "sub" } } */
--- /dev/null
+/* PR optimization/10876 */
+/* { dg-do compile { target sparc*-*-* } } */
+
+/* Verify that adding the constant 4096 is turned
+ into substracting the constant -4096. */
+
+int foo(int a)
+{
+ return a+4096;
+}
+
+/* { dg-final { scan-assembler "sub" } } */
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F50ED0E0F50FE512F50B6E
+:10002000E511F50CE510F50D750000750110750969
+:1000300000750A00C3751000E500F5F0E51F35F006
+:10004000F500E501F5F0E51E35F0F501E509F5F0FF
+:10005000E51D35F0F509E50AF5F0E51C35F0F50A82
+:10006000E500F502E501F503E509F504E50AF50506
+:10007000E50BF512E50CF511E50DF510E50FC0E007
+:10008000E50EC0E075E0042506F50675E0003507CD
+:10009000F507E502F582E503F583E504F500E505DE
+:1000A000F501220000000000000000000000000038
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostics for empty structures and unions. Test with no
+ special options. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct s0 {};
+union u0 {};
+struct s1 { int : 1; };
+union u1 { int : 1; };
--- /dev/null
+/* Test diagnostics for empty structures and unions. Test with no
+ special options. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct s0 {};
+union u0 {};
+struct s1 { int : 1; };
+union u1 { int : 1; };
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostics for empty structures and unions. Test with
+ -pedantic. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic" } */
+
+struct s0 {}; /* { dg-warning "warning: struct has no members" } */
+union u0 {}; /* { dg-warning "warning: union has no members" } */
+struct s1 { int : 1; }; /* { dg-warning "warning: struct has no named members" } */
+union u1 { int : 1; }; /* { dg-warning "warning: union has no named members" } */
--- /dev/null
+/* Test diagnostics for empty structures and unions. Test with
+ -pedantic. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic" } */
+
+struct s0 {}; /* { dg-warning "warning: struct has no members" } */
+union u0 {}; /* { dg-warning "warning: union has no members" } */
+struct s1 { int : 1; }; /* { dg-warning "warning: struct has no named members" } */
+union u1 { int : 1; }; /* { dg-warning "warning: union has no named members" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test diagnostics for empty structures and unions. Test with
+ -pedantic-errors. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors" } */
+
+struct s0 {}; /* { dg-error "error: struct has no members" } */
+union u0 {}; /* { dg-error "error: union has no members" } */
+struct s1 { int : 1; }; /* { dg-error "error: struct has no named members" } */
+union u1 { int : 1; }; /* { dg-error "error: union has no named members" } */
--- /dev/null
+/* Test diagnostics for empty structures and unions. Test with
+ -pedantic-errors. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors" } */
+
+struct s0 {}; /* { dg-error "error: struct has no members" } */
+union u0 {}; /* { dg-error "error: union has no members" } */
+struct s1 { int : 1; }; /* { dg-error "error: struct has no named members" } */
+union u1 { int : 1; }; /* { dg-error "error: union has no named members" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Simplified by Alexandre Oliva <oliva@lsd.ic.unicamp.br>
+ from bug report by Helmut Jarausch <jarausch@igpm.rwth-aachen.de>
+
+ Copyright (C) 1999 Free Software Foundation */
+
+/* { dg-do compile } */
+/* { dg-options "-O3 -w" } */
+
+struct {
+ unsigned i[4];
+} foo() {}
+
+void bar() {
+ foo();
+}
--- /dev/null
+/* Simplified by Alexandre Oliva <oliva@lsd.ic.unicamp.br>
+ from bug report by Helmut Jarausch <jarausch@igpm.rwth-aachen.de>
+
+ Copyright (C) 1999 Free Software Foundation */
+
+/* { dg-do compile } */
+/* { dg-options "-O3 -w" } */
+
+struct {
+ unsigned i[4];
+} foo() {}
+
+void bar() {
+ foo();
+}
--- /dev/null
+:1000000000E506758202C39582F506E50775830053
+:100010009583F507D0E0F500D0E0F501750900E51E
+:1000200009F502E509F503E509F504E509F505E536
+:1000300001C0E0E500C0E075E0022506F50675E0C8
+:10004000003507F507E502F582E503F583E504F5DC
+:1000500000E505F5012200E506758212C39582F5DB
+:1000600006E5077583009583F507D0E0F50875E090
+:10007000112506F58275E0003507F583E508F0D017
+:10008000E0F50875E0102506F58275E0003507F506
+:1000900083E508F0E506F509E507F50A750100C3F3
+:1000A000750000E501F5F0E50935F0F501E500F52D
+:1000B000F0E50A35F0F500E501F51FE500F51E1243
+:1000C0000000750000E500F502E500F503E500F528
+:1000D00004E500F50575E0102506F58275E00035AC
+:1000E00007F583E0F508E508C0E075E0112506F5A1
+:1000F0008275E0003507F583E0F508E508C0E07596
+:10010000E0122506F50675E0003507F507E502F56E
+:1001100082E503F583E504F500E505F5012200001D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target rs6000-*-linux* powerpc-*-linux*} } */
+/* { dg-options "-fpic -O2" } */
+
+void f (char *s)
+{
+ for (;;)
+ {
+ int t = 6;
+ switch (t)
+ {
+ case 2:
+ *s = '2';
+ case 6: case 4: case 3: case 1:
+ break;
+ }
+ }
+}
--- /dev/null
+/* { dg-do compile { target rs6000-*-linux* powerpc-*-linux*} } */
+/* { dg-options "-fpic -O2" } */
+
+void f (char *s)
+{
+ for (;;)
+ {
+ int t = 6;
+ switch (t)
+ {
+ case 2:
+ *s = '2';
+ case 6: case 4: case 3: case 1:
+ break;
+ }
+ }
+}
--- /dev/null
+:1000000000E506758202C39582F506E50775830053
+:100010009583F507D0E0F519D0E0F51AE510F5184D
+:10002000750001750100750900750A00750C01C3A2
+:10003000750B00E500F5F0E50B95F0F50B750B0081
+:10004000E50BF5F0E50B35F0F50BE50BF5F0E50C00
+:1000500065F0F50CC3750B00E501F5F0E50B95F0C7
+:10006000F50B750B00E50BF5F0E50B35F0F50BE541
+:100070000BF5F0E50C65F0F50CC3750B00E509F523
+:10008000F0E50B95F0F50B750B00E50BF5F0E50BC6
+:1000900035F0F50BE50BF5F0E50C65F0F50CC375E7
+:1000A0000B00E50AF5F0E50B95F0F50B750B00E597
+:1000B0000BF5F0E50B35F0F50BE50BF5F0E50C6510
+:1000C000F0F50C750100750900750A00750000E572
+:1000D0000CF5F0E50045F0F500E501F5F0E500452B
+:1000E000F0F500E509F5F0E50045F0F500E50AF565
+:1000F000F0E50045F0F500E500700280030207B569
+:1001000000750D06750E00750F0075100075000264
+:10011000750100750900750A00750C00C3E500F54E
+:10012000F0E50D95F0F500E500F5F0E50C45F0F58E
+:100130000CC3E501F5F0E50E95F0F500E500F5F0EE
+:10014000E50C45F0F50CC3E509F5F0E50F95F0F584
+:1001500000E500F5F0E50C45F0F50CC3E50AF5F017
+:10016000E51095F0F500E500F5F0E50C45F0F50C2F
+:10017000750100750900750A00E50CF500750C01A4
+:10018000C3750B00E500F5F0E50B95F0F50B750B6D
+:1001900000E50BF5F0E50B35F0F50BE50BF5F0E5BB
+:1001A0000C65F0F50CC3750B00E501F5F0E50B955A
+:1001B000F0F50B750B00E50BF5F0E50B35F0F50BE5
+:1001C000E50BF5F0E50C65F0F50CC3750B00E509E2
+:1001D000F5F0E50B95F0F50B750B00E50BF5F0E58B
+:1001E0000B35F0F50BE50BF5F0E50C65F0F50CC300
+:1001F000750B00E50AF5F0E50B95F0F50B750B00B6
+:10020000E50BF5F0E50B35F0F50BE50BF5F0E50C3E
+:1002100065F0F50C750100750900750A00750000A0
+:10022000E50CF5F0E50045F0F500E501F5F0E50039
+:1002300045F0F500E509F5F0E50045F0F500E50AC3
+:10024000F5F0E50045F0F500E500700280030207D7
+:100250007F00750006750100750900750A00750CB0
+:1002600000C3E500F5F0E50D95F0F500E500F5F0CB
+:10027000E50C45F0F50CC3E501F5F0E50E95F0F55C
+:1002800000E500F5F0E50C45F0F50CC3E509F5F0E7
+:10029000E50F95F0F500E500F5F0E50C45F0F50CFF
+:1002A000C3E50AF5F0E51095F0F500E500F5F0E599
+:1002B0000C45F0F50C750100750900750A00E50C98
+:1002C000F500750C01C3750B00E500F5F0E50B9525
+:1002D000F0F50B750B00E50BF5F0E50B35F0F50BC4
+:1002E000E50BF5F0E50C65F0F50CC3750B00E501C9
+:1002F000F5F0E50B95F0F50B750B00E50BF5F0E56A
+:100300000B35F0F50BE50BF5F0E50C65F0F50CC3DE
+:10031000750B00E509F5F0E50B95F0F50B750B0095
+:10032000E50BF5F0E50B35F0F50BE50BF5F0E50C1D
+:1003300065F0F50CC3750B00E50AF5F0E50B95F0DB
+:10034000F50B750B00E50BF5F0E50B35F0F50BE55E
+:100350000BF5F0E50C65F0F50C75010075090075FD
+:100360000A00750000E50CF5F0E50045F0F500E544
+:1003700001F5F0E50045F0F500E509F5F0E500458B
+:10038000F0F500E50AF5F0E50045F0F500E5007050
+:1003900002800302077A00750004750100750900E8
+:1003A000750A00750C00C3E500F5F0E50D95F0F554
+:1003B00000E500F5F0E50C45F0F50CC3E501F5F0BE
+:1003C000E50E95F0F500E500F5F0E50C45F0F50CCF
+:1003D000C3E509F5F0E50F95F0F500E500F5F0E56A
+:1003E0000C45F0F50CC3E50AF5F0E51095F0F500C5
+:1003F000E500F5F0E50C45F0F50C75010075090018
+:10040000750A00E50CF500750C01C3750B00E500DD
+:10041000F5F0E50B95F0F50B750B00E50BF5F0E548
+:100420000B35F0F50BE50BF5F0E50C65F0F50CC3BD
+:10043000750B00E501F5F0E50B95F0F50B750B007C
+:10044000E50BF5F0E50B35F0F50BE50BF5F0E50CFC
+:1004500065F0F50CC3750B00E509F5F0E50B95F0BB
+:10046000F50B750B00E50BF5F0E50B35F0F50BE53D
+:100470000BF5F0E50C65F0F50CC3750B00E50AF51E
+:10048000F0E50B95F0F50B750B00E50BF5F0E50BC2
+:1004900035F0F50BE50BF5F0E50C65F0F50C7501A5
+:1004A00000750900750A00750000E50CF5F0E5001F
+:1004B00045F0F500E501F5F0E50045F0F500E5094A
+:1004C000F5F0E50045F0F500E50AF5F0E50045F04A
+:1004D000F500E500700280030207750075000375E2
+:1004E0000100750900750A00750C00C3E500F5F000
+:1004F000E50D95F0F500E500F5F0E50C45F0F50C9F
+:10050000C3E501F5F0E50E95F0F500E500F5F0E541
+:100510000C45F0F50CC3E509F5F0E50F95F0F50095
+:10052000E500F5F0E50C45F0F50CC3E50AF5F0E55E
+:100530001095F0F500E500F5F0E50C45F0F50C75CB
+:100540000100750900750A00E50CF500750C01C382
+:10055000750B00E500F5F0E50B95F0F50B750B005C
+:10056000E50BF5F0E50B35F0F50BE50BF5F0E50CDB
+:1005700065F0F50CC3750B00E501F5F0E50B95F0A2
+:10058000F50B750B00E50BF5F0E50B35F0F50BE51C
+:100590000BF5F0E50C65F0F50CC3750B00E509F5FE
+:1005A000F0E50B95F0F50B750B00E50BF5F0E50BA1
+:1005B00035F0F50BE50BF5F0E50C65F0F50CC375C2
+:1005C0000B00E50AF5F0E50B95F0F50B750B00E572
+:1005D0000BF5F0E50B35F0F50BE50BF5F0E50C65EB
+:1005E000F0F50C750100750900750A00750000E54D
+:1005F0000CF5F0E50045F0F500E501F5F0E5004506
+:10060000F0F500E509F5F0E50045F0F500E50AF53F
+:10061000F0E50045F0F500E5007002800302077088
+:1006200000750001750100750900750A00750B0061
+:10063000C3E500F5F0E50D95F0F500E500F5F0E512
+:100640000B45F0F50BC3E501F5F0E50E95F0F5006F
+:10065000E500F5F0E50B45F0F50BC3E509F5F0E530
+:100660000F95F0F500E500F5F0E50B45F0F50BC34F
+:10067000E50AF5F0E51095F0F500E500F5F0E50B7D
+:1006800045F0F50B750100750900750A00E50BF5DD
+:1006900000750B01C3750C00E500F5F0E50C95F055
+:1006A000F50C750C00E50CF5F0E50C35F0F50CE5F6
+:1006B0000CF5F0E50B65F0F50BC3750C00E501F5E5
+:1006C000F0E50C95F0F50C750C00E50CF5F0E50C7B
+:1006D00035F0F50CE50CF5F0E50B65F0F50BC375A1
+:1006E0000C00E509F5F0E50C95F0F50C750C00E54E
+:1006F0000CF5F0E50C35F0F50CE50CF5F0E50B65C7
+:10070000F0F50BC3750C00E50AF5F0E50C95F0F576
+:100710000C750C00E50CF5F0E50C35F0F50CE50C6E
+:10072000F5F0E50B65F0F50B750100750900750A2C
+:1007300000750000E50BF5F0E50045F0F500E5017A
+:10074000F5F0E50045F0F500E509F5F0E50045F0C8
+:10075000F500E50AF5F0E50045F0F500E50070026A
+:10076000800302076B000000020020000002076700
+:10077000000002076C00000207710000020776000B
+:1007800000750932750100C3750000E501F5F0E55B
+:100790001F35F0F501E500F5F0E51E35F0F500E553
+:1007A00009F503E500F502E501F582E502F583E5CB
+:1007B00003F002077B00750000E500F502E500F597
+:1007C00003E500F504E500F505E518F510E51AC0A8
+:1007D000E0E519C0E075E0022506F50675E0003594
+:1007E00007F507E502F582E503F583E504F500E585
+:1007F00005F50122000000000000000000000000DC
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR middle-end/17657 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+extern signed char foo(int);
+
+void bar (void)
+{
+ signed char tmp = foo (0);
+ int t1 = tmp;
+ switch (t1)
+ {
+ case 1: foo (1); break;
+ case 2: foo (2); break;
+ case 3: foo (3); break;
+ case 4: foo (4); break;
+ case 5: foo (5); break;
+ case 6: foo (6); break;
+ case 7: foo (7); break;
+ case 255: foo (8); break;
+ default: break;
+ }
+}
+
--- /dev/null
+/* PR middle-end/17657 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+extern signed char foo(int);
+
+void bar (void)
+{
+ signed char tmp = foo (0);
+ int t1 = tmp;
+ switch (t1)
+ {
+ case 1: foo (1); break;
+ case 2: foo (2); break;
+ case 3: foo (3); break;
+ case 4: foo (4); break;
+ case 5: foo (5); break;
+ case 6: foo (6); break;
+ case 7: foo (7); break;
+ case 255: foo (8); break;
+ default: break;
+ }
+}
+
--- /dev/null
+:100000000000E506758203C39582F506E507758352
+:10001000009583F507D0E0F50875E0012506F58227
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000002506F58275E0003507F583E508F075C3
+:10004000E0022506F58275E0003507F583E510F03E
+:10005000751F00751E00751D00751C00E582F502F8
+:10006000E502F50D750080E50DF5F0E50055F0F5BC
+:1000700010E500F5F0E51084F5107500FFE500F5DA
+:10008000F0E510A4F510E510F50EE510F50F75007C
+:1000900001750100750900750A00750C00C3E500C3
+:1000A000F5F0E50D95F0F500E500F5F0E50C45F00F
+:1000B000F50CC3E501F5F0E50E95F0F500E500F56A
+:1000C000F0E50C45F0F50CC3E509F5F0E50F95F00A
+:1000D000F500E500F5F0E50C45F0F50CC3E50AF593
+:1000E000F0E51095F0F500E500F5F0E50C45F0F5CC
+:1000F0000C750100750900750A00E50CF500750C1A
+:1001000001C3750B00E500F5F0E50B95F0F50B75F7
+:100110000B00E50BF5F0E50B35F0F50BE50BF5F015
+:10012000E50C65F0F50CC3750B00E501F5F0E50B8A
+:1001300095F0F50B750B00E50BF5F0E50B35F0F5DB
+:100140000BE50BF5F0E50C65F0F50CC3750B00E560
+:1001500009F5F0E50B95F0F50B750B00E50BF5F0E7
+:10016000E50B35F0F50BE50BF5F0E50C65F0F50C5E
+:10017000C3750B00E50AF5F0E50B95F0F50B750B73
+:1001800000E50BF5F0E50B35F0F50BE50BF5F0E5CB
+:100190000C65F0F50C750100750900750A00750015
+:1001A00000E50CF5F0E50045F0F500E501F5F0E5BA
+:1001B0000045F0F500E509F5F0E50045F0F500E54E
+:1001C0000AF5F0E50045F0F500E500700280030255
+:1001D0000B9C00750002750100750900750A007519
+:1001E0000C00C3E500F5F0E50D95F0F500E500F530
+:1001F000F0E50C45F0F50CC3E501F5F0E50E95F0E2
+:10020000F500E500F5F0E50C45F0F50CC3E509F562
+:10021000F0E50F95F0F500E500F5F0E50C45F0F59B
+:100220000CC3E50AF5F0E51095F0F500E500F5F0F2
+:10023000E50C45F0F50C750100750900750A00E53F
+:100240000CF500750C01C3750B00E500F5F0E50B2E
+:1002500095F0F50B750B00E50BF5F0E50B35F0F5BA
+:100260000BE50BF5F0E50C65F0F50CC3750B00E53F
+:1002700001F5F0E50B95F0F50B750B00E50BF5F0CE
+:10028000E50B35F0F50BE50BF5F0E50C65F0F50C3D
+:10029000C3750B00E509F5F0E50B95F0F50B750B53
+:1002A00000E50BF5F0E50B35F0F50BE50BF5F0E5AA
+:1002B0000C65F0F50CC3750B00E50AF5F0E50B9540
+:1002C000F0F50B750B00E50BF5F0E50B35F0F50BD4
+:1002D000E50BF5F0E50C65F0F50C7501007509000E
+:1002E000750A00750000E50CF5F0E50045F0F50035
+:1002F000E501F5F0E50045F0F500E509F5F0E5006C
+:1003000045F0F500E50AF5F0E50045F0F500E500FB
+:1003100070028003020B8B007500037501007509E4
+:1003200000750A00750C00C3E500F5F0E50D95F0C9
+:10033000F500E500F5F0E50C45F0F50CC3E501F539
+:10034000F0E50E95F0F500E500F5F0E50C45F0F56B
+:100350000CC3E509F5F0E50F95F0F500E500F5F0C3
+:10036000E50C45F0F50CC3E50AF5F0E51095F0F560
+:1003700000E500F5F0E50C45F0F50C750100750998
+:1003800000750A00E50CF500750C01C3750B00E55E
+:1003900000F5F0E50B95F0F50B750B00E50BF5F0AE
+:1003A000E50B35F0F50BE50BF5F0E50C65F0F50C1C
+:1003B000C3750B00E501F5F0E50B95F0F50B750B3A
+:1003C00000E50BF5F0E50B35F0F50BE50BF5F0E589
+:1003D0000C65F0F50CC3750B00E509F5F0E50B9520
+:1003E000F0F50B750B00E50BF5F0E50B35F0F50BB3
+:1003F000E50BF5F0E50C65F0F50CC3750B00E50AAF
+:10040000F5F0E50B95F0F50B750B00E50BF5F0E558
+:100410000B35F0F50BE50BF5F0E50C65F0F50C751B
+:100420000100750900750A00750000E50CF5F0E59E
+:100430000045F0F500E501F5F0E50045F0F500E5D3
+:1004400009F5F0E50045F0F500E50AF5F0E50045B1
+:10045000F0F500E50070028003020B7A00750004DD
+:10046000750100750900750A00750C00C3E500F5FB
+:10047000F0E50D95F0F500E500F5F0E50C45F0F53B
+:100480000CC3E501F5F0E50E95F0F500E500F5F09B
+:10049000E50C45F0F50CC3E509F5F0E50F95F0F531
+:1004A00000E500F5F0E50C45F0F50CC3E50AF5F0C4
+:1004B000E51095F0F500E500F5F0E50C45F0F50CDC
+:1004C000750100750900750A00E50CF500750C0151
+:1004D000C3750B00E500F5F0E50B95F0F50B750B1A
+:1004E00000E50BF5F0E50B35F0F50BE50BF5F0E568
+:1004F0000C65F0F50CC3750B00E501F5F0E50B9507
+:10050000F0F50B750B00E50BF5F0E50B35F0F50B91
+:10051000E50BF5F0E50C65F0F50CC3750B00E5098E
+:10052000F5F0E50B95F0F50B750B00E50BF5F0E537
+:100530000B35F0F50BE50BF5F0E50C65F0F50CC3AC
+:10054000750B00E50AF5F0E50B95F0F50B750B0062
+:10055000E50BF5F0E50B35F0F50BE50BF5F0E50CEB
+:1005600065F0F50C750100750900750A007500004D
+:10057000E50CF5F0E50045F0F500E501F5F0E500E6
+:1005800045F0F500E509F5F0E50045F0F500E50A70
+:10059000F5F0E50045F0F500E50070028003020B80
+:1005A0006900750005750100750900750A00750C74
+:1005B00000C3E500F5F0E50D95F0F500E500F5F078
+:1005C000E50C45F0F50CC3E501F5F0E50E95F0F509
+:1005D00000E500F5F0E50C45F0F50CC3E509F5F094
+:1005E000E50F95F0F500E500F5F0E50C45F0F50CAC
+:1005F000C3E50AF5F0E51095F0F500E500F5F0E546
+:100600000C45F0F50C750100750900750A00E50C44
+:10061000F500750C01C3750B00E500F5F0E50B95D1
+:10062000F0F50B750B00E50BF5F0E50B35F0F50B70
+:10063000E50BF5F0E50C65F0F50CC3750B00E50175
+:10064000F5F0E50B95F0F50B750B00E50BF5F0E516
+:100650000B35F0F50BE50BF5F0E50C65F0F50CC38B
+:10066000750B00E509F5F0E50B95F0F50B750B0042
+:10067000E50BF5F0E50B35F0F50BE50BF5F0E50CCA
+:1006800065F0F50CC3750B00E50AF5F0E50B95F088
+:10069000F50B750B00E50BF5F0E50B35F0F50BE50B
+:1006A0000BF5F0E50C65F0F50C75010075090075AA
+:1006B0000A00750000E50CF5F0E50045F0F500E5F1
+:1006C00001F5F0E50045F0F500E509F5F0E5004538
+:1006D000F0F500E50AF5F0E50045F0F500E50070FD
+:1006E000028003020B5800750006750100750900B1
+:1006F000750A00750C00C3E500F5F0E50D95F0F501
+:1007000000E500F5F0E50C45F0F50CC3E501F5F06A
+:10071000E50E95F0F500E500F5F0E50C45F0F50C7B
+:10072000C3E509F5F0E50F95F0F500E500F5F0E516
+:100730000C45F0F50CC3E50AF5F0E51095F0F50071
+:10074000E500F5F0E50C45F0F50C750100750900C4
+:10075000750A00E50CF500750C01C3750B00E5008A
+:10076000F5F0E50B95F0F50B750B00E50BF5F0E5F5
+:100770000B35F0F50BE50BF5F0E50C65F0F50CC36A
+:10078000750B00E501F5F0E50B95F0F50B750B0029
+:10079000E50BF5F0E50B35F0F50BE50BF5F0E50CA9
+:1007A00065F0F50CC3750B00E509F5F0E50B95F068
+:1007B000F50B750B00E50BF5F0E50B35F0F50BE5EA
+:1007C0000BF5F0E50C65F0F50CC3750B00E50AF5CB
+:1007D000F0E50B95F0F50B750B00E50BF5F0E50B6F
+:1007E00035F0F50BE50BF5F0E50C65F0F50C750152
+:1007F00000750900750A00750000E50CF5F0E500CC
+:1008000045F0F500E501F5F0E50045F0F500E509F6
+:10081000F5F0E50045F0F500E50AF5F0E50045F0F6
+:10082000F500E50070028003020B470075000775B4
+:100830000100750900750A00750C00C3E500F5F0AC
+:10084000E50D95F0F500E500F5F0E50C45F0F50C4B
+:10085000C3E501F5F0E50E95F0F500E500F5F0E5EE
+:100860000C45F0F50CC3E509F5F0E50F95F0F50042
+:10087000E500F5F0E50C45F0F50CC3E50AF5F0E50B
+:100880001095F0F500E500F5F0E50C45F0F50C7578
+:100890000100750900750A00E50CF500750C01C32F
+:1008A000750B00E500F5F0E50B95F0F50B750B0009
+:1008B000E50BF5F0E50B35F0F50BE50BF5F0E50C88
+:1008C00065F0F50CC3750B00E501F5F0E50B95F04F
+:1008D000F50B750B00E50BF5F0E50B35F0F50BE5C9
+:1008E0000BF5F0E50C65F0F50CC3750B00E509F5AB
+:1008F000F0E50B95F0F50B750B00E50BF5F0E50B4E
+:1009000035F0F50BE50BF5F0E50C65F0F50CC3756E
+:100910000B00E50AF5F0E50B95F0F50B750B00E51E
+:100920000BF5F0E50B35F0F50BE50BF5F0E50C6597
+:10093000F0F50C750100750900750A00750000E5F9
+:100940000CF5F0E50045F0F500E501F5F0E50045B2
+:10095000F0F500E509F5F0E50045F0F500E50AF5EC
+:10096000F0E50045F0F500E50070028003020B366B
+:10097000007500FF750100750900750A00750B0010
+:10098000C3E500F5F0E50D95F0F500E500F5F0E5BF
+:100990000B45F0F50BC3E501F5F0E50E95F0F5001C
+:1009A000E500F5F0E50B45F0F50BC3E509F5F0E5DD
+:1009B0000F95F0F500E500F5F0E50B45F0F50BC3FC
+:1009C000E50AF5F0E51095F0F500E500F5F0E50B2A
+:1009D00045F0F50B750100750900750A00E50BF58A
+:1009E00000750B01C3750C00E500F5F0E50C95F002
+:1009F000F50C750C00E50CF5F0E50C35F0F50CE5A3
+:100A00000CF5F0E50B65F0F50BC3750C00E501F591
+:100A1000F0E50C95F0F50C750C00E50CF5F0E50C27
+:100A200035F0F50CE50CF5F0E50B65F0F50BC3754D
+:100A30000C00E509F5F0E50C95F0F50C750C00E5FA
+:100A40000CF5F0E50C35F0F50CE50CF5F0E50B6573
+:100A5000F0F50BC3750C00E50AF5F0E50C95F0F523
+:100A60000C750C00E50CF5F0E50C35F0F50CE50C1B
+:100A7000F5F0E50B65F0F50B750100750900750AD9
+:100A800000750000E50BF5F0E50045F0F500E50127
+:100A9000F5F0E50045F0F500E509F5F0E50045F075
+:100AA000F500E50AF5F0E50045F0F500E500700217
+:100AB0008003020B25000000750000E500F502E54B
+:100AC00000F503E500F504E500F50575E0022506EF
+:100AD000F58275E0003507F583E0F51075E0002537
+:100AE00006F58275E0003507F583E0F508E508C0F6
+:100AF000E075E0012506F58275E0003507F583E035
+:100B0000F508E508C0E075E0032506F50675E00088
+:100B10003507F507E502F582E503F583E504F50001
+:100B2000E505F501220000751F08751E00751D0002
+:100B3000751C00020AB70000751F07751E00751DA1
+:100B400000751C00020AB70000751F06751E0075AF
+:100B50001D00751C00020AB70000751F05751E00F8
+:100B6000751D00751C00020AB70000751F04751E74
+:100B700000751D00751C00020AB70000751F037583
+:100B80001E00751D00751C00020AB70000751F02CB
+:100B9000751E00751D00751C00020AB70000751F48
+:100BA00001751E00751D00751C00020AB7000000CB
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target arm*-*-symbianelf* } } */
+/* Symbian OS requires that all defined symbols with external linkage
+ have the ELF STV_HIDDEN attribute set by default. */
+/* { dg-final { scan-assembler ".hidden.*i" } } */
+/* { dg-final { scan-assembler ".hidden.*j" } } */
+/* { dg-final { scan-assembler ".hidden.*f" } } */
+
+int i;
+int j = 3;
+void f() {}
+
--- /dev/null
+/* { dg-do compile { target arm*-*-symbianelf* } } */
+/* Symbian OS requires that all defined symbols with external linkage
+ have the ELF STV_HIDDEN attribute set by default. */
+/* { dg-final { scan-assembler ".hidden.*i" } } */
+/* { dg-final { scan-assembler ".hidden.*j" } } */
+/* { dg-final { scan-assembler ".hidden.*f" } } */
+
+int i;
+int j = 3;
+void f() {}
+
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target arm*-*-symbianelf* } } */
+/* Check that enumeration types are 4-byte types. */
+
+enum e { e_1 };
+
+extern int i[sizeof (enum e)];
+int i[4];
--- /dev/null
+/* { dg-do compile { target arm*-*-symbianelf* } } */
+/* Check that enumeration types are 4-byte types. */
+
+enum e { e_1 };
+
+extern int i[sizeof (enum e)];
+int i[4];
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target arm*-*-symbianelf* } } */
+/* Check that wchar_t is a 2-byte type. */
+
+extern int i[sizeof (L'a')];
+int i[2];
--- /dev/null
+/* { dg-do compile { target arm*-*-symbianelf* } } */
+/* Check that wchar_t is a 2-byte type. */
+
+extern int i[sizeof (L'a')];
+int i[2];
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile { target arm*-*-symbianelf* } } */
+/* { dg-options "-fno-short-wchar" } */
+/* Check that wchar_t is a 4-byte type when -fno-short-wchar is
+ used. */
+
+extern int i[sizeof (L'a')];
+int i[4];
+
--- /dev/null
+/* { dg-do compile { target arm*-*-symbianelf* } } */
+/* { dg-options "-fno-short-wchar" } */
+/* Check that wchar_t is a 4-byte type when -fno-short-wchar is
+ used. */
+
+extern int i[sizeof (L'a')];
+int i[4];
+
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR c/20043 */
+/* { dg-compile } */
+/* { dg-options "-std=gnu99" } */
+
+typedef union { int *i; long *l; } U
+ __attribute__((transparent_union));
+
+extern void f0 (U); /* { dg-error "previous declaration" } */
+extern void f0 (void *); /* { dg-error "conflicting types" } */
+
+extern void f1 (U); /* { dg-error "previous declaration" } */
+extern void f1 (unsigned long); /* { dg-error "conflicting types" } */
+
+extern void f2 (void *); /* { dg-error "previous declaration" } */
+extern void f2 (U); /* { dg-error "conflicting types" } */
+
+extern void f3 (unsigned long); /* { dg-error "previous declaration" } */
+extern void f3 (U); /* { dg-error "conflicting types" } */
--- /dev/null
+/* PR c/20043 */
+/* { dg-compile } */
+/* { dg-options "-std=gnu99" } */
+
+typedef union { int *i; long *l; } U
+ __attribute__((transparent_union));
+
+extern void f0 (U); /* { dg-error "previous declaration" } */
+extern void f0 (void *); /* { dg-error "conflicting types" } */
+
+extern void f1 (U); /* { dg-error "previous declaration" } */
+extern void f1 (unsigned long); /* { dg-error "conflicting types" } */
+
+extern void f2 (void *); /* { dg-error "previous declaration" } */
+extern void f2 (U); /* { dg-error "conflicting types" } */
+
+extern void f3 (unsigned long); /* { dg-error "previous declaration" } */
+extern void f3 (U); /* { dg-error "conflicting types" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for ICEs on invalid transparent unions (empty or no named
+ members). Bug 21213. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+enum e { A };
+
+union __attribute__((__transparent_union__)) ue1 { enum e; }; /* { dg-warning "warning: declaration does not declare anything" } */
+/* { dg-warning "warning: union cannot be made transparent" "" { target *-*-* } 9 } */
+union ue2 { enum e; } __attribute__((__transparent_union__)); /* { dg-warning "warning: declaration does not declare anything" } */
+/* { dg-warning "warning: union cannot be made transparent" "" { target *-*-* } 11 } */
+
+union __attribute__((__transparent_union__)) ui1 { int; }; /* { dg-warning "warning: declaration does not declare anything" } */
+/* { dg-warning "warning: union cannot be made transparent" "" { target *-*-* } 14 } */
+union ui2 { int; } __attribute__((__transparent_union__)); /* { dg-warning "warning: declaration does not declare anything" } */
+/* { dg-warning "warning: union cannot be made transparent" "" { target *-*-* } 16 } */
+
+union __attribute__((__transparent_union__)) u1 { };
+/* { dg-warning "warning: union cannot be made transparent" "" { target *-*-* } 19 } */
+union u2 { } __attribute__((__transparent_union__));
+/* { dg-warning "warning: union cannot be made transparent" "" { target *-*-* } 21 } */
--- /dev/null
+/* Test for ICEs on invalid transparent unions (empty or no named
+ members). Bug 21213. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+enum e { A };
+
+union __attribute__((__transparent_union__)) ue1 { enum e; }; /* { dg-warning "warning: declaration does not declare anything" } */
+/* { dg-warning "warning: union cannot be made transparent" "" { target *-*-* } 9 } */
+union ue2 { enum e; } __attribute__((__transparent_union__)); /* { dg-warning "warning: declaration does not declare anything" } */
+/* { dg-warning "warning: union cannot be made transparent" "" { target *-*-* } 11 } */
+
+union __attribute__((__transparent_union__)) ui1 { int; }; /* { dg-warning "warning: declaration does not declare anything" } */
+/* { dg-warning "warning: union cannot be made transparent" "" { target *-*-* } 14 } */
+union ui2 { int; } __attribute__((__transparent_union__)); /* { dg-warning "warning: declaration does not declare anything" } */
+/* { dg-warning "warning: union cannot be made transparent" "" { target *-*-* } 16 } */
+
+union __attribute__((__transparent_union__)) u1 { };
+/* { dg-warning "warning: union cannot be made transparent" "" { target *-*-* } 19 } */
+union u2 { } __attribute__((__transparent_union__));
+/* { dg-warning "warning: union cannot be made transparent" "" { target *-*-* } 21 } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Origin: PR c/675 from aj@suse.de. */
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+#include <stddef.h>
+
+int
+main (void)
+{
+ size_t len;
+
+ len = ~(sizeof (size_t) - 1); /* { dg-bogus "truncated" "bogus truncation warning" } */
+
+ return 0;
+}
--- /dev/null
+/* Origin: PR c/675 from aj@suse.de. */
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+#include <stddef.h>
+
+int
+main (void)
+{
+ size_t len;
+
+ len = ~(sizeof (size_t) - 1); /* { dg-bogus "truncated" "bogus truncation warning" } */
+
+ return 0;
+}
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501C3750900750A007560
+:100020000B00750C00E509F502E50AF503E50BF593
+:1000300004E50CF505E501C0E0E500C0E0E502F5EA
+:1000400082E503F583E504F500E505F501220000EE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89" } // suppress default -pedantic-errors */
+
+/* This code used to be a legitimate, if dubious, extension. However,
+ it's been broken since GCC 3.0 (caused ICE) and we have now removed
+ the extension. See PR c/7353. */
+
+/* Case A: just the bare name = initializer. */
+
+typedef A = 0; /* { dg-error "initialized" "A" } */
+A a; /* { dg-bogus "" "A error cascade" } */
+
+/* Case B: with a type also. */
+
+typedef int B = 0; /* { dg-error "initialized" "B" } */
+B b; /* { dg-bogus "" "B error cascade" } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89" } // suppress default -pedantic-errors */
+
+/* This code used to be a legitimate, if dubious, extension. However,
+ it's been broken since GCC 3.0 (caused ICE) and we have now removed
+ the extension. See PR c/7353. */
+
+/* Case A: just the bare name = initializer. */
+
+typedef A = 0; /* { dg-error "initialized" "A" } */
+A a; /* { dg-bogus "" "A error cascade" } */
+
+/* Case B: with a type also. */
+
+typedef int B = 0; /* { dg-error "initialized" "B" } */
+B b; /* { dg-bogus "" "B error cascade" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Simplified from testcase by David Staepelaere <staapa@ultimatech.com> */
+
+/* { dg-do compile } */
+/* { dg-options "" } */
+/* { dg-options -mcpu=ultrasparc { target sparc-*-* } } */
+
+int foo(long long y) {
+ return -1 * y;
+}
--- /dev/null
+/* Simplified from testcase by David Staepelaere <staapa@ultimatech.com> */
+
+/* { dg-do compile } */
+/* { dg-options "" } */
+/* { dg-options -mcpu=ultrasparc { target sparc-*-* } } */
+
+int foo(long long y) {
+ return -1 * y;
+}
--- /dev/null
+:1000000000E50675820AC39582F506E5077583004B
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F0E5173C
+:10004000F518E516F519E515F51AE514F51B75E033
+:10005000052506F58275E0003507F583E513F07593
+:10006000E0042506F58275E0003507F583E512F01A
+:1000700075E0032506F58275E0003507F583E51187
+:10008000F075E0022506F58275E0003507F583E599
+:1000900010F0E51FF514E51EF515E51DF516E51C38
+:1000A000F517750001750100750900750A00E50076
+:1000B000F4F500E501F4F501E509F4F509E50AF4C4
+:1000C000F50AD3750B00E50BF5F0E50035F0F5000A
+:1000D000E50BF5F0E50135F0F501E50BF5F0E50987
+:1000E00035F0F509E50BF5F0E50A35F0F50A751080
+:1000F00000751100751200751300C3750B00E50043
+:10010000F5F0E514A4F50FE500F5F0E514A4E5F02D
+:10011000F50CE50FF5F0E50B35F0F50BE501F5F025
+:10012000E514A4F50FE501F5F0E514A4E5F0F50DEF
+:10013000E50FF5F0E50C35F0F50CE509F5F0E51403
+:10014000A4F50FE509F5F0E514A4E5F0F50EE50FCB
+:10015000F5F0E50D35F0F50DE50AF5F0E514A4F53B
+:100160000FE50AF5F0E514A4E5F0F50AE50FF5F062
+:10017000E50E35F0F50EC3C3750A00E50BF5F0E5A5
+:100180001035F0F510E50CF5F0E51135F0F511E559
+:100190000DF5F0E51235F0F512E50EF5F0E5133545
+:1001A000F0F513C3750C00E500F5F0E515A4F50FA7
+:1001B000E500F5F0E515A4E5F0F50DE50FF5F0E542
+:1001C0000C35F0F50CE501F5F0E515A4F50FE501AA
+:1001D000F5F0E515A4E5F0F50EE50FF5F0E50D35C4
+:1001E000F0F50DE509F5F0E515A4F50FE509F5F0D5
+:1001F000E515A4E5F0F50AE50FF5F0E50E35F0F5A7
+:100200000E750B00C3C3750900E50BF5F0E510355D
+:10021000F0F510E50CF5F0E51135F0F511E50DF50B
+:10022000F0E51235F0F512E50EF5F0E51335F0F5D1
+:1002300013C3750D00E500F5F0E516A4F50FE50014
+:10024000F5F0E516A4E5F0F50EE50FF5F0E50D3552
+:10025000F0F50DE501F5F0E516A4F50FE501F5F073
+:10026000E516A4E5F0F50AE50FF5F0E50E35F0F535
+:100270000E750B00750C00C3C3750100E50BF5F09E
+:10028000E51035F0F510E50CF5F0E51135F0F51158
+:10029000E50DF5F0E51235F0F512E50EF5F0E51394
+:1002A00035F0F513C3750E00E500F5F0E517A4F57C
+:1002B0000FE500F5F0E517A4E5F0F50AE50FF5F018
+:1002C000E50E35F0F50E750B00750C00750D00C3CD
+:1002D000C3750000E50BF5F0E51035F0F510E50C01
+:1002E000F5F0E51135F0F511E50DF5F0E51235F015
+:1002F000F512E50EF5F0E51335F0F513E510F5020E
+:10030000E511F503E512F504E513F505E518F51714
+:10031000E519F516E51AF515E51BF51475E0052543
+:1003200006F58275E0003507F583E0F51375E00406
+:100330002506F58275E0003507F583E0F51275E0D6
+:10034000032506F58275E0003507F583E0F51175A4
+:10035000E0022506F58275E0003507F583E0F5102B
+:1003600075E0002506F58275E0003507F583E0F5B8
+:1003700008E508C0E075E0012506F58275E0003566
+:1003800007F583E0F508E508C0E075E00A2506F505
+:100390000675E0003507F507E502F582E503F5830C
+:1003A000E504F500E505F50122000000000000006D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR target/11965 */
+/* Originator: <jk@tools.de> */
+/* { dg-do run { target sparc*-*-* } } */
+/* { dg-options "-O -mcpu=ultrasparc" } */
+
+/* This used to fail on 32-bit Ultrasparc because GCC emitted
+ an invalid shift instruction. */
+
+
+static inline unsigned int shift(int n, unsigned int value)
+{
+ return value << n;
+}
+
+unsigned int val = 1;
+
+int main(void)
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ val = shift(32, val);
+
+ return 0;
+}
--- /dev/null
+/* PR target/11965 */
+/* Originator: <jk@tools.de> */
+/* { dg-do run { target sparc*-*-* } } */
+/* { dg-options "-O -mcpu=ultrasparc" } */
+
+/* This used to fail on 32-bit Ultrasparc because GCC emitted
+ an invalid shift instruction. */
+
+
+static inline unsigned int shift(int n, unsigned int value)
+{
+ return value << n;
+}
+
+unsigned int val = 1;
+
+int main(void)
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ val = shift(32, val);
+
+ return 0;
+}
--- /dev/null
+/* Copyright (C) 1999 Free Software Foundation
+ by Alexandre Oliva <oliva@lsd.ic.unicamp.br>
+ Simplified from libg++/src/Fix16.cc */
+
+/* { dg-do compile } */
+/* { dg-options "" } */
+/* { dg-options "-O0" { target sparc64-*-* sparcv9-*-* } } */
+
+short foo() {
+ short i = (short)(1<<15);
+ return i;
+}
--- /dev/null
+/* Copyright (C) 1999 Free Software Foundation
+ by Alexandre Oliva <oliva@lsd.ic.unicamp.br>
+ Simplified from libg++/src/Fix16.cc */
+
+/* { dg-do compile } */
+/* { dg-options "" } */
+/* { dg-options "-O0" { target sparc64-*-* sparcv9-*-* } } */
+
+short foo() {
+ short i = (short)(1<<15);
+ return i;
+}
--- /dev/null
+:1000000000E506758212C39582F506E50775830043
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F075E0E3
+:10004000092506F58275E0003507F583E517F0759B
+:10005000E0082506F58275E0003507F583E516F022
+:1000600075E0072506F58275E0003507F583E5158F
+:10007000F075E0062506F58275E0003507F583E5A5
+:1000800014F075E0052506F58275E0003507F58367
+:10009000E513F075E0042506F58275E0003507F5F7
+:1000A00083E512F075E0032506F58275E00035075B
+:1000B000F583E511F075E0022506F58275E000355F
+:1000C00007F583E510F0E51FF500E51EF501E51DD8
+:1000D000F509E51CF50AE51BF51EE519F516E51809
+:1000E000F51FE500F50FE501F510E509F511E50A45
+:1000F000F512751900751500751300751D00E51DC5
+:10010000F50EE51FF50D750080E500F5F0E50E250F
+:10011000F0F50EE500F5F0E50D25F0F50D750C0098
+:10012000751400751700751800750B00750A0175B8
+:100130000001C3E50DF5F0E50E95F0F509E50BF5C9
+:10014000F0E50B35F0F509E509F5F0E50055F0F5BA
+:1001500000E500F5F0E50C45F0F50C750001C3E590
+:100160000DF5F0E50E95F0F509E50BF5F0E50B352D
+:10017000F0F509E50EF5F0E50D95F0F501E50BF567
+:10018000F0E50B35F0F501E501F5F0E50945F0F591
+:1001900009E50AF5F0E50965F0F509E509F5F0E589
+:1001A0000055F0F500C3E516F5F0E51395F0F509F7
+:1001B000E50BF5F0E50B35F0F509E509F5F0E5009F
+:1001C00055F0F500E500F5F0E50C45F0F50C75008F
+:1001D00001C3E50DF5F0E50E95F0F509E50BF5F039
+:1001E000E50B35F0F509E50EF5F0E50D95F0F501B7
+:1001F000E50BF5F0E50B35F0F501E501F5F0E50966
+:1002000045F0F509E50AF5F0E50965F0F509E509B8
+:10021000F5F0E50055F0F500C3E516F5F0E51395AA
+:10022000F0F509E50BF5F0E50B35F0F509E513F50B
+:10023000F0E51695F0F501E50BF5F0E50B35F0F579
+:1002400001E501F5F0E50945F0F509E50AF5F0E508
+:100250000965F0F509E509F5F0E50055F0F500C38D
+:10026000E51AF5F0E51595F0F509E50BF5F0E50B68
+:1002700035F0F509E509F5F0E50055F0F500E50084
+:10028000F5F0E50C45F0F50C750001C3E50DF5F052
+:10029000E50E95F0F509E50BF5F0E50B35F0F50900
+:1002A000E50EF5F0E50D95F0F501E50BF5F0E50B44
+:1002B00035F0F501E501F5F0E50945F0F509E50A48
+:1002C000F5F0E50965F0F509E509F5F0E50055F00B
+:1002D000F500C3E516F5F0E51395F0F509E50BF526
+:1002E000F0E50B35F0F509E513F5F0E51695F0F5B9
+:1002F00001E50BF5F0E50B35F0F501E501F5F0E56D
+:100300000945F0F509E50AF5F0E50965F0F509E5B7
+:1003100009F5F0E50055F0F500C3E51AF5F0E5152F
+:1003200095F0F509E50BF5F0E50B35F0F509E51568
+:10033000F5F0E51A95F0F501E50BF5F0E50B35F074
+:10034000F501E501F5F0E50945F0F509E50AF5F0F7
+:10035000E50965F0F509E509F5F0E50055F0F5006A
+:10036000C3E51EF5F0E51995F0F509E50BF5F0E5A7
+:100370000B35F0F509E509F5F0E50055F0F500E578
+:1003800000F5F0E50C45F0F50CE50CF50AE514F583
+:1003900000E517F501E518F509E50AF50C750B01FF
+:1003A000C3750A00E50CF5F0E50A95F0F50A750A43
+:1003B00000E50AF5F0E50A35F0F50AE50AF5F0E59D
+:1003C0000B65F0F50BC3750A00E500F5F0E50A953D
+:1003D000F0F50A750A00E50AF5F0E50A35F0F50AC8
+:1003E000E50AF5F0E50B65F0F50BC3750A00E501CC
+:1003F000F5F0E50A95F0F50A750A00E50AF5F0E56D
+:100400000A35F0F50AE50AF5F0E50B65F0F50BC3E2
+:10041000750A00E509F5F0E50A95F0F50A750A0098
+:10042000E50AF5F0E50A35F0F50AE50AF5F0E50B21
+:1004300065F0F50B750100750900750A007500007F
+:10044000E50BF5F0E50045F0F500E501F5F0E50018
+:1004500045F0F500E509F5F0E50045F0F500E50AA1
+:10046000F5F0E50045F0F500E500700280030206B6
+:10047000D700750D02750E00751700751B00E50F8E
+:10048000F500E510F514E511F518E512F51C750FEA
+:1004900000751000751100751200C3750100E500AC
+:1004A000F5F0E50DA4F50CE500F5F0E50DA4E5F09B
+:1004B000F509E50CF5F0E50135F0F501E514F5F089
+:1004C000E50DA4F50CE514F5F0E50DA4E5F0F50A4D
+:1004D000E50CF5F0E50935F0F509E518F5F0E50D61
+:1004E000A4F50CE518F5F0E50DA4E5F0F50BE50C29
+:1004F000F5F0E50A35F0F50AE51CF5F0E50DA4F593
+:100500000CE51CF5F0E50DA4E5F0F50DE50CF5F0B6
+:10051000E50B35F0F50BC3C3750C00E501F5F0E50F
+:100520000F35F0F50FE509F5F0E51035F0F510E5BC
+:100530000AF5F0E51135F0F511E50BF5F0E51235AA
+:10054000F0F512C3750900E500F5F0E50EA4F50C11
+:10055000E500F5F0E50EA4E5F0F50AE50CF5F0E5AB
+:100560000935F0F509E514F5F0E50EA4F50CE514F0
+:10057000F5F0E50EA4E5F0F50BE50CF5F0E50A3530
+:10058000F0F50AE518F5F0E50EA4F50CE518F5F020
+:10059000E50EA4E5F0F50DE50CF5F0E50B35F0F50D
+:1005A0000B750100C3C3750C00E501F5F0E50F35CF
+:1005B000F0F50FE509F5F0E51035F0F510E50AF571
+:1005C000F0E51135F0F511E50BF5F0E51235F0F534
+:1005D00012C3750A00E500F5F0E517A4F50CE50077
+:1005E000F5F0E517A4E5F0F50BE50CF5F0E50A35B7
+:1005F000F0F50AE514F5F0E517A4F50CE514F5F0AF
+:10060000E517A4E5F0F50DE50CF5F0E50B35F0F593
+:100610000B750100750900C3C3750C00E501F5F009
+:10062000E50F35F0F50FE509F5F0E51035F0F510BB
+:10063000E50AF5F0E51135F0F511E50BF5F0E512F9
+:1006400035F0F512C3750B00E500F5F0E51BA4F5D8
+:100650000CE500F5F0E51BA4E5F0F50DE50CF5F073
+:10066000E50B35F0F50B750100750900750A00C33F
+:10067000C3750000E501F5F0E50F35F0F50FE5096C
+:10068000F5F0E51035F0F510E50AF5F0E51135F077
+:10069000F511E50BF5F0E51235F0F5127500017571
+:1006A0000100750900750A00C3750B00E500F5F03F
+:1006B000E51935F0F519E501F5F0E51535F0F51515
+:1006C000E509F5F0E51335F0F513E50AF5F0E51D5C
+:1006D00035F0F51D0200FE00E50FF502E510F5030B
+:1006E000E511F504E512F50575E0092506F58275B5
+:1006F000E0003507F583E0F51775E0082506F5827B
+:1007000075E0003507F583E0F51675E0072506F579
+:100710008275E0003507F583E0F51575E0062506DE
+:10072000F58275E0003507F583E0F51475E00525E1
+:1007300006F58275E0003507F583E0F51375E004F2
+:100740002506F58275E0003507F583E0F51275E0C2
+:10075000032506F58275E0003507F583E0F5117590
+:10076000E0022506F58275E0003507F583E0F51017
+:1007700075E0002506F58275E0003507F583E0F5A4
+:1007800008E508C0E075E0012506F58275E0003552
+:1007900007F583E0F508E508C0E075E0122506F5E9
+:1007A0000675E0003507F507E502F582E503F583F8
+:1007B000E504F500E505F5012200E506758202C3B2
+:1007C0009582F506E5077583009583F507D0E0F57A
+:1007D0000875E0012506F58275E0003507F583E52B
+:1007E00008F0D0E0F50875E0002506F58275E00018
+:1007F0003507F583E508F0751F01751E00751D00AE
+:10080000751C00751B0F751A0075190075180012FC
+:100810000000E582F502E583F503E502F500E50356
+:10082000F501750900E500F502E501F503E509F5B7
+:1008300004E509F50575E0002506F58275E000354B
+:1008400007F583E0F508E508C0E075E0012506F549
+:100850008275E0003507F583E0F508E508C0E0752E
+:10086000E0022506F50675E0003507F507E502F517
+:1008700082E503F583E504F500E505F501220000B6
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Simplified from PR target/5309. */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-options "-O2 -mcpu=ultrasparc" { target sparc64-*-* sparcv9-*-* } } */
+
+#if __INT_MAX__ > 32767
+#define PTR_TYPE long
+#else
+/* For 16-bit ports a long is a 32-bit quantity. So you cannot
+ cast a 32-bit long integer into a pointer which will only be
+ 16-bits long. */
+#define PTR_TYPE int
+#endif
+
+extern PTR_TYPE bar (unsigned int);
+
+PTR_TYPE
+foo (PTR_TYPE x, unsigned int y)
+{
+ return *(((PTR_TYPE *) (bar (y) - 1)) + 1 + (x >> 2) % 359);
+}
--- /dev/null
+/* Simplified from PR target/5309. */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-options "-O2 -mcpu=ultrasparc" { target sparc64-*-* sparcv9-*-* } } */
+
+#if __INT_MAX__ > 32767
+#define PTR_TYPE long
+#else
+/* For 16-bit ports a long is a 32-bit quantity. So you cannot
+ cast a 32-bit long integer into a pointer which will only be
+ 16-bits long. */
+#define PTR_TYPE int
+#endif
+
+extern PTR_TYPE bar (unsigned int);
+
+PTR_TYPE
+foo (PTR_TYPE x, unsigned int y)
+{
+ return *(((PTR_TYPE *) (bar (y) - 1)) + 1 + (x >> 2) % 359);
+}
--- /dev/null
+:1000000000E506758212C39582F506E50775830043
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F075E0E3
+:10004000092506F58275E0003507F583E517F0759B
+:10005000E0082506F58275E0003507F583E516F022
+:1000600075E0072506F58275E0003507F583E5158F
+:10007000F075E0062506F58275E0003507F583E5A5
+:1000800014F075E0052506F58275E0003507F58367
+:10009000E513F075E0042506F58275E0003507F5F7
+:1000A00083E512F075E0032506F58275E00035075B
+:1000B000F583E511F075E0022506F58275E000355F
+:1000C00007F583E510F0E51FF500E51EF501E51DD8
+:1000D000F509E51CF50AE51AF515E519F513750F8F
+:1000E00000751000751100751200E500F516E501A8
+:1000F000F514E509F50DE50AF50E750C0075170008
+:10010000751900751A00750B00750A01750001C399
+:10011000E518F5F0E50E95F0F509E50BF5F0E50BC2
+:1001200035F0F509E509F5F0E50055F0F500E500D5
+:10013000F5F0E50C45F0F50C750001C3E518F5F098
+:10014000E50E95F0F509E50BF5F0E50B35F0F50951
+:10015000E50EF5F0E51895F0F501E50BF5F0E50B8A
+:1001600035F0F501E501F5F0E50945F0F509E50A99
+:10017000F5F0E50965F0F509E509F5F0E50055F05C
+:10018000F500C3E513F5F0E50D95F0F509E50BF580
+:10019000F0E50B35F0F509E509F5F0E50055F0F56A
+:1001A00000E500F5F0E50C45F0F50C750001C3E540
+:1001B00018F5F0E50E95F0F509E50BF5F0E50B35D2
+:1001C000F0F509E50EF5F0E51895F0F501E50BF50C
+:1001D000F0E50B35F0F501E501F5F0E50945F0F541
+:1001E00009E50AF5F0E50965F0F509E509F5F0E539
+:1001F0000055F0F500C3E513F5F0E50D95F0F509B0
+:10020000E50BF5F0E50B35F0F509E50DF5F0E51337
+:1002100095F0F501E50BF5F0E50B35F0F501E5019D
+:10022000F5F0E50945F0F509E50AF5F0E50965F0B1
+:10023000F509E509F5F0E50055F0F500C3E515F51C
+:10024000F0E51495F0F509E50BF5F0E50B35F0F563
+:1002500009E509F5F0E50055F0F500E500F5F0E5F4
+:100260000C45F0F50C750001C3E518F5F0E50E95A9
+:10027000F0F509E50BF5F0E50B35F0F509E50EF5C0
+:10028000F0E51895F0F501E50BF5F0E50B35F0F527
+:1002900001E501F5F0E50945F0F509E50AF5F0E5B8
+:1002A0000965F0F509E509F5F0E50055F0F500C33D
+:1002B000E513F5F0E50D95F0F509E50BF5F0E50B27
+:1002C00035F0F509E50DF5F0E51395F0F501E50BD1
+:1002D000F5F0E50B35F0F501E501F5F0E50945F040
+:1002E000F509E50AF5F0E50965F0F509E509F5F028
+:1002F000E50055F0F500C3E515F5F0E51495F0F5CA
+:1003000009E50BF5F0E50B35F0F509E514F5F0E539
+:100310001595F0F501E50BF5F0E50B35F0F501E588
+:1003200001F5F0E50945F0F509E50AF5F0E509659F
+:10033000F0F509E509F5F0E50055F0F500C3E51B1A
+:10034000F5F0E51695F0F509E50BF5F0E50B35F060
+:10035000F509E509F5F0E50055F0F500E500F5F0E3
+:10036000E50C45F0F50CE517F500E519F501E51A82
+:10037000F509E50CF50B750C01C3750A00E50BF5E5
+:10038000F0E50A95F0F50A750A00E50AF5F0E50AC8
+:1003900035F0F50AE50AF5F0E50C65F0F50CC375E6
+:1003A0000A00E500F5F0E50A95F0F50A750A00E5A2
+:1003B0000AF5F0E50A35F0F50AE50AF5F0E50C6511
+:1003C000F0F50CC3750A00E501F5F0E50A95F0F5C6
+:1003D0000A750A00E50AF5F0E50A35F0F50AE50ABE
+:1003E000F5F0E50C65F0F50CC3750A00E509F5F0CC
+:1003F000E50A95F0F50A750A00E50AF5F0E50A3513
+:10040000F0F50AE50AF5F0E50C65F0F50C7500006D
+:10041000750100750900E500F50BE501F50A7501A8
+:1004200001C3750000E50CF5F0E50095F0F50075E9
+:100430000000E500F5F0E50035F0F500E500F5F029
+:10044000E50165F0F501C3750000E50BF5F0E50089
+:1004500095F0F500750000E500F5F0E50035F0F5E4
+:1004600000E500F5F0E50165F0F501C3750000E574
+:100470000AF5F0E50095F0F500750000E500F5F0EF
+:10048000E50035F0F500E500F5F0E50165F0F50172
+:10049000C3750000E509F5F0E50095F0F50075007D
+:1004A00000E500F5F0E50035F0F500E500F5F0E5D4
+:1004B0000165F0F501750900750A00750B007500FE
+:1004C00000E501F5F0E50045F0F500E509F5F0E59A
+:1004D0000045F0F500E50AF5F0E50045F0F500E52A
+:1004E0000BF5F0E50045F0F500E500700280030231
+:1004F000055700750001750100750900750A00C3F4
+:10050000750B00E500F5F0E50F35F0F50FE501F5A9
+:10051000F0E51035F0F510E509F5F0E51135F0F5E9
+:1005200011E50AF5F0E51235F0F512C3E51BF5F01B
+:10053000E51695F0F516E515F5F0E51495F0F514CA
+:10054000E513F5F0E50D95F0F50DE518F5F0E50E80
+:1005500095F0F50E0200FA00E50FF502E510F5033F
+:10056000E511F504E512F50575E0092506F5827536
+:10057000E0003507F583E0F51775E0082506F582FC
+:1005800075E0003507F583E0F51675E0072506F5FB
+:100590008275E0003507F583E0F51575E006250660
+:1005A000F58275E0003507F583E0F51475E0052563
+:1005B00006F58275E0003507F583E0F51375E00474
+:1005C0002506F58275E0003507F583E0F51275E044
+:1005D000032506F58275E0003507F583E0F5117512
+:1005E000E0022506F58275E0003507F583E0F51099
+:1005F00075E0002506F58275E0003507F583E0F526
+:1006000008E508C0E075E0012506F58275E00035D3
+:1006100007F583E0F508E508C0E075E0122506F56A
+:100620000675E0003507F507E502F582E503F58379
+:10063000E504F500E505F5012200E506758217C31E
+:100640009582F506E5077583009583F507D0E0F5FB
+:100650000875E0062506F58275E0003507F583E5A7
+:1006600008F0D0E0F50875E0052506F58275E00094
+:100670003507F583E508F075E00E2506F58275E08F
+:10068000003507F583E517F075E00D2506F5827551
+:10069000E0003507F583E516F075E00C2506F582D8
+:1006A00075E0003507F583E515F075E00B2506F5D7
+:1006B0008275E0003507F583E514F075E00A25063C
+:1006C000F58275E0003507F583E513F075E009253F
+:1006D00006F58275E0003507F583E512F075E00850
+:1006E0002506F58275E0003507F583E511F075E024
+:1006F000072506F58275E0003507F583E510F0E57E
+:100700001FF511E51BF512E51AF513E519F514753A
+:10071000E0042506F58275E0003507F583E511F064
+:1007200075E0032506F58275E0003507F583E51EC3
+:10073000F075E0022506F58275E0003507F583E5E2
+:100740001DF075E0012506F58275E0003507F5839B
+:10075000E51CF07515017516007517007508007514
+:10076000E0002506F58275E0003507F583E508F021
+:10077000751900750D00750E00750F00E51CF5105C
+:10078000750080E500F5F0E51025F0F510E500F5C1
+:10079000F0E50F25F0F50F750C00751A00751B00BC
+:1007A000751F00750B00750A01750001C3E50FF593
+:1007B000F0E51095F0F509E50BF5F0E50B35F0F5F2
+:1007C00009E509F5F0E50055F0F500E500F5F0E57F
+:1007D0000C45F0F50C750001C3E50FF5F0E510953B
+:1007E000F0F509E50BF5F0E50B35F0F509E510F549
+:1007F000F0E50F95F0F501E50BF5F0E50B35F0F5BB
+:1008000001E501F5F0E50945F0F509E50AF5F0E542
+:100810000965F0F509E509F5F0E50055F0F500C3C7
+:10082000E50EF5F0E51D95F0F509E50BF5F0E50BA6
+:1008300035F0F509E509F5F0E50055F0F500E500BE
+:10084000F5F0E50C45F0F50C750001C3E50FF5F08A
+:10085000E51095F0F509E50BF5F0E50B35F0F50938
+:10086000E510F5F0E50F95F0F501E50BF5F0E50B7A
+:1008700035F0F501E501F5F0E50945F0F509E50A82
+:10088000F5F0E50965F0F509E509F5F0E50055F045
+:10089000F500C3E50EF5F0E51D95F0F509E50BF55E
+:1008A000F0E50B35F0F509E51DF5F0E50E95F0F5F1
+:1008B00001E50BF5F0E50B35F0F501E501F5F0E5A7
+:1008C0000945F0F509E50AF5F0E50965F0F509E5F2
+:1008D00009F5F0E50055F0F500C3E50DF5F0E51E6E
+:1008E00095F0F509E50BF5F0E50B35F0F509E509AF
+:1008F000F5F0E50055F0F500E500F5F0E50C45F004
+:10090000F50C750001C3E50FF5F0E51095F0F5095C
+:10091000E50BF5F0E50B35F0F509E510F5F0E50F21
+:1009200095F0F501E50BF5F0E50B35F0F501E50186
+:10093000F5F0E50945F0F509E50AF5F0E50965F09A
+:10094000F509E509F5F0E50055F0F500C3E50EF50C
+:10095000F0E51D95F0F509E50BF5F0E50B35F0F543
+:1009600009E51DF5F0E50E95F0F501E50BF5F0E56F
+:100970000B35F0F501E501F5F0E50945F0F509E580
+:100980000AF5F0E50965F0F509E509F5F0E500552A
+:10099000F0F500C3E50DF5F0E51E95F0F509E50B62
+:1009A000F5F0E50B35F0F509E51EF5F0E50D95F0F0
+:1009B000F501E50BF5F0E50B35F0F501E501F5F096
+:1009C000E50945F0F509E50AF5F0E50965F0F509F1
+:1009D000E509F5F0E50055F0F500C3E519F5F0E59A
+:1009E0001195F0F509E50BF5F0E50B35F0F509E5A6
+:1009F00009F5F0E50055F0F500E500F5F0E50C45EA
+:100A0000F0F50CE51AF501E51BF509E51FF50A758A
+:100A10000000E50CF5F0E50045F0F500E501F5F026
+:100A2000E50045F0F500E509F5F0E50045F0F500D5
+:100A3000E50AF5F0E50045F0F500E50070028003F9
+:100A400002116B00751900750D00750E00750F0011
+:100A5000E512F51BE513F51AE514F510E518F51187
+:100A6000750080E500F5F0E51125F0F511E500F5DC
+:100A7000F0E50F25F0F50F750C00751C00751D00D5
+:100A8000751E00750B00750A01750001C3E50FF5B1
+:100A9000F0E51195F0F509E50BF5F0E50B35F0F50E
+:100AA00009E509F5F0E50055F0F500E500F5F0E59C
+:100AB0000C45F0F50C750001C3E50FF5F0E5119557
+:100AC000F0F509E50BF5F0E50B35F0F509E511F565
+:100AD000F0E50F95F0F501E50BF5F0E50B35F0F5D8
+:100AE00001E501F5F0E50945F0F509E50AF5F0E560
+:100AF0000965F0F509E509F5F0E50055F0F500C3E5
+:100B0000E50EF5F0E51095F0F509E50BF5F0E50BD0
+:100B100035F0F509E509F5F0E50055F0F500E500DB
+:100B2000F5F0E50C45F0F50C750001C3E50FF5F0A7
+:100B3000E51195F0F509E50BF5F0E50B35F0F50954
+:100B4000E511F5F0E50F95F0F501E50BF5F0E50B96
+:100B500035F0F501E501F5F0E50945F0F509E50A9F
+:100B6000F5F0E50965F0F509E509F5F0E50055F062
+:100B7000F500C3E50EF5F0E51095F0F509E50BF588
+:100B8000F0E50B35F0F509E510F5F0E50E95F0F51B
+:100B900001E50BF5F0E50B35F0F501E501F5F0E5C4
+:100BA0000945F0F509E50AF5F0E50965F0F509E50F
+:100BB00009F5F0E50055F0F500C3E50DF5F0E51A8F
+:100BC00095F0F509E50BF5F0E50B35F0F509E509CC
+:100BD000F5F0E50055F0F500E500F5F0E50C45F021
+:100BE000F50C750001C3E50FF5F0E51195F0F50979
+:100BF000E50BF5F0E50B35F0F509E511F5F0E50F3E
+:100C000095F0F501E50BF5F0E50B35F0F501E501A3
+:100C1000F5F0E50945F0F509E50AF5F0E50965F0B7
+:100C2000F509E509F5F0E50055F0F500C3E50EF529
+:100C3000F0E51095F0F509E50BF5F0E50B35F0F56D
+:100C400009E510F5F0E50E95F0F501E50BF5F0E599
+:100C50000B35F0F501E501F5F0E50945F0F509E59D
+:100C60000AF5F0E50965F0F509E509F5F0E5005547
+:100C7000F0F500C3E50DF5F0E51A95F0F509E50B83
+:100C8000F5F0E50B35F0F509E51AF5F0E50D95F011
+:100C9000F501E50BF5F0E50B35F0F501E501F5F0B3
+:100CA000E50945F0F509E50AF5F0E50965F0F5090E
+:100CB000E509F5F0E50055F0F500C3E519F5F0E5B7
+:100CC0001B95F0F509E50BF5F0E50B35F0F509E5B9
+:100CD00009F5F0E50055F0F500E500F5F0E50C4507
+:100CE000F0F50CE51CF501E51DF509E51EF50A75A5
+:100CF0000000E50CF5F0E50045F0F500E501F5F044
+:100D0000E50045F0F500E509F5F0E50045F0F500F2
+:100D1000E50AF5F0E50045F0F500E5007002800316
+:100D20000210A30075E0042506F58275E000350782
+:100D3000F583E0F51F75E0032506F58275E00035C3
+:100D400007F583E0F51E75E0022506F58275E000E3
+:100D50003507F583E0F51D75E0012506F58275E0A0
+:100D6000003507F583E0F51CE512F51BE513F51AD0
+:100D7000E514F519120000E582F502E583F503E5B7
+:100D800000F504E501F505E502F511E503F512E5C9
+:100D900004F513E505F514E515F500E516F515E57B
+:100DA00017F51675E0002506F58275E0003507F5A4
+:100DB00083E0F517750D00750E00750F00751000B6
+:100DC000C3750100E500F5F0E511A4F50CE500F5AB
+:100DD000F0E511A4E5F0F509E50CF5F0E50135F0D5
+:100DE000F501E515F5F0E511A4F50CE515F5F0E5CF
+:100DF00011A4E5F0F50AE50CF5F0E50935F0F50983
+:100E0000E516F5F0E511A4F50CE516F5F0E511A4ED
+:100E1000E5F0F50BE50CF5F0E50A35F0F50AE51718
+:100E2000F5F0E511A4F50CE517F5F0E511A4E5F0F2
+:100E3000F511E50CF5F0E50B35F0F50BC3C3750CBA
+:100E400000E501F5F0E50D35F0F50DE509F5F0E506
+:100E50000E35F0F50EE50AF5F0E50F35F0F50FE586
+:100E60000BF5F0E51035F0F510C3750900E500F558
+:100E7000F0E512A4F50CE500F5F0E512A4E5F0F5B7
+:100E80000AE50CF5F0E50935F0F509E515F5F0E5AD
+:100E900012A4F50CE515F5F0E512A4E5F0F50BE567
+:100EA0000CF5F0E50A35F0F50AE516F5F0E512A4C3
+:100EB000F50CE516F5F0E512A4E5F0F511E50CF5F5
+:100EC000F0E50B35F0F50B750100C3C3750C00E5BB
+:100ED00001F5F0E50D35F0F50DE509F5F0E50E3518
+:100EE000F0F50EE50AF5F0E50F35F0F50FE50BF539
+:100EF000F0E51035F0F510C3750A00E500F5F0E5F2
+:100F000013A4F50CE500F5F0E513A4E5F0F50BE509
+:100F10000CF5F0E50A35F0F50AE515F5F0E513A452
+:100F2000F50CE515F5F0E513A4E5F0F511E50CF584
+:100F3000F0E50B35F0F50B750100750900C3C375BD
+:100F40000C00E501F5F0E50D35F0F50DE509F5F0DE
+:100F5000E50E35F0F50EE50AF5F0E50F35F0F50F85
+:100F6000E50BF5F0E51035F0F510C3750B00E50065
+:100F7000F5F0E514A4F50CE500F5F0E514A4E5F0B2
+:100F8000F511E50CF5F0E50B35F0F50B7501007585
+:100F90000900750A00C3C3750000E501F5F0E50D11
+:100FA00035F0F50DE509F5F0E50E35F0F50EE50A3D
+:100FB000F5F0E50F35F0F50FE50BF5F0E51035F040
+:100FC000F510E50DF502E50EF503E50FF504E51066
+:100FD000F50575E00E2506F58275E0003507F58309
+:100FE000E0F51775E00D2506F58275E0003507F58B
+:100FF00083E0F51675E00C2506F58275E0003507EF
+:10100000F583E0F51575E00B2506F58275E00035F2
+:1010100007F583E0F51475E00A2506F58275E00012
+:101020003507F583E0F51375E0092506F58275E0CF
+:10103000003507F583E0F51275E0082506F58275A1
+:10104000E0003507F583E0F51175E0072506F58228
+:1010500075E0003507F583E0F51075E0052506F528
+:101060008275E0003507F583E0F508E508C0E07516
+:10107000E0062506F58275E0003507F583E0F50802
+:10108000E508C0E075E0172506F50675E0003507B0
+:10109000F507E502F582E503F583E504F500E505CE
+:1010A000F5012200E512F4F512E513F4F513E51449
+:1010B000F4F514E518F4F518D3750000E500F5F023
+:1010C000E51235F0F512E500F5F0E51335F0F5130E
+:1010D000E500F5F0E51435F0F514E500F5F0E51858
+:1010E00035F0F518E515F4F515E516F4F516E517E0
+:1010F000F4F51775E0002506F58275E0003507F573
+:1011000083E0F508E508F4F50875E0002506F582AA
+:1011100075E0003507F583E508F0D3750000E500BC
+:10112000F5F0E51535F0F515E500F5F0E51635F0C7
+:10113000F516E500F5F0E51735F0F517E500F5F0E3
+:1011400075E0002506F58275E0003507F583E0F5CA
+:1011500008E50835F0F50875E0002506F58275E02C
+:10116000003507F583E508F0020D2400E511F4F5DC
+:1011700000E51EF4F501E51DF4F509E51CF4F50B99
+:10118000D3750A00E50AF5F0E50035F0F500E50A4B
+:10119000F5F0E50135F0F501E50AF5F0E50935F082
+:1011A000F509E50AF5F0E50B35F0F50B75E00425DA
+:1011B00006F58275E0003507F583E500F075E0037C
+:1011C0002506F58275E0003507F583E501F075E049
+:1011D000022506F58275E0003507F583E509F0750F
+:1011E000E0012506F58275E0003507F583E50BF093
+:1011F000E515F4F515E516F4F516E517F4F517758C
+:10120000E0002506F58275E0003507F583E0F50876
+:10121000E508F4F50875E0002506F58275E000356F
+:1012200007F583E508F0D3750000E500F5F0E51556
+:1012300035F0F515E500F5F0E51635F0F516E500A5
+:10124000F5F0E51735F0F517E500F5F075E0002548
+:1012500006F58275E0003507F583E0F508E5083509
+:10126000F0F50875E0002506F58275E0003507F514
+:1012700083E508F0020A4400E506758216C39582EC
+:10128000F506E5077583009583F507D0E0F5087549
+:10129000E0052506F58275E0003507F583E508F0E1
+:1012A000D0E0F50875E0042506F58275E000350705
+:1012B000F583E508F075E00D2506F58275E000354B
+:1012C00007F583E517F075E00C2506F58275E0005B
+:1012D0003507F583E516F075E00B2506F58275E018
+:1012E000003507F583E515F075E00A2506F58275EA
+:1012F000E0003507F583E514F075E0092506F58271
+:1013000075E0003507F583E513F075E0082506F56F
+:101310008275E0003507F583E512F075E0072506D4
+:10132000F58275E0003507F583E511F075E00625D7
+:1013300006F58275E0003507F583E510F075E003EA
+:101340002506F58275E0003507F583E51FF075E0A9
+:10135000022506F58275E0003507F583E51EF07578
+:10136000E0012506F58275E0003507F583E51DF0FF
+:1013700075E0002506F58275E0003507F583E51C6C
+:10138000F0E51BF514E51AF515E519F516E518F560
+:101390001775E0032506F58275E0003507F583E053
+:1013A000F51F75E0022506F58275E0003507F58327
+:1013B000E0F51E75E0012506F58275E0003507F5BC
+:1013C00083E0F51D75E0002506F58275E000350720
+:1013D000F583E0F51CE514F51BE515F51AE516F5A2
+:1013E00019E517F518120639E582F502E583F503CC
+:1013F000E500F504E501F505E502F500E503F50175
+:10140000E504F509E505F50A75100075110075127A
+:1014100000751300C3750B00E500F5F0E514A4F5A5
+:101420000FE500F5F0E514A4E5F0F50CE50FF5F097
+:10143000E50B35F0F50BE501F5F0E514A4F50FE546
+:1014400001F5F0E514A4E5F0F50DE50FF5F0E50C78
+:1014500035F0F50CE509F5F0E514A4F50FE509F50F
+:10146000F0E514A4E5F0F50EE50FF5F0E50D35F027
+:10147000F50DE50AF5F0E514A4F50FE50AF5F0E53C
+:1014800014A4E5F0F50AE50FF5F0E50E35F0F50EDC
+:10149000C3C3750A00E50BF5F0E51035F0F510E56E
+:1014A0000CF5F0E51135F0F511E50DF5F0E5123527
+:1014B000F0F512E50EF5F0E51335F0F513C3750CF4
+:1014C00000E500F5F0E515A4F50FE500F5F0E515EC
+:1014D000A4E5F0F50DE50FF5F0E50C35F0F50CE5BC
+:1014E00001F5F0E515A4F50FE501F5F0E515A4E526
+:1014F000F0F50EE50FF5F0E50D35F0F50DE509F524
+:10150000F0E515A4F50FE509F5F0E515A4E5F0F50E
+:101510000AE50FF5F0E50E35F0F50E750B00C3C3C7
+:10152000750900E50BF5F0E51035F0F510E50CF563
+:10153000F0E51135F0F511E50DF5F0E51235F0F5B2
+:1015400012E50EF5F0E51335F0F513C3750D00E562
+:1015500000F5F0E516A4F50FE500F5F0E516A4E5B5
+:10156000F0F50EE50FF5F0E50D35F0F50DE501F5BB
+:10157000F0E516A4F50FE501F5F0E516A4E5F0F5A4
+:101580000AE50FF5F0E50E35F0F50E750B00750C5C
+:1015900000C3C3750100E50BF5F0E51035F0F5105B
+:1015A000E50CF5F0E51135F0F511E50DF5F0E51276
+:1015B00035F0F512E50EF5F0E51335F0F513C375CA
+:1015C0000E00E500F5F0E517A4F50FE500F5F0E5F0
+:1015D00017A4E5F0F50AE50FF5F0E50E35F0F50E88
+:1015E000750B00750C00750D00C3C3750000E50B8D
+:1015F000F5F0E51035F0F510E50CF5F0E51135F0F6
+:10160000F511E50DF5F0E51235F0F512E50EF5F002
+:10161000E51335F0F513C3E510F5F075E003250685
+:10162000F58275E0003507F583E0F508E50895F0EB
+:10163000F500E511F5F075E0022506F58275E0008C
+:101640003507F583E0F508E50895F0F501E512F5B5
+:10165000F075E0012506F58275E0003507F583E0B9
+:10166000F508E50895F0F509E513F5F075E00025B6
+:1016700006F58275E0003507F583E0F508E5089585
+:10168000F0F50AE500F502E501F503E509F504E5E5
+:101690000AF50575E00D2506F58275E0003507F5BC
+:1016A00083E0F51775E00C2506F58275E000350737
+:1016B000F583E0F51675E00B2506F58275E000353B
+:1016C00007F583E0F51575E00A2506F58275E0005B
+:1016D0003507F583E0F51475E0092506F58275E018
+:1016E000003507F583E0F51375E0082506F58275EA
+:1016F000E0003507F583E0F51275E0072506F58271
+:1017000075E0003507F583E0F51175E0062506F56F
+:101710008275E0003507F583E0F51075E0042506D5
+:10172000F58275E0003507F583E0F508E508C0E0CF
+:1017300075E0052506F58275E0003507F583E0F5CF
+:1017400008E508C0E075E0162506F50675E00035E9
+:1017500007F507E502F582E503F583E504F500E505
+:1017600005F5012200E506758219C39582F506E5A7
+:10177000077583009583F507D0E0F50875E0082527
+:1017800006F58275E0003507F583E508F0D0E0F551
+:101790000875E0072506F58275E0003507F583E555
+:1017A00008F075E0102506F58275E0003507F58331
+:1017B000E517F075E00F2506F58275E0003507F5B1
+:1017C00083E516F075E00E2506F58275E000350715
+:1017D000F583E515F075E00D2506F58275E0003519
+:1017E00007F583E514F075E00C2506F58275E00039
+:1017F0003507F583E513F075E00B2506F58275E0F6
+:10180000003507F583E512F075E00A2506F58275C7
+:10181000E0003507F583E511F075E0092506F5824E
+:1018200075E0003507F583E510F0E51DF517E51CBB
+:10183000F516E518F515751400750D00750E007593
+:101840000F00E515F510750080E500F5F0E51025B1
+:10185000F0F510E500F5F0E50F25F0F50F750C003B
+:10186000751100751200751300750B00750A01756E
+:101870000001C3E50FF5F0E51095F0F509E50BF56E
+:10188000F0E50B35F0F509E509F5F0E50055F0F563
+:1018900000E500F5F0E50C45F0F50C750001C3E539
+:1018A0000FF5F0E51095F0F509E50BF5F0E50B35D2
+:1018B000F0F509E510F5F0E50F95F0F501E50BF50C
+:1018C000F0E50B35F0F501E501F5F0E50945F0F53A
+:1018D00009E50AF5F0E50965F0F509E509F5F0E532
+:1018E0000055F0F500C3E50EF5F0E51995F0F509A2
+:1018F000E50BF5F0E50B35F0F509E509F5F0E50048
+:1019000055F0F500E500F5F0E50C45F0F50C750037
+:1019100001C3E50FF5F0E51095F0F509E50BF5F0DD
+:10192000E50B35F0F509E510F5F0E50F95F0F5015B
+:10193000E50BF5F0E50B35F0F501E501F5F0E5090E
+:1019400045F0F509E50AF5F0E50965F0F509E50961
+:10195000F5F0E50055F0F500C3E50EF5F0E5199555
+:10196000F0F509E50BF5F0E50B35F0F509E519F5AE
+:10197000F0E50E95F0F501E50BF5F0E50B35F0F52A
+:1019800001E501F5F0E50945F0F509E50AF5F0E5B1
+:101990000965F0F509E509F5F0E50055F0F500C336
+:1019A000E50DF5F0E51A95F0F509E50BF5F0E50B19
+:1019B00035F0F509E509F5F0E50055F0F500E5002D
+:1019C000F5F0E50C45F0F50C750001C3E50FF5F0F9
+:1019D000E51095F0F509E50BF5F0E50B35F0F509A7
+:1019E000E510F5F0E50F95F0F501E50BF5F0E50BE9
+:1019F00035F0F501E501F5F0E50945F0F509E50AF1
+:101A0000F5F0E50965F0F509E509F5F0E50055F0B3
+:101A1000F500C3E50EF5F0E51995F0F509E50BF5D0
+:101A2000F0E50B35F0F509E519F5F0E50E95F0F563
+:101A300001E50BF5F0E50B35F0F501E501F5F0E515
+:101A40000945F0F509E50AF5F0E50965F0F509E560
+:101A500009F5F0E50055F0F500C3E50DF5F0E51AE0
+:101A600095F0F509E50BF5F0E50B35F0F509E51A0C
+:101A7000F5F0E50D95F0F501E50BF5F0E50B35F02A
+:101A8000F501E501F5F0E50945F0F509E50AF5F0A0
+:101A9000E50965F0F509E509F5F0E50055F0F50013
+:101AA000C3E514F5F0E51B95F0F509E50BF5F0E558
+:101AB0000B35F0F509E509F5F0E50055F0F500E521
+:101AC00000F5F0E50C45F0F50C750000E50CF5F0BF
+:101AD000E50045F0F500E511F5F0E50045F0F5000D
+:101AE000E512F5F0E50045F0F500E513F5F0E50049
+:101AF00045F0F500E5007002800302284B00E51F69
+:101B0000F51CE51EF51DE517F51FE516F51E75E03C
+:101B1000032506F58275E0003507F583E51BF075B2
+:101B2000E0022506F58275E0003507F583E51AF039
+:101B300075E0012506F58275E0003507F583E519A6
+:101B4000F075E0002506F58275E0003507F583E5C0
+:101B500015F075130175140075150075120075E008
+:101B6000062506F58275E0003507F583E51FF0755B
+:101B7000E0052506F58275E0003507F583E51EF0E2
+:101B800075080075E0042506F58275E0003507F557
+:101B900083E508F075160075110075100075171FA4
+:101BA000750F00750C00750D00750B00751800752C
+:101BB0001900751A00750A00750E01750001C3E55C
+:101BC0000DF5F0E51095F0F509E50AF5F0E50A35B3
+:101BD000F0F509E509F5F0E50055F0F500E500F54B
+:101BE000F0E50B45F0F50B750001C3E50DF5F0E5EB
+:101BF0001095F0F509E50AF5F0E50A35F0F509E587
+:101C000010F5F0E50D95F0F501E50AF5F0E50A357A
+:101C1000F0F501E501F5F0E50945F0F509E50EF50A
+:101C2000F0E50965F0F509E509F5F0E50055F0F591
+:101C300000C3E50CF5F0E51195F0F509E50AF5F0BE
+:101C4000E50A35F0F509E509F5F0E50055F0F50090
+:101C5000E500F5F0E50B45F0F50B750001C3E50D6A
+:101C6000F5F0E51095F0F509E50AF5F0E50A35F02F
+:101C7000F509E510F5F0E50D95F0F501E50AF5F04B
+:101C8000E50A35F0F501E501F5F0E50945F0F5095E
+:101C9000E50EF5F0E50965F0F509E509F5F0E50073
+:101CA00055F0F500C3E50CF5F0E51195F0F509E503
+:101CB0000AF5F0E50A35F0F509E511F5F0E50C95C2
+:101CC000F0F501E50AF5F0E50A35F0F501E501F575
+:101CD000F0E50945F0F509E50EF5F0E50965F0F5E3
+:101CE00009E509F5F0E50055F0F500C3E50FF5F05D
+:101CF000E51695F0F509E50AF5F0E50A35F0F50980
+:101D0000E509F5F0E50055F0F500E500F5F0E50B27
+:101D100045F0F50B750001C3E50DF5F0E51095F004
+:101D2000F509E50AF5F0E50A35F0F509E510F5F0F5
+:101D3000E50D95F0F501E50AF5F0E50A35F0F50158
+:101D4000E501F5F0E50945F0F509E50EF5F0E509E1
+:101D500065F0F509E509F5F0E50055F0F500C3E596
+:101D60000CF5F0E51195F0F509E50AF5F0E50A3511
+:101D7000F0F509E511F5F0E50C95F0F501E50AF54A
+:101D8000F0E50A35F0F501E501F5F0E50945F0F576
+:101D900009E50EF5F0E50965F0F509E509F5F0E569
+:101DA0000055F0F500C3E50FF5F0E51695F0F509DF
+:101DB000E50AF5F0E50A35F0F509E516F5F0E50F69
+:101DC00095F0F501E50AF5F0E50A35F0F501E501D4
+:101DD000F5F0E50945F0F509E50EF5F0E50965F0E2
+:101DE000F509E509F5F0E50055F0F500C3E517F54F
+:101DF000F075E0042506F58275E0003507F583E00F
+:101E0000F508E50895F0F509E50AF5F0E50A35F07D
+:101E1000F509E509F5F0E50055F0F500E500F5F008
+:101E2000E50B45F0F50BE518F500E519F501E51AA8
+:101E3000F50C750A01C3750900E50BF5F0E5099588
+:101E4000F0F509750900E509F5F0E50935F0F50942
+:101E5000E509F5F0E50A65F0F50AC3750900E50046
+:101E6000F5F0E50995F0F509750900E509F5F0E5E6
+:101E70000935F0F509E509F5F0E50A65F0F50AC35D
+:101E8000750900E501F5F0E50995F0F5097509001A
+:101E9000E509F5F0E50935F0F509E509F5F0E50A9C
+:101EA00065F0F50AC3750900E50CF5F0E50995F054
+:101EB000F509750900E509F5F0E50935F0F509E5DD
+:101EC00009F5F0E50A65F0F50A7501007509007578
+:101ED0000B00750000E50AF5F0E50045F0F500E5BA
+:101EE00001F5F0E50045F0F500E509F5F0E5004500
+:101EF000F0F500E50BF5F0E50045F0F500E50070C4
+:101F000002800302218E00750C02750D00750F0012
+:101F1000751800E513F50EE514F517E515F519E547
+:101F200012F51A751300751400751500751200C3AB
+:101F3000750000E50EF5F0E50CA4F50BE50EF5F0E7
+:101F4000E50CA4E5F0F501E50BF5F0E50035F0F55D
+:101F500000E517F5F0E50CA4F50BE517F5F0E50C39
+:101F6000A4E5F0F509E50BF5F0E50135F0F501E53F
+:101F700019F5F0E50CA4F50BE519F5F0E50CA4E571
+:101F8000F0F50AE50BF5F0E50935F0F509E51AF588
+:101F9000F0E50CA4F50BE51AF5F0E50CA4E5F0F579
+:101FA0000CE50BF5F0E50A35F0F50AC3C3750B0037
+:101FB000E500F5F0E51335F0F513E501F5F0E5146E
+:101FC00035F0F514E509F5F0E51535F0F515E50AF8
+:101FD000F5F0E51235F0F512C3750100E50EF5F0E8
+:101FE000E50DA4F50BE50EF5F0E50DA4E5F0F5091A
+:101FF000E50BF5F0E50135F0F501E517F5F0E50D38
+:10200000A4F50BE517F5F0E50DA4E5F0F50AE50BF1
+:10201000F5F0E50935F0F509E519F5F0E50DA4F55C
+:102020000BE519F5F0E50DA4E5F0F50CE50BF5F081
+:10203000E50A35F0F50A750000C3C3750B00E5002D
+:10204000F5F0E51335F0F513E501F5F0E51435F09D
+:10205000F514E509F5F0E51535F0F515E50AF5F0A7
+:10206000E51235F0F512C3750900E50EF5F0E50F40
+:10207000A4F50BE50EF5F0E50FA4E5F0F50AE50B88
+:10208000F5F0E50935F0F509E517F5F0E50FA4F5EC
+:102090000BE517F5F0E50FA4E5F0F50CE50BF5F011
+:1020A000E50A35F0F50A750000750100C3C3750B2C
+:1020B00000E500F5F0E51335F0F513E501F5F0E581
+:1020C0001435F0F514E509F5F0E51535F0F515E5ED
+:1020D0000AF5F0E51235F0F512C3750A00E50EF5C4
+:1020E000F0E518A4F50BE50EF5F0E518A4E5F0F51C
+:1020F0000CE50BF5F0E50A35F0F50A750000750101
+:1021000000750900C3C3750B00E500F5F0E5133554
+:10211000F0F513E501F5F0E51435F0F514E509F5F2
+:10212000F0E51535F0F515E50AF5F0E51235F0F5B1
+:1021300012750001750100750900750A00C3750B61
+:1021400000E500F5F075E0042506F58275E0003540
+:1021500007F583E0F508E50835F0F50875E0042596
+:1021600006F58275E0003507F583E508F0E501F531
+:10217000F0E51635F0F516E509F5F0E51135F0F561
+:1021800011E50AF5F0E51035F0F510021B9D00C3CE
+:10219000E51CF5F0E51355F0F513E51DF5F0E51434
+:1021A00055F0F514E51FF5F0E51555F0F515E51EAC
+:1021B000F5F0E51255F0F51275080075E0042506F6
+:1021C000F58275E0003507F583E508F075160075B2
+:1021D0001100751000750C00750D00750E00750F5F
+:1021E00000750B00750A01750001C375E000250636
+:1021F000F58275E0003507F583E0F508E508F5F0B0
+:10220000E51095F0F509E50BF5F0E50B35F0F5096E
+:10221000E509F5F0E50055F0F500E500F5F0E50C11
+:1022200045F0F50C750001C375E0002506F58275D3
+:10223000E0003507F583E0F508E508F5F0E51095D1
+:10224000F0F509E50BF5F0E50B35F0F509E510F5CE
+:10225000F075E0002506F58275E0003507F583E0AE
+:10226000F508E50895F0F501E50BF5F0E50B35F01F
+:10227000F501E501F5F0E50945F0F509E50AF5F0A8
+:10228000E50965F0F509E509F5F0E50055F0F5001B
+:10229000C375E0012506F58275E0003507F583E09A
+:1022A000F508E508F5F0E51195F0F509E50BF5F011
+:1022B000E50B35F0F509E509F5F0E50055F0F50019
+:1022C000E500F5F0E50C45F0F50C750001C375E08F
+:1022D000002506F58275E0003507F583E0F508E591
+:1022E00008F5F0E51095F0F509E50BF5F0E50B358F
+:1022F000F0F509E510F5F075E0002506F58275E0CA
+:10230000003507F583E0F508E50895F0F501E50BE4
+:10231000F5F0E50B35F0F501E501F5F0E50945F0DF
+:10232000F509E50AF5F0E50965F0F509E509F5F0C7
+:10233000E50055F0F500C375E0012506F58275E06E
+:10234000003507F583E0F508E508F5F0E51195F0AF
+:10235000F509E50BF5F0E50B35F0F509E511F5F0BC
+:1023600075E0012506F58275E0003507F583E0F597
+:1023700008E50895F0F501E50BF5F0E50B35F0F50E
+:1023800001E501F5F0E50945F0F509E50AF5F0E5A7
+:102390000965F0F509E509F5F0E50055F0F500C32C
+:1023A00075E0022506F58275E0003507F583E0F556
+:1023B00008E508F5F0E51695F0F509E50BF5F0E50B
+:1023C0000B35F0F509E509F5F0E50055F0F500E508
+:1023D00000F5F0E50C45F0F50C750001C375E00063
+:1023E0002506F58275E0003507F583E0F508E50878
+:1023F000F5F0E51095F0F509E50BF5F0E50B35F096
+:10240000F509E510F5F075E0002506F58275E000A8
+:102410003507F583E0F508E50895F0F501E50BF5DE
+:10242000F0E50B35F0F501E501F5F0E50945F0F5CE
+:1024300009E50AF5F0E50965F0F509E509F5F0E5C6
+:102440000055F0F500C375E0012506F58275E00042
+:102450003507F583E0F508E508F5F0E51195F0F5A9
+:1024600009E50BF5F0E50B35F0F509E511F5F0752B
+:10247000E0012506F58275E0003507F583E0F508F3
+:10248000E50895F0F501E50BF5F0E50B35F0F50104
+:10249000E501F5F0E50945F0F509E50AF5F0E5098E
+:1024A00065F0F509E509F5F0E50055F0F500C375AF
+:1024B000E0022506F58275E0003507F583E0F508B2
+:1024C000E508F5F0E51695F0F509E50BF5F0E50BF7
+:1024D00035F0F509E516F5F075E0022506F582758B
+:1024E000E0003507F583E0F508E50895F0F501E52E
+:1024F0000BF5F0E50B35F0F501E501F5F0E50945E3
+:10250000F0F509E50AF5F0E50965F0F509E509F5E5
+:10251000F0E50055F0F500C375E0032506F582757A
+:10252000E0003507F583E0F508E508F5F075E0040F
+:102530002506F58275E0003507F583E0F508E50826
+:1025400095F0F509E50BF5F0E50B35F0F509E50932
+:10255000F5F0E50055F0F500E500F5F0E50C45F087
+:10256000F50CE50DF500E50EF501E50FF509E500C3
+:10257000F50BE501F50A750101C3750000E50CF5E1
+:10258000F0E50095F0F500750000E500F5F0E500D8
+:1025900035F0F500E500F5F0E50165F0F501C375EE
+:1025A0000000E50BF5F0E50095F0F500750000E59D
+:1025B00000F5F0E50035F0F500E500F5F0E5016522
+:1025C000F0F501C3750000E50AF5F0E50095F0F5BA
+:1025D00000750000E500F5F0E50035F0F500E500D8
+:1025E000F5F0E50165F0F501C3750000E509F5F0CA
+:1025F000E50095F0F500750000E500F5F0E5003523
+:10260000F0F500E500F5F0E50165F0F5017509006C
+:10261000750A00750B00750000E501F5F0E5004551
+:10262000F0F500E509F5F0E50045F0F500E50AF5FF
+:10263000F0E50045F0F500E50BF5F0E50045F0F5B7
+:1026400000E5007002800302274F00751B02751A17
+:1026500000751900751800E51CF51FE51DF51E75C0
+:10266000E0062506F58275E0003507F583E0F51DE7
+:1026700075E0052506F58275E0003507F583E0F580
+:102680001C120000E582F502E583F503E500F50480
+:10269000E501F505E502F50AE503F509E504F501AF
+:1026A000E505F500C3750B00E513F5F0E50A35F017
+:1026B000F51CE514F5F0E50935F0F51DE515F5F027
+:1026C000E50135F0F50875E0062506F58275E000B0
+:1026D0003507F583E508F0E512F5F0E50035F0F58E
+:1026E0000875E0052506F58275E0003507F583E5F8
+:1026F00008F0750001750100750900750A00C375C1
+:102700000B00E500F5F075E0042506F58275E000A4
+:102710003507F583E0F508E50835F0F50875E004C0
+:102720002506F58275E0003507F583E508F0E5013B
+:10273000F5F0E51635F0F516E509F5F0E51135F09B
+:10274000F511E50AF5F0E51035F0F5100221D50098
+:10275000E51CF502E51DF50375E0062506F5827515
+:10276000E0003507F583E0F50475E0052506F58200
+:1027700075E0003507F583E0F50575E0102506F5F1
+:102780008275E0003507F583E0F51775E00F250643
+:10279000F58275E0003507F583E0F51675E00E2546
+:1027A00006F58275E0003507F583E0F51575E00D57
+:1027B0002506F58275E0003507F583E0F51475E030
+:1027C0000C2506F58275E0003507F583E0F51375F5
+:1027D000E00B2506F58275E0003507F583E0F5127C
+:1027E00075E00A2506F58275E0003507F583E0F50A
+:1027F0001175E0092506F58275E0003507F583E0DF
+:10280000F51075E0072506F58275E0003507F583BC
+:10281000E0F508E508C0E075E0082506F58275E0FA
+:10282000003507F583E0F508E508C0E075E01925F7
+:1028300006F50675E0003507F507E502F582E503C4
+:10284000F583E504F500E505F5012200751C00752A
+:102850001D0075080075E0062506F58275E0003557
+:1028600007F583E508F075080075E0052506F58293
+:1028700075E0003507F583E508F00227500000E514
+:1028800006758210C39582F506E50775830095836A
+:10289000F507D0E0F50875E0012506F58275E00042
+:1028A0003507F583E508F0D0E0F50875E00025066A
+:1028B000F58275E0003507F583E508F075E007253A
+:1028C00006F58275E0003507F583E515F075E0063D
+:1028D0002506F58275E0003507F583E514F075E00F
+:1028E000052506F58275E0003507F583E513F075DB
+:1028F000E0042506F58275E0003507F583E512F062
+:1029000075E0032506F58275E0003507F583E511CE
+:10291000F075E0022506F58275E0003507F583E5E0
+:1029200010F0E51FF512E51EF513E51DF514E51C85
+:10293000F515E51BF51FE51AF51EE519F51DE5185A
+:10294000F51CE582F502E583F503E502F510E503E4
+:10295000F511751B02751A00751900751800E5123E
+:10296000F51FE513F51EE514F51DE515F51C121709
+:1029700064E582F502E583F503E500F504E501F57C
+:1029800005E502F51FE503F51EE504F51DE505F572
+:102990001C751B67751A01751900751800121277DE
+:1029A000E582F502E583F503E502F500E503F501AF
+:1029B000750901750A00C3E509F5F0E51095F0F514
+:1029C00009E50AF5F0E51195F0F50AE509F512E5D6
+:1029D0000AF513750901750A00750E04750F007567
+:1029E0001000751100C3750B00E509F5F0E50EA4A4
+:1029F000F50DE509F5F0E50EA4E5F0F50CE50DF5AE
+:102A0000F0E50B35F0F50BE50AF5F0E50EA4F50D54
+:102A1000E50AF5F0E50EA4E5F0F50AE50DF5F0E5BB
+:102A20000C35F0F50CC3C3750A00E50BF5F0E510A5
+:102A300035F0F510E50CF5F0E51135F0F511C3753D
+:102A40000C00E509F5F0E50FA4F50DE509F5F0E555
+:102A50000FA4E5F0F50AE50DF5F0E50C35F0F50C01
+:102A6000750B00C3C3750900E50BF5F0E51035F0F3
+:102A7000F510E50CF5F0E51135F0F511C3750B0017
+:102A8000750C00C3C3750900E50BF5F0E51035F0D2
+:102A9000F510E50CF5F0E51135F0F511C3750B00F7
+:102AA000750C00C3C3750900E50BF5F0E51035F0B2
+:102AB000F510E50CF5F0E51135F0F511C3750900D9
+:102AC000E510F5F0E51235F0F509E511F5F0E5133F
+:102AD00035F0F50C750A04750B00751000751100C2
+:102AE000C3750D00E500F5F0E50AA4F50FE500F566
+:102AF000F0E50AA4E5F0F50EE50FF5F0E50D35F08B
+:102B0000F50DE501F5F0E50AA4F50FE501F5F0E5B1
+:102B10000AA4E5F0F501E50FF5F0E50E35F0F50E48
+:102B2000C3C3750100E50DF5F0E51035F0F510E5CE
+:102B30000EF5F0E51135F0F511C3750E00E500F561
+:102B4000F0E50BA4F50FE500F5F0E50BA4E5F0F5D5
+:102B500001E50FF5F0E50E35F0F50E750D00C3C378
+:102B6000750000E50DF5F0E51035F0F510E50EF512
+:102B7000F0E51135F0F511C3750D00750E00C3C3F6
+:102B8000750000E50DF5F0E51035F0F510E50EF5F2
+:102B9000F0E51135F0F511C3750D00750E00C3C3D6
+:102BA000750000E50DF5F0E51035F0F510E50EF5D2
+:102BB000F0E51135F0F511C3750000E510F5F0E50D
+:102BC0000935F0F500E511F5F0E50C35F0F501E516
+:102BD00000F509E501F50A750100C3750000E5017E
+:102BE000F5F0E50935F0F501E500F5F0E50A35F019
+:102BF000F500E500F502E501F582E502F583E0F573
+:102C00000B750101C3750000E501F5F0E50935F02C
+:102C1000F501E500F5F0E50A35F0F500E500F5020F
+:102C2000E501F582E502F583E0F50C750102C37557
+:102C30000000E501F5F0E50935F0F501E500F5F0F6
+:102C4000E50A35F0F500E500F502E501F582E5025B
+:102C5000F583E0F50D750103C3750000E501F5F09E
+:102C6000E50935F0F501E500F5F0E50A35F0F50088
+:102C7000E500F502E501F582E502F583E0F500E502
+:102C80000BF502E50CF503E50DF504E500F505751A
+:102C9000E0072506F58275E0003507F583E0F515B8
+:102CA00075E0062506F58275E0003507F583E0F549
+:102CB0001475E0052506F58275E0003507F583E01B
+:102CC000F51375E0042506F58275E0003507F583F8
+:102CD000E0F51275E0032506F58275E0003507F58D
+:102CE00083E0F51175E0022506F58275E0003507F1
+:102CF000F583E0F51075E0002506F58275E00035F6
+:102D000007F583E0F508E508C0E075E0012506F564
+:102D10008275E0003507F583E0F508E508C0E07549
+:102D2000E0102506F50675E0003507F507E502F524
+:102D300082E503F583E504F500E505F501220000D1
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Spurious uninitialized variable warnings, case 1.
+ Taken from cppfiles.c (merge_include_chains) */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+struct list
+{
+ struct list *next;
+ int id;
+};
+
+extern void free (void *);
+
+void remove_dupes (struct list *el)
+{
+ struct list *p, *q, *r; /* { dg-bogus "r" "uninitialized variable warning" } */
+
+ for (p = el; p; p = p->next)
+ {
+ for (q = el; q != p; q = q->next)
+ if (q->id == p->id)
+ {
+ r->next = p->next;
+ free (p);
+ p = r;
+ break;
+ }
+ r = p;
+ }
+}
--- /dev/null
+/* Spurious uninitialized variable warnings, case 1.
+ Taken from cppfiles.c (merge_include_chains) */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+struct list
+{
+ struct list *next;
+ int id;
+};
+
+extern void free (void *);
+
+void remove_dupes (struct list *el)
+{
+ struct list *p, *q, *r; /* { dg-bogus "r" "uninitialized variable warning" } */
+
+ for (p = el; p; p = p->next)
+ {
+ for (q = el; q != p; q = q->next)
+ if (q->id == p->id)
+ {
+ r->next = p->next;
+ free (p);
+ p = r;
+ break;
+ }
+ r = p;
+ }
+}
--- /dev/null
+:100000000000E50675820CC39582F506E507758349
+:10001000009583F507D0E0F50875E0012506F58227
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000002506F58275E0003507F583E508F075C3
+:10004000E0092506F58275E0003507F583E517F030
+:1000500075E0082506F58275E0003507F583E5169D
+:10006000F075E0072506F58275E0003507F583E5B4
+:1000700015F075E0062506F58275E0003507F58375
+:10008000E514F075E0052506F58275E0003507F505
+:1000900083E513F075E0042506F58275E000350769
+:1000A000F583E512F075E0032506F58275E000356D
+:1000B00007F583E511F075E0022506F58275E0008D
+:1000C0003507F583E510F0E51FF516E51EF517E594
+:1000D00016F51FE517F51E750101C3750000E51F34
+:1000E000F5F0E50095F0F500750000E500F5F0E5A8
+:1000F0000035F0F500E500F5F0E50165F0F501C328
+:10010000750000E51EF5F0E50095F0F500750000BE
+:10011000E500F5F0E50035F0F500E500F5F0E50166
+:1001200065F0F501750900750000E501F5F0E500E1
+:1001300045F0F500E509F5F0E50045F0F500E500CE
+:100140007002800302070600E516F510E517F511A9
+:10015000750000C3E51FF5F0E51095F0F501E50128
+:10016000F5F0E50045F0F500C3E51EF5F0E5119565
+:10017000F0F501E501F5F0E50045F0F50075010049
+:10018000750900750A00750C01C3750B00E500F5D3
+:10019000F0E50B95F0F50B750B00E50BF5F0E50BB5
+:1001A00035F0F50BE50BF5F0E50C65F0F50CC375D6
+:1001B0000B00E501F5F0E50B95F0F50B750B00E58F
+:1001C0000BF5F0E50B35F0F50BE50BF5F0E50C65FF
+:1001D000F0F50CC3750B00E509F5F0E50B95F0F5AE
+:1001E0000B750B00E50BF5F0E50B35F0F50BE50BAA
+:1001F000F5F0E50C65F0F50CC3750B00E50AF5F0BC
+:10020000E50B95F0F50B750B00E50BF5F0E50B35FF
+:10021000F0F50BE50BF5F0E50C65F0F50C7501005C
+:10022000750900750A00750000E50CF5F0E500455C
+:10023000F0F500E501F5F0E50045F0F500E509F51C
+:10024000F0E50045F0F500E50AF5F0E50045F0F5CC
+:1002500000E5007002800302068300750102C37589
+:100260000000E501F5F0E51035F0F509E500F5F0E1
+:10027000E51135F0F50A750100C3750000E501F5DB
+:10028000F0E50935F0F501E500F5F0E50A35F0F5A2
+:1002900000E500F502E501F582E502F583E0F50EE3
+:1002A000750101C3750000E501F5F0E50935F0F5CC
+:1002B00001E500F5F0E50A35F0F500E500F502E5A9
+:1002C00001F582E502F583E0F50F750102C37500C3
+:1002D00000E501F5F0E50935F0F501E500F5F0E59B
+:1002E0000A35F0F500E500F502E501F582E502F5D5
+:1002F00083E0F512750103C3750000E501F5F0E533
+:100300000935F0F501E500F5F0E50A35F0F500E511
+:1003100000F502E501F582E502F583E0F5137501CC
+:1003200002C3750000E501F5F0E51F35F0F509E5BC
+:1003300000F5F0E51E35F0F50A750000C375010003
+:10034000E500F5F0E50935F0F500E501F5F0E50A21
+:1003500035F0F501E501F502E500F582E502F583EA
+:10036000E0F50B750001C3750100E500F5F0E50946
+:1003700035F0F500E501F5F0E50A35F0F501E501A8
+:10038000F502E500F582E502F583E0F50C75000263
+:10039000C3750100E500F5F0E50935F0F500E5016C
+:1003A000F5F0E50A35F0F501E501F502E500F58225
+:1003B000E502F583E0F50D750003C3750100E50066
+:1003C000F5F0E50935F0F500E501F5F0E50A35F061
+:1003D000F501E501F502E500F582E502F583E0F5BA
+:1003E00000750100C3E50BF5F0E50E95F0F509E5A4
+:1003F00009F5F0E50145F0F501C3E50CF5F0E50F71
+:1004000095F0F509E509F5F0E50145F0F501C3E5DD
+:100410000DF5F0E51295F0F509E509F5F0E5014572
+:10042000F0F501C3E500F5F0E51395F0F509E509F0
+:10043000F5F0E50145F0F501750900750A00750B49
+:1004400000E501F500750101C3750C00E500F5F04C
+:10045000E50C95F0F50C750C00E50CF5F0E50C35A8
+:10046000F0F50CE50CF5F0E50165F0F501C3750C50
+:1004700000E509F5F0E50C95F0F50C750C00E50CC0
+:10048000F5F0E50C35F0F50CE50CF5F0E50165F05F
+:10049000F501C3750C00E50AF5F0E50C95F0F50CD7
+:1004A000750C00E50CF5F0E50C35F0F50CE50CF5F8
+:1004B000F0E50165F0F501C3750C00E50BF5F0E51D
+:1004C0000C95F0F50C750C00E50CF5F0E50C35F02D
+:1004D000F50CE50CF5F0E50165F0F5017509007521
+:1004E0000A00750B00750000E501F5F0E50045F028
+:1004F000F500E509F5F0E50045F0F500E50AF5F051
+:10050000E50045F0F500E50BF5F0E50045F0F500F8
+:10051000E5007002800302059400750100C37500B8
+:1005200000E501F5F0E51035F0F501E500F5F0E541
+:100530001135F0F500E501F509E500F50A75010052
+:10054000C3750000E501F5F0E50935F0F501E500BA
+:10055000F5F0E50A35F0F500E500F502E501F58274
+:10056000E502F583E0F510750101C3750000E501B2
+:10057000F5F0E50935F0F501E500F5F0E50A35F0AF
+:10058000F500E500F502E501F582E502F583E0F509
+:100590001102015000750100C3750000E501F5F07E
+:1005A000E51435F0F50CE500F5F0E51535F0F50D41
+:1005B000750100C3750000E501F5F0E51F35F0F5A4
+:1005C00009E500F5F0E51E35F0F50A750100C37583
+:1005D0000000E501F5F0E50935F0F501E500F5F07D
+:1005E000E50A35F0F500E500F502E501F582E502E2
+:1005F000F583E0F50B750101C3750000E501F5F029
+:10060000E50935F0F501E500F5F0E50A35F0F5000E
+:10061000E500F502E501F582E502F583E0F50975EF
+:100620000100C3750000E501F5F0E50C35F0F501BA
+:10063000E500F5F0E50D35F0F500E50BF503E50017
+:10064000F502E501F582E502F583E503F0750101A8
+:10065000C3750000E501F5F0E50C35F0F501E500A6
+:10066000F5F0E50D35F0F500E509F503E500F502D7
+:10067000E501F582E502F583E503F0E514F51FE5F4
+:1006800015F51E00E51FF514E51EF515750100C3EF
+:10069000750000E501F5F0E51F35F0F501E500F521
+:1006A000F0E51E35F0F500E501F509E500F50A7500
+:1006B0000100C3750000E501F5F0E50935F0F5012D
+:1006C000E500F5F0E50A35F0F500E500F502E50195
+:1006D000F582E502F583E0F51F750101C3750000A1
+:1006E000E501F5F0E50935F0F501E500F5F0E50A7D
+:1006F00035F0F500E500F502E501F582E502F58348
+:10070000E0F51E0200D700750000E500F502E500E7
+:10071000F503E500F504E500F50575E0092506F5A6
+:100720008275E0003507F583E0F51775E0082506CA
+:10073000F58275E0003507F583E0F51675E00725CD
+:1007400006F58275E0003507F583E0F51575E006DE
+:100750002506F58275E0003507F583E0F51475E0B0
+:10076000052506F58275E0003507F583E0F513757C
+:10077000E0042506F58275E0003507F583E0F51203
+:1007800075E0032506F58275E0003507F583E0F591
+:100790001175E0022506F58275E0003507F583E066
+:1007A000F51075E0002506F58275E0003507F58344
+:1007B000E0F508E508C0E075E0012506F58275E082
+:1007C000003507F583E0F508E508C0E075E00C2585
+:1007D00006F50675E0003507F507E502F582E50345
+:1007E000F583E504F500E505F501220000000000B1
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Positive test for uninitialized variables. */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+int sink;
+
+void f1(int parm) /* { dg-bogus "uninitialized" "parameter" } */
+{
+ sink = parm; /* { dg-bogus "uninitialized" "parameter" } */
+}
+
+void f2(void)
+{
+ int x;
+ sink = x; /* { dg-warning "is used" "unconditional" } */
+}
+
+void f3(int p)
+{
+ int x; /* { dg-warning "may be used" "conditional" } */
+ if (p)
+ x = p;
+ sink = x;
+}
+
+void f4(int p)
+{
+ int x; /* { dg-bogus "uninitialized" "easy if" } */
+ if (p)
+ x = 1;
+ else
+ x = 2;
+ sink = x;
+}
+
+void f5(void)
+{
+ int x, i; /* { dg-bogus "uninitialized" "easy loop" } */
+ for (i = 0; i < 10; ++i)
+ x = 1;
+ sink = x;
+}
--- /dev/null
+/* Positive test for uninitialized variables. */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+int sink;
+
+void f1(int parm) /* { dg-bogus "uninitialized" "parameter" } */
+{
+ sink = parm; /* { dg-bogus "uninitialized" "parameter" } */
+}
+
+void f2(void)
+{
+ int x;
+ sink = x; /* { dg-warning "is used" "unconditional" } */
+}
+
+void f3(int p)
+{
+ int x; /* { dg-warning "may be used" "conditional" } */
+ if (p)
+ x = p;
+ sink = x;
+}
+
+void f4(int p)
+{
+ int x; /* { dg-bogus "uninitialized" "easy if" } */
+ if (p)
+ x = 1;
+ else
+ x = 2;
+ sink = x;
+}
+
+void f5(void)
+{
+ int x, i; /* { dg-bogus "uninitialized" "easy loop" } */
+ for (i = 0; i < 10; ++i)
+ x = 1;
+ sink = x;
+}
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F50ED0E0F50FE512F50B6E
+:10002000E511F50CE510F50D900000E582F509905D
+:100030000000E583F50A750100C3750000E501F5D0
+:10004000F0E50935F0F501E500F5F0E50A35F0F5E4
+:1000500000E51FF503E500F502E501F582E502F58F
+:1000600083E503F0750101C3750000E501F5F0E5D6
+:100070000935F0F501E500F5F0E50A35F0F500E5A4
+:100080001EF503E500F502E501F582E502F583E5DD
+:1000900003F0750102C3750000E501F5F0E50935CF
+:1000A000F0F501E500F5F0E50A35F0F500E51DF5A0
+:1000B00003E500F502E501F582E502F583E503F0CD
+:1000C000750103C3750000E501F5F0E50935F0F5AC
+:1000D00001E500F5F0E50A35F0F500E51CF503E56E
+:1000E00000F502E501F582E502F583E503F0750010
+:1000F00000E500F502E500F503E500F504E500F58F
+:1001000005E50BF512E50CF511E50DF510E50FC051
+:10011000E0E50EC0E075E0042506F50675E0003563
+:1001200007F507E502F582E503F583E504F500E54B
+:1001300005F5012200D0E0F50BD0E0F50C900000B1
+:10014000E582F509900000E583F50A750100C375A5
+:100150000000E501F5F0E50935F0F501E500F5F001
+:10016000E50A35F0F500E50DF503E500F502E501DA
+:10017000F582E502F583E503F0750101C375000022
+:10018000E501F5F0E50935F0F501E500F5F0E50AE2
+:1001900035F0F500E50DF503E500F502E501F58222
+:1001A000E502F583E503F0750102C3750000E50182
+:1001B000F5F0E50935F0F501E500F5F0E50A35F073
+:1001C000F500E50DF503E500F502E501F582E50230
+:1001D000F583E503F0750103C3750000E501F5F053
+:1001E000E50935F0F501E500F5F0E50A35F0F50033
+:1001F000E50DF503E500F502E501F582E502F5837D
+:10020000E503F0750000E500F502E500F503E50003
+:10021000F504E500F505E50CC0E0E50BC0E0E502FE
+:10022000F582E503F583E504F500E505F501220017
+:10023000E506758204C39582F506E507758300958A
+:1002400083F507D0E0F518D0E0F519E512F50F7544
+:100250000B00E51FF5F0E50B45F0F50BE51EF5F09D
+:10026000E50B45F0F50BE51DF5F0E50B45F0F50B5D
+:10027000E51CF5F0E50B45F0F50BE50B700280038E
+:1002800002038800900000E582F50D900000E583F0
+:10029000F50E750C00C3750B00E50CF5F0E50D359A
+:1002A000F0F50CE50BF5F0E50E35F0F50BE500F596
+:1002B00003E50BF502E50CF582E502F583E503F0B5
+:1002C000750C01C3750000E50CF5F0E50D35F0F592
+:1002D0000CE500F5F0E50E35F0F50BE501F503E56D
+:1002E0000BF502E50CF582E502F583E503F0750CEC
+:1002F00002C3750000E50CF5F0E50D35F0F50CE5F1
+:1003000000F5F0E50E35F0F50BE509F503E50BF525
+:1003100002E50CF582E502F583E503F0750C03C3F5
+:10032000750000E50CF5F0E50D35F0F50CE500F590
+:10033000F0E50E35F0F50BE50AF503E50BF502E502
+:100340000CF582E502F583E503F0750000E500F5A4
+:1003500002E500F503E500F504E500F505E50FF518
+:1003600012E519C0E0E518C0E075E0042506F506C1
+:1003700075E0003507F507E502F582E503F583E54D
+:1003800004F500E505F5012200E51FF500E51EF581
+:1003900001E51DF509E51CF50A02028400E5067574
+:1003A0008204C39582F506E5077583009583F507FA
+:1003B000D0E0F518D0E0F519E512F50F750000E56D
+:1003C0001FF5F0E50045F0F500E51EF5F0E5004508
+:1003D000F0F500E51DF5F0E50045F0F500E51CF54C
+:1003E000F0E50045F0F500E500700280030205012C
+:1003F00000750B02750C00750D00750E0090000065
+:10040000E582F509900000E583F50A750100C375E2
+:100410000000E501F5F0E50935F0F501E500F5F03E
+:10042000E50A35F0F500E50BF503E500F502E50119
+:10043000F582E502F583E503F0750101C37500005F
+:10044000E501F5F0E50935F0F501E500F5F0E50A1F
+:1004500035F0F500E50CF503E500F502E501F58260
+:10046000E502F583E503F0750102C3750000E501BF
+:10047000F5F0E50935F0F501E500F5F0E50A35F0B0
+:10048000F500E50DF503E500F502E501F582E5026D
+:10049000F583E503F0750103C3750000E501F5F090
+:1004A000E50935F0F501E500F5F0E50A35F0F50070
+:1004B000E50EF503E500F502E501F582E502F583B9
+:1004C000E503F0750000E500F502E500F503E50041
+:1004D000F504E500F505E50FF512E519C0E0E518AE
+:1004E000C0E075E0042506F50675E0003507F50760
+:1004F000E502F582E503F583E504F500E505F50180
+:100500002200750B01750C00750D00750E000203BD
+:10051000FD00E506758207C39582F506E50775833C
+:10052000009583F507D0E0F50875E0012506F58212
+:1005300075E0003507F583E508F0D0E0F50875E0D3
+:10054000002506F58275E0003507F583E508F0E53E
+:1005500017F51DE516F51EE515F51F75E0062506D0
+:10056000F58275E0003507F583E514F075E00525A3
+:1005700006F58275E0003507F583E513F075E004B4
+:100580002506F58275E0003507F583E512F075E084
+:10059000032506F58275E0003507F583E511F07552
+:1005A000E0022506F58275E0003507F583E510F0D9
+:1005B00075160075120075130075180075170A7509
+:1005C0001500750F00751000E518F511750080E530
+:1005D00000F5F0E51125F0F511E500F5F0E5102541
+:1005E000F0F510750C00750D00750E007514007592
+:1005F0000B00750A01750001C3E510F5F0E51195D2
+:10060000F0F509E50BF5F0E50B35F0F509E509F531
+:10061000F0E50055F0F500E500F5F0E50C45F0F5E6
+:100620000C750001C3E510F5F0E51195F0F509E54D
+:100630000BF5F0E50B35F0F509E511F5F0E5109552
+:10064000F0F501E50BF5F0E50B35F0F501E501F509
+:10065000F0E50945F0F509E50AF5F0E50965F0F57D
+:1006600009E509F5F0E50055F0F500C3E50FF5F0F3
+:10067000E51395F0F509E50BF5F0E50B35F0F50917
+:10068000E509F5F0E50055F0F500E500F5F0E50CBD
+:1006900045F0F50C750001C3E510F5F0E51195F096
+:1006A000F509E50BF5F0E50B35F0F509E511F5F089
+:1006B000E51095F0F501E50BF5F0E50B35F0F501EA
+:1006C000E501F5F0E50945F0F509E50AF5F0E5097C
+:1006D00065F0F509E509F5F0E50055F0F500C3E52D
+:1006E0000FF5F0E51395F0F509E50BF5F0E50B35A1
+:1006F000F0F509E513F5F0E50F95F0F501E50BF5DB
+:10070000F0E50B35F0F501E501F5F0E50945F0F50B
+:1007100009E50AF5F0E50965F0F509E509F5F0E503
+:100720000055F0F500C3E515F5F0E51295F0F50973
+:10073000E50BF5F0E50B35F0F509E509F5F0E50019
+:1007400055F0F500E500F5F0E50C45F0F50C750009
+:1007500001C3E510F5F0E51195F0F509E50BF5F0AD
+:10076000E50B35F0F509E511F5F0E51095F0F5012B
+:10077000E50BF5F0E50B35F0F501E501F5F0E509E0
+:1007800045F0F509E50AF5F0E50965F0F509E50933
+:10079000F5F0E50055F0F500C3E50FF5F0E513952C
+:1007A000F0F509E50BF5F0E50B35F0F509E513F586
+:1007B000F0E50F95F0F501E50BF5F0E50B35F0F5FB
+:1007C00001E501F5F0E50945F0F509E50AF5F0E583
+:1007D0000965F0F509E509F5F0E50055F0F500C308
+:1007E000E515F5F0E51295F0F509E50BF5F0E50BEB
+:1007F00035F0F509E512F5F0E51595F0F501E50B95
+:10080000F5F0E50B35F0F501E501F5F0E50945F00A
+:10081000F509E50AF5F0E50965F0F509E509F5F0F2
+:10082000E50055F0F500C3E517F5F0E51695F0F590
+:1008300009E50BF5F0E50B35F0F509E509F5F0E50F
+:100840000055F0F500E500F5F0E50C45F0F50C7508
+:100850000101C3750000E50CF5F0E50095F0F50029
+:10086000750000E500F5F0E50035F0F500E500F570
+:10087000F0E50165F0F501C3750000E50DF5F0E563
+:100880000095F0F500750000E500F5F0E50035F0A5
+:10089000F500E500F5F0E50165F0F501C375000030
+:1008A000E50EF5F0E50095F0F500750000E500F5C2
+:1008B000F0E50035F0F500E500F5F0E50165F0F54F
+:1008C00001C3750000E514F5F0E50095F0F500753D
+:1008D0000000E500F5F0E50035F0F500E500F5F085
+:1008E000E50165F0F501750900750A00750B0075E5
+:1008F0000000E501F5F0E50045F0F500E509F5F04B
+:10090000E50045F0F500E50AF5F0E50045F0F500F5
+:10091000E50BF5F0E50045F0F500E5007002800319
+:1009200002096B00751901751A00751B00751C0012
+:10093000750101750900750A00750B00C37500008B
+:10094000E501F5F0E51635F0F516E509F5F0E512E7
+:1009500035F0F512E50AF5F0E51335F0F513E50B82
+:10096000F5F0E51835F0F5180205BC00900000E53B
+:1009700082F509900000E583F50A750100C3750052
+:1009800000E501F5F0E50935F0F501E500F5F0E5E4
+:100990000A35F0F500E519F503E500F502E501F586
+:1009A00082E502F583E503F0750101C3750000E5FA
+:1009B00001F5F0E50935F0F501E500F5F0E50A355A
+:1009C000F0F500E51AF503E500F502E501F582E52D
+:1009D00002F583E503F0750102C3750000E501F53A
+:1009E000F0E50935F0F501E500F5F0E50A35F0F53B
+:1009F00000E51BF503E500F502E501F582E502F5EA
+:100A000083E503F0750103C3750000E501F5F0E52A
+:100A10000935F0F501E500F5F0E50A35F0F500E5FA
+:100A20001CF503E500F502E501F582E502F583E535
+:100A300003F0750000E500F502E500F503E500F5BB
+:100A400004E500F505E51DF517E51EF516E51FF5AE
+:100A50001575E0062506F58275E0003507F583E09B
+:100A6000F51475E0052506F58275E0003507F58378
+:100A7000E0F51375E0042506F58275E0003507F50D
+:100A800083E0F51275E0032506F58275E000350771
+:100A9000F583E0F51175E0022506F58275E0003575
+:100AA00007F583E0F51075E0002506F58275E00096
+:100AB0003507F583E0F508E508C0E075E001250697
+:100AC000F58275E0003507F583E0F508E508C0E03C
+:100AD00075E0072506F50675E0003507F507E50220
+:100AE000F582E503F583E504F500E505F50122004F
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Spurious uninitialized variable warnings, case 2.
+ Taken from cpphash.c (macroexpand) */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+struct definition
+{
+ int nargs;
+ int rest_args;
+};
+
+struct cpp_reader;
+
+enum cpp_token
+{
+ CPP_EOF, CPP_POP, CPP_COMMA, CPP_RPAREN
+};
+
+extern enum cpp_token macarg (struct cpp_reader *, int);
+
+void
+macroexpand (struct cpp_reader *pfile, struct definition *defn)
+{
+ int nargs = defn->nargs;
+
+ if (nargs >= 0)
+ {
+ enum cpp_token token; /* { dg-bogus "token" "uninitialized variable warning" } */
+ int i, rest_args;
+ i = 0;
+ rest_args = 0;
+ do
+ {
+ if (rest_args)
+ continue;
+ if (i < nargs || (nargs == 0 && i == 0))
+ {
+ /* if we are working on last arg which absorbs rest of args... */
+ if (i == nargs - 1 && defn->rest_args)
+ rest_args = 1;
+ token = macarg (pfile, rest_args);
+ }
+ else
+ token = macarg (pfile, 0);
+ if (token == CPP_EOF || token == CPP_POP)
+ return;
+
+ i++;
+ }
+ while (token == CPP_COMMA);
+ }
+}
--- /dev/null
+/* Spurious uninitialized variable warnings, case 2.
+ Taken from cpphash.c (macroexpand) */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+struct definition
+{
+ int nargs;
+ int rest_args;
+};
+
+struct cpp_reader;
+
+enum cpp_token
+{
+ CPP_EOF, CPP_POP, CPP_COMMA, CPP_RPAREN
+};
+
+extern enum cpp_token macarg (struct cpp_reader *, int);
+
+void
+macroexpand (struct cpp_reader *pfile, struct definition *defn)
+{
+ int nargs = defn->nargs;
+
+ if (nargs >= 0)
+ {
+ enum cpp_token token; /* { dg-bogus "token" "uninitialized variable warning" } */
+ int i, rest_args;
+ i = 0;
+ rest_args = 0;
+ do
+ {
+ if (rest_args)
+ continue;
+ if (i < nargs || (nargs == 0 && i == 0))
+ {
+ /* if we are working on last arg which absorbs rest of args... */
+ if (i == nargs - 1 && defn->rest_args)
+ rest_args = 1;
+ token = macarg (pfile, rest_args);
+ }
+ else
+ token = macarg (pfile, 0);
+ if (token == CPP_EOF || token == CPP_POP)
+ return;
+
+ i++;
+ }
+ while (token == CPP_COMMA);
+ }
+}
--- /dev/null
+:100000000000E506758218C39582F506E50775833D
+:10001000009583F507D0E0F50875E00B2506F5821D
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:100030000A2506F58275E0003507F583E508F075B9
+:10004000E0132506F58275E0003507F583E517F026
+:1000500075E0122506F58275E0003507F583E51693
+:10006000F075E0112506F58275E0003507F583E5AA
+:1000700015F075E0102506F58275E0003507F5836B
+:10008000E514F075E00F2506F58275E0003507F5FB
+:1000900083E513F075E00E2506F58275E00035075F
+:1000A000F583E512F075E00D2506F58275E0003563
+:1000B00007F583E511F075E00C2506F58275E00083
+:1000C0003507F583E510F075E0012506F58275E04A
+:1000D000003507F583E51FF075E0002506F582750C
+:1000E000E0003507F583E51EF075E0032506F5828F
+:1000F00075E0003507F583E51DF075E0022506F58E
+:100100008275E0003507F583E51CF0750C00C375BA
+:100110000B00E50CF5F075E0032506F58275E000AF
+:100120003507F583E0F508E50835F0F50DE50BF545
+:10013000F075E0022506F58275E0003507F583E0ED
+:10014000F508E50835F0F50E750C00C3750B00E5F4
+:100150000CF5F0E50D35F0F50CE50BF5F0E50E3599
+:10016000F0F50BE50BF502E50CF582E502F583E011
+:10017000F50875E0092506F58275E0003507F58379
+:10018000E508F0750C01C3750B00E50CF5F0E50D05
+:1001900035F0F50CE50BF5F0E50E35F0F50BE50B5C
+:1001A000F502E50CF582E502F583E0F512750C0227
+:1001B000C3750B00E50CF5F0E50D35F0F50CE50B1E
+:1001C000F5F0E50E35F0F50BE50BF502E50CF582E3
+:1001D000E502F583E0F510750C03C3750B00E50C23
+:1001E000F5F0E50D35F0F50CE50BF5F0E50E35F025
+:1001F000F50BE50BF502E50CF582E502F583E0F57C
+:100200000875E0082506F58275E0003507F583E5F9
+:1002100008F0751A0075190075160075110075E063
+:10022000082506F58275E0003507F583E0F51375BE
+:100230000B80E50BF5F0E51325F0F513E50BF5F074
+:10024000E51125F0F511750F00751400751800758E
+:100250001500750E00751701750B01C3E511F5F05A
+:10026000E51395F0F50DE50EF5F0E50E35F0F50D1D
+:10027000E50DF5F0E50B55F0F50BE50BF5F0E50FA9
+:1002800045F0F50F750B01C3E511F5F0E51395F099
+:10029000F50DE50EF5F0E50E35F0F50DE513F5F08D
+:1002A000E51195F0F50CE50EF5F0E50E35F0F50CE1
+:1002B000E50CF5F0E50D45F0F50DE517F5F0E50D6C
+:1002C00065F0F50DE50DF5F0E50B55F0F50BC3E523
+:1002D00016F5F0E51095F0F50DE50EF5F0E50E35A7
+:1002E000F0F50DE50DF5F0E50B55F0F50BE50BF52B
+:1002F000F0E50F45F0F50F750B01C3E511F5F0E5DD
+:100300001395F0F50DE50EF5F0E50E35F0F50DE57C
+:1003100013F5F0E51195F0F50CE50EF5F0E50E3569
+:10032000F0F50CE50CF5F0E50D45F0F50DE517F5EC
+:10033000F0E50D65F0F50DE50DF5F0E50B55F0F583
+:100340000BC3E516F5F0E51095F0F50DE50EF5F0AB
+:10035000E50E35F0F50DE510F5F0E51695F0F50C28
+:10036000E50EF5F0E50E35F0F50CE50CF5F0E50DD4
+:1003700045F0F50DE517F5F0E50D65F0F50DE50D2A
+:10038000F5F0E50B55F0F50BC3E519F5F0E5129521
+:10039000F0F50DE50EF5F0E50E35F0F50DE50DF592
+:1003A000F0E50B55F0F50BE50BF5F0E50F45F0F535
+:1003B0000F750B01C3E511F5F0E51395F0F50DE5AB
+:1003C0000EF5F0E50E35F0F50DE513F5F0E51195B8
+:1003D000F0F50CE50EF5F0E50E35F0F50CE50CF555
+:1003E000F0E50D45F0F50DE517F5F0E50D65F0F5D7
+:1003F0000DE50DF5F0E50B55F0F50BC3E516F5F041
+:10040000E51095F0F50DE50EF5F0E50E35F0F50D7E
+:10041000E510F5F0E51695F0F50CE50EF5F0E50EB6
+:1004200035F0F50CE50CF5F0E50D45F0F50DE517AB
+:10043000F5F0E50D65F0F50DE50DF5F0E50B55F082
+:10044000F50BC3E519F5F0E51295F0F50DE50EF5A0
+:10045000F0E50E35F0F50DE512F5F0E51995F0F53E
+:100460000CE50EF5F0E50E35F0F50CE50CF5F0E5D4
+:100470000D45F0F50DE517F5F0E50D65F0F50DE529
+:100480000DF5F0E50B55F0F50BC3E51AF5F075E049
+:10049000092506F58275E0003507F583E0F508E5E6
+:1004A0000895F0F50DE50EF5F0E50E35F0F50DE5E6
+:1004B0000DF5F0E50B55F0F50BE50BF5F0E50F4507
+:1004C000F0F50FE50FF50BE518F50C750F01C37589
+:1004D0000D00E50BF5F0E50D95F0F50D750D00E55A
+:1004E0000DF5F0E50D35F0F50DE50DF5F0E50F65D1
+:1004F000F0F50FC3750D00E514F5F0E50D95F0F579
+:100500000D750D00E50DF5F0E50D35F0F50DE50D7A
+:10051000F5F0E50F65F0F50FC3750D00E50CF5F08E
+:10052000E50D95F0F50D750D00E50DF5F0E50D35D2
+:10053000F0F50DE50DF5F0E50F65F0F50FC3750D60
+:1005400000E515F5F0E50D95F0F50D750D00E50DDF
+:10055000F5F0E50D35F0F50DE50DF5F0E50F65F07D
+:10056000F50F751400751800751500750B00E50F73
+:10057000F5F0E50B45F0F50BE514F5F0E50B45F06E
+:10058000F50BE518F5F0E50B45F0F50BE515F5F085
+:10059000E50B45F0F50BE50B7002800302068400C5
+:1005A000750000E500F502E500F503E500F504E55A
+:1005B00000F50575E0132506F58275E0003507F5B1
+:1005C00083E0F51775E0122506F58275E000350722
+:1005D000F583E0F51675E0112506F58275E0003526
+:1005E00007F583E0F51575E0102506F58275E00046
+:1005F0003507F583E0F51475E00F2506F58275E003
+:10060000003507F583E0F51375E00E2506F58275D4
+:10061000E0003507F583E0F51275E00D2506F5825B
+:1006200075E0003507F583E0F51175E00C2506F55A
+:100630008275E0003507F583E0F51075E00A2506C0
+:10064000F58275E0003507F583E0F508E508C0E0C0
+:1006500075E00B2506F58275E0003507F583E0F5BA
+:1006600008E508C0E075E0182506F50675E00035D8
+:1006700007F507E502F582E503F583E504F500E5F6
+:1006800005F501220075140075130075110075172A
+:100690000075080075E0072506F58275E00035074E
+:1006A000F583E508F075080075E0062506F5827506
+:1006B000E0003507F583E508F075080075E00525CD
+:1006C00006F58275E0003507F583E508F07508004A
+:1006D00075E0042506F58275E0003507F583E50829
+:1006E000F000750B0075E0072506F58275E0003512
+:1006F00007F583E0F508E508F5F0E50B45F0F50BA7
+:1007000075E0062506F58275E0003507F583E0F50E
+:1007100008E508F5F0E50B45F0F50B75E005250655
+:10072000F58275E0003507F583E0F508E508F5F09A
+:10073000E50B45F0F50B75E0042506F58275E00044
+:100740003507F583E0F508E508F5F0E50B45F0F52C
+:100750000BE50B7002800302172F00E517F50E75ED
+:10076000E0082506F58275E0003507F583E0F50D14
+:10077000750080E500F5F0E50E25F0F50EE500F5D5
+:10078000F0E50D25F0F50D750C00750F00751500E1
+:10079000751600750B00750A01750001C3E50DF5AE
+:1007A000F0E50E95F0F509E50BF5F0E50B35F0F504
+:1007B00009E509F5F0E50055F0F500E500F5F0E58F
+:1007C0000C45F0F50C750001C3E50DF5F0E50E954F
+:1007D000F0F509E50BF5F0E50B35F0F509E50EF55B
+:1007E000F0E50D95F0F501E50BF5F0E50B35F0F5CD
+:1007F00001E501F5F0E50945F0F509E50AF5F0E553
+:100800000965F0F509E509F5F0E50055F0F500C3D7
+:10081000E510F5F0E51195F0F509E50BF5F0E50BC0
+:1008200035F0F509E509F5F0E50055F0F500E500CE
+:10083000F5F0E50C45F0F50C750001C3E50DF5F09C
+:10084000E50E95F0F509E50BF5F0E50B35F0F5094A
+:10085000E50EF5F0E50D95F0F501E50BF5F0E50B8E
+:1008600035F0F501E501F5F0E50945F0F509E50A92
+:10087000F5F0E50965F0F509E509F5F0E50055F055
+:10088000F500C3E510F5F0E51195F0F509E50BF578
+:10089000F0E50B35F0F509E511F5F0E51095F0F50B
+:1008A00001E50BF5F0E50B35F0F501E501F5F0E5B7
+:1008B0000945F0F509E50AF5F0E50965F0F509E502
+:1008C00009F5F0E50055F0F500C3E512F5F0E51384
+:1008D00095F0F509E50BF5F0E50B35F0F509E509BF
+:1008E000F5F0E50055F0F500E500F5F0E50C45F014
+:1008F000F50C750001C3E50DF5F0E50E95F0F50971
+:10090000E50BF5F0E50B35F0F509E50EF5F0E50D35
+:1009100095F0F501E50BF5F0E50B35F0F501E50196
+:10092000F5F0E50945F0F509E50AF5F0E50965F0AA
+:10093000F509E509F5F0E50055F0F500C3E510F51A
+:10094000F0E51195F0F509E50BF5F0E50B35F0F55F
+:1009500009E511F5F0E51095F0F501E50BF5F0E589
+:100960000B35F0F501E501F5F0E50945F0F509E590
+:100970000AF5F0E50965F0F509E509F5F0E500553A
+:10098000F0F500C3E512F5F0E51395F0F509E50B78
+:10099000F5F0E50B35F0F509E513F5F0E51295F006
+:1009A000F501E50BF5F0E50B35F0F501E501F5F0A6
+:1009B000E50945F0F509E50AF5F0E50965F0F50901
+:1009C000E509F5F0E50055F0F500C375E0092506E9
+:1009D000F58275E0003507F583E0F508E508F5F0E8
+:1009E000E51495F0F509E50BF5F0E50B35F0F509A3
+:1009F000E509F5F0E50055F0F500E500F5F0E50C4A
+:100A000045F0F50C750000E50CF5F0E50045F0F556
+:100A100000E50FF5F0E50045F0F500E515F5F0E52A
+:100A20000045F0F500E516F5F0E50045F0F500E5C8
+:100A3000007002800302171F007500007501007529
+:100A40000900750A00750C00C3E500F5F075E009B2
+:100A50002506F58275E0003507F583E0F508E50821
+:100A600095F0F500E500F5F0E50C45F0F50CC3E573
+:100A700001F5F0E51295F0F500E500F5F0E50C451F
+:100A8000F0F50CC3E509F5F0E51095F0F500E5008B
+:100A9000F5F0E50C45F0F50CC3E50AF5F075E00856
+:100AA0002506F58275E0003507F583E0F508E508D1
+:100AB00095F0F500E500F5F0E50C45F0F50C750155
+:100AC00000750900750A00E50CF500750C01C37589
+:100AD0000B00E500F5F0E50B95F0F50B750B00E567
+:100AE0000BF5F0E50B35F0F50BE50BF5F0E50C65D6
+:100AF000F0F50CC3750B00E501F5F0E50B95F0F58D
+:100B00000B750B00E50BF5F0E50B35F0F50BE50B80
+:100B1000F5F0E50C65F0F50CC3750B00E509F5F093
+:100B2000E50B95F0F50B750B00E50BF5F0E50B35D6
+:100B3000F0F50BE50BF5F0E50C65F0F50CC3750B66
+:100B400000E50AF5F0E50B95F0F50B750B00E50BEC
+:100B5000F5F0E50B35F0F50BE50BF5F0E50C65F080
+:100B6000F50C750100750900750A00750000E50CAB
+:100B7000F5F0E50045F0F500E501F5F0E50045F09C
+:100B8000F500E509F5F0E50045F0F500E50AF5F0BA
+:100B9000E50045F0F500E500700280030215BA009B
+:100BA000750100750900750A00750B00750000E5F8
+:100BB00001F5F0E50045F0F500E509F5F0E5004543
+:100BC000F0F500E50AF5F0E50045F0F500E50BF578
+:100BD000F0E50045F0F500E500700280030215AA7B
+:100BE00000750100750900750A00750B007500009D
+:100BF000E501F5F0E50045F0F500E509F5F0E50063
+:100C000045F0F500E50AF5F0E50045F0F500E50BE7
+:100C1000F5F0E50045F0F500E500700280030211F3
+:100C2000A200751D00751C00751B00751A0075E08B
+:100C3000012506F58275E0003507F583E0F51F759F
+:100C4000E0002506F58275E0003507F583E0F51E26
+:100C5000E582F502E583F503E500F504E501F50518
+:100C6000E502F500E503F501E504F509E505F50AFA
+:100C7000750B00750C00750D00750F00750E00C327
+:100C8000E50BF5F0E50095F0F50BE50BF5F0E50E5D
+:100C900045F0F50EC3E50CF5F0E50195F0F50BE533
+:100CA0000BF5F0E50E45F0F50EC3E50DF5F0E509A1
+:100CB00095F0F50BE50BF5F0E50E45F0F50EC3E507
+:100CC0000FF5F0E50A95F0F50BE50BF5F0E50E45AF
+:100CD000F0F50E750C00750D00750F00E50EF5169C
+:100CE000E50CF515E50FF50C750E01C3750B00E568
+:100CF00016F5F0E50B95F0F50B750B00E50BF5F02F
+:100D0000E50B35F0F50BE50BF5F0E50E65F0F50EAE
+:100D1000C3750B00E515F5F0E50B95F0F50B750BBC
+:100D200000E50BF5F0E50B35F0F50BE50BF5F0E51F
+:100D30000E65F0F50EC3750B00E50DF5F0E50B95AE
+:100D4000F0F50B750B00E50BF5F0E50B35F0F50B49
+:100D5000E50BF5F0E50E65F0F50EC3750B00E50C3F
+:100D6000F5F0E50B95F0F50B750B00E50BF5F0E5EF
+:100D70000B35F0F50BE50BF5F0E50E65F0F50E75AE
+:100D80000C00750D00750F00750B00E50EF5F0E514
+:100D90000B45F0F50BE50CF5F0E50B45F0F50BE533
+:100DA0000DF5F0E50B45F0F50BE50FF5F0E50B451E
+:100DB000F0F50BE50B7002800302119200750B0138
+:100DC000750C00750D00750F00750E00C3E50BF571
+:100DD000F0E50095F0F50BE50BF5F0E50E45F0F5C7
+:100DE0000EC3E50CF5F0E50195F0F50BE50BF5F01C
+:100DF000E50E45F0F50EC3E50DF5F0E50995F0F5C6
+:100E00000BE50BF5F0E50E45F0F50EC3E50FF5F03B
+:100E1000E50A95F0F50BE50BF5F0E50E45F0F50E5E
+:100E2000750C00750D00750F00E50EF516E50CF557
+:100E300015E50FF50C750E01C3750B00E516F5F001
+:100E4000E50B95F0F50B750B00E50BF5F0E50B35B3
+:100E5000F0F50BE50BF5F0E50E65F0F50EC3750B3F
+:100E600000E515F5F0E50B95F0F50B750B00E50BBE
+:100E7000F5F0E50B35F0F50BE50BF5F0E50E65F05B
+:100E8000F50EC3750B00E50DF5F0E50B95F0F50BD0
+:100E9000750B00E50BF5F0E50B35F0F50BE50BF503
+:100EA000F0E50E65F0F50EC3750B00E50CF5F0E509
+:100EB0000B95F0F50B750B00E50BF5F0E50B35F038
+:100EC000F50BE50BF5F0E50E65F0F50E750C00750C
+:100ED0000D00750F00750B00E50EF5F0E50B45F004
+:100EE000F50BE50CF5F0E50B45F0F50BE50DF5F030
+:100EF000E50B45F0F50BE50FF5F0E50B45F0F50BCF
+:100F0000E50B7002800302118200750C00750D0064
+:100F1000750E00750F00750B00E50CF5F0E50B453F
+:100F2000F0F50BE50DF5F0E50B45F0F50BE50EF5ED
+:100F3000F0E50B45F0F50BE50FF5F0E50B45F0F5A9
+:100F40000BE50B7002800302117E00750B01750C1E
+:100F500000750D00750E00C3750F00E50BF5F0E58B
+:100F60001435F0F514E50CF5F0E51335F0F513E55F
+:100F70000DF5F0E51135F0F511E50EF5F0E5173555
+:100F8000F0F517750B02750C00750D00750F0075E7
+:100F90000E00C3E50BF5F0E50095F0F50BE50BF55C
+:100FA000F0E50E45F0F50EC3E50CF5F0E50195F022
+:100FB000F50BE50BF5F0E50E45F0F50EC3E50DF587
+:100FC000F0E50995F0F50BE50BF5F0E50E45F0F5CC
+:100FD0000EC3E50FF5F0E50A95F0F50BE50BF5F01E
+:100FE000E50E45F0F50E750B00750C00750F00E56C
+:100FF0000EF515750E01C3750D00E515F5F0E50D3F
+:1010000095F0F50D750D00E50DF5F0E50D35F0F5F4
+:101010000DE50DF5F0E50E65F0F50EC3750D00E577
+:101020000BF5F0E50D95F0F50D750D00E50DF5F0FE
+:10103000E50D35F0F50DE50DF5F0E50E65F0F50E75
+:10104000C3750D00E50CF5F0E50D95F0F50D750D8A
+:1010500000E50DF5F0E50D35F0F50DE50DF5F0E5E4
+:101060000E65F0F50EC3750D00E50FF5F0E50D9575
+:10107000F0F50D750D00E50DF5F0E50D35F0F50D0C
+:10108000E50DF5F0E50E65F0F50E750B00750C003D
+:10109000750F00E50EF516E50BF515E50CF50EE5FB
+:1010A0000FF50D750C01C3750B00E516F5F0E50B9A
+:1010B00095F0F50B750B00E50BF5F0E50B35F0F54C
+:1010C0000BE50BF5F0E50C65F0F50CC3750B00E5D1
+:1010D00015F5F0E50B95F0F50B750B00E50BF5F04C
+:1010E000E50B35F0F50BE50BF5F0E50C65F0F50CCF
+:1010F000C3750B00E50EF5F0E50B95F0F50B750BE0
+:1011000000E50BF5F0E50B35F0F50BE50BF5F0E53B
+:101110000C65F0F50CC3750B00E50DF5F0E50B95CE
+:10112000F0F50B750B00E50BF5F0E50B35F0F50B65
+:10113000E50BF5F0E50C65F0F50C750D00750E008E
+:10114000750F00750B00E50CF5F0E50B45F0F50BA0
+:10115000E50DF5F0E50B45F0F50BE50EF5F0E50BCB
+:1011600045F0F50BE50FF5F0E50B45F0F50BE50B5C
+:101170007002800302117A0206E1000205A000025B
+:1011800005A000750C01750D00750E00750F0002AD
+:101190000F1600750C01750D00750E00750F00021D
+:1011A0000F1600750001750100750900750A00C36E
+:1011B000E500F5F075E0092506F58275E0003507D4
+:1011C000F583E0F508E50895F0F500E501F5F0E5B3
+:1011D0001295F0F501E509F5F0E51095F0F509E552
+:1011E0000AF5F075E0082506F58275E0003507F58B
+:1011F00083E0F508E50895F0F50A750C00C3E500F5
+:10120000F5F0E51495F0F500E500F5F0E50C45F096
+:10121000F50CC3E501F5F0E51395F0F500E500F5F3
+:10122000F0E50C45F0F50CC3E509F5F0E51195F096
+:10123000F500E500F5F0E50C45F0F50CC3E50AF521
+:10124000F0E51795F0F500E500F5F0E50C45F0F553
+:101250000C750100750900750A00E50CF500750CA8
+:1012600001C3750B00E500F5F0E50B95F0F50B7586
+:101270000B00E50BF5F0E50B35F0F50BE50BF5F0A4
+:10128000E50C65F0F50CC3750B00E501F5F0E50B19
+:1012900095F0F50B750B00E50BF5F0E50B35F0F56A
+:1012A0000BE50BF5F0E50C65F0F50CC3750B00E5EF
+:1012B00009F5F0E50B95F0F50B750B00E50BF5F076
+:1012C000E50B35F0F50BE50BF5F0E50C65F0F50CED
+:1012D000C3750B00E50AF5F0E50B95F0F50B750B02
+:1012E00000E50BF5F0E50B35F0F50BE50BF5F0E55A
+:1012F0000C65F0F50C750100750900750A007500A4
+:1013000000E50CF5F0E50045F0F500E501F5F0E548
+:101310000045F0F500E509F5F0E50045F0F500E5DC
+:101320000AF5F0E50045F0F500E5007002800302E3
+:10133000145100750D00750100750900750A0075DE
+:101340000000E50DF5F0E50045F0F500E501F5F0EC
+:10135000E50045F0F500E509F5F0E50045F0F5009C
+:10136000E50AF5F0E50045F0F500E50070028003C0
+:101370000213FD0075E0012506F58275E0003507D2
+:10138000F583E0F51F75E0002506F58275E0003570
+:1013900007F583E0F51E75E0072506F58275E00088
+:1013A0003507F583E0F51D75E0062506F58275E045
+:1013B000003507F583E0F51C75E0052506F5827517
+:1013C000E0003507F583E0F51B75E0042506F5829E
+:1013D00075E0003507F583E0F51AE582F502E5834F
+:1013E000F503E500F504E501F505E502F500E50383
+:1013F000F501E504F509E505F50A020C700075082C
+:101400000175E0072506F58275E0003507F583E5EF
+:1014100008F075080075E0062506F58275E00035D0
+:1014200007F583E508F075080075E0052506F582E7
+:1014300075E0003507F583E508F075080075E004F0
+:101440002506F58275E0003507F583E508F00213FF
+:101450007400750104C3750000E501F5F075E00343
+:101460002506F58275E0003507F583E0F508E50807
+:1014700035F0F509E500F5F075E0022506F5827511
+:10148000E0003507F583E0F508E50835F0F50A7565
+:101490000100C3750000E501F5F0E50935F0F5013F
+:1014A000E500F5F0E50A35F0F500E500F502E501A7
+:1014B000F582E502F583E0F50B750101C3750000C7
+:1014C000E501F5F0E50935F0F501E500F5F0E50A8F
+:1014D00035F0F500E500F502E501F582E502F5835A
+:1014E000E0F50D750102C3750000E501F5F0E509B1
+:1014F00035F0F501E500F5F0E50A35F0F500E50019
+:10150000F502E501F582E502F583E0F50F750103CB
+:10151000C3750000E501F5F0E50935F0F501E500DA
+:10152000F5F0E50A35F0F500E500F502E501F58294
+:10153000E502F583E0F50C75000075010075090002
+:10154000750A00E50DF50E750D00C3E500F5F0E533
+:101550000B95F0F500E500F5F0E50D45F0F50DC350
+:10156000E501F5F0E50E95F0F500E500F5F0E50D87
+:1015700045F0F50DC3E509F5F0E50F95F0F500E54B
+:1015800000F5F0E50D45F0F50DC3E50AF5F0E50CC5
+:1015900095F0F500E500F5F0E50D45F0F50D750168
+:1015A00000750900750A0002133F007501017509F5
+:1015B00000750A00750B00020BED00750000750147
+:1015C00000750900750A00750C00C3E500F5F0E52B
+:1015D0001495F0F500E500F5F0E50C45F0F50CC3C9
+:1015E000E501F5F0E51395F0F500E500F5F0E50C03
+:1015F00045F0F50CC3E509F5F0E51195F0F500E5CA
+:1016000000F5F0E50C45F0F50CC3E50AF5F0E5173B
+:1016100095F0F500E500F5F0E50C45F0F50C7501E9
+:1016200000750900750A00E50CF500750C01C3751D
+:101630000B00E500F5F0E50B95F0F50B750B00E5FB
+:101640000BF5F0E50B35F0F50BE50BF5F0E50C656A
+:10165000F0F50CC3750B00E501F5F0E50B95F0F521
+:101660000B750B00E50BF5F0E50B35F0F50BE50B15
+:10167000F5F0E50C65F0F50CC3750B00E509F5F028
+:10168000E50B95F0F50B750B00E50BF5F0E50B356B
+:10169000F0F50BE50BF5F0E50C65F0F50CC3750BFB
+:1016A00000E50AF5F0E50B95F0F50B750B00E50B81
+:1016B000F5F0E50B35F0F50BE50BF5F0E50C65F015
+:1016C000F50C750100750900750A00750000E50C40
+:1016D000F5F0E50045F0F500E501F5F0E50045F031
+:1016E000F500E509F5F0E50045F0F500E50AF5F04F
+:1016F000E50045F0F500E5007002800302170F00D9
+:10170000750100750900750A00750B00020BAC002D
+:10171000750101750900750A00750B00020BAC001C
+:10172000750101750900750A00750B00020BED00CB
+:10173000020F830000000000000000000000000015
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Spurious uninit variable warnings, case 3.
+ Inspired by cppexp.c (parse_charconst) */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+extern void error (char *);
+
+int
+parse_charconst (const char *start, const char *end)
+{
+ int c; /* { dg-bogus "c" "uninitialized variable warning" } */
+ int nchars, retval;
+
+ nchars = 0;
+ retval = 0;
+ while (start < end)
+ {
+ c = *start++;
+ if (c == '\'')
+ break;
+ nchars++;
+ retval += c;
+ retval <<= 8;
+ }
+
+ if (nchars == 0)
+ return 0;
+
+ if (c != '\'')
+ error ("malformed character constant");
+
+ return retval;
+}
--- /dev/null
+/* Spurious uninit variable warnings, case 3.
+ Inspired by cppexp.c (parse_charconst) */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+extern void error (char *);
+
+int
+parse_charconst (const char *start, const char *end)
+{
+ int c; /* { dg-bogus "c" "uninitialized variable warning" } */
+ int nchars, retval;
+
+ nchars = 0;
+ retval = 0;
+ while (start < end)
+ {
+ c = *start++;
+ if (c == '\'')
+ break;
+ nchars++;
+ retval += c;
+ retval <<= 8;
+ }
+
+ if (nchars == 0)
+ return 0;
+
+ if (c != '\'')
+ error ("malformed character constant");
+
+ return retval;
+}
--- /dev/null
+/* Spurious uninit variable warnings, case 4.
+ Simplified version of cppexp.c (cpp_parse_expr).
+
+ This one is really fragile, it gets it right if you take out case
+ 1, or if the structure is replaced by an int, or if the structure
+ has fewer members (!) */
+
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+extern void abort (void);
+
+struct operation {
+ short op;
+ char rprio;
+ char flags;
+ char unsignedp;
+ long value;
+};
+
+extern struct operation cpp_lex (void);
+
+void
+cpp_parse_expr (void)
+{
+ int rprio; /* { dg-bogus "rprio" "uninitialized variable warning PR19833" } */
+ struct operation op;
+
+ for (;;)
+ {
+ op = cpp_lex ();
+
+ switch (op.op)
+ {
+ case 0:
+ break;
+ case 1:
+ return;
+ case 2:
+ rprio = 1;
+ break;
+ default:
+ return;
+ }
+
+ if (op.op == 0)
+ return;
+
+ if (rprio != 1)
+ abort();
+ }
+}
--- /dev/null
+/* Spurious uninit variable warnings, case 4.
+ Simplified version of cppexp.c (cpp_parse_expr).
+
+ This one is really fragile, it gets it right if you take out case
+ 1, or if the structure is replaced by an int, or if the structure
+ has fewer members (!) */
+
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+extern void abort (void);
+
+struct operation {
+ short op;
+ char rprio;
+ char flags;
+ char unsignedp;
+ long value;
+};
+
+extern struct operation cpp_lex (void);
+
+void
+cpp_parse_expr (void)
+{
+ int rprio; /* { dg-bogus "rprio" "uninitialized variable warning PR19833" } */
+ struct operation op;
+
+ for (;;)
+ {
+ op = cpp_lex ();
+
+ switch (op.op)
+ {
+ case 0:
+ break;
+ case 1:
+ return;
+ case 2:
+ rprio = 1;
+ break;
+ default:
+ return;
+ }
+
+ if (op.op == 0)
+ return;
+
+ if (rprio != 1)
+ abort();
+ }
+}
--- /dev/null
+:10000000000000E50675820FC39582F506E50775C9
+:1000100083009583F507D0E0F50875E00A2506F51D
+:100020008275E0003507F583E508F0D0E0F5087546
+:10003000E0092506F58275E0003507F583E508F04F
+:1000400075E00E2506F58275E0003507F583E513AA
+:10005000F075E00D2506F58275E0003507F583E5BE
+:1000600012F075E00C2506F58275E0003507F58382
+:10007000E511F075E00B2506F58275E0003507F512
+:1000800083E510F0750001750100750900750A001F
+:10009000750C01C3750B00E500F5F0E50B95F0F567
+:1000A0000B750B00E50BF5F0E50B35F0F50BE50BEB
+:1000B000F5F0E50C65F0F50CC3750B00E501F5F006
+:1000C000E50B95F0F50B750B00E50BF5F0E50B3541
+:1000D000F0F50BE50BF5F0E50C65F0F50CC3750BD1
+:1000E00000E509F5F0E50B95F0F50B750B00E50B58
+:1000F000F5F0E50B35F0F50BE50BF5F0E50C65F0EB
+:10010000F50CC3750B00E50AF5F0E50B95F0F50B62
+:10011000750B00E50BF5F0E50B35F0F50BE50BF590
+:10012000F0E50C65F0F50C750100750900750A0025
+:10013000750000E50CF5F0E50045F0F500E501F58A
+:10014000F0E50045F0F500E509F5F0E50045F0F5CE
+:1001500000E50AF5F0E50045F0F500E500700280E5
+:1001600003020B1A00E506F509E507F50A7501001B
+:10017000C3750000E501F5F0E50935F0F501E5008E
+:10018000F5F0E50A35F0F500E501F51FE500F51E8F
+:10019000E506F509E507F50A750100C3750000E5F8
+:1001A00001F5F0E50935F0F501E500F5F0E50A3572
+:1001B000F0F50A750900C3750000E509F5F0E501E1
+:1001C00035F0F501E500F5F0E50A35F0F500E5015B
+:1001D000F509E500F50A750100C3750000E501F5B4
+:1001E000F0E50935F0F501E500F5F0E50A35F0F543
+:1001F00000E500F502E501F582E502F583E0F50B87
+:10020000750101C3750000E501F5F0E50935F0F56C
+:1002100001E500F5F0E50A35F0F500E500F502E549
+:1002200001F582E502F583E0F501E501F50C7500C5
+:1002300080E501F5F0E50055F0F50EE500F5F0E597
+:100240000E84F50E7500FFE500F5F0E50EA4F50E41
+:10025000E50EF50D750000750100750900750A00C1
+:10026000750F00C3E500F5F0E50B95F0F500E5002E
+:10027000F5F0E50F45F0F50FC3E501F5F0E50C9558
+:10028000F0F500E500F5F0E50F45F0F50FC3E509E1
+:10029000F5F0E50D95F0F500E500F5F0E50F45F01A
+:1002A000F50FC3E50AF5F0E50E95F0F500E500F56C
+:1002B000F0E50F45F0F50F750100750900750A00AE
+:1002C000E50FF500750F01C3750B00E500F5F0E5CE
+:1002D0000B95F0F50B750B00E50BF5F0E50B35F024
+:1002E000F50BE50BF5F0E50F65F0F50FC3750B00A9
+:1002F000E501F5F0E50B95F0F50B750B00E50BF559
+:10030000F0E50B35F0F50BE50BF5F0E50F65F0F5D5
+:100310000FC3750B00E509F5F0E50B95F0F50B75CE
+:100320000B00E50BF5F0E50B35F0F50BE50BF5F003
+:10033000E50F65F0F50FC3750B00E50AF5F0E50B69
+:1003400095F0F50B750B00E50BF5F0E50B35F0F5C9
+:100350000BE50BF5F0E50F65F0F50F75010075097C
+:1003600000750A00750000E50FF5F0E50045F0F5B1
+:1003700000E501F5F0E50045F0F500E509F5F0E5EB
+:100380000045F0F500E50AF5F0E50045F0F500E57B
+:100390000070028003020B1500E506F509E507F57C
+:1003A0000A750100C3750000E501F5F0E50935F0B7
+:1003B000F501E500F5F0E50A35F0F50A750900C329
+:1003C000750000E509F5F0E50135F0F501E500F50A
+:1003D000F0E50A35F0F500E501F509E500F50A75E7
+:1003E0000100C3750000E501F5F0E50935F0F50100
+:1003F000E500F5F0E50A35F0F500E500F502E50168
+:10040000F582E502F583E0F50B750101C375000087
+:10041000E501F5F0E50935F0F501E500F5F0E50A4F
+:1004200035F0F500E500F502E501F582E502F5831A
+:10043000E0F501E501F50C750080E501F5F0E5005A
+:1004400055F0F50EE500F5F0E50E84F50E7500FFAC
+:10045000E500F5F0E50EA4F50EE50EF50D750001CD
+:10046000750100750900750A00750F00C3E500F5F8
+:10047000F0E50B95F0F500E500F5F0E50F45F0F53A
+:100480000FC3E501F5F0E50C95F0F500E500F5F09A
+:10049000E50F45F0F50FC3E509F5F0E50D95F0F52D
+:1004A00000E500F5F0E50F45F0F50FC3E50AF5F0BE
+:1004B000E50E95F0F500E500F5F0E50F45F0F50FD8
+:1004C000750100750900750A00E50FF500750F014B
+:1004D000C3750B00E500F5F0E50B95F0F50B750B1A
+:1004E00000E50BF5F0E50B35F0F50BE50BF5F0E568
+:1004F0000F65F0F50FC3750B00E501F5F0E50B9501
+:10050000F0F50B750B00E50BF5F0E50B35F0F50B91
+:10051000E50BF5F0E50F65F0F50FC3750B00E50988
+:10052000F5F0E50B95F0F50B750B00E50BF5F0E537
+:100530000B35F0F50BE50BF5F0E50F65F0F50FC3A6
+:10054000750B00E50AF5F0E50B95F0F50B750B0062
+:10055000E50BF5F0E50B35F0F50BE50BF5F0E50FE8
+:1005600065F0F50F750100750900750A007500004A
+:10057000E50FF5F0E50045F0F500E501F5F0E500E3
+:1005800045F0F500E509F5F0E50045F0F500E50A70
+:10059000F5F0E50045F0F500E50070028003020B80
+:1005A0001000E506F509E507F50A750100C37500B9
+:1005B00000E501F5F0E50935F0F501E500F5F0E5B8
+:1005C0000A35F0F50A750900C3750000E509F5F074
+:1005D000E50135F0F501E500F5F0E50A35F0F50047
+:1005E000E501F509E500F50A750100C3750000E5B0
+:1005F00001F5F0E50935F0F501E500F5F0E50A351E
+:10060000F0F500E500F502E501F582E502F583E08D
+:10061000F50B750101C3750000E501F5F0E509353D
+:10062000F0F501E500F5F0E50A35F0F500E500F537
+:1006300002E501F582E502F583E0F501E501F50C3F
+:10064000750080E501F5F0E50055F0F50EE500F5E3
+:10065000F0E50E84F50E7500FFE500F5F0E50EA45B
+:10066000F50EE50EF50D75000275010075090075B2
+:100670000A00750F00C3E500F5F0E50B95F0F500F5
+:10068000E500F5F0E50F45F0F50FC3E501F5F0E500
+:100690000C95F0F500E500F5F0E50F45F0F50FC31A
+:1006A000E509F5F0E50D95F0F500E500F5F0E50F4D
+:1006B00045F0F50FC3E50AF5F0E50E95F0F500E518
+:1006C00000F5F0E50F45F0F50F75010075090075AF
+:1006D0000A00E50FF500750F01C3750B00E500F585
+:1006E000F0E50B95F0F50B750B00E50BF5F0E50B60
+:1006F00035F0F50BE50BF5F0E50F65F0F50FC3757B
+:100700000B00E501F5F0E50B95F0F50B750B00E539
+:100710000BF5F0E50B35F0F50BE50BF5F0E50F65A6
+:10072000F0F50FC3750B00E509F5F0E50B95F0F555
+:100730000B750B00E50BF5F0E50B35F0F50BE50B54
+:10074000F5F0E50F65F0F50FC3750B00E50AF5F060
+:10075000E50B95F0F50B750B00E50BF5F0E50B35AA
+:10076000F0F50BE50BF5F0E50F65F0F50F75010001
+:10077000750900750A00750000E50FF5F0E5004504
+:10078000F0F500E501F5F0E50045F0F500E509F5C7
+:10079000F0E50045F0F500E50AF5F0E50045F0F577
+:1007A00000E5007002800302084C0000750000E5BF
+:1007B00000F502E500F503E500F504E500F5057533
+:1007C000E00E2506F58275E0003507F583E0F513A8
+:1007D00075E00D2506F58275E0003507F583E0F537
+:1007E0001275E00C2506F58275E0003507F583E00B
+:1007F000F51175E00B2506F58275E0003507F583E8
+:10080000E0F51075E0092506F58275E0003507F57D
+:1008100083E0F508E508C0E075E00A2506F5827575
+:10082000E0003507F583E0F508E508C0E075E00F66
+:100830002506F50675E0003507F507E502F582E5C2
+:1008400003F583E504F500E505F5012200007510C8
+:100850000175110075120075130000E506F509E534
+:1008600007F50A750100C3750000E501F5F0E5091B
+:1008700035F0F501E500F5F0E50A35F0F50A750902
+:1008800000C3750000E509F5F0E50135F0F501E577
+:1008900000F5F0E50A35F0F500E501F509E500F5AC
+:1008A0000A750100C3750000E501F5F0E50935F0B2
+:1008B000F501E500F5F0E50A35F0F500E500F50293
+:1008C000E501F582E502F583E0F50B750101C375DD
+:1008D0000000E501F5F0E50935F0F501E500F5F07A
+:1008E000E50A35F0F500E500F502E501F582E502DF
+:1008F000F583E0F501E501F50C750080E501F5F003
+:10090000E50055F0F50EE500F5F0E50E84F50E7501
+:1009100000FFE500F5F0E50EA4F50EE50EF50D750A
+:100920000000750100750900750A00750F00C3E528
+:1009300000F5F0E50B95F0F500E500F5F0E50F4565
+:10094000F0F50FC3E501F5F0E50C95F0F500E500D5
+:10095000F5F0E50F45F0F50FC3E509F5F0E50D9568
+:10096000F0F500E500F5F0E50F45F0F50FC3E50AF9
+:10097000F5F0E50E95F0F500E500F5F0E50F45F032
+:10098000F50F750100750900750A00E50FF5007592
+:100990000F01C3750B00E500F5F0E50B95F0F50BC5
+:1009A000750B00E50BF5F0E50B35F0F50BE50BF5F8
+:1009B000F0E50F65F0F50FC3750B00E501F5F0E507
+:1009C0000B95F0F50B750B00E50BF5F0E50B35F02D
+:1009D000F50BE50BF5F0E50F65F0F50FC3750B00B2
+:1009E000E509F5F0E50B95F0F50B750B00E50BF55A
+:1009F000F0E50B35F0F50BE50BF5F0E50F65F0F5DF
+:100A00000FC3750B00E50AF5F0E50B95F0F50B75D6
+:100A10000B00E50BF5F0E50B35F0F50BE50BF5F00C
+:100A2000E50F65F0F50F750100750900750A007591
+:100A30000000E50FF5F0E50045F0F500E501F5F003
+:100A4000E50045F0F500E509F5F0E50045F0F500B5
+:100A5000E50AF5F0E50045F0F500E50070028003D9
+:100A6000020B0C00750001750100750900750A0084
+:100A7000750B00C3E500F5F0E51095F0F500E50015
+:100A8000F5F0E50B45F0F50BC3E501F5F0E5119543
+:100A9000F0F500E500F5F0E50B45F0F50BC3E509D1
+:100AA000F5F0E51295F0F500E500F5F0E50B45F001
+:100AB000F50BC3E50AF5F0E51395F0F500E500F553
+:100AC000F0E50B45F0F50B750100750900750A009E
+:100AD000750000E50BF5F0E50045F0F500E501F5E2
+:100AE000F0E50045F0F500E509F5F0E50045F0F525
+:100AF00000E50AF5F0E50045F0F500E5007002803C
+:100B000003020B080002008400020084000207AC0C
+:100B100000000207AC000002085A000207AC000007
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Spurious uninitialized-variable warnings. */
+
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+extern void use(int);
+extern void foo(void);
+
+void
+func1(int cond)
+{
+ int x; /* { dg-bogus "x" "uninitialized variable warning" } */
+
+ if(cond)
+ x = 1;
+
+ foo();
+
+ if(cond)
+ use(x);
+}
+
+void
+func2 (int cond)
+{
+ int x; /* { dg-bogus "x" "uninitialized variable warning" } */
+ int flag = 0;
+
+ if(cond)
+ {
+ x = 1;
+ flag = 1;
+ }
+
+ foo();
+
+ if(flag)
+ use(x);
+}
--- /dev/null
+/* Spurious uninitialized-variable warnings. */
+
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+extern void use(int);
+extern void foo(void);
+
+void
+func1(int cond)
+{
+ int x; /* { dg-bogus "x" "uninitialized variable warning" } */
+
+ if(cond)
+ x = 1;
+
+ foo();
+
+ if(cond)
+ use(x);
+}
+
+void
+func2 (int cond)
+{
+ int x; /* { dg-bogus "x" "uninitialized variable warning" } */
+ int flag = 0;
+
+ if(cond)
+ {
+ x = 1;
+ flag = 1;
+ }
+
+ foo();
+
+ if(flag)
+ use(x);
+}
--- /dev/null
+:10000000000000E50675820EC39582F506E50775CA
+:1000100083009583F507D0E0F50875E0012506F526
+:100020008275E0003507F583E508F0D0E0F5087546
+:10003000E0002506F58275E0003507F583E508F058
+:1000400075E0092506F58275E0003507F583E517AB
+:10005000F075E0082506F58275E0003507F583E5C3
+:1000600016F075E0072506F58275E0003507F58383
+:10007000E515F075E0062506F58275E0003507F513
+:1000800083E514F075E0052506F58275E000350777
+:10009000F583E513F075E0042506F58275E000357B
+:1000A00007F583E512F075E0032506F58275E0009B
+:1000B0003507F583E511F075E0022506F58275E058
+:1000C000003507F583E510F0E51FF510E51EF51185
+:1000D000E51DF512E51CF513750000E510F5F0E5DA
+:1000E0000045F0F500E511F5F0E50045F0F500E517
+:1000F00012F5F0E50045F0F500E513F5F0E50045F3
+:10010000F0F500E5007002800302023A007500007D
+:10011000E510F5F0E50045F0F500E511F5F0E50036
+:1001200045F0F500E512F5F0E50045F0F500E513C2
+:10013000F5F0E50045F0F500E500700280030202ED
+:100140002600750000E500F502E500F503E500F581
+:1001500004E500F50575E0092506F58275E0003532
+:1001600007F583E0F51775E0082506F58275E000D0
+:100170003507F583E0F51675E0072506F58275E08D
+:10018000003507F583E0F51575E0062506F582755F
+:10019000E0003507F583E0F51475E0052506F582E6
+:1001A00075E0003507F583E0F51375E0042506F5E5
+:1001B0008275E0003507F583E0F51275E00325064A
+:1001C000F58275E0003507F583E0F51175E002254D
+:1001D00006F58275E0003507F583E0F51075E0005F
+:1001E0002506F58275E0003507F583E0F508E5089A
+:1001F000C0E075E0012506F58275E0003507F5835E
+:10020000E0F508E508C0E075E00E2506F50675E0A6
+:10021000003507F507E502F582E503F583E504F50A
+:1002200000E505F5012200E514F51FE515F51EE5CD
+:1002300016F51DE517F51C02014200751401751530
+:100240000075160075170002010D00E50675820E97
+:10025000C39582F506E5077583009583F507D0E021
+:10026000F50875E0012506F58275E0003507F58390
+:10027000E508F0D0E0F50875E0002506F58275E0A8
+:10028000003507F583E508F075E0092506F5827568
+:10029000E0003507F583E517F075E0082506F582DF
+:1002A00075E0003507F583E516F075E0072506F5DE
+:1002B0008275E0003507F583E515F075E006250643
+:1002C000F58275E0003507F583E514F075E0052546
+:1002D00006F58275E0003507F583E513F075E00457
+:1002E0002506F58275E0003507F583E512F075E027
+:1002F000032506F58275E0003507F583E511F075F5
+:10030000E0022506F58275E0003507F583E510F07B
+:10031000751000751100751200751300750000E569
+:100320001FF5F0E50045F0F500E51EF5F0E50045A8
+:10033000F0F500E51DF5F0E50045F0F500E51CF5EC
+:10034000F0E50045F0F500E5007002800302047E50
+:1003500000750000E510F5F0E50045F0F500E51149
+:10036000F5F0E50045F0F500E512F5F0E50045F0A3
+:10037000F500E513F5F0E50045F0F500E500700245
+:10038000800302046A00750000E500F502E500F54F
+:1003900003E500F504E500F50575E0092506F5829D
+:1003A00075E0003507F583E0F51775E0082506F5DB
+:1003B0008275E0003507F583E0F51675E007250640
+:1003C000F58275E0003507F583E0F51575E0062543
+:1003D00006F58275E0003507F583E0F51475E00554
+:1003E0002506F58275E0003507F583E0F51375E025
+:1003F000042506F58275E0003507F583E0F51275F2
+:10040000E0032506F58275E0003507F583E0F51178
+:1004100075E0022506F58275E0003507F583E0F505
+:100420001075E0002506F58275E0003507F583E0DC
+:10043000F508E508C0E075E0012506F58275E000E5
+:100440003507F583E0F508E508C0E075E00E250600
+:10045000F50675E0003507F507E502F582E503F5D9
+:1004600083E504F500E505F5012200E514F51FE537
+:1004700015F51EE516F51DE517F51C02038600753A
+:1004800014017515007516007517007510017511AA
+:1004900000751200751300020351000000000000F7
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Spurious uninitialized variable warnings.
+ This one inspired by java/class.c:build_utf8_ref. */
+
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+#include <stddef.h>
+
+struct tree
+{
+ struct tree *car;
+ struct tree *cdr;
+ int type, data;
+};
+
+extern void *malloc(size_t);
+
+#define INTEGER_T 1
+#define PTR_T 2
+
+#define APPEND(TREE, LAST, TYPE, VALUE) \
+do { \
+ struct tree *tmp = malloc (sizeof (struct tree)); \
+ tmp->car = 0; tmp->cdr = 0; tmp->type = TYPE; \
+ tmp->data = VALUE; \
+ if (TREE->car) \
+ LAST->cdr = tmp; \
+ else \
+ TREE->car = tmp; \
+ LAST = tmp; \
+} while(0)
+
+struct tree *
+make_something(int a, int b, int c)
+{
+ struct tree *rv;
+ struct tree *field;
+
+ rv = malloc (sizeof (struct tree));
+ rv->car = 0;
+
+ APPEND(rv, field, INTEGER_T, a); /* { dg-bogus "field" "uninitialized variable warning" { xfail *-*-* } } */
+ APPEND(rv, field, PTR_T, b);
+ APPEND(rv, field, INTEGER_T, c);
+
+ return rv;
+}
--- /dev/null
+/* Spurious uninitialized variable warnings.
+ This one inspired by java/class.c:build_utf8_ref. */
+
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+#include <stddef.h>
+
+struct tree
+{
+ struct tree *car;
+ struct tree *cdr;
+ int type, data;
+};
+
+extern void *malloc(size_t);
+
+#define INTEGER_T 1
+#define PTR_T 2
+
+#define APPEND(TREE, LAST, TYPE, VALUE) \
+do { \
+ struct tree *tmp = malloc (sizeof (struct tree)); \
+ tmp->car = 0; tmp->cdr = 0; tmp->type = TYPE; \
+ tmp->data = VALUE; \
+ if (TREE->car) \
+ LAST->cdr = tmp; \
+ else \
+ TREE->car = tmp; \
+ LAST = tmp; \
+} while(0)
+
+struct tree *
+make_something(int a, int b, int c)
+{
+ struct tree *rv;
+ struct tree *field;
+
+ rv = malloc (sizeof (struct tree));
+ rv->car = 0;
+
+ APPEND(rv, field, INTEGER_T, a); /* { dg-bogus "field" "uninitialized variable warning" { xfail *-*-* } } */
+ APPEND(rv, field, PTR_T, b);
+ APPEND(rv, field, INTEGER_T, c);
+
+ return rv;
+}
--- /dev/null
+:100000000000E506758223C39582F506E507758332
+:10001000009583F507D0E0F50875E00E2506F5821A
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:100030000D2506F58275E0003507F583E508F075B6
+:10004000E0162506F58275E0003507F583E517F023
+:1000500075E0152506F58275E0003507F583E51690
+:10006000F075E0142506F58275E0003507F583E5A7
+:1000700015F075E0132506F58275E0003507F58368
+:10008000E514F075E0122506F58275E0003507F5F8
+:1000900083E513F075E0112506F58275E00035075C
+:1000A000F583E512F075E0102506F58275E0003560
+:1000B00007F583E511F075E00F2506F58275E00080
+:1000C0003507F583E510F0E51FF515E51EF516E596
+:1000D0001DF51775E0042506F58275E0003507F576
+:1000E00083E51CF075E0082506F58275E00035070C
+:1000F000F583E51BF075E0072506F58275E0003510
+:1001000007F583E51AF075E0062506F58275E0002F
+:100110003507F583E519F075E0052506F58275E0EC
+:10012000003507F583E518F0750923750001E50032
+:10013000F5F0E50995F0F509E506F500E500F5F0BF
+:10014000E50925F0F509750100E507F500E500F57D
+:10015000F0E50135F0F501E501F502E509F582E587
+:1001600002F583E0F50875E00C2506F58275E000E0
+:100170003507F583E508F0750923750002E500F5FC
+:10018000F0E50995F0F509E506F500E500F5F0E57F
+:100190000925F0F509750100E507F500E500F5F022
+:1001A000E50135F0F501E501F502E509F582E50225
+:1001B000F583E0F50875E00B2506F58275E000355E
+:1001C00007F583E508F0750923750003E500F5F0F0
+:1001D000E50995F0F509E506F500E500F5F0E50916
+:1001E00025F0F509750100E507F500E500F5F0E5F6
+:1001F0000135F0F501E501F502E509F582E502F5C5
+:1002000083E0F50875E00A2506F58275E0003507FC
+:10021000F583E508F0750923750004E500F5F0E5C0
+:100220000995F0F509E506F500E500F5F0E5092585
+:10023000F0F509750100E507F500E500F5F0E501C9
+:1002400035F0F501E501F502E509F582E502F583F2
+:10025000E0F50875E0092506F58275E0003507F53B
+:1002600083E508F0751F0C751E00751D00751C00D8
+:10027000E582F502E583F503E502F510E503F511E6
+:10028000750100C3750000E501F5F0E51035F0F5E6
+:100290000BE500F5F0E51135F0F50C750900750A70
+:1002A00000750100C3750000E501F5F0E50B35F0C0
+:1002B000F501E500F5F0E50C35F0F500E509F5038D
+:1002C000E500F502E501F582E502F583E503F07549
+:1002D0000101C3750000E501F5F0E50B35F0F5010E
+:1002E000E500F5F0E50C35F0F500E50AF503E5006D
+:1002F000F502E501F582E502F583E503F000751FDF
+:100300000C751E00751D00751C00E582F502E58365
+:10031000F503E502F50EE503F50F750100C3750061
+:1003200000E501F5F0E50E35F0F50BE500F5F0E53B
+:100330000F35F0F50C750900750A00750100C375DD
+:100340000000E501F5F0E50B35F0F501E500F5F00D
+:10035000E50C35F0F500E509F503E500F502E501EA
+:10036000F582E502F583E503F0750101C375000030
+:10037000E501F5F0E50B35F0F501E500F5F0E50CEC
+:1003800035F0F500E50AF503E500F502E501F58233
+:10039000E502F583E503F0750102C3750000E50190
+:1003A000F5F0E50E35F0F50BE500F5F0E50F35F06D
+:1003B000F50C750900750A00750100C3750000E5AC
+:1003C00001F5F0E50B35F0F501E500F5F0E50C354C
+:1003D000F0F500E509F503E500F502E501F582E534
+:1003E00002F583E503F0750101C3750000E501F531
+:1003F000F0E50B35F0F501E500F5F0E50C35F0F52D
+:1004000000E50AF503E500F502E501F582E502F5F0
+:1004100083E503F0750104C3750000E501F5F0E51F
+:100420000E35F0F50CE500F5F0E50F35F0F50D753E
+:100430000901750A00750B00751400750100C3757C
+:100440000000E501F5F0E50C35F0F501E500F5F00B
+:10045000E50D35F0F500E509F503E500F502E501E8
+:10046000F582E502F583E503F0750101C37500002F
+:10047000E501F5F0E50C35F0F501E500F5F0E50DE9
+:1004800035F0F500E50AF503E500F502E501F58232
+:10049000E502F583E503F0750102C3750000E5018F
+:1004A000F5F0E50C35F0F501E500F5F0E50D35F07A
+:1004B000F500E50BF503E500F502E501F582E5023F
+:1004C000F583E503F0750103C3750000E501F5F060
+:1004D000E50C35F0F501E500F5F0E50D35F0F5003A
+:1004E000E514F503E500F502E501F582E502F58383
+:1004F000E503F0750108C3750000E501F5F0E50EB0
+:1005000035F0F509E500F5F0E50F35F0F50A750170
+:1005100000C3750000E501F5F0E50935F0F501E5EA
+:1005200000F5F0E50A35F0F500E515F503E500F511
+:1005300002E501F582E502F583E503F0750101C3EB
+:10054000750000E501F5F0E50935F0F501E500F588
+:10055000F0E50A35F0F500E516F503E500F502E5EE
+:1005600001F582E502F583E503F0750102C375002C
+:1005700000E501F5F0E50935F0F501E500F5F0E5F8
+:100580000A35F0F500E517F503E500F502E501F59C
+:1005900082E502F583E503F0750103C3750000E50C
+:1005A00001F5F0E50935F0F501E500F5F0E50A356E
+:1005B000F0F50075E0042506F58275E0003507F5D5
+:1005C00083E0F508E508F503E500F502E501F582AD
+:1005D000E502F583E503F0750100C3750000E50150
+:1005E000F5F0E51035F0F509E500F5F0E51135F029
+:1005F000F50A750100C3750000E501F5F0E5093560
+:10060000F0F501E500F5F0E50A35F0F500E500F557
+:1006100002E501F582E502F583E0F50B750101C302
+:10062000750000E501F5F0E50935F0F501E500F5A7
+:10063000F0E50A35F0F500E500F502E501F582E5A3
+:1006400002F583E0F501750000E50BF5F0E50045E6
+:10065000F0F500E501F5F0E50045F0F500E5007086
+:100660000280030213A400750100C3750000E501B8
+:10067000F5F0E51035F0F509E500F5F0E51135F098
+:10068000F50A750100C3750000E501F5F0E50935CF
+:10069000F0F501E500F5F0E50A35F0F500E50EF5B9
+:1006A00003E500F502E501F582E502F583E503F0D7
+:1006B000750101C3750000E501F5F0E50935F0F5B8
+:1006C00001E500F5F0E50A35F0F500E50FF503E585
+:1006D00000F502E501F582E502F583E503F0E50E9C
+:1006E000F512E50FF5137500007501007509007529
+:1006F0000A00750C01C3750B00E500F5F0E50B95DC
+:10070000F0F50B750B00E50BF5F0E50B35F0F50B8F
+:10071000E50BF5F0E50C65F0F50CC3750B00E50194
+:10072000F5F0E50B95F0F50B750B00E50BF5F0E535
+:100730000B35F0F50BE50BF5F0E50C65F0F50CC3AA
+:10074000750B00E509F5F0E50B95F0F50B750B0061
+:10075000E50BF5F0E50B35F0F50BE50BF5F0E50CE9
+:1007600065F0F50CC3750B00E50AF5F0E50B95F0A7
+:10077000F50B750B00E50BF5F0E50B35F0F50BE52A
+:100780000BF5F0E50C65F0F50C75010075090075C9
+:100790000A00750000E50CF5F0E50045F0F500E510
+:1007A00001F5F0E50045F0F500E509F5F0E5004557
+:1007B000F0F500E50AF5F0E50045F0F500E500701C
+:1007C0000280030207C90202FD0000751F0C751E9E
+:1007D00000751D00751C00E582F502E583F503E553
+:1007E00002F50EE503F50F750100C3750000E50184
+:1007F000F5F0E50E35F0F50BE500F5F0E50F35F019
+:10080000F50C750900750A00750100C3750000E557
+:1008100001F5F0E50B35F0F501E500F5F0E50C35F7
+:10082000F0F500E509F503E500F502E501F582E5DF
+:1008300002F583E503F0750101C3750000E501F5DC
+:10084000F0E50B35F0F501E500F5F0E50C35F0F5D8
+:1008500000E50AF503E500F502E501F582E502F59C
+:1008600083E503F0750102C3750000E501F5F0E5CD
+:100870000E35F0F50BE500F5F0E50F35F0F50C75EC
+:100880000900750A00750100C3750000E501F5F067
+:10089000E50B35F0F501E500F5F0E50C35F0F50078
+:1008A000E509F503E500F502E501F582E502F583CA
+:1008B000E503F0750101C3750000E501F5F0E50BF6
+:1008C00035F0F501E500F5F0E50C35F0F500E50A49
+:1008D000F503E500F502E501F582E502F583E503A0
+:1008E000F0750104C3750000E501F5F0E50E35F083
+:1008F000F50CE500F5F0E50F35F0F50D750902751D
+:100900000A00750B00751400750100C3750000E541
+:1009100001F5F0E50C35F0F501E500F5F0E50D35F4
+:10092000F0F500E509F503E500F502E501F582E5DE
+:1009300002F583E503F0750101C3750000E501F5DB
+:10094000F0E50C35F0F501E500F5F0E50D35F0F5D5
+:1009500000E50AF503E500F502E501F582E502F59B
+:1009600083E503F0750102C3750000E501F5F0E5CC
+:100970000C35F0F501E500F5F0E50D35F0F500E595
+:100980000BF503E500F502E501F582E502F583E5E7
+:1009900003F0750103C3750000E501F5F0E50C35C2
+:1009A000F0F501E500F5F0E50D35F0F500E514F59D
+:1009B00003E500F502E501F582E502F583E503F0C4
+:1009C000750108C3750000E501F5F0E50E35F0F599
+:1009D00009E500F5F0E50F35F0F50A750100C3757E
+:1009E0000000E501F5F0E50935F0F501E500F5F069
+:1009F000E50A35F0F50075E0082506F58275E0009A
+:100A00003507F583E0F508E508F503E500F502E5AF
+:100A100001F582E502F583E503F0750101C3750078
+:100A200000E501F5F0E50935F0F501E500F5F0E543
+:100A30000A35F0F50075E0072506F58275E000350A
+:100A400007F583E0F508E508F503E500F502E501A3
+:100A5000F582E502F583E503F0750102C375000038
+:100A6000E501F5F0E50935F0F501E500F5F0E50AF9
+:100A700035F0F50075E0062506F58275E0003507CE
+:100A8000F583E0F508E508F503E500F502E501F575
+:100A900082E502F583E503F0750103C3750000E507
+:100AA00001F5F0E50935F0F501E500F5F0E50A3569
+:100AB000F0F50075E0052506F58275E0003507F5CF
+:100AC00083E0F508E508F503E500F502E501F582A8
+:100AD000E502F583E503F0750100C3750000E5014B
+:100AE000F5F0E51035F0F509E500F5F0E51135F024
+:100AF000F50A750100C3750000E501F5F0E509355B
+:100B0000F0F501E500F5F0E50A35F0F500E500F552
+:100B100002E501F582E502F583E0F50B750101C3FD
+:100B2000750000E501F5F0E50935F0F501E500F5A2
+:100B3000F0E50A35F0F500E500F502E501F582E59E
+:100B400002F583E0F501750000E50BF5F0E50045E1
+:100B5000F0F500E501F5F0E50045F0F500E5007081
+:100B600002800302132900750100C3750000E5012E
+:100B7000F5F0E51035F0F509E500F5F0E51135F093
+:100B8000F50A750100C3750000E501F5F0E50935CA
+:100B9000F0F501E500F5F0E50A35F0F500E50EF5B4
+:100BA00003E500F502E501F582E502F583E503F0D2
+:100BB000750101C3750000E501F5F0E50935F0F5B3
+:100BC00001E500F5F0E50A35F0F500E50FF503E580
+:100BD00000F502E501F582E502F583E503F0E50E97
+:100BE000F512E50FF5137500007501007509007524
+:100BF0000A00750C01C3750B00E500F5F0E50B95D7
+:100C0000F0F50B750B00E50BF5F0E50B35F0F50B8A
+:100C1000E50BF5F0E50C65F0F50CC3750B00E5018F
+:100C2000F5F0E50B95F0F50B750B00E50BF5F0E530
+:100C30000B35F0F50BE50BF5F0E50C65F0F50CC3A5
+:100C4000750B00E509F5F0E50B95F0F50B750B005C
+:100C5000E50BF5F0E50B35F0F50BE50BF5F0E50CE4
+:100C600065F0F50CC3750B00E50AF5F0E50B95F0A2
+:100C7000F50B750B00E50BF5F0E50B35F0F50BE525
+:100C80000BF5F0E50C65F0F50C75010075090075C4
+:100C90000A00750000E50CF5F0E50045F0F500E50B
+:100CA00001F5F0E50045F0F500E509F5F0E5004552
+:100CB000F0F500E50AF5F0E50045F0F500E5007017
+:100CC000028003020CC90207CA0000751F0C751EC2
+:100CD00000751D00751C00E582F502E583F503E54E
+:100CE00002F50EE503F50F750100C3750000E5017F
+:100CF000F5F0E50E35F0F50BE500F5F0E50F35F014
+:100D0000F50C750900750A00750100C3750000E552
+:100D100001F5F0E50B35F0F501E500F5F0E50C35F2
+:100D2000F0F500E509F503E500F502E501F582E5DA
+:100D300002F583E503F0750101C3750000E501F5D7
+:100D4000F0E50B35F0F501E500F5F0E50C35F0F5D3
+:100D500000E50AF503E500F502E501F582E502F597
+:100D600083E503F0750102C3750000E501F5F0E5C8
+:100D70000E35F0F50BE500F5F0E50F35F0F50C75E7
+:100D80000900750A00750100C3750000E501F5F062
+:100D9000E50B35F0F501E500F5F0E50C35F0F50073
+:100DA000E509F503E500F502E501F582E502F583C5
+:100DB000E503F0750101C3750000E501F5F0E50BF1
+:100DC00035F0F501E500F5F0E50C35F0F500E50A44
+:100DD000F503E500F502E501F582E502F583E5039B
+:100DE000F0750104C3750000E501F5F0E50E35F07E
+:100DF000F50CE500F5F0E50F35F0F50D7509017519
+:100E00000A00750B00751400750100C3750000E53C
+:100E100001F5F0E50C35F0F501E500F5F0E50D35EF
+:100E2000F0F500E509F503E500F502E501F582E5D9
+:100E300002F583E503F0750101C3750000E501F5D6
+:100E4000F0E50C35F0F501E500F5F0E50D35F0F5D0
+:100E500000E50AF503E500F502E501F582E502F596
+:100E600083E503F0750102C3750000E501F5F0E5C7
+:100E70000C35F0F501E500F5F0E50D35F0F500E590
+:100E80000BF503E500F502E501F582E502F583E5E2
+:100E900003F0750103C3750000E501F5F0E50C35BD
+:100EA000F0F501E500F5F0E50D35F0F500E514F598
+:100EB00003E500F502E501F582E502F583E503F0BF
+:100EC000750108C3750000E501F5F0E50E35F0F594
+:100ED00009E500F5F0E50F35F0F50A750100C37579
+:100EE0000000E501F5F0E50935F0F501E500F5F064
+:100EF000E50A35F0F50075E00C2506F58275E00091
+:100F00003507F583E0F508E508F503E500F502E5AA
+:100F100001F582E502F583E503F0750101C3750073
+:100F200000E501F5F0E50935F0F501E500F5F0E53E
+:100F30000A35F0F50075E00B2506F58275E0003501
+:100F400007F583E0F508E508F503E500F502E5019E
+:100F5000F582E502F583E503F0750102C375000033
+:100F6000E501F5F0E50935F0F501E500F5F0E50AF4
+:100F700035F0F50075E00A2506F58275E0003507C5
+:100F8000F583E0F508E508F503E500F502E501F570
+:100F900082E502F583E503F0750103C3750000E502
+:100FA00001F5F0E50935F0F501E500F5F0E50A3564
+:100FB000F0F50075E0092506F58275E0003507F5C6
+:100FC00083E0F508E508F503E500F502E501F582A3
+:100FD000E502F583E503F0750100C3750000E50146
+:100FE000F5F0E51035F0F509E500F5F0E51135F01F
+:100FF000F50A750100C3750000E501F5F0E5093556
+:10100000F0F501E500F5F0E50A35F0F500E500F54D
+:1010100002E501F582E502F583E0F50B750101C3F8
+:10102000750000E501F5F0E50935F0F501E500F59D
+:10103000F0E50A35F0F500E500F502E501F582E599
+:1010400002F583E0F501750000E50BF5F0E50045DC
+:10105000F0F500E501F5F0E50045F0F500E500707C
+:101060000280030212AE00750100C3750000E501A5
+:10107000F5F0E51035F0F509E500F5F0E51135F08E
+:10108000F50A750100C3750000E501F5F0E50935C5
+:10109000F0F501E500F5F0E50A35F0F500E50EF5AF
+:1010A00003E500F502E501F582E502F583E503F0CD
+:1010B000750101C3750000E501F5F0E50935F0F5AE
+:1010C00001E500F5F0E50A35F0F500E50FF503E57B
+:1010D00000F502E501F582E502F583E503F0E50E92
+:1010E000F512E50FF513750000750100750900751F
+:1010F0000A00750C01C3750B00E500F5F0E50B95D2
+:10110000F0F50B750B00E50BF5F0E50B35F0F50B85
+:10111000E50BF5F0E50C65F0F50CC3750B00E5018A
+:10112000F5F0E50B95F0F50B750B00E50BF5F0E52B
+:101130000B35F0F50BE50BF5F0E50C65F0F50CC3A0
+:10114000750B00E509F5F0E50B95F0F50B750B0057
+:10115000E50BF5F0E50B35F0F50BE50BF5F0E50CDF
+:1011600065F0F50CC3750B00E50AF5F0E50B95F09D
+:10117000F50B750B00E50BF5F0E50B35F0F50BE520
+:101180000BF5F0E50C65F0F50C75010075090075BF
+:101190000A00750000E50CF5F0E50045F0F500E506
+:1011A00001F5F0E50045F0F500E509F5F0E500454D
+:1011B000F0F500E50AF5F0E50045F0F500E5007012
+:1011C0000280030211C9020CCA00750000E510F587
+:1011D00002E511F503E500F504E500F50575E016F7
+:1011E0002506F58275E0003507F583E0F51775E013
+:1011F000152506F58275E0003507F583E0F51675CF
+:10120000E0142506F58275E0003507F583E0F51555
+:1012100075E0132506F58275E0003507F583E0F5E6
+:101220001475E0122506F58275E0003507F583E0B8
+:10123000F51375E0112506F58275E0003507F58395
+:10124000E0F51275E0102506F58275E0003507F52A
+:1012500083E0F51175E00F2506F58275E00035078E
+:10126000F583E0F51075E00D2506F58275E0003593
+:1012700007F583E0F508E508C0E075E00E2506F502
+:101280008275E0003507F583E0F508E508C0E075F4
+:10129000E0232506F50675E0003507F507E502F5BC
+:1012A00082E503F583E504F500E505F50122007507
+:1012B0000002C3750100E500F5F0E51235F0F50018
+:1012C000E501F5F0E51335F0F50A750900C3750180
+:1012D00000E509F5F0E50035F0F509E501F5F0E583
+:1012E0000A35F0F501E50EF503E501F502E509F52E
+:1012F00082E502F583E503F0750901C3750100E598
+:1013000009F5F0E50035F0F509E501F5F0E50A35F8
+:10131000F0F501E50FF503E501F502E509F582E5D4
+:1013200002F583E503F00210DE00750002C37501CB
+:1013300000E500F5F0E51235F0F500E501F5F0E522
+:101340001335F0F50A750900C3750100E509F5F0DC
+:10135000E50035F0F509E501F5F0E50A35F0F501B0
+:10136000E50EF503E501F502E509F582E502F583F1
+:10137000E503F0750901C3750100E509F5F0E50025
+:1013800035F0F509E501F5F0E50A35F0F501E50F71
+:10139000F503E501F502E509F582E502F583E503CC
+:1013A000F0020BDE00750002C3750100E500F5F0E8
+:1013B000E51235F0F500E501F5F0E51335F0F50A35
+:1013C000750900C3750100E509F5F0E50035F0F594
+:1013D00009E501F5F0E50A35F0F501E50EF503E55F
+:1013E00001F502E509F582E502F583E503F07509EB
+:1013F00001C3750100E509F5F0E50035F0F509E5F3
+:1014000001F5F0E50A35F0F501E50FF503E501F525
+:1014100002E509F582E502F583E503F00206DE0048
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Uninitialized variable warning tests...
+ Inspired by part of optabs.c:expand_binop.
+ May be the same as uninit-1.c. */
+
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+#include <limits.h>
+
+void
+add_bignums (int *out, int *x, int *y)
+{
+ int p, sum;
+ int carry; /* { dg-bogus "carry" "uninitialized variable warning" } */
+
+ p = 0;
+ for (; *x; x++, y++, out++, p++)
+ {
+ if (p)
+ sum = *x + *y + carry;
+ else
+ sum = *x + *y;
+
+ if (sum < 0)
+ {
+ carry = 1;
+ sum -= INT_MAX;
+ }
+ else
+ carry = 0;
+ }
+}
--- /dev/null
+/* Uninitialized variable warning tests...
+ Inspired by part of optabs.c:expand_binop.
+ May be the same as uninit-1.c. */
+
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+#include <limits.h>
+
+void
+add_bignums (int *out, int *x, int *y)
+{
+ int p, sum;
+ int carry; /* { dg-bogus "carry" "uninitialized variable warning" } */
+
+ p = 0;
+ for (; *x; x++, y++, out++, p++)
+ {
+ if (p)
+ sum = *x + *y + carry;
+ else
+ sum = *x + *y;
+
+ if (sum < 0)
+ {
+ carry = 1;
+ sum -= INT_MAX;
+ }
+ else
+ carry = 0;
+ }
+}
--- /dev/null
+:1000000000E506758210C39582F506E50775830045
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F075E0E3
+:10004000092506F58275E0003507F583E517F0759B
+:10005000E0082506F58275E0003507F583E516F022
+:1000600075E0072506F58275E0003507F583E5158F
+:10007000F075E0062506F58275E0003507F583E5A5
+:1000800014F075E0052506F58275E0003507F58367
+:10009000E513F075E0042506F58275E0003507F5F7
+:1000A00083E512F075E0032506F58275E00035075B
+:1000B000F583E511F075E0022506F58275E000355F
+:1000C00007F583E510F0751800751900751E0075A9
+:1000D0001F00750B00C3750000E50BF5F0E51D353D
+:1000E000F0F50BE500F5F0E51C35F0F50AE50AF54D
+:1000F00002E50BF582E502F583E0F500750B01C31F
+:10010000750100E50BF5F0E51D35F0F50BE501F5A2
+:10011000F0E51C35F0F50AE50AF502E50BF582E598
+:1001200002F583E0F501750B02C3750900E50BF5D7
+:10013000F0E51D35F0F50BE509F5F0E51C35F0F5BA
+:100140000AE50AF502E50BF582E502F583E0F5091B
+:10015000750B03C3750A00E50BF5F0E51D35F0F5E9
+:100160000BE50AF5F0E51C35F0F50AE50AF502E5C0
+:100170000BF582E502F583E0F50A750C01C3750BFA
+:1001800000E500F5F0E50B95F0F50B750B00E50BC0
+:10019000F5F0E50B35F0F50BE50BF5F0E50C65F04A
+:1001A000F50CC3750B00E501F5F0E50B95F0F50BCB
+:1001B000750B00E50BF5F0E50B35F0F50BE50BF5F0
+:1001C000F0E50C65F0F50CC3750B00E509F5F0E5FD
+:1001D0000B95F0F50B750B00E50BF5F0E50B35F025
+:1001E000F50BE50BF5F0E50C65F0F50CC3750B00B0
+:1001F000E50AF5F0E50B95F0F50B750B00E50BF551
+:10020000F0E50B35F0F50BE50BF5F0E50C65F0F5D9
+:100210000C750100750900750A00750000E50CF504
+:10022000F0E50045F0F500E501F5F0E50045F0F5F5
+:1002300000E509F5F0E50045F0F500E50AF5F0E523
+:100240000045F0F500E50070028003020ADC00754D
+:100250000000E518F5F0E50045F0F500E519F5F0CA
+:10026000E50045F0F500E51EF5F0E50045F0F50088
+:10027000E51FF5F0E50045F0F500E50070028003AC
+:1002800002093000750100C3750000E501F5F0E5D5
+:100290001D35F0F501E500F5F0E51C35F0F500E55C
+:1002A00000F502E501F582E502F583E0F50E750142
+:1002B00001C3750000E501F5F0E51D35F0F501E538
+:1002C00000F5F0E51C35F0F500E500F502E501F577
+:1002D00082E502F583E0F50D750102C3750000E5C6
+:1002E00001F5F0E51D35F0F501E500F5F0E51C350B
+:1002F000F0F500E500F502E501F582E502F583E0A1
+:10030000F50B750103C3750000E501F5F0E51D353A
+:10031000F0F501E500F5F0E51C35F0F500E500F538
+:1003200002E501F582E502F583E0F509750F00C3EA
+:10033000750000E50FF5F0E51B35F0F50FE500F56C
+:10034000F0E51A35F0F501E501F502E50FF582E576
+:1003500002F583E0F500750F01C3750100E50FF5A7
+:10036000F0E51B35F0F50FE501F5F0E51A35F0F590
+:1003700001E501F502E50FF582E502F583E0F50CF4
+:10038000750F02C3750100E50FF5F0E51B35F0F5BB
+:100390000FE501F5F0E51A35F0F501E501F502E5A7
+:1003A0000FF582E502F583E0F50A750F03C37501C9
+:1003B00000E50FF5F0E51B35F0F50FE501F5F0E58B
+:1003C0001A35F0F501E501F502E50FF582E502F5D4
+:1003D00083E0F501C3750F00E500F5F0E50E35F09B
+:1003E000F500E50CF5F0E50D35F0F50DE50AF5F055
+:1003F000E50B35F0F50EE501F5F0E50935F0F50F03
+:10040000751600751200751000750C00E500F517E3
+:10041000750080E500F5F0E50F25F0F50FE500F536
+:10042000F0E50C25F0F50C750B0075130075140044
+:10043000751500750A00751101750001C3E50CF50D
+:10044000F0E50F95F0F509E50AF5F0E50A35F0F568
+:1004500009E509F5F0E50055F0F500E500F5F0E5F2
+:100460000B45F0F50B750001C3E50CF5F0E50F95B4
+:10047000F0F509E50AF5F0E50A35F0F509E50FF5BF
+:10048000F0E50C95F0F501E50AF5F0E50A35F0F533
+:1004900001E501F5F0E50945F0F509E511F5F0E5AF
+:1004A0000965F0F509E509F5F0E50055F0F500C33B
+:1004B000E510F5F0E50E95F0F509E50AF5F0E50A29
+:1004C00035F0F509E509F5F0E50055F0F500E50032
+:1004D000F5F0E50B45F0F50B750001C3E50CF5F003
+:1004E000E50F95F0F509E50AF5F0E50A35F0F509AF
+:1004F000E50FF5F0E50C95F0F501E50AF5F0E50AF4
+:1005000035F0F501E501F5F0E50945F0F509E511EE
+:10051000F5F0E50965F0F509E509F5F0E50055F0B8
+:10052000F500C3E510F5F0E50E95F0F509E50AF5DF
+:10053000F0E50A35F0F509E50EF5F0E51095F0F572
+:1005400001E50AF5F0E50A35F0F501E501F5F0E51C
+:100550000945F0F509E511F5F0E50965F0F509E55E
+:1005600009F5F0E50055F0F500C3E512F5F0E50DED
+:1005700095F0F509E50AF5F0E50A35F0F509E50924
+:10058000F5F0E50055F0F500E500F5F0E50B45F078
+:10059000F50B750001C3E50CF5F0E50F95F0F509D5
+:1005A000E50AF5F0E50A35F0F509E50FF5F0E50C9B
+:1005B00095F0F501E50AF5F0E50A35F0F501E501FC
+:1005C000F5F0E50945F0F509E511F5F0E50965F007
+:1005D000F509E509F5F0E50055F0F500C3E510F57E
+:1005E000F0E50E95F0F509E50AF5F0E50A35F0F5C8
+:1005F00009E50EF5F0E51095F0F501E50AF5F0E5F1
+:100600000A35F0F501E501F5F0E50945F0F509E5F4
+:1006100011F5F0E50965F0F509E509F5F0E5005596
+:10062000F0F500C3E512F5F0E50D95F0F509E50AE2
+:10063000F5F0E50A35F0F509E50DF5F0E51295F070
+:10064000F501E50AF5F0E50A35F0F501E501F5F00B
+:10065000E50945F0F509E511F5F0E50965F0F5095D
+:10066000E509F5F0E50055F0F500C3E516F5F0E510
+:100670001795F0F509E50AF5F0E50A35F0F509E515
+:1006800009F5F0E50055F0F500E500F5F0E50B455E
+:10069000F0F50B750000E50BF5F0E50045F0F50011
+:1006A000E513F5F0E50045F0F500E514F5F0E5009B
+:1006B00045F0F500E515F5F0E50045F0F500E5003D
+:1006C0007002800302091E0075100075110075127A
+:1006D00000751300750001750100750C04750D009F
+:1006E000750E00750F00C3750900E500F5F0E50C07
+:1006F000A4F50BE500F5F0E50CA4E5F0F50AE50B33
+:10070000F5F0E50935F0F509E501F5F0E50CA4F59E
+:100710000BE501F5F0E50CA4E5F0F501E50BF5F0CE
+:10072000E50A35F0F50AC3C3750100E509F5F0E502
+:100730000E35F0F50EE50AF5F0E50F35F0F50FC3CF
+:10074000750A00E500F5F0E50DA4F50BE500F5F000
+:10075000E50DA4E5F0F501E50BF5F0E50A35F0F55A
+:100760000A750900C3C3750000E509F5F0E50E350B
+:10077000F0F50EE50AF5F0E50F35F0F50FC3750954
+:1007800000750A00C3C3750000E509F5F0E50E35F4
+:10079000F0F50EE50AF5F0E50F35F0F50FC3750934
+:1007A00000750A00C3C3750000E509F5F0E50E35D4
+:1007B000F0F50EE50AF5F0E50F35F0F50FC375001D
+:1007C00000E50EF5F0E51D35F0F51DE50FF5F0E55A
+:1007D0001C35F0F51C750001750100750C04750DD4
+:1007E00000750E00750F00C3750900E500F5F0E512
+:1007F0000CA4F50BE500F5F0E50CA4E5F0F50AE531
+:100800000BF5F0E50935F0F509E501F5F0E50CA487
+:10081000F50BE501F5F0E50CA4E5F0F501E50BF5C8
+:10082000F0E50A35F0F50AC3C3750100E509F5F0F6
+:10083000E50E35F0F50EE50AF5F0E50F35F0F50FAC
+:10084000C3750A00E500F5F0E50DA4F50BE500F52C
+:10085000F0E50DA4E5F0F501E50BF5F0E50A35F05E
+:10086000F50A750900C3C3750000E509F5F0E50E4A
+:1008700035F0F50EE50AF5F0E50F35F0F50FC37527
+:100880000900750A00C3C3750000E509F5F0E50E1F
+:1008900035F0F50EE50AF5F0E50F35F0F50FC37507
+:1008A0000900750A00C3C3750000E509F5F0E50EFF
+:1008B00035F0F50EE50AF5F0E50F35F0F50FC375E7
+:1008C0000000E50EF5F0E51B35F0F51BE50FF5F042
+:1008D000E51A35F0F51AC3C3C3C3C3C3C3C3C3C347
+:1008E000C3C3C3750101750900750A00750B00C308
+:1008F000750000E501F5F0E51835F0F518E509F5A6
+:10090000F0E51935F0F519E50AF5F0E51E35F0F5D5
+:100910001EE50BF5F0E51F35F0F51F0200D200755E
+:100920001001751100751200751300D3C30206D4AF
+:1009300000750100C3750000E501F5F0E51D35F017
+:10094000F501E500F5F0E51C35F0F500E500F502F0
+:10095000E501F582E502F583E0F50C750101C3754B
+:100960000000E501F5F0E51D35F0F501E500F5F0D5
+:10097000E51C35F0F500E500F502E501F582E5023C
+:10098000F583E0F50D750102C3750000E501F5F092
+:10099000E51D35F0F501E500F5F0E51C35F0F50055
+:1009A000E500F502E501F582E502F583E0F50E7557
+:1009B0000103C3750000E501F5F0E51D35F0F50113
+:1009C000E500F5F0E51C35F0F500E500F502E50180
+:1009D000F582E502F583E0F50F750100C3750000AF
+:1009E000E501F5F0E51B35F0F501E500F5F0E51A58
+:1009F00035F0F500E500F502E501F582E502F58345
+:100A0000E0F509750101C3750000E501F5F0E51B8E
+:100A100035F0F501E500F5F0E51A35F0F500E500F3
+:100A2000F502E501F582E502F583E0F50A750102BC
+:100A3000C3750000E501F5F0E51B35F0F501E500B3
+:100A4000F5F0E51A35F0F500E500F502E501F5826F
+:100A5000E502F583E0F50B750103C3750000E501C0
+:100A6000F5F0E51B35F0F501E500F5F0E51A35F098
+:100A7000F500E500F502E501F582E502F583E0F514
+:100A800000C3750100E509F5F0E50C35F0F501E569
+:100A90000AF5F0E50D35F0F509E50BF5F0E50E3555
+:100AA000F0F50AE500F5F0E50F35F0F50BC375003C
+:100AB00000E510F5F0E50135F0F500E511F5F0E59C
+:100AC0000935F0F50DE512F5F0E50A35F0F50EE51E
+:100AD00013F5F0E50B35F0F50F020400007500008A
+:100AE000E500F502E500F503E500F504E500F50590
+:100AF00075E0092506F58275E0003507F583E0F518
+:100B00001775E0082506F58275E0003507F583E0E6
+:100B1000F51675E0072506F58275E0003507F583C3
+:100B2000E0F51575E0062506F58275E0003507F558
+:100B300083E0F51475E0052506F58275E0003507BC
+:100B4000F583E0F51375E0042506F58275E00035C0
+:100B500007F583E0F51275E0032506F58275E000E0
+:100B60003507F583E0F51175E0022506F58275E09D
+:100B7000003507F583E0F51075E0002506F5827570
+:100B8000E0003507F583E0F508E508C0E075E00111
+:100B90002506F58275E0003507F583E0F508E508E0
+:100BA000C0E075E0102506F50675E0003507F5078D
+:100BB000E502F582E503F583E504F500E505F501B9
+:100BC0002200000000000000000000000000000003
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Origin: PR c/179 from Gray Watson <gray@256.com>, adapted as a testcase
+ by Joseph Myers <jsm28@cam.ac.uk>. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wuninitialized" } */
+extern void foo (int *);
+extern void bar (int);
+
+void
+baz (void)
+{
+ int i;
+ if (i) /* { dg-warning "uninit" "uninit i warning" { xfail *-*-* } } */
+ bar (i);
+ foo (&i);
+}
--- /dev/null
+/* Origin: PR c/179 from Gray Watson <gray@256.com>, adapted as a testcase
+ by Joseph Myers <jsm28@cam.ac.uk>. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wuninitialized" } */
+extern void foo (int *);
+extern void bar (int);
+
+void
+baz (void)
+{
+ int i;
+ if (i) /* { dg-warning "uninit" "uninit i warning" { xfail *-*-* } } */
+ bar (i);
+ foo (&i);
+}
--- /dev/null
+:10000000000000E506758206C39582F506E50775D2
+:1000100083009583F507D0E0F50875E0052506F522
+:100020008275E0003507F583E508F0D0E0F5087546
+:10003000E0042506F58275E0003507F583E508F054
+:10004000E506F509E507F50A750100C3750000E549
+:1000500001F5F0E50935F0F501E500F5F0E50A35C3
+:10006000F0F500E501F509E500F50A750100C37535
+:100070000000E501F5F0E50935F0F501E500F5F0E2
+:10008000E50A35F0F500E500F502E501F582E50247
+:10009000F583E0F50B750101C3750000E501F5F08E
+:1000A000E50935F0F501E500F5F0E50A35F0F50074
+:1000B000E500F502E501F582E502F583E0F50C7552
+:1000C0000102C3750000E501F5F0E50935F0F50121
+:1000D000E500F5F0E50A35F0F500E500F502E5018B
+:1000E000F582E502F583E0F50D750103C3750000A7
+:1000F000E501F5F0E50935F0F501E500F5F0E50A73
+:1001000035F0F500E500F502E501F582E502F5833D
+:10011000E0F501750000E50BF5F0E50045F0F500B0
+:10012000E50CF5F0E50045F0F500E50DF5F0E5002E
+:1001300045F0F500E501F5F0E50045F0F500E500D6
+:10014000700280030201CF00E506F509E507F50A14
+:10015000750100C3750000E501F5F0E50935F0F51E
+:1001600001E500F5F0E50A35F0F500E501F51FE5DC
+:1001700000F51E750000E500F502E500F503E50059
+:10018000F504E500F50575E0042506F58275E00047
+:100190003507F583E0F508E508C0E075E0052506BC
+:1001A000F58275E0003507F583E0F508E508C0E065
+:1001B00075E0062506F50675E0003507F507E5024A
+:1001C000F582E503F583E504F500E505F501220078
+:1001D000E506F509E507F50A750100C3750000E5B8
+:1001E00001F5F0E50935F0F501E500F5F0E50A3532
+:1001F000F0F500E501F509E500F50A750100C375A4
+:100200000000E501F5F0E50935F0F501E500F5F050
+:10021000E50A35F0F500E500F502E501F582E502B5
+:10022000F583E0F51F750101C3750000E501F5F0E8
+:10023000E50935F0F501E500F5F0E50A35F0F500E2
+:10024000E500F502E501F582E502F583E0F51E75AE
+:100250000102C3750000E501F5F0E50935F0F5018F
+:10026000E500F5F0E50A35F0F500E500F502E501F9
+:10027000F582E502F583E0F51D750103C375000005
+:10028000E501F5F0E50935F0F501E500F5F0E50AE1
+:1002900035F0F500E500F502E501F582E502F583AC
+:1002A000E0F500E500F51C02014800000000000038
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Spurious uninitialized variable warning, inspired by libgcc2.c. */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+/* Not all platforms support TImode integers. */
+#if defined(__LP64__) && !defined(__hppa__)
+typedef int TItype __attribute__ ((mode (TI)));
+#else
+typedef long TItype;
+#endif
+
+
+TItype
+__subvdi3 (TItype a, TItype b)
+{
+ TItype w;
+
+ w = a - b;
+
+ return w;
+}
--- /dev/null
+/* Spurious uninitialized variable warning, inspired by libgcc2.c. */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+/* Not all platforms support TImode integers. */
+#if defined(__LP64__) && !defined(__hppa__)
+typedef int TItype __attribute__ ((mode (TI)));
+#else
+typedef long TItype;
+#endif
+
+
+TItype
+__subvdi3 (TItype a, TItype b)
+{
+ TItype w;
+
+ w = a - b;
+
+ return w;
+}
--- /dev/null
+:1000000000E506758208C39582F506E5077583004D
+:100010009583F507D0E0F50CD0E0F50EE511F5017C
+:10002000E510F50AC3E51BF5F0E51F95F0F500E5D1
+:100030001AF5F0E51E95F0F509E519F5F0E51D95C1
+:10004000F0F50BE518F5F0E51C95F0F50DE500F57C
+:1000500002E509F503E50BF504E50DF505E501F508
+:1000600011E50AF510E50EC0E0E50CC0E075E0080A
+:100070002506F50675E0003507F507E502F582E58A
+:1000800003F583E504F500E505F501220000000015
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test we do not warn about initializing variable with self. */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+int f()
+{
+ int i = i;
+ return i;
+}
--- /dev/null
+/* Test we do not warn about initializing variable with self. */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+int f()
+{
+ int i = i;
+ return i;
+}
--- /dev/null
+:1000000000D0E0F500D0E0F501E509F502E50AF5DC
+:1000100003E50BF504E50CF505E501C0E0E500C0DE
+:10002000E0E502F582E503F583E504F500E505F575
+:10003000012200000000000000000000000000009D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test we do warn about initializing variable with self when -Winit-self is supplied. */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized -Winit-self" } */
+
+int f()
+{
+ int i = i; /* { dg-warning "i" "uninitialized variable warning" } */
+ return i;
+}
--- /dev/null
+/* Test we do warn about initializing variable with self when -Winit-self is supplied. */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized -Winit-self" } */
+
+int f()
+{
+ int i = i; /* { dg-warning "i" "uninitialized variable warning" } */
+ return i;
+}
--- /dev/null
+:1000000000D0E0F500D0E0F501E509F502E50AF5DC
+:1000100003E50BF504E50CF505E501C0E0E500C0DE
+:10002000E0E502F582E503F583E504F500E505F575
+:10003000012200000000000000000000000000009D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test we do warn about initializing variable with self in the initialization. */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+int f()
+{
+ int i = i + 1; /* { dg-warning "i" "uninitialized variable warning" } */
+ return i;
+}
--- /dev/null
+/* Test we do warn about initializing variable with self in the initialization. */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+int f()
+{
+ int i = i + 1; /* { dg-warning "i" "uninitialized variable warning" } */
+ return i;
+}
--- /dev/null
+:1000000000D0E0F518D0E0F519E512F50F75000104
+:10001000750100750900750A00C3751200E500F549
+:10002000F0E50B35F0F50BE501F5F0E50C35F0F5F5
+:100030000CE509F5F0E50D35F0F50DE50AF5F0E50F
+:100040000E35F0F50EE50BF502E50CF503E50DF5C3
+:1000500004E50EF505E50FF512E519C0E0E518C059
+:10006000E0E502F582E503F583E504F500E505F535
+:10007000012200000000000000000000000000005D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test we do not warn about initializing variable with address of self in the initialization. */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+void *f()
+{
+ void *i = &i;
+ return i;
+}
--- /dev/null
+/* Test we do not warn about initializing variable with address of self in the initialization. */
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+void *f()
+{
+ void *i = &i;
+ return i;
+}
--- /dev/null
+:1000000000E506758202C39582F506E50775830053
+:100010009583F507D0E0F50ED0E0F50FE510F50D6E
+:10002000E506F50AE507F501750900C3750000E569
+:1000300009F5F0E50A35F0F50BE500F5F0E50135D9
+:10004000F0F50CE506F50AE507F501750900C3753D
+:100050000000E509F5F0E50A35F0F509E500F5F0F1
+:10006000E50135F0F50A750100C3750000E501F5FD
+:10007000F0E50B35F0F501E500F5F0E50C35F0F5B0
+:1000800000E509F503E500F502E501F582E502F575
+:1000900083E503F0750101C3750000E501F5F0E5A6
+:1000A0000B35F0F501E500F5F0E50C35F0F500E570
+:1000B0000AF503E500F502E501F582E502F583E5C1
+:1000C00003F0E506F509E507F50A750100C37500BB
+:1000D00000E501F5F0E50935F0F501E500F5F0E59D
+:1000E0000A35F0F500E501F509E500F50A750100AE
+:1000F000C3750000E501F5F0E50935F0F501E5000F
+:10010000F5F0E50A35F0F500E500F502E501F582C8
+:10011000E502F583E0F50B750101C3750000E5010B
+:10012000F5F0E50935F0F501E500F5F0E50A35F003
+:10013000F500E500F502E501F582E502F583E0F55D
+:1001400001750000E50BF502E501F503E500F50496
+:10015000E500F505E50DF510E50FC0E0E50EC0E0A2
+:1001600075E0022506F50675E0003507F507E5029E
+:10017000F582E503F583E504F500E505F5012200C8
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR 14204 */
+/* { dg-do compile } */
+/* { dg-options "-O -Wall -Werror" } */
+
+#if defined __alpha__
+# define ASM __asm__("$30")
+#elif defined __i386__
+# define ASM __asm__("esp")
+#elif defined (__powerpc__) || defined (__PPC__) || defined (__ppc__) || defined (_POWER)
+# define ASM __asm__("r1")
+#elif defined __s390__
+# define ASM __asm__("r15")
+#elif defined __mips
+# define ASM __asm__("$sp")
+#elif defined __sparc__
+# define ASM __asm__("sp")
+#elif defined __ia64__
+# define ASM __asm__("r12")
+#elif defined __hppa__
+# define ASM __asm__("%r30")
+#elif defined __xtensa__
+# define ASM __asm__("sp")
+#else
+/* The register name should be target-dependent so for other targets,
+ we just silence the test. */
+# define ASM = 0
+#endif
+
+void *load_PCB (void)
+{
+ register void *sp ASM;
+ return sp; /* { dg-bogus "uninitialized" } */
+}
--- /dev/null
+/* PR 14204 */
+/* { dg-do compile } */
+/* { dg-options "-O -Wall -Werror" } */
+
+#if defined __alpha__
+# define ASM __asm__("$30")
+#elif defined __i386__
+# define ASM __asm__("esp")
+#elif defined (__powerpc__) || defined (__PPC__) || defined (__ppc__) || defined (_POWER)
+# define ASM __asm__("r1")
+#elif defined __s390__
+# define ASM __asm__("r15")
+#elif defined __mips
+# define ASM __asm__("$sp")
+#elif defined __sparc__
+# define ASM __asm__("sp")
+#elif defined __ia64__
+# define ASM __asm__("r12")
+#elif defined __hppa__
+# define ASM __asm__("%r30")
+#elif defined __xtensa__
+# define ASM __asm__("sp")
+#else
+/* The register name should be target-dependent so for other targets,
+ we just silence the test. */
+# define ASM = 0
+#endif
+
+void *load_PCB (void)
+{
+ register void *sp ASM;
+ return sp; /* { dg-bogus "uninitialized" } */
+}
--- /dev/null
+:1000000000D0E0F500D0E0F501750B00E509F50240
+:10001000E50AF503E50BF504E50BF505E501C0E0A0
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wuninitialized" } */
+
+int sys_msgctl (void)
+{
+ struct { int mode; } setbuf; /* { dg-warning "'setbuf\.mode' is used" } */
+ return setbuf.mode;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wuninitialized" } */
+
+int sys_msgctl (void)
+{
+ struct { int mode; } setbuf; /* { dg-warning "'setbuf\.mode' is used" } */
+ return setbuf.mode;
+}
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F518D0E0F519E511F50E58
+:10002000E510F50FE506F509E507F50A750100C3CA
+:10003000750000E501F5F0E50935F0F501E500F59D
+:10004000F0E50A35F0F50A750900C3750000E50909
+:10005000F5F0E50135F0F501E500F5F0E50A35F0DC
+:10006000F500E501F509E500F50A750100C3750025
+:1000700000E501F5F0E50935F0F501E500F5F0E5FD
+:100080000A35F0F500E500F502E501F582E502F537
+:1000900083E0F50B750101C3750000E501F5F0E59E
+:1000A0000935F0F501E500F5F0E50A35F0F500E574
+:1000B00000F502E501F582E502F583E0F50C750136
+:1000C00002C3750000E501F5F0E50935F0F501E53D
+:1000D00000F5F0E50A35F0F500E500F502E501F57B
+:1000E00082E502F583E0F50D750103C3750000E5B7
+:1000F00001F5F0E50935F0F501E500F5F0E50A3523
+:10010000F0F500E500F502E501F582E502F583E092
+:10011000F500E50BF502E50CF503E50DF504E5004A
+:10012000F505E50EF511E50FF510E519C0E0E51848
+:10013000C0E075E0042506F50675E0003507F50713
+:10014000E502F582E503F583E504F500E505F50133
+:10015000220000000000000000000000000000007D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR optimization/8599 */
+/* { dg-do run } */
+/* { dg-options "-O2 -funroll-loops" } */
+/* { dg-options "-mtune=k6 -O2 -funroll-loops" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
+
+
+extern void abort (void);
+
+int array[6] = { 1,2,3,4,5,6 };
+
+void foo()
+{
+ int i;
+
+ for (i = 0; i < 5; i++)
+ array[i] = 0;
+}
+
+int main()
+{
+ foo();
+ if (array[0] || array [1] || array[2] || array[3] || array[4])
+ abort ();
+ if (array[5] != 6)
+ abort ();
+ return 0;
+}
--- /dev/null
+/* PR optimization/8599 */
+/* { dg-do run } */
+/* { dg-options "-O2 -funroll-loops" } */
+/* { dg-options "-mtune=k6 -O2 -funroll-loops" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
+
+
+extern void abort (void);
+
+int array[6] = { 1,2,3,4,5,6 };
+
+void foo()
+{
+ int i;
+
+ for (i = 0; i < 5; i++)
+ array[i] = 0;
+}
+
+int main()
+{
+ foo();
+ if (array[0] || array [1] || array[2] || array[3] || array[4])
+ abort ();
+ if (array[5] != 6)
+ abort ();
+ return 0;
+}
--- /dev/null
+:1000000075812F7506FF7507FF12068102000C002F
+:1000100000E506758203C39582F506E50775830042
+:100020009583F507D0E0F50875E0012506F58275A2
+:10003000E0003507F583E508F0D0E0F50875E0004D
+:100040002506F58275E0003507F583E508F0E5172C
+:10005000F519E516F51AE515F51BE514F51CE5137C
+:10006000F51DE512F51EE511F51F75E0022506F5F3
+:100070008275E0003507F583E510F0751100751203
+:1000800000751300751700751805751600750E00BC
+:10009000750F00E517F510750080E500F5F0E51027
+:1000A00025F0F510E500F5F0E50F25F0F50F750CDE
+:1000B00000750D00751400751500750B00750A01AB
+:1000C000750001C3E50FF5F0E51095F0F509E50BB6
+:1000D000F5F0E50B35F0F509E509F5F0E50055F02B
+:1000E000F500E500F5F0E50C45F0F50C750001C3F1
+:1000F000E50FF5F0E51095F0F509E50BF5F0E50BEA
+:1001000035F0F509E510F5F0E50F95F0F501E50B93
+:10011000F5F0E50B35F0F501E501F5F0E50945F001
+:10012000F509E50AF5F0E50965F0F509E509F5F0E9
+:10013000E50055F0F500C3E50EF5F0E51395F0F593
+:1001400009E50BF5F0E50B35F0F509E509F5F0E506
+:100150000055F0F500E500F5F0E50C45F0F50C75FF
+:100160000001C3E50FF5F0E51095F0F509E50BF595
+:10017000F0E50B35F0F509E510F5F0E50F95F0F534
+:1001800001E50BF5F0E50B35F0F501E501F5F0E5DE
+:100190000945F0F509E50AF5F0E50965F0F509E529
+:1001A00009F5F0E50055F0F500C3E50EF5F0E513AF
+:1001B00095F0F509E50BF5F0E50B35F0F509E513DC
+:1001C000F5F0E50E95F0F501E50BF5F0E50B35F0F2
+:1001D000F501E501F5F0E50945F0F509E50AF5F069
+:1001E000E50965F0F509E509F5F0E50055F0F500DC
+:1001F000C3E516F5F0E51295F0F509E50BF5F0E528
+:100200000B35F0F509E509F5F0E50055F0F500E5E9
+:1002100000F5F0E50C45F0F50C750001C3E50FF5B0
+:10022000F0E51095F0F509E50BF5F0E50B35F0F587
+:1002300009E510F5F0E50F95F0F501E50BF5F0E5B2
+:100240000B35F0F501E501F5F0E50945F0F509E5B7
+:100250000AF5F0E50965F0F509E509F5F0E5005561
+:10026000F0F500C3E50EF5F0E51395F0F509E50BA3
+:10027000F5F0E50B35F0F509E513F5F0E50E95F031
+:10028000F501E50BF5F0E50B35F0F501E501F5F0CD
+:10029000E50945F0F509E50AF5F0E50965F0F50928
+:1002A000E509F5F0E50055F0F500C3E516F5F0E5D4
+:1002B0001295F0F509E50BF5F0E50B35F0F509E5DC
+:1002C00012F5F0E51695F0F501E50BF5F0E50B35C7
+:1002D000F0F501E501F5F0E50945F0F509E50AF568
+:1002E000F0E50965F0F509E509F5F0E50055F0F5EB
+:1002F00000C3E518F5F0E51195F0F509E50BF5F00B
+:10030000E50B35F0F509E509F5F0E50055F0F500E8
+:10031000E500F5F0E50C45F0F50C750101C375003D
+:1003200000E50CF5F0E50095F0F500750000E5003E
+:10033000F5F0E50035F0F500E500F5F0E50165F0D4
+:10034000F501C3750000E50DF5F0E50095F0F50049
+:10035000750000E500F5F0E50035F0F500E500F585
+:10036000F0E50165F0F501C3750000E514F5F0E571
+:100370000095F0F500750000E500F5F0E50035F0BA
+:10038000F500E500F5F0E50165F0F501C375000045
+:10039000E515F5F0E50095F0F500750000E500F5D0
+:1003A000F0E50035F0F500E500F5F0E50165F0F564
+:1003B00001750900750A00750B00750000E501F56F
+:1003C000F0E50045F0F500E509F5F0E50045F0F54C
+:1003D00000E50AF5F0E50045F0F500E50BF5F0E580
+:1003E0000045F0F500E500700280030205F700907B
+:1003F0000000E582F50E900000E583F50F75090415
+:10040000750B00750C00750D00C3750000E511F546
+:10041000F0E509A4F50AE511F5F0E509A4E5F0F524
+:1004200001E50AF5F0E50035F0F500E512F5F0E537
+:1004300009A4F50AE512F5F0E509A4E5F0F509E5EA
+:100440000AF5F0E50135F0F501C3C3750900E500D3
+:10045000F5F0E50C35F0F50CE501F5F0E50D35F0BE
+:10046000F50DC3750100E511F5F0E50BA4F50AE5FE
+:1004700011F5F0E50BA4E5F0F509E50AF5F0E50165
+:1004800035F0F501750000C3C3750900E500F5F00E
+:10049000E50C35F0F50CE501F5F0E50D35F0F50D61
+:1004A000C3750000750100C3C3750900E500F5F0D0
+:1004B000E50C35F0F50CE501F5F0E50D35F0F50D41
+:1004C000C3750000750100C3C3750900E500F5F0B0
+:1004D000E50C35F0F50CE501F5F0E50D35F0F50D21
+:1004E000C3750000E50CF5F0E50E35F0F500E50DFF
+:1004F000F5F0E50F35F0F50E750A00750B00750C7B
+:1005000000750D00750900C3750100E509F5F0E5FA
+:100510000035F0F509E501F5F0E50E35F0F501E5FA
+:100520000AF503E501F502E509F582E502F583E543
+:1005300003F0750901C3750100E509F5F0E5003523
+:10054000F0F509E501F5F0E50E35F0F501E50BF5FF
+:1005500003E501F502E509F582E502F583E503F01F
+:10056000750902C3750100E509F5F0E50035F0F500
+:1005700009E501F5F0E50E35F0F501E50CF503E5CB
+:1005800001F502E509F582E502F583E503F0750959
+:1005900003C3750100E509F5F0E50035F0F509E55F
+:1005A00001F5F0E50E35F0F501E50DF503E501F592
+:1005B00002E509F582E502F583E503F075010175B1
+:1005C0000900750A00750B00C3750000E501F5F020
+:1005D000E51135F0F511E509F5F0E51235F0F51204
+:1005E000E50AF5F0E51335F0F513E50BF5F0E51741
+:1005F00035F0F51702008700750000E500F502E50B
+:1006000000F503E500F504E500F505E519F517E546
+:100610001AF516E51BF515E51CF514E51DF513E5B2
+:100620001EF512E51FF51175E0022506F58275E04D
+:10063000003507F583E0F51075E0002506F58275B5
+:10064000E0003507F583E0F508E508C0E075E00156
+:100650002506F58275E0003507F583E0F508E50825
+:10066000C0E075E0032506F50675E0003507F507DF
+:10067000E502F582E503F583E504F500E505F501FE
+:100680002200E506758204C39582F506E5077583A9
+:10069000009583F507D0E0F50875E0012506F582A1
+:1006A00075E0003507F583E508F0D0E0F50875E062
+:1006B000002506F58275E0003507F583E508F0753D
+:1006C000E0032506F58275E0003507F583E511F0B6
+:1006D00075E0022506F58275E0003507F583E51023
+:1006E000F0900000E582F50B900000E583F50075C1
+:1006F0000A00750900C3750100E509F5F0E50A3542
+:10070000F0F509C3750100E509F5F0E50B35F0F5E5
+:100710000DE501F5F0E50035F0F50E750901750AF6
+:1007200000750B00750C00750100C3750000E50134
+:10073000F5F0E50D35F0F501E500F5F0E50E35F0E5
+:10074000F500E509F503E500F502E501F582E502AE
+:10075000F583E503F0750101C3750000E501F5F0CF
+:10076000E50D35F0F501E500F5F0E50E35F0F500A5
+:10077000E50AF503E500F502E501F582E502F583FA
+:10078000E503F0750102C3750000E501F5F0E50D24
+:1007900035F0F501E500F5F0E50E35F0F500E50B77
+:1007A000F503E500F502E501F582E502F583E503D1
+:1007B000F0750103C3750000E501F5F0E50D35F0B6
+:1007C000F501E500F5F0E50E35F0F500E50CF50373
+:1007D000E500F502E501F582E502F583E503F09019
+:1007E0000000E582F50B900000E583F500750A0036
+:1007F000750904C3750100E509F5F0E50A35F0F562
+:1008000009C3750100E509F5F0E50B35F0F50DE5D7
+:1008100001F5F0E50035F0F50E750902750A007571
+:100820000B00750C00750100C3750000E501F5F0C3
+:10083000E50D35F0F501E500F5F0E50E35F0F500D4
+:10084000E509F503E500F502E501F582E502F5832A
+:10085000E503F0750101C3750000E501F5F0E50D54
+:1008600035F0F501E500F5F0E50E35F0F500E50AA7
+:10087000F503E500F502E501F582E502F583E50300
+:10088000F0750102C3750000E501F5F0E50D35F0E6
+:10089000F501E500F5F0E50E35F0F500E50BF503A3
+:1008A000E500F502E501F582E502F583E503F07563
+:1008B0000103C3750000E501F5F0E50D35F0F50124
+:1008C000E500F5F0E50E35F0F500E50CF503E50083
+:1008D000F502E501F582E502F583E503F0900000FD
+:1008E000E582F50B900000E583F500750A007509B7
+:1008F00008C3750100E509F5F0E50A35F0F509C30F
+:10090000750100E509F5F0E50B35F0F50DE501F5AC
+:10091000F0E50035F0F50E750903750A00750B005A
+:10092000750C00750100C3750000E501F5F0E50DDB
+:1009300035F0F501E500F5F0E50E35F0F500E509D7
+:10094000F503E500F502E501F582E502F583E5032F
+:10095000F0750101C3750000E501F5F0E50D35F016
+:10096000F501E500F5F0E50E35F0F500E50AF503D3
+:10097000E500F502E501F582E502F583E503F07592
+:100980000102C3750000E501F5F0E50D35F0F50154
+:10099000E500F5F0E50E35F0F500E50BF503E500B3
+:1009A000F502E501F582E502F583E503F075010343
+:1009B000C3750000E501F5F0E50D35F0F501E50042
+:1009C000F5F0E50E35F0F500E50CF503E500F50270
+:1009D000E501F582E502F583E503F0900000E5828C
+:1009E000F50B900000E583F500750A0075090CC34E
+:1009F000750100E509F5F0E50A35F0F509C3750163
+:100A000000E509F5F0E50B35F0F50DE501F5F0E54C
+:100A10000035F0F50E750904750A00750B00750CAC
+:100A200000750100C3750000E501F5F0E50D35F036
+:100A3000F501E500F5F0E50E35F0F500E509F50303
+:100A4000E500F502E501F582E502F583E503F075C1
+:100A50000101C3750000E501F5F0E50D35F0F50184
+:100A6000E500F5F0E50E35F0F500E50AF503E500E3
+:100A7000F502E501F582E502F583E503F075010273
+:100A8000C3750000E501F5F0E50D35F0F501E50071
+:100A9000F5F0E50E35F0F500E50BF503E500F502A0
+:100AA000E501F582E502F583E503F0750103C37501
+:100AB0000000E501F5F0E50D35F0F501E500F5F094
+:100AC000E50E35F0F500E50CF503E500F502E5016E
+:100AD000F582E502F583E503F0900000E582F50B71
+:100AE000900000E583F500750A00750910C37501D3
+:100AF00000E509F5F0E50A35F0F509C3750100E5F3
+:100B000009F5F0E50B35F0F50DE501F5F0E50035FB
+:100B1000F0F50E750905750A00750B00750C00756A
+:100B20000100C3750000E501F5F0E50D35F0F501B4
+:100B3000E500F5F0E50E35F0F500E509F503E50013
+:100B4000F502E501F582E502F583E503F0750101A3
+:100B5000C3750000E501F5F0E50D35F0F501E500A0
+:100B6000F5F0E50E35F0F500E50AF503E500F502D0
+:100B7000E501F582E502F583E503F0750102C37531
+:100B80000000E501F5F0E50D35F0F501E500F5F0C3
+:100B9000E50E35F0F500E50BF503E500F502E5019E
+:100BA000F582E502F583E503F0750103C3750000E6
+:100BB000E501F5F0E50D35F0F501E500F5F0E50EA0
+:100BC00035F0F500E50CF503E500F502E501F582E9
+:100BD000E502F583E503F0900000E582F50B900057
+:100BE00000E583F500750A00750914C3750100E579
+:100BF00009F5F0E50A35F0F509C3750100E509F5D9
+:100C0000F0E50B35F0F50DE501F5F0E50035F0F513
+:100C10000E750906750A00750B00750C007501004C
+:100C2000C3750000E501F5F0E50D35F0F501E500CF
+:100C3000F5F0E50E35F0F500E509F503E500F50200
+:100C4000E501F582E502F583E503F0750101C37561
+:100C50000000E501F5F0E50D35F0F501E500F5F0F2
+:100C6000E50E35F0F500E50AF503E500F502E501CE
+:100C7000F582E502F583E503F0750102C375000016
+:100C8000E501F5F0E50D35F0F501E500F5F0E50ECF
+:100C900035F0F500E50BF503E500F502E501F58219
+:100CA000E502F583E503F0750103C3750000E50176
+:100CB000F5F0E50D35F0F501E500F5F0E50E35F060
+:100CC000F500E50CF503E500F502E501F582E50226
+:100CD000F583E503F0120010900000E582F5109016
+:100CE0000000E583F511750000750100750C0475B1
+:100CF0000D00750E00750F00C3750900E500F5F0D5
+:100D0000E50CA4F50BE500F5F0E50CA4E5F0F50A1B
+:100D1000E50BF5F0E50935F0F509E501F5F0E50C31
+:100D2000A4F50BE501F5F0E50CA4E5F0F501E50B04
+:100D3000F5F0E50A35F0F50AC3C3750100E509F5DC
+:100D4000F0E50E35F0F50EE50AF5F0E50F35F0F5B6
+:100D50000FC3750A00E500F5F0E50DA4F50BE500FD
+:100D6000F5F0E50DA4E5F0F501E50BF5F0E50A3544
+:100D7000F0F50A750900C3C3750000E509F5F0E553
+:100D80000E35F0F50EE50AF5F0E50F35F0F50FC379
+:100D9000750900750A00C3C3750000E509F5F0E5A3
+:100DA0000E35F0F50EE50AF5F0E50F35F0F50FC359
+:100DB000750900750A00C3C3750000E509F5F0E583
+:100DC0000E35F0F50EE50AF5F0E50F35F0F50FC339
+:100DD000750000E50EF5F0E51035F0F500E50FF5CE
+:100DE000F0E51135F0F501E500F509E501F50A75C5
+:100DF0000100C3750000E501F5F0E50935F0F501E6
+:100E0000E500F5F0E50A35F0F500E500F502E5014D
+:100E1000F582E502F583E0F50B750101C37500006D
+:100E2000E501F5F0E50935F0F501E500F5F0E50A35
+:100E300035F0F500E500F502E501F582E502F58300
+:100E4000E0F50C750102C3750000E501F5F0E50958
+:100E500035F0F501E500F5F0E50A35F0F500E500BF
+:100E6000F502E501F582E502F583E0F50D75010374
+:100E7000C3750000E501F5F0E50935F0F501E50081
+:100E8000F5F0E50A35F0F500E500F502E501F5823B
+:100E9000E502F583E0F501750000E50BF5F0E500EE
+:100EA00045F0F500E50CF5F0E50045F0F500E50D41
+:100EB000F5F0E50045F0F500E501F5F0E50045F059
+:100EC000F500E50070028003021AFF00900000E5C3
+:100ED00082F510900000E583F511750001750100A1
+:100EE000750C04750D00750E00750F00C3750900B3
+:100EF000E500F5F0E50CA4F50BE500F5F0E50CA434
+:100F0000E5F0F50AE50BF5F0E50935F0F509E50141
+:100F1000F5F0E50CA4F50BE501F5F0E50CA4E5F022
+:100F2000F501E50BF5F0E50A35F0F50AC3C37501E7
+:100F300000E509F5F0E50E35F0F50EE50AF5F0E50A
+:100F40000F35F0F50FC3750A00E500F5F0E50DA4C7
+:100F5000F50BE500F5F0E50DA4E5F0F501E50BF581
+:100F6000F0E50A35F0F50A750900C3C3750000E520
+:100F700009F5F0E50E35F0F50EE50AF5F0E50F356B
+:100F8000F0F50FC3750900750A00C3C3750000E5CD
+:100F900009F5F0E50E35F0F50EE50AF5F0E50F354B
+:100FA000F0F50FC3750900750A00C3C3750000E5AD
+:100FB00009F5F0E50E35F0F50EE50AF5F0E50F352B
+:100FC000F0F50FC3750000E50EF5F0E51035F0F50E
+:100FD00000E50FF5F0E51135F0F501E500F509E55F
+:100FE00001F50A750100C3750000E501F5F0E5099A
+:100FF00035F0F501E500F5F0E50A35F0F500E5001E
+:10100000F502E501F582E502F583E0F50B750101D6
+:10101000C3750000E501F5F0E50935F0F501E500DF
+:10102000F5F0E50A35F0F500E500F502E501F58299
+:10103000E502F583E0F50C750102C3750000E501DA
+:10104000F5F0E50935F0F501E500F5F0E50A35F0D4
+:10105000F500E500F502E501F582E502F583E0F52E
+:101060000D750103C3750000E501F5F0E50935F0E4
+:10107000F501E500F5F0E50A35F0F500E500F502CB
+:10108000E501F582E502F583E0F501750000E50B69
+:10109000F5F0E50045F0F500E50CF5F0E50045F06C
+:1010A000F500E50DF5F0E50045F0F500E501F5F09A
+:1010B000E50045F0F500E50070028003021AEF003C
+:1010C000750100750900750A00750B00750000E5D3
+:1010D00001F5F0E50045F0F500E509F5F0E500451E
+:1010E000F0F500E50AF5F0E50045F0F500E50BF553
+:1010F000F0E50045F0F500E50070028003021ADF1C
+:1011000000900000E582F510900000E583F5117570
+:101110000002750100750C04750D00750E00750F49
+:1011200000C3750900E500F5F0E50CA4F50BE5003A
+:10113000F5F0E50CA4E5F0F50AE50BF5F0E5093569
+:10114000F0F509E501F5F0E50CA4F50BE501F5F086
+:10115000E50CA4E5F0F501E50BF5F0E50A35F0F551
+:101160000AC3C3750100E509F5F0E50E35F0F50E8B
+:10117000E50AF5F0E50F35F0F50FC3750A00E50057
+:10118000F5F0E50DA4F50BE500F5F0E50DA4E5F0AF
+:10119000F501E50BF5F0E50A35F0F50A750900C330
+:1011A000C3750000E509F5F0E50E35F0F50EE50A2A
+:1011B000F5F0E50F35F0F50FC3750900750A00C3AA
+:1011C000C3750000E509F5F0E50E35F0F50EE50A0A
+:1011D000F5F0E50F35F0F50FC3750900750A00C38A
+:1011E000C3750000E509F5F0E50E35F0F50EE50AEA
+:1011F000F5F0E50F35F0F50FC3750000E50EF5F0DD
+:10120000E51035F0F500E50FF5F0E51135F0F501E5
+:10121000E500F509E501F50A750100C3750000E573
+:1012200001F5F0E50935F0F501E500F5F0E50A35E1
+:10123000F0F500E500F502E501F582E502F583E051
+:10124000F50B750101C3750000E501F5F0E5093501
+:10125000F0F501E500F5F0E50A35F0F500E500F5FB
+:1012600002E501F582E502F583E0F50C750102C3A4
+:10127000750000E501F5F0E50935F0F501E500F54B
+:10128000F0E50A35F0F500E500F502E501F582E547
+:1012900002F583E0F50D750103C3750000E501F566
+:1012A000F0E50935F0F501E500F5F0E50A35F0F572
+:1012B00000E500F502E501F582E502F583E0F501C0
+:1012C000750000E50BF5F0E50045F0F500E50CF5DF
+:1012D000F0E50045F0F500E50DF5F0E50045F0F529
+:1012E00000E501F5F0E50045F0F500E5007002804D
+:1012F00003021ACF00750100750900750A00750B0D
+:1013000000750000E501F5F0E50045F0F500E509A0
+:10131000F5F0E50045F0F500E50AF5F0E50045F0EB
+:10132000F500E50BF5F0E50045F0F500E50070028D
+:101330008003021ABF00900000E582F510900000C3
+:10134000E583F511750003750100750C04750D003A
+:10135000750E00750F00C3750900E500F5F0E50C8A
+:10136000A4F50BE500F5F0E50CA4E5F0F50AE50BB6
+:10137000F5F0E50935F0F509E501F5F0E50CA4F522
+:101380000BE501F5F0E50CA4E5F0F501E50BF5F052
+:10139000E50A35F0F50AC3C3750100E509F5F0E586
+:1013A0000E35F0F50EE50AF5F0E50F35F0F50FC353
+:1013B000750A00E500F5F0E50DA4F50BE500F5F084
+:1013C000E50DA4E5F0F501E50BF5F0E50A35F0F5DE
+:1013D0000A750900C3C3750000E509F5F0E50E358F
+:1013E000F0F50EE50AF5F0E50F35F0F50FC37509D8
+:1013F00000750A00C3C3750000E509F5F0E50E3578
+:10140000F0F50EE50AF5F0E50F35F0F50FC37509B7
+:1014100000750A00C3C3750000E509F5F0E50E3557
+:10142000F0F50EE50AF5F0E50F35F0F50FC37500A0
+:1014300000E50EF5F0E51035F0F500E50FF5F0E507
+:101440001135F0F501E500F509E501F50A75010032
+:10145000C3750000E501F5F0E50935F0F501E5009B
+:10146000F5F0E50A35F0F500E500F502E501F58255
+:10147000E502F583E0F50B750101C3750000E50198
+:10148000F5F0E50935F0F501E500F5F0E50A35F090
+:10149000F500E500F502E501F582E502F583E0F5EA
+:1014A0000C750102C3750000E501F5F0E50935F0A2
+:1014B000F501E500F5F0E50A35F0F500E500F50287
+:1014C000E501F582E502F583E0F50D750103C375CD
+:1014D0000000E501F5F0E50935F0F501E500F5F06E
+:1014E000E50A35F0F500E500F502E501F582E502D3
+:1014F000F583E0F501750000E50BF5F0E50045F03A
+:10150000F500E50CF5F0E50045F0F500E50DF5F02A
+:10151000E50045F0F500E501F5F0E50045F0F500E2
+:10152000E50070028003021AAF0075010075090022
+:10153000750A00750B00750000E501F5F0E5004542
+:10154000F0F500E509F5F0E50045F0F500E50AF5F0
+:10155000F0E50045F0F500E50BF5F0E50045F0F5A8
+:1015600000E50070028003021A9F00900000E582EF
+:10157000F510900000E583F5117500047501007504
+:101580000C04750D00750E00750F00C3750900E59C
+:1015900000F5F0E50CA4F50BE500F5F0E50CA4E58D
+:1015A000F0F50AE50BF5F0E50935F0F509E501F58B
+:1015B000F0E50CA4F50BE501F5F0E50CA4E5F0F57C
+:1015C00001E50BF5F0E50A35F0F50AC3C375010036
+:1015D000E509F5F0E50E35F0F50EE50AF5F0E50F55
+:1015E00035F0F50FC3750A00E500F5F0E50DA4F53B
+:1015F0000BE500F5F0E50DA4E5F0F501E50BF5F0E0
+:10160000E50A35F0F50A750900C3C3750000E50960
+:10161000F5F0E50E35F0F50EE50AF5F0E50F35F0DD
+:10162000F50FC3750900750A00C3C3750000E5090D
+:10163000F5F0E50E35F0F50EE50AF5F0E50F35F0BD
+:10164000F50FC3750900750A00C3C3750000E509ED
+:10165000F5F0E50E35F0F50EE50AF5F0E50F35F09D
+:10166000F50FC3750000E50EF5F0E51035F0F50057
+:10167000E50FF5F0E51135F0F501E500F509E501B7
+:10168000F50A750100C3750000E501F5F0E50935BF
+:10169000F0F501E500F5F0E50A35F0F500E500F5B7
+:1016A00002E501F582E502F583E0F50B750101C362
+:1016B000750000E501F5F0E50935F0F501E500F507
+:1016C000F0E50A35F0F500E500F502E501F582E503
+:1016D00002F583E0F50C750102C3750000E501F524
+:1016E000F0E50935F0F501E500F5F0E50A35F0F52E
+:1016F00000E500F502E501F582E502F583E0F50D70
+:10170000750103C3750000E501F5F0E50935F0F555
+:1017100001E500F5F0E50A35F0F500E500F502E534
+:1017200001F582E502F583E0F501750000E50BF5B2
+:10173000F0E50045F0F500E50CF5F0E50045F0F5C5
+:1017400000E50DF5F0E50045F0F500E501F5F0E503
+:101750000045F0F500E50070028003021A8F007565
+:101760000100750900750A00750B00750000E501A0
+:10177000F5F0E50045F0F500E509F5F0E50045F088
+:10178000F500E50AF5F0E50045F0F500E50BF5F0AC
+:10179000E50045F0F500E50070028003021A8B00B9
+:1017A000900000E582F510900000E583F5117500CA
+:1017B00005750100750C04750D00750E00750F00A0
+:1017C000C3750900E500F5F0E50CA4F50BE500F59F
+:1017D000F0E50CA4E5F0F50AE50BF5F0E50935F0C8
+:1017E000F509E501F5F0E50CA4F50BE501F5F0E5EB
+:1017F0000CA4E5F0F501E50BF5F0E50A35F0F50A86
+:10180000C3C3750100E509F5F0E50E35F0F50EE509
+:101810000AF5F0E50F35F0F50FC3750A00E500F5A0
+:10182000F0E50DA4F50BE500F5F0E50DA4E5F0F508
+:1018300001E50BF5F0E50A35F0F50A750900C3C3BB
+:10184000750000E509F5F0E50E35F0F50EE50AF551
+:10185000F0E50F35F0F50FC3750900750A00C3C335
+:10186000750000E509F5F0E50E35F0F50EE50AF531
+:10187000F0E50F35F0F50FC3750900750A00C3C315
+:10188000750000E509F5F0E50E35F0F50EE50AF511
+:10189000F0E50F35F0F50FC3750000E50EF5F0E546
+:1018A0001035F0F500E50FF5F0E51135F0F501E53F
+:1018B00000F509E501F50A750100C3750000E501B1
+:1018C000F5F0E50935F0F501E500F5F0E50A35F04C
+:1018D000F500E500F502E501F582E502F583E0F5A6
+:1018E0000B750101C3750000E501F5F0E50935F060
+:1018F000F501E500F5F0E50A35F0F500E500F50243
+:10190000E501F582E502F583E0F50C750102C3758A
+:101910000000E501F5F0E50935F0F501E500F5F029
+:10192000E50A35F0F500E500F502E501F582E5028E
+:10193000F583E0F50D750103C3750000E501F5F0D1
+:10194000E50935F0F501E500F5F0E50A35F0F500BB
+:10195000E500F502E501F582E502F583E0F50E7597
+:101960000006750100750900750A00750F00C3E5D2
+:1019700000F5F0E50B95F0F500E500F5F0E50F4515
+:10198000F0F50FC3E501F5F0E50C95F0F500E50085
+:10199000F5F0E50F45F0F50FC3E509F5F0E50D9518
+:1019A000F0F500E500F5F0E50F45F0F50FC3E50AA9
+:1019B000F5F0E50E95F0F500E500F5F0E50F45F0E2
+:1019C000F50F750100750900750A00750000E50F37
+:1019D000F5F0E50045F0F500E501F5F0E50045F02E
+:1019E000F500E509F5F0E50045F0F500E50AF5F04C
+:1019F000E50045F0F500E50070028003021A87005B
+:101A0000750000750100750900750A00E500F50212
+:101A1000E501F503E509F504E50AF50575E003259B
+:101A200006F58275E0003507F583E0F51175E002F3
+:101A30002506F58275E0003507F583E0F51075E0C1
+:101A4000002506F58275E0003507F583E0F508E529
+:101A500008C0E075E0012506F58275E0003507F560
+:101A600083E0F508E508C0E075E0042506F5067595
+:101A7000E0003507F507E502F582E503F583E504A7
+:101A8000F500E505F5012200021A00000217A0008A
+:101A9000750101750900750A00750B0002176B00CE
+:101AA000750101750900750A00750B0002176B00BE
+:101AB000750101750900750A00750B0002153600E5
+:101AC000750101750900750A00750B0002153600D5
+:101AD000750101750900750A00750B0002130100FC
+:101AE000750101750900750A00750B0002130100EC
+:101AF000750101750900750A00750B000210CC0014
+:101B0000750101750900750A00750B000210CC0003
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Missing `unused parameter' warning.
+ egcs-1.1.2 fails, egcs-ss-19990418 passes.
+ http://gcc.gnu.org/ml/gcc-bugs/1998-09/msg00199.html */
+/* { dg-do compile } */
+/* { dg-options "-O -Wall -W" } */
+int
+f(c)
+ char c; /* { dg-warning "unused parameter" "unused parameter warning" } */
+{
+ return 0;
+}
--- /dev/null
+/* Missing `unused parameter' warning.
+ egcs-1.1.2 fails, egcs-ss-19990418 passes.
+ http://gcc.gnu.org/ml/gcc-bugs/1998-09/msg00199.html */
+/* { dg-do compile } */
+/* { dg-options "-O -Wall -W" } */
+int
+f(c)
+ char c; /* { dg-warning "unused parameter" "unused parameter warning" } */
+{
+ return 0;
+}
--- /dev/null
+:1000000000E506758201C39582F506E50775830054
+:100010009583F507D0E0F500D0E0F501750900758E
+:100020000A00750B00750C00E509F502E50AF503F9
+:10003000E50BF504E50CF505E501C0E0E500C0E0E1
+:1000400075E0012506F50675E0003507F507E502C0
+:10005000F582E503F583E504F500E505F5012200E9
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Copyright (C) 2000 Free Software Foundation.
+
+ by Alexandre Oliva <oliva@lsd.ic.unicamp.br> */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -finline-functions -Wunused -Wreturn-type" } */
+
+static void
+foo ()
+{
+ skip_it: ; /* { dg-warning "defined but not used" "unused label warning" } */
+}
+
+void
+bar ()
+{
+ foo ();
+}
--- /dev/null
+/* Copyright (C) 2000 Free Software Foundation.
+
+ by Alexandre Oliva <oliva@lsd.ic.unicamp.br> */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -finline-functions -Wunused -Wreturn-type" } */
+
+static void
+foo ()
+{
+ skip_it: ; /* { dg-warning "defined but not used" "unused label warning" } */
+}
+
+void
+bar ()
+{
+ foo ();
+}
--- /dev/null
+:1000000000D0E0F500D0E0F50100750900E509F544
+:1000100002E509F503E509F504E509F505E501C083
+:10002000E0E500C0E0E502F582E503F583E504F5CF
+:1000300000E505F5012200E506758202C39582F50B
+:1000400006E5077583009583F507D0E0F50875E0B0
+:10005000012506F58275E0003507F583E508F0D047
+:10006000E0F50875E0002506F58275E0003507F536
+:1000700083E508F0120000750000E500F502E500D8
+:10008000F503E500F504E500F50575E0002506F546
+:100090008275E0003507F583E0F508E508C0E075F6
+:1000A000E0012506F58275E0003507F583E0F508E7
+:1000B000E508C0E075E0022506F50675E0003507A5
+:1000C000F507E502F582E503F583E504F500E505AE
+:1000D000F501220000000000000000000000000008
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Copyright (C) 2000 Free Software Foundation. */
+/* Added extra line-breaks to check that diagnostics refer to correct token.
+ --Per Bothner. */
+/* { dg-do compile } */
+/* { dg-options "-Wunused" } */
+
+typedef short unused_type __attribute__ ((unused));
+main ()
+{
+ short
+ x /* { dg-warning "unused variable" "unused variable warning" } */
+ ;
+ unused_type y;
+}
--- /dev/null
+/* Copyright (C) 2000 Free Software Foundation. */
+/* Added extra line-breaks to check that diagnostics refer to correct token.
+ --Per Bothner. */
+/* { dg-do compile } */
+/* { dg-options "-Wunused" } */
+
+typedef short unused_type __attribute__ ((unused));
+main ()
+{
+ short
+ x /* { dg-warning "unused variable" "unused variable warning" } */
+ ;
+ unused_type y;
+}
--- /dev/null
+:1000000075812F7506FF7507FF12000F02000C00A7
+:10001000D0E0F500D0E0F501E509F502E509F503CA
+:10002000E509F504E509F505E501C0E0E500C0E0F6
+:10003000E502F582E503F583E504F500E505F50144
+:10004000220000000000000000000000000000008E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wunused -O3" } */
+
+static const int i = 0;
+static void f() { } /* { dg-warning "defined but not used" } */
+static inline void g() { }
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wunused -O3" } */
+
+static const int i = 0;
+static void f() { } /* { dg-warning "defined but not used" } */
+static inline void g() { }
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wunused" } */
+/* { dg-final { scan-assembler "string_to_look_for" } } */
+
+/* 'volatile' variables get output and don't produce a warning about being
+ unused. */
+static volatile char string[]
+ = "string_to_look_for"; /* { dg-bogus "not used" } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wunused" } */
+/* { dg-final { scan-assembler "string_to_look_for" } } */
+
+/* 'volatile' variables get output and don't produce a warning about being
+ unused. */
+static volatile char string[]
+ = "string_to_look_for"; /* { dg-bogus "not used" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+
+/* { dg-do compile } */
+/* { dg-options "-O3 -Wunused-parameter" } */
+static int t(int i) /* { dg-warning "unused parameter" "unused parameter warning" } */
+{
+ return 0;
+}
+int tt()
+{
+ return t(0);
+}
--- /dev/null
+
+/* { dg-do compile } */
+/* { dg-options "-O3 -Wunused-parameter" } */
+static int t(int i) /* { dg-warning "unused parameter" "unused parameter warning" } */
+{
+ return 0;
+}
+int tt()
+{
+ return t(0);
+}
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F500D0E0F501750900758E
+:100020000A00750B00750C00E509F502E50AF503F9
+:10003000E50BF504E50CF505E501C0E0E500C0E0E1
+:1000400075E0042506F50675E0003507F507E502BD
+:10005000F582E503F583E504F500E505F5012200E9
+:10006000E506758202C39582F506E507758300955E
+:1000700083F507D0E0F50875E0012506F58275E007
+:10008000003507F583E508F0D0E0F50875E00025B8
+:1000900006F58275E0003507F583E508F0751F0069
+:1000A000751E00751D00751C00120000E582F5022A
+:1000B000E583F503E500F504E501F505E502F50046
+:1000C000E503F501E504F509E505F50AE500F502A6
+:1000D000E501F503E509F504E50AF50575E00025F8
+:1000E00006F58275E0003507F583E0F508E508C000
+:1000F000E075E0012506F58275E0003507F583E03F
+:10010000F508E508C0E075E0022506F50675E00093
+:100110003507F507E502F582E503F583E504F5000B
+:10012000E505F501220000000000000000000000CD
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wunused" } */
+
+static int a = 10; /* { dg-warning "defined but not used" } */
+
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wunused" } */
+
+static int a = 10; /* { dg-warning "defined but not used" } */
+
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test whether -fverbose-asm works. */
+/* { dg-do compile } */
+/* { dg-options "-fverbose-asm" } */
+
+void foo (int *x)
+{
+ (*x)++;
+}
+
+int bar (int *y)
+{
+ int a, b;
+ b = 10;
+ a = 26;
+ foo (&a);
+ a += 10;
+ foo (&a);
+ *y--;
+ return b;
+}
+
+int
+main ()
+{
+ int argc;
+ int r =bar (&argc);
+ return 0;
+}
--- /dev/null
+/* Test whether -fverbose-asm works. */
+/* { dg-do compile } */
+/* { dg-options "-fverbose-asm" } */
+
+void foo (int *x)
+{
+ (*x)++;
+}
+
+int bar (int *y)
+{
+ int a, b;
+ b = 10;
+ a = 26;
+ foo (&a);
+ a += 10;
+ foo (&a);
+ *y--;
+ return b;
+}
+
+int
+main ()
+{
+ int argc;
+ int r =bar (&argc);
+ return 0;
+}
--- /dev/null
+:1000000075812F7506FF7507FF1206AA02000C0006
+:10001000E506758202C39582F506E50775830095AE
+:1000200083F507D0E0F518D0E0F519E514F50F7564
+:100030000100C3750000E501F5F0E51F35F0F5019D
+:10004000E500F5F0E51E35F0F500E500F502E50107
+:10005000F582E502F583E0F50B750101C37500003B
+:10006000E501F5F0E51F35F0F501E500F5F0E51ED9
+:1000700035F0F500E500F502E501F582E502F583CE
+:10008000E0F50C750102C3750000E501F5F0E51F10
+:1000900035F0F501E500F5F0E51E35F0F500E50079
+:1000A000F502E501F582E502F583E0F50D75010342
+:1000B000C3750000E501F5F0E51F35F0F501E50039
+:1000C000F5F0E51E35F0F500E500F502E501F582F5
+:1000D000E502F583E0F50E75000175010075090074
+:1000E000750A00C3751400E500F5F0E50B35F0F571
+:1000F00000E501F5F0E50C35F0F501E509F5F0E571
+:100100000D35F0F509E50AF5F0E50E35F0F50C755D
+:100110000B00C3750A00E50BF5F0E51F35F0F50B94
+:10012000E50AF5F0E51E35F0F50AE500F503E50A08
+:10013000F502E50BF582E502F583E503F0750B01A9
+:10014000C3750000E50BF5F0E51F35F0F50BE50094
+:10015000F5F0E51E35F0F50AE501F503E50AF502CF
+:10016000E50BF582E502F583E503F0750B02C37537
+:100170000000E50BF5F0E51F35F0F50BE500F5F0B7
+:10018000E51E35F0F50AE509F503E50AF502E50B8C
+:10019000F582E502F583E503F0750B03C3750000F6
+:1001A000E50BF5F0E51F35F0F50BE500F5F0E51E84
+:1001B00035F0F50AE50CF503E50AF502E50BF582E5
+:1001C000E502F583E503F0750000E500F502E500C2
+:1001D000F503E500F504E500F505E50FF514E5196F
+:1001E000C0E0E518C0E075E0022506F50675E00000
+:1001F0003507F507E502F582E503F583E504F5002B
+:10020000E505F5012200E50675820EC39582F50627
+:10021000E5077583009583F507D0E0F50875E005DF
+:100220002506F58275E0003507F583E508F0D0E096
+:10023000F50875E0042506F58275E0003507F583BD
+:10024000E508F075E00B2506F58275E0003507F549
+:1002500083E515F075E00A2506F58275E00035079F
+:10026000F583E514F075E0092506F58275E00035A3
+:1002700007F583E513F075E0082506F58275E000C3
+:100280003507F583E512F075E0072506F58275E080
+:10029000003507F583E511F075E0062506F5827552
+:1002A000E0003507F583E510F075100A751100754B
+:1002B0001200751300E506F50AE507F5017509005A
+:1002C000C3750000E509F5F0E50A35F0F50DE50028
+:1002D000F5F0E50135F0F50E75091A750A00750B94
+:1002E00000750C00750100C3750000E501F5F0E52F
+:1002F0000D35F0F501E500F5F0E50E35F0F500E51A
+:1003000009F503E500F502E501F582E502F583E56F
+:1003100003F0750101C3750000E501F5F0E50D3549
+:10032000F0F501E500F5F0E50E35F0F500E50AF52C
+:1003300003E500F502E501F582E502F583E503F04A
+:10034000750102C3750000E501F5F0E50D35F0F526
+:1003500001E500F5F0E50E35F0F500E50BF503E5F8
+:1003600000F502E501F582E502F583E503F075018C
+:1003700003C3750000E501F5F0E50D35F0F501E585
+:1003800000F5F0E50E35F0F500E50CF503E500F5B8
+:1003900002E501F582E502F583E503F0E506F509DE
+:1003A000E507F50A750100C3750000E501F5F0E504
+:1003B0000935F0F501E500F5F0E50A35F0F500E561
+:1003C00001F51FE500F51E12000FE506F50AE50729
+:1003D000F501750900C3750000E509F5F0E50A357A
+:1003E000F0F50EE500F5F0E50135F0F50FE506F561
+:1003F00009E507F50A750100C3750000E501F5F090
+:10040000E50935F0F501E500F5F0E50A35F0F50010
+:10041000E501F509E500F50A750100C3750000E581
+:1004200001F5F0E50935F0F501E500F5F0E50A35EF
+:10043000F0F500E500F502E501F582E502F583E05F
+:10044000F50B750101C3750000E501F5F0E509350F
+:10045000F0F501E500F5F0E50A35F0F500E500F509
+:1004600002E501F582E502F583E0F50C750102C3B2
+:10047000750000E501F5F0E50935F0F501E500F559
+:10048000F0E50A35F0F500E500F502E501F582E555
+:1004900002F583E0F50D750103C3750000E501F574
+:1004A000F0E50935F0F501E500F5F0E50A35F0F580
+:1004B00000E500F502E501F582E502F583E0F514BB
+:1004C00075000A750100750900750A00C3751500ED
+:1004D000E500F5F0E50B35F0F500E501F5F0E50C8C
+:1004E00035F0F501E509F5F0E50D35F0F509E50A1A
+:1004F000F5F0E51435F0F50C750B00C3750A00E551
+:100500000BF5F0E50E35F0F50BE50AF5F0E50F35E6
+:10051000F0F50AE500F503E50AF502E50BF582E5DD
+:1005200002F583E503F0750B01C3750000E50BF5DB
+:10053000F0E50E35F0F50BE500F5F0E50F35F0F5DB
+:100540000AE501F503E50AF502E50BF582E502F59A
+:1005500083E503F0750B02C3750000E50BF5F0E5CC
+:100560000E35F0F50BE500F5F0E50F35F0F50AE591
+:1005700009F503E50AF502E50BF582E502F583E5E9
+:1005800003F0750B03C3750000E50BF5F0E50E35C0
+:10059000F0F50BE500F5F0E50F35F0F50AE50CF5A3
+:1005A00003E50AF502E50BF582E502F583E503F0C4
+:1005B000E506F509E507F50A750100C3750000E5D4
+:1005C00001F5F0E50935F0F501E500F5F0E50A354E
+:1005D000F0F500E501F51FE500F51E12000FC3C39D
+:1005E000C3C3C3C3C3C3C3C3C3C3C3E510F502E5D9
+:1005F00011F503E512F504E513F50575E00B250685
+:10060000F58275E0003507F583E0F51575E00A25FC
+:1006100006F58275E0003507F583E0F51475E0090D
+:100620002506F58275E0003507F583E0F51375E0E2
+:10063000082506F58275E0003507F583E0F51275AB
+:10064000E0072506F58275E0003507F583E0F51132
+:1006500075E0062506F58275E0003507F583E0F5BF
+:100660001075E0042506F58275E0003507F583E096
+:10067000F508E508C0E075E0052506F58275E0009F
+:100680003507F583E0F508E508C0E075E00E2506BE
+:10069000F50675E0003507F507E502F582E503F597
+:1006A00083E504F500E505F5012200E506758206FF
+:1006B000C39582F506E5077583009583F507D0E0BD
+:1006C000F50875E0052506F58275E0003507F58328
+:1006D000E508F0D0E0F50875E0042506F58275E040
+:1006E000003507F583E508F0E506F509E507F50AA5
+:1006F000750100C3750000E501F5F0E50935F0F579
+:1007000001E500F5F0E50A35F0F500E501F51FE536
+:1007100000F51E12020575000075010075090075CF
+:100720000A00E500F502E501F503E509F504E50A2F
+:10073000F50575E0042506F58275E0003507F583BB
+:10074000E0F508E508C0E075E0052506F58275E0EE
+:10075000003507F583E0F508E508C0E075E00625FB
+:1007600006F50675E0003507F507E502F582E503B5
+:10077000F583E504F500E505F50122000000000021
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test visibility attribute on function definition. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "foo" } } */
+
+void
+__attribute__((visibility ("hidden")))
+foo()
+{ }
--- /dev/null
+/* Test visibility attribute on function definition. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "foo" } } */
+
+void
+__attribute__((visibility ("hidden")))
+foo()
+{ }
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test that a definition marked with dllexport has default
+ visibility. */
+/* { dg-require-visibility "" } */
+/* { dg-require-dll "" } */
+/* { dg-options "-fvisibility=hidden" } */
+/* { dg-final { scan-not-hidden "g" } } */
+/* { dg-final { scan-not-hidden "h" } } */
+/* { dg-final { scan-not-hidden "k" } } */
+/* { dg-final { scan-not-hidden "l" } } */
+
+__declspec(dllexport) void g() {}
+
+__declspec(dllexport) void h();
+void h() {}
+
+__declspec(dllexport) int k;
+
+__declspec(dllexport) extern int l;
+int l;
--- /dev/null
+/* Test that a definition marked with dllexport has default
+ visibility. */
+/* { dg-require-visibility "" } */
+/* { dg-require-dll "" } */
+/* { dg-options "-fvisibility=hidden" } */
+/* { dg-final { scan-not-hidden "g" } } */
+/* { dg-final { scan-not-hidden "h" } } */
+/* { dg-final { scan-not-hidden "k" } } */
+/* { dg-final { scan-not-hidden "l" } } */
+
+__declspec(dllexport) void g() {}
+
+__declspec(dllexport) void h();
+void h() {}
+
+__declspec(dllexport) int k;
+
+__declspec(dllexport) extern int l;
+int l;
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F5012200D0E0F500D0E0F5017509F5
+:1000400000E509F502E509F503E509F504E509F51B
+:1000500005E501C0E0E500C0E0E502F582E503F555
+:1000600083E504F500E505F501220000000000002D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test that visibility attribute on declaration extends to definition. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "foo" } } */
+
+void
+__attribute__((visibility ("hidden")))
+foo();
+
+void foo() { }
--- /dev/null
+/* Test that visibility attribute on declaration extends to definition. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "foo" } } */
+
+void
+__attribute__((visibility ("hidden")))
+foo();
+
+void foo() { }
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test visibility attribute on forward declaration of global variable */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "xyzzy" } } */
+
+int
+__attribute__((visibility ("hidden")))
+xyzzy = 5;
--- /dev/null
+/* Test visibility attribute on forward declaration of global variable */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "xyzzy" } } */
+
+int
+__attribute__((visibility ("hidden")))
+xyzzy = 5;
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test visibility attribute on forward declaration of global variable */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "xyzzy" } } */
+
+extern int
+__attribute__((visibility ("hidden")))
+xyzzy;
+
+int xyzzy = 5;
--- /dev/null
+/* Test visibility attribute on forward declaration of global variable */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "xyzzy" } } */
+
+extern int
+__attribute__((visibility ("hidden")))
+xyzzy;
+
+int xyzzy = 5;
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test visibility attribute on definition of a function that has
+ already had a forward declaration. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "foo" } } */
+
+void foo();
+
+void
+ __attribute__((visibility ("hidden")))
+foo()
+{ }
--- /dev/null
+/* Test visibility attribute on definition of a function that has
+ already had a forward declaration. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "foo" } } */
+
+void foo();
+
+void
+ __attribute__((visibility ("hidden")))
+foo()
+{ }
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test visibility attribute on definition of global variable that has
+ already had a forward declaration. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "xyzzy" } } */
+
+extern int xyzzy;
+
+int
+__attribute__((visibility ("hidden")))
+xyzzy = 5;
--- /dev/null
+/* Test visibility attribute on definition of global variable that has
+ already had a forward declaration. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "xyzzy" } } */
+
+extern int xyzzy;
+
+int
+__attribute__((visibility ("hidden")))
+xyzzy = 5;
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test warning from conflicting visibility specifications. */
+/* { dg-do compile } */
+/* { dg-require-visibility "protected" } */
+/* { dg-final { scan-hidden "xyzzy" } } */
+
+extern int
+__attribute__((visibility ("hidden")))
+xyzzy; /* { dg-warning "previous declaration" "" } */
+
+int
+__attribute__((visibility ("protected")))
+xyzzy = 5; /* { dg-warning "different visibility" "" } */
--- /dev/null
+/* Test warning from conflicting visibility specifications. */
+/* { dg-do compile } */
+/* { dg-require-visibility "protected" } */
+/* { dg-final { scan-hidden "xyzzy" } } */
+
+extern int
+__attribute__((visibility ("hidden")))
+xyzzy; /* { dg-warning "previous declaration" "" } */
+
+int
+__attribute__((visibility ("protected")))
+xyzzy = 5; /* { dg-warning "different visibility" "" } */
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test hidden visibility on built-in functions (for libc). PR 13856. */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99" } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "__GI_fputs_unlocked" } } */
+
+int fputs_unlocked (const char *restrict, int *restrict)
+ __asm__ ("__GI_fputs_unlocked")
+ __attribute__ ((visibility ("hidden")));
+
+int
+fputs_unlocked (str, fp)
+ const char *str;
+ int *fp;
+{
+}
--- /dev/null
+/* Test hidden visibility on built-in functions (for libc). PR 13856. */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99" } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "__GI_fputs_unlocked" } } */
+
+int fputs_unlocked (const char *restrict, int *restrict)
+ __asm__ ("__GI_fputs_unlocked")
+ __attribute__ ((visibility ("hidden")));
+
+int
+fputs_unlocked (str, fp)
+ const char *str;
+ int *fp;
+{
+}
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F500D0E0F501E509F5029C
+:10002000E509F503E509F504E509F505E501C0E095
+:10003000E500C0E075E0042506F50675E00035072B
+:10004000F507E502F582E503F583E504F500E5052E
+:10005000F501220000000000000000000000000088
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test that -fvisibility works. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-options "-fvisibility=hidden" } */
+/* { dg-final { scan-hidden "foo" } } */
+
+void foo();
+
+void foo() { }
--- /dev/null
+/* Test that -fvisibility works. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-options "-fvisibility=hidden" } */
+/* { dg-final { scan-hidden "foo" } } */
+
+void foo();
+
+void foo() { }
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test that #pragma GCC visibility works. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "foo" } } */
+
+#pragma GCC visibility push(hidden)
+void foo();
+#pragma GCC visibility pop
+
+void foo() { }
--- /dev/null
+/* Test that #pragma GCC visibility works. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-hidden "foo" } } */
+
+#pragma GCC visibility push(hidden)
+void foo();
+#pragma GCC visibility pop
+
+void foo() { }
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do assemble { target *-*-darwin* } } */
+
+#define __private_extern__ extern __attribute__((visibility ("hidden")))
+
+__private_extern__ int n;
+
+int
+mach_error_type(int sub)
+{
+ if (sub >= n)
+ return 1;
+ return 0;
+}
--- /dev/null
+/* { dg-do assemble { target *-*-darwin* } } */
+
+#define __private_extern__ extern __attribute__((visibility ("hidden")))
+
+__private_extern__ int n;
+
+int
+mach_error_type(int sub)
+{
+ if (sub >= n)
+ return 1;
+ return 0;
+}
--- /dev/null
+:1000000000E506758209C39582F506E5077583004C
+:100010009583F507D0E0F50875E0012506F58275B2
+:10002000E0003507F583E508F0D0E0F50875E0005D
+:100030002506F58275E0003507F583E508F0E5163D
+:10004000F518E515F519E514F51AE513F51B75E036
+:10005000042506F58275E0003507F583E512F07595
+:10006000E0032506F58275E0003507F583E511F01C
+:1000700075E0022506F58275E0003507F583E51089
+:10008000F0E51FF500E51EF501E51DF509900000FE
+:10009000E582F50C900000E583F50D750B00C37546
+:1000A0000A00E50BF5F0E50C35F0F50BE50AF5F087
+:1000B000E50D35F0F50AE50AF502E50BF582E502F6
+:1000C000F583E0F514750B01C3750A00E50BF5F037
+:1000D000E50C35F0F50BE50AF5F0E50D35F0F50A20
+:1000E000E50AF502E50BF582E502F583E0F510750A
+:1000F0000B02C3750A00E50BF5F0E50C35F0F50BC6
+:10010000E50AF5F0E50D35F0F50AE50AF502E50B2F
+:10011000F582E502F583E0F511750B03C3750A005E
+:10012000E50BF5F0E50C35F0F50BE50AF5F0E50D1E
+:1001300035F0F50AE50AF502E50BF582E502F583EF
+:10014000E0F512E500F516E501F515E509F513757D
+:100150000080E500F5F0E51C25F0F51CE500F5F064
+:10016000E51225F0F512750C00750D00750E007581
+:100170000F00750B00750A01750001C3E512F5F05B
+:10018000E51C95F0F509E50BF5F0E50B35F0F50903
+:10019000E509F5F0E50055F0F500E500F5F0E50CB2
+:1001A00045F0F50C750001C3E512F5F0E51C95F07E
+:1001B000F509E50BF5F0E50B35F0F509E51CF5F073
+:1001C000E51295F0F501E50BF5F0E50B35F0F501DD
+:1001D000E501F5F0E50945F0F509E50AF5F0E50971
+:1001E00065F0F509E509F5F0E50055F0F500C3E522
+:1001F00011F5F0E51395F0F509E50BF5F0E50B3594
+:10020000F0F509E509F5F0E50055F0F500E500F534
+:10021000F0E50C45F0F50C750001C3E512F5F0E5CD
+:100220001C95F0F509E50BF5F0E50B35F0F509E562
+:100230001CF5F0E51295F0F501E50BF5F0E50B3551
+:10024000F0F501E501F5F0E50945F0F509E50AF5F8
+:10025000F0E50965F0F509E509F5F0E50055F0F57B
+:1002600000C3E511F5F0E51395F0F509E50BF5F0A0
+:10027000E50B35F0F509E513F5F0E51195F0F5011D
+:10028000E50BF5F0E50B35F0F501E501F5F0E509D5
+:1002900045F0F509E50AF5F0E50965F0F509E50928
+:1002A000F5F0E50055F0F500C3E510F5F0E515951E
+:1002B000F0F509E50BF5F0E50B35F0F509E509F585
+:1002C000F0E50055F0F500E500F5F0E50C45F0F53A
+:1002D0000C750001C3E512F5F0E51C95F0F509E594
+:1002E0000BF5F0E50B35F0F509E51CF5F0E5129599
+:1002F000F0F501E50BF5F0E50B35F0F501E501F55D
+:10030000F0E50945F0F509E50AF5F0E50965F0F5D0
+:1003100009E509F5F0E50055F0F500C3E511F5F044
+:10032000E51395F0F509E50BF5F0E50B35F0F5096A
+:10033000E513F5F0E51195F0F501E50BF5F0E50BAA
+:1003400035F0F501E501F5F0E50945F0F509E50AB7
+:10035000F5F0E50965F0F509E509F5F0E50055F07A
+:10036000F500C3E510F5F0E51595F0F509E50BF599
+:10037000F0E50B35F0F509E515F5F0E51095F0F52C
+:1003800001E50BF5F0E50B35F0F501E501F5F0E5DC
+:100390000945F0F509E50AF5F0E50965F0F509E527
+:1003A00009F5F0E50055F0F500C3E514F5F0E516A4
+:1003B00095F0F509E50BF5F0E50B35F0F509E509E4
+:1003C000F5F0E50055F0F500E500F5F0E50C45F039
+:1003D000F50CE50CF500E50EF501750C01C375098A
+:1003E00000E500F5F0E50995F0F509750900E50966
+:1003F000F5F0E50935F0F509E509F5F0E50C65F0EE
+:10040000F50CC3750900E50DF5F0E50995F0F50962
+:10041000750900E509F5F0E50935F0F509E509F597
+:10042000F0E50C65F0F50CC3750900E501F5F0E5A4
+:100430000995F0F509750900E509F5F0E50935F0CC
+:10044000F509E509F5F0E50C65F0F50CC375090053
+:10045000E50FF5F0E50995F0F509750900E509F5F1
+:10046000F0E50935F0F509E509F5F0E50C65F0F57D
+:100470000C750D00750E00750F00750000E50CF58C
+:10048000F0E50045F0F500E50DF5F0E50045F0F587
+:1004900000E50EF5F0E50045F0F500E50FF5F0E5B7
+:1004A0000045F0F500E50070028003020557007575
+:1004B0000000750100750900750A00E500F502E508
+:1004C00001F503E509F504E50AF505E518F516E576
+:1004D00019F515E51AF514E51BF51375E004250665
+:1004E000F58275E0003507F583E0F51275E0032528
+:1004F00006F58275E0003507F583E0F51175E00239
+:100500002506F58275E0003507F583E0F51075E006
+:10051000002506F58275E0003507F583E0F508E56E
+:1005200008C0E075E0012506F58275E0003507F5A5
+:1005300083E0F508E508C0E075E0092506F50675D5
+:10054000E0003507F507E502F582E503F583E504EC
+:10055000F500E505F501220075000175010075093A
+:1005600000750A000204BB0000000000000000004B
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test that visibility works on common symbols also. */
+/* { dg-do assemble } */
+/* { dg-require-visibility "" } */
+
+int options __attribute__((__visibility__("hidden")));
+
+void f(void)
+{
+ options = 0;
+}
--- /dev/null
+/* Test that visibility works on common symbols also. */
+/* { dg-do assemble } */
+/* { dg-require-visibility "" } */
+
+int options __attribute__((__visibility__("hidden")));
+
+void f(void)
+{
+ options = 0;
+}
--- /dev/null
+:1000000000D0E0F518D0E0F519E512F50F900000EA
+:10001000E582F50D900000E583F50E750900750A7F
+:1000200000750B00750C00750100C3750000E5013B
+:10003000F5F0E50D35F0F501E500F5F0E50E35F0EC
+:10004000F500E509F503E500F502E501F582E502B5
+:10005000F583E503F0750101C3750000E501F5F0D6
+:10006000E50D35F0F501E500F5F0E50E35F0F500AC
+:10007000E50AF503E500F502E501F582E502F58301
+:10008000E503F0750102C3750000E501F5F0E50D2B
+:1000900035F0F501E500F5F0E50E35F0F500E50B7E
+:1000A000F503E500F502E501F582E502F583E503D8
+:1000B000F0750103C3750000E501F5F0E50D35F0BD
+:1000C000F501E500F5F0E50E35F0F500E50CF5037A
+:1000D000E500F502E501F582E502F583E503F0753B
+:1000E0000000E500F502E500F503E500F504E50094
+:1000F000F505E50FF512E519C0E0E518C0E0E502E9
+:10010000F582E503F583E504F500E505F501220038
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR middle-end/20303 */
+/* Test nesting of #pragma GCC visibility. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-not-hidden "foo00" } } */
+/* { dg-final { scan-hidden "foo01" } } */
+/* { dg-final { scan-not-hidden "foo02" } } */
+/* { dg-final { scan-hidden "foo03" } } */
+/* { dg-final { scan-not-hidden "foo04" } } */
+/* { dg-final { scan-not-hidden "foo05" } } */
+/* { dg-final { scan-not-hidden "foo06" } } */
+/* { dg-final { scan-hidden "foo07" } } */
+/* { dg-final { scan-not-hidden "foo08" } } */
+/* { dg-final { scan-hidden "foo09" } } */
+/* { dg-final { scan-not-hidden "foo10" } } */
+/* { dg-final { scan-hidden "foo11" } } */
+/* { dg-final { scan-hidden "foo12" } } */
+/* { dg-final { scan-hidden "foo13" } } */
+/* { dg-final { scan-not-hidden "foo14" } } */
+/* { dg-final { scan-hidden "foo15" } } */
+/* { dg-final { scan-not-hidden "foo16" } } */
+/* { dg-final { scan-hidden "foo17" } } */
+/* { dg-final { scan-not-hidden "foo18" } } */
+/* { dg-final { scan-hidden "foo19" } } */
+/* { dg-final { scan-not-hidden "foo20" } } */
+/* { dg-final { scan-hidden "foo21" } } */
+/* { dg-final { scan-not-hidden "foo22" } } */
+/* { dg-final { scan-hidden "foo23" } } */
+/* { dg-final { scan-not-hidden "foo24" } } */
+/* { dg-final { scan-hidden "foo25" } } */
+/* { dg-final { scan-not-hidden "foo26" } } */
+/* { dg-final { scan-hidden "foo27" } } */
+/* { dg-final { scan-not-hidden "foo28" } } */
+/* { dg-final { scan-hidden "foo29" } } */
+/* { dg-final { scan-not-hidden "foo30" } } */
+/* { dg-final { scan-hidden "foo31" } } */
+/* { dg-final { scan-not-hidden "foo32" } } */
+/* { dg-final { scan-hidden "foo33" } } */
+/* { dg-final { scan-not-hidden "foo34" } } */
+/* { dg-final { scan-hidden "foo35" } } */
+/* { dg-final { scan-not-hidden "foo36" } } */
+/* { dg-final { scan-hidden "foo37" } } */
+/* { dg-final { scan-not-hidden "foo38" } } */
+/* { dg-final { scan-hidden "foo39" } } */
+/* { dg-final { scan-not-hidden "foo40" } } */
+/* { dg-final { scan-hidden "foo41" } } */
+/* { dg-final { scan-not-hidden "foo42" } } */
+/* { dg-final { scan-hidden "foo43" } } */
+/* { dg-final { scan-not-hidden "foo44" } } */
+/* { dg-final { scan-hidden "foo45" } } */
+/* { dg-final { scan-hidden "foo46" } } */
+/* { dg-final { scan-hidden "foo47" } } */
+/* { dg-final { scan-not-hidden "foo48" } } */
+/* { dg-final { scan-hidden "foo49" } } */
+/* { dg-final { scan-not-hidden "foo50" } } */
+/* { dg-final { scan-hidden "foo51" } } */
+/* { dg-final { scan-not-hidden "foo52" } } */
+/* { dg-final { scan-not-hidden "foo53" } } */
+/* { dg-final { scan-not-hidden "foo54" } } */
+/* { dg-final { scan-hidden "foo55" } } */
+/* { dg-final { scan-not-hidden "foo56" } } */
+/* { dg-final { scan-hidden "foo57" } } */
+/* { dg-final { scan-not-hidden "foo58" } } */
+/* { dg-final { scan-hidden "foo59" } } */
+
+#pragma GCC visibility push(default)
+void foo00();
+#pragma GCC visibility push(hidden)
+void foo01();
+#pragma GCC visibility push(default)
+void foo02();
+#pragma GCC visibility push(hidden)
+void foo03();
+#pragma GCC visibility push(default)
+void foo04();
+#pragma GCC visibility push(default)
+void foo05();
+#pragma GCC visibility push(default)
+void foo06();
+#pragma GCC visibility push(hidden)
+void foo07();
+#pragma GCC visibility push(default)
+void foo08();
+#pragma GCC visibility push(hidden)
+void foo09();
+#pragma GCC visibility push(default)
+void foo10();
+#pragma GCC visibility push(hidden)
+void foo11();
+#pragma GCC visibility push(hidden)
+void foo12();
+#pragma GCC visibility push(hidden)
+void foo13();
+#pragma GCC visibility push(default)
+void foo14();
+#pragma GCC visibility push(hidden)
+void foo15();
+#pragma GCC visibility push(default)
+void foo16();
+#pragma GCC visibility push(hidden)
+void foo17();
+#pragma GCC visibility push(default)
+void foo18();
+#pragma GCC visibility push(hidden)
+void foo19();
+#pragma GCC visibility push(default)
+void foo20();
+#pragma GCC visibility push(hidden)
+void foo21();
+#pragma GCC visibility push(default)
+void foo22();
+#pragma GCC visibility push(hidden)
+void foo23();
+#pragma GCC visibility push(default)
+void foo24();
+#pragma GCC visibility push(hidden)
+void foo25();
+#pragma GCC visibility push(default)
+void foo26();
+#pragma GCC visibility push(hidden)
+void foo27();
+#pragma GCC visibility push(default)
+void foo28();
+#pragma GCC visibility push(hidden)
+void foo29();
+#pragma GCC visibility pop
+void foo30();
+#pragma GCC visibility pop
+void foo31();
+#pragma GCC visibility pop
+void foo32();
+#pragma GCC visibility pop
+void foo33();
+#pragma GCC visibility pop
+void foo34();
+#pragma GCC visibility pop
+void foo35();
+#pragma GCC visibility pop
+void foo36();
+#pragma GCC visibility pop
+void foo37();
+#pragma GCC visibility pop
+void foo38();
+#pragma GCC visibility pop
+void foo39();
+#pragma GCC visibility pop
+void foo40();
+#pragma GCC visibility pop
+void foo41();
+#pragma GCC visibility pop
+void foo42();
+#pragma GCC visibility pop
+void foo43();
+#pragma GCC visibility pop
+void foo44();
+#pragma GCC visibility pop
+void foo45();
+#pragma GCC visibility pop
+void foo46();
+#pragma GCC visibility pop
+void foo47();
+#pragma GCC visibility pop
+void foo48();
+#pragma GCC visibility pop
+void foo49();
+#pragma GCC visibility pop
+void foo50();
+#pragma GCC visibility pop
+void foo51();
+#pragma GCC visibility pop
+void foo52();
+#pragma GCC visibility pop
+void foo53();
+#pragma GCC visibility pop
+void foo54();
+#pragma GCC visibility pop
+void foo55();
+#pragma GCC visibility pop
+void foo56();
+#pragma GCC visibility pop
+void foo57();
+#pragma GCC visibility pop
+void foo58();
+#pragma GCC visibility push (hidden)
+void foo59();
+#pragma GCC visibility pop
+#pragma GCC visibility pop
+
+#define D(N) \
+void foo##N##0() { } \
+void foo##N##1() { } \
+void foo##N##2() { } \
+void foo##N##3() { } \
+void foo##N##4() { } \
+void foo##N##5() { } \
+void foo##N##6() { } \
+void foo##N##7() { } \
+void foo##N##8() { } \
+void foo##N##9() { }
+D(0)
+D(1)
+D(2)
+D(3)
+D(4)
+D(5)
--- /dev/null
+/* PR middle-end/20303 */
+/* Test nesting of #pragma GCC visibility. */
+/* { dg-do compile } */
+/* { dg-require-visibility "" } */
+/* { dg-final { scan-not-hidden "foo00" } } */
+/* { dg-final { scan-hidden "foo01" } } */
+/* { dg-final { scan-not-hidden "foo02" } } */
+/* { dg-final { scan-hidden "foo03" } } */
+/* { dg-final { scan-not-hidden "foo04" } } */
+/* { dg-final { scan-not-hidden "foo05" } } */
+/* { dg-final { scan-not-hidden "foo06" } } */
+/* { dg-final { scan-hidden "foo07" } } */
+/* { dg-final { scan-not-hidden "foo08" } } */
+/* { dg-final { scan-hidden "foo09" } } */
+/* { dg-final { scan-not-hidden "foo10" } } */
+/* { dg-final { scan-hidden "foo11" } } */
+/* { dg-final { scan-hidden "foo12" } } */
+/* { dg-final { scan-hidden "foo13" } } */
+/* { dg-final { scan-not-hidden "foo14" } } */
+/* { dg-final { scan-hidden "foo15" } } */
+/* { dg-final { scan-not-hidden "foo16" } } */
+/* { dg-final { scan-hidden "foo17" } } */
+/* { dg-final { scan-not-hidden "foo18" } } */
+/* { dg-final { scan-hidden "foo19" } } */
+/* { dg-final { scan-not-hidden "foo20" } } */
+/* { dg-final { scan-hidden "foo21" } } */
+/* { dg-final { scan-not-hidden "foo22" } } */
+/* { dg-final { scan-hidden "foo23" } } */
+/* { dg-final { scan-not-hidden "foo24" } } */
+/* { dg-final { scan-hidden "foo25" } } */
+/* { dg-final { scan-not-hidden "foo26" } } */
+/* { dg-final { scan-hidden "foo27" } } */
+/* { dg-final { scan-not-hidden "foo28" } } */
+/* { dg-final { scan-hidden "foo29" } } */
+/* { dg-final { scan-not-hidden "foo30" } } */
+/* { dg-final { scan-hidden "foo31" } } */
+/* { dg-final { scan-not-hidden "foo32" } } */
+/* { dg-final { scan-hidden "foo33" } } */
+/* { dg-final { scan-not-hidden "foo34" } } */
+/* { dg-final { scan-hidden "foo35" } } */
+/* { dg-final { scan-not-hidden "foo36" } } */
+/* { dg-final { scan-hidden "foo37" } } */
+/* { dg-final { scan-not-hidden "foo38" } } */
+/* { dg-final { scan-hidden "foo39" } } */
+/* { dg-final { scan-not-hidden "foo40" } } */
+/* { dg-final { scan-hidden "foo41" } } */
+/* { dg-final { scan-not-hidden "foo42" } } */
+/* { dg-final { scan-hidden "foo43" } } */
+/* { dg-final { scan-not-hidden "foo44" } } */
+/* { dg-final { scan-hidden "foo45" } } */
+/* { dg-final { scan-hidden "foo46" } } */
+/* { dg-final { scan-hidden "foo47" } } */
+/* { dg-final { scan-not-hidden "foo48" } } */
+/* { dg-final { scan-hidden "foo49" } } */
+/* { dg-final { scan-not-hidden "foo50" } } */
+/* { dg-final { scan-hidden "foo51" } } */
+/* { dg-final { scan-not-hidden "foo52" } } */
+/* { dg-final { scan-not-hidden "foo53" } } */
+/* { dg-final { scan-not-hidden "foo54" } } */
+/* { dg-final { scan-hidden "foo55" } } */
+/* { dg-final { scan-not-hidden "foo56" } } */
+/* { dg-final { scan-hidden "foo57" } } */
+/* { dg-final { scan-not-hidden "foo58" } } */
+/* { dg-final { scan-hidden "foo59" } } */
+
+#pragma GCC visibility push(default)
+void foo00();
+#pragma GCC visibility push(hidden)
+void foo01();
+#pragma GCC visibility push(default)
+void foo02();
+#pragma GCC visibility push(hidden)
+void foo03();
+#pragma GCC visibility push(default)
+void foo04();
+#pragma GCC visibility push(default)
+void foo05();
+#pragma GCC visibility push(default)
+void foo06();
+#pragma GCC visibility push(hidden)
+void foo07();
+#pragma GCC visibility push(default)
+void foo08();
+#pragma GCC visibility push(hidden)
+void foo09();
+#pragma GCC visibility push(default)
+void foo10();
+#pragma GCC visibility push(hidden)
+void foo11();
+#pragma GCC visibility push(hidden)
+void foo12();
+#pragma GCC visibility push(hidden)
+void foo13();
+#pragma GCC visibility push(default)
+void foo14();
+#pragma GCC visibility push(hidden)
+void foo15();
+#pragma GCC visibility push(default)
+void foo16();
+#pragma GCC visibility push(hidden)
+void foo17();
+#pragma GCC visibility push(default)
+void foo18();
+#pragma GCC visibility push(hidden)
+void foo19();
+#pragma GCC visibility push(default)
+void foo20();
+#pragma GCC visibility push(hidden)
+void foo21();
+#pragma GCC visibility push(default)
+void foo22();
+#pragma GCC visibility push(hidden)
+void foo23();
+#pragma GCC visibility push(default)
+void foo24();
+#pragma GCC visibility push(hidden)
+void foo25();
+#pragma GCC visibility push(default)
+void foo26();
+#pragma GCC visibility push(hidden)
+void foo27();
+#pragma GCC visibility push(default)
+void foo28();
+#pragma GCC visibility push(hidden)
+void foo29();
+#pragma GCC visibility pop
+void foo30();
+#pragma GCC visibility pop
+void foo31();
+#pragma GCC visibility pop
+void foo32();
+#pragma GCC visibility pop
+void foo33();
+#pragma GCC visibility pop
+void foo34();
+#pragma GCC visibility pop
+void foo35();
+#pragma GCC visibility pop
+void foo36();
+#pragma GCC visibility pop
+void foo37();
+#pragma GCC visibility pop
+void foo38();
+#pragma GCC visibility pop
+void foo39();
+#pragma GCC visibility pop
+void foo40();
+#pragma GCC visibility pop
+void foo41();
+#pragma GCC visibility pop
+void foo42();
+#pragma GCC visibility pop
+void foo43();
+#pragma GCC visibility pop
+void foo44();
+#pragma GCC visibility pop
+void foo45();
+#pragma GCC visibility pop
+void foo46();
+#pragma GCC visibility pop
+void foo47();
+#pragma GCC visibility pop
+void foo48();
+#pragma GCC visibility pop
+void foo49();
+#pragma GCC visibility pop
+void foo50();
+#pragma GCC visibility pop
+void foo51();
+#pragma GCC visibility pop
+void foo52();
+#pragma GCC visibility pop
+void foo53();
+#pragma GCC visibility pop
+void foo54();
+#pragma GCC visibility pop
+void foo55();
+#pragma GCC visibility pop
+void foo56();
+#pragma GCC visibility pop
+void foo57();
+#pragma GCC visibility pop
+void foo58();
+#pragma GCC visibility push (hidden)
+void foo59();
+#pragma GCC visibility pop
+#pragma GCC visibility pop
+
+#define D(N) \
+void foo##N##0() { } \
+void foo##N##1() { } \
+void foo##N##2() { } \
+void foo##N##3() { } \
+void foo##N##4() { } \
+void foo##N##5() { } \
+void foo##N##6() { } \
+void foo##N##7() { } \
+void foo##N##8() { } \
+void foo##N##9() { }
+D(0)
+D(1)
+D(2)
+D(3)
+D(4)
+D(5)
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F5012200D0E0F500D0E0F5017509F5
+:1000400000E509F502E509F503E509F504E509F51B
+:1000500005E501C0E0E500C0E0E502F582E503F555
+:1000600083E504F500E505F5012200D0E0F500D0B8
+:10007000E0F501750900E509F502E509F503E50973
+:10008000F504E509F505E501C0E0E500C0E0E5029D
+:10009000F582E503F583E504F500E505F5012200A9
+:1000A000D0E0F500D0E0F501750900E509F502E5BD
+:1000B00009F503E509F504E509F505E501C0E0E505
+:1000C00000C0E0E502F582E503F583E504F500E50F
+:1000D00005F5012200D0E0F500D0E0F5017509003A
+:1000E000E509F502E509F503E509F504E509F50576
+:1000F000E501C0E0E500C0E0E502F582E503F58337
+:10010000E504F500E505F5012200D0E0F500D0E0BA
+:10011000F501750900E509F502E509F503E509F5BD
+:1001200004E509F505E501C0E0E500C0E0E502F5FC
+:1001300082E503F583E504F500E505F5012200D02D
+:10014000E0F500D0E0F501750900E509F502E509E3
+:10015000F503E509F504E509F505E501C0E0E5006D
+:10016000C0E0E502F582E503F583E504F500E50569
+:10017000F5012200D0E0F500D0E0F501750900E5B9
+:1001800009F502E509F503E509F504E509F505E5D5
+:1001900001C0E0E500C0E0E502F582E503F583E596
+:1001A00004F500E505F5012200D0E0F500D0E0F50A
+:1001B00001750900E509F502E509F503E509F5040E
+:1001C000E509F505E501C0E0E500C0E0E502F582DE
+:1001D000E503F583E504F500E505F5012200D0E02F
+:1001E000F500D0E0F501750900E509F502E509F52E
+:1001F00003E509F504E509F505E501C0E0E500C002
+:10020000E0E502F582E503F583E504F500E505F593
+:10021000012200D0E0F500D0E0F501750900E50904
+:10022000F502E509F503E509F504E509F505E5013C
+:10023000C0E0E500C0E0E502F582E503F583E504F2
+:10024000F500E505F5012200D0E0F500D0E0F5016C
+:10025000750900E509F502E509F503E509F504E589
+:1002600009F505E501C0E0E500C0E0E502F582E53D
+:1002700003F583E504F500E505F5012200D0E0F57E
+:1002800000D0E0F501750900E509F502E509F5037F
+:10029000E509F504E509F505E501C0E0E500C0E084
+:1002A000E502F582E503F583E504F500E505F501D2
+:1002B0002200D0E0F500D0E0F501750900E509F570
+:1002C00002E509F503E509F504E509F505E501C0D1
+:1002D000E0E500C0E0E502F582E503F583E504F51D
+:1002E00000E505F5012200D0E0F500D0E0F501754C
+:1002F0000900E509F502E509F503E509F504E50955
+:10030000F505E501C0E0E500C0E0E502F582E503A2
+:10031000F583E504F500E505F5012200D0E0F500E0
+:10032000D0E0F501750900E509F502E509F503E5F9
+:1003300009F504E509F505E501C0E0E500C0E0E5E3
+:1003400002F582E503F583E504F500E505F50122F4
+:1003500000D0E0F500D0E0F501750900E509F502EF
+:10036000E509F503E509F504E509F505E501C0E052
+:10037000E500C0E0E502F582E503F583E504F5005C
+:10038000E505F5012200D0E0F500D0E0F5017509A2
+:1003900000E509F502E509F503E509F504E509F5C8
+:1003A00005E501C0E0E500C0E0E502F582E503F502
+:1003B00083E504F500E505F5012200D0E0F500D065
+:1003C000E0F501750900E509F502E509F503E50920
+:1003D000F504E509F505E501C0E0E500C0E0E5024A
+:1003E000F582E503F583E504F500E505F501220056
+:1003F000D0E0F500D0E0F501750900E509F502E56A
+:1004000009F503E509F504E509F505E501C0E0E5B1
+:1004100000C0E0E502F582E503F583E504F500E5BB
+:1004200005F5012200D0E0F500D0E0F501750900E6
+:10043000E509F502E509F503E509F504E509F50522
+:10044000E501C0E0E500C0E0E502F582E503F583E3
+:10045000E504F500E505F5012200D0E0F500D0E067
+:10046000F501750900E509F502E509F503E509F56A
+:1004700004E509F505E501C0E0E500C0E0E502F5A9
+:1004800082E503F583E504F500E505F5012200D0DA
+:10049000E0F500D0E0F501750900E509F502E50990
+:1004A000F503E509F504E509F505E501C0E0E5001A
+:1004B000C0E0E502F582E503F583E504F500E50516
+:1004C000F5012200D0E0F500D0E0F501750900E566
+:1004D00009F502E509F503E509F504E509F505E582
+:1004E00001C0E0E500C0E0E502F582E503F583E543
+:1004F00004F500E505F5012200D0E0F500D0E0F5B7
+:1005000001750900E509F502E509F503E509F504BA
+:10051000E509F505E501C0E0E500C0E0E502F5828A
+:10052000E503F583E504F500E505F5012200D0E0DB
+:10053000F500D0E0F501750900E509F502E509F5DA
+:1005400003E509F504E509F505E501C0E0E500C0AE
+:10055000E0E502F582E503F583E504F500E505F540
+:10056000012200D0E0F500D0E0F501750900E509B1
+:10057000F502E509F503E509F504E509F505E501E9
+:10058000C0E0E500C0E0E502F582E503F583E5049F
+:10059000F500E505F5012200D0E0F500D0E0F50119
+:1005A000750900E509F502E509F503E509F504E536
+:1005B00009F505E501C0E0E500C0E0E502F582E5EA
+:1005C00003F583E504F500E505F5012200D0E0F52B
+:1005D00000D0E0F501750900E509F502E509F5032C
+:1005E000E509F504E509F505E501C0E0E500C0E031
+:1005F000E502F582E503F583E504F500E505F5017F
+:100600002200D0E0F500D0E0F501750900E509F51C
+:1006100002E509F503E509F504E509F505E501C07D
+:10062000E0E500C0E0E502F582E503F583E504F5C9
+:1006300000E505F5012200D0E0F500D0E0F50175F8
+:100640000900E509F502E509F503E509F504E50901
+:10065000F505E501C0E0E500C0E0E502F582E5034F
+:10066000F583E504F500E505F5012200D0E0F5008D
+:10067000D0E0F501750900E509F502E509F503E5A6
+:1006800009F504E509F505E501C0E0E500C0E0E590
+:1006900002F582E503F583E504F500E505F50122A1
+:1006A00000D0E0F500D0E0F501750900E509F5029C
+:1006B000E509F503E509F504E509F505E501C0E0FF
+:1006C000E500C0E0E502F582E503F583E504F50009
+:1006D000E505F5012200D0E0F500D0E0F50175094F
+:1006E00000E509F502E509F503E509F504E509F575
+:1006F00005E501C0E0E500C0E0E502F582E503F5AF
+:1007000083E504F500E505F5012200D0E0F500D011
+:10071000E0F501750900E509F502E509F503E509CC
+:10072000F504E509F505E501C0E0E500C0E0E502F6
+:10073000F582E503F583E504F500E505F501220002
+:10074000D0E0F500D0E0F501750900E509F502E516
+:1007500009F503E509F504E509F505E501C0E0E55E
+:1007600000C0E0E502F582E503F583E504F500E568
+:1007700005F5012200D0E0F500D0E0F50175090093
+:10078000E509F502E509F503E509F504E509F505CF
+:10079000E501C0E0E500C0E0E502F582E503F58390
+:1007A000E504F500E505F5012200D0E0F500D0E014
+:1007B000F501750900E509F502E509F503E509F517
+:1007C00004E509F505E501C0E0E500C0E0E502F556
+:1007D00082E503F583E504F500E505F5012200D087
+:1007E000E0F500D0E0F501750900E509F502E5093D
+:1007F000F503E509F504E509F505E501C0E0E500C7
+:10080000C0E0E502F582E503F583E504F500E505C2
+:10081000F5012200D0E0F500D0E0F501750900E512
+:1008200009F502E509F503E509F504E509F505E52E
+:1008300001C0E0E500C0E0E502F582E503F583E5EF
+:1008400004F500E505F5012200D0E0F500D0E0F563
+:1008500001750900E509F502E509F503E509F50467
+:10086000E509F505E501C0E0E500C0E0E502F58237
+:10087000E503F583E504F500E505F5012200D0E088
+:10088000F500D0E0F501750900E509F502E509F587
+:1008900003E509F504E509F505E501C0E0E500C05B
+:1008A000E0E502F582E503F583E504F500E505F5ED
+:1008B000012200D0E0F500D0E0F501750900E5095E
+:1008C000F502E509F503E509F504E509F505E50196
+:1008D000C0E0E500C0E0E502F582E503F583E5044C
+:1008E000F500E505F5012200D0E0F500D0E0F501C6
+:1008F000750900E509F502E509F503E509F504E5E3
+:1009000009F505E501C0E0E500C0E0E502F582E596
+:1009100003F583E504F500E505F5012200D0E0F5D7
+:1009200000D0E0F501750900E509F502E509F503D8
+:10093000E509F504E509F505E501C0E0E500C0E0DD
+:10094000E502F582E503F583E504F500E505F5012B
+:100950002200D0E0F500D0E0F501750900E509F5C9
+:1009600002E509F503E509F504E509F505E501C02A
+:10097000E0E500C0E0E502F582E503F583E504F576
+:1009800000E505F5012200D0E0F500D0E0F50175A5
+:100990000900E509F502E509F503E509F504E509AE
+:1009A000F505E501C0E0E500C0E0E502F582E503FC
+:1009B000F583E504F500E505F5012200D0E0F5003A
+:1009C000D0E0F501750900E509F502E509F503E553
+:1009D00009F504E509F505E501C0E0E500C0E0E53D
+:1009E00002F582E503F583E504F500E505F501224E
+:1009F00000D0E0F500D0E0F501750900E509F50249
+:100A0000E509F503E509F504E509F505E501C0E0AB
+:100A1000E500C0E0E502F582E503F583E504F500B5
+:100A2000E505F5012200D0E0F500D0E0F5017509FB
+:100A300000E509F502E509F503E509F504E509F521
+:100A400005E501C0E0E500C0E0E502F582E503F55B
+:100A500083E504F500E505F5012200D0E0F500D0BE
+:100A6000E0F501750900E509F502E509F503E50979
+:100A7000F504E509F505E501C0E0E500C0E0E502A3
+:100A8000F582E503F583E504F500E505F5012200AF
+:100A9000D0E0F500D0E0F501750900E509F502E5C3
+:100AA00009F503E509F504E509F505E501C0E0E50B
+:100AB00000C0E0E502F582E503F583E504F500E515
+:100AC00005F5012200D0E0F500D0E0F50175090040
+:100AD000E509F502E509F503E509F504E509F5057C
+:100AE000E501C0E0E500C0E0E502F582E503F5833D
+:100AF000E504F500E505F5012200D0E0F500D0E0C1
+:100B0000F501750900E509F502E509F503E509F5C3
+:100B100004E509F505E501C0E0E500C0E0E502F502
+:100B200082E503F583E504F500E505F5012200D033
+:100B3000E0F500D0E0F501750900E509F502E509E9
+:100B4000F503E509F504E509F505E501C0E0E50073
+:100B5000C0E0E502F582E503F583E504F500E5056F
+:100B6000F5012200D0E0F500D0E0F501750900E5BF
+:100B700009F502E509F503E509F504E509F505E5DB
+:100B800001C0E0E500C0E0E502F582E503F583E59C
+:100B900004F500E505F5012200D0E0F500D0E0F510
+:100BA00001750900E509F502E509F503E509F50414
+:100BB000E509F505E501C0E0E500C0E0E502F582E4
+:100BC000E503F583E504F500E505F5012200D0E035
+:100BD000F500D0E0F501750900E509F502E509F534
+:100BE00003E509F504E509F505E501C0E0E500C008
+:100BF000E0E502F582E503F583E504F500E505F59A
+:100C0000012200D0E0F500D0E0F501750900E5090A
+:100C1000F502E509F503E509F504E509F505E50142
+:100C2000C0E0E500C0E0E502F582E503F583E504F8
+:100C3000F500E505F5012200D0E0F500D0E0F50172
+:100C4000750900E509F502E509F503E509F504E58F
+:100C500009F505E501C0E0E500C0E0E502F582E543
+:100C600003F583E504F500E505F501220000000029
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Don't warn where the left-hand side of a comma expression is a
+ comma expression whose right-hand side is cast to void. Bug
+ 21159. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+int a, b, c, d;
+int e(void) { return (void)a, b; }
+int f(void) { return (void)a, (void)b, c; }
+int g(void) { return (void)a, (void)b, (void)c, d; }
--- /dev/null
+/* Don't warn where the left-hand side of a comma expression is a
+ comma expression whose right-hand side is cast to void. Bug
+ 21159. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+int a, b, c, d;
+int e(void) { return (void)a, b; }
+int f(void) { return (void)a, (void)b, c; }
+int g(void) { return (void)a, (void)b, (void)c, d; }
--- /dev/null
+:1000000000D0E0F518D0E0F519E511F50EE510F592
+:100010000F900004E582F509900004E583F50A7568
+:100020000100C3750000E501F5F0E50935F0F501C3
+:10003000E500F5F0E50A35F0F500E500F502E5012B
+:10004000F582E502F583E0F50B750101C37500004B
+:10005000E501F5F0E50935F0F501E500F5F0E50A13
+:1000600035F0F500E500F502E501F582E502F583DE
+:10007000E0F50C750102C3750000E501F5F0E50936
+:1000800035F0F501E500F5F0E50A35F0F500E5009D
+:10009000F502E501F582E502F583E0F50D75010352
+:1000A000C3750000E501F5F0E50935F0F501E5005F
+:1000B000F5F0E50A35F0F500E500F502E501F58219
+:1000C000E502F583E0F500E50BF502E50CF503E547
+:1000D0000DF504E500F505E50EF511E50FF510E564
+:1000E00019C0E0E518C0E0E502F582E503F583E517
+:1000F00004F500E505F5012200D0E0F518D0E0F5A3
+:1001000019E511F50EE510F50F900008E582F509E7
+:10011000900008E583F50A750100C3750000E5014C
+:10012000F5F0E50935F0F501E500F5F0E50A35F003
+:10013000F500E500F502E501F582E502F583E0F55D
+:100140000B750101C3750000E501F5F0E50935F017
+:10015000F501E500F5F0E50A35F0F500E500F502FA
+:10016000E501F582E502F583E0F50C750102C37542
+:100170000000E501F5F0E50935F0F501E500F5F0E1
+:10018000E50A35F0F500E500F502E501F582E50246
+:10019000F583E0F50D750103C3750000E501F5F089
+:1001A000E50935F0F501E500F5F0E50A35F0F50073
+:1001B000E500F502E501F582E502F583E0F500E5ED
+:1001C0000BF502E50CF503E50DF504E500F505E595
+:1001D0000EF511E50FF510E519C0E0E518C0E0E5F2
+:1001E00002F582E503F583E504F500E505F5012256
+:1001F00000D0E0F518D0E0F519E511F50EE510F5A1
+:100200000F90000CE582F50990000CE583F50A7566
+:100210000100C3750000E501F5F0E50935F0F501D1
+:10022000E500F5F0E50A35F0F500E500F502E50139
+:10023000F582E502F583E0F50B750101C375000059
+:10024000E501F5F0E50935F0F501E500F5F0E50A21
+:1002500035F0F500E500F502E501F582E502F583EC
+:10026000E0F50C750102C3750000E501F5F0E50944
+:1002700035F0F501E500F5F0E50A35F0F500E500AB
+:10028000F502E501F582E502F583E0F50D75010360
+:10029000C3750000E501F5F0E50935F0F501E5006D
+:1002A000F5F0E50A35F0F500E500F502E501F58227
+:1002B000E502F583E0F500E50BF502E50CF503E555
+:1002C0000DF504E500F505E50EF511E50FF510E572
+:1002D00019C0E0E518C0E0E502F582E503F583E525
+:1002E00004F500E505F50122000000000000000013
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test further cases of warnings for comma expressions, with and
+ without casts to void. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+int a, b, c, d;
+int e(void) { return (char)a, b; } /* { dg-warning "warning: left-hand operand of comma expression has no effect" } */
+int f(void) { return (a ? (void)b : (void)c), d; } /* { dg-warning "warning: left-hand operand of comma expression has no effect" } */
--- /dev/null
+/* Test further cases of warnings for comma expressions, with and
+ without casts to void. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+int a, b, c, d;
+int e(void) { return (char)a, b; } /* { dg-warning "warning: left-hand operand of comma expression has no effect" } */
+int f(void) { return (a ? (void)b : (void)c), d; } /* { dg-warning "warning: left-hand operand of comma expression has no effect" } */
--- /dev/null
+:1000000000D0E0F518D0E0F519E511F50EE510F592
+:100010000F900004E582F509900004E583F50A7568
+:100020000100C3750000E501F5F0E50935F0F501C3
+:10003000E500F5F0E50A35F0F500E500F502E5012B
+:10004000F582E502F583E0F50B750101C37500004B
+:10005000E501F5F0E50935F0F501E500F5F0E50A13
+:1000600035F0F500E500F502E501F582E502F583DE
+:10007000E0F50C750102C3750000E501F5F0E50936
+:1000800035F0F501E500F5F0E50A35F0F500E5009D
+:10009000F502E501F582E502F583E0F50D75010352
+:1000A000C3750000E501F5F0E50935F0F501E5005F
+:1000B000F5F0E50A35F0F500E500F502E501F58219
+:1000C000E502F583E0F500E50BF502E50CF503E547
+:1000D0000DF504E500F505E50EF511E50FF510E564
+:1000E00019C0E0E518C0E0E502F582E503F583E517
+:1000F00004F500E505F5012200D0E0F518D0E0F5A3
+:1001000019E511F50EE510F50F90000CE582F509E3
+:1001100090000CE583F50A750100C3750000E50148
+:10012000F5F0E50935F0F501E500F5F0E50A35F003
+:10013000F500E500F502E501F582E502F583E0F55D
+:100140000B750101C3750000E501F5F0E50935F017
+:10015000F501E500F5F0E50A35F0F500E500F502FA
+:10016000E501F582E502F583E0F50C750102C37542
+:100170000000E501F5F0E50935F0F501E500F5F0E1
+:10018000E50A35F0F500E500F502E501F582E50246
+:10019000F583E0F50D750103C3750000E501F5F089
+:1001A000E50935F0F501E500F5F0E50A35F0F50073
+:1001B000E500F502E501F582E502F583E0F500E5ED
+:1001C0000BF502E50CF503E50DF504E500F505E595
+:1001D0000EF511E50FF510E519C0E0E518C0E0E5F2
+:1001E00002F582E503F583E504F500E505F5012256
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* PR c/12553: we were erroneously setting TREE_SIDE_EFFECTS on &y, which
+ confused tree-ssa. */
+
+void f()
+{
+ int x;
+ volatile int y;
+ &x == &y;
+}
--- /dev/null
+/* PR c/12553: we were erroneously setting TREE_SIDE_EFFECTS on &y, which
+ confused tree-ssa. */
+
+void f()
+{
+ int x;
+ volatile int y;
+ &x == &y;
+}
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* The compiler used to say passing arg 0 of, which is wrong. */
+/* Radar 3069179 */
+
+/* { dg-options "-O3" } */
+
+static void foo (p)
+ int p;
+{
+}
+
+void bar (void)
+{
+ void *vp;
+
+ foo (vp); /* { dg-warning "passing argument 1 of" } */
+}
--- /dev/null
+/* The compiler used to say passing arg 0 of, which is wrong. */
+/* Radar 3069179 */
+
+/* { dg-options "-O3" } */
+
+static void foo (p)
+ int p;
+{
+}
+
+void bar (void)
+{
+ void *vp;
+
+ foo (vp); /* { dg-warning "passing argument 1 of" } */
+}
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F500D0E0F501750900E51E
+:1000200009F502E509F503E509F504E509F505E536
+:1000300001C0E0E500C0E075E0042506F50675E0C6
+:10004000003507F507E502F582E503F583E504F5DC
+:1000500000E505F5012200E506758202C39582F5EB
+:1000600006E5077583009583F507D0E0F50875E090
+:10007000012506F58275E0003507F583E508F0D027
+:10008000E0F50875E0002506F58275E0003507F516
+:1000900083E508F0751D00751C0012000075000056
+:1000A000E500F502E500F503E500F504E500F505DA
+:1000B00075E0002506F58275E0003507F583E0F56B
+:1000C00008E508C0E075E0012506F58275E0003519
+:1000D00007F583E0F508E508C0E075E0022506F5C0
+:1000E0000675E0003507F507E502F582E503F583BF
+:1000F000E504F500E505F501220000000000000020
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+/* Compile with -Wall to get a warning if built-in and system wchar_t don't
+ match. */
+
+#define _STDDEF_H
+#include <wchar.h>
+
+__WCHAR_TYPE__ __wc_t__;
+wchar_t *wc_t_p;
+
+void
+wct (void)
+{
+ wc_t_p = &__wc_t__;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+/* Compile with -Wall to get a warning if built-in and system wchar_t don't
+ match. */
+
+#define _STDDEF_H
+#include <wchar.h>
+
+__WCHAR_TYPE__ __wc_t__;
+wchar_t *wc_t_p;
+
+void
+wct (void)
+{
+ wc_t_p = &__wc_t__;
+}
--- /dev/null
+:1000000000D0E0F50ED0E0F50FE510F50D900004FE
+:10001000E582F50B900004E583F50C900000E58285
+:10002000F509900000E583F50A750100C37500002D
+:10003000E501F5F0E50B35F0F501E500F5F0E50C2F
+:1000400035F0F500E509F503E500F502E501F58277
+:10005000E502F583E503F0750101C3750000E501D4
+:10006000F5F0E50B35F0F501E500F5F0E50C35F0C0
+:10007000F500E50AF503E500F502E501F582E50284
+:10008000F583E503F0750000E500F502E500F503F2
+:10009000E500F504E500F505E50DF510E50FC0E018
+:1000A000E50EC0E0E502F582E503F583E504F50021
+:1000B000E505F5012200000000000000000000003E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-options "-fshort-wchar" } */
+/* Check that "-fshort-wchar" makes wchar_t the same size as "unsigned
+ short". */
+
+extern int i[sizeof (L'a')];
+int i[sizeof (unsigned short)];
--- /dev/null
+/* { dg-options "-fshort-wchar" } */
+/* Check that "-fshort-wchar" makes wchar_t the same size as "unsigned
+ short". */
+
+extern int i[sizeof (L'a')];
+int i[sizeof (unsigned short)];
--- /dev/null
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Winline -O2" } */
+
+void q(void);
+inline int t(void)
+{
+ int ret;
+ q();
+ ret = t(); /* We define sane semantics for inline keyword on recursive
+ functions, so do not warn here. */
+ q();
+ return ret;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Winline -O2" } */
+
+void q(void);
+inline int t(void)
+{
+ int ret;
+ q();
+ ret = t(); /* We define sane semantics for inline keyword on recursive
+ functions, so do not warn here. */
+ q();
+ return ret;
+}
--- /dev/null
+:100000000000E506758206C39582F506E50775834F
+:10001000009583F507D0E0F50875E0012506F58227
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000002506F58275E0003507F583E508F075C3
+:10004000E0052506F58275E0003507F583E513F038
+:1000500075E0042506F58275E0003507F583E512A5
+:10006000F075E0032506F58275E0003507F583E5B8
+:1000700011F075E0022506F58275E0003507F5837D
+:10008000E510F0120001E582F502E583F503E500D5
+:10009000F504E501F505E502F510E503F511E504C4
+:1000A000F512E505F513E510F502E511F503E51286
+:1000B000F504E513F50575E0052506F58275E00004
+:1000C0003507F583E0F51375E0042506F58275E044
+:1000D000003507F583E0F51275E0032506F5827516
+:1000E000E0003507F583E0F51175E0022506F5829D
+:1000F00075E0003507F583E0F51075E0002506F59D
+:100100008275E0003507F583E0F508E508C0E07585
+:10011000E0012506F58275E0003507F583E0F50876
+:10012000E508C0E075E0062506F50675E000350730
+:10013000F507E502F582E503F583E504F500E5053D
+:10014000F501220000000000000000000000000097
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Winline -O2" } */
+
+inline int q(void); /* { dg-warning "body not available" "" } */
+inline int t(void)
+{
+ return q(); /* { dg-warning "called from here" "" } */
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Winline -O2" } */
+
+inline int q(void); /* { dg-warning "body not available" "" } */
+inline int t(void)
+{
+ return q(); /* { dg-warning "called from here" "" } */
+}
--- /dev/null
+:100000000000E506758202C39582F506E507758353
+:10001000009583F507D0E0F50875E0012506F58227
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000002506F58275E0003507F583E508F0E553
+:1000400082F502E583F503E500F504E501F505E534
+:1000500002F500E503F501E504F509E505F50AE516
+:1000600000F502E501F503E509F504E50AF5057576
+:10007000E0002506F58275E0003507F583E0F50818
+:10008000E508C0E075E0012506F58275E00035075A
+:10009000F583E0F508E508C0E075E0022506F50601
+:1000A00075E0003507F507E502F582E503F583E520
+:1000B00004F500E505F50122000000000000000045
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Winline -O2 --param max-inline-insns-single=1" } */
+
+void big (void);
+inline int q(void)
+{ /* { dg-warning "max-inline-insns-single" "" } */
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+}
+inline int t (void)
+{
+ return q (); /* { dg-warning "called from here" "" } */
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Winline -O2 --param max-inline-insns-single=1" } */
+
+void big (void);
+inline int q(void)
+{ /* { dg-warning "max-inline-insns-single" "" } */
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+}
+inline int t (void)
+{
+ return q (); /* { dg-warning "called from here" "" } */
+}
--- /dev/null
+:100000000000E506758203C39582F506E507758352
+:10001000009583F507D0E0F50875E0022506F58226
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000012506F58275E0003507F583E508F075C2
+:10004000E0002506F58275E0003507F583E0F5024E
+:1000500075E0002506F58275E0003507F583E0F5CB
+:100060000375E0002506F58275E0003507F583E0AD
+:10007000F50475E0002506F58275E0003507F58387
+:10008000E0F50575E0012506F58275E0003507F518
+:1000900083E0F508E508C0E075E0022506F5827505
+:1000A000E0003507F583E0F508E508C0E075E003FA
+:1000B0002506F50675E0003507F507E502F582E54A
+:1000C00003F583E504F500E505F5012200E5067575
+:1000D0008202C39582F506E5077583009583F507CF
+:1000E000D0E0F50875E0012506F58275E0003507DA
+:1000F000F583E508F0D0E0F50875E0002506F58207
+:1001000075E0003507F583E508F0120001E582F59A
+:1001100002E583F503E500F504E501F505E502F5E3
+:1001200000E503F501E504F509E505F50AE500F547
+:1001300002E501F503E509F504E50AF50575E000BA
+:100140002506F58275E0003507F583E0F508E5083A
+:10015000C0E075E0012506F58275E0003507F583FE
+:10016000E0F508E508C0E075E0022506F50675E053
+:10017000003507F507E502F582E503F583E504F5AB
+:1001800000E505F50122000000000000000000006D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Winline -O2 --param inline-unit-growth=0 --param large-unit-insns=0" } */
+
+void big (void);
+inline int q(void)
+{ /* { dg-warning "inline-unit-growth" } */
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+}
+inline int q1(void)
+{
+ big();
+ big();
+ big();
+}
+int t (void)
+{
+ /* We allow one inlining over limit. */
+ q1();
+ return q (); /* { dg-warning "called from here" } */
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Winline -O2 --param inline-unit-growth=0 --param large-unit-insns=0" } */
+
+void big (void);
+inline int q(void)
+{ /* { dg-warning "inline-unit-growth" } */
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+}
+inline int q1(void)
+{
+ big();
+ big();
+ big();
+}
+int t (void)
+{
+ /* We allow one inlining over limit. */
+ q1();
+ return q (); /* { dg-warning "called from here" } */
+}
--- /dev/null
+:100000000000E506758203C39582F506E507758352
+:10001000009583F507D0E0F50875E0022506F58226
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000012506F58275E0003507F583E508F075C2
+:10004000E0002506F58275E0003507F583E0F5024E
+:1000500075E0002506F58275E0003507F583E0F5CB
+:100060000375E0002506F58275E0003507F583E0AD
+:10007000F50475E0002506F58275E0003507F58387
+:10008000E0F50575E0012506F58275E0003507F518
+:1000900083E0F508E508C0E075E0022506F5827505
+:1000A000E0003507F583E0F508E508C0E075E003FA
+:1000B0002506F50675E0003507F507E502F582E54A
+:1000C00003F583E504F500E505F5012200E5067575
+:1000D0008203C39582F506E5077583009583F507CE
+:1000E000D0E0F50875E0022506F58275E0003507D9
+:1000F000F583E508F0D0E0F50875E0012506F58206
+:1001000075E0003507F583E508F075E0002506F594
+:100110008275E0003507F583E0F50275E0002506FD
+:10012000F58275E0003507F583E0F50375E00025FD
+:1001300006F58275E0003507F583E0F50475E0000B
+:100140002506F58275E0003507F583E0F50575E0D5
+:10015000012506F58275E0003507F583E0F508E531
+:1001600008C0E075E0022506F58275E0003507F568
+:1001700083E0F508E508C0E075E0032506F506759F
+:10018000E0003507F507E502F582E503F583E504B0
+:10019000F500E505F5012200E506758202C39582AA
+:1001A000F506E5077583009583F507D0E0F508753A
+:1001B000E0012506F58275E0003507F583E508F0D6
+:1001C000D0E0F50875E0002506F58275E0003507FA
+:1001D000F583E508F01200CC120001E582F502E596
+:1001E00083F503E500F504E501F505E502F500E515
+:1001F00003F501E504F509E505F50AE500F502E575
+:1002000001F503E509F504E50AF50575E0002506A5
+:10021000F58275E0003507F583E0F508E508C0E0F4
+:1002200075E0012506F58275E0003507F583E0F5F8
+:1002300008E508C0E075E0022506F50675E0003522
+:1002400007F507E502F582E503F583E504F500E52A
+:1002500005F5012200000000000000000000000081
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Winline -O2 --param large-function-growth=0 --param large-function-insns=1" } */
+
+void big (void);
+inline int q(void)
+{ /* { dg-warning "large-function-growth" } */
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+}
+inline int t (void)
+{
+ return q () + 1; /* { dg-warning "called from here" } */
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Winline -O2 --param large-function-growth=0 --param large-function-insns=1" } */
+
+void big (void);
+inline int q(void)
+{ /* { dg-warning "large-function-growth" } */
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+ big();
+}
+inline int t (void)
+{
+ return q () + 1; /* { dg-warning "called from here" } */
+}
--- /dev/null
+:100000000000E506758203C39582F506E507758352
+:10001000009583F507D0E0F50875E0022506F58226
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000012506F58275E0003507F583E508F075C2
+:10004000E0002506F58275E0003507F583E0F5024E
+:1000500075E0002506F58275E0003507F583E0F5CB
+:100060000375E0002506F58275E0003507F583E0AD
+:10007000F50475E0002506F58275E0003507F58387
+:10008000E0F50575E0012506F58275E0003507F518
+:1000900083E0F508E508C0E075E0022506F5827505
+:1000A000E0003507F583E0F508E508C0E075E003FA
+:1000B0002506F50675E0003507F507E502F582E54A
+:1000C00003F583E504F500E505F5012200E5067575
+:1000D0008202C39582F506E5077583009583F507CF
+:1000E000D0E0F50875E0012506F58275E0003507DA
+:1000F000F583E508F0D0E0F50875E0002506F58207
+:1001000075E0003507F583E508F0120001E582F59A
+:1001100002E583F503E500F504E501F505E502F5E3
+:100120000BE503F50CE504F50DE505F50E7500018D
+:10013000750100750900750A00C3750F00E500F52B
+:10014000F0E50B35F0F500E501F5F0E50C35F0F5DF
+:1001500001E509F5F0E50D35F0F509E50AF5F0E5FD
+:100160000E35F0F50AE500F502E501F503E509F5C0
+:1001700004E50AF50575E0002506F58275E0003511
+:1001800007F583E0F508E508C0E075E0012506F510
+:100190008275E0003507F583E0F508E508C0E075F5
+:1001A000E0022506F50675E0003507F507E502F5DE
+:1001B00082E503F583E504F500E505F5012200007D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Winline -O2" } */
+
+extern void *alloca (__SIZE_TYPE__);
+
+void big (void);
+inline void *q (void)
+{ /* { dg-warning "(function not inlinable|alloca)" } */
+ return alloca (10);
+}
+inline void *t (void)
+{
+ return q (); /* { dg-warning "called from here" } */
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Winline -O2" } */
+
+extern void *alloca (__SIZE_TYPE__);
+
+void big (void);
+inline void *q (void)
+{ /* { dg-warning "(function not inlinable|alloca)" } */
+ return alloca (10);
+}
+inline void *t (void)
+{
+ return q (); /* { dg-warning "called from here" } */
+}
--- /dev/null
+:100000000000E506758202C39582F506E507758353
+:10001000009583F507D0E0F50875E0012506F58227
+:1000200075E0003507F583E508F0D0E0F50875E0E8
+:10003000002506F58275E0003507F583E508F075C3
+:100040001F0A751E00751D00751C00E582F502E58E
+:1000500083F503E502F500E503F501750900E50008
+:10006000F502E501F503E509F504E509F50575E097
+:10007000002506F58275E0003507F583E0F508E513
+:1000800008C0E075E0012506F58275E0003507F54A
+:1000900083E0F508E508C0E075E0022506F5067581
+:1000A000E0003507F507E502F582E503F583E50491
+:1000B000F500E505F5012200E506758202C395828B
+:1000C000F506E5077583009583F507D0E0F508751B
+:1000D000E0012506F58275E0003507F583E508F0B7
+:1000E000D0E0F50875E0002506F58275E0003507DB
+:1000F000F583E508F0120001E582F502E583F503DA
+:10010000E502F500E503F501750900E500F502E5F6
+:1001100001F503E509F504E509F50575E000250697
+:10012000F58275E0003507F583E0F508E508C0E0E5
+:1001300075E0012506F58275E0003507F583E0F5E9
+:1001400008E508C0E075E0022506F50675E0003513
+:1001500007F507E502F582E503F583E504F500E51B
+:1001600005F5012200000000000000000000000072
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+/* Compile with -Wall to get a warning if built-in and system wint_t don't
+ match. */
+
+#define _STDDEF_H
+#include <wchar.h>
+
+__WINT_TYPE__ __wi_t__;
+wint_t *wi_t_p;
+
+void
+wit (void)
+{
+ wi_t_p = &__wi_t__;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+/* Compile with -Wall to get a warning if built-in and system wint_t don't
+ match. */
+
+#define _STDDEF_H
+#include <wchar.h>
+
+__WINT_TYPE__ __wi_t__;
+wint_t *wi_t_p;
+
+void
+wit (void)
+{
+ wi_t_p = &__wi_t__;
+}
--- /dev/null
+:1000000000D0E0F50ED0E0F50FE510F50D900004FE
+:10001000E582F50B900004E583F50C900000E58285
+:10002000F509900000E583F50A750100C37500002D
+:10003000E501F5F0E50B35F0F501E500F5F0E50C2F
+:1000400035F0F500E509F503E500F502E501F58277
+:10005000E502F583E503F0750101C3750000E501D4
+:10006000F5F0E50B35F0F501E500F5F0E50C35F0C0
+:10007000F500E50AF503E500F502E501F582E50284
+:10008000F583E503F0750000E500F502E500F503F2
+:10009000E500F504E500F505E50DF510E50FC0E018
+:1000A000E50EC0E0E502F582E503F583E504F50021
+:1000B000E505F5012200000000000000000000003E
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for -Wtraditional warnings on escape characters.
+ Note, gcc should omit these warnings in system header files.
+ By Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 8/22/2000. */
+/* { dg-do compile } */
+/* { dg-options "-Wtraditional" } */
+
+void
+testfunc ()
+{
+ char c;
+
+ c = '\a'; /* { dg-warning "the meaning of" "escaped character warning " } */
+ c = '\x2'; /* { dg-warning "the meaning of" "escaped character warning " } */
+ c = '\n';
+
+# 17 "sys-header.h" 3
+/* We are in system headers now, no -Wtraditional warnings should issue. */
+
+ c = '\a';
+ c = '\x2';
+ c = '\n';
+}
--- /dev/null
+/* Test for -Wtraditional warnings on escape characters.
+ Note, gcc should omit these warnings in system header files.
+ By Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 8/22/2000. */
+/* { dg-do compile } */
+/* { dg-options "-Wtraditional" } */
+
+void
+testfunc ()
+{
+ char c;
+
+ c = '\a'; /* { dg-warning "the meaning of" "escaped character warning " } */
+ c = '\x2'; /* { dg-warning "the meaning of" "escaped character warning " } */
+ c = '\n';
+
+# 17 "sys-header.h" 3
+/* We are in system headers now, no -Wtraditional warnings should issue. */
+
+ c = '\a';
+ c = '\x2';
+ c = '\n';
+}
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for -Wtraditional warnings on static/non-static mismatches.
+ Note, gcc should omit these warnings in system header files.
+ By Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 8/22/2000. */
+/* { dg-do compile } */
+/* { dg-options "-Wtraditional" } */
+
+static void testfunc1(void); /* { dg-warning "previous declaration" } */
+void testfunc1() {} /* { dg-warning "non-static.*follows static" "non-static follows static" } */
+
+# 11 "sys-header.h" 3
+/* We are in system headers now, no -Wtraditional warnings should issue. */
+
+static void testfunc2(void);
+void testfunc2() {}
--- /dev/null
+/* Test for -Wtraditional warnings on static/non-static mismatches.
+ Note, gcc should omit these warnings in system header files.
+ By Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 8/22/2000. */
+/* { dg-do compile } */
+/* { dg-options "-Wtraditional" } */
+
+static void testfunc1(void); /* { dg-warning "previous declaration" } */
+void testfunc1() {} /* { dg-warning "non-static.*follows static" "non-static follows static" } */
+
+# 11 "sys-header.h" 3
+/* We are in system headers now, no -Wtraditional warnings should issue. */
+
+static void testfunc2(void);
+void testfunc2() {}
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F5012200D0E0F500D0E0F5017509F5
+:1000400000E509F502E509F503E509F504E509F51B
+:1000500005E501C0E0E500C0E0E502F582E503F555
+:1000600083E504F500E505F501220000000000002D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for -Wtraditional warnings on switch operands of type long.
+ Note, gcc should omit these warnings in system header files.
+ By Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 8/22/2000. */
+/* { dg-do compile } */
+/* { dg-options "-Wtraditional" } */
+
+void
+testfunc (l)
+ long l;
+{
+ switch (l) /* { dg-warning "switch expression" "switch expression" } */
+ {
+ default:
+ break;
+ }
+
+# 17 "sys-header.h" 3
+/* We are in system headers now, no -Wtraditional warnings should issue. */
+
+ switch (l)
+ {
+ default:
+ break;
+ }
+}
--- /dev/null
+/* Test for -Wtraditional warnings on switch operands of type long.
+ Note, gcc should omit these warnings in system header files.
+ By Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 8/22/2000. */
+/* { dg-do compile } */
+/* { dg-options "-Wtraditional" } */
+
+void
+testfunc (l)
+ long l;
+{
+ switch (l) /* { dg-warning "switch expression" "switch expression" } */
+ {
+ default:
+ break;
+ }
+
+# 17 "sys-header.h" 3
+/* We are in system headers now, no -Wtraditional warnings should issue. */
+
+ switch (l)
+ {
+ default:
+ break;
+ }
+}
--- /dev/null
+:1000000000E506758204C39582F506E50775830051
+:100010009583F507D0E0F500D0E0F5010000000081
+:10002000750900E509F502E509F503E509F504E5BB
+:1000300009F505E501C0E0E500C0E075E00425062E
+:10004000F50675E0003507F507E502F582E503F5ED
+:1000500083E504F500E505F501220000000000003D
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for -Wtraditional warnings on the unary plus operator.
+ Note, gcc should omit these warnings in system header files.
+ By Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 8/22/2000. */
+/* { dg-do compile } */
+/* { dg-options "-Wtraditional" } */
+
+void
+testfunc ()
+{
+ int i;
+
+ i = +1; /* { dg-warning "unary plus operator" "unary plus operator" } */
+ i = +i; /* { dg-warning "unary plus operator" "unary plus operator" } */
+
+# 16 "sys-header.h" 3
+/* We are in system headers now, no -Wtraditional warnings should issue. */
+
+ i = +1;
+ i = +i;
+}
--- /dev/null
+/* Test for -Wtraditional warnings on the unary plus operator.
+ Note, gcc should omit these warnings in system header files.
+ By Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 8/22/2000. */
+/* { dg-do compile } */
+/* { dg-options "-Wtraditional" } */
+
+void
+testfunc ()
+{
+ int i;
+
+ i = +1; /* { dg-warning "unary plus operator" "unary plus operator" } */
+ i = +i; /* { dg-warning "unary plus operator" "unary plus operator" } */
+
+# 16 "sys-header.h" 3
+/* We are in system headers now, no -Wtraditional warnings should issue. */
+
+ i = +1;
+ i = +i;
+}
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+/* Test for -Wtraditional warnings on union initialization.
+ Note, gcc should omit these warnings in system header files.
+ By Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 8/22/2000. */
+/* { dg-do compile } */
+/* { dg-options "-Wtraditional" } */
+
+union foo
+{
+ int i;
+ long l;
+};
+
+void
+testfunc ()
+{
+ /* Note we only warn for nonzero initializers. */
+ static union foo f1 = { 0 };
+ static union foo f2 = { 1 }; /* { dg-warning "traditional C rejects initialization of unions" "initialization of unions" } */
+
+# 21 "sys-header.h" 3
+/* We are in system headers now, no -Wtraditional warnings should issue. */
+
+ static union foo f3 = { 0 };
+ static union foo f4 = { 1 };
+}
--- /dev/null
+/* Test for -Wtraditional warnings on union initialization.
+ Note, gcc should omit these warnings in system header files.
+ By Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 8/22/2000. */
+/* { dg-do compile } */
+/* { dg-options "-Wtraditional" } */
+
+union foo
+{
+ int i;
+ long l;
+};
+
+void
+testfunc ()
+{
+ /* Note we only warn for nonzero initializers. */
+ static union foo f1 = { 0 };
+ static union foo f2 = { 1 }; /* { dg-warning "traditional C rejects initialization of unions" "initialization of unions" } */
+
+# 21 "sys-header.h" 3
+/* We are in system headers now, no -Wtraditional warnings should issue. */
+
+ static union foo f3 = { 0 };
+ static union foo f4 = { 1 };
+}
--- /dev/null
+:1000000000D0E0F500D0E0F501750900E509F50242
+:10001000E509F503E509F504E509F505E501C0E0A5
+:10002000E500C0E0E502F582E503F583E504F500AF
+:10003000E505F501220000000000000000000000BE
+:00000001FF
\ No newline at end of file
--- /dev/null
+Pretty print not requested
\ No newline at end of file
--- /dev/null
+.PHONY: check
+
+SUBDIRS=GCCTestSuite
+
+check:
+ for i in $(SUBDIRS); do $(MAKE) -C $$i check; done
+
+clean:
+ for i in $(SUBDIRS); do $(MAKE) -C $$i clean; done
\ No newline at end of file
--- /dev/null
+.PHONY: clean all bench prepare
+
+SOURCES=$(wildcard *.c)
+BASENAMES=$(SOURCES:.c=)
+GCCEXES=$(SOURCES:.c=.gcc)
+GCCEXES=$(SOURCES:.c=.ogcc)
+ACCEXES=$(SOURCES:.c=.acc)
+EXES=$(GCCEXES) $(ACCEXES)
+RESULTS=$(SOURCES:.c=.result)
+
+GCC=gcc
+CFLAGS=-O0
+OFLAGS=-O2
+
+ACC=./acc.run
+TIME=./meantime.sh
+
+all: bench
+
+%.gcc: %.c
+ @ $(GCC) $(CPPFLAGS) $(CFLAGS) -o $@ $<
+
+%.ogcc: %.c
+ @ $(GCC) $(CPPFLAGS) $(OFLAGS) -o $@ $<
+
+%.s: %.c
+ @ $(ACC) $<
+
+%.acc: %.s
+ @ $(GCC) $(CPPFLAGS) $(CFLAGS) -o $@ $<
+
+%.acc-run: %.acc
+ @ $(TIME) -f %U ./$< > $@
+
+%.gcc-run: %.gcc
+ @ $(TIME) -f %U ./$< > $@
+
+%.ogcc-run: %.ogcc
+ @ $(TIME) -f %U ./$< > $@
+
+%.ratio1: %.acc-run %.gcc-run
+ @ echo "print round(`cat $*.acc-run` / `cat $*.gcc-run`, 2)" | python > $@
+
+%.ratio2: %.acc-run %.ogcc-run
+ @ echo "print round(`cat $*.acc-run` / `cat $*.ogcc-run`, 2)" | python > $@
+
+%.announce:
+ @ echo Benchmarking "$*.c"...
+ @ echo "$*.c" > $@
+
+%.result: %.announce %.acc-run %.gcc-run %.ogcc-run %.ratio1 %.ratio2
+ @ cat $^ | tr '\n' '&' > $@
+
+prepare:
+ rm --force *.announce
+
+bench: prepare $(RESULTS)
+ @ echo '& acc & gcc -O0 & gcc -O2 & 1/2 & 1/3 \\'
+ @ for i in $(BASENAMES); do cat $$i.result; echo '\\'; done
+
+clean:
+ rm --force $(EXES) $(RESULTS) \
+ *.gcc-run *.ogcc-run *.acc-run *.ratio* *.announce *.Clight *.ASM
\ No newline at end of file
--- /dev/null
+#!/usr/bin/env bash
+
+# On MIPS Debian, I had trouble loading cparser.so file...
+# FIXME: This should be investigated.
+LD_LIBRARY_PATH=../../lib:$LD_LIBRARY_PATH ../../acc -no-annotation $*
--- /dev/null
+
+/* function badsort: sorting algorithm of quadratic complexity
+ ran 10000000 times on 3 lists of size 100 */
+
+
+int tab1[] =
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
+ 98, 99};
+int tab2[] =
+ {99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81,
+ 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62,
+ 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43,
+ 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24,
+ 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3,
+ 2, 1, 0};
+
+int min (int tab[], int size, int n) {
+ int i, min_index, min;
+
+ if (size == 0) return 0;
+
+ min_index = n;
+ min = tab[min_index];
+ for (i = n+1 ; i < size ; i++) {
+ if (tab[i] < min) {
+ min_index = i;
+ min = tab[min_index];
+ }
+ }
+
+ return min_index;
+}
+
+void swap (int tab[], int i, int j) {
+ int t;
+ t = tab[i] ; tab[i] = tab[j] ; tab[j] = t;
+}
+
+void badsort(int tab[], int size) {
+ int i, min_index;
+
+ for (i = 0 ; i < size ; i++) {
+ min_index = min(tab, size, i);
+ swap(tab, i, min_index);
+ }
+}
+
+void copy (int dest[], int src[], int size) {
+ int i;
+
+ for (i = 0 ; i < size ; i++)
+ dest[i] = src[i];
+}
+
+void run (int tab[]) {
+ int size, tmp[100];
+
+ size = sizeof(tab) / sizeof(int);
+ copy(tmp, tab, size);
+ badsort(tmp, size);
+}
+
+int main () {
+ int i;
+ int tab3[] =
+ {-21, 19, -26, -62, -72, 33, -14, 20, 85, 92, -26, -33, 38, -14, -88, -35,
+ -51, 29, -84, -98, -92, -60, -52, 53, 53, -11, -99, 72, -55, 90, -83, 98,
+ 29, -25, -32, -33, -98, 14, -86, 99, 77, -38, -1, -7, -98, 57, 5, -64, 72,
+ 60, -5, -66, -7, -84, -97, 92, 2, 11, 70, -27, -56, -16, -81, 86, 27, 24,
+ 68, -54, -15, -45, 60, 25, -31, 67, 7, -14, -41, -67, 51, -27, -1, -98,
+ -97, -16, -41, 33, -8, -45, 48, -44, -1, 56, -70, 59, -60, 64, 5, 32, 86,
+ -72};
+
+ for (i = 0 ; i < 10000000 ; i++) {
+ run(tab1);
+ run(tab2);
+ run(tab3);
+ }
+
+ return 0;
+}
--- /dev/null
+
+/* Fibonacci function ran 100 times for values 10, 20 and 30 */
+
+
+int fib (int n) {
+ if (n < 2) return 1;
+ else return (fib (n-1) + fib (n-2));
+}
+
+int main () {
+ int i, res1, res2, res3;
+
+ for (i = 0 ; i < 100 ; i++) {
+ res1 = fib (10);
+ res2 = fib (20);
+ res3 = fib (30);
+ }
+
+ return 0;
+}
--- /dev/null
+
+/* function det: computes the determinant of a square matrice in exponential
+ complexity
+ ran 50 times on 3 matrices of dimension 3*3 */
+
+
+int mat1[9] = {-5, 2, -2, -10, 7, -1, 4, -8, 5};
+int mat2[9] = {7, -9, 4, 8, 8, 10, -8, 10, 1};
+
+void lmatrice (int mat[], int lmat[], int n, int l) {
+ int i, j, line = 0, m = n-1;
+
+ for (i = 0; i < n ; i++) {
+ if (i != l) {
+ for (j = 1 ; j < n ; j++)
+ lmat[line*m + j-1] = mat[i*n + j];
+ line++;
+ }
+ }
+}
+
+int det (int mat[], int n) {
+ int res = 0, signe = 1, i;
+ int lmat[100];
+
+ if (n == 0) return 0;
+ if (n == 1) return mat[0];
+
+ for (i = 0 ; i < n ; i++) {
+ lmatrice(mat, lmat, n, i);
+ /* The real computation has been disable to avoid overflow, but the
+ complexity is the same. */
+ res = det(lmat, n-1);
+ // res += signe * mat[i] * det(lmat, n-1);
+ // signe = -signe;
+ }
+
+ return res;
+}
+
+int main () {
+ int i, res1, res2, res3;
+ int size = 9;
+
+ int mat3[9] = {7, -9, 7, 6, -10, -10, -5, -4, 1};
+
+ for (i = 0 ; i < 50 ; i++) {
+ res1 = det(mat1, size);
+ res2 = det(mat2, size);
+ res3 = det(mat3, size);
+ }
+
+ return 0;
+}
--- /dev/null
+#!/usr/bin/env bash
+
+RUNS=2
+COUNT=$RUNS
+VAL=0.
+while [ $COUNT -gt 0 ]; do
+ R=`/usr/bin/time -f %U $* 2>&1 | tail -n1`
+ VAL=`echo "print $VAL + $R" | bc`
+ COUNT=$(($COUNT - 1))
+done
+echo "print $VAL / $RUNS" | python
--- /dev/null
+
+/* function min: minimum of a list in linear complexity
+ ran 100000000 times on 3 lists of size 100 */
+
+int tab1[100] =
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
+ 98, 99};
+int tab2[100] =
+ {99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81,
+ 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62,
+ 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43,
+ 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24,
+ 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3,
+ 2, 1, 0};
+
+int min (int tab[100]) {
+ int i, min;
+
+ min = tab[0];
+ for (i = 1 ; i < 100 ; i++) {
+ if (tab[i] < min) min = tab[i];
+ }
+
+ return min;
+}
+
+int main () {
+ int i, sum;
+ int tab3[100] =
+ {-21, 19, -26, -62, -72, 33, -14, 20, 85, 92, -26, -33, 38, -14, -88, -35,
+ -51, 29, -84, -98, -92, -60, -52, 53, 53, -11, -99, 72, -55, 90, -83, 98,
+ 29, -25, -32, -33, -98, 14, -86, 99, 77, -38, -1, -7, -98, 57, 5, -64, 72,
+ 60, -5, -66, -7, -84, -97, 92, 2, 11, 70, -27, -56, -16, -81, 86, 27, 24,
+ 68, -54, -15, -45, 60, 25, -31, 67, 7, -14, -41, -67, 51, -27, -1, -98,
+ -97, -16, -41, 33, -8, -45, 48, -44, -1, 56, -70, 59, -60, 64, 5, 32, 86,
+ -72};
+
+ sum = 0;
+ for (i = 0 ; i < 100000000 ; i++) {
+ sum += i & 1 == 0 ? min(tab1) : i & 2 == 0 ? min(tab2) : min(tab3);
+ }
+
+ return (sum);
+}
--- /dev/null
+
+/* function quicksort: sorting algorithm of n*log(n) complexity
+ ran 10000000 times on 3 lists of size 100 */
+
+
+int a1[] =
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
+ 98, 99};
+int a2[] =
+ {99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81,
+ 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62,
+ 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43,
+ 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24,
+ 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3,
+ 2, 1, 0};
+
+void swap (int a[], int i, int j) {
+ int t;
+ t = a[i] ; a[i] = a[j] ; a[j] = t;
+}
+
+int partition (int a[], int l, int r) {
+ int pivot, i, j;
+ pivot = a[l];
+ i = l; j = r+1;
+
+ while (1) {
+ do ++i; while (a[i] <= pivot && i <= r);
+ do --j; while (a[j] > pivot);
+ if (i >= j) break;
+ swap(a, i, j);
+ }
+ swap(a, l, j);
+ return j;
+}
+
+void quickSort (int a[], int l, int r) {
+ int j;
+
+ if (l < r) {
+ j = partition(a, l, r);
+ quickSort(a, l, j-1);
+ quickSort(a, j+1, r);
+ }
+}
+
+void copy (int dest[], int src[], int size) {
+ int i;
+
+ for (i = 0 ; i < size ; i++)
+ dest[i] = src[i];
+}
+
+void run (int a[]) {
+ int size, tab[100];
+
+ size = sizeof(a) / sizeof(int);
+ copy(tab, a, size);
+ quickSort(tab, 0, size-1);
+}
+
+int main () {
+ int i;
+ int a3[] =
+ {-21, 19, -26, -62, -72, 33, -14, 20, 85, 92, -26, -33, 38, -14, -88, -35,
+ -51, 29, -84, -98, -92, -60, -52, 53, 53, -11, -99, 72, -55, 90, -83, 98,
+ 29, -25, -32, -33, -98, 14, -86, 99, 77, -38, -1, -7, -98, 57, 5, -64, 72,
+ 60, -5, -66, -7, -84, -97, 92, 2, 11, 70, -27, -56, -16, -81, 86, 27, 24,
+ 68, -54, -15, -45, 60, 25, -31, 67, 7, -14, -41, -67, 51, -27, -1, -98,
+ -97, -16, -41, 33, -8, -45, 48, -44, -1, 56, -70, 59, -60, 64, 5, 32, 86,
+ -72};
+
+ for (i = 0 ; i < 10000000 ; i++) {
+ run(a1);
+ run(a2);
+ run(a3);
+ }
+
+ return 0;
+}
--- /dev/null
+
+/* function search: element searching in a sorted list in logarithmic complexity
+ ran 100000000 times on 3 lists of size 100 */
+#define N 100
+
+int tab1[] =
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+ 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
+ 98, 99};
+int tab2[] =
+ {99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81,
+ 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62,
+ 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43,
+ 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24,
+ 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3,
+ 2, 1, 0};
+
+int search (int tab[], int e) {
+ int i, size, left, right, previous, middle;
+
+ size = 100;
+
+ if (size == 0) return 0;
+
+ left = 0;
+ right = size;
+ middle = (left + right) / 2;
+ while ((middle != left) && (middle != right)) {
+ if (e == tab[middle]) return 1;
+ if (e > tab[middle]) left = middle;
+ else right = middle;
+ middle = (left + right) / 2;
+ }
+
+ return 0;
+}
+
+int main () {
+ int i, search1, search2, search3;
+ int tab3[] =
+ {-21, 19, -26, -62, -72, 33, -14, 20, 85, 92, -26, -33, 38, -14, -88, -35,
+ -51, 29, -84, -98, -92, -60, -52, 53, 53, -11, -99, 72, -55, 90, -83, 98,
+ 29, -25, -32, -33, -98, 14, -86, 99, 77, -38, -1, -7, -98, 57, 5, -64, 72,
+ 60, -5, -66, -7, -84, -97, 92, 2, 11, 70, -27, -56, -16, -81, 86, 27, 24,
+ 68, -54, -15, -45, 60, 25, -31, 67, 7, -14, -41, -67, 51, -27, -1, -98,
+ -97, -16, -41, 33, -8, -45, 48, -44, -1, 56, -70, 59, -60, 64, 5, 32, 86,
+ -72};
+
+ for (i = 0 ; i < 100000000 ; i++) {
+ search1 = search(tab1, 18);
+ search2 = search(tab2, -1);
+ search3 = search(tab3, 36);
+ }
+
+ return 0;
+}
--- /dev/null
+# -*- Makefile -*-
+.PHONY: prepare-check check clean prepare-expected expected all
+
+all: check
+
+-include ../../Makefile.local
+
+IN_EXT=c
+OUT_EXT=ASM
+OPTIONS=$(shell if test -f options; then cat options; else echo ""; fi)
+PROGRAM=../../$(TARGET) -d $(OPTIONS)
+
+# Compute the set of input files.
+INPUTS=$(shell find . -name "*.$(IN_EXT)")
+
+OUTPUTS=$(INPUTS:$(IN_EXT)=$(OUT_EXT))
+
+# We run the compiler in debugging mode on each input file.
+# This will produce an $(OUTEXT) file as well as a lot of
+# files that contain execution traces. We check that these
+# traces are the ones that are expected.
+%.$(OUT_EXT): %.$(IN_EXT) ../../$(TARGET)
+ @ echo ----------------------------------------\
+ --------------------------------------
+ @ echo -n Checking $* ...
+ @ (($(PROGRAM) -d $< 2> $*.log 1> $*.log && (echo OK | tee -a ok-counter)) \
+ || (echo "KO"; echo " ($*.log for details)" | tee -a ko-counter))
+ @ for i in `ls $** | grep -v expected | grep -v log`; do \
+ if [ ! -e $$i.expected ]; then \
+ echo No reference to compare to.; \
+ if [ x`cat generate` == x1 ]; then \
+ echo "Current output becomes expected behavior, as asked."; \
+ cp $$i $$i.expected; \
+ fi; \
+ elif diff -u $$i $$i.expected 2> /dev/null 1> /dev/null; then \
+ echo " [OK] $$i" | tee -a ok-counter; \
+ else \
+ echo " [KO] $$i" | tee -a ko-counter; \
+ fi; \
+ done
+
+prepare-check:
+ @ rm --force ok-counter ko-counter
+ @ touch ok-counter
+ @ touch ko-counter
+
+check: clean prepare-check $(OUTPUTS)
+ @ cat ok-counter ko-counter > total-counter
+ @ echo ----------------------------------------\
+ --------------------------------------
+ @ echo ----------------------------------------\
+ --------------------------------------
+ @ echo Total: \
+ `wc -l ok-counter | cut -f1 -d' '` \
+ /`wc -l total-counter | cut -f1 -d' '`
+ @ echo ----------------------------------------\
+ --------------------------------------
+
+prepare-expected:
+ @ GENERATE=1
+ @ export GENERATE
+ @ echo You asked for overwriting of the expected outputs.
+ @ echo -n "Are you sure? [Y/N] "
+ @ read R; if [ $$R == "Y" ]; then \
+ echo 1 > generate; \
+ else \
+ echo 0 > generate; \
+ fi
+
+expected: clean prepare-expected check
+
+clean:
+ rm --force *.ASM *.Clight *.Cminor *.RTLabs *.RTL *.ERTL *.LTL *.LIN *.log
\ No newline at end of file
--- /dev/null
+# extern __builtin_varargs_start: int -> void
+# extern __builtin_va_start: int -> int -> void
+# extern __builtin_va_end: int -> void
+# extern __builtin_va_copy: int -> int -> void
+# extern __builtin_va_arg: int -> int -> void
+# extern __builtin_types_compatible_p: int -> int -> int
+# extern __builtin_tanl: float -> float
+# extern __builtin_tanhl: float -> float
+# extern __builtin_tanhf: float -> float
+# extern __builtin_tanh: float -> float
+# extern __builtin_tanf: float -> float
+# extern __builtin_tan: float -> float
+# extern __builtin_strspn: int -> int -> int
+# extern __builtin_strpbrk: int -> int -> int
+# extern __builtin_strncpy: int -> int -> int -> int
+# extern __builtin_strncmp: int -> int -> int -> int
+# extern __builtin_strncat: int -> int -> int -> int
+# extern __builtin_strcspn: int -> int -> int
+# extern __builtin_strcpy: int -> int -> int
+# extern __builtin_strcmp: int -> int -> int
+# extern __builtin_strchr: int -> int -> int
+# extern __builtin_stpcpy: int -> int -> int
+# extern __builtin_stdarg_start: int -> void
+# extern __builtin_sqrtl: float -> float
+# extern __builtin_sqrtf: float -> float
+# extern __builtin_sqrt: float -> float
+# extern __builtin_sinl: float -> float
+# extern __builtin_sinhl: float -> float
+# extern __builtin_sinhf: float -> float
+# extern __builtin_sinh: float -> float
+# extern __builtin_sinf: float -> float
+# extern __builtin_sin: float -> float
+# extern __builtin_return_address: int -> int
+# extern __builtin_return: int -> void
+# extern __builtin_powil: float -> int -> float
+# extern __builtin_powif: float -> int -> float
+# extern __builtin_powi: float -> int -> float
+# extern __builtin_popcountll: int -> int
+# extern __builtin_popcountl: int -> int
+# extern __builtin_popcount: int -> int
+# extern __builtin_parityll: int -> int
+# extern __builtin_parityl: int -> int
+# extern __builtin_parity: int -> int
+# extern __builtin_object_size: int -> int -> int
+# extern __builtin_next_arg: int
+# extern __builtin_nansl: int -> float
+# extern __builtin_nansf: int -> float
+# extern __builtin_nans: int -> float
+# extern __builtin_nanl: int -> float
+# extern __builtin_nanf: int -> float
+# extern __builtin_nan: int -> float
+# extern __builtin_modfl: float -> int -> float
+# extern __builtin_modff: float -> int -> float
+# extern __builtin_mempcpy: int -> int -> int -> int
+# extern __builtin_memcpy: int -> int -> int -> int
+# extern __builtin_logl: float -> float
+# extern __builtin_logf: float -> float
+# extern __builtin_log10l: float -> float
+# extern __builtin_log10f: float -> float
+# extern __builtin_log10: float -> float
+# extern __builtin_log: float -> float
+# extern __builtin_ldexpl: float -> int -> float
+# extern __builtin_ldexpf: float -> int -> float
+# extern __builtin_ldexp: float -> int -> float
+# extern __builtin_infl: float
+# extern __builtin_inff: float
+# extern __builtin_inf: float
+# extern __builtin_huge_vall: float
+# extern __builtin_huge_valf: float
+# extern __builtin_huge_val: float
+# extern __builtin_frexpl: float -> int -> float
+# extern __builtin_frexpf: float -> int -> float
+# extern __builtin_frexp: float -> int -> float
+# extern __builtin_frame_address: int -> int
+# extern __builtin_fmodl: float -> float
+# extern __builtin_fmodf: float -> float
+# extern __builtin_fmod: float -> float
+# extern __builtin_floorl: float -> float
+# extern __builtin_floorf: float -> float
+# extern __builtin_floor: float -> float
+# extern __builtin_ffsll: int -> int
+# extern __builtin_ffsl: int -> int
+# extern __builtin_ffs: int -> int
+# extern __builtin_fabsl: float -> float
+# extern __builtin_fabsf: float -> float
+# extern __builtin_fabs: float -> float
+# extern __builtin_expl: float -> float
+# extern __builtin_expf: float -> float
+# extern __builtin_expect: int -> int -> int
+# extern __builtin_exp: float -> float
+# extern __builtin_ctzll: int -> int
+# extern __builtin_ctzl: int -> int
+# extern __builtin_ctz: int -> int
+# extern __builtin_cosl: float -> float
+# extern __builtin_coshl: float -> float
+# extern __builtin_coshf: float -> float
+# extern __builtin_cosh: float -> float
+# extern __builtin_cosf: float -> float
+# extern __builtin_cos: float -> float
+# extern __builtin_constant_p: int -> int
+# extern __builtin_clzll: int -> int
+# extern __builtin_clzl: int -> int
+# extern __builtin_clz: int -> int
+# extern __builtin_ceill: float -> float
+# extern __builtin_ceilf: float -> float
+# extern __builtin_ceil: float -> float
+# extern __builtin_atanl: float -> float
+# extern __builtin_atanf: float -> float
+# extern __builtin_atan2l: float -> float -> float
+# extern __builtin_atan2f: float -> float -> float
+# extern __builtin_atan2: float -> float -> float
+# extern __builtin_atan: float -> float
+# extern __builtin_asinl: float -> float
+# extern __builtin_asinf: float -> float
+# extern __builtin_asin: float -> float
+# extern __builtin_alloca: int -> int
+# extern __builtin_acosl: float -> float
+# extern __builtin_acosf: float -> float
+# extern __builtin_acos: float -> float
+# extern __builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+# extern __builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+# extern __builtin___vprintf_chk: int -> int -> int -> int
+# extern __builtin___vfprintf_chk: int -> int -> int -> int -> int
+# extern __builtin___strncpy_chk: int -> int -> int -> int -> int
+# extern __builtin___strncat_chk: int -> int -> int -> int -> int
+# extern __builtin___strcpy_chk: int -> int -> int -> int
+# extern __builtin___strcat_chk: int -> int -> int -> int
+# extern __builtin___stpcpy_chk: int -> int -> int -> int
+# extern __builtin___memset_chk: int -> int -> int -> int -> int
+# extern __builtin___mempcpy_chk: int -> int -> int -> int -> int
+# extern __builtin___memmove_chk: int -> int -> int -> int -> int
+# extern __builtin___memcpy_chk: int -> int -> int -> int -> int
+
+# begin preamble
+.data
+globals:
+.space 0
+nl:
+.asciiz "\n"
+.align 2
+.text
+main:
+la $gp, globals
+j main181
+print_int:
+li $v0, 1
+syscall
+jr $ra
+print_intln:
+li $v0, 1
+syscall
+la $a0, nl
+li $v0, 4
+syscall
+jr $ra
+scan_int:
+li $v0, 5
+syscall
+jr $ra
+alloc:
+li $v0, 9
+syscall
+jr $ra
+
+pow2:
+li $v0, 1
+sllv $v0, $v0, $a0
+jr $ra
+
+mod:
+beqz $a0, mod0
+beqz $a1, mod0
+li $t2, 0
+mod_t0:
+bgtz $a0, mod_a0_pos
+neg $t0, $a0
+addi $t2, $t2, 1
+j mod_t1
+mod_a0_pos:
+move $t0, $a0
+mod_t1:
+bgtz $a1, mod_a1_pos
+neg $t1, $a1
+addi $t2, $t2, 2
+j mod_main
+mod_a1_pos:
+move $t1, $a1
+mod_main:
+rem $v0, $t0, $t1
+beqz $t2, mod_exit
+addi $t2, -1
+beqz $t2, mod_case1
+addi $t2, -1
+beqz $t2, mod_case2
+neg $v0, $v0
+j mod_exit
+mod_case1:
+sub $v0, $a1, $v0
+j mod_exit
+mod_case2:
+add $v0, $a1, $v0
+j mod_exit
+mod0:
+li $v0, 0
+mod_exit:
+jr $ra
+
+toint:
+# $a0: size
+# $a1: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+jal pow2
+move $a0, $a1
+move $a1, $v0
+jal mod
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 8
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 16
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+sign_ext:
+# $a0: size
+# $a1: int to extend
+li $v0, 32
+sub $a0, $v0, $a0
+sllv $v0, $a1, $a0
+srav $v0, $v0, $a0
+jr $ra
+
+ofint:
+# $a0: signedness
+# $a1: size
+# $a2: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+beqz $a0, ofint_unsigned
+move $a0, $a1
+move $a1, $a2
+jal sign_ext
+j ofint_exit
+ofint_unsigned:
+move $v0, $a2
+ofint_exit:
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+# end preamble
+
+
+# begin array_param
+array_param79:
+c37:
+li $a3, 1
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a3, 0($v0)
+c36:
+li $a3, 1
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c35:
+c34:
+li $a1, 7
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c33:
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+lw $v0, 0($v0)
+c32:
+c31:
+jr $ra
+# end array_param
+
+
+# begin array_mixte
+array_mixte223:
+addi $sp, $sp, -40
+c30:
+li $t0, 0
+move $a3, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a3, $v0
+sw $t0, 0($v0)
+c29:
+move $t0, $sp
+li $a3, 1
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c28:
+move $t0, $sp
+li $a3, 2
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c27:
+move $t0, $sp
+li $a3, 3
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c26:
+move $t0, $sp
+li $a3, 4
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c25:
+move $t0, $sp
+li $a3, 5
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c24:
+move $t0, $sp
+li $a3, 6
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c23:
+move $t0, $sp
+li $a3, 7
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c22:
+move $t0, $sp
+li $a3, 8
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c21:
+move $t0, $sp
+li $a3, 9
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c20:
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+lw $a3, 0($v0)
+li $v0, 1
+add $t0, $a3, $v0
+move $a3, $sp
+li $v0, 4
+mulo $v0, $a1, $v0
+add $v0, $a3, $v0
+sw $t0, 0($v0)
+c19:
+move $a3, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a3, $v0
+lw $a3, 0($v0)
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+sw $a3, 0($v0)
+c18:
+li $a2, 1
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+lw $a2, 0($v0)
+li $v0, 4
+mulo $v0, $a1, $v0
+add $v0, $a0, $v0
+sw $a2, 0($v0)
+c17:
+li $v0, 4
+mulo $v0, $a1, $v0
+add $v0, $sp, $v0
+lw $v0, 0($v0)
+addi $sp, $sp, 40
+jr $ra
+# end array_mixte
+
+
+# begin array_local
+array_local234:
+addi $sp, $sp, -40
+c16:
+li $a1, 0
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c15:
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c14:
+move $a1, $sp
+li $a0, 2
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c13:
+move $a1, $sp
+li $a0, 3
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c12:
+move $a1, $sp
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c11:
+move $a1, $sp
+li $a0, 5
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c10:
+move $a1, $sp
+li $a0, 6
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c9:
+move $a1, $sp
+li $a0, 7
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c8:
+move $a1, $sp
+li $a0, 8
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c7:
+move $a1, $sp
+li $a0, 9
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c6:
+li $a1, 1
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c5:
+li $a2, 5
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c4:
+c3:
+li $a2, 7
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c2:
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $sp, $v0
+lw $v0, 0($v0)
+c1:
+c0:
+addi $sp, $sp, 40
+jr $ra
+# end array_local
+
+
+# begin _main
+main181:
+addi $sp, $sp, -52
+sw $ra, 48($sp)
+sw $s1, 44($sp)
+sw $s0, 40($sp)
+c51:
+li $a1, 1
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c50:
+li $a2, 2
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c49:
+li $a2, 3
+move $a1, $sp
+li $a0, 2
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c48:
+li $a2, 4
+move $a1, $sp
+li $a0, 3
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c47:
+li $a2, 5
+move $a1, $sp
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c46:
+li $a2, 6
+move $a1, $sp
+li $a0, 5
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c45:
+li $a2, 7
+move $a1, $sp
+li $a0, 6
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c44:
+li $a2, 8
+move $a1, $sp
+li $a0, 7
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c43:
+li $a2, 9
+move $a1, $sp
+li $a0, 8
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c42:
+move $a1, $sp
+li $a0, 9
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c41:
+la $v0, array_local234
+jalr $v0
+move $s0, $v0
+c40:
+move $a0, $sp
+li $a1, 2
+li $a2, 3
+la $v0, array_mixte223
+jalr $v0
+move $s1, $v0
+c39:
+move $a0, $sp
+li $a1, 2
+li $a2, 3
+la $v0, array_param79
+jalr $v0
+c38:
+add $a0, $s0, $s1
+add $v0, $a0, $v0
+lw $ra, 48($sp)
+lw $s1, 44($sp)
+lw $s0, 40($sp)
+addi $sp, $sp, 52
+jr $ra
+# end _main
--- /dev/null
+extern void *__builtin___memcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memmove_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___mempcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memset_chk(void *, int, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___stpcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcat_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strncat_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___strncpy_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern int __builtin___vfprintf_chk(void *, int, unsigned char *, void *);
+
+extern int __builtin___vprintf_chk(int, unsigned char *, void *);
+
+extern int __builtin___vsnprintf_chk(unsigned char *, unsigned int, int, unsigned int, unsigned char *, void *);
+
+extern int __builtin___vsprintf_chk(unsigned char *, int, unsigned int, unsigned char *, void *);
+
+extern double __builtin_acos(double);
+
+extern float __builtin_acosf(float);
+
+extern double __builtin_acosl(double);
+
+extern void *__builtin_alloca(unsigned int);
+
+extern double __builtin_asin(double);
+
+extern float __builtin_asinf(float);
+
+extern double __builtin_asinl(double);
+
+extern double __builtin_atan(double);
+
+extern float __builtin_atanf(float);
+
+extern double __builtin_atanl(double);
+
+extern double __builtin_atan2(double, double);
+
+extern float __builtin_atan2f(float, float);
+
+extern double __builtin_atan2l(double, double);
+
+extern double __builtin_ceil(double);
+
+extern float __builtin_ceilf(float);
+
+extern double __builtin_ceill(double);
+
+extern double __builtin_cos(double);
+
+extern float __builtin_cosf(float);
+
+extern double __builtin_cosl(double);
+
+extern double __builtin_cosh(double);
+
+extern float __builtin_coshf(float);
+
+extern double __builtin_coshl(double);
+
+extern int __builtin_clz(unsigned int);
+
+extern int __builtin_clzl(unsigned int);
+
+extern int __builtin_clzll(unsigned int);
+
+extern int __builtin_constant_p(int);
+
+extern int __builtin_ctz(unsigned int);
+
+extern int __builtin_ctzl(unsigned int);
+
+extern int __builtin_ctzll(unsigned int);
+
+extern double __builtin_exp(double);
+
+extern float __builtin_expf(float);
+
+extern double __builtin_expl(double);
+
+extern int __builtin_expect(int, int);
+
+extern double __builtin_fabs(double);
+
+extern float __builtin_fabsf(float);
+
+extern double __builtin_fabsl(double);
+
+extern int __builtin_ffs(unsigned int);
+
+extern int __builtin_ffsl(unsigned int);
+
+extern int __builtin_ffsll(unsigned int);
+
+extern void *__builtin_frame_address(unsigned int);
+
+extern double __builtin_floor(double);
+
+extern float __builtin_floorf(float);
+
+extern double __builtin_floorl(double);
+
+extern double __builtin_huge_val(void);
+
+extern float __builtin_huge_valf(void);
+
+extern double __builtin_huge_vall(void);
+
+extern double __builtin_inf(void);
+
+extern float __builtin_inff(void);
+
+extern double __builtin_infl(void);
+
+extern void *__builtin_memcpy(void *, void *, unsigned int);
+
+extern void *__builtin_mempcpy(void *, void *, unsigned int);
+
+extern double __builtin_fmod(double);
+
+extern float __builtin_fmodf(float);
+
+extern double __builtin_fmodl(double);
+
+extern double __builtin_frexp(double, int *);
+
+extern float __builtin_frexpf(float, int *);
+
+extern double __builtin_frexpl(double, int *);
+
+extern double __builtin_ldexp(double, int);
+
+extern float __builtin_ldexpf(float, int);
+
+extern double __builtin_ldexpl(double, int);
+
+extern double __builtin_log(double);
+
+extern float __builtin_logf(float);
+
+extern double __builtin_logl(double);
+
+extern double __builtin_log10(double);
+
+extern float __builtin_log10f(float);
+
+extern double __builtin_log10l(double);
+
+extern float __builtin_modff(float, float *);
+
+extern double __builtin_modfl(double, double *);
+
+extern double __builtin_nan(unsigned char *);
+
+extern float __builtin_nanf(unsigned char *);
+
+extern double __builtin_nanl(unsigned char *);
+
+extern double __builtin_nans(unsigned char *);
+
+extern float __builtin_nansf(unsigned char *);
+
+extern double __builtin_nansl(unsigned char *);
+
+extern void *__builtin_next_arg(void);
+
+extern unsigned int __builtin_object_size(void *, int);
+
+extern int __builtin_parity(unsigned int);
+
+extern int __builtin_parityl(unsigned int);
+
+extern int __builtin_parityll(unsigned int);
+
+extern int __builtin_popcount(unsigned int);
+
+extern int __builtin_popcountl(unsigned int);
+
+extern int __builtin_popcountll(unsigned int);
+
+extern double __builtin_powi(double, int);
+
+extern float __builtin_powif(float, int);
+
+extern double __builtin_powil(double, int);
+
+extern void __builtin_return(void *);
+
+extern void *__builtin_return_address(unsigned int);
+
+extern double __builtin_sin(double);
+
+extern float __builtin_sinf(float);
+
+extern double __builtin_sinl(double);
+
+extern double __builtin_sinh(double);
+
+extern float __builtin_sinhf(float);
+
+extern double __builtin_sinhl(double);
+
+extern double __builtin_sqrt(double);
+
+extern float __builtin_sqrtf(float);
+
+extern double __builtin_sqrtl(double);
+
+extern unsigned char *__builtin_stpcpy(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strchr(unsigned char *, unsigned char);
+
+extern int __builtin_strcmp(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strcpy(unsigned char *, unsigned char *);
+
+extern unsigned int __builtin_strcspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strncat(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strncmp(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin_strncpy(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strpbrk(unsigned char *, unsigned char *);
+
+extern int __builtin_types_compatible_p(unsigned int, unsigned int);
+
+extern double __builtin_tan(double);
+
+extern float __builtin_tanf(float);
+
+extern double __builtin_tanl(double);
+
+extern double __builtin_tanh(double);
+
+extern float __builtin_tanhf(float);
+
+extern double __builtin_tanhl(double);
+
+extern void __builtin_va_end(void *);
+
+extern void __builtin_varargs_start(void *);
+
+extern void __builtin_va_start(void *, void *);
+
+extern void __builtin_stdarg_start(void *);
+
+extern void __builtin_va_arg(void *, unsigned int);
+
+extern void __builtin_va_copy(void *, void *);
+
+int array_local(void)
+{
+ int i;
+ int j;
+ int a;
+ int b;
+ int tab[10];
+ c16:
+ tab[0] = 0;
+ c15:
+ tab[1] = 0;
+ c14:
+ tab[2] = 0;
+ c13:
+ tab[3] = 0;
+ c12:
+ tab[4] = 0;
+ c11:
+ tab[5] = 0;
+ c10:
+ tab[6] = 0;
+ c9:
+ tab[7] = 0;
+ c8:
+ tab[8] = 0;
+ c7:
+ tab[9] = 0;
+ c6:
+ tab[0] = 1;
+ c5:
+ tab[1] = 5;
+ c4:
+ a = tab[0];
+ c3:
+ tab[1] = 7;
+ c2:
+ a = tab[1];
+ c1:
+ b = tab[0];
+ c0:
+ return a;
+}
+
+int array_mixte(int *tab1, int a, int b)
+{
+ int tab2[10];
+ c30:
+ tab2[0] = 0;
+ c29:
+ tab2[1] = 0;
+ c28:
+ tab2[2] = 0;
+ c27:
+ tab2[3] = 0;
+ c26:
+ tab2[4] = 0;
+ c25:
+ tab2[5] = 0;
+ c24:
+ tab2[6] = 0;
+ c23:
+ tab2[7] = 0;
+ c22:
+ tab2[8] = 0;
+ c21:
+ tab2[9] = 0;
+ c20:
+ tab2[a] = tab1[b] + 1;
+ c19:
+ tab1[b] = tab2[0];
+ c18:
+ tab1[a] = tab1[1];
+ c17:
+ return tab2[a];
+}
+
+int array_param(int *tab, int c, int d)
+{
+ int i;
+ int j;
+ int a;
+ int b;
+ c37:
+ tab[0] = 1;
+ c36:
+ tab[1] = c;
+ c35:
+ a = tab[0];
+ c34:
+ tab[d] = 7;
+ c33:
+ a = tab[d];
+ c32:
+ b = tab[0];
+ c31:
+ return a;
+}
+
+int main(void)
+{
+ int t[10];
+ int a;
+ int b;
+ int c;
+ c51:
+ t[0] = 1;
+ c50:
+ t[1] = 2;
+ c49:
+ t[2] = 3;
+ c48:
+ t[3] = 4;
+ c47:
+ t[4] = 5;
+ c46:
+ t[5] = 6;
+ c45:
+ t[6] = 7;
+ c44:
+ t[7] = 8;
+ c43:
+ t[8] = 9;
+ c42:
+ t[9] = 0;
+ c41:
+ a = array_local();
+ c40:
+ b = array_mixte(t, 2, 3);
+ c39:
+ c = array_param(t, 2, 3);
+ c38:
+ return (a + b) + c;
+}
+
+
--- /dev/null
+
+
+
+extern "__builtin___memcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memmove_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___mempcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memset_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___stpcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcat_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strncat_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___strncpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vfprintf_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vprintf_chk" : int -> int -> int -> int
+
+
+extern "__builtin___vsnprintf_chk" : int -> int -> int -> int -> int -> int -> int
+
+
+extern "__builtin___vsprintf_chk" : int -> int -> int -> int -> int -> int
+
+
+extern "__builtin_acos" : float -> float
+
+
+extern "__builtin_acosf" : float -> float
+
+
+extern "__builtin_acosl" : float -> float
+
+
+extern "__builtin_alloca" : int -> int
+
+
+extern "__builtin_asin" : float -> float
+
+
+extern "__builtin_asinf" : float -> float
+
+
+extern "__builtin_asinl" : float -> float
+
+
+extern "__builtin_atan" : float -> float
+
+
+extern "__builtin_atanf" : float -> float
+
+
+extern "__builtin_atanl" : float -> float
+
+
+extern "__builtin_atan2" : float -> float -> float
+
+
+extern "__builtin_atan2f" : float -> float -> float
+
+
+extern "__builtin_atan2l" : float -> float -> float
+
+
+extern "__builtin_ceil" : float -> float
+
+
+extern "__builtin_ceilf" : float -> float
+
+
+extern "__builtin_ceill" : float -> float
+
+
+extern "__builtin_cos" : float -> float
+
+
+extern "__builtin_cosf" : float -> float
+
+
+extern "__builtin_cosl" : float -> float
+
+
+extern "__builtin_cosh" : float -> float
+
+
+extern "__builtin_coshf" : float -> float
+
+
+extern "__builtin_coshl" : float -> float
+
+
+extern "__builtin_clz" : int -> int
+
+
+extern "__builtin_clzl" : int -> int
+
+
+extern "__builtin_clzll" : int -> int
+
+
+extern "__builtin_constant_p" : int -> int
+
+
+extern "__builtin_ctz" : int -> int
+
+
+extern "__builtin_ctzl" : int -> int
+
+
+extern "__builtin_ctzll" : int -> int
+
+
+extern "__builtin_exp" : float -> float
+
+
+extern "__builtin_expf" : float -> float
+
+
+extern "__builtin_expl" : float -> float
+
+
+extern "__builtin_expect" : int -> int -> int
+
+
+extern "__builtin_fabs" : float -> float
+
+
+extern "__builtin_fabsf" : float -> float
+
+
+extern "__builtin_fabsl" : float -> float
+
+
+extern "__builtin_ffs" : int -> int
+
+
+extern "__builtin_ffsl" : int -> int
+
+
+extern "__builtin_ffsll" : int -> int
+
+
+extern "__builtin_frame_address" : int -> int
+
+
+extern "__builtin_floor" : float -> float
+
+
+extern "__builtin_floorf" : float -> float
+
+
+extern "__builtin_floorl" : float -> float
+
+
+extern "__builtin_huge_val" : float
+
+
+extern "__builtin_huge_valf" : float
+
+
+extern "__builtin_huge_vall" : float
+
+
+extern "__builtin_inf" : float
+
+
+extern "__builtin_inff" : float
+
+
+extern "__builtin_infl" : float
+
+
+extern "__builtin_memcpy" : int -> int -> int -> int
+
+
+extern "__builtin_mempcpy" : int -> int -> int -> int
+
+
+extern "__builtin_fmod" : float -> float
+
+
+extern "__builtin_fmodf" : float -> float
+
+
+extern "__builtin_fmodl" : float -> float
+
+
+extern "__builtin_frexp" : float -> int -> float
+
+
+extern "__builtin_frexpf" : float -> int -> float
+
+
+extern "__builtin_frexpl" : float -> int -> float
+
+
+extern "__builtin_ldexp" : float -> int -> float
+
+
+extern "__builtin_ldexpf" : float -> int -> float
+
+
+extern "__builtin_ldexpl" : float -> int -> float
+
+
+extern "__builtin_log" : float -> float
+
+
+extern "__builtin_logf" : float -> float
+
+
+extern "__builtin_logl" : float -> float
+
+
+extern "__builtin_log10" : float -> float
+
+
+extern "__builtin_log10f" : float -> float
+
+
+extern "__builtin_log10l" : float -> float
+
+
+extern "__builtin_modff" : float -> int -> float
+
+
+extern "__builtin_modfl" : float -> int -> float
+
+
+extern "__builtin_nan" : int -> float
+
+
+extern "__builtin_nanf" : int -> float
+
+
+extern "__builtin_nanl" : int -> float
+
+
+extern "__builtin_nans" : int -> float
+
+
+extern "__builtin_nansf" : int -> float
+
+
+extern "__builtin_nansl" : int -> float
+
+
+extern "__builtin_next_arg" : int
+
+
+extern "__builtin_object_size" : int -> int -> int
+
+
+extern "__builtin_parity" : int -> int
+
+
+extern "__builtin_parityl" : int -> int
+
+
+extern "__builtin_parityll" : int -> int
+
+
+extern "__builtin_popcount" : int -> int
+
+
+extern "__builtin_popcountl" : int -> int
+
+
+extern "__builtin_popcountll" : int -> int
+
+
+extern "__builtin_powi" : float -> int -> float
+
+
+extern "__builtin_powif" : float -> int -> float
+
+
+extern "__builtin_powil" : float -> int -> float
+
+
+extern "__builtin_return" : int -> void
+
+
+extern "__builtin_return_address" : int -> int
+
+
+extern "__builtin_sin" : float -> float
+
+
+extern "__builtin_sinf" : float -> float
+
+
+extern "__builtin_sinl" : float -> float
+
+
+extern "__builtin_sinh" : float -> float
+
+
+extern "__builtin_sinhf" : float -> float
+
+
+extern "__builtin_sinhl" : float -> float
+
+
+extern "__builtin_sqrt" : float -> float
+
+
+extern "__builtin_sqrtf" : float -> float
+
+
+extern "__builtin_sqrtl" : float -> float
+
+
+extern "__builtin_stpcpy" : int -> int -> int
+
+
+extern "__builtin_strchr" : int -> int -> int
+
+
+extern "__builtin_strcmp" : int -> int -> int
+
+
+extern "__builtin_strcpy" : int -> int -> int
+
+
+extern "__builtin_strcspn" : int -> int -> int
+
+
+extern "__builtin_strncat" : int -> int -> int -> int
+
+
+extern "__builtin_strncmp" : int -> int -> int -> int
+
+
+extern "__builtin_strncpy" : int -> int -> int -> int
+
+
+extern "__builtin_strspn" : int -> int -> int
+
+
+extern "__builtin_strpbrk" : int -> int -> int
+
+
+extern "__builtin_types_compatible_p" : int -> int -> int
+
+
+extern "__builtin_tan" : float -> float
+
+
+extern "__builtin_tanf" : float -> float
+
+
+extern "__builtin_tanl" : float -> float
+
+
+extern "__builtin_tanh" : float -> float
+
+
+extern "__builtin_tanhf" : float -> float
+
+
+extern "__builtin_tanhl" : float -> float
+
+
+extern "__builtin_va_end" : int -> void
+
+
+extern "__builtin_varargs_start" : int -> void
+
+
+extern "__builtin_va_start" : int -> int -> void
+
+
+extern "__builtin_stdarg_start" : int -> void
+
+
+extern "__builtin_va_arg" : int -> int -> void
+
+
+extern "__builtin_va_copy" : int -> int -> void
+
+
+"array_local" () : int {
+
+ stack 40;
+
+ var j, i, b, a;
+
+ c16:
+ int32[&0 + (0 * 4)] = 0;
+ c15:
+ int32[&0 + (1 * 4)] = 0;
+ c14:
+ int32[&0 + (2 * 4)] = 0;
+ c13:
+ int32[&0 + (3 * 4)] = 0;
+ c12:
+ int32[&0 + (4 * 4)] = 0;
+ c11:
+ int32[&0 + (5 * 4)] = 0;
+ c10:
+ int32[&0 + (6 * 4)] = 0;
+ c9:
+ int32[&0 + (7 * 4)] = 0;
+ c8:
+ int32[&0 + (8 * 4)] = 0;
+ c7:
+ int32[&0 + (9 * 4)] = 0;
+ c6:
+ int32[&0 + (0 * 4)] = 1;
+ c5:
+ int32[&0 + (1 * 4)] = 5;
+ c4:
+ a = int32[&0 + (0 * 4)];
+ c3:
+ int32[&0 + (1 * 4)] = 7;
+ c2:
+ a = int32[&0 + (1 * 4)];
+ c1:
+ b = int32[&0 + (0 * 4)];
+ c0:
+ return a;
+
+}
+
+
+"array_mixte" (tab1, a, b) : int -> int -> int -> int {
+
+ stack 40;
+
+ c30:
+ int32[&0 + (0 * 4)] = 0;
+ c29:
+ int32[&0 + (1 * 4)] = 0;
+ c28:
+ int32[&0 + (2 * 4)] = 0;
+ c27:
+ int32[&0 + (3 * 4)] = 0;
+ c26:
+ int32[&0 + (4 * 4)] = 0;
+ c25:
+ int32[&0 + (5 * 4)] = 0;
+ c24:
+ int32[&0 + (6 * 4)] = 0;
+ c23:
+ int32[&0 + (7 * 4)] = 0;
+ c22:
+ int32[&0 + (8 * 4)] = 0;
+ c21:
+ int32[&0 + (9 * 4)] = 0;
+ c20:
+ int32[&0 + (a * 4)] = int32[tab1 + (b * 4)] + 1;
+ c19:
+ int32[tab1 + (b * 4)] = int32[&0 + (0 * 4)];
+ c18:
+ int32[tab1 + (a * 4)] = int32[tab1 + (1 * 4)];
+ c17:
+ return int32[&0 + (a * 4)];
+
+}
+
+
+"array_param" (tab, c, d) : int -> int -> int -> int {
+
+ stack 0;
+
+ var j, i, b, a;
+
+ c37:
+ int32[tab + (0 * 4)] = 1;
+ c36:
+ int32[tab + (1 * 4)] = c;
+ c35:
+ a = int32[tab + (0 * 4)];
+ c34:
+ int32[tab + (d * 4)] = 7;
+ c33:
+ a = int32[tab + (d * 4)];
+ c32:
+ b = int32[tab + (0 * 4)];
+ c31:
+ return a;
+
+}
+
+
+"main" () : int {
+
+ stack 40;
+
+ var c, b, a;
+
+ c51:
+ int32[&0 + (0 * 4)] = 1;
+ c50:
+ int32[&0 + (1 * 4)] = 2;
+ c49:
+ int32[&0 + (2 * 4)] = 3;
+ c48:
+ int32[&0 + (3 * 4)] = 4;
+ c47:
+ int32[&0 + (4 * 4)] = 5;
+ c46:
+ int32[&0 + (5 * 4)] = 6;
+ c45:
+ int32[&0 + (6 * 4)] = 7;
+ c44:
+ int32[&0 + (7 * 4)] = 8;
+ c43:
+ int32[&0 + (8 * 4)] = 9;
+ c42:
+ int32[&0 + (9 * 4)] = 0;
+ c41:
+ a = "array_local"() : int;
+ c40:
+ b = "array_mixte"(&0, 2, 3) : int -> int -> int -> int;
+ c39:
+ c = "array_param"(&0, 2, 3) : int -> int -> int -> int;
+ c38:
+ return (a + b) + c;
+
+}
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure array_param(3)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40
+entry array_param79
+array_param79: newframe --> array_param78
+array_param78: move %40, $ra --> array_param77
+array_param77: move %39, $s7 --> array_param76
+array_param76: move %38, $s6 --> array_param75
+array_param75: move %37, $s5 --> array_param74
+array_param74: move %36, $s4 --> array_param73
+array_param73: move %35, $s3 --> array_param72
+array_param72: move %34, $s2 --> array_param71
+array_param71: move %33, $s1 --> array_param70
+array_param70: move %32, $s0 --> array_param69
+array_param69: move %0, $a0 --> array_param68
+array_param68: move %1, $a1 --> array_param67
+array_param67: move %2, $a2 --> array_param66
+array_param66: li %3, 0 --> array_param65
+array_param65: li %4, 0 --> array_param64
+array_param64: li %5, 0 --> array_param63
+array_param63: li %6, 0 --> array_param62
+array_param62: li %8, 0 --> array_param61
+array_param61: li %9, 0 --> array_param60
+array_param60: li %10, 0 --> array_param59
+array_param59: li %11, 0 --> array_param58
+array_param58: li %12, 0 --> array_param57
+array_param57: li %13, 0 --> array_param56
+array_param56: li %14, 0 --> array_param55
+array_param55: li %15, 0 --> array_param54
+array_param54: li %16, 0 --> array_param53
+array_param53: li %17, 0 --> array_param52
+array_param52: li %18, 0 --> array_param51
+array_param51: li %19, 0 --> array_param50
+array_param50: li %20, 0 --> array_param49
+array_param49: li %21, 0 --> array_param48
+array_param48: li %22, 0 --> array_param47
+array_param47: li %23, 0 --> array_param46
+array_param46: li %24, 0 --> array_param45
+array_param45: li %25, 0 --> array_param44
+array_param44: li %26, 0 --> array_param43
+array_param43: li %27, 0 --> array_param42
+array_param42: li %28, 0 --> array_param41
+array_param41: li %29, 0 --> array_param40
+array_param40: li %30, 0 --> array_param39
+array_param39: li %31, 0 --> array_param32
+array_param32: emit c37 --> array_param31
+array_param31: li %22, 1 --> array_param30
+array_param30: li %24, 0 --> array_param29
+array_param29: li %25, 4 --> array_param28
+array_param28: mulo %23, %24, %25 --> array_param27
+array_param27: add %29, %0, %23 --> array_param36
+array_param36: sw %22, 0(%29) --> array_param26
+array_param26: emit c36 --> array_param25
+array_param25: li %20, 1 --> array_param24
+array_param24: li %21, 4 --> array_param23
+array_param23: mulo %19, %20, %21 --> array_param22
+array_param22: add %28, %0, %19 --> array_param35
+array_param35: sw %1, 0(%28) --> array_param21
+array_param21: emit c35 --> array_param20
+array_param20: li %17, 0 --> array_param19
+array_param19: li %18, 4 --> array_param18
+array_param18: mulo %16, %17, %18 --> array_param17
+array_param17: add %27, %0, %16 --> array_param34
+array_param34: lw %6, 0(%27) --> array_param16
+array_param16: emit c34 --> array_param15
+array_param15: li %13, 7 --> array_param14
+array_param14: li %15, 4 --> array_param13
+array_param13: mulo %14, %2, %15 --> array_param12
+array_param12: add %26, %0, %14 --> array_param33
+array_param33: sw %13, 0(%26) --> array_param11
+array_param11: emit c33 --> array_param10
+array_param10: li %12, 4 --> array_param9
+array_param9 : mulo %11, %2, %12 --> array_param8
+array_param8 : add %31, %0, %11 --> array_param38
+array_param38: lw %6, 0(%31) --> array_param7
+array_param7 : emit c32 --> array_param6
+array_param6 : li %9, 0 --> array_param5
+array_param5 : li %10, 4 --> array_param4
+array_param4 : mulo %8, %9, %10 --> array_param3
+array_param3 : add %30, %0, %8 --> array_param37
+array_param37: lw %5, 0(%30) --> array_param2
+array_param2 : emit c31 --> array_param1
+array_param1 : move %7, %6 --> array_param0
+array_param0 : j --> array_param91
+array_param91: move $v0, %7 --> array_param90
+array_param90: move $ra, %40 --> array_param89
+array_param89: move $s7, %39 --> array_param88
+array_param88: move $s6, %38 --> array_param87
+array_param87: move $s5, %37 --> array_param86
+array_param86: move $s4, %36 --> array_param85
+array_param85: move $s3, %35 --> array_param84
+array_param84: move $s2, %34 --> array_param83
+array_param83: move $s1, %33 --> array_param82
+array_param82: move $s0, %32 --> array_param81
+array_param81: delframe --> array_param80
+array_param80: jr $ra (xmits $v0)
+
+procedure array_mixte(3)
+stacksize 40
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78, %79, %80, %81, %82, %83,
+ %84, %85, %86, %87, %88, %89, %90,
+ %91, %92, %93, %94, %95, %96, %97,
+ %98, %99, %100, %101, %102, %103
+entry array_mixte223
+array_mixte223: newframe --> array_mixte222
+array_mixte222: move %103, $ra --> array_mixte221
+array_mixte221: move %102, $s7 --> array_mixte220
+array_mixte220: move %101, $s6 --> array_mixte219
+array_mixte219: move %100, $s5 --> array_mixte218
+array_mixte218: move %99, $s4 --> array_mixte217
+array_mixte217: move %98, $s3 --> array_mixte216
+array_mixte216: move %97, $s2 --> array_mixte215
+array_mixte215: move %96, $s1 --> array_mixte214
+array_mixte214: move %95, $s0 --> array_mixte213
+array_mixte213: move %0, $a0 --> array_mixte212
+array_mixte212: move %1, $a1 --> array_mixte211
+array_mixte211: move %2, $a2 --> array_mixte210
+array_mixte210: li %4, 0 --> array_mixte209
+array_mixte209: li %5, 0 --> array_mixte208
+array_mixte208: li %6, 0 --> array_mixte207
+array_mixte207: li %7, 0 --> array_mixte206
+array_mixte206: li %8, 0 --> array_mixte205
+array_mixte205: li %9, 0 --> array_mixte204
+array_mixte204: li %10, 0 --> array_mixte203
+array_mixte203: li %11, 0 --> array_mixte202
+array_mixte202: li %12, 0 --> array_mixte201
+array_mixte201: li %13, 0 --> array_mixte200
+array_mixte200: li %14, 0 --> array_mixte199
+array_mixte199: li %15, 0 --> array_mixte198
+array_mixte198: li %16, 0 --> array_mixte197
+array_mixte197: li %17, 0 --> array_mixte196
+array_mixte196: li %18, 0 --> array_mixte195
+array_mixte195: li %19, 0 --> array_mixte194
+array_mixte194: li %20, 0 --> array_mixte193
+array_mixte193: li %21, 0 --> array_mixte192
+array_mixte192: li %22, 0 --> array_mixte191
+array_mixte191: li %23, 0 --> array_mixte190
+array_mixte190: li %24, 0 --> array_mixte189
+array_mixte189: li %25, 0 --> array_mixte188
+array_mixte188: li %26, 0 --> array_mixte187
+array_mixte187: li %27, 0 --> array_mixte186
+array_mixte186: li %28, 0 --> array_mixte185
+array_mixte185: li %29, 0 --> array_mixte184
+array_mixte184: li %30, 0 --> array_mixte183
+array_mixte183: li %31, 0 --> array_mixte182
+array_mixte182: li %32, 0 --> array_mixte181
+array_mixte181: li %33, 0 --> array_mixte180
+array_mixte180: li %34, 0 --> array_mixte179
+array_mixte179: li %35, 0 --> array_mixte178
+array_mixte178: li %36, 0 --> array_mixte177
+array_mixte177: li %37, 0 --> array_mixte176
+array_mixte176: li %38, 0 --> array_mixte175
+array_mixte175: li %39, 0 --> array_mixte174
+array_mixte174: li %40, 0 --> array_mixte173
+array_mixte173: li %41, 0 --> array_mixte172
+array_mixte172: li %42, 0 --> array_mixte171
+array_mixte171: li %43, 0 --> array_mixte170
+array_mixte170: li %44, 0 --> array_mixte169
+array_mixte169: li %45, 0 --> array_mixte168
+array_mixte168: li %46, 0 --> array_mixte167
+array_mixte167: li %47, 0 --> array_mixte166
+array_mixte166: li %48, 0 --> array_mixte165
+array_mixte165: li %49, 0 --> array_mixte164
+array_mixte164: li %50, 0 --> array_mixte163
+array_mixte163: li %51, 0 --> array_mixte162
+array_mixte162: li %52, 0 --> array_mixte161
+array_mixte161: li %53, 0 --> array_mixte160
+array_mixte160: li %54, 0 --> array_mixte159
+array_mixte159: li %55, 0 --> array_mixte158
+array_mixte158: li %56, 0 --> array_mixte157
+array_mixte157: li %57, 0 --> array_mixte156
+array_mixte156: li %58, 0 --> array_mixte155
+array_mixte155: li %59, 0 --> array_mixte154
+array_mixte154: li %60, 0 --> array_mixte153
+array_mixte153: li %61, 0 --> array_mixte152
+array_mixte152: li %62, 0 --> array_mixte151
+array_mixte151: li %63, 0 --> array_mixte150
+array_mixte150: li %64, 0 --> array_mixte149
+array_mixte149: li %65, 0 --> array_mixte148
+array_mixte148: li %66, 0 --> array_mixte147
+array_mixte147: li %67, 0 --> array_mixte146
+array_mixte146: li %68, 0 --> array_mixte145
+array_mixte145: li %69, 0 --> array_mixte144
+array_mixte144: li %70, 0 --> array_mixte143
+array_mixte143: li %71, 0 --> array_mixte142
+array_mixte142: li %72, 0 --> array_mixte141
+array_mixte141: li %73, 0 --> array_mixte140
+array_mixte140: li %74, 0 --> array_mixte139
+array_mixte139: li %75, 0 --> array_mixte138
+array_mixte138: li %76, 0 --> array_mixte137
+array_mixte137: li %77, 0 --> array_mixte136
+array_mixte136: li %78, 0 --> array_mixte135
+array_mixte135: li %79, 0 --> array_mixte134
+array_mixte134: li %80, 0 --> array_mixte133
+array_mixte133: li %81, 0 --> array_mixte132
+array_mixte132: li %82, 0 --> array_mixte131
+array_mixte131: li %83, 0 --> array_mixte130
+array_mixte130: li %84, 0 --> array_mixte129
+array_mixte129: li %85, 0 --> array_mixte128
+array_mixte128: li %86, 0 --> array_mixte127
+array_mixte127: li %87, 0 --> array_mixte126
+array_mixte126: li %88, 0 --> array_mixte125
+array_mixte125: li %89, 0 --> array_mixte124
+array_mixte124: li %90, 0 --> array_mixte123
+array_mixte123: li %91, 0 --> array_mixte122
+array_mixte122: li %92, 0 --> array_mixte121
+array_mixte121: li %93, 0 --> array_mixte120
+array_mixte120: li %94, 0 --> array_mixte102
+array_mixte102: emit c30 --> array_mixte101
+array_mixte101: li %73, 0 --> array_mixte100
+array_mixte100: move %74, $sp --> array_mixte236
+array_mixte236: move %74, %74 --> array_mixte99
+array_mixte99 : li %76, 0 --> array_mixte98
+array_mixte98 : li %77, 4 --> array_mixte97
+array_mixte97 : mulo %75, %76, %77 --> array_mixte96
+array_mixte96 : add %94, %74, %75 --> array_mixte119
+array_mixte119: sw %73, 0(%94) --> array_mixte95
+array_mixte95 : emit c29 --> array_mixte94
+array_mixte94 : li %68, 0 --> array_mixte93
+array_mixte93 : move %69, $sp --> array_mixte248
+array_mixte248: move %69, %69 --> array_mixte92
+array_mixte92 : li %71, 1 --> array_mixte91
+array_mixte91 : li %72, 4 --> array_mixte90
+array_mixte90 : mulo %70, %71, %72 --> array_mixte89
+array_mixte89 : add %92, %69, %70 --> array_mixte117
+array_mixte117: sw %68, 0(%92) --> array_mixte88
+array_mixte88 : emit c28 --> array_mixte87
+array_mixte87 : li %63, 0 --> array_mixte86
+array_mixte86 : move %64, $sp --> array_mixte247
+array_mixte247: move %64, %64 --> array_mixte85
+array_mixte85 : li %66, 2 --> array_mixte84
+array_mixte84 : li %67, 4 --> array_mixte83
+array_mixte83 : mulo %65, %66, %67 --> array_mixte82
+array_mixte82 : add %91, %64, %65 --> array_mixte116
+array_mixte116: sw %63, 0(%91) --> array_mixte81
+array_mixte81 : emit c27 --> array_mixte80
+array_mixte80 : li %58, 0 --> array_mixte79
+array_mixte79 : move %59, $sp --> array_mixte246
+array_mixte246: move %59, %59 --> array_mixte78
+array_mixte78 : li %61, 3 --> array_mixte77
+array_mixte77 : li %62, 4 --> array_mixte76
+array_mixte76 : mulo %60, %61, %62 --> array_mixte75
+array_mixte75 : add %90, %59, %60 --> array_mixte115
+array_mixte115: sw %58, 0(%90) --> array_mixte74
+array_mixte74 : emit c26 --> array_mixte73
+array_mixte73 : li %53, 0 --> array_mixte72
+array_mixte72 : move %54, $sp --> array_mixte245
+array_mixte245: move %54, %54 --> array_mixte71
+array_mixte71 : li %56, 4 --> array_mixte70
+array_mixte70 : li %57, 4 --> array_mixte69
+array_mixte69 : mulo %55, %56, %57 --> array_mixte68
+array_mixte68 : add %89, %54, %55 --> array_mixte114
+array_mixte114: sw %53, 0(%89) --> array_mixte67
+array_mixte67 : emit c25 --> array_mixte66
+array_mixte66 : li %48, 0 --> array_mixte65
+array_mixte65 : move %49, $sp --> array_mixte244
+array_mixte244: move %49, %49 --> array_mixte64
+array_mixte64 : li %51, 5 --> array_mixte63
+array_mixte63 : li %52, 4 --> array_mixte62
+array_mixte62 : mulo %50, %51, %52 --> array_mixte61
+array_mixte61 : add %88, %49, %50 --> array_mixte113
+array_mixte113: sw %48, 0(%88) --> array_mixte60
+array_mixte60 : emit c24 --> array_mixte59
+array_mixte59 : li %43, 0 --> array_mixte58
+array_mixte58 : move %44, $sp --> array_mixte243
+array_mixte243: move %44, %44 --> array_mixte57
+array_mixte57 : li %46, 6 --> array_mixte56
+array_mixte56 : li %47, 4 --> array_mixte55
+array_mixte55 : mulo %45, %46, %47 --> array_mixte54
+array_mixte54 : add %86, %44, %45 --> array_mixte111
+array_mixte111: sw %43, 0(%86) --> array_mixte53
+array_mixte53 : emit c23 --> array_mixte52
+array_mixte52 : li %38, 0 --> array_mixte51
+array_mixte51 : move %39, $sp --> array_mixte242
+array_mixte242: move %39, %39 --> array_mixte50
+array_mixte50 : li %41, 7 --> array_mixte49
+array_mixte49 : li %42, 4 --> array_mixte48
+array_mixte48 : mulo %40, %41, %42 --> array_mixte47
+array_mixte47 : add %85, %39, %40 --> array_mixte110
+array_mixte110: sw %38, 0(%85) --> array_mixte46
+array_mixte46 : emit c22 --> array_mixte45
+array_mixte45 : li %33, 0 --> array_mixte44
+array_mixte44 : move %34, $sp --> array_mixte241
+array_mixte241: move %34, %34 --> array_mixte43
+array_mixte43 : li %36, 8 --> array_mixte42
+array_mixte42 : li %37, 4 --> array_mixte41
+array_mixte41 : mulo %35, %36, %37 --> array_mixte40
+array_mixte40 : add %84, %34, %35 --> array_mixte109
+array_mixte109: sw %33, 0(%84) --> array_mixte39
+array_mixte39 : emit c21 --> array_mixte38
+array_mixte38 : li %28, 0 --> array_mixte37
+array_mixte37 : move %29, $sp --> array_mixte239
+array_mixte239: move %29, %29 --> array_mixte36
+array_mixte36 : li %31, 9 --> array_mixte35
+array_mixte35 : li %32, 4 --> array_mixte34
+array_mixte34 : mulo %30, %31, %32 --> array_mixte33
+array_mixte33 : add %83, %29, %30 --> array_mixte108
+array_mixte108: sw %28, 0(%83) --> array_mixte32
+array_mixte32 : emit c20 --> array_mixte31
+array_mixte31 : li %27, 4 --> array_mixte30
+array_mixte30 : mulo %26, %2, %27 --> array_mixte29
+array_mixte29 : add %82, %0, %26 --> array_mixte107
+array_mixte107: lw %24, 0(%82) --> array_mixte28
+array_mixte28 : li %25, 1 --> array_mixte27
+array_mixte27 : add %20, %24, %25 --> array_mixte26
+array_mixte26 : move %21, $sp --> array_mixte238
+array_mixte238: move %21, %21 --> array_mixte25
+array_mixte25 : li %23, 4 --> array_mixte24
+array_mixte24 : mulo %22, %1, %23 --> array_mixte23
+array_mixte23 : add %81, %21, %22 --> array_mixte106
+array_mixte106: sw %20, 0(%81) --> array_mixte22
+array_mixte22 : emit c19 --> array_mixte21
+array_mixte21 : move %16, $sp --> array_mixte237
+array_mixte237: move %16, %16 --> array_mixte20
+array_mixte20 : li %18, 0 --> array_mixte19
+array_mixte19 : li %19, 4 --> array_mixte18
+array_mixte18 : mulo %17, %18, %19 --> array_mixte17
+array_mixte17 : add %80, %16, %17 --> array_mixte105
+array_mixte105: lw %13, 0(%80) --> array_mixte16
+array_mixte16 : li %15, 4 --> array_mixte15
+array_mixte15 : mulo %14, %2, %15 --> array_mixte14
+array_mixte14 : add %79, %0, %14 --> array_mixte104
+array_mixte104: sw %13, 0(%79) --> array_mixte13
+array_mixte13 : emit c18 --> array_mixte12
+array_mixte12 : li %11, 1 --> array_mixte11
+array_mixte11 : li %12, 4 --> array_mixte10
+array_mixte10 : mulo %10, %11, %12 --> array_mixte9
+array_mixte9 : add %93, %0, %10 --> array_mixte118
+array_mixte118: lw %7, 0(%93) --> array_mixte8
+array_mixte8 : li %9, 4 --> array_mixte7
+array_mixte7 : mulo %8, %1, %9 --> array_mixte6
+array_mixte6 : add %87, %0, %8 --> array_mixte112
+array_mixte112: sw %7, 0(%87) --> array_mixte5
+array_mixte5 : emit c17 --> array_mixte4
+array_mixte4 : move %4, $sp --> array_mixte240
+array_mixte240: move %4, %4 --> array_mixte3
+array_mixte3 : li %6, 4 --> array_mixte2
+array_mixte2 : mulo %5, %1, %6 --> array_mixte1
+array_mixte1 : add %78, %4, %5 --> array_mixte103
+array_mixte103: lw %3, 0(%78) --> array_mixte0
+array_mixte0 : j --> array_mixte235
+array_mixte235: move $v0, %3 --> array_mixte234
+array_mixte234: move $ra, %103 --> array_mixte233
+array_mixte233: move $s7, %102 --> array_mixte232
+array_mixte232: move $s6, %101 --> array_mixte231
+array_mixte231: move $s5, %100 --> array_mixte230
+array_mixte230: move $s4, %99 --> array_mixte229
+array_mixte229: move $s3, %98 --> array_mixte228
+array_mixte228: move $s2, %97 --> array_mixte227
+array_mixte227: move $s1, %96 --> array_mixte226
+array_mixte226: move $s0, %95 --> array_mixte225
+array_mixte225: delframe --> array_mixte224
+array_mixte224: jr $ra (xmits $v0)
+
+procedure array_local(0)
+stacksize 40
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78, %79, %80, %81, %82, %83,
+ %84, %85, %86, %87, %88, %89, %90,
+ %91, %92, %93, %94, %95, %96, %97,
+ %98, %99, %100, %101, %102, %103, %104,
+ %105, %106
+entry array_local234
+array_local234: newframe --> array_local233
+array_local233: move %106, $ra --> array_local232
+array_local232: move %105, $s7 --> array_local231
+array_local231: move %104, $s6 --> array_local230
+array_local230: move %103, $s5 --> array_local229
+array_local229: move %102, $s4 --> array_local228
+array_local228: move %101, $s3 --> array_local227
+array_local227: move %100, $s2 --> array_local226
+array_local226: move %99, $s1 --> array_local225
+array_local225: move %98, $s0 --> array_local224
+array_local224: li %0, 0 --> array_local223
+array_local223: li %1, 0 --> array_local222
+array_local222: li %2, 0 --> array_local221
+array_local221: li %3, 0 --> array_local220
+array_local220: li %5, 0 --> array_local219
+array_local219: li %6, 0 --> array_local218
+array_local218: li %7, 0 --> array_local217
+array_local217: li %8, 0 --> array_local216
+array_local216: li %9, 0 --> array_local215
+array_local215: li %10, 0 --> array_local214
+array_local214: li %11, 0 --> array_local213
+array_local213: li %12, 0 --> array_local212
+array_local212: li %13, 0 --> array_local211
+array_local211: li %14, 0 --> array_local210
+array_local210: li %15, 0 --> array_local209
+array_local209: li %16, 0 --> array_local208
+array_local208: li %17, 0 --> array_local207
+array_local207: li %18, 0 --> array_local206
+array_local206: li %19, 0 --> array_local205
+array_local205: li %20, 0 --> array_local204
+array_local204: li %21, 0 --> array_local203
+array_local203: li %22, 0 --> array_local202
+array_local202: li %23, 0 --> array_local201
+array_local201: li %24, 0 --> array_local200
+array_local200: li %25, 0 --> array_local199
+array_local199: li %26, 0 --> array_local198
+array_local198: li %27, 0 --> array_local197
+array_local197: li %28, 0 --> array_local196
+array_local196: li %29, 0 --> array_local195
+array_local195: li %30, 0 --> array_local194
+array_local194: li %31, 0 --> array_local193
+array_local193: li %32, 0 --> array_local192
+array_local192: li %33, 0 --> array_local191
+array_local191: li %34, 0 --> array_local190
+array_local190: li %35, 0 --> array_local189
+array_local189: li %36, 0 --> array_local188
+array_local188: li %37, 0 --> array_local187
+array_local187: li %38, 0 --> array_local186
+array_local186: li %39, 0 --> array_local185
+array_local185: li %40, 0 --> array_local184
+array_local184: li %41, 0 --> array_local183
+array_local183: li %42, 0 --> array_local182
+array_local182: li %43, 0 --> array_local181
+array_local181: li %44, 0 --> array_local180
+array_local180: li %45, 0 --> array_local179
+array_local179: li %46, 0 --> array_local178
+array_local178: li %47, 0 --> array_local177
+array_local177: li %48, 0 --> array_local176
+array_local176: li %49, 0 --> array_local175
+array_local175: li %50, 0 --> array_local174
+array_local174: li %51, 0 --> array_local173
+array_local173: li %52, 0 --> array_local172
+array_local172: li %53, 0 --> array_local171
+array_local171: li %54, 0 --> array_local170
+array_local170: li %55, 0 --> array_local169
+array_local169: li %56, 0 --> array_local168
+array_local168: li %57, 0 --> array_local167
+array_local167: li %58, 0 --> array_local166
+array_local166: li %59, 0 --> array_local165
+array_local165: li %60, 0 --> array_local164
+array_local164: li %61, 0 --> array_local163
+array_local163: li %62, 0 --> array_local162
+array_local162: li %63, 0 --> array_local161
+array_local161: li %64, 0 --> array_local160
+array_local160: li %65, 0 --> array_local159
+array_local159: li %66, 0 --> array_local158
+array_local158: li %67, 0 --> array_local157
+array_local157: li %68, 0 --> array_local156
+array_local156: li %69, 0 --> array_local155
+array_local155: li %70, 0 --> array_local154
+array_local154: li %71, 0 --> array_local153
+array_local153: li %72, 0 --> array_local152
+array_local152: li %73, 0 --> array_local151
+array_local151: li %74, 0 --> array_local150
+array_local150: li %75, 0 --> array_local149
+array_local149: li %76, 0 --> array_local148
+array_local148: li %77, 0 --> array_local147
+array_local147: li %78, 0 --> array_local146
+array_local146: li %79, 0 --> array_local145
+array_local145: li %80, 0 --> array_local144
+array_local144: li %81, 0 --> array_local143
+array_local143: li %82, 0 --> array_local142
+array_local142: li %83, 0 --> array_local141
+array_local141: li %84, 0 --> array_local140
+array_local140: li %85, 0 --> array_local139
+array_local139: li %86, 0 --> array_local138
+array_local138: li %87, 0 --> array_local137
+array_local137: li %88, 0 --> array_local136
+array_local136: li %89, 0 --> array_local135
+array_local135: li %90, 0 --> array_local134
+array_local134: li %91, 0 --> array_local133
+array_local133: li %92, 0 --> array_local132
+array_local132: li %93, 0 --> array_local131
+array_local131: li %94, 0 --> array_local130
+array_local130: li %95, 0 --> array_local129
+array_local129: li %96, 0 --> array_local128
+array_local128: li %97, 0 --> array_local111
+array_local111: emit c16 --> array_local110
+array_local110: li %77, 0 --> array_local109
+array_local109: move %78, $sp --> array_local248
+array_local248: move %78, %78 --> array_local108
+array_local108: li %80, 0 --> array_local107
+array_local107: li %81, 4 --> array_local106
+array_local106: mulo %79, %80, %81 --> array_local105
+array_local105: add %82, %78, %79 --> array_local112
+array_local112: sw %77, 0(%82) --> array_local104
+array_local104: emit c15 --> array_local103
+array_local103: li %72, 0 --> array_local102
+array_local102: move %73, $sp --> array_local247
+array_local247: move %73, %73 --> array_local101
+array_local101: li %75, 1 --> array_local100
+array_local100: li %76, 4 --> array_local99
+array_local99 : mulo %74, %75, %76 --> array_local98
+array_local98 : add %97, %73, %74 --> array_local127
+array_local127: sw %72, 0(%97) --> array_local97
+array_local97 : emit c14 --> array_local96
+array_local96 : li %67, 0 --> array_local95
+array_local95 : move %68, $sp --> array_local262
+array_local262: move %68, %68 --> array_local94
+array_local94 : li %70, 2 --> array_local93
+array_local93 : li %71, 4 --> array_local92
+array_local92 : mulo %69, %70, %71 --> array_local91
+array_local91 : add %96, %68, %69 --> array_local126
+array_local126: sw %67, 0(%96) --> array_local90
+array_local90 : emit c13 --> array_local89
+array_local89 : li %62, 0 --> array_local88
+array_local88 : move %63, $sp --> array_local261
+array_local261: move %63, %63 --> array_local87
+array_local87 : li %65, 3 --> array_local86
+array_local86 : li %66, 4 --> array_local85
+array_local85 : mulo %64, %65, %66 --> array_local84
+array_local84 : add %94, %63, %64 --> array_local124
+array_local124: sw %62, 0(%94) --> array_local83
+array_local83 : emit c12 --> array_local82
+array_local82 : li %57, 0 --> array_local81
+array_local81 : move %58, $sp --> array_local260
+array_local260: move %58, %58 --> array_local80
+array_local80 : li %60, 4 --> array_local79
+array_local79 : li %61, 4 --> array_local78
+array_local78 : mulo %59, %60, %61 --> array_local77
+array_local77 : add %93, %58, %59 --> array_local123
+array_local123: sw %57, 0(%93) --> array_local76
+array_local76 : emit c11 --> array_local75
+array_local75 : li %52, 0 --> array_local74
+array_local74 : move %53, $sp --> array_local259
+array_local259: move %53, %53 --> array_local73
+array_local73 : li %55, 5 --> array_local72
+array_local72 : li %56, 4 --> array_local71
+array_local71 : mulo %54, %55, %56 --> array_local70
+array_local70 : add %92, %53, %54 --> array_local122
+array_local122: sw %52, 0(%92) --> array_local69
+array_local69 : emit c10 --> array_local68
+array_local68 : li %47, 0 --> array_local67
+array_local67 : move %48, $sp --> array_local257
+array_local257: move %48, %48 --> array_local66
+array_local66 : li %50, 6 --> array_local65
+array_local65 : li %51, 4 --> array_local64
+array_local64 : mulo %49, %50, %51 --> array_local63
+array_local63 : add %91, %48, %49 --> array_local121
+array_local121: sw %47, 0(%91) --> array_local62
+array_local62 : emit c9 --> array_local61
+array_local61 : li %42, 0 --> array_local60
+array_local60 : move %43, $sp --> array_local256
+array_local256: move %43, %43 --> array_local59
+array_local59 : li %45, 7 --> array_local58
+array_local58 : li %46, 4 --> array_local57
+array_local57 : mulo %44, %45, %46 --> array_local56
+array_local56 : add %90, %43, %44 --> array_local120
+array_local120: sw %42, 0(%90) --> array_local55
+array_local55 : emit c8 --> array_local54
+array_local54 : li %37, 0 --> array_local53
+array_local53 : move %38, $sp --> array_local255
+array_local255: move %38, %38 --> array_local52
+array_local52 : li %40, 8 --> array_local51
+array_local51 : li %41, 4 --> array_local50
+array_local50 : mulo %39, %40, %41 --> array_local49
+array_local49 : add %89, %38, %39 --> array_local119
+array_local119: sw %37, 0(%89) --> array_local48
+array_local48 : emit c7 --> array_local47
+array_local47 : li %32, 0 --> array_local46
+array_local46 : move %33, $sp --> array_local254
+array_local254: move %33, %33 --> array_local45
+array_local45 : li %35, 9 --> array_local44
+array_local44 : li %36, 4 --> array_local43
+array_local43 : mulo %34, %35, %36 --> array_local42
+array_local42 : add %88, %33, %34 --> array_local118
+array_local118: sw %32, 0(%88) --> array_local41
+array_local41 : emit c6 --> array_local40
+array_local40 : li %27, 1 --> array_local39
+array_local39 : move %28, $sp --> array_local253
+array_local253: move %28, %28 --> array_local38
+array_local38 : li %30, 0 --> array_local37
+array_local37 : li %31, 4 --> array_local36
+array_local36 : mulo %29, %30, %31 --> array_local35
+array_local35 : add %87, %28, %29 --> array_local117
+array_local117: sw %27, 0(%87) --> array_local34
+array_local34 : emit c5 --> array_local33
+array_local33 : li %22, 5 --> array_local32
+array_local32 : move %23, $sp --> array_local252
+array_local252: move %23, %23 --> array_local31
+array_local31 : li %25, 1 --> array_local30
+array_local30 : li %26, 4 --> array_local29
+array_local29 : mulo %24, %25, %26 --> array_local28
+array_local28 : add %85, %23, %24 --> array_local115
+array_local115: sw %22, 0(%85) --> array_local27
+array_local27 : emit c4 --> array_local26
+array_local26 : move %18, $sp --> array_local251
+array_local251: move %18, %18 --> array_local25
+array_local25 : li %20, 0 --> array_local24
+array_local24 : li %21, 4 --> array_local23
+array_local23 : mulo %19, %20, %21 --> array_local22
+array_local22 : add %84, %18, %19 --> array_local114
+array_local114: lw %3, 0(%84) --> array_local21
+array_local21 : emit c3 --> array_local20
+array_local20 : li %13, 7 --> array_local19
+array_local19 : move %14, $sp --> array_local250
+array_local250: move %14, %14 --> array_local18
+array_local18 : li %16, 1 --> array_local17
+array_local17 : li %17, 4 --> array_local16
+array_local16 : mulo %15, %16, %17 --> array_local15
+array_local15 : add %83, %14, %15 --> array_local113
+array_local113: sw %13, 0(%83) --> array_local14
+array_local14 : emit c2 --> array_local13
+array_local13 : move %9, $sp --> array_local249
+array_local249: move %9, %9 --> array_local12
+array_local12 : li %11, 1 --> array_local11
+array_local11 : li %12, 4 --> array_local10
+array_local10 : mulo %10, %11, %12 --> array_local9
+array_local9 : add %95, %9, %10 --> array_local125
+array_local125: lw %3, 0(%95) --> array_local8
+array_local8 : emit c1 --> array_local7
+array_local7 : move %5, $sp --> array_local258
+array_local258: move %5, %5 --> array_local6
+array_local6 : li %7, 0 --> array_local5
+array_local5 : li %8, 4 --> array_local4
+array_local4 : mulo %6, %7, %8 --> array_local3
+array_local3 : add %86, %5, %6 --> array_local116
+array_local116: lw %2, 0(%86) --> array_local2
+array_local2 : emit c0 --> array_local1
+array_local1 : move %4, %3 --> array_local0
+array_local0 : j --> array_local246
+array_local246: move $v0, %4 --> array_local245
+array_local245: move $ra, %106 --> array_local244
+array_local244: move $s7, %105 --> array_local243
+array_local243: move $s6, %104 --> array_local242
+array_local242: move $s5, %103 --> array_local241
+array_local241: move $s4, %102 --> array_local240
+array_local240: move $s3, %101 --> array_local239
+array_local239: move $s2, %100 --> array_local238
+array_local238: move $s1, %99 --> array_local237
+array_local237: move $s0, %98 --> array_local236
+array_local236: delframe --> array_local235
+array_local235: jr $ra (xmits $v0)
+
+procedure _main(0)
+stacksize 40
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78, %79, %80, %81, %82
+entry main181
+main181: newframe --> main180
+main180: move %82, $ra --> main179
+main179: move %81, $s7 --> main178
+main178: move %80, $s6 --> main177
+main177: move %79, $s5 --> main176
+main176: move %78, $s4 --> main175
+main175: move %77, $s3 --> main174
+main174: move %76, $s2 --> main173
+main173: move %75, $s1 --> main172
+main172: move %74, $s0 --> main171
+main171: li %0, 0 --> main170
+main170: li %1, 0 --> main169
+main169: li %2, 0 --> main168
+main168: li %4, 0 --> main167
+main167: li %5, 0 --> main166
+main166: li %6, 0 --> main165
+main165: li %7, 0 --> main164
+main164: li %8, 0 --> main163
+main163: li %9, 0 --> main162
+main162: li %10, 0 --> main161
+main161: li %11, 0 --> main160
+main160: li %12, 0 --> main159
+main159: li %13, 0 --> main158
+main158: li %14, 0 --> main157
+main157: li %15, 0 --> main156
+main156: li %16, 0 --> main155
+main155: li %17, 0 --> main154
+main154: li %18, 0 --> main153
+main153: li %19, 0 --> main152
+main152: li %20, 0 --> main151
+main151: li %21, 0 --> main150
+main150: li %22, 0 --> main149
+main149: li %23, 0 --> main148
+main148: li %24, 0 --> main147
+main147: li %25, 0 --> main146
+main146: li %26, 0 --> main145
+main145: li %27, 0 --> main144
+main144: li %28, 0 --> main143
+main143: li %29, 0 --> main142
+main142: li %30, 0 --> main141
+main141: li %31, 0 --> main140
+main140: li %32, 0 --> main139
+main139: li %33, 0 --> main138
+main138: li %34, 0 --> main137
+main137: li %35, 0 --> main136
+main136: li %36, 0 --> main135
+main135: li %37, 0 --> main134
+main134: li %38, 0 --> main133
+main133: li %39, 0 --> main132
+main132: li %40, 0 --> main131
+main131: li %41, 0 --> main130
+main130: li %42, 0 --> main129
+main129: li %43, 0 --> main128
+main128: li %44, 0 --> main127
+main127: li %45, 0 --> main126
+main126: li %46, 0 --> main125
+main125: li %47, 0 --> main124
+main124: li %48, 0 --> main123
+main123: li %49, 0 --> main122
+main122: li %50, 0 --> main121
+main121: li %51, 0 --> main120
+main120: li %52, 0 --> main119
+main119: li %53, 0 --> main118
+main118: li %54, 0 --> main117
+main117: li %55, 0 --> main116
+main116: li %56, 0 --> main115
+main115: li %57, 0 --> main114
+main114: li %58, 0 --> main113
+main113: li %59, 0 --> main112
+main112: li %60, 0 --> main111
+main111: li %61, 0 --> main110
+main110: li %62, 0 --> main109
+main109: li %63, 0 --> main108
+main108: li %64, 0 --> main107
+main107: li %65, 0 --> main106
+main106: li %66, 0 --> main105
+main105: li %67, 0 --> main104
+main104: li %68, 0 --> main103
+main103: li %69, 0 --> main102
+main102: li %70, 0 --> main101
+main101: li %71, 0 --> main100
+main100: li %72, 0 --> main99
+main99 : li %73, 0 --> main85
+main85 : emit c51 --> main84
+main84 : li %56, 1 --> main83
+main83 : move %57, $sp --> main205
+main205: move %57, %57 --> main82
+main82 : li %59, 0 --> main81
+main81 : li %60, 4 --> main80
+main80 : mulo %58, %59, %60 --> main79
+main79 : add %72, %57, %58 --> main97
+main97 : sw %56, 0(%72) --> main78
+main78 : emit c50 --> main77
+main77 : li %51, 2 --> main76
+main76 : move %52, $sp --> main204
+main204: move %52, %52 --> main75
+main75 : li %54, 1 --> main74
+main74 : li %55, 4 --> main73
+main73 : mulo %53, %54, %55 --> main72
+main72 : add %71, %52, %53 --> main96
+main96 : sw %51, 0(%71) --> main71
+main71 : emit c49 --> main70
+main70 : li %46, 3 --> main69
+main69 : move %47, $sp --> main202
+main202: move %47, %47 --> main68
+main68 : li %49, 2 --> main67
+main67 : li %50, 4 --> main66
+main66 : mulo %48, %49, %50 --> main65
+main65 : add %70, %47, %48 --> main95
+main95 : sw %46, 0(%70) --> main64
+main64 : emit c48 --> main63
+main63 : li %41, 4 --> main62
+main62 : move %42, $sp --> main201
+main201: move %42, %42 --> main61
+main61 : li %44, 3 --> main60
+main60 : li %45, 4 --> main59
+main59 : mulo %43, %44, %45 --> main58
+main58 : add %69, %42, %43 --> main94
+main94 : sw %41, 0(%69) --> main57
+main57 : emit c47 --> main56
+main56 : li %36, 5 --> main55
+main55 : move %37, $sp --> main200
+main200: move %37, %37 --> main54
+main54 : li %39, 4 --> main53
+main53 : li %40, 4 --> main52
+main52 : mulo %38, %39, %40 --> main51
+main51 : add %68, %37, %38 --> main93
+main93 : sw %36, 0(%68) --> main50
+main50 : emit c46 --> main49
+main49 : li %31, 6 --> main48
+main48 : move %32, $sp --> main199
+main199: move %32, %32 --> main47
+main47 : li %34, 5 --> main46
+main46 : li %35, 4 --> main45
+main45 : mulo %33, %34, %35 --> main44
+main44 : add %67, %32, %33 --> main92
+main92 : sw %31, 0(%67) --> main43
+main43 : emit c45 --> main42
+main42 : li %26, 7 --> main41
+main41 : move %27, $sp --> main198
+main198: move %27, %27 --> main40
+main40 : li %29, 6 --> main39
+main39 : li %30, 4 --> main38
+main38 : mulo %28, %29, %30 --> main37
+main37 : add %65, %27, %28 --> main90
+main90 : sw %26, 0(%65) --> main36
+main36 : emit c44 --> main35
+main35 : li %21, 8 --> main34
+main34 : move %22, $sp --> main197
+main197: move %22, %22 --> main33
+main33 : li %24, 7 --> main32
+main32 : li %25, 4 --> main31
+main31 : mulo %23, %24, %25 --> main30
+main30 : add %64, %22, %23 --> main89
+main89 : sw %21, 0(%64) --> main29
+main29 : emit c43 --> main28
+main28 : li %16, 9 --> main27
+main27 : move %17, $sp --> main196
+main196: move %17, %17 --> main26
+main26 : li %19, 8 --> main25
+main25 : li %20, 4 --> main24
+main24 : mulo %18, %19, %20 --> main23
+main23 : add %63, %17, %18 --> main88
+main88 : sw %16, 0(%63) --> main22
+main22 : emit c42 --> main21
+main21 : li %11, 0 --> main20
+main20 : move %12, $sp --> main195
+main195: move %12, %12 --> main19
+main19 : li %14, 9 --> main18
+main18 : li %15, 4 --> main17
+main17 : mulo %13, %14, %15 --> main16
+main16 : add %62, %12, %13 --> main87
+main87 : sw %11, 0(%62) --> main15
+main15 : emit c41 --> main14
+main14 : la %61, array_local --> main86
+main86 : j --> main207
+main207: call %61(0) --> main206
+main206: move %2, $v0 --> main13
+main13 : emit c40 --> main12
+main12 : move %8, $sp --> main194
+main194: move %8, %8 --> main11
+main11 : li %9, 2 --> main10
+main10 : li %10, 3 --> main9
+main9 : la %73, array_mixte --> main98
+main98 : j --> main217
+main217: move $a0, %8 --> main216
+main216: move $a1, %9 --> main215
+main215: move $a2, %10 --> main214
+main214: call %73(3) --> main213
+main213: move %1, $v0 --> main8
+main8 : emit c39 --> main7
+main7 : move %5, $sp --> main203
+main203: move %5, %5 --> main6
+main6 : li %6, 2 --> main5
+main5 : li %7, 3 --> main4
+main4 : la %66, array_param --> main91
+main91 : j --> main212
+main212: move $a0, %5 --> main211
+main211: move $a1, %6 --> main210
+main210: move $a2, %7 --> main209
+main209: call %66(3) --> main208
+main208: move %0, $v0 --> main3
+main3 : emit c38 --> main2
+main2 : add %4, %2, %1 --> main1
+main1 : add %3, %4, %0 --> main0
+main0 : j --> main193
+main193: move $v0, %3 --> main192
+main192: move $ra, %82 --> main191
+main191: move $s7, %81 --> main190
+main190: move $s6, %80 --> main189
+main189: move $s5, %79 --> main188
+main188: move $s4, %78 --> main187
+main187: move $s3, %77 --> main186
+main186: move $s2, %76 --> main185
+main185: move $s1, %75 --> main184
+main184: move $s0, %74 --> main183
+main183: delframe --> main182
+main182: jr $ra (xmits $v0)
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure array_param(3)
+var 0
+array_param79:
+newframe
+c37:
+li $a3, 1
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a3, 0($v0)
+c36:
+li $a3, 1
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c35:
+c34:
+li $a1, 7
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c33:
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+lw $v0, 0($v0)
+c32:
+c31:
+delframe
+jr $ra
+
+procedure array_mixte(3)
+var 40
+array_mixte223:
+newframe
+c30:
+li $t0, 0
+move $a3, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a3, $v0
+sw $t0, 0($v0)
+c29:
+move $t0, $sp
+li $a3, 1
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c28:
+move $t0, $sp
+li $a3, 2
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c27:
+move $t0, $sp
+li $a3, 3
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c26:
+move $t0, $sp
+li $a3, 4
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c25:
+move $t0, $sp
+li $a3, 5
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c24:
+move $t0, $sp
+li $a3, 6
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c23:
+move $t0, $sp
+li $a3, 7
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c22:
+move $t0, $sp
+li $a3, 8
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c21:
+move $t0, $sp
+li $a3, 9
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c20:
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+lw $a3, 0($v0)
+li $v0, 1
+add $t0, $a3, $v0
+move $a3, $sp
+li $v0, 4
+mulo $v0, $a1, $v0
+add $v0, $a3, $v0
+sw $t0, 0($v0)
+c19:
+move $a3, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a3, $v0
+lw $a3, 0($v0)
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+sw $a3, 0($v0)
+c18:
+li $a2, 1
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+lw $a2, 0($v0)
+li $v0, 4
+mulo $v0, $a1, $v0
+add $v0, $a0, $v0
+sw $a2, 0($v0)
+c17:
+li $v0, 4
+mulo $v0, $a1, $v0
+add $v0, $sp, $v0
+lw $v0, 0($v0)
+delframe
+jr $ra
+
+procedure array_local(0)
+var 40
+array_local234:
+newframe
+c16:
+li $a1, 0
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c15:
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c14:
+move $a1, $sp
+li $a0, 2
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c13:
+move $a1, $sp
+li $a0, 3
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c12:
+move $a1, $sp
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c11:
+move $a1, $sp
+li $a0, 5
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c10:
+move $a1, $sp
+li $a0, 6
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c9:
+move $a1, $sp
+li $a0, 7
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c8:
+move $a1, $sp
+li $a0, 8
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c7:
+move $a1, $sp
+li $a0, 9
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c6:
+li $a1, 1
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c5:
+li $a2, 5
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c4:
+c3:
+li $a2, 7
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c2:
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $sp, $v0
+lw $v0, 0($v0)
+c1:
+c0:
+delframe
+jr $ra
+
+procedure _main(0)
+var 52
+main181:
+newframe
+sw $ra, 48($sp)
+sw $s1, 44($sp)
+sw $s0, 40($sp)
+c51:
+li $a1, 1
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c50:
+li $a2, 2
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c49:
+li $a2, 3
+move $a1, $sp
+li $a0, 2
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c48:
+li $a2, 4
+move $a1, $sp
+li $a0, 3
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c47:
+li $a2, 5
+move $a1, $sp
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c46:
+li $a2, 6
+move $a1, $sp
+li $a0, 5
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c45:
+li $a2, 7
+move $a1, $sp
+li $a0, 6
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c44:
+li $a2, 8
+move $a1, $sp
+li $a0, 7
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c43:
+li $a2, 9
+move $a1, $sp
+li $a0, 8
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c42:
+move $a1, $sp
+li $a0, 9
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c41:
+la $v0, array_local
+call $v0
+move $s0, $v0
+c40:
+move $a0, $sp
+li $a1, 2
+li $a2, 3
+la $v0, array_mixte
+call $v0
+move $s1, $v0
+c39:
+move $a0, $sp
+li $a1, 2
+li $a2, 3
+la $v0, array_param
+call $v0
+c38:
+add $a0, $s0, $s1
+add $v0, $a0, $v0
+lw $ra, 48($sp)
+lw $s1, 44($sp)
+lw $s0, 40($sp)
+delframe
+jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure array_param(3)
+var 0
+entry array_param79
+array_param79: newframe --> array_param78
+array_param78: j --> array_param77
+array_param77: j --> array_param76
+array_param76: j --> array_param75
+array_param75: j --> array_param74
+array_param74: j --> array_param73
+array_param73: j --> array_param72
+array_param72: j --> array_param71
+array_param71: j --> array_param70
+array_param70: j --> array_param69
+array_param69: j --> array_param68
+array_param68: j --> array_param67
+array_param67: j --> array_param66
+array_param66: j --> array_param65
+array_param65: j --> array_param64
+array_param64: j --> array_param63
+array_param63: j --> array_param62
+array_param62: j --> array_param61
+array_param61: j --> array_param60
+array_param60: j --> array_param59
+array_param59: j --> array_param58
+array_param58: j --> array_param57
+array_param57: j --> array_param56
+array_param56: j --> array_param55
+array_param55: j --> array_param54
+array_param54: j --> array_param53
+array_param53: j --> array_param52
+array_param52: j --> array_param51
+array_param51: j --> array_param50
+array_param50: j --> array_param49
+array_param49: j --> array_param48
+array_param48: j --> array_param47
+array_param47: j --> array_param46
+array_param46: j --> array_param45
+array_param45: j --> array_param44
+array_param44: j --> array_param43
+array_param43: j --> array_param42
+array_param42: j --> array_param41
+array_param41: j --> array_param40
+array_param40: j --> array_param39
+array_param39: j --> array_param32
+array_param32: emit c37 --> array_param31
+array_param31: li $a3, 1 --> array_param30
+array_param30: j --> array_param29
+array_param29: li $v0, 4 --> array_param28
+array_param28: mulo $v0, $zero, $v0 --> array_param27
+array_param27: add $v0, $a0, $v0 --> array_param36
+array_param36: lw $a3, 0($v0) --> array_param26
+array_param26: emit c36 --> array_param25
+array_param25: li $a3, 1 --> array_param24
+array_param24: li $v0, 4 --> array_param23
+array_param23: mulo $v0, $a3, $v0 --> array_param22
+array_param22: add $v0, $a0, $v0 --> array_param35
+array_param35: lw $a1, 0($v0) --> array_param21
+array_param21: emit c35 --> array_param20
+array_param20: j --> array_param19
+array_param19: j --> array_param18
+array_param18: j --> array_param17
+array_param17: j --> array_param34
+array_param34: j --> array_param16
+array_param16: emit c34 --> array_param15
+array_param15: li $a1, 7 --> array_param14
+array_param14: li $v0, 4 --> array_param13
+array_param13: mulo $v0, $a2, $v0 --> array_param12
+array_param12: add $v0, $a0, $v0 --> array_param33
+array_param33: lw $a1, 0($v0) --> array_param11
+array_param11: emit c33 --> array_param10
+array_param10: li $v0, 4 --> array_param9
+array_param9 : mulo $v0, $a2, $v0 --> array_param8
+array_param8 : add $v0, $a0, $v0 --> array_param38
+array_param38: lw $v0, 0($v0) --> array_param7
+array_param7 : emit c32 --> array_param6
+array_param6 : j --> array_param5
+array_param5 : j --> array_param4
+array_param4 : j --> array_param3
+array_param3 : j --> array_param37
+array_param37: j --> array_param2
+array_param2 : emit c31 --> array_param1
+array_param1 : j --> array_param0
+array_param0 : j --> array_param91
+array_param91: j --> array_param90
+array_param90: j --> array_param89
+array_param89: j --> array_param88
+array_param88: j --> array_param87
+array_param87: j --> array_param86
+array_param86: j --> array_param85
+array_param85: j --> array_param84
+array_param84: j --> array_param83
+array_param83: j --> array_param82
+array_param82: j --> array_param81
+array_param81: delframe --> array_param80
+array_param80: jr $ra
+
+procedure array_mixte(3)
+var 40
+entry array_mixte223
+array_mixte223: newframe --> array_mixte222
+array_mixte222: j --> array_mixte221
+array_mixte221: j --> array_mixte220
+array_mixte220: j --> array_mixte219
+array_mixte219: j --> array_mixte218
+array_mixte218: j --> array_mixte217
+array_mixte217: j --> array_mixte216
+array_mixte216: j --> array_mixte215
+array_mixte215: j --> array_mixte214
+array_mixte214: j --> array_mixte213
+array_mixte213: j --> array_mixte212
+array_mixte212: j --> array_mixte211
+array_mixte211: j --> array_mixte210
+array_mixte210: j --> array_mixte209
+array_mixte209: j --> array_mixte208
+array_mixte208: j --> array_mixte207
+array_mixte207: j --> array_mixte206
+array_mixte206: j --> array_mixte205
+array_mixte205: j --> array_mixte204
+array_mixte204: j --> array_mixte203
+array_mixte203: j --> array_mixte202
+array_mixte202: j --> array_mixte201
+array_mixte201: j --> array_mixte200
+array_mixte200: j --> array_mixte199
+array_mixte199: j --> array_mixte198
+array_mixte198: j --> array_mixte197
+array_mixte197: j --> array_mixte196
+array_mixte196: j --> array_mixte195
+array_mixte195: j --> array_mixte194
+array_mixte194: j --> array_mixte193
+array_mixte193: j --> array_mixte192
+array_mixte192: j --> array_mixte191
+array_mixte191: j --> array_mixte190
+array_mixte190: j --> array_mixte189
+array_mixte189: j --> array_mixte188
+array_mixte188: j --> array_mixte187
+array_mixte187: j --> array_mixte186
+array_mixte186: j --> array_mixte185
+array_mixte185: j --> array_mixte184
+array_mixte184: j --> array_mixte183
+array_mixte183: j --> array_mixte182
+array_mixte182: j --> array_mixte181
+array_mixte181: j --> array_mixte180
+array_mixte180: j --> array_mixte179
+array_mixte179: j --> array_mixte178
+array_mixte178: j --> array_mixte177
+array_mixte177: j --> array_mixte176
+array_mixte176: j --> array_mixte175
+array_mixte175: j --> array_mixte174
+array_mixte174: j --> array_mixte173
+array_mixte173: j --> array_mixte172
+array_mixte172: j --> array_mixte171
+array_mixte171: j --> array_mixte170
+array_mixte170: j --> array_mixte169
+array_mixte169: j --> array_mixte168
+array_mixte168: j --> array_mixte167
+array_mixte167: j --> array_mixte166
+array_mixte166: j --> array_mixte165
+array_mixte165: j --> array_mixte164
+array_mixte164: j --> array_mixte163
+array_mixte163: j --> array_mixte162
+array_mixte162: j --> array_mixte161
+array_mixte161: j --> array_mixte160
+array_mixte160: j --> array_mixte159
+array_mixte159: j --> array_mixte158
+array_mixte158: j --> array_mixte157
+array_mixte157: j --> array_mixte156
+array_mixte156: j --> array_mixte155
+array_mixte155: j --> array_mixte154
+array_mixte154: j --> array_mixte153
+array_mixte153: j --> array_mixte152
+array_mixte152: j --> array_mixte151
+array_mixte151: j --> array_mixte150
+array_mixte150: j --> array_mixte149
+array_mixte149: j --> array_mixte148
+array_mixte148: j --> array_mixte147
+array_mixte147: j --> array_mixte146
+array_mixte146: j --> array_mixte145
+array_mixte145: j --> array_mixte144
+array_mixte144: j --> array_mixte143
+array_mixte143: j --> array_mixte142
+array_mixte142: j --> array_mixte141
+array_mixte141: j --> array_mixte140
+array_mixte140: j --> array_mixte139
+array_mixte139: j --> array_mixte138
+array_mixte138: j --> array_mixte137
+array_mixte137: j --> array_mixte136
+array_mixte136: j --> array_mixte135
+array_mixte135: j --> array_mixte134
+array_mixte134: j --> array_mixte133
+array_mixte133: j --> array_mixte132
+array_mixte132: j --> array_mixte131
+array_mixte131: j --> array_mixte130
+array_mixte130: j --> array_mixte129
+array_mixte129: j --> array_mixte128
+array_mixte128: j --> array_mixte127
+array_mixte127: j --> array_mixte126
+array_mixte126: j --> array_mixte125
+array_mixte125: j --> array_mixte124
+array_mixte124: j --> array_mixte123
+array_mixte123: j --> array_mixte122
+array_mixte122: j --> array_mixte121
+array_mixte121: j --> array_mixte120
+array_mixte120: j --> array_mixte102
+array_mixte102: emit c30 --> array_mixte101
+array_mixte101: li $t0, 0 --> array_mixte100
+array_mixte100: move $a3, $sp --> array_mixte236
+array_mixte236: j --> array_mixte99
+array_mixte99 : j --> array_mixte98
+array_mixte98 : li $v0, 4 --> array_mixte97
+array_mixte97 : mulo $v0, $zero, $v0 --> array_mixte96
+array_mixte96 : add $v0, $a3, $v0 --> array_mixte119
+array_mixte119: lw $t0, 0($v0) --> array_mixte95
+array_mixte95 : emit c29 --> array_mixte94
+array_mixte94 : j --> array_mixte93
+array_mixte93 : move $t0, $sp --> array_mixte248
+array_mixte248: j --> array_mixte92
+array_mixte92 : li $a3, 1 --> array_mixte91
+array_mixte91 : li $v0, 4 --> array_mixte90
+array_mixte90 : mulo $v0, $a3, $v0 --> array_mixte89
+array_mixte89 : add $v0, $t0, $v0 --> array_mixte117
+array_mixte117: lw $zero, 0($v0) --> array_mixte88
+array_mixte88 : emit c28 --> array_mixte87
+array_mixte87 : j --> array_mixte86
+array_mixte86 : move $t0, $sp --> array_mixte247
+array_mixte247: j --> array_mixte85
+array_mixte85 : li $a3, 2 --> array_mixte84
+array_mixte84 : li $v0, 4 --> array_mixte83
+array_mixte83 : mulo $v0, $a3, $v0 --> array_mixte82
+array_mixte82 : add $v0, $t0, $v0 --> array_mixte116
+array_mixte116: lw $zero, 0($v0) --> array_mixte81
+array_mixte81 : emit c27 --> array_mixte80
+array_mixte80 : j --> array_mixte79
+array_mixte79 : move $t0, $sp --> array_mixte246
+array_mixte246: j --> array_mixte78
+array_mixte78 : li $a3, 3 --> array_mixte77
+array_mixte77 : li $v0, 4 --> array_mixte76
+array_mixte76 : mulo $v0, $a3, $v0 --> array_mixte75
+array_mixte75 : add $v0, $t0, $v0 --> array_mixte115
+array_mixte115: lw $zero, 0($v0) --> array_mixte74
+array_mixte74 : emit c26 --> array_mixte73
+array_mixte73 : j --> array_mixte72
+array_mixte72 : move $t0, $sp --> array_mixte245
+array_mixte245: j --> array_mixte71
+array_mixte71 : li $a3, 4 --> array_mixte70
+array_mixte70 : li $v0, 4 --> array_mixte69
+array_mixte69 : mulo $v0, $a3, $v0 --> array_mixte68
+array_mixte68 : add $v0, $t0, $v0 --> array_mixte114
+array_mixte114: lw $zero, 0($v0) --> array_mixte67
+array_mixte67 : emit c25 --> array_mixte66
+array_mixte66 : j --> array_mixte65
+array_mixte65 : move $t0, $sp --> array_mixte244
+array_mixte244: j --> array_mixte64
+array_mixte64 : li $a3, 5 --> array_mixte63
+array_mixte63 : li $v0, 4 --> array_mixte62
+array_mixte62 : mulo $v0, $a3, $v0 --> array_mixte61
+array_mixte61 : add $v0, $t0, $v0 --> array_mixte113
+array_mixte113: lw $zero, 0($v0) --> array_mixte60
+array_mixte60 : emit c24 --> array_mixte59
+array_mixte59 : j --> array_mixte58
+array_mixte58 : move $t0, $sp --> array_mixte243
+array_mixte243: j --> array_mixte57
+array_mixte57 : li $a3, 6 --> array_mixte56
+array_mixte56 : li $v0, 4 --> array_mixte55
+array_mixte55 : mulo $v0, $a3, $v0 --> array_mixte54
+array_mixte54 : add $v0, $t0, $v0 --> array_mixte111
+array_mixte111: lw $zero, 0($v0) --> array_mixte53
+array_mixte53 : emit c23 --> array_mixte52
+array_mixte52 : j --> array_mixte51
+array_mixte51 : move $t0, $sp --> array_mixte242
+array_mixte242: j --> array_mixte50
+array_mixte50 : li $a3, 7 --> array_mixte49
+array_mixte49 : li $v0, 4 --> array_mixte48
+array_mixte48 : mulo $v0, $a3, $v0 --> array_mixte47
+array_mixte47 : add $v0, $t0, $v0 --> array_mixte110
+array_mixte110: lw $zero, 0($v0) --> array_mixte46
+array_mixte46 : emit c22 --> array_mixte45
+array_mixte45 : j --> array_mixte44
+array_mixte44 : move $t0, $sp --> array_mixte241
+array_mixte241: j --> array_mixte43
+array_mixte43 : li $a3, 8 --> array_mixte42
+array_mixte42 : li $v0, 4 --> array_mixte41
+array_mixte41 : mulo $v0, $a3, $v0 --> array_mixte40
+array_mixte40 : add $v0, $t0, $v0 --> array_mixte109
+array_mixte109: lw $zero, 0($v0) --> array_mixte39
+array_mixte39 : emit c21 --> array_mixte38
+array_mixte38 : j --> array_mixte37
+array_mixte37 : move $t0, $sp --> array_mixte239
+array_mixte239: j --> array_mixte36
+array_mixte36 : li $a3, 9 --> array_mixte35
+array_mixte35 : li $v0, 4 --> array_mixte34
+array_mixte34 : mulo $v0, $a3, $v0 --> array_mixte33
+array_mixte33 : add $v0, $t0, $v0 --> array_mixte108
+array_mixte108: lw $zero, 0($v0) --> array_mixte32
+array_mixte32 : emit c20 --> array_mixte31
+array_mixte31 : li $v0, 4 --> array_mixte30
+array_mixte30 : mulo $v0, $a2, $v0 --> array_mixte29
+array_mixte29 : add $v0, $a0, $v0 --> array_mixte107
+array_mixte107: lw $a3, 0($v0) --> array_mixte28
+array_mixte28 : li $v0, 1 --> array_mixte27
+array_mixte27 : add $t0, $a3, $v0 --> array_mixte26
+array_mixte26 : move $a3, $sp --> array_mixte238
+array_mixte238: j --> array_mixte25
+array_mixte25 : li $v0, 4 --> array_mixte24
+array_mixte24 : mulo $v0, $a1, $v0 --> array_mixte23
+array_mixte23 : add $v0, $a3, $v0 --> array_mixte106
+array_mixte106: lw $t0, 0($v0) --> array_mixte22
+array_mixte22 : emit c19 --> array_mixte21
+array_mixte21 : move $a3, $sp --> array_mixte237
+array_mixte237: j --> array_mixte20
+array_mixte20 : j --> array_mixte19
+array_mixte19 : li $v0, 4 --> array_mixte18
+array_mixte18 : mulo $v0, $zero, $v0 --> array_mixte17
+array_mixte17 : add $v0, $a3, $v0 --> array_mixte105
+array_mixte105: lw $a3, 0($v0) --> array_mixte16
+array_mixte16 : li $v0, 4 --> array_mixte15
+array_mixte15 : mulo $v0, $a2, $v0 --> array_mixte14
+array_mixte14 : add $v0, $a0, $v0 --> array_mixte104
+array_mixte104: lw $a3, 0($v0) --> array_mixte13
+array_mixte13 : emit c18 --> array_mixte12
+array_mixte12 : li $a2, 1 --> array_mixte11
+array_mixte11 : li $v0, 4 --> array_mixte10
+array_mixte10 : mulo $v0, $a2, $v0 --> array_mixte9
+array_mixte9 : add $v0, $a0, $v0 --> array_mixte118
+array_mixte118: lw $a2, 0($v0) --> array_mixte8
+array_mixte8 : li $v0, 4 --> array_mixte7
+array_mixte7 : mulo $v0, $a1, $v0 --> array_mixte6
+array_mixte6 : add $v0, $a0, $v0 --> array_mixte112
+array_mixte112: lw $a2, 0($v0) --> array_mixte5
+array_mixte5 : emit c17 --> array_mixte4
+array_mixte4 : j --> array_mixte240
+array_mixte240: j --> array_mixte3
+array_mixte3 : li $v0, 4 --> array_mixte2
+array_mixte2 : mulo $v0, $a1, $v0 --> array_mixte1
+array_mixte1 : add $v0, $sp, $v0 --> array_mixte103
+array_mixte103: lw $v0, 0($v0) --> array_mixte0
+array_mixte0 : j --> array_mixte235
+array_mixte235: j --> array_mixte234
+array_mixte234: j --> array_mixte233
+array_mixte233: j --> array_mixte232
+array_mixte232: j --> array_mixte231
+array_mixte231: j --> array_mixte230
+array_mixte230: j --> array_mixte229
+array_mixte229: j --> array_mixte228
+array_mixte228: j --> array_mixte227
+array_mixte227: j --> array_mixte226
+array_mixte226: j --> array_mixte225
+array_mixte225: delframe --> array_mixte224
+array_mixte224: jr $ra
+
+procedure array_local(0)
+var 40
+entry array_local234
+array_local234: newframe --> array_local233
+array_local233: j --> array_local232
+array_local232: j --> array_local231
+array_local231: j --> array_local230
+array_local230: j --> array_local229
+array_local229: j --> array_local228
+array_local228: j --> array_local227
+array_local227: j --> array_local226
+array_local226: j --> array_local225
+array_local225: j --> array_local224
+array_local224: j --> array_local223
+array_local223: j --> array_local222
+array_local222: j --> array_local221
+array_local221: j --> array_local220
+array_local220: j --> array_local219
+array_local219: j --> array_local218
+array_local218: j --> array_local217
+array_local217: j --> array_local216
+array_local216: j --> array_local215
+array_local215: j --> array_local214
+array_local214: j --> array_local213
+array_local213: j --> array_local212
+array_local212: j --> array_local211
+array_local211: j --> array_local210
+array_local210: j --> array_local209
+array_local209: j --> array_local208
+array_local208: j --> array_local207
+array_local207: j --> array_local206
+array_local206: j --> array_local205
+array_local205: j --> array_local204
+array_local204: j --> array_local203
+array_local203: j --> array_local202
+array_local202: j --> array_local201
+array_local201: j --> array_local200
+array_local200: j --> array_local199
+array_local199: j --> array_local198
+array_local198: j --> array_local197
+array_local197: j --> array_local196
+array_local196: j --> array_local195
+array_local195: j --> array_local194
+array_local194: j --> array_local193
+array_local193: j --> array_local192
+array_local192: j --> array_local191
+array_local191: j --> array_local190
+array_local190: j --> array_local189
+array_local189: j --> array_local188
+array_local188: j --> array_local187
+array_local187: j --> array_local186
+array_local186: j --> array_local185
+array_local185: j --> array_local184
+array_local184: j --> array_local183
+array_local183: j --> array_local182
+array_local182: j --> array_local181
+array_local181: j --> array_local180
+array_local180: j --> array_local179
+array_local179: j --> array_local178
+array_local178: j --> array_local177
+array_local177: j --> array_local176
+array_local176: j --> array_local175
+array_local175: j --> array_local174
+array_local174: j --> array_local173
+array_local173: j --> array_local172
+array_local172: j --> array_local171
+array_local171: j --> array_local170
+array_local170: j --> array_local169
+array_local169: j --> array_local168
+array_local168: j --> array_local167
+array_local167: j --> array_local166
+array_local166: j --> array_local165
+array_local165: j --> array_local164
+array_local164: j --> array_local163
+array_local163: j --> array_local162
+array_local162: j --> array_local161
+array_local161: j --> array_local160
+array_local160: j --> array_local159
+array_local159: j --> array_local158
+array_local158: j --> array_local157
+array_local157: j --> array_local156
+array_local156: j --> array_local155
+array_local155: j --> array_local154
+array_local154: j --> array_local153
+array_local153: j --> array_local152
+array_local152: j --> array_local151
+array_local151: j --> array_local150
+array_local150: j --> array_local149
+array_local149: j --> array_local148
+array_local148: j --> array_local147
+array_local147: j --> array_local146
+array_local146: j --> array_local145
+array_local145: j --> array_local144
+array_local144: j --> array_local143
+array_local143: j --> array_local142
+array_local142: j --> array_local141
+array_local141: j --> array_local140
+array_local140: j --> array_local139
+array_local139: j --> array_local138
+array_local138: j --> array_local137
+array_local137: j --> array_local136
+array_local136: j --> array_local135
+array_local135: j --> array_local134
+array_local134: j --> array_local133
+array_local133: j --> array_local132
+array_local132: j --> array_local131
+array_local131: j --> array_local130
+array_local130: j --> array_local129
+array_local129: j --> array_local128
+array_local128: j --> array_local111
+array_local111: emit c16 --> array_local110
+array_local110: li $a1, 0 --> array_local109
+array_local109: move $a0, $sp --> array_local248
+array_local248: j --> array_local108
+array_local108: j --> array_local107
+array_local107: li $v0, 4 --> array_local106
+array_local106: mulo $v0, $zero, $v0 --> array_local105
+array_local105: add $v0, $a0, $v0 --> array_local112
+array_local112: lw $a1, 0($v0) --> array_local104
+array_local104: emit c15 --> array_local103
+array_local103: j --> array_local102
+array_local102: move $a1, $sp --> array_local247
+array_local247: j --> array_local101
+array_local101: li $a0, 1 --> array_local100
+array_local100: li $v0, 4 --> array_local99
+array_local99 : mulo $v0, $a0, $v0 --> array_local98
+array_local98 : add $v0, $a1, $v0 --> array_local127
+array_local127: lw $zero, 0($v0) --> array_local97
+array_local97 : emit c14 --> array_local96
+array_local96 : j --> array_local95
+array_local95 : move $a1, $sp --> array_local262
+array_local262: j --> array_local94
+array_local94 : li $a0, 2 --> array_local93
+array_local93 : li $v0, 4 --> array_local92
+array_local92 : mulo $v0, $a0, $v0 --> array_local91
+array_local91 : add $v0, $a1, $v0 --> array_local126
+array_local126: lw $zero, 0($v0) --> array_local90
+array_local90 : emit c13 --> array_local89
+array_local89 : j --> array_local88
+array_local88 : move $a1, $sp --> array_local261
+array_local261: j --> array_local87
+array_local87 : li $a0, 3 --> array_local86
+array_local86 : li $v0, 4 --> array_local85
+array_local85 : mulo $v0, $a0, $v0 --> array_local84
+array_local84 : add $v0, $a1, $v0 --> array_local124
+array_local124: lw $zero, 0($v0) --> array_local83
+array_local83 : emit c12 --> array_local82
+array_local82 : j --> array_local81
+array_local81 : move $a1, $sp --> array_local260
+array_local260: j --> array_local80
+array_local80 : li $a0, 4 --> array_local79
+array_local79 : li $v0, 4 --> array_local78
+array_local78 : mulo $v0, $a0, $v0 --> array_local77
+array_local77 : add $v0, $a1, $v0 --> array_local123
+array_local123: lw $zero, 0($v0) --> array_local76
+array_local76 : emit c11 --> array_local75
+array_local75 : j --> array_local74
+array_local74 : move $a1, $sp --> array_local259
+array_local259: j --> array_local73
+array_local73 : li $a0, 5 --> array_local72
+array_local72 : li $v0, 4 --> array_local71
+array_local71 : mulo $v0, $a0, $v0 --> array_local70
+array_local70 : add $v0, $a1, $v0 --> array_local122
+array_local122: lw $zero, 0($v0) --> array_local69
+array_local69 : emit c10 --> array_local68
+array_local68 : j --> array_local67
+array_local67 : move $a1, $sp --> array_local257
+array_local257: j --> array_local66
+array_local66 : li $a0, 6 --> array_local65
+array_local65 : li $v0, 4 --> array_local64
+array_local64 : mulo $v0, $a0, $v0 --> array_local63
+array_local63 : add $v0, $a1, $v0 --> array_local121
+array_local121: lw $zero, 0($v0) --> array_local62
+array_local62 : emit c9 --> array_local61
+array_local61 : j --> array_local60
+array_local60 : move $a1, $sp --> array_local256
+array_local256: j --> array_local59
+array_local59 : li $a0, 7 --> array_local58
+array_local58 : li $v0, 4 --> array_local57
+array_local57 : mulo $v0, $a0, $v0 --> array_local56
+array_local56 : add $v0, $a1, $v0 --> array_local120
+array_local120: lw $zero, 0($v0) --> array_local55
+array_local55 : emit c8 --> array_local54
+array_local54 : j --> array_local53
+array_local53 : move $a1, $sp --> array_local255
+array_local255: j --> array_local52
+array_local52 : li $a0, 8 --> array_local51
+array_local51 : li $v0, 4 --> array_local50
+array_local50 : mulo $v0, $a0, $v0 --> array_local49
+array_local49 : add $v0, $a1, $v0 --> array_local119
+array_local119: lw $zero, 0($v0) --> array_local48
+array_local48 : emit c7 --> array_local47
+array_local47 : j --> array_local46
+array_local46 : move $a1, $sp --> array_local254
+array_local254: j --> array_local45
+array_local45 : li $a0, 9 --> array_local44
+array_local44 : li $v0, 4 --> array_local43
+array_local43 : mulo $v0, $a0, $v0 --> array_local42
+array_local42 : add $v0, $a1, $v0 --> array_local118
+array_local118: lw $zero, 0($v0) --> array_local41
+array_local41 : emit c6 --> array_local40
+array_local40 : li $a1, 1 --> array_local39
+array_local39 : move $a0, $sp --> array_local253
+array_local253: j --> array_local38
+array_local38 : j --> array_local37
+array_local37 : li $v0, 4 --> array_local36
+array_local36 : mulo $v0, $zero, $v0 --> array_local35
+array_local35 : add $v0, $a0, $v0 --> array_local117
+array_local117: lw $a1, 0($v0) --> array_local34
+array_local34 : emit c5 --> array_local33
+array_local33 : li $a2, 5 --> array_local32
+array_local32 : move $a1, $sp --> array_local252
+array_local252: j --> array_local31
+array_local31 : li $a0, 1 --> array_local30
+array_local30 : li $v0, 4 --> array_local29
+array_local29 : mulo $v0, $a0, $v0 --> array_local28
+array_local28 : add $v0, $a1, $v0 --> array_local115
+array_local115: lw $a2, 0($v0) --> array_local27
+array_local27 : emit c4 --> array_local26
+array_local26 : j --> array_local251
+array_local251: j --> array_local25
+array_local25 : j --> array_local24
+array_local24 : j --> array_local23
+array_local23 : j --> array_local22
+array_local22 : j --> array_local114
+array_local114: j --> array_local21
+array_local21 : emit c3 --> array_local20
+array_local20 : li $a2, 7 --> array_local19
+array_local19 : move $a1, $sp --> array_local250
+array_local250: j --> array_local18
+array_local18 : li $a0, 1 --> array_local17
+array_local17 : li $v0, 4 --> array_local16
+array_local16 : mulo $v0, $a0, $v0 --> array_local15
+array_local15 : add $v0, $a1, $v0 --> array_local113
+array_local113: lw $a2, 0($v0) --> array_local14
+array_local14 : emit c2 --> array_local13
+array_local13 : j --> array_local249
+array_local249: j --> array_local12
+array_local12 : li $a0, 1 --> array_local11
+array_local11 : li $v0, 4 --> array_local10
+array_local10 : mulo $v0, $a0, $v0 --> array_local9
+array_local9 : add $v0, $sp, $v0 --> array_local125
+array_local125: lw $v0, 0($v0) --> array_local8
+array_local8 : emit c1 --> array_local7
+array_local7 : j --> array_local258
+array_local258: j --> array_local6
+array_local6 : j --> array_local5
+array_local5 : j --> array_local4
+array_local4 : j --> array_local3
+array_local3 : j --> array_local116
+array_local116: j --> array_local2
+array_local2 : emit c0 --> array_local1
+array_local1 : j --> array_local0
+array_local0 : j --> array_local246
+array_local246: j --> array_local245
+array_local245: j --> array_local244
+array_local244: j --> array_local243
+array_local243: j --> array_local242
+array_local242: j --> array_local241
+array_local241: j --> array_local240
+array_local240: j --> array_local239
+array_local239: j --> array_local238
+array_local238: j --> array_local237
+array_local237: j --> array_local236
+array_local236: delframe --> array_local235
+array_local235: jr $ra
+
+procedure _main(0)
+var 52
+entry main181
+main181: newframe --> main180
+main180: lw $ra, 48($sp) --> main179
+main179: j --> main178
+main178: j --> main177
+main177: j --> main176
+main176: j --> main175
+main175: j --> main174
+main174: j --> main173
+main173: lw $s1, 44($sp) --> main172
+main172: lw $s0, 40($sp) --> main171
+main171: j --> main170
+main170: j --> main169
+main169: j --> main168
+main168: j --> main167
+main167: j --> main166
+main166: j --> main165
+main165: j --> main164
+main164: j --> main163
+main163: j --> main162
+main162: j --> main161
+main161: j --> main160
+main160: j --> main159
+main159: j --> main158
+main158: j --> main157
+main157: j --> main156
+main156: j --> main155
+main155: j --> main154
+main154: j --> main153
+main153: j --> main152
+main152: j --> main151
+main151: j --> main150
+main150: j --> main149
+main149: j --> main148
+main148: j --> main147
+main147: j --> main146
+main146: j --> main145
+main145: j --> main144
+main144: j --> main143
+main143: j --> main142
+main142: j --> main141
+main141: j --> main140
+main140: j --> main139
+main139: j --> main138
+main138: j --> main137
+main137: j --> main136
+main136: j --> main135
+main135: j --> main134
+main134: j --> main133
+main133: j --> main132
+main132: j --> main131
+main131: j --> main130
+main130: j --> main129
+main129: j --> main128
+main128: j --> main127
+main127: j --> main126
+main126: j --> main125
+main125: j --> main124
+main124: j --> main123
+main123: j --> main122
+main122: j --> main121
+main121: j --> main120
+main120: j --> main119
+main119: j --> main118
+main118: j --> main117
+main117: j --> main116
+main116: j --> main115
+main115: j --> main114
+main114: j --> main113
+main113: j --> main112
+main112: j --> main111
+main111: j --> main110
+main110: j --> main109
+main109: j --> main108
+main108: j --> main107
+main107: j --> main106
+main106: j --> main105
+main105: j --> main104
+main104: j --> main103
+main103: j --> main102
+main102: j --> main101
+main101: j --> main100
+main100: j --> main99
+main99 : j --> main85
+main85 : emit c51 --> main84
+main84 : li $a1, 1 --> main83
+main83 : move $a0, $sp --> main205
+main205: j --> main82
+main82 : j --> main81
+main81 : li $v0, 4 --> main80
+main80 : mulo $v0, $zero, $v0 --> main79
+main79 : add $v0, $a0, $v0 --> main97
+main97 : lw $a1, 0($v0) --> main78
+main78 : emit c50 --> main77
+main77 : li $a2, 2 --> main76
+main76 : move $a1, $sp --> main204
+main204: j --> main75
+main75 : li $a0, 1 --> main74
+main74 : li $v0, 4 --> main73
+main73 : mulo $v0, $a0, $v0 --> main72
+main72 : add $v0, $a1, $v0 --> main96
+main96 : lw $a2, 0($v0) --> main71
+main71 : emit c49 --> main70
+main70 : li $a2, 3 --> main69
+main69 : move $a1, $sp --> main202
+main202: j --> main68
+main68 : li $a0, 2 --> main67
+main67 : li $v0, 4 --> main66
+main66 : mulo $v0, $a0, $v0 --> main65
+main65 : add $v0, $a1, $v0 --> main95
+main95 : lw $a2, 0($v0) --> main64
+main64 : emit c48 --> main63
+main63 : li $a2, 4 --> main62
+main62 : move $a1, $sp --> main201
+main201: j --> main61
+main61 : li $a0, 3 --> main60
+main60 : li $v0, 4 --> main59
+main59 : mulo $v0, $a0, $v0 --> main58
+main58 : add $v0, $a1, $v0 --> main94
+main94 : lw $a2, 0($v0) --> main57
+main57 : emit c47 --> main56
+main56 : li $a2, 5 --> main55
+main55 : move $a1, $sp --> main200
+main200: j --> main54
+main54 : li $a0, 4 --> main53
+main53 : li $v0, 4 --> main52
+main52 : mulo $v0, $a0, $v0 --> main51
+main51 : add $v0, $a1, $v0 --> main93
+main93 : lw $a2, 0($v0) --> main50
+main50 : emit c46 --> main49
+main49 : li $a2, 6 --> main48
+main48 : move $a1, $sp --> main199
+main199: j --> main47
+main47 : li $a0, 5 --> main46
+main46 : li $v0, 4 --> main45
+main45 : mulo $v0, $a0, $v0 --> main44
+main44 : add $v0, $a1, $v0 --> main92
+main92 : lw $a2, 0($v0) --> main43
+main43 : emit c45 --> main42
+main42 : li $a2, 7 --> main41
+main41 : move $a1, $sp --> main198
+main198: j --> main40
+main40 : li $a0, 6 --> main39
+main39 : li $v0, 4 --> main38
+main38 : mulo $v0, $a0, $v0 --> main37
+main37 : add $v0, $a1, $v0 --> main90
+main90 : lw $a2, 0($v0) --> main36
+main36 : emit c44 --> main35
+main35 : li $a2, 8 --> main34
+main34 : move $a1, $sp --> main197
+main197: j --> main33
+main33 : li $a0, 7 --> main32
+main32 : li $v0, 4 --> main31
+main31 : mulo $v0, $a0, $v0 --> main30
+main30 : add $v0, $a1, $v0 --> main89
+main89 : lw $a2, 0($v0) --> main29
+main29 : emit c43 --> main28
+main28 : li $a2, 9 --> main27
+main27 : move $a1, $sp --> main196
+main196: j --> main26
+main26 : li $a0, 8 --> main25
+main25 : li $v0, 4 --> main24
+main24 : mulo $v0, $a0, $v0 --> main23
+main23 : add $v0, $a1, $v0 --> main88
+main88 : lw $a2, 0($v0) --> main22
+main22 : emit c42 --> main21
+main21 : j --> main20
+main20 : move $a1, $sp --> main195
+main195: j --> main19
+main19 : li $a0, 9 --> main18
+main18 : li $v0, 4 --> main17
+main17 : mulo $v0, $a0, $v0 --> main16
+main16 : add $v0, $a1, $v0 --> main87
+main87 : lw $zero, 0($v0) --> main15
+main15 : emit c41 --> main14
+main14 : la $v0, array_local --> main86
+main86 : j --> main207
+main207: call $v0 --> main206
+main206: move $s0, $v0 --> main13
+main13 : emit c40 --> main12
+main12 : move $a0, $sp --> main194
+main194: j --> main11
+main11 : li $a1, 2 --> main10
+main10 : li $a2, 3 --> main9
+main9 : la $v0, array_mixte --> main98
+main98 : j --> main217
+main217: j --> main216
+main216: j --> main215
+main215: j --> main214
+main214: call $v0 --> main213
+main213: move $s1, $v0 --> main8
+main8 : emit c39 --> main7
+main7 : move $a0, $sp --> main203
+main203: j --> main6
+main6 : li $a1, 2 --> main5
+main5 : li $a2, 3 --> main4
+main4 : la $v0, array_param --> main91
+main91 : j --> main212
+main212: j --> main211
+main211: j --> main210
+main210: j --> main209
+main209: call $v0 --> main208
+main208: j --> main3
+main3 : emit c38 --> main2
+main2 : add $a0, $s0, $s1 --> main1
+main1 : add $v0, $a0, $v0 --> main0
+main0 : j --> main193
+main193: j --> main192
+main192: lw $ra, 48($sp) --> main191
+main191: j --> main190
+main190: j --> main189
+main189: j --> main188
+main188: j --> main187
+main187: j --> main186
+main186: j --> main185
+main185: lw $s1, 44($sp) --> main184
+main184: lw $s0, 40($sp) --> main183
+main183: delframe --> main182
+main182: jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 0
+
+function array_param(%0; %1; %2) : %7
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31
+entry array_param66
+array_param66: li %3, 0 --> array_param65
+array_param65: li %4, 0 --> array_param64
+array_param64: li %5, 0 --> array_param63
+array_param63: li %6, 0 --> array_param62
+array_param62: li %8, 0 --> array_param61
+array_param61: li %9, 0 --> array_param60
+array_param60: li %10, 0 --> array_param59
+array_param59: li %11, 0 --> array_param58
+array_param58: li %12, 0 --> array_param57
+array_param57: li %13, 0 --> array_param56
+array_param56: li %14, 0 --> array_param55
+array_param55: li %15, 0 --> array_param54
+array_param54: li %16, 0 --> array_param53
+array_param53: li %17, 0 --> array_param52
+array_param52: li %18, 0 --> array_param51
+array_param51: li %19, 0 --> array_param50
+array_param50: li %20, 0 --> array_param49
+array_param49: li %21, 0 --> array_param48
+array_param48: li %22, 0 --> array_param47
+array_param47: li %23, 0 --> array_param46
+array_param46: li %24, 0 --> array_param45
+array_param45: li %25, 0 --> array_param44
+array_param44: li %26, 0 --> array_param43
+array_param43: li %27, 0 --> array_param42
+array_param42: li %28, 0 --> array_param41
+array_param41: li %29, 0 --> array_param40
+array_param40: li %30, 0 --> array_param39
+array_param39: li %31, 0 --> array_param32
+array_param32: emit c37 --> array_param31
+array_param31: li %22, 1 --> array_param30
+array_param30: li %24, 0 --> array_param29
+array_param29: li %25, 4 --> array_param28
+array_param28: mulo %23, %24, %25 --> array_param27
+array_param27: add %29, %0, %23 --> array_param36
+array_param36: sw %22, 0(%29) --> array_param26
+array_param26: emit c36 --> array_param25
+array_param25: li %20, 1 --> array_param24
+array_param24: li %21, 4 --> array_param23
+array_param23: mulo %19, %20, %21 --> array_param22
+array_param22: add %28, %0, %19 --> array_param35
+array_param35: sw %1, 0(%28) --> array_param21
+array_param21: emit c35 --> array_param20
+array_param20: li %17, 0 --> array_param19
+array_param19: li %18, 4 --> array_param18
+array_param18: mulo %16, %17, %18 --> array_param17
+array_param17: add %27, %0, %16 --> array_param34
+array_param34: lw %6, 0(%27) --> array_param16
+array_param16: emit c34 --> array_param15
+array_param15: li %13, 7 --> array_param14
+array_param14: li %15, 4 --> array_param13
+array_param13: mulo %14, %2, %15 --> array_param12
+array_param12: add %26, %0, %14 --> array_param33
+array_param33: sw %13, 0(%26) --> array_param11
+array_param11: emit c33 --> array_param10
+array_param10: li %12, 4 --> array_param9
+array_param9 : mulo %11, %2, %12 --> array_param8
+array_param8 : add %31, %0, %11 --> array_param38
+array_param38: lw %6, 0(%31) --> array_param7
+array_param7 : emit c32 --> array_param6
+array_param6 : li %9, 0 --> array_param5
+array_param5 : li %10, 4 --> array_param4
+array_param4 : mulo %8, %9, %10 --> array_param3
+array_param3 : add %30, %0, %8 --> array_param37
+array_param37: lw %5, 0(%30) --> array_param2
+array_param2 : emit c31 --> array_param1
+array_param1 : move %7, %6 --> array_param0
+array_param0 : return %7
+
+function array_mixte(%0; %1; %2) : %3
+stacksize 40
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78, %79, %80, %81, %82, %83,
+ %84, %85, %86, %87, %88, %89, %90,
+ %91, %92, %93, %94
+entry array_mixte210
+array_mixte210: li %4, 0 --> array_mixte209
+array_mixte209: li %5, 0 --> array_mixte208
+array_mixte208: li %6, 0 --> array_mixte207
+array_mixte207: li %7, 0 --> array_mixte206
+array_mixte206: li %8, 0 --> array_mixte205
+array_mixte205: li %9, 0 --> array_mixte204
+array_mixte204: li %10, 0 --> array_mixte203
+array_mixte203: li %11, 0 --> array_mixte202
+array_mixte202: li %12, 0 --> array_mixte201
+array_mixte201: li %13, 0 --> array_mixte200
+array_mixte200: li %14, 0 --> array_mixte199
+array_mixte199: li %15, 0 --> array_mixte198
+array_mixte198: li %16, 0 --> array_mixte197
+array_mixte197: li %17, 0 --> array_mixte196
+array_mixte196: li %18, 0 --> array_mixte195
+array_mixte195: li %19, 0 --> array_mixte194
+array_mixte194: li %20, 0 --> array_mixte193
+array_mixte193: li %21, 0 --> array_mixte192
+array_mixte192: li %22, 0 --> array_mixte191
+array_mixte191: li %23, 0 --> array_mixte190
+array_mixte190: li %24, 0 --> array_mixte189
+array_mixte189: li %25, 0 --> array_mixte188
+array_mixte188: li %26, 0 --> array_mixte187
+array_mixte187: li %27, 0 --> array_mixte186
+array_mixte186: li %28, 0 --> array_mixte185
+array_mixte185: li %29, 0 --> array_mixte184
+array_mixte184: li %30, 0 --> array_mixte183
+array_mixte183: li %31, 0 --> array_mixte182
+array_mixte182: li %32, 0 --> array_mixte181
+array_mixte181: li %33, 0 --> array_mixte180
+array_mixte180: li %34, 0 --> array_mixte179
+array_mixte179: li %35, 0 --> array_mixte178
+array_mixte178: li %36, 0 --> array_mixte177
+array_mixte177: li %37, 0 --> array_mixte176
+array_mixte176: li %38, 0 --> array_mixte175
+array_mixte175: li %39, 0 --> array_mixte174
+array_mixte174: li %40, 0 --> array_mixte173
+array_mixte173: li %41, 0 --> array_mixte172
+array_mixte172: li %42, 0 --> array_mixte171
+array_mixte171: li %43, 0 --> array_mixte170
+array_mixte170: li %44, 0 --> array_mixte169
+array_mixte169: li %45, 0 --> array_mixte168
+array_mixte168: li %46, 0 --> array_mixte167
+array_mixte167: li %47, 0 --> array_mixte166
+array_mixte166: li %48, 0 --> array_mixte165
+array_mixte165: li %49, 0 --> array_mixte164
+array_mixte164: li %50, 0 --> array_mixte163
+array_mixte163: li %51, 0 --> array_mixte162
+array_mixte162: li %52, 0 --> array_mixte161
+array_mixte161: li %53, 0 --> array_mixte160
+array_mixte160: li %54, 0 --> array_mixte159
+array_mixte159: li %55, 0 --> array_mixte158
+array_mixte158: li %56, 0 --> array_mixte157
+array_mixte157: li %57, 0 --> array_mixte156
+array_mixte156: li %58, 0 --> array_mixte155
+array_mixte155: li %59, 0 --> array_mixte154
+array_mixte154: li %60, 0 --> array_mixte153
+array_mixte153: li %61, 0 --> array_mixte152
+array_mixte152: li %62, 0 --> array_mixte151
+array_mixte151: li %63, 0 --> array_mixte150
+array_mixte150: li %64, 0 --> array_mixte149
+array_mixte149: li %65, 0 --> array_mixte148
+array_mixte148: li %66, 0 --> array_mixte147
+array_mixte147: li %67, 0 --> array_mixte146
+array_mixte146: li %68, 0 --> array_mixte145
+array_mixte145: li %69, 0 --> array_mixte144
+array_mixte144: li %70, 0 --> array_mixte143
+array_mixte143: li %71, 0 --> array_mixte142
+array_mixte142: li %72, 0 --> array_mixte141
+array_mixte141: li %73, 0 --> array_mixte140
+array_mixte140: li %74, 0 --> array_mixte139
+array_mixte139: li %75, 0 --> array_mixte138
+array_mixte138: li %76, 0 --> array_mixte137
+array_mixte137: li %77, 0 --> array_mixte136
+array_mixte136: li %78, 0 --> array_mixte135
+array_mixte135: li %79, 0 --> array_mixte134
+array_mixte134: li %80, 0 --> array_mixte133
+array_mixte133: li %81, 0 --> array_mixte132
+array_mixte132: li %82, 0 --> array_mixte131
+array_mixte131: li %83, 0 --> array_mixte130
+array_mixte130: li %84, 0 --> array_mixte129
+array_mixte129: li %85, 0 --> array_mixte128
+array_mixte128: li %86, 0 --> array_mixte127
+array_mixte127: li %87, 0 --> array_mixte126
+array_mixte126: li %88, 0 --> array_mixte125
+array_mixte125: li %89, 0 --> array_mixte124
+array_mixte124: li %90, 0 --> array_mixte123
+array_mixte123: li %91, 0 --> array_mixte122
+array_mixte122: li %92, 0 --> array_mixte121
+array_mixte121: li %93, 0 --> array_mixte120
+array_mixte120: li %94, 0 --> array_mixte102
+array_mixte102: emit c30 --> array_mixte101
+array_mixte101: li %73, 0 --> array_mixte100
+array_mixte100: addi %74, STACK, 0 --> array_mixte99
+array_mixte99 : li %76, 0 --> array_mixte98
+array_mixte98 : li %77, 4 --> array_mixte97
+array_mixte97 : mulo %75, %76, %77 --> array_mixte96
+array_mixte96 : add %94, %74, %75 --> array_mixte119
+array_mixte119: sw %73, 0(%94) --> array_mixte95
+array_mixte95 : emit c29 --> array_mixte94
+array_mixte94 : li %68, 0 --> array_mixte93
+array_mixte93 : addi %69, STACK, 0 --> array_mixte92
+array_mixte92 : li %71, 1 --> array_mixte91
+array_mixte91 : li %72, 4 --> array_mixte90
+array_mixte90 : mulo %70, %71, %72 --> array_mixte89
+array_mixte89 : add %92, %69, %70 --> array_mixte117
+array_mixte117: sw %68, 0(%92) --> array_mixte88
+array_mixte88 : emit c28 --> array_mixte87
+array_mixte87 : li %63, 0 --> array_mixte86
+array_mixte86 : addi %64, STACK, 0 --> array_mixte85
+array_mixte85 : li %66, 2 --> array_mixte84
+array_mixte84 : li %67, 4 --> array_mixte83
+array_mixte83 : mulo %65, %66, %67 --> array_mixte82
+array_mixte82 : add %91, %64, %65 --> array_mixte116
+array_mixte116: sw %63, 0(%91) --> array_mixte81
+array_mixte81 : emit c27 --> array_mixte80
+array_mixte80 : li %58, 0 --> array_mixte79
+array_mixte79 : addi %59, STACK, 0 --> array_mixte78
+array_mixte78 : li %61, 3 --> array_mixte77
+array_mixte77 : li %62, 4 --> array_mixte76
+array_mixte76 : mulo %60, %61, %62 --> array_mixte75
+array_mixte75 : add %90, %59, %60 --> array_mixte115
+array_mixte115: sw %58, 0(%90) --> array_mixte74
+array_mixte74 : emit c26 --> array_mixte73
+array_mixte73 : li %53, 0 --> array_mixte72
+array_mixte72 : addi %54, STACK, 0 --> array_mixte71
+array_mixte71 : li %56, 4 --> array_mixte70
+array_mixte70 : li %57, 4 --> array_mixte69
+array_mixte69 : mulo %55, %56, %57 --> array_mixte68
+array_mixte68 : add %89, %54, %55 --> array_mixte114
+array_mixte114: sw %53, 0(%89) --> array_mixte67
+array_mixte67 : emit c25 --> array_mixte66
+array_mixte66 : li %48, 0 --> array_mixte65
+array_mixte65 : addi %49, STACK, 0 --> array_mixte64
+array_mixte64 : li %51, 5 --> array_mixte63
+array_mixte63 : li %52, 4 --> array_mixte62
+array_mixte62 : mulo %50, %51, %52 --> array_mixte61
+array_mixte61 : add %88, %49, %50 --> array_mixte113
+array_mixte113: sw %48, 0(%88) --> array_mixte60
+array_mixte60 : emit c24 --> array_mixte59
+array_mixte59 : li %43, 0 --> array_mixte58
+array_mixte58 : addi %44, STACK, 0 --> array_mixte57
+array_mixte57 : li %46, 6 --> array_mixte56
+array_mixte56 : li %47, 4 --> array_mixte55
+array_mixte55 : mulo %45, %46, %47 --> array_mixte54
+array_mixte54 : add %86, %44, %45 --> array_mixte111
+array_mixte111: sw %43, 0(%86) --> array_mixte53
+array_mixte53 : emit c23 --> array_mixte52
+array_mixte52 : li %38, 0 --> array_mixte51
+array_mixte51 : addi %39, STACK, 0 --> array_mixte50
+array_mixte50 : li %41, 7 --> array_mixte49
+array_mixte49 : li %42, 4 --> array_mixte48
+array_mixte48 : mulo %40, %41, %42 --> array_mixte47
+array_mixte47 : add %85, %39, %40 --> array_mixte110
+array_mixte110: sw %38, 0(%85) --> array_mixte46
+array_mixte46 : emit c22 --> array_mixte45
+array_mixte45 : li %33, 0 --> array_mixte44
+array_mixte44 : addi %34, STACK, 0 --> array_mixte43
+array_mixte43 : li %36, 8 --> array_mixte42
+array_mixte42 : li %37, 4 --> array_mixte41
+array_mixte41 : mulo %35, %36, %37 --> array_mixte40
+array_mixte40 : add %84, %34, %35 --> array_mixte109
+array_mixte109: sw %33, 0(%84) --> array_mixte39
+array_mixte39 : emit c21 --> array_mixte38
+array_mixte38 : li %28, 0 --> array_mixte37
+array_mixte37 : addi %29, STACK, 0 --> array_mixte36
+array_mixte36 : li %31, 9 --> array_mixte35
+array_mixte35 : li %32, 4 --> array_mixte34
+array_mixte34 : mulo %30, %31, %32 --> array_mixte33
+array_mixte33 : add %83, %29, %30 --> array_mixte108
+array_mixte108: sw %28, 0(%83) --> array_mixte32
+array_mixte32 : emit c20 --> array_mixte31
+array_mixte31 : li %27, 4 --> array_mixte30
+array_mixte30 : mulo %26, %2, %27 --> array_mixte29
+array_mixte29 : add %82, %0, %26 --> array_mixte107
+array_mixte107: lw %24, 0(%82) --> array_mixte28
+array_mixte28 : li %25, 1 --> array_mixte27
+array_mixte27 : add %20, %24, %25 --> array_mixte26
+array_mixte26 : addi %21, STACK, 0 --> array_mixte25
+array_mixte25 : li %23, 4 --> array_mixte24
+array_mixte24 : mulo %22, %1, %23 --> array_mixte23
+array_mixte23 : add %81, %21, %22 --> array_mixte106
+array_mixte106: sw %20, 0(%81) --> array_mixte22
+array_mixte22 : emit c19 --> array_mixte21
+array_mixte21 : addi %16, STACK, 0 --> array_mixte20
+array_mixte20 : li %18, 0 --> array_mixte19
+array_mixte19 : li %19, 4 --> array_mixte18
+array_mixte18 : mulo %17, %18, %19 --> array_mixte17
+array_mixte17 : add %80, %16, %17 --> array_mixte105
+array_mixte105: lw %13, 0(%80) --> array_mixte16
+array_mixte16 : li %15, 4 --> array_mixte15
+array_mixte15 : mulo %14, %2, %15 --> array_mixte14
+array_mixte14 : add %79, %0, %14 --> array_mixte104
+array_mixte104: sw %13, 0(%79) --> array_mixte13
+array_mixte13 : emit c18 --> array_mixte12
+array_mixte12 : li %11, 1 --> array_mixte11
+array_mixte11 : li %12, 4 --> array_mixte10
+array_mixte10 : mulo %10, %11, %12 --> array_mixte9
+array_mixte9 : add %93, %0, %10 --> array_mixte118
+array_mixte118: lw %7, 0(%93) --> array_mixte8
+array_mixte8 : li %9, 4 --> array_mixte7
+array_mixte7 : mulo %8, %1, %9 --> array_mixte6
+array_mixte6 : add %87, %0, %8 --> array_mixte112
+array_mixte112: sw %7, 0(%87) --> array_mixte5
+array_mixte5 : emit c17 --> array_mixte4
+array_mixte4 : addi %4, STACK, 0 --> array_mixte3
+array_mixte3 : li %6, 4 --> array_mixte2
+array_mixte2 : mulo %5, %1, %6 --> array_mixte1
+array_mixte1 : add %78, %4, %5 --> array_mixte103
+array_mixte103: lw %3, 0(%78) --> array_mixte0
+array_mixte0 : return %3
+
+function array_local() : %4
+stacksize 40
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78, %79, %80, %81, %82, %83,
+ %84, %85, %86, %87, %88, %89, %90,
+ %91, %92, %93, %94, %95, %96, %97
+entry array_local224
+array_local224: li %0, 0 --> array_local223
+array_local223: li %1, 0 --> array_local222
+array_local222: li %2, 0 --> array_local221
+array_local221: li %3, 0 --> array_local220
+array_local220: li %5, 0 --> array_local219
+array_local219: li %6, 0 --> array_local218
+array_local218: li %7, 0 --> array_local217
+array_local217: li %8, 0 --> array_local216
+array_local216: li %9, 0 --> array_local215
+array_local215: li %10, 0 --> array_local214
+array_local214: li %11, 0 --> array_local213
+array_local213: li %12, 0 --> array_local212
+array_local212: li %13, 0 --> array_local211
+array_local211: li %14, 0 --> array_local210
+array_local210: li %15, 0 --> array_local209
+array_local209: li %16, 0 --> array_local208
+array_local208: li %17, 0 --> array_local207
+array_local207: li %18, 0 --> array_local206
+array_local206: li %19, 0 --> array_local205
+array_local205: li %20, 0 --> array_local204
+array_local204: li %21, 0 --> array_local203
+array_local203: li %22, 0 --> array_local202
+array_local202: li %23, 0 --> array_local201
+array_local201: li %24, 0 --> array_local200
+array_local200: li %25, 0 --> array_local199
+array_local199: li %26, 0 --> array_local198
+array_local198: li %27, 0 --> array_local197
+array_local197: li %28, 0 --> array_local196
+array_local196: li %29, 0 --> array_local195
+array_local195: li %30, 0 --> array_local194
+array_local194: li %31, 0 --> array_local193
+array_local193: li %32, 0 --> array_local192
+array_local192: li %33, 0 --> array_local191
+array_local191: li %34, 0 --> array_local190
+array_local190: li %35, 0 --> array_local189
+array_local189: li %36, 0 --> array_local188
+array_local188: li %37, 0 --> array_local187
+array_local187: li %38, 0 --> array_local186
+array_local186: li %39, 0 --> array_local185
+array_local185: li %40, 0 --> array_local184
+array_local184: li %41, 0 --> array_local183
+array_local183: li %42, 0 --> array_local182
+array_local182: li %43, 0 --> array_local181
+array_local181: li %44, 0 --> array_local180
+array_local180: li %45, 0 --> array_local179
+array_local179: li %46, 0 --> array_local178
+array_local178: li %47, 0 --> array_local177
+array_local177: li %48, 0 --> array_local176
+array_local176: li %49, 0 --> array_local175
+array_local175: li %50, 0 --> array_local174
+array_local174: li %51, 0 --> array_local173
+array_local173: li %52, 0 --> array_local172
+array_local172: li %53, 0 --> array_local171
+array_local171: li %54, 0 --> array_local170
+array_local170: li %55, 0 --> array_local169
+array_local169: li %56, 0 --> array_local168
+array_local168: li %57, 0 --> array_local167
+array_local167: li %58, 0 --> array_local166
+array_local166: li %59, 0 --> array_local165
+array_local165: li %60, 0 --> array_local164
+array_local164: li %61, 0 --> array_local163
+array_local163: li %62, 0 --> array_local162
+array_local162: li %63, 0 --> array_local161
+array_local161: li %64, 0 --> array_local160
+array_local160: li %65, 0 --> array_local159
+array_local159: li %66, 0 --> array_local158
+array_local158: li %67, 0 --> array_local157
+array_local157: li %68, 0 --> array_local156
+array_local156: li %69, 0 --> array_local155
+array_local155: li %70, 0 --> array_local154
+array_local154: li %71, 0 --> array_local153
+array_local153: li %72, 0 --> array_local152
+array_local152: li %73, 0 --> array_local151
+array_local151: li %74, 0 --> array_local150
+array_local150: li %75, 0 --> array_local149
+array_local149: li %76, 0 --> array_local148
+array_local148: li %77, 0 --> array_local147
+array_local147: li %78, 0 --> array_local146
+array_local146: li %79, 0 --> array_local145
+array_local145: li %80, 0 --> array_local144
+array_local144: li %81, 0 --> array_local143
+array_local143: li %82, 0 --> array_local142
+array_local142: li %83, 0 --> array_local141
+array_local141: li %84, 0 --> array_local140
+array_local140: li %85, 0 --> array_local139
+array_local139: li %86, 0 --> array_local138
+array_local138: li %87, 0 --> array_local137
+array_local137: li %88, 0 --> array_local136
+array_local136: li %89, 0 --> array_local135
+array_local135: li %90, 0 --> array_local134
+array_local134: li %91, 0 --> array_local133
+array_local133: li %92, 0 --> array_local132
+array_local132: li %93, 0 --> array_local131
+array_local131: li %94, 0 --> array_local130
+array_local130: li %95, 0 --> array_local129
+array_local129: li %96, 0 --> array_local128
+array_local128: li %97, 0 --> array_local111
+array_local111: emit c16 --> array_local110
+array_local110: li %77, 0 --> array_local109
+array_local109: addi %78, STACK, 0 --> array_local108
+array_local108: li %80, 0 --> array_local107
+array_local107: li %81, 4 --> array_local106
+array_local106: mulo %79, %80, %81 --> array_local105
+array_local105: add %82, %78, %79 --> array_local112
+array_local112: sw %77, 0(%82) --> array_local104
+array_local104: emit c15 --> array_local103
+array_local103: li %72, 0 --> array_local102
+array_local102: addi %73, STACK, 0 --> array_local101
+array_local101: li %75, 1 --> array_local100
+array_local100: li %76, 4 --> array_local99
+array_local99 : mulo %74, %75, %76 --> array_local98
+array_local98 : add %97, %73, %74 --> array_local127
+array_local127: sw %72, 0(%97) --> array_local97
+array_local97 : emit c14 --> array_local96
+array_local96 : li %67, 0 --> array_local95
+array_local95 : addi %68, STACK, 0 --> array_local94
+array_local94 : li %70, 2 --> array_local93
+array_local93 : li %71, 4 --> array_local92
+array_local92 : mulo %69, %70, %71 --> array_local91
+array_local91 : add %96, %68, %69 --> array_local126
+array_local126: sw %67, 0(%96) --> array_local90
+array_local90 : emit c13 --> array_local89
+array_local89 : li %62, 0 --> array_local88
+array_local88 : addi %63, STACK, 0 --> array_local87
+array_local87 : li %65, 3 --> array_local86
+array_local86 : li %66, 4 --> array_local85
+array_local85 : mulo %64, %65, %66 --> array_local84
+array_local84 : add %94, %63, %64 --> array_local124
+array_local124: sw %62, 0(%94) --> array_local83
+array_local83 : emit c12 --> array_local82
+array_local82 : li %57, 0 --> array_local81
+array_local81 : addi %58, STACK, 0 --> array_local80
+array_local80 : li %60, 4 --> array_local79
+array_local79 : li %61, 4 --> array_local78
+array_local78 : mulo %59, %60, %61 --> array_local77
+array_local77 : add %93, %58, %59 --> array_local123
+array_local123: sw %57, 0(%93) --> array_local76
+array_local76 : emit c11 --> array_local75
+array_local75 : li %52, 0 --> array_local74
+array_local74 : addi %53, STACK, 0 --> array_local73
+array_local73 : li %55, 5 --> array_local72
+array_local72 : li %56, 4 --> array_local71
+array_local71 : mulo %54, %55, %56 --> array_local70
+array_local70 : add %92, %53, %54 --> array_local122
+array_local122: sw %52, 0(%92) --> array_local69
+array_local69 : emit c10 --> array_local68
+array_local68 : li %47, 0 --> array_local67
+array_local67 : addi %48, STACK, 0 --> array_local66
+array_local66 : li %50, 6 --> array_local65
+array_local65 : li %51, 4 --> array_local64
+array_local64 : mulo %49, %50, %51 --> array_local63
+array_local63 : add %91, %48, %49 --> array_local121
+array_local121: sw %47, 0(%91) --> array_local62
+array_local62 : emit c9 --> array_local61
+array_local61 : li %42, 0 --> array_local60
+array_local60 : addi %43, STACK, 0 --> array_local59
+array_local59 : li %45, 7 --> array_local58
+array_local58 : li %46, 4 --> array_local57
+array_local57 : mulo %44, %45, %46 --> array_local56
+array_local56 : add %90, %43, %44 --> array_local120
+array_local120: sw %42, 0(%90) --> array_local55
+array_local55 : emit c8 --> array_local54
+array_local54 : li %37, 0 --> array_local53
+array_local53 : addi %38, STACK, 0 --> array_local52
+array_local52 : li %40, 8 --> array_local51
+array_local51 : li %41, 4 --> array_local50
+array_local50 : mulo %39, %40, %41 --> array_local49
+array_local49 : add %89, %38, %39 --> array_local119
+array_local119: sw %37, 0(%89) --> array_local48
+array_local48 : emit c7 --> array_local47
+array_local47 : li %32, 0 --> array_local46
+array_local46 : addi %33, STACK, 0 --> array_local45
+array_local45 : li %35, 9 --> array_local44
+array_local44 : li %36, 4 --> array_local43
+array_local43 : mulo %34, %35, %36 --> array_local42
+array_local42 : add %88, %33, %34 --> array_local118
+array_local118: sw %32, 0(%88) --> array_local41
+array_local41 : emit c6 --> array_local40
+array_local40 : li %27, 1 --> array_local39
+array_local39 : addi %28, STACK, 0 --> array_local38
+array_local38 : li %30, 0 --> array_local37
+array_local37 : li %31, 4 --> array_local36
+array_local36 : mulo %29, %30, %31 --> array_local35
+array_local35 : add %87, %28, %29 --> array_local117
+array_local117: sw %27, 0(%87) --> array_local34
+array_local34 : emit c5 --> array_local33
+array_local33 : li %22, 5 --> array_local32
+array_local32 : addi %23, STACK, 0 --> array_local31
+array_local31 : li %25, 1 --> array_local30
+array_local30 : li %26, 4 --> array_local29
+array_local29 : mulo %24, %25, %26 --> array_local28
+array_local28 : add %85, %23, %24 --> array_local115
+array_local115: sw %22, 0(%85) --> array_local27
+array_local27 : emit c4 --> array_local26
+array_local26 : addi %18, STACK, 0 --> array_local25
+array_local25 : li %20, 0 --> array_local24
+array_local24 : li %21, 4 --> array_local23
+array_local23 : mulo %19, %20, %21 --> array_local22
+array_local22 : add %84, %18, %19 --> array_local114
+array_local114: lw %3, 0(%84) --> array_local21
+array_local21 : emit c3 --> array_local20
+array_local20 : li %13, 7 --> array_local19
+array_local19 : addi %14, STACK, 0 --> array_local18
+array_local18 : li %16, 1 --> array_local17
+array_local17 : li %17, 4 --> array_local16
+array_local16 : mulo %15, %16, %17 --> array_local15
+array_local15 : add %83, %14, %15 --> array_local113
+array_local113: sw %13, 0(%83) --> array_local14
+array_local14 : emit c2 --> array_local13
+array_local13 : addi %9, STACK, 0 --> array_local12
+array_local12 : li %11, 1 --> array_local11
+array_local11 : li %12, 4 --> array_local10
+array_local10 : mulo %10, %11, %12 --> array_local9
+array_local9 : add %95, %9, %10 --> array_local125
+array_local125: lw %3, 0(%95) --> array_local8
+array_local8 : emit c1 --> array_local7
+array_local7 : addi %5, STACK, 0 --> array_local6
+array_local6 : li %7, 0 --> array_local5
+array_local5 : li %8, 4 --> array_local4
+array_local4 : mulo %6, %7, %8 --> array_local3
+array_local3 : add %86, %5, %6 --> array_local116
+array_local116: lw %2, 0(%86) --> array_local2
+array_local2 : emit c0 --> array_local1
+array_local1 : move %4, %3 --> array_local0
+array_local0 : return %4
+
+function _main() : %3
+stacksize 40
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73
+entry main171
+main171: li %0, 0 --> main170
+main170: li %1, 0 --> main169
+main169: li %2, 0 --> main168
+main168: li %4, 0 --> main167
+main167: li %5, 0 --> main166
+main166: li %6, 0 --> main165
+main165: li %7, 0 --> main164
+main164: li %8, 0 --> main163
+main163: li %9, 0 --> main162
+main162: li %10, 0 --> main161
+main161: li %11, 0 --> main160
+main160: li %12, 0 --> main159
+main159: li %13, 0 --> main158
+main158: li %14, 0 --> main157
+main157: li %15, 0 --> main156
+main156: li %16, 0 --> main155
+main155: li %17, 0 --> main154
+main154: li %18, 0 --> main153
+main153: li %19, 0 --> main152
+main152: li %20, 0 --> main151
+main151: li %21, 0 --> main150
+main150: li %22, 0 --> main149
+main149: li %23, 0 --> main148
+main148: li %24, 0 --> main147
+main147: li %25, 0 --> main146
+main146: li %26, 0 --> main145
+main145: li %27, 0 --> main144
+main144: li %28, 0 --> main143
+main143: li %29, 0 --> main142
+main142: li %30, 0 --> main141
+main141: li %31, 0 --> main140
+main140: li %32, 0 --> main139
+main139: li %33, 0 --> main138
+main138: li %34, 0 --> main137
+main137: li %35, 0 --> main136
+main136: li %36, 0 --> main135
+main135: li %37, 0 --> main134
+main134: li %38, 0 --> main133
+main133: li %39, 0 --> main132
+main132: li %40, 0 --> main131
+main131: li %41, 0 --> main130
+main130: li %42, 0 --> main129
+main129: li %43, 0 --> main128
+main128: li %44, 0 --> main127
+main127: li %45, 0 --> main126
+main126: li %46, 0 --> main125
+main125: li %47, 0 --> main124
+main124: li %48, 0 --> main123
+main123: li %49, 0 --> main122
+main122: li %50, 0 --> main121
+main121: li %51, 0 --> main120
+main120: li %52, 0 --> main119
+main119: li %53, 0 --> main118
+main118: li %54, 0 --> main117
+main117: li %55, 0 --> main116
+main116: li %56, 0 --> main115
+main115: li %57, 0 --> main114
+main114: li %58, 0 --> main113
+main113: li %59, 0 --> main112
+main112: li %60, 0 --> main111
+main111: li %61, 0 --> main110
+main110: li %62, 0 --> main109
+main109: li %63, 0 --> main108
+main108: li %64, 0 --> main107
+main107: li %65, 0 --> main106
+main106: li %66, 0 --> main105
+main105: li %67, 0 --> main104
+main104: li %68, 0 --> main103
+main103: li %69, 0 --> main102
+main102: li %70, 0 --> main101
+main101: li %71, 0 --> main100
+main100: li %72, 0 --> main99
+main99 : li %73, 0 --> main85
+main85 : emit c51 --> main84
+main84 : li %56, 1 --> main83
+main83 : addi %57, STACK, 0 --> main82
+main82 : li %59, 0 --> main81
+main81 : li %60, 4 --> main80
+main80 : mulo %58, %59, %60 --> main79
+main79 : add %72, %57, %58 --> main97
+main97 : sw %56, 0(%72) --> main78
+main78 : emit c50 --> main77
+main77 : li %51, 2 --> main76
+main76 : addi %52, STACK, 0 --> main75
+main75 : li %54, 1 --> main74
+main74 : li %55, 4 --> main73
+main73 : mulo %53, %54, %55 --> main72
+main72 : add %71, %52, %53 --> main96
+main96 : sw %51, 0(%71) --> main71
+main71 : emit c49 --> main70
+main70 : li %46, 3 --> main69
+main69 : addi %47, STACK, 0 --> main68
+main68 : li %49, 2 --> main67
+main67 : li %50, 4 --> main66
+main66 : mulo %48, %49, %50 --> main65
+main65 : add %70, %47, %48 --> main95
+main95 : sw %46, 0(%70) --> main64
+main64 : emit c48 --> main63
+main63 : li %41, 4 --> main62
+main62 : addi %42, STACK, 0 --> main61
+main61 : li %44, 3 --> main60
+main60 : li %45, 4 --> main59
+main59 : mulo %43, %44, %45 --> main58
+main58 : add %69, %42, %43 --> main94
+main94 : sw %41, 0(%69) --> main57
+main57 : emit c47 --> main56
+main56 : li %36, 5 --> main55
+main55 : addi %37, STACK, 0 --> main54
+main54 : li %39, 4 --> main53
+main53 : li %40, 4 --> main52
+main52 : mulo %38, %39, %40 --> main51
+main51 : add %68, %37, %38 --> main93
+main93 : sw %36, 0(%68) --> main50
+main50 : emit c46 --> main49
+main49 : li %31, 6 --> main48
+main48 : addi %32, STACK, 0 --> main47
+main47 : li %34, 5 --> main46
+main46 : li %35, 4 --> main45
+main45 : mulo %33, %34, %35 --> main44
+main44 : add %67, %32, %33 --> main92
+main92 : sw %31, 0(%67) --> main43
+main43 : emit c45 --> main42
+main42 : li %26, 7 --> main41
+main41 : addi %27, STACK, 0 --> main40
+main40 : li %29, 6 --> main39
+main39 : li %30, 4 --> main38
+main38 : mulo %28, %29, %30 --> main37
+main37 : add %65, %27, %28 --> main90
+main90 : sw %26, 0(%65) --> main36
+main36 : emit c44 --> main35
+main35 : li %21, 8 --> main34
+main34 : addi %22, STACK, 0 --> main33
+main33 : li %24, 7 --> main32
+main32 : li %25, 4 --> main31
+main31 : mulo %23, %24, %25 --> main30
+main30 : add %64, %22, %23 --> main89
+main89 : sw %21, 0(%64) --> main29
+main29 : emit c43 --> main28
+main28 : li %16, 9 --> main27
+main27 : addi %17, STACK, 0 --> main26
+main26 : li %19, 8 --> main25
+main25 : li %20, 4 --> main24
+main24 : mulo %18, %19, %20 --> main23
+main23 : add %63, %17, %18 --> main88
+main88 : sw %16, 0(%63) --> main22
+main22 : emit c42 --> main21
+main21 : li %11, 0 --> main20
+main20 : addi %12, STACK, 0 --> main19
+main19 : li %14, 9 --> main18
+main18 : li %15, 4 --> main17
+main17 : mulo %13, %14, %15 --> main16
+main16 : add %62, %12, %13 --> main87
+main87 : sw %11, 0(%62) --> main15
+main15 : emit c41 --> main14
+main14 : la %61, array_local --> main86
+main86 : call %2, %61() --> main13
+main13 : emit c40 --> main12
+main12 : addi %8, STACK, 0 --> main11
+main11 : li %9, 2 --> main10
+main10 : li %10, 3 --> main9
+main9 : la %73, array_mixte --> main98
+main98 : call %1, %73(%8, %9, %10) --> main8
+main8 : emit c39 --> main7
+main7 : addi %5, STACK, 0 --> main6
+main6 : li %6, 2 --> main5
+main5 : li %7, 3 --> main4
+main4 : la %66, array_param --> main91
+main91 : call %0, %66(%5, %6, %7) --> main3
+main3 : emit c38 --> main2
+main2 : add %4, %2, %1 --> main1
+main1 : add %3, %4, %0 --> main0
+main0 : return %3
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program: (main function is "main")
+
+
+ globals:
+
+
+ "__builtin___memcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memmove_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___mempcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memset_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___stpcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strcat_chk": int -> int -> int -> int
+
+
+ "__builtin___strcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strncat_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___strncpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vfprintf_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vprintf_chk": int -> int -> int -> int
+
+
+ "__builtin___vsnprintf_chk": int -> int -> int -> int -> int -> int -> int
+
+
+ "__builtin___vsprintf_chk": int -> int -> int -> int -> int -> int
+
+
+ "__builtin_acos": float -> float
+
+
+ "__builtin_acosf": float -> float
+
+
+ "__builtin_acosl": float -> float
+
+
+ "__builtin_alloca": int -> int
+
+
+ "__builtin_asin": float -> float
+
+
+ "__builtin_asinf": float -> float
+
+
+ "__builtin_asinl": float -> float
+
+
+ "__builtin_atan": float -> float
+
+
+ "__builtin_atanf": float -> float
+
+
+ "__builtin_atanl": float -> float
+
+
+ "__builtin_atan2": float -> float -> float
+
+
+ "__builtin_atan2f": float -> float -> float
+
+
+ "__builtin_atan2l": float -> float -> float
+
+
+ "__builtin_ceil": float -> float
+
+
+ "__builtin_ceilf": float -> float
+
+
+ "__builtin_ceill": float -> float
+
+
+ "__builtin_cos": float -> float
+
+
+ "__builtin_cosf": float -> float
+
+
+ "__builtin_cosl": float -> float
+
+
+ "__builtin_cosh": float -> float
+
+
+ "__builtin_coshf": float -> float
+
+
+ "__builtin_coshl": float -> float
+
+
+ "__builtin_clz": int -> int
+
+
+ "__builtin_clzl": int -> int
+
+
+ "__builtin_clzll": int -> int
+
+
+ "__builtin_constant_p": int -> int
+
+
+ "__builtin_ctz": int -> int
+
+
+ "__builtin_ctzl": int -> int
+
+
+ "__builtin_ctzll": int -> int
+
+
+ "__builtin_exp": float -> float
+
+
+ "__builtin_expf": float -> float
+
+
+ "__builtin_expl": float -> float
+
+
+ "__builtin_expect": int -> int -> int
+
+
+ "__builtin_fabs": float -> float
+
+
+ "__builtin_fabsf": float -> float
+
+
+ "__builtin_fabsl": float -> float
+
+
+ "__builtin_ffs": int -> int
+
+
+ "__builtin_ffsl": int -> int
+
+
+ "__builtin_ffsll": int -> int
+
+
+ "__builtin_frame_address": int -> int
+
+
+ "__builtin_floor": float -> float
+
+
+ "__builtin_floorf": float -> float
+
+
+ "__builtin_floorl": float -> float
+
+
+ "__builtin_huge_val": float
+
+
+ "__builtin_huge_valf": float
+
+
+ "__builtin_huge_vall": float
+
+
+ "__builtin_inf": float
+
+
+ "__builtin_inff": float
+
+
+ "__builtin_infl": float
+
+
+ "__builtin_memcpy": int -> int -> int -> int
+
+
+ "__builtin_mempcpy": int -> int -> int -> int
+
+
+ "__builtin_fmod": float -> float
+
+
+ "__builtin_fmodf": float -> float
+
+
+ "__builtin_fmodl": float -> float
+
+
+ "__builtin_frexp": float -> int -> float
+
+
+ "__builtin_frexpf": float -> int -> float
+
+
+ "__builtin_frexpl": float -> int -> float
+
+
+ "__builtin_ldexp": float -> int -> float
+
+
+ "__builtin_ldexpf": float -> int -> float
+
+
+ "__builtin_ldexpl": float -> int -> float
+
+
+ "__builtin_log": float -> float
+
+
+ "__builtin_logf": float -> float
+
+
+ "__builtin_logl": float -> float
+
+
+ "__builtin_log10": float -> float
+
+
+ "__builtin_log10f": float -> float
+
+
+ "__builtin_log10l": float -> float
+
+
+ "__builtin_modff": float -> int -> float
+
+
+ "__builtin_modfl": float -> int -> float
+
+
+ "__builtin_nan": int -> float
+
+
+ "__builtin_nanf": int -> float
+
+
+ "__builtin_nanl": int -> float
+
+
+ "__builtin_nans": int -> float
+
+
+ "__builtin_nansf": int -> float
+
+
+ "__builtin_nansl": int -> float
+
+
+ "__builtin_next_arg": int
+
+
+ "__builtin_object_size": int -> int -> int
+
+
+ "__builtin_parity": int -> int
+
+
+ "__builtin_parityl": int -> int
+
+
+ "__builtin_parityll": int -> int
+
+
+ "__builtin_popcount": int -> int
+
+
+ "__builtin_popcountl": int -> int
+
+
+ "__builtin_popcountll": int -> int
+
+
+ "__builtin_powi": float -> int -> float
+
+
+ "__builtin_powif": float -> int -> float
+
+
+ "__builtin_powil": float -> int -> float
+
+
+ "__builtin_return": int -> void
+
+
+ "__builtin_return_address": int -> int
+
+
+ "__builtin_sin": float -> float
+
+
+ "__builtin_sinf": float -> float
+
+
+ "__builtin_sinl": float -> float
+
+
+ "__builtin_sinh": float -> float
+
+
+ "__builtin_sinhf": float -> float
+
+
+ "__builtin_sinhl": float -> float
+
+
+ "__builtin_sqrt": float -> float
+
+
+ "__builtin_sqrtf": float -> float
+
+
+ "__builtin_sqrtl": float -> float
+
+
+ "__builtin_stpcpy": int -> int -> int
+
+
+ "__builtin_strchr": int -> int -> int
+
+
+ "__builtin_strcmp": int -> int -> int
+
+
+ "__builtin_strcpy": int -> int -> int
+
+
+ "__builtin_strcspn": int -> int -> int
+
+
+ "__builtin_strncat": int -> int -> int -> int
+
+
+ "__builtin_strncmp": int -> int -> int -> int
+
+
+ "__builtin_strncpy": int -> int -> int -> int
+
+
+ "__builtin_strspn": int -> int -> int
+
+
+ "__builtin_strpbrk": int -> int -> int
+
+
+ "__builtin_types_compatible_p": int -> int -> int
+
+
+ "__builtin_tan": float -> float
+
+
+ "__builtin_tanf": float -> float
+
+
+ "__builtin_tanl": float -> float
+
+
+ "__builtin_tanh": float -> float
+
+
+ "__builtin_tanhf": float -> float
+
+
+ "__builtin_tanhl": float -> float
+
+
+ "__builtin_va_end": int -> void
+
+
+ "__builtin_varargs_start": int -> void
+
+
+ "__builtin_va_start": int -> int -> void
+
+
+ "__builtin_stdarg_start": int -> void
+
+
+ "__builtin_va_arg": int -> int -> void
+
+
+ "__builtin_va_copy": int -> int -> void
+
+
+ "array_local"(): int
+ locals: %4, %0, %1, %2, %3, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31, %32, %33, %34, %35, %36, %37, %38, %39, %40, %41, %42, %43, %44, %45, %46, %47, %48, %49, %50, %51, %52, %53, %54, %55, %56, %57, %58, %59, %60, %61, %62, %63, %64, %65, %66, %67, %68, %69, %70, %71, %72, %73, %74, %75, %76, %77, %78, %79, %80, %81
+ result: %4
+ stacksize: 40
+ entry: array_local111
+ exit: array_local0
+
+ array_local99: mul %74, %75, %76 --> array_local98
+ array_local98: store int32, add, %73, %74, %72 --> array_local97
+ array_local97: emit c14 --> array_local96
+ array_local96: imm_int 0, %67, --> array_local95
+ array_local95: imm_addr 0($sp), %68, --> array_local94
+ array_local94: imm_int 2, %70, --> array_local93
+ array_local93: imm_int 4, %71, --> array_local92
+ array_local92: mul %69, %70, %71 --> array_local91
+ array_local91: store int32, add, %68, %69, %67 --> array_local90
+ array_local90: emit c13 --> array_local89
+ array_local9: load int32, add, %9, %10, %3 --> array_local8
+ array_local89: imm_int 0, %62, --> array_local88
+ array_local88: imm_addr 0($sp), %63, --> array_local87
+ array_local87: imm_int 3, %65, --> array_local86
+ array_local86: imm_int 4, %66, --> array_local85
+ array_local85: mul %64, %65, %66 --> array_local84
+ array_local84: store int32, add, %63, %64, %62 --> array_local83
+ array_local83: emit c12 --> array_local82
+ array_local82: imm_int 0, %57, --> array_local81
+ array_local81: imm_addr 0($sp), %58, --> array_local80
+ array_local80: imm_int 4, %60, --> array_local79
+ array_local8: emit c1 --> array_local7
+ array_local79: imm_int 4, %61, --> array_local78
+ array_local78: mul %59, %60, %61 --> array_local77
+ array_local77: store int32, add, %58, %59, %57 --> array_local76
+ array_local76: emit c11 --> array_local75
+ array_local75: imm_int 0, %52, --> array_local74
+ array_local74: imm_addr 0($sp), %53, --> array_local73
+ array_local73: imm_int 5, %55, --> array_local72
+ array_local72: imm_int 4, %56, --> array_local71
+ array_local71: mul %54, %55, %56 --> array_local70
+ array_local70: store int32, add, %53, %54, %52 --> array_local69
+ array_local7: imm_addr 0($sp), %5, --> array_local6
+ array_local69: emit c10 --> array_local68
+ array_local68: imm_int 0, %47, --> array_local67
+ array_local67: imm_addr 0($sp), %48, --> array_local66
+ array_local66: imm_int 6, %50, --> array_local65
+ array_local65: imm_int 4, %51, --> array_local64
+ array_local64: mul %49, %50, %51 --> array_local63
+ array_local63: store int32, add, %48, %49, %47 --> array_local62
+ array_local62: emit c9 --> array_local61
+ array_local61: imm_int 0, %42, --> array_local60
+ array_local60: imm_addr 0($sp), %43, --> array_local59
+ array_local6: imm_int 0, %7, --> array_local5
+ array_local59: imm_int 7, %45, --> array_local58
+ array_local58: imm_int 4, %46, --> array_local57
+ array_local57: mul %44, %45, %46 --> array_local56
+ array_local56: store int32, add, %43, %44, %42 --> array_local55
+ array_local55: emit c8 --> array_local54
+ array_local54: imm_int 0, %37, --> array_local53
+ array_local53: imm_addr 0($sp), %38, --> array_local52
+ array_local52: imm_int 8, %40, --> array_local51
+ array_local51: imm_int 4, %41, --> array_local50
+ array_local50: mul %39, %40, %41 --> array_local49
+ array_local5: imm_int 4, %8, --> array_local4
+ array_local49: store int32, add, %38, %39, %37 --> array_local48
+ array_local48: emit c7 --> array_local47
+ array_local47: imm_int 0, %32, --> array_local46
+ array_local46: imm_addr 0($sp), %33, --> array_local45
+ array_local45: imm_int 9, %35, --> array_local44
+ array_local44: imm_int 4, %36, --> array_local43
+ array_local43: mul %34, %35, %36 --> array_local42
+ array_local42: store int32, add, %33, %34, %32 --> array_local41
+ array_local41: emit c6 --> array_local40
+ array_local40: imm_int 1, %27, --> array_local39
+ array_local4: mul %6, %7, %8 --> array_local3
+ array_local39: imm_addr 0($sp), %28, --> array_local38
+ array_local38: imm_int 0, %30, --> array_local37
+ array_local37: imm_int 4, %31, --> array_local36
+ array_local36: mul %29, %30, %31 --> array_local35
+ array_local35: store int32, add, %28, %29, %27 --> array_local34
+ array_local34: emit c5 --> array_local33
+ array_local33: imm_int 5, %22, --> array_local32
+ array_local32: imm_addr 0($sp), %23, --> array_local31
+ array_local31: imm_int 1, %25, --> array_local30
+ array_local30: imm_int 4, %26, --> array_local29
+ array_local3: load int32, add, %5, %6, %2 --> array_local2
+ array_local29: mul %24, %25, %26 --> array_local28
+ array_local28: store int32, add, %23, %24, %22 --> array_local27
+ array_local27: emit c4 --> array_local26
+ array_local26: imm_addr 0($sp), %18, --> array_local25
+ array_local25: imm_int 0, %20, --> array_local24
+ array_local24: imm_int 4, %21, --> array_local23
+ array_local23: mul %19, %20, %21 --> array_local22
+ array_local22: load int32, add, %18, %19, %3 --> array_local21
+ array_local21: emit c3 --> array_local20
+ array_local20: imm_int 7, %13, --> array_local19
+ array_local2: emit c0 --> array_local1
+ array_local19: imm_addr 0($sp), %14, --> array_local18
+ array_local18: imm_int 1, %16, --> array_local17
+ array_local17: imm_int 4, %17, --> array_local16
+ array_local16: mul %15, %16, %17 --> array_local15
+ array_local15: store int32, add, %14, %15, %13 --> array_local14
+ array_local14: emit c2 --> array_local13
+ array_local13: imm_addr 0($sp), %9, --> array_local12
+ array_local12: imm_int 1, %11, --> array_local11
+ array_local111: emit c16 --> array_local110
+ array_local110: imm_int 0, %77, --> array_local109
+ array_local11: imm_int 4, %12, --> array_local10
+ array_local109: imm_addr 0($sp), %78, --> array_local108
+ array_local108: imm_int 0, %80, --> array_local107
+ array_local107: imm_int 4, %81, --> array_local106
+ array_local106: mul %79, %80, %81 --> array_local105
+ array_local105: store int32, add, %78, %79, %77 --> array_local104
+ array_local104: emit c15 --> array_local103
+ array_local103: imm_int 0, %72, --> array_local102
+ array_local102: imm_addr 0($sp), %73, --> array_local101
+ array_local101: imm_int 1, %75, --> array_local100
+ array_local100: imm_int 4, %76, --> array_local99
+ array_local10: mul %10, %11, %12 --> array_local9
+ array_local1: mov %4, %3 --> array_local0
+ array_local0: return %4
+
+
+ "array_mixte"(%0, %1, %2): int -> int -> int -> int
+ locals: %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31, %32, %33, %34, %35, %36, %37, %38, %39, %40, %41, %42, %43, %44, %45, %46, %47, %48, %49, %50, %51, %52, %53, %54, %55, %56, %57, %58, %59, %60, %61, %62, %63, %64, %65, %66, %67, %68, %69, %70, %71, %72, %73, %74, %75, %76, %77
+ result: %3
+ stacksize: 40
+ entry: array_mixte102
+ exit: array_mixte0
+
+ array_mixte99: imm_int 0, %76, --> array_mixte98
+ array_mixte98: imm_int 4, %77, --> array_mixte97
+ array_mixte97: mul %75, %76, %77 --> array_mixte96
+ array_mixte96: store int32, add, %74, %75, %73 --> array_mixte95
+ array_mixte95: emit c29 --> array_mixte94
+ array_mixte94: imm_int 0, %68, --> array_mixte93
+ array_mixte93: imm_addr 0($sp), %69, --> array_mixte92
+ array_mixte92: imm_int 1, %71, --> array_mixte91
+ array_mixte91: imm_int 4, %72, --> array_mixte90
+ array_mixte90: mul %70, %71, %72 --> array_mixte89
+ array_mixte9: load int32, add, %0, %10, %7 --> array_mixte8
+ array_mixte89: store int32, add, %69, %70, %68 --> array_mixte88
+ array_mixte88: emit c28 --> array_mixte87
+ array_mixte87: imm_int 0, %63, --> array_mixte86
+ array_mixte86: imm_addr 0($sp), %64, --> array_mixte85
+ array_mixte85: imm_int 2, %66, --> array_mixte84
+ array_mixte84: imm_int 4, %67, --> array_mixte83
+ array_mixte83: mul %65, %66, %67 --> array_mixte82
+ array_mixte82: store int32, add, %64, %65, %63 --> array_mixte81
+ array_mixte81: emit c27 --> array_mixte80
+ array_mixte80: imm_int 0, %58, --> array_mixte79
+ array_mixte8: imm_int 4, %9, --> array_mixte7
+ array_mixte79: imm_addr 0($sp), %59, --> array_mixte78
+ array_mixte78: imm_int 3, %61, --> array_mixte77
+ array_mixte77: imm_int 4, %62, --> array_mixte76
+ array_mixte76: mul %60, %61, %62 --> array_mixte75
+ array_mixte75: store int32, add, %59, %60, %58 --> array_mixte74
+ array_mixte74: emit c26 --> array_mixte73
+ array_mixte73: imm_int 0, %53, --> array_mixte72
+ array_mixte72: imm_addr 0($sp), %54, --> array_mixte71
+ array_mixte71: imm_int 4, %56, --> array_mixte70
+ array_mixte70: imm_int 4, %57, --> array_mixte69
+ array_mixte7: mul %8, %1, %9 --> array_mixte6
+ array_mixte69: mul %55, %56, %57 --> array_mixte68
+ array_mixte68: store int32, add, %54, %55, %53 --> array_mixte67
+ array_mixte67: emit c25 --> array_mixte66
+ array_mixte66: imm_int 0, %48, --> array_mixte65
+ array_mixte65: imm_addr 0($sp), %49, --> array_mixte64
+ array_mixte64: imm_int 5, %51, --> array_mixte63
+ array_mixte63: imm_int 4, %52, --> array_mixte62
+ array_mixte62: mul %50, %51, %52 --> array_mixte61
+ array_mixte61: store int32, add, %49, %50, %48 --> array_mixte60
+ array_mixte60: emit c24 --> array_mixte59
+ array_mixte6: store int32, add, %0, %8, %7 --> array_mixte5
+ array_mixte59: imm_int 0, %43, --> array_mixte58
+ array_mixte58: imm_addr 0($sp), %44, --> array_mixte57
+ array_mixte57: imm_int 6, %46, --> array_mixte56
+ array_mixte56: imm_int 4, %47, --> array_mixte55
+ array_mixte55: mul %45, %46, %47 --> array_mixte54
+ array_mixte54: store int32, add, %44, %45, %43 --> array_mixte53
+ array_mixte53: emit c23 --> array_mixte52
+ array_mixte52: imm_int 0, %38, --> array_mixte51
+ array_mixte51: imm_addr 0($sp), %39, --> array_mixte50
+ array_mixte50: imm_int 7, %41, --> array_mixte49
+ array_mixte5: emit c17 --> array_mixte4
+ array_mixte49: imm_int 4, %42, --> array_mixte48
+ array_mixte48: mul %40, %41, %42 --> array_mixte47
+ array_mixte47: store int32, add, %39, %40, %38 --> array_mixte46
+ array_mixte46: emit c22 --> array_mixte45
+ array_mixte45: imm_int 0, %33, --> array_mixte44
+ array_mixte44: imm_addr 0($sp), %34, --> array_mixte43
+ array_mixte43: imm_int 8, %36, --> array_mixte42
+ array_mixte42: imm_int 4, %37, --> array_mixte41
+ array_mixte41: mul %35, %36, %37 --> array_mixte40
+ array_mixte40: store int32, add, %34, %35, %33 --> array_mixte39
+ array_mixte4: imm_addr 0($sp), %4, --> array_mixte3
+ array_mixte39: emit c21 --> array_mixte38
+ array_mixte38: imm_int 0, %28, --> array_mixte37
+ array_mixte37: imm_addr 0($sp), %29, --> array_mixte36
+ array_mixte36: imm_int 9, %31, --> array_mixte35
+ array_mixte35: imm_int 4, %32, --> array_mixte34
+ array_mixte34: mul %30, %31, %32 --> array_mixte33
+ array_mixte33: store int32, add, %29, %30, %28 --> array_mixte32
+ array_mixte32: emit c20 --> array_mixte31
+ array_mixte31: imm_int 4, %27, --> array_mixte30
+ array_mixte30: mul %26, %2, %27 --> array_mixte29
+ array_mixte3: imm_int 4, %6, --> array_mixte2
+ array_mixte29: load int32, add, %0, %26, %24 --> array_mixte28
+ array_mixte28: imm_int 1, %25, --> array_mixte27
+ array_mixte27: add %20, %24, %25 --> array_mixte26
+ array_mixte26: imm_addr 0($sp), %21, --> array_mixte25
+ array_mixte25: imm_int 4, %23, --> array_mixte24
+ array_mixte24: mul %22, %1, %23 --> array_mixte23
+ array_mixte23: store int32, add, %21, %22, %20 --> array_mixte22
+ array_mixte22: emit c19 --> array_mixte21
+ array_mixte21: imm_addr 0($sp), %16, --> array_mixte20
+ array_mixte20: imm_int 0, %18, --> array_mixte19
+ array_mixte2: mul %5, %1, %6 --> array_mixte1
+ array_mixte19: imm_int 4, %19, --> array_mixte18
+ array_mixte18: mul %17, %18, %19 --> array_mixte17
+ array_mixte17: load int32, add, %16, %17, %13 --> array_mixte16
+ array_mixte16: imm_int 4, %15, --> array_mixte15
+ array_mixte15: mul %14, %2, %15 --> array_mixte14
+ array_mixte14: store int32, add, %0, %14, %13 --> array_mixte13
+ array_mixte13: emit c18 --> array_mixte12
+ array_mixte12: imm_int 1, %11, --> array_mixte11
+ array_mixte11: imm_int 4, %12, --> array_mixte10
+ array_mixte102: emit c30 --> array_mixte101
+ array_mixte101: imm_int 0, %73, --> array_mixte100
+ array_mixte100: imm_addr 0($sp), %74, --> array_mixte99
+ array_mixte10: mul %10, %11, %12 --> array_mixte9
+ array_mixte1: load int32, add, %4, %5, %3 --> array_mixte0
+ array_mixte0: return %3
+
+
+ "array_param"(%0, %1, %2): int -> int -> int -> int
+ locals: %7, %3, %4, %5, %6, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24, %25
+ result: %7
+ stacksize: 0
+ entry: array_param32
+ exit: array_param0
+
+ array_param9: mul %11, %2, %12 --> array_param8
+ array_param8: load int32, add, %0, %11, %6 --> array_param7
+ array_param7: emit c32 --> array_param6
+ array_param6: imm_int 0, %9, --> array_param5
+ array_param5: imm_int 4, %10, --> array_param4
+ array_param4: mul %8, %9, %10 --> array_param3
+ array_param32: emit c37 --> array_param31
+ array_param31: imm_int 1, %22, --> array_param30
+ array_param30: imm_int 0, %24, --> array_param29
+ array_param3: load int32, add, %0, %8, %5 --> array_param2
+ array_param29: imm_int 4, %25, --> array_param28
+ array_param28: mul %23, %24, %25 --> array_param27
+ array_param27: store int32, add, %0, %23, %22 --> array_param26
+ array_param26: emit c36 --> array_param25
+ array_param25: imm_int 1, %20, --> array_param24
+ array_param24: imm_int 4, %21, --> array_param23
+ array_param23: mul %19, %20, %21 --> array_param22
+ array_param22: store int32, add, %0, %19, %1 --> array_param21
+ array_param21: emit c35 --> array_param20
+ array_param20: imm_int 0, %17, --> array_param19
+ array_param2: emit c31 --> array_param1
+ array_param19: imm_int 4, %18, --> array_param18
+ array_param18: mul %16, %17, %18 --> array_param17
+ array_param17: load int32, add, %0, %16, %6 --> array_param16
+ array_param16: emit c34 --> array_param15
+ array_param15: imm_int 7, %13, --> array_param14
+ array_param14: imm_int 4, %15, --> array_param13
+ array_param13: mul %14, %2, %15 --> array_param12
+ array_param12: store int32, add, %0, %14, %13 --> array_param11
+ array_param11: emit c33 --> array_param10
+ array_param10: imm_int 4, %12, --> array_param9
+ array_param1: mov %7, %6 --> array_param0
+ array_param0: return %7
+
+
+ "main"(): int
+ locals: %3, %0, %1, %2, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31, %32, %33, %34, %35, %36, %37, %38, %39, %40, %41, %42, %43, %44, %45, %46, %47, %48, %49, %50, %51, %52, %53, %54, %55, %56, %57, %58, %59, %60
+ result: %3
+ stacksize: 40
+ entry: main85
+ exit: main0
+
+ main9: call "array_mixte", %8, %9, %10, %1: int -> int -> int -> int --> main8
+ main85: emit c51 --> main84
+ main84: imm_int 1, %56, --> main83
+ main83: imm_addr 0($sp), %57, --> main82
+ main82: imm_int 0, %59, --> main81
+ main81: imm_int 4, %60, --> main80
+ main80: mul %58, %59, %60 --> main79
+ main8: emit c39 --> main7
+ main79: store int32, add, %57, %58, %56 --> main78
+ main78: emit c50 --> main77
+ main77: imm_int 2, %51, --> main76
+ main76: imm_addr 0($sp), %52, --> main75
+ main75: imm_int 1, %54, --> main74
+ main74: imm_int 4, %55, --> main73
+ main73: mul %53, %54, %55 --> main72
+ main72: store int32, add, %52, %53, %51 --> main71
+ main71: emit c49 --> main70
+ main70: imm_int 3, %46, --> main69
+ main7: imm_addr 0($sp), %5, --> main6
+ main69: imm_addr 0($sp), %47, --> main68
+ main68: imm_int 2, %49, --> main67
+ main67: imm_int 4, %50, --> main66
+ main66: mul %48, %49, %50 --> main65
+ main65: store int32, add, %47, %48, %46 --> main64
+ main64: emit c48 --> main63
+ main63: imm_int 4, %41, --> main62
+ main62: imm_addr 0($sp), %42, --> main61
+ main61: imm_int 3, %44, --> main60
+ main60: imm_int 4, %45, --> main59
+ main6: imm_int 2, %6, --> main5
+ main59: mul %43, %44, %45 --> main58
+ main58: store int32, add, %42, %43, %41 --> main57
+ main57: emit c47 --> main56
+ main56: imm_int 5, %36, --> main55
+ main55: imm_addr 0($sp), %37, --> main54
+ main54: imm_int 4, %39, --> main53
+ main53: imm_int 4, %40, --> main52
+ main52: mul %38, %39, %40 --> main51
+ main51: store int32, add, %37, %38, %36 --> main50
+ main50: emit c46 --> main49
+ main5: imm_int 3, %7, --> main4
+ main49: imm_int 6, %31, --> main48
+ main48: imm_addr 0($sp), %32, --> main47
+ main47: imm_int 5, %34, --> main46
+ main46: imm_int 4, %35, --> main45
+ main45: mul %33, %34, %35 --> main44
+ main44: store int32, add, %32, %33, %31 --> main43
+ main43: emit c45 --> main42
+ main42: imm_int 7, %26, --> main41
+ main41: imm_addr 0($sp), %27, --> main40
+ main40: imm_int 6, %29, --> main39
+ main4: call "array_param", %5, %6, %7, %0: int -> int -> int -> int --> main3
+ main39: imm_int 4, %30, --> main38
+ main38: mul %28, %29, %30 --> main37
+ main37: store int32, add, %27, %28, %26 --> main36
+ main36: emit c44 --> main35
+ main35: imm_int 8, %21, --> main34
+ main34: imm_addr 0($sp), %22, --> main33
+ main33: imm_int 7, %24, --> main32
+ main32: imm_int 4, %25, --> main31
+ main31: mul %23, %24, %25 --> main30
+ main30: store int32, add, %22, %23, %21 --> main29
+ main3: emit c38 --> main2
+ main29: emit c43 --> main28
+ main28: imm_int 9, %16, --> main27
+ main27: imm_addr 0($sp), %17, --> main26
+ main26: imm_int 8, %19, --> main25
+ main25: imm_int 4, %20, --> main24
+ main24: mul %18, %19, %20 --> main23
+ main23: store int32, add, %17, %18, %16 --> main22
+ main22: emit c42 --> main21
+ main21: imm_int 0, %11, --> main20
+ main20: imm_addr 0($sp), %12, --> main19
+ main2: add %4, %2, %1 --> main1
+ main19: imm_int 9, %14, --> main18
+ main18: imm_int 4, %15, --> main17
+ main17: mul %13, %14, %15 --> main16
+ main16: store int32, add, %12, %13, %11 --> main15
+ main15: emit c41 --> main14
+ main14: call "array_local", , %2: int --> main13
+ main13: emit c40 --> main12
+ main12: imm_addr 0($sp), %8, --> main11
+ main11: imm_int 2, %9, --> main10
+ main10: imm_int 3, %10, --> main9
+ main1: add %3, %4, %0 --> main0
+ main0: return %3
+
+
--- /dev/null
+int array_local () {\r
+ int i,j,a,b;\r
+ int tab[10] = {0,0,0,0,0,0,0,0,0,0};\r
+ \r
+ tab[0]=1; //Ecriture\r
+ tab[1]=5;\r
+ \r
+ a=tab[0]; //Lecture & Ecriture\r
+ tab[1]=7;\r
+ \r
+ a=tab[1]; //Lecture\r
+ b=tab[0];\r
+ \r
+ return a;//7\r
+}\r
+\r
+int array_mixte (int tab1[], int a, int b) {\r
+ int tab2[10] = {0,0,0,0,0,0,0,0,0,0};\r
+ \r
+ tab2[a] = tab1[b]+1;\r
+ tab1[b] = tab2[0];\r
+ tab1[a] = tab1[1];\r
+ return tab2[a];//5\r
+}\r
+\r
+int array_param (int tab[], int c, int d) {\r
+ int i,j,a,b;\r
+ \r
+ tab[0]=1; //Ecriture\r
+ tab[1]=c;\r
+ \r
+ a=tab[0]; //Lecture & Ecriture\r
+ tab[d]=7;\r
+ \r
+ a=tab[d]; //Lecture\r
+ b=tab[0];\r
+ \r
+ return a;//7\r
+}\r
+\r
+int main(){\r
+ int t[10] = {1,2,3,4,5,6,7,8,9,0}; \r
+ int a = array_local();\r
+ int b = array_mixte(t,2,3);\r
+ int c = array_param(t,2,3);\r
+ return a+b+c; //19\r
+ // return b;\r
+}\r
--- /dev/null
+int array_local () {\r
+ int i,j,a,b;\r
+ int tab[10] = {0,0,0,0,0,0,0,0,0,0};\r
+ \r
+ tab[0]=1; //Ecriture\r
+ tab[1]=5;\r
+ \r
+ a=tab[0]; //Lecture & Ecriture\r
+ tab[1]=7;\r
+ \r
+ a=tab[1]; //Lecture\r
+ b=tab[0];\r
+ \r
+ return a;//7\r
+}\r
+\r
+int array_mixte (int tab1[], int a, int b) {\r
+ int tab2[10] = {0,0,0,0,0,0,0,0,0,0};\r
+ \r
+ tab2[a] = tab1[b]+1;\r
+ tab1[b] = tab2[0];\r
+ tab1[a] = tab1[1];\r
+ return tab2[a];//5\r
+}\r
+\r
+int array_param (int tab[], int c, int d) {\r
+ int i,j,a,b;\r
+ \r
+ tab[0]=1; //Ecriture\r
+ tab[1]=c;\r
+ \r
+ a=tab[0]; //Lecture & Ecriture\r
+ tab[d]=7;\r
+ \r
+ a=tab[d]; //Lecture\r
+ b=tab[0];\r
+ \r
+ return a;//7\r
+}\r
+\r
+main(){\r
+ int t[10] = {1,2,3,4,5,6,7,8,9,0}; \r
+ int a = array_local();\r
+ int b = array_mixte(t,2,3);\r
+ int c = array_param(t,2,3);\r
+ return a+b+c; //19\r
+ //return b;\r
+}\r
--- /dev/null
+Global Error (Translation RTLabs -> RTL):
+ Constant not supported.
--- /dev/null
+# extern __builtin_varargs_start: int -> void
+# extern __builtin_va_start: int -> int -> void
+# extern __builtin_va_end: int -> void
+# extern __builtin_va_copy: int -> int -> void
+# extern __builtin_va_arg: int -> int -> void
+# extern __builtin_types_compatible_p: int -> int -> int
+# extern __builtin_tanl: float -> float
+# extern __builtin_tanhl: float -> float
+# extern __builtin_tanhf: float -> float
+# extern __builtin_tanh: float -> float
+# extern __builtin_tanf: float -> float
+# extern __builtin_tan: float -> float
+# extern __builtin_strspn: int -> int -> int
+# extern __builtin_strpbrk: int -> int -> int
+# extern __builtin_strncpy: int -> int -> int -> int
+# extern __builtin_strncmp: int -> int -> int -> int
+# extern __builtin_strncat: int -> int -> int -> int
+# extern __builtin_strcspn: int -> int -> int
+# extern __builtin_strcpy: int -> int -> int
+# extern __builtin_strcmp: int -> int -> int
+# extern __builtin_strchr: int -> int -> int
+# extern __builtin_stpcpy: int -> int -> int
+# extern __builtin_stdarg_start: int -> void
+# extern __builtin_sqrtl: float -> float
+# extern __builtin_sqrtf: float -> float
+# extern __builtin_sqrt: float -> float
+# extern __builtin_sinl: float -> float
+# extern __builtin_sinhl: float -> float
+# extern __builtin_sinhf: float -> float
+# extern __builtin_sinh: float -> float
+# extern __builtin_sinf: float -> float
+# extern __builtin_sin: float -> float
+# extern __builtin_return_address: int -> int
+# extern __builtin_return: int -> void
+# extern __builtin_powil: float -> int -> float
+# extern __builtin_powif: float -> int -> float
+# extern __builtin_powi: float -> int -> float
+# extern __builtin_popcountll: int -> int
+# extern __builtin_popcountl: int -> int
+# extern __builtin_popcount: int -> int
+# extern __builtin_parityll: int -> int
+# extern __builtin_parityl: int -> int
+# extern __builtin_parity: int -> int
+# extern __builtin_object_size: int -> int -> int
+# extern __builtin_next_arg: int
+# extern __builtin_nansl: int -> float
+# extern __builtin_nansf: int -> float
+# extern __builtin_nans: int -> float
+# extern __builtin_nanl: int -> float
+# extern __builtin_nanf: int -> float
+# extern __builtin_nan: int -> float
+# extern __builtin_modfl: float -> int -> float
+# extern __builtin_modff: float -> int -> float
+# extern __builtin_mempcpy: int -> int -> int -> int
+# extern __builtin_memcpy: int -> int -> int -> int
+# extern __builtin_logl: float -> float
+# extern __builtin_logf: float -> float
+# extern __builtin_log10l: float -> float
+# extern __builtin_log10f: float -> float
+# extern __builtin_log10: float -> float
+# extern __builtin_log: float -> float
+# extern __builtin_ldexpl: float -> int -> float
+# extern __builtin_ldexpf: float -> int -> float
+# extern __builtin_ldexp: float -> int -> float
+# extern __builtin_infl: float
+# extern __builtin_inff: float
+# extern __builtin_inf: float
+# extern __builtin_huge_vall: float
+# extern __builtin_huge_valf: float
+# extern __builtin_huge_val: float
+# extern __builtin_frexpl: float -> int -> float
+# extern __builtin_frexpf: float -> int -> float
+# extern __builtin_frexp: float -> int -> float
+# extern __builtin_frame_address: int -> int
+# extern __builtin_fmodl: float -> float
+# extern __builtin_fmodf: float -> float
+# extern __builtin_fmod: float -> float
+# extern __builtin_floorl: float -> float
+# extern __builtin_floorf: float -> float
+# extern __builtin_floor: float -> float
+# extern __builtin_ffsll: int -> int
+# extern __builtin_ffsl: int -> int
+# extern __builtin_ffs: int -> int
+# extern __builtin_fabsl: float -> float
+# extern __builtin_fabsf: float -> float
+# extern __builtin_fabs: float -> float
+# extern __builtin_expl: float -> float
+# extern __builtin_expf: float -> float
+# extern __builtin_expect: int -> int -> int
+# extern __builtin_exp: float -> float
+# extern __builtin_ctzll: int -> int
+# extern __builtin_ctzl: int -> int
+# extern __builtin_ctz: int -> int
+# extern __builtin_cosl: float -> float
+# extern __builtin_coshl: float -> float
+# extern __builtin_coshf: float -> float
+# extern __builtin_cosh: float -> float
+# extern __builtin_cosf: float -> float
+# extern __builtin_cos: float -> float
+# extern __builtin_constant_p: int -> int
+# extern __builtin_clzll: int -> int
+# extern __builtin_clzl: int -> int
+# extern __builtin_clz: int -> int
+# extern __builtin_ceill: float -> float
+# extern __builtin_ceilf: float -> float
+# extern __builtin_ceil: float -> float
+# extern __builtin_atanl: float -> float
+# extern __builtin_atanf: float -> float
+# extern __builtin_atan2l: float -> float -> float
+# extern __builtin_atan2f: float -> float -> float
+# extern __builtin_atan2: float -> float -> float
+# extern __builtin_atan: float -> float
+# extern __builtin_asinl: float -> float
+# extern __builtin_asinf: float -> float
+# extern __builtin_asin: float -> float
+# extern __builtin_alloca: int -> int
+# extern __builtin_acosl: float -> float
+# extern __builtin_acosf: float -> float
+# extern __builtin_acos: float -> float
+# extern __builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+# extern __builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+# extern __builtin___vprintf_chk: int -> int -> int -> int
+# extern __builtin___vfprintf_chk: int -> int -> int -> int -> int
+# extern __builtin___strncpy_chk: int -> int -> int -> int -> int
+# extern __builtin___strncat_chk: int -> int -> int -> int -> int
+# extern __builtin___strcpy_chk: int -> int -> int -> int
+# extern __builtin___strcat_chk: int -> int -> int -> int
+# extern __builtin___stpcpy_chk: int -> int -> int -> int
+# extern __builtin___memset_chk: int -> int -> int -> int -> int
+# extern __builtin___mempcpy_chk: int -> int -> int -> int -> int
+# extern __builtin___memmove_chk: int -> int -> int -> int -> int
+# extern __builtin___memcpy_chk: int -> int -> int -> int -> int
+
+# begin preamble
+.data
+globals:
+.space 0
+nl:
+.asciiz "\n"
+.align 2
+.text
+main:
+la $gp, globals
+j main57
+print_int:
+li $v0, 1
+syscall
+jr $ra
+print_intln:
+li $v0, 1
+syscall
+la $a0, nl
+li $v0, 4
+syscall
+jr $ra
+scan_int:
+li $v0, 5
+syscall
+jr $ra
+alloc:
+li $v0, 9
+syscall
+jr $ra
+
+pow2:
+li $v0, 1
+sllv $v0, $v0, $a0
+jr $ra
+
+mod:
+beqz $a0, mod0
+beqz $a1, mod0
+li $t2, 0
+mod_t0:
+bgtz $a0, mod_a0_pos
+neg $t0, $a0
+addi $t2, $t2, 1
+j mod_t1
+mod_a0_pos:
+move $t0, $a0
+mod_t1:
+bgtz $a1, mod_a1_pos
+neg $t1, $a1
+addi $t2, $t2, 2
+j mod_main
+mod_a1_pos:
+move $t1, $a1
+mod_main:
+rem $v0, $t0, $t1
+beqz $t2, mod_exit
+addi $t2, -1
+beqz $t2, mod_case1
+addi $t2, -1
+beqz $t2, mod_case2
+neg $v0, $v0
+j mod_exit
+mod_case1:
+sub $v0, $a1, $v0
+j mod_exit
+mod_case2:
+add $v0, $a1, $v0
+j mod_exit
+mod0:
+li $v0, 0
+mod_exit:
+jr $ra
+
+toint:
+# $a0: size
+# $a1: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+jal pow2
+move $a0, $a1
+move $a1, $v0
+jal mod
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 8
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 16
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+sign_ext:
+# $a0: size
+# $a1: int to extend
+li $v0, 32
+sub $a0, $v0, $a0
+sllv $v0, $a1, $a0
+srav $v0, $v0, $a0
+jr $ra
+
+ofint:
+# $a0: signedness
+# $a1: size
+# $a2: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+beqz $a0, ofint_unsigned
+move $a0, $a1
+move $a1, $a2
+jal sign_ext
+j ofint_exit
+ofint_unsigned:
+move $v0, $a2
+ofint_exit:
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+# end preamble
+
+
+# begin _main
+main57:
+addi $sp, $sp, -12
+sw $ra, 8($sp)
+sw $s1, 4($sp)
+sw $s0, 0($sp)
+c20:
+li $s0, 4
+c19:
+li $s1, 5
+c18:
+c17:
+c16:
+c15:
+c14:
+c13:
+c12:
+la $v0, mod
+move $a0, $s0
+move $a1, $s1
+jalr $v0
+c11:
+c10:
+c9:
+c8:
+c7:
+c6:
+c5:
+c4:
+c3:
+c2:
+c1:
+sge $v0, $s0, $s1
+c0:
+lw $ra, 8($sp)
+lw $s1, 4($sp)
+lw $s0, 0($sp)
+addi $sp, $sp, 12
+jr $ra
+# end _main
--- /dev/null
+extern void *__builtin___memcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memmove_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___mempcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memset_chk(void *, int, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___stpcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcat_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strncat_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___strncpy_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern int __builtin___vfprintf_chk(void *, int, unsigned char *, void *);
+
+extern int __builtin___vprintf_chk(int, unsigned char *, void *);
+
+extern int __builtin___vsnprintf_chk(unsigned char *, unsigned int, int, unsigned int, unsigned char *, void *);
+
+extern int __builtin___vsprintf_chk(unsigned char *, int, unsigned int, unsigned char *, void *);
+
+extern double __builtin_acos(double);
+
+extern float __builtin_acosf(float);
+
+extern double __builtin_acosl(double);
+
+extern void *__builtin_alloca(unsigned int);
+
+extern double __builtin_asin(double);
+
+extern float __builtin_asinf(float);
+
+extern double __builtin_asinl(double);
+
+extern double __builtin_atan(double);
+
+extern float __builtin_atanf(float);
+
+extern double __builtin_atanl(double);
+
+extern double __builtin_atan2(double, double);
+
+extern float __builtin_atan2f(float, float);
+
+extern double __builtin_atan2l(double, double);
+
+extern double __builtin_ceil(double);
+
+extern float __builtin_ceilf(float);
+
+extern double __builtin_ceill(double);
+
+extern double __builtin_cos(double);
+
+extern float __builtin_cosf(float);
+
+extern double __builtin_cosl(double);
+
+extern double __builtin_cosh(double);
+
+extern float __builtin_coshf(float);
+
+extern double __builtin_coshl(double);
+
+extern int __builtin_clz(unsigned int);
+
+extern int __builtin_clzl(unsigned int);
+
+extern int __builtin_clzll(unsigned int);
+
+extern int __builtin_constant_p(int);
+
+extern int __builtin_ctz(unsigned int);
+
+extern int __builtin_ctzl(unsigned int);
+
+extern int __builtin_ctzll(unsigned int);
+
+extern double __builtin_exp(double);
+
+extern float __builtin_expf(float);
+
+extern double __builtin_expl(double);
+
+extern int __builtin_expect(int, int);
+
+extern double __builtin_fabs(double);
+
+extern float __builtin_fabsf(float);
+
+extern double __builtin_fabsl(double);
+
+extern int __builtin_ffs(unsigned int);
+
+extern int __builtin_ffsl(unsigned int);
+
+extern int __builtin_ffsll(unsigned int);
+
+extern void *__builtin_frame_address(unsigned int);
+
+extern double __builtin_floor(double);
+
+extern float __builtin_floorf(float);
+
+extern double __builtin_floorl(double);
+
+extern double __builtin_huge_val(void);
+
+extern float __builtin_huge_valf(void);
+
+extern double __builtin_huge_vall(void);
+
+extern double __builtin_inf(void);
+
+extern float __builtin_inff(void);
+
+extern double __builtin_infl(void);
+
+extern void *__builtin_memcpy(void *, void *, unsigned int);
+
+extern void *__builtin_mempcpy(void *, void *, unsigned int);
+
+extern double __builtin_fmod(double);
+
+extern float __builtin_fmodf(float);
+
+extern double __builtin_fmodl(double);
+
+extern double __builtin_frexp(double, int *);
+
+extern float __builtin_frexpf(float, int *);
+
+extern double __builtin_frexpl(double, int *);
+
+extern double __builtin_ldexp(double, int);
+
+extern float __builtin_ldexpf(float, int);
+
+extern double __builtin_ldexpl(double, int);
+
+extern double __builtin_log(double);
+
+extern float __builtin_logf(float);
+
+extern double __builtin_logl(double);
+
+extern double __builtin_log10(double);
+
+extern float __builtin_log10f(float);
+
+extern double __builtin_log10l(double);
+
+extern float __builtin_modff(float, float *);
+
+extern double __builtin_modfl(double, double *);
+
+extern double __builtin_nan(unsigned char *);
+
+extern float __builtin_nanf(unsigned char *);
+
+extern double __builtin_nanl(unsigned char *);
+
+extern double __builtin_nans(unsigned char *);
+
+extern float __builtin_nansf(unsigned char *);
+
+extern double __builtin_nansl(unsigned char *);
+
+extern void *__builtin_next_arg(void);
+
+extern unsigned int __builtin_object_size(void *, int);
+
+extern int __builtin_parity(unsigned int);
+
+extern int __builtin_parityl(unsigned int);
+
+extern int __builtin_parityll(unsigned int);
+
+extern int __builtin_popcount(unsigned int);
+
+extern int __builtin_popcountl(unsigned int);
+
+extern int __builtin_popcountll(unsigned int);
+
+extern double __builtin_powi(double, int);
+
+extern float __builtin_powif(float, int);
+
+extern double __builtin_powil(double, int);
+
+extern void __builtin_return(void *);
+
+extern void *__builtin_return_address(unsigned int);
+
+extern double __builtin_sin(double);
+
+extern float __builtin_sinf(float);
+
+extern double __builtin_sinl(double);
+
+extern double __builtin_sinh(double);
+
+extern float __builtin_sinhf(float);
+
+extern double __builtin_sinhl(double);
+
+extern double __builtin_sqrt(double);
+
+extern float __builtin_sqrtf(float);
+
+extern double __builtin_sqrtl(double);
+
+extern unsigned char *__builtin_stpcpy(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strchr(unsigned char *, unsigned char);
+
+extern int __builtin_strcmp(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strcpy(unsigned char *, unsigned char *);
+
+extern unsigned int __builtin_strcspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strncat(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strncmp(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin_strncpy(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strpbrk(unsigned char *, unsigned char *);
+
+extern int __builtin_types_compatible_p(unsigned int, unsigned int);
+
+extern double __builtin_tan(double);
+
+extern float __builtin_tanf(float);
+
+extern double __builtin_tanl(double);
+
+extern double __builtin_tanh(double);
+
+extern float __builtin_tanhf(float);
+
+extern double __builtin_tanhl(double);
+
+extern void __builtin_va_end(void *);
+
+extern void __builtin_varargs_start(void *);
+
+extern void __builtin_va_start(void *, void *);
+
+extern void __builtin_stdarg_start(void *);
+
+extern void __builtin_va_arg(void *, unsigned int);
+
+extern void __builtin_va_copy(void *, void *);
+
+int main(void)
+{
+ int a;
+ int b;
+ int c;
+ c20:
+ a = 4;
+ c19:
+ b = 5;
+ c18:
+ c = a;
+ c17:
+ c = 10;
+ c16:
+ c = a + b;
+ c15:
+ c = a - b;
+ c14:
+ c = a * b;
+ c13:
+ c = a / b;
+ c12:
+ c = a % b;
+ c11:
+ c = a & b;
+ c10:
+ c = a | b;
+ c9:
+ c = a << b;
+ c8:
+ c = a >> b;
+ c7:
+ c = a ^ b;
+ c6:
+ c = a < b;
+ c5:
+ c = a > b;
+ c4:
+ c = a == b;
+ c3:
+ c = a != b;
+ c2:
+ c = a <= b;
+ c1:
+ c = a >= b;
+ c0:
+ return c;
+}
+
+
--- /dev/null
+
+
+
+extern "__builtin___memcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memmove_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___mempcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memset_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___stpcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcat_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strncat_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___strncpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vfprintf_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vprintf_chk" : int -> int -> int -> int
+
+
+extern "__builtin___vsnprintf_chk" : int -> int -> int -> int -> int -> int -> int
+
+
+extern "__builtin___vsprintf_chk" : int -> int -> int -> int -> int -> int
+
+
+extern "__builtin_acos" : float -> float
+
+
+extern "__builtin_acosf" : float -> float
+
+
+extern "__builtin_acosl" : float -> float
+
+
+extern "__builtin_alloca" : int -> int
+
+
+extern "__builtin_asin" : float -> float
+
+
+extern "__builtin_asinf" : float -> float
+
+
+extern "__builtin_asinl" : float -> float
+
+
+extern "__builtin_atan" : float -> float
+
+
+extern "__builtin_atanf" : float -> float
+
+
+extern "__builtin_atanl" : float -> float
+
+
+extern "__builtin_atan2" : float -> float -> float
+
+
+extern "__builtin_atan2f" : float -> float -> float
+
+
+extern "__builtin_atan2l" : float -> float -> float
+
+
+extern "__builtin_ceil" : float -> float
+
+
+extern "__builtin_ceilf" : float -> float
+
+
+extern "__builtin_ceill" : float -> float
+
+
+extern "__builtin_cos" : float -> float
+
+
+extern "__builtin_cosf" : float -> float
+
+
+extern "__builtin_cosl" : float -> float
+
+
+extern "__builtin_cosh" : float -> float
+
+
+extern "__builtin_coshf" : float -> float
+
+
+extern "__builtin_coshl" : float -> float
+
+
+extern "__builtin_clz" : int -> int
+
+
+extern "__builtin_clzl" : int -> int
+
+
+extern "__builtin_clzll" : int -> int
+
+
+extern "__builtin_constant_p" : int -> int
+
+
+extern "__builtin_ctz" : int -> int
+
+
+extern "__builtin_ctzl" : int -> int
+
+
+extern "__builtin_ctzll" : int -> int
+
+
+extern "__builtin_exp" : float -> float
+
+
+extern "__builtin_expf" : float -> float
+
+
+extern "__builtin_expl" : float -> float
+
+
+extern "__builtin_expect" : int -> int -> int
+
+
+extern "__builtin_fabs" : float -> float
+
+
+extern "__builtin_fabsf" : float -> float
+
+
+extern "__builtin_fabsl" : float -> float
+
+
+extern "__builtin_ffs" : int -> int
+
+
+extern "__builtin_ffsl" : int -> int
+
+
+extern "__builtin_ffsll" : int -> int
+
+
+extern "__builtin_frame_address" : int -> int
+
+
+extern "__builtin_floor" : float -> float
+
+
+extern "__builtin_floorf" : float -> float
+
+
+extern "__builtin_floorl" : float -> float
+
+
+extern "__builtin_huge_val" : float
+
+
+extern "__builtin_huge_valf" : float
+
+
+extern "__builtin_huge_vall" : float
+
+
+extern "__builtin_inf" : float
+
+
+extern "__builtin_inff" : float
+
+
+extern "__builtin_infl" : float
+
+
+extern "__builtin_memcpy" : int -> int -> int -> int
+
+
+extern "__builtin_mempcpy" : int -> int -> int -> int
+
+
+extern "__builtin_fmod" : float -> float
+
+
+extern "__builtin_fmodf" : float -> float
+
+
+extern "__builtin_fmodl" : float -> float
+
+
+extern "__builtin_frexp" : float -> int -> float
+
+
+extern "__builtin_frexpf" : float -> int -> float
+
+
+extern "__builtin_frexpl" : float -> int -> float
+
+
+extern "__builtin_ldexp" : float -> int -> float
+
+
+extern "__builtin_ldexpf" : float -> int -> float
+
+
+extern "__builtin_ldexpl" : float -> int -> float
+
+
+extern "__builtin_log" : float -> float
+
+
+extern "__builtin_logf" : float -> float
+
+
+extern "__builtin_logl" : float -> float
+
+
+extern "__builtin_log10" : float -> float
+
+
+extern "__builtin_log10f" : float -> float
+
+
+extern "__builtin_log10l" : float -> float
+
+
+extern "__builtin_modff" : float -> int -> float
+
+
+extern "__builtin_modfl" : float -> int -> float
+
+
+extern "__builtin_nan" : int -> float
+
+
+extern "__builtin_nanf" : int -> float
+
+
+extern "__builtin_nanl" : int -> float
+
+
+extern "__builtin_nans" : int -> float
+
+
+extern "__builtin_nansf" : int -> float
+
+
+extern "__builtin_nansl" : int -> float
+
+
+extern "__builtin_next_arg" : int
+
+
+extern "__builtin_object_size" : int -> int -> int
+
+
+extern "__builtin_parity" : int -> int
+
+
+extern "__builtin_parityl" : int -> int
+
+
+extern "__builtin_parityll" : int -> int
+
+
+extern "__builtin_popcount" : int -> int
+
+
+extern "__builtin_popcountl" : int -> int
+
+
+extern "__builtin_popcountll" : int -> int
+
+
+extern "__builtin_powi" : float -> int -> float
+
+
+extern "__builtin_powif" : float -> int -> float
+
+
+extern "__builtin_powil" : float -> int -> float
+
+
+extern "__builtin_return" : int -> void
+
+
+extern "__builtin_return_address" : int -> int
+
+
+extern "__builtin_sin" : float -> float
+
+
+extern "__builtin_sinf" : float -> float
+
+
+extern "__builtin_sinl" : float -> float
+
+
+extern "__builtin_sinh" : float -> float
+
+
+extern "__builtin_sinhf" : float -> float
+
+
+extern "__builtin_sinhl" : float -> float
+
+
+extern "__builtin_sqrt" : float -> float
+
+
+extern "__builtin_sqrtf" : float -> float
+
+
+extern "__builtin_sqrtl" : float -> float
+
+
+extern "__builtin_stpcpy" : int -> int -> int
+
+
+extern "__builtin_strchr" : int -> int -> int
+
+
+extern "__builtin_strcmp" : int -> int -> int
+
+
+extern "__builtin_strcpy" : int -> int -> int
+
+
+extern "__builtin_strcspn" : int -> int -> int
+
+
+extern "__builtin_strncat" : int -> int -> int -> int
+
+
+extern "__builtin_strncmp" : int -> int -> int -> int
+
+
+extern "__builtin_strncpy" : int -> int -> int -> int
+
+
+extern "__builtin_strspn" : int -> int -> int
+
+
+extern "__builtin_strpbrk" : int -> int -> int
+
+
+extern "__builtin_types_compatible_p" : int -> int -> int
+
+
+extern "__builtin_tan" : float -> float
+
+
+extern "__builtin_tanf" : float -> float
+
+
+extern "__builtin_tanl" : float -> float
+
+
+extern "__builtin_tanh" : float -> float
+
+
+extern "__builtin_tanhf" : float -> float
+
+
+extern "__builtin_tanhl" : float -> float
+
+
+extern "__builtin_va_end" : int -> void
+
+
+extern "__builtin_varargs_start" : int -> void
+
+
+extern "__builtin_va_start" : int -> int -> void
+
+
+extern "__builtin_stdarg_start" : int -> void
+
+
+extern "__builtin_va_arg" : int -> int -> void
+
+
+extern "__builtin_va_copy" : int -> int -> void
+
+
+"main" () : int {
+
+ stack 0;
+
+ var c, b, a;
+
+ c20:
+ a = 4;
+ c19:
+ b = 5;
+ c18:
+ c = a;
+ c17:
+ c = 10;
+ c16:
+ c = a + b;
+ c15:
+ c = a - b;
+ c14:
+ c = a * b;
+ c13:
+ c = a / b;
+ c12:
+ c = a % b;
+ c11:
+ c = a && b;
+ c10:
+ c = a || b;
+ c9:
+ c = a << b;
+ c8:
+ c = a >> b;
+ c7:
+ c = a ^ b;
+ c6:
+ c = a < b;
+ c5:
+ c = a > b;
+ c4:
+ c = a == b;
+ c3:
+ c = a != b;
+ c2:
+ c = a <= b;
+ c1:
+ c = a >= b;
+ c0:
+ return c;
+
+}
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure _main(0)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13
+entry main57
+main57: newframe --> main56
+main56: move %13, $ra --> main55
+main55: move %12, $s7 --> main54
+main54: move %11, $s6 --> main53
+main53: move %10, $s5 --> main52
+main52: move %9, $s4 --> main51
+main51: move %8, $s3 --> main50
+main50: move %7, $s2 --> main49
+main49: move %6, $s1 --> main48
+main48: move %5, $s0 --> main47
+main47: li %0, 0 --> main46
+main46: li %1, 0 --> main45
+main45: li %2, 0 --> main44
+main44: li %4, 0 --> main42
+main42: emit c20 --> main41
+main41: li %2, 4 --> main40
+main40: emit c19 --> main39
+main39: li %1, 5 --> main38
+main38: emit c18 --> main37
+main37: move %0, %2 --> main36
+main36: emit c17 --> main35
+main35: li %0, 10 --> main34
+main34: emit c16 --> main33
+main33: add %0, %2, %1 --> main32
+main32: emit c15 --> main31
+main31: sub %0, %2, %1 --> main30
+main30: emit c14 --> main29
+main29: mulo %0, %2, %1 --> main28
+main28: emit c13 --> main27
+main27: div %0, %2, %1 --> main26
+main26: emit c12 --> main25
+main25: la %4, mod --> main43
+main43: j --> main73
+main73: move $a0, %2 --> main72
+main72: move $a1, %1 --> main71
+main71: call %4(2) --> main70
+main70: move %0, $v0 --> main24
+main24: emit c11 --> main23
+main23: and %0, %2, %1 --> main22
+main22: emit c10 --> main21
+main21: or %0, %2, %1 --> main20
+main20: emit c9 --> main19
+main19: sllv %0, %2, %1 --> main18
+main18: emit c8 --> main17
+main17: srav %0, %2, %1 --> main16
+main16: emit c7 --> main15
+main15: xor %0, %2, %1 --> main14
+main14: emit c6 --> main13
+main13: slt %0, %2, %1 --> main12
+main12: emit c5 --> main11
+main11: sgt %0, %2, %1 --> main10
+main10: emit c4 --> main9
+main9 : seq %0, %2, %1 --> main8
+main8 : emit c3 --> main7
+main7 : sne %0, %2, %1 --> main6
+main6 : emit c2 --> main5
+main5 : sle %0, %2, %1 --> main4
+main4 : emit c1 --> main3
+main3 : sge %0, %2, %1 --> main2
+main2 : emit c0 --> main1
+main1 : move %3, %0 --> main0
+main0 : j --> main69
+main69: move $v0, %3 --> main68
+main68: move $ra, %13 --> main67
+main67: move $s7, %12 --> main66
+main66: move $s6, %11 --> main65
+main65: move $s5, %10 --> main64
+main64: move $s4, %9 --> main63
+main63: move $s3, %8 --> main62
+main62: move $s2, %7 --> main61
+main61: move $s1, %6 --> main60
+main60: move $s0, %5 --> main59
+main59: delframe --> main58
+main58: jr $ra (xmits $v0)
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure _main(0)
+var 12
+main57:
+newframe
+sw $ra, 8($sp)
+sw $s1, 4($sp)
+sw $s0, 0($sp)
+c20:
+li $s0, 4
+c19:
+li $s1, 5
+c18:
+c17:
+c16:
+c15:
+c14:
+c13:
+c12:
+la $v0, mod
+move $a0, $s0
+move $a1, $s1
+call $v0
+c11:
+c10:
+c9:
+c8:
+c7:
+c6:
+c5:
+c4:
+c3:
+c2:
+c1:
+sge $v0, $s0, $s1
+c0:
+lw $ra, 8($sp)
+lw $s1, 4($sp)
+lw $s0, 0($sp)
+delframe
+jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure _main(0)
+var 12
+entry main57
+main57: newframe --> main56
+main56: lw $ra, 8($sp) --> main55
+main55: j --> main54
+main54: j --> main53
+main53: j --> main52
+main52: j --> main51
+main51: j --> main50
+main50: j --> main49
+main49: lw $s1, 4($sp) --> main48
+main48: lw $s0, 0($sp) --> main47
+main47: j --> main46
+main46: j --> main45
+main45: j --> main44
+main44: j --> main42
+main42: emit c20 --> main41
+main41: li $s0, 4 --> main40
+main40: emit c19 --> main39
+main39: li $s1, 5 --> main38
+main38: emit c18 --> main37
+main37: j --> main36
+main36: emit c17 --> main35
+main35: j --> main34
+main34: emit c16 --> main33
+main33: j --> main32
+main32: emit c15 --> main31
+main31: j --> main30
+main30: emit c14 --> main29
+main29: j --> main28
+main28: emit c13 --> main27
+main27: j --> main26
+main26: emit c12 --> main25
+main25: la $v0, mod --> main43
+main43: j --> main73
+main73: move $a0, $s0 --> main72
+main72: move $a1, $s1 --> main71
+main71: call $v0 --> main70
+main70: j --> main24
+main24: emit c11 --> main23
+main23: j --> main22
+main22: emit c10 --> main21
+main21: j --> main20
+main20: emit c9 --> main19
+main19: j --> main18
+main18: emit c8 --> main17
+main17: j --> main16
+main16: emit c7 --> main15
+main15: j --> main14
+main14: emit c6 --> main13
+main13: j --> main12
+main12: emit c5 --> main11
+main11: j --> main10
+main10: emit c4 --> main9
+main9 : j --> main8
+main8 : emit c3 --> main7
+main7 : j --> main6
+main6 : emit c2 --> main5
+main5 : j --> main4
+main4 : emit c1 --> main3
+main3 : sge $v0, $s0, $s1 --> main2
+main2 : emit c0 --> main1
+main1 : j --> main0
+main0 : j --> main69
+main69: j --> main68
+main68: lw $ra, 8($sp) --> main67
+main67: j --> main66
+main66: j --> main65
+main65: j --> main64
+main64: j --> main63
+main63: j --> main62
+main62: j --> main61
+main61: lw $s1, 4($sp) --> main60
+main60: lw $s0, 0($sp) --> main59
+main59: delframe --> main58
+main58: jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 0
+
+function _main() : %3
+stacksize 0
+var %0, %1, %2, %3, %4
+entry main47
+main47: li %0, 0 --> main46
+main46: li %1, 0 --> main45
+main45: li %2, 0 --> main44
+main44: li %4, 0 --> main42
+main42: emit c20 --> main41
+main41: li %2, 4 --> main40
+main40: emit c19 --> main39
+main39: li %1, 5 --> main38
+main38: emit c18 --> main37
+main37: move %0, %2 --> main36
+main36: emit c17 --> main35
+main35: li %0, 10 --> main34
+main34: emit c16 --> main33
+main33: add %0, %2, %1 --> main32
+main32: emit c15 --> main31
+main31: sub %0, %2, %1 --> main30
+main30: emit c14 --> main29
+main29: mulo %0, %2, %1 --> main28
+main28: emit c13 --> main27
+main27: div %0, %2, %1 --> main26
+main26: emit c12 --> main25
+main25: la %4, mod --> main43
+main43: call %0, %4(%2, %1) --> main24
+main24: emit c11 --> main23
+main23: and %0, %2, %1 --> main22
+main22: emit c10 --> main21
+main21: or %0, %2, %1 --> main20
+main20: emit c9 --> main19
+main19: sllv %0, %2, %1 --> main18
+main18: emit c8 --> main17
+main17: srav %0, %2, %1 --> main16
+main16: emit c7 --> main15
+main15: xor %0, %2, %1 --> main14
+main14: emit c6 --> main13
+main13: slt %0, %2, %1 --> main12
+main12: emit c5 --> main11
+main11: sgt %0, %2, %1 --> main10
+main10: emit c4 --> main9
+main9 : seq %0, %2, %1 --> main8
+main8 : emit c3 --> main7
+main7 : sne %0, %2, %1 --> main6
+main6 : emit c2 --> main5
+main5 : sle %0, %2, %1 --> main4
+main4 : emit c1 --> main3
+main3 : sge %0, %2, %1 --> main2
+main2 : emit c0 --> main1
+main1 : move %3, %0 --> main0
+main0 : return %3
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program: (main function is "main")
+
+
+ globals:
+
+
+ "__builtin___memcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memmove_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___mempcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memset_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___stpcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strcat_chk": int -> int -> int -> int
+
+
+ "__builtin___strcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strncat_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___strncpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vfprintf_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vprintf_chk": int -> int -> int -> int
+
+
+ "__builtin___vsnprintf_chk": int -> int -> int -> int -> int -> int -> int
+
+
+ "__builtin___vsprintf_chk": int -> int -> int -> int -> int -> int
+
+
+ "__builtin_acos": float -> float
+
+
+ "__builtin_acosf": float -> float
+
+
+ "__builtin_acosl": float -> float
+
+
+ "__builtin_alloca": int -> int
+
+
+ "__builtin_asin": float -> float
+
+
+ "__builtin_asinf": float -> float
+
+
+ "__builtin_asinl": float -> float
+
+
+ "__builtin_atan": float -> float
+
+
+ "__builtin_atanf": float -> float
+
+
+ "__builtin_atanl": float -> float
+
+
+ "__builtin_atan2": float -> float -> float
+
+
+ "__builtin_atan2f": float -> float -> float
+
+
+ "__builtin_atan2l": float -> float -> float
+
+
+ "__builtin_ceil": float -> float
+
+
+ "__builtin_ceilf": float -> float
+
+
+ "__builtin_ceill": float -> float
+
+
+ "__builtin_cos": float -> float
+
+
+ "__builtin_cosf": float -> float
+
+
+ "__builtin_cosl": float -> float
+
+
+ "__builtin_cosh": float -> float
+
+
+ "__builtin_coshf": float -> float
+
+
+ "__builtin_coshl": float -> float
+
+
+ "__builtin_clz": int -> int
+
+
+ "__builtin_clzl": int -> int
+
+
+ "__builtin_clzll": int -> int
+
+
+ "__builtin_constant_p": int -> int
+
+
+ "__builtin_ctz": int -> int
+
+
+ "__builtin_ctzl": int -> int
+
+
+ "__builtin_ctzll": int -> int
+
+
+ "__builtin_exp": float -> float
+
+
+ "__builtin_expf": float -> float
+
+
+ "__builtin_expl": float -> float
+
+
+ "__builtin_expect": int -> int -> int
+
+
+ "__builtin_fabs": float -> float
+
+
+ "__builtin_fabsf": float -> float
+
+
+ "__builtin_fabsl": float -> float
+
+
+ "__builtin_ffs": int -> int
+
+
+ "__builtin_ffsl": int -> int
+
+
+ "__builtin_ffsll": int -> int
+
+
+ "__builtin_frame_address": int -> int
+
+
+ "__builtin_floor": float -> float
+
+
+ "__builtin_floorf": float -> float
+
+
+ "__builtin_floorl": float -> float
+
+
+ "__builtin_huge_val": float
+
+
+ "__builtin_huge_valf": float
+
+
+ "__builtin_huge_vall": float
+
+
+ "__builtin_inf": float
+
+
+ "__builtin_inff": float
+
+
+ "__builtin_infl": float
+
+
+ "__builtin_memcpy": int -> int -> int -> int
+
+
+ "__builtin_mempcpy": int -> int -> int -> int
+
+
+ "__builtin_fmod": float -> float
+
+
+ "__builtin_fmodf": float -> float
+
+
+ "__builtin_fmodl": float -> float
+
+
+ "__builtin_frexp": float -> int -> float
+
+
+ "__builtin_frexpf": float -> int -> float
+
+
+ "__builtin_frexpl": float -> int -> float
+
+
+ "__builtin_ldexp": float -> int -> float
+
+
+ "__builtin_ldexpf": float -> int -> float
+
+
+ "__builtin_ldexpl": float -> int -> float
+
+
+ "__builtin_log": float -> float
+
+
+ "__builtin_logf": float -> float
+
+
+ "__builtin_logl": float -> float
+
+
+ "__builtin_log10": float -> float
+
+
+ "__builtin_log10f": float -> float
+
+
+ "__builtin_log10l": float -> float
+
+
+ "__builtin_modff": float -> int -> float
+
+
+ "__builtin_modfl": float -> int -> float
+
+
+ "__builtin_nan": int -> float
+
+
+ "__builtin_nanf": int -> float
+
+
+ "__builtin_nanl": int -> float
+
+
+ "__builtin_nans": int -> float
+
+
+ "__builtin_nansf": int -> float
+
+
+ "__builtin_nansl": int -> float
+
+
+ "__builtin_next_arg": int
+
+
+ "__builtin_object_size": int -> int -> int
+
+
+ "__builtin_parity": int -> int
+
+
+ "__builtin_parityl": int -> int
+
+
+ "__builtin_parityll": int -> int
+
+
+ "__builtin_popcount": int -> int
+
+
+ "__builtin_popcountl": int -> int
+
+
+ "__builtin_popcountll": int -> int
+
+
+ "__builtin_powi": float -> int -> float
+
+
+ "__builtin_powif": float -> int -> float
+
+
+ "__builtin_powil": float -> int -> float
+
+
+ "__builtin_return": int -> void
+
+
+ "__builtin_return_address": int -> int
+
+
+ "__builtin_sin": float -> float
+
+
+ "__builtin_sinf": float -> float
+
+
+ "__builtin_sinl": float -> float
+
+
+ "__builtin_sinh": float -> float
+
+
+ "__builtin_sinhf": float -> float
+
+
+ "__builtin_sinhl": float -> float
+
+
+ "__builtin_sqrt": float -> float
+
+
+ "__builtin_sqrtf": float -> float
+
+
+ "__builtin_sqrtl": float -> float
+
+
+ "__builtin_stpcpy": int -> int -> int
+
+
+ "__builtin_strchr": int -> int -> int
+
+
+ "__builtin_strcmp": int -> int -> int
+
+
+ "__builtin_strcpy": int -> int -> int
+
+
+ "__builtin_strcspn": int -> int -> int
+
+
+ "__builtin_strncat": int -> int -> int -> int
+
+
+ "__builtin_strncmp": int -> int -> int -> int
+
+
+ "__builtin_strncpy": int -> int -> int -> int
+
+
+ "__builtin_strspn": int -> int -> int
+
+
+ "__builtin_strpbrk": int -> int -> int
+
+
+ "__builtin_types_compatible_p": int -> int -> int
+
+
+ "__builtin_tan": float -> float
+
+
+ "__builtin_tanf": float -> float
+
+
+ "__builtin_tanl": float -> float
+
+
+ "__builtin_tanh": float -> float
+
+
+ "__builtin_tanhf": float -> float
+
+
+ "__builtin_tanhl": float -> float
+
+
+ "__builtin_va_end": int -> void
+
+
+ "__builtin_varargs_start": int -> void
+
+
+ "__builtin_va_start": int -> int -> void
+
+
+ "__builtin_stdarg_start": int -> void
+
+
+ "__builtin_va_arg": int -> int -> void
+
+
+ "__builtin_va_copy": int -> int -> void
+
+
+ "main"(): int
+ locals: %3, %0, %1, %2
+ result: %3
+ stacksize: 0
+ entry: main42
+ exit: main0
+
+ main9: eq %0, %2, %1 --> main8
+ main8: emit c3 --> main7
+ main7: ne %0, %2, %1 --> main6
+ main6: emit c2 --> main5
+ main5: le %0, %2, %1 --> main4
+ main42: emit c20 --> main41
+ main41: imm_int 4, %2, --> main40
+ main40: emit c19 --> main39
+ main4: emit c1 --> main3
+ main39: imm_int 5, %1, --> main38
+ main38: emit c18 --> main37
+ main37: mov %0, %2 --> main36
+ main36: emit c17 --> main35
+ main35: imm_int 10, %0, --> main34
+ main34: emit c16 --> main33
+ main33: add %0, %2, %1 --> main32
+ main32: emit c15 --> main31
+ main31: sub %0, %2, %1 --> main30
+ main30: emit c14 --> main29
+ main3: ge %0, %2, %1 --> main2
+ main29: mul %0, %2, %1 --> main28
+ main28: emit c13 --> main27
+ main27: div %0, %2, %1 --> main26
+ main26: emit c12 --> main25
+ main25: mod %0, %2, %1 --> main24
+ main24: emit c11 --> main23
+ main23: and %0, %2, %1 --> main22
+ main22: emit c10 --> main21
+ main21: or %0, %2, %1 --> main20
+ main20: emit c9 --> main19
+ main2: emit c0 --> main1
+ main19: shl %0, %2, %1 --> main18
+ main18: emit c8 --> main17
+ main17: shr %0, %2, %1 --> main16
+ main16: emit c7 --> main15
+ main15: xor %0, %2, %1 --> main14
+ main14: emit c6 --> main13
+ main13: lt %0, %2, %1 --> main12
+ main12: emit c5 --> main11
+ main11: gt %0, %2, %1 --> main10
+ main10: emit c4 --> main9
+ main1: mov %3, %0 --> main0
+ main0: return %3
+
+
--- /dev/null
+int main(){
+ int a=4,b=5,c;
+// double d=3.5,e=0.1,f;
+
+ c = a;
+ c = 10;
+ c = a+b;
+ c = a-b;
+ c = a*b;
+ c = a/b;
+ c = a%b;
+ c = a&b;
+ c = a|b;
+ c = a<<b;
+ c = a>>b;
+ c = a^b;
+ c = a<b;
+ c = a>b;
+ c = a==b;
+ c = a!=b;
+ c = a<=b;
+ c = a>=b;
+
+// f = d;
+// f = 1.0;
+// f = d+e;
+// f = d-e;
+// f = d*e;
+// f = d/e;
+// c = d<e;
+// c = d>e;
+// c = d==e;
+// c = d!=e;
+// c = d<=e;
+// c = d>=e;
+
+ return c;
+}
+
+
--- /dev/null
+int main(){
+ int a=4,b=5,c;
+ double d=3.5,e=0.1,f;
+
+ c = a;
+ c = 10;
+ c = a+b;
+ c = a-b;
+ c = a*b;
+ c = a/b;
+ c = a%b;
+ c = a&b;
+ c = a|b;
+ c = a<<b;
+ c = a>>b;
+ c = a^b;
+ c = a<b;
+ c = a>b;
+ c = a==b;
+ c = a!=b;
+ c = a<=b;
+ c = a>=b;
+
+ f = d;
+ f = 1.0;
+ f = d+e;
+ f = d-e;
+ f = d*e;
+ f = d/e;
+ c = d<e;
+ c = d>e;
+ c = d==e;
+ c = d!=e;
+ c = d<=e;
+ c = d>=e;
+
+ return c;
+}
+
+
--- /dev/null
+Fatal error: exception Assert_failure("src/RTLabs/RTLabsToRTL.ml", 23, 9)
--- /dev/null
+# extern __builtin_varargs_start: int -> void
+# extern __builtin_va_start: int -> int -> void
+# extern __builtin_va_end: int -> void
+# extern __builtin_va_copy: int -> int -> void
+# extern __builtin_va_arg: int -> int -> void
+# extern __builtin_types_compatible_p: int -> int -> int
+# extern __builtin_tanl: float -> float
+# extern __builtin_tanhl: float -> float
+# extern __builtin_tanhf: float -> float
+# extern __builtin_tanh: float -> float
+# extern __builtin_tanf: float -> float
+# extern __builtin_tan: float -> float
+# extern __builtin_strspn: int -> int -> int
+# extern __builtin_strpbrk: int -> int -> int
+# extern __builtin_strncpy: int -> int -> int -> int
+# extern __builtin_strncmp: int -> int -> int -> int
+# extern __builtin_strncat: int -> int -> int -> int
+# extern __builtin_strcspn: int -> int -> int
+# extern __builtin_strcpy: int -> int -> int
+# extern __builtin_strcmp: int -> int -> int
+# extern __builtin_strchr: int -> int -> int
+# extern __builtin_stpcpy: int -> int -> int
+# extern __builtin_stdarg_start: int -> void
+# extern __builtin_sqrtl: float -> float
+# extern __builtin_sqrtf: float -> float
+# extern __builtin_sqrt: float -> float
+# extern __builtin_sinl: float -> float
+# extern __builtin_sinhl: float -> float
+# extern __builtin_sinhf: float -> float
+# extern __builtin_sinh: float -> float
+# extern __builtin_sinf: float -> float
+# extern __builtin_sin: float -> float
+# extern __builtin_return_address: int -> int
+# extern __builtin_return: int -> void
+# extern __builtin_powil: float -> int -> float
+# extern __builtin_powif: float -> int -> float
+# extern __builtin_powi: float -> int -> float
+# extern __builtin_popcountll: int -> int
+# extern __builtin_popcountl: int -> int
+# extern __builtin_popcount: int -> int
+# extern __builtin_parityll: int -> int
+# extern __builtin_parityl: int -> int
+# extern __builtin_parity: int -> int
+# extern __builtin_object_size: int -> int -> int
+# extern __builtin_next_arg: int
+# extern __builtin_nansl: int -> float
+# extern __builtin_nansf: int -> float
+# extern __builtin_nans: int -> float
+# extern __builtin_nanl: int -> float
+# extern __builtin_nanf: int -> float
+# extern __builtin_nan: int -> float
+# extern __builtin_modfl: float -> int -> float
+# extern __builtin_modff: float -> int -> float
+# extern __builtin_mempcpy: int -> int -> int -> int
+# extern __builtin_memcpy: int -> int -> int -> int
+# extern __builtin_logl: float -> float
+# extern __builtin_logf: float -> float
+# extern __builtin_log10l: float -> float
+# extern __builtin_log10f: float -> float
+# extern __builtin_log10: float -> float
+# extern __builtin_log: float -> float
+# extern __builtin_ldexpl: float -> int -> float
+# extern __builtin_ldexpf: float -> int -> float
+# extern __builtin_ldexp: float -> int -> float
+# extern __builtin_infl: float
+# extern __builtin_inff: float
+# extern __builtin_inf: float
+# extern __builtin_huge_vall: float
+# extern __builtin_huge_valf: float
+# extern __builtin_huge_val: float
+# extern __builtin_frexpl: float -> int -> float
+# extern __builtin_frexpf: float -> int -> float
+# extern __builtin_frexp: float -> int -> float
+# extern __builtin_frame_address: int -> int
+# extern __builtin_fmodl: float -> float
+# extern __builtin_fmodf: float -> float
+# extern __builtin_fmod: float -> float
+# extern __builtin_floorl: float -> float
+# extern __builtin_floorf: float -> float
+# extern __builtin_floor: float -> float
+# extern __builtin_ffsll: int -> int
+# extern __builtin_ffsl: int -> int
+# extern __builtin_ffs: int -> int
+# extern __builtin_fabsl: float -> float
+# extern __builtin_fabsf: float -> float
+# extern __builtin_fabs: float -> float
+# extern __builtin_expl: float -> float
+# extern __builtin_expf: float -> float
+# extern __builtin_expect: int -> int -> int
+# extern __builtin_exp: float -> float
+# extern __builtin_ctzll: int -> int
+# extern __builtin_ctzl: int -> int
+# extern __builtin_ctz: int -> int
+# extern __builtin_cosl: float -> float
+# extern __builtin_coshl: float -> float
+# extern __builtin_coshf: float -> float
+# extern __builtin_cosh: float -> float
+# extern __builtin_cosf: float -> float
+# extern __builtin_cos: float -> float
+# extern __builtin_constant_p: int -> int
+# extern __builtin_clzll: int -> int
+# extern __builtin_clzl: int -> int
+# extern __builtin_clz: int -> int
+# extern __builtin_ceill: float -> float
+# extern __builtin_ceilf: float -> float
+# extern __builtin_ceil: float -> float
+# extern __builtin_atanl: float -> float
+# extern __builtin_atanf: float -> float
+# extern __builtin_atan2l: float -> float -> float
+# extern __builtin_atan2f: float -> float -> float
+# extern __builtin_atan2: float -> float -> float
+# extern __builtin_atan: float -> float
+# extern __builtin_asinl: float -> float
+# extern __builtin_asinf: float -> float
+# extern __builtin_asin: float -> float
+# extern __builtin_alloca: int -> int
+# extern __builtin_acosl: float -> float
+# extern __builtin_acosf: float -> float
+# extern __builtin_acos: float -> float
+# extern __builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+# extern __builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+# extern __builtin___vprintf_chk: int -> int -> int -> int
+# extern __builtin___vfprintf_chk: int -> int -> int -> int -> int
+# extern __builtin___strncpy_chk: int -> int -> int -> int -> int
+# extern __builtin___strncat_chk: int -> int -> int -> int -> int
+# extern __builtin___strcpy_chk: int -> int -> int -> int
+# extern __builtin___strcat_chk: int -> int -> int -> int
+# extern __builtin___stpcpy_chk: int -> int -> int -> int
+# extern __builtin___memset_chk: int -> int -> int -> int -> int
+# extern __builtin___mempcpy_chk: int -> int -> int -> int -> int
+# extern __builtin___memmove_chk: int -> int -> int -> int -> int
+# extern __builtin___memcpy_chk: int -> int -> int -> int -> int
+
+# begin preamble
+.data
+globals:
+.space 0
+nl:
+.asciiz "\n"
+.align 2
+.text
+main:
+la $gp, globals
+j main307
+print_int:
+li $v0, 1
+syscall
+jr $ra
+print_intln:
+li $v0, 1
+syscall
+la $a0, nl
+li $v0, 4
+syscall
+jr $ra
+scan_int:
+li $v0, 5
+syscall
+jr $ra
+alloc:
+li $v0, 9
+syscall
+jr $ra
+
+pow2:
+li $v0, 1
+sllv $v0, $v0, $a0
+jr $ra
+
+mod:
+beqz $a0, mod0
+beqz $a1, mod0
+li $t2, 0
+mod_t0:
+bgtz $a0, mod_a0_pos
+neg $t0, $a0
+addi $t2, $t2, 1
+j mod_t1
+mod_a0_pos:
+move $t0, $a0
+mod_t1:
+bgtz $a1, mod_a1_pos
+neg $t1, $a1
+addi $t2, $t2, 2
+j mod_main
+mod_a1_pos:
+move $t1, $a1
+mod_main:
+rem $v0, $t0, $t1
+beqz $t2, mod_exit
+addi $t2, -1
+beqz $t2, mod_case1
+addi $t2, -1
+beqz $t2, mod_case2
+neg $v0, $v0
+j mod_exit
+mod_case1:
+sub $v0, $a1, $v0
+j mod_exit
+mod_case2:
+add $v0, $a1, $v0
+j mod_exit
+mod0:
+li $v0, 0
+mod_exit:
+jr $ra
+
+toint:
+# $a0: size
+# $a1: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+jal pow2
+move $a0, $a1
+move $a1, $v0
+jal mod
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 8
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 16
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+sign_ext:
+# $a0: size
+# $a1: int to extend
+li $v0, 32
+sub $a0, $v0, $a0
+sllv $v0, $a1, $a0
+srav $v0, $v0, $a0
+jr $ra
+
+ofint:
+# $a0: signedness
+# $a1: size
+# $a2: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+beqz $a0, ofint_unsigned
+move $a0, $a1
+move $a1, $a2
+jal sign_ext
+j ofint_exit
+ofint_unsigned:
+move $v0, $a2
+ofint_exit:
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+# end preamble
+
+
+# begin comp_tri
+comp_tri123:
+c108:
+li $v0, 0
+c107:
+c106:
+li $t1, 0
+comp_tri55:
+li $a3, 0
+c105:
+slt $a2, $t1, $a1
+seq $a2, $a2, $zero
+beq $a2, $a3, comp_tri50
+c95:
+jr $ra
+comp_tri50:
+c103:
+c102:
+li $t2, 1
+comp_tri47:
+li $a3, 0
+c101:
+sub $a2, $a1, $t1
+slt $a2, $t2, $a2
+seq $a2, $a2, $zero
+beq $a2, $a3, comp_tri41
+c104:
+li $a2, 1
+add $t1, $t1, $a2
+j comp_tri55
+comp_tri41:
+c99:
+li $a2, 4
+mulo $a2, $t2, $a2
+add $a2, $a0, $a2
+lw $t0, 0($a2)
+li $a2, 1
+sub $a3, $t2, $a2
+li $a2, 4
+mulo $a2, $a3, $a2
+add $a2, $a0, $a2
+lw $a2, 0($a2)
+slt $a2, $t0, $a2
+beq $a2, $zero, comp_tri10
+c98:
+li $v0, 1
+sub $a2, $t2, $v0
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+lw $v0, 0($v0)
+c97:
+li $a2, 4
+mulo $a2, $t2, $a2
+add $a2, $a0, $a2
+lw $t0, 0($a2)
+li $a2, 1
+sub $a3, $t2, $a2
+li $a2, 4
+mulo $a2, $a3, $a2
+add $a2, $a0, $a2
+sw $t0, 0($a2)
+c96:
+li $a2, 4
+mulo $a2, $t2, $a2
+add $a2, $a0, $a2
+sw $v0, 0($a2)
+comp_tri10:
+c100:
+li $a2, 1
+add $t2, $t2, $a2
+j comp_tri47
+# end comp_tri
+
+
+# begin comp_total
+comp_total410:
+addi $sp, $sp, -80
+c94:
+li $t0, 0
+move $a3, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a3, $v0
+sw $t0, 0($v0)
+c93:
+move $t0, $sp
+li $a3, 1
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c92:
+move $t0, $sp
+li $a3, 2
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c91:
+move $t0, $sp
+li $a3, 3
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c90:
+move $t0, $sp
+li $a3, 4
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c89:
+move $t0, $sp
+li $a3, 5
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c88:
+move $t0, $sp
+li $a3, 6
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c87:
+move $t0, $sp
+li $a3, 7
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c86:
+move $t0, $sp
+li $a3, 8
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c85:
+move $t0, $sp
+li $a3, 9
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c84:
+li $t0, 0
+move $a3, $sp
+addi $a3, $a3, 40
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a3, $v0
+sw $t0, 0($v0)
+c83:
+move $t0, $sp
+addi $t0, $t0, 40
+li $a3, 1
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c82:
+move $t0, $sp
+addi $t0, $t0, 40
+li $a3, 2
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c81:
+move $t0, $sp
+addi $t0, $t0, 40
+li $a3, 3
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c80:
+move $t0, $sp
+addi $t0, $t0, 40
+li $a3, 4
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c79:
+move $t0, $sp
+addi $t0, $t0, 40
+li $a3, 5
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c78:
+move $t0, $sp
+addi $t0, $t0, 40
+li $a3, 6
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c77:
+move $t0, $sp
+addi $t0, $t0, 40
+li $a3, 7
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c76:
+move $t0, $sp
+addi $t0, $t0, 40
+li $a3, 8
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c75:
+move $t0, $sp
+addi $t0, $t0, 40
+li $a3, 9
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c74:
+slt $v0, $a1, $a2
+beq $v0, $zero, comp_total40
+c73:
+c72:
+li $t0, 0
+comp_total58:
+li $a2, 0
+c71:
+sle $v0, $t0, $a1
+seq $v0, $v0, $zero
+beq $v0, $a2, comp_total53
+comp_total2:
+c59:
+li $v0, 0
+addi $sp, $sp, 80
+jr $ra
+comp_total53:
+c69:
+sub $a2, $a1, $t0
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+lw $a3, 0($v0)
+move $a2, $sp
+li $v0, 4
+mulo $v0, $t0, $v0
+add $v0, $a2, $v0
+sw $a3, 0($v0)
+c70:
+li $v0, 1
+add $t0, $t0, $v0
+j comp_total58
+comp_total40:
+c68:
+c67:
+li $t2, 0
+comp_total37:
+li $a3, 0
+c66:
+slt $v0, $t2, $a1
+seq $v0, $v0, $zero
+bne $v0, $a3, comp_total2
+c64:
+c63:
+move $t1, $a2
+comp_total29:
+li $a3, 0
+c62:
+sgt $v0, $t1, $zero
+seq $v0, $v0, $zero
+beq $v0, $a3, comp_total23
+c65:
+li $v0, 1
+add $t2, $t2, $v0
+j comp_total37
+comp_total23:
+c60:
+move $a3, $sp
+li $v0, 4
+mulo $v0, $t2, $v0
+add $v0, $a3, $v0
+lw $t0, 0($v0)
+move $a3, $sp
+addi $a3, $a3, 40
+li $v0, 4
+mulo $v0, $t1, $v0
+add $v0, $a3, $v0
+lw $v0, 0($v0)
+add $a3, $t0, $v0
+li $v0, 4
+mulo $v0, $t2, $v0
+add $v0, $a0, $v0
+sw $a3, 0($v0)
+c61:
+li $v0, 1
+sub $t1, $t1, $v0
+j comp_total29
+# end comp_total
+
+
+# begin comp_ifFor
+comp_ifFor45:
+c58:
+li $v0, 0
+c57:
+c56:
+li $t0, 0
+comp_ifFor18:
+li $t1, 0
+c55:
+slt $a3, $t0, $a0
+seq $a3, $a3, $zero
+beq $a3, $t1, comp_ifFor13
+c50:
+jr $ra
+comp_ifFor13:
+c53:
+sne $a3, $t0, $a1
+beq $a3, $zero, comp_ifFor7
+c52:
+add $v0, $v0, $t0
+comp_ifFor5:
+c54:
+add $t0, $t0, $a2
+j comp_ifFor18
+comp_ifFor7:
+c51:
+li $v0, 0
+j comp_ifFor5
+# end comp_ifFor
+
+
+# begin comp_forif2
+comp_forif2153:
+addi $sp, $sp, -16
+sw $ra, 12($sp)
+sw $s2, 8($sp)
+sw $s1, 4($sp)
+sw $s0, 0($sp)
+c130:
+li $s0, 0
+c129:
+li $s1, 0
+c128:
+c127:
+li $t0, 0
+comp_forif275:
+li $t1, 0
+c126:
+slt $v0, $t0, $a2
+seq $v0, $v0, $zero
+beq $v0, $t1, comp_forif270
+c123:
+c122:
+li $a0, 0
+comp_forif258:
+li $a2, 0
+c121:
+slt $v0, $a0, $a3
+seq $v0, $v0, $zero
+beq $v0, $a2, comp_forif253
+c118:
+li $s2, 0
+c117:
+li $a1, 2
+la $v0, mod
+move $a0, $s0
+jalr $v0
+li $a0, 0
+seq $v0, $v0, $a0
+beq $v0, $zero, comp_forif226
+c116:
+li $a1, 2
+la $v0, mod
+move $a0, $s1
+jalr $v0
+li $a0, 0
+seq $v0, $v0, $a0
+beq $v0, $zero, comp_forif227
+li $v0, 1
+comp_forif225:
+beq $v0, $s2, comp_forif222
+c115:
+comp_forif22:
+c109:
+li $v0, 0
+lw $ra, 12($sp)
+lw $s2, 8($sp)
+lw $s1, 4($sp)
+lw $s0, 0($sp)
+addi $sp, $sp, 16
+jr $ra
+comp_forif222:
+c114:
+li $a1, 2
+la $v0, mod
+move $a0, $s0
+jalr $v0
+li $a0, 0
+seq $v0, $v0, $a0
+beq $v0, $zero, comp_forif213
+c113:
+j comp_forif22
+comp_forif213:
+c112:
+li $a1, 2
+la $v0, mod
+move $a0, $s1
+jalr $v0
+li $a0, 0
+seq $v0, $v0, $a0
+beq $v0, $zero, comp_forif24
+c111:
+j comp_forif22
+comp_forif24:
+c110:
+j comp_forif22
+comp_forif227:
+li $v0, 0
+j comp_forif225
+comp_forif226:
+li $v0, 0
+j comp_forif225
+comp_forif253:
+c119:
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+lw $v0, 0($v0)
+add $s1, $s1, $v0
+c120:
+li $v0, 1
+add $a0, $a0, $v0
+j comp_forif258
+comp_forif270:
+c124:
+li $v0, 4
+mulo $v0, $t0, $v0
+add $v0, $a0, $v0
+lw $v0, 0($v0)
+add $s0, $s0, $v0
+c125:
+li $v0, 1
+add $t0, $t0, $v0
+j comp_forif275
+# end comp_forif2
+
+
+# begin comp_forif
+comp_forif65:
+addi $sp, $sp, -12
+sw $ra, 8($sp)
+sw $s1, 4($sp)
+sw $s0, 0($sp)
+c141:
+li $s1, 0
+c140:
+c139:
+c138:
+li $s0, 0
+comp_forif28:
+li $a0, 0
+c137:
+li $v0, 10
+slt $v0, $s0, $v0
+seq $v0, $v0, $zero
+beq $v0, $a0, comp_forif22
+c131:
+move $v0, $s1
+lw $ra, 8($sp)
+lw $s1, 4($sp)
+lw $s0, 0($sp)
+addi $sp, $sp, 12
+jr $ra
+comp_forif22:
+c135:
+li $v0, 1
+add $s1, $s1, $v0
+c134:
+li $v0, 1
+add $s1, $s1, $v0
+c133:
+li $a1, 2
+la $v0, mod
+move $a0, $s0
+jalr $v0
+li $a0, 0
+seq $v0, $v0, $a0
+beq $v0, $zero, comp_forif6
+c132:
+comp_forif6:
+c136:
+li $v0, 1
+add $s0, $s0, $v0
+j comp_forif28
+# end comp_forif
+
+
+# begin comp_fir_basic
+comp_fir_basic141:
+addi $sp, $sp, -4
+c16:
+li $v0, 0
+c15:
+c14:
+li $t3, 0
+comp_fir_basic64:
+li $t0, 0
+c13:
+li $a3, 3
+slt $a3, $t3, $a3
+seq $a3, $a3, $zero
+beq $a3, $t0, comp_fir_basic58
+c0:
+addi $sp, $sp, 4
+jr $ra
+comp_fir_basic58:
+c11:
+li $a3, 4
+mulo $a3, $t3, $a3
+add $a3, $a0, $a3
+lw $t0, 0($a3)
+li $a3, 4
+mulo $a3, $zero, $a3
+add $a3, $a2, $a3
+sw $t0, 0($a3)
+c10:
+c9:
+li $t0, 0
+comp_fir_basic47:
+li $t1, 0
+c8:
+li $a3, 3
+slt $a3, $t0, $a3
+seq $a3, $a3, $zero
+beq $a3, $t1, comp_fir_basic41
+c5:
+c4:
+li $t2, 2
+comp_fir_basic25:
+li $t0, 0
+c3:
+sge $a3, $t2, $zero
+seq $a3, $a3, $zero
+beq $a3, $t0, comp_fir_basic19
+c12:
+li $a3, 1
+add $t3, $t3, $a3
+j comp_fir_basic64
+comp_fir_basic19:
+c1:
+li $a3, 4
+mulo $a3, $t2, $a3
+add $a3, $a2, $a3
+lw $t1, 0($a3)
+li $a3, 1
+add $t0, $t2, $a3
+li $a3, 4
+mulo $a3, $t0, $a3
+add $a3, $a2, $a3
+sw $t1, 0($a3)
+c2:
+li $a3, 1
+sub $t2, $t2, $a3
+j comp_fir_basic25
+comp_fir_basic41:
+c6:
+li $a3, 4
+mulo $a3, $t0, $a3
+add $a3, $a1, $a3
+lw $t1, 0($a3)
+li $a3, 4
+mulo $a3, $t0, $a3
+add $a3, $a2, $a3
+lw $a3, 0($a3)
+mulo $a3, $t1, $a3
+add $v0, $v0, $a3
+c7:
+li $a3, 1
+add $t0, $t0, $a3
+j comp_fir_basic47
+# end comp_fir_basic
+
+
+# begin comp_fir16
+comp_fir16373:
+addi $sp, $sp, -96
+sw $ra, 92($sp)
+sw $s6, 88($sp)
+sw $s5, 84($sp)
+sw $s4, 80($sp)
+sw $s3, 76($sp)
+sw $s2, 72($sp)
+sw $s1, 68($sp)
+sw $s0, 64($sp)
+move $s6, $a0
+move $s5, $a1
+move $s4, $a2
+move $s3, $a3
+c49:
+li $a1, 0
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c48:
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c47:
+move $a1, $sp
+li $a0, 2
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c46:
+move $a1, $sp
+li $a0, 3
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c45:
+move $a1, $sp
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c44:
+move $a1, $sp
+li $a0, 5
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c43:
+move $a1, $sp
+li $a0, 6
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c42:
+move $a1, $sp
+li $a0, 7
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c41:
+move $a1, $sp
+li $a0, 8
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c40:
+move $a1, $sp
+li $a0, 9
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c39:
+move $a1, $sp
+li $a0, 10
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c38:
+move $a1, $sp
+li $a0, 11
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c37:
+move $a1, $sp
+li $a0, 12
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c36:
+move $a1, $sp
+li $a0, 13
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c35:
+move $a1, $sp
+li $a0, 14
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c34:
+move $a1, $sp
+li $a0, 15
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c33:
+li $v0, 0
+c32:
+li $s2, 0
+c31:
+c30:
+li $s1, 0
+comp_fir1665:
+li $a1, 0
+c29:
+slt $a0, $s1, $s3
+seq $a0, $a0, $zero
+beq $a0, $a1, comp_fir1660
+c17:
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $sp, $v0
+lw $v0, 0($v0)
+lw $ra, 92($sp)
+lw $s6, 88($sp)
+lw $s5, 84($sp)
+lw $s4, 80($sp)
+lw $s3, 76($sp)
+lw $s2, 72($sp)
+lw $s1, 68($sp)
+lw $s0, 64($sp)
+addi $sp, $sp, 96
+jr $ra
+comp_fir1660:
+c27:
+li $a0, 4
+mulo $a0, $s1, $a0
+add $a0, $s6, $a0
+lw $a2, 0($a0)
+move $a1, $sp
+li $a0, 4
+mulo $a0, $v0, $a0
+add $a0, $a1, $a0
+sw $a2, 0($a0)
+c26:
+c25:
+li $s0, 0
+comp_fir1649:
+li $a1, 0
+c24:
+li $a0, 16
+slt $a0, $s0, $a0
+seq $a0, $a0, $zero
+beq $a0, $a1, comp_fir1643
+c19:
+li $a0, 1
+add $a0, $v0, $a0
+li $a1, 16
+la $v0, mod
+jalr $v0
+c18:
+li $a0, 4
+mulo $a0, $s1, $a0
+add $a0, $s4, $a0
+sw $s2, 0($a0)
+c28:
+li $a0, 1
+add $s1, $s1, $a0
+j comp_fir1665
+comp_fir1643:
+c22:
+move $a1, $sp
+li $a0, 4
+mulo $a0, $v0, $a0
+add $a0, $a1, $a0
+lw $a1, 0($a0)
+li $a0, 4
+mulo $a0, $s0, $a0
+add $a0, $s5, $a0
+lw $a0, 0($a0)
+mulo $a2, $a1, $a0
+li $a1, 2
+li $a0, 16
+xor $a0, $a1, $a0
+mulo $a0, $a2, $a0
+c21:
+add $s2, $s2, $a0
+c20:
+li $a0, 1
+add $a0, $v0, $a0
+li $a1, 16
+la $v0, mod
+jalr $v0
+c23:
+li $a0, 1
+add $s0, $s0, $a0
+j comp_fir1649
+# end comp_fir16
+
+
+# begin _main
+main307:
+addi $sp, $sp, -68
+sw $ra, 64($sp)
+c165:
+li $a1, 10
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c164:
+li $a2, 9
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c163:
+li $a2, 8
+move $a1, $sp
+li $a0, 2
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c162:
+li $a2, 7
+move $a1, $sp
+li $a0, 3
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c161:
+li $a2, 6
+move $a1, $sp
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c160:
+move $a1, $sp
+li $a0, 5
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c159:
+li $a2, 5
+move $a1, $sp
+li $a0, 6
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c158:
+li $a2, 4
+move $a1, $sp
+li $a0, 7
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c157:
+li $a2, 3
+move $a1, $sp
+li $a0, 8
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c156:
+li $a2, 2
+move $a1, $sp
+li $a0, 9
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c155:
+move $a1, $sp
+li $a0, 10
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c154:
+move $a1, $sp
+li $a0, 11
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c153:
+move $a1, $sp
+li $a0, 12
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c152:
+move $a1, $sp
+li $a0, 13
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c151:
+move $a1, $sp
+li $a0, 14
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c150:
+move $a1, $sp
+li $a0, 15
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c149:
+move $a0, $sp
+move $a1, $sp
+move $a2, $sp
+li $a3, 10
+li $t0, 10
+la $v0, comp_fir_basic141
+sw $t0, -4($sp)
+jalr $v0
+c148:
+move $a0, $sp
+move $a1, $sp
+move $a2, $sp
+li $a3, 16
+la $v0, comp_fir16373
+jalr $v0
+c147:
+li $a0, 4
+li $a1, 1
+li $a2, 1
+la $v0, comp_ifFor45
+jalr $v0
+c146:
+move $a0, $sp
+li $a1, 9
+li $a2, 3
+la $v0, comp_total410
+jalr $v0
+c145:
+move $a0, $sp
+li $a1, 10
+la $v0, comp_tri123
+jalr $v0
+c144:
+move $a0, $sp
+move $a1, $sp
+li $a2, 10
+li $a3, 10
+la $v0, comp_forif2153
+jalr $v0
+c143:
+la $v0, comp_forif65
+jalr $v0
+c142:
+lw $ra, 64($sp)
+addi $sp, $sp, 68
+jr $ra
+# end _main
--- /dev/null
+extern void *__builtin___memcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memmove_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___mempcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memset_chk(void *, int, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___stpcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcat_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strncat_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___strncpy_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern int __builtin___vfprintf_chk(void *, int, unsigned char *, void *);
+
+extern int __builtin___vprintf_chk(int, unsigned char *, void *);
+
+extern int __builtin___vsnprintf_chk(unsigned char *, unsigned int, int, unsigned int, unsigned char *, void *);
+
+extern int __builtin___vsprintf_chk(unsigned char *, int, unsigned int, unsigned char *, void *);
+
+extern double __builtin_acos(double);
+
+extern float __builtin_acosf(float);
+
+extern double __builtin_acosl(double);
+
+extern void *__builtin_alloca(unsigned int);
+
+extern double __builtin_asin(double);
+
+extern float __builtin_asinf(float);
+
+extern double __builtin_asinl(double);
+
+extern double __builtin_atan(double);
+
+extern float __builtin_atanf(float);
+
+extern double __builtin_atanl(double);
+
+extern double __builtin_atan2(double, double);
+
+extern float __builtin_atan2f(float, float);
+
+extern double __builtin_atan2l(double, double);
+
+extern double __builtin_ceil(double);
+
+extern float __builtin_ceilf(float);
+
+extern double __builtin_ceill(double);
+
+extern double __builtin_cos(double);
+
+extern float __builtin_cosf(float);
+
+extern double __builtin_cosl(double);
+
+extern double __builtin_cosh(double);
+
+extern float __builtin_coshf(float);
+
+extern double __builtin_coshl(double);
+
+extern int __builtin_clz(unsigned int);
+
+extern int __builtin_clzl(unsigned int);
+
+extern int __builtin_clzll(unsigned int);
+
+extern int __builtin_constant_p(int);
+
+extern int __builtin_ctz(unsigned int);
+
+extern int __builtin_ctzl(unsigned int);
+
+extern int __builtin_ctzll(unsigned int);
+
+extern double __builtin_exp(double);
+
+extern float __builtin_expf(float);
+
+extern double __builtin_expl(double);
+
+extern int __builtin_expect(int, int);
+
+extern double __builtin_fabs(double);
+
+extern float __builtin_fabsf(float);
+
+extern double __builtin_fabsl(double);
+
+extern int __builtin_ffs(unsigned int);
+
+extern int __builtin_ffsl(unsigned int);
+
+extern int __builtin_ffsll(unsigned int);
+
+extern void *__builtin_frame_address(unsigned int);
+
+extern double __builtin_floor(double);
+
+extern float __builtin_floorf(float);
+
+extern double __builtin_floorl(double);
+
+extern double __builtin_huge_val(void);
+
+extern float __builtin_huge_valf(void);
+
+extern double __builtin_huge_vall(void);
+
+extern double __builtin_inf(void);
+
+extern float __builtin_inff(void);
+
+extern double __builtin_infl(void);
+
+extern void *__builtin_memcpy(void *, void *, unsigned int);
+
+extern void *__builtin_mempcpy(void *, void *, unsigned int);
+
+extern double __builtin_fmod(double);
+
+extern float __builtin_fmodf(float);
+
+extern double __builtin_fmodl(double);
+
+extern double __builtin_frexp(double, int *);
+
+extern float __builtin_frexpf(float, int *);
+
+extern double __builtin_frexpl(double, int *);
+
+extern double __builtin_ldexp(double, int);
+
+extern float __builtin_ldexpf(float, int);
+
+extern double __builtin_ldexpl(double, int);
+
+extern double __builtin_log(double);
+
+extern float __builtin_logf(float);
+
+extern double __builtin_logl(double);
+
+extern double __builtin_log10(double);
+
+extern float __builtin_log10f(float);
+
+extern double __builtin_log10l(double);
+
+extern float __builtin_modff(float, float *);
+
+extern double __builtin_modfl(double, double *);
+
+extern double __builtin_nan(unsigned char *);
+
+extern float __builtin_nanf(unsigned char *);
+
+extern double __builtin_nanl(unsigned char *);
+
+extern double __builtin_nans(unsigned char *);
+
+extern float __builtin_nansf(unsigned char *);
+
+extern double __builtin_nansl(unsigned char *);
+
+extern void *__builtin_next_arg(void);
+
+extern unsigned int __builtin_object_size(void *, int);
+
+extern int __builtin_parity(unsigned int);
+
+extern int __builtin_parityl(unsigned int);
+
+extern int __builtin_parityll(unsigned int);
+
+extern int __builtin_popcount(unsigned int);
+
+extern int __builtin_popcountl(unsigned int);
+
+extern int __builtin_popcountll(unsigned int);
+
+extern double __builtin_powi(double, int);
+
+extern float __builtin_powif(float, int);
+
+extern double __builtin_powil(double, int);
+
+extern void __builtin_return(void *);
+
+extern void *__builtin_return_address(unsigned int);
+
+extern double __builtin_sin(double);
+
+extern float __builtin_sinf(float);
+
+extern double __builtin_sinl(double);
+
+extern double __builtin_sinh(double);
+
+extern float __builtin_sinhf(float);
+
+extern double __builtin_sinhl(double);
+
+extern double __builtin_sqrt(double);
+
+extern float __builtin_sqrtf(float);
+
+extern double __builtin_sqrtl(double);
+
+extern unsigned char *__builtin_stpcpy(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strchr(unsigned char *, unsigned char);
+
+extern int __builtin_strcmp(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strcpy(unsigned char *, unsigned char *);
+
+extern unsigned int __builtin_strcspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strncat(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strncmp(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin_strncpy(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strpbrk(unsigned char *, unsigned char *);
+
+extern int __builtin_types_compatible_p(unsigned int, unsigned int);
+
+extern double __builtin_tan(double);
+
+extern float __builtin_tanf(float);
+
+extern double __builtin_tanl(double);
+
+extern double __builtin_tanh(double);
+
+extern float __builtin_tanhf(float);
+
+extern double __builtin_tanhl(double);
+
+extern void __builtin_va_end(void *);
+
+extern void __builtin_varargs_start(void *);
+
+extern void __builtin_va_start(void *, void *);
+
+extern void __builtin_stdarg_start(void *);
+
+extern void __builtin_va_arg(void *, unsigned int);
+
+extern void __builtin_va_copy(void *, void *);
+
+int comp_fir_basic(int *input, int *h, int *z, int N, int n)
+{
+ int i;
+ int j;
+ int k;
+ int y;
+ c16:
+ y = 0;
+ c15:
+ for (({ c14: k = 0; }); (/* c13 */ k < 3); ({ c12: k = k + 1; })) {
+ c11:
+ z[0] = input[k];
+ c10:
+ for (({ c9: i = 0; }); (/* c8 */ i < 3); ({ c7: i = i + 1; })) {
+ c6:
+ y = y + h[i] * z[i];
+ }
+ c5:
+ for (({ c4: j = 2; }); (/* c3 */ j >= 0); ({ c2: j = j - 1; })) {
+ c1:
+ z[(j + 1)] = z[j];
+ }
+ }
+ c0:
+ return y;
+}
+
+int comp_fir16(int *in, int *c, int *out, int size)
+{
+ int i;
+ int j;
+ int res;
+ int tmp;
+ int x[16];
+ int adx;
+ c49:
+ x[0] = 0;
+ c48:
+ x[1] = 0;
+ c47:
+ x[2] = 0;
+ c46:
+ x[3] = 0;
+ c45:
+ x[4] = 0;
+ c44:
+ x[5] = 0;
+ c43:
+ x[6] = 0;
+ c42:
+ x[7] = 0;
+ c41:
+ x[8] = 0;
+ c40:
+ x[9] = 0;
+ c39:
+ x[10] = 0;
+ c38:
+ x[11] = 0;
+ c37:
+ x[12] = 0;
+ c36:
+ x[13] = 0;
+ c35:
+ x[14] = 0;
+ c34:
+ x[15] = 0;
+ c33:
+ adx = 0;
+ c32:
+ res = 0;
+ c31:
+ for (({ c30: j = 0; }); (/* c29 */ j < size); ({ c28: j = j + 1; })) {
+ c27:
+ x[adx] = in[j];
+ c26:
+ for (({ c25: i = 0; }); (/* c24 */ i < 16); ({ c23: i = i + 1; })) {
+ c22:
+ tmp = (x[adx] * c[i]) * (2 ^ 16);
+ c21:
+ res = res + tmp;
+ c20:
+ adx = (adx + 1) % 16;
+ }
+ c19:
+ adx = (adx + 1) % 16;
+ c18:
+ out[j] = res;
+ }
+ c17:
+ return x[0];
+}
+
+int comp_ifFor(int a, int b, int pas)
+{
+ int i;
+ int result;
+ c58:
+ result = 0;
+ c57:
+ for (({ c56: i = 0; }); (/* c55 */ i < a); ({ c54: i = i + pas; })) {
+ c53:
+ if (i != b) {
+ c52:
+ result = result + i;
+ } else {
+ c51:
+ result = 0;
+ }
+ }
+ c50:
+ return result;
+}
+
+int comp_total(int *tabParam, int a, int b)
+{
+ int i;
+ int j;
+ int k;
+ int tabLocal1[10];
+ int tabLocal2[10];
+ c94:
+ tabLocal1[0] = 0;
+ c93:
+ tabLocal1[1] = 0;
+ c92:
+ tabLocal1[2] = 0;
+ c91:
+ tabLocal1[3] = 0;
+ c90:
+ tabLocal1[4] = 0;
+ c89:
+ tabLocal1[5] = 0;
+ c88:
+ tabLocal1[6] = 0;
+ c87:
+ tabLocal1[7] = 0;
+ c86:
+ tabLocal1[8] = 0;
+ c85:
+ tabLocal1[9] = 0;
+ c84:
+ tabLocal2[0] = 0;
+ c83:
+ tabLocal2[1] = 0;
+ c82:
+ tabLocal2[2] = 0;
+ c81:
+ tabLocal2[3] = 0;
+ c80:
+ tabLocal2[4] = 0;
+ c79:
+ tabLocal2[5] = 0;
+ c78:
+ tabLocal2[6] = 0;
+ c77:
+ tabLocal2[7] = 0;
+ c76:
+ tabLocal2[8] = 0;
+ c75:
+ tabLocal2[9] = 0;
+ c74:
+ if (a < b) {
+ c73:
+ for (({ c72: i = 0; }); (/* c71 */ i <= a); ({ c70: i = i + 1; })) {
+ c69:
+ tabLocal1[i] = tabParam[(a - i)];
+ }
+ } else {
+ c68:
+ for (({ c67: k = 0; }); (/* c66 */ k < a); ({ c65: k = k + 1; })) {
+ c64:
+ for (({ c63: j = b; }); (/* c62 */ j > 0); ({ c61: j = j - 1; })) {
+ c60:
+ tabParam[k] = tabLocal1[k] + tabLocal2[j];
+ }
+ }
+ }
+ c59:
+ return 0;
+}
+
+int comp_tri(int *t, int n)
+{
+ int i;
+ int j;
+ int tmp;
+ c108:
+ tmp = 0;
+ c107:
+ for (({ c106: i = 0; }); (/* c105 */ i < n); ({ c104: i = i + 1; })) {
+ c103:
+ for (({ c102:
+ j = 1; });
+ (/* c101 */
+ j < n - i);
+ ({ c100:
+ j = j + 1; })) {
+ c99:
+ if (t[j] < t[(j - 1)]) {
+ c98:
+ tmp = t[(j - 1)];
+ c97:
+ t[(j - 1)] = t[j];
+ c96:
+ t[j] = tmp;
+ }
+ }
+ }
+ c95:
+ return tmp;
+}
+
+int comp_forif2(int *u, int *v, int a, int b)
+{
+ int i;
+ int j;
+ int k;
+ int l;
+ int res;
+ c130:
+ k = 0;
+ c129:
+ l = 0;
+ c128:
+ for (({ c127: i = 0; }); (/* c126 */ i < a); ({ c125: i = i + 1; })) {
+ c124:
+ k = k + u[i];
+ }
+ c123:
+ for (({ c122: j = 0; }); (/* c121 */ j < b); ({ c120: j = j + 1; })) {
+ c119:
+ l = l + v[j];
+ }
+ c118:
+ if ((/* c117 */ k % 2 == 0) && (/* c116 */ l % 2 == 0)) {
+ c115:
+ res = 0;
+ } else {
+ c114:
+ if (k % 2 == 0) {
+ c113:
+ res = 1;
+ } else {
+ c112:
+ if (l % 2 == 0) {
+ c111:
+ res = 2;
+ } else {
+ c110:
+ res = 3;
+ }
+ }
+ }
+ c109:
+ return 0;
+}
+
+int comp_forif(void)
+{
+ int i;
+ int j;
+ int k;
+ c141:
+ j = 0;
+ c140:
+ k = 0;
+ c139:
+ for (({ c138: i = 0; }); (/* c137 */ i < 10); ({ c136: i = i + 1; })) {
+ c135:
+ j = j + 1;
+ c134:
+ j = j + 1;
+ c133:
+ if (i % 2 == 0) {
+ c132:
+ k = k + 1;
+ }
+ }
+ c131:
+ return j;
+}
+
+int main(void)
+{
+ int a;
+ int t[16];
+ c165:
+ t[0] = 10;
+ c164:
+ t[1] = 9;
+ c163:
+ t[2] = 8;
+ c162:
+ t[3] = 7;
+ c161:
+ t[4] = 6;
+ c160:
+ t[5] = 0;
+ c159:
+ t[6] = 5;
+ c158:
+ t[7] = 4;
+ c157:
+ t[8] = 3;
+ c156:
+ t[9] = 2;
+ c155:
+ t[10] = 0;
+ c154:
+ t[11] = 0;
+ c153:
+ t[12] = 0;
+ c152:
+ t[13] = 0;
+ c151:
+ t[14] = 0;
+ c150:
+ t[15] = 0;
+ c149:
+ a = comp_fir_basic(t, t, t, 10, 10);
+ c148:
+ a = comp_fir16(t, t, t, 16);
+ c147:
+ a = comp_ifFor(4, 1, 1);
+ c146:
+ a = comp_total(t, 9, 3);
+ c145:
+ a = comp_tri(t, 10);
+ c144:
+ a = comp_forif2(t, t, 10, 10);
+ c143:
+ a = comp_forif();
+ c142:
+ return a;
+}
+
+
--- /dev/null
+
+
+
+extern "__builtin___memcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memmove_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___mempcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memset_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___stpcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcat_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strncat_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___strncpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vfprintf_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vprintf_chk" : int -> int -> int -> int
+
+
+extern "__builtin___vsnprintf_chk" : int -> int -> int -> int -> int -> int -> int
+
+
+extern "__builtin___vsprintf_chk" : int -> int -> int -> int -> int -> int
+
+
+extern "__builtin_acos" : float -> float
+
+
+extern "__builtin_acosf" : float -> float
+
+
+extern "__builtin_acosl" : float -> float
+
+
+extern "__builtin_alloca" : int -> int
+
+
+extern "__builtin_asin" : float -> float
+
+
+extern "__builtin_asinf" : float -> float
+
+
+extern "__builtin_asinl" : float -> float
+
+
+extern "__builtin_atan" : float -> float
+
+
+extern "__builtin_atanf" : float -> float
+
+
+extern "__builtin_atanl" : float -> float
+
+
+extern "__builtin_atan2" : float -> float -> float
+
+
+extern "__builtin_atan2f" : float -> float -> float
+
+
+extern "__builtin_atan2l" : float -> float -> float
+
+
+extern "__builtin_ceil" : float -> float
+
+
+extern "__builtin_ceilf" : float -> float
+
+
+extern "__builtin_ceill" : float -> float
+
+
+extern "__builtin_cos" : float -> float
+
+
+extern "__builtin_cosf" : float -> float
+
+
+extern "__builtin_cosl" : float -> float
+
+
+extern "__builtin_cosh" : float -> float
+
+
+extern "__builtin_coshf" : float -> float
+
+
+extern "__builtin_coshl" : float -> float
+
+
+extern "__builtin_clz" : int -> int
+
+
+extern "__builtin_clzl" : int -> int
+
+
+extern "__builtin_clzll" : int -> int
+
+
+extern "__builtin_constant_p" : int -> int
+
+
+extern "__builtin_ctz" : int -> int
+
+
+extern "__builtin_ctzl" : int -> int
+
+
+extern "__builtin_ctzll" : int -> int
+
+
+extern "__builtin_exp" : float -> float
+
+
+extern "__builtin_expf" : float -> float
+
+
+extern "__builtin_expl" : float -> float
+
+
+extern "__builtin_expect" : int -> int -> int
+
+
+extern "__builtin_fabs" : float -> float
+
+
+extern "__builtin_fabsf" : float -> float
+
+
+extern "__builtin_fabsl" : float -> float
+
+
+extern "__builtin_ffs" : int -> int
+
+
+extern "__builtin_ffsl" : int -> int
+
+
+extern "__builtin_ffsll" : int -> int
+
+
+extern "__builtin_frame_address" : int -> int
+
+
+extern "__builtin_floor" : float -> float
+
+
+extern "__builtin_floorf" : float -> float
+
+
+extern "__builtin_floorl" : float -> float
+
+
+extern "__builtin_huge_val" : float
+
+
+extern "__builtin_huge_valf" : float
+
+
+extern "__builtin_huge_vall" : float
+
+
+extern "__builtin_inf" : float
+
+
+extern "__builtin_inff" : float
+
+
+extern "__builtin_infl" : float
+
+
+extern "__builtin_memcpy" : int -> int -> int -> int
+
+
+extern "__builtin_mempcpy" : int -> int -> int -> int
+
+
+extern "__builtin_fmod" : float -> float
+
+
+extern "__builtin_fmodf" : float -> float
+
+
+extern "__builtin_fmodl" : float -> float
+
+
+extern "__builtin_frexp" : float -> int -> float
+
+
+extern "__builtin_frexpf" : float -> int -> float
+
+
+extern "__builtin_frexpl" : float -> int -> float
+
+
+extern "__builtin_ldexp" : float -> int -> float
+
+
+extern "__builtin_ldexpf" : float -> int -> float
+
+
+extern "__builtin_ldexpl" : float -> int -> float
+
+
+extern "__builtin_log" : float -> float
+
+
+extern "__builtin_logf" : float -> float
+
+
+extern "__builtin_logl" : float -> float
+
+
+extern "__builtin_log10" : float -> float
+
+
+extern "__builtin_log10f" : float -> float
+
+
+extern "__builtin_log10l" : float -> float
+
+
+extern "__builtin_modff" : float -> int -> float
+
+
+extern "__builtin_modfl" : float -> int -> float
+
+
+extern "__builtin_nan" : int -> float
+
+
+extern "__builtin_nanf" : int -> float
+
+
+extern "__builtin_nanl" : int -> float
+
+
+extern "__builtin_nans" : int -> float
+
+
+extern "__builtin_nansf" : int -> float
+
+
+extern "__builtin_nansl" : int -> float
+
+
+extern "__builtin_next_arg" : int
+
+
+extern "__builtin_object_size" : int -> int -> int
+
+
+extern "__builtin_parity" : int -> int
+
+
+extern "__builtin_parityl" : int -> int
+
+
+extern "__builtin_parityll" : int -> int
+
+
+extern "__builtin_popcount" : int -> int
+
+
+extern "__builtin_popcountl" : int -> int
+
+
+extern "__builtin_popcountll" : int -> int
+
+
+extern "__builtin_powi" : float -> int -> float
+
+
+extern "__builtin_powif" : float -> int -> float
+
+
+extern "__builtin_powil" : float -> int -> float
+
+
+extern "__builtin_return" : int -> void
+
+
+extern "__builtin_return_address" : int -> int
+
+
+extern "__builtin_sin" : float -> float
+
+
+extern "__builtin_sinf" : float -> float
+
+
+extern "__builtin_sinl" : float -> float
+
+
+extern "__builtin_sinh" : float -> float
+
+
+extern "__builtin_sinhf" : float -> float
+
+
+extern "__builtin_sinhl" : float -> float
+
+
+extern "__builtin_sqrt" : float -> float
+
+
+extern "__builtin_sqrtf" : float -> float
+
+
+extern "__builtin_sqrtl" : float -> float
+
+
+extern "__builtin_stpcpy" : int -> int -> int
+
+
+extern "__builtin_strchr" : int -> int -> int
+
+
+extern "__builtin_strcmp" : int -> int -> int
+
+
+extern "__builtin_strcpy" : int -> int -> int
+
+
+extern "__builtin_strcspn" : int -> int -> int
+
+
+extern "__builtin_strncat" : int -> int -> int -> int
+
+
+extern "__builtin_strncmp" : int -> int -> int -> int
+
+
+extern "__builtin_strncpy" : int -> int -> int -> int
+
+
+extern "__builtin_strspn" : int -> int -> int
+
+
+extern "__builtin_strpbrk" : int -> int -> int
+
+
+extern "__builtin_types_compatible_p" : int -> int -> int
+
+
+extern "__builtin_tan" : float -> float
+
+
+extern "__builtin_tanf" : float -> float
+
+
+extern "__builtin_tanl" : float -> float
+
+
+extern "__builtin_tanh" : float -> float
+
+
+extern "__builtin_tanhf" : float -> float
+
+
+extern "__builtin_tanhl" : float -> float
+
+
+extern "__builtin_va_end" : int -> void
+
+
+extern "__builtin_varargs_start" : int -> void
+
+
+extern "__builtin_va_start" : int -> int -> void
+
+
+extern "__builtin_stdarg_start" : int -> void
+
+
+extern "__builtin_va_arg" : int -> int -> void
+
+
+extern "__builtin_va_copy" : int -> int -> void
+
+
+"comp_fir_basic" (input, h, z, N, n) : int -> int -> int -> int -> int -> int {
+
+ stack 0;
+
+ var y, k, j, i;
+
+ c16:
+ y = 0;
+ c15:
+ c14:
+ k = 0;
+ block {
+ loop {
+ if (!(/* c13 */ k < 3)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c11:
+ int32[z + (0 * 4)] = int32[input + (k * 4)];
+ c10:
+ c9:
+ i = 0;
+ block {
+ loop {
+ if (!(/* c8 */ i < 3)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c6:
+ y = y + (int32[h + (i * 4)] * int32[z + (i * 4)]);
+ }
+ c7:
+ i = i + 1;
+ }
+ }
+ c5:
+ c4:
+ j = 2;
+ block {
+ loop {
+ if (!(/* c3 */ j >= 0)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c1:
+ int32[z + ((j + 1) * 4)] = int32[z + (j * 4)];
+ }
+ c2:
+ j = j - 1;
+ }
+ }
+ }
+ c12:
+ k = k + 1;
+ }
+ }
+ c0:
+ return y;
+
+}
+
+
+"comp_fir16" (in, c, out, size) : int -> int -> int -> int -> int {
+
+ stack 64;
+
+ var res, tmp, j, i, adx;
+
+ c49:
+ int32[&0 + (0 * 4)] = 0;
+ c48:
+ int32[&0 + (1 * 4)] = 0;
+ c47:
+ int32[&0 + (2 * 4)] = 0;
+ c46:
+ int32[&0 + (3 * 4)] = 0;
+ c45:
+ int32[&0 + (4 * 4)] = 0;
+ c44:
+ int32[&0 + (5 * 4)] = 0;
+ c43:
+ int32[&0 + (6 * 4)] = 0;
+ c42:
+ int32[&0 + (7 * 4)] = 0;
+ c41:
+ int32[&0 + (8 * 4)] = 0;
+ c40:
+ int32[&0 + (9 * 4)] = 0;
+ c39:
+ int32[&0 + (10 * 4)] = 0;
+ c38:
+ int32[&0 + (11 * 4)] = 0;
+ c37:
+ int32[&0 + (12 * 4)] = 0;
+ c36:
+ int32[&0 + (13 * 4)] = 0;
+ c35:
+ int32[&0 + (14 * 4)] = 0;
+ c34:
+ int32[&0 + (15 * 4)] = 0;
+ c33:
+ adx = 0;
+ c32:
+ res = 0;
+ c31:
+ c30:
+ j = 0;
+ block {
+ loop {
+ if (!(/* c29 */ j < size)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c27:
+ int32[&0 + (adx * 4)] = int32[in + (j * 4)];
+ c26:
+ c25:
+ i = 0;
+ block {
+ loop {
+ if (!(/* c24 */ i < 16)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c22:
+ tmp = (int32[&0 + (adx * 4)] * int32[c + (i * 4)]) * (2 ^ 16);
+ c21:
+ res = res + tmp;
+ c20:
+ adx = (adx + 1) % 16;
+ }
+ c23:
+ i = i + 1;
+ }
+ }
+ c19:
+ adx = (adx + 1) % 16;
+ c18:
+ int32[out + (j * 4)] = res;
+ }
+ c28:
+ j = j + 1;
+ }
+ }
+ c17:
+ return int32[&0 + (0 * 4)];
+
+}
+
+
+"comp_ifFor" (a, b, pas) : int -> int -> int -> int {
+
+ stack 0;
+
+ var i, result;
+
+ c58:
+ result = 0;
+ c57:
+ c56:
+ i = 0;
+ block {
+ loop {
+ if (!(/* c55 */ i < a)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c53:
+ if (i != b) {
+ c52:
+ result = result + i;
+ }
+ else {
+ c51:
+ result = 0;
+ }
+ }
+ c54:
+ i = i + pas;
+ }
+ }
+ c50:
+ return result;
+
+}
+
+
+"comp_total" (tabParam, a, b) : int -> int -> int -> int {
+
+ stack 80;
+
+ var k, j, i;
+
+ c94:
+ int32[&0 + (0 * 4)] = 0;
+ c93:
+ int32[&0 + (1 * 4)] = 0;
+ c92:
+ int32[&0 + (2 * 4)] = 0;
+ c91:
+ int32[&0 + (3 * 4)] = 0;
+ c90:
+ int32[&0 + (4 * 4)] = 0;
+ c89:
+ int32[&0 + (5 * 4)] = 0;
+ c88:
+ int32[&0 + (6 * 4)] = 0;
+ c87:
+ int32[&0 + (7 * 4)] = 0;
+ c86:
+ int32[&0 + (8 * 4)] = 0;
+ c85:
+ int32[&0 + (9 * 4)] = 0;
+ c84:
+ int32[&40 + (0 * 4)] = 0;
+ c83:
+ int32[&40 + (1 * 4)] = 0;
+ c82:
+ int32[&40 + (2 * 4)] = 0;
+ c81:
+ int32[&40 + (3 * 4)] = 0;
+ c80:
+ int32[&40 + (4 * 4)] = 0;
+ c79:
+ int32[&40 + (5 * 4)] = 0;
+ c78:
+ int32[&40 + (6 * 4)] = 0;
+ c77:
+ int32[&40 + (7 * 4)] = 0;
+ c76:
+ int32[&40 + (8 * 4)] = 0;
+ c75:
+ int32[&40 + (9 * 4)] = 0;
+ c74:
+ if (a < b) {
+ c73:
+ c72:
+ i = 0;
+ block {
+ loop {
+ if (!(/* c71 */ i <= a)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c69:
+ int32[&0 + (i * 4)] = int32[tabParam + ((a - i) * 4)];
+ }
+ c70:
+ i = i + 1;
+ }
+ }
+ }
+ else {
+ c68:
+ c67:
+ k = 0;
+ block {
+ loop {
+ if (!(/* c66 */ k < a)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c64:
+ c63:
+ j = b;
+ block {
+ loop {
+ if (!(/* c62 */ j > 0)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c60:
+ int32[tabParam + (k * 4)] = int32[&0 + (k * 4)] + int32[&40 + (j * 4)];
+ }
+ c61:
+ j = j - 1;
+ }
+ }
+ }
+ c65:
+ k = k + 1;
+ }
+ }
+ }
+ c59:
+ return 0;
+
+}
+
+
+"comp_tri" (t, n) : int -> int -> int {
+
+ stack 0;
+
+ var tmp, j, i;
+
+ c108:
+ tmp = 0;
+ c107:
+ c106:
+ i = 0;
+ block {
+ loop {
+ if (!(/* c105 */ i < n)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c103:
+ c102:
+ j = 1;
+ block {
+ loop {
+ if (!(/* c101 */ j < (n - i))) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c99:
+ if (int32[t + (j * 4)] < int32[t + ((j - 1) * 4)]) {
+ c98:
+ tmp = int32[t + ((j - 1) * 4)];
+ c97:
+ int32[t + ((j - 1) * 4)] = int32[t + (j * 4)];
+ c96:
+ int32[t + (j * 4)] = tmp;
+ }
+ else {
+ }
+ }
+ c100:
+ j = j + 1;
+ }
+ }
+ }
+ c104:
+ i = i + 1;
+ }
+ }
+ c95:
+ return tmp;
+
+}
+
+
+"comp_forif2" (u, v, a, b) : int -> int -> int -> int -> int {
+
+ stack 0;
+
+ var res, l, k, j, i;
+
+ c130:
+ k = 0;
+ c129:
+ l = 0;
+ c128:
+ c127:
+ i = 0;
+ block {
+ loop {
+ if (!(/* c126 */ i < a)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c124:
+ k = k + int32[u + (i * 4)];
+ }
+ c125:
+ i = i + 1;
+ }
+ }
+ c123:
+ c122:
+ j = 0;
+ block {
+ loop {
+ if (!(/* c121 */ j < b)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c119:
+ l = l + int32[v + (j * 4)];
+ }
+ c120:
+ j = j + 1;
+ }
+ }
+ c118:
+ if ((/* c117 */ (k % 2) == 0) ? ((/* c116 */ (l % 2) == 0) ? 1 : 0) : 0) {
+ c115:
+ res = 0;
+ }
+ else {
+ c114:
+ if ((k % 2) == 0) {
+ c113:
+ res = 1;
+ }
+ else {
+ c112:
+ if ((l % 2) == 0) {
+ c111:
+ res = 2;
+ }
+ else {
+ c110:
+ res = 3;
+ }
+ }
+ }
+ c109:
+ return 0;
+
+}
+
+
+"comp_forif" () : int {
+
+ stack 0;
+
+ var k, j, i;
+
+ c141:
+ j = 0;
+ c140:
+ k = 0;
+ c139:
+ c138:
+ i = 0;
+ block {
+ loop {
+ if (!(/* c137 */ i < 10)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c135:
+ j = j + 1;
+ c134:
+ j = j + 1;
+ c133:
+ if ((i % 2) == 0) {
+ c132:
+ k = k + 1;
+ }
+ else {
+ }
+ }
+ c136:
+ i = i + 1;
+ }
+ }
+ c131:
+ return j;
+
+}
+
+
+"main" () : int {
+
+ stack 64;
+
+ var a;
+
+ c165:
+ int32[&0 + (0 * 4)] = 10;
+ c164:
+ int32[&0 + (1 * 4)] = 9;
+ c163:
+ int32[&0 + (2 * 4)] = 8;
+ c162:
+ int32[&0 + (3 * 4)] = 7;
+ c161:
+ int32[&0 + (4 * 4)] = 6;
+ c160:
+ int32[&0 + (5 * 4)] = 0;
+ c159:
+ int32[&0 + (6 * 4)] = 5;
+ c158:
+ int32[&0 + (7 * 4)] = 4;
+ c157:
+ int32[&0 + (8 * 4)] = 3;
+ c156:
+ int32[&0 + (9 * 4)] = 2;
+ c155:
+ int32[&0 + (10 * 4)] = 0;
+ c154:
+ int32[&0 + (11 * 4)] = 0;
+ c153:
+ int32[&0 + (12 * 4)] = 0;
+ c152:
+ int32[&0 + (13 * 4)] = 0;
+ c151:
+ int32[&0 + (14 * 4)] = 0;
+ c150:
+ int32[&0 + (15 * 4)] = 0;
+ c149:
+ a = "comp_fir_basic"(&0, &0, &0, 10, 10) : int -> int -> int -> int -> int -> int;
+ c148:
+ a = "comp_fir16"(&0, &0, &0, 16) : int -> int -> int -> int -> int;
+ c147:
+ a = "comp_ifFor"(4, 1, 1) : int -> int -> int -> int;
+ c146:
+ a = "comp_total"(&0, 9, 3) : int -> int -> int -> int;
+ c145:
+ a = "comp_tri"(&0, 10) : int -> int -> int;
+ c144:
+ a = "comp_forif2"(&0, &0, 10, 10) : int -> int -> int -> int -> int;
+ c143:
+ a = "comp_forif"() : int;
+ c142:
+ return a;
+
+}
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure comp_tri(2)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54
+entry comp_tri123
+comp_tri123: newframe --> comp_tri122
+comp_tri122: move %54, $ra --> comp_tri121
+comp_tri121: move %53, $s7 --> comp_tri120
+comp_tri120: move %52, $s6 --> comp_tri119
+comp_tri119: move %51, $s5 --> comp_tri118
+comp_tri118: move %50, $s4 --> comp_tri117
+comp_tri117: move %49, $s3 --> comp_tri116
+comp_tri116: move %48, $s2 --> comp_tri115
+comp_tri115: move %47, $s1 --> comp_tri114
+comp_tri114: move %46, $s0 --> comp_tri113
+comp_tri113: move %0, $a0 --> comp_tri112
+comp_tri112: move %1, $a1 --> comp_tri111
+comp_tri111: li %2, 0 --> comp_tri110
+comp_tri110: li %3, 0 --> comp_tri109
+comp_tri109: li %4, 0 --> comp_tri108
+comp_tri108: li %6, 0 --> comp_tri107
+comp_tri107: li %7, 0 --> comp_tri106
+comp_tri106: li %8, 0 --> comp_tri105
+comp_tri105: li %9, 0 --> comp_tri104
+comp_tri104: li %10, 0 --> comp_tri103
+comp_tri103: li %11, 0 --> comp_tri102
+comp_tri102: li %12, 0 --> comp_tri101
+comp_tri101: li %13, 0 --> comp_tri100
+comp_tri100: li %14, 0 --> comp_tri99
+comp_tri99 : li %15, 0 --> comp_tri98
+comp_tri98 : li %16, 0 --> comp_tri97
+comp_tri97 : li %17, 0 --> comp_tri96
+comp_tri96 : li %18, 0 --> comp_tri95
+comp_tri95 : li %19, 0 --> comp_tri94
+comp_tri94 : li %20, 0 --> comp_tri93
+comp_tri93 : li %21, 0 --> comp_tri92
+comp_tri92 : li %22, 0 --> comp_tri91
+comp_tri91 : li %23, 0 --> comp_tri90
+comp_tri90 : li %24, 0 --> comp_tri89
+comp_tri89 : li %25, 0 --> comp_tri88
+comp_tri88 : li %26, 0 --> comp_tri87
+comp_tri87 : li %27, 0 --> comp_tri86
+comp_tri86 : li %28, 0 --> comp_tri85
+comp_tri85 : li %29, 0 --> comp_tri84
+comp_tri84 : li %30, 0 --> comp_tri83
+comp_tri83 : li %31, 0 --> comp_tri82
+comp_tri82 : li %32, 0 --> comp_tri81
+comp_tri81 : li %33, 0 --> comp_tri80
+comp_tri80 : li %34, 0 --> comp_tri79
+comp_tri79 : li %35, 0 --> comp_tri78
+comp_tri78 : li %36, 0 --> comp_tri77
+comp_tri77 : li %37, 0 --> comp_tri76
+comp_tri76 : li %38, 0 --> comp_tri75
+comp_tri75 : li %39, 0 --> comp_tri74
+comp_tri74 : li %40, 0 --> comp_tri73
+comp_tri73 : li %41, 0 --> comp_tri72
+comp_tri72 : li %42, 0 --> comp_tri71
+comp_tri71 : li %43, 0 --> comp_tri70
+comp_tri70 : li %44, 0 --> comp_tri69
+comp_tri69 : li %45, 0 --> comp_tri60
+comp_tri60 : emit c108 --> comp_tri59
+comp_tri59 : li %2, 0 --> comp_tri58
+comp_tri58 : emit c107 --> comp_tri57
+comp_tri57 : emit c106 --> comp_tri56
+comp_tri56 : li %4, 0 --> comp_tri3
+comp_tri3 : j --> comp_tri55
+comp_tri55 : li %36, 0 --> comp_tri54
+comp_tri54 : emit c105 --> comp_tri53
+comp_tri53 : slt %37, %4, %1 --> comp_tri52
+comp_tri52 : li %45, 0 --> comp_tri68
+comp_tri68 : seq %35, %37, %45 --> comp_tri51
+comp_tri51 : beq %35, %36 --> comp_tri50, comp_tri2
+comp_tri2 : emit c95 --> comp_tri1
+comp_tri1 : move %5, %2 --> comp_tri0
+comp_tri0 : j --> comp_tri135
+comp_tri135: move $v0, %5 --> comp_tri134
+comp_tri134: move $ra, %54 --> comp_tri133
+comp_tri133: move $s7, %53 --> comp_tri132
+comp_tri132: move $s6, %52 --> comp_tri131
+comp_tri131: move $s5, %51 --> comp_tri130
+comp_tri130: move $s4, %50 --> comp_tri129
+comp_tri129: move $s3, %49 --> comp_tri128
+comp_tri128: move $s2, %48 --> comp_tri127
+comp_tri127: move $s1, %47 --> comp_tri126
+comp_tri126: move $s0, %46 --> comp_tri125
+comp_tri125: delframe --> comp_tri124
+comp_tri124: jr $ra (xmits $v0)
+comp_tri50 : emit c103 --> comp_tri49
+comp_tri49 : emit c102 --> comp_tri48
+comp_tri48 : li %3, 1 --> comp_tri7
+comp_tri7 : j --> comp_tri47
+comp_tri47 : li %32, 0 --> comp_tri46
+comp_tri46 : emit c101 --> comp_tri45
+comp_tri45 : sub %34, %1, %4 --> comp_tri44
+comp_tri44 : slt %33, %3, %34 --> comp_tri43
+comp_tri43 : li %44, 0 --> comp_tri67
+comp_tri67 : seq %31, %33, %44 --> comp_tri42
+comp_tri42 : beq %31, %32 --> comp_tri41, comp_tri6
+comp_tri6 : emit c104 --> comp_tri5
+comp_tri5 : li %6, 1 --> comp_tri4
+comp_tri4 : add %4, %4, %6 --> comp_tri3
+comp_tri41 : emit c99 --> comp_tri40
+comp_tri40 : li %22, 0 --> comp_tri39
+comp_tri39 : li %30, 4 --> comp_tri38
+comp_tri38 : mulo %29, %3, %30 --> comp_tri37
+comp_tri37 : add %43, %0, %29 --> comp_tri66
+comp_tri66 : lw %23, 0(%43) --> comp_tri36
+comp_tri36 : li %28, 1 --> comp_tri35
+comp_tri35 : sub %26, %3, %28 --> comp_tri34
+comp_tri34 : li %27, 4 --> comp_tri33
+comp_tri33 : mulo %25, %26, %27 --> comp_tri32
+comp_tri32 : add %42, %0, %25 --> comp_tri65
+comp_tri65 : lw %24, 0(%42) --> comp_tri31
+comp_tri31 : slt %21, %23, %24 --> comp_tri30
+comp_tri30 : beq %21, %22 --> comp_tri10, comp_tri29
+comp_tri29 : emit c98 --> comp_tri28
+comp_tri28 : li %20, 1 --> comp_tri27
+comp_tri27 : sub %18, %3, %20 --> comp_tri26
+comp_tri26 : li %19, 4 --> comp_tri25
+comp_tri25 : mulo %17, %18, %19 --> comp_tri24
+comp_tri24 : add %41, %0, %17 --> comp_tri64
+comp_tri64 : lw %2, 0(%41) --> comp_tri23
+comp_tri23 : emit c97 --> comp_tri22
+comp_tri22 : li %16, 4 --> comp_tri21
+comp_tri21 : mulo %15, %3, %16 --> comp_tri20
+comp_tri20 : add %40, %0, %15 --> comp_tri63
+comp_tri63 : lw %10, 0(%40) --> comp_tri19
+comp_tri19 : li %14, 1 --> comp_tri18
+comp_tri18 : sub %12, %3, %14 --> comp_tri17
+comp_tri17 : li %13, 4 --> comp_tri16
+comp_tri16 : mulo %11, %12, %13 --> comp_tri15
+comp_tri15 : add %39, %0, %11 --> comp_tri62
+comp_tri62 : sw %10, 0(%39) --> comp_tri14
+comp_tri14 : emit c96 --> comp_tri13
+comp_tri13 : li %9, 4 --> comp_tri12
+comp_tri12 : mulo %8, %3, %9 --> comp_tri11
+comp_tri11 : add %38, %0, %8 --> comp_tri61
+comp_tri61 : sw %2, 0(%38) --> comp_tri10
+comp_tri10 : emit c100 --> comp_tri9
+comp_tri9 : li %7, 1 --> comp_tri8
+comp_tri8 : add %3, %3, %7 --> comp_tri7
+
+procedure comp_total(3)
+stacksize 80
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78, %79, %80, %81, %82, %83,
+ %84, %85, %86, %87, %88, %89, %90,
+ %91, %92, %93, %94, %95, %96, %97,
+ %98, %99, %100, %101, %102, %103, %104,
+ %105, %106, %107, %108, %109, %110, %111,
+ %112, %113, %114, %115, %116, %117, %118,
+ %119, %120, %121, %122, %123, %124, %125,
+ %126, %127, %128, %129, %130, %131, %132,
+ %133, %134, %135, %136, %137, %138, %139,
+ %140, %141, %142, %143, %144, %145, %146,
+ %147, %148, %149, %150, %151, %152, %153,
+ %154, %155, %156, %157, %158, %159, %160,
+ %161, %162, %163, %164, %165, %166, %167,
+ %168, %169, %170, %171, %172, %173, %174,
+ %175, %176
+entry comp_total410
+comp_total410: newframe --> comp_total409
+comp_total409: move %176, $ra --> comp_total408
+comp_total408: move %175, $s7 --> comp_total407
+comp_total407: move %174, $s6 --> comp_total406
+comp_total406: move %173, $s5 --> comp_total405
+comp_total405: move %172, $s4 --> comp_total404
+comp_total404: move %171, $s3 --> comp_total403
+comp_total403: move %170, $s2 --> comp_total402
+comp_total402: move %169, $s1 --> comp_total401
+comp_total401: move %168, $s0 --> comp_total400
+comp_total400: move %0, $a0 --> comp_total399
+comp_total399: move %1, $a1 --> comp_total398
+comp_total398: move %2, $a2 --> comp_total397
+comp_total397: li %3, 0 --> comp_total396
+comp_total396: li %4, 0 --> comp_total395
+comp_total395: li %5, 0 --> comp_total394
+comp_total394: li %7, 0 --> comp_total393
+comp_total393: li %8, 0 --> comp_total392
+comp_total392: li %9, 0 --> comp_total391
+comp_total391: li %10, 0 --> comp_total390
+comp_total390: li %11, 0 --> comp_total389
+comp_total389: li %12, 0 --> comp_total388
+comp_total388: li %13, 0 --> comp_total387
+comp_total387: li %14, 0 --> comp_total386
+comp_total386: li %15, 0 --> comp_total385
+comp_total385: li %16, 0 --> comp_total384
+comp_total384: li %17, 0 --> comp_total383
+comp_total383: li %18, 0 --> comp_total382
+comp_total382: li %19, 0 --> comp_total381
+comp_total381: li %20, 0 --> comp_total380
+comp_total380: li %21, 0 --> comp_total379
+comp_total379: li %22, 0 --> comp_total378
+comp_total378: li %23, 0 --> comp_total377
+comp_total377: li %24, 0 --> comp_total376
+comp_total376: li %25, 0 --> comp_total375
+comp_total375: li %26, 0 --> comp_total374
+comp_total374: li %27, 0 --> comp_total373
+comp_total373: li %28, 0 --> comp_total372
+comp_total372: li %29, 0 --> comp_total371
+comp_total371: li %30, 0 --> comp_total370
+comp_total370: li %31, 0 --> comp_total369
+comp_total369: li %32, 0 --> comp_total368
+comp_total368: li %33, 0 --> comp_total367
+comp_total367: li %34, 0 --> comp_total366
+comp_total366: li %35, 0 --> comp_total365
+comp_total365: li %36, 0 --> comp_total364
+comp_total364: li %37, 0 --> comp_total363
+comp_total363: li %38, 0 --> comp_total362
+comp_total362: li %39, 0 --> comp_total361
+comp_total361: li %40, 0 --> comp_total360
+comp_total360: li %41, 0 --> comp_total359
+comp_total359: li %42, 0 --> comp_total358
+comp_total358: li %43, 0 --> comp_total357
+comp_total357: li %44, 0 --> comp_total356
+comp_total356: li %45, 0 --> comp_total355
+comp_total355: li %46, 0 --> comp_total354
+comp_total354: li %47, 0 --> comp_total353
+comp_total353: li %48, 0 --> comp_total352
+comp_total352: li %49, 0 --> comp_total351
+comp_total351: li %50, 0 --> comp_total350
+comp_total350: li %51, 0 --> comp_total349
+comp_total349: li %52, 0 --> comp_total348
+comp_total348: li %53, 0 --> comp_total347
+comp_total347: li %54, 0 --> comp_total346
+comp_total346: li %55, 0 --> comp_total345
+comp_total345: li %56, 0 --> comp_total344
+comp_total344: li %57, 0 --> comp_total343
+comp_total343: li %58, 0 --> comp_total342
+comp_total342: li %59, 0 --> comp_total341
+comp_total341: li %60, 0 --> comp_total340
+comp_total340: li %61, 0 --> comp_total339
+comp_total339: li %62, 0 --> comp_total338
+comp_total338: li %63, 0 --> comp_total337
+comp_total337: li %64, 0 --> comp_total336
+comp_total336: li %65, 0 --> comp_total335
+comp_total335: li %66, 0 --> comp_total334
+comp_total334: li %67, 0 --> comp_total333
+comp_total333: li %68, 0 --> comp_total332
+comp_total332: li %69, 0 --> comp_total331
+comp_total331: li %70, 0 --> comp_total330
+comp_total330: li %71, 0 --> comp_total329
+comp_total329: li %72, 0 --> comp_total328
+comp_total328: li %73, 0 --> comp_total327
+comp_total327: li %74, 0 --> comp_total326
+comp_total326: li %75, 0 --> comp_total325
+comp_total325: li %76, 0 --> comp_total324
+comp_total324: li %77, 0 --> comp_total323
+comp_total323: li %78, 0 --> comp_total322
+comp_total322: li %79, 0 --> comp_total321
+comp_total321: li %80, 0 --> comp_total320
+comp_total320: li %81, 0 --> comp_total319
+comp_total319: li %82, 0 --> comp_total318
+comp_total318: li %83, 0 --> comp_total317
+comp_total317: li %84, 0 --> comp_total316
+comp_total316: li %85, 0 --> comp_total315
+comp_total315: li %86, 0 --> comp_total314
+comp_total314: li %87, 0 --> comp_total313
+comp_total313: li %88, 0 --> comp_total312
+comp_total312: li %89, 0 --> comp_total311
+comp_total311: li %90, 0 --> comp_total310
+comp_total310: li %91, 0 --> comp_total309
+comp_total309: li %92, 0 --> comp_total308
+comp_total308: li %93, 0 --> comp_total307
+comp_total307: li %94, 0 --> comp_total306
+comp_total306: li %95, 0 --> comp_total305
+comp_total305: li %96, 0 --> comp_total304
+comp_total304: li %97, 0 --> comp_total303
+comp_total303: li %98, 0 --> comp_total302
+comp_total302: li %99, 0 --> comp_total301
+comp_total301: li %100, 0 --> comp_total300
+comp_total300: li %101, 0 --> comp_total299
+comp_total299: li %102, 0 --> comp_total298
+comp_total298: li %103, 0 --> comp_total297
+comp_total297: li %104, 0 --> comp_total296
+comp_total296: li %105, 0 --> comp_total295
+comp_total295: li %106, 0 --> comp_total294
+comp_total294: li %107, 0 --> comp_total293
+comp_total293: li %108, 0 --> comp_total292
+comp_total292: li %109, 0 --> comp_total291
+comp_total291: li %110, 0 --> comp_total290
+comp_total290: li %111, 0 --> comp_total289
+comp_total289: li %112, 0 --> comp_total288
+comp_total288: li %113, 0 --> comp_total287
+comp_total287: li %114, 0 --> comp_total286
+comp_total286: li %115, 0 --> comp_total285
+comp_total285: li %116, 0 --> comp_total284
+comp_total284: li %117, 0 --> comp_total283
+comp_total283: li %118, 0 --> comp_total282
+comp_total282: li %119, 0 --> comp_total281
+comp_total281: li %120, 0 --> comp_total280
+comp_total280: li %121, 0 --> comp_total279
+comp_total279: li %122, 0 --> comp_total278
+comp_total278: li %123, 0 --> comp_total277
+comp_total277: li %124, 0 --> comp_total276
+comp_total276: li %125, 0 --> comp_total275
+comp_total275: li %126, 0 --> comp_total274
+comp_total274: li %127, 0 --> comp_total273
+comp_total273: li %128, 0 --> comp_total272
+comp_total272: li %129, 0 --> comp_total271
+comp_total271: li %130, 0 --> comp_total270
+comp_total270: li %131, 0 --> comp_total269
+comp_total269: li %132, 0 --> comp_total268
+comp_total268: li %133, 0 --> comp_total267
+comp_total267: li %134, 0 --> comp_total266
+comp_total266: li %135, 0 --> comp_total265
+comp_total265: li %136, 0 --> comp_total264
+comp_total264: li %137, 0 --> comp_total263
+comp_total263: li %138, 0 --> comp_total262
+comp_total262: li %139, 0 --> comp_total261
+comp_total261: li %140, 0 --> comp_total260
+comp_total260: li %141, 0 --> comp_total259
+comp_total259: li %142, 0 --> comp_total258
+comp_total258: li %143, 0 --> comp_total257
+comp_total257: li %144, 0 --> comp_total256
+comp_total256: li %145, 0 --> comp_total255
+comp_total255: li %146, 0 --> comp_total254
+comp_total254: li %147, 0 --> comp_total253
+comp_total253: li %148, 0 --> comp_total252
+comp_total252: li %149, 0 --> comp_total251
+comp_total251: li %150, 0 --> comp_total250
+comp_total250: li %151, 0 --> comp_total249
+comp_total249: li %152, 0 --> comp_total248
+comp_total248: li %153, 0 --> comp_total247
+comp_total247: li %154, 0 --> comp_total246
+comp_total246: li %155, 0 --> comp_total245
+comp_total245: li %156, 0 --> comp_total244
+comp_total244: li %157, 0 --> comp_total243
+comp_total243: li %158, 0 --> comp_total242
+comp_total242: li %159, 0 --> comp_total241
+comp_total241: li %160, 0 --> comp_total240
+comp_total240: li %161, 0 --> comp_total239
+comp_total239: li %162, 0 --> comp_total238
+comp_total238: li %163, 0 --> comp_total237
+comp_total237: li %164, 0 --> comp_total236
+comp_total236: li %165, 0 --> comp_total235
+comp_total235: li %166, 0 --> comp_total234
+comp_total234: li %167, 0 --> comp_total205
+comp_total205: emit c94 --> comp_total204
+comp_total204: li %135, 0 --> comp_total203
+comp_total203: move %136, $sp --> comp_total438
+comp_total438: move %136, %136 --> comp_total202
+comp_total202: li %138, 0 --> comp_total201
+comp_total201: li %139, 4 --> comp_total200
+comp_total200: mulo %137, %138, %139 --> comp_total199
+comp_total199: add %157, %136, %137 --> comp_total223
+comp_total223: sw %135, 0(%157) --> comp_total198
+comp_total198: emit c93 --> comp_total197
+comp_total197: li %130, 0 --> comp_total196
+comp_total196: move %131, $sp --> comp_total437
+comp_total437: move %131, %131 --> comp_total195
+comp_total195: li %133, 1 --> comp_total194
+comp_total194: li %134, 4 --> comp_total193
+comp_total193: mulo %132, %133, %134 --> comp_total192
+comp_total192: add %156, %131, %132 --> comp_total222
+comp_total222: sw %130, 0(%156) --> comp_total191
+comp_total191: emit c92 --> comp_total190
+comp_total190: li %125, 0 --> comp_total189
+comp_total189: move %126, $sp --> comp_total436
+comp_total436: move %126, %126 --> comp_total188
+comp_total188: li %128, 2 --> comp_total187
+comp_total187: li %129, 4 --> comp_total186
+comp_total186: mulo %127, %128, %129 --> comp_total185
+comp_total185: add %154, %126, %127 --> comp_total220
+comp_total220: sw %125, 0(%154) --> comp_total184
+comp_total184: emit c91 --> comp_total183
+comp_total183: li %120, 0 --> comp_total182
+comp_total182: move %121, $sp --> comp_total435
+comp_total435: move %121, %121 --> comp_total181
+comp_total181: li %123, 3 --> comp_total180
+comp_total180: li %124, 4 --> comp_total179
+comp_total179: mulo %122, %123, %124 --> comp_total178
+comp_total178: add %153, %121, %122 --> comp_total219
+comp_total219: sw %120, 0(%153) --> comp_total177
+comp_total177: emit c90 --> comp_total176
+comp_total176: li %115, 0 --> comp_total175
+comp_total175: move %116, $sp --> comp_total433
+comp_total433: move %116, %116 --> comp_total174
+comp_total174: li %118, 4 --> comp_total173
+comp_total173: li %119, 4 --> comp_total172
+comp_total172: mulo %117, %118, %119 --> comp_total171
+comp_total171: add %152, %116, %117 --> comp_total218
+comp_total218: sw %115, 0(%152) --> comp_total170
+comp_total170: emit c89 --> comp_total169
+comp_total169: li %110, 0 --> comp_total168
+comp_total168: move %111, $sp --> comp_total432
+comp_total432: move %111, %111 --> comp_total167
+comp_total167: li %113, 5 --> comp_total166
+comp_total166: li %114, 4 --> comp_total165
+comp_total165: mulo %112, %113, %114 --> comp_total164
+comp_total164: add %151, %111, %112 --> comp_total217
+comp_total217: sw %110, 0(%151) --> comp_total163
+comp_total163: emit c88 --> comp_total162
+comp_total162: li %105, 0 --> comp_total161
+comp_total161: move %106, $sp --> comp_total431
+comp_total431: move %106, %106 --> comp_total160
+comp_total160: li %108, 6 --> comp_total159
+comp_total159: li %109, 4 --> comp_total158
+comp_total158: mulo %107, %108, %109 --> comp_total157
+comp_total157: add %150, %106, %107 --> comp_total216
+comp_total216: sw %105, 0(%150) --> comp_total156
+comp_total156: emit c87 --> comp_total155
+comp_total155: li %100, 0 --> comp_total154
+comp_total154: move %101, $sp --> comp_total430
+comp_total430: move %101, %101 --> comp_total153
+comp_total153: li %103, 7 --> comp_total152
+comp_total152: li %104, 4 --> comp_total151
+comp_total151: mulo %102, %103, %104 --> comp_total150
+comp_total150: add %149, %101, %102 --> comp_total215
+comp_total215: sw %100, 0(%149) --> comp_total149
+comp_total149: emit c86 --> comp_total148
+comp_total148: li %95, 0 --> comp_total147
+comp_total147: move %96, $sp --> comp_total429
+comp_total429: move %96, %96 --> comp_total146
+comp_total146: li %98, 8 --> comp_total145
+comp_total145: li %99, 4 --> comp_total144
+comp_total144: mulo %97, %98, %99 --> comp_total143
+comp_total143: add %147, %96, %97 --> comp_total213
+comp_total213: sw %95, 0(%147) --> comp_total142
+comp_total142: emit c85 --> comp_total141
+comp_total141: li %90, 0 --> comp_total140
+comp_total140: move %91, $sp --> comp_total428
+comp_total428: move %91, %91 --> comp_total139
+comp_total139: li %93, 9 --> comp_total138
+comp_total138: li %94, 4 --> comp_total137
+comp_total137: mulo %92, %93, %94 --> comp_total136
+comp_total136: add %146, %91, %92 --> comp_total212
+comp_total212: sw %90, 0(%146) --> comp_total135
+comp_total135: emit c84 --> comp_total134
+comp_total134: li %85, 0 --> comp_total133
+comp_total133: move %86, $sp --> comp_total427
+comp_total427: addi %86, %86, 40 --> comp_total132
+comp_total132: li %88, 0 --> comp_total131
+comp_total131: li %89, 4 --> comp_total130
+comp_total130: mulo %87, %88, %89 --> comp_total129
+comp_total129: add %145, %86, %87 --> comp_total211
+comp_total211: sw %85, 0(%145) --> comp_total128
+comp_total128: emit c83 --> comp_total127
+comp_total127: li %80, 0 --> comp_total126
+comp_total126: move %81, $sp --> comp_total426
+comp_total426: addi %81, %81, 40 --> comp_total125
+comp_total125: li %83, 1 --> comp_total124
+comp_total124: li %84, 4 --> comp_total123
+comp_total123: mulo %82, %83, %84 --> comp_total122
+comp_total122: add %144, %81, %82 --> comp_total210
+comp_total210: sw %80, 0(%144) --> comp_total121
+comp_total121: emit c82 --> comp_total120
+comp_total120: li %75, 0 --> comp_total119
+comp_total119: move %76, $sp --> comp_total425
+comp_total425: addi %76, %76, 40 --> comp_total118
+comp_total118: li %78, 2 --> comp_total117
+comp_total117: li %79, 4 --> comp_total116
+comp_total116: mulo %77, %78, %79 --> comp_total115
+comp_total115: add %143, %76, %77 --> comp_total209
+comp_total209: sw %75, 0(%143) --> comp_total114
+comp_total114: emit c81 --> comp_total113
+comp_total113: li %70, 0 --> comp_total112
+comp_total112: move %71, $sp --> comp_total424
+comp_total424: addi %71, %71, 40 --> comp_total111
+comp_total111: li %73, 3 --> comp_total110
+comp_total110: li %74, 4 --> comp_total109
+comp_total109: mulo %72, %73, %74 --> comp_total108
+comp_total108: add %141, %71, %72 --> comp_total207
+comp_total207: sw %70, 0(%141) --> comp_total107
+comp_total107: emit c80 --> comp_total106
+comp_total106: li %65, 0 --> comp_total105
+comp_total105: move %66, $sp --> comp_total423
+comp_total423: addi %66, %66, 40 --> comp_total104
+comp_total104: li %68, 4 --> comp_total103
+comp_total103: li %69, 4 --> comp_total102
+comp_total102: mulo %67, %68, %69 --> comp_total101
+comp_total101: add %140, %66, %67 --> comp_total206
+comp_total206: sw %65, 0(%140) --> comp_total100
+comp_total100: emit c79 --> comp_total99
+comp_total99 : li %60, 0 --> comp_total98
+comp_total98 : move %61, $sp --> comp_total445
+comp_total445: addi %61, %61, 40 --> comp_total97
+comp_total97 : li %63, 5 --> comp_total96
+comp_total96 : li %64, 4 --> comp_total95
+comp_total95 : mulo %62, %63, %64 --> comp_total94
+comp_total94 : add %167, %61, %62 --> comp_total233
+comp_total233: sw %60, 0(%167) --> comp_total93
+comp_total93 : emit c78 --> comp_total92
+comp_total92 : li %55, 0 --> comp_total91
+comp_total91 : move %56, $sp --> comp_total444
+comp_total444: addi %56, %56, 40 --> comp_total90
+comp_total90 : li %58, 6 --> comp_total89
+comp_total89 : li %59, 4 --> comp_total88
+comp_total88 : mulo %57, %58, %59 --> comp_total87
+comp_total87 : add %166, %56, %57 --> comp_total232
+comp_total232: sw %55, 0(%166) --> comp_total86
+comp_total86 : emit c77 --> comp_total85
+comp_total85 : li %50, 0 --> comp_total84
+comp_total84 : move %51, $sp --> comp_total443
+comp_total443: addi %51, %51, 40 --> comp_total83
+comp_total83 : li %53, 7 --> comp_total82
+comp_total82 : li %54, 4 --> comp_total81
+comp_total81 : mulo %52, %53, %54 --> comp_total80
+comp_total80 : add %165, %51, %52 --> comp_total231
+comp_total231: sw %50, 0(%165) --> comp_total79
+comp_total79 : emit c76 --> comp_total78
+comp_total78 : li %45, 0 --> comp_total77
+comp_total77 : move %46, $sp --> comp_total442
+comp_total442: addi %46, %46, 40 --> comp_total76
+comp_total76 : li %48, 8 --> comp_total75
+comp_total75 : li %49, 4 --> comp_total74
+comp_total74 : mulo %47, %48, %49 --> comp_total73
+comp_total73 : add %164, %46, %47 --> comp_total230
+comp_total230: sw %45, 0(%164) --> comp_total72
+comp_total72 : emit c75 --> comp_total71
+comp_total71 : li %40, 0 --> comp_total70
+comp_total70 : move %41, $sp --> comp_total441
+comp_total441: addi %41, %41, 40 --> comp_total69
+comp_total69 : li %43, 9 --> comp_total68
+comp_total68 : li %44, 4 --> comp_total67
+comp_total67 : mulo %42, %43, %44 --> comp_total66
+comp_total66 : add %163, %41, %42 --> comp_total229
+comp_total229: sw %40, 0(%163) --> comp_total65
+comp_total65 : emit c74 --> comp_total64
+comp_total64 : li %39, 0 --> comp_total63
+comp_total63 : slt %38, %1, %2 --> comp_total62
+comp_total62 : beq %38, %39 --> comp_total40, comp_total61
+comp_total61 : emit c73 --> comp_total60
+comp_total60 : emit c72 --> comp_total59
+comp_total59 : li %5, 0 --> comp_total41
+comp_total41 : j --> comp_total58
+comp_total58 : li %36, 0 --> comp_total57
+comp_total57 : emit c71 --> comp_total56
+comp_total56 : sle %37, %5, %1 --> comp_total55
+comp_total55 : li %162, 0 --> comp_total228
+comp_total228: seq %35, %37, %162 --> comp_total54
+comp_total54 : beq %35, %36 --> comp_total53, comp_total2
+comp_total2 : emit c59 --> comp_total1
+comp_total1 : li %6, 0 --> comp_total0
+comp_total0 : j --> comp_total422
+comp_total422: move $v0, %6 --> comp_total421
+comp_total421: move $ra, %176 --> comp_total420
+comp_total420: move $s7, %175 --> comp_total419
+comp_total419: move $s6, %174 --> comp_total418
+comp_total418: move $s5, %173 --> comp_total417
+comp_total417: move $s4, %172 --> comp_total416
+comp_total416: move $s3, %171 --> comp_total415
+comp_total415: move $s2, %170 --> comp_total414
+comp_total414: move $s1, %169 --> comp_total413
+comp_total413: move $s0, %168 --> comp_total412
+comp_total412: delframe --> comp_total411
+comp_total411: jr $ra (xmits $v0)
+comp_total53 : emit c69 --> comp_total52
+comp_total52 : sub %33, %1, %5 --> comp_total51
+comp_total51 : li %34, 4 --> comp_total50
+comp_total50 : mulo %32, %33, %34 --> comp_total49
+comp_total49 : add %161, %0, %32 --> comp_total227
+comp_total227: lw %28, 0(%161) --> comp_total48
+comp_total48 : move %29, $sp --> comp_total440
+comp_total440: move %29, %29 --> comp_total47
+comp_total47 : li %31, 4 --> comp_total46
+comp_total46 : mulo %30, %5, %31 --> comp_total45
+comp_total45 : add %160, %29, %30 --> comp_total226
+comp_total226: sw %28, 0(%160) --> comp_total44
+comp_total44 : emit c70 --> comp_total43
+comp_total43 : li %27, 1 --> comp_total42
+comp_total42 : add %5, %5, %27 --> comp_total41
+comp_total40 : emit c68 --> comp_total39
+comp_total39 : emit c67 --> comp_total38
+comp_total38 : li %3, 0 --> comp_total3
+comp_total3 : j --> comp_total37
+comp_total37 : li %25, 0 --> comp_total36
+comp_total36 : emit c66 --> comp_total35
+comp_total35 : slt %26, %3, %1 --> comp_total34
+comp_total34 : li %159, 0 --> comp_total225
+comp_total225: seq %24, %26, %159 --> comp_total33
+comp_total33 : beq %24, %25 --> comp_total32, comp_total2
+comp_total32 : emit c64 --> comp_total31
+comp_total31 : emit c63 --> comp_total30
+comp_total30 : move %4, %2 --> comp_total7
+comp_total7 : j --> comp_total29
+comp_total29 : li %21, 0 --> comp_total28
+comp_total28 : emit c62 --> comp_total27
+comp_total27 : li %23, 0 --> comp_total26
+comp_total26 : sgt %22, %4, %23 --> comp_total25
+comp_total25 : li %158, 0 --> comp_total224
+comp_total224: seq %20, %22, %158 --> comp_total24
+comp_total24 : beq %20, %21 --> comp_total23, comp_total6
+comp_total6 : emit c65 --> comp_total5
+comp_total5 : li %7, 1 --> comp_total4
+comp_total4 : add %3, %3, %7 --> comp_total3
+comp_total23 : emit c60 --> comp_total22
+comp_total22 : move %17, $sp --> comp_total439
+comp_total439: move %17, %17 --> comp_total21
+comp_total21 : li %19, 4 --> comp_total20
+comp_total20 : mulo %18, %3, %19 --> comp_total19
+comp_total19 : add %155, %17, %18 --> comp_total221
+comp_total221: lw %12, 0(%155) --> comp_total18
+comp_total18 : move %14, $sp --> comp_total434
+comp_total434: addi %14, %14, 40 --> comp_total17
+comp_total17 : li %16, 4 --> comp_total16
+comp_total16 : mulo %15, %4, %16 --> comp_total15
+comp_total15 : add %148, %14, %15 --> comp_total214
+comp_total214: lw %13, 0(%148) --> comp_total14
+comp_total14 : add %9, %12, %13 --> comp_total13
+comp_total13 : li %11, 4 --> comp_total12
+comp_total12 : mulo %10, %3, %11 --> comp_total11
+comp_total11 : add %142, %0, %10 --> comp_total208
+comp_total208: sw %9, 0(%142) --> comp_total10
+comp_total10 : emit c61 --> comp_total9
+comp_total9 : li %8, 1 --> comp_total8
+comp_total8 : sub %4, %4, %8 --> comp_total7
+
+procedure comp_ifFor(3)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20
+entry comp_ifFor45
+comp_ifFor45: newframe --> comp_ifFor44
+comp_ifFor44: move %20, $ra --> comp_ifFor43
+comp_ifFor43: move %19, $s7 --> comp_ifFor42
+comp_ifFor42: move %18, $s6 --> comp_ifFor41
+comp_ifFor41: move %17, $s5 --> comp_ifFor40
+comp_ifFor40: move %16, $s4 --> comp_ifFor39
+comp_ifFor39: move %15, $s3 --> comp_ifFor38
+comp_ifFor38: move %14, $s2 --> comp_ifFor37
+comp_ifFor37: move %13, $s1 --> comp_ifFor36
+comp_ifFor36: move %12, $s0 --> comp_ifFor35
+comp_ifFor35: move %0, $a0 --> comp_ifFor34
+comp_ifFor34: move %1, $a1 --> comp_ifFor33
+comp_ifFor33: move %2, $a2 --> comp_ifFor32
+comp_ifFor32: li %3, 0 --> comp_ifFor31
+comp_ifFor31: li %4, 0 --> comp_ifFor30
+comp_ifFor30: li %6, 0 --> comp_ifFor29
+comp_ifFor29: li %7, 0 --> comp_ifFor28
+comp_ifFor28: li %8, 0 --> comp_ifFor27
+comp_ifFor27: li %9, 0 --> comp_ifFor26
+comp_ifFor26: li %10, 0 --> comp_ifFor25
+comp_ifFor25: li %11, 0 --> comp_ifFor23
+comp_ifFor23: emit c58 --> comp_ifFor22
+comp_ifFor22: li %4, 0 --> comp_ifFor21
+comp_ifFor21: emit c57 --> comp_ifFor20
+comp_ifFor20: emit c56 --> comp_ifFor19
+comp_ifFor19: li %3, 0 --> comp_ifFor3
+comp_ifFor3 : j --> comp_ifFor18
+comp_ifFor18: li %9, 0 --> comp_ifFor17
+comp_ifFor17: emit c55 --> comp_ifFor16
+comp_ifFor16: slt %10, %3, %0 --> comp_ifFor15
+comp_ifFor15: li %11, 0 --> comp_ifFor24
+comp_ifFor24: seq %8, %10, %11 --> comp_ifFor14
+comp_ifFor14: beq %8, %9 --> comp_ifFor13, comp_ifFor2
+comp_ifFor2 : emit c50 --> comp_ifFor1
+comp_ifFor1 : move %5, %4 --> comp_ifFor0
+comp_ifFor0 : j --> comp_ifFor57
+comp_ifFor57: move $v0, %5 --> comp_ifFor56
+comp_ifFor56: move $ra, %20 --> comp_ifFor55
+comp_ifFor55: move $s7, %19 --> comp_ifFor54
+comp_ifFor54: move $s6, %18 --> comp_ifFor53
+comp_ifFor53: move $s5, %17 --> comp_ifFor52
+comp_ifFor52: move $s4, %16 --> comp_ifFor51
+comp_ifFor51: move $s3, %15 --> comp_ifFor50
+comp_ifFor50: move $s2, %14 --> comp_ifFor49
+comp_ifFor49: move $s1, %13 --> comp_ifFor48
+comp_ifFor48: move $s0, %12 --> comp_ifFor47
+comp_ifFor47: delframe --> comp_ifFor46
+comp_ifFor46: jr $ra (xmits $v0)
+comp_ifFor13: emit c53 --> comp_ifFor12
+comp_ifFor12: li %7, 0 --> comp_ifFor11
+comp_ifFor11: sne %6, %3, %1 --> comp_ifFor10
+comp_ifFor10: beq %6, %7 --> comp_ifFor7, comp_ifFor9
+comp_ifFor9 : emit c52 --> comp_ifFor8
+comp_ifFor8 : add %4, %4, %3 --> comp_ifFor5
+comp_ifFor5 : emit c54 --> comp_ifFor4
+comp_ifFor4 : add %3, %3, %2 --> comp_ifFor3
+comp_ifFor7 : emit c51 --> comp_ifFor6
+comp_ifFor6 : li %4, 0 --> comp_ifFor5
+
+procedure comp_forif2(4)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62
+entry comp_forif2153
+comp_forif2153: newframe --> comp_forif2152
+comp_forif2152: move %62, $ra --> comp_forif2151
+comp_forif2151: move %61, $s7 --> comp_forif2150
+comp_forif2150: move %60, $s6 --> comp_forif2149
+comp_forif2149: move %59, $s5 --> comp_forif2148
+comp_forif2148: move %58, $s4 --> comp_forif2147
+comp_forif2147: move %57, $s3 --> comp_forif2146
+comp_forif2146: move %56, $s2 --> comp_forif2145
+comp_forif2145: move %55, $s1 --> comp_forif2144
+comp_forif2144: move %54, $s0 --> comp_forif2143
+comp_forif2143: move %0, $a0 --> comp_forif2142
+comp_forif2142: move %1, $a1 --> comp_forif2141
+comp_forif2141: move %2, $a2 --> comp_forif2140
+comp_forif2140: move %3, $a3 --> comp_forif2139
+comp_forif2139: li %4, 0 --> comp_forif2138
+comp_forif2138: li %5, 0 --> comp_forif2137
+comp_forif2137: li %6, 0 --> comp_forif2136
+comp_forif2136: li %7, 0 --> comp_forif2135
+comp_forif2135: li %8, 0 --> comp_forif2134
+comp_forif2134: li %10, 0 --> comp_forif2133
+comp_forif2133: li %11, 0 --> comp_forif2132
+comp_forif2132: li %12, 0 --> comp_forif2131
+comp_forif2131: li %13, 0 --> comp_forif2130
+comp_forif2130: li %14, 0 --> comp_forif2129
+comp_forif2129: li %15, 0 --> comp_forif2128
+comp_forif2128: li %16, 0 --> comp_forif2127
+comp_forif2127: li %17, 0 --> comp_forif2126
+comp_forif2126: li %18, 0 --> comp_forif2125
+comp_forif2125: li %19, 0 --> comp_forif2124
+comp_forif2124: li %20, 0 --> comp_forif2123
+comp_forif2123: li %21, 0 --> comp_forif2122
+comp_forif2122: li %22, 0 --> comp_forif2121
+comp_forif2121: li %23, 0 --> comp_forif2120
+comp_forif2120: li %24, 0 --> comp_forif2119
+comp_forif2119: li %25, 0 --> comp_forif2118
+comp_forif2118: li %26, 0 --> comp_forif2117
+comp_forif2117: li %27, 0 --> comp_forif2116
+comp_forif2116: li %28, 0 --> comp_forif2115
+comp_forif2115: li %29, 0 --> comp_forif2114
+comp_forif2114: li %30, 0 --> comp_forif2113
+comp_forif2113: li %31, 0 --> comp_forif2112
+comp_forif2112: li %32, 0 --> comp_forif2111
+comp_forif2111: li %33, 0 --> comp_forif2110
+comp_forif2110: li %34, 0 --> comp_forif2109
+comp_forif2109: li %35, 0 --> comp_forif2108
+comp_forif2108: li %36, 0 --> comp_forif2107
+comp_forif2107: li %37, 0 --> comp_forif2106
+comp_forif2106: li %38, 0 --> comp_forif2105
+comp_forif2105: li %39, 0 --> comp_forif2104
+comp_forif2104: li %40, 0 --> comp_forif2103
+comp_forif2103: li %41, 0 --> comp_forif2102
+comp_forif2102: li %42, 0 --> comp_forif2101
+comp_forif2101: li %43, 0 --> comp_forif2100
+comp_forif2100: li %44, 0 --> comp_forif299
+comp_forif299 : li %45, 0 --> comp_forif298
+comp_forif298 : li %46, 0 --> comp_forif297
+comp_forif297 : li %47, 0 --> comp_forif296
+comp_forif296 : li %48, 0 --> comp_forif295
+comp_forif295 : li %49, 0 --> comp_forif294
+comp_forif294 : li %50, 0 --> comp_forif293
+comp_forif293 : li %51, 0 --> comp_forif292
+comp_forif292 : li %52, 0 --> comp_forif291
+comp_forif291 : li %53, 0 --> comp_forif282
+comp_forif282 : emit c130 --> comp_forif281
+comp_forif281 : li %6, 0 --> comp_forif280
+comp_forif280 : emit c129 --> comp_forif279
+comp_forif279 : li %5, 0 --> comp_forif278
+comp_forif278 : emit c128 --> comp_forif277
+comp_forif277 : emit c127 --> comp_forif276
+comp_forif276 : li %8, 0 --> comp_forif262
+comp_forif262 : j --> comp_forif275
+comp_forif275 : li %44, 0 --> comp_forif274
+comp_forif274 : emit c126 --> comp_forif273
+comp_forif273 : slt %45, %8, %2 --> comp_forif272
+comp_forif272 : li %53, 0 --> comp_forif290
+comp_forif290 : seq %43, %45, %53 --> comp_forif271
+comp_forif271 : beq %43, %44 --> comp_forif270, comp_forif261
+comp_forif261 : emit c123 --> comp_forif260
+comp_forif260 : emit c122 --> comp_forif259
+comp_forif259 : li %7, 0 --> comp_forif245
+comp_forif245 : j --> comp_forif258
+comp_forif258 : li %37, 0 --> comp_forif257
+comp_forif257 : emit c121 --> comp_forif256
+comp_forif256 : slt %38, %7, %3 --> comp_forif255
+comp_forif255 : li %51, 0 --> comp_forif288
+comp_forif288 : seq %36, %38, %51 --> comp_forif254
+comp_forif254 : beq %36, %37 --> comp_forif253, comp_forif244
+comp_forif244 : emit c118 --> comp_forif243
+comp_forif243 : li %21, 0 --> comp_forif242
+comp_forif242 : li %28, 0 --> comp_forif241
+comp_forif241 : emit c117 --> comp_forif240
+comp_forif240 : li %31, 2 --> comp_forif239
+comp_forif239 : la %49, mod --> comp_forif286
+comp_forif286 : j --> comp_forif2181
+comp_forif2181: move $a0, %6 --> comp_forif2180
+comp_forif2180: move $a1, %31 --> comp_forif2179
+comp_forif2179: call %49(2) --> comp_forif2178
+comp_forif2178: move %29, $v0 --> comp_forif238
+comp_forif238 : li %30, 0 --> comp_forif237
+comp_forif237 : seq %27, %29, %30 --> comp_forif236
+comp_forif236 : beq %27, %28 --> comp_forif226, comp_forif235
+comp_forif235 : li %23, 0 --> comp_forif234
+comp_forif234 : emit c116 --> comp_forif233
+comp_forif233 : li %26, 2 --> comp_forif232
+comp_forif232 : la %48, mod --> comp_forif285
+comp_forif285 : j --> comp_forif2177
+comp_forif2177: move $a0, %5 --> comp_forif2176
+comp_forif2176: move $a1, %26 --> comp_forif2175
+comp_forif2175: call %48(2) --> comp_forif2174
+comp_forif2174: move %24, $v0 --> comp_forif231
+comp_forif231 : li %25, 0 --> comp_forif230
+comp_forif230 : seq %22, %24, %25 --> comp_forif229
+comp_forif229 : beq %22, %23 --> comp_forif227, comp_forif228
+comp_forif228 : li %20, 1 --> comp_forif225
+comp_forif225 : beq %20, %21 --> comp_forif222, comp_forif224
+comp_forif224 : emit c115 --> comp_forif223
+comp_forif223 : li %4, 0 --> comp_forif22
+comp_forif22 : emit c109 --> comp_forif21
+comp_forif21 : li %9, 0 --> comp_forif20
+comp_forif20 : j --> comp_forif2165
+comp_forif2165: move $v0, %9 --> comp_forif2164
+comp_forif2164: move $ra, %62 --> comp_forif2163
+comp_forif2163: move $s7, %61 --> comp_forif2162
+comp_forif2162: move $s6, %60 --> comp_forif2161
+comp_forif2161: move $s5, %59 --> comp_forif2160
+comp_forif2160: move $s4, %58 --> comp_forif2159
+comp_forif2159: move $s3, %57 --> comp_forif2158
+comp_forif2158: move $s2, %56 --> comp_forif2157
+comp_forif2157: move $s1, %55 --> comp_forif2156
+comp_forif2156: move $s0, %54 --> comp_forif2155
+comp_forif2155: delframe --> comp_forif2154
+comp_forif2154: jr $ra (xmits $v0)
+comp_forif222 : emit c114 --> comp_forif221
+comp_forif221 : li %16, 0 --> comp_forif220
+comp_forif220 : li %19, 2 --> comp_forif219
+comp_forif219 : la %47, mod --> comp_forif284
+comp_forif284 : j --> comp_forif2173
+comp_forif2173: move $a0, %6 --> comp_forif2172
+comp_forif2172: move $a1, %19 --> comp_forif2171
+comp_forif2171: call %47(2) --> comp_forif2170
+comp_forif2170: move %17, $v0 --> comp_forif218
+comp_forif218 : li %18, 0 --> comp_forif217
+comp_forif217 : seq %15, %17, %18 --> comp_forif216
+comp_forif216 : beq %15, %16 --> comp_forif213, comp_forif215
+comp_forif215 : emit c113 --> comp_forif214
+comp_forif214 : li %4, 1 --> comp_forif22
+comp_forif213 : emit c112 --> comp_forif212
+comp_forif212 : li %11, 0 --> comp_forif211
+comp_forif211 : li %14, 2 --> comp_forif210
+comp_forif210 : la %46, mod --> comp_forif283
+comp_forif283 : j --> comp_forif2169
+comp_forif2169: move $a0, %5 --> comp_forif2168
+comp_forif2168: move $a1, %14 --> comp_forif2167
+comp_forif2167: call %46(2) --> comp_forif2166
+comp_forif2166: move %12, $v0 --> comp_forif29
+comp_forif29 : li %13, 0 --> comp_forif28
+comp_forif28 : seq %10, %12, %13 --> comp_forif27
+comp_forif27 : beq %10, %11 --> comp_forif24, comp_forif26
+comp_forif26 : emit c111 --> comp_forif25
+comp_forif25 : li %4, 2 --> comp_forif22
+comp_forif24 : emit c110 --> comp_forif23
+comp_forif23 : li %4, 3 --> comp_forif22
+comp_forif227 : li %20, 0 --> comp_forif225
+comp_forif226 : li %20, 0 --> comp_forif225
+comp_forif253 : emit c119 --> comp_forif252
+comp_forif252 : li %35, 4 --> comp_forif251
+comp_forif251 : mulo %34, %7, %35 --> comp_forif250
+comp_forif250 : add %50, %1, %34 --> comp_forif287
+comp_forif287 : lw %33, 0(%50) --> comp_forif249
+comp_forif249 : add %5, %5, %33 --> comp_forif248
+comp_forif248 : emit c120 --> comp_forif247
+comp_forif247 : li %32, 1 --> comp_forif246
+comp_forif246 : add %7, %7, %32 --> comp_forif245
+comp_forif270 : emit c124 --> comp_forif269
+comp_forif269 : li %42, 4 --> comp_forif268
+comp_forif268 : mulo %41, %8, %42 --> comp_forif267
+comp_forif267 : add %52, %0, %41 --> comp_forif289
+comp_forif289 : lw %40, 0(%52) --> comp_forif266
+comp_forif266 : add %6, %6, %40 --> comp_forif265
+comp_forif265 : emit c125 --> comp_forif264
+comp_forif264 : li %39, 1 --> comp_forif263
+comp_forif263 : add %8, %8, %39 --> comp_forif262
+
+procedure comp_forif(0)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27
+entry comp_forif65
+comp_forif65: newframe --> comp_forif64
+comp_forif64: move %27, $ra --> comp_forif63
+comp_forif63: move %26, $s7 --> comp_forif62
+comp_forif62: move %25, $s6 --> comp_forif61
+comp_forif61: move %24, $s5 --> comp_forif60
+comp_forif60: move %23, $s4 --> comp_forif59
+comp_forif59: move %22, $s3 --> comp_forif58
+comp_forif58: move %21, $s2 --> comp_forif57
+comp_forif57: move %20, $s1 --> comp_forif56
+comp_forif56: move %19, $s0 --> comp_forif55
+comp_forif55: li %0, 0 --> comp_forif54
+comp_forif54: li %1, 0 --> comp_forif53
+comp_forif53: li %2, 0 --> comp_forif52
+comp_forif52: li %4, 0 --> comp_forif51
+comp_forif51: li %5, 0 --> comp_forif50
+comp_forif50: li %6, 0 --> comp_forif49
+comp_forif49: li %7, 0 --> comp_forif48
+comp_forif48: li %8, 0 --> comp_forif47
+comp_forif47: li %9, 0 --> comp_forif46
+comp_forif46: li %10, 0 --> comp_forif45
+comp_forif45: li %11, 0 --> comp_forif44
+comp_forif44: li %12, 0 --> comp_forif43
+comp_forif43: li %13, 0 --> comp_forif42
+comp_forif42: li %14, 0 --> comp_forif41
+comp_forif41: li %15, 0 --> comp_forif40
+comp_forif40: li %16, 0 --> comp_forif39
+comp_forif39: li %17, 0 --> comp_forif38
+comp_forif38: li %18, 0 --> comp_forif35
+comp_forif35: emit c141 --> comp_forif34
+comp_forif34: li %1, 0 --> comp_forif33
+comp_forif33: emit c140 --> comp_forif32
+comp_forif32: li %0, 0 --> comp_forif31
+comp_forif31: emit c139 --> comp_forif30
+comp_forif30: emit c138 --> comp_forif29
+comp_forif29: li %2, 0 --> comp_forif3
+comp_forif3 : j --> comp_forif28
+comp_forif28: li %14, 0 --> comp_forif27
+comp_forif27: emit c137 --> comp_forif26
+comp_forif26: li %16, 10 --> comp_forif25
+comp_forif25: slt %15, %2, %16 --> comp_forif24
+comp_forif24: li %18, 0 --> comp_forif37
+comp_forif37: seq %13, %15, %18 --> comp_forif23
+comp_forif23: beq %13, %14 --> comp_forif22, comp_forif2
+comp_forif2 : emit c131 --> comp_forif1
+comp_forif1 : move %3, %1 --> comp_forif0
+comp_forif0 : j --> comp_forif77
+comp_forif77: move $v0, %3 --> comp_forif76
+comp_forif76: move $ra, %27 --> comp_forif75
+comp_forif75: move $s7, %26 --> comp_forif74
+comp_forif74: move $s6, %25 --> comp_forif73
+comp_forif73: move $s5, %24 --> comp_forif72
+comp_forif72: move $s4, %23 --> comp_forif71
+comp_forif71: move $s3, %22 --> comp_forif70
+comp_forif70: move $s2, %21 --> comp_forif69
+comp_forif69: move $s1, %20 --> comp_forif68
+comp_forif68: move $s0, %19 --> comp_forif67
+comp_forif67: delframe --> comp_forif66
+comp_forif66: jr $ra (xmits $v0)
+comp_forif22: emit c135 --> comp_forif21
+comp_forif21: li %12, 1 --> comp_forif20
+comp_forif20: add %1, %1, %12 --> comp_forif19
+comp_forif19: emit c134 --> comp_forif18
+comp_forif18: li %11, 1 --> comp_forif17
+comp_forif17: add %1, %1, %11 --> comp_forif16
+comp_forif16: emit c133 --> comp_forif15
+comp_forif15: li %7, 0 --> comp_forif14
+comp_forif14: li %10, 2 --> comp_forif13
+comp_forif13: la %17, mod --> comp_forif36
+comp_forif36: j --> comp_forif81
+comp_forif81: move $a0, %2 --> comp_forif80
+comp_forif80: move $a1, %10 --> comp_forif79
+comp_forif79: call %17(2) --> comp_forif78
+comp_forif78: move %8, $v0 --> comp_forif12
+comp_forif12: li %9, 0 --> comp_forif11
+comp_forif11: seq %6, %8, %9 --> comp_forif10
+comp_forif10: beq %6, %7 --> comp_forif6, comp_forif9
+comp_forif9 : emit c132 --> comp_forif8
+comp_forif8 : li %5, 1 --> comp_forif7
+comp_forif7 : add %0, %0, %5 --> comp_forif6
+comp_forif6 : emit c136 --> comp_forif5
+comp_forif5 : li %4, 1 --> comp_forif4
+comp_forif4 : add %2, %2, %4 --> comp_forif3
+
+procedure comp_fir_basic(5)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62
+entry comp_fir_basic141
+comp_fir_basic141: newframe --> comp_fir_basic140
+comp_fir_basic140: move %62, $ra --> comp_fir_basic139
+comp_fir_basic139: move %61, $s7 --> comp_fir_basic138
+comp_fir_basic138: move %60, $s6 --> comp_fir_basic137
+comp_fir_basic137: move %59, $s5 --> comp_fir_basic136
+comp_fir_basic136: move %58, $s4 --> comp_fir_basic135
+comp_fir_basic135: move %57, $s3 --> comp_fir_basic134
+comp_fir_basic134: move %56, $s2 --> comp_fir_basic133
+comp_fir_basic133: move %55, $s1 --> comp_fir_basic132
+comp_fir_basic132: move %54, $s0 --> comp_fir_basic131
+comp_fir_basic131: move %0, $a0 --> comp_fir_basic130
+comp_fir_basic130: move %1, $a1 --> comp_fir_basic129
+comp_fir_basic129: move %2, $a2 --> comp_fir_basic128
+comp_fir_basic128: move %3, $a3 --> comp_fir_basic127
+comp_fir_basic127: gets %4, in(0) --> comp_fir_basic126
+comp_fir_basic126: li %5, 0 --> comp_fir_basic125
+comp_fir_basic125: li %6, 0 --> comp_fir_basic124
+comp_fir_basic124: li %7, 0 --> comp_fir_basic123
+comp_fir_basic123: li %8, 0 --> comp_fir_basic122
+comp_fir_basic122: li %10, 0 --> comp_fir_basic121
+comp_fir_basic121: li %11, 0 --> comp_fir_basic120
+comp_fir_basic120: li %12, 0 --> comp_fir_basic119
+comp_fir_basic119: li %13, 0 --> comp_fir_basic118
+comp_fir_basic118: li %14, 0 --> comp_fir_basic117
+comp_fir_basic117: li %15, 0 --> comp_fir_basic116
+comp_fir_basic116: li %16, 0 --> comp_fir_basic115
+comp_fir_basic115: li %17, 0 --> comp_fir_basic114
+comp_fir_basic114: li %18, 0 --> comp_fir_basic113
+comp_fir_basic113: li %19, 0 --> comp_fir_basic112
+comp_fir_basic112: li %20, 0 --> comp_fir_basic111
+comp_fir_basic111: li %21, 0 --> comp_fir_basic110
+comp_fir_basic110: li %22, 0 --> comp_fir_basic109
+comp_fir_basic109: li %23, 0 --> comp_fir_basic108
+comp_fir_basic108: li %24, 0 --> comp_fir_basic107
+comp_fir_basic107: li %25, 0 --> comp_fir_basic106
+comp_fir_basic106: li %26, 0 --> comp_fir_basic105
+comp_fir_basic105: li %27, 0 --> comp_fir_basic104
+comp_fir_basic104: li %28, 0 --> comp_fir_basic103
+comp_fir_basic103: li %29, 0 --> comp_fir_basic102
+comp_fir_basic102: li %30, 0 --> comp_fir_basic101
+comp_fir_basic101: li %31, 0 --> comp_fir_basic100
+comp_fir_basic100: li %32, 0 --> comp_fir_basic99
+comp_fir_basic99 : li %33, 0 --> comp_fir_basic98
+comp_fir_basic98 : li %34, 0 --> comp_fir_basic97
+comp_fir_basic97 : li %35, 0 --> comp_fir_basic96
+comp_fir_basic96 : li %36, 0 --> comp_fir_basic95
+comp_fir_basic95 : li %37, 0 --> comp_fir_basic94
+comp_fir_basic94 : li %38, 0 --> comp_fir_basic93
+comp_fir_basic93 : li %39, 0 --> comp_fir_basic92
+comp_fir_basic92 : li %40, 0 --> comp_fir_basic91
+comp_fir_basic91 : li %41, 0 --> comp_fir_basic90
+comp_fir_basic90 : li %42, 0 --> comp_fir_basic89
+comp_fir_basic89 : li %43, 0 --> comp_fir_basic88
+comp_fir_basic88 : li %44, 0 --> comp_fir_basic87
+comp_fir_basic87 : li %45, 0 --> comp_fir_basic86
+comp_fir_basic86 : li %46, 0 --> comp_fir_basic85
+comp_fir_basic85 : li %47, 0 --> comp_fir_basic84
+comp_fir_basic84 : li %48, 0 --> comp_fir_basic83
+comp_fir_basic83 : li %49, 0 --> comp_fir_basic82
+comp_fir_basic82 : li %50, 0 --> comp_fir_basic81
+comp_fir_basic81 : li %51, 0 --> comp_fir_basic80
+comp_fir_basic80 : li %52, 0 --> comp_fir_basic79
+comp_fir_basic79 : li %53, 0 --> comp_fir_basic69
+comp_fir_basic69 : emit c16 --> comp_fir_basic68
+comp_fir_basic68 : li %5, 0 --> comp_fir_basic67
+comp_fir_basic67 : emit c15 --> comp_fir_basic66
+comp_fir_basic66 : emit c14 --> comp_fir_basic65
+comp_fir_basic65 : li %6, 0 --> comp_fir_basic3
+comp_fir_basic3 : j --> comp_fir_basic64
+comp_fir_basic64 : li %42, 0 --> comp_fir_basic63
+comp_fir_basic63 : emit c13 --> comp_fir_basic62
+comp_fir_basic62 : li %44, 3 --> comp_fir_basic61
+comp_fir_basic61 : slt %43, %6, %44 --> comp_fir_basic60
+comp_fir_basic60 : li %53, 0 --> comp_fir_basic78
+comp_fir_basic78 : seq %41, %43, %53 --> comp_fir_basic59
+comp_fir_basic59 : beq %41, %42 --> comp_fir_basic58, comp_fir_basic2
+comp_fir_basic2 : emit c0 --> comp_fir_basic1
+comp_fir_basic1 : move %9, %5 --> comp_fir_basic0
+comp_fir_basic0 : j --> comp_fir_basic153
+comp_fir_basic153: move $v0, %9 --> comp_fir_basic152
+comp_fir_basic152: move $ra, %62 --> comp_fir_basic151
+comp_fir_basic151: move $s7, %61 --> comp_fir_basic150
+comp_fir_basic150: move $s6, %60 --> comp_fir_basic149
+comp_fir_basic149: move $s5, %59 --> comp_fir_basic148
+comp_fir_basic148: move $s4, %58 --> comp_fir_basic147
+comp_fir_basic147: move $s3, %57 --> comp_fir_basic146
+comp_fir_basic146: move $s2, %56 --> comp_fir_basic145
+comp_fir_basic145: move $s1, %55 --> comp_fir_basic144
+comp_fir_basic144: move $s0, %54 --> comp_fir_basic143
+comp_fir_basic143: delframe --> comp_fir_basic142
+comp_fir_basic142: jr $ra (xmits $v0)
+comp_fir_basic58 : emit c11 --> comp_fir_basic57
+comp_fir_basic57 : li %40, 4 --> comp_fir_basic56
+comp_fir_basic56 : mulo %39, %6, %40 --> comp_fir_basic55
+comp_fir_basic55 : add %52, %0, %39 --> comp_fir_basic77
+comp_fir_basic77 : lw %35, 0(%52) --> comp_fir_basic54
+comp_fir_basic54 : li %37, 0 --> comp_fir_basic53
+comp_fir_basic53 : li %38, 4 --> comp_fir_basic52
+comp_fir_basic52 : mulo %36, %37, %38 --> comp_fir_basic51
+comp_fir_basic51 : add %51, %2, %36 --> comp_fir_basic76
+comp_fir_basic76 : sw %35, 0(%51) --> comp_fir_basic50
+comp_fir_basic50 : emit c10 --> comp_fir_basic49
+comp_fir_basic49 : emit c9 --> comp_fir_basic48
+comp_fir_basic48 : li %8, 0 --> comp_fir_basic29
+comp_fir_basic29 : j --> comp_fir_basic47
+comp_fir_basic47 : li %32, 0 --> comp_fir_basic46
+comp_fir_basic46 : emit c8 --> comp_fir_basic45
+comp_fir_basic45 : li %34, 3 --> comp_fir_basic44
+comp_fir_basic44 : slt %33, %8, %34 --> comp_fir_basic43
+comp_fir_basic43 : li %50, 0 --> comp_fir_basic75
+comp_fir_basic75 : seq %31, %33, %50 --> comp_fir_basic42
+comp_fir_basic42 : beq %31, %32 --> comp_fir_basic41, comp_fir_basic28
+comp_fir_basic28 : emit c5 --> comp_fir_basic27
+comp_fir_basic27 : emit c4 --> comp_fir_basic26
+comp_fir_basic26 : li %7, 2 --> comp_fir_basic7
+comp_fir_basic7 : j --> comp_fir_basic25
+comp_fir_basic25 : li %20, 0 --> comp_fir_basic24
+comp_fir_basic24 : emit c3 --> comp_fir_basic23
+comp_fir_basic23 : li %22, 0 --> comp_fir_basic22
+comp_fir_basic22 : sge %21, %7, %22 --> comp_fir_basic21
+comp_fir_basic21 : li %47, 0 --> comp_fir_basic72
+comp_fir_basic72 : seq %19, %21, %47 --> comp_fir_basic20
+comp_fir_basic20 : beq %19, %20 --> comp_fir_basic19, comp_fir_basic6
+comp_fir_basic6 : emit c12 --> comp_fir_basic5
+comp_fir_basic5 : li %10, 1 --> comp_fir_basic4
+comp_fir_basic4 : add %6, %6, %10 --> comp_fir_basic3
+comp_fir_basic19 : emit c1 --> comp_fir_basic18
+comp_fir_basic18 : li %18, 4 --> comp_fir_basic17
+comp_fir_basic17 : mulo %17, %7, %18 --> comp_fir_basic16
+comp_fir_basic16 : add %46, %2, %17 --> comp_fir_basic71
+comp_fir_basic71 : lw %12, 0(%46) --> comp_fir_basic15
+comp_fir_basic15 : li %16, 1 --> comp_fir_basic14
+comp_fir_basic14 : add %14, %7, %16 --> comp_fir_basic13
+comp_fir_basic13 : li %15, 4 --> comp_fir_basic12
+comp_fir_basic12 : mulo %13, %14, %15 --> comp_fir_basic11
+comp_fir_basic11 : add %45, %2, %13 --> comp_fir_basic70
+comp_fir_basic70 : sw %12, 0(%45) --> comp_fir_basic10
+comp_fir_basic10 : emit c2 --> comp_fir_basic9
+comp_fir_basic9 : li %11, 1 --> comp_fir_basic8
+comp_fir_basic8 : sub %7, %7, %11 --> comp_fir_basic7
+comp_fir_basic41 : emit c6 --> comp_fir_basic40
+comp_fir_basic40 : li %30, 4 --> comp_fir_basic39
+comp_fir_basic39 : mulo %29, %8, %30 --> comp_fir_basic38
+comp_fir_basic38 : add %49, %1, %29 --> comp_fir_basic74
+comp_fir_basic74 : lw %25, 0(%49) --> comp_fir_basic37
+comp_fir_basic37 : li %28, 4 --> comp_fir_basic36
+comp_fir_basic36 : mulo %27, %8, %28 --> comp_fir_basic35
+comp_fir_basic35 : add %48, %2, %27 --> comp_fir_basic73
+comp_fir_basic73 : lw %26, 0(%48) --> comp_fir_basic34
+comp_fir_basic34 : mulo %24, %25, %26 --> comp_fir_basic33
+comp_fir_basic33 : add %5, %5, %24 --> comp_fir_basic32
+comp_fir_basic32 : emit c7 --> comp_fir_basic31
+comp_fir_basic31 : li %23, 1 --> comp_fir_basic30
+comp_fir_basic30 : add %8, %8, %23 --> comp_fir_basic29
+
+procedure comp_fir16(4)
+stacksize 64
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78, %79, %80, %81, %82, %83,
+ %84, %85, %86, %87, %88, %89, %90,
+ %91, %92, %93, %94, %95, %96, %97,
+ %98, %99, %100, %101, %102, %103, %104,
+ %105, %106, %107, %108, %109, %110, %111,
+ %112, %113, %114, %115, %116, %117, %118,
+ %119, %120, %121, %122, %123, %124, %125,
+ %126, %127, %128, %129, %130, %131, %132,
+ %133, %134, %135, %136, %137, %138, %139,
+ %140, %141, %142, %143, %144, %145, %146,
+ %147, %148, %149, %150, %151, %152, %153,
+ %154, %155, %156, %157, %158, %159, %160,
+ %161, %162
+entry comp_fir16373
+comp_fir16373: newframe --> comp_fir16372
+comp_fir16372: move %162, $ra --> comp_fir16371
+comp_fir16371: move %161, $s7 --> comp_fir16370
+comp_fir16370: move %160, $s6 --> comp_fir16369
+comp_fir16369: move %159, $s5 --> comp_fir16368
+comp_fir16368: move %158, $s4 --> comp_fir16367
+comp_fir16367: move %157, $s3 --> comp_fir16366
+comp_fir16366: move %156, $s2 --> comp_fir16365
+comp_fir16365: move %155, $s1 --> comp_fir16364
+comp_fir16364: move %154, $s0 --> comp_fir16363
+comp_fir16363: move %0, $a0 --> comp_fir16362
+comp_fir16362: move %1, $a1 --> comp_fir16361
+comp_fir16361: move %2, $a2 --> comp_fir16360
+comp_fir16360: move %3, $a3 --> comp_fir16359
+comp_fir16359: li %4, 0 --> comp_fir16358
+comp_fir16358: li %5, 0 --> comp_fir16357
+comp_fir16357: li %6, 0 --> comp_fir16356
+comp_fir16356: li %7, 0 --> comp_fir16355
+comp_fir16355: li %8, 0 --> comp_fir16354
+comp_fir16354: li %10, 0 --> comp_fir16353
+comp_fir16353: li %11, 0 --> comp_fir16352
+comp_fir16352: li %12, 0 --> comp_fir16351
+comp_fir16351: li %13, 0 --> comp_fir16350
+comp_fir16350: li %14, 0 --> comp_fir16349
+comp_fir16349: li %15, 0 --> comp_fir16348
+comp_fir16348: li %16, 0 --> comp_fir16347
+comp_fir16347: li %17, 0 --> comp_fir16346
+comp_fir16346: li %18, 0 --> comp_fir16345
+comp_fir16345: li %19, 0 --> comp_fir16344
+comp_fir16344: li %20, 0 --> comp_fir16343
+comp_fir16343: li %21, 0 --> comp_fir16342
+comp_fir16342: li %22, 0 --> comp_fir16341
+comp_fir16341: li %23, 0 --> comp_fir16340
+comp_fir16340: li %24, 0 --> comp_fir16339
+comp_fir16339: li %25, 0 --> comp_fir16338
+comp_fir16338: li %26, 0 --> comp_fir16337
+comp_fir16337: li %27, 0 --> comp_fir16336
+comp_fir16336: li %28, 0 --> comp_fir16335
+comp_fir16335: li %29, 0 --> comp_fir16334
+comp_fir16334: li %30, 0 --> comp_fir16333
+comp_fir16333: li %31, 0 --> comp_fir16332
+comp_fir16332: li %32, 0 --> comp_fir16331
+comp_fir16331: li %33, 0 --> comp_fir16330
+comp_fir16330: li %34, 0 --> comp_fir16329
+comp_fir16329: li %35, 0 --> comp_fir16328
+comp_fir16328: li %36, 0 --> comp_fir16327
+comp_fir16327: li %37, 0 --> comp_fir16326
+comp_fir16326: li %38, 0 --> comp_fir16325
+comp_fir16325: li %39, 0 --> comp_fir16324
+comp_fir16324: li %40, 0 --> comp_fir16323
+comp_fir16323: li %41, 0 --> comp_fir16322
+comp_fir16322: li %42, 0 --> comp_fir16321
+comp_fir16321: li %43, 0 --> comp_fir16320
+comp_fir16320: li %44, 0 --> comp_fir16319
+comp_fir16319: li %45, 0 --> comp_fir16318
+comp_fir16318: li %46, 0 --> comp_fir16317
+comp_fir16317: li %47, 0 --> comp_fir16316
+comp_fir16316: li %48, 0 --> comp_fir16315
+comp_fir16315: li %49, 0 --> comp_fir16314
+comp_fir16314: li %50, 0 --> comp_fir16313
+comp_fir16313: li %51, 0 --> comp_fir16312
+comp_fir16312: li %52, 0 --> comp_fir16311
+comp_fir16311: li %53, 0 --> comp_fir16310
+comp_fir16310: li %54, 0 --> comp_fir16309
+comp_fir16309: li %55, 0 --> comp_fir16308
+comp_fir16308: li %56, 0 --> comp_fir16307
+comp_fir16307: li %57, 0 --> comp_fir16306
+comp_fir16306: li %58, 0 --> comp_fir16305
+comp_fir16305: li %59, 0 --> comp_fir16304
+comp_fir16304: li %60, 0 --> comp_fir16303
+comp_fir16303: li %61, 0 --> comp_fir16302
+comp_fir16302: li %62, 0 --> comp_fir16301
+comp_fir16301: li %63, 0 --> comp_fir16300
+comp_fir16300: li %64, 0 --> comp_fir16299
+comp_fir16299: li %65, 0 --> comp_fir16298
+comp_fir16298: li %66, 0 --> comp_fir16297
+comp_fir16297: li %67, 0 --> comp_fir16296
+comp_fir16296: li %68, 0 --> comp_fir16295
+comp_fir16295: li %69, 0 --> comp_fir16294
+comp_fir16294: li %70, 0 --> comp_fir16293
+comp_fir16293: li %71, 0 --> comp_fir16292
+comp_fir16292: li %72, 0 --> comp_fir16291
+comp_fir16291: li %73, 0 --> comp_fir16290
+comp_fir16290: li %74, 0 --> comp_fir16289
+comp_fir16289: li %75, 0 --> comp_fir16288
+comp_fir16288: li %76, 0 --> comp_fir16287
+comp_fir16287: li %77, 0 --> comp_fir16286
+comp_fir16286: li %78, 0 --> comp_fir16285
+comp_fir16285: li %79, 0 --> comp_fir16284
+comp_fir16284: li %80, 0 --> comp_fir16283
+comp_fir16283: li %81, 0 --> comp_fir16282
+comp_fir16282: li %82, 0 --> comp_fir16281
+comp_fir16281: li %83, 0 --> comp_fir16280
+comp_fir16280: li %84, 0 --> comp_fir16279
+comp_fir16279: li %85, 0 --> comp_fir16278
+comp_fir16278: li %86, 0 --> comp_fir16277
+comp_fir16277: li %87, 0 --> comp_fir16276
+comp_fir16276: li %88, 0 --> comp_fir16275
+comp_fir16275: li %89, 0 --> comp_fir16274
+comp_fir16274: li %90, 0 --> comp_fir16273
+comp_fir16273: li %91, 0 --> comp_fir16272
+comp_fir16272: li %92, 0 --> comp_fir16271
+comp_fir16271: li %93, 0 --> comp_fir16270
+comp_fir16270: li %94, 0 --> comp_fir16269
+comp_fir16269: li %95, 0 --> comp_fir16268
+comp_fir16268: li %96, 0 --> comp_fir16267
+comp_fir16267: li %97, 0 --> comp_fir16266
+comp_fir16266: li %98, 0 --> comp_fir16265
+comp_fir16265: li %99, 0 --> comp_fir16264
+comp_fir16264: li %100, 0 --> comp_fir16263
+comp_fir16263: li %101, 0 --> comp_fir16262
+comp_fir16262: li %102, 0 --> comp_fir16261
+comp_fir16261: li %103, 0 --> comp_fir16260
+comp_fir16260: li %104, 0 --> comp_fir16259
+comp_fir16259: li %105, 0 --> comp_fir16258
+comp_fir16258: li %106, 0 --> comp_fir16257
+comp_fir16257: li %107, 0 --> comp_fir16256
+comp_fir16256: li %108, 0 --> comp_fir16255
+comp_fir16255: li %109, 0 --> comp_fir16254
+comp_fir16254: li %110, 0 --> comp_fir16253
+comp_fir16253: li %111, 0 --> comp_fir16252
+comp_fir16252: li %112, 0 --> comp_fir16251
+comp_fir16251: li %113, 0 --> comp_fir16250
+comp_fir16250: li %114, 0 --> comp_fir16249
+comp_fir16249: li %115, 0 --> comp_fir16248
+comp_fir16248: li %116, 0 --> comp_fir16247
+comp_fir16247: li %117, 0 --> comp_fir16246
+comp_fir16246: li %118, 0 --> comp_fir16245
+comp_fir16245: li %119, 0 --> comp_fir16244
+comp_fir16244: li %120, 0 --> comp_fir16243
+comp_fir16243: li %121, 0 --> comp_fir16242
+comp_fir16242: li %122, 0 --> comp_fir16241
+comp_fir16241: li %123, 0 --> comp_fir16240
+comp_fir16240: li %124, 0 --> comp_fir16239
+comp_fir16239: li %125, 0 --> comp_fir16238
+comp_fir16238: li %126, 0 --> comp_fir16237
+comp_fir16237: li %127, 0 --> comp_fir16236
+comp_fir16236: li %128, 0 --> comp_fir16235
+comp_fir16235: li %129, 0 --> comp_fir16234
+comp_fir16234: li %130, 0 --> comp_fir16233
+comp_fir16233: li %131, 0 --> comp_fir16232
+comp_fir16232: li %132, 0 --> comp_fir16231
+comp_fir16231: li %133, 0 --> comp_fir16230
+comp_fir16230: li %134, 0 --> comp_fir16229
+comp_fir16229: li %135, 0 --> comp_fir16228
+comp_fir16228: li %136, 0 --> comp_fir16227
+comp_fir16227: li %137, 0 --> comp_fir16226
+comp_fir16226: li %138, 0 --> comp_fir16225
+comp_fir16225: li %139, 0 --> comp_fir16224
+comp_fir16224: li %140, 0 --> comp_fir16223
+comp_fir16223: li %141, 0 --> comp_fir16222
+comp_fir16222: li %142, 0 --> comp_fir16221
+comp_fir16221: li %143, 0 --> comp_fir16220
+comp_fir16220: li %144, 0 --> comp_fir16219
+comp_fir16219: li %145, 0 --> comp_fir16218
+comp_fir16218: li %146, 0 --> comp_fir16217
+comp_fir16217: li %147, 0 --> comp_fir16216
+comp_fir16216: li %148, 0 --> comp_fir16215
+comp_fir16215: li %149, 0 --> comp_fir16214
+comp_fir16214: li %150, 0 --> comp_fir16213
+comp_fir16213: li %151, 0 --> comp_fir16212
+comp_fir16212: li %152, 0 --> comp_fir16211
+comp_fir16211: li %153, 0 --> comp_fir16184
+comp_fir16184: emit c49 --> comp_fir16183
+comp_fir16183: li %123, 0 --> comp_fir16182
+comp_fir16182: move %124, $sp --> comp_fir16397
+comp_fir16397: move %124, %124 --> comp_fir16181
+comp_fir16181: li %126, 0 --> comp_fir16180
+comp_fir16180: li %127, 4 --> comp_fir16179
+comp_fir16179: mulo %125, %126, %127 --> comp_fir16178
+comp_fir16178: add %142, %124, %125 --> comp_fir16199
+comp_fir16199: sw %123, 0(%142) --> comp_fir16177
+comp_fir16177: emit c48 --> comp_fir16176
+comp_fir16176: li %118, 0 --> comp_fir16175
+comp_fir16175: move %119, $sp --> comp_fir16396
+comp_fir16396: move %119, %119 --> comp_fir16174
+comp_fir16174: li %121, 1 --> comp_fir16173
+comp_fir16173: li %122, 4 --> comp_fir16172
+comp_fir16172: mulo %120, %121, %122 --> comp_fir16171
+comp_fir16171: add %141, %119, %120 --> comp_fir16198
+comp_fir16198: sw %118, 0(%141) --> comp_fir16170
+comp_fir16170: emit c47 --> comp_fir16169
+comp_fir16169: li %113, 0 --> comp_fir16168
+comp_fir16168: move %114, $sp --> comp_fir16395
+comp_fir16395: move %114, %114 --> comp_fir16167
+comp_fir16167: li %116, 2 --> comp_fir16166
+comp_fir16166: li %117, 4 --> comp_fir16165
+comp_fir16165: mulo %115, %116, %117 --> comp_fir16164
+comp_fir16164: add %140, %114, %115 --> comp_fir16197
+comp_fir16197: sw %113, 0(%140) --> comp_fir16163
+comp_fir16163: emit c46 --> comp_fir16162
+comp_fir16162: li %108, 0 --> comp_fir16161
+comp_fir16161: move %109, $sp --> comp_fir16394
+comp_fir16394: move %109, %109 --> comp_fir16160
+comp_fir16160: li %111, 3 --> comp_fir16159
+comp_fir16159: li %112, 4 --> comp_fir16158
+comp_fir16158: mulo %110, %111, %112 --> comp_fir16157
+comp_fir16157: add %139, %109, %110 --> comp_fir16196
+comp_fir16196: sw %108, 0(%139) --> comp_fir16156
+comp_fir16156: emit c45 --> comp_fir16155
+comp_fir16155: li %103, 0 --> comp_fir16154
+comp_fir16154: move %104, $sp --> comp_fir16393
+comp_fir16393: move %104, %104 --> comp_fir16153
+comp_fir16153: li %106, 4 --> comp_fir16152
+comp_fir16152: li %107, 4 --> comp_fir16151
+comp_fir16151: mulo %105, %106, %107 --> comp_fir16150
+comp_fir16150: add %138, %104, %105 --> comp_fir16195
+comp_fir16195: sw %103, 0(%138) --> comp_fir16149
+comp_fir16149: emit c44 --> comp_fir16148
+comp_fir16148: li %98, 0 --> comp_fir16147
+comp_fir16147: move %99, $sp --> comp_fir16392
+comp_fir16392: move %99, %99 --> comp_fir16146
+comp_fir16146: li %101, 5 --> comp_fir16145
+comp_fir16145: li %102, 4 --> comp_fir16144
+comp_fir16144: mulo %100, %101, %102 --> comp_fir16143
+comp_fir16143: add %136, %99, %100 --> comp_fir16193
+comp_fir16193: sw %98, 0(%136) --> comp_fir16142
+comp_fir16142: emit c43 --> comp_fir16141
+comp_fir16141: li %93, 0 --> comp_fir16140
+comp_fir16140: move %94, $sp --> comp_fir16391
+comp_fir16391: move %94, %94 --> comp_fir16139
+comp_fir16139: li %96, 6 --> comp_fir16138
+comp_fir16138: li %97, 4 --> comp_fir16137
+comp_fir16137: mulo %95, %96, %97 --> comp_fir16136
+comp_fir16136: add %135, %94, %95 --> comp_fir16192
+comp_fir16192: sw %93, 0(%135) --> comp_fir16135
+comp_fir16135: emit c42 --> comp_fir16134
+comp_fir16134: li %88, 0 --> comp_fir16133
+comp_fir16133: move %89, $sp --> comp_fir16390
+comp_fir16390: move %89, %89 --> comp_fir16132
+comp_fir16132: li %91, 7 --> comp_fir16131
+comp_fir16131: li %92, 4 --> comp_fir16130
+comp_fir16130: mulo %90, %91, %92 --> comp_fir16129
+comp_fir16129: add %134, %89, %90 --> comp_fir16191
+comp_fir16191: sw %88, 0(%134) --> comp_fir16128
+comp_fir16128: emit c41 --> comp_fir16127
+comp_fir16127: li %83, 0 --> comp_fir16126
+comp_fir16126: move %84, $sp --> comp_fir16389
+comp_fir16389: move %84, %84 --> comp_fir16125
+comp_fir16125: li %86, 8 --> comp_fir16124
+comp_fir16124: li %87, 4 --> comp_fir16123
+comp_fir16123: mulo %85, %86, %87 --> comp_fir16122
+comp_fir16122: add %133, %84, %85 --> comp_fir16190
+comp_fir16190: sw %83, 0(%133) --> comp_fir16121
+comp_fir16121: emit c40 --> comp_fir16120
+comp_fir16120: li %78, 0 --> comp_fir16119
+comp_fir16119: move %79, $sp --> comp_fir16388
+comp_fir16388: move %79, %79 --> comp_fir16118
+comp_fir16118: li %81, 9 --> comp_fir16117
+comp_fir16117: li %82, 4 --> comp_fir16116
+comp_fir16116: mulo %80, %81, %82 --> comp_fir16115
+comp_fir16115: add %132, %79, %80 --> comp_fir16189
+comp_fir16189: sw %78, 0(%132) --> comp_fir16114
+comp_fir16114: emit c39 --> comp_fir16113
+comp_fir16113: li %73, 0 --> comp_fir16112
+comp_fir16112: move %74, $sp --> comp_fir16387
+comp_fir16387: move %74, %74 --> comp_fir16111
+comp_fir16111: li %76, 10 --> comp_fir16110
+comp_fir16110: li %77, 4 --> comp_fir16109
+comp_fir16109: mulo %75, %76, %77 --> comp_fir16108
+comp_fir16108: add %130, %74, %75 --> comp_fir16187
+comp_fir16187: sw %73, 0(%130) --> comp_fir16107
+comp_fir16107: emit c38 --> comp_fir16106
+comp_fir16106: li %68, 0 --> comp_fir16105
+comp_fir16105: move %69, $sp --> comp_fir16386
+comp_fir16386: move %69, %69 --> comp_fir16104
+comp_fir16104: li %71, 11 --> comp_fir16103
+comp_fir16103: li %72, 4 --> comp_fir16102
+comp_fir16102: mulo %70, %71, %72 --> comp_fir16101
+comp_fir16101: add %129, %69, %70 --> comp_fir16186
+comp_fir16186: sw %68, 0(%129) --> comp_fir16100
+comp_fir16100: emit c37 --> comp_fir1699
+comp_fir1699 : li %63, 0 --> comp_fir1698
+comp_fir1698 : move %64, $sp --> comp_fir16412
+comp_fir16412: move %64, %64 --> comp_fir1697
+comp_fir1697 : li %66, 12 --> comp_fir1696
+comp_fir1696 : li %67, 4 --> comp_fir1695
+comp_fir1695 : mulo %65, %66, %67 --> comp_fir1694
+comp_fir1694 : add %153, %64, %65 --> comp_fir16210
+comp_fir16210: sw %63, 0(%153) --> comp_fir1693
+comp_fir1693 : emit c36 --> comp_fir1692
+comp_fir1692 : li %58, 0 --> comp_fir1691
+comp_fir1691 : move %59, $sp --> comp_fir16411
+comp_fir16411: move %59, %59 --> comp_fir1690
+comp_fir1690 : li %61, 13 --> comp_fir1689
+comp_fir1689 : li %62, 4 --> comp_fir1688
+comp_fir1688 : mulo %60, %61, %62 --> comp_fir1687
+comp_fir1687 : add %152, %59, %60 --> comp_fir16209
+comp_fir16209: sw %58, 0(%152) --> comp_fir1686
+comp_fir1686 : emit c35 --> comp_fir1685
+comp_fir1685 : li %53, 0 --> comp_fir1684
+comp_fir1684 : move %54, $sp --> comp_fir16410
+comp_fir16410: move %54, %54 --> comp_fir1683
+comp_fir1683 : li %56, 14 --> comp_fir1682
+comp_fir1682 : li %57, 4 --> comp_fir1681
+comp_fir1681 : mulo %55, %56, %57 --> comp_fir1680
+comp_fir1680 : add %151, %54, %55 --> comp_fir16208
+comp_fir16208: sw %53, 0(%151) --> comp_fir1679
+comp_fir1679 : emit c34 --> comp_fir1678
+comp_fir1678 : li %48, 0 --> comp_fir1677
+comp_fir1677 : move %49, $sp --> comp_fir16409
+comp_fir16409: move %49, %49 --> comp_fir1676
+comp_fir1676 : li %51, 15 --> comp_fir1675
+comp_fir1675 : li %52, 4 --> comp_fir1674
+comp_fir1674 : mulo %50, %51, %52 --> comp_fir1673
+comp_fir1673 : add %150, %49, %50 --> comp_fir16207
+comp_fir16207: sw %48, 0(%150) --> comp_fir1672
+comp_fir1672 : emit c33 --> comp_fir1671
+comp_fir1671 : li %8, 0 --> comp_fir1670
+comp_fir1670 : emit c32 --> comp_fir1669
+comp_fir1669 : li %4, 0 --> comp_fir1668
+comp_fir1668 : emit c31 --> comp_fir1667
+comp_fir1667 : emit c30 --> comp_fir1666
+comp_fir1666 : li %6, 0 --> comp_fir167
+comp_fir167 : j --> comp_fir1665
+comp_fir1665 : li %46, 0 --> comp_fir1664
+comp_fir1664 : emit c29 --> comp_fir1663
+comp_fir1663 : slt %47, %6, %3 --> comp_fir1662
+comp_fir1662 : li %149, 0 --> comp_fir16206
+comp_fir16206: seq %45, %47, %149 --> comp_fir1661
+comp_fir1661 : beq %45, %46 --> comp_fir1660, comp_fir166
+comp_fir166 : emit c17 --> comp_fir165
+comp_fir165 : move %10, $sp --> comp_fir16407
+comp_fir16407: move %10, %10 --> comp_fir164
+comp_fir164 : li %12, 0 --> comp_fir163
+comp_fir163 : li %13, 4 --> comp_fir162
+comp_fir162 : mulo %11, %12, %13 --> comp_fir161
+comp_fir161 : add %128, %10, %11 --> comp_fir16185
+comp_fir16185: lw %9, 0(%128) --> comp_fir160
+comp_fir160 : j --> comp_fir16385
+comp_fir16385: move $v0, %9 --> comp_fir16384
+comp_fir16384: move $ra, %162 --> comp_fir16383
+comp_fir16383: move $s7, %161 --> comp_fir16382
+comp_fir16382: move $s6, %160 --> comp_fir16381
+comp_fir16381: move $s5, %159 --> comp_fir16380
+comp_fir16380: move $s4, %158 --> comp_fir16379
+comp_fir16379: move $s3, %157 --> comp_fir16378
+comp_fir16378: move $s2, %156 --> comp_fir16377
+comp_fir16377: move $s1, %155 --> comp_fir16376
+comp_fir16376: move $s0, %154 --> comp_fir16375
+comp_fir16375: delframe --> comp_fir16374
+comp_fir16374: jr $ra (xmits $v0)
+comp_fir1660 : emit c27 --> comp_fir1659
+comp_fir1659 : li %44, 4 --> comp_fir1658
+comp_fir1658 : mulo %43, %6, %44 --> comp_fir1657
+comp_fir1657 : add %148, %0, %43 --> comp_fir16205
+comp_fir16205: lw %39, 0(%148) --> comp_fir1656
+comp_fir1656 : move %40, $sp --> comp_fir16408
+comp_fir16408: move %40, %40 --> comp_fir1655
+comp_fir1655 : li %42, 4 --> comp_fir1654
+comp_fir1654 : mulo %41, %8, %42 --> comp_fir1653
+comp_fir1653 : add %147, %40, %41 --> comp_fir16204
+comp_fir16204: sw %39, 0(%147) --> comp_fir1652
+comp_fir1652 : emit c26 --> comp_fir1651
+comp_fir1651 : emit c25 --> comp_fir1650
+comp_fir1650 : li %7, 0 --> comp_fir1620
+comp_fir1620 : j --> comp_fir1649
+comp_fir1649 : li %36, 0 --> comp_fir1648
+comp_fir1648 : emit c24 --> comp_fir1647
+comp_fir1647 : li %38, 16 --> comp_fir1646
+comp_fir1646 : slt %37, %7, %38 --> comp_fir1645
+comp_fir1645 : li %146, 0 --> comp_fir16203
+comp_fir16203: seq %35, %37, %146 --> comp_fir1644
+comp_fir1644 : beq %35, %36 --> comp_fir1643, comp_fir1619
+comp_fir1619 : emit c19 --> comp_fir1618
+comp_fir1618 : li %19, 1 --> comp_fir1617
+comp_fir1617 : add %17, %8, %19 --> comp_fir1616
+comp_fir1616 : li %18, 16 --> comp_fir1615
+comp_fir1615 : la %137, mod --> comp_fir16194
+comp_fir16194: j --> comp_fir16401
+comp_fir16401: move $a0, %17 --> comp_fir16400
+comp_fir16400: move $a1, %18 --> comp_fir16399
+comp_fir16399: call %137(2) --> comp_fir16398
+comp_fir16398: move %8, $v0 --> comp_fir1614
+comp_fir1614 : emit c18 --> comp_fir1613
+comp_fir1613 : li %16, 4 --> comp_fir1612
+comp_fir1612 : mulo %15, %6, %16 --> comp_fir1611
+comp_fir1611 : add %131, %2, %15 --> comp_fir16188
+comp_fir16188: sw %4, 0(%131) --> comp_fir1610
+comp_fir1610 : emit c28 --> comp_fir169
+comp_fir169 : li %14, 1 --> comp_fir168
+comp_fir168 : add %6, %6, %14 --> comp_fir167
+comp_fir1643 : emit c22 --> comp_fir1642
+comp_fir1642 : move %32, $sp --> comp_fir16406
+comp_fir16406: move %32, %32 --> comp_fir1641
+comp_fir1641 : li %34, 4 --> comp_fir1640
+comp_fir1640 : mulo %33, %8, %34 --> comp_fir1639
+comp_fir1639 : add %145, %32, %33 --> comp_fir16202
+comp_fir16202: lw %28, 0(%145) --> comp_fir1638
+comp_fir1638 : li %31, 4 --> comp_fir1637
+comp_fir1637 : mulo %30, %7, %31 --> comp_fir1636
+comp_fir1636 : add %144, %1, %30 --> comp_fir16201
+comp_fir16201: lw %29, 0(%144) --> comp_fir1635
+comp_fir1635 : mulo %24, %28, %29 --> comp_fir1634
+comp_fir1634 : li %26, 2 --> comp_fir1633
+comp_fir1633 : li %27, 16 --> comp_fir1632
+comp_fir1632 : xor %25, %26, %27 --> comp_fir1631
+comp_fir1631 : mulo %5, %24, %25 --> comp_fir1630
+comp_fir1630 : emit c21 --> comp_fir1629
+comp_fir1629 : add %4, %4, %5 --> comp_fir1628
+comp_fir1628 : emit c20 --> comp_fir1627
+comp_fir1627 : li %23, 1 --> comp_fir1626
+comp_fir1626 : add %21, %8, %23 --> comp_fir1625
+comp_fir1625 : li %22, 16 --> comp_fir1624
+comp_fir1624 : la %143, mod --> comp_fir16200
+comp_fir16200: j --> comp_fir16405
+comp_fir16405: move $a0, %21 --> comp_fir16404
+comp_fir16404: move $a1, %22 --> comp_fir16403
+comp_fir16403: call %143(2) --> comp_fir16402
+comp_fir16402: move %8, $v0 --> comp_fir1623
+comp_fir1623 : emit c23 --> comp_fir1622
+comp_fir1622 : li %20, 1 --> comp_fir1621
+comp_fir1621 : add %7, %7, %20 --> comp_fir1620
+
+procedure _main(0)
+stacksize 64
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78, %79, %80, %81, %82, %83,
+ %84, %85, %86, %87, %88, %89, %90,
+ %91, %92, %93, %94, %95, %96, %97,
+ %98, %99, %100, %101, %102, %103, %104,
+ %105, %106, %107, %108, %109, %110, %111,
+ %112, %113, %114, %115, %116, %117, %118,
+ %119, %120, %121, %122, %123, %124, %125,
+ %126, %127, %128, %129, %130, %131, %132,
+ %133, %134
+entry main307
+main307: newframe --> main306
+main306: move %134, $ra --> main305
+main305: move %133, $s7 --> main304
+main304: move %132, $s6 --> main303
+main303: move %131, $s5 --> main302
+main302: move %130, $s4 --> main301
+main301: move %129, $s3 --> main300
+main300: move %128, $s2 --> main299
+main299: move %127, $s1 --> main298
+main298: move %126, $s0 --> main297
+main297: li %0, 0 --> main296
+main296: li %2, 0 --> main295
+main295: li %3, 0 --> main294
+main294: li %4, 0 --> main293
+main293: li %5, 0 --> main292
+main292: li %6, 0 --> main291
+main291: li %7, 0 --> main290
+main290: li %8, 0 --> main289
+main289: li %9, 0 --> main288
+main288: li %10, 0 --> main287
+main287: li %11, 0 --> main286
+main286: li %12, 0 --> main285
+main285: li %13, 0 --> main284
+main284: li %14, 0 --> main283
+main283: li %15, 0 --> main282
+main282: li %16, 0 --> main281
+main281: li %17, 0 --> main280
+main280: li %18, 0 --> main279
+main279: li %19, 0 --> main278
+main278: li %20, 0 --> main277
+main277: li %21, 0 --> main276
+main276: li %22, 0 --> main275
+main275: li %23, 0 --> main274
+main274: li %24, 0 --> main273
+main273: li %25, 0 --> main272
+main272: li %26, 0 --> main271
+main271: li %27, 0 --> main270
+main270: li %28, 0 --> main269
+main269: li %29, 0 --> main268
+main268: li %30, 0 --> main267
+main267: li %31, 0 --> main266
+main266: li %32, 0 --> main265
+main265: li %33, 0 --> main264
+main264: li %34, 0 --> main263
+main263: li %35, 0 --> main262
+main262: li %36, 0 --> main261
+main261: li %37, 0 --> main260
+main260: li %38, 0 --> main259
+main259: li %39, 0 --> main258
+main258: li %40, 0 --> main257
+main257: li %41, 0 --> main256
+main256: li %42, 0 --> main255
+main255: li %43, 0 --> main254
+main254: li %44, 0 --> main253
+main253: li %45, 0 --> main252
+main252: li %46, 0 --> main251
+main251: li %47, 0 --> main250
+main250: li %48, 0 --> main249
+main249: li %49, 0 --> main248
+main248: li %50, 0 --> main247
+main247: li %51, 0 --> main246
+main246: li %52, 0 --> main245
+main245: li %53, 0 --> main244
+main244: li %54, 0 --> main243
+main243: li %55, 0 --> main242
+main242: li %56, 0 --> main241
+main241: li %57, 0 --> main240
+main240: li %58, 0 --> main239
+main239: li %59, 0 --> main238
+main238: li %60, 0 --> main237
+main237: li %61, 0 --> main236
+main236: li %62, 0 --> main235
+main235: li %63, 0 --> main234
+main234: li %64, 0 --> main233
+main233: li %65, 0 --> main232
+main232: li %66, 0 --> main231
+main231: li %67, 0 --> main230
+main230: li %68, 0 --> main229
+main229: li %69, 0 --> main228
+main228: li %70, 0 --> main227
+main227: li %71, 0 --> main226
+main226: li %72, 0 --> main225
+main225: li %73, 0 --> main224
+main224: li %74, 0 --> main223
+main223: li %75, 0 --> main222
+main222: li %76, 0 --> main221
+main221: li %77, 0 --> main220
+main220: li %78, 0 --> main219
+main219: li %79, 0 --> main218
+main218: li %80, 0 --> main217
+main217: li %81, 0 --> main216
+main216: li %82, 0 --> main215
+main215: li %83, 0 --> main214
+main214: li %84, 0 --> main213
+main213: li %85, 0 --> main212
+main212: li %86, 0 --> main211
+main211: li %87, 0 --> main210
+main210: li %88, 0 --> main209
+main209: li %89, 0 --> main208
+main208: li %90, 0 --> main207
+main207: li %91, 0 --> main206
+main206: li %92, 0 --> main205
+main205: li %93, 0 --> main204
+main204: li %94, 0 --> main203
+main203: li %95, 0 --> main202
+main202: li %96, 0 --> main201
+main201: li %97, 0 --> main200
+main200: li %98, 0 --> main199
+main199: li %99, 0 --> main198
+main198: li %100, 0 --> main197
+main197: li %101, 0 --> main196
+main196: li %102, 0 --> main195
+main195: li %103, 0 --> main194
+main194: li %104, 0 --> main193
+main193: li %105, 0 --> main192
+main192: li %106, 0 --> main191
+main191: li %107, 0 --> main190
+main190: li %108, 0 --> main189
+main189: li %109, 0 --> main188
+main188: li %110, 0 --> main187
+main187: li %111, 0 --> main186
+main186: li %112, 0 --> main185
+main185: li %113, 0 --> main184
+main184: li %114, 0 --> main183
+main183: li %115, 0 --> main182
+main182: li %116, 0 --> main181
+main181: li %117, 0 --> main180
+main180: li %118, 0 --> main179
+main179: li %119, 0 --> main178
+main178: li %120, 0 --> main177
+main177: li %121, 0 --> main176
+main176: li %122, 0 --> main175
+main175: li %123, 0 --> main174
+main174: li %124, 0 --> main173
+main173: li %125, 0 --> main149
+main149: emit c165 --> main148
+main148: li %98, 10 --> main147
+main147: move %99, $sp --> main327
+main327: move %99, %99 --> main146
+main146: li %101, 0 --> main145
+main145: li %102, 4 --> main144
+main144: mulo %100, %101, %102 --> main143
+main143: add %110, %99, %100 --> main157
+main157: sw %98, 0(%110) --> main142
+main142: emit c164 --> main141
+main141: li %93, 9 --> main140
+main140: move %94, $sp --> main326
+main326: move %94, %94 --> main139
+main139: li %96, 1 --> main138
+main138: li %97, 4 --> main137
+main137: mulo %95, %96, %97 --> main136
+main136: add %109, %94, %95 --> main156
+main156: sw %93, 0(%109) --> main135
+main135: emit c163 --> main134
+main134: li %88, 8 --> main133
+main133: move %89, $sp --> main325
+main325: move %89, %89 --> main132
+main132: li %91, 2 --> main131
+main131: li %92, 4 --> main130
+main130: mulo %90, %91, %92 --> main129
+main129: add %108, %89, %90 --> main155
+main155: sw %88, 0(%108) --> main128
+main128: emit c162 --> main127
+main127: li %83, 7 --> main126
+main126: move %84, $sp --> main323
+main323: move %84, %84 --> main125
+main125: li %86, 3 --> main124
+main124: li %87, 4 --> main123
+main123: mulo %85, %86, %87 --> main122
+main122: add %107, %84, %85 --> main154
+main154: sw %83, 0(%107) --> main121
+main121: emit c161 --> main120
+main120: li %78, 6 --> main119
+main119: move %79, $sp --> main322
+main322: move %79, %79 --> main118
+main118: li %81, 4 --> main117
+main117: li %82, 4 --> main116
+main116: mulo %80, %81, %82 --> main115
+main115: add %106, %79, %80 --> main153
+main153: sw %78, 0(%106) --> main114
+main114: emit c160 --> main113
+main113: li %73, 0 --> main112
+main112: move %74, $sp --> main321
+main321: move %74, %74 --> main111
+main111: li %76, 5 --> main110
+main110: li %77, 4 --> main109
+main109: mulo %75, %76, %77 --> main108
+main108: add %104, %74, %75 --> main151
+main151: sw %73, 0(%104) --> main107
+main107: emit c159 --> main106
+main106: li %68, 5 --> main105
+main105: move %69, $sp --> main320
+main320: move %69, %69 --> main104
+main104: li %71, 6 --> main103
+main103: li %72, 4 --> main102
+main102: mulo %70, %71, %72 --> main101
+main101: add %103, %69, %70 --> main150
+main150: sw %68, 0(%103) --> main100
+main100: emit c158 --> main99
+main99 : li %63, 4 --> main98
+main98 : move %64, $sp --> main380
+main380: move %64, %64 --> main97
+main97 : li %66, 7 --> main96
+main96 : li %67, 4 --> main95
+main95 : mulo %65, %66, %67 --> main94
+main94 : add %125, %64, %65 --> main172
+main172: sw %63, 0(%125) --> main93
+main93 : emit c157 --> main92
+main92 : li %58, 3 --> main91
+main91 : move %59, $sp --> main379
+main379: move %59, %59 --> main90
+main90 : li %61, 8 --> main89
+main89 : li %62, 4 --> main88
+main88 : mulo %60, %61, %62 --> main87
+main87 : add %124, %59, %60 --> main171
+main171: sw %58, 0(%124) --> main86
+main86 : emit c156 --> main85
+main85 : li %53, 2 --> main84
+main84 : move %54, $sp --> main377
+main377: move %54, %54 --> main83
+main83 : li %56, 9 --> main82
+main82 : li %57, 4 --> main81
+main81 : mulo %55, %56, %57 --> main80
+main80 : add %123, %54, %55 --> main170
+main170: sw %53, 0(%123) --> main79
+main79 : emit c155 --> main78
+main78 : li %48, 0 --> main77
+main77 : move %49, $sp --> main375
+main375: move %49, %49 --> main76
+main76 : li %51, 10 --> main75
+main75 : li %52, 4 --> main74
+main74 : mulo %50, %51, %52 --> main73
+main73 : add %122, %49, %50 --> main169
+main169: sw %48, 0(%122) --> main72
+main72 : emit c154 --> main71
+main71 : li %43, 0 --> main70
+main70 : move %44, $sp --> main374
+main374: move %44, %44 --> main69
+main69 : li %46, 11 --> main68
+main68 : li %47, 4 --> main67
+main67 : mulo %45, %46, %47 --> main66
+main66 : add %121, %44, %45 --> main168
+main168: sw %43, 0(%121) --> main65
+main65 : emit c153 --> main64
+main64 : li %38, 0 --> main63
+main63 : move %39, $sp --> main373
+main373: move %39, %39 --> main62
+main62 : li %41, 12 --> main61
+main61 : li %42, 4 --> main60
+main60 : mulo %40, %41, %42 --> main59
+main59 : add %120, %39, %40 --> main167
+main167: sw %38, 0(%120) --> main58
+main58 : emit c152 --> main57
+main57 : li %33, 0 --> main56
+main56 : move %34, $sp --> main372
+main372: move %34, %34 --> main55
+main55 : li %36, 13 --> main54
+main54 : li %37, 4 --> main53
+main53 : mulo %35, %36, %37 --> main52
+main52 : add %119, %34, %35 --> main166
+main166: sw %33, 0(%119) --> main51
+main51 : emit c151 --> main50
+main50 : li %28, 0 --> main49
+main49 : move %29, $sp --> main371
+main371: move %29, %29 --> main48
+main48 : li %31, 14 --> main47
+main47 : li %32, 4 --> main46
+main46 : mulo %30, %31, %32 --> main45
+main45 : add %117, %29, %30 --> main164
+main164: sw %28, 0(%117) --> main44
+main44 : emit c150 --> main43
+main43 : li %23, 0 --> main42
+main42 : move %24, $sp --> main370
+main370: move %24, %24 --> main41
+main41 : li %26, 15 --> main40
+main40 : li %27, 4 --> main39
+main39 : mulo %25, %26, %27 --> main38
+main38 : add %116, %24, %25 --> main163
+main163: sw %23, 0(%116) --> main37
+main37 : emit c149 --> main36
+main36 : move %18, $sp --> main369
+main369: move %18, %18 --> main35
+main35 : move %19, $sp --> main368
+main368: move %19, %19 --> main34
+main34 : move %20, $sp --> main367
+main367: move %20, %20 --> main33
+main33 : li %21, 10 --> main32
+main32 : li %22, 10 --> main31
+main31 : la %115, comp_fir_basic --> main162
+main162: j --> main356
+main356: move $a0, %18 --> main355
+main355: move $a1, %19 --> main354
+main354: move $a2, %20 --> main353
+main353: move $a3, %21 --> main352
+main352: sets out(0), %22 --> main351
+main351: call %115(5) --> main350
+main350: move %0, $v0 --> main30
+main30 : emit c148 --> main29
+main29 : move %14, $sp --> main366
+main366: move %14, %14 --> main28
+main28 : move %15, $sp --> main365
+main365: move %15, %15 --> main27
+main27 : move %16, $sp --> main364
+main364: move %16, %16 --> main26
+main26 : li %17, 16 --> main25
+main25 : la %113, comp_fir16 --> main160
+main160: j --> main347
+main347: move $a0, %14 --> main346
+main346: move $a1, %15 --> main345
+main345: move $a2, %16 --> main344
+main344: move $a3, %17 --> main343
+main343: call %113(4) --> main342
+main342: move %0, $v0 --> main24
+main24 : emit c147 --> main23
+main23 : li %11, 4 --> main22
+main22 : li %12, 1 --> main21
+main21 : li %13, 1 --> main20
+main20 : la %112, comp_ifFor --> main159
+main159: j --> main341
+main341: move $a0, %11 --> main340
+main340: move $a1, %12 --> main339
+main339: move $a2, %13 --> main338
+main338: call %112(3) --> main337
+main337: move %0, $v0 --> main19
+main19 : emit c146 --> main18
+main18 : move %8, $sp --> main363
+main363: move %8, %8 --> main17
+main17 : li %9, 9 --> main16
+main16 : li %10, 3 --> main15
+main15 : la %111, comp_total --> main158
+main158: j --> main336
+main336: move $a0, %8 --> main335
+main335: move $a1, %9 --> main334
+main334: move $a2, %10 --> main333
+main333: call %111(3) --> main332
+main332: move %0, $v0 --> main14
+main14 : emit c145 --> main13
+main13 : move %6, $sp --> main324
+main324: move %6, %6 --> main12
+main12 : li %7, 10 --> main11
+main11 : la %105, comp_tri --> main152
+main152: j --> main331
+main331: move $a0, %6 --> main330
+main330: move $a1, %7 --> main329
+main329: call %105(2) --> main328
+main328: move %0, $v0 --> main10
+main10 : emit c144 --> main9
+main9 : move %2, $sp --> main378
+main378: move %2, %2 --> main8
+main8 : move %3, $sp --> main376
+main376: move %3, %3 --> main7
+main7 : li %4, 10 --> main6
+main6 : li %5, 10 --> main5
+main5 : la %118, comp_forif2 --> main165
+main165: j --> main362
+main362: move $a0, %2 --> main361
+main361: move $a1, %3 --> main360
+main360: move $a2, %4 --> main359
+main359: move $a3, %5 --> main358
+main358: call %118(4) --> main357
+main357: move %0, $v0 --> main4
+main4 : emit c143 --> main3
+main3 : la %114, comp_forif --> main161
+main161: j --> main349
+main349: call %114(0) --> main348
+main348: move %0, $v0 --> main2
+main2 : emit c142 --> main1
+main1 : move %1, %0 --> main0
+main0 : j --> main319
+main319: move $v0, %1 --> main318
+main318: move $ra, %134 --> main317
+main317: move $s7, %133 --> main316
+main316: move $s6, %132 --> main315
+main315: move $s5, %131 --> main314
+main314: move $s4, %130 --> main313
+main313: move $s3, %129 --> main312
+main312: move $s2, %128 --> main311
+main311: move $s1, %127 --> main310
+main310: move $s0, %126 --> main309
+main309: delframe --> main308
+main308: jr $ra (xmits $v0)
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure comp_tri(2)
+var 0
+comp_tri123:
+newframe
+c108:
+li $v0, 0
+c107:
+c106:
+li $t1, 0
+comp_tri55:
+li $a3, 0
+c105:
+slt $a2, $t1, $a1
+seq $a2, $a2, $zero
+beq $a2, $a3, comp_tri50
+c95:
+delframe
+jr $ra
+comp_tri50:
+c103:
+c102:
+li $t2, 1
+comp_tri47:
+li $a3, 0
+c101:
+sub $a2, $a1, $t1
+slt $a2, $t2, $a2
+seq $a2, $a2, $zero
+beq $a2, $a3, comp_tri41
+c104:
+li $a2, 1
+add $t1, $t1, $a2
+j comp_tri55
+comp_tri41:
+c99:
+li $a2, 4
+mulo $a2, $t2, $a2
+add $a2, $a0, $a2
+lw $t0, 0($a2)
+li $a2, 1
+sub $a3, $t2, $a2
+li $a2, 4
+mulo $a2, $a3, $a2
+add $a2, $a0, $a2
+lw $a2, 0($a2)
+slt $a2, $t0, $a2
+beq $a2, $zero, comp_tri10
+c98:
+li $v0, 1
+sub $a2, $t2, $v0
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+lw $v0, 0($v0)
+c97:
+li $a2, 4
+mulo $a2, $t2, $a2
+add $a2, $a0, $a2
+lw $t0, 0($a2)
+li $a2, 1
+sub $a3, $t2, $a2
+li $a2, 4
+mulo $a2, $a3, $a2
+add $a2, $a0, $a2
+sw $t0, 0($a2)
+c96:
+li $a2, 4
+mulo $a2, $t2, $a2
+add $a2, $a0, $a2
+sw $v0, 0($a2)
+comp_tri10:
+c100:
+li $a2, 1
+add $t2, $t2, $a2
+j comp_tri47
+
+procedure comp_total(3)
+var 80
+comp_total410:
+newframe
+c94:
+li $t0, 0
+move $a3, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a3, $v0
+sw $t0, 0($v0)
+c93:
+move $t0, $sp
+li $a3, 1
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c92:
+move $t0, $sp
+li $a3, 2
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c91:
+move $t0, $sp
+li $a3, 3
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c90:
+move $t0, $sp
+li $a3, 4
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c89:
+move $t0, $sp
+li $a3, 5
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c88:
+move $t0, $sp
+li $a3, 6
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c87:
+move $t0, $sp
+li $a3, 7
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c86:
+move $t0, $sp
+li $a3, 8
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c85:
+move $t0, $sp
+li $a3, 9
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c84:
+li $t0, 0
+move $a3, $sp
+addi $a3, $a3, 40
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a3, $v0
+sw $t0, 0($v0)
+c83:
+move $t0, $sp
+addi $t0, $t0, 40
+li $a3, 1
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c82:
+move $t0, $sp
+addi $t0, $t0, 40
+li $a3, 2
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c81:
+move $t0, $sp
+addi $t0, $t0, 40
+li $a3, 3
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c80:
+move $t0, $sp
+addi $t0, $t0, 40
+li $a3, 4
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c79:
+move $t0, $sp
+addi $t0, $t0, 40
+li $a3, 5
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c78:
+move $t0, $sp
+addi $t0, $t0, 40
+li $a3, 6
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c77:
+move $t0, $sp
+addi $t0, $t0, 40
+li $a3, 7
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c76:
+move $t0, $sp
+addi $t0, $t0, 40
+li $a3, 8
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c75:
+move $t0, $sp
+addi $t0, $t0, 40
+li $a3, 9
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $t0, $v0
+sw $zero, 0($v0)
+c74:
+slt $v0, $a1, $a2
+beq $v0, $zero, comp_total40
+c73:
+c72:
+li $t0, 0
+comp_total58:
+li $a2, 0
+c71:
+sle $v0, $t0, $a1
+seq $v0, $v0, $zero
+beq $v0, $a2, comp_total53
+comp_total2:
+c59:
+li $v0, 0
+delframe
+jr $ra
+comp_total53:
+c69:
+sub $a2, $a1, $t0
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+lw $a3, 0($v0)
+move $a2, $sp
+li $v0, 4
+mulo $v0, $t0, $v0
+add $v0, $a2, $v0
+sw $a3, 0($v0)
+c70:
+li $v0, 1
+add $t0, $t0, $v0
+j comp_total58
+comp_total40:
+c68:
+c67:
+li $t2, 0
+comp_total37:
+li $a3, 0
+c66:
+slt $v0, $t2, $a1
+seq $v0, $v0, $zero
+bne $v0, $a3, comp_total2
+c64:
+c63:
+move $t1, $a2
+comp_total29:
+li $a3, 0
+c62:
+sgt $v0, $t1, $zero
+seq $v0, $v0, $zero
+beq $v0, $a3, comp_total23
+c65:
+li $v0, 1
+add $t2, $t2, $v0
+j comp_total37
+comp_total23:
+c60:
+move $a3, $sp
+li $v0, 4
+mulo $v0, $t2, $v0
+add $v0, $a3, $v0
+lw $t0, 0($v0)
+move $a3, $sp
+addi $a3, $a3, 40
+li $v0, 4
+mulo $v0, $t1, $v0
+add $v0, $a3, $v0
+lw $v0, 0($v0)
+add $a3, $t0, $v0
+li $v0, 4
+mulo $v0, $t2, $v0
+add $v0, $a0, $v0
+sw $a3, 0($v0)
+c61:
+li $v0, 1
+sub $t1, $t1, $v0
+j comp_total29
+
+procedure comp_ifFor(3)
+var 0
+comp_ifFor45:
+newframe
+c58:
+li $v0, 0
+c57:
+c56:
+li $t0, 0
+comp_ifFor18:
+li $t1, 0
+c55:
+slt $a3, $t0, $a0
+seq $a3, $a3, $zero
+beq $a3, $t1, comp_ifFor13
+c50:
+delframe
+jr $ra
+comp_ifFor13:
+c53:
+sne $a3, $t0, $a1
+beq $a3, $zero, comp_ifFor7
+c52:
+add $v0, $v0, $t0
+comp_ifFor5:
+c54:
+add $t0, $t0, $a2
+j comp_ifFor18
+comp_ifFor7:
+c51:
+li $v0, 0
+j comp_ifFor5
+
+procedure comp_forif2(4)
+var 16
+comp_forif2153:
+newframe
+sw $ra, 12($sp)
+sw $s2, 8($sp)
+sw $s1, 4($sp)
+sw $s0, 0($sp)
+c130:
+li $s0, 0
+c129:
+li $s1, 0
+c128:
+c127:
+li $t0, 0
+comp_forif275:
+li $t1, 0
+c126:
+slt $v0, $t0, $a2
+seq $v0, $v0, $zero
+beq $v0, $t1, comp_forif270
+c123:
+c122:
+li $a0, 0
+comp_forif258:
+li $a2, 0
+c121:
+slt $v0, $a0, $a3
+seq $v0, $v0, $zero
+beq $v0, $a2, comp_forif253
+c118:
+li $s2, 0
+c117:
+li $a1, 2
+la $v0, mod
+move $a0, $s0
+call $v0
+li $a0, 0
+seq $v0, $v0, $a0
+beq $v0, $zero, comp_forif226
+c116:
+li $a1, 2
+la $v0, mod
+move $a0, $s1
+call $v0
+li $a0, 0
+seq $v0, $v0, $a0
+beq $v0, $zero, comp_forif227
+li $v0, 1
+comp_forif225:
+beq $v0, $s2, comp_forif222
+c115:
+comp_forif22:
+c109:
+li $v0, 0
+lw $ra, 12($sp)
+lw $s2, 8($sp)
+lw $s1, 4($sp)
+lw $s0, 0($sp)
+delframe
+jr $ra
+comp_forif222:
+c114:
+li $a1, 2
+la $v0, mod
+move $a0, $s0
+call $v0
+li $a0, 0
+seq $v0, $v0, $a0
+beq $v0, $zero, comp_forif213
+c113:
+j comp_forif22
+comp_forif213:
+c112:
+li $a1, 2
+la $v0, mod
+move $a0, $s1
+call $v0
+li $a0, 0
+seq $v0, $v0, $a0
+beq $v0, $zero, comp_forif24
+c111:
+j comp_forif22
+comp_forif24:
+c110:
+j comp_forif22
+comp_forif227:
+li $v0, 0
+j comp_forif225
+comp_forif226:
+li $v0, 0
+j comp_forif225
+comp_forif253:
+c119:
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+lw $v0, 0($v0)
+add $s1, $s1, $v0
+c120:
+li $v0, 1
+add $a0, $a0, $v0
+j comp_forif258
+comp_forif270:
+c124:
+li $v0, 4
+mulo $v0, $t0, $v0
+add $v0, $a0, $v0
+lw $v0, 0($v0)
+add $s0, $s0, $v0
+c125:
+li $v0, 1
+add $t0, $t0, $v0
+j comp_forif275
+
+procedure comp_forif(0)
+var 12
+comp_forif65:
+newframe
+sw $ra, 8($sp)
+sw $s1, 4($sp)
+sw $s0, 0($sp)
+c141:
+li $s1, 0
+c140:
+c139:
+c138:
+li $s0, 0
+comp_forif28:
+li $a0, 0
+c137:
+li $v0, 10
+slt $v0, $s0, $v0
+seq $v0, $v0, $zero
+beq $v0, $a0, comp_forif22
+c131:
+move $v0, $s1
+lw $ra, 8($sp)
+lw $s1, 4($sp)
+lw $s0, 0($sp)
+delframe
+jr $ra
+comp_forif22:
+c135:
+li $v0, 1
+add $s1, $s1, $v0
+c134:
+li $v0, 1
+add $s1, $s1, $v0
+c133:
+li $a1, 2
+la $v0, mod
+move $a0, $s0
+call $v0
+li $a0, 0
+seq $v0, $v0, $a0
+beq $v0, $zero, comp_forif6
+c132:
+comp_forif6:
+c136:
+li $v0, 1
+add $s0, $s0, $v0
+j comp_forif28
+
+procedure comp_fir_basic(5)
+var 4
+comp_fir_basic141:
+newframe
+c16:
+li $v0, 0
+c15:
+c14:
+li $t3, 0
+comp_fir_basic64:
+li $t0, 0
+c13:
+li $a3, 3
+slt $a3, $t3, $a3
+seq $a3, $a3, $zero
+beq $a3, $t0, comp_fir_basic58
+c0:
+delframe
+jr $ra
+comp_fir_basic58:
+c11:
+li $a3, 4
+mulo $a3, $t3, $a3
+add $a3, $a0, $a3
+lw $t0, 0($a3)
+li $a3, 4
+mulo $a3, $zero, $a3
+add $a3, $a2, $a3
+sw $t0, 0($a3)
+c10:
+c9:
+li $t0, 0
+comp_fir_basic47:
+li $t1, 0
+c8:
+li $a3, 3
+slt $a3, $t0, $a3
+seq $a3, $a3, $zero
+beq $a3, $t1, comp_fir_basic41
+c5:
+c4:
+li $t2, 2
+comp_fir_basic25:
+li $t0, 0
+c3:
+sge $a3, $t2, $zero
+seq $a3, $a3, $zero
+beq $a3, $t0, comp_fir_basic19
+c12:
+li $a3, 1
+add $t3, $t3, $a3
+j comp_fir_basic64
+comp_fir_basic19:
+c1:
+li $a3, 4
+mulo $a3, $t2, $a3
+add $a3, $a2, $a3
+lw $t1, 0($a3)
+li $a3, 1
+add $t0, $t2, $a3
+li $a3, 4
+mulo $a3, $t0, $a3
+add $a3, $a2, $a3
+sw $t1, 0($a3)
+c2:
+li $a3, 1
+sub $t2, $t2, $a3
+j comp_fir_basic25
+comp_fir_basic41:
+c6:
+li $a3, 4
+mulo $a3, $t0, $a3
+add $a3, $a1, $a3
+lw $t1, 0($a3)
+li $a3, 4
+mulo $a3, $t0, $a3
+add $a3, $a2, $a3
+lw $a3, 0($a3)
+mulo $a3, $t1, $a3
+add $v0, $v0, $a3
+c7:
+li $a3, 1
+add $t0, $t0, $a3
+j comp_fir_basic47
+
+procedure comp_fir16(4)
+var 96
+comp_fir16373:
+newframe
+sw $ra, 92($sp)
+sw $s6, 88($sp)
+sw $s5, 84($sp)
+sw $s4, 80($sp)
+sw $s3, 76($sp)
+sw $s2, 72($sp)
+sw $s1, 68($sp)
+sw $s0, 64($sp)
+move $s6, $a0
+move $s5, $a1
+move $s4, $a2
+move $s3, $a3
+c49:
+li $a1, 0
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c48:
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c47:
+move $a1, $sp
+li $a0, 2
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c46:
+move $a1, $sp
+li $a0, 3
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c45:
+move $a1, $sp
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c44:
+move $a1, $sp
+li $a0, 5
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c43:
+move $a1, $sp
+li $a0, 6
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c42:
+move $a1, $sp
+li $a0, 7
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c41:
+move $a1, $sp
+li $a0, 8
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c40:
+move $a1, $sp
+li $a0, 9
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c39:
+move $a1, $sp
+li $a0, 10
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c38:
+move $a1, $sp
+li $a0, 11
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c37:
+move $a1, $sp
+li $a0, 12
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c36:
+move $a1, $sp
+li $a0, 13
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c35:
+move $a1, $sp
+li $a0, 14
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c34:
+move $a1, $sp
+li $a0, 15
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c33:
+li $v0, 0
+c32:
+li $s2, 0
+c31:
+c30:
+li $s1, 0
+comp_fir1665:
+li $a1, 0
+c29:
+slt $a0, $s1, $s3
+seq $a0, $a0, $zero
+beq $a0, $a1, comp_fir1660
+c17:
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $sp, $v0
+lw $v0, 0($v0)
+lw $ra, 92($sp)
+lw $s6, 88($sp)
+lw $s5, 84($sp)
+lw $s4, 80($sp)
+lw $s3, 76($sp)
+lw $s2, 72($sp)
+lw $s1, 68($sp)
+lw $s0, 64($sp)
+delframe
+jr $ra
+comp_fir1660:
+c27:
+li $a0, 4
+mulo $a0, $s1, $a0
+add $a0, $s6, $a0
+lw $a2, 0($a0)
+move $a1, $sp
+li $a0, 4
+mulo $a0, $v0, $a0
+add $a0, $a1, $a0
+sw $a2, 0($a0)
+c26:
+c25:
+li $s0, 0
+comp_fir1649:
+li $a1, 0
+c24:
+li $a0, 16
+slt $a0, $s0, $a0
+seq $a0, $a0, $zero
+beq $a0, $a1, comp_fir1643
+c19:
+li $a0, 1
+add $a0, $v0, $a0
+li $a1, 16
+la $v0, mod
+call $v0
+c18:
+li $a0, 4
+mulo $a0, $s1, $a0
+add $a0, $s4, $a0
+sw $s2, 0($a0)
+c28:
+li $a0, 1
+add $s1, $s1, $a0
+j comp_fir1665
+comp_fir1643:
+c22:
+move $a1, $sp
+li $a0, 4
+mulo $a0, $v0, $a0
+add $a0, $a1, $a0
+lw $a1, 0($a0)
+li $a0, 4
+mulo $a0, $s0, $a0
+add $a0, $s5, $a0
+lw $a0, 0($a0)
+mulo $a2, $a1, $a0
+li $a1, 2
+li $a0, 16
+xor $a0, $a1, $a0
+mulo $a0, $a2, $a0
+c21:
+add $s2, $s2, $a0
+c20:
+li $a0, 1
+add $a0, $v0, $a0
+li $a1, 16
+la $v0, mod
+call $v0
+c23:
+li $a0, 1
+add $s0, $s0, $a0
+j comp_fir1649
+
+procedure _main(0)
+var 68
+main307:
+newframe
+sw $ra, 64($sp)
+c165:
+li $a1, 10
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c164:
+li $a2, 9
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c163:
+li $a2, 8
+move $a1, $sp
+li $a0, 2
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c162:
+li $a2, 7
+move $a1, $sp
+li $a0, 3
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c161:
+li $a2, 6
+move $a1, $sp
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c160:
+move $a1, $sp
+li $a0, 5
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c159:
+li $a2, 5
+move $a1, $sp
+li $a0, 6
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c158:
+li $a2, 4
+move $a1, $sp
+li $a0, 7
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c157:
+li $a2, 3
+move $a1, $sp
+li $a0, 8
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c156:
+li $a2, 2
+move $a1, $sp
+li $a0, 9
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c155:
+move $a1, $sp
+li $a0, 10
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c154:
+move $a1, $sp
+li $a0, 11
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c153:
+move $a1, $sp
+li $a0, 12
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c152:
+move $a1, $sp
+li $a0, 13
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c151:
+move $a1, $sp
+li $a0, 14
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c150:
+move $a1, $sp
+li $a0, 15
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c149:
+move $a0, $sp
+move $a1, $sp
+move $a2, $sp
+li $a3, 10
+li $t0, 10
+la $v0, comp_fir_basic
+sw $t0, -4($sp)
+call $v0
+c148:
+move $a0, $sp
+move $a1, $sp
+move $a2, $sp
+li $a3, 16
+la $v0, comp_fir16
+call $v0
+c147:
+li $a0, 4
+li $a1, 1
+li $a2, 1
+la $v0, comp_ifFor
+call $v0
+c146:
+move $a0, $sp
+li $a1, 9
+li $a2, 3
+la $v0, comp_total
+call $v0
+c145:
+move $a0, $sp
+li $a1, 10
+la $v0, comp_tri
+call $v0
+c144:
+move $a0, $sp
+move $a1, $sp
+li $a2, 10
+li $a3, 10
+la $v0, comp_forif2
+call $v0
+c143:
+la $v0, comp_forif
+call $v0
+c142:
+lw $ra, 64($sp)
+delframe
+jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure comp_tri(2)
+var 0
+entry comp_tri123
+comp_tri123: newframe --> comp_tri122
+comp_tri122: j --> comp_tri121
+comp_tri121: j --> comp_tri120
+comp_tri120: j --> comp_tri119
+comp_tri119: j --> comp_tri118
+comp_tri118: j --> comp_tri117
+comp_tri117: j --> comp_tri116
+comp_tri116: j --> comp_tri115
+comp_tri115: j --> comp_tri114
+comp_tri114: j --> comp_tri113
+comp_tri113: j --> comp_tri112
+comp_tri112: j --> comp_tri111
+comp_tri111: j --> comp_tri110
+comp_tri110: j --> comp_tri109
+comp_tri109: j --> comp_tri108
+comp_tri108: j --> comp_tri107
+comp_tri107: j --> comp_tri106
+comp_tri106: j --> comp_tri105
+comp_tri105: j --> comp_tri104
+comp_tri104: j --> comp_tri103
+comp_tri103: j --> comp_tri102
+comp_tri102: j --> comp_tri101
+comp_tri101: j --> comp_tri100
+comp_tri100: j --> comp_tri99
+comp_tri99 : j --> comp_tri98
+comp_tri98 : j --> comp_tri97
+comp_tri97 : j --> comp_tri96
+comp_tri96 : j --> comp_tri95
+comp_tri95 : j --> comp_tri94
+comp_tri94 : j --> comp_tri93
+comp_tri93 : j --> comp_tri92
+comp_tri92 : j --> comp_tri91
+comp_tri91 : j --> comp_tri90
+comp_tri90 : j --> comp_tri89
+comp_tri89 : j --> comp_tri88
+comp_tri88 : j --> comp_tri87
+comp_tri87 : j --> comp_tri86
+comp_tri86 : j --> comp_tri85
+comp_tri85 : j --> comp_tri84
+comp_tri84 : j --> comp_tri83
+comp_tri83 : j --> comp_tri82
+comp_tri82 : j --> comp_tri81
+comp_tri81 : j --> comp_tri80
+comp_tri80 : j --> comp_tri79
+comp_tri79 : j --> comp_tri78
+comp_tri78 : j --> comp_tri77
+comp_tri77 : j --> comp_tri76
+comp_tri76 : j --> comp_tri75
+comp_tri75 : j --> comp_tri74
+comp_tri74 : j --> comp_tri73
+comp_tri73 : j --> comp_tri72
+comp_tri72 : j --> comp_tri71
+comp_tri71 : j --> comp_tri70
+comp_tri70 : j --> comp_tri69
+comp_tri69 : j --> comp_tri60
+comp_tri60 : emit c108 --> comp_tri59
+comp_tri59 : li $v0, 0 --> comp_tri58
+comp_tri58 : emit c107 --> comp_tri57
+comp_tri57 : emit c106 --> comp_tri56
+comp_tri56 : li $t1, 0 --> comp_tri3
+comp_tri3 : j --> comp_tri55
+comp_tri55 : li $a3, 0 --> comp_tri54
+comp_tri54 : emit c105 --> comp_tri53
+comp_tri53 : slt $a2, $t1, $a1 --> comp_tri52
+comp_tri52 : j --> comp_tri68
+comp_tri68 : seq $a2, $a2, $zero --> comp_tri51
+comp_tri51 : beq $a2, $a3 --> comp_tri50, comp_tri2
+comp_tri2 : emit c95 --> comp_tri1
+comp_tri1 : j --> comp_tri0
+comp_tri0 : j --> comp_tri135
+comp_tri135: j --> comp_tri134
+comp_tri134: j --> comp_tri133
+comp_tri133: j --> comp_tri132
+comp_tri132: j --> comp_tri131
+comp_tri131: j --> comp_tri130
+comp_tri130: j --> comp_tri129
+comp_tri129: j --> comp_tri128
+comp_tri128: j --> comp_tri127
+comp_tri127: j --> comp_tri126
+comp_tri126: j --> comp_tri125
+comp_tri125: delframe --> comp_tri124
+comp_tri124: jr $ra
+comp_tri50 : emit c103 --> comp_tri49
+comp_tri49 : emit c102 --> comp_tri48
+comp_tri48 : li $t2, 1 --> comp_tri7
+comp_tri7 : j --> comp_tri47
+comp_tri47 : li $a3, 0 --> comp_tri46
+comp_tri46 : emit c101 --> comp_tri45
+comp_tri45 : sub $a2, $a1, $t1 --> comp_tri44
+comp_tri44 : slt $a2, $t2, $a2 --> comp_tri43
+comp_tri43 : j --> comp_tri67
+comp_tri67 : seq $a2, $a2, $zero --> comp_tri42
+comp_tri42 : beq $a2, $a3 --> comp_tri41, comp_tri6
+comp_tri6 : emit c104 --> comp_tri5
+comp_tri5 : li $a2, 1 --> comp_tri4
+comp_tri4 : add $t1, $t1, $a2 --> comp_tri3
+comp_tri41 : emit c99 --> comp_tri40
+comp_tri40 : j --> comp_tri39
+comp_tri39 : li $a2, 4 --> comp_tri38
+comp_tri38 : mulo $a2, $t2, $a2 --> comp_tri37
+comp_tri37 : add $a2, $a0, $a2 --> comp_tri66
+comp_tri66 : lw $t0, 0($a2) --> comp_tri36
+comp_tri36 : li $a2, 1 --> comp_tri35
+comp_tri35 : sub $a3, $t2, $a2 --> comp_tri34
+comp_tri34 : li $a2, 4 --> comp_tri33
+comp_tri33 : mulo $a2, $a3, $a2 --> comp_tri32
+comp_tri32 : add $a2, $a0, $a2 --> comp_tri65
+comp_tri65 : lw $a2, 0($a2) --> comp_tri31
+comp_tri31 : slt $a2, $t0, $a2 --> comp_tri30
+comp_tri30 : beq $a2, $zero --> comp_tri10, comp_tri29
+comp_tri29 : emit c98 --> comp_tri28
+comp_tri28 : li $v0, 1 --> comp_tri27
+comp_tri27 : sub $a2, $t2, $v0 --> comp_tri26
+comp_tri26 : li $v0, 4 --> comp_tri25
+comp_tri25 : mulo $v0, $a2, $v0 --> comp_tri24
+comp_tri24 : add $v0, $a0, $v0 --> comp_tri64
+comp_tri64 : lw $v0, 0($v0) --> comp_tri23
+comp_tri23 : emit c97 --> comp_tri22
+comp_tri22 : li $a2, 4 --> comp_tri21
+comp_tri21 : mulo $a2, $t2, $a2 --> comp_tri20
+comp_tri20 : add $a2, $a0, $a2 --> comp_tri63
+comp_tri63 : lw $t0, 0($a2) --> comp_tri19
+comp_tri19 : li $a2, 1 --> comp_tri18
+comp_tri18 : sub $a3, $t2, $a2 --> comp_tri17
+comp_tri17 : li $a2, 4 --> comp_tri16
+comp_tri16 : mulo $a2, $a3, $a2 --> comp_tri15
+comp_tri15 : add $a2, $a0, $a2 --> comp_tri62
+comp_tri62 : lw $t0, 0($a2) --> comp_tri14
+comp_tri14 : emit c96 --> comp_tri13
+comp_tri13 : li $a2, 4 --> comp_tri12
+comp_tri12 : mulo $a2, $t2, $a2 --> comp_tri11
+comp_tri11 : add $a2, $a0, $a2 --> comp_tri61
+comp_tri61 : lw $v0, 0($a2) --> comp_tri10
+comp_tri10 : emit c100 --> comp_tri9
+comp_tri9 : li $a2, 1 --> comp_tri8
+comp_tri8 : add $t2, $t2, $a2 --> comp_tri7
+
+procedure comp_total(3)
+var 80
+entry comp_total410
+comp_total410: newframe --> comp_total409
+comp_total409: j --> comp_total408
+comp_total408: j --> comp_total407
+comp_total407: j --> comp_total406
+comp_total406: j --> comp_total405
+comp_total405: j --> comp_total404
+comp_total404: j --> comp_total403
+comp_total403: j --> comp_total402
+comp_total402: j --> comp_total401
+comp_total401: j --> comp_total400
+comp_total400: j --> comp_total399
+comp_total399: j --> comp_total398
+comp_total398: j --> comp_total397
+comp_total397: j --> comp_total396
+comp_total396: j --> comp_total395
+comp_total395: j --> comp_total394
+comp_total394: j --> comp_total393
+comp_total393: j --> comp_total392
+comp_total392: j --> comp_total391
+comp_total391: j --> comp_total390
+comp_total390: j --> comp_total389
+comp_total389: j --> comp_total388
+comp_total388: j --> comp_total387
+comp_total387: j --> comp_total386
+comp_total386: j --> comp_total385
+comp_total385: j --> comp_total384
+comp_total384: j --> comp_total383
+comp_total383: j --> comp_total382
+comp_total382: j --> comp_total381
+comp_total381: j --> comp_total380
+comp_total380: j --> comp_total379
+comp_total379: j --> comp_total378
+comp_total378: j --> comp_total377
+comp_total377: j --> comp_total376
+comp_total376: j --> comp_total375
+comp_total375: j --> comp_total374
+comp_total374: j --> comp_total373
+comp_total373: j --> comp_total372
+comp_total372: j --> comp_total371
+comp_total371: j --> comp_total370
+comp_total370: j --> comp_total369
+comp_total369: j --> comp_total368
+comp_total368: j --> comp_total367
+comp_total367: j --> comp_total366
+comp_total366: j --> comp_total365
+comp_total365: j --> comp_total364
+comp_total364: j --> comp_total363
+comp_total363: j --> comp_total362
+comp_total362: j --> comp_total361
+comp_total361: j --> comp_total360
+comp_total360: j --> comp_total359
+comp_total359: j --> comp_total358
+comp_total358: j --> comp_total357
+comp_total357: j --> comp_total356
+comp_total356: j --> comp_total355
+comp_total355: j --> comp_total354
+comp_total354: j --> comp_total353
+comp_total353: j --> comp_total352
+comp_total352: j --> comp_total351
+comp_total351: j --> comp_total350
+comp_total350: j --> comp_total349
+comp_total349: j --> comp_total348
+comp_total348: j --> comp_total347
+comp_total347: j --> comp_total346
+comp_total346: j --> comp_total345
+comp_total345: j --> comp_total344
+comp_total344: j --> comp_total343
+comp_total343: j --> comp_total342
+comp_total342: j --> comp_total341
+comp_total341: j --> comp_total340
+comp_total340: j --> comp_total339
+comp_total339: j --> comp_total338
+comp_total338: j --> comp_total337
+comp_total337: j --> comp_total336
+comp_total336: j --> comp_total335
+comp_total335: j --> comp_total334
+comp_total334: j --> comp_total333
+comp_total333: j --> comp_total332
+comp_total332: j --> comp_total331
+comp_total331: j --> comp_total330
+comp_total330: j --> comp_total329
+comp_total329: j --> comp_total328
+comp_total328: j --> comp_total327
+comp_total327: j --> comp_total326
+comp_total326: j --> comp_total325
+comp_total325: j --> comp_total324
+comp_total324: j --> comp_total323
+comp_total323: j --> comp_total322
+comp_total322: j --> comp_total321
+comp_total321: j --> comp_total320
+comp_total320: j --> comp_total319
+comp_total319: j --> comp_total318
+comp_total318: j --> comp_total317
+comp_total317: j --> comp_total316
+comp_total316: j --> comp_total315
+comp_total315: j --> comp_total314
+comp_total314: j --> comp_total313
+comp_total313: j --> comp_total312
+comp_total312: j --> comp_total311
+comp_total311: j --> comp_total310
+comp_total310: j --> comp_total309
+comp_total309: j --> comp_total308
+comp_total308: j --> comp_total307
+comp_total307: j --> comp_total306
+comp_total306: j --> comp_total305
+comp_total305: j --> comp_total304
+comp_total304: j --> comp_total303
+comp_total303: j --> comp_total302
+comp_total302: j --> comp_total301
+comp_total301: j --> comp_total300
+comp_total300: j --> comp_total299
+comp_total299: j --> comp_total298
+comp_total298: j --> comp_total297
+comp_total297: j --> comp_total296
+comp_total296: j --> comp_total295
+comp_total295: j --> comp_total294
+comp_total294: j --> comp_total293
+comp_total293: j --> comp_total292
+comp_total292: j --> comp_total291
+comp_total291: j --> comp_total290
+comp_total290: j --> comp_total289
+comp_total289: j --> comp_total288
+comp_total288: j --> comp_total287
+comp_total287: j --> comp_total286
+comp_total286: j --> comp_total285
+comp_total285: j --> comp_total284
+comp_total284: j --> comp_total283
+comp_total283: j --> comp_total282
+comp_total282: j --> comp_total281
+comp_total281: j --> comp_total280
+comp_total280: j --> comp_total279
+comp_total279: j --> comp_total278
+comp_total278: j --> comp_total277
+comp_total277: j --> comp_total276
+comp_total276: j --> comp_total275
+comp_total275: j --> comp_total274
+comp_total274: j --> comp_total273
+comp_total273: j --> comp_total272
+comp_total272: j --> comp_total271
+comp_total271: j --> comp_total270
+comp_total270: j --> comp_total269
+comp_total269: j --> comp_total268
+comp_total268: j --> comp_total267
+comp_total267: j --> comp_total266
+comp_total266: j --> comp_total265
+comp_total265: j --> comp_total264
+comp_total264: j --> comp_total263
+comp_total263: j --> comp_total262
+comp_total262: j --> comp_total261
+comp_total261: j --> comp_total260
+comp_total260: j --> comp_total259
+comp_total259: j --> comp_total258
+comp_total258: j --> comp_total257
+comp_total257: j --> comp_total256
+comp_total256: j --> comp_total255
+comp_total255: j --> comp_total254
+comp_total254: j --> comp_total253
+comp_total253: j --> comp_total252
+comp_total252: j --> comp_total251
+comp_total251: j --> comp_total250
+comp_total250: j --> comp_total249
+comp_total249: j --> comp_total248
+comp_total248: j --> comp_total247
+comp_total247: j --> comp_total246
+comp_total246: j --> comp_total245
+comp_total245: j --> comp_total244
+comp_total244: j --> comp_total243
+comp_total243: j --> comp_total242
+comp_total242: j --> comp_total241
+comp_total241: j --> comp_total240
+comp_total240: j --> comp_total239
+comp_total239: j --> comp_total238
+comp_total238: j --> comp_total237
+comp_total237: j --> comp_total236
+comp_total236: j --> comp_total235
+comp_total235: j --> comp_total234
+comp_total234: j --> comp_total205
+comp_total205: emit c94 --> comp_total204
+comp_total204: li $t0, 0 --> comp_total203
+comp_total203: move $a3, $sp --> comp_total438
+comp_total438: j --> comp_total202
+comp_total202: j --> comp_total201
+comp_total201: li $v0, 4 --> comp_total200
+comp_total200: mulo $v0, $zero, $v0 --> comp_total199
+comp_total199: add $v0, $a3, $v0 --> comp_total223
+comp_total223: lw $t0, 0($v0) --> comp_total198
+comp_total198: emit c93 --> comp_total197
+comp_total197: j --> comp_total196
+comp_total196: move $t0, $sp --> comp_total437
+comp_total437: j --> comp_total195
+comp_total195: li $a3, 1 --> comp_total194
+comp_total194: li $v0, 4 --> comp_total193
+comp_total193: mulo $v0, $a3, $v0 --> comp_total192
+comp_total192: add $v0, $t0, $v0 --> comp_total222
+comp_total222: lw $zero, 0($v0) --> comp_total191
+comp_total191: emit c92 --> comp_total190
+comp_total190: j --> comp_total189
+comp_total189: move $t0, $sp --> comp_total436
+comp_total436: j --> comp_total188
+comp_total188: li $a3, 2 --> comp_total187
+comp_total187: li $v0, 4 --> comp_total186
+comp_total186: mulo $v0, $a3, $v0 --> comp_total185
+comp_total185: add $v0, $t0, $v0 --> comp_total220
+comp_total220: lw $zero, 0($v0) --> comp_total184
+comp_total184: emit c91 --> comp_total183
+comp_total183: j --> comp_total182
+comp_total182: move $t0, $sp --> comp_total435
+comp_total435: j --> comp_total181
+comp_total181: li $a3, 3 --> comp_total180
+comp_total180: li $v0, 4 --> comp_total179
+comp_total179: mulo $v0, $a3, $v0 --> comp_total178
+comp_total178: add $v0, $t0, $v0 --> comp_total219
+comp_total219: lw $zero, 0($v0) --> comp_total177
+comp_total177: emit c90 --> comp_total176
+comp_total176: j --> comp_total175
+comp_total175: move $t0, $sp --> comp_total433
+comp_total433: j --> comp_total174
+comp_total174: li $a3, 4 --> comp_total173
+comp_total173: li $v0, 4 --> comp_total172
+comp_total172: mulo $v0, $a3, $v0 --> comp_total171
+comp_total171: add $v0, $t0, $v0 --> comp_total218
+comp_total218: lw $zero, 0($v0) --> comp_total170
+comp_total170: emit c89 --> comp_total169
+comp_total169: j --> comp_total168
+comp_total168: move $t0, $sp --> comp_total432
+comp_total432: j --> comp_total167
+comp_total167: li $a3, 5 --> comp_total166
+comp_total166: li $v0, 4 --> comp_total165
+comp_total165: mulo $v0, $a3, $v0 --> comp_total164
+comp_total164: add $v0, $t0, $v0 --> comp_total217
+comp_total217: lw $zero, 0($v0) --> comp_total163
+comp_total163: emit c88 --> comp_total162
+comp_total162: j --> comp_total161
+comp_total161: move $t0, $sp --> comp_total431
+comp_total431: j --> comp_total160
+comp_total160: li $a3, 6 --> comp_total159
+comp_total159: li $v0, 4 --> comp_total158
+comp_total158: mulo $v0, $a3, $v0 --> comp_total157
+comp_total157: add $v0, $t0, $v0 --> comp_total216
+comp_total216: lw $zero, 0($v0) --> comp_total156
+comp_total156: emit c87 --> comp_total155
+comp_total155: j --> comp_total154
+comp_total154: move $t0, $sp --> comp_total430
+comp_total430: j --> comp_total153
+comp_total153: li $a3, 7 --> comp_total152
+comp_total152: li $v0, 4 --> comp_total151
+comp_total151: mulo $v0, $a3, $v0 --> comp_total150
+comp_total150: add $v0, $t0, $v0 --> comp_total215
+comp_total215: lw $zero, 0($v0) --> comp_total149
+comp_total149: emit c86 --> comp_total148
+comp_total148: j --> comp_total147
+comp_total147: move $t0, $sp --> comp_total429
+comp_total429: j --> comp_total146
+comp_total146: li $a3, 8 --> comp_total145
+comp_total145: li $v0, 4 --> comp_total144
+comp_total144: mulo $v0, $a3, $v0 --> comp_total143
+comp_total143: add $v0, $t0, $v0 --> comp_total213
+comp_total213: lw $zero, 0($v0) --> comp_total142
+comp_total142: emit c85 --> comp_total141
+comp_total141: j --> comp_total140
+comp_total140: move $t0, $sp --> comp_total428
+comp_total428: j --> comp_total139
+comp_total139: li $a3, 9 --> comp_total138
+comp_total138: li $v0, 4 --> comp_total137
+comp_total137: mulo $v0, $a3, $v0 --> comp_total136
+comp_total136: add $v0, $t0, $v0 --> comp_total212
+comp_total212: lw $zero, 0($v0) --> comp_total135
+comp_total135: emit c84 --> comp_total134
+comp_total134: li $t0, 0 --> comp_total133
+comp_total133: move $a3, $sp --> comp_total427
+comp_total427: addi $a3, $a3, 40 --> comp_total132
+comp_total132: j --> comp_total131
+comp_total131: li $v0, 4 --> comp_total130
+comp_total130: mulo $v0, $zero, $v0 --> comp_total129
+comp_total129: add $v0, $a3, $v0 --> comp_total211
+comp_total211: lw $t0, 0($v0) --> comp_total128
+comp_total128: emit c83 --> comp_total127
+comp_total127: j --> comp_total126
+comp_total126: move $t0, $sp --> comp_total426
+comp_total426: addi $t0, $t0, 40 --> comp_total125
+comp_total125: li $a3, 1 --> comp_total124
+comp_total124: li $v0, 4 --> comp_total123
+comp_total123: mulo $v0, $a3, $v0 --> comp_total122
+comp_total122: add $v0, $t0, $v0 --> comp_total210
+comp_total210: lw $zero, 0($v0) --> comp_total121
+comp_total121: emit c82 --> comp_total120
+comp_total120: j --> comp_total119
+comp_total119: move $t0, $sp --> comp_total425
+comp_total425: addi $t0, $t0, 40 --> comp_total118
+comp_total118: li $a3, 2 --> comp_total117
+comp_total117: li $v0, 4 --> comp_total116
+comp_total116: mulo $v0, $a3, $v0 --> comp_total115
+comp_total115: add $v0, $t0, $v0 --> comp_total209
+comp_total209: lw $zero, 0($v0) --> comp_total114
+comp_total114: emit c81 --> comp_total113
+comp_total113: j --> comp_total112
+comp_total112: move $t0, $sp --> comp_total424
+comp_total424: addi $t0, $t0, 40 --> comp_total111
+comp_total111: li $a3, 3 --> comp_total110
+comp_total110: li $v0, 4 --> comp_total109
+comp_total109: mulo $v0, $a3, $v0 --> comp_total108
+comp_total108: add $v0, $t0, $v0 --> comp_total207
+comp_total207: lw $zero, 0($v0) --> comp_total107
+comp_total107: emit c80 --> comp_total106
+comp_total106: j --> comp_total105
+comp_total105: move $t0, $sp --> comp_total423
+comp_total423: addi $t0, $t0, 40 --> comp_total104
+comp_total104: li $a3, 4 --> comp_total103
+comp_total103: li $v0, 4 --> comp_total102
+comp_total102: mulo $v0, $a3, $v0 --> comp_total101
+comp_total101: add $v0, $t0, $v0 --> comp_total206
+comp_total206: lw $zero, 0($v0) --> comp_total100
+comp_total100: emit c79 --> comp_total99
+comp_total99 : j --> comp_total98
+comp_total98 : move $t0, $sp --> comp_total445
+comp_total445: addi $t0, $t0, 40 --> comp_total97
+comp_total97 : li $a3, 5 --> comp_total96
+comp_total96 : li $v0, 4 --> comp_total95
+comp_total95 : mulo $v0, $a3, $v0 --> comp_total94
+comp_total94 : add $v0, $t0, $v0 --> comp_total233
+comp_total233: lw $zero, 0($v0) --> comp_total93
+comp_total93 : emit c78 --> comp_total92
+comp_total92 : j --> comp_total91
+comp_total91 : move $t0, $sp --> comp_total444
+comp_total444: addi $t0, $t0, 40 --> comp_total90
+comp_total90 : li $a3, 6 --> comp_total89
+comp_total89 : li $v0, 4 --> comp_total88
+comp_total88 : mulo $v0, $a3, $v0 --> comp_total87
+comp_total87 : add $v0, $t0, $v0 --> comp_total232
+comp_total232: lw $zero, 0($v0) --> comp_total86
+comp_total86 : emit c77 --> comp_total85
+comp_total85 : j --> comp_total84
+comp_total84 : move $t0, $sp --> comp_total443
+comp_total443: addi $t0, $t0, 40 --> comp_total83
+comp_total83 : li $a3, 7 --> comp_total82
+comp_total82 : li $v0, 4 --> comp_total81
+comp_total81 : mulo $v0, $a3, $v0 --> comp_total80
+comp_total80 : add $v0, $t0, $v0 --> comp_total231
+comp_total231: lw $zero, 0($v0) --> comp_total79
+comp_total79 : emit c76 --> comp_total78
+comp_total78 : j --> comp_total77
+comp_total77 : move $t0, $sp --> comp_total442
+comp_total442: addi $t0, $t0, 40 --> comp_total76
+comp_total76 : li $a3, 8 --> comp_total75
+comp_total75 : li $v0, 4 --> comp_total74
+comp_total74 : mulo $v0, $a3, $v0 --> comp_total73
+comp_total73 : add $v0, $t0, $v0 --> comp_total230
+comp_total230: lw $zero, 0($v0) --> comp_total72
+comp_total72 : emit c75 --> comp_total71
+comp_total71 : j --> comp_total70
+comp_total70 : move $t0, $sp --> comp_total441
+comp_total441: addi $t0, $t0, 40 --> comp_total69
+comp_total69 : li $a3, 9 --> comp_total68
+comp_total68 : li $v0, 4 --> comp_total67
+comp_total67 : mulo $v0, $a3, $v0 --> comp_total66
+comp_total66 : add $v0, $t0, $v0 --> comp_total229
+comp_total229: lw $zero, 0($v0) --> comp_total65
+comp_total65 : emit c74 --> comp_total64
+comp_total64 : j --> comp_total63
+comp_total63 : slt $v0, $a1, $a2 --> comp_total62
+comp_total62 : beq $v0, $zero --> comp_total40, comp_total61
+comp_total61 : emit c73 --> comp_total60
+comp_total60 : emit c72 --> comp_total59
+comp_total59 : li $t0, 0 --> comp_total41
+comp_total41 : j --> comp_total58
+comp_total58 : li $a2, 0 --> comp_total57
+comp_total57 : emit c71 --> comp_total56
+comp_total56 : sle $v0, $t0, $a1 --> comp_total55
+comp_total55 : j --> comp_total228
+comp_total228: seq $v0, $v0, $zero --> comp_total54
+comp_total54 : beq $v0, $a2 --> comp_total53, comp_total2
+comp_total2 : emit c59 --> comp_total1
+comp_total1 : li $v0, 0 --> comp_total0
+comp_total0 : j --> comp_total422
+comp_total422: j --> comp_total421
+comp_total421: j --> comp_total420
+comp_total420: j --> comp_total419
+comp_total419: j --> comp_total418
+comp_total418: j --> comp_total417
+comp_total417: j --> comp_total416
+comp_total416: j --> comp_total415
+comp_total415: j --> comp_total414
+comp_total414: j --> comp_total413
+comp_total413: j --> comp_total412
+comp_total412: delframe --> comp_total411
+comp_total411: jr $ra
+comp_total53 : emit c69 --> comp_total52
+comp_total52 : sub $a2, $a1, $t0 --> comp_total51
+comp_total51 : li $v0, 4 --> comp_total50
+comp_total50 : mulo $v0, $a2, $v0 --> comp_total49
+comp_total49 : add $v0, $a0, $v0 --> comp_total227
+comp_total227: lw $a3, 0($v0) --> comp_total48
+comp_total48 : move $a2, $sp --> comp_total440
+comp_total440: j --> comp_total47
+comp_total47 : li $v0, 4 --> comp_total46
+comp_total46 : mulo $v0, $t0, $v0 --> comp_total45
+comp_total45 : add $v0, $a2, $v0 --> comp_total226
+comp_total226: lw $a3, 0($v0) --> comp_total44
+comp_total44 : emit c70 --> comp_total43
+comp_total43 : li $v0, 1 --> comp_total42
+comp_total42 : add $t0, $t0, $v0 --> comp_total41
+comp_total40 : emit c68 --> comp_total39
+comp_total39 : emit c67 --> comp_total38
+comp_total38 : li $t2, 0 --> comp_total3
+comp_total3 : j --> comp_total37
+comp_total37 : li $a3, 0 --> comp_total36
+comp_total36 : emit c66 --> comp_total35
+comp_total35 : slt $v0, $t2, $a1 --> comp_total34
+comp_total34 : j --> comp_total225
+comp_total225: seq $v0, $v0, $zero --> comp_total33
+comp_total33 : beq $v0, $a3 --> comp_total32, comp_total2
+comp_total32 : emit c64 --> comp_total31
+comp_total31 : emit c63 --> comp_total30
+comp_total30 : move $t1, $a2 --> comp_total7
+comp_total7 : j --> comp_total29
+comp_total29 : li $a3, 0 --> comp_total28
+comp_total28 : emit c62 --> comp_total27
+comp_total27 : j --> comp_total26
+comp_total26 : sgt $v0, $t1, $zero --> comp_total25
+comp_total25 : j --> comp_total224
+comp_total224: seq $v0, $v0, $zero --> comp_total24
+comp_total24 : beq $v0, $a3 --> comp_total23, comp_total6
+comp_total6 : emit c65 --> comp_total5
+comp_total5 : li $v0, 1 --> comp_total4
+comp_total4 : add $t2, $t2, $v0 --> comp_total3
+comp_total23 : emit c60 --> comp_total22
+comp_total22 : move $a3, $sp --> comp_total439
+comp_total439: j --> comp_total21
+comp_total21 : li $v0, 4 --> comp_total20
+comp_total20 : mulo $v0, $t2, $v0 --> comp_total19
+comp_total19 : add $v0, $a3, $v0 --> comp_total221
+comp_total221: lw $t0, 0($v0) --> comp_total18
+comp_total18 : move $a3, $sp --> comp_total434
+comp_total434: addi $a3, $a3, 40 --> comp_total17
+comp_total17 : li $v0, 4 --> comp_total16
+comp_total16 : mulo $v0, $t1, $v0 --> comp_total15
+comp_total15 : add $v0, $a3, $v0 --> comp_total214
+comp_total214: lw $v0, 0($v0) --> comp_total14
+comp_total14 : add $a3, $t0, $v0 --> comp_total13
+comp_total13 : li $v0, 4 --> comp_total12
+comp_total12 : mulo $v0, $t2, $v0 --> comp_total11
+comp_total11 : add $v0, $a0, $v0 --> comp_total208
+comp_total208: lw $a3, 0($v0) --> comp_total10
+comp_total10 : emit c61 --> comp_total9
+comp_total9 : li $v0, 1 --> comp_total8
+comp_total8 : sub $t1, $t1, $v0 --> comp_total7
+
+procedure comp_ifFor(3)
+var 0
+entry comp_ifFor45
+comp_ifFor45: newframe --> comp_ifFor44
+comp_ifFor44: j --> comp_ifFor43
+comp_ifFor43: j --> comp_ifFor42
+comp_ifFor42: j --> comp_ifFor41
+comp_ifFor41: j --> comp_ifFor40
+comp_ifFor40: j --> comp_ifFor39
+comp_ifFor39: j --> comp_ifFor38
+comp_ifFor38: j --> comp_ifFor37
+comp_ifFor37: j --> comp_ifFor36
+comp_ifFor36: j --> comp_ifFor35
+comp_ifFor35: j --> comp_ifFor34
+comp_ifFor34: j --> comp_ifFor33
+comp_ifFor33: j --> comp_ifFor32
+comp_ifFor32: j --> comp_ifFor31
+comp_ifFor31: j --> comp_ifFor30
+comp_ifFor30: j --> comp_ifFor29
+comp_ifFor29: j --> comp_ifFor28
+comp_ifFor28: j --> comp_ifFor27
+comp_ifFor27: j --> comp_ifFor26
+comp_ifFor26: j --> comp_ifFor25
+comp_ifFor25: j --> comp_ifFor23
+comp_ifFor23: emit c58 --> comp_ifFor22
+comp_ifFor22: li $v0, 0 --> comp_ifFor21
+comp_ifFor21: emit c57 --> comp_ifFor20
+comp_ifFor20: emit c56 --> comp_ifFor19
+comp_ifFor19: li $t0, 0 --> comp_ifFor3
+comp_ifFor3 : j --> comp_ifFor18
+comp_ifFor18: li $t1, 0 --> comp_ifFor17
+comp_ifFor17: emit c55 --> comp_ifFor16
+comp_ifFor16: slt $a3, $t0, $a0 --> comp_ifFor15
+comp_ifFor15: j --> comp_ifFor24
+comp_ifFor24: seq $a3, $a3, $zero --> comp_ifFor14
+comp_ifFor14: beq $a3, $t1 --> comp_ifFor13, comp_ifFor2
+comp_ifFor2 : emit c50 --> comp_ifFor1
+comp_ifFor1 : j --> comp_ifFor0
+comp_ifFor0 : j --> comp_ifFor57
+comp_ifFor57: j --> comp_ifFor56
+comp_ifFor56: j --> comp_ifFor55
+comp_ifFor55: j --> comp_ifFor54
+comp_ifFor54: j --> comp_ifFor53
+comp_ifFor53: j --> comp_ifFor52
+comp_ifFor52: j --> comp_ifFor51
+comp_ifFor51: j --> comp_ifFor50
+comp_ifFor50: j --> comp_ifFor49
+comp_ifFor49: j --> comp_ifFor48
+comp_ifFor48: j --> comp_ifFor47
+comp_ifFor47: delframe --> comp_ifFor46
+comp_ifFor46: jr $ra
+comp_ifFor13: emit c53 --> comp_ifFor12
+comp_ifFor12: j --> comp_ifFor11
+comp_ifFor11: sne $a3, $t0, $a1 --> comp_ifFor10
+comp_ifFor10: beq $a3, $zero --> comp_ifFor7, comp_ifFor9
+comp_ifFor9 : emit c52 --> comp_ifFor8
+comp_ifFor8 : add $v0, $v0, $t0 --> comp_ifFor5
+comp_ifFor5 : emit c54 --> comp_ifFor4
+comp_ifFor4 : add $t0, $t0, $a2 --> comp_ifFor3
+comp_ifFor7 : emit c51 --> comp_ifFor6
+comp_ifFor6 : li $v0, 0 --> comp_ifFor5
+
+procedure comp_forif2(4)
+var 16
+entry comp_forif2153
+comp_forif2153: newframe --> comp_forif2152
+comp_forif2152: lw $ra, 12($sp) --> comp_forif2151
+comp_forif2151: j --> comp_forif2150
+comp_forif2150: j --> comp_forif2149
+comp_forif2149: j --> comp_forif2148
+comp_forif2148: j --> comp_forif2147
+comp_forif2147: j --> comp_forif2146
+comp_forif2146: lw $s2, 8($sp) --> comp_forif2145
+comp_forif2145: lw $s1, 4($sp) --> comp_forif2144
+comp_forif2144: lw $s0, 0($sp) --> comp_forif2143
+comp_forif2143: j --> comp_forif2142
+comp_forif2142: j --> comp_forif2141
+comp_forif2141: j --> comp_forif2140
+comp_forif2140: j --> comp_forif2139
+comp_forif2139: j --> comp_forif2138
+comp_forif2138: j --> comp_forif2137
+comp_forif2137: j --> comp_forif2136
+comp_forif2136: j --> comp_forif2135
+comp_forif2135: j --> comp_forif2134
+comp_forif2134: j --> comp_forif2133
+comp_forif2133: j --> comp_forif2132
+comp_forif2132: j --> comp_forif2131
+comp_forif2131: j --> comp_forif2130
+comp_forif2130: j --> comp_forif2129
+comp_forif2129: j --> comp_forif2128
+comp_forif2128: j --> comp_forif2127
+comp_forif2127: j --> comp_forif2126
+comp_forif2126: j --> comp_forif2125
+comp_forif2125: j --> comp_forif2124
+comp_forif2124: j --> comp_forif2123
+comp_forif2123: j --> comp_forif2122
+comp_forif2122: j --> comp_forif2121
+comp_forif2121: j --> comp_forif2120
+comp_forif2120: j --> comp_forif2119
+comp_forif2119: j --> comp_forif2118
+comp_forif2118: j --> comp_forif2117
+comp_forif2117: j --> comp_forif2116
+comp_forif2116: j --> comp_forif2115
+comp_forif2115: j --> comp_forif2114
+comp_forif2114: j --> comp_forif2113
+comp_forif2113: j --> comp_forif2112
+comp_forif2112: j --> comp_forif2111
+comp_forif2111: j --> comp_forif2110
+comp_forif2110: j --> comp_forif2109
+comp_forif2109: j --> comp_forif2108
+comp_forif2108: j --> comp_forif2107
+comp_forif2107: j --> comp_forif2106
+comp_forif2106: j --> comp_forif2105
+comp_forif2105: j --> comp_forif2104
+comp_forif2104: j --> comp_forif2103
+comp_forif2103: j --> comp_forif2102
+comp_forif2102: j --> comp_forif2101
+comp_forif2101: j --> comp_forif2100
+comp_forif2100: j --> comp_forif299
+comp_forif299 : j --> comp_forif298
+comp_forif298 : j --> comp_forif297
+comp_forif297 : j --> comp_forif296
+comp_forif296 : j --> comp_forif295
+comp_forif295 : j --> comp_forif294
+comp_forif294 : j --> comp_forif293
+comp_forif293 : j --> comp_forif292
+comp_forif292 : j --> comp_forif291
+comp_forif291 : j --> comp_forif282
+comp_forif282 : emit c130 --> comp_forif281
+comp_forif281 : li $s0, 0 --> comp_forif280
+comp_forif280 : emit c129 --> comp_forif279
+comp_forif279 : li $s1, 0 --> comp_forif278
+comp_forif278 : emit c128 --> comp_forif277
+comp_forif277 : emit c127 --> comp_forif276
+comp_forif276 : li $t0, 0 --> comp_forif262
+comp_forif262 : j --> comp_forif275
+comp_forif275 : li $t1, 0 --> comp_forif274
+comp_forif274 : emit c126 --> comp_forif273
+comp_forif273 : slt $v0, $t0, $a2 --> comp_forif272
+comp_forif272 : j --> comp_forif290
+comp_forif290 : seq $v0, $v0, $zero --> comp_forif271
+comp_forif271 : beq $v0, $t1 --> comp_forif270, comp_forif261
+comp_forif261 : emit c123 --> comp_forif260
+comp_forif260 : emit c122 --> comp_forif259
+comp_forif259 : li $a0, 0 --> comp_forif245
+comp_forif245 : j --> comp_forif258
+comp_forif258 : li $a2, 0 --> comp_forif257
+comp_forif257 : emit c121 --> comp_forif256
+comp_forif256 : slt $v0, $a0, $a3 --> comp_forif255
+comp_forif255 : j --> comp_forif288
+comp_forif288 : seq $v0, $v0, $zero --> comp_forif254
+comp_forif254 : beq $v0, $a2 --> comp_forif253, comp_forif244
+comp_forif244 : emit c118 --> comp_forif243
+comp_forif243 : li $s2, 0 --> comp_forif242
+comp_forif242 : j --> comp_forif241
+comp_forif241 : emit c117 --> comp_forif240
+comp_forif240 : li $a1, 2 --> comp_forif239
+comp_forif239 : la $v0, mod --> comp_forif286
+comp_forif286 : j --> comp_forif2181
+comp_forif2181: move $a0, $s0 --> comp_forif2180
+comp_forif2180: j --> comp_forif2179
+comp_forif2179: call $v0 --> comp_forif2178
+comp_forif2178: j --> comp_forif238
+comp_forif238 : li $a0, 0 --> comp_forif237
+comp_forif237 : seq $v0, $v0, $a0 --> comp_forif236
+comp_forif236 : beq $v0, $zero --> comp_forif226, comp_forif235
+comp_forif235 : j --> comp_forif234
+comp_forif234 : emit c116 --> comp_forif233
+comp_forif233 : li $a1, 2 --> comp_forif232
+comp_forif232 : la $v0, mod --> comp_forif285
+comp_forif285 : j --> comp_forif2177
+comp_forif2177: move $a0, $s1 --> comp_forif2176
+comp_forif2176: j --> comp_forif2175
+comp_forif2175: call $v0 --> comp_forif2174
+comp_forif2174: j --> comp_forif231
+comp_forif231 : li $a0, 0 --> comp_forif230
+comp_forif230 : seq $v0, $v0, $a0 --> comp_forif229
+comp_forif229 : beq $v0, $zero --> comp_forif227, comp_forif228
+comp_forif228 : li $v0, 1 --> comp_forif225
+comp_forif225 : beq $v0, $s2 --> comp_forif222, comp_forif224
+comp_forif224 : emit c115 --> comp_forif223
+comp_forif223 : j --> comp_forif22
+comp_forif22 : emit c109 --> comp_forif21
+comp_forif21 : li $v0, 0 --> comp_forif20
+comp_forif20 : j --> comp_forif2165
+comp_forif2165: j --> comp_forif2164
+comp_forif2164: lw $ra, 12($sp) --> comp_forif2163
+comp_forif2163: j --> comp_forif2162
+comp_forif2162: j --> comp_forif2161
+comp_forif2161: j --> comp_forif2160
+comp_forif2160: j --> comp_forif2159
+comp_forif2159: j --> comp_forif2158
+comp_forif2158: lw $s2, 8($sp) --> comp_forif2157
+comp_forif2157: lw $s1, 4($sp) --> comp_forif2156
+comp_forif2156: lw $s0, 0($sp) --> comp_forif2155
+comp_forif2155: delframe --> comp_forif2154
+comp_forif2154: jr $ra
+comp_forif222 : emit c114 --> comp_forif221
+comp_forif221 : j --> comp_forif220
+comp_forif220 : li $a1, 2 --> comp_forif219
+comp_forif219 : la $v0, mod --> comp_forif284
+comp_forif284 : j --> comp_forif2173
+comp_forif2173: move $a0, $s0 --> comp_forif2172
+comp_forif2172: j --> comp_forif2171
+comp_forif2171: call $v0 --> comp_forif2170
+comp_forif2170: j --> comp_forif218
+comp_forif218 : li $a0, 0 --> comp_forif217
+comp_forif217 : seq $v0, $v0, $a0 --> comp_forif216
+comp_forif216 : beq $v0, $zero --> comp_forif213, comp_forif215
+comp_forif215 : emit c113 --> comp_forif214
+comp_forif214 : j --> comp_forif22
+comp_forif213 : emit c112 --> comp_forif212
+comp_forif212 : j --> comp_forif211
+comp_forif211 : li $a1, 2 --> comp_forif210
+comp_forif210 : la $v0, mod --> comp_forif283
+comp_forif283 : j --> comp_forif2169
+comp_forif2169: move $a0, $s1 --> comp_forif2168
+comp_forif2168: j --> comp_forif2167
+comp_forif2167: call $v0 --> comp_forif2166
+comp_forif2166: j --> comp_forif29
+comp_forif29 : li $a0, 0 --> comp_forif28
+comp_forif28 : seq $v0, $v0, $a0 --> comp_forif27
+comp_forif27 : beq $v0, $zero --> comp_forif24, comp_forif26
+comp_forif26 : emit c111 --> comp_forif25
+comp_forif25 : j --> comp_forif22
+comp_forif24 : emit c110 --> comp_forif23
+comp_forif23 : j --> comp_forif22
+comp_forif227 : li $v0, 0 --> comp_forif225
+comp_forif226 : li $v0, 0 --> comp_forif225
+comp_forif253 : emit c119 --> comp_forif252
+comp_forif252 : li $v0, 4 --> comp_forif251
+comp_forif251 : mulo $v0, $a0, $v0 --> comp_forif250
+comp_forif250 : add $v0, $a1, $v0 --> comp_forif287
+comp_forif287 : lw $v0, 0($v0) --> comp_forif249
+comp_forif249 : add $s1, $s1, $v0 --> comp_forif248
+comp_forif248 : emit c120 --> comp_forif247
+comp_forif247 : li $v0, 1 --> comp_forif246
+comp_forif246 : add $a0, $a0, $v0 --> comp_forif245
+comp_forif270 : emit c124 --> comp_forif269
+comp_forif269 : li $v0, 4 --> comp_forif268
+comp_forif268 : mulo $v0, $t0, $v0 --> comp_forif267
+comp_forif267 : add $v0, $a0, $v0 --> comp_forif289
+comp_forif289 : lw $v0, 0($v0) --> comp_forif266
+comp_forif266 : add $s0, $s0, $v0 --> comp_forif265
+comp_forif265 : emit c125 --> comp_forif264
+comp_forif264 : li $v0, 1 --> comp_forif263
+comp_forif263 : add $t0, $t0, $v0 --> comp_forif262
+
+procedure comp_forif(0)
+var 12
+entry comp_forif65
+comp_forif65: newframe --> comp_forif64
+comp_forif64: lw $ra, 8($sp) --> comp_forif63
+comp_forif63: j --> comp_forif62
+comp_forif62: j --> comp_forif61
+comp_forif61: j --> comp_forif60
+comp_forif60: j --> comp_forif59
+comp_forif59: j --> comp_forif58
+comp_forif58: j --> comp_forif57
+comp_forif57: lw $s1, 4($sp) --> comp_forif56
+comp_forif56: lw $s0, 0($sp) --> comp_forif55
+comp_forif55: j --> comp_forif54
+comp_forif54: j --> comp_forif53
+comp_forif53: j --> comp_forif52
+comp_forif52: j --> comp_forif51
+comp_forif51: j --> comp_forif50
+comp_forif50: j --> comp_forif49
+comp_forif49: j --> comp_forif48
+comp_forif48: j --> comp_forif47
+comp_forif47: j --> comp_forif46
+comp_forif46: j --> comp_forif45
+comp_forif45: j --> comp_forif44
+comp_forif44: j --> comp_forif43
+comp_forif43: j --> comp_forif42
+comp_forif42: j --> comp_forif41
+comp_forif41: j --> comp_forif40
+comp_forif40: j --> comp_forif39
+comp_forif39: j --> comp_forif38
+comp_forif38: j --> comp_forif35
+comp_forif35: emit c141 --> comp_forif34
+comp_forif34: li $s1, 0 --> comp_forif33
+comp_forif33: emit c140 --> comp_forif32
+comp_forif32: j --> comp_forif31
+comp_forif31: emit c139 --> comp_forif30
+comp_forif30: emit c138 --> comp_forif29
+comp_forif29: li $s0, 0 --> comp_forif3
+comp_forif3 : j --> comp_forif28
+comp_forif28: li $a0, 0 --> comp_forif27
+comp_forif27: emit c137 --> comp_forif26
+comp_forif26: li $v0, 10 --> comp_forif25
+comp_forif25: slt $v0, $s0, $v0 --> comp_forif24
+comp_forif24: j --> comp_forif37
+comp_forif37: seq $v0, $v0, $zero --> comp_forif23
+comp_forif23: beq $v0, $a0 --> comp_forif22, comp_forif2
+comp_forif2 : emit c131 --> comp_forif1
+comp_forif1 : j --> comp_forif0
+comp_forif0 : j --> comp_forif77
+comp_forif77: move $v0, $s1 --> comp_forif76
+comp_forif76: lw $ra, 8($sp) --> comp_forif75
+comp_forif75: j --> comp_forif74
+comp_forif74: j --> comp_forif73
+comp_forif73: j --> comp_forif72
+comp_forif72: j --> comp_forif71
+comp_forif71: j --> comp_forif70
+comp_forif70: j --> comp_forif69
+comp_forif69: lw $s1, 4($sp) --> comp_forif68
+comp_forif68: lw $s0, 0($sp) --> comp_forif67
+comp_forif67: delframe --> comp_forif66
+comp_forif66: jr $ra
+comp_forif22: emit c135 --> comp_forif21
+comp_forif21: li $v0, 1 --> comp_forif20
+comp_forif20: add $s1, $s1, $v0 --> comp_forif19
+comp_forif19: emit c134 --> comp_forif18
+comp_forif18: li $v0, 1 --> comp_forif17
+comp_forif17: add $s1, $s1, $v0 --> comp_forif16
+comp_forif16: emit c133 --> comp_forif15
+comp_forif15: j --> comp_forif14
+comp_forif14: li $a1, 2 --> comp_forif13
+comp_forif13: la $v0, mod --> comp_forif36
+comp_forif36: j --> comp_forif81
+comp_forif81: move $a0, $s0 --> comp_forif80
+comp_forif80: j --> comp_forif79
+comp_forif79: call $v0 --> comp_forif78
+comp_forif78: j --> comp_forif12
+comp_forif12: li $a0, 0 --> comp_forif11
+comp_forif11: seq $v0, $v0, $a0 --> comp_forif10
+comp_forif10: beq $v0, $zero --> comp_forif6, comp_forif9
+comp_forif9 : emit c132 --> comp_forif8
+comp_forif8 : j --> comp_forif7
+comp_forif7 : j --> comp_forif6
+comp_forif6 : emit c136 --> comp_forif5
+comp_forif5 : li $v0, 1 --> comp_forif4
+comp_forif4 : add $s0, $s0, $v0 --> comp_forif3
+
+procedure comp_fir_basic(5)
+var 4
+entry comp_fir_basic141
+comp_fir_basic141: newframe --> comp_fir_basic140
+comp_fir_basic140: j --> comp_fir_basic139
+comp_fir_basic139: j --> comp_fir_basic138
+comp_fir_basic138: j --> comp_fir_basic137
+comp_fir_basic137: j --> comp_fir_basic136
+comp_fir_basic136: j --> comp_fir_basic135
+comp_fir_basic135: j --> comp_fir_basic134
+comp_fir_basic134: j --> comp_fir_basic133
+comp_fir_basic133: j --> comp_fir_basic132
+comp_fir_basic132: j --> comp_fir_basic131
+comp_fir_basic131: j --> comp_fir_basic130
+comp_fir_basic130: j --> comp_fir_basic129
+comp_fir_basic129: j --> comp_fir_basic128
+comp_fir_basic128: j --> comp_fir_basic127
+comp_fir_basic127: j --> comp_fir_basic126
+comp_fir_basic126: j --> comp_fir_basic125
+comp_fir_basic125: j --> comp_fir_basic124
+comp_fir_basic124: j --> comp_fir_basic123
+comp_fir_basic123: j --> comp_fir_basic122
+comp_fir_basic122: j --> comp_fir_basic121
+comp_fir_basic121: j --> comp_fir_basic120
+comp_fir_basic120: j --> comp_fir_basic119
+comp_fir_basic119: j --> comp_fir_basic118
+comp_fir_basic118: j --> comp_fir_basic117
+comp_fir_basic117: j --> comp_fir_basic116
+comp_fir_basic116: j --> comp_fir_basic115
+comp_fir_basic115: j --> comp_fir_basic114
+comp_fir_basic114: j --> comp_fir_basic113
+comp_fir_basic113: j --> comp_fir_basic112
+comp_fir_basic112: j --> comp_fir_basic111
+comp_fir_basic111: j --> comp_fir_basic110
+comp_fir_basic110: j --> comp_fir_basic109
+comp_fir_basic109: j --> comp_fir_basic108
+comp_fir_basic108: j --> comp_fir_basic107
+comp_fir_basic107: j --> comp_fir_basic106
+comp_fir_basic106: j --> comp_fir_basic105
+comp_fir_basic105: j --> comp_fir_basic104
+comp_fir_basic104: j --> comp_fir_basic103
+comp_fir_basic103: j --> comp_fir_basic102
+comp_fir_basic102: j --> comp_fir_basic101
+comp_fir_basic101: j --> comp_fir_basic100
+comp_fir_basic100: j --> comp_fir_basic99
+comp_fir_basic99 : j --> comp_fir_basic98
+comp_fir_basic98 : j --> comp_fir_basic97
+comp_fir_basic97 : j --> comp_fir_basic96
+comp_fir_basic96 : j --> comp_fir_basic95
+comp_fir_basic95 : j --> comp_fir_basic94
+comp_fir_basic94 : j --> comp_fir_basic93
+comp_fir_basic93 : j --> comp_fir_basic92
+comp_fir_basic92 : j --> comp_fir_basic91
+comp_fir_basic91 : j --> comp_fir_basic90
+comp_fir_basic90 : j --> comp_fir_basic89
+comp_fir_basic89 : j --> comp_fir_basic88
+comp_fir_basic88 : j --> comp_fir_basic87
+comp_fir_basic87 : j --> comp_fir_basic86
+comp_fir_basic86 : j --> comp_fir_basic85
+comp_fir_basic85 : j --> comp_fir_basic84
+comp_fir_basic84 : j --> comp_fir_basic83
+comp_fir_basic83 : j --> comp_fir_basic82
+comp_fir_basic82 : j --> comp_fir_basic81
+comp_fir_basic81 : j --> comp_fir_basic80
+comp_fir_basic80 : j --> comp_fir_basic79
+comp_fir_basic79 : j --> comp_fir_basic69
+comp_fir_basic69 : emit c16 --> comp_fir_basic68
+comp_fir_basic68 : li $v0, 0 --> comp_fir_basic67
+comp_fir_basic67 : emit c15 --> comp_fir_basic66
+comp_fir_basic66 : emit c14 --> comp_fir_basic65
+comp_fir_basic65 : li $t3, 0 --> comp_fir_basic3
+comp_fir_basic3 : j --> comp_fir_basic64
+comp_fir_basic64 : li $t0, 0 --> comp_fir_basic63
+comp_fir_basic63 : emit c13 --> comp_fir_basic62
+comp_fir_basic62 : li $a3, 3 --> comp_fir_basic61
+comp_fir_basic61 : slt $a3, $t3, $a3 --> comp_fir_basic60
+comp_fir_basic60 : j --> comp_fir_basic78
+comp_fir_basic78 : seq $a3, $a3, $zero --> comp_fir_basic59
+comp_fir_basic59 : beq $a3, $t0 --> comp_fir_basic58, comp_fir_basic2
+comp_fir_basic2 : emit c0 --> comp_fir_basic1
+comp_fir_basic1 : j --> comp_fir_basic0
+comp_fir_basic0 : j --> comp_fir_basic153
+comp_fir_basic153: j --> comp_fir_basic152
+comp_fir_basic152: j --> comp_fir_basic151
+comp_fir_basic151: j --> comp_fir_basic150
+comp_fir_basic150: j --> comp_fir_basic149
+comp_fir_basic149: j --> comp_fir_basic148
+comp_fir_basic148: j --> comp_fir_basic147
+comp_fir_basic147: j --> comp_fir_basic146
+comp_fir_basic146: j --> comp_fir_basic145
+comp_fir_basic145: j --> comp_fir_basic144
+comp_fir_basic144: j --> comp_fir_basic143
+comp_fir_basic143: delframe --> comp_fir_basic142
+comp_fir_basic142: jr $ra
+comp_fir_basic58 : emit c11 --> comp_fir_basic57
+comp_fir_basic57 : li $a3, 4 --> comp_fir_basic56
+comp_fir_basic56 : mulo $a3, $t3, $a3 --> comp_fir_basic55
+comp_fir_basic55 : add $a3, $a0, $a3 --> comp_fir_basic77
+comp_fir_basic77 : lw $t0, 0($a3) --> comp_fir_basic54
+comp_fir_basic54 : j --> comp_fir_basic53
+comp_fir_basic53 : li $a3, 4 --> comp_fir_basic52
+comp_fir_basic52 : mulo $a3, $zero, $a3 --> comp_fir_basic51
+comp_fir_basic51 : add $a3, $a2, $a3 --> comp_fir_basic76
+comp_fir_basic76 : lw $t0, 0($a3) --> comp_fir_basic50
+comp_fir_basic50 : emit c10 --> comp_fir_basic49
+comp_fir_basic49 : emit c9 --> comp_fir_basic48
+comp_fir_basic48 : li $t0, 0 --> comp_fir_basic29
+comp_fir_basic29 : j --> comp_fir_basic47
+comp_fir_basic47 : li $t1, 0 --> comp_fir_basic46
+comp_fir_basic46 : emit c8 --> comp_fir_basic45
+comp_fir_basic45 : li $a3, 3 --> comp_fir_basic44
+comp_fir_basic44 : slt $a3, $t0, $a3 --> comp_fir_basic43
+comp_fir_basic43 : j --> comp_fir_basic75
+comp_fir_basic75 : seq $a3, $a3, $zero --> comp_fir_basic42
+comp_fir_basic42 : beq $a3, $t1 --> comp_fir_basic41, comp_fir_basic28
+comp_fir_basic28 : emit c5 --> comp_fir_basic27
+comp_fir_basic27 : emit c4 --> comp_fir_basic26
+comp_fir_basic26 : li $t2, 2 --> comp_fir_basic7
+comp_fir_basic7 : j --> comp_fir_basic25
+comp_fir_basic25 : li $t0, 0 --> comp_fir_basic24
+comp_fir_basic24 : emit c3 --> comp_fir_basic23
+comp_fir_basic23 : j --> comp_fir_basic22
+comp_fir_basic22 : sge $a3, $t2, $zero --> comp_fir_basic21
+comp_fir_basic21 : j --> comp_fir_basic72
+comp_fir_basic72 : seq $a3, $a3, $zero --> comp_fir_basic20
+comp_fir_basic20 : beq $a3, $t0 --> comp_fir_basic19, comp_fir_basic6
+comp_fir_basic6 : emit c12 --> comp_fir_basic5
+comp_fir_basic5 : li $a3, 1 --> comp_fir_basic4
+comp_fir_basic4 : add $t3, $t3, $a3 --> comp_fir_basic3
+comp_fir_basic19 : emit c1 --> comp_fir_basic18
+comp_fir_basic18 : li $a3, 4 --> comp_fir_basic17
+comp_fir_basic17 : mulo $a3, $t2, $a3 --> comp_fir_basic16
+comp_fir_basic16 : add $a3, $a2, $a3 --> comp_fir_basic71
+comp_fir_basic71 : lw $t1, 0($a3) --> comp_fir_basic15
+comp_fir_basic15 : li $a3, 1 --> comp_fir_basic14
+comp_fir_basic14 : add $t0, $t2, $a3 --> comp_fir_basic13
+comp_fir_basic13 : li $a3, 4 --> comp_fir_basic12
+comp_fir_basic12 : mulo $a3, $t0, $a3 --> comp_fir_basic11
+comp_fir_basic11 : add $a3, $a2, $a3 --> comp_fir_basic70
+comp_fir_basic70 : lw $t1, 0($a3) --> comp_fir_basic10
+comp_fir_basic10 : emit c2 --> comp_fir_basic9
+comp_fir_basic9 : li $a3, 1 --> comp_fir_basic8
+comp_fir_basic8 : sub $t2, $t2, $a3 --> comp_fir_basic7
+comp_fir_basic41 : emit c6 --> comp_fir_basic40
+comp_fir_basic40 : li $a3, 4 --> comp_fir_basic39
+comp_fir_basic39 : mulo $a3, $t0, $a3 --> comp_fir_basic38
+comp_fir_basic38 : add $a3, $a1, $a3 --> comp_fir_basic74
+comp_fir_basic74 : lw $t1, 0($a3) --> comp_fir_basic37
+comp_fir_basic37 : li $a3, 4 --> comp_fir_basic36
+comp_fir_basic36 : mulo $a3, $t0, $a3 --> comp_fir_basic35
+comp_fir_basic35 : add $a3, $a2, $a3 --> comp_fir_basic73
+comp_fir_basic73 : lw $a3, 0($a3) --> comp_fir_basic34
+comp_fir_basic34 : mulo $a3, $t1, $a3 --> comp_fir_basic33
+comp_fir_basic33 : add $v0, $v0, $a3 --> comp_fir_basic32
+comp_fir_basic32 : emit c7 --> comp_fir_basic31
+comp_fir_basic31 : li $a3, 1 --> comp_fir_basic30
+comp_fir_basic30 : add $t0, $t0, $a3 --> comp_fir_basic29
+
+procedure comp_fir16(4)
+var 96
+entry comp_fir16373
+comp_fir16373: newframe --> comp_fir16372
+comp_fir16372: lw $ra, 92($sp) --> comp_fir16371
+comp_fir16371: j --> comp_fir16370
+comp_fir16370: lw $s6, 88($sp) --> comp_fir16369
+comp_fir16369: lw $s5, 84($sp) --> comp_fir16368
+comp_fir16368: lw $s4, 80($sp) --> comp_fir16367
+comp_fir16367: lw $s3, 76($sp) --> comp_fir16366
+comp_fir16366: lw $s2, 72($sp) --> comp_fir16365
+comp_fir16365: lw $s1, 68($sp) --> comp_fir16364
+comp_fir16364: lw $s0, 64($sp) --> comp_fir16363
+comp_fir16363: move $s6, $a0 --> comp_fir16362
+comp_fir16362: move $s5, $a1 --> comp_fir16361
+comp_fir16361: move $s4, $a2 --> comp_fir16360
+comp_fir16360: move $s3, $a3 --> comp_fir16359
+comp_fir16359: j --> comp_fir16358
+comp_fir16358: j --> comp_fir16357
+comp_fir16357: j --> comp_fir16356
+comp_fir16356: j --> comp_fir16355
+comp_fir16355: j --> comp_fir16354
+comp_fir16354: j --> comp_fir16353
+comp_fir16353: j --> comp_fir16352
+comp_fir16352: j --> comp_fir16351
+comp_fir16351: j --> comp_fir16350
+comp_fir16350: j --> comp_fir16349
+comp_fir16349: j --> comp_fir16348
+comp_fir16348: j --> comp_fir16347
+comp_fir16347: j --> comp_fir16346
+comp_fir16346: j --> comp_fir16345
+comp_fir16345: j --> comp_fir16344
+comp_fir16344: j --> comp_fir16343
+comp_fir16343: j --> comp_fir16342
+comp_fir16342: j --> comp_fir16341
+comp_fir16341: j --> comp_fir16340
+comp_fir16340: j --> comp_fir16339
+comp_fir16339: j --> comp_fir16338
+comp_fir16338: j --> comp_fir16337
+comp_fir16337: j --> comp_fir16336
+comp_fir16336: j --> comp_fir16335
+comp_fir16335: j --> comp_fir16334
+comp_fir16334: j --> comp_fir16333
+comp_fir16333: j --> comp_fir16332
+comp_fir16332: j --> comp_fir16331
+comp_fir16331: j --> comp_fir16330
+comp_fir16330: j --> comp_fir16329
+comp_fir16329: j --> comp_fir16328
+comp_fir16328: j --> comp_fir16327
+comp_fir16327: j --> comp_fir16326
+comp_fir16326: j --> comp_fir16325
+comp_fir16325: j --> comp_fir16324
+comp_fir16324: j --> comp_fir16323
+comp_fir16323: j --> comp_fir16322
+comp_fir16322: j --> comp_fir16321
+comp_fir16321: j --> comp_fir16320
+comp_fir16320: j --> comp_fir16319
+comp_fir16319: j --> comp_fir16318
+comp_fir16318: j --> comp_fir16317
+comp_fir16317: j --> comp_fir16316
+comp_fir16316: j --> comp_fir16315
+comp_fir16315: j --> comp_fir16314
+comp_fir16314: j --> comp_fir16313
+comp_fir16313: j --> comp_fir16312
+comp_fir16312: j --> comp_fir16311
+comp_fir16311: j --> comp_fir16310
+comp_fir16310: j --> comp_fir16309
+comp_fir16309: j --> comp_fir16308
+comp_fir16308: j --> comp_fir16307
+comp_fir16307: j --> comp_fir16306
+comp_fir16306: j --> comp_fir16305
+comp_fir16305: j --> comp_fir16304
+comp_fir16304: j --> comp_fir16303
+comp_fir16303: j --> comp_fir16302
+comp_fir16302: j --> comp_fir16301
+comp_fir16301: j --> comp_fir16300
+comp_fir16300: j --> comp_fir16299
+comp_fir16299: j --> comp_fir16298
+comp_fir16298: j --> comp_fir16297
+comp_fir16297: j --> comp_fir16296
+comp_fir16296: j --> comp_fir16295
+comp_fir16295: j --> comp_fir16294
+comp_fir16294: j --> comp_fir16293
+comp_fir16293: j --> comp_fir16292
+comp_fir16292: j --> comp_fir16291
+comp_fir16291: j --> comp_fir16290
+comp_fir16290: j --> comp_fir16289
+comp_fir16289: j --> comp_fir16288
+comp_fir16288: j --> comp_fir16287
+comp_fir16287: j --> comp_fir16286
+comp_fir16286: j --> comp_fir16285
+comp_fir16285: j --> comp_fir16284
+comp_fir16284: j --> comp_fir16283
+comp_fir16283: j --> comp_fir16282
+comp_fir16282: j --> comp_fir16281
+comp_fir16281: j --> comp_fir16280
+comp_fir16280: j --> comp_fir16279
+comp_fir16279: j --> comp_fir16278
+comp_fir16278: j --> comp_fir16277
+comp_fir16277: j --> comp_fir16276
+comp_fir16276: j --> comp_fir16275
+comp_fir16275: j --> comp_fir16274
+comp_fir16274: j --> comp_fir16273
+comp_fir16273: j --> comp_fir16272
+comp_fir16272: j --> comp_fir16271
+comp_fir16271: j --> comp_fir16270
+comp_fir16270: j --> comp_fir16269
+comp_fir16269: j --> comp_fir16268
+comp_fir16268: j --> comp_fir16267
+comp_fir16267: j --> comp_fir16266
+comp_fir16266: j --> comp_fir16265
+comp_fir16265: j --> comp_fir16264
+comp_fir16264: j --> comp_fir16263
+comp_fir16263: j --> comp_fir16262
+comp_fir16262: j --> comp_fir16261
+comp_fir16261: j --> comp_fir16260
+comp_fir16260: j --> comp_fir16259
+comp_fir16259: j --> comp_fir16258
+comp_fir16258: j --> comp_fir16257
+comp_fir16257: j --> comp_fir16256
+comp_fir16256: j --> comp_fir16255
+comp_fir16255: j --> comp_fir16254
+comp_fir16254: j --> comp_fir16253
+comp_fir16253: j --> comp_fir16252
+comp_fir16252: j --> comp_fir16251
+comp_fir16251: j --> comp_fir16250
+comp_fir16250: j --> comp_fir16249
+comp_fir16249: j --> comp_fir16248
+comp_fir16248: j --> comp_fir16247
+comp_fir16247: j --> comp_fir16246
+comp_fir16246: j --> comp_fir16245
+comp_fir16245: j --> comp_fir16244
+comp_fir16244: j --> comp_fir16243
+comp_fir16243: j --> comp_fir16242
+comp_fir16242: j --> comp_fir16241
+comp_fir16241: j --> comp_fir16240
+comp_fir16240: j --> comp_fir16239
+comp_fir16239: j --> comp_fir16238
+comp_fir16238: j --> comp_fir16237
+comp_fir16237: j --> comp_fir16236
+comp_fir16236: j --> comp_fir16235
+comp_fir16235: j --> comp_fir16234
+comp_fir16234: j --> comp_fir16233
+comp_fir16233: j --> comp_fir16232
+comp_fir16232: j --> comp_fir16231
+comp_fir16231: j --> comp_fir16230
+comp_fir16230: j --> comp_fir16229
+comp_fir16229: j --> comp_fir16228
+comp_fir16228: j --> comp_fir16227
+comp_fir16227: j --> comp_fir16226
+comp_fir16226: j --> comp_fir16225
+comp_fir16225: j --> comp_fir16224
+comp_fir16224: j --> comp_fir16223
+comp_fir16223: j --> comp_fir16222
+comp_fir16222: j --> comp_fir16221
+comp_fir16221: j --> comp_fir16220
+comp_fir16220: j --> comp_fir16219
+comp_fir16219: j --> comp_fir16218
+comp_fir16218: j --> comp_fir16217
+comp_fir16217: j --> comp_fir16216
+comp_fir16216: j --> comp_fir16215
+comp_fir16215: j --> comp_fir16214
+comp_fir16214: j --> comp_fir16213
+comp_fir16213: j --> comp_fir16212
+comp_fir16212: j --> comp_fir16211
+comp_fir16211: j --> comp_fir16184
+comp_fir16184: emit c49 --> comp_fir16183
+comp_fir16183: li $a1, 0 --> comp_fir16182
+comp_fir16182: move $a0, $sp --> comp_fir16397
+comp_fir16397: j --> comp_fir16181
+comp_fir16181: j --> comp_fir16180
+comp_fir16180: li $v0, 4 --> comp_fir16179
+comp_fir16179: mulo $v0, $zero, $v0 --> comp_fir16178
+comp_fir16178: add $v0, $a0, $v0 --> comp_fir16199
+comp_fir16199: lw $a1, 0($v0) --> comp_fir16177
+comp_fir16177: emit c48 --> comp_fir16176
+comp_fir16176: j --> comp_fir16175
+comp_fir16175: move $a1, $sp --> comp_fir16396
+comp_fir16396: j --> comp_fir16174
+comp_fir16174: li $a0, 1 --> comp_fir16173
+comp_fir16173: li $v0, 4 --> comp_fir16172
+comp_fir16172: mulo $v0, $a0, $v0 --> comp_fir16171
+comp_fir16171: add $v0, $a1, $v0 --> comp_fir16198
+comp_fir16198: lw $zero, 0($v0) --> comp_fir16170
+comp_fir16170: emit c47 --> comp_fir16169
+comp_fir16169: j --> comp_fir16168
+comp_fir16168: move $a1, $sp --> comp_fir16395
+comp_fir16395: j --> comp_fir16167
+comp_fir16167: li $a0, 2 --> comp_fir16166
+comp_fir16166: li $v0, 4 --> comp_fir16165
+comp_fir16165: mulo $v0, $a0, $v0 --> comp_fir16164
+comp_fir16164: add $v0, $a1, $v0 --> comp_fir16197
+comp_fir16197: lw $zero, 0($v0) --> comp_fir16163
+comp_fir16163: emit c46 --> comp_fir16162
+comp_fir16162: j --> comp_fir16161
+comp_fir16161: move $a1, $sp --> comp_fir16394
+comp_fir16394: j --> comp_fir16160
+comp_fir16160: li $a0, 3 --> comp_fir16159
+comp_fir16159: li $v0, 4 --> comp_fir16158
+comp_fir16158: mulo $v0, $a0, $v0 --> comp_fir16157
+comp_fir16157: add $v0, $a1, $v0 --> comp_fir16196
+comp_fir16196: lw $zero, 0($v0) --> comp_fir16156
+comp_fir16156: emit c45 --> comp_fir16155
+comp_fir16155: j --> comp_fir16154
+comp_fir16154: move $a1, $sp --> comp_fir16393
+comp_fir16393: j --> comp_fir16153
+comp_fir16153: li $a0, 4 --> comp_fir16152
+comp_fir16152: li $v0, 4 --> comp_fir16151
+comp_fir16151: mulo $v0, $a0, $v0 --> comp_fir16150
+comp_fir16150: add $v0, $a1, $v0 --> comp_fir16195
+comp_fir16195: lw $zero, 0($v0) --> comp_fir16149
+comp_fir16149: emit c44 --> comp_fir16148
+comp_fir16148: j --> comp_fir16147
+comp_fir16147: move $a1, $sp --> comp_fir16392
+comp_fir16392: j --> comp_fir16146
+comp_fir16146: li $a0, 5 --> comp_fir16145
+comp_fir16145: li $v0, 4 --> comp_fir16144
+comp_fir16144: mulo $v0, $a0, $v0 --> comp_fir16143
+comp_fir16143: add $v0, $a1, $v0 --> comp_fir16193
+comp_fir16193: lw $zero, 0($v0) --> comp_fir16142
+comp_fir16142: emit c43 --> comp_fir16141
+comp_fir16141: j --> comp_fir16140
+comp_fir16140: move $a1, $sp --> comp_fir16391
+comp_fir16391: j --> comp_fir16139
+comp_fir16139: li $a0, 6 --> comp_fir16138
+comp_fir16138: li $v0, 4 --> comp_fir16137
+comp_fir16137: mulo $v0, $a0, $v0 --> comp_fir16136
+comp_fir16136: add $v0, $a1, $v0 --> comp_fir16192
+comp_fir16192: lw $zero, 0($v0) --> comp_fir16135
+comp_fir16135: emit c42 --> comp_fir16134
+comp_fir16134: j --> comp_fir16133
+comp_fir16133: move $a1, $sp --> comp_fir16390
+comp_fir16390: j --> comp_fir16132
+comp_fir16132: li $a0, 7 --> comp_fir16131
+comp_fir16131: li $v0, 4 --> comp_fir16130
+comp_fir16130: mulo $v0, $a0, $v0 --> comp_fir16129
+comp_fir16129: add $v0, $a1, $v0 --> comp_fir16191
+comp_fir16191: lw $zero, 0($v0) --> comp_fir16128
+comp_fir16128: emit c41 --> comp_fir16127
+comp_fir16127: j --> comp_fir16126
+comp_fir16126: move $a1, $sp --> comp_fir16389
+comp_fir16389: j --> comp_fir16125
+comp_fir16125: li $a0, 8 --> comp_fir16124
+comp_fir16124: li $v0, 4 --> comp_fir16123
+comp_fir16123: mulo $v0, $a0, $v0 --> comp_fir16122
+comp_fir16122: add $v0, $a1, $v0 --> comp_fir16190
+comp_fir16190: lw $zero, 0($v0) --> comp_fir16121
+comp_fir16121: emit c40 --> comp_fir16120
+comp_fir16120: j --> comp_fir16119
+comp_fir16119: move $a1, $sp --> comp_fir16388
+comp_fir16388: j --> comp_fir16118
+comp_fir16118: li $a0, 9 --> comp_fir16117
+comp_fir16117: li $v0, 4 --> comp_fir16116
+comp_fir16116: mulo $v0, $a0, $v0 --> comp_fir16115
+comp_fir16115: add $v0, $a1, $v0 --> comp_fir16189
+comp_fir16189: lw $zero, 0($v0) --> comp_fir16114
+comp_fir16114: emit c39 --> comp_fir16113
+comp_fir16113: j --> comp_fir16112
+comp_fir16112: move $a1, $sp --> comp_fir16387
+comp_fir16387: j --> comp_fir16111
+comp_fir16111: li $a0, 10 --> comp_fir16110
+comp_fir16110: li $v0, 4 --> comp_fir16109
+comp_fir16109: mulo $v0, $a0, $v0 --> comp_fir16108
+comp_fir16108: add $v0, $a1, $v0 --> comp_fir16187
+comp_fir16187: lw $zero, 0($v0) --> comp_fir16107
+comp_fir16107: emit c38 --> comp_fir16106
+comp_fir16106: j --> comp_fir16105
+comp_fir16105: move $a1, $sp --> comp_fir16386
+comp_fir16386: j --> comp_fir16104
+comp_fir16104: li $a0, 11 --> comp_fir16103
+comp_fir16103: li $v0, 4 --> comp_fir16102
+comp_fir16102: mulo $v0, $a0, $v0 --> comp_fir16101
+comp_fir16101: add $v0, $a1, $v0 --> comp_fir16186
+comp_fir16186: lw $zero, 0($v0) --> comp_fir16100
+comp_fir16100: emit c37 --> comp_fir1699
+comp_fir1699 : j --> comp_fir1698
+comp_fir1698 : move $a1, $sp --> comp_fir16412
+comp_fir16412: j --> comp_fir1697
+comp_fir1697 : li $a0, 12 --> comp_fir1696
+comp_fir1696 : li $v0, 4 --> comp_fir1695
+comp_fir1695 : mulo $v0, $a0, $v0 --> comp_fir1694
+comp_fir1694 : add $v0, $a1, $v0 --> comp_fir16210
+comp_fir16210: lw $zero, 0($v0) --> comp_fir1693
+comp_fir1693 : emit c36 --> comp_fir1692
+comp_fir1692 : j --> comp_fir1691
+comp_fir1691 : move $a1, $sp --> comp_fir16411
+comp_fir16411: j --> comp_fir1690
+comp_fir1690 : li $a0, 13 --> comp_fir1689
+comp_fir1689 : li $v0, 4 --> comp_fir1688
+comp_fir1688 : mulo $v0, $a0, $v0 --> comp_fir1687
+comp_fir1687 : add $v0, $a1, $v0 --> comp_fir16209
+comp_fir16209: lw $zero, 0($v0) --> comp_fir1686
+comp_fir1686 : emit c35 --> comp_fir1685
+comp_fir1685 : j --> comp_fir1684
+comp_fir1684 : move $a1, $sp --> comp_fir16410
+comp_fir16410: j --> comp_fir1683
+comp_fir1683 : li $a0, 14 --> comp_fir1682
+comp_fir1682 : li $v0, 4 --> comp_fir1681
+comp_fir1681 : mulo $v0, $a0, $v0 --> comp_fir1680
+comp_fir1680 : add $v0, $a1, $v0 --> comp_fir16208
+comp_fir16208: lw $zero, 0($v0) --> comp_fir1679
+comp_fir1679 : emit c34 --> comp_fir1678
+comp_fir1678 : j --> comp_fir1677
+comp_fir1677 : move $a1, $sp --> comp_fir16409
+comp_fir16409: j --> comp_fir1676
+comp_fir1676 : li $a0, 15 --> comp_fir1675
+comp_fir1675 : li $v0, 4 --> comp_fir1674
+comp_fir1674 : mulo $v0, $a0, $v0 --> comp_fir1673
+comp_fir1673 : add $v0, $a1, $v0 --> comp_fir16207
+comp_fir16207: lw $zero, 0($v0) --> comp_fir1672
+comp_fir1672 : emit c33 --> comp_fir1671
+comp_fir1671 : li $v0, 0 --> comp_fir1670
+comp_fir1670 : emit c32 --> comp_fir1669
+comp_fir1669 : li $s2, 0 --> comp_fir1668
+comp_fir1668 : emit c31 --> comp_fir1667
+comp_fir1667 : emit c30 --> comp_fir1666
+comp_fir1666 : li $s1, 0 --> comp_fir167
+comp_fir167 : j --> comp_fir1665
+comp_fir1665 : li $a1, 0 --> comp_fir1664
+comp_fir1664 : emit c29 --> comp_fir1663
+comp_fir1663 : slt $a0, $s1, $s3 --> comp_fir1662
+comp_fir1662 : j --> comp_fir16206
+comp_fir16206: seq $a0, $a0, $zero --> comp_fir1661
+comp_fir1661 : beq $a0, $a1 --> comp_fir1660, comp_fir166
+comp_fir166 : emit c17 --> comp_fir165
+comp_fir165 : j --> comp_fir16407
+comp_fir16407: j --> comp_fir164
+comp_fir164 : j --> comp_fir163
+comp_fir163 : li $v0, 4 --> comp_fir162
+comp_fir162 : mulo $v0, $zero, $v0 --> comp_fir161
+comp_fir161 : add $v0, $sp, $v0 --> comp_fir16185
+comp_fir16185: lw $v0, 0($v0) --> comp_fir160
+comp_fir160 : j --> comp_fir16385
+comp_fir16385: j --> comp_fir16384
+comp_fir16384: lw $ra, 92($sp) --> comp_fir16383
+comp_fir16383: j --> comp_fir16382
+comp_fir16382: lw $s6, 88($sp) --> comp_fir16381
+comp_fir16381: lw $s5, 84($sp) --> comp_fir16380
+comp_fir16380: lw $s4, 80($sp) --> comp_fir16379
+comp_fir16379: lw $s3, 76($sp) --> comp_fir16378
+comp_fir16378: lw $s2, 72($sp) --> comp_fir16377
+comp_fir16377: lw $s1, 68($sp) --> comp_fir16376
+comp_fir16376: lw $s0, 64($sp) --> comp_fir16375
+comp_fir16375: delframe --> comp_fir16374
+comp_fir16374: jr $ra
+comp_fir1660 : emit c27 --> comp_fir1659
+comp_fir1659 : li $a0, 4 --> comp_fir1658
+comp_fir1658 : mulo $a0, $s1, $a0 --> comp_fir1657
+comp_fir1657 : add $a0, $s6, $a0 --> comp_fir16205
+comp_fir16205: lw $a2, 0($a0) --> comp_fir1656
+comp_fir1656 : move $a1, $sp --> comp_fir16408
+comp_fir16408: j --> comp_fir1655
+comp_fir1655 : li $a0, 4 --> comp_fir1654
+comp_fir1654 : mulo $a0, $v0, $a0 --> comp_fir1653
+comp_fir1653 : add $a0, $a1, $a0 --> comp_fir16204
+comp_fir16204: lw $a2, 0($a0) --> comp_fir1652
+comp_fir1652 : emit c26 --> comp_fir1651
+comp_fir1651 : emit c25 --> comp_fir1650
+comp_fir1650 : li $s0, 0 --> comp_fir1620
+comp_fir1620 : j --> comp_fir1649
+comp_fir1649 : li $a1, 0 --> comp_fir1648
+comp_fir1648 : emit c24 --> comp_fir1647
+comp_fir1647 : li $a0, 16 --> comp_fir1646
+comp_fir1646 : slt $a0, $s0, $a0 --> comp_fir1645
+comp_fir1645 : j --> comp_fir16203
+comp_fir16203: seq $a0, $a0, $zero --> comp_fir1644
+comp_fir1644 : beq $a0, $a1 --> comp_fir1643, comp_fir1619
+comp_fir1619 : emit c19 --> comp_fir1618
+comp_fir1618 : li $a0, 1 --> comp_fir1617
+comp_fir1617 : add $a0, $v0, $a0 --> comp_fir1616
+comp_fir1616 : li $a1, 16 --> comp_fir1615
+comp_fir1615 : la $v0, mod --> comp_fir16194
+comp_fir16194: j --> comp_fir16401
+comp_fir16401: j --> comp_fir16400
+comp_fir16400: j --> comp_fir16399
+comp_fir16399: call $v0 --> comp_fir16398
+comp_fir16398: j --> comp_fir1614
+comp_fir1614 : emit c18 --> comp_fir1613
+comp_fir1613 : li $a0, 4 --> comp_fir1612
+comp_fir1612 : mulo $a0, $s1, $a0 --> comp_fir1611
+comp_fir1611 : add $a0, $s4, $a0 --> comp_fir16188
+comp_fir16188: lw $s2, 0($a0) --> comp_fir1610
+comp_fir1610 : emit c28 --> comp_fir169
+comp_fir169 : li $a0, 1 --> comp_fir168
+comp_fir168 : add $s1, $s1, $a0 --> comp_fir167
+comp_fir1643 : emit c22 --> comp_fir1642
+comp_fir1642 : move $a1, $sp --> comp_fir16406
+comp_fir16406: j --> comp_fir1641
+comp_fir1641 : li $a0, 4 --> comp_fir1640
+comp_fir1640 : mulo $a0, $v0, $a0 --> comp_fir1639
+comp_fir1639 : add $a0, $a1, $a0 --> comp_fir16202
+comp_fir16202: lw $a1, 0($a0) --> comp_fir1638
+comp_fir1638 : li $a0, 4 --> comp_fir1637
+comp_fir1637 : mulo $a0, $s0, $a0 --> comp_fir1636
+comp_fir1636 : add $a0, $s5, $a0 --> comp_fir16201
+comp_fir16201: lw $a0, 0($a0) --> comp_fir1635
+comp_fir1635 : mulo $a2, $a1, $a0 --> comp_fir1634
+comp_fir1634 : li $a1, 2 --> comp_fir1633
+comp_fir1633 : li $a0, 16 --> comp_fir1632
+comp_fir1632 : xor $a0, $a1, $a0 --> comp_fir1631
+comp_fir1631 : mulo $a0, $a2, $a0 --> comp_fir1630
+comp_fir1630 : emit c21 --> comp_fir1629
+comp_fir1629 : add $s2, $s2, $a0 --> comp_fir1628
+comp_fir1628 : emit c20 --> comp_fir1627
+comp_fir1627 : li $a0, 1 --> comp_fir1626
+comp_fir1626 : add $a0, $v0, $a0 --> comp_fir1625
+comp_fir1625 : li $a1, 16 --> comp_fir1624
+comp_fir1624 : la $v0, mod --> comp_fir16200
+comp_fir16200: j --> comp_fir16405
+comp_fir16405: j --> comp_fir16404
+comp_fir16404: j --> comp_fir16403
+comp_fir16403: call $v0 --> comp_fir16402
+comp_fir16402: j --> comp_fir1623
+comp_fir1623 : emit c23 --> comp_fir1622
+comp_fir1622 : li $a0, 1 --> comp_fir1621
+comp_fir1621 : add $s0, $s0, $a0 --> comp_fir1620
+
+procedure _main(0)
+var 68
+entry main307
+main307: newframe --> main306
+main306: lw $ra, 64($sp) --> main305
+main305: j --> main304
+main304: j --> main303
+main303: j --> main302
+main302: j --> main301
+main301: j --> main300
+main300: j --> main299
+main299: j --> main298
+main298: j --> main297
+main297: j --> main296
+main296: j --> main295
+main295: j --> main294
+main294: j --> main293
+main293: j --> main292
+main292: j --> main291
+main291: j --> main290
+main290: j --> main289
+main289: j --> main288
+main288: j --> main287
+main287: j --> main286
+main286: j --> main285
+main285: j --> main284
+main284: j --> main283
+main283: j --> main282
+main282: j --> main281
+main281: j --> main280
+main280: j --> main279
+main279: j --> main278
+main278: j --> main277
+main277: j --> main276
+main276: j --> main275
+main275: j --> main274
+main274: j --> main273
+main273: j --> main272
+main272: j --> main271
+main271: j --> main270
+main270: j --> main269
+main269: j --> main268
+main268: j --> main267
+main267: j --> main266
+main266: j --> main265
+main265: j --> main264
+main264: j --> main263
+main263: j --> main262
+main262: j --> main261
+main261: j --> main260
+main260: j --> main259
+main259: j --> main258
+main258: j --> main257
+main257: j --> main256
+main256: j --> main255
+main255: j --> main254
+main254: j --> main253
+main253: j --> main252
+main252: j --> main251
+main251: j --> main250
+main250: j --> main249
+main249: j --> main248
+main248: j --> main247
+main247: j --> main246
+main246: j --> main245
+main245: j --> main244
+main244: j --> main243
+main243: j --> main242
+main242: j --> main241
+main241: j --> main240
+main240: j --> main239
+main239: j --> main238
+main238: j --> main237
+main237: j --> main236
+main236: j --> main235
+main235: j --> main234
+main234: j --> main233
+main233: j --> main232
+main232: j --> main231
+main231: j --> main230
+main230: j --> main229
+main229: j --> main228
+main228: j --> main227
+main227: j --> main226
+main226: j --> main225
+main225: j --> main224
+main224: j --> main223
+main223: j --> main222
+main222: j --> main221
+main221: j --> main220
+main220: j --> main219
+main219: j --> main218
+main218: j --> main217
+main217: j --> main216
+main216: j --> main215
+main215: j --> main214
+main214: j --> main213
+main213: j --> main212
+main212: j --> main211
+main211: j --> main210
+main210: j --> main209
+main209: j --> main208
+main208: j --> main207
+main207: j --> main206
+main206: j --> main205
+main205: j --> main204
+main204: j --> main203
+main203: j --> main202
+main202: j --> main201
+main201: j --> main200
+main200: j --> main199
+main199: j --> main198
+main198: j --> main197
+main197: j --> main196
+main196: j --> main195
+main195: j --> main194
+main194: j --> main193
+main193: j --> main192
+main192: j --> main191
+main191: j --> main190
+main190: j --> main189
+main189: j --> main188
+main188: j --> main187
+main187: j --> main186
+main186: j --> main185
+main185: j --> main184
+main184: j --> main183
+main183: j --> main182
+main182: j --> main181
+main181: j --> main180
+main180: j --> main179
+main179: j --> main178
+main178: j --> main177
+main177: j --> main176
+main176: j --> main175
+main175: j --> main174
+main174: j --> main173
+main173: j --> main149
+main149: emit c165 --> main148
+main148: li $a1, 10 --> main147
+main147: move $a0, $sp --> main327
+main327: j --> main146
+main146: j --> main145
+main145: li $v0, 4 --> main144
+main144: mulo $v0, $zero, $v0 --> main143
+main143: add $v0, $a0, $v0 --> main157
+main157: lw $a1, 0($v0) --> main142
+main142: emit c164 --> main141
+main141: li $a2, 9 --> main140
+main140: move $a1, $sp --> main326
+main326: j --> main139
+main139: li $a0, 1 --> main138
+main138: li $v0, 4 --> main137
+main137: mulo $v0, $a0, $v0 --> main136
+main136: add $v0, $a1, $v0 --> main156
+main156: lw $a2, 0($v0) --> main135
+main135: emit c163 --> main134
+main134: li $a2, 8 --> main133
+main133: move $a1, $sp --> main325
+main325: j --> main132
+main132: li $a0, 2 --> main131
+main131: li $v0, 4 --> main130
+main130: mulo $v0, $a0, $v0 --> main129
+main129: add $v0, $a1, $v0 --> main155
+main155: lw $a2, 0($v0) --> main128
+main128: emit c162 --> main127
+main127: li $a2, 7 --> main126
+main126: move $a1, $sp --> main323
+main323: j --> main125
+main125: li $a0, 3 --> main124
+main124: li $v0, 4 --> main123
+main123: mulo $v0, $a0, $v0 --> main122
+main122: add $v0, $a1, $v0 --> main154
+main154: lw $a2, 0($v0) --> main121
+main121: emit c161 --> main120
+main120: li $a2, 6 --> main119
+main119: move $a1, $sp --> main322
+main322: j --> main118
+main118: li $a0, 4 --> main117
+main117: li $v0, 4 --> main116
+main116: mulo $v0, $a0, $v0 --> main115
+main115: add $v0, $a1, $v0 --> main153
+main153: lw $a2, 0($v0) --> main114
+main114: emit c160 --> main113
+main113: j --> main112
+main112: move $a1, $sp --> main321
+main321: j --> main111
+main111: li $a0, 5 --> main110
+main110: li $v0, 4 --> main109
+main109: mulo $v0, $a0, $v0 --> main108
+main108: add $v0, $a1, $v0 --> main151
+main151: lw $zero, 0($v0) --> main107
+main107: emit c159 --> main106
+main106: li $a2, 5 --> main105
+main105: move $a1, $sp --> main320
+main320: j --> main104
+main104: li $a0, 6 --> main103
+main103: li $v0, 4 --> main102
+main102: mulo $v0, $a0, $v0 --> main101
+main101: add $v0, $a1, $v0 --> main150
+main150: lw $a2, 0($v0) --> main100
+main100: emit c158 --> main99
+main99 : li $a2, 4 --> main98
+main98 : move $a1, $sp --> main380
+main380: j --> main97
+main97 : li $a0, 7 --> main96
+main96 : li $v0, 4 --> main95
+main95 : mulo $v0, $a0, $v0 --> main94
+main94 : add $v0, $a1, $v0 --> main172
+main172: lw $a2, 0($v0) --> main93
+main93 : emit c157 --> main92
+main92 : li $a2, 3 --> main91
+main91 : move $a1, $sp --> main379
+main379: j --> main90
+main90 : li $a0, 8 --> main89
+main89 : li $v0, 4 --> main88
+main88 : mulo $v0, $a0, $v0 --> main87
+main87 : add $v0, $a1, $v0 --> main171
+main171: lw $a2, 0($v0) --> main86
+main86 : emit c156 --> main85
+main85 : li $a2, 2 --> main84
+main84 : move $a1, $sp --> main377
+main377: j --> main83
+main83 : li $a0, 9 --> main82
+main82 : li $v0, 4 --> main81
+main81 : mulo $v0, $a0, $v0 --> main80
+main80 : add $v0, $a1, $v0 --> main170
+main170: lw $a2, 0($v0) --> main79
+main79 : emit c155 --> main78
+main78 : j --> main77
+main77 : move $a1, $sp --> main375
+main375: j --> main76
+main76 : li $a0, 10 --> main75
+main75 : li $v0, 4 --> main74
+main74 : mulo $v0, $a0, $v0 --> main73
+main73 : add $v0, $a1, $v0 --> main169
+main169: lw $zero, 0($v0) --> main72
+main72 : emit c154 --> main71
+main71 : j --> main70
+main70 : move $a1, $sp --> main374
+main374: j --> main69
+main69 : li $a0, 11 --> main68
+main68 : li $v0, 4 --> main67
+main67 : mulo $v0, $a0, $v0 --> main66
+main66 : add $v0, $a1, $v0 --> main168
+main168: lw $zero, 0($v0) --> main65
+main65 : emit c153 --> main64
+main64 : j --> main63
+main63 : move $a1, $sp --> main373
+main373: j --> main62
+main62 : li $a0, 12 --> main61
+main61 : li $v0, 4 --> main60
+main60 : mulo $v0, $a0, $v0 --> main59
+main59 : add $v0, $a1, $v0 --> main167
+main167: lw $zero, 0($v0) --> main58
+main58 : emit c152 --> main57
+main57 : j --> main56
+main56 : move $a1, $sp --> main372
+main372: j --> main55
+main55 : li $a0, 13 --> main54
+main54 : li $v0, 4 --> main53
+main53 : mulo $v0, $a0, $v0 --> main52
+main52 : add $v0, $a1, $v0 --> main166
+main166: lw $zero, 0($v0) --> main51
+main51 : emit c151 --> main50
+main50 : j --> main49
+main49 : move $a1, $sp --> main371
+main371: j --> main48
+main48 : li $a0, 14 --> main47
+main47 : li $v0, 4 --> main46
+main46 : mulo $v0, $a0, $v0 --> main45
+main45 : add $v0, $a1, $v0 --> main164
+main164: lw $zero, 0($v0) --> main44
+main44 : emit c150 --> main43
+main43 : j --> main42
+main42 : move $a1, $sp --> main370
+main370: j --> main41
+main41 : li $a0, 15 --> main40
+main40 : li $v0, 4 --> main39
+main39 : mulo $v0, $a0, $v0 --> main38
+main38 : add $v0, $a1, $v0 --> main163
+main163: lw $zero, 0($v0) --> main37
+main37 : emit c149 --> main36
+main36 : move $a0, $sp --> main369
+main369: j --> main35
+main35 : move $a1, $sp --> main368
+main368: j --> main34
+main34 : move $a2, $sp --> main367
+main367: j --> main33
+main33 : li $a3, 10 --> main32
+main32 : li $t0, 10 --> main31
+main31 : la $v0, comp_fir_basic --> main162
+main162: j --> main356
+main356: j --> main355
+main355: j --> main354
+main354: j --> main353
+main353: j --> main352
+main352: lw $t0, -4($sp) --> main351
+main351: call $v0 --> main350
+main350: j --> main30
+main30 : emit c148 --> main29
+main29 : move $a0, $sp --> main366
+main366: j --> main28
+main28 : move $a1, $sp --> main365
+main365: j --> main27
+main27 : move $a2, $sp --> main364
+main364: j --> main26
+main26 : li $a3, 16 --> main25
+main25 : la $v0, comp_fir16 --> main160
+main160: j --> main347
+main347: j --> main346
+main346: j --> main345
+main345: j --> main344
+main344: j --> main343
+main343: call $v0 --> main342
+main342: j --> main24
+main24 : emit c147 --> main23
+main23 : li $a0, 4 --> main22
+main22 : li $a1, 1 --> main21
+main21 : li $a2, 1 --> main20
+main20 : la $v0, comp_ifFor --> main159
+main159: j --> main341
+main341: j --> main340
+main340: j --> main339
+main339: j --> main338
+main338: call $v0 --> main337
+main337: j --> main19
+main19 : emit c146 --> main18
+main18 : move $a0, $sp --> main363
+main363: j --> main17
+main17 : li $a1, 9 --> main16
+main16 : li $a2, 3 --> main15
+main15 : la $v0, comp_total --> main158
+main158: j --> main336
+main336: j --> main335
+main335: j --> main334
+main334: j --> main333
+main333: call $v0 --> main332
+main332: j --> main14
+main14 : emit c145 --> main13
+main13 : move $a0, $sp --> main324
+main324: j --> main12
+main12 : li $a1, 10 --> main11
+main11 : la $v0, comp_tri --> main152
+main152: j --> main331
+main331: j --> main330
+main330: j --> main329
+main329: call $v0 --> main328
+main328: j --> main10
+main10 : emit c144 --> main9
+main9 : move $a0, $sp --> main378
+main378: j --> main8
+main8 : move $a1, $sp --> main376
+main376: j --> main7
+main7 : li $a2, 10 --> main6
+main6 : li $a3, 10 --> main5
+main5 : la $v0, comp_forif2 --> main165
+main165: j --> main362
+main362: j --> main361
+main361: j --> main360
+main360: j --> main359
+main359: j --> main358
+main358: call $v0 --> main357
+main357: j --> main4
+main4 : emit c143 --> main3
+main3 : la $v0, comp_forif --> main161
+main161: j --> main349
+main349: call $v0 --> main348
+main348: j --> main2
+main2 : emit c142 --> main1
+main1 : j --> main0
+main0 : j --> main319
+main319: j --> main318
+main318: lw $ra, 64($sp) --> main317
+main317: j --> main316
+main316: j --> main315
+main315: j --> main314
+main314: j --> main313
+main313: j --> main312
+main312: j --> main311
+main311: j --> main310
+main310: j --> main309
+main309: delframe --> main308
+main308: jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 0
+
+function comp_tri(%0; %1) : %5
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45
+entry comp_tri111
+comp_tri111: li %2, 0 --> comp_tri110
+comp_tri110: li %3, 0 --> comp_tri109
+comp_tri109: li %4, 0 --> comp_tri108
+comp_tri108: li %6, 0 --> comp_tri107
+comp_tri107: li %7, 0 --> comp_tri106
+comp_tri106: li %8, 0 --> comp_tri105
+comp_tri105: li %9, 0 --> comp_tri104
+comp_tri104: li %10, 0 --> comp_tri103
+comp_tri103: li %11, 0 --> comp_tri102
+comp_tri102: li %12, 0 --> comp_tri101
+comp_tri101: li %13, 0 --> comp_tri100
+comp_tri100: li %14, 0 --> comp_tri99
+comp_tri99 : li %15, 0 --> comp_tri98
+comp_tri98 : li %16, 0 --> comp_tri97
+comp_tri97 : li %17, 0 --> comp_tri96
+comp_tri96 : li %18, 0 --> comp_tri95
+comp_tri95 : li %19, 0 --> comp_tri94
+comp_tri94 : li %20, 0 --> comp_tri93
+comp_tri93 : li %21, 0 --> comp_tri92
+comp_tri92 : li %22, 0 --> comp_tri91
+comp_tri91 : li %23, 0 --> comp_tri90
+comp_tri90 : li %24, 0 --> comp_tri89
+comp_tri89 : li %25, 0 --> comp_tri88
+comp_tri88 : li %26, 0 --> comp_tri87
+comp_tri87 : li %27, 0 --> comp_tri86
+comp_tri86 : li %28, 0 --> comp_tri85
+comp_tri85 : li %29, 0 --> comp_tri84
+comp_tri84 : li %30, 0 --> comp_tri83
+comp_tri83 : li %31, 0 --> comp_tri82
+comp_tri82 : li %32, 0 --> comp_tri81
+comp_tri81 : li %33, 0 --> comp_tri80
+comp_tri80 : li %34, 0 --> comp_tri79
+comp_tri79 : li %35, 0 --> comp_tri78
+comp_tri78 : li %36, 0 --> comp_tri77
+comp_tri77 : li %37, 0 --> comp_tri76
+comp_tri76 : li %38, 0 --> comp_tri75
+comp_tri75 : li %39, 0 --> comp_tri74
+comp_tri74 : li %40, 0 --> comp_tri73
+comp_tri73 : li %41, 0 --> comp_tri72
+comp_tri72 : li %42, 0 --> comp_tri71
+comp_tri71 : li %43, 0 --> comp_tri70
+comp_tri70 : li %44, 0 --> comp_tri69
+comp_tri69 : li %45, 0 --> comp_tri60
+comp_tri60 : emit c108 --> comp_tri59
+comp_tri59 : li %2, 0 --> comp_tri58
+comp_tri58 : emit c107 --> comp_tri57
+comp_tri57 : emit c106 --> comp_tri56
+comp_tri56 : li %4, 0 --> comp_tri3
+comp_tri3 : j --> comp_tri55
+comp_tri55 : li %36, 0 --> comp_tri54
+comp_tri54 : emit c105 --> comp_tri53
+comp_tri53 : slt %37, %4, %1 --> comp_tri52
+comp_tri52 : li %45, 0 --> comp_tri68
+comp_tri68 : seq %35, %37, %45 --> comp_tri51
+comp_tri51 : beq %35, %36 --> comp_tri50, comp_tri2
+comp_tri2 : emit c95 --> comp_tri1
+comp_tri1 : move %5, %2 --> comp_tri0
+comp_tri0 : return %5
+comp_tri50 : emit c103 --> comp_tri49
+comp_tri49 : emit c102 --> comp_tri48
+comp_tri48 : li %3, 1 --> comp_tri7
+comp_tri7 : j --> comp_tri47
+comp_tri47 : li %32, 0 --> comp_tri46
+comp_tri46 : emit c101 --> comp_tri45
+comp_tri45 : sub %34, %1, %4 --> comp_tri44
+comp_tri44 : slt %33, %3, %34 --> comp_tri43
+comp_tri43 : li %44, 0 --> comp_tri67
+comp_tri67 : seq %31, %33, %44 --> comp_tri42
+comp_tri42 : beq %31, %32 --> comp_tri41, comp_tri6
+comp_tri6 : emit c104 --> comp_tri5
+comp_tri5 : li %6, 1 --> comp_tri4
+comp_tri4 : add %4, %4, %6 --> comp_tri3
+comp_tri41 : emit c99 --> comp_tri40
+comp_tri40 : li %22, 0 --> comp_tri39
+comp_tri39 : li %30, 4 --> comp_tri38
+comp_tri38 : mulo %29, %3, %30 --> comp_tri37
+comp_tri37 : add %43, %0, %29 --> comp_tri66
+comp_tri66 : lw %23, 0(%43) --> comp_tri36
+comp_tri36 : li %28, 1 --> comp_tri35
+comp_tri35 : sub %26, %3, %28 --> comp_tri34
+comp_tri34 : li %27, 4 --> comp_tri33
+comp_tri33 : mulo %25, %26, %27 --> comp_tri32
+comp_tri32 : add %42, %0, %25 --> comp_tri65
+comp_tri65 : lw %24, 0(%42) --> comp_tri31
+comp_tri31 : slt %21, %23, %24 --> comp_tri30
+comp_tri30 : beq %21, %22 --> comp_tri10, comp_tri29
+comp_tri29 : emit c98 --> comp_tri28
+comp_tri28 : li %20, 1 --> comp_tri27
+comp_tri27 : sub %18, %3, %20 --> comp_tri26
+comp_tri26 : li %19, 4 --> comp_tri25
+comp_tri25 : mulo %17, %18, %19 --> comp_tri24
+comp_tri24 : add %41, %0, %17 --> comp_tri64
+comp_tri64 : lw %2, 0(%41) --> comp_tri23
+comp_tri23 : emit c97 --> comp_tri22
+comp_tri22 : li %16, 4 --> comp_tri21
+comp_tri21 : mulo %15, %3, %16 --> comp_tri20
+comp_tri20 : add %40, %0, %15 --> comp_tri63
+comp_tri63 : lw %10, 0(%40) --> comp_tri19
+comp_tri19 : li %14, 1 --> comp_tri18
+comp_tri18 : sub %12, %3, %14 --> comp_tri17
+comp_tri17 : li %13, 4 --> comp_tri16
+comp_tri16 : mulo %11, %12, %13 --> comp_tri15
+comp_tri15 : add %39, %0, %11 --> comp_tri62
+comp_tri62 : sw %10, 0(%39) --> comp_tri14
+comp_tri14 : emit c96 --> comp_tri13
+comp_tri13 : li %9, 4 --> comp_tri12
+comp_tri12 : mulo %8, %3, %9 --> comp_tri11
+comp_tri11 : add %38, %0, %8 --> comp_tri61
+comp_tri61 : sw %2, 0(%38) --> comp_tri10
+comp_tri10 : emit c100 --> comp_tri9
+comp_tri9 : li %7, 1 --> comp_tri8
+comp_tri8 : add %3, %3, %7 --> comp_tri7
+
+function comp_total(%0; %1; %2) : %6
+stacksize 80
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78, %79, %80, %81, %82, %83,
+ %84, %85, %86, %87, %88, %89, %90,
+ %91, %92, %93, %94, %95, %96, %97,
+ %98, %99, %100, %101, %102, %103, %104,
+ %105, %106, %107, %108, %109, %110, %111,
+ %112, %113, %114, %115, %116, %117, %118,
+ %119, %120, %121, %122, %123, %124, %125,
+ %126, %127, %128, %129, %130, %131, %132,
+ %133, %134, %135, %136, %137, %138, %139,
+ %140, %141, %142, %143, %144, %145, %146,
+ %147, %148, %149, %150, %151, %152, %153,
+ %154, %155, %156, %157, %158, %159, %160,
+ %161, %162, %163, %164, %165, %166, %167
+entry comp_total397
+comp_total397: li %3, 0 --> comp_total396
+comp_total396: li %4, 0 --> comp_total395
+comp_total395: li %5, 0 --> comp_total394
+comp_total394: li %7, 0 --> comp_total393
+comp_total393: li %8, 0 --> comp_total392
+comp_total392: li %9, 0 --> comp_total391
+comp_total391: li %10, 0 --> comp_total390
+comp_total390: li %11, 0 --> comp_total389
+comp_total389: li %12, 0 --> comp_total388
+comp_total388: li %13, 0 --> comp_total387
+comp_total387: li %14, 0 --> comp_total386
+comp_total386: li %15, 0 --> comp_total385
+comp_total385: li %16, 0 --> comp_total384
+comp_total384: li %17, 0 --> comp_total383
+comp_total383: li %18, 0 --> comp_total382
+comp_total382: li %19, 0 --> comp_total381
+comp_total381: li %20, 0 --> comp_total380
+comp_total380: li %21, 0 --> comp_total379
+comp_total379: li %22, 0 --> comp_total378
+comp_total378: li %23, 0 --> comp_total377
+comp_total377: li %24, 0 --> comp_total376
+comp_total376: li %25, 0 --> comp_total375
+comp_total375: li %26, 0 --> comp_total374
+comp_total374: li %27, 0 --> comp_total373
+comp_total373: li %28, 0 --> comp_total372
+comp_total372: li %29, 0 --> comp_total371
+comp_total371: li %30, 0 --> comp_total370
+comp_total370: li %31, 0 --> comp_total369
+comp_total369: li %32, 0 --> comp_total368
+comp_total368: li %33, 0 --> comp_total367
+comp_total367: li %34, 0 --> comp_total366
+comp_total366: li %35, 0 --> comp_total365
+comp_total365: li %36, 0 --> comp_total364
+comp_total364: li %37, 0 --> comp_total363
+comp_total363: li %38, 0 --> comp_total362
+comp_total362: li %39, 0 --> comp_total361
+comp_total361: li %40, 0 --> comp_total360
+comp_total360: li %41, 0 --> comp_total359
+comp_total359: li %42, 0 --> comp_total358
+comp_total358: li %43, 0 --> comp_total357
+comp_total357: li %44, 0 --> comp_total356
+comp_total356: li %45, 0 --> comp_total355
+comp_total355: li %46, 0 --> comp_total354
+comp_total354: li %47, 0 --> comp_total353
+comp_total353: li %48, 0 --> comp_total352
+comp_total352: li %49, 0 --> comp_total351
+comp_total351: li %50, 0 --> comp_total350
+comp_total350: li %51, 0 --> comp_total349
+comp_total349: li %52, 0 --> comp_total348
+comp_total348: li %53, 0 --> comp_total347
+comp_total347: li %54, 0 --> comp_total346
+comp_total346: li %55, 0 --> comp_total345
+comp_total345: li %56, 0 --> comp_total344
+comp_total344: li %57, 0 --> comp_total343
+comp_total343: li %58, 0 --> comp_total342
+comp_total342: li %59, 0 --> comp_total341
+comp_total341: li %60, 0 --> comp_total340
+comp_total340: li %61, 0 --> comp_total339
+comp_total339: li %62, 0 --> comp_total338
+comp_total338: li %63, 0 --> comp_total337
+comp_total337: li %64, 0 --> comp_total336
+comp_total336: li %65, 0 --> comp_total335
+comp_total335: li %66, 0 --> comp_total334
+comp_total334: li %67, 0 --> comp_total333
+comp_total333: li %68, 0 --> comp_total332
+comp_total332: li %69, 0 --> comp_total331
+comp_total331: li %70, 0 --> comp_total330
+comp_total330: li %71, 0 --> comp_total329
+comp_total329: li %72, 0 --> comp_total328
+comp_total328: li %73, 0 --> comp_total327
+comp_total327: li %74, 0 --> comp_total326
+comp_total326: li %75, 0 --> comp_total325
+comp_total325: li %76, 0 --> comp_total324
+comp_total324: li %77, 0 --> comp_total323
+comp_total323: li %78, 0 --> comp_total322
+comp_total322: li %79, 0 --> comp_total321
+comp_total321: li %80, 0 --> comp_total320
+comp_total320: li %81, 0 --> comp_total319
+comp_total319: li %82, 0 --> comp_total318
+comp_total318: li %83, 0 --> comp_total317
+comp_total317: li %84, 0 --> comp_total316
+comp_total316: li %85, 0 --> comp_total315
+comp_total315: li %86, 0 --> comp_total314
+comp_total314: li %87, 0 --> comp_total313
+comp_total313: li %88, 0 --> comp_total312
+comp_total312: li %89, 0 --> comp_total311
+comp_total311: li %90, 0 --> comp_total310
+comp_total310: li %91, 0 --> comp_total309
+comp_total309: li %92, 0 --> comp_total308
+comp_total308: li %93, 0 --> comp_total307
+comp_total307: li %94, 0 --> comp_total306
+comp_total306: li %95, 0 --> comp_total305
+comp_total305: li %96, 0 --> comp_total304
+comp_total304: li %97, 0 --> comp_total303
+comp_total303: li %98, 0 --> comp_total302
+comp_total302: li %99, 0 --> comp_total301
+comp_total301: li %100, 0 --> comp_total300
+comp_total300: li %101, 0 --> comp_total299
+comp_total299: li %102, 0 --> comp_total298
+comp_total298: li %103, 0 --> comp_total297
+comp_total297: li %104, 0 --> comp_total296
+comp_total296: li %105, 0 --> comp_total295
+comp_total295: li %106, 0 --> comp_total294
+comp_total294: li %107, 0 --> comp_total293
+comp_total293: li %108, 0 --> comp_total292
+comp_total292: li %109, 0 --> comp_total291
+comp_total291: li %110, 0 --> comp_total290
+comp_total290: li %111, 0 --> comp_total289
+comp_total289: li %112, 0 --> comp_total288
+comp_total288: li %113, 0 --> comp_total287
+comp_total287: li %114, 0 --> comp_total286
+comp_total286: li %115, 0 --> comp_total285
+comp_total285: li %116, 0 --> comp_total284
+comp_total284: li %117, 0 --> comp_total283
+comp_total283: li %118, 0 --> comp_total282
+comp_total282: li %119, 0 --> comp_total281
+comp_total281: li %120, 0 --> comp_total280
+comp_total280: li %121, 0 --> comp_total279
+comp_total279: li %122, 0 --> comp_total278
+comp_total278: li %123, 0 --> comp_total277
+comp_total277: li %124, 0 --> comp_total276
+comp_total276: li %125, 0 --> comp_total275
+comp_total275: li %126, 0 --> comp_total274
+comp_total274: li %127, 0 --> comp_total273
+comp_total273: li %128, 0 --> comp_total272
+comp_total272: li %129, 0 --> comp_total271
+comp_total271: li %130, 0 --> comp_total270
+comp_total270: li %131, 0 --> comp_total269
+comp_total269: li %132, 0 --> comp_total268
+comp_total268: li %133, 0 --> comp_total267
+comp_total267: li %134, 0 --> comp_total266
+comp_total266: li %135, 0 --> comp_total265
+comp_total265: li %136, 0 --> comp_total264
+comp_total264: li %137, 0 --> comp_total263
+comp_total263: li %138, 0 --> comp_total262
+comp_total262: li %139, 0 --> comp_total261
+comp_total261: li %140, 0 --> comp_total260
+comp_total260: li %141, 0 --> comp_total259
+comp_total259: li %142, 0 --> comp_total258
+comp_total258: li %143, 0 --> comp_total257
+comp_total257: li %144, 0 --> comp_total256
+comp_total256: li %145, 0 --> comp_total255
+comp_total255: li %146, 0 --> comp_total254
+comp_total254: li %147, 0 --> comp_total253
+comp_total253: li %148, 0 --> comp_total252
+comp_total252: li %149, 0 --> comp_total251
+comp_total251: li %150, 0 --> comp_total250
+comp_total250: li %151, 0 --> comp_total249
+comp_total249: li %152, 0 --> comp_total248
+comp_total248: li %153, 0 --> comp_total247
+comp_total247: li %154, 0 --> comp_total246
+comp_total246: li %155, 0 --> comp_total245
+comp_total245: li %156, 0 --> comp_total244
+comp_total244: li %157, 0 --> comp_total243
+comp_total243: li %158, 0 --> comp_total242
+comp_total242: li %159, 0 --> comp_total241
+comp_total241: li %160, 0 --> comp_total240
+comp_total240: li %161, 0 --> comp_total239
+comp_total239: li %162, 0 --> comp_total238
+comp_total238: li %163, 0 --> comp_total237
+comp_total237: li %164, 0 --> comp_total236
+comp_total236: li %165, 0 --> comp_total235
+comp_total235: li %166, 0 --> comp_total234
+comp_total234: li %167, 0 --> comp_total205
+comp_total205: emit c94 --> comp_total204
+comp_total204: li %135, 0 --> comp_total203
+comp_total203: addi %136, STACK, 0 --> comp_total202
+comp_total202: li %138, 0 --> comp_total201
+comp_total201: li %139, 4 --> comp_total200
+comp_total200: mulo %137, %138, %139 --> comp_total199
+comp_total199: add %157, %136, %137 --> comp_total223
+comp_total223: sw %135, 0(%157) --> comp_total198
+comp_total198: emit c93 --> comp_total197
+comp_total197: li %130, 0 --> comp_total196
+comp_total196: addi %131, STACK, 0 --> comp_total195
+comp_total195: li %133, 1 --> comp_total194
+comp_total194: li %134, 4 --> comp_total193
+comp_total193: mulo %132, %133, %134 --> comp_total192
+comp_total192: add %156, %131, %132 --> comp_total222
+comp_total222: sw %130, 0(%156) --> comp_total191
+comp_total191: emit c92 --> comp_total190
+comp_total190: li %125, 0 --> comp_total189
+comp_total189: addi %126, STACK, 0 --> comp_total188
+comp_total188: li %128, 2 --> comp_total187
+comp_total187: li %129, 4 --> comp_total186
+comp_total186: mulo %127, %128, %129 --> comp_total185
+comp_total185: add %154, %126, %127 --> comp_total220
+comp_total220: sw %125, 0(%154) --> comp_total184
+comp_total184: emit c91 --> comp_total183
+comp_total183: li %120, 0 --> comp_total182
+comp_total182: addi %121, STACK, 0 --> comp_total181
+comp_total181: li %123, 3 --> comp_total180
+comp_total180: li %124, 4 --> comp_total179
+comp_total179: mulo %122, %123, %124 --> comp_total178
+comp_total178: add %153, %121, %122 --> comp_total219
+comp_total219: sw %120, 0(%153) --> comp_total177
+comp_total177: emit c90 --> comp_total176
+comp_total176: li %115, 0 --> comp_total175
+comp_total175: addi %116, STACK, 0 --> comp_total174
+comp_total174: li %118, 4 --> comp_total173
+comp_total173: li %119, 4 --> comp_total172
+comp_total172: mulo %117, %118, %119 --> comp_total171
+comp_total171: add %152, %116, %117 --> comp_total218
+comp_total218: sw %115, 0(%152) --> comp_total170
+comp_total170: emit c89 --> comp_total169
+comp_total169: li %110, 0 --> comp_total168
+comp_total168: addi %111, STACK, 0 --> comp_total167
+comp_total167: li %113, 5 --> comp_total166
+comp_total166: li %114, 4 --> comp_total165
+comp_total165: mulo %112, %113, %114 --> comp_total164
+comp_total164: add %151, %111, %112 --> comp_total217
+comp_total217: sw %110, 0(%151) --> comp_total163
+comp_total163: emit c88 --> comp_total162
+comp_total162: li %105, 0 --> comp_total161
+comp_total161: addi %106, STACK, 0 --> comp_total160
+comp_total160: li %108, 6 --> comp_total159
+comp_total159: li %109, 4 --> comp_total158
+comp_total158: mulo %107, %108, %109 --> comp_total157
+comp_total157: add %150, %106, %107 --> comp_total216
+comp_total216: sw %105, 0(%150) --> comp_total156
+comp_total156: emit c87 --> comp_total155
+comp_total155: li %100, 0 --> comp_total154
+comp_total154: addi %101, STACK, 0 --> comp_total153
+comp_total153: li %103, 7 --> comp_total152
+comp_total152: li %104, 4 --> comp_total151
+comp_total151: mulo %102, %103, %104 --> comp_total150
+comp_total150: add %149, %101, %102 --> comp_total215
+comp_total215: sw %100, 0(%149) --> comp_total149
+comp_total149: emit c86 --> comp_total148
+comp_total148: li %95, 0 --> comp_total147
+comp_total147: addi %96, STACK, 0 --> comp_total146
+comp_total146: li %98, 8 --> comp_total145
+comp_total145: li %99, 4 --> comp_total144
+comp_total144: mulo %97, %98, %99 --> comp_total143
+comp_total143: add %147, %96, %97 --> comp_total213
+comp_total213: sw %95, 0(%147) --> comp_total142
+comp_total142: emit c85 --> comp_total141
+comp_total141: li %90, 0 --> comp_total140
+comp_total140: addi %91, STACK, 0 --> comp_total139
+comp_total139: li %93, 9 --> comp_total138
+comp_total138: li %94, 4 --> comp_total137
+comp_total137: mulo %92, %93, %94 --> comp_total136
+comp_total136: add %146, %91, %92 --> comp_total212
+comp_total212: sw %90, 0(%146) --> comp_total135
+comp_total135: emit c84 --> comp_total134
+comp_total134: li %85, 0 --> comp_total133
+comp_total133: addi %86, STACK, 40 --> comp_total132
+comp_total132: li %88, 0 --> comp_total131
+comp_total131: li %89, 4 --> comp_total130
+comp_total130: mulo %87, %88, %89 --> comp_total129
+comp_total129: add %145, %86, %87 --> comp_total211
+comp_total211: sw %85, 0(%145) --> comp_total128
+comp_total128: emit c83 --> comp_total127
+comp_total127: li %80, 0 --> comp_total126
+comp_total126: addi %81, STACK, 40 --> comp_total125
+comp_total125: li %83, 1 --> comp_total124
+comp_total124: li %84, 4 --> comp_total123
+comp_total123: mulo %82, %83, %84 --> comp_total122
+comp_total122: add %144, %81, %82 --> comp_total210
+comp_total210: sw %80, 0(%144) --> comp_total121
+comp_total121: emit c82 --> comp_total120
+comp_total120: li %75, 0 --> comp_total119
+comp_total119: addi %76, STACK, 40 --> comp_total118
+comp_total118: li %78, 2 --> comp_total117
+comp_total117: li %79, 4 --> comp_total116
+comp_total116: mulo %77, %78, %79 --> comp_total115
+comp_total115: add %143, %76, %77 --> comp_total209
+comp_total209: sw %75, 0(%143) --> comp_total114
+comp_total114: emit c81 --> comp_total113
+comp_total113: li %70, 0 --> comp_total112
+comp_total112: addi %71, STACK, 40 --> comp_total111
+comp_total111: li %73, 3 --> comp_total110
+comp_total110: li %74, 4 --> comp_total109
+comp_total109: mulo %72, %73, %74 --> comp_total108
+comp_total108: add %141, %71, %72 --> comp_total207
+comp_total207: sw %70, 0(%141) --> comp_total107
+comp_total107: emit c80 --> comp_total106
+comp_total106: li %65, 0 --> comp_total105
+comp_total105: addi %66, STACK, 40 --> comp_total104
+comp_total104: li %68, 4 --> comp_total103
+comp_total103: li %69, 4 --> comp_total102
+comp_total102: mulo %67, %68, %69 --> comp_total101
+comp_total101: add %140, %66, %67 --> comp_total206
+comp_total206: sw %65, 0(%140) --> comp_total100
+comp_total100: emit c79 --> comp_total99
+comp_total99 : li %60, 0 --> comp_total98
+comp_total98 : addi %61, STACK, 40 --> comp_total97
+comp_total97 : li %63, 5 --> comp_total96
+comp_total96 : li %64, 4 --> comp_total95
+comp_total95 : mulo %62, %63, %64 --> comp_total94
+comp_total94 : add %167, %61, %62 --> comp_total233
+comp_total233: sw %60, 0(%167) --> comp_total93
+comp_total93 : emit c78 --> comp_total92
+comp_total92 : li %55, 0 --> comp_total91
+comp_total91 : addi %56, STACK, 40 --> comp_total90
+comp_total90 : li %58, 6 --> comp_total89
+comp_total89 : li %59, 4 --> comp_total88
+comp_total88 : mulo %57, %58, %59 --> comp_total87
+comp_total87 : add %166, %56, %57 --> comp_total232
+comp_total232: sw %55, 0(%166) --> comp_total86
+comp_total86 : emit c77 --> comp_total85
+comp_total85 : li %50, 0 --> comp_total84
+comp_total84 : addi %51, STACK, 40 --> comp_total83
+comp_total83 : li %53, 7 --> comp_total82
+comp_total82 : li %54, 4 --> comp_total81
+comp_total81 : mulo %52, %53, %54 --> comp_total80
+comp_total80 : add %165, %51, %52 --> comp_total231
+comp_total231: sw %50, 0(%165) --> comp_total79
+comp_total79 : emit c76 --> comp_total78
+comp_total78 : li %45, 0 --> comp_total77
+comp_total77 : addi %46, STACK, 40 --> comp_total76
+comp_total76 : li %48, 8 --> comp_total75
+comp_total75 : li %49, 4 --> comp_total74
+comp_total74 : mulo %47, %48, %49 --> comp_total73
+comp_total73 : add %164, %46, %47 --> comp_total230
+comp_total230: sw %45, 0(%164) --> comp_total72
+comp_total72 : emit c75 --> comp_total71
+comp_total71 : li %40, 0 --> comp_total70
+comp_total70 : addi %41, STACK, 40 --> comp_total69
+comp_total69 : li %43, 9 --> comp_total68
+comp_total68 : li %44, 4 --> comp_total67
+comp_total67 : mulo %42, %43, %44 --> comp_total66
+comp_total66 : add %163, %41, %42 --> comp_total229
+comp_total229: sw %40, 0(%163) --> comp_total65
+comp_total65 : emit c74 --> comp_total64
+comp_total64 : li %39, 0 --> comp_total63
+comp_total63 : slt %38, %1, %2 --> comp_total62
+comp_total62 : beq %38, %39 --> comp_total40, comp_total61
+comp_total61 : emit c73 --> comp_total60
+comp_total60 : emit c72 --> comp_total59
+comp_total59 : li %5, 0 --> comp_total41
+comp_total41 : j --> comp_total58
+comp_total58 : li %36, 0 --> comp_total57
+comp_total57 : emit c71 --> comp_total56
+comp_total56 : sle %37, %5, %1 --> comp_total55
+comp_total55 : li %162, 0 --> comp_total228
+comp_total228: seq %35, %37, %162 --> comp_total54
+comp_total54 : beq %35, %36 --> comp_total53, comp_total2
+comp_total2 : emit c59 --> comp_total1
+comp_total1 : li %6, 0 --> comp_total0
+comp_total0 : return %6
+comp_total53 : emit c69 --> comp_total52
+comp_total52 : sub %33, %1, %5 --> comp_total51
+comp_total51 : li %34, 4 --> comp_total50
+comp_total50 : mulo %32, %33, %34 --> comp_total49
+comp_total49 : add %161, %0, %32 --> comp_total227
+comp_total227: lw %28, 0(%161) --> comp_total48
+comp_total48 : addi %29, STACK, 0 --> comp_total47
+comp_total47 : li %31, 4 --> comp_total46
+comp_total46 : mulo %30, %5, %31 --> comp_total45
+comp_total45 : add %160, %29, %30 --> comp_total226
+comp_total226: sw %28, 0(%160) --> comp_total44
+comp_total44 : emit c70 --> comp_total43
+comp_total43 : li %27, 1 --> comp_total42
+comp_total42 : add %5, %5, %27 --> comp_total41
+comp_total40 : emit c68 --> comp_total39
+comp_total39 : emit c67 --> comp_total38
+comp_total38 : li %3, 0 --> comp_total3
+comp_total3 : j --> comp_total37
+comp_total37 : li %25, 0 --> comp_total36
+comp_total36 : emit c66 --> comp_total35
+comp_total35 : slt %26, %3, %1 --> comp_total34
+comp_total34 : li %159, 0 --> comp_total225
+comp_total225: seq %24, %26, %159 --> comp_total33
+comp_total33 : beq %24, %25 --> comp_total32, comp_total2
+comp_total32 : emit c64 --> comp_total31
+comp_total31 : emit c63 --> comp_total30
+comp_total30 : move %4, %2 --> comp_total7
+comp_total7 : j --> comp_total29
+comp_total29 : li %21, 0 --> comp_total28
+comp_total28 : emit c62 --> comp_total27
+comp_total27 : li %23, 0 --> comp_total26
+comp_total26 : sgt %22, %4, %23 --> comp_total25
+comp_total25 : li %158, 0 --> comp_total224
+comp_total224: seq %20, %22, %158 --> comp_total24
+comp_total24 : beq %20, %21 --> comp_total23, comp_total6
+comp_total6 : emit c65 --> comp_total5
+comp_total5 : li %7, 1 --> comp_total4
+comp_total4 : add %3, %3, %7 --> comp_total3
+comp_total23 : emit c60 --> comp_total22
+comp_total22 : addi %17, STACK, 0 --> comp_total21
+comp_total21 : li %19, 4 --> comp_total20
+comp_total20 : mulo %18, %3, %19 --> comp_total19
+comp_total19 : add %155, %17, %18 --> comp_total221
+comp_total221: lw %12, 0(%155) --> comp_total18
+comp_total18 : addi %14, STACK, 40 --> comp_total17
+comp_total17 : li %16, 4 --> comp_total16
+comp_total16 : mulo %15, %4, %16 --> comp_total15
+comp_total15 : add %148, %14, %15 --> comp_total214
+comp_total214: lw %13, 0(%148) --> comp_total14
+comp_total14 : add %9, %12, %13 --> comp_total13
+comp_total13 : li %11, 4 --> comp_total12
+comp_total12 : mulo %10, %3, %11 --> comp_total11
+comp_total11 : add %142, %0, %10 --> comp_total208
+comp_total208: sw %9, 0(%142) --> comp_total10
+comp_total10 : emit c61 --> comp_total9
+comp_total9 : li %8, 1 --> comp_total8
+comp_total8 : sub %4, %4, %8 --> comp_total7
+
+function comp_ifFor(%0; %1; %2) : %5
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11
+entry comp_ifFor32
+comp_ifFor32: li %3, 0 --> comp_ifFor31
+comp_ifFor31: li %4, 0 --> comp_ifFor30
+comp_ifFor30: li %6, 0 --> comp_ifFor29
+comp_ifFor29: li %7, 0 --> comp_ifFor28
+comp_ifFor28: li %8, 0 --> comp_ifFor27
+comp_ifFor27: li %9, 0 --> comp_ifFor26
+comp_ifFor26: li %10, 0 --> comp_ifFor25
+comp_ifFor25: li %11, 0 --> comp_ifFor23
+comp_ifFor23: emit c58 --> comp_ifFor22
+comp_ifFor22: li %4, 0 --> comp_ifFor21
+comp_ifFor21: emit c57 --> comp_ifFor20
+comp_ifFor20: emit c56 --> comp_ifFor19
+comp_ifFor19: li %3, 0 --> comp_ifFor3
+comp_ifFor3 : j --> comp_ifFor18
+comp_ifFor18: li %9, 0 --> comp_ifFor17
+comp_ifFor17: emit c55 --> comp_ifFor16
+comp_ifFor16: slt %10, %3, %0 --> comp_ifFor15
+comp_ifFor15: li %11, 0 --> comp_ifFor24
+comp_ifFor24: seq %8, %10, %11 --> comp_ifFor14
+comp_ifFor14: beq %8, %9 --> comp_ifFor13, comp_ifFor2
+comp_ifFor2 : emit c50 --> comp_ifFor1
+comp_ifFor1 : move %5, %4 --> comp_ifFor0
+comp_ifFor0 : return %5
+comp_ifFor13: emit c53 --> comp_ifFor12
+comp_ifFor12: li %7, 0 --> comp_ifFor11
+comp_ifFor11: sne %6, %3, %1 --> comp_ifFor10
+comp_ifFor10: beq %6, %7 --> comp_ifFor7, comp_ifFor9
+comp_ifFor9 : emit c52 --> comp_ifFor8
+comp_ifFor8 : add %4, %4, %3 --> comp_ifFor5
+comp_ifFor5 : emit c54 --> comp_ifFor4
+comp_ifFor4 : add %3, %3, %2 --> comp_ifFor3
+comp_ifFor7 : emit c51 --> comp_ifFor6
+comp_ifFor6 : li %4, 0 --> comp_ifFor5
+
+function comp_forif2(%0; %1; %2; %3) : %9
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53
+entry comp_forif2139
+comp_forif2139: li %4, 0 --> comp_forif2138
+comp_forif2138: li %5, 0 --> comp_forif2137
+comp_forif2137: li %6, 0 --> comp_forif2136
+comp_forif2136: li %7, 0 --> comp_forif2135
+comp_forif2135: li %8, 0 --> comp_forif2134
+comp_forif2134: li %10, 0 --> comp_forif2133
+comp_forif2133: li %11, 0 --> comp_forif2132
+comp_forif2132: li %12, 0 --> comp_forif2131
+comp_forif2131: li %13, 0 --> comp_forif2130
+comp_forif2130: li %14, 0 --> comp_forif2129
+comp_forif2129: li %15, 0 --> comp_forif2128
+comp_forif2128: li %16, 0 --> comp_forif2127
+comp_forif2127: li %17, 0 --> comp_forif2126
+comp_forif2126: li %18, 0 --> comp_forif2125
+comp_forif2125: li %19, 0 --> comp_forif2124
+comp_forif2124: li %20, 0 --> comp_forif2123
+comp_forif2123: li %21, 0 --> comp_forif2122
+comp_forif2122: li %22, 0 --> comp_forif2121
+comp_forif2121: li %23, 0 --> comp_forif2120
+comp_forif2120: li %24, 0 --> comp_forif2119
+comp_forif2119: li %25, 0 --> comp_forif2118
+comp_forif2118: li %26, 0 --> comp_forif2117
+comp_forif2117: li %27, 0 --> comp_forif2116
+comp_forif2116: li %28, 0 --> comp_forif2115
+comp_forif2115: li %29, 0 --> comp_forif2114
+comp_forif2114: li %30, 0 --> comp_forif2113
+comp_forif2113: li %31, 0 --> comp_forif2112
+comp_forif2112: li %32, 0 --> comp_forif2111
+comp_forif2111: li %33, 0 --> comp_forif2110
+comp_forif2110: li %34, 0 --> comp_forif2109
+comp_forif2109: li %35, 0 --> comp_forif2108
+comp_forif2108: li %36, 0 --> comp_forif2107
+comp_forif2107: li %37, 0 --> comp_forif2106
+comp_forif2106: li %38, 0 --> comp_forif2105
+comp_forif2105: li %39, 0 --> comp_forif2104
+comp_forif2104: li %40, 0 --> comp_forif2103
+comp_forif2103: li %41, 0 --> comp_forif2102
+comp_forif2102: li %42, 0 --> comp_forif2101
+comp_forif2101: li %43, 0 --> comp_forif2100
+comp_forif2100: li %44, 0 --> comp_forif299
+comp_forif299 : li %45, 0 --> comp_forif298
+comp_forif298 : li %46, 0 --> comp_forif297
+comp_forif297 : li %47, 0 --> comp_forif296
+comp_forif296 : li %48, 0 --> comp_forif295
+comp_forif295 : li %49, 0 --> comp_forif294
+comp_forif294 : li %50, 0 --> comp_forif293
+comp_forif293 : li %51, 0 --> comp_forif292
+comp_forif292 : li %52, 0 --> comp_forif291
+comp_forif291 : li %53, 0 --> comp_forif282
+comp_forif282 : emit c130 --> comp_forif281
+comp_forif281 : li %6, 0 --> comp_forif280
+comp_forif280 : emit c129 --> comp_forif279
+comp_forif279 : li %5, 0 --> comp_forif278
+comp_forif278 : emit c128 --> comp_forif277
+comp_forif277 : emit c127 --> comp_forif276
+comp_forif276 : li %8, 0 --> comp_forif262
+comp_forif262 : j --> comp_forif275
+comp_forif275 : li %44, 0 --> comp_forif274
+comp_forif274 : emit c126 --> comp_forif273
+comp_forif273 : slt %45, %8, %2 --> comp_forif272
+comp_forif272 : li %53, 0 --> comp_forif290
+comp_forif290 : seq %43, %45, %53 --> comp_forif271
+comp_forif271 : beq %43, %44 --> comp_forif270, comp_forif261
+comp_forif261 : emit c123 --> comp_forif260
+comp_forif260 : emit c122 --> comp_forif259
+comp_forif259 : li %7, 0 --> comp_forif245
+comp_forif245 : j --> comp_forif258
+comp_forif258 : li %37, 0 --> comp_forif257
+comp_forif257 : emit c121 --> comp_forif256
+comp_forif256 : slt %38, %7, %3 --> comp_forif255
+comp_forif255 : li %51, 0 --> comp_forif288
+comp_forif288 : seq %36, %38, %51 --> comp_forif254
+comp_forif254 : beq %36, %37 --> comp_forif253, comp_forif244
+comp_forif244 : emit c118 --> comp_forif243
+comp_forif243 : li %21, 0 --> comp_forif242
+comp_forif242 : li %28, 0 --> comp_forif241
+comp_forif241 : emit c117 --> comp_forif240
+comp_forif240 : li %31, 2 --> comp_forif239
+comp_forif239 : la %49, mod --> comp_forif286
+comp_forif286 : call %29, %49(%6, %31) --> comp_forif238
+comp_forif238 : li %30, 0 --> comp_forif237
+comp_forif237 : seq %27, %29, %30 --> comp_forif236
+comp_forif236 : beq %27, %28 --> comp_forif226, comp_forif235
+comp_forif235 : li %23, 0 --> comp_forif234
+comp_forif234 : emit c116 --> comp_forif233
+comp_forif233 : li %26, 2 --> comp_forif232
+comp_forif232 : la %48, mod --> comp_forif285
+comp_forif285 : call %24, %48(%5, %26) --> comp_forif231
+comp_forif231 : li %25, 0 --> comp_forif230
+comp_forif230 : seq %22, %24, %25 --> comp_forif229
+comp_forif229 : beq %22, %23 --> comp_forif227, comp_forif228
+comp_forif228 : li %20, 1 --> comp_forif225
+comp_forif225 : beq %20, %21 --> comp_forif222, comp_forif224
+comp_forif224 : emit c115 --> comp_forif223
+comp_forif223 : li %4, 0 --> comp_forif22
+comp_forif22 : emit c109 --> comp_forif21
+comp_forif21 : li %9, 0 --> comp_forif20
+comp_forif20 : return %9
+comp_forif222 : emit c114 --> comp_forif221
+comp_forif221 : li %16, 0 --> comp_forif220
+comp_forif220 : li %19, 2 --> comp_forif219
+comp_forif219 : la %47, mod --> comp_forif284
+comp_forif284 : call %17, %47(%6, %19) --> comp_forif218
+comp_forif218 : li %18, 0 --> comp_forif217
+comp_forif217 : seq %15, %17, %18 --> comp_forif216
+comp_forif216 : beq %15, %16 --> comp_forif213, comp_forif215
+comp_forif215 : emit c113 --> comp_forif214
+comp_forif214 : li %4, 1 --> comp_forif22
+comp_forif213 : emit c112 --> comp_forif212
+comp_forif212 : li %11, 0 --> comp_forif211
+comp_forif211 : li %14, 2 --> comp_forif210
+comp_forif210 : la %46, mod --> comp_forif283
+comp_forif283 : call %12, %46(%5, %14) --> comp_forif29
+comp_forif29 : li %13, 0 --> comp_forif28
+comp_forif28 : seq %10, %12, %13 --> comp_forif27
+comp_forif27 : beq %10, %11 --> comp_forif24, comp_forif26
+comp_forif26 : emit c111 --> comp_forif25
+comp_forif25 : li %4, 2 --> comp_forif22
+comp_forif24 : emit c110 --> comp_forif23
+comp_forif23 : li %4, 3 --> comp_forif22
+comp_forif227 : li %20, 0 --> comp_forif225
+comp_forif226 : li %20, 0 --> comp_forif225
+comp_forif253 : emit c119 --> comp_forif252
+comp_forif252 : li %35, 4 --> comp_forif251
+comp_forif251 : mulo %34, %7, %35 --> comp_forif250
+comp_forif250 : add %50, %1, %34 --> comp_forif287
+comp_forif287 : lw %33, 0(%50) --> comp_forif249
+comp_forif249 : add %5, %5, %33 --> comp_forif248
+comp_forif248 : emit c120 --> comp_forif247
+comp_forif247 : li %32, 1 --> comp_forif246
+comp_forif246 : add %7, %7, %32 --> comp_forif245
+comp_forif270 : emit c124 --> comp_forif269
+comp_forif269 : li %42, 4 --> comp_forif268
+comp_forif268 : mulo %41, %8, %42 --> comp_forif267
+comp_forif267 : add %52, %0, %41 --> comp_forif289
+comp_forif289 : lw %40, 0(%52) --> comp_forif266
+comp_forif266 : add %6, %6, %40 --> comp_forif265
+comp_forif265 : emit c125 --> comp_forif264
+comp_forif264 : li %39, 1 --> comp_forif263
+comp_forif263 : add %8, %8, %39 --> comp_forif262
+
+function comp_forif() : %3
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18
+entry comp_forif55
+comp_forif55: li %0, 0 --> comp_forif54
+comp_forif54: li %1, 0 --> comp_forif53
+comp_forif53: li %2, 0 --> comp_forif52
+comp_forif52: li %4, 0 --> comp_forif51
+comp_forif51: li %5, 0 --> comp_forif50
+comp_forif50: li %6, 0 --> comp_forif49
+comp_forif49: li %7, 0 --> comp_forif48
+comp_forif48: li %8, 0 --> comp_forif47
+comp_forif47: li %9, 0 --> comp_forif46
+comp_forif46: li %10, 0 --> comp_forif45
+comp_forif45: li %11, 0 --> comp_forif44
+comp_forif44: li %12, 0 --> comp_forif43
+comp_forif43: li %13, 0 --> comp_forif42
+comp_forif42: li %14, 0 --> comp_forif41
+comp_forif41: li %15, 0 --> comp_forif40
+comp_forif40: li %16, 0 --> comp_forif39
+comp_forif39: li %17, 0 --> comp_forif38
+comp_forif38: li %18, 0 --> comp_forif35
+comp_forif35: emit c141 --> comp_forif34
+comp_forif34: li %1, 0 --> comp_forif33
+comp_forif33: emit c140 --> comp_forif32
+comp_forif32: li %0, 0 --> comp_forif31
+comp_forif31: emit c139 --> comp_forif30
+comp_forif30: emit c138 --> comp_forif29
+comp_forif29: li %2, 0 --> comp_forif3
+comp_forif3 : j --> comp_forif28
+comp_forif28: li %14, 0 --> comp_forif27
+comp_forif27: emit c137 --> comp_forif26
+comp_forif26: li %16, 10 --> comp_forif25
+comp_forif25: slt %15, %2, %16 --> comp_forif24
+comp_forif24: li %18, 0 --> comp_forif37
+comp_forif37: seq %13, %15, %18 --> comp_forif23
+comp_forif23: beq %13, %14 --> comp_forif22, comp_forif2
+comp_forif2 : emit c131 --> comp_forif1
+comp_forif1 : move %3, %1 --> comp_forif0
+comp_forif0 : return %3
+comp_forif22: emit c135 --> comp_forif21
+comp_forif21: li %12, 1 --> comp_forif20
+comp_forif20: add %1, %1, %12 --> comp_forif19
+comp_forif19: emit c134 --> comp_forif18
+comp_forif18: li %11, 1 --> comp_forif17
+comp_forif17: add %1, %1, %11 --> comp_forif16
+comp_forif16: emit c133 --> comp_forif15
+comp_forif15: li %7, 0 --> comp_forif14
+comp_forif14: li %10, 2 --> comp_forif13
+comp_forif13: la %17, mod --> comp_forif36
+comp_forif36: call %8, %17(%2, %10) --> comp_forif12
+comp_forif12: li %9, 0 --> comp_forif11
+comp_forif11: seq %6, %8, %9 --> comp_forif10
+comp_forif10: beq %6, %7 --> comp_forif6, comp_forif9
+comp_forif9 : emit c132 --> comp_forif8
+comp_forif8 : li %5, 1 --> comp_forif7
+comp_forif7 : add %0, %0, %5 --> comp_forif6
+comp_forif6 : emit c136 --> comp_forif5
+comp_forif5 : li %4, 1 --> comp_forif4
+comp_forif4 : add %2, %2, %4 --> comp_forif3
+
+function comp_fir_basic(%0; %1; %2; %3; %4) : %9
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53
+entry comp_fir_basic126
+comp_fir_basic126: li %5, 0 --> comp_fir_basic125
+comp_fir_basic125: li %6, 0 --> comp_fir_basic124
+comp_fir_basic124: li %7, 0 --> comp_fir_basic123
+comp_fir_basic123: li %8, 0 --> comp_fir_basic122
+comp_fir_basic122: li %10, 0 --> comp_fir_basic121
+comp_fir_basic121: li %11, 0 --> comp_fir_basic120
+comp_fir_basic120: li %12, 0 --> comp_fir_basic119
+comp_fir_basic119: li %13, 0 --> comp_fir_basic118
+comp_fir_basic118: li %14, 0 --> comp_fir_basic117
+comp_fir_basic117: li %15, 0 --> comp_fir_basic116
+comp_fir_basic116: li %16, 0 --> comp_fir_basic115
+comp_fir_basic115: li %17, 0 --> comp_fir_basic114
+comp_fir_basic114: li %18, 0 --> comp_fir_basic113
+comp_fir_basic113: li %19, 0 --> comp_fir_basic112
+comp_fir_basic112: li %20, 0 --> comp_fir_basic111
+comp_fir_basic111: li %21, 0 --> comp_fir_basic110
+comp_fir_basic110: li %22, 0 --> comp_fir_basic109
+comp_fir_basic109: li %23, 0 --> comp_fir_basic108
+comp_fir_basic108: li %24, 0 --> comp_fir_basic107
+comp_fir_basic107: li %25, 0 --> comp_fir_basic106
+comp_fir_basic106: li %26, 0 --> comp_fir_basic105
+comp_fir_basic105: li %27, 0 --> comp_fir_basic104
+comp_fir_basic104: li %28, 0 --> comp_fir_basic103
+comp_fir_basic103: li %29, 0 --> comp_fir_basic102
+comp_fir_basic102: li %30, 0 --> comp_fir_basic101
+comp_fir_basic101: li %31, 0 --> comp_fir_basic100
+comp_fir_basic100: li %32, 0 --> comp_fir_basic99
+comp_fir_basic99 : li %33, 0 --> comp_fir_basic98
+comp_fir_basic98 : li %34, 0 --> comp_fir_basic97
+comp_fir_basic97 : li %35, 0 --> comp_fir_basic96
+comp_fir_basic96 : li %36, 0 --> comp_fir_basic95
+comp_fir_basic95 : li %37, 0 --> comp_fir_basic94
+comp_fir_basic94 : li %38, 0 --> comp_fir_basic93
+comp_fir_basic93 : li %39, 0 --> comp_fir_basic92
+comp_fir_basic92 : li %40, 0 --> comp_fir_basic91
+comp_fir_basic91 : li %41, 0 --> comp_fir_basic90
+comp_fir_basic90 : li %42, 0 --> comp_fir_basic89
+comp_fir_basic89 : li %43, 0 --> comp_fir_basic88
+comp_fir_basic88 : li %44, 0 --> comp_fir_basic87
+comp_fir_basic87 : li %45, 0 --> comp_fir_basic86
+comp_fir_basic86 : li %46, 0 --> comp_fir_basic85
+comp_fir_basic85 : li %47, 0 --> comp_fir_basic84
+comp_fir_basic84 : li %48, 0 --> comp_fir_basic83
+comp_fir_basic83 : li %49, 0 --> comp_fir_basic82
+comp_fir_basic82 : li %50, 0 --> comp_fir_basic81
+comp_fir_basic81 : li %51, 0 --> comp_fir_basic80
+comp_fir_basic80 : li %52, 0 --> comp_fir_basic79
+comp_fir_basic79 : li %53, 0 --> comp_fir_basic69
+comp_fir_basic69 : emit c16 --> comp_fir_basic68
+comp_fir_basic68 : li %5, 0 --> comp_fir_basic67
+comp_fir_basic67 : emit c15 --> comp_fir_basic66
+comp_fir_basic66 : emit c14 --> comp_fir_basic65
+comp_fir_basic65 : li %6, 0 --> comp_fir_basic3
+comp_fir_basic3 : j --> comp_fir_basic64
+comp_fir_basic64 : li %42, 0 --> comp_fir_basic63
+comp_fir_basic63 : emit c13 --> comp_fir_basic62
+comp_fir_basic62 : li %44, 3 --> comp_fir_basic61
+comp_fir_basic61 : slt %43, %6, %44 --> comp_fir_basic60
+comp_fir_basic60 : li %53, 0 --> comp_fir_basic78
+comp_fir_basic78 : seq %41, %43, %53 --> comp_fir_basic59
+comp_fir_basic59 : beq %41, %42 --> comp_fir_basic58, comp_fir_basic2
+comp_fir_basic2 : emit c0 --> comp_fir_basic1
+comp_fir_basic1 : move %9, %5 --> comp_fir_basic0
+comp_fir_basic0 : return %9
+comp_fir_basic58 : emit c11 --> comp_fir_basic57
+comp_fir_basic57 : li %40, 4 --> comp_fir_basic56
+comp_fir_basic56 : mulo %39, %6, %40 --> comp_fir_basic55
+comp_fir_basic55 : add %52, %0, %39 --> comp_fir_basic77
+comp_fir_basic77 : lw %35, 0(%52) --> comp_fir_basic54
+comp_fir_basic54 : li %37, 0 --> comp_fir_basic53
+comp_fir_basic53 : li %38, 4 --> comp_fir_basic52
+comp_fir_basic52 : mulo %36, %37, %38 --> comp_fir_basic51
+comp_fir_basic51 : add %51, %2, %36 --> comp_fir_basic76
+comp_fir_basic76 : sw %35, 0(%51) --> comp_fir_basic50
+comp_fir_basic50 : emit c10 --> comp_fir_basic49
+comp_fir_basic49 : emit c9 --> comp_fir_basic48
+comp_fir_basic48 : li %8, 0 --> comp_fir_basic29
+comp_fir_basic29 : j --> comp_fir_basic47
+comp_fir_basic47 : li %32, 0 --> comp_fir_basic46
+comp_fir_basic46 : emit c8 --> comp_fir_basic45
+comp_fir_basic45 : li %34, 3 --> comp_fir_basic44
+comp_fir_basic44 : slt %33, %8, %34 --> comp_fir_basic43
+comp_fir_basic43 : li %50, 0 --> comp_fir_basic75
+comp_fir_basic75 : seq %31, %33, %50 --> comp_fir_basic42
+comp_fir_basic42 : beq %31, %32 --> comp_fir_basic41, comp_fir_basic28
+comp_fir_basic28 : emit c5 --> comp_fir_basic27
+comp_fir_basic27 : emit c4 --> comp_fir_basic26
+comp_fir_basic26 : li %7, 2 --> comp_fir_basic7
+comp_fir_basic7 : j --> comp_fir_basic25
+comp_fir_basic25 : li %20, 0 --> comp_fir_basic24
+comp_fir_basic24 : emit c3 --> comp_fir_basic23
+comp_fir_basic23 : li %22, 0 --> comp_fir_basic22
+comp_fir_basic22 : sge %21, %7, %22 --> comp_fir_basic21
+comp_fir_basic21 : li %47, 0 --> comp_fir_basic72
+comp_fir_basic72 : seq %19, %21, %47 --> comp_fir_basic20
+comp_fir_basic20 : beq %19, %20 --> comp_fir_basic19, comp_fir_basic6
+comp_fir_basic6 : emit c12 --> comp_fir_basic5
+comp_fir_basic5 : li %10, 1 --> comp_fir_basic4
+comp_fir_basic4 : add %6, %6, %10 --> comp_fir_basic3
+comp_fir_basic19 : emit c1 --> comp_fir_basic18
+comp_fir_basic18 : li %18, 4 --> comp_fir_basic17
+comp_fir_basic17 : mulo %17, %7, %18 --> comp_fir_basic16
+comp_fir_basic16 : add %46, %2, %17 --> comp_fir_basic71
+comp_fir_basic71 : lw %12, 0(%46) --> comp_fir_basic15
+comp_fir_basic15 : li %16, 1 --> comp_fir_basic14
+comp_fir_basic14 : add %14, %7, %16 --> comp_fir_basic13
+comp_fir_basic13 : li %15, 4 --> comp_fir_basic12
+comp_fir_basic12 : mulo %13, %14, %15 --> comp_fir_basic11
+comp_fir_basic11 : add %45, %2, %13 --> comp_fir_basic70
+comp_fir_basic70 : sw %12, 0(%45) --> comp_fir_basic10
+comp_fir_basic10 : emit c2 --> comp_fir_basic9
+comp_fir_basic9 : li %11, 1 --> comp_fir_basic8
+comp_fir_basic8 : sub %7, %7, %11 --> comp_fir_basic7
+comp_fir_basic41 : emit c6 --> comp_fir_basic40
+comp_fir_basic40 : li %30, 4 --> comp_fir_basic39
+comp_fir_basic39 : mulo %29, %8, %30 --> comp_fir_basic38
+comp_fir_basic38 : add %49, %1, %29 --> comp_fir_basic74
+comp_fir_basic74 : lw %25, 0(%49) --> comp_fir_basic37
+comp_fir_basic37 : li %28, 4 --> comp_fir_basic36
+comp_fir_basic36 : mulo %27, %8, %28 --> comp_fir_basic35
+comp_fir_basic35 : add %48, %2, %27 --> comp_fir_basic73
+comp_fir_basic73 : lw %26, 0(%48) --> comp_fir_basic34
+comp_fir_basic34 : mulo %24, %25, %26 --> comp_fir_basic33
+comp_fir_basic33 : add %5, %5, %24 --> comp_fir_basic32
+comp_fir_basic32 : emit c7 --> comp_fir_basic31
+comp_fir_basic31 : li %23, 1 --> comp_fir_basic30
+comp_fir_basic30 : add %8, %8, %23 --> comp_fir_basic29
+
+function comp_fir16(%0; %1; %2; %3) : %9
+stacksize 64
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78, %79, %80, %81, %82, %83,
+ %84, %85, %86, %87, %88, %89, %90,
+ %91, %92, %93, %94, %95, %96, %97,
+ %98, %99, %100, %101, %102, %103, %104,
+ %105, %106, %107, %108, %109, %110, %111,
+ %112, %113, %114, %115, %116, %117, %118,
+ %119, %120, %121, %122, %123, %124, %125,
+ %126, %127, %128, %129, %130, %131, %132,
+ %133, %134, %135, %136, %137, %138, %139,
+ %140, %141, %142, %143, %144, %145, %146,
+ %147, %148, %149, %150, %151, %152, %153
+entry comp_fir16359
+comp_fir16359: li %4, 0 --> comp_fir16358
+comp_fir16358: li %5, 0 --> comp_fir16357
+comp_fir16357: li %6, 0 --> comp_fir16356
+comp_fir16356: li %7, 0 --> comp_fir16355
+comp_fir16355: li %8, 0 --> comp_fir16354
+comp_fir16354: li %10, 0 --> comp_fir16353
+comp_fir16353: li %11, 0 --> comp_fir16352
+comp_fir16352: li %12, 0 --> comp_fir16351
+comp_fir16351: li %13, 0 --> comp_fir16350
+comp_fir16350: li %14, 0 --> comp_fir16349
+comp_fir16349: li %15, 0 --> comp_fir16348
+comp_fir16348: li %16, 0 --> comp_fir16347
+comp_fir16347: li %17, 0 --> comp_fir16346
+comp_fir16346: li %18, 0 --> comp_fir16345
+comp_fir16345: li %19, 0 --> comp_fir16344
+comp_fir16344: li %20, 0 --> comp_fir16343
+comp_fir16343: li %21, 0 --> comp_fir16342
+comp_fir16342: li %22, 0 --> comp_fir16341
+comp_fir16341: li %23, 0 --> comp_fir16340
+comp_fir16340: li %24, 0 --> comp_fir16339
+comp_fir16339: li %25, 0 --> comp_fir16338
+comp_fir16338: li %26, 0 --> comp_fir16337
+comp_fir16337: li %27, 0 --> comp_fir16336
+comp_fir16336: li %28, 0 --> comp_fir16335
+comp_fir16335: li %29, 0 --> comp_fir16334
+comp_fir16334: li %30, 0 --> comp_fir16333
+comp_fir16333: li %31, 0 --> comp_fir16332
+comp_fir16332: li %32, 0 --> comp_fir16331
+comp_fir16331: li %33, 0 --> comp_fir16330
+comp_fir16330: li %34, 0 --> comp_fir16329
+comp_fir16329: li %35, 0 --> comp_fir16328
+comp_fir16328: li %36, 0 --> comp_fir16327
+comp_fir16327: li %37, 0 --> comp_fir16326
+comp_fir16326: li %38, 0 --> comp_fir16325
+comp_fir16325: li %39, 0 --> comp_fir16324
+comp_fir16324: li %40, 0 --> comp_fir16323
+comp_fir16323: li %41, 0 --> comp_fir16322
+comp_fir16322: li %42, 0 --> comp_fir16321
+comp_fir16321: li %43, 0 --> comp_fir16320
+comp_fir16320: li %44, 0 --> comp_fir16319
+comp_fir16319: li %45, 0 --> comp_fir16318
+comp_fir16318: li %46, 0 --> comp_fir16317
+comp_fir16317: li %47, 0 --> comp_fir16316
+comp_fir16316: li %48, 0 --> comp_fir16315
+comp_fir16315: li %49, 0 --> comp_fir16314
+comp_fir16314: li %50, 0 --> comp_fir16313
+comp_fir16313: li %51, 0 --> comp_fir16312
+comp_fir16312: li %52, 0 --> comp_fir16311
+comp_fir16311: li %53, 0 --> comp_fir16310
+comp_fir16310: li %54, 0 --> comp_fir16309
+comp_fir16309: li %55, 0 --> comp_fir16308
+comp_fir16308: li %56, 0 --> comp_fir16307
+comp_fir16307: li %57, 0 --> comp_fir16306
+comp_fir16306: li %58, 0 --> comp_fir16305
+comp_fir16305: li %59, 0 --> comp_fir16304
+comp_fir16304: li %60, 0 --> comp_fir16303
+comp_fir16303: li %61, 0 --> comp_fir16302
+comp_fir16302: li %62, 0 --> comp_fir16301
+comp_fir16301: li %63, 0 --> comp_fir16300
+comp_fir16300: li %64, 0 --> comp_fir16299
+comp_fir16299: li %65, 0 --> comp_fir16298
+comp_fir16298: li %66, 0 --> comp_fir16297
+comp_fir16297: li %67, 0 --> comp_fir16296
+comp_fir16296: li %68, 0 --> comp_fir16295
+comp_fir16295: li %69, 0 --> comp_fir16294
+comp_fir16294: li %70, 0 --> comp_fir16293
+comp_fir16293: li %71, 0 --> comp_fir16292
+comp_fir16292: li %72, 0 --> comp_fir16291
+comp_fir16291: li %73, 0 --> comp_fir16290
+comp_fir16290: li %74, 0 --> comp_fir16289
+comp_fir16289: li %75, 0 --> comp_fir16288
+comp_fir16288: li %76, 0 --> comp_fir16287
+comp_fir16287: li %77, 0 --> comp_fir16286
+comp_fir16286: li %78, 0 --> comp_fir16285
+comp_fir16285: li %79, 0 --> comp_fir16284
+comp_fir16284: li %80, 0 --> comp_fir16283
+comp_fir16283: li %81, 0 --> comp_fir16282
+comp_fir16282: li %82, 0 --> comp_fir16281
+comp_fir16281: li %83, 0 --> comp_fir16280
+comp_fir16280: li %84, 0 --> comp_fir16279
+comp_fir16279: li %85, 0 --> comp_fir16278
+comp_fir16278: li %86, 0 --> comp_fir16277
+comp_fir16277: li %87, 0 --> comp_fir16276
+comp_fir16276: li %88, 0 --> comp_fir16275
+comp_fir16275: li %89, 0 --> comp_fir16274
+comp_fir16274: li %90, 0 --> comp_fir16273
+comp_fir16273: li %91, 0 --> comp_fir16272
+comp_fir16272: li %92, 0 --> comp_fir16271
+comp_fir16271: li %93, 0 --> comp_fir16270
+comp_fir16270: li %94, 0 --> comp_fir16269
+comp_fir16269: li %95, 0 --> comp_fir16268
+comp_fir16268: li %96, 0 --> comp_fir16267
+comp_fir16267: li %97, 0 --> comp_fir16266
+comp_fir16266: li %98, 0 --> comp_fir16265
+comp_fir16265: li %99, 0 --> comp_fir16264
+comp_fir16264: li %100, 0 --> comp_fir16263
+comp_fir16263: li %101, 0 --> comp_fir16262
+comp_fir16262: li %102, 0 --> comp_fir16261
+comp_fir16261: li %103, 0 --> comp_fir16260
+comp_fir16260: li %104, 0 --> comp_fir16259
+comp_fir16259: li %105, 0 --> comp_fir16258
+comp_fir16258: li %106, 0 --> comp_fir16257
+comp_fir16257: li %107, 0 --> comp_fir16256
+comp_fir16256: li %108, 0 --> comp_fir16255
+comp_fir16255: li %109, 0 --> comp_fir16254
+comp_fir16254: li %110, 0 --> comp_fir16253
+comp_fir16253: li %111, 0 --> comp_fir16252
+comp_fir16252: li %112, 0 --> comp_fir16251
+comp_fir16251: li %113, 0 --> comp_fir16250
+comp_fir16250: li %114, 0 --> comp_fir16249
+comp_fir16249: li %115, 0 --> comp_fir16248
+comp_fir16248: li %116, 0 --> comp_fir16247
+comp_fir16247: li %117, 0 --> comp_fir16246
+comp_fir16246: li %118, 0 --> comp_fir16245
+comp_fir16245: li %119, 0 --> comp_fir16244
+comp_fir16244: li %120, 0 --> comp_fir16243
+comp_fir16243: li %121, 0 --> comp_fir16242
+comp_fir16242: li %122, 0 --> comp_fir16241
+comp_fir16241: li %123, 0 --> comp_fir16240
+comp_fir16240: li %124, 0 --> comp_fir16239
+comp_fir16239: li %125, 0 --> comp_fir16238
+comp_fir16238: li %126, 0 --> comp_fir16237
+comp_fir16237: li %127, 0 --> comp_fir16236
+comp_fir16236: li %128, 0 --> comp_fir16235
+comp_fir16235: li %129, 0 --> comp_fir16234
+comp_fir16234: li %130, 0 --> comp_fir16233
+comp_fir16233: li %131, 0 --> comp_fir16232
+comp_fir16232: li %132, 0 --> comp_fir16231
+comp_fir16231: li %133, 0 --> comp_fir16230
+comp_fir16230: li %134, 0 --> comp_fir16229
+comp_fir16229: li %135, 0 --> comp_fir16228
+comp_fir16228: li %136, 0 --> comp_fir16227
+comp_fir16227: li %137, 0 --> comp_fir16226
+comp_fir16226: li %138, 0 --> comp_fir16225
+comp_fir16225: li %139, 0 --> comp_fir16224
+comp_fir16224: li %140, 0 --> comp_fir16223
+comp_fir16223: li %141, 0 --> comp_fir16222
+comp_fir16222: li %142, 0 --> comp_fir16221
+comp_fir16221: li %143, 0 --> comp_fir16220
+comp_fir16220: li %144, 0 --> comp_fir16219
+comp_fir16219: li %145, 0 --> comp_fir16218
+comp_fir16218: li %146, 0 --> comp_fir16217
+comp_fir16217: li %147, 0 --> comp_fir16216
+comp_fir16216: li %148, 0 --> comp_fir16215
+comp_fir16215: li %149, 0 --> comp_fir16214
+comp_fir16214: li %150, 0 --> comp_fir16213
+comp_fir16213: li %151, 0 --> comp_fir16212
+comp_fir16212: li %152, 0 --> comp_fir16211
+comp_fir16211: li %153, 0 --> comp_fir16184
+comp_fir16184: emit c49 --> comp_fir16183
+comp_fir16183: li %123, 0 --> comp_fir16182
+comp_fir16182: addi %124, STACK, 0 --> comp_fir16181
+comp_fir16181: li %126, 0 --> comp_fir16180
+comp_fir16180: li %127, 4 --> comp_fir16179
+comp_fir16179: mulo %125, %126, %127 --> comp_fir16178
+comp_fir16178: add %142, %124, %125 --> comp_fir16199
+comp_fir16199: sw %123, 0(%142) --> comp_fir16177
+comp_fir16177: emit c48 --> comp_fir16176
+comp_fir16176: li %118, 0 --> comp_fir16175
+comp_fir16175: addi %119, STACK, 0 --> comp_fir16174
+comp_fir16174: li %121, 1 --> comp_fir16173
+comp_fir16173: li %122, 4 --> comp_fir16172
+comp_fir16172: mulo %120, %121, %122 --> comp_fir16171
+comp_fir16171: add %141, %119, %120 --> comp_fir16198
+comp_fir16198: sw %118, 0(%141) --> comp_fir16170
+comp_fir16170: emit c47 --> comp_fir16169
+comp_fir16169: li %113, 0 --> comp_fir16168
+comp_fir16168: addi %114, STACK, 0 --> comp_fir16167
+comp_fir16167: li %116, 2 --> comp_fir16166
+comp_fir16166: li %117, 4 --> comp_fir16165
+comp_fir16165: mulo %115, %116, %117 --> comp_fir16164
+comp_fir16164: add %140, %114, %115 --> comp_fir16197
+comp_fir16197: sw %113, 0(%140) --> comp_fir16163
+comp_fir16163: emit c46 --> comp_fir16162
+comp_fir16162: li %108, 0 --> comp_fir16161
+comp_fir16161: addi %109, STACK, 0 --> comp_fir16160
+comp_fir16160: li %111, 3 --> comp_fir16159
+comp_fir16159: li %112, 4 --> comp_fir16158
+comp_fir16158: mulo %110, %111, %112 --> comp_fir16157
+comp_fir16157: add %139, %109, %110 --> comp_fir16196
+comp_fir16196: sw %108, 0(%139) --> comp_fir16156
+comp_fir16156: emit c45 --> comp_fir16155
+comp_fir16155: li %103, 0 --> comp_fir16154
+comp_fir16154: addi %104, STACK, 0 --> comp_fir16153
+comp_fir16153: li %106, 4 --> comp_fir16152
+comp_fir16152: li %107, 4 --> comp_fir16151
+comp_fir16151: mulo %105, %106, %107 --> comp_fir16150
+comp_fir16150: add %138, %104, %105 --> comp_fir16195
+comp_fir16195: sw %103, 0(%138) --> comp_fir16149
+comp_fir16149: emit c44 --> comp_fir16148
+comp_fir16148: li %98, 0 --> comp_fir16147
+comp_fir16147: addi %99, STACK, 0 --> comp_fir16146
+comp_fir16146: li %101, 5 --> comp_fir16145
+comp_fir16145: li %102, 4 --> comp_fir16144
+comp_fir16144: mulo %100, %101, %102 --> comp_fir16143
+comp_fir16143: add %136, %99, %100 --> comp_fir16193
+comp_fir16193: sw %98, 0(%136) --> comp_fir16142
+comp_fir16142: emit c43 --> comp_fir16141
+comp_fir16141: li %93, 0 --> comp_fir16140
+comp_fir16140: addi %94, STACK, 0 --> comp_fir16139
+comp_fir16139: li %96, 6 --> comp_fir16138
+comp_fir16138: li %97, 4 --> comp_fir16137
+comp_fir16137: mulo %95, %96, %97 --> comp_fir16136
+comp_fir16136: add %135, %94, %95 --> comp_fir16192
+comp_fir16192: sw %93, 0(%135) --> comp_fir16135
+comp_fir16135: emit c42 --> comp_fir16134
+comp_fir16134: li %88, 0 --> comp_fir16133
+comp_fir16133: addi %89, STACK, 0 --> comp_fir16132
+comp_fir16132: li %91, 7 --> comp_fir16131
+comp_fir16131: li %92, 4 --> comp_fir16130
+comp_fir16130: mulo %90, %91, %92 --> comp_fir16129
+comp_fir16129: add %134, %89, %90 --> comp_fir16191
+comp_fir16191: sw %88, 0(%134) --> comp_fir16128
+comp_fir16128: emit c41 --> comp_fir16127
+comp_fir16127: li %83, 0 --> comp_fir16126
+comp_fir16126: addi %84, STACK, 0 --> comp_fir16125
+comp_fir16125: li %86, 8 --> comp_fir16124
+comp_fir16124: li %87, 4 --> comp_fir16123
+comp_fir16123: mulo %85, %86, %87 --> comp_fir16122
+comp_fir16122: add %133, %84, %85 --> comp_fir16190
+comp_fir16190: sw %83, 0(%133) --> comp_fir16121
+comp_fir16121: emit c40 --> comp_fir16120
+comp_fir16120: li %78, 0 --> comp_fir16119
+comp_fir16119: addi %79, STACK, 0 --> comp_fir16118
+comp_fir16118: li %81, 9 --> comp_fir16117
+comp_fir16117: li %82, 4 --> comp_fir16116
+comp_fir16116: mulo %80, %81, %82 --> comp_fir16115
+comp_fir16115: add %132, %79, %80 --> comp_fir16189
+comp_fir16189: sw %78, 0(%132) --> comp_fir16114
+comp_fir16114: emit c39 --> comp_fir16113
+comp_fir16113: li %73, 0 --> comp_fir16112
+comp_fir16112: addi %74, STACK, 0 --> comp_fir16111
+comp_fir16111: li %76, 10 --> comp_fir16110
+comp_fir16110: li %77, 4 --> comp_fir16109
+comp_fir16109: mulo %75, %76, %77 --> comp_fir16108
+comp_fir16108: add %130, %74, %75 --> comp_fir16187
+comp_fir16187: sw %73, 0(%130) --> comp_fir16107
+comp_fir16107: emit c38 --> comp_fir16106
+comp_fir16106: li %68, 0 --> comp_fir16105
+comp_fir16105: addi %69, STACK, 0 --> comp_fir16104
+comp_fir16104: li %71, 11 --> comp_fir16103
+comp_fir16103: li %72, 4 --> comp_fir16102
+comp_fir16102: mulo %70, %71, %72 --> comp_fir16101
+comp_fir16101: add %129, %69, %70 --> comp_fir16186
+comp_fir16186: sw %68, 0(%129) --> comp_fir16100
+comp_fir16100: emit c37 --> comp_fir1699
+comp_fir1699 : li %63, 0 --> comp_fir1698
+comp_fir1698 : addi %64, STACK, 0 --> comp_fir1697
+comp_fir1697 : li %66, 12 --> comp_fir1696
+comp_fir1696 : li %67, 4 --> comp_fir1695
+comp_fir1695 : mulo %65, %66, %67 --> comp_fir1694
+comp_fir1694 : add %153, %64, %65 --> comp_fir16210
+comp_fir16210: sw %63, 0(%153) --> comp_fir1693
+comp_fir1693 : emit c36 --> comp_fir1692
+comp_fir1692 : li %58, 0 --> comp_fir1691
+comp_fir1691 : addi %59, STACK, 0 --> comp_fir1690
+comp_fir1690 : li %61, 13 --> comp_fir1689
+comp_fir1689 : li %62, 4 --> comp_fir1688
+comp_fir1688 : mulo %60, %61, %62 --> comp_fir1687
+comp_fir1687 : add %152, %59, %60 --> comp_fir16209
+comp_fir16209: sw %58, 0(%152) --> comp_fir1686
+comp_fir1686 : emit c35 --> comp_fir1685
+comp_fir1685 : li %53, 0 --> comp_fir1684
+comp_fir1684 : addi %54, STACK, 0 --> comp_fir1683
+comp_fir1683 : li %56, 14 --> comp_fir1682
+comp_fir1682 : li %57, 4 --> comp_fir1681
+comp_fir1681 : mulo %55, %56, %57 --> comp_fir1680
+comp_fir1680 : add %151, %54, %55 --> comp_fir16208
+comp_fir16208: sw %53, 0(%151) --> comp_fir1679
+comp_fir1679 : emit c34 --> comp_fir1678
+comp_fir1678 : li %48, 0 --> comp_fir1677
+comp_fir1677 : addi %49, STACK, 0 --> comp_fir1676
+comp_fir1676 : li %51, 15 --> comp_fir1675
+comp_fir1675 : li %52, 4 --> comp_fir1674
+comp_fir1674 : mulo %50, %51, %52 --> comp_fir1673
+comp_fir1673 : add %150, %49, %50 --> comp_fir16207
+comp_fir16207: sw %48, 0(%150) --> comp_fir1672
+comp_fir1672 : emit c33 --> comp_fir1671
+comp_fir1671 : li %8, 0 --> comp_fir1670
+comp_fir1670 : emit c32 --> comp_fir1669
+comp_fir1669 : li %4, 0 --> comp_fir1668
+comp_fir1668 : emit c31 --> comp_fir1667
+comp_fir1667 : emit c30 --> comp_fir1666
+comp_fir1666 : li %6, 0 --> comp_fir167
+comp_fir167 : j --> comp_fir1665
+comp_fir1665 : li %46, 0 --> comp_fir1664
+comp_fir1664 : emit c29 --> comp_fir1663
+comp_fir1663 : slt %47, %6, %3 --> comp_fir1662
+comp_fir1662 : li %149, 0 --> comp_fir16206
+comp_fir16206: seq %45, %47, %149 --> comp_fir1661
+comp_fir1661 : beq %45, %46 --> comp_fir1660, comp_fir166
+comp_fir166 : emit c17 --> comp_fir165
+comp_fir165 : addi %10, STACK, 0 --> comp_fir164
+comp_fir164 : li %12, 0 --> comp_fir163
+comp_fir163 : li %13, 4 --> comp_fir162
+comp_fir162 : mulo %11, %12, %13 --> comp_fir161
+comp_fir161 : add %128, %10, %11 --> comp_fir16185
+comp_fir16185: lw %9, 0(%128) --> comp_fir160
+comp_fir160 : return %9
+comp_fir1660 : emit c27 --> comp_fir1659
+comp_fir1659 : li %44, 4 --> comp_fir1658
+comp_fir1658 : mulo %43, %6, %44 --> comp_fir1657
+comp_fir1657 : add %148, %0, %43 --> comp_fir16205
+comp_fir16205: lw %39, 0(%148) --> comp_fir1656
+comp_fir1656 : addi %40, STACK, 0 --> comp_fir1655
+comp_fir1655 : li %42, 4 --> comp_fir1654
+comp_fir1654 : mulo %41, %8, %42 --> comp_fir1653
+comp_fir1653 : add %147, %40, %41 --> comp_fir16204
+comp_fir16204: sw %39, 0(%147) --> comp_fir1652
+comp_fir1652 : emit c26 --> comp_fir1651
+comp_fir1651 : emit c25 --> comp_fir1650
+comp_fir1650 : li %7, 0 --> comp_fir1620
+comp_fir1620 : j --> comp_fir1649
+comp_fir1649 : li %36, 0 --> comp_fir1648
+comp_fir1648 : emit c24 --> comp_fir1647
+comp_fir1647 : li %38, 16 --> comp_fir1646
+comp_fir1646 : slt %37, %7, %38 --> comp_fir1645
+comp_fir1645 : li %146, 0 --> comp_fir16203
+comp_fir16203: seq %35, %37, %146 --> comp_fir1644
+comp_fir1644 : beq %35, %36 --> comp_fir1643, comp_fir1619
+comp_fir1619 : emit c19 --> comp_fir1618
+comp_fir1618 : li %19, 1 --> comp_fir1617
+comp_fir1617 : add %17, %8, %19 --> comp_fir1616
+comp_fir1616 : li %18, 16 --> comp_fir1615
+comp_fir1615 : la %137, mod --> comp_fir16194
+comp_fir16194: call %8, %137(%17, %18) --> comp_fir1614
+comp_fir1614 : emit c18 --> comp_fir1613
+comp_fir1613 : li %16, 4 --> comp_fir1612
+comp_fir1612 : mulo %15, %6, %16 --> comp_fir1611
+comp_fir1611 : add %131, %2, %15 --> comp_fir16188
+comp_fir16188: sw %4, 0(%131) --> comp_fir1610
+comp_fir1610 : emit c28 --> comp_fir169
+comp_fir169 : li %14, 1 --> comp_fir168
+comp_fir168 : add %6, %6, %14 --> comp_fir167
+comp_fir1643 : emit c22 --> comp_fir1642
+comp_fir1642 : addi %32, STACK, 0 --> comp_fir1641
+comp_fir1641 : li %34, 4 --> comp_fir1640
+comp_fir1640 : mulo %33, %8, %34 --> comp_fir1639
+comp_fir1639 : add %145, %32, %33 --> comp_fir16202
+comp_fir16202: lw %28, 0(%145) --> comp_fir1638
+comp_fir1638 : li %31, 4 --> comp_fir1637
+comp_fir1637 : mulo %30, %7, %31 --> comp_fir1636
+comp_fir1636 : add %144, %1, %30 --> comp_fir16201
+comp_fir16201: lw %29, 0(%144) --> comp_fir1635
+comp_fir1635 : mulo %24, %28, %29 --> comp_fir1634
+comp_fir1634 : li %26, 2 --> comp_fir1633
+comp_fir1633 : li %27, 16 --> comp_fir1632
+comp_fir1632 : xor %25, %26, %27 --> comp_fir1631
+comp_fir1631 : mulo %5, %24, %25 --> comp_fir1630
+comp_fir1630 : emit c21 --> comp_fir1629
+comp_fir1629 : add %4, %4, %5 --> comp_fir1628
+comp_fir1628 : emit c20 --> comp_fir1627
+comp_fir1627 : li %23, 1 --> comp_fir1626
+comp_fir1626 : add %21, %8, %23 --> comp_fir1625
+comp_fir1625 : li %22, 16 --> comp_fir1624
+comp_fir1624 : la %143, mod --> comp_fir16200
+comp_fir16200: call %8, %143(%21, %22) --> comp_fir1623
+comp_fir1623 : emit c23 --> comp_fir1622
+comp_fir1622 : li %20, 1 --> comp_fir1621
+comp_fir1621 : add %7, %7, %20 --> comp_fir1620
+
+function _main() : %1
+stacksize 64
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78, %79, %80, %81, %82, %83,
+ %84, %85, %86, %87, %88, %89, %90,
+ %91, %92, %93, %94, %95, %96, %97,
+ %98, %99, %100, %101, %102, %103, %104,
+ %105, %106, %107, %108, %109, %110, %111,
+ %112, %113, %114, %115, %116, %117, %118,
+ %119, %120, %121, %122, %123, %124, %125
+entry main297
+main297: li %0, 0 --> main296
+main296: li %2, 0 --> main295
+main295: li %3, 0 --> main294
+main294: li %4, 0 --> main293
+main293: li %5, 0 --> main292
+main292: li %6, 0 --> main291
+main291: li %7, 0 --> main290
+main290: li %8, 0 --> main289
+main289: li %9, 0 --> main288
+main288: li %10, 0 --> main287
+main287: li %11, 0 --> main286
+main286: li %12, 0 --> main285
+main285: li %13, 0 --> main284
+main284: li %14, 0 --> main283
+main283: li %15, 0 --> main282
+main282: li %16, 0 --> main281
+main281: li %17, 0 --> main280
+main280: li %18, 0 --> main279
+main279: li %19, 0 --> main278
+main278: li %20, 0 --> main277
+main277: li %21, 0 --> main276
+main276: li %22, 0 --> main275
+main275: li %23, 0 --> main274
+main274: li %24, 0 --> main273
+main273: li %25, 0 --> main272
+main272: li %26, 0 --> main271
+main271: li %27, 0 --> main270
+main270: li %28, 0 --> main269
+main269: li %29, 0 --> main268
+main268: li %30, 0 --> main267
+main267: li %31, 0 --> main266
+main266: li %32, 0 --> main265
+main265: li %33, 0 --> main264
+main264: li %34, 0 --> main263
+main263: li %35, 0 --> main262
+main262: li %36, 0 --> main261
+main261: li %37, 0 --> main260
+main260: li %38, 0 --> main259
+main259: li %39, 0 --> main258
+main258: li %40, 0 --> main257
+main257: li %41, 0 --> main256
+main256: li %42, 0 --> main255
+main255: li %43, 0 --> main254
+main254: li %44, 0 --> main253
+main253: li %45, 0 --> main252
+main252: li %46, 0 --> main251
+main251: li %47, 0 --> main250
+main250: li %48, 0 --> main249
+main249: li %49, 0 --> main248
+main248: li %50, 0 --> main247
+main247: li %51, 0 --> main246
+main246: li %52, 0 --> main245
+main245: li %53, 0 --> main244
+main244: li %54, 0 --> main243
+main243: li %55, 0 --> main242
+main242: li %56, 0 --> main241
+main241: li %57, 0 --> main240
+main240: li %58, 0 --> main239
+main239: li %59, 0 --> main238
+main238: li %60, 0 --> main237
+main237: li %61, 0 --> main236
+main236: li %62, 0 --> main235
+main235: li %63, 0 --> main234
+main234: li %64, 0 --> main233
+main233: li %65, 0 --> main232
+main232: li %66, 0 --> main231
+main231: li %67, 0 --> main230
+main230: li %68, 0 --> main229
+main229: li %69, 0 --> main228
+main228: li %70, 0 --> main227
+main227: li %71, 0 --> main226
+main226: li %72, 0 --> main225
+main225: li %73, 0 --> main224
+main224: li %74, 0 --> main223
+main223: li %75, 0 --> main222
+main222: li %76, 0 --> main221
+main221: li %77, 0 --> main220
+main220: li %78, 0 --> main219
+main219: li %79, 0 --> main218
+main218: li %80, 0 --> main217
+main217: li %81, 0 --> main216
+main216: li %82, 0 --> main215
+main215: li %83, 0 --> main214
+main214: li %84, 0 --> main213
+main213: li %85, 0 --> main212
+main212: li %86, 0 --> main211
+main211: li %87, 0 --> main210
+main210: li %88, 0 --> main209
+main209: li %89, 0 --> main208
+main208: li %90, 0 --> main207
+main207: li %91, 0 --> main206
+main206: li %92, 0 --> main205
+main205: li %93, 0 --> main204
+main204: li %94, 0 --> main203
+main203: li %95, 0 --> main202
+main202: li %96, 0 --> main201
+main201: li %97, 0 --> main200
+main200: li %98, 0 --> main199
+main199: li %99, 0 --> main198
+main198: li %100, 0 --> main197
+main197: li %101, 0 --> main196
+main196: li %102, 0 --> main195
+main195: li %103, 0 --> main194
+main194: li %104, 0 --> main193
+main193: li %105, 0 --> main192
+main192: li %106, 0 --> main191
+main191: li %107, 0 --> main190
+main190: li %108, 0 --> main189
+main189: li %109, 0 --> main188
+main188: li %110, 0 --> main187
+main187: li %111, 0 --> main186
+main186: li %112, 0 --> main185
+main185: li %113, 0 --> main184
+main184: li %114, 0 --> main183
+main183: li %115, 0 --> main182
+main182: li %116, 0 --> main181
+main181: li %117, 0 --> main180
+main180: li %118, 0 --> main179
+main179: li %119, 0 --> main178
+main178: li %120, 0 --> main177
+main177: li %121, 0 --> main176
+main176: li %122, 0 --> main175
+main175: li %123, 0 --> main174
+main174: li %124, 0 --> main173
+main173: li %125, 0 --> main149
+main149: emit c165 --> main148
+main148: li %98, 10 --> main147
+main147: addi %99, STACK, 0 --> main146
+main146: li %101, 0 --> main145
+main145: li %102, 4 --> main144
+main144: mulo %100, %101, %102 --> main143
+main143: add %110, %99, %100 --> main157
+main157: sw %98, 0(%110) --> main142
+main142: emit c164 --> main141
+main141: li %93, 9 --> main140
+main140: addi %94, STACK, 0 --> main139
+main139: li %96, 1 --> main138
+main138: li %97, 4 --> main137
+main137: mulo %95, %96, %97 --> main136
+main136: add %109, %94, %95 --> main156
+main156: sw %93, 0(%109) --> main135
+main135: emit c163 --> main134
+main134: li %88, 8 --> main133
+main133: addi %89, STACK, 0 --> main132
+main132: li %91, 2 --> main131
+main131: li %92, 4 --> main130
+main130: mulo %90, %91, %92 --> main129
+main129: add %108, %89, %90 --> main155
+main155: sw %88, 0(%108) --> main128
+main128: emit c162 --> main127
+main127: li %83, 7 --> main126
+main126: addi %84, STACK, 0 --> main125
+main125: li %86, 3 --> main124
+main124: li %87, 4 --> main123
+main123: mulo %85, %86, %87 --> main122
+main122: add %107, %84, %85 --> main154
+main154: sw %83, 0(%107) --> main121
+main121: emit c161 --> main120
+main120: li %78, 6 --> main119
+main119: addi %79, STACK, 0 --> main118
+main118: li %81, 4 --> main117
+main117: li %82, 4 --> main116
+main116: mulo %80, %81, %82 --> main115
+main115: add %106, %79, %80 --> main153
+main153: sw %78, 0(%106) --> main114
+main114: emit c160 --> main113
+main113: li %73, 0 --> main112
+main112: addi %74, STACK, 0 --> main111
+main111: li %76, 5 --> main110
+main110: li %77, 4 --> main109
+main109: mulo %75, %76, %77 --> main108
+main108: add %104, %74, %75 --> main151
+main151: sw %73, 0(%104) --> main107
+main107: emit c159 --> main106
+main106: li %68, 5 --> main105
+main105: addi %69, STACK, 0 --> main104
+main104: li %71, 6 --> main103
+main103: li %72, 4 --> main102
+main102: mulo %70, %71, %72 --> main101
+main101: add %103, %69, %70 --> main150
+main150: sw %68, 0(%103) --> main100
+main100: emit c158 --> main99
+main99 : li %63, 4 --> main98
+main98 : addi %64, STACK, 0 --> main97
+main97 : li %66, 7 --> main96
+main96 : li %67, 4 --> main95
+main95 : mulo %65, %66, %67 --> main94
+main94 : add %125, %64, %65 --> main172
+main172: sw %63, 0(%125) --> main93
+main93 : emit c157 --> main92
+main92 : li %58, 3 --> main91
+main91 : addi %59, STACK, 0 --> main90
+main90 : li %61, 8 --> main89
+main89 : li %62, 4 --> main88
+main88 : mulo %60, %61, %62 --> main87
+main87 : add %124, %59, %60 --> main171
+main171: sw %58, 0(%124) --> main86
+main86 : emit c156 --> main85
+main85 : li %53, 2 --> main84
+main84 : addi %54, STACK, 0 --> main83
+main83 : li %56, 9 --> main82
+main82 : li %57, 4 --> main81
+main81 : mulo %55, %56, %57 --> main80
+main80 : add %123, %54, %55 --> main170
+main170: sw %53, 0(%123) --> main79
+main79 : emit c155 --> main78
+main78 : li %48, 0 --> main77
+main77 : addi %49, STACK, 0 --> main76
+main76 : li %51, 10 --> main75
+main75 : li %52, 4 --> main74
+main74 : mulo %50, %51, %52 --> main73
+main73 : add %122, %49, %50 --> main169
+main169: sw %48, 0(%122) --> main72
+main72 : emit c154 --> main71
+main71 : li %43, 0 --> main70
+main70 : addi %44, STACK, 0 --> main69
+main69 : li %46, 11 --> main68
+main68 : li %47, 4 --> main67
+main67 : mulo %45, %46, %47 --> main66
+main66 : add %121, %44, %45 --> main168
+main168: sw %43, 0(%121) --> main65
+main65 : emit c153 --> main64
+main64 : li %38, 0 --> main63
+main63 : addi %39, STACK, 0 --> main62
+main62 : li %41, 12 --> main61
+main61 : li %42, 4 --> main60
+main60 : mulo %40, %41, %42 --> main59
+main59 : add %120, %39, %40 --> main167
+main167: sw %38, 0(%120) --> main58
+main58 : emit c152 --> main57
+main57 : li %33, 0 --> main56
+main56 : addi %34, STACK, 0 --> main55
+main55 : li %36, 13 --> main54
+main54 : li %37, 4 --> main53
+main53 : mulo %35, %36, %37 --> main52
+main52 : add %119, %34, %35 --> main166
+main166: sw %33, 0(%119) --> main51
+main51 : emit c151 --> main50
+main50 : li %28, 0 --> main49
+main49 : addi %29, STACK, 0 --> main48
+main48 : li %31, 14 --> main47
+main47 : li %32, 4 --> main46
+main46 : mulo %30, %31, %32 --> main45
+main45 : add %117, %29, %30 --> main164
+main164: sw %28, 0(%117) --> main44
+main44 : emit c150 --> main43
+main43 : li %23, 0 --> main42
+main42 : addi %24, STACK, 0 --> main41
+main41 : li %26, 15 --> main40
+main40 : li %27, 4 --> main39
+main39 : mulo %25, %26, %27 --> main38
+main38 : add %116, %24, %25 --> main163
+main163: sw %23, 0(%116) --> main37
+main37 : emit c149 --> main36
+main36 : addi %18, STACK, 0 --> main35
+main35 : addi %19, STACK, 0 --> main34
+main34 : addi %20, STACK, 0 --> main33
+main33 : li %21, 10 --> main32
+main32 : li %22, 10 --> main31
+main31 : la %115, comp_fir_basic --> main162
+main162: call %0, %115(%18, %19, %20, %21, %22) --> main30
+main30 : emit c148 --> main29
+main29 : addi %14, STACK, 0 --> main28
+main28 : addi %15, STACK, 0 --> main27
+main27 : addi %16, STACK, 0 --> main26
+main26 : li %17, 16 --> main25
+main25 : la %113, comp_fir16 --> main160
+main160: call %0, %113(%14, %15, %16, %17) --> main24
+main24 : emit c147 --> main23
+main23 : li %11, 4 --> main22
+main22 : li %12, 1 --> main21
+main21 : li %13, 1 --> main20
+main20 : la %112, comp_ifFor --> main159
+main159: call %0, %112(%11, %12, %13) --> main19
+main19 : emit c146 --> main18
+main18 : addi %8, STACK, 0 --> main17
+main17 : li %9, 9 --> main16
+main16 : li %10, 3 --> main15
+main15 : la %111, comp_total --> main158
+main158: call %0, %111(%8, %9, %10) --> main14
+main14 : emit c145 --> main13
+main13 : addi %6, STACK, 0 --> main12
+main12 : li %7, 10 --> main11
+main11 : la %105, comp_tri --> main152
+main152: call %0, %105(%6, %7) --> main10
+main10 : emit c144 --> main9
+main9 : addi %2, STACK, 0 --> main8
+main8 : addi %3, STACK, 0 --> main7
+main7 : li %4, 10 --> main6
+main6 : li %5, 10 --> main5
+main5 : la %118, comp_forif2 --> main165
+main165: call %0, %118(%2, %3, %4, %5) --> main4
+main4 : emit c143 --> main3
+main3 : la %114, comp_forif --> main161
+main161: call %0, %114() --> main2
+main2 : emit c142 --> main1
+main1 : move %1, %0 --> main0
+main0 : return %1
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program: (main function is "main")
+
+
+ globals:
+
+
+ "__builtin___memcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memmove_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___mempcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memset_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___stpcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strcat_chk": int -> int -> int -> int
+
+
+ "__builtin___strcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strncat_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___strncpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vfprintf_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vprintf_chk": int -> int -> int -> int
+
+
+ "__builtin___vsnprintf_chk": int -> int -> int -> int -> int -> int -> int
+
+
+ "__builtin___vsprintf_chk": int -> int -> int -> int -> int -> int
+
+
+ "__builtin_acos": float -> float
+
+
+ "__builtin_acosf": float -> float
+
+
+ "__builtin_acosl": float -> float
+
+
+ "__builtin_alloca": int -> int
+
+
+ "__builtin_asin": float -> float
+
+
+ "__builtin_asinf": float -> float
+
+
+ "__builtin_asinl": float -> float
+
+
+ "__builtin_atan": float -> float
+
+
+ "__builtin_atanf": float -> float
+
+
+ "__builtin_atanl": float -> float
+
+
+ "__builtin_atan2": float -> float -> float
+
+
+ "__builtin_atan2f": float -> float -> float
+
+
+ "__builtin_atan2l": float -> float -> float
+
+
+ "__builtin_ceil": float -> float
+
+
+ "__builtin_ceilf": float -> float
+
+
+ "__builtin_ceill": float -> float
+
+
+ "__builtin_cos": float -> float
+
+
+ "__builtin_cosf": float -> float
+
+
+ "__builtin_cosl": float -> float
+
+
+ "__builtin_cosh": float -> float
+
+
+ "__builtin_coshf": float -> float
+
+
+ "__builtin_coshl": float -> float
+
+
+ "__builtin_clz": int -> int
+
+
+ "__builtin_clzl": int -> int
+
+
+ "__builtin_clzll": int -> int
+
+
+ "__builtin_constant_p": int -> int
+
+
+ "__builtin_ctz": int -> int
+
+
+ "__builtin_ctzl": int -> int
+
+
+ "__builtin_ctzll": int -> int
+
+
+ "__builtin_exp": float -> float
+
+
+ "__builtin_expf": float -> float
+
+
+ "__builtin_expl": float -> float
+
+
+ "__builtin_expect": int -> int -> int
+
+
+ "__builtin_fabs": float -> float
+
+
+ "__builtin_fabsf": float -> float
+
+
+ "__builtin_fabsl": float -> float
+
+
+ "__builtin_ffs": int -> int
+
+
+ "__builtin_ffsl": int -> int
+
+
+ "__builtin_ffsll": int -> int
+
+
+ "__builtin_frame_address": int -> int
+
+
+ "__builtin_floor": float -> float
+
+
+ "__builtin_floorf": float -> float
+
+
+ "__builtin_floorl": float -> float
+
+
+ "__builtin_huge_val": float
+
+
+ "__builtin_huge_valf": float
+
+
+ "__builtin_huge_vall": float
+
+
+ "__builtin_inf": float
+
+
+ "__builtin_inff": float
+
+
+ "__builtin_infl": float
+
+
+ "__builtin_memcpy": int -> int -> int -> int
+
+
+ "__builtin_mempcpy": int -> int -> int -> int
+
+
+ "__builtin_fmod": float -> float
+
+
+ "__builtin_fmodf": float -> float
+
+
+ "__builtin_fmodl": float -> float
+
+
+ "__builtin_frexp": float -> int -> float
+
+
+ "__builtin_frexpf": float -> int -> float
+
+
+ "__builtin_frexpl": float -> int -> float
+
+
+ "__builtin_ldexp": float -> int -> float
+
+
+ "__builtin_ldexpf": float -> int -> float
+
+
+ "__builtin_ldexpl": float -> int -> float
+
+
+ "__builtin_log": float -> float
+
+
+ "__builtin_logf": float -> float
+
+
+ "__builtin_logl": float -> float
+
+
+ "__builtin_log10": float -> float
+
+
+ "__builtin_log10f": float -> float
+
+
+ "__builtin_log10l": float -> float
+
+
+ "__builtin_modff": float -> int -> float
+
+
+ "__builtin_modfl": float -> int -> float
+
+
+ "__builtin_nan": int -> float
+
+
+ "__builtin_nanf": int -> float
+
+
+ "__builtin_nanl": int -> float
+
+
+ "__builtin_nans": int -> float
+
+
+ "__builtin_nansf": int -> float
+
+
+ "__builtin_nansl": int -> float
+
+
+ "__builtin_next_arg": int
+
+
+ "__builtin_object_size": int -> int -> int
+
+
+ "__builtin_parity": int -> int
+
+
+ "__builtin_parityl": int -> int
+
+
+ "__builtin_parityll": int -> int
+
+
+ "__builtin_popcount": int -> int
+
+
+ "__builtin_popcountl": int -> int
+
+
+ "__builtin_popcountll": int -> int
+
+
+ "__builtin_powi": float -> int -> float
+
+
+ "__builtin_powif": float -> int -> float
+
+
+ "__builtin_powil": float -> int -> float
+
+
+ "__builtin_return": int -> void
+
+
+ "__builtin_return_address": int -> int
+
+
+ "__builtin_sin": float -> float
+
+
+ "__builtin_sinf": float -> float
+
+
+ "__builtin_sinl": float -> float
+
+
+ "__builtin_sinh": float -> float
+
+
+ "__builtin_sinhf": float -> float
+
+
+ "__builtin_sinhl": float -> float
+
+
+ "__builtin_sqrt": float -> float
+
+
+ "__builtin_sqrtf": float -> float
+
+
+ "__builtin_sqrtl": float -> float
+
+
+ "__builtin_stpcpy": int -> int -> int
+
+
+ "__builtin_strchr": int -> int -> int
+
+
+ "__builtin_strcmp": int -> int -> int
+
+
+ "__builtin_strcpy": int -> int -> int
+
+
+ "__builtin_strcspn": int -> int -> int
+
+
+ "__builtin_strncat": int -> int -> int -> int
+
+
+ "__builtin_strncmp": int -> int -> int -> int
+
+
+ "__builtin_strncpy": int -> int -> int -> int
+
+
+ "__builtin_strspn": int -> int -> int
+
+
+ "__builtin_strpbrk": int -> int -> int
+
+
+ "__builtin_types_compatible_p": int -> int -> int
+
+
+ "__builtin_tan": float -> float
+
+
+ "__builtin_tanf": float -> float
+
+
+ "__builtin_tanl": float -> float
+
+
+ "__builtin_tanh": float -> float
+
+
+ "__builtin_tanhf": float -> float
+
+
+ "__builtin_tanhl": float -> float
+
+
+ "__builtin_va_end": int -> void
+
+
+ "__builtin_varargs_start": int -> void
+
+
+ "__builtin_va_start": int -> int -> void
+
+
+ "__builtin_stdarg_start": int -> void
+
+
+ "__builtin_va_arg": int -> int -> void
+
+
+ "__builtin_va_copy": int -> int -> void
+
+
+ "comp_fir_basic"(%0, %1, %2, %3, %4): int -> int -> int -> int -> int -> int
+ locals: %9, %5, %6, %7, %8, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31, %32, %33, %34, %35, %36, %37, %38, %39, %40, %41, %42, %43, %44
+ result: %9
+ stacksize: 0
+ entry: comp_fir_basic69
+ exit: comp_fir_basic0
+
+ comp_fir_basic9: imm_int 1, %11, --> comp_fir_basic8
+ comp_fir_basic8: sub %7, %7, %11 --> comp_fir_basic7
+ comp_fir_basic7: --> comp_fir_basic25
+ comp_fir_basic69: emit c16 --> comp_fir_basic68
+ comp_fir_basic68: imm_int 0, %5, --> comp_fir_basic67
+ comp_fir_basic67: emit c15 --> comp_fir_basic66
+ comp_fir_basic66: emit c14 --> comp_fir_basic65
+ comp_fir_basic65: imm_int 0, %6, --> comp_fir_basic3
+ comp_fir_basic64: imm_int 0, %42, --> comp_fir_basic63
+ comp_fir_basic63: emit c13 --> comp_fir_basic62
+ comp_fir_basic62: imm_int 3, %44, --> comp_fir_basic61
+ comp_fir_basic61: lt %43, %6, %44 --> comp_fir_basic60
+ comp_fir_basic60: notbool %41, %43 --> comp_fir_basic59
+ comp_fir_basic6: emit c12 --> comp_fir_basic5
+ comp_fir_basic59: eq %41, %42 --> comp_fir_basic58, comp_fir_basic2
+ comp_fir_basic58: emit c11 --> comp_fir_basic57
+ comp_fir_basic57: imm_int 4, %40, --> comp_fir_basic56
+ comp_fir_basic56: mul %39, %6, %40 --> comp_fir_basic55
+ comp_fir_basic55: load int32, add, %0, %39, %35 --> comp_fir_basic54
+ comp_fir_basic54: imm_int 0, %37, --> comp_fir_basic53
+ comp_fir_basic53: imm_int 4, %38, --> comp_fir_basic52
+ comp_fir_basic52: mul %36, %37, %38 --> comp_fir_basic51
+ comp_fir_basic51: store int32, add, %2, %36, %35 --> comp_fir_basic50
+ comp_fir_basic50: emit c10 --> comp_fir_basic49
+ comp_fir_basic5: imm_int 1, %10, --> comp_fir_basic4
+ comp_fir_basic49: emit c9 --> comp_fir_basic48
+ comp_fir_basic48: imm_int 0, %8, --> comp_fir_basic29
+ comp_fir_basic47: imm_int 0, %32, --> comp_fir_basic46
+ comp_fir_basic46: emit c8 --> comp_fir_basic45
+ comp_fir_basic45: imm_int 3, %34, --> comp_fir_basic44
+ comp_fir_basic44: lt %33, %8, %34 --> comp_fir_basic43
+ comp_fir_basic43: notbool %31, %33 --> comp_fir_basic42
+ comp_fir_basic42: eq %31, %32 --> comp_fir_basic41, comp_fir_basic28
+ comp_fir_basic41: emit c6 --> comp_fir_basic40
+ comp_fir_basic40: imm_int 4, %30, --> comp_fir_basic39
+ comp_fir_basic4: add %6, %6, %10 --> comp_fir_basic3
+ comp_fir_basic39: mul %29, %8, %30 --> comp_fir_basic38
+ comp_fir_basic38: load int32, add, %1, %29, %25 --> comp_fir_basic37
+ comp_fir_basic37: imm_int 4, %28, --> comp_fir_basic36
+ comp_fir_basic36: mul %27, %8, %28 --> comp_fir_basic35
+ comp_fir_basic35: load int32, add, %2, %27, %26 --> comp_fir_basic34
+ comp_fir_basic34: mul %24, %25, %26 --> comp_fir_basic33
+ comp_fir_basic33: add %5, %5, %24 --> comp_fir_basic32
+ comp_fir_basic32: emit c7 --> comp_fir_basic31
+ comp_fir_basic31: imm_int 1, %23, --> comp_fir_basic30
+ comp_fir_basic30: add %8, %8, %23 --> comp_fir_basic29
+ comp_fir_basic3: --> comp_fir_basic64
+ comp_fir_basic29: --> comp_fir_basic47
+ comp_fir_basic28: emit c5 --> comp_fir_basic27
+ comp_fir_basic27: emit c4 --> comp_fir_basic26
+ comp_fir_basic26: imm_int 2, %7, --> comp_fir_basic7
+ comp_fir_basic25: imm_int 0, %20, --> comp_fir_basic24
+ comp_fir_basic24: emit c3 --> comp_fir_basic23
+ comp_fir_basic23: imm_int 0, %22, --> comp_fir_basic22
+ comp_fir_basic22: ge %21, %7, %22 --> comp_fir_basic21
+ comp_fir_basic21: notbool %19, %21 --> comp_fir_basic20
+ comp_fir_basic20: eq %19, %20 --> comp_fir_basic19, comp_fir_basic6
+ comp_fir_basic2: emit c0 --> comp_fir_basic1
+ comp_fir_basic19: emit c1 --> comp_fir_basic18
+ comp_fir_basic18: imm_int 4, %18, --> comp_fir_basic17
+ comp_fir_basic17: mul %17, %7, %18 --> comp_fir_basic16
+ comp_fir_basic16: load int32, add, %2, %17, %12 --> comp_fir_basic15
+ comp_fir_basic15: imm_int 1, %16, --> comp_fir_basic14
+ comp_fir_basic14: add %14, %7, %16 --> comp_fir_basic13
+ comp_fir_basic13: imm_int 4, %15, --> comp_fir_basic12
+ comp_fir_basic12: mul %13, %14, %15 --> comp_fir_basic11
+ comp_fir_basic11: store int32, add, %2, %13, %12 --> comp_fir_basic10
+ comp_fir_basic10: emit c2 --> comp_fir_basic9
+ comp_fir_basic1: mov %9, %5 --> comp_fir_basic0
+ comp_fir_basic0: return %9
+
+
+ "comp_fir16"(%0, %1, %2, %3): int -> int -> int -> int -> int
+ locals: %9, %4, %5, %6, %7, %8, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31, %32, %33, %34, %35, %36, %37, %38, %39, %40, %41, %42, %43, %44, %45, %46, %47, %48, %49, %50, %51, %52, %53, %54, %55, %56, %57, %58, %59, %60, %61, %62, %63, %64, %65, %66, %67, %68, %69, %70, %71, %72, %73, %74, %75, %76, %77, %78, %79, %80, %81, %82, %83, %84, %85, %86, %87, %88, %89, %90, %91, %92, %93, %94, %95, %96, %97, %98, %99, %100, %101, %102, %103, %104, %105, %106, %107, %108, %109, %110, %111, %112, %113, %114, %115, %116, %117, %118, %119, %120, %121, %122, %123, %124, %125, %126, %127
+ result: %9
+ stacksize: 64
+ entry: comp_fir16184
+ exit: comp_fir160
+
+ comp_fir1699: imm_int 0, %63, --> comp_fir1698
+ comp_fir1698: imm_addr 0($sp), %64, --> comp_fir1697
+ comp_fir1697: imm_int 12, %66, --> comp_fir1696
+ comp_fir1696: imm_int 4, %67, --> comp_fir1695
+ comp_fir1695: mul %65, %66, %67 --> comp_fir1694
+ comp_fir1694: store int32, add, %64, %65, %63 --> comp_fir1693
+ comp_fir1693: emit c36 --> comp_fir1692
+ comp_fir1692: imm_int 0, %58, --> comp_fir1691
+ comp_fir1691: imm_addr 0($sp), %59, --> comp_fir1690
+ comp_fir1690: imm_int 13, %61, --> comp_fir1689
+ comp_fir169: imm_int 1, %14, --> comp_fir168
+ comp_fir1689: imm_int 4, %62, --> comp_fir1688
+ comp_fir1688: mul %60, %61, %62 --> comp_fir1687
+ comp_fir1687: store int32, add, %59, %60, %58 --> comp_fir1686
+ comp_fir1686: emit c35 --> comp_fir1685
+ comp_fir1685: imm_int 0, %53, --> comp_fir1684
+ comp_fir1684: imm_addr 0($sp), %54, --> comp_fir1683
+ comp_fir1683: imm_int 14, %56, --> comp_fir1682
+ comp_fir1682: imm_int 4, %57, --> comp_fir1681
+ comp_fir1681: mul %55, %56, %57 --> comp_fir1680
+ comp_fir1680: store int32, add, %54, %55, %53 --> comp_fir1679
+ comp_fir168: add %6, %6, %14 --> comp_fir167
+ comp_fir1679: emit c34 --> comp_fir1678
+ comp_fir1678: imm_int 0, %48, --> comp_fir1677
+ comp_fir1677: imm_addr 0($sp), %49, --> comp_fir1676
+ comp_fir1676: imm_int 15, %51, --> comp_fir1675
+ comp_fir1675: imm_int 4, %52, --> comp_fir1674
+ comp_fir1674: mul %50, %51, %52 --> comp_fir1673
+ comp_fir1673: store int32, add, %49, %50, %48 --> comp_fir1672
+ comp_fir1672: emit c33 --> comp_fir1671
+ comp_fir1671: imm_int 0, %8, --> comp_fir1670
+ comp_fir1670: emit c32 --> comp_fir1669
+ comp_fir167: --> comp_fir1665
+ comp_fir1669: imm_int 0, %4, --> comp_fir1668
+ comp_fir1668: emit c31 --> comp_fir1667
+ comp_fir1667: emit c30 --> comp_fir1666
+ comp_fir1666: imm_int 0, %6, --> comp_fir167
+ comp_fir1665: imm_int 0, %46, --> comp_fir1664
+ comp_fir1664: emit c29 --> comp_fir1663
+ comp_fir1663: lt %47, %6, %3 --> comp_fir1662
+ comp_fir1662: notbool %45, %47 --> comp_fir1661
+ comp_fir1661: eq %45, %46 --> comp_fir1660, comp_fir166
+ comp_fir1660: emit c27 --> comp_fir1659
+ comp_fir166: emit c17 --> comp_fir165
+ comp_fir1659: imm_int 4, %44, --> comp_fir1658
+ comp_fir1658: mul %43, %6, %44 --> comp_fir1657
+ comp_fir1657: load int32, add, %0, %43, %39 --> comp_fir1656
+ comp_fir1656: imm_addr 0($sp), %40, --> comp_fir1655
+ comp_fir1655: imm_int 4, %42, --> comp_fir1654
+ comp_fir1654: mul %41, %8, %42 --> comp_fir1653
+ comp_fir1653: store int32, add, %40, %41, %39 --> comp_fir1652
+ comp_fir1652: emit c26 --> comp_fir1651
+ comp_fir1651: emit c25 --> comp_fir1650
+ comp_fir1650: imm_int 0, %7, --> comp_fir1620
+ comp_fir165: imm_addr 0($sp), %10, --> comp_fir164
+ comp_fir1649: imm_int 0, %36, --> comp_fir1648
+ comp_fir1648: emit c24 --> comp_fir1647
+ comp_fir1647: imm_int 16, %38, --> comp_fir1646
+ comp_fir1646: lt %37, %7, %38 --> comp_fir1645
+ comp_fir1645: notbool %35, %37 --> comp_fir1644
+ comp_fir1644: eq %35, %36 --> comp_fir1643, comp_fir1619
+ comp_fir1643: emit c22 --> comp_fir1642
+ comp_fir1642: imm_addr 0($sp), %32, --> comp_fir1641
+ comp_fir1641: imm_int 4, %34, --> comp_fir1640
+ comp_fir1640: mul %33, %8, %34 --> comp_fir1639
+ comp_fir164: imm_int 0, %12, --> comp_fir163
+ comp_fir1639: load int32, add, %32, %33, %28 --> comp_fir1638
+ comp_fir1638: imm_int 4, %31, --> comp_fir1637
+ comp_fir1637: mul %30, %7, %31 --> comp_fir1636
+ comp_fir1636: load int32, add, %1, %30, %29 --> comp_fir1635
+ comp_fir1635: mul %24, %28, %29 --> comp_fir1634
+ comp_fir1634: imm_int 2, %26, --> comp_fir1633
+ comp_fir1633: imm_int 16, %27, --> comp_fir1632
+ comp_fir1632: xor %25, %26, %27 --> comp_fir1631
+ comp_fir1631: mul %5, %24, %25 --> comp_fir1630
+ comp_fir1630: emit c21 --> comp_fir1629
+ comp_fir163: imm_int 4, %13, --> comp_fir162
+ comp_fir1629: add %4, %4, %5 --> comp_fir1628
+ comp_fir1628: emit c20 --> comp_fir1627
+ comp_fir1627: imm_int 1, %23, --> comp_fir1626
+ comp_fir1626: add %21, %8, %23 --> comp_fir1625
+ comp_fir1625: imm_int 16, %22, --> comp_fir1624
+ comp_fir1624: mod %8, %21, %22 --> comp_fir1623
+ comp_fir1623: emit c23 --> comp_fir1622
+ comp_fir1622: imm_int 1, %20, --> comp_fir1621
+ comp_fir1621: add %7, %7, %20 --> comp_fir1620
+ comp_fir1620: --> comp_fir1649
+ comp_fir162: mul %11, %12, %13 --> comp_fir161
+ comp_fir1619: emit c19 --> comp_fir1618
+ comp_fir16184: emit c49 --> comp_fir16183
+ comp_fir16183: imm_int 0, %123, --> comp_fir16182
+ comp_fir16182: imm_addr 0($sp), %124, --> comp_fir16181
+ comp_fir16181: imm_int 0, %126, --> comp_fir16180
+ comp_fir16180: imm_int 4, %127, --> comp_fir16179
+ comp_fir1618: imm_int 1, %19, --> comp_fir1617
+ comp_fir16179: mul %125, %126, %127 --> comp_fir16178
+ comp_fir16178: store int32, add, %124, %125, %123 --> comp_fir16177
+ comp_fir16177: emit c48 --> comp_fir16176
+ comp_fir16176: imm_int 0, %118, --> comp_fir16175
+ comp_fir16175: imm_addr 0($sp), %119, --> comp_fir16174
+ comp_fir16174: imm_int 1, %121, --> comp_fir16173
+ comp_fir16173: imm_int 4, %122, --> comp_fir16172
+ comp_fir16172: mul %120, %121, %122 --> comp_fir16171
+ comp_fir16171: store int32, add, %119, %120, %118 --> comp_fir16170
+ comp_fir16170: emit c47 --> comp_fir16169
+ comp_fir1617: add %17, %8, %19 --> comp_fir1616
+ comp_fir16169: imm_int 0, %113, --> comp_fir16168
+ comp_fir16168: imm_addr 0($sp), %114, --> comp_fir16167
+ comp_fir16167: imm_int 2, %116, --> comp_fir16166
+ comp_fir16166: imm_int 4, %117, --> comp_fir16165
+ comp_fir16165: mul %115, %116, %117 --> comp_fir16164
+ comp_fir16164: store int32, add, %114, %115, %113 --> comp_fir16163
+ comp_fir16163: emit c46 --> comp_fir16162
+ comp_fir16162: imm_int 0, %108, --> comp_fir16161
+ comp_fir16161: imm_addr 0($sp), %109, --> comp_fir16160
+ comp_fir16160: imm_int 3, %111, --> comp_fir16159
+ comp_fir1616: imm_int 16, %18, --> comp_fir1615
+ comp_fir16159: imm_int 4, %112, --> comp_fir16158
+ comp_fir16158: mul %110, %111, %112 --> comp_fir16157
+ comp_fir16157: store int32, add, %109, %110, %108 --> comp_fir16156
+ comp_fir16156: emit c45 --> comp_fir16155
+ comp_fir16155: imm_int 0, %103, --> comp_fir16154
+ comp_fir16154: imm_addr 0($sp), %104, --> comp_fir16153
+ comp_fir16153: imm_int 4, %106, --> comp_fir16152
+ comp_fir16152: imm_int 4, %107, --> comp_fir16151
+ comp_fir16151: mul %105, %106, %107 --> comp_fir16150
+ comp_fir16150: store int32, add, %104, %105, %103 --> comp_fir16149
+ comp_fir1615: mod %8, %17, %18 --> comp_fir1614
+ comp_fir16149: emit c44 --> comp_fir16148
+ comp_fir16148: imm_int 0, %98, --> comp_fir16147
+ comp_fir16147: imm_addr 0($sp), %99, --> comp_fir16146
+ comp_fir16146: imm_int 5, %101, --> comp_fir16145
+ comp_fir16145: imm_int 4, %102, --> comp_fir16144
+ comp_fir16144: mul %100, %101, %102 --> comp_fir16143
+ comp_fir16143: store int32, add, %99, %100, %98 --> comp_fir16142
+ comp_fir16142: emit c43 --> comp_fir16141
+ comp_fir16141: imm_int 0, %93, --> comp_fir16140
+ comp_fir16140: imm_addr 0($sp), %94, --> comp_fir16139
+ comp_fir1614: emit c18 --> comp_fir1613
+ comp_fir16139: imm_int 6, %96, --> comp_fir16138
+ comp_fir16138: imm_int 4, %97, --> comp_fir16137
+ comp_fir16137: mul %95, %96, %97 --> comp_fir16136
+ comp_fir16136: store int32, add, %94, %95, %93 --> comp_fir16135
+ comp_fir16135: emit c42 --> comp_fir16134
+ comp_fir16134: imm_int 0, %88, --> comp_fir16133
+ comp_fir16133: imm_addr 0($sp), %89, --> comp_fir16132
+ comp_fir16132: imm_int 7, %91, --> comp_fir16131
+ comp_fir16131: imm_int 4, %92, --> comp_fir16130
+ comp_fir16130: mul %90, %91, %92 --> comp_fir16129
+ comp_fir1613: imm_int 4, %16, --> comp_fir1612
+ comp_fir16129: store int32, add, %89, %90, %88 --> comp_fir16128
+ comp_fir16128: emit c41 --> comp_fir16127
+ comp_fir16127: imm_int 0, %83, --> comp_fir16126
+ comp_fir16126: imm_addr 0($sp), %84, --> comp_fir16125
+ comp_fir16125: imm_int 8, %86, --> comp_fir16124
+ comp_fir16124: imm_int 4, %87, --> comp_fir16123
+ comp_fir16123: mul %85, %86, %87 --> comp_fir16122
+ comp_fir16122: store int32, add, %84, %85, %83 --> comp_fir16121
+ comp_fir16121: emit c40 --> comp_fir16120
+ comp_fir16120: imm_int 0, %78, --> comp_fir16119
+ comp_fir1612: mul %15, %6, %16 --> comp_fir1611
+ comp_fir16119: imm_addr 0($sp), %79, --> comp_fir16118
+ comp_fir16118: imm_int 9, %81, --> comp_fir16117
+ comp_fir16117: imm_int 4, %82, --> comp_fir16116
+ comp_fir16116: mul %80, %81, %82 --> comp_fir16115
+ comp_fir16115: store int32, add, %79, %80, %78 --> comp_fir16114
+ comp_fir16114: emit c39 --> comp_fir16113
+ comp_fir16113: imm_int 0, %73, --> comp_fir16112
+ comp_fir16112: imm_addr 0($sp), %74, --> comp_fir16111
+ comp_fir16111: imm_int 10, %76, --> comp_fir16110
+ comp_fir16110: imm_int 4, %77, --> comp_fir16109
+ comp_fir1611: store int32, add, %2, %15, %4 --> comp_fir1610
+ comp_fir16109: mul %75, %76, %77 --> comp_fir16108
+ comp_fir16108: store int32, add, %74, %75, %73 --> comp_fir16107
+ comp_fir16107: emit c38 --> comp_fir16106
+ comp_fir16106: imm_int 0, %68, --> comp_fir16105
+ comp_fir16105: imm_addr 0($sp), %69, --> comp_fir16104
+ comp_fir16104: imm_int 11, %71, --> comp_fir16103
+ comp_fir16103: imm_int 4, %72, --> comp_fir16102
+ comp_fir16102: mul %70, %71, %72 --> comp_fir16101
+ comp_fir16101: store int32, add, %69, %70, %68 --> comp_fir16100
+ comp_fir16100: emit c37 --> comp_fir1699
+ comp_fir1610: emit c28 --> comp_fir169
+ comp_fir161: load int32, add, %10, %11, %9 --> comp_fir160
+ comp_fir160: return %9
+
+
+ "comp_ifFor"(%0, %1, %2): int -> int -> int -> int
+ locals: %5, %3, %4, %6, %7, %8, %9, %10
+ result: %5
+ stacksize: 0
+ entry: comp_ifFor23
+ exit: comp_ifFor0
+
+ comp_ifFor9: emit c52 --> comp_ifFor8
+ comp_ifFor8: add %4, %4, %3 --> comp_ifFor5
+ comp_ifFor7: emit c51 --> comp_ifFor6
+ comp_ifFor6: imm_int 0, %4, --> comp_ifFor5
+ comp_ifFor5: emit c54 --> comp_ifFor4
+ comp_ifFor4: add %3, %3, %2 --> comp_ifFor3
+ comp_ifFor3: --> comp_ifFor18
+ comp_ifFor23: emit c58 --> comp_ifFor22
+ comp_ifFor22: imm_int 0, %4, --> comp_ifFor21
+ comp_ifFor21: emit c57 --> comp_ifFor20
+ comp_ifFor20: emit c56 --> comp_ifFor19
+ comp_ifFor2: emit c50 --> comp_ifFor1
+ comp_ifFor19: imm_int 0, %3, --> comp_ifFor3
+ comp_ifFor18: imm_int 0, %9, --> comp_ifFor17
+ comp_ifFor17: emit c55 --> comp_ifFor16
+ comp_ifFor16: lt %10, %3, %0 --> comp_ifFor15
+ comp_ifFor15: notbool %8, %10 --> comp_ifFor14
+ comp_ifFor14: eq %8, %9 --> comp_ifFor13, comp_ifFor2
+ comp_ifFor13: emit c53 --> comp_ifFor12
+ comp_ifFor12: imm_int 0, %7, --> comp_ifFor11
+ comp_ifFor11: ne %6, %3, %1 --> comp_ifFor10
+ comp_ifFor10: eq %6, %7 --> comp_ifFor7, comp_ifFor9
+ comp_ifFor1: mov %5, %4 --> comp_ifFor0
+ comp_ifFor0: return %5
+
+
+ "comp_total"(%0, %1, %2): int -> int -> int -> int
+ locals: %6, %3, %4, %5, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31, %32, %33, %34, %35, %36, %37, %38, %39, %40, %41, %42, %43, %44, %45, %46, %47, %48, %49, %50, %51, %52, %53, %54, %55, %56, %57, %58, %59, %60, %61, %62, %63, %64, %65, %66, %67, %68, %69, %70, %71, %72, %73, %74, %75, %76, %77, %78, %79, %80, %81, %82, %83, %84, %85, %86, %87, %88, %89, %90, %91, %92, %93, %94, %95, %96, %97, %98, %99, %100, %101, %102, %103, %104, %105, %106, %107, %108, %109, %110, %111, %112, %113, %114, %115, %116, %117, %118, %119, %120, %121, %122, %123, %124, %125, %126, %127, %128, %129, %130, %131, %132, %133, %134, %135, %136, %137, %138, %139
+ result: %6
+ stacksize: 80
+ entry: comp_total205
+ exit: comp_total0
+
+ comp_total99: imm_int 0, %60, --> comp_total98
+ comp_total98: imm_addr 40($sp), %61, --> comp_total97
+ comp_total97: imm_int 5, %63, --> comp_total96
+ comp_total96: imm_int 4, %64, --> comp_total95
+ comp_total95: mul %62, %63, %64 --> comp_total94
+ comp_total94: store int32, add, %61, %62, %60 --> comp_total93
+ comp_total93: emit c78 --> comp_total92
+ comp_total92: imm_int 0, %55, --> comp_total91
+ comp_total91: imm_addr 40($sp), %56, --> comp_total90
+ comp_total90: imm_int 6, %58, --> comp_total89
+ comp_total9: imm_int 1, %8, --> comp_total8
+ comp_total89: imm_int 4, %59, --> comp_total88
+ comp_total88: mul %57, %58, %59 --> comp_total87
+ comp_total87: store int32, add, %56, %57, %55 --> comp_total86
+ comp_total86: emit c77 --> comp_total85
+ comp_total85: imm_int 0, %50, --> comp_total84
+ comp_total84: imm_addr 40($sp), %51, --> comp_total83
+ comp_total83: imm_int 7, %53, --> comp_total82
+ comp_total82: imm_int 4, %54, --> comp_total81
+ comp_total81: mul %52, %53, %54 --> comp_total80
+ comp_total80: store int32, add, %51, %52, %50 --> comp_total79
+ comp_total8: sub %4, %4, %8 --> comp_total7
+ comp_total79: emit c76 --> comp_total78
+ comp_total78: imm_int 0, %45, --> comp_total77
+ comp_total77: imm_addr 40($sp), %46, --> comp_total76
+ comp_total76: imm_int 8, %48, --> comp_total75
+ comp_total75: imm_int 4, %49, --> comp_total74
+ comp_total74: mul %47, %48, %49 --> comp_total73
+ comp_total73: store int32, add, %46, %47, %45 --> comp_total72
+ comp_total72: emit c75 --> comp_total71
+ comp_total71: imm_int 0, %40, --> comp_total70
+ comp_total70: imm_addr 40($sp), %41, --> comp_total69
+ comp_total7: --> comp_total29
+ comp_total69: imm_int 9, %43, --> comp_total68
+ comp_total68: imm_int 4, %44, --> comp_total67
+ comp_total67: mul %42, %43, %44 --> comp_total66
+ comp_total66: store int32, add, %41, %42, %40 --> comp_total65
+ comp_total65: emit c74 --> comp_total64
+ comp_total64: imm_int 0, %39, --> comp_total63
+ comp_total63: lt %38, %1, %2 --> comp_total62
+ comp_total62: eq %38, %39 --> comp_total40, comp_total61
+ comp_total61: emit c73 --> comp_total60
+ comp_total60: emit c72 --> comp_total59
+ comp_total6: emit c65 --> comp_total5
+ comp_total59: imm_int 0, %5, --> comp_total41
+ comp_total58: imm_int 0, %36, --> comp_total57
+ comp_total57: emit c71 --> comp_total56
+ comp_total56: le %37, %5, %1 --> comp_total55
+ comp_total55: notbool %35, %37 --> comp_total54
+ comp_total54: eq %35, %36 --> comp_total53, comp_total2
+ comp_total53: emit c69 --> comp_total52
+ comp_total52: sub %33, %1, %5 --> comp_total51
+ comp_total51: imm_int 4, %34, --> comp_total50
+ comp_total50: mul %32, %33, %34 --> comp_total49
+ comp_total5: imm_int 1, %7, --> comp_total4
+ comp_total49: load int32, add, %0, %32, %28 --> comp_total48
+ comp_total48: imm_addr 0($sp), %29, --> comp_total47
+ comp_total47: imm_int 4, %31, --> comp_total46
+ comp_total46: mul %30, %5, %31 --> comp_total45
+ comp_total45: store int32, add, %29, %30, %28 --> comp_total44
+ comp_total44: emit c70 --> comp_total43
+ comp_total43: imm_int 1, %27, --> comp_total42
+ comp_total42: add %5, %5, %27 --> comp_total41
+ comp_total41: --> comp_total58
+ comp_total40: emit c68 --> comp_total39
+ comp_total4: add %3, %3, %7 --> comp_total3
+ comp_total39: emit c67 --> comp_total38
+ comp_total38: imm_int 0, %3, --> comp_total3
+ comp_total37: imm_int 0, %25, --> comp_total36
+ comp_total36: emit c66 --> comp_total35
+ comp_total35: lt %26, %3, %1 --> comp_total34
+ comp_total34: notbool %24, %26 --> comp_total33
+ comp_total33: eq %24, %25 --> comp_total32, comp_total2
+ comp_total32: emit c64 --> comp_total31
+ comp_total31: emit c63 --> comp_total30
+ comp_total30: mov %4, %2 --> comp_total7
+ comp_total3: --> comp_total37
+ comp_total29: imm_int 0, %21, --> comp_total28
+ comp_total28: emit c62 --> comp_total27
+ comp_total27: imm_int 0, %23, --> comp_total26
+ comp_total26: gt %22, %4, %23 --> comp_total25
+ comp_total25: notbool %20, %22 --> comp_total24
+ comp_total24: eq %20, %21 --> comp_total23, comp_total6
+ comp_total23: emit c60 --> comp_total22
+ comp_total22: imm_addr 0($sp), %17, --> comp_total21
+ comp_total21: imm_int 4, %19, --> comp_total20
+ comp_total205: emit c94 --> comp_total204
+ comp_total204: imm_int 0, %135, --> comp_total203
+ comp_total203: imm_addr 0($sp), %136, --> comp_total202
+ comp_total202: imm_int 0, %138, --> comp_total201
+ comp_total201: imm_int 4, %139, --> comp_total200
+ comp_total200: mul %137, %138, %139 --> comp_total199
+ comp_total20: mul %18, %3, %19 --> comp_total19
+ comp_total2: emit c59 --> comp_total1
+ comp_total199: store int32, add, %136, %137, %135 --> comp_total198
+ comp_total198: emit c93 --> comp_total197
+ comp_total197: imm_int 0, %130, --> comp_total196
+ comp_total196: imm_addr 0($sp), %131, --> comp_total195
+ comp_total195: imm_int 1, %133, --> comp_total194
+ comp_total194: imm_int 4, %134, --> comp_total193
+ comp_total193: mul %132, %133, %134 --> comp_total192
+ comp_total192: store int32, add, %131, %132, %130 --> comp_total191
+ comp_total191: emit c92 --> comp_total190
+ comp_total190: imm_int 0, %125, --> comp_total189
+ comp_total19: load int32, add, %17, %18, %12 --> comp_total18
+ comp_total189: imm_addr 0($sp), %126, --> comp_total188
+ comp_total188: imm_int 2, %128, --> comp_total187
+ comp_total187: imm_int 4, %129, --> comp_total186
+ comp_total186: mul %127, %128, %129 --> comp_total185
+ comp_total185: store int32, add, %126, %127, %125 --> comp_total184
+ comp_total184: emit c91 --> comp_total183
+ comp_total183: imm_int 0, %120, --> comp_total182
+ comp_total182: imm_addr 0($sp), %121, --> comp_total181
+ comp_total181: imm_int 3, %123, --> comp_total180
+ comp_total180: imm_int 4, %124, --> comp_total179
+ comp_total18: imm_addr 40($sp), %14, --> comp_total17
+ comp_total179: mul %122, %123, %124 --> comp_total178
+ comp_total178: store int32, add, %121, %122, %120 --> comp_total177
+ comp_total177: emit c90 --> comp_total176
+ comp_total176: imm_int 0, %115, --> comp_total175
+ comp_total175: imm_addr 0($sp), %116, --> comp_total174
+ comp_total174: imm_int 4, %118, --> comp_total173
+ comp_total173: imm_int 4, %119, --> comp_total172
+ comp_total172: mul %117, %118, %119 --> comp_total171
+ comp_total171: store int32, add, %116, %117, %115 --> comp_total170
+ comp_total170: emit c89 --> comp_total169
+ comp_total17: imm_int 4, %16, --> comp_total16
+ comp_total169: imm_int 0, %110, --> comp_total168
+ comp_total168: imm_addr 0($sp), %111, --> comp_total167
+ comp_total167: imm_int 5, %113, --> comp_total166
+ comp_total166: imm_int 4, %114, --> comp_total165
+ comp_total165: mul %112, %113, %114 --> comp_total164
+ comp_total164: store int32, add, %111, %112, %110 --> comp_total163
+ comp_total163: emit c88 --> comp_total162
+ comp_total162: imm_int 0, %105, --> comp_total161
+ comp_total161: imm_addr 0($sp), %106, --> comp_total160
+ comp_total160: imm_int 6, %108, --> comp_total159
+ comp_total16: mul %15, %4, %16 --> comp_total15
+ comp_total159: imm_int 4, %109, --> comp_total158
+ comp_total158: mul %107, %108, %109 --> comp_total157
+ comp_total157: store int32, add, %106, %107, %105 --> comp_total156
+ comp_total156: emit c87 --> comp_total155
+ comp_total155: imm_int 0, %100, --> comp_total154
+ comp_total154: imm_addr 0($sp), %101, --> comp_total153
+ comp_total153: imm_int 7, %103, --> comp_total152
+ comp_total152: imm_int 4, %104, --> comp_total151
+ comp_total151: mul %102, %103, %104 --> comp_total150
+ comp_total150: store int32, add, %101, %102, %100 --> comp_total149
+ comp_total15: load int32, add, %14, %15, %13 --> comp_total14
+ comp_total149: emit c86 --> comp_total148
+ comp_total148: imm_int 0, %95, --> comp_total147
+ comp_total147: imm_addr 0($sp), %96, --> comp_total146
+ comp_total146: imm_int 8, %98, --> comp_total145
+ comp_total145: imm_int 4, %99, --> comp_total144
+ comp_total144: mul %97, %98, %99 --> comp_total143
+ comp_total143: store int32, add, %96, %97, %95 --> comp_total142
+ comp_total142: emit c85 --> comp_total141
+ comp_total141: imm_int 0, %90, --> comp_total140
+ comp_total140: imm_addr 0($sp), %91, --> comp_total139
+ comp_total14: add %9, %12, %13 --> comp_total13
+ comp_total139: imm_int 9, %93, --> comp_total138
+ comp_total138: imm_int 4, %94, --> comp_total137
+ comp_total137: mul %92, %93, %94 --> comp_total136
+ comp_total136: store int32, add, %91, %92, %90 --> comp_total135
+ comp_total135: emit c84 --> comp_total134
+ comp_total134: imm_int 0, %85, --> comp_total133
+ comp_total133: imm_addr 40($sp), %86, --> comp_total132
+ comp_total132: imm_int 0, %88, --> comp_total131
+ comp_total131: imm_int 4, %89, --> comp_total130
+ comp_total130: mul %87, %88, %89 --> comp_total129
+ comp_total13: imm_int 4, %11, --> comp_total12
+ comp_total129: store int32, add, %86, %87, %85 --> comp_total128
+ comp_total128: emit c83 --> comp_total127
+ comp_total127: imm_int 0, %80, --> comp_total126
+ comp_total126: imm_addr 40($sp), %81, --> comp_total125
+ comp_total125: imm_int 1, %83, --> comp_total124
+ comp_total124: imm_int 4, %84, --> comp_total123
+ comp_total123: mul %82, %83, %84 --> comp_total122
+ comp_total122: store int32, add, %81, %82, %80 --> comp_total121
+ comp_total121: emit c82 --> comp_total120
+ comp_total120: imm_int 0, %75, --> comp_total119
+ comp_total12: mul %10, %3, %11 --> comp_total11
+ comp_total119: imm_addr 40($sp), %76, --> comp_total118
+ comp_total118: imm_int 2, %78, --> comp_total117
+ comp_total117: imm_int 4, %79, --> comp_total116
+ comp_total116: mul %77, %78, %79 --> comp_total115
+ comp_total115: store int32, add, %76, %77, %75 --> comp_total114
+ comp_total114: emit c81 --> comp_total113
+ comp_total113: imm_int 0, %70, --> comp_total112
+ comp_total112: imm_addr 40($sp), %71, --> comp_total111
+ comp_total111: imm_int 3, %73, --> comp_total110
+ comp_total110: imm_int 4, %74, --> comp_total109
+ comp_total11: store int32, add, %0, %10, %9 --> comp_total10
+ comp_total109: mul %72, %73, %74 --> comp_total108
+ comp_total108: store int32, add, %71, %72, %70 --> comp_total107
+ comp_total107: emit c80 --> comp_total106
+ comp_total106: imm_int 0, %65, --> comp_total105
+ comp_total105: imm_addr 40($sp), %66, --> comp_total104
+ comp_total104: imm_int 4, %68, --> comp_total103
+ comp_total103: imm_int 4, %69, --> comp_total102
+ comp_total102: mul %67, %68, %69 --> comp_total101
+ comp_total101: store int32, add, %66, %67, %65 --> comp_total100
+ comp_total100: emit c79 --> comp_total99
+ comp_total10: emit c61 --> comp_total9
+ comp_total1: imm_int 0, %6, --> comp_total0
+ comp_total0: return %6
+
+
+ "comp_tri"(%0, %1): int -> int -> int
+ locals: %5, %2, %3, %4, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31, %32, %33, %34, %35, %36, %37
+ result: %5
+ stacksize: 0
+ entry: comp_tri60
+ exit: comp_tri0
+
+ comp_tri9: imm_int 1, %7, --> comp_tri8
+ comp_tri8: add %3, %3, %7 --> comp_tri7
+ comp_tri7: --> comp_tri47
+ comp_tri60: emit c108 --> comp_tri59
+ comp_tri6: emit c104 --> comp_tri5
+ comp_tri59: imm_int 0, %2, --> comp_tri58
+ comp_tri58: emit c107 --> comp_tri57
+ comp_tri57: emit c106 --> comp_tri56
+ comp_tri56: imm_int 0, %4, --> comp_tri3
+ comp_tri55: imm_int 0, %36, --> comp_tri54
+ comp_tri54: emit c105 --> comp_tri53
+ comp_tri53: lt %37, %4, %1 --> comp_tri52
+ comp_tri52: notbool %35, %37 --> comp_tri51
+ comp_tri51: eq %35, %36 --> comp_tri50, comp_tri2
+ comp_tri50: emit c103 --> comp_tri49
+ comp_tri5: imm_int 1, %6, --> comp_tri4
+ comp_tri49: emit c102 --> comp_tri48
+ comp_tri48: imm_int 1, %3, --> comp_tri7
+ comp_tri47: imm_int 0, %32, --> comp_tri46
+ comp_tri46: emit c101 --> comp_tri45
+ comp_tri45: sub %34, %1, %4 --> comp_tri44
+ comp_tri44: lt %33, %3, %34 --> comp_tri43
+ comp_tri43: notbool %31, %33 --> comp_tri42
+ comp_tri42: eq %31, %32 --> comp_tri41, comp_tri6
+ comp_tri41: emit c99 --> comp_tri40
+ comp_tri40: imm_int 0, %22, --> comp_tri39
+ comp_tri4: add %4, %4, %6 --> comp_tri3
+ comp_tri39: imm_int 4, %30, --> comp_tri38
+ comp_tri38: mul %29, %3, %30 --> comp_tri37
+ comp_tri37: load int32, add, %0, %29, %23 --> comp_tri36
+ comp_tri36: imm_int 1, %28, --> comp_tri35
+ comp_tri35: sub %26, %3, %28 --> comp_tri34
+ comp_tri34: imm_int 4, %27, --> comp_tri33
+ comp_tri33: mul %25, %26, %27 --> comp_tri32
+ comp_tri32: load int32, add, %0, %25, %24 --> comp_tri31
+ comp_tri31: lt %21, %23, %24 --> comp_tri30
+ comp_tri30: eq %21, %22 --> comp_tri10, comp_tri29
+ comp_tri3: --> comp_tri55
+ comp_tri29: emit c98 --> comp_tri28
+ comp_tri28: imm_int 1, %20, --> comp_tri27
+ comp_tri27: sub %18, %3, %20 --> comp_tri26
+ comp_tri26: imm_int 4, %19, --> comp_tri25
+ comp_tri25: mul %17, %18, %19 --> comp_tri24
+ comp_tri24: load int32, add, %0, %17, %2 --> comp_tri23
+ comp_tri23: emit c97 --> comp_tri22
+ comp_tri22: imm_int 4, %16, --> comp_tri21
+ comp_tri21: mul %15, %3, %16 --> comp_tri20
+ comp_tri20: load int32, add, %0, %15, %10 --> comp_tri19
+ comp_tri2: emit c95 --> comp_tri1
+ comp_tri19: imm_int 1, %14, --> comp_tri18
+ comp_tri18: sub %12, %3, %14 --> comp_tri17
+ comp_tri17: imm_int 4, %13, --> comp_tri16
+ comp_tri16: mul %11, %12, %13 --> comp_tri15
+ comp_tri15: store int32, add, %0, %11, %10 --> comp_tri14
+ comp_tri14: emit c96 --> comp_tri13
+ comp_tri13: imm_int 4, %9, --> comp_tri12
+ comp_tri12: mul %8, %3, %9 --> comp_tri11
+ comp_tri11: store int32, add, %0, %8, %2 --> comp_tri10
+ comp_tri10: emit c100 --> comp_tri9
+ comp_tri1: mov %5, %2 --> comp_tri0
+ comp_tri0: return %5
+
+
+ "comp_forif2"(%0, %1, %2, %3): int -> int -> int -> int -> int
+ locals: %9, %4, %5, %6, %7, %8, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31, %32, %33, %34, %35, %36, %37, %38, %39, %40, %41, %42, %43, %44, %45
+ result: %9
+ stacksize: 0
+ entry: comp_forif282
+ exit: comp_forif20
+
+ comp_forif29: imm_int 0, %13, --> comp_forif28
+ comp_forif282: emit c130 --> comp_forif281
+ comp_forif281: imm_int 0, %6, --> comp_forif280
+ comp_forif280: emit c129 --> comp_forif279
+ comp_forif28: eq %10, %12, %13 --> comp_forif27
+ comp_forif279: imm_int 0, %5, --> comp_forif278
+ comp_forif278: emit c128 --> comp_forif277
+ comp_forif277: emit c127 --> comp_forif276
+ comp_forif276: imm_int 0, %8, --> comp_forif262
+ comp_forif275: imm_int 0, %44, --> comp_forif274
+ comp_forif274: emit c126 --> comp_forif273
+ comp_forif273: lt %45, %8, %2 --> comp_forif272
+ comp_forif272: notbool %43, %45 --> comp_forif271
+ comp_forif271: eq %43, %44 --> comp_forif270, comp_forif261
+ comp_forif270: emit c124 --> comp_forif269
+ comp_forif27: eq %10, %11 --> comp_forif24, comp_forif26
+ comp_forif269: imm_int 4, %42, --> comp_forif268
+ comp_forif268: mul %41, %8, %42 --> comp_forif267
+ comp_forif267: load int32, add, %0, %41, %40 --> comp_forif266
+ comp_forif266: add %6, %6, %40 --> comp_forif265
+ comp_forif265: emit c125 --> comp_forif264
+ comp_forif264: imm_int 1, %39, --> comp_forif263
+ comp_forif263: add %8, %8, %39 --> comp_forif262
+ comp_forif262: --> comp_forif275
+ comp_forif261: emit c123 --> comp_forif260
+ comp_forif260: emit c122 --> comp_forif259
+ comp_forif26: emit c111 --> comp_forif25
+ comp_forif259: imm_int 0, %7, --> comp_forif245
+ comp_forif258: imm_int 0, %37, --> comp_forif257
+ comp_forif257: emit c121 --> comp_forif256
+ comp_forif256: lt %38, %7, %3 --> comp_forif255
+ comp_forif255: notbool %36, %38 --> comp_forif254
+ comp_forif254: eq %36, %37 --> comp_forif253, comp_forif244
+ comp_forif253: emit c119 --> comp_forif252
+ comp_forif252: imm_int 4, %35, --> comp_forif251
+ comp_forif251: mul %34, %7, %35 --> comp_forif250
+ comp_forif250: load int32, add, %1, %34, %33 --> comp_forif249
+ comp_forif25: imm_int 2, %4, --> comp_forif22
+ comp_forif249: add %5, %5, %33 --> comp_forif248
+ comp_forif248: emit c120 --> comp_forif247
+ comp_forif247: imm_int 1, %32, --> comp_forif246
+ comp_forif246: add %7, %7, %32 --> comp_forif245
+ comp_forif245: --> comp_forif258
+ comp_forif244: emit c118 --> comp_forif243
+ comp_forif243: imm_int 0, %21, --> comp_forif242
+ comp_forif242: imm_int 0, %28, --> comp_forif241
+ comp_forif241: emit c117 --> comp_forif240
+ comp_forif240: imm_int 2, %31, --> comp_forif239
+ comp_forif24: emit c110 --> comp_forif23
+ comp_forif239: mod %29, %6, %31 --> comp_forif238
+ comp_forif238: imm_int 0, %30, --> comp_forif237
+ comp_forif237: eq %27, %29, %30 --> comp_forif236
+ comp_forif236: eq %27, %28 --> comp_forif226, comp_forif235
+ comp_forif235: imm_int 0, %23, --> comp_forif234
+ comp_forif234: emit c116 --> comp_forif233
+ comp_forif233: imm_int 2, %26, --> comp_forif232
+ comp_forif232: mod %24, %5, %26 --> comp_forif231
+ comp_forif231: imm_int 0, %25, --> comp_forif230
+ comp_forif230: eq %22, %24, %25 --> comp_forif229
+ comp_forif23: imm_int 3, %4, --> comp_forif22
+ comp_forif229: eq %22, %23 --> comp_forif227, comp_forif228
+ comp_forif228: imm_int 1, %20, --> comp_forif225
+ comp_forif227: imm_int 0, %20, --> comp_forif225
+ comp_forif226: imm_int 0, %20, --> comp_forif225
+ comp_forif225: eq %20, %21 --> comp_forif222, comp_forif224
+ comp_forif224: emit c115 --> comp_forif223
+ comp_forif223: imm_int 0, %4, --> comp_forif22
+ comp_forif222: emit c114 --> comp_forif221
+ comp_forif221: imm_int 0, %16, --> comp_forif220
+ comp_forif220: imm_int 2, %19, --> comp_forif219
+ comp_forif22: emit c109 --> comp_forif21
+ comp_forif219: mod %17, %6, %19 --> comp_forif218
+ comp_forif218: imm_int 0, %18, --> comp_forif217
+ comp_forif217: eq %15, %17, %18 --> comp_forif216
+ comp_forif216: eq %15, %16 --> comp_forif213, comp_forif215
+ comp_forif215: emit c113 --> comp_forif214
+ comp_forif214: imm_int 1, %4, --> comp_forif22
+ comp_forif213: emit c112 --> comp_forif212
+ comp_forif212: imm_int 0, %11, --> comp_forif211
+ comp_forif211: imm_int 2, %14, --> comp_forif210
+ comp_forif210: mod %12, %5, %14 --> comp_forif29
+ comp_forif21: imm_int 0, %9, --> comp_forif20
+ comp_forif20: return %9
+
+
+ "comp_forif"(): int
+ locals: %3, %0, %1, %2, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16
+ result: %3
+ stacksize: 0
+ entry: comp_forif35
+ exit: comp_forif0
+
+ comp_forif9: emit c132 --> comp_forif8
+ comp_forif8: imm_int 1, %5, --> comp_forif7
+ comp_forif7: add %0, %0, %5 --> comp_forif6
+ comp_forif6: emit c136 --> comp_forif5
+ comp_forif5: imm_int 1, %4, --> comp_forif4
+ comp_forif4: add %2, %2, %4 --> comp_forif3
+ comp_forif35: emit c141 --> comp_forif34
+ comp_forif34: imm_int 0, %1, --> comp_forif33
+ comp_forif33: emit c140 --> comp_forif32
+ comp_forif32: imm_int 0, %0, --> comp_forif31
+ comp_forif31: emit c139 --> comp_forif30
+ comp_forif30: emit c138 --> comp_forif29
+ comp_forif3: --> comp_forif28
+ comp_forif29: imm_int 0, %2, --> comp_forif3
+ comp_forif28: imm_int 0, %14, --> comp_forif27
+ comp_forif27: emit c137 --> comp_forif26
+ comp_forif26: imm_int 10, %16, --> comp_forif25
+ comp_forif25: lt %15, %2, %16 --> comp_forif24
+ comp_forif24: notbool %13, %15 --> comp_forif23
+ comp_forif23: eq %13, %14 --> comp_forif22, comp_forif2
+ comp_forif22: emit c135 --> comp_forif21
+ comp_forif21: imm_int 1, %12, --> comp_forif20
+ comp_forif20: add %1, %1, %12 --> comp_forif19
+ comp_forif2: emit c131 --> comp_forif1
+ comp_forif19: emit c134 --> comp_forif18
+ comp_forif18: imm_int 1, %11, --> comp_forif17
+ comp_forif17: add %1, %1, %11 --> comp_forif16
+ comp_forif16: emit c133 --> comp_forif15
+ comp_forif15: imm_int 0, %7, --> comp_forif14
+ comp_forif14: imm_int 2, %10, --> comp_forif13
+ comp_forif13: mod %8, %2, %10 --> comp_forif12
+ comp_forif12: imm_int 0, %9, --> comp_forif11
+ comp_forif11: eq %6, %8, %9 --> comp_forif10
+ comp_forif10: eq %6, %7 --> comp_forif6, comp_forif9
+ comp_forif1: mov %3, %1 --> comp_forif0
+ comp_forif0: return %3
+
+
+ "main"(): int
+ locals: %1, %0, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31, %32, %33, %34, %35, %36, %37, %38, %39, %40, %41, %42, %43, %44, %45, %46, %47, %48, %49, %50, %51, %52, %53, %54, %55, %56, %57, %58, %59, %60, %61, %62, %63, %64, %65, %66, %67, %68, %69, %70, %71, %72, %73, %74, %75, %76, %77, %78, %79, %80, %81, %82, %83, %84, %85, %86, %87, %88, %89, %90, %91, %92, %93, %94, %95, %96, %97, %98, %99, %100, %101, %102
+ result: %1
+ stacksize: 64
+ entry: main149
+ exit: main0
+
+ main99: imm_int 4, %63, --> main98
+ main98: imm_addr 0($sp), %64, --> main97
+ main97: imm_int 7, %66, --> main96
+ main96: imm_int 4, %67, --> main95
+ main95: mul %65, %66, %67 --> main94
+ main94: store int32, add, %64, %65, %63 --> main93
+ main93: emit c157 --> main92
+ main92: imm_int 3, %58, --> main91
+ main91: imm_addr 0($sp), %59, --> main90
+ main90: imm_int 8, %61, --> main89
+ main9: imm_addr 0($sp), %2, --> main8
+ main89: imm_int 4, %62, --> main88
+ main88: mul %60, %61, %62 --> main87
+ main87: store int32, add, %59, %60, %58 --> main86
+ main86: emit c156 --> main85
+ main85: imm_int 2, %53, --> main84
+ main84: imm_addr 0($sp), %54, --> main83
+ main83: imm_int 9, %56, --> main82
+ main82: imm_int 4, %57, --> main81
+ main81: mul %55, %56, %57 --> main80
+ main80: store int32, add, %54, %55, %53 --> main79
+ main8: imm_addr 0($sp), %3, --> main7
+ main79: emit c155 --> main78
+ main78: imm_int 0, %48, --> main77
+ main77: imm_addr 0($sp), %49, --> main76
+ main76: imm_int 10, %51, --> main75
+ main75: imm_int 4, %52, --> main74
+ main74: mul %50, %51, %52 --> main73
+ main73: store int32, add, %49, %50, %48 --> main72
+ main72: emit c154 --> main71
+ main71: imm_int 0, %43, --> main70
+ main70: imm_addr 0($sp), %44, --> main69
+ main7: imm_int 10, %4, --> main6
+ main69: imm_int 11, %46, --> main68
+ main68: imm_int 4, %47, --> main67
+ main67: mul %45, %46, %47 --> main66
+ main66: store int32, add, %44, %45, %43 --> main65
+ main65: emit c153 --> main64
+ main64: imm_int 0, %38, --> main63
+ main63: imm_addr 0($sp), %39, --> main62
+ main62: imm_int 12, %41, --> main61
+ main61: imm_int 4, %42, --> main60
+ main60: mul %40, %41, %42 --> main59
+ main6: imm_int 10, %5, --> main5
+ main59: store int32, add, %39, %40, %38 --> main58
+ main58: emit c152 --> main57
+ main57: imm_int 0, %33, --> main56
+ main56: imm_addr 0($sp), %34, --> main55
+ main55: imm_int 13, %36, --> main54
+ main54: imm_int 4, %37, --> main53
+ main53: mul %35, %36, %37 --> main52
+ main52: store int32, add, %34, %35, %33 --> main51
+ main51: emit c151 --> main50
+ main50: imm_int 0, %28, --> main49
+ main5: call "comp_forif2", %2, %3, %4, %5, %0: int -> int -> int -> int -> int --> main4
+ main49: imm_addr 0($sp), %29, --> main48
+ main48: imm_int 14, %31, --> main47
+ main47: imm_int 4, %32, --> main46
+ main46: mul %30, %31, %32 --> main45
+ main45: store int32, add, %29, %30, %28 --> main44
+ main44: emit c150 --> main43
+ main43: imm_int 0, %23, --> main42
+ main42: imm_addr 0($sp), %24, --> main41
+ main41: imm_int 15, %26, --> main40
+ main40: imm_int 4, %27, --> main39
+ main4: emit c143 --> main3
+ main39: mul %25, %26, %27 --> main38
+ main38: store int32, add, %24, %25, %23 --> main37
+ main37: emit c149 --> main36
+ main36: imm_addr 0($sp), %18, --> main35
+ main35: imm_addr 0($sp), %19, --> main34
+ main34: imm_addr 0($sp), %20, --> main33
+ main33: imm_int 10, %21, --> main32
+ main32: imm_int 10, %22, --> main31
+ main31: call "comp_fir_basic", %18, %19, %20, %21, %22, %0: int -> int -> int -> int -> int -> int --> main30
+ main30: emit c148 --> main29
+ main3: call "comp_forif", , %0: int --> main2
+ main29: imm_addr 0($sp), %14, --> main28
+ main28: imm_addr 0($sp), %15, --> main27
+ main27: imm_addr 0($sp), %16, --> main26
+ main26: imm_int 16, %17, --> main25
+ main25: call "comp_fir16", %14, %15, %16, %17, %0: int -> int -> int -> int -> int --> main24
+ main24: emit c147 --> main23
+ main23: imm_int 4, %11, --> main22
+ main22: imm_int 1, %12, --> main21
+ main21: imm_int 1, %13, --> main20
+ main20: call "comp_ifFor", %11, %12, %13, %0: int -> int -> int -> int --> main19
+ main2: emit c142 --> main1
+ main19: emit c146 --> main18
+ main18: imm_addr 0($sp), %8, --> main17
+ main17: imm_int 9, %9, --> main16
+ main16: imm_int 3, %10, --> main15
+ main15: call "comp_total", %8, %9, %10, %0: int -> int -> int -> int --> main14
+ main149: emit c165 --> main148
+ main148: imm_int 10, %98, --> main147
+ main147: imm_addr 0($sp), %99, --> main146
+ main146: imm_int 0, %101, --> main145
+ main145: imm_int 4, %102, --> main144
+ main144: mul %100, %101, %102 --> main143
+ main143: store int32, add, %99, %100, %98 --> main142
+ main142: emit c164 --> main141
+ main141: imm_int 9, %93, --> main140
+ main140: imm_addr 0($sp), %94, --> main139
+ main14: emit c145 --> main13
+ main139: imm_int 1, %96, --> main138
+ main138: imm_int 4, %97, --> main137
+ main137: mul %95, %96, %97 --> main136
+ main136: store int32, add, %94, %95, %93 --> main135
+ main135: emit c163 --> main134
+ main134: imm_int 8, %88, --> main133
+ main133: imm_addr 0($sp), %89, --> main132
+ main132: imm_int 2, %91, --> main131
+ main131: imm_int 4, %92, --> main130
+ main130: mul %90, %91, %92 --> main129
+ main13: imm_addr 0($sp), %6, --> main12
+ main129: store int32, add, %89, %90, %88 --> main128
+ main128: emit c162 --> main127
+ main127: imm_int 7, %83, --> main126
+ main126: imm_addr 0($sp), %84, --> main125
+ main125: imm_int 3, %86, --> main124
+ main124: imm_int 4, %87, --> main123
+ main123: mul %85, %86, %87 --> main122
+ main122: store int32, add, %84, %85, %83 --> main121
+ main121: emit c161 --> main120
+ main120: imm_int 6, %78, --> main119
+ main12: imm_int 10, %7, --> main11
+ main119: imm_addr 0($sp), %79, --> main118
+ main118: imm_int 4, %81, --> main117
+ main117: imm_int 4, %82, --> main116
+ main116: mul %80, %81, %82 --> main115
+ main115: store int32, add, %79, %80, %78 --> main114
+ main114: emit c160 --> main113
+ main113: imm_int 0, %73, --> main112
+ main112: imm_addr 0($sp), %74, --> main111
+ main111: imm_int 5, %76, --> main110
+ main110: imm_int 4, %77, --> main109
+ main11: call "comp_tri", %6, %7, %0: int -> int -> int --> main10
+ main109: mul %75, %76, %77 --> main108
+ main108: store int32, add, %74, %75, %73 --> main107
+ main107: emit c159 --> main106
+ main106: imm_int 5, %68, --> main105
+ main105: imm_addr 0($sp), %69, --> main104
+ main104: imm_int 6, %71, --> main103
+ main103: imm_int 4, %72, --> main102
+ main102: mul %70, %71, %72 --> main101
+ main101: store int32, add, %69, %70, %68 --> main100
+ main100: emit c158 --> main99
+ main10: emit c144 --> main9
+ main1: mov %1, %0 --> main0
+ main0: return %1
+
+
--- /dev/null
+int comp_fir_basic(int input[], int h[], int z[], int N,int n) \r
+{\r
+ int i,j,k;\r
+ int y ;\r
+ y = 0;\r
+ /* calc FIR */\r
+ for(k=0;k<3;k=k+1){\r
+ \r
+ /* store input at the beginning of the delay line */\r
+ z[0] = input[k];\r
+ for (i = 0; i < 3; i=i+1) {\r
+ y = y +h[i] * z[i];\r
+ }\r
+ \r
+ /* shift delay line */\r
+ for (j = 2; j >=0; j=j-1) {\r
+ z[j + 1] = z[j];\r
+ }\r
+ }\r
+ return y;\r
+}\r
+\r
+\r
+int comp_fir16(int in[], int c[], int out[], int size) {\r
+ int i,j,res,tmp;\r
+ int x[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};\r
+ int adx =0;\r
+ res =0;\r
+ for (j=0;j<size;j++) {\r
+ x[adx]=in[j];\r
+ for(i=0;i<16;i=i+1){\r
+ tmp = (x[adx]*c[i])*(2^16);\r
+ res = res + tmp;\r
+ adx=(adx+1)%16;\r
+ }\r
+ adx=(adx+1)%16;\r
+ out[j]=res;\r
+ }\r
+ return x[0];\r
+}\r
+\r
+int comp_ifFor (int a, int b, int pas) {\r
+ int i, result;\r
+ result = 0;\r
+ for (i = 0; i < a; i=i+pas) {\r
+ if (i != b) {\r
+ result = result + i; \r
+ }\r
+ else {\r
+ result = 0;\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+int comp_total (int tabParam[], int a, int b) {\r
+ int i, j, k;\r
+ int tabLocal1[10] = {0,0,0,0,0,0,0,0,0,0};\r
+ int tabLocal2[10] = {0,0,0,0,0,0,0,0,0,0};;\r
+ if (a < b) {\r
+ for (i = 0; i <= a; i++) {\r
+ tabLocal1[i] = tabParam[a-i];\r
+ }\r
+ }\r
+ else {\r
+ for (k = 0; k < a; k++) {\r
+ for (j = b; j > 0; j--) {\r
+ tabParam[k] = tabLocal1[k]+tabLocal2[j];\r
+ }\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
+int comp_tri (int t[], int n) {\r
+ int i,j,tmp;\r
+ tmp = 0; \r
+\r
+ for(i = 0 ; (i < n); i=i+1)\r
+ {\r
+ for(j = 1 ; j < n- i ; j=j+1)\r
+ {\r
+ if(t[j] < t[j-1])\r
+ {\r
+ tmp = t[j-1];\r
+ t[j-1] = t[j];\r
+ t[j] = tmp;\r
+ }\r
+ }\r
+ }\r
+ return tmp;\r
+}\r
+int comp_forif2 (int u[], int v[], int a, int b){\r
+ int i,j,k,l,res;\r
+ k=0;\r
+ l=0;\r
+ for (i=0;i<a;i=i+1) {\r
+ k = k+u[i];\r
+ }\r
+ for (j=0;j<b;j=j+1) {\r
+ l = l+v[j];\r
+ }\r
+ if (k%2 == 0 && l%2 == 0) {\r
+ res = 0;\r
+ }\r
+ else if (k%2 == 0) {\r
+ res = 1;\r
+ }\r
+ else if (l%2 == 0) {\r
+ res = 2;\r
+ }\r
+ else {\r
+ res = 3;\r
+ }\r
+ return 0;\r
+}\r
+int comp_forif (){\r
+ int i,j,k;\r
+ j=0;k=0;\r
+ for (i=0;i<10;i=i+1) {\r
+ j=j+1;j=j+1;\r
+ if (i % 2 == 0) {k=k+1;}\r
+ }\r
+ return j;\r
+}\r
+\r
+int main(){\r
+ int a;\r
+ int t[16] = {10,9,8,7,6,0,5,4,3,2,0,0,0,0,0,0};\r
+ a = comp_fir_basic(t,t,t,10,10);\r
+ a = comp_fir16(t,t,t,16);\r
+ a = comp_ifFor(4,1,1);\r
+ a = comp_total(t,9,3);\r
+ a = comp_tri(t,10);\r
+ a = comp_forif2(t,t,10,10);\r
+ a = comp_forif();\r
+ return a;\r
+}\r
--- /dev/null
+int comp_fir_basic(int input[], int h[], int z[], int N,int n) \r
+{\r
+ int i,j,k;\r
+ int y ;\r
+ y = 0;\r
+ /* calc FIR */\r
+ for(k=0;k<3;k=k+1){\r
+ \r
+ /* store input at the beginning of the delay line */\r
+ z[0] = input[k];\r
+ for (i = 0; i < 3; i=i+1) {\r
+ y = y +h[i] * z[i];\r
+ }\r
+ \r
+ /* shift delay line */\r
+ for (j = 2; j >=0; j=j-1) {\r
+ z[j + 1] = z[j];\r
+ }\r
+ }\r
+ return y;\r
+}\r
+\r
+\r
+int comp_fir16(int in[], int c[], int out[], int size) {\r
+ int i,j,res,tmp;\r
+ int x[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};\r
+ int adx =0;\r
+ res =0;\r
+ for (j=0;j<size;j++) {\r
+ x[adx]=in[j];\r
+ for(i=0;i<16;i=i+1){\r
+ tmp = (x[adx]*c[i])*(2^16);\r
+ res = res + tmp;\r
+ adx=(adx+1)%16;\r
+ }\r
+ adx=(adx+1)%16;\r
+ out[j]=res;\r
+ }\r
+ return x[0];\r
+}\r
+\r
+int comp_ifFor (int a, int b, int pas) {\r
+ int i, result;\r
+ result = 0;\r
+ for (i = 0; i < a; i=i+pas) {\r
+ if (i != b) {\r
+ result = result + i; \r
+ }\r
+ else {\r
+ result = 0;\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+int comp_total (int tabParam[], int a, int b) {\r
+ int i, j, k;\r
+ int tabLocal1[10] = {0,0,0,0,0,0,0,0,0,0};\r
+ int tabLocal2[10] = {0,0,0,0,0,0,0,0,0,0};;\r
+ if (a < b) {\r
+ for (i = 0; i <= a; i++) {\r
+ tabLocal1[i] = tabParam[a-i];\r
+ }\r
+ }\r
+ else {\r
+ for (k = 0; k < a; k++) {\r
+ for (j = b; j > 0; j--) {\r
+ tabParam[k] = tabLocal1[k]+tabLocal2[j];\r
+ }\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
+int comp_tri (int t[], int n) {\r
+ int i,j,tmp;\r
+ tmp = 0; \r
+\r
+ for(i = 0 ; (i < n); i=i+1)\r
+ {\r
+ for(j = 1 ; j < n- i ; j=j+1)\r
+ {\r
+ if(t[j] < t[j-1])\r
+ {\r
+ tmp = t[j-1];\r
+ t[j-1] = t[j];\r
+ t[j] = tmp;\r
+ }\r
+ }\r
+ }\r
+ return tmp;\r
+}\r
+int comp_forif2 (int u[], int v[], int a, int b){\r
+ int i,j,k,l,res;\r
+ k=0;\r
+ l=0;\r
+ for (i=0;i<a;i=i+1) {\r
+ k = k+u[i];\r
+ }\r
+ for (j=0;j<b;j=j+1) {\r
+ l = l+v[j];\r
+ }\r
+ if (k%2 == 0 && l%2 == 0) {\r
+ res = 0;\r
+ }\r
+ else if (k%2 == 0) {\r
+ res = 1;\r
+ }\r
+ else if (l%2 == 0) {\r
+ res = 2;\r
+ }\r
+ else {\r
+ res = 3;\r
+ }\r
+ return 0;\r
+}\r
+int comp_forif (){\r
+ int i,j,k;\r
+ j=0;k=0;\r
+ for (i=0;i<10;i=i+1) {\r
+ j=j+1;j=j+1;\r
+ if (i % 2 == 0) {k=k+1;}\r
+ }\r
+ return j;\r
+}\r
+\r
+int main(){\r
+ int a;\r
+ int t[16] = {10,9,8,7,6,0,5,4,3,2,0,0,0,0,0,0};\r
+ a = comp_fir_basic(t,t,t,10,10);\r
+ a = comp_fir16(t,t,t,16);\r
+ a = comp_ifFor(4,1,1);\r
+ a = comp_total(t,9,3);\r
+ a = comp_tri(t,10);\r
+ a = comp_forif2(t,t,10,10);\r
+ a = comp_forif();\r
+ return a;\r
+}\r
--- /dev/null
+Global Error (Translation RTLabs -> RTL):
+ Constant not supported.
--- /dev/null
+.data
+globals:
+.space 0
+nl:
+.asciiz "\n"
+.align 2
+.text
+main:
+la $gp, globals
+j main17
+write:
+li $v0, 1
+syscall
+jr $ra
+writeln:
+li $v0, 1
+syscall
+la $a0, nl
+li $v0, 4
+syscall
+jr $ra
+readln:
+li $v0, 5
+syscall
+jr $ra
+alloc:
+li $v0, 9
+syscall
+jr $ra
+
+# begin fib
+fib37:
+addiu $sp, $sp, -12
+sw $ra, 8($sp)
+sw $s1, 4($sp)
+sw $s0, 0($sp)
+move $s1, $a0
+c4:
+li $v0, 2
+slt $v0, $s1, $v0
+beq $v0, $zero, fib10
+c3:
+li $v0, 1
+fib48:
+lw $ra, 8($sp)
+lw $s1, 4($sp)
+lw $s0, 0($sp)
+addiu $sp, $sp, 12
+jr $ra
+fib10:
+c2:
+li $v0, 1
+subu $a0, $s1, $v0
+jal fib37
+move $s0, $v0
+c1:
+li $v0, 2
+subu $a0, $s1, $v0
+jal fib37
+c0:
+addu $v0, $s0, $v0
+j fib48
+# end fib
+
+# begin _main
+main17:
+addiu $sp, $sp, -4
+sw $ra, 0($sp)
+c6:
+li $a0, 10
+jal fib37
+c5:
+lw $ra, 0($sp)
+addiu $sp, $sp, 4
+jr $ra
+# end _main
--- /dev/null
+extern void *__builtin___memcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memmove_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___mempcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memset_chk(void *, int, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___stpcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcat_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strncat_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___strncpy_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern int __builtin___vfprintf_chk(void *, int, unsigned char *, void *);
+
+extern int __builtin___vprintf_chk(int, unsigned char *, void *);
+
+extern int __builtin___vsnprintf_chk(unsigned char *, unsigned int, int, unsigned int, unsigned char *, void *);
+
+extern int __builtin___vsprintf_chk(unsigned char *, int, unsigned int, unsigned char *, void *);
+
+extern double __builtin_acos(double);
+
+extern float __builtin_acosf(float);
+
+extern double __builtin_acosl(double);
+
+extern void *__builtin_alloca(unsigned int);
+
+extern double __builtin_asin(double);
+
+extern float __builtin_asinf(float);
+
+extern double __builtin_asinl(double);
+
+extern double __builtin_atan(double);
+
+extern float __builtin_atanf(float);
+
+extern double __builtin_atanl(double);
+
+extern double __builtin_atan2(double, double);
+
+extern float __builtin_atan2f(float, float);
+
+extern double __builtin_atan2l(double, double);
+
+extern double __builtin_ceil(double);
+
+extern float __builtin_ceilf(float);
+
+extern double __builtin_ceill(double);
+
+extern double __builtin_cos(double);
+
+extern float __builtin_cosf(float);
+
+extern double __builtin_cosl(double);
+
+extern double __builtin_cosh(double);
+
+extern float __builtin_coshf(float);
+
+extern double __builtin_coshl(double);
+
+extern int __builtin_clz(unsigned int);
+
+extern int __builtin_clzl(unsigned int);
+
+extern int __builtin_clzll(unsigned int);
+
+extern int __builtin_constant_p(int);
+
+extern int __builtin_ctz(unsigned int);
+
+extern int __builtin_ctzl(unsigned int);
+
+extern int __builtin_ctzll(unsigned int);
+
+extern double __builtin_exp(double);
+
+extern float __builtin_expf(float);
+
+extern double __builtin_expl(double);
+
+extern int __builtin_expect(int, int);
+
+extern double __builtin_fabs(double);
+
+extern float __builtin_fabsf(float);
+
+extern double __builtin_fabsl(double);
+
+extern int __builtin_ffs(unsigned int);
+
+extern int __builtin_ffsl(unsigned int);
+
+extern int __builtin_ffsll(unsigned int);
+
+extern void *__builtin_frame_address(unsigned int);
+
+extern double __builtin_floor(double);
+
+extern float __builtin_floorf(float);
+
+extern double __builtin_floorl(double);
+
+extern double __builtin_huge_val(void);
+
+extern float __builtin_huge_valf(void);
+
+extern double __builtin_huge_vall(void);
+
+extern double __builtin_inf(void);
+
+extern float __builtin_inff(void);
+
+extern double __builtin_infl(void);
+
+extern void *__builtin_memcpy(void *, void *, unsigned int);
+
+extern void *__builtin_mempcpy(void *, void *, unsigned int);
+
+extern double __builtin_fmod(double);
+
+extern float __builtin_fmodf(float);
+
+extern double __builtin_fmodl(double);
+
+extern double __builtin_frexp(double, int *);
+
+extern float __builtin_frexpf(float, int *);
+
+extern double __builtin_frexpl(double, int *);
+
+extern double __builtin_ldexp(double, int);
+
+extern float __builtin_ldexpf(float, int);
+
+extern double __builtin_ldexpl(double, int);
+
+extern double __builtin_log(double);
+
+extern float __builtin_logf(float);
+
+extern double __builtin_logl(double);
+
+extern double __builtin_log10(double);
+
+extern float __builtin_log10f(float);
+
+extern double __builtin_log10l(double);
+
+extern float __builtin_modff(float, float *);
+
+extern double __builtin_modfl(double, double *);
+
+extern double __builtin_nan(unsigned char *);
+
+extern float __builtin_nanf(unsigned char *);
+
+extern double __builtin_nanl(unsigned char *);
+
+extern double __builtin_nans(unsigned char *);
+
+extern float __builtin_nansf(unsigned char *);
+
+extern double __builtin_nansl(unsigned char *);
+
+extern void *__builtin_next_arg(void);
+
+extern unsigned int __builtin_object_size(void *, int);
+
+extern int __builtin_parity(unsigned int);
+
+extern int __builtin_parityl(unsigned int);
+
+extern int __builtin_parityll(unsigned int);
+
+extern int __builtin_popcount(unsigned int);
+
+extern int __builtin_popcountl(unsigned int);
+
+extern int __builtin_popcountll(unsigned int);
+
+extern double __builtin_powi(double, int);
+
+extern float __builtin_powif(float, int);
+
+extern double __builtin_powil(double, int);
+
+extern void __builtin_return(void *);
+
+extern void *__builtin_return_address(unsigned int);
+
+extern double __builtin_sin(double);
+
+extern float __builtin_sinf(float);
+
+extern double __builtin_sinl(double);
+
+extern double __builtin_sinh(double);
+
+extern float __builtin_sinhf(float);
+
+extern double __builtin_sinhl(double);
+
+extern double __builtin_sqrt(double);
+
+extern float __builtin_sqrtf(float);
+
+extern double __builtin_sqrtl(double);
+
+extern unsigned char *__builtin_stpcpy(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strchr(unsigned char *, unsigned char);
+
+extern int __builtin_strcmp(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strcpy(unsigned char *, unsigned char *);
+
+extern unsigned int __builtin_strcspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strncat(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strncmp(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin_strncpy(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strpbrk(unsigned char *, unsigned char *);
+
+extern int __builtin_types_compatible_p(unsigned int, unsigned int);
+
+extern double __builtin_tan(double);
+
+extern float __builtin_tanf(float);
+
+extern double __builtin_tanl(double);
+
+extern double __builtin_tanh(double);
+
+extern float __builtin_tanhf(float);
+
+extern double __builtin_tanhl(double);
+
+extern void __builtin_va_end(void *);
+
+extern void __builtin_varargs_start(void *);
+
+extern void __builtin_va_start(void *, void *);
+
+extern void __builtin_stdarg_start(void *);
+
+extern void __builtin_va_arg(void *, unsigned int);
+
+extern void __builtin_va_copy(void *, void *);
+
+int fib(int n)
+{
+ int t;
+ int t__1;
+ c4:
+ if (n < 2) {
+ c3:
+ return 1;
+ } else {
+ c2:
+ t = fib(n - 1);
+ c1:
+ t__1 = fib(n - 2);
+ c0:
+ return t + t__1;
+ }
+}
+
+int main(void)
+{
+ int t;
+ c6:
+ t = fib(10);
+ c5:
+ return t;
+}
+
+
--- /dev/null
+
+
+
+extern "__builtin___memcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memmove_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___mempcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memset_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___stpcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcat_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strncat_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___strncpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vfprintf_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vprintf_chk" : int -> int -> int -> int
+
+
+extern "__builtin___vsnprintf_chk" : int -> int -> int -> int -> int -> int -> int
+
+
+extern "__builtin___vsprintf_chk" : int -> int -> int -> int -> int -> int
+
+
+extern "__builtin_acos" : float -> float
+
+
+extern "__builtin_acosf" : float -> float
+
+
+extern "__builtin_acosl" : float -> float
+
+
+extern "__builtin_alloca" : int -> int
+
+
+extern "__builtin_asin" : float -> float
+
+
+extern "__builtin_asinf" : float -> float
+
+
+extern "__builtin_asinl" : float -> float
+
+
+extern "__builtin_atan" : float -> float
+
+
+extern "__builtin_atanf" : float -> float
+
+
+extern "__builtin_atanl" : float -> float
+
+
+extern "__builtin_atan2" : float -> float -> float
+
+
+extern "__builtin_atan2f" : float -> float -> float
+
+
+extern "__builtin_atan2l" : float -> float -> float
+
+
+extern "__builtin_ceil" : float -> float
+
+
+extern "__builtin_ceilf" : float -> float
+
+
+extern "__builtin_ceill" : float -> float
+
+
+extern "__builtin_cos" : float -> float
+
+
+extern "__builtin_cosf" : float -> float
+
+
+extern "__builtin_cosl" : float -> float
+
+
+extern "__builtin_cosh" : float -> float
+
+
+extern "__builtin_coshf" : float -> float
+
+
+extern "__builtin_coshl" : float -> float
+
+
+extern "__builtin_clz" : int -> int
+
+
+extern "__builtin_clzl" : int -> int
+
+
+extern "__builtin_clzll" : int -> int
+
+
+extern "__builtin_constant_p" : int -> int
+
+
+extern "__builtin_ctz" : int -> int
+
+
+extern "__builtin_ctzl" : int -> int
+
+
+extern "__builtin_ctzll" : int -> int
+
+
+extern "__builtin_exp" : float -> float
+
+
+extern "__builtin_expf" : float -> float
+
+
+extern "__builtin_expl" : float -> float
+
+
+extern "__builtin_expect" : int -> int -> int
+
+
+extern "__builtin_fabs" : float -> float
+
+
+extern "__builtin_fabsf" : float -> float
+
+
+extern "__builtin_fabsl" : float -> float
+
+
+extern "__builtin_ffs" : int -> int
+
+
+extern "__builtin_ffsl" : int -> int
+
+
+extern "__builtin_ffsll" : int -> int
+
+
+extern "__builtin_frame_address" : int -> int
+
+
+extern "__builtin_floor" : float -> float
+
+
+extern "__builtin_floorf" : float -> float
+
+
+extern "__builtin_floorl" : float -> float
+
+
+extern "__builtin_huge_val" : float
+
+
+extern "__builtin_huge_valf" : float
+
+
+extern "__builtin_huge_vall" : float
+
+
+extern "__builtin_inf" : float
+
+
+extern "__builtin_inff" : float
+
+
+extern "__builtin_infl" : float
+
+
+extern "__builtin_memcpy" : int -> int -> int -> int
+
+
+extern "__builtin_mempcpy" : int -> int -> int -> int
+
+
+extern "__builtin_fmod" : float -> float
+
+
+extern "__builtin_fmodf" : float -> float
+
+
+extern "__builtin_fmodl" : float -> float
+
+
+extern "__builtin_frexp" : float -> int -> float
+
+
+extern "__builtin_frexpf" : float -> int -> float
+
+
+extern "__builtin_frexpl" : float -> int -> float
+
+
+extern "__builtin_ldexp" : float -> int -> float
+
+
+extern "__builtin_ldexpf" : float -> int -> float
+
+
+extern "__builtin_ldexpl" : float -> int -> float
+
+
+extern "__builtin_log" : float -> float
+
+
+extern "__builtin_logf" : float -> float
+
+
+extern "__builtin_logl" : float -> float
+
+
+extern "__builtin_log10" : float -> float
+
+
+extern "__builtin_log10f" : float -> float
+
+
+extern "__builtin_log10l" : float -> float
+
+
+extern "__builtin_modff" : float -> int -> float
+
+
+extern "__builtin_modfl" : float -> int -> float
+
+
+extern "__builtin_nan" : int -> float
+
+
+extern "__builtin_nanf" : int -> float
+
+
+extern "__builtin_nanl" : int -> float
+
+
+extern "__builtin_nans" : int -> float
+
+
+extern "__builtin_nansf" : int -> float
+
+
+extern "__builtin_nansl" : int -> float
+
+
+extern "__builtin_next_arg" : int
+
+
+extern "__builtin_object_size" : int -> int -> int
+
+
+extern "__builtin_parity" : int -> int
+
+
+extern "__builtin_parityl" : int -> int
+
+
+extern "__builtin_parityll" : int -> int
+
+
+extern "__builtin_popcount" : int -> int
+
+
+extern "__builtin_popcountl" : int -> int
+
+
+extern "__builtin_popcountll" : int -> int
+
+
+extern "__builtin_powi" : float -> int -> float
+
+
+extern "__builtin_powif" : float -> int -> float
+
+
+extern "__builtin_powil" : float -> int -> float
+
+
+extern "__builtin_return" : int -> void
+
+
+extern "__builtin_return_address" : int -> int
+
+
+extern "__builtin_sin" : float -> float
+
+
+extern "__builtin_sinf" : float -> float
+
+
+extern "__builtin_sinl" : float -> float
+
+
+extern "__builtin_sinh" : float -> float
+
+
+extern "__builtin_sinhf" : float -> float
+
+
+extern "__builtin_sinhl" : float -> float
+
+
+extern "__builtin_sqrt" : float -> float
+
+
+extern "__builtin_sqrtf" : float -> float
+
+
+extern "__builtin_sqrtl" : float -> float
+
+
+extern "__builtin_stpcpy" : int -> int -> int
+
+
+extern "__builtin_strchr" : int -> int -> int
+
+
+extern "__builtin_strcmp" : int -> int -> int
+
+
+extern "__builtin_strcpy" : int -> int -> int
+
+
+extern "__builtin_strcspn" : int -> int -> int
+
+
+extern "__builtin_strncat" : int -> int -> int -> int
+
+
+extern "__builtin_strncmp" : int -> int -> int -> int
+
+
+extern "__builtin_strncpy" : int -> int -> int -> int
+
+
+extern "__builtin_strspn" : int -> int -> int
+
+
+extern "__builtin_strpbrk" : int -> int -> int
+
+
+extern "__builtin_types_compatible_p" : int -> int -> int
+
+
+extern "__builtin_tan" : float -> float
+
+
+extern "__builtin_tanf" : float -> float
+
+
+extern "__builtin_tanl" : float -> float
+
+
+extern "__builtin_tanh" : float -> float
+
+
+extern "__builtin_tanhf" : float -> float
+
+
+extern "__builtin_tanhl" : float -> float
+
+
+extern "__builtin_va_end" : int -> void
+
+
+extern "__builtin_varargs_start" : int -> void
+
+
+extern "__builtin_va_start" : int -> int -> void
+
+
+extern "__builtin_stdarg_start" : int -> void
+
+
+extern "__builtin_va_arg" : int -> int -> void
+
+
+extern "__builtin_va_copy" : int -> int -> void
+
+
+"fib" (n) : int -> int {
+
+ stack 0;
+
+ var t, t__1;
+
+ c4:
+ if (n < 2) {
+ c3:
+ return 1;
+ }
+ else {
+ c2:
+ t = "fib"(n - 1) : int -> int;
+ c1:
+ t__1 = "fib"(n - 2) : int -> int;
+ c0:
+ return t + t__1;
+ }
+
+}
+
+
+"main" () : int {
+
+ stack 0;
+
+ var t;
+
+ c6:
+ t = "fib"(10) : int -> int;
+ c5:
+ return t;
+
+}
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure fib(1)
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19
+entry fib37
+fib37: newframe --> fib36
+fib36: move %19, $ra --> fib35
+fib35: move %18, $s7 --> fib34
+fib34: move %17, $s6 --> fib33
+fib33: move %16, $s5 --> fib32
+fib32: move %15, $s4 --> fib31
+fib31: move %14, $s3 --> fib30
+fib30: move %13, $s2 --> fib29
+fib29: move %12, $s1 --> fib28
+fib28: move %11, $s0 --> fib27
+fib27: move %0, $a0 --> fib26
+fib26: li %1, 0 --> fib25
+fib25: li %2, 0 --> fib24
+fib24: li %4, 0 --> fib23
+fib23: li %5, 0 --> fib22
+fib22: li %6, 0 --> fib21
+fib21: li %7, 0 --> fib20
+fib20: li %8, 0 --> fib19
+fib19: li %9, 0 --> fib18
+fib18: li %10, 0 --> fib17
+fib17: emit c4 --> fib16
+fib16: li %9, 0 --> fib15
+fib15: li %10, 2 --> fib14
+fib14: slt %8, %0, %10 --> fib13
+fib13: beq %8, %9 --> fib10, fib12
+fib12: emit c3 --> fib11
+fib11: li %3, 1 --> fib0
+fib0 : j --> fib49
+fib49: move $v0, %3 --> fib48
+fib48: move $ra, %19 --> fib47
+fib47: move $s7, %18 --> fib46
+fib46: move $s6, %17 --> fib45
+fib45: move $s5, %16 --> fib44
+fib44: move $s4, %15 --> fib43
+fib43: move $s3, %14 --> fib42
+fib42: move $s2, %13 --> fib41
+fib41: move $s1, %12 --> fib40
+fib40: move $s0, %11 --> fib39
+fib39: delframe --> fib38
+fib38: jr $ra (xmits $v0)
+fib10: emit c2 --> fib9
+fib9 : li %7, 1 --> fib8
+fib8 : subu %6, %0, %7 --> fib7
+fib7 : j --> fib55
+fib55: move $a0, %6 --> fib54
+fib54: call fib(1) --> fib53
+fib53: move %1, $v0 --> fib6
+fib6 : emit c1 --> fib5
+fib5 : li %5, 2 --> fib4
+fib4 : subu %4, %0, %5 --> fib3
+fib3 : j --> fib52
+fib52: move $a0, %4 --> fib51
+fib51: call fib(1) --> fib50
+fib50: move %2, $v0 --> fib2
+fib2 : emit c0 --> fib1
+fib1 : addu %3, %1, %2 --> fib0
+
+procedure _main(0)
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11
+entry main17
+main17: newframe --> main16
+main16: move %11, $ra --> main15
+main15: move %10, $s7 --> main14
+main14: move %9, $s6 --> main13
+main13: move %8, $s5 --> main12
+main12: move %7, $s4 --> main11
+main11: move %6, $s3 --> main10
+main10: move %5, $s2 --> main9
+main9 : move %4, $s1 --> main8
+main8 : move %3, $s0 --> main7
+main7 : li %0, 0 --> main6
+main6 : li %2, 0 --> main5
+main5 : emit c6 --> main4
+main4 : li %2, 10 --> main3
+main3 : j --> main32
+main32: move $a0, %2 --> main31
+main31: call fib(1) --> main30
+main30: move %0, $v0 --> main2
+main2 : emit c5 --> main1
+main1 : move %1, %0 --> main0
+main0 : j --> main29
+main29: move $v0, %1 --> main28
+main28: move $ra, %11 --> main27
+main27: move $s7, %10 --> main26
+main26: move $s6, %9 --> main25
+main25: move $s5, %8 --> main24
+main24: move $s4, %7 --> main23
+main23: move $s3, %6 --> main22
+main22: move $s2, %5 --> main21
+main21: move $s1, %4 --> main20
+main20: move $s0, %3 --> main19
+main19: delframe --> main18
+main18: jr $ra (xmits $v0)
+
--- /dev/null
+program
+
+globals 0
+
+procedure fib(1)
+var 12
+fib37:
+newframe
+sets local(0), $ra
+sets local(4), $s1
+sets local(8), $s0
+move $s1, $a0
+c4:
+li $v0, 2
+slt $v0, $s1, $v0
+beq $v0, $zero, fib10
+c3:
+li $v0, 1
+fib48:
+gets $ra, local(0)
+gets $s1, local(4)
+gets $s0, local(8)
+delframe
+jr $ra
+fib10:
+c2:
+li $v0, 1
+subu $a0, $s1, $v0
+call fib
+move $s0, $v0
+c1:
+li $v0, 2
+subu $a0, $s1, $v0
+call fib
+c0:
+addu $v0, $s0, $v0
+j fib48
+
+procedure _main(0)
+var 4
+main17:
+newframe
+sets local(0), $ra
+c6:
+li $a0, 10
+call fib
+c5:
+gets $ra, local(0)
+delframe
+jr $ra
+
--- /dev/null
+program
+
+globals 0
+
+procedure fib(1)
+var 12
+entry fib37
+fib37: newframe --> fib36
+fib36: sets local(0), $ra --> fib35
+fib35: j --> fib34
+fib34: j --> fib33
+fib33: j --> fib32
+fib32: j --> fib31
+fib31: j --> fib30
+fib30: j --> fib29
+fib29: sets local(4), $s1 --> fib28
+fib28: sets local(8), $s0 --> fib27
+fib27: move $s1, $a0 --> fib26
+fib26: j --> fib25
+fib25: j --> fib24
+fib24: j --> fib23
+fib23: j --> fib22
+fib22: j --> fib21
+fib21: j --> fib20
+fib20: j --> fib19
+fib19: j --> fib18
+fib18: j --> fib17
+fib17: emit c4 --> fib16
+fib16: j --> fib15
+fib15: li $v0, 2 --> fib14
+fib14: slt $v0, $s1, $v0 --> fib13
+fib13: beq $v0, $zero --> fib10, fib12
+fib12: emit c3 --> fib11
+fib11: li $v0, 1 --> fib0
+fib0 : j --> fib49
+fib49: j --> fib48
+fib48: gets $ra, local(0) --> fib47
+fib47: j --> fib46
+fib46: j --> fib45
+fib45: j --> fib44
+fib44: j --> fib43
+fib43: j --> fib42
+fib42: j --> fib41
+fib41: gets $s1, local(4) --> fib40
+fib40: gets $s0, local(8) --> fib39
+fib39: delframe --> fib38
+fib38: jr $ra
+fib10: emit c2 --> fib9
+fib9 : li $v0, 1 --> fib8
+fib8 : subu $a0, $s1, $v0 --> fib7
+fib7 : j --> fib55
+fib55: j --> fib54
+fib54: call fib --> fib53
+fib53: move $s0, $v0 --> fib6
+fib6 : emit c1 --> fib5
+fib5 : li $v0, 2 --> fib4
+fib4 : subu $a0, $s1, $v0 --> fib3
+fib3 : j --> fib52
+fib52: j --> fib51
+fib51: call fib --> fib50
+fib50: j --> fib2
+fib2 : emit c0 --> fib1
+fib1 : addu $v0, $s0, $v0 --> fib0
+
+procedure _main(0)
+var 4
+entry main17
+main17: newframe --> main16
+main16: sets local(0), $ra --> main15
+main15: j --> main14
+main14: j --> main13
+main13: j --> main12
+main12: j --> main11
+main11: j --> main10
+main10: j --> main9
+main9 : j --> main8
+main8 : j --> main7
+main7 : j --> main6
+main6 : j --> main5
+main5 : emit c6 --> main4
+main4 : li $a0, 10 --> main3
+main3 : j --> main32
+main32: j --> main31
+main31: call fib --> main30
+main30: j --> main2
+main2 : emit c5 --> main1
+main1 : j --> main0
+main0 : j --> main29
+main29: j --> main28
+main28: gets $ra, local(0) --> main27
+main27: j --> main26
+main26: j --> main25
+main25: j --> main24
+main24: j --> main23
+main23: j --> main22
+main22: j --> main21
+main21: j --> main20
+main20: j --> main19
+main19: delframe --> main18
+main18: jr $ra
+
--- /dev/null
+program
+
+globals 0
+
+function fib(%0) : %3
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10
+entry fib26
+exit fib0
+fib26: li %1, 0 --> fib25
+fib25: li %2, 0 --> fib24
+fib24: li %4, 0 --> fib23
+fib23: li %5, 0 --> fib22
+fib22: li %6, 0 --> fib21
+fib21: li %7, 0 --> fib20
+fib20: li %8, 0 --> fib19
+fib19: li %9, 0 --> fib18
+fib18: li %10, 0 --> fib17
+fib17: emit c4 --> fib16
+fib16: li %9, 0 --> fib15
+fib15: li %10, 2 --> fib14
+fib14: slt %8, %0, %10 --> fib13
+fib13: beq %8, %9 --> fib10, fib12
+fib12: emit c3 --> fib11
+fib11: li %3, 1 --> fib0
+fib10: emit c2 --> fib9
+fib9 : li %7, 1 --> fib8
+fib8 : subu %6, %0, %7 --> fib7
+fib7 : call %1, fib(%6) --> fib6
+fib6 : emit c1 --> fib5
+fib5 : li %5, 2 --> fib4
+fib4 : subu %4, %0, %5 --> fib3
+fib3 : call %2, fib(%4) --> fib2
+fib2 : emit c0 --> fib1
+fib1 : addu %3, %1, %2 --> fib0
+
+function _main() : %1
+var %0, %1, %2
+entry main7
+exit main0
+main7: li %0, 0 --> main6
+main6: li %2, 0 --> main5
+main5: emit c6 --> main4
+main4: li %2, 10 --> main3
+main3: call %0, fib(%2) --> main2
+main2: emit c5 --> main1
+main1: move %1, %0 --> main0
+
--- /dev/null
+program: (main function is "main")
+
+
+ globals:
+
+
+ "__builtin___memcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memmove_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___mempcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memset_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___stpcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strcat_chk": int -> int -> int -> int
+
+
+ "__builtin___strcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strncat_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___strncpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vfprintf_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vprintf_chk": int -> int -> int -> int
+
+
+ "__builtin___vsnprintf_chk": int -> int -> int -> int -> int -> int -> int
+
+
+ "__builtin___vsprintf_chk": int -> int -> int -> int -> int -> int
+
+
+ "__builtin_acos": float -> float
+
+
+ "__builtin_acosf": float -> float
+
+
+ "__builtin_acosl": float -> float
+
+
+ "__builtin_alloca": int -> int
+
+
+ "__builtin_asin": float -> float
+
+
+ "__builtin_asinf": float -> float
+
+
+ "__builtin_asinl": float -> float
+
+
+ "__builtin_atan": float -> float
+
+
+ "__builtin_atanf": float -> float
+
+
+ "__builtin_atanl": float -> float
+
+
+ "__builtin_atan2": float -> float -> float
+
+
+ "__builtin_atan2f": float -> float -> float
+
+
+ "__builtin_atan2l": float -> float -> float
+
+
+ "__builtin_ceil": float -> float
+
+
+ "__builtin_ceilf": float -> float
+
+
+ "__builtin_ceill": float -> float
+
+
+ "__builtin_cos": float -> float
+
+
+ "__builtin_cosf": float -> float
+
+
+ "__builtin_cosl": float -> float
+
+
+ "__builtin_cosh": float -> float
+
+
+ "__builtin_coshf": float -> float
+
+
+ "__builtin_coshl": float -> float
+
+
+ "__builtin_clz": int -> int
+
+
+ "__builtin_clzl": int -> int
+
+
+ "__builtin_clzll": int -> int
+
+
+ "__builtin_constant_p": int -> int
+
+
+ "__builtin_ctz": int -> int
+
+
+ "__builtin_ctzl": int -> int
+
+
+ "__builtin_ctzll": int -> int
+
+
+ "__builtin_exp": float -> float
+
+
+ "__builtin_expf": float -> float
+
+
+ "__builtin_expl": float -> float
+
+
+ "__builtin_expect": int -> int -> int
+
+
+ "__builtin_fabs": float -> float
+
+
+ "__builtin_fabsf": float -> float
+
+
+ "__builtin_fabsl": float -> float
+
+
+ "__builtin_ffs": int -> int
+
+
+ "__builtin_ffsl": int -> int
+
+
+ "__builtin_ffsll": int -> int
+
+
+ "__builtin_frame_address": int -> int
+
+
+ "__builtin_floor": float -> float
+
+
+ "__builtin_floorf": float -> float
+
+
+ "__builtin_floorl": float -> float
+
+
+ "__builtin_huge_val": float
+
+
+ "__builtin_huge_valf": float
+
+
+ "__builtin_huge_vall": float
+
+
+ "__builtin_inf": float
+
+
+ "__builtin_inff": float
+
+
+ "__builtin_infl": float
+
+
+ "__builtin_memcpy": int -> int -> int -> int
+
+
+ "__builtin_mempcpy": int -> int -> int -> int
+
+
+ "__builtin_fmod": float -> float
+
+
+ "__builtin_fmodf": float -> float
+
+
+ "__builtin_fmodl": float -> float
+
+
+ "__builtin_frexp": float -> int -> float
+
+
+ "__builtin_frexpf": float -> int -> float
+
+
+ "__builtin_frexpl": float -> int -> float
+
+
+ "__builtin_ldexp": float -> int -> float
+
+
+ "__builtin_ldexpf": float -> int -> float
+
+
+ "__builtin_ldexpl": float -> int -> float
+
+
+ "__builtin_log": float -> float
+
+
+ "__builtin_logf": float -> float
+
+
+ "__builtin_logl": float -> float
+
+
+ "__builtin_log10": float -> float
+
+
+ "__builtin_log10f": float -> float
+
+
+ "__builtin_log10l": float -> float
+
+
+ "__builtin_modff": float -> int -> float
+
+
+ "__builtin_modfl": float -> int -> float
+
+
+ "__builtin_nan": int -> float
+
+
+ "__builtin_nanf": int -> float
+
+
+ "__builtin_nanl": int -> float
+
+
+ "__builtin_nans": int -> float
+
+
+ "__builtin_nansf": int -> float
+
+
+ "__builtin_nansl": int -> float
+
+
+ "__builtin_next_arg": int
+
+
+ "__builtin_object_size": int -> int -> int
+
+
+ "__builtin_parity": int -> int
+
+
+ "__builtin_parityl": int -> int
+
+
+ "__builtin_parityll": int -> int
+
+
+ "__builtin_popcount": int -> int
+
+
+ "__builtin_popcountl": int -> int
+
+
+ "__builtin_popcountll": int -> int
+
+
+ "__builtin_powi": float -> int -> float
+
+
+ "__builtin_powif": float -> int -> float
+
+
+ "__builtin_powil": float -> int -> float
+
+
+ "__builtin_return": int -> void
+
+
+ "__builtin_return_address": int -> int
+
+
+ "__builtin_sin": float -> float
+
+
+ "__builtin_sinf": float -> float
+
+
+ "__builtin_sinl": float -> float
+
+
+ "__builtin_sinh": float -> float
+
+
+ "__builtin_sinhf": float -> float
+
+
+ "__builtin_sinhl": float -> float
+
+
+ "__builtin_sqrt": float -> float
+
+
+ "__builtin_sqrtf": float -> float
+
+
+ "__builtin_sqrtl": float -> float
+
+
+ "__builtin_stpcpy": int -> int -> int
+
+
+ "__builtin_strchr": int -> int -> int
+
+
+ "__builtin_strcmp": int -> int -> int
+
+
+ "__builtin_strcpy": int -> int -> int
+
+
+ "__builtin_strcspn": int -> int -> int
+
+
+ "__builtin_strncat": int -> int -> int -> int
+
+
+ "__builtin_strncmp": int -> int -> int -> int
+
+
+ "__builtin_strncpy": int -> int -> int -> int
+
+
+ "__builtin_strspn": int -> int -> int
+
+
+ "__builtin_strpbrk": int -> int -> int
+
+
+ "__builtin_types_compatible_p": int -> int -> int
+
+
+ "__builtin_tan": float -> float
+
+
+ "__builtin_tanf": float -> float
+
+
+ "__builtin_tanl": float -> float
+
+
+ "__builtin_tanh": float -> float
+
+
+ "__builtin_tanhf": float -> float
+
+
+ "__builtin_tanhl": float -> float
+
+
+ "__builtin_va_end": int -> void
+
+
+ "__builtin_varargs_start": int -> void
+
+
+ "__builtin_va_start": int -> int -> void
+
+
+ "__builtin_stdarg_start": int -> void
+
+
+ "__builtin_va_arg": int -> int -> void
+
+
+ "__builtin_va_copy": int -> int -> void
+
+
+ "fib"(%0): int -> int
+ locals: %3, %1, %2, %4, %5, %6, %7, %8, %9, %10
+ result: %3
+ stacksize: 0
+ entry: fib17
+ exit: fib0
+
+ fib9: imm_int 1, %7, --> fib8
+ fib8: sub %6, %0, %7 --> fib7
+ fib7: call "fib", %6, %1: int -> int --> fib6
+ fib6: emit c1 --> fib5
+ fib5: imm_int 2, %5, --> fib4
+ fib4: sub %4, %0, %5 --> fib3
+ fib3: call "fib", %4, %2: int -> int --> fib2
+ fib2: emit c0 --> fib1
+ fib17: emit c4 --> fib16
+ fib16: imm_int 0, %9, --> fib15
+ fib15: imm_int 2, %10, --> fib14
+ fib14: lt %8, %0, %10 --> fib13
+ fib13: eq %8, %9 --> fib10, fib12
+ fib12: emit c3 --> fib11
+ fib11: imm_int 1, %3, --> fib0
+ fib10: emit c2 --> fib9
+ fib1: add %3, %1, %2 --> fib0
+ fib0: return %3
+
+
+ "main"(): int
+ locals: %1, %0, %2
+ result: %1
+ stacksize: 0
+ entry: main5
+ exit: main0
+
+ main5: emit c6 --> main4
+ main4: imm_int 10, %2, --> main3
+ main3: call "fib", %2, %0: int -> int --> main2
+ main2: emit c5 --> main1
+ main1: mov %1, %0 --> main0
+ main0: return %1
+
+
--- /dev/null
+int fib (int n)
+{
+ if (n < 2)
+ return 1;
+ else {
+ return fib (n-1) + fib (n-2);
+ }
+}
+int main () {
+ return fib (10);
+}
--- /dev/null
+int fib (int n)
+{
+ if (n < 2)
+ return 1;
+ else {
+ return fib (n-1) + fib (n-2);
+ }
+}
+int main () {
+ return fib (10);
+}
--- /dev/null
+Warning (during instrumentation):
+ Clight instrumentation is not implemented yet.
+Checking execution traces...OK.
+thenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(5),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(8),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(5),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(13),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(5),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(8),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(21),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(5),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(8),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(5),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(13),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(34),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(5),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(8),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(5),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(13),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(5),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(8),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(21),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(55),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(5),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(8),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(5),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(13),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(5),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(8),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(21),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(5),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(8),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(seq,call)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(cost,call)
+Regular(ifthenelse,call)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(5),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(13),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(34),call)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(89),call)
+Regular(skip,seq)
+Regular(cost,stop)
+Regular(return,stop)
+Result: Int(89)
+Memory dump:
+n = 533
+block 1 : Free.
+
+block 2 : Free.
+
+block 3 : Free.
+
+block 4 : Free.
+
+block 5 : Free.
+
+block 6 : Free.
+
+block 7 : Free.
+
+block 8 : Free.
+
+block 9 : Free.
+
+block 10 : Free.
+
+block 11 : Free.
+
+block 12 : Free.
+
+block 13 : Free.
+
+block 14 : Free.
+
+block 15 : Free.
+
+block 16 : Free.
+
+block 17 : Free.
+
+block 18 : Free.
+
+block 19 : Free.
+
+block 20 : Free.
+
+block 21 : Free.
+
+block 22 : Free.
+
+block 23 : Free.
+
+block 24 : Free.
+
+block 25 : Free.
+
+block 26 : Free.
+
+block 27 : Free.
+
+block 28 : Free.
+
+block 29 : Free.
+
+block 30 : Free.
+
+block 31 : Free.
+
+block 32 : Free.
+
+block 33 : Free.
+
+block 34 : Free.
+
+block 35 : Free.
+
+block 36 : Free.
+
+block 37 : Free.
+
+block 38 : Free.
+
+block 39 : Free.
+
+block 40 : Free.
+
+block 41 : Free.
+
+block 42 : Free.
+
+block 43 : Free.
+
+block 44 : Free.
+
+block 45 : Free.
+
+block 46 : Free.
+
+block 47 : Free.
+
+block 48 : Free.
+
+block 49 : Free.
+
+block 50 : Free.
+
+block 51 : Free.
+
+block 52 : Free.
+
+block 53 : Free.
+
+block 54 : Free.
+
+block 55 : Free.
+
+block 56 : Free.
+
+block 57 : Free.
+
+block 58 : Free.
+
+block 59 : Free.
+
+block 60 : Free.
+
+block 61 : Free.
+
+block 62 : Free.
+
+block 63 : Free.
+
+block 64 : Free.
+
+block 65 : Free.
+
+block 66 : Free.
+
+block 67 : Free.
+
+block 68 : Free.
+
+block 69 : Free.
+
+block 70 : Free.
+
+block 71 : Free.
+
+block 72 : Free.
+
+block 73 : Free.
+
+block 74 : Free.
+
+block 75 : Free.
+
+block 76 : Free.
+
+block 77 : Free.
+
+block 78 : Free.
+
+block 79 : Free.
+
+block 80 : Free.
+
+block 81 : Free.
+
+block 82 : Free.
+
+block 83 : Free.
+
+block 84 : Free.
+
+block 85 : Free.
+
+block 86 : Free.
+
+block 87 : Free.
+
+block 88 : Free.
+
+block 89 : Free.
+
+block 90 : Free.
+
+block 91 : Free.
+
+block 92 : Free.
+
+block 93 : Free.
+
+block 94 : Free.
+
+block 95 : Free.
+
+block 96 : Free.
+
+block 97 : Free.
+
+block 98 : Free.
+
+block 99 : Free.
+
+block 100 : Free.
+
+block 101 : Free.
+
+block 102 : Free.
+
+block 103 : Free.
+
+block 104 : Free.
+
+block 105 : Free.
+
+block 106 : Free.
+
+block 107 : Free.
+
+block 108 : Free.
+
+block 109 : Free.
+
+block 110 : Free.
+
+block 111 : Free.
+
+block 112 : Free.
+
+block 113 : Free.
+
+block 114 : Free.
+
+block 115 : Free.
+
+block 116 : Free.
+
+block 117 : Free.
+
+block 118 : Free.
+
+block 119 : Free.
+
+block 120 : Free.
+
+block 121 : Free.
+
+block 122 : Free.
+
+block 123 : Free.
+
+block 124 : Free.
+
+block 125 : Free.
+
+block 126 : Free.
+
+block 127 : Free.
+
+block 128 : Free.
+
+block 129 : Free.
+
+block 130 : Free.
+
+block 131 : Free.
+
+block 132 : Free.
+
+block 133 : Free.
+
+block 134 : Free.
+
+block 135 : Free.
+
+block 136 : Free.
+
+block 137 : Free.
+
+block 138 : Free.
+
+block 139 : Free.
+
+block 140 : Free.
+
+block 141 : Free.
+
+block 142 : Free.
+
+block 143 : Free.
+
+block 144 : Free.
+
+block 145 : Free.
+
+block 146 : Free.
+
+block 147 : Free.
+
+block 148 : Free.
+
+block 149 : Free.
+
+block 150 : Free.
+
+block 151 : Free.
+
+block 152 : Free.
+
+block 153 : Free.
+
+block 154 : Free.
+
+block 155 : Free.
+
+block 156 : Free.
+
+block 157 : Free.
+
+block 158 : Free.
+
+block 159 : Free.
+
+block 160 : Free.
+
+block 161 : Free.
+
+block 162 : Free.
+
+block 163 : Free.
+
+block 164 : Free.
+
+block 165 : Free.
+
+block 166 : Free.
+
+block 167 : Free.
+
+block 168 : Free.
+
+block 169 : Free.
+
+block 170 : Free.
+
+block 171 : Free.
+
+block 172 : Free.
+
+block 173 : Free.
+
+block 174 : Free.
+
+block 175 : Free.
+
+block 176 : Free.
+
+block 177 : Free.
+
+block 178 : Free.
+
+block 179 : Free.
+
+block 180 : Free.
+
+block 181 : Free.
+
+block 182 : Free.
+
+block 183 : Free.
+
+block 184 : Free.
+
+block 185 : Free.
+
+block 186 : Free.
+
+block 187 : Free.
+
+block 188 : Free.
+
+block 189 : Free.
+
+block 190 : Free.
+
+block 191 : Free.
+
+block 192 : Free.
+
+block 193 : Free.
+
+block 194 : Free.
+
+block 195 : Free.
+
+block 196 : Free.
+
+block 197 : Free.
+
+block 198 : Free.
+
+block 199 : Free.
+
+block 200 : Free.
+
+block 201 : Free.
+
+block 202 : Free.
+
+block 203 : Free.
+
+block 204 : Free.
+
+block 205 : Free.
+
+block 206 : Free.
+
+block 207 : Free.
+
+block 208 : Free.
+
+block 209 : Free.
+
+block 210 : Free.
+
+block 211 : Free.
+
+block 212 : Free.
+
+block 213 : Free.
+
+block 214 : Free.
+
+block 215 : Free.
+
+block 216 : Free.
+
+block 217 : Free.
+
+block 218 : Free.
+
+block 219 : Free.
+
+block 220 : Free.
+
+block 221 : Free.
+
+block 222 : Free.
+
+block 223 : Free.
+
+block 224 : Free.
+
+block 225 : Free.
+
+block 226 : Free.
+
+block 227 : Free.
+
+block 228 : Free.
+
+block 229 : Free.
+
+block 230 : Free.
+
+block 231 : Free.
+
+block 232 : Free.
+
+block 233 : Free.
+
+block 234 : Free.
+
+block 235 : Free.
+
+block 236 : Free.
+
+block 237 : Free.
+
+block 238 : Free.
+
+block 239 : Free.
+
+block 240 : Free.
+
+block 241 : Free.
+
+block 242 : Free.
+
+block 243 : Free.
+
+block 244 : Free.
+
+block 245 : Free.
+
+block 246 : Free.
+
+block 247 : Free.
+
+block 248 : Free.
+
+block 249 : Free.
+
+block 250 : Free.
+
+block 251 : Free.
+
+block 252 : Free.
+
+block 253 : Free.
+
+block 254 : Free.
+
+block 255 : Free.
+
+block 256 : Free.
+
+block 257 : Free.
+
+block 258 : Free.
+
+block 259 : Free.
+
+block 260 : Free.
+
+block 261 : Free.
+
+block 262 : Free.
+
+block 263 : Free.
+
+block 264 : Free.
+
+block 265 : Free.
+
+block 266 : Free.
+
+block 267 : Free.
+
+block 268 : Free.
+
+block 269 : Free.
+
+block 270 : Free.
+
+block 271 : Free.
+
+block 272 : Free.
+
+block 273 : Free.
+
+block 274 : Free.
+
+block 275 : Free.
+
+block 276 : Free.
+
+block 277 : Free.
+
+block 278 : Free.
+
+block 279 : Free.
+
+block 280 : Free.
+
+block 281 : Free.
+
+block 282 : Free.
+
+block 283 : Free.
+
+block 284 : Free.
+
+block 285 : Free.
+
+block 286 : Free.
+
+block 287 : Free.
+
+block 288 : Free.
+
+block 289 : Free.
+
+block 290 : Free.
+
+block 291 : Free.
+
+block 292 : Free.
+
+block 293 : Free.
+
+block 294 : Free.
+
+block 295 : Free.
+
+block 296 : Free.
+
+block 297 : Free.
+
+block 298 : Free.
+
+block 299 : Free.
+
+block 300 : Free.
+
+block 301 : Free.
+
+block 302 : Free.
+
+block 303 : Free.
+
+block 304 : Free.
+
+block 305 : Free.
+
+block 306 : Free.
+
+block 307 : Free.
+
+block 308 : Free.
+
+block 309 : Free.
+
+block 310 : Free.
+
+block 311 : Free.
+
+block 312 : Free.
+
+block 313 : Free.
+
+block 314 : Free.
+
+block 315 : Free.
+
+block 316 : Free.
+
+block 317 : Free.
+
+block 318 : Free.
+
+block 319 : Free.
+
+block 320 : Free.
+
+block 321 : Free.
+
+block 322 : Free.
+
+block 323 : Free.
+
+block 324 : Free.
+
+block 325 : Free.
+
+block 326 : Free.
+
+block 327 : Free.
+
+block 328 : Free.
+
+block 329 : Free.
+
+block 330 : Free.
+
+block 331 : Free.
+
+block 332 : Free.
+
+block 333 : Free.
+
+block 334 : Free.
+
+block 335 : Free.
+
+block 336 : Free.
+
+block 337 : Free.
+
+block 338 : Free.
+
+block 339 : Free.
+
+block 340 : Free.
+
+block 341 : Free.
+
+block 342 : Free.
+
+block 343 : Free.
+
+block 344 : Free.
+
+block 345 : Free.
+
+block 346 : Free.
+
+block 347 : Free.
+
+block 348 : Free.
+
+block 349 : Free.
+
+block 350 : Free.
+
+block 351 : Free.
+
+block 352 : Free.
+
+block 353 : Free.
+
+block 354 : Free.
+
+block 355 : Free.
+
+block 356 : Free.
+
+block 357 : Free.
+
+block 358 : Free.
+
+block 359 : Free.
+
+block 360 : Free.
+
+block 361 : Free.
+
+block 362 : Free.
+
+block 363 : Free.
+
+block 364 : Free.
+
+block 365 : Free.
+
+block 366 : Free.
+
+block 367 : Free.
+
+block 368 : Free.
+
+block 369 : Free.
+
+block 370 : Free.
+
+block 371 : Free.
+
+block 372 : Free.
+
+block 373 : Free.
+
+block 374 : Free.
+
+block 375 : Free.
+
+block 376 : Free.
+
+block 377 : Free.
+
+block 378 : Free.
+
+block 379 : Free.
+
+block 380 : Free.
+
+block 381 : Free.
+
+block 382 : Free.
+
+block 383 : Free.
+
+block 384 : Free.
+
+block 385 : Free.
+
+block 386 : Free.
+
+block 387 : Free.
+
+block 388 : Free.
+
+block 389 : Free.
+
+block 390 : Free.
+
+block 391 : Free.
+
+block 392 : Free.
+
+block 393 : Free.
+
+block 394 : Free.
+
+block 395 : Free.
+
+block 396 : Free.
+
+block 397 : Free.
+
+block 398 : Free.
+
+block 399 : Free.
+
+block 400 : Free.
+
+block 401 : Free.
+
+block 402 : Free.
+
+block 403 : Free.
+
+block 404 : Free.
+
+block 405 : Free.
+
+block 406 : Free.
+
+block 407 : Free.
+
+block 408 : Free.
+
+block 409 : Free.
+
+block 410 : Free.
+
+block 411 : Free.
+
+block 412 : Free.
+
+block 413 : Free.
+
+block 414 : Free.
+
+block 415 : Free.
+
+block 416 : Free.
+
+block 417 : Free.
+
+block 418 : Free.
+
+block 419 : Free.
+
+block 420 : Free.
+
+block 421 : Free.
+
+block 422 : Free.
+
+block 423 : Free.
+
+block 424 : Free.
+
+block 425 : Free.
+
+block 426 : Free.
+
+block 427 : Free.
+
+block 428 : Free.
+
+block 429 : Free.
+
+block 430 : Free.
+
+block 431 : Free.
+
+block 432 : Free.
+
+block 433 : Free.
+
+block 434 : Free.
+
+block 435 : Free.
+
+block 436 : Free.
+
+block 437 : Free.
+
+block 438 : Free.
+
+block 439 : Free.
+
+block 440 : Free.
+
+block 441 : Free.
+
+block 442 : Free.
+
+block 443 : Free.
+
+block 444 : Free.
+
+block 445 : Free.
+
+block 446 : Free.
+
+block 447 : Free.
+
+block 448 : Free.
+
+block 449 : Free.
+
+block 450 : Free.
+
+block 451 : Free.
+
+block 452 : Free.
+
+block 453 : Free.
+
+block 454 : Free.
+
+block 455 : Free.
+
+block 456 : Free.
+
+block 457 : Free.
+
+block 458 : Free.
+
+block 459 : Free.
+
+block 460 : Free.
+
+block 461 : Free.
+
+block 462 : Free.
+
+block 463 : Free.
+
+block 464 : Free.
+
+block 465 : Free.
+
+block 466 : Free.
+
+block 467 : Free.
+
+block 468 : Free.
+
+block 469 : Free.
+
+block 470 : Free.
+
+block 471 : Free.
+
+block 472 : Free.
+
+block 473 : Free.
+
+block 474 : Free.
+
+block 475 : Free.
+
+block 476 : Free.
+
+block 477 : Free.
+
+block 478 : Free.
+
+block 479 : Free.
+
+block 480 : Free.
+
+block 481 : Free.
+
+block 482 : Free.
+
+block 483 : Free.
+
+block 484 : Free.
+
+block 485 : Free.
+
+block 486 : Free.
+
+block 487 : Free.
+
+block 488 : Free.
+
+block 489 : Free.
+
+block 490 : Free.
+
+block 491 : Free.
+
+block 492 : Free.
+
+block 493 : Free.
+
+block 494 : Free.
+
+block 495 : Free.
+
+block 496 : Free.
+
+block 497 : Free.
+
+block 498 : Free.
+
+block 499 : Free.
+
+block 500 : Free.
+
+block 501 : Free.
+
+block 502 : Free.
+
+block 503 : Free.
+
+block 504 : Free.
+
+block 505 : Free.
+
+block 506 : Free.
+
+block 507 : Free.
+
+block 508 : Free.
+
+block 509 : Free.
+
+block 510 : Free.
+
+block 511 : Free.
+
+block 512 : Free.
+
+block 513 : Free.
+
+block 514 : Free.
+
+block 515 : Free.
+
+block 516 : Free.
+
+block 517 : Free.
+
+block 518 : Free.
+
+block 519 : Free.
+
+block 520 : Free.
+
+block 521 : Free.
+
+block 522 : Free.
+
+block 523 : Free.
+
+block 524 : Free.
+
+block 525 : Free.
+
+block 526 : Free.
+
+block 527 : Free.
+
+block 528 : Free.
+
+block 529 : Free.
+
+block 530 : Free.
+
+block 531 : Free.
+
+block 532 : Free.
+
+State_call { function() - stop }
+State_regular { seq - stop }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(10)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(9)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(8)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(7)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(6)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(5)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(4)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(5) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(8) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(4)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(5) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(13) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(5)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(4)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(5) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(8) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(21) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(6)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(5)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(4)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(5) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(8) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(4)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(5) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(13) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(34) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(7)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(6)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(5)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(4)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(5) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(8) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(4)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(5) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(13) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(5)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(4)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(5) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(8) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(21) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(55) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(8)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(7)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(6)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(5)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(4)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(5) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(8) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(4)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(5) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(13) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(5)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(4)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(5) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(8) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(21) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(6)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(5)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(4)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(5) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(8) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(4)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(3)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(2)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { seq - returnto }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(0)) - returnto }
+State_regular { cost - returnto }
+State_regular { ifthenelse - returnto }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(5) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(13) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(34) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(89) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - stop }
+State_regular { return - stop }
+Result: Int(89)
+Memory dump:
+n = 179
+block 1 : Free.
+
+block 2 : Free.
+
+block 3 : Free.
+
+block 4 : Free.
+
+block 5 : Free.
+
+block 6 : Free.
+
+block 7 : Free.
+
+block 8 : Free.
+
+block 9 : Free.
+
+block 10 : Free.
+
+block 11 : Free.
+
+block 12 : Free.
+
+block 13 : Free.
+
+block 14 : Free.
+
+block 15 : Free.
+
+block 16 : Free.
+
+block 17 : Free.
+
+block 18 : Free.
+
+block 19 : Free.
+
+block 20 : Free.
+
+block 21 : Free.
+
+block 22 : Free.
+
+block 23 : Free.
+
+block 24 : Free.
+
+block 25 : Free.
+
+block 26 : Free.
+
+block 27 : Free.
+
+block 28 : Free.
+
+block 29 : Free.
+
+block 30 : Free.
+
+block 31 : Free.
+
+block 32 : Free.
+
+block 33 : Free.
+
+block 34 : Free.
+
+block 35 : Free.
+
+block 36 : Free.
+
+block 37 : Free.
+
+block 38 : Free.
+
+block 39 : Free.
+
+block 40 : Free.
+
+block 41 : Free.
+
+block 42 : Free.
+
+block 43 : Free.
+
+block 44 : Free.
+
+block 45 : Free.
+
+block 46 : Free.
+
+block 47 : Free.
+
+block 48 : Free.
+
+block 49 : Free.
+
+block 50 : Free.
+
+block 51 : Free.
+
+block 52 : Free.
+
+block 53 : Free.
+
+block 54 : Free.
+
+block 55 : Free.
+
+block 56 : Free.
+
+block 57 : Free.
+
+block 58 : Free.
+
+block 59 : Free.
+
+block 60 : Free.
+
+block 61 : Free.
+
+block 62 : Free.
+
+block 63 : Free.
+
+block 64 : Free.
+
+block 65 : Free.
+
+block 66 : Free.
+
+block 67 : Free.
+
+block 68 : Free.
+
+block 69 : Free.
+
+block 70 : Free.
+
+block 71 : Free.
+
+block 72 : Free.
+
+block 73 : Free.
+
+block 74 : Free.
+
+block 75 : Free.
+
+block 76 : Free.
+
+block 77 : Free.
+
+block 78 : Free.
+
+block 79 : Free.
+
+block 80 : Free.
+
+block 81 : Free.
+
+block 82 : Free.
+
+block 83 : Free.
+
+block 84 : Free.
+
+block 85 : Free.
+
+block 86 : Free.
+
+block 87 : Free.
+
+block 88 : Free.
+
+block 89 : Free.
+
+block 90 : Free.
+
+block 91 : Free.
+
+block 92 : Free.
+
+block 93 : Free.
+
+block 94 : Free.
+
+block 95 : Free.
+
+block 96 : Free.
+
+block 97 : Free.
+
+block 98 : Free.
+
+block 99 : Free.
+
+block 100 : Free.
+
+block 101 : Free.
+
+block 102 : Free.
+
+block 103 : Free.
+
+block 104 : Free.
+
+block 105 : Free.
+
+block 106 : Free.
+
+block 107 : Free.
+
+block 108 : Free.
+
+block 109 : Free.
+
+block 110 : Free.
+
+block 111 : Free.
+
+block 112 : Free.
+
+block 113 : Free.
+
+block 114 : Free.
+
+block 115 : Free.
+
+block 116 : Free.
+
+block 117 : Free.
+
+block 118 : Free.
+
+block 119 : Free.
+
+block 120 : Free.
+
+block 121 : Free.
+
+block 122 : Free.
+
+block 123 : Free.
+
+block 124 : Free.
+
+block 125 : Free.
+
+block 126 : Free.
+
+block 127 : Free.
+
+block 128 : Free.
+
+block 129 : Free.
+
+block 130 : Free.
+
+block 131 : Free.
+
+block 132 : Free.
+
+block 133 : Free.
+
+block 134 : Free.
+
+block 135 : Free.
+
+block 136 : Free.
+
+block 137 : Free.
+
+block 138 : Free.
+
+block 139 : Free.
+
+block 140 : Free.
+
+block 141 : Free.
+
+block 142 : Free.
+
+block 143 : Free.
+
+block 144 : Free.
+
+block 145 : Free.
+
+block 146 : Free.
+
+block 147 : Free.
+
+block 148 : Free.
+
+block 149 : Free.
+
+block 150 : Free.
+
+block 151 : Free.
+
+block 152 : Free.
+
+block 153 : Free.
+
+block 154 : Free.
+
+block 155 : Free.
+
+block 156 : Free.
+
+block 157 : Free.
+
+block 158 : Free.
+
+block 159 : Free.
+
+block 160 : Free.
+
+block 161 : Free.
+
+block 162 : Free.
+
+block 163 : Free.
+
+block 164 : Free.
+
+block 165 : Free.
+
+block 166 : Free.
+
+block 167 : Free.
+
+block 168 : Free.
+
+block 169 : Free.
+
+block 170 : Free.
+
+block 171 : Free.
+
+block 172 : Free.
+
+block 173 : Free.
+
+block 174 : Free.
+
+block 175 : Free.
+
+block 176 : Free.
+
+block 177 : Free.
+
+block 178 : Free.
+
--- /dev/null
+# extern __builtin_varargs_start: int -> void
+# extern __builtin_va_start: int -> int -> void
+# extern __builtin_va_end: int -> void
+# extern __builtin_va_copy: int -> int -> void
+# extern __builtin_va_arg: int -> int -> void
+# extern __builtin_types_compatible_p: int -> int -> int
+# extern __builtin_tanl: float -> float
+# extern __builtin_tanhl: float -> float
+# extern __builtin_tanhf: float -> float
+# extern __builtin_tanh: float -> float
+# extern __builtin_tanf: float -> float
+# extern __builtin_tan: float -> float
+# extern __builtin_strspn: int -> int -> int
+# extern __builtin_strpbrk: int -> int -> int
+# extern __builtin_strncpy: int -> int -> int -> int
+# extern __builtin_strncmp: int -> int -> int -> int
+# extern __builtin_strncat: int -> int -> int -> int
+# extern __builtin_strcspn: int -> int -> int
+# extern __builtin_strcpy: int -> int -> int
+# extern __builtin_strcmp: int -> int -> int
+# extern __builtin_strchr: int -> int -> int
+# extern __builtin_stpcpy: int -> int -> int
+# extern __builtin_stdarg_start: int -> void
+# extern __builtin_sqrtl: float -> float
+# extern __builtin_sqrtf: float -> float
+# extern __builtin_sqrt: float -> float
+# extern __builtin_sinl: float -> float
+# extern __builtin_sinhl: float -> float
+# extern __builtin_sinhf: float -> float
+# extern __builtin_sinh: float -> float
+# extern __builtin_sinf: float -> float
+# extern __builtin_sin: float -> float
+# extern __builtin_return_address: int -> int
+# extern __builtin_return: int -> void
+# extern __builtin_powil: float -> int -> float
+# extern __builtin_powif: float -> int -> float
+# extern __builtin_powi: float -> int -> float
+# extern __builtin_popcountll: int -> int
+# extern __builtin_popcountl: int -> int
+# extern __builtin_popcount: int -> int
+# extern __builtin_parityll: int -> int
+# extern __builtin_parityl: int -> int
+# extern __builtin_parity: int -> int
+# extern __builtin_object_size: int -> int -> int
+# extern __builtin_next_arg: int
+# extern __builtin_nansl: int -> float
+# extern __builtin_nansf: int -> float
+# extern __builtin_nans: int -> float
+# extern __builtin_nanl: int -> float
+# extern __builtin_nanf: int -> float
+# extern __builtin_nan: int -> float
+# extern __builtin_modfl: float -> int -> float
+# extern __builtin_modff: float -> int -> float
+# extern __builtin_mempcpy: int -> int -> int -> int
+# extern __builtin_memcpy: int -> int -> int -> int
+# extern __builtin_logl: float -> float
+# extern __builtin_logf: float -> float
+# extern __builtin_log10l: float -> float
+# extern __builtin_log10f: float -> float
+# extern __builtin_log10: float -> float
+# extern __builtin_log: float -> float
+# extern __builtin_ldexpl: float -> int -> float
+# extern __builtin_ldexpf: float -> int -> float
+# extern __builtin_ldexp: float -> int -> float
+# extern __builtin_infl: float
+# extern __builtin_inff: float
+# extern __builtin_inf: float
+# extern __builtin_huge_vall: float
+# extern __builtin_huge_valf: float
+# extern __builtin_huge_val: float
+# extern __builtin_frexpl: float -> int -> float
+# extern __builtin_frexpf: float -> int -> float
+# extern __builtin_frexp: float -> int -> float
+# extern __builtin_frame_address: int -> int
+# extern __builtin_fmodl: float -> float
+# extern __builtin_fmodf: float -> float
+# extern __builtin_fmod: float -> float
+# extern __builtin_floorl: float -> float
+# extern __builtin_floorf: float -> float
+# extern __builtin_floor: float -> float
+# extern __builtin_ffsll: int -> int
+# extern __builtin_ffsl: int -> int
+# extern __builtin_ffs: int -> int
+# extern __builtin_fabsl: float -> float
+# extern __builtin_fabsf: float -> float
+# extern __builtin_fabs: float -> float
+# extern __builtin_expl: float -> float
+# extern __builtin_expf: float -> float
+# extern __builtin_expect: int -> int -> int
+# extern __builtin_exp: float -> float
+# extern __builtin_ctzll: int -> int
+# extern __builtin_ctzl: int -> int
+# extern __builtin_ctz: int -> int
+# extern __builtin_cosl: float -> float
+# extern __builtin_coshl: float -> float
+# extern __builtin_coshf: float -> float
+# extern __builtin_cosh: float -> float
+# extern __builtin_cosf: float -> float
+# extern __builtin_cos: float -> float
+# extern __builtin_constant_p: int -> int
+# extern __builtin_clzll: int -> int
+# extern __builtin_clzl: int -> int
+# extern __builtin_clz: int -> int
+# extern __builtin_ceill: float -> float
+# extern __builtin_ceilf: float -> float
+# extern __builtin_ceil: float -> float
+# extern __builtin_atanl: float -> float
+# extern __builtin_atanf: float -> float
+# extern __builtin_atan2l: float -> float -> float
+# extern __builtin_atan2f: float -> float -> float
+# extern __builtin_atan2: float -> float -> float
+# extern __builtin_atan: float -> float
+# extern __builtin_asinl: float -> float
+# extern __builtin_asinf: float -> float
+# extern __builtin_asin: float -> float
+# extern __builtin_alloca: int -> int
+# extern __builtin_acosl: float -> float
+# extern __builtin_acosf: float -> float
+# extern __builtin_acos: float -> float
+# extern __builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+# extern __builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+# extern __builtin___vprintf_chk: int -> int -> int -> int
+# extern __builtin___vfprintf_chk: int -> int -> int -> int -> int
+# extern __builtin___strncpy_chk: int -> int -> int -> int -> int
+# extern __builtin___strncat_chk: int -> int -> int -> int -> int
+# extern __builtin___strcpy_chk: int -> int -> int -> int
+# extern __builtin___strcat_chk: int -> int -> int -> int
+# extern __builtin___stpcpy_chk: int -> int -> int -> int
+# extern __builtin___memset_chk: int -> int -> int -> int -> int
+# extern __builtin___mempcpy_chk: int -> int -> int -> int -> int
+# extern __builtin___memmove_chk: int -> int -> int -> int -> int
+# extern __builtin___memcpy_chk: int -> int -> int -> int -> int
+
+# begin preamble
+.data
+globals:
+.space 0
+nl:
+.asciiz "\n"
+.align 2
+.text
+main:
+la $gp, globals
+j main19
+print_int:
+li $v0, 1
+syscall
+jr $ra
+print_intln:
+li $v0, 1
+syscall
+la $a0, nl
+li $v0, 4
+syscall
+jr $ra
+scan_int:
+li $v0, 5
+syscall
+jr $ra
+alloc:
+li $v0, 9
+syscall
+jr $ra
+
+pow2:
+li $v0, 1
+sllv $v0, $v0, $a0
+jr $ra
+
+mod:
+beqz $a0, mod0
+beqz $a1, mod0
+li $t2, 0
+mod_t0:
+bgtz $a0, mod_a0_pos
+neg $t0, $a0
+addi $t2, $t2, 1
+j mod_t1
+mod_a0_pos:
+move $t0, $a0
+mod_t1:
+bgtz $a1, mod_a1_pos
+neg $t1, $a1
+addi $t2, $t2, 2
+j mod_main
+mod_a1_pos:
+move $t1, $a1
+mod_main:
+rem $v0, $t0, $t1
+beqz $t2, mod_exit
+addi $t2, -1
+beqz $t2, mod_case1
+addi $t2, -1
+beqz $t2, mod_case2
+neg $v0, $v0
+j mod_exit
+mod_case1:
+sub $v0, $a1, $v0
+j mod_exit
+mod_case2:
+add $v0, $a1, $v0
+j mod_exit
+mod0:
+li $v0, 0
+mod_exit:
+jr $ra
+
+toint:
+# $a0: size
+# $a1: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+jal pow2
+move $a0, $a1
+move $a1, $v0
+jal mod
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 8
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 16
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+sign_ext:
+# $a0: size
+# $a1: int to extend
+li $v0, 32
+sub $a0, $v0, $a0
+sllv $v0, $a1, $a0
+srav $v0, $v0, $a0
+jr $ra
+
+ofint:
+# $a0: signedness
+# $a1: size
+# $a2: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+beqz $a0, ofint_unsigned
+move $a0, $a1
+move $a1, $a2
+jal sign_ext
+j ofint_exit
+ofint_unsigned:
+move $v0, $a2
+ofint_exit:
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+# end preamble
+
+
+# begin fib
+fib41:
+addi $sp, $sp, -12
+sw $ra, 8($sp)
+sw $s1, 4($sp)
+sw $s0, 0($sp)
+move $s1, $a0
+c4:
+li $v0, 2
+slt $v0, $s1, $v0
+beq $v0, $zero, fib10
+c3:
+li $v0, 1
+fib52:
+lw $ra, 8($sp)
+lw $s1, 4($sp)
+lw $s0, 0($sp)
+addi $sp, $sp, 12
+jr $ra
+fib10:
+c2:
+li $v0, 1
+sub $a0, $s1, $v0
+la $v0, fib41
+jalr $v0
+move $s0, $v0
+c1:
+li $v0, 2
+sub $a0, $s1, $v0
+la $v0, fib41
+jalr $v0
+c0:
+add $v0, $s0, $v0
+j fib52
+# end fib
+
+
+# begin _main
+main19:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+c6:
+li $a0, 10
+la $v0, fib41
+jalr $v0
+c5:
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+# end _main
--- /dev/null
+# extern __builtin_varargs_start: int -> void
+# extern __builtin_va_start: int -> int -> void
+# extern __builtin_va_end: int -> void
+# extern __builtin_va_copy: int -> int -> void
+# extern __builtin_va_arg: int -> int -> void
+# extern __builtin_types_compatible_p: int -> int -> int
+# extern __builtin_tanl: float -> float
+# extern __builtin_tanhl: float -> float
+# extern __builtin_tanhf: float -> float
+# extern __builtin_tanh: float -> float
+# extern __builtin_tanf: float -> float
+# extern __builtin_tan: float -> float
+# extern __builtin_strspn: int -> int -> int
+# extern __builtin_strpbrk: int -> int -> int
+# extern __builtin_strncpy: int -> int -> int -> int
+# extern __builtin_strncmp: int -> int -> int -> int
+# extern __builtin_strncat: int -> int -> int -> int
+# extern __builtin_strcspn: int -> int -> int
+# extern __builtin_strcpy: int -> int -> int
+# extern __builtin_strcmp: int -> int -> int
+# extern __builtin_strchr: int -> int -> int
+# extern __builtin_stpcpy: int -> int -> int
+# extern __builtin_stdarg_start: int -> void
+# extern __builtin_sqrtl: float -> float
+# extern __builtin_sqrtf: float -> float
+# extern __builtin_sqrt: float -> float
+# extern __builtin_sinl: float -> float
+# extern __builtin_sinhl: float -> float
+# extern __builtin_sinhf: float -> float
+# extern __builtin_sinh: float -> float
+# extern __builtin_sinf: float -> float
+# extern __builtin_sin: float -> float
+# extern __builtin_return_address: int -> int
+# extern __builtin_return: int -> void
+# extern __builtin_powil: float -> int -> float
+# extern __builtin_powif: float -> int -> float
+# extern __builtin_powi: float -> int -> float
+# extern __builtin_popcountll: int -> int
+# extern __builtin_popcountl: int -> int
+# extern __builtin_popcount: int -> int
+# extern __builtin_parityll: int -> int
+# extern __builtin_parityl: int -> int
+# extern __builtin_parity: int -> int
+# extern __builtin_object_size: int -> int -> int
+# extern __builtin_next_arg: int
+# extern __builtin_nansl: int -> float
+# extern __builtin_nansf: int -> float
+# extern __builtin_nans: int -> float
+# extern __builtin_nanl: int -> float
+# extern __builtin_nanf: int -> float
+# extern __builtin_nan: int -> float
+# extern __builtin_modfl: float -> int -> float
+# extern __builtin_modff: float -> int -> float
+# extern __builtin_mempcpy: int -> int -> int -> int
+# extern __builtin_memcpy: int -> int -> int -> int
+# extern __builtin_logl: float -> float
+# extern __builtin_logf: float -> float
+# extern __builtin_log10l: float -> float
+# extern __builtin_log10f: float -> float
+# extern __builtin_log10: float -> float
+# extern __builtin_log: float -> float
+# extern __builtin_ldexpl: float -> int -> float
+# extern __builtin_ldexpf: float -> int -> float
+# extern __builtin_ldexp: float -> int -> float
+# extern __builtin_infl: float
+# extern __builtin_inff: float
+# extern __builtin_inf: float
+# extern __builtin_huge_vall: float
+# extern __builtin_huge_valf: float
+# extern __builtin_huge_val: float
+# extern __builtin_frexpl: float -> int -> float
+# extern __builtin_frexpf: float -> int -> float
+# extern __builtin_frexp: float -> int -> float
+# extern __builtin_frame_address: int -> int
+# extern __builtin_fmodl: float -> float
+# extern __builtin_fmodf: float -> float
+# extern __builtin_fmod: float -> float
+# extern __builtin_floorl: float -> float
+# extern __builtin_floorf: float -> float
+# extern __builtin_floor: float -> float
+# extern __builtin_ffsll: int -> int
+# extern __builtin_ffsl: int -> int
+# extern __builtin_ffs: int -> int
+# extern __builtin_fabsl: float -> float
+# extern __builtin_fabsf: float -> float
+# extern __builtin_fabs: float -> float
+# extern __builtin_expl: float -> float
+# extern __builtin_expf: float -> float
+# extern __builtin_expect: int -> int -> int
+# extern __builtin_exp: float -> float
+# extern __builtin_ctzll: int -> int
+# extern __builtin_ctzl: int -> int
+# extern __builtin_ctz: int -> int
+# extern __builtin_cosl: float -> float
+# extern __builtin_coshl: float -> float
+# extern __builtin_coshf: float -> float
+# extern __builtin_cosh: float -> float
+# extern __builtin_cosf: float -> float
+# extern __builtin_cos: float -> float
+# extern __builtin_constant_p: int -> int
+# extern __builtin_clzll: int -> int
+# extern __builtin_clzl: int -> int
+# extern __builtin_clz: int -> int
+# extern __builtin_ceill: float -> float
+# extern __builtin_ceilf: float -> float
+# extern __builtin_ceil: float -> float
+# extern __builtin_atanl: float -> float
+# extern __builtin_atanf: float -> float
+# extern __builtin_atan2l: float -> float -> float
+# extern __builtin_atan2f: float -> float -> float
+# extern __builtin_atan2: float -> float -> float
+# extern __builtin_atan: float -> float
+# extern __builtin_asinl: float -> float
+# extern __builtin_asinf: float -> float
+# extern __builtin_asin: float -> float
+# extern __builtin_alloca: int -> int
+# extern __builtin_acosl: float -> float
+# extern __builtin_acosf: float -> float
+# extern __builtin_acos: float -> float
+# extern __builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+# extern __builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+# extern __builtin___vprintf_chk: int -> int -> int -> int
+# extern __builtin___vfprintf_chk: int -> int -> int -> int -> int
+# extern __builtin___strncpy_chk: int -> int -> int -> int -> int
+# extern __builtin___strncat_chk: int -> int -> int -> int -> int
+# extern __builtin___strcpy_chk: int -> int -> int -> int
+# extern __builtin___strcat_chk: int -> int -> int -> int
+# extern __builtin___stpcpy_chk: int -> int -> int -> int
+# extern __builtin___memset_chk: int -> int -> int -> int -> int
+# extern __builtin___mempcpy_chk: int -> int -> int -> int -> int
+# extern __builtin___memmove_chk: int -> int -> int -> int -> int
+# extern __builtin___memcpy_chk: int -> int -> int -> int -> int
+
+# begin preamble
+.data
+globals:
+.space 288
+nl:
+.asciiz "\n"
+.align 2
+.text
+main:
+la $gp, globals
+j main385
+print_int:
+li $v0, 1
+syscall
+jr $ra
+print_intln:
+li $v0, 1
+syscall
+la $a0, nl
+li $v0, 4
+syscall
+jr $ra
+scan_int:
+li $v0, 5
+syscall
+jr $ra
+alloc:
+li $v0, 9
+syscall
+jr $ra
+
+pow2:
+li $v0, 1
+sllv $v0, $v0, $a0
+jr $ra
+
+mod:
+beqz $a0, mod0
+beqz $a1, mod0
+li $t2, 0
+mod_t0:
+bgtz $a0, mod_a0_pos
+neg $t0, $a0
+addi $t2, $t2, 1
+j mod_t1
+mod_a0_pos:
+move $t0, $a0
+mod_t1:
+bgtz $a1, mod_a1_pos
+neg $t1, $a1
+addi $t2, $t2, 2
+j mod_main
+mod_a1_pos:
+move $t1, $a1
+mod_main:
+rem $v0, $t0, $t1
+beqz $t2, mod_exit
+addi $t2, -1
+beqz $t2, mod_case1
+addi $t2, -1
+beqz $t2, mod_case2
+neg $v0, $v0
+j mod_exit
+mod_case1:
+sub $v0, $a1, $v0
+j mod_exit
+mod_case2:
+add $v0, $a1, $v0
+j mod_exit
+mod0:
+li $v0, 0
+mod_exit:
+jr $ra
+
+toint:
+# $a0: size
+# $a1: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+jal pow2
+move $a0, $a1
+move $a1, $v0
+jal mod
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 8
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 16
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+sign_ext:
+# $a0: size
+# $a1: int to extend
+li $v0, 32
+sub $a0, $v0, $a0
+sllv $v0, $a1, $a0
+srav $v0, $v0, $a0
+jr $ra
+
+ofint:
+# $a0: signedness
+# $a1: size
+# $a2: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+beqz $a0, ofint_unsigned
+move $a0, $a1
+move $a1, $a2
+jal sign_ext
+j ofint_exit
+ofint_unsigned:
+move $v0, $a2
+ofint_exit:
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+# end preamble
+
+
+# begin fir4
+fir4280:
+addi $sp, $sp, -116
+sw $ra, 112($sp)
+sw $s7, 108($sp)
+sw $s6, 104($sp)
+sw $s5, 100($sp)
+sw $s4, 96($sp)
+sw $s3, 92($sp)
+sw $s2, 88($sp)
+sw $s1, 84($sp)
+sw $s0, 80($sp)
+sw $a0, 64($sp)
+move $s6, $a1
+sw $a2, 68($sp)
+sw $a3, 72($sp)
+c25:
+li $s1, 0
+c24:
+c23:
+c22:
+li $s3, 0
+fir4128:
+li $a0, 0
+c21:
+li $v0, 16
+slt $v0, $s3, $v0
+seq $v0, $v0, $zero
+beq $v0, $a0, fir4122
+c18:
+c17:
+li $s4, 0
+fir4109:
+li $a0, 0
+c16:
+lw $fp, 72($sp)
+slt $v0, $s4, $fp
+seq $v0, $v0, $zero
+beq $v0, $a0, fir4104
+c0:
+li $v0, 0
+lw $ra, 112($sp)
+lw $s7, 108($sp)
+lw $s6, 104($sp)
+lw $s5, 100($sp)
+lw $s4, 96($sp)
+lw $s3, 92($sp)
+lw $s2, 88($sp)
+lw $s1, 84($sp)
+lw $s0, 80($sp)
+addi $sp, $sp, 116
+jr $ra
+fir4104:
+c14:
+li $v0, 4
+mulo $v0, $s4, $v0
+lw $v1, 64($sp)
+add $v0, $v1, $v0
+lw $a1, 0($v0)
+move $a0, $sp
+li $v0, 4
+mulo $v0, $s1, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c13:
+li $s5, 0
+c12:
+c11:
+li $s3, 0
+fir491:
+li $a0, 0
+c10:
+li $v0, 16
+slt $v0, $s3, $v0
+seq $v0, $v0, $zero
+beq $v0, $a0, fir485
+c2:
+li $v0, 1
+add $a0, $s1, $v0
+li $a1, 16
+la $v0, mod
+jalr $v0
+move $s1, $v0
+c1:
+li $v0, 16
+srav $a0, $s5, $v0
+li $v0, 4
+mulo $v0, $s4, $v0
+lw $v1, 68($sp)
+add $v0, $v1, $v0
+sw $a0, 0($v0)
+c15:
+li $v0, 1
+add $s4, $s4, $v0
+j fir4109
+fir485:
+c8:
+move $a0, $sp
+li $v0, 4
+mulo $v0, $s1, $v0
+add $v0, $a0, $v0
+lw $a0, 0($v0)
+li $v0, 4
+mulo $v0, $s3, $v0
+add $v0, $s6, $v0
+lw $v0, 0($v0)
+mulo $s2, $a0, $v0
+c7:
+move $s0, $sp
+li $v0, 1
+add $a0, $s1, $v0
+li $a1, 16
+la $v0, mod
+jalr $v0
+li $a0, 4
+mulo $v0, $v0, $a0
+add $v0, $s0, $v0
+lw $a1, 0($v0)
+li $v0, 1
+add $a0, $s3, $v0
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $s6, $v0
+lw $v0, 0($v0)
+mulo $v1, $a1, $v0
+sw $v1, 76($sp)
+c6:
+move $s0, $sp
+li $v0, 2
+add $a0, $s1, $v0
+li $a1, 16
+la $v0, mod
+jalr $v0
+li $a0, 4
+mulo $v0, $v0, $a0
+add $v0, $s0, $v0
+lw $a1, 0($v0)
+li $v0, 2
+add $a0, $s3, $v0
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $s6, $v0
+lw $v0, 0($v0)
+mulo $s7, $a1, $v0
+c5:
+move $s0, $sp
+li $v0, 3
+add $a0, $s1, $v0
+li $a1, 16
+la $v0, mod
+jalr $v0
+li $a0, 4
+mulo $v0, $v0, $a0
+add $v0, $s0, $v0
+lw $a1, 0($v0)
+li $v0, 3
+add $a0, $s3, $v0
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $s6, $v0
+lw $v0, 0($v0)
+mulo $v0, $a1, $v0
+c4:
+add $a0, $s5, $s2
+lw $fp, 76($sp)
+add $a0, $a0, $fp
+add $a0, $a0, $s7
+add $s5, $a0, $v0
+c3:
+li $v0, 4
+add $a0, $s1, $v0
+li $a1, 16
+la $v0, mod
+jalr $v0
+move $s1, $v0
+c9:
+li $v0, 4
+add $s3, $s3, $v0
+j fir491
+fir4122:
+c19:
+move $a0, $sp
+li $v0, 4
+mulo $v0, $s3, $v0
+add $v0, $a0, $v0
+sw $zero, 0($v0)
+c20:
+li $v0, 1
+add $s3, $s3, $v0
+j fir4128
+# end fir4
+
+
+# begin _main
+main385:
+addi $sp, $sp, -68
+sw $ra, 64($sp)
+li $a0, 1129
+move $v0, $gp
+sw $a0, 0($v0)
+li $a0, 60034
+move $v0, $gp
+sw $a0, 4($v0)
+li $a0, 64720
+move $v0, $gp
+sw $a0, 8($v0)
+li $a0, 5595
+move $v0, $gp
+sw $a0, 12($v0)
+li $a0, 494
+move $v0, $gp
+sw $a0, 16($v0)
+li $a0, 59867
+move $v0, $gp
+sw $a0, 20($v0)
+li $a0, 65370
+move $v0, $gp
+sw $a0, 24($v0)
+li $a0, 5724
+move $v0, $gp
+sw $a0, 28($v0)
+li $a0, 5724
+move $v0, $gp
+sw $a0, 32($v0)
+li $a0, 65370
+move $v0, $gp
+sw $a0, 36($v0)
+li $a0, 59867
+move $v0, $gp
+sw $a0, 40($v0)
+li $a0, 494
+move $v0, $gp
+sw $a0, 44($v0)
+li $a0, 5595
+move $v0, $gp
+sw $a0, 48($v0)
+li $a0, 64720
+move $v0, $gp
+sw $a0, 52($v0)
+li $a0, 60034
+move $v0, $gp
+sw $a0, 56($v0)
+li $a0, 1129
+move $v0, $gp
+sw $a0, 60($v0)
+li $a0, 1
+move $v0, $gp
+sw $a0, 64($v0)
+move $v0, $gp
+sw $zero, 68($v0)
+li $a0, 16384
+move $v0, $gp
+sw $a0, 72($v0)
+move $v0, $gp
+sw $zero, 76($v0)
+move $v0, $gp
+sw $zero, 80($v0)
+move $v0, $gp
+sw $zero, 84($v0)
+move $v0, $gp
+sw $zero, 88($v0)
+move $v0, $gp
+sw $zero, 92($v0)
+move $v0, $gp
+sw $zero, 96($v0)
+move $v0, $gp
+sw $zero, 100($v0)
+move $v0, $gp
+sw $zero, 104($v0)
+move $v0, $gp
+sw $zero, 108($v0)
+move $v0, $gp
+sw $zero, 112($v0)
+move $v0, $gp
+sw $zero, 116($v0)
+move $v0, $gp
+sw $zero, 120($v0)
+move $v0, $gp
+sw $zero, 124($v0)
+move $v0, $gp
+sw $zero, 128($v0)
+move $v0, $gp
+sw $zero, 132($v0)
+move $v0, $gp
+sw $zero, 136($v0)
+move $v0, $gp
+sw $zero, 140($v0)
+move $v0, $gp
+sw $zero, 144($v0)
+move $v0, $gp
+sw $zero, 148($v0)
+move $v0, $gp
+sw $zero, 152($v0)
+move $v0, $gp
+sw $zero, 156($v0)
+move $v0, $gp
+sw $zero, 160($v0)
+li $a0, 7986
+move $v0, $gp
+sw $a0, 164($v0)
+li $a0, 8993
+move $v0, $gp
+sw $a0, 168($v0)
+li $a0, 1808
+move $v0, $gp
+sw $a0, 172($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 176($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 180($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 184($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 188($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 192($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 196($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 200($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 204($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 208($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 212($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 216($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 220($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 224($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 228($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 232($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 236($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 240($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 244($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 248($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 252($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 256($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 260($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 264($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 268($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 272($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 276($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 280($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 284($v0)
+c27:
+move $a0, $gp
+addi $a0, $a0, 64
+move $a1, $gp
+move $a2, $sp
+li $a3, 16
+la $v0, fir4280
+jalr $v0
+c26:
+lw $ra, 64($sp)
+addi $sp, $sp, 68
+jr $ra
+# end _main
--- /dev/null
+int fir4_c[16] = { 1129, 60034, 64720, 5595, 494, 59867, 65370, 5724, 5724,
+ 65370, 59867, 494, 5595, 64720, 60034, 1129, };
+
+int fir4_in[56] = { 1, 0, 16384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 7986, 8993, 1808, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, };
+
+extern void *__builtin___memcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memmove_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___mempcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memset_chk(void *, int, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___stpcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcat_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strncat_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___strncpy_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern int __builtin___vfprintf_chk(void *, int, unsigned char *, void *);
+
+extern int __builtin___vprintf_chk(int, unsigned char *, void *);
+
+extern int __builtin___vsnprintf_chk(unsigned char *, unsigned int, int, unsigned int, unsigned char *, void *);
+
+extern int __builtin___vsprintf_chk(unsigned char *, int, unsigned int, unsigned char *, void *);
+
+extern double __builtin_acos(double);
+
+extern float __builtin_acosf(float);
+
+extern double __builtin_acosl(double);
+
+extern void *__builtin_alloca(unsigned int);
+
+extern double __builtin_asin(double);
+
+extern float __builtin_asinf(float);
+
+extern double __builtin_asinl(double);
+
+extern double __builtin_atan(double);
+
+extern float __builtin_atanf(float);
+
+extern double __builtin_atanl(double);
+
+extern double __builtin_atan2(double, double);
+
+extern float __builtin_atan2f(float, float);
+
+extern double __builtin_atan2l(double, double);
+
+extern double __builtin_ceil(double);
+
+extern float __builtin_ceilf(float);
+
+extern double __builtin_ceill(double);
+
+extern double __builtin_cos(double);
+
+extern float __builtin_cosf(float);
+
+extern double __builtin_cosl(double);
+
+extern double __builtin_cosh(double);
+
+extern float __builtin_coshf(float);
+
+extern double __builtin_coshl(double);
+
+extern int __builtin_clz(unsigned int);
+
+extern int __builtin_clzl(unsigned int);
+
+extern int __builtin_clzll(unsigned int);
+
+extern int __builtin_constant_p(int);
+
+extern int __builtin_ctz(unsigned int);
+
+extern int __builtin_ctzl(unsigned int);
+
+extern int __builtin_ctzll(unsigned int);
+
+extern double __builtin_exp(double);
+
+extern float __builtin_expf(float);
+
+extern double __builtin_expl(double);
+
+extern int __builtin_expect(int, int);
+
+extern double __builtin_fabs(double);
+
+extern float __builtin_fabsf(float);
+
+extern double __builtin_fabsl(double);
+
+extern int __builtin_ffs(unsigned int);
+
+extern int __builtin_ffsl(unsigned int);
+
+extern int __builtin_ffsll(unsigned int);
+
+extern void *__builtin_frame_address(unsigned int);
+
+extern double __builtin_floor(double);
+
+extern float __builtin_floorf(float);
+
+extern double __builtin_floorl(double);
+
+extern double __builtin_huge_val(void);
+
+extern float __builtin_huge_valf(void);
+
+extern double __builtin_huge_vall(void);
+
+extern double __builtin_inf(void);
+
+extern float __builtin_inff(void);
+
+extern double __builtin_infl(void);
+
+extern void *__builtin_memcpy(void *, void *, unsigned int);
+
+extern void *__builtin_mempcpy(void *, void *, unsigned int);
+
+extern double __builtin_fmod(double);
+
+extern float __builtin_fmodf(float);
+
+extern double __builtin_fmodl(double);
+
+extern double __builtin_frexp(double, int *);
+
+extern float __builtin_frexpf(float, int *);
+
+extern double __builtin_frexpl(double, int *);
+
+extern double __builtin_ldexp(double, int);
+
+extern float __builtin_ldexpf(float, int);
+
+extern double __builtin_ldexpl(double, int);
+
+extern double __builtin_log(double);
+
+extern float __builtin_logf(float);
+
+extern double __builtin_logl(double);
+
+extern double __builtin_log10(double);
+
+extern float __builtin_log10f(float);
+
+extern double __builtin_log10l(double);
+
+extern float __builtin_modff(float, float *);
+
+extern double __builtin_modfl(double, double *);
+
+extern double __builtin_nan(unsigned char *);
+
+extern float __builtin_nanf(unsigned char *);
+
+extern double __builtin_nanl(unsigned char *);
+
+extern double __builtin_nans(unsigned char *);
+
+extern float __builtin_nansf(unsigned char *);
+
+extern double __builtin_nansl(unsigned char *);
+
+extern void *__builtin_next_arg(void);
+
+extern unsigned int __builtin_object_size(void *, int);
+
+extern int __builtin_parity(unsigned int);
+
+extern int __builtin_parityl(unsigned int);
+
+extern int __builtin_parityll(unsigned int);
+
+extern int __builtin_popcount(unsigned int);
+
+extern int __builtin_popcountl(unsigned int);
+
+extern int __builtin_popcountll(unsigned int);
+
+extern double __builtin_powi(double, int);
+
+extern float __builtin_powif(float, int);
+
+extern double __builtin_powil(double, int);
+
+extern void __builtin_return(void *);
+
+extern void *__builtin_return_address(unsigned int);
+
+extern double __builtin_sin(double);
+
+extern float __builtin_sinf(float);
+
+extern double __builtin_sinl(double);
+
+extern double __builtin_sinh(double);
+
+extern float __builtin_sinhf(float);
+
+extern double __builtin_sinhl(double);
+
+extern double __builtin_sqrt(double);
+
+extern float __builtin_sqrtf(float);
+
+extern double __builtin_sqrtl(double);
+
+extern unsigned char *__builtin_stpcpy(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strchr(unsigned char *, unsigned char);
+
+extern int __builtin_strcmp(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strcpy(unsigned char *, unsigned char *);
+
+extern unsigned int __builtin_strcspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strncat(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strncmp(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin_strncpy(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strpbrk(unsigned char *, unsigned char *);
+
+extern int __builtin_types_compatible_p(unsigned int, unsigned int);
+
+extern double __builtin_tan(double);
+
+extern float __builtin_tanf(float);
+
+extern double __builtin_tanl(double);
+
+extern double __builtin_tanh(double);
+
+extern float __builtin_tanhf(float);
+
+extern double __builtin_tanhl(double);
+
+extern void __builtin_va_end(void *);
+
+extern void __builtin_varargs_start(void *);
+
+extern void __builtin_va_start(void *, void *);
+
+extern void __builtin_stdarg_start(void *);
+
+extern void __builtin_va_arg(void *, unsigned int);
+
+extern void __builtin_va_copy(void *, void *);
+
+int fir4(int *fir4_in__1, int *fir4_c__1, int *fir4_out, int size)
+{
+ int i;
+ int j;
+ int tmp1;
+ int tmp2;
+ int tmp3;
+ int tmp4;
+ int x[16];
+ int adx;
+ int res;
+ c25:
+ adx = 0;
+ c24:
+ res = 0;
+ c23:
+ for (({ c22: i = 0; }); (/* c21 */ i < 16); ({ c20: i = i + 1; })) {
+ c19:
+ x[i] = 0;
+ }
+ c18:
+ for (({ c17: j = 0; }); (/* c16 */ j < size); ({ c15: j = j + 1; })) {
+ c14:
+ x[adx] = fir4_in__1[j];
+ c13:
+ res = 0;
+ c12:
+ for (({ c11: i = 0; }); (/* c10 */ i < 16); ({ c9: i = i + 4; })) {
+ c8:
+ tmp1 = x[adx] * fir4_c__1[i];
+ c7:
+ tmp2 = x[((adx + 1) % 16)] * fir4_c__1[(i + 1)];
+ c6:
+ tmp3 = x[((adx + 2) % 16)] * fir4_c__1[(i + 2)];
+ c5:
+ tmp4 = x[((adx + 3) % 16)] * fir4_c__1[(i + 3)];
+ c4:
+ res = (((res + tmp1) + tmp2) + tmp3) + tmp4;
+ c3:
+ adx = (adx + 4) % 16;
+ }
+ c2:
+ adx = (adx + 1) % 16;
+ c1:
+ fir4_out[j] = res >> 16;
+ }
+ c0:
+ return 0;
+}
+
+int main(void)
+{
+ int fir4_out[16];
+ int t;
+ c27:
+ t = fir4(fir4_in, fir4_c, fir4_out, 16);
+ c26:
+ return t;
+}
+
+
--- /dev/null
+
+var "fir4_c" {1129, 60034, 64720, 5595, 494, 59867, 65370, 5724, 5724, 65370, 59867, 494, 5595, 64720, 60034, 1129}
+var "fir4_in" {1, 0, 16384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7986, 8993, 1808, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096}
+
+
+extern "__builtin___memcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memmove_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___mempcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memset_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___stpcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcat_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strncat_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___strncpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vfprintf_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vprintf_chk" : int -> int -> int -> int
+
+
+extern "__builtin___vsnprintf_chk" : int -> int -> int -> int -> int -> int -> int
+
+
+extern "__builtin___vsprintf_chk" : int -> int -> int -> int -> int -> int
+
+
+extern "__builtin_acos" : float -> float
+
+
+extern "__builtin_acosf" : float -> float
+
+
+extern "__builtin_acosl" : float -> float
+
+
+extern "__builtin_alloca" : int -> int
+
+
+extern "__builtin_asin" : float -> float
+
+
+extern "__builtin_asinf" : float -> float
+
+
+extern "__builtin_asinl" : float -> float
+
+
+extern "__builtin_atan" : float -> float
+
+
+extern "__builtin_atanf" : float -> float
+
+
+extern "__builtin_atanl" : float -> float
+
+
+extern "__builtin_atan2" : float -> float -> float
+
+
+extern "__builtin_atan2f" : float -> float -> float
+
+
+extern "__builtin_atan2l" : float -> float -> float
+
+
+extern "__builtin_ceil" : float -> float
+
+
+extern "__builtin_ceilf" : float -> float
+
+
+extern "__builtin_ceill" : float -> float
+
+
+extern "__builtin_cos" : float -> float
+
+
+extern "__builtin_cosf" : float -> float
+
+
+extern "__builtin_cosl" : float -> float
+
+
+extern "__builtin_cosh" : float -> float
+
+
+extern "__builtin_coshf" : float -> float
+
+
+extern "__builtin_coshl" : float -> float
+
+
+extern "__builtin_clz" : int -> int
+
+
+extern "__builtin_clzl" : int -> int
+
+
+extern "__builtin_clzll" : int -> int
+
+
+extern "__builtin_constant_p" : int -> int
+
+
+extern "__builtin_ctz" : int -> int
+
+
+extern "__builtin_ctzl" : int -> int
+
+
+extern "__builtin_ctzll" : int -> int
+
+
+extern "__builtin_exp" : float -> float
+
+
+extern "__builtin_expf" : float -> float
+
+
+extern "__builtin_expl" : float -> float
+
+
+extern "__builtin_expect" : int -> int -> int
+
+
+extern "__builtin_fabs" : float -> float
+
+
+extern "__builtin_fabsf" : float -> float
+
+
+extern "__builtin_fabsl" : float -> float
+
+
+extern "__builtin_ffs" : int -> int
+
+
+extern "__builtin_ffsl" : int -> int
+
+
+extern "__builtin_ffsll" : int -> int
+
+
+extern "__builtin_frame_address" : int -> int
+
+
+extern "__builtin_floor" : float -> float
+
+
+extern "__builtin_floorf" : float -> float
+
+
+extern "__builtin_floorl" : float -> float
+
+
+extern "__builtin_huge_val" : float
+
+
+extern "__builtin_huge_valf" : float
+
+
+extern "__builtin_huge_vall" : float
+
+
+extern "__builtin_inf" : float
+
+
+extern "__builtin_inff" : float
+
+
+extern "__builtin_infl" : float
+
+
+extern "__builtin_memcpy" : int -> int -> int -> int
+
+
+extern "__builtin_mempcpy" : int -> int -> int -> int
+
+
+extern "__builtin_fmod" : float -> float
+
+
+extern "__builtin_fmodf" : float -> float
+
+
+extern "__builtin_fmodl" : float -> float
+
+
+extern "__builtin_frexp" : float -> int -> float
+
+
+extern "__builtin_frexpf" : float -> int -> float
+
+
+extern "__builtin_frexpl" : float -> int -> float
+
+
+extern "__builtin_ldexp" : float -> int -> float
+
+
+extern "__builtin_ldexpf" : float -> int -> float
+
+
+extern "__builtin_ldexpl" : float -> int -> float
+
+
+extern "__builtin_log" : float -> float
+
+
+extern "__builtin_logf" : float -> float
+
+
+extern "__builtin_logl" : float -> float
+
+
+extern "__builtin_log10" : float -> float
+
+
+extern "__builtin_log10f" : float -> float
+
+
+extern "__builtin_log10l" : float -> float
+
+
+extern "__builtin_modff" : float -> int -> float
+
+
+extern "__builtin_modfl" : float -> int -> float
+
+
+extern "__builtin_nan" : int -> float
+
+
+extern "__builtin_nanf" : int -> float
+
+
+extern "__builtin_nanl" : int -> float
+
+
+extern "__builtin_nans" : int -> float
+
+
+extern "__builtin_nansf" : int -> float
+
+
+extern "__builtin_nansl" : int -> float
+
+
+extern "__builtin_next_arg" : int
+
+
+extern "__builtin_object_size" : int -> int -> int
+
+
+extern "__builtin_parity" : int -> int
+
+
+extern "__builtin_parityl" : int -> int
+
+
+extern "__builtin_parityll" : int -> int
+
+
+extern "__builtin_popcount" : int -> int
+
+
+extern "__builtin_popcountl" : int -> int
+
+
+extern "__builtin_popcountll" : int -> int
+
+
+extern "__builtin_powi" : float -> int -> float
+
+
+extern "__builtin_powif" : float -> int -> float
+
+
+extern "__builtin_powil" : float -> int -> float
+
+
+extern "__builtin_return" : int -> void
+
+
+extern "__builtin_return_address" : int -> int
+
+
+extern "__builtin_sin" : float -> float
+
+
+extern "__builtin_sinf" : float -> float
+
+
+extern "__builtin_sinl" : float -> float
+
+
+extern "__builtin_sinh" : float -> float
+
+
+extern "__builtin_sinhf" : float -> float
+
+
+extern "__builtin_sinhl" : float -> float
+
+
+extern "__builtin_sqrt" : float -> float
+
+
+extern "__builtin_sqrtf" : float -> float
+
+
+extern "__builtin_sqrtl" : float -> float
+
+
+extern "__builtin_stpcpy" : int -> int -> int
+
+
+extern "__builtin_strchr" : int -> int -> int
+
+
+extern "__builtin_strcmp" : int -> int -> int
+
+
+extern "__builtin_strcpy" : int -> int -> int
+
+
+extern "__builtin_strcspn" : int -> int -> int
+
+
+extern "__builtin_strncat" : int -> int -> int -> int
+
+
+extern "__builtin_strncmp" : int -> int -> int -> int
+
+
+extern "__builtin_strncpy" : int -> int -> int -> int
+
+
+extern "__builtin_strspn" : int -> int -> int
+
+
+extern "__builtin_strpbrk" : int -> int -> int
+
+
+extern "__builtin_types_compatible_p" : int -> int -> int
+
+
+extern "__builtin_tan" : float -> float
+
+
+extern "__builtin_tanf" : float -> float
+
+
+extern "__builtin_tanl" : float -> float
+
+
+extern "__builtin_tanh" : float -> float
+
+
+extern "__builtin_tanhf" : float -> float
+
+
+extern "__builtin_tanhl" : float -> float
+
+
+extern "__builtin_va_end" : int -> void
+
+
+extern "__builtin_varargs_start" : int -> void
+
+
+extern "__builtin_va_start" : int -> int -> void
+
+
+extern "__builtin_stdarg_start" : int -> void
+
+
+extern "__builtin_va_arg" : int -> int -> void
+
+
+extern "__builtin_va_copy" : int -> int -> void
+
+
+"fir4" (fir4_in__1, fir4_c__1, fir4_out, size) : int -> int -> int -> int -> int {
+
+ stack 64;
+
+ var res, j, i, tmp4, tmp3, tmp2, tmp1, adx;
+
+ c25:
+ adx = 0;
+ c24:
+ res = 0;
+ c23:
+ c22:
+ i = 0;
+ block {
+ loop {
+ if (!(/* c21 */ i < 16)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c19:
+ int32[&0 + (i * 4)] = 0;
+ }
+ c20:
+ i = i + 1;
+ }
+ }
+ c18:
+ c17:
+ j = 0;
+ block {
+ loop {
+ if (!(/* c16 */ j < size)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c14:
+ int32[&0 + (adx * 4)] = int32[fir4_in__1 + (j * 4)];
+ c13:
+ res = 0;
+ c12:
+ c11:
+ i = 0;
+ block {
+ loop {
+ if (!(/* c10 */ i < 16)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c8:
+ tmp1 = int32[&0 + (adx * 4)] * int32[fir4_c__1 + (i * 4)];
+ c7:
+ tmp2 = int32[&0 + (((adx + 1) % 16) * 4)] * int32[fir4_c__1 + ((i + 1) * 4)];
+ c6:
+ tmp3 = int32[&0 + (((adx + 2) % 16) * 4)] * int32[fir4_c__1 + ((i + 2) * 4)];
+ c5:
+ tmp4 = int32[&0 + (((adx + 3) % 16) * 4)] * int32[fir4_c__1 + ((i + 3) * 4)];
+ c4:
+ res = (((res + tmp1) + tmp2) + tmp3) + tmp4;
+ c3:
+ adx = (adx + 4) % 16;
+ }
+ c9:
+ i = i + 4;
+ }
+ }
+ c2:
+ adx = (adx + 1) % 16;
+ c1:
+ int32[fir4_out + (j * 4)] = res >> 16;
+ }
+ c15:
+ j = j + 1;
+ }
+ }
+ c0:
+ return 0;
+
+}
+
+
+"main" () : int {
+
+ stack 64;
+
+ var t;
+
+ c27:
+ t = "fir4"("fir4_in", "fir4_c", &0, 16) : int -> int -> int -> int -> int;
+ c26:
+ return t;
+
+}
+
+
--- /dev/null
+program
+
+globals 288
+
+procedure fir4(4)
+stacksize 64
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78, %79, %80, %81, %82, %83,
+ %84, %85, %86, %87, %88, %89, %90,
+ %91, %92, %93, %94, %95, %96, %97,
+ %98, %99, %100, %101, %102, %103, %104,
+ %105, %106, %107, %108, %109, %110, %111,
+ %112, %113, %114, %115, %116, %117, %118,
+ %119, %120, %121, %122, %123, %124
+entry fir4280
+fir4280: newframe --> fir4279
+fir4279: move %124, $ra --> fir4278
+fir4278: move %123, $s7 --> fir4277
+fir4277: move %122, $s6 --> fir4276
+fir4276: move %121, $s5 --> fir4275
+fir4275: move %120, $s4 --> fir4274
+fir4274: move %119, $s3 --> fir4273
+fir4273: move %118, $s2 --> fir4272
+fir4272: move %117, $s1 --> fir4271
+fir4271: move %116, $s0 --> fir4270
+fir4270: move %0, $a0 --> fir4269
+fir4269: move %1, $a1 --> fir4268
+fir4268: move %2, $a2 --> fir4267
+fir4267: move %3, $a3 --> fir4266
+fir4266: li %4, 0 --> fir4265
+fir4265: li %5, 0 --> fir4264
+fir4264: li %6, 0 --> fir4263
+fir4263: li %7, 0 --> fir4262
+fir4262: li %8, 0 --> fir4261
+fir4261: li %9, 0 --> fir4260
+fir4260: li %10, 0 --> fir4259
+fir4259: li %11, 0 --> fir4258
+fir4258: li %13, 0 --> fir4257
+fir4257: li %14, 0 --> fir4256
+fir4256: li %15, 0 --> fir4255
+fir4255: li %16, 0 --> fir4254
+fir4254: li %17, 0 --> fir4253
+fir4253: li %18, 0 --> fir4252
+fir4252: li %19, 0 --> fir4251
+fir4251: li %20, 0 --> fir4250
+fir4250: li %21, 0 --> fir4249
+fir4249: li %22, 0 --> fir4248
+fir4248: li %23, 0 --> fir4247
+fir4247: li %24, 0 --> fir4246
+fir4246: li %25, 0 --> fir4245
+fir4245: li %26, 0 --> fir4244
+fir4244: li %27, 0 --> fir4243
+fir4243: li %28, 0 --> fir4242
+fir4242: li %29, 0 --> fir4241
+fir4241: li %30, 0 --> fir4240
+fir4240: li %31, 0 --> fir4239
+fir4239: li %32, 0 --> fir4238
+fir4238: li %33, 0 --> fir4237
+fir4237: li %34, 0 --> fir4236
+fir4236: li %35, 0 --> fir4235
+fir4235: li %36, 0 --> fir4234
+fir4234: li %37, 0 --> fir4233
+fir4233: li %38, 0 --> fir4232
+fir4232: li %39, 0 --> fir4231
+fir4231: li %40, 0 --> fir4230
+fir4230: li %41, 0 --> fir4229
+fir4229: li %42, 0 --> fir4228
+fir4228: li %43, 0 --> fir4227
+fir4227: li %44, 0 --> fir4226
+fir4226: li %45, 0 --> fir4225
+fir4225: li %46, 0 --> fir4224
+fir4224: li %47, 0 --> fir4223
+fir4223: li %48, 0 --> fir4222
+fir4222: li %49, 0 --> fir4221
+fir4221: li %50, 0 --> fir4220
+fir4220: li %51, 0 --> fir4219
+fir4219: li %52, 0 --> fir4218
+fir4218: li %53, 0 --> fir4217
+fir4217: li %54, 0 --> fir4216
+fir4216: li %55, 0 --> fir4215
+fir4215: li %56, 0 --> fir4214
+fir4214: li %57, 0 --> fir4213
+fir4213: li %58, 0 --> fir4212
+fir4212: li %59, 0 --> fir4211
+fir4211: li %60, 0 --> fir4210
+fir4210: li %61, 0 --> fir4209
+fir4209: li %62, 0 --> fir4208
+fir4208: li %63, 0 --> fir4207
+fir4207: li %64, 0 --> fir4206
+fir4206: li %65, 0 --> fir4205
+fir4205: li %66, 0 --> fir4204
+fir4204: li %67, 0 --> fir4203
+fir4203: li %68, 0 --> fir4202
+fir4202: li %69, 0 --> fir4201
+fir4201: li %70, 0 --> fir4200
+fir4200: li %71, 0 --> fir4199
+fir4199: li %72, 0 --> fir4198
+fir4198: li %73, 0 --> fir4197
+fir4197: li %74, 0 --> fir4196
+fir4196: li %75, 0 --> fir4195
+fir4195: li %76, 0 --> fir4194
+fir4194: li %77, 0 --> fir4193
+fir4193: li %78, 0 --> fir4192
+fir4192: li %79, 0 --> fir4191
+fir4191: li %80, 0 --> fir4190
+fir4190: li %81, 0 --> fir4189
+fir4189: li %82, 0 --> fir4188
+fir4188: li %83, 0 --> fir4187
+fir4187: li %84, 0 --> fir4186
+fir4186: li %85, 0 --> fir4185
+fir4185: li %86, 0 --> fir4184
+fir4184: li %87, 0 --> fir4183
+fir4183: li %88, 0 --> fir4182
+fir4182: li %89, 0 --> fir4181
+fir4181: li %90, 0 --> fir4180
+fir4180: li %91, 0 --> fir4179
+fir4179: li %92, 0 --> fir4178
+fir4178: li %93, 0 --> fir4177
+fir4177: li %94, 0 --> fir4176
+fir4176: li %95, 0 --> fir4175
+fir4175: li %96, 0 --> fir4174
+fir4174: li %97, 0 --> fir4173
+fir4173: li %98, 0 --> fir4172
+fir4172: li %99, 0 --> fir4171
+fir4171: li %100, 0 --> fir4170
+fir4170: li %101, 0 --> fir4169
+fir4169: li %102, 0 --> fir4168
+fir4168: li %103, 0 --> fir4167
+fir4167: li %104, 0 --> fir4166
+fir4166: li %105, 0 --> fir4165
+fir4165: li %106, 0 --> fir4164
+fir4164: li %107, 0 --> fir4163
+fir4163: li %108, 0 --> fir4162
+fir4162: li %109, 0 --> fir4161
+fir4161: li %110, 0 --> fir4160
+fir4160: li %111, 0 --> fir4159
+fir4159: li %112, 0 --> fir4158
+fir4158: li %113, 0 --> fir4157
+fir4157: li %114, 0 --> fir4156
+fir4156: li %115, 0 --> fir4135
+fir4135: emit c25 --> fir4134
+fir4134: li %11, 0 --> fir4133
+fir4133: emit c24 --> fir4132
+fir4132: li %4, 0 --> fir4131
+fir4131: emit c23 --> fir4130
+fir4130: emit c22 --> fir4129
+fir4129: li %6, 0 --> fir4113
+fir4113: j --> fir4128
+fir4128: li %93, 0 --> fir4127
+fir4127: emit c21 --> fir4126
+fir4126: li %95, 16 --> fir4125
+fir4125: slt %94, %6, %95 --> fir4124
+fir4124: li %99, 0 --> fir4139
+fir4139: seq %92, %94, %99 --> fir4123
+fir4123: beq %92, %93 --> fir4122, fir4112
+fir4112: emit c18 --> fir4111
+fir4111: emit c17 --> fir4110
+fir4110: li %5, 0 --> fir43
+fir43 : j --> fir4109
+fir4109: li %85, 0 --> fir4108
+fir4108: emit c16 --> fir4107
+fir4107: slt %86, %5, %3 --> fir4106
+fir4106: li %97, 0 --> fir4137
+fir4137: seq %84, %86, %97 --> fir4105
+fir4105: beq %84, %85 --> fir4104, fir42
+fir42 : emit c0 --> fir41
+fir41 : li %12, 0 --> fir40
+fir40 : j --> fir4292
+fir4292: move $v0, %12 --> fir4291
+fir4291: move $ra, %124 --> fir4290
+fir4290: move $s7, %123 --> fir4289
+fir4289: move $s6, %122 --> fir4288
+fir4288: move $s5, %121 --> fir4287
+fir4287: move $s4, %120 --> fir4286
+fir4286: move $s3, %119 --> fir4285
+fir4285: move $s2, %118 --> fir4284
+fir4284: move $s1, %117 --> fir4283
+fir4283: move $s0, %116 --> fir4282
+fir4282: delframe --> fir4281
+fir4281: jr $ra (xmits $v0)
+fir4104: emit c14 --> fir4103
+fir4103: li %83, 4 --> fir4102
+fir4102: mulo %82, %5, %83 --> fir4101
+fir4101: add %96, %0, %82 --> fir4136
+fir4136: lw %78, 0(%96) --> fir4100
+fir4100: move %79, $sp --> fir4293
+fir4293: move %79, %79 --> fir499
+fir499 : li %81, 4 --> fir498
+fir498 : mulo %80, %11, %81 --> fir497
+fir497 : add %115, %79, %80 --> fir4155
+fir4155: sw %78, 0(%115) --> fir496
+fir496 : emit c13 --> fir495
+fir495 : li %4, 0 --> fir494
+fir494 : emit c12 --> fir493
+fir493 : emit c11 --> fir492
+fir492 : li %6, 0 --> fir418
+fir418 : j --> fir491
+fir491 : li %75, 0 --> fir490
+fir490 : emit c10 --> fir489
+fir489 : li %77, 16 --> fir488
+fir488 : slt %76, %6, %77 --> fir487
+fir487 : li %114, 0 --> fir4154
+fir4154: seq %74, %76, %114 --> fir486
+fir486 : beq %74, %75 --> fir485, fir417
+fir417 : emit c2 --> fir416
+fir416 : li %20, 1 --> fir415
+fir415 : add %18, %11, %20 --> fir414
+fir414 : li %19, 16 --> fir413
+fir413 : la %100, mod --> fir4140
+fir4140: j --> fir4298
+fir4298: move $a0, %18 --> fir4297
+fir4297: move $a1, %19 --> fir4296
+fir4296: call %100(2) --> fir4295
+fir4295: move %11, $v0 --> fir412
+fir412 : emit c1 --> fir411
+fir411 : li %17, 16 --> fir410
+fir410 : srav %14, %4, %17 --> fir49
+fir49 : li %16, 4 --> fir48
+fir48 : mulo %15, %5, %16 --> fir47
+fir47 : add %110, %2, %15 --> fir4150
+fir4150: sw %14, 0(%110) --> fir46
+fir46 : emit c15 --> fir45
+fir45 : li %13, 1 --> fir44
+fir44 : add %5, %5, %13 --> fir43
+fir485 : emit c8 --> fir484
+fir484 : move %71, $sp --> fir4318
+fir4318: move %71, %71 --> fir483
+fir483 : li %73, 4 --> fir482
+fir482 : mulo %72, %11, %73 --> fir481
+fir481 : add %113, %71, %72 --> fir4153
+fir4153: lw %67, 0(%113) --> fir480
+fir480 : li %70, 4 --> fir479
+fir479 : mulo %69, %6, %70 --> fir478
+fir478 : add %112, %1, %69 --> fir4152
+fir4152: lw %68, 0(%112) --> fir477
+fir477 : mulo %10, %67, %68 --> fir476
+fir476 : emit c7 --> fir475
+fir475 : move %60, $sp --> fir4317
+fir4317: move %60, %60 --> fir474
+fir474 : li %66, 1 --> fir473
+fir473 : add %64, %11, %66 --> fir472
+fir472 : li %65, 16 --> fir471
+fir471 : la %111, mod --> fir4151
+fir4151: j --> fir4314
+fir4314: move $a0, %64 --> fir4313
+fir4313: move $a1, %65 --> fir4312
+fir4312: call %111(2) --> fir4311
+fir4311: move %62, $v0 --> fir470
+fir470 : li %63, 4 --> fir469
+fir469 : mulo %61, %62, %63 --> fir468
+fir468 : add %109, %60, %61 --> fir4149
+fir4149: lw %54, 0(%109) --> fir467
+fir467 : li %59, 1 --> fir466
+fir466 : add %57, %6, %59 --> fir465
+fir465 : li %58, 4 --> fir464
+fir464 : mulo %56, %57, %58 --> fir463
+fir463 : add %108, %1, %56 --> fir4148
+fir4148: lw %55, 0(%108) --> fir462
+fir462 : mulo %9, %54, %55 --> fir461
+fir461 : emit c6 --> fir460
+fir460 : move %47, $sp --> fir4316
+fir4316: move %47, %47 --> fir459
+fir459 : li %53, 2 --> fir458
+fir458 : add %51, %11, %53 --> fir457
+fir457 : li %52, 16 --> fir456
+fir456 : la %107, mod --> fir4147
+fir4147: j --> fir4310
+fir4310: move $a0, %51 --> fir4309
+fir4309: move $a1, %52 --> fir4308
+fir4308: call %107(2) --> fir4307
+fir4307: move %49, $v0 --> fir455
+fir455 : li %50, 4 --> fir454
+fir454 : mulo %48, %49, %50 --> fir453
+fir453 : add %106, %47, %48 --> fir4146
+fir4146: lw %41, 0(%106) --> fir452
+fir452 : li %46, 2 --> fir451
+fir451 : add %44, %6, %46 --> fir450
+fir450 : li %45, 4 --> fir449
+fir449 : mulo %43, %44, %45 --> fir448
+fir448 : add %105, %1, %43 --> fir4145
+fir4145: lw %42, 0(%105) --> fir447
+fir447 : mulo %8, %41, %42 --> fir446
+fir446 : emit c5 --> fir445
+fir445 : move %34, $sp --> fir4315
+fir4315: move %34, %34 --> fir444
+fir444 : li %40, 3 --> fir443
+fir443 : add %38, %11, %40 --> fir442
+fir442 : li %39, 16 --> fir441
+fir441 : la %104, mod --> fir4144
+fir4144: j --> fir4306
+fir4306: move $a0, %38 --> fir4305
+fir4305: move $a1, %39 --> fir4304
+fir4304: call %104(2) --> fir4303
+fir4303: move %36, $v0 --> fir440
+fir440 : li %37, 4 --> fir439
+fir439 : mulo %35, %36, %37 --> fir438
+fir438 : add %103, %34, %35 --> fir4143
+fir4143: lw %28, 0(%103) --> fir437
+fir437 : li %33, 3 --> fir436
+fir436 : add %31, %6, %33 --> fir435
+fir435 : li %32, 4 --> fir434
+fir434 : mulo %30, %31, %32 --> fir433
+fir433 : add %102, %1, %30 --> fir4142
+fir4142: lw %29, 0(%102) --> fir432
+fir432 : mulo %7, %28, %29 --> fir431
+fir431 : emit c4 --> fir430
+fir430 : add %27, %4, %10 --> fir429
+fir429 : add %26, %27, %9 --> fir428
+fir428 : add %25, %26, %8 --> fir427
+fir427 : add %4, %25, %7 --> fir426
+fir426 : emit c3 --> fir425
+fir425 : li %24, 4 --> fir424
+fir424 : add %22, %11, %24 --> fir423
+fir423 : li %23, 16 --> fir422
+fir422 : la %101, mod --> fir4141
+fir4141: j --> fir4302
+fir4302: move $a0, %22 --> fir4301
+fir4301: move $a1, %23 --> fir4300
+fir4300: call %101(2) --> fir4299
+fir4299: move %11, $v0 --> fir421
+fir421 : emit c9 --> fir420
+fir420 : li %21, 4 --> fir419
+fir419 : add %6, %6, %21 --> fir418
+fir4122: emit c19 --> fir4121
+fir4121: li %88, 0 --> fir4120
+fir4120: move %89, $sp --> fir4294
+fir4294: move %89, %89 --> fir4119
+fir4119: li %91, 4 --> fir4118
+fir4118: mulo %90, %6, %91 --> fir4117
+fir4117: add %98, %89, %90 --> fir4138
+fir4138: sw %88, 0(%98) --> fir4116
+fir4116: emit c20 --> fir4115
+fir4115: li %87, 1 --> fir4114
+fir4114: add %6, %6, %87 --> fir4113
+
+procedure _main(0)
+stacksize 64
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78, %79, %80, %81, %82, %83,
+ %84, %85, %86, %87, %88, %89, %90,
+ %91, %92, %93, %94, %95, %96, %97,
+ %98, %99, %100, %101, %102, %103, %104,
+ %105, %106, %107, %108, %109, %110, %111,
+ %112, %113, %114, %115, %116, %117, %118,
+ %119, %120, %121, %122, %123, %124, %125,
+ %126, %127, %128, %129, %130, %131, %132,
+ %133, %134, %135, %136, %137, %138, %139,
+ %140, %141, %142, %143, %144, %145, %146,
+ %147, %148, %149, %150, %151, %152, %153,
+ %154, %155, %156, %157, %158, %159
+entry main385
+main385: newframe --> main384
+main384: move %159, $ra --> main383
+main383: move %158, $s7 --> main382
+main382: move %157, $s6 --> main381
+main381: move %156, $s5 --> main380
+main380: move %155, $s4 --> main379
+main379: move %154, $s3 --> main378
+main378: move %153, $s2 --> main377
+main377: move %152, $s1 --> main376
+main376: move %151, $s0 --> main375
+main375: li %0, 0 --> main374
+main374: li %2, 0 --> main373
+main373: li %3, 0 --> main372
+main372: li %4, 0 --> main371
+main371: li %5, 0 --> main370
+main370: li %6, 0 --> main369
+main369: li %7, 0 --> main368
+main368: li %8, 0 --> main367
+main367: li %9, 0 --> main366
+main366: li %10, 0 --> main365
+main365: li %11, 0 --> main364
+main364: li %12, 0 --> main363
+main363: li %13, 0 --> main362
+main362: li %14, 0 --> main361
+main361: li %15, 0 --> main360
+main360: li %16, 0 --> main359
+main359: li %17, 0 --> main358
+main358: li %18, 0 --> main357
+main357: li %19, 0 --> main356
+main356: li %20, 0 --> main355
+main355: li %21, 0 --> main354
+main354: li %22, 0 --> main353
+main353: li %23, 0 --> main352
+main352: li %24, 0 --> main351
+main351: li %25, 0 --> main350
+main350: li %26, 0 --> main349
+main349: li %27, 0 --> main348
+main348: li %28, 0 --> main347
+main347: li %29, 0 --> main346
+main346: li %30, 0 --> main345
+main345: li %31, 0 --> main344
+main344: li %32, 0 --> main343
+main343: li %33, 0 --> main342
+main342: li %34, 0 --> main341
+main341: li %35, 0 --> main340
+main340: li %36, 0 --> main339
+main339: li %37, 0 --> main338
+main338: li %38, 0 --> main337
+main337: li %39, 0 --> main336
+main336: li %40, 0 --> main335
+main335: li %41, 0 --> main334
+main334: li %42, 0 --> main333
+main333: li %43, 0 --> main332
+main332: li %44, 0 --> main331
+main331: li %45, 0 --> main330
+main330: li %46, 0 --> main329
+main329: li %47, 0 --> main328
+main328: li %48, 0 --> main327
+main327: li %49, 0 --> main326
+main326: li %50, 0 --> main325
+main325: li %51, 0 --> main324
+main324: li %52, 0 --> main323
+main323: li %53, 0 --> main322
+main322: li %54, 0 --> main321
+main321: li %55, 0 --> main320
+main320: li %56, 0 --> main319
+main319: li %57, 0 --> main318
+main318: li %58, 0 --> main317
+main317: li %59, 0 --> main316
+main316: li %60, 0 --> main315
+main315: li %61, 0 --> main314
+main314: li %62, 0 --> main313
+main313: li %63, 0 --> main312
+main312: li %64, 0 --> main311
+main311: li %65, 0 --> main310
+main310: li %66, 0 --> main309
+main309: li %67, 0 --> main308
+main308: li %68, 0 --> main307
+main307: li %69, 0 --> main306
+main306: li %70, 0 --> main305
+main305: li %71, 0 --> main304
+main304: li %72, 0 --> main303
+main303: li %73, 0 --> main302
+main302: li %74, 0 --> main301
+main301: li %75, 0 --> main300
+main300: li %76, 0 --> main299
+main299: li %77, 0 --> main298
+main298: li %78, 0 --> main297
+main297: li %79, 0 --> main296
+main296: li %80, 0 --> main295
+main295: li %81, 0 --> main294
+main294: li %82, 0 --> main293
+main293: li %83, 0 --> main292
+main292: li %84, 0 --> main291
+main291: li %85, 0 --> main290
+main290: li %86, 0 --> main289
+main289: li %87, 0 --> main288
+main288: li %88, 0 --> main287
+main287: li %89, 0 --> main286
+main286: li %90, 0 --> main285
+main285: li %91, 0 --> main284
+main284: li %92, 0 --> main283
+main283: li %93, 0 --> main282
+main282: li %94, 0 --> main281
+main281: li %95, 0 --> main280
+main280: li %96, 0 --> main279
+main279: li %97, 0 --> main278
+main278: li %98, 0 --> main277
+main277: li %99, 0 --> main276
+main276: li %100, 0 --> main275
+main275: li %101, 0 --> main274
+main274: li %102, 0 --> main273
+main273: li %103, 0 --> main272
+main272: li %104, 0 --> main271
+main271: li %105, 0 --> main270
+main270: li %106, 0 --> main269
+main269: li %107, 0 --> main268
+main268: li %108, 0 --> main267
+main267: li %109, 0 --> main266
+main266: li %110, 0 --> main265
+main265: li %111, 0 --> main264
+main264: li %112, 0 --> main263
+main263: li %113, 0 --> main262
+main262: li %114, 0 --> main261
+main261: li %115, 0 --> main260
+main260: li %116, 0 --> main259
+main259: li %117, 0 --> main258
+main258: li %118, 0 --> main257
+main257: li %119, 0 --> main256
+main256: li %120, 0 --> main255
+main255: li %121, 0 --> main254
+main254: li %122, 0 --> main253
+main253: li %123, 0 --> main252
+main252: li %124, 0 --> main251
+main251: li %125, 0 --> main250
+main250: li %126, 0 --> main249
+main249: li %127, 0 --> main248
+main248: li %128, 0 --> main247
+main247: li %129, 0 --> main246
+main246: li %130, 0 --> main245
+main245: li %131, 0 --> main244
+main244: li %132, 0 --> main243
+main243: li %133, 0 --> main242
+main242: li %134, 0 --> main241
+main241: li %135, 0 --> main240
+main240: li %136, 0 --> main239
+main239: li %137, 0 --> main238
+main238: li %138, 0 --> main237
+main237: li %139, 0 --> main236
+main236: li %140, 0 --> main235
+main235: li %141, 0 --> main234
+main234: li %142, 0 --> main233
+main233: li %143, 0 --> main232
+main232: li %144, 0 --> main231
+main231: li %145, 0 --> main230
+main230: li %146, 0 --> main229
+main229: li %147, 0 --> main228
+main228: li %148, 0 --> main227
+main227: li %149, 0 --> main226
+main226: li %150, 0 --> main152
+main152: li %77, 1129 --> main151
+main151: move %106, $gp --> main426
+main426: move %106, %106 --> main181
+main181: sw %77, 0(%106) --> main150
+main150: li %76, 60034 --> main149
+main149: move %104, $gp --> main424
+main424: move %104, %104 --> main179
+main179: sw %76, 4(%104) --> main148
+main148: li %75, 64720 --> main147
+main147: move %103, $gp --> main423
+main423: move %103, %103 --> main178
+main178: sw %75, 8(%103) --> main146
+main146: li %74, 5595 --> main145
+main145: move %102, $gp --> main422
+main422: move %102, %102 --> main177
+main177: sw %74, 12(%102) --> main144
+main144: li %73, 494 --> main143
+main143: move %101, $gp --> main421
+main421: move %101, %101 --> main176
+main176: sw %73, 16(%101) --> main142
+main142: li %72, 59867 --> main141
+main141: move %100, $gp --> main420
+main420: move %100, %100 --> main175
+main175: sw %72, 20(%100) --> main140
+main140: li %71, 65370 --> main139
+main139: move %99, $gp --> main419
+main419: move %99, %99 --> main174
+main174: sw %71, 24(%99) --> main138
+main138: li %70, 5724 --> main137
+main137: move %98, $gp --> main418
+main418: move %98, %98 --> main173
+main173: sw %70, 28(%98) --> main136
+main136: li %69, 5724 --> main135
+main135: move %97, $gp --> main417
+main417: move %97, %97 --> main172
+main172: sw %69, 32(%97) --> main134
+main134: li %68, 65370 --> main133
+main133: move %96, $gp --> main416
+main416: move %96, %96 --> main171
+main171: sw %68, 36(%96) --> main132
+main132: li %67, 59867 --> main131
+main131: move %95, $gp --> main415
+main415: move %95, %95 --> main170
+main170: sw %67, 40(%95) --> main130
+main130: li %66, 494 --> main129
+main129: move %93, $gp --> main413
+main413: move %93, %93 --> main168
+main168: sw %66, 44(%93) --> main128
+main128: li %65, 5595 --> main127
+main127: move %92, $gp --> main412
+main412: move %92, %92 --> main167
+main167: sw %65, 48(%92) --> main126
+main126: li %64, 64720 --> main125
+main125: move %91, $gp --> main411
+main411: move %91, %91 --> main166
+main166: sw %64, 52(%91) --> main124
+main124: li %63, 60034 --> main123
+main123: move %90, $gp --> main410
+main410: move %90, %90 --> main165
+main165: sw %63, 56(%90) --> main122
+main122: li %62, 1129 --> main121
+main121: move %89, $gp --> main409
+main409: move %89, %89 --> main164
+main164: sw %62, 60(%89) --> main120
+main120: li %61, 1 --> main119
+main119: move %88, $gp --> main408
+main408: move %88, %88 --> main163
+main163: sw %61, 64(%88) --> main118
+main118: li %60, 0 --> main117
+main117: move %87, $gp --> main407
+main407: move %87, %87 --> main162
+main162: sw %60, 68(%87) --> main116
+main116: li %59, 16384 --> main115
+main115: move %86, $gp --> main406
+main406: move %86, %86 --> main161
+main161: sw %59, 72(%86) --> main114
+main114: li %58, 0 --> main113
+main113: move %85, $gp --> main405
+main405: move %85, %85 --> main160
+main160: sw %58, 76(%85) --> main112
+main112: li %57, 0 --> main111
+main111: move %84, $gp --> main404
+main404: move %84, %84 --> main159
+main159: sw %57, 80(%84) --> main110
+main110: li %56, 0 --> main109
+main109: move %82, $gp --> main402
+main402: move %82, %82 --> main157
+main157: sw %56, 84(%82) --> main108
+main108: li %55, 0 --> main107
+main107: move %81, $gp --> main401
+main401: move %81, %81 --> main156
+main156: sw %55, 88(%81) --> main106
+main106: li %54, 0 --> main105
+main105: move %80, $gp --> main400
+main400: move %80, %80 --> main155
+main155: sw %54, 92(%80) --> main104
+main104: li %53, 0 --> main103
+main103: move %79, $gp --> main399
+main399: move %79, %79 --> main154
+main154: sw %53, 96(%79) --> main102
+main102: li %52, 0 --> main101
+main101: move %78, $gp --> main398
+main398: move %78, %78 --> main153
+main153: sw %52, 100(%78) --> main100
+main100: li %51, 0 --> main99
+main99 : move %150, $gp --> main478
+main478: move %150, %150 --> main225
+main225: sw %51, 104(%150) --> main98
+main98 : li %50, 0 --> main97
+main97 : move %149, $gp --> main477
+main477: move %149, %149 --> main224
+main224: sw %50, 108(%149) --> main96
+main96 : li %49, 0 --> main95
+main95 : move %148, $gp --> main476
+main476: move %148, %148 --> main223
+main223: sw %49, 112(%148) --> main94
+main94 : li %48, 0 --> main93
+main93 : move %147, $gp --> main475
+main475: move %147, %147 --> main222
+main222: sw %48, 116(%147) --> main92
+main92 : li %47, 0 --> main91
+main91 : move %146, $gp --> main474
+main474: move %146, %146 --> main221
+main221: sw %47, 120(%146) --> main90
+main90 : li %46, 0 --> main89
+main89 : move %144, $gp --> main472
+main472: move %144, %144 --> main219
+main219: sw %46, 124(%144) --> main88
+main88 : li %45, 0 --> main87
+main87 : move %143, $gp --> main471
+main471: move %143, %143 --> main218
+main218: sw %45, 128(%143) --> main86
+main86 : li %44, 0 --> main85
+main85 : move %142, $gp --> main470
+main470: move %142, %142 --> main217
+main217: sw %44, 132(%142) --> main84
+main84 : li %43, 0 --> main83
+main83 : move %141, $gp --> main469
+main469: move %141, %141 --> main216
+main216: sw %43, 136(%141) --> main82
+main82 : li %42, 0 --> main81
+main81 : move %140, $gp --> main468
+main468: move %140, %140 --> main215
+main215: sw %42, 140(%140) --> main80
+main80 : li %41, 0 --> main79
+main79 : move %139, $gp --> main467
+main467: move %139, %139 --> main214
+main214: sw %41, 144(%139) --> main78
+main78 : li %40, 0 --> main77
+main77 : move %138, $gp --> main466
+main466: move %138, %138 --> main213
+main213: sw %40, 148(%138) --> main76
+main76 : li %39, 0 --> main75
+main75 : move %137, $gp --> main465
+main465: move %137, %137 --> main212
+main212: sw %39, 152(%137) --> main74
+main74 : li %38, 0 --> main73
+main73 : move %136, $gp --> main464
+main464: move %136, %136 --> main211
+main211: sw %38, 156(%136) --> main72
+main72 : li %37, 0 --> main71
+main71 : move %135, $gp --> main463
+main463: move %135, %135 --> main210
+main210: sw %37, 160(%135) --> main70
+main70 : li %36, 7986 --> main69
+main69 : move %134, $gp --> main461
+main461: move %134, %134 --> main209
+main209: sw %36, 164(%134) --> main68
+main68 : li %35, 8993 --> main67
+main67 : move %133, $gp --> main460
+main460: move %133, %133 --> main208
+main208: sw %35, 168(%133) --> main66
+main66 : li %34, 1808 --> main65
+main65 : move %132, $gp --> main459
+main459: move %132, %132 --> main207
+main207: sw %34, 172(%132) --> main64
+main64 : li %33, 4096 --> main63
+main63 : move %131, $gp --> main458
+main458: move %131, %131 --> main206
+main206: sw %33, 176(%131) --> main62
+main62 : li %32, 4096 --> main61
+main61 : move %130, $gp --> main457
+main457: move %130, %130 --> main205
+main205: sw %32, 180(%130) --> main60
+main60 : li %31, 4096 --> main59
+main59 : move %129, $gp --> main455
+main455: move %129, %129 --> main204
+main204: sw %31, 184(%129) --> main58
+main58 : li %30, 4096 --> main57
+main57 : move %128, $gp --> main454
+main454: move %128, %128 --> main203
+main203: sw %30, 188(%128) --> main56
+main56 : li %29, 4096 --> main55
+main55 : move %127, $gp --> main453
+main453: move %127, %127 --> main202
+main202: sw %29, 192(%127) --> main54
+main54 : li %28, 4096 --> main53
+main53 : move %126, $gp --> main452
+main452: move %126, %126 --> main201
+main201: sw %28, 196(%126) --> main52
+main52 : li %27, 4096 --> main51
+main51 : move %125, $gp --> main451
+main451: move %125, %125 --> main200
+main200: sw %27, 200(%125) --> main50
+main50 : li %26, 4096 --> main49
+main49 : move %124, $gp --> main449
+main449: move %124, %124 --> main199
+main199: sw %26, 204(%124) --> main48
+main48 : li %25, 4096 --> main47
+main47 : move %123, $gp --> main448
+main448: move %123, %123 --> main198
+main198: sw %25, 208(%123) --> main46
+main46 : li %24, 4096 --> main45
+main45 : move %122, $gp --> main447
+main447: move %122, %122 --> main197
+main197: sw %24, 212(%122) --> main44
+main44 : li %23, 4096 --> main43
+main43 : move %121, $gp --> main446
+main446: move %121, %121 --> main196
+main196: sw %23, 216(%121) --> main42
+main42 : li %22, 4096 --> main41
+main41 : move %120, $gp --> main445
+main445: move %120, %120 --> main195
+main195: sw %22, 220(%120) --> main40
+main40 : li %21, 4096 --> main39
+main39 : move %119, $gp --> main444
+main444: move %119, %119 --> main194
+main194: sw %21, 224(%119) --> main38
+main38 : li %20, 4096 --> main37
+main37 : move %118, $gp --> main443
+main443: move %118, %118 --> main193
+main193: sw %20, 228(%118) --> main36
+main36 : li %19, 4096 --> main35
+main35 : move %117, $gp --> main442
+main442: move %117, %117 --> main192
+main192: sw %19, 232(%117) --> main34
+main34 : li %18, 4096 --> main33
+main33 : move %116, $gp --> main441
+main441: move %116, %116 --> main191
+main191: sw %18, 236(%116) --> main32
+main32 : li %17, 4096 --> main31
+main31 : move %115, $gp --> main440
+main440: move %115, %115 --> main190
+main190: sw %17, 240(%115) --> main30
+main30 : li %16, 4096 --> main29
+main29 : move %113, $gp --> main439
+main439: move %113, %113 --> main188
+main188: sw %16, 244(%113) --> main28
+main28 : li %15, 4096 --> main27
+main27 : move %112, $gp --> main438
+main438: move %112, %112 --> main187
+main187: sw %15, 248(%112) --> main26
+main26 : li %14, 4096 --> main25
+main25 : move %111, $gp --> main437
+main437: move %111, %111 --> main186
+main186: sw %14, 252(%111) --> main24
+main24 : li %13, 4096 --> main23
+main23 : move %110, $gp --> main436
+main436: move %110, %110 --> main185
+main185: sw %13, 256(%110) --> main22
+main22 : li %12, 4096 --> main21
+main21 : move %109, $gp --> main435
+main435: move %109, %109 --> main184
+main184: sw %12, 260(%109) --> main20
+main20 : li %11, 4096 --> main19
+main19 : move %108, $gp --> main434
+main434: move %108, %108 --> main183
+main183: sw %11, 264(%108) --> main18
+main18 : li %10, 4096 --> main17
+main17 : move %107, $gp --> main427
+main427: move %107, %107 --> main182
+main182: sw %10, 268(%107) --> main16
+main16 : li %9, 4096 --> main15
+main15 : move %105, $gp --> main425
+main425: move %105, %105 --> main180
+main180: sw %9, 272(%105) --> main14
+main14 : li %8, 4096 --> main13
+main13 : move %94, $gp --> main414
+main414: move %94, %94 --> main169
+main169: sw %8, 276(%94) --> main12
+main12 : li %7, 4096 --> main11
+main11 : move %83, $gp --> main403
+main403: move %83, %83 --> main158
+main158: sw %7, 280(%83) --> main10
+main10 : li %6, 4096 --> main9
+main9 : move %145, $gp --> main473
+main473: move %145, %145 --> main220
+main220: sw %6, 284(%145) --> main8
+main8 : emit c27 --> main7
+main7 : move %2, $gp --> main462
+main462: addi %2, %2, 64 --> main6
+main6 : move %3, $gp --> main456
+main456: move %3, %3 --> main5
+main5 : move %4, $sp --> main450
+main450: move %4, %4 --> main4
+main4 : li %5, 16 --> main3
+main3 : la %114, fir4 --> main189
+main189: j --> main433
+main433: move $a0, %2 --> main432
+main432: move $a1, %3 --> main431
+main431: move $a2, %4 --> main430
+main430: move $a3, %5 --> main429
+main429: call %114(4) --> main428
+main428: move %0, $v0 --> main2
+main2 : emit c26 --> main1
+main1 : move %1, %0 --> main0
+main0 : j --> main397
+main397: move $v0, %1 --> main396
+main396: move $ra, %159 --> main395
+main395: move $s7, %158 --> main394
+main394: move $s6, %157 --> main393
+main393: move $s5, %156 --> main392
+main392: move $s4, %155 --> main391
+main391: move $s3, %154 --> main390
+main390: move $s2, %153 --> main389
+main389: move $s1, %152 --> main388
+main388: move $s0, %151 --> main387
+main387: delframe --> main386
+main386: jr $ra (xmits $v0)
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 288
+
+procedure fir4(4)
+var 116
+fir4280:
+newframe
+sw $ra, 112($sp)
+sw $s7, 108($sp)
+sw $s6, 104($sp)
+sw $s5, 100($sp)
+sw $s4, 96($sp)
+sw $s3, 92($sp)
+sw $s2, 88($sp)
+sw $s1, 84($sp)
+sw $s0, 80($sp)
+sw $a0, 64($sp)
+move $s6, $a1
+sw $a2, 68($sp)
+sw $a3, 72($sp)
+c25:
+li $s1, 0
+c24:
+c23:
+c22:
+li $s3, 0
+fir4128:
+li $a0, 0
+c21:
+li $v0, 16
+slt $v0, $s3, $v0
+seq $v0, $v0, $zero
+beq $v0, $a0, fir4122
+c18:
+c17:
+li $s4, 0
+fir4109:
+li $a0, 0
+c16:
+lw $fp, 72($sp)
+slt $v0, $s4, $fp
+seq $v0, $v0, $zero
+beq $v0, $a0, fir4104
+c0:
+li $v0, 0
+lw $ra, 112($sp)
+lw $s7, 108($sp)
+lw $s6, 104($sp)
+lw $s5, 100($sp)
+lw $s4, 96($sp)
+lw $s3, 92($sp)
+lw $s2, 88($sp)
+lw $s1, 84($sp)
+lw $s0, 80($sp)
+delframe
+jr $ra
+fir4104:
+c14:
+li $v0, 4
+mulo $v0, $s4, $v0
+lw $v1, 64($sp)
+add $v0, $v1, $v0
+lw $a1, 0($v0)
+move $a0, $sp
+li $v0, 4
+mulo $v0, $s1, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c13:
+li $s5, 0
+c12:
+c11:
+li $s3, 0
+fir491:
+li $a0, 0
+c10:
+li $v0, 16
+slt $v0, $s3, $v0
+seq $v0, $v0, $zero
+beq $v0, $a0, fir485
+c2:
+li $v0, 1
+add $a0, $s1, $v0
+li $a1, 16
+la $v0, mod
+call $v0
+move $s1, $v0
+c1:
+li $v0, 16
+srav $a0, $s5, $v0
+li $v0, 4
+mulo $v0, $s4, $v0
+lw $v1, 68($sp)
+add $v0, $v1, $v0
+sw $a0, 0($v0)
+c15:
+li $v0, 1
+add $s4, $s4, $v0
+j fir4109
+fir485:
+c8:
+move $a0, $sp
+li $v0, 4
+mulo $v0, $s1, $v0
+add $v0, $a0, $v0
+lw $a0, 0($v0)
+li $v0, 4
+mulo $v0, $s3, $v0
+add $v0, $s6, $v0
+lw $v0, 0($v0)
+mulo $s2, $a0, $v0
+c7:
+move $s0, $sp
+li $v0, 1
+add $a0, $s1, $v0
+li $a1, 16
+la $v0, mod
+call $v0
+li $a0, 4
+mulo $v0, $v0, $a0
+add $v0, $s0, $v0
+lw $a1, 0($v0)
+li $v0, 1
+add $a0, $s3, $v0
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $s6, $v0
+lw $v0, 0($v0)
+mulo $v1, $a1, $v0
+sw $v1, 76($sp)
+c6:
+move $s0, $sp
+li $v0, 2
+add $a0, $s1, $v0
+li $a1, 16
+la $v0, mod
+call $v0
+li $a0, 4
+mulo $v0, $v0, $a0
+add $v0, $s0, $v0
+lw $a1, 0($v0)
+li $v0, 2
+add $a0, $s3, $v0
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $s6, $v0
+lw $v0, 0($v0)
+mulo $s7, $a1, $v0
+c5:
+move $s0, $sp
+li $v0, 3
+add $a0, $s1, $v0
+li $a1, 16
+la $v0, mod
+call $v0
+li $a0, 4
+mulo $v0, $v0, $a0
+add $v0, $s0, $v0
+lw $a1, 0($v0)
+li $v0, 3
+add $a0, $s3, $v0
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $s6, $v0
+lw $v0, 0($v0)
+mulo $v0, $a1, $v0
+c4:
+add $a0, $s5, $s2
+lw $fp, 76($sp)
+add $a0, $a0, $fp
+add $a0, $a0, $s7
+add $s5, $a0, $v0
+c3:
+li $v0, 4
+add $a0, $s1, $v0
+li $a1, 16
+la $v0, mod
+call $v0
+move $s1, $v0
+c9:
+li $v0, 4
+add $s3, $s3, $v0
+j fir491
+fir4122:
+c19:
+move $a0, $sp
+li $v0, 4
+mulo $v0, $s3, $v0
+add $v0, $a0, $v0
+sw $zero, 0($v0)
+c20:
+li $v0, 1
+add $s3, $s3, $v0
+j fir4128
+
+procedure _main(0)
+var 68
+main385:
+newframe
+sw $ra, 64($sp)
+li $a0, 1129
+move $v0, $gp
+sw $a0, 0($v0)
+li $a0, 60034
+move $v0, $gp
+sw $a0, 4($v0)
+li $a0, 64720
+move $v0, $gp
+sw $a0, 8($v0)
+li $a0, 5595
+move $v0, $gp
+sw $a0, 12($v0)
+li $a0, 494
+move $v0, $gp
+sw $a0, 16($v0)
+li $a0, 59867
+move $v0, $gp
+sw $a0, 20($v0)
+li $a0, 65370
+move $v0, $gp
+sw $a0, 24($v0)
+li $a0, 5724
+move $v0, $gp
+sw $a0, 28($v0)
+li $a0, 5724
+move $v0, $gp
+sw $a0, 32($v0)
+li $a0, 65370
+move $v0, $gp
+sw $a0, 36($v0)
+li $a0, 59867
+move $v0, $gp
+sw $a0, 40($v0)
+li $a0, 494
+move $v0, $gp
+sw $a0, 44($v0)
+li $a0, 5595
+move $v0, $gp
+sw $a0, 48($v0)
+li $a0, 64720
+move $v0, $gp
+sw $a0, 52($v0)
+li $a0, 60034
+move $v0, $gp
+sw $a0, 56($v0)
+li $a0, 1129
+move $v0, $gp
+sw $a0, 60($v0)
+li $a0, 1
+move $v0, $gp
+sw $a0, 64($v0)
+move $v0, $gp
+sw $zero, 68($v0)
+li $a0, 16384
+move $v0, $gp
+sw $a0, 72($v0)
+move $v0, $gp
+sw $zero, 76($v0)
+move $v0, $gp
+sw $zero, 80($v0)
+move $v0, $gp
+sw $zero, 84($v0)
+move $v0, $gp
+sw $zero, 88($v0)
+move $v0, $gp
+sw $zero, 92($v0)
+move $v0, $gp
+sw $zero, 96($v0)
+move $v0, $gp
+sw $zero, 100($v0)
+move $v0, $gp
+sw $zero, 104($v0)
+move $v0, $gp
+sw $zero, 108($v0)
+move $v0, $gp
+sw $zero, 112($v0)
+move $v0, $gp
+sw $zero, 116($v0)
+move $v0, $gp
+sw $zero, 120($v0)
+move $v0, $gp
+sw $zero, 124($v0)
+move $v0, $gp
+sw $zero, 128($v0)
+move $v0, $gp
+sw $zero, 132($v0)
+move $v0, $gp
+sw $zero, 136($v0)
+move $v0, $gp
+sw $zero, 140($v0)
+move $v0, $gp
+sw $zero, 144($v0)
+move $v0, $gp
+sw $zero, 148($v0)
+move $v0, $gp
+sw $zero, 152($v0)
+move $v0, $gp
+sw $zero, 156($v0)
+move $v0, $gp
+sw $zero, 160($v0)
+li $a0, 7986
+move $v0, $gp
+sw $a0, 164($v0)
+li $a0, 8993
+move $v0, $gp
+sw $a0, 168($v0)
+li $a0, 1808
+move $v0, $gp
+sw $a0, 172($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 176($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 180($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 184($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 188($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 192($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 196($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 200($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 204($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 208($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 212($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 216($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 220($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 224($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 228($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 232($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 236($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 240($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 244($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 248($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 252($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 256($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 260($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 264($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 268($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 272($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 276($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 280($v0)
+li $a0, 4096
+move $v0, $gp
+sw $a0, 284($v0)
+c27:
+move $a0, $gp
+addi $a0, $a0, 64
+move $a1, $gp
+move $a2, $sp
+li $a3, 16
+la $v0, fir4
+call $v0
+c26:
+lw $ra, 64($sp)
+delframe
+jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 288
+
+procedure fir4(4)
+var 116
+entry fir4280
+fir4280: newframe --> fir4279
+fir4279: lw $ra, 112($sp) --> fir4278
+fir4278: lw $s7, 108($sp) --> fir4277
+fir4277: lw $s6, 104($sp) --> fir4276
+fir4276: lw $s5, 100($sp) --> fir4275
+fir4275: lw $s4, 96($sp) --> fir4274
+fir4274: lw $s3, 92($sp) --> fir4273
+fir4273: lw $s2, 88($sp) --> fir4272
+fir4272: lw $s1, 84($sp) --> fir4271
+fir4271: lw $s0, 80($sp) --> fir4270
+fir4270: lw $a0, 64($sp) --> fir4269
+fir4269: move $s6, $a1 --> fir4268
+fir4268: lw $a2, 68($sp) --> fir4267
+fir4267: lw $a3, 72($sp) --> fir4266
+fir4266: j --> fir4265
+fir4265: j --> fir4264
+fir4264: j --> fir4263
+fir4263: j --> fir4262
+fir4262: j --> fir4261
+fir4261: j --> fir4260
+fir4260: j --> fir4259
+fir4259: j --> fir4258
+fir4258: j --> fir4257
+fir4257: j --> fir4256
+fir4256: j --> fir4255
+fir4255: j --> fir4254
+fir4254: j --> fir4253
+fir4253: j --> fir4252
+fir4252: j --> fir4251
+fir4251: j --> fir4250
+fir4250: j --> fir4249
+fir4249: j --> fir4248
+fir4248: j --> fir4247
+fir4247: j --> fir4246
+fir4246: j --> fir4245
+fir4245: j --> fir4244
+fir4244: j --> fir4243
+fir4243: j --> fir4242
+fir4242: j --> fir4241
+fir4241: j --> fir4240
+fir4240: j --> fir4239
+fir4239: j --> fir4238
+fir4238: j --> fir4237
+fir4237: j --> fir4236
+fir4236: j --> fir4235
+fir4235: j --> fir4234
+fir4234: j --> fir4233
+fir4233: j --> fir4232
+fir4232: j --> fir4231
+fir4231: j --> fir4230
+fir4230: j --> fir4229
+fir4229: j --> fir4228
+fir4228: j --> fir4227
+fir4227: j --> fir4226
+fir4226: j --> fir4225
+fir4225: j --> fir4224
+fir4224: j --> fir4223
+fir4223: j --> fir4222
+fir4222: j --> fir4221
+fir4221: j --> fir4220
+fir4220: j --> fir4219
+fir4219: j --> fir4218
+fir4218: j --> fir4217
+fir4217: j --> fir4216
+fir4216: j --> fir4215
+fir4215: j --> fir4214
+fir4214: j --> fir4213
+fir4213: j --> fir4212
+fir4212: j --> fir4211
+fir4211: j --> fir4210
+fir4210: j --> fir4209
+fir4209: j --> fir4208
+fir4208: j --> fir4207
+fir4207: j --> fir4206
+fir4206: j --> fir4205
+fir4205: j --> fir4204
+fir4204: j --> fir4203
+fir4203: j --> fir4202
+fir4202: j --> fir4201
+fir4201: j --> fir4200
+fir4200: j --> fir4199
+fir4199: j --> fir4198
+fir4198: j --> fir4197
+fir4197: j --> fir4196
+fir4196: j --> fir4195
+fir4195: j --> fir4194
+fir4194: j --> fir4193
+fir4193: j --> fir4192
+fir4192: j --> fir4191
+fir4191: j --> fir4190
+fir4190: j --> fir4189
+fir4189: j --> fir4188
+fir4188: j --> fir4187
+fir4187: j --> fir4186
+fir4186: j --> fir4185
+fir4185: j --> fir4184
+fir4184: j --> fir4183
+fir4183: j --> fir4182
+fir4182: j --> fir4181
+fir4181: j --> fir4180
+fir4180: j --> fir4179
+fir4179: j --> fir4178
+fir4178: j --> fir4177
+fir4177: j --> fir4176
+fir4176: j --> fir4175
+fir4175: j --> fir4174
+fir4174: j --> fir4173
+fir4173: j --> fir4172
+fir4172: j --> fir4171
+fir4171: j --> fir4170
+fir4170: j --> fir4169
+fir4169: j --> fir4168
+fir4168: j --> fir4167
+fir4167: j --> fir4166
+fir4166: j --> fir4165
+fir4165: j --> fir4164
+fir4164: j --> fir4163
+fir4163: j --> fir4162
+fir4162: j --> fir4161
+fir4161: j --> fir4160
+fir4160: j --> fir4159
+fir4159: j --> fir4158
+fir4158: j --> fir4157
+fir4157: j --> fir4156
+fir4156: j --> fir4135
+fir4135: emit c25 --> fir4134
+fir4134: li $s1, 0 --> fir4133
+fir4133: emit c24 --> fir4132
+fir4132: j --> fir4131
+fir4131: emit c23 --> fir4130
+fir4130: emit c22 --> fir4129
+fir4129: li $s3, 0 --> fir4113
+fir4113: j --> fir4128
+fir4128: li $a0, 0 --> fir4127
+fir4127: emit c21 --> fir4126
+fir4126: li $v0, 16 --> fir4125
+fir4125: slt $v0, $s3, $v0 --> fir4124
+fir4124: j --> fir4139
+fir4139: seq $v0, $v0, $zero --> fir4123
+fir4123: beq $v0, $a0 --> fir4122, fir4112
+fir4112: emit c18 --> fir4111
+fir4111: emit c17 --> fir4110
+fir4110: li $s4, 0 --> fir43
+fir43 : j --> fir4109
+fir4109: li $a0, 0 --> fir4108
+fir4108: emit c16 --> fir4107
+fir4107: lw $fp, 72($sp) --> fir4320
+fir4320: slt $v0, $s4, $fp --> fir4106
+fir4106: j --> fir4137
+fir4137: seq $v0, $v0, $zero --> fir4105
+fir4105: beq $v0, $a0 --> fir4104, fir42
+fir42 : emit c0 --> fir41
+fir41 : li $v0, 0 --> fir40
+fir40 : j --> fir4292
+fir4292: j --> fir4291
+fir4291: lw $ra, 112($sp) --> fir4290
+fir4290: lw $s7, 108($sp) --> fir4289
+fir4289: lw $s6, 104($sp) --> fir4288
+fir4288: lw $s5, 100($sp) --> fir4287
+fir4287: lw $s4, 96($sp) --> fir4286
+fir4286: lw $s3, 92($sp) --> fir4285
+fir4285: lw $s2, 88($sp) --> fir4284
+fir4284: lw $s1, 84($sp) --> fir4283
+fir4283: lw $s0, 80($sp) --> fir4282
+fir4282: delframe --> fir4281
+fir4281: jr $ra
+fir4104: emit c14 --> fir4103
+fir4103: li $v0, 4 --> fir4102
+fir4102: mulo $v0, $s4, $v0 --> fir4101
+fir4101: lw $v1, 64($sp) --> fir4319
+fir4319: add $v0, $v1, $v0 --> fir4136
+fir4136: lw $a1, 0($v0) --> fir4100
+fir4100: move $a0, $sp --> fir4293
+fir4293: j --> fir499
+fir499 : li $v0, 4 --> fir498
+fir498 : mulo $v0, $s1, $v0 --> fir497
+fir497 : add $v0, $a0, $v0 --> fir4155
+fir4155: lw $a1, 0($v0) --> fir496
+fir496 : emit c13 --> fir495
+fir495 : li $s5, 0 --> fir494
+fir494 : emit c12 --> fir493
+fir493 : emit c11 --> fir492
+fir492 : li $s3, 0 --> fir418
+fir418 : j --> fir491
+fir491 : li $a0, 0 --> fir490
+fir490 : emit c10 --> fir489
+fir489 : li $v0, 16 --> fir488
+fir488 : slt $v0, $s3, $v0 --> fir487
+fir487 : j --> fir4154
+fir4154: seq $v0, $v0, $zero --> fir486
+fir486 : beq $v0, $a0 --> fir485, fir417
+fir417 : emit c2 --> fir416
+fir416 : li $v0, 1 --> fir415
+fir415 : add $a0, $s1, $v0 --> fir414
+fir414 : li $a1, 16 --> fir413
+fir413 : la $v0, mod --> fir4140
+fir4140: j --> fir4298
+fir4298: j --> fir4297
+fir4297: j --> fir4296
+fir4296: call $v0 --> fir4295
+fir4295: move $s1, $v0 --> fir412
+fir412 : emit c1 --> fir411
+fir411 : li $v0, 16 --> fir410
+fir410 : srav $a0, $s5, $v0 --> fir49
+fir49 : li $v0, 4 --> fir48
+fir48 : mulo $v0, $s4, $v0 --> fir47
+fir47 : lw $v1, 68($sp) --> fir4323
+fir4323: add $v0, $v1, $v0 --> fir4150
+fir4150: lw $a0, 0($v0) --> fir46
+fir46 : emit c15 --> fir45
+fir45 : li $v0, 1 --> fir44
+fir44 : add $s4, $s4, $v0 --> fir43
+fir485 : emit c8 --> fir484
+fir484 : move $a0, $sp --> fir4318
+fir4318: j --> fir483
+fir483 : li $v0, 4 --> fir482
+fir482 : mulo $v0, $s1, $v0 --> fir481
+fir481 : add $v0, $a0, $v0 --> fir4153
+fir4153: lw $a0, 0($v0) --> fir480
+fir480 : li $v0, 4 --> fir479
+fir479 : mulo $v0, $s3, $v0 --> fir478
+fir478 : add $v0, $s6, $v0 --> fir4152
+fir4152: lw $v0, 0($v0) --> fir477
+fir477 : mulo $s2, $a0, $v0 --> fir476
+fir476 : emit c7 --> fir475
+fir475 : move $s0, $sp --> fir4317
+fir4317: j --> fir474
+fir474 : li $v0, 1 --> fir473
+fir473 : add $a0, $s1, $v0 --> fir472
+fir472 : li $a1, 16 --> fir471
+fir471 : la $v0, mod --> fir4151
+fir4151: j --> fir4314
+fir4314: j --> fir4313
+fir4313: j --> fir4312
+fir4312: call $v0 --> fir4311
+fir4311: j --> fir470
+fir470 : li $a0, 4 --> fir469
+fir469 : mulo $v0, $v0, $a0 --> fir468
+fir468 : add $v0, $s0, $v0 --> fir4149
+fir4149: lw $a1, 0($v0) --> fir467
+fir467 : li $v0, 1 --> fir466
+fir466 : add $a0, $s3, $v0 --> fir465
+fir465 : li $v0, 4 --> fir464
+fir464 : mulo $v0, $a0, $v0 --> fir463
+fir463 : add $v0, $s6, $v0 --> fir4148
+fir4148: lw $v0, 0($v0) --> fir462
+fir462 : mulo $v1, $a1, $v0 --> fir4322
+fir4322: lw $v1, 76($sp) --> fir461
+fir461 : emit c6 --> fir460
+fir460 : move $s0, $sp --> fir4316
+fir4316: j --> fir459
+fir459 : li $v0, 2 --> fir458
+fir458 : add $a0, $s1, $v0 --> fir457
+fir457 : li $a1, 16 --> fir456
+fir456 : la $v0, mod --> fir4147
+fir4147: j --> fir4310
+fir4310: j --> fir4309
+fir4309: j --> fir4308
+fir4308: call $v0 --> fir4307
+fir4307: j --> fir455
+fir455 : li $a0, 4 --> fir454
+fir454 : mulo $v0, $v0, $a0 --> fir453
+fir453 : add $v0, $s0, $v0 --> fir4146
+fir4146: lw $a1, 0($v0) --> fir452
+fir452 : li $v0, 2 --> fir451
+fir451 : add $a0, $s3, $v0 --> fir450
+fir450 : li $v0, 4 --> fir449
+fir449 : mulo $v0, $a0, $v0 --> fir448
+fir448 : add $v0, $s6, $v0 --> fir4145
+fir4145: lw $v0, 0($v0) --> fir447
+fir447 : mulo $s7, $a1, $v0 --> fir446
+fir446 : emit c5 --> fir445
+fir445 : move $s0, $sp --> fir4315
+fir4315: j --> fir444
+fir444 : li $v0, 3 --> fir443
+fir443 : add $a0, $s1, $v0 --> fir442
+fir442 : li $a1, 16 --> fir441
+fir441 : la $v0, mod --> fir4144
+fir4144: j --> fir4306
+fir4306: j --> fir4305
+fir4305: j --> fir4304
+fir4304: call $v0 --> fir4303
+fir4303: j --> fir440
+fir440 : li $a0, 4 --> fir439
+fir439 : mulo $v0, $v0, $a0 --> fir438
+fir438 : add $v0, $s0, $v0 --> fir4143
+fir4143: lw $a1, 0($v0) --> fir437
+fir437 : li $v0, 3 --> fir436
+fir436 : add $a0, $s3, $v0 --> fir435
+fir435 : li $v0, 4 --> fir434
+fir434 : mulo $v0, $a0, $v0 --> fir433
+fir433 : add $v0, $s6, $v0 --> fir4142
+fir4142: lw $v0, 0($v0) --> fir432
+fir432 : mulo $v0, $a1, $v0 --> fir431
+fir431 : emit c4 --> fir430
+fir430 : add $a0, $s5, $s2 --> fir429
+fir429 : lw $fp, 76($sp) --> fir4321
+fir4321: add $a0, $a0, $fp --> fir428
+fir428 : add $a0, $a0, $s7 --> fir427
+fir427 : add $s5, $a0, $v0 --> fir426
+fir426 : emit c3 --> fir425
+fir425 : li $v0, 4 --> fir424
+fir424 : add $a0, $s1, $v0 --> fir423
+fir423 : li $a1, 16 --> fir422
+fir422 : la $v0, mod --> fir4141
+fir4141: j --> fir4302
+fir4302: j --> fir4301
+fir4301: j --> fir4300
+fir4300: call $v0 --> fir4299
+fir4299: move $s1, $v0 --> fir421
+fir421 : emit c9 --> fir420
+fir420 : li $v0, 4 --> fir419
+fir419 : add $s3, $s3, $v0 --> fir418
+fir4122: emit c19 --> fir4121
+fir4121: j --> fir4120
+fir4120: move $a0, $sp --> fir4294
+fir4294: j --> fir4119
+fir4119: li $v0, 4 --> fir4118
+fir4118: mulo $v0, $s3, $v0 --> fir4117
+fir4117: add $v0, $a0, $v0 --> fir4138
+fir4138: lw $zero, 0($v0) --> fir4116
+fir4116: emit c20 --> fir4115
+fir4115: li $v0, 1 --> fir4114
+fir4114: add $s3, $s3, $v0 --> fir4113
+
+procedure _main(0)
+var 68
+entry main385
+main385: newframe --> main384
+main384: lw $ra, 64($sp) --> main383
+main383: j --> main382
+main382: j --> main381
+main381: j --> main380
+main380: j --> main379
+main379: j --> main378
+main378: j --> main377
+main377: j --> main376
+main376: j --> main375
+main375: j --> main374
+main374: j --> main373
+main373: j --> main372
+main372: j --> main371
+main371: j --> main370
+main370: j --> main369
+main369: j --> main368
+main368: j --> main367
+main367: j --> main366
+main366: j --> main365
+main365: j --> main364
+main364: j --> main363
+main363: j --> main362
+main362: j --> main361
+main361: j --> main360
+main360: j --> main359
+main359: j --> main358
+main358: j --> main357
+main357: j --> main356
+main356: j --> main355
+main355: j --> main354
+main354: j --> main353
+main353: j --> main352
+main352: j --> main351
+main351: j --> main350
+main350: j --> main349
+main349: j --> main348
+main348: j --> main347
+main347: j --> main346
+main346: j --> main345
+main345: j --> main344
+main344: j --> main343
+main343: j --> main342
+main342: j --> main341
+main341: j --> main340
+main340: j --> main339
+main339: j --> main338
+main338: j --> main337
+main337: j --> main336
+main336: j --> main335
+main335: j --> main334
+main334: j --> main333
+main333: j --> main332
+main332: j --> main331
+main331: j --> main330
+main330: j --> main329
+main329: j --> main328
+main328: j --> main327
+main327: j --> main326
+main326: j --> main325
+main325: j --> main324
+main324: j --> main323
+main323: j --> main322
+main322: j --> main321
+main321: j --> main320
+main320: j --> main319
+main319: j --> main318
+main318: j --> main317
+main317: j --> main316
+main316: j --> main315
+main315: j --> main314
+main314: j --> main313
+main313: j --> main312
+main312: j --> main311
+main311: j --> main310
+main310: j --> main309
+main309: j --> main308
+main308: j --> main307
+main307: j --> main306
+main306: j --> main305
+main305: j --> main304
+main304: j --> main303
+main303: j --> main302
+main302: j --> main301
+main301: j --> main300
+main300: j --> main299
+main299: j --> main298
+main298: j --> main297
+main297: j --> main296
+main296: j --> main295
+main295: j --> main294
+main294: j --> main293
+main293: j --> main292
+main292: j --> main291
+main291: j --> main290
+main290: j --> main289
+main289: j --> main288
+main288: j --> main287
+main287: j --> main286
+main286: j --> main285
+main285: j --> main284
+main284: j --> main283
+main283: j --> main282
+main282: j --> main281
+main281: j --> main280
+main280: j --> main279
+main279: j --> main278
+main278: j --> main277
+main277: j --> main276
+main276: j --> main275
+main275: j --> main274
+main274: j --> main273
+main273: j --> main272
+main272: j --> main271
+main271: j --> main270
+main270: j --> main269
+main269: j --> main268
+main268: j --> main267
+main267: j --> main266
+main266: j --> main265
+main265: j --> main264
+main264: j --> main263
+main263: j --> main262
+main262: j --> main261
+main261: j --> main260
+main260: j --> main259
+main259: j --> main258
+main258: j --> main257
+main257: j --> main256
+main256: j --> main255
+main255: j --> main254
+main254: j --> main253
+main253: j --> main252
+main252: j --> main251
+main251: j --> main250
+main250: j --> main249
+main249: j --> main248
+main248: j --> main247
+main247: j --> main246
+main246: j --> main245
+main245: j --> main244
+main244: j --> main243
+main243: j --> main242
+main242: j --> main241
+main241: j --> main240
+main240: j --> main239
+main239: j --> main238
+main238: j --> main237
+main237: j --> main236
+main236: j --> main235
+main235: j --> main234
+main234: j --> main233
+main233: j --> main232
+main232: j --> main231
+main231: j --> main230
+main230: j --> main229
+main229: j --> main228
+main228: j --> main227
+main227: j --> main226
+main226: j --> main152
+main152: li $a0, 1129 --> main151
+main151: move $v0, $gp --> main426
+main426: j --> main181
+main181: lw $a0, 0($v0) --> main150
+main150: li $a0, 60034 --> main149
+main149: move $v0, $gp --> main424
+main424: j --> main179
+main179: lw $a0, 4($v0) --> main148
+main148: li $a0, 64720 --> main147
+main147: move $v0, $gp --> main423
+main423: j --> main178
+main178: lw $a0, 8($v0) --> main146
+main146: li $a0, 5595 --> main145
+main145: move $v0, $gp --> main422
+main422: j --> main177
+main177: lw $a0, 12($v0) --> main144
+main144: li $a0, 494 --> main143
+main143: move $v0, $gp --> main421
+main421: j --> main176
+main176: lw $a0, 16($v0) --> main142
+main142: li $a0, 59867 --> main141
+main141: move $v0, $gp --> main420
+main420: j --> main175
+main175: lw $a0, 20($v0) --> main140
+main140: li $a0, 65370 --> main139
+main139: move $v0, $gp --> main419
+main419: j --> main174
+main174: lw $a0, 24($v0) --> main138
+main138: li $a0, 5724 --> main137
+main137: move $v0, $gp --> main418
+main418: j --> main173
+main173: lw $a0, 28($v0) --> main136
+main136: li $a0, 5724 --> main135
+main135: move $v0, $gp --> main417
+main417: j --> main172
+main172: lw $a0, 32($v0) --> main134
+main134: li $a0, 65370 --> main133
+main133: move $v0, $gp --> main416
+main416: j --> main171
+main171: lw $a0, 36($v0) --> main132
+main132: li $a0, 59867 --> main131
+main131: move $v0, $gp --> main415
+main415: j --> main170
+main170: lw $a0, 40($v0) --> main130
+main130: li $a0, 494 --> main129
+main129: move $v0, $gp --> main413
+main413: j --> main168
+main168: lw $a0, 44($v0) --> main128
+main128: li $a0, 5595 --> main127
+main127: move $v0, $gp --> main412
+main412: j --> main167
+main167: lw $a0, 48($v0) --> main126
+main126: li $a0, 64720 --> main125
+main125: move $v0, $gp --> main411
+main411: j --> main166
+main166: lw $a0, 52($v0) --> main124
+main124: li $a0, 60034 --> main123
+main123: move $v0, $gp --> main410
+main410: j --> main165
+main165: lw $a0, 56($v0) --> main122
+main122: li $a0, 1129 --> main121
+main121: move $v0, $gp --> main409
+main409: j --> main164
+main164: lw $a0, 60($v0) --> main120
+main120: li $a0, 1 --> main119
+main119: move $v0, $gp --> main408
+main408: j --> main163
+main163: lw $a0, 64($v0) --> main118
+main118: j --> main117
+main117: move $v0, $gp --> main407
+main407: j --> main162
+main162: lw $zero, 68($v0) --> main116
+main116: li $a0, 16384 --> main115
+main115: move $v0, $gp --> main406
+main406: j --> main161
+main161: lw $a0, 72($v0) --> main114
+main114: j --> main113
+main113: move $v0, $gp --> main405
+main405: j --> main160
+main160: lw $zero, 76($v0) --> main112
+main112: j --> main111
+main111: move $v0, $gp --> main404
+main404: j --> main159
+main159: lw $zero, 80($v0) --> main110
+main110: j --> main109
+main109: move $v0, $gp --> main402
+main402: j --> main157
+main157: lw $zero, 84($v0) --> main108
+main108: j --> main107
+main107: move $v0, $gp --> main401
+main401: j --> main156
+main156: lw $zero, 88($v0) --> main106
+main106: j --> main105
+main105: move $v0, $gp --> main400
+main400: j --> main155
+main155: lw $zero, 92($v0) --> main104
+main104: j --> main103
+main103: move $v0, $gp --> main399
+main399: j --> main154
+main154: lw $zero, 96($v0) --> main102
+main102: j --> main101
+main101: move $v0, $gp --> main398
+main398: j --> main153
+main153: lw $zero, 100($v0) --> main100
+main100: j --> main99
+main99 : move $v0, $gp --> main478
+main478: j --> main225
+main225: lw $zero, 104($v0) --> main98
+main98 : j --> main97
+main97 : move $v0, $gp --> main477
+main477: j --> main224
+main224: lw $zero, 108($v0) --> main96
+main96 : j --> main95
+main95 : move $v0, $gp --> main476
+main476: j --> main223
+main223: lw $zero, 112($v0) --> main94
+main94 : j --> main93
+main93 : move $v0, $gp --> main475
+main475: j --> main222
+main222: lw $zero, 116($v0) --> main92
+main92 : j --> main91
+main91 : move $v0, $gp --> main474
+main474: j --> main221
+main221: lw $zero, 120($v0) --> main90
+main90 : j --> main89
+main89 : move $v0, $gp --> main472
+main472: j --> main219
+main219: lw $zero, 124($v0) --> main88
+main88 : j --> main87
+main87 : move $v0, $gp --> main471
+main471: j --> main218
+main218: lw $zero, 128($v0) --> main86
+main86 : j --> main85
+main85 : move $v0, $gp --> main470
+main470: j --> main217
+main217: lw $zero, 132($v0) --> main84
+main84 : j --> main83
+main83 : move $v0, $gp --> main469
+main469: j --> main216
+main216: lw $zero, 136($v0) --> main82
+main82 : j --> main81
+main81 : move $v0, $gp --> main468
+main468: j --> main215
+main215: lw $zero, 140($v0) --> main80
+main80 : j --> main79
+main79 : move $v0, $gp --> main467
+main467: j --> main214
+main214: lw $zero, 144($v0) --> main78
+main78 : j --> main77
+main77 : move $v0, $gp --> main466
+main466: j --> main213
+main213: lw $zero, 148($v0) --> main76
+main76 : j --> main75
+main75 : move $v0, $gp --> main465
+main465: j --> main212
+main212: lw $zero, 152($v0) --> main74
+main74 : j --> main73
+main73 : move $v0, $gp --> main464
+main464: j --> main211
+main211: lw $zero, 156($v0) --> main72
+main72 : j --> main71
+main71 : move $v0, $gp --> main463
+main463: j --> main210
+main210: lw $zero, 160($v0) --> main70
+main70 : li $a0, 7986 --> main69
+main69 : move $v0, $gp --> main461
+main461: j --> main209
+main209: lw $a0, 164($v0) --> main68
+main68 : li $a0, 8993 --> main67
+main67 : move $v0, $gp --> main460
+main460: j --> main208
+main208: lw $a0, 168($v0) --> main66
+main66 : li $a0, 1808 --> main65
+main65 : move $v0, $gp --> main459
+main459: j --> main207
+main207: lw $a0, 172($v0) --> main64
+main64 : li $a0, 4096 --> main63
+main63 : move $v0, $gp --> main458
+main458: j --> main206
+main206: lw $a0, 176($v0) --> main62
+main62 : li $a0, 4096 --> main61
+main61 : move $v0, $gp --> main457
+main457: j --> main205
+main205: lw $a0, 180($v0) --> main60
+main60 : li $a0, 4096 --> main59
+main59 : move $v0, $gp --> main455
+main455: j --> main204
+main204: lw $a0, 184($v0) --> main58
+main58 : li $a0, 4096 --> main57
+main57 : move $v0, $gp --> main454
+main454: j --> main203
+main203: lw $a0, 188($v0) --> main56
+main56 : li $a0, 4096 --> main55
+main55 : move $v0, $gp --> main453
+main453: j --> main202
+main202: lw $a0, 192($v0) --> main54
+main54 : li $a0, 4096 --> main53
+main53 : move $v0, $gp --> main452
+main452: j --> main201
+main201: lw $a0, 196($v0) --> main52
+main52 : li $a0, 4096 --> main51
+main51 : move $v0, $gp --> main451
+main451: j --> main200
+main200: lw $a0, 200($v0) --> main50
+main50 : li $a0, 4096 --> main49
+main49 : move $v0, $gp --> main449
+main449: j --> main199
+main199: lw $a0, 204($v0) --> main48
+main48 : li $a0, 4096 --> main47
+main47 : move $v0, $gp --> main448
+main448: j --> main198
+main198: lw $a0, 208($v0) --> main46
+main46 : li $a0, 4096 --> main45
+main45 : move $v0, $gp --> main447
+main447: j --> main197
+main197: lw $a0, 212($v0) --> main44
+main44 : li $a0, 4096 --> main43
+main43 : move $v0, $gp --> main446
+main446: j --> main196
+main196: lw $a0, 216($v0) --> main42
+main42 : li $a0, 4096 --> main41
+main41 : move $v0, $gp --> main445
+main445: j --> main195
+main195: lw $a0, 220($v0) --> main40
+main40 : li $a0, 4096 --> main39
+main39 : move $v0, $gp --> main444
+main444: j --> main194
+main194: lw $a0, 224($v0) --> main38
+main38 : li $a0, 4096 --> main37
+main37 : move $v0, $gp --> main443
+main443: j --> main193
+main193: lw $a0, 228($v0) --> main36
+main36 : li $a0, 4096 --> main35
+main35 : move $v0, $gp --> main442
+main442: j --> main192
+main192: lw $a0, 232($v0) --> main34
+main34 : li $a0, 4096 --> main33
+main33 : move $v0, $gp --> main441
+main441: j --> main191
+main191: lw $a0, 236($v0) --> main32
+main32 : li $a0, 4096 --> main31
+main31 : move $v0, $gp --> main440
+main440: j --> main190
+main190: lw $a0, 240($v0) --> main30
+main30 : li $a0, 4096 --> main29
+main29 : move $v0, $gp --> main439
+main439: j --> main188
+main188: lw $a0, 244($v0) --> main28
+main28 : li $a0, 4096 --> main27
+main27 : move $v0, $gp --> main438
+main438: j --> main187
+main187: lw $a0, 248($v0) --> main26
+main26 : li $a0, 4096 --> main25
+main25 : move $v0, $gp --> main437
+main437: j --> main186
+main186: lw $a0, 252($v0) --> main24
+main24 : li $a0, 4096 --> main23
+main23 : move $v0, $gp --> main436
+main436: j --> main185
+main185: lw $a0, 256($v0) --> main22
+main22 : li $a0, 4096 --> main21
+main21 : move $v0, $gp --> main435
+main435: j --> main184
+main184: lw $a0, 260($v0) --> main20
+main20 : li $a0, 4096 --> main19
+main19 : move $v0, $gp --> main434
+main434: j --> main183
+main183: lw $a0, 264($v0) --> main18
+main18 : li $a0, 4096 --> main17
+main17 : move $v0, $gp --> main427
+main427: j --> main182
+main182: lw $a0, 268($v0) --> main16
+main16 : li $a0, 4096 --> main15
+main15 : move $v0, $gp --> main425
+main425: j --> main180
+main180: lw $a0, 272($v0) --> main14
+main14 : li $a0, 4096 --> main13
+main13 : move $v0, $gp --> main414
+main414: j --> main169
+main169: lw $a0, 276($v0) --> main12
+main12 : li $a0, 4096 --> main11
+main11 : move $v0, $gp --> main403
+main403: j --> main158
+main158: lw $a0, 280($v0) --> main10
+main10 : li $a0, 4096 --> main9
+main9 : move $v0, $gp --> main473
+main473: j --> main220
+main220: lw $a0, 284($v0) --> main8
+main8 : emit c27 --> main7
+main7 : move $a0, $gp --> main462
+main462: addi $a0, $a0, 64 --> main6
+main6 : move $a1, $gp --> main456
+main456: j --> main5
+main5 : move $a2, $sp --> main450
+main450: j --> main4
+main4 : li $a3, 16 --> main3
+main3 : la $v0, fir4 --> main189
+main189: j --> main433
+main433: j --> main432
+main432: j --> main431
+main431: j --> main430
+main430: j --> main429
+main429: call $v0 --> main428
+main428: j --> main2
+main2 : emit c26 --> main1
+main1 : j --> main0
+main0 : j --> main397
+main397: j --> main396
+main396: lw $ra, 64($sp) --> main395
+main395: j --> main394
+main394: j --> main393
+main393: j --> main392
+main392: j --> main391
+main391: j --> main390
+main390: j --> main389
+main389: j --> main388
+main388: j --> main387
+main387: delframe --> main386
+main386: jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 288
+
+function fir4(%0; %1; %2; %3) : %12
+stacksize 64
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78, %79, %80, %81, %82, %83,
+ %84, %85, %86, %87, %88, %89, %90,
+ %91, %92, %93, %94, %95, %96, %97,
+ %98, %99, %100, %101, %102, %103, %104,
+ %105, %106, %107, %108, %109, %110, %111,
+ %112, %113, %114, %115
+entry fir4266
+fir4266: li %4, 0 --> fir4265
+fir4265: li %5, 0 --> fir4264
+fir4264: li %6, 0 --> fir4263
+fir4263: li %7, 0 --> fir4262
+fir4262: li %8, 0 --> fir4261
+fir4261: li %9, 0 --> fir4260
+fir4260: li %10, 0 --> fir4259
+fir4259: li %11, 0 --> fir4258
+fir4258: li %13, 0 --> fir4257
+fir4257: li %14, 0 --> fir4256
+fir4256: li %15, 0 --> fir4255
+fir4255: li %16, 0 --> fir4254
+fir4254: li %17, 0 --> fir4253
+fir4253: li %18, 0 --> fir4252
+fir4252: li %19, 0 --> fir4251
+fir4251: li %20, 0 --> fir4250
+fir4250: li %21, 0 --> fir4249
+fir4249: li %22, 0 --> fir4248
+fir4248: li %23, 0 --> fir4247
+fir4247: li %24, 0 --> fir4246
+fir4246: li %25, 0 --> fir4245
+fir4245: li %26, 0 --> fir4244
+fir4244: li %27, 0 --> fir4243
+fir4243: li %28, 0 --> fir4242
+fir4242: li %29, 0 --> fir4241
+fir4241: li %30, 0 --> fir4240
+fir4240: li %31, 0 --> fir4239
+fir4239: li %32, 0 --> fir4238
+fir4238: li %33, 0 --> fir4237
+fir4237: li %34, 0 --> fir4236
+fir4236: li %35, 0 --> fir4235
+fir4235: li %36, 0 --> fir4234
+fir4234: li %37, 0 --> fir4233
+fir4233: li %38, 0 --> fir4232
+fir4232: li %39, 0 --> fir4231
+fir4231: li %40, 0 --> fir4230
+fir4230: li %41, 0 --> fir4229
+fir4229: li %42, 0 --> fir4228
+fir4228: li %43, 0 --> fir4227
+fir4227: li %44, 0 --> fir4226
+fir4226: li %45, 0 --> fir4225
+fir4225: li %46, 0 --> fir4224
+fir4224: li %47, 0 --> fir4223
+fir4223: li %48, 0 --> fir4222
+fir4222: li %49, 0 --> fir4221
+fir4221: li %50, 0 --> fir4220
+fir4220: li %51, 0 --> fir4219
+fir4219: li %52, 0 --> fir4218
+fir4218: li %53, 0 --> fir4217
+fir4217: li %54, 0 --> fir4216
+fir4216: li %55, 0 --> fir4215
+fir4215: li %56, 0 --> fir4214
+fir4214: li %57, 0 --> fir4213
+fir4213: li %58, 0 --> fir4212
+fir4212: li %59, 0 --> fir4211
+fir4211: li %60, 0 --> fir4210
+fir4210: li %61, 0 --> fir4209
+fir4209: li %62, 0 --> fir4208
+fir4208: li %63, 0 --> fir4207
+fir4207: li %64, 0 --> fir4206
+fir4206: li %65, 0 --> fir4205
+fir4205: li %66, 0 --> fir4204
+fir4204: li %67, 0 --> fir4203
+fir4203: li %68, 0 --> fir4202
+fir4202: li %69, 0 --> fir4201
+fir4201: li %70, 0 --> fir4200
+fir4200: li %71, 0 --> fir4199
+fir4199: li %72, 0 --> fir4198
+fir4198: li %73, 0 --> fir4197
+fir4197: li %74, 0 --> fir4196
+fir4196: li %75, 0 --> fir4195
+fir4195: li %76, 0 --> fir4194
+fir4194: li %77, 0 --> fir4193
+fir4193: li %78, 0 --> fir4192
+fir4192: li %79, 0 --> fir4191
+fir4191: li %80, 0 --> fir4190
+fir4190: li %81, 0 --> fir4189
+fir4189: li %82, 0 --> fir4188
+fir4188: li %83, 0 --> fir4187
+fir4187: li %84, 0 --> fir4186
+fir4186: li %85, 0 --> fir4185
+fir4185: li %86, 0 --> fir4184
+fir4184: li %87, 0 --> fir4183
+fir4183: li %88, 0 --> fir4182
+fir4182: li %89, 0 --> fir4181
+fir4181: li %90, 0 --> fir4180
+fir4180: li %91, 0 --> fir4179
+fir4179: li %92, 0 --> fir4178
+fir4178: li %93, 0 --> fir4177
+fir4177: li %94, 0 --> fir4176
+fir4176: li %95, 0 --> fir4175
+fir4175: li %96, 0 --> fir4174
+fir4174: li %97, 0 --> fir4173
+fir4173: li %98, 0 --> fir4172
+fir4172: li %99, 0 --> fir4171
+fir4171: li %100, 0 --> fir4170
+fir4170: li %101, 0 --> fir4169
+fir4169: li %102, 0 --> fir4168
+fir4168: li %103, 0 --> fir4167
+fir4167: li %104, 0 --> fir4166
+fir4166: li %105, 0 --> fir4165
+fir4165: li %106, 0 --> fir4164
+fir4164: li %107, 0 --> fir4163
+fir4163: li %108, 0 --> fir4162
+fir4162: li %109, 0 --> fir4161
+fir4161: li %110, 0 --> fir4160
+fir4160: li %111, 0 --> fir4159
+fir4159: li %112, 0 --> fir4158
+fir4158: li %113, 0 --> fir4157
+fir4157: li %114, 0 --> fir4156
+fir4156: li %115, 0 --> fir4135
+fir4135: emit c25 --> fir4134
+fir4134: li %11, 0 --> fir4133
+fir4133: emit c24 --> fir4132
+fir4132: li %4, 0 --> fir4131
+fir4131: emit c23 --> fir4130
+fir4130: emit c22 --> fir4129
+fir4129: li %6, 0 --> fir4113
+fir4113: j --> fir4128
+fir4128: li %93, 0 --> fir4127
+fir4127: emit c21 --> fir4126
+fir4126: li %95, 16 --> fir4125
+fir4125: slt %94, %6, %95 --> fir4124
+fir4124: li %99, 0 --> fir4139
+fir4139: seq %92, %94, %99 --> fir4123
+fir4123: beq %92, %93 --> fir4122, fir4112
+fir4112: emit c18 --> fir4111
+fir4111: emit c17 --> fir4110
+fir4110: li %5, 0 --> fir43
+fir43 : j --> fir4109
+fir4109: li %85, 0 --> fir4108
+fir4108: emit c16 --> fir4107
+fir4107: slt %86, %5, %3 --> fir4106
+fir4106: li %97, 0 --> fir4137
+fir4137: seq %84, %86, %97 --> fir4105
+fir4105: beq %84, %85 --> fir4104, fir42
+fir42 : emit c0 --> fir41
+fir41 : li %12, 0 --> fir40
+fir40 : return %12
+fir4104: emit c14 --> fir4103
+fir4103: li %83, 4 --> fir4102
+fir4102: mulo %82, %5, %83 --> fir4101
+fir4101: add %96, %0, %82 --> fir4136
+fir4136: lw %78, 0(%96) --> fir4100
+fir4100: addi %79, STACK, 0 --> fir499
+fir499 : li %81, 4 --> fir498
+fir498 : mulo %80, %11, %81 --> fir497
+fir497 : add %115, %79, %80 --> fir4155
+fir4155: sw %78, 0(%115) --> fir496
+fir496 : emit c13 --> fir495
+fir495 : li %4, 0 --> fir494
+fir494 : emit c12 --> fir493
+fir493 : emit c11 --> fir492
+fir492 : li %6, 0 --> fir418
+fir418 : j --> fir491
+fir491 : li %75, 0 --> fir490
+fir490 : emit c10 --> fir489
+fir489 : li %77, 16 --> fir488
+fir488 : slt %76, %6, %77 --> fir487
+fir487 : li %114, 0 --> fir4154
+fir4154: seq %74, %76, %114 --> fir486
+fir486 : beq %74, %75 --> fir485, fir417
+fir417 : emit c2 --> fir416
+fir416 : li %20, 1 --> fir415
+fir415 : add %18, %11, %20 --> fir414
+fir414 : li %19, 16 --> fir413
+fir413 : la %100, mod --> fir4140
+fir4140: call %11, %100(%18, %19) --> fir412
+fir412 : emit c1 --> fir411
+fir411 : li %17, 16 --> fir410
+fir410 : srav %14, %4, %17 --> fir49
+fir49 : li %16, 4 --> fir48
+fir48 : mulo %15, %5, %16 --> fir47
+fir47 : add %110, %2, %15 --> fir4150
+fir4150: sw %14, 0(%110) --> fir46
+fir46 : emit c15 --> fir45
+fir45 : li %13, 1 --> fir44
+fir44 : add %5, %5, %13 --> fir43
+fir485 : emit c8 --> fir484
+fir484 : addi %71, STACK, 0 --> fir483
+fir483 : li %73, 4 --> fir482
+fir482 : mulo %72, %11, %73 --> fir481
+fir481 : add %113, %71, %72 --> fir4153
+fir4153: lw %67, 0(%113) --> fir480
+fir480 : li %70, 4 --> fir479
+fir479 : mulo %69, %6, %70 --> fir478
+fir478 : add %112, %1, %69 --> fir4152
+fir4152: lw %68, 0(%112) --> fir477
+fir477 : mulo %10, %67, %68 --> fir476
+fir476 : emit c7 --> fir475
+fir475 : addi %60, STACK, 0 --> fir474
+fir474 : li %66, 1 --> fir473
+fir473 : add %64, %11, %66 --> fir472
+fir472 : li %65, 16 --> fir471
+fir471 : la %111, mod --> fir4151
+fir4151: call %62, %111(%64, %65) --> fir470
+fir470 : li %63, 4 --> fir469
+fir469 : mulo %61, %62, %63 --> fir468
+fir468 : add %109, %60, %61 --> fir4149
+fir4149: lw %54, 0(%109) --> fir467
+fir467 : li %59, 1 --> fir466
+fir466 : add %57, %6, %59 --> fir465
+fir465 : li %58, 4 --> fir464
+fir464 : mulo %56, %57, %58 --> fir463
+fir463 : add %108, %1, %56 --> fir4148
+fir4148: lw %55, 0(%108) --> fir462
+fir462 : mulo %9, %54, %55 --> fir461
+fir461 : emit c6 --> fir460
+fir460 : addi %47, STACK, 0 --> fir459
+fir459 : li %53, 2 --> fir458
+fir458 : add %51, %11, %53 --> fir457
+fir457 : li %52, 16 --> fir456
+fir456 : la %107, mod --> fir4147
+fir4147: call %49, %107(%51, %52) --> fir455
+fir455 : li %50, 4 --> fir454
+fir454 : mulo %48, %49, %50 --> fir453
+fir453 : add %106, %47, %48 --> fir4146
+fir4146: lw %41, 0(%106) --> fir452
+fir452 : li %46, 2 --> fir451
+fir451 : add %44, %6, %46 --> fir450
+fir450 : li %45, 4 --> fir449
+fir449 : mulo %43, %44, %45 --> fir448
+fir448 : add %105, %1, %43 --> fir4145
+fir4145: lw %42, 0(%105) --> fir447
+fir447 : mulo %8, %41, %42 --> fir446
+fir446 : emit c5 --> fir445
+fir445 : addi %34, STACK, 0 --> fir444
+fir444 : li %40, 3 --> fir443
+fir443 : add %38, %11, %40 --> fir442
+fir442 : li %39, 16 --> fir441
+fir441 : la %104, mod --> fir4144
+fir4144: call %36, %104(%38, %39) --> fir440
+fir440 : li %37, 4 --> fir439
+fir439 : mulo %35, %36, %37 --> fir438
+fir438 : add %103, %34, %35 --> fir4143
+fir4143: lw %28, 0(%103) --> fir437
+fir437 : li %33, 3 --> fir436
+fir436 : add %31, %6, %33 --> fir435
+fir435 : li %32, 4 --> fir434
+fir434 : mulo %30, %31, %32 --> fir433
+fir433 : add %102, %1, %30 --> fir4142
+fir4142: lw %29, 0(%102) --> fir432
+fir432 : mulo %7, %28, %29 --> fir431
+fir431 : emit c4 --> fir430
+fir430 : add %27, %4, %10 --> fir429
+fir429 : add %26, %27, %9 --> fir428
+fir428 : add %25, %26, %8 --> fir427
+fir427 : add %4, %25, %7 --> fir426
+fir426 : emit c3 --> fir425
+fir425 : li %24, 4 --> fir424
+fir424 : add %22, %11, %24 --> fir423
+fir423 : li %23, 16 --> fir422
+fir422 : la %101, mod --> fir4141
+fir4141: call %11, %101(%22, %23) --> fir421
+fir421 : emit c9 --> fir420
+fir420 : li %21, 4 --> fir419
+fir419 : add %6, %6, %21 --> fir418
+fir4122: emit c19 --> fir4121
+fir4121: li %88, 0 --> fir4120
+fir4120: addi %89, STACK, 0 --> fir4119
+fir4119: li %91, 4 --> fir4118
+fir4118: mulo %90, %6, %91 --> fir4117
+fir4117: add %98, %89, %90 --> fir4138
+fir4138: sw %88, 0(%98) --> fir4116
+fir4116: emit c20 --> fir4115
+fir4115: li %87, 1 --> fir4114
+fir4114: add %6, %6, %87 --> fir4113
+
+function _main() : %1
+stacksize 64
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78, %79, %80, %81, %82, %83,
+ %84, %85, %86, %87, %88, %89, %90,
+ %91, %92, %93, %94, %95, %96, %97,
+ %98, %99, %100, %101, %102, %103, %104,
+ %105, %106, %107, %108, %109, %110, %111,
+ %112, %113, %114, %115, %116, %117, %118,
+ %119, %120, %121, %122, %123, %124, %125,
+ %126, %127, %128, %129, %130, %131, %132,
+ %133, %134, %135, %136, %137, %138, %139,
+ %140, %141, %142, %143, %144, %145, %146,
+ %147, %148, %149, %150
+entry main375
+main375: li %0, 0 --> main374
+main374: li %2, 0 --> main373
+main373: li %3, 0 --> main372
+main372: li %4, 0 --> main371
+main371: li %5, 0 --> main370
+main370: li %6, 0 --> main369
+main369: li %7, 0 --> main368
+main368: li %8, 0 --> main367
+main367: li %9, 0 --> main366
+main366: li %10, 0 --> main365
+main365: li %11, 0 --> main364
+main364: li %12, 0 --> main363
+main363: li %13, 0 --> main362
+main362: li %14, 0 --> main361
+main361: li %15, 0 --> main360
+main360: li %16, 0 --> main359
+main359: li %17, 0 --> main358
+main358: li %18, 0 --> main357
+main357: li %19, 0 --> main356
+main356: li %20, 0 --> main355
+main355: li %21, 0 --> main354
+main354: li %22, 0 --> main353
+main353: li %23, 0 --> main352
+main352: li %24, 0 --> main351
+main351: li %25, 0 --> main350
+main350: li %26, 0 --> main349
+main349: li %27, 0 --> main348
+main348: li %28, 0 --> main347
+main347: li %29, 0 --> main346
+main346: li %30, 0 --> main345
+main345: li %31, 0 --> main344
+main344: li %32, 0 --> main343
+main343: li %33, 0 --> main342
+main342: li %34, 0 --> main341
+main341: li %35, 0 --> main340
+main340: li %36, 0 --> main339
+main339: li %37, 0 --> main338
+main338: li %38, 0 --> main337
+main337: li %39, 0 --> main336
+main336: li %40, 0 --> main335
+main335: li %41, 0 --> main334
+main334: li %42, 0 --> main333
+main333: li %43, 0 --> main332
+main332: li %44, 0 --> main331
+main331: li %45, 0 --> main330
+main330: li %46, 0 --> main329
+main329: li %47, 0 --> main328
+main328: li %48, 0 --> main327
+main327: li %49, 0 --> main326
+main326: li %50, 0 --> main325
+main325: li %51, 0 --> main324
+main324: li %52, 0 --> main323
+main323: li %53, 0 --> main322
+main322: li %54, 0 --> main321
+main321: li %55, 0 --> main320
+main320: li %56, 0 --> main319
+main319: li %57, 0 --> main318
+main318: li %58, 0 --> main317
+main317: li %59, 0 --> main316
+main316: li %60, 0 --> main315
+main315: li %61, 0 --> main314
+main314: li %62, 0 --> main313
+main313: li %63, 0 --> main312
+main312: li %64, 0 --> main311
+main311: li %65, 0 --> main310
+main310: li %66, 0 --> main309
+main309: li %67, 0 --> main308
+main308: li %68, 0 --> main307
+main307: li %69, 0 --> main306
+main306: li %70, 0 --> main305
+main305: li %71, 0 --> main304
+main304: li %72, 0 --> main303
+main303: li %73, 0 --> main302
+main302: li %74, 0 --> main301
+main301: li %75, 0 --> main300
+main300: li %76, 0 --> main299
+main299: li %77, 0 --> main298
+main298: li %78, 0 --> main297
+main297: li %79, 0 --> main296
+main296: li %80, 0 --> main295
+main295: li %81, 0 --> main294
+main294: li %82, 0 --> main293
+main293: li %83, 0 --> main292
+main292: li %84, 0 --> main291
+main291: li %85, 0 --> main290
+main290: li %86, 0 --> main289
+main289: li %87, 0 --> main288
+main288: li %88, 0 --> main287
+main287: li %89, 0 --> main286
+main286: li %90, 0 --> main285
+main285: li %91, 0 --> main284
+main284: li %92, 0 --> main283
+main283: li %93, 0 --> main282
+main282: li %94, 0 --> main281
+main281: li %95, 0 --> main280
+main280: li %96, 0 --> main279
+main279: li %97, 0 --> main278
+main278: li %98, 0 --> main277
+main277: li %99, 0 --> main276
+main276: li %100, 0 --> main275
+main275: li %101, 0 --> main274
+main274: li %102, 0 --> main273
+main273: li %103, 0 --> main272
+main272: li %104, 0 --> main271
+main271: li %105, 0 --> main270
+main270: li %106, 0 --> main269
+main269: li %107, 0 --> main268
+main268: li %108, 0 --> main267
+main267: li %109, 0 --> main266
+main266: li %110, 0 --> main265
+main265: li %111, 0 --> main264
+main264: li %112, 0 --> main263
+main263: li %113, 0 --> main262
+main262: li %114, 0 --> main261
+main261: li %115, 0 --> main260
+main260: li %116, 0 --> main259
+main259: li %117, 0 --> main258
+main258: li %118, 0 --> main257
+main257: li %119, 0 --> main256
+main256: li %120, 0 --> main255
+main255: li %121, 0 --> main254
+main254: li %122, 0 --> main253
+main253: li %123, 0 --> main252
+main252: li %124, 0 --> main251
+main251: li %125, 0 --> main250
+main250: li %126, 0 --> main249
+main249: li %127, 0 --> main248
+main248: li %128, 0 --> main247
+main247: li %129, 0 --> main246
+main246: li %130, 0 --> main245
+main245: li %131, 0 --> main244
+main244: li %132, 0 --> main243
+main243: li %133, 0 --> main242
+main242: li %134, 0 --> main241
+main241: li %135, 0 --> main240
+main240: li %136, 0 --> main239
+main239: li %137, 0 --> main238
+main238: li %138, 0 --> main237
+main237: li %139, 0 --> main236
+main236: li %140, 0 --> main235
+main235: li %141, 0 --> main234
+main234: li %142, 0 --> main233
+main233: li %143, 0 --> main232
+main232: li %144, 0 --> main231
+main231: li %145, 0 --> main230
+main230: li %146, 0 --> main229
+main229: li %147, 0 --> main228
+main228: li %148, 0 --> main227
+main227: li %149, 0 --> main226
+main226: li %150, 0 --> main152
+main152: li %77, 1129 --> main151
+main151: addi %106, GLOBALS, 0 --> main181
+main181: sw %77, 0(%106) --> main150
+main150: li %76, 60034 --> main149
+main149: addi %104, GLOBALS, 0 --> main179
+main179: sw %76, 4(%104) --> main148
+main148: li %75, 64720 --> main147
+main147: addi %103, GLOBALS, 0 --> main178
+main178: sw %75, 8(%103) --> main146
+main146: li %74, 5595 --> main145
+main145: addi %102, GLOBALS, 0 --> main177
+main177: sw %74, 12(%102) --> main144
+main144: li %73, 494 --> main143
+main143: addi %101, GLOBALS, 0 --> main176
+main176: sw %73, 16(%101) --> main142
+main142: li %72, 59867 --> main141
+main141: addi %100, GLOBALS, 0 --> main175
+main175: sw %72, 20(%100) --> main140
+main140: li %71, 65370 --> main139
+main139: addi %99, GLOBALS, 0 --> main174
+main174: sw %71, 24(%99) --> main138
+main138: li %70, 5724 --> main137
+main137: addi %98, GLOBALS, 0 --> main173
+main173: sw %70, 28(%98) --> main136
+main136: li %69, 5724 --> main135
+main135: addi %97, GLOBALS, 0 --> main172
+main172: sw %69, 32(%97) --> main134
+main134: li %68, 65370 --> main133
+main133: addi %96, GLOBALS, 0 --> main171
+main171: sw %68, 36(%96) --> main132
+main132: li %67, 59867 --> main131
+main131: addi %95, GLOBALS, 0 --> main170
+main170: sw %67, 40(%95) --> main130
+main130: li %66, 494 --> main129
+main129: addi %93, GLOBALS, 0 --> main168
+main168: sw %66, 44(%93) --> main128
+main128: li %65, 5595 --> main127
+main127: addi %92, GLOBALS, 0 --> main167
+main167: sw %65, 48(%92) --> main126
+main126: li %64, 64720 --> main125
+main125: addi %91, GLOBALS, 0 --> main166
+main166: sw %64, 52(%91) --> main124
+main124: li %63, 60034 --> main123
+main123: addi %90, GLOBALS, 0 --> main165
+main165: sw %63, 56(%90) --> main122
+main122: li %62, 1129 --> main121
+main121: addi %89, GLOBALS, 0 --> main164
+main164: sw %62, 60(%89) --> main120
+main120: li %61, 1 --> main119
+main119: addi %88, GLOBALS, 0 --> main163
+main163: sw %61, 64(%88) --> main118
+main118: li %60, 0 --> main117
+main117: addi %87, GLOBALS, 0 --> main162
+main162: sw %60, 68(%87) --> main116
+main116: li %59, 16384 --> main115
+main115: addi %86, GLOBALS, 0 --> main161
+main161: sw %59, 72(%86) --> main114
+main114: li %58, 0 --> main113
+main113: addi %85, GLOBALS, 0 --> main160
+main160: sw %58, 76(%85) --> main112
+main112: li %57, 0 --> main111
+main111: addi %84, GLOBALS, 0 --> main159
+main159: sw %57, 80(%84) --> main110
+main110: li %56, 0 --> main109
+main109: addi %82, GLOBALS, 0 --> main157
+main157: sw %56, 84(%82) --> main108
+main108: li %55, 0 --> main107
+main107: addi %81, GLOBALS, 0 --> main156
+main156: sw %55, 88(%81) --> main106
+main106: li %54, 0 --> main105
+main105: addi %80, GLOBALS, 0 --> main155
+main155: sw %54, 92(%80) --> main104
+main104: li %53, 0 --> main103
+main103: addi %79, GLOBALS, 0 --> main154
+main154: sw %53, 96(%79) --> main102
+main102: li %52, 0 --> main101
+main101: addi %78, GLOBALS, 0 --> main153
+main153: sw %52, 100(%78) --> main100
+main100: li %51, 0 --> main99
+main99 : addi %150, GLOBALS, 0 --> main225
+main225: sw %51, 104(%150) --> main98
+main98 : li %50, 0 --> main97
+main97 : addi %149, GLOBALS, 0 --> main224
+main224: sw %50, 108(%149) --> main96
+main96 : li %49, 0 --> main95
+main95 : addi %148, GLOBALS, 0 --> main223
+main223: sw %49, 112(%148) --> main94
+main94 : li %48, 0 --> main93
+main93 : addi %147, GLOBALS, 0 --> main222
+main222: sw %48, 116(%147) --> main92
+main92 : li %47, 0 --> main91
+main91 : addi %146, GLOBALS, 0 --> main221
+main221: sw %47, 120(%146) --> main90
+main90 : li %46, 0 --> main89
+main89 : addi %144, GLOBALS, 0 --> main219
+main219: sw %46, 124(%144) --> main88
+main88 : li %45, 0 --> main87
+main87 : addi %143, GLOBALS, 0 --> main218
+main218: sw %45, 128(%143) --> main86
+main86 : li %44, 0 --> main85
+main85 : addi %142, GLOBALS, 0 --> main217
+main217: sw %44, 132(%142) --> main84
+main84 : li %43, 0 --> main83
+main83 : addi %141, GLOBALS, 0 --> main216
+main216: sw %43, 136(%141) --> main82
+main82 : li %42, 0 --> main81
+main81 : addi %140, GLOBALS, 0 --> main215
+main215: sw %42, 140(%140) --> main80
+main80 : li %41, 0 --> main79
+main79 : addi %139, GLOBALS, 0 --> main214
+main214: sw %41, 144(%139) --> main78
+main78 : li %40, 0 --> main77
+main77 : addi %138, GLOBALS, 0 --> main213
+main213: sw %40, 148(%138) --> main76
+main76 : li %39, 0 --> main75
+main75 : addi %137, GLOBALS, 0 --> main212
+main212: sw %39, 152(%137) --> main74
+main74 : li %38, 0 --> main73
+main73 : addi %136, GLOBALS, 0 --> main211
+main211: sw %38, 156(%136) --> main72
+main72 : li %37, 0 --> main71
+main71 : addi %135, GLOBALS, 0 --> main210
+main210: sw %37, 160(%135) --> main70
+main70 : li %36, 7986 --> main69
+main69 : addi %134, GLOBALS, 0 --> main209
+main209: sw %36, 164(%134) --> main68
+main68 : li %35, 8993 --> main67
+main67 : addi %133, GLOBALS, 0 --> main208
+main208: sw %35, 168(%133) --> main66
+main66 : li %34, 1808 --> main65
+main65 : addi %132, GLOBALS, 0 --> main207
+main207: sw %34, 172(%132) --> main64
+main64 : li %33, 4096 --> main63
+main63 : addi %131, GLOBALS, 0 --> main206
+main206: sw %33, 176(%131) --> main62
+main62 : li %32, 4096 --> main61
+main61 : addi %130, GLOBALS, 0 --> main205
+main205: sw %32, 180(%130) --> main60
+main60 : li %31, 4096 --> main59
+main59 : addi %129, GLOBALS, 0 --> main204
+main204: sw %31, 184(%129) --> main58
+main58 : li %30, 4096 --> main57
+main57 : addi %128, GLOBALS, 0 --> main203
+main203: sw %30, 188(%128) --> main56
+main56 : li %29, 4096 --> main55
+main55 : addi %127, GLOBALS, 0 --> main202
+main202: sw %29, 192(%127) --> main54
+main54 : li %28, 4096 --> main53
+main53 : addi %126, GLOBALS, 0 --> main201
+main201: sw %28, 196(%126) --> main52
+main52 : li %27, 4096 --> main51
+main51 : addi %125, GLOBALS, 0 --> main200
+main200: sw %27, 200(%125) --> main50
+main50 : li %26, 4096 --> main49
+main49 : addi %124, GLOBALS, 0 --> main199
+main199: sw %26, 204(%124) --> main48
+main48 : li %25, 4096 --> main47
+main47 : addi %123, GLOBALS, 0 --> main198
+main198: sw %25, 208(%123) --> main46
+main46 : li %24, 4096 --> main45
+main45 : addi %122, GLOBALS, 0 --> main197
+main197: sw %24, 212(%122) --> main44
+main44 : li %23, 4096 --> main43
+main43 : addi %121, GLOBALS, 0 --> main196
+main196: sw %23, 216(%121) --> main42
+main42 : li %22, 4096 --> main41
+main41 : addi %120, GLOBALS, 0 --> main195
+main195: sw %22, 220(%120) --> main40
+main40 : li %21, 4096 --> main39
+main39 : addi %119, GLOBALS, 0 --> main194
+main194: sw %21, 224(%119) --> main38
+main38 : li %20, 4096 --> main37
+main37 : addi %118, GLOBALS, 0 --> main193
+main193: sw %20, 228(%118) --> main36
+main36 : li %19, 4096 --> main35
+main35 : addi %117, GLOBALS, 0 --> main192
+main192: sw %19, 232(%117) --> main34
+main34 : li %18, 4096 --> main33
+main33 : addi %116, GLOBALS, 0 --> main191
+main191: sw %18, 236(%116) --> main32
+main32 : li %17, 4096 --> main31
+main31 : addi %115, GLOBALS, 0 --> main190
+main190: sw %17, 240(%115) --> main30
+main30 : li %16, 4096 --> main29
+main29 : addi %113, GLOBALS, 0 --> main188
+main188: sw %16, 244(%113) --> main28
+main28 : li %15, 4096 --> main27
+main27 : addi %112, GLOBALS, 0 --> main187
+main187: sw %15, 248(%112) --> main26
+main26 : li %14, 4096 --> main25
+main25 : addi %111, GLOBALS, 0 --> main186
+main186: sw %14, 252(%111) --> main24
+main24 : li %13, 4096 --> main23
+main23 : addi %110, GLOBALS, 0 --> main185
+main185: sw %13, 256(%110) --> main22
+main22 : li %12, 4096 --> main21
+main21 : addi %109, GLOBALS, 0 --> main184
+main184: sw %12, 260(%109) --> main20
+main20 : li %11, 4096 --> main19
+main19 : addi %108, GLOBALS, 0 --> main183
+main183: sw %11, 264(%108) --> main18
+main18 : li %10, 4096 --> main17
+main17 : addi %107, GLOBALS, 0 --> main182
+main182: sw %10, 268(%107) --> main16
+main16 : li %9, 4096 --> main15
+main15 : addi %105, GLOBALS, 0 --> main180
+main180: sw %9, 272(%105) --> main14
+main14 : li %8, 4096 --> main13
+main13 : addi %94, GLOBALS, 0 --> main169
+main169: sw %8, 276(%94) --> main12
+main12 : li %7, 4096 --> main11
+main11 : addi %83, GLOBALS, 0 --> main158
+main158: sw %7, 280(%83) --> main10
+main10 : li %6, 4096 --> main9
+main9 : addi %145, GLOBALS, 0 --> main220
+main220: sw %6, 284(%145) --> main8
+main8 : emit c27 --> main7
+main7 : addi %2, GLOBALS, 64 --> main6
+main6 : addi %3, GLOBALS, 0 --> main5
+main5 : addi %4, STACK, 0 --> main4
+main4 : li %5, 16 --> main3
+main3 : la %114, fir4 --> main189
+main189: call %0, %114(%2, %3, %4, %5) --> main2
+main2 : emit c26 --> main1
+main1 : move %1, %0 --> main0
+main0 : return %1
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program: (main function is "main")
+
+
+ globals:
+ "fir4_c" = {1129, 60034, 64720, 5595, 494, 59867, 65370, 5724, 5724, 65370, 59867, 494, 5595, 64720, 60034, 1129}
+ "fir4_in" = {1, 0, 16384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7986, 8993, 1808, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096}
+
+
+ "__builtin___memcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memmove_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___mempcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memset_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___stpcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strcat_chk": int -> int -> int -> int
+
+
+ "__builtin___strcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strncat_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___strncpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vfprintf_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vprintf_chk": int -> int -> int -> int
+
+
+ "__builtin___vsnprintf_chk": int -> int -> int -> int -> int -> int -> int
+
+
+ "__builtin___vsprintf_chk": int -> int -> int -> int -> int -> int
+
+
+ "__builtin_acos": float -> float
+
+
+ "__builtin_acosf": float -> float
+
+
+ "__builtin_acosl": float -> float
+
+
+ "__builtin_alloca": int -> int
+
+
+ "__builtin_asin": float -> float
+
+
+ "__builtin_asinf": float -> float
+
+
+ "__builtin_asinl": float -> float
+
+
+ "__builtin_atan": float -> float
+
+
+ "__builtin_atanf": float -> float
+
+
+ "__builtin_atanl": float -> float
+
+
+ "__builtin_atan2": float -> float -> float
+
+
+ "__builtin_atan2f": float -> float -> float
+
+
+ "__builtin_atan2l": float -> float -> float
+
+
+ "__builtin_ceil": float -> float
+
+
+ "__builtin_ceilf": float -> float
+
+
+ "__builtin_ceill": float -> float
+
+
+ "__builtin_cos": float -> float
+
+
+ "__builtin_cosf": float -> float
+
+
+ "__builtin_cosl": float -> float
+
+
+ "__builtin_cosh": float -> float
+
+
+ "__builtin_coshf": float -> float
+
+
+ "__builtin_coshl": float -> float
+
+
+ "__builtin_clz": int -> int
+
+
+ "__builtin_clzl": int -> int
+
+
+ "__builtin_clzll": int -> int
+
+
+ "__builtin_constant_p": int -> int
+
+
+ "__builtin_ctz": int -> int
+
+
+ "__builtin_ctzl": int -> int
+
+
+ "__builtin_ctzll": int -> int
+
+
+ "__builtin_exp": float -> float
+
+
+ "__builtin_expf": float -> float
+
+
+ "__builtin_expl": float -> float
+
+
+ "__builtin_expect": int -> int -> int
+
+
+ "__builtin_fabs": float -> float
+
+
+ "__builtin_fabsf": float -> float
+
+
+ "__builtin_fabsl": float -> float
+
+
+ "__builtin_ffs": int -> int
+
+
+ "__builtin_ffsl": int -> int
+
+
+ "__builtin_ffsll": int -> int
+
+
+ "__builtin_frame_address": int -> int
+
+
+ "__builtin_floor": float -> float
+
+
+ "__builtin_floorf": float -> float
+
+
+ "__builtin_floorl": float -> float
+
+
+ "__builtin_huge_val": float
+
+
+ "__builtin_huge_valf": float
+
+
+ "__builtin_huge_vall": float
+
+
+ "__builtin_inf": float
+
+
+ "__builtin_inff": float
+
+
+ "__builtin_infl": float
+
+
+ "__builtin_memcpy": int -> int -> int -> int
+
+
+ "__builtin_mempcpy": int -> int -> int -> int
+
+
+ "__builtin_fmod": float -> float
+
+
+ "__builtin_fmodf": float -> float
+
+
+ "__builtin_fmodl": float -> float
+
+
+ "__builtin_frexp": float -> int -> float
+
+
+ "__builtin_frexpf": float -> int -> float
+
+
+ "__builtin_frexpl": float -> int -> float
+
+
+ "__builtin_ldexp": float -> int -> float
+
+
+ "__builtin_ldexpf": float -> int -> float
+
+
+ "__builtin_ldexpl": float -> int -> float
+
+
+ "__builtin_log": float -> float
+
+
+ "__builtin_logf": float -> float
+
+
+ "__builtin_logl": float -> float
+
+
+ "__builtin_log10": float -> float
+
+
+ "__builtin_log10f": float -> float
+
+
+ "__builtin_log10l": float -> float
+
+
+ "__builtin_modff": float -> int -> float
+
+
+ "__builtin_modfl": float -> int -> float
+
+
+ "__builtin_nan": int -> float
+
+
+ "__builtin_nanf": int -> float
+
+
+ "__builtin_nanl": int -> float
+
+
+ "__builtin_nans": int -> float
+
+
+ "__builtin_nansf": int -> float
+
+
+ "__builtin_nansl": int -> float
+
+
+ "__builtin_next_arg": int
+
+
+ "__builtin_object_size": int -> int -> int
+
+
+ "__builtin_parity": int -> int
+
+
+ "__builtin_parityl": int -> int
+
+
+ "__builtin_parityll": int -> int
+
+
+ "__builtin_popcount": int -> int
+
+
+ "__builtin_popcountl": int -> int
+
+
+ "__builtin_popcountll": int -> int
+
+
+ "__builtin_powi": float -> int -> float
+
+
+ "__builtin_powif": float -> int -> float
+
+
+ "__builtin_powil": float -> int -> float
+
+
+ "__builtin_return": int -> void
+
+
+ "__builtin_return_address": int -> int
+
+
+ "__builtin_sin": float -> float
+
+
+ "__builtin_sinf": float -> float
+
+
+ "__builtin_sinl": float -> float
+
+
+ "__builtin_sinh": float -> float
+
+
+ "__builtin_sinhf": float -> float
+
+
+ "__builtin_sinhl": float -> float
+
+
+ "__builtin_sqrt": float -> float
+
+
+ "__builtin_sqrtf": float -> float
+
+
+ "__builtin_sqrtl": float -> float
+
+
+ "__builtin_stpcpy": int -> int -> int
+
+
+ "__builtin_strchr": int -> int -> int
+
+
+ "__builtin_strcmp": int -> int -> int
+
+
+ "__builtin_strcpy": int -> int -> int
+
+
+ "__builtin_strcspn": int -> int -> int
+
+
+ "__builtin_strncat": int -> int -> int -> int
+
+
+ "__builtin_strncmp": int -> int -> int -> int
+
+
+ "__builtin_strncpy": int -> int -> int -> int
+
+
+ "__builtin_strspn": int -> int -> int
+
+
+ "__builtin_strpbrk": int -> int -> int
+
+
+ "__builtin_types_compatible_p": int -> int -> int
+
+
+ "__builtin_tan": float -> float
+
+
+ "__builtin_tanf": float -> float
+
+
+ "__builtin_tanl": float -> float
+
+
+ "__builtin_tanh": float -> float
+
+
+ "__builtin_tanhf": float -> float
+
+
+ "__builtin_tanhl": float -> float
+
+
+ "__builtin_va_end": int -> void
+
+
+ "__builtin_varargs_start": int -> void
+
+
+ "__builtin_va_start": int -> int -> void
+
+
+ "__builtin_stdarg_start": int -> void
+
+
+ "__builtin_va_arg": int -> int -> void
+
+
+ "__builtin_va_copy": int -> int -> void
+
+
+ "fir4"(%0, %1, %2, %3): int -> int -> int -> int -> int
+ locals: %12, %4, %5, %6, %7, %8, %9, %10, %11, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31, %32, %33, %34, %35, %36, %37, %38, %39, %40, %41, %42, %43, %44, %45, %46, %47, %48, %49, %50, %51, %52, %53, %54, %55, %56, %57, %58, %59, %60, %61, %62, %63, %64, %65, %66, %67, %68, %69, %70, %71, %72, %73, %74, %75, %76, %77, %78, %79, %80, %81, %82, %83, %84, %85, %86, %87, %88, %89, %90, %91, %92, %93, %94, %95
+ result: %12
+ stacksize: 64
+ entry: fir4135
+ exit: fir40
+
+ fir499: imm_int 4, %81, --> fir498
+ fir498: mul %80, %11, %81 --> fir497
+ fir497: store int32, add, %79, %80, %78 --> fir496
+ fir496: emit c13 --> fir495
+ fir495: imm_int 0, %4, --> fir494
+ fir494: emit c12 --> fir493
+ fir493: emit c11 --> fir492
+ fir492: imm_int 0, %6, --> fir418
+ fir491: imm_int 0, %75, --> fir490
+ fir490: emit c10 --> fir489
+ fir49: imm_int 4, %16, --> fir48
+ fir489: imm_int 16, %77, --> fir488
+ fir488: lt %76, %6, %77 --> fir487
+ fir487: notbool %74, %76 --> fir486
+ fir486: eq %74, %75 --> fir485, fir417
+ fir485: emit c8 --> fir484
+ fir484: imm_addr 0($sp), %71, --> fir483
+ fir483: imm_int 4, %73, --> fir482
+ fir482: mul %72, %11, %73 --> fir481
+ fir481: load int32, add, %71, %72, %67 --> fir480
+ fir480: imm_int 4, %70, --> fir479
+ fir48: mul %15, %5, %16 --> fir47
+ fir479: mul %69, %6, %70 --> fir478
+ fir478: load int32, add, %1, %69, %68 --> fir477
+ fir477: mul %10, %67, %68 --> fir476
+ fir476: emit c7 --> fir475
+ fir475: imm_addr 0($sp), %60, --> fir474
+ fir474: imm_int 1, %66, --> fir473
+ fir473: add %64, %11, %66 --> fir472
+ fir472: imm_int 16, %65, --> fir471
+ fir471: mod %62, %64, %65 --> fir470
+ fir470: imm_int 4, %63, --> fir469
+ fir47: store int32, add, %2, %15, %14 --> fir46
+ fir469: mul %61, %62, %63 --> fir468
+ fir468: load int32, add, %60, %61, %54 --> fir467
+ fir467: imm_int 1, %59, --> fir466
+ fir466: add %57, %6, %59 --> fir465
+ fir465: imm_int 4, %58, --> fir464
+ fir464: mul %56, %57, %58 --> fir463
+ fir463: load int32, add, %1, %56, %55 --> fir462
+ fir462: mul %9, %54, %55 --> fir461
+ fir461: emit c6 --> fir460
+ fir460: imm_addr 0($sp), %47, --> fir459
+ fir46: emit c15 --> fir45
+ fir459: imm_int 2, %53, --> fir458
+ fir458: add %51, %11, %53 --> fir457
+ fir457: imm_int 16, %52, --> fir456
+ fir456: mod %49, %51, %52 --> fir455
+ fir455: imm_int 4, %50, --> fir454
+ fir454: mul %48, %49, %50 --> fir453
+ fir453: load int32, add, %47, %48, %41 --> fir452
+ fir452: imm_int 2, %46, --> fir451
+ fir451: add %44, %6, %46 --> fir450
+ fir450: imm_int 4, %45, --> fir449
+ fir45: imm_int 1, %13, --> fir44
+ fir449: mul %43, %44, %45 --> fir448
+ fir448: load int32, add, %1, %43, %42 --> fir447
+ fir447: mul %8, %41, %42 --> fir446
+ fir446: emit c5 --> fir445
+ fir445: imm_addr 0($sp), %34, --> fir444
+ fir444: imm_int 3, %40, --> fir443
+ fir443: add %38, %11, %40 --> fir442
+ fir442: imm_int 16, %39, --> fir441
+ fir441: mod %36, %38, %39 --> fir440
+ fir440: imm_int 4, %37, --> fir439
+ fir44: add %5, %5, %13 --> fir43
+ fir439: mul %35, %36, %37 --> fir438
+ fir438: load int32, add, %34, %35, %28 --> fir437
+ fir437: imm_int 3, %33, --> fir436
+ fir436: add %31, %6, %33 --> fir435
+ fir435: imm_int 4, %32, --> fir434
+ fir434: mul %30, %31, %32 --> fir433
+ fir433: load int32, add, %1, %30, %29 --> fir432
+ fir432: mul %7, %28, %29 --> fir431
+ fir431: emit c4 --> fir430
+ fir430: add %27, %4, %10 --> fir429
+ fir43: --> fir4109
+ fir429: add %26, %27, %9 --> fir428
+ fir428: add %25, %26, %8 --> fir427
+ fir427: add %4, %25, %7 --> fir426
+ fir426: emit c3 --> fir425
+ fir425: imm_int 4, %24, --> fir424
+ fir424: add %22, %11, %24 --> fir423
+ fir423: imm_int 16, %23, --> fir422
+ fir422: mod %11, %22, %23 --> fir421
+ fir421: emit c9 --> fir420
+ fir420: imm_int 4, %21, --> fir419
+ fir42: emit c0 --> fir41
+ fir419: add %6, %6, %21 --> fir418
+ fir418: --> fir491
+ fir417: emit c2 --> fir416
+ fir416: imm_int 1, %20, --> fir415
+ fir415: add %18, %11, %20 --> fir414
+ fir414: imm_int 16, %19, --> fir413
+ fir4135: emit c25 --> fir4134
+ fir4134: imm_int 0, %11, --> fir4133
+ fir4133: emit c24 --> fir4132
+ fir4132: imm_int 0, %4, --> fir4131
+ fir4131: emit c23 --> fir4130
+ fir4130: emit c22 --> fir4129
+ fir413: mod %11, %18, %19 --> fir412
+ fir4129: imm_int 0, %6, --> fir4113
+ fir4128: imm_int 0, %93, --> fir4127
+ fir4127: emit c21 --> fir4126
+ fir4126: imm_int 16, %95, --> fir4125
+ fir4125: lt %94, %6, %95 --> fir4124
+ fir4124: notbool %92, %94 --> fir4123
+ fir4123: eq %92, %93 --> fir4122, fir4112
+ fir4122: emit c19 --> fir4121
+ fir4121: imm_int 0, %88, --> fir4120
+ fir4120: imm_addr 0($sp), %89, --> fir4119
+ fir412: emit c1 --> fir411
+ fir4119: imm_int 4, %91, --> fir4118
+ fir4118: mul %90, %6, %91 --> fir4117
+ fir4117: store int32, add, %89, %90, %88 --> fir4116
+ fir4116: emit c20 --> fir4115
+ fir4115: imm_int 1, %87, --> fir4114
+ fir4114: add %6, %6, %87 --> fir4113
+ fir4113: --> fir4128
+ fir4112: emit c18 --> fir4111
+ fir4111: emit c17 --> fir4110
+ fir4110: imm_int 0, %5, --> fir43
+ fir411: imm_int 16, %17, --> fir410
+ fir4109: imm_int 0, %85, --> fir4108
+ fir4108: emit c16 --> fir4107
+ fir4107: lt %86, %5, %3 --> fir4106
+ fir4106: notbool %84, %86 --> fir4105
+ fir4105: eq %84, %85 --> fir4104, fir42
+ fir4104: emit c14 --> fir4103
+ fir4103: imm_int 4, %83, --> fir4102
+ fir4102: mul %82, %5, %83 --> fir4101
+ fir4101: load int32, add, %0, %82, %78 --> fir4100
+ fir4100: imm_addr 0($sp), %79, --> fir499
+ fir410: shr %14, %4, %17 --> fir49
+ fir41: imm_int 0, %12, --> fir40
+ fir40: return %12
+
+
+ "main"(): int
+ locals: %1, %0, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31, %32, %33, %34, %35, %36, %37, %38, %39, %40, %41, %42, %43, %44, %45, %46, %47, %48, %49, %50, %51, %52, %53, %54, %55, %56, %57, %58, %59, %60, %61, %62, %63, %64, %65, %66, %67, %68, %69, %70, %71, %72, %73, %74, %75, %76, %77
+ result: %1
+ stacksize: 64
+ entry: main152
+ exit: main0
+
+ main99: store int32, 40("fir4_in"), , %51 --> main98
+ main98: imm_int 0, %50, --> main97
+ main97: store int32, 44("fir4_in"), , %50 --> main96
+ main96: imm_int 0, %49, --> main95
+ main95: store int32, 48("fir4_in"), , %49 --> main94
+ main94: imm_int 0, %48, --> main93
+ main93: store int32, 52("fir4_in"), , %48 --> main92
+ main92: imm_int 0, %47, --> main91
+ main91: store int32, 56("fir4_in"), , %47 --> main90
+ main90: imm_int 0, %46, --> main89
+ main9: store int32, 220("fir4_in"), , %6 --> main8
+ main89: store int32, 60("fir4_in"), , %46 --> main88
+ main88: imm_int 0, %45, --> main87
+ main87: store int32, 64("fir4_in"), , %45 --> main86
+ main86: imm_int 0, %44, --> main85
+ main85: store int32, 68("fir4_in"), , %44 --> main84
+ main84: imm_int 0, %43, --> main83
+ main83: store int32, 72("fir4_in"), , %43 --> main82
+ main82: imm_int 0, %42, --> main81
+ main81: store int32, 76("fir4_in"), , %42 --> main80
+ main80: imm_int 0, %41, --> main79
+ main8: emit c27 --> main7
+ main79: store int32, 80("fir4_in"), , %41 --> main78
+ main78: imm_int 0, %40, --> main77
+ main77: store int32, 84("fir4_in"), , %40 --> main76
+ main76: imm_int 0, %39, --> main75
+ main75: store int32, 88("fir4_in"), , %39 --> main74
+ main74: imm_int 0, %38, --> main73
+ main73: store int32, 92("fir4_in"), , %38 --> main72
+ main72: imm_int 0, %37, --> main71
+ main71: store int32, 96("fir4_in"), , %37 --> main70
+ main70: imm_int 7986, %36, --> main69
+ main7: imm_addr "fir4_in", %2, --> main6
+ main69: store int32, 100("fir4_in"), , %36 --> main68
+ main68: imm_int 8993, %35, --> main67
+ main67: store int32, 104("fir4_in"), , %35 --> main66
+ main66: imm_int 1808, %34, --> main65
+ main65: store int32, 108("fir4_in"), , %34 --> main64
+ main64: imm_int 4096, %33, --> main63
+ main63: store int32, 112("fir4_in"), , %33 --> main62
+ main62: imm_int 4096, %32, --> main61
+ main61: store int32, 116("fir4_in"), , %32 --> main60
+ main60: imm_int 4096, %31, --> main59
+ main6: imm_addr "fir4_c", %3, --> main5
+ main59: store int32, 120("fir4_in"), , %31 --> main58
+ main58: imm_int 4096, %30, --> main57
+ main57: store int32, 124("fir4_in"), , %30 --> main56
+ main56: imm_int 4096, %29, --> main55
+ main55: store int32, 128("fir4_in"), , %29 --> main54
+ main54: imm_int 4096, %28, --> main53
+ main53: store int32, 132("fir4_in"), , %28 --> main52
+ main52: imm_int 4096, %27, --> main51
+ main51: store int32, 136("fir4_in"), , %27 --> main50
+ main50: imm_int 4096, %26, --> main49
+ main5: imm_addr 0($sp), %4, --> main4
+ main49: store int32, 140("fir4_in"), , %26 --> main48
+ main48: imm_int 4096, %25, --> main47
+ main47: store int32, 144("fir4_in"), , %25 --> main46
+ main46: imm_int 4096, %24, --> main45
+ main45: store int32, 148("fir4_in"), , %24 --> main44
+ main44: imm_int 4096, %23, --> main43
+ main43: store int32, 152("fir4_in"), , %23 --> main42
+ main42: imm_int 4096, %22, --> main41
+ main41: store int32, 156("fir4_in"), , %22 --> main40
+ main40: imm_int 4096, %21, --> main39
+ main4: imm_int 16, %5, --> main3
+ main39: store int32, 160("fir4_in"), , %21 --> main38
+ main38: imm_int 4096, %20, --> main37
+ main37: store int32, 164("fir4_in"), , %20 --> main36
+ main36: imm_int 4096, %19, --> main35
+ main35: store int32, 168("fir4_in"), , %19 --> main34
+ main34: imm_int 4096, %18, --> main33
+ main33: store int32, 172("fir4_in"), , %18 --> main32
+ main32: imm_int 4096, %17, --> main31
+ main31: store int32, 176("fir4_in"), , %17 --> main30
+ main30: imm_int 4096, %16, --> main29
+ main3: call "fir4", %2, %3, %4, %5, %0: int -> int -> int -> int -> int --> main2
+ main29: store int32, 180("fir4_in"), , %16 --> main28
+ main28: imm_int 4096, %15, --> main27
+ main27: store int32, 184("fir4_in"), , %15 --> main26
+ main26: imm_int 4096, %14, --> main25
+ main25: store int32, 188("fir4_in"), , %14 --> main24
+ main24: imm_int 4096, %13, --> main23
+ main23: store int32, 192("fir4_in"), , %13 --> main22
+ main22: imm_int 4096, %12, --> main21
+ main21: store int32, 196("fir4_in"), , %12 --> main20
+ main20: imm_int 4096, %11, --> main19
+ main2: emit c26 --> main1
+ main19: store int32, 200("fir4_in"), , %11 --> main18
+ main18: imm_int 4096, %10, --> main17
+ main17: store int32, 204("fir4_in"), , %10 --> main16
+ main16: imm_int 4096, %9, --> main15
+ main152: imm_int 1129, %77, --> main151
+ main151: store int32, 0("fir4_c"), , %77 --> main150
+ main150: imm_int 60034, %76, --> main149
+ main15: store int32, 208("fir4_in"), , %9 --> main14
+ main149: store int32, 4("fir4_c"), , %76 --> main148
+ main148: imm_int 64720, %75, --> main147
+ main147: store int32, 8("fir4_c"), , %75 --> main146
+ main146: imm_int 5595, %74, --> main145
+ main145: store int32, 12("fir4_c"), , %74 --> main144
+ main144: imm_int 494, %73, --> main143
+ main143: store int32, 16("fir4_c"), , %73 --> main142
+ main142: imm_int 59867, %72, --> main141
+ main141: store int32, 20("fir4_c"), , %72 --> main140
+ main140: imm_int 65370, %71, --> main139
+ main14: imm_int 4096, %8, --> main13
+ main139: store int32, 24("fir4_c"), , %71 --> main138
+ main138: imm_int 5724, %70, --> main137
+ main137: store int32, 28("fir4_c"), , %70 --> main136
+ main136: imm_int 5724, %69, --> main135
+ main135: store int32, 32("fir4_c"), , %69 --> main134
+ main134: imm_int 65370, %68, --> main133
+ main133: store int32, 36("fir4_c"), , %68 --> main132
+ main132: imm_int 59867, %67, --> main131
+ main131: store int32, 40("fir4_c"), , %67 --> main130
+ main130: imm_int 494, %66, --> main129
+ main13: store int32, 212("fir4_in"), , %8 --> main12
+ main129: store int32, 44("fir4_c"), , %66 --> main128
+ main128: imm_int 5595, %65, --> main127
+ main127: store int32, 48("fir4_c"), , %65 --> main126
+ main126: imm_int 64720, %64, --> main125
+ main125: store int32, 52("fir4_c"), , %64 --> main124
+ main124: imm_int 60034, %63, --> main123
+ main123: store int32, 56("fir4_c"), , %63 --> main122
+ main122: imm_int 1129, %62, --> main121
+ main121: store int32, 60("fir4_c"), , %62 --> main120
+ main120: imm_int 1, %61, --> main119
+ main12: imm_int 4096, %7, --> main11
+ main119: store int32, 0("fir4_in"), , %61 --> main118
+ main118: imm_int 0, %60, --> main117
+ main117: store int32, 4("fir4_in"), , %60 --> main116
+ main116: imm_int 16384, %59, --> main115
+ main115: store int32, 8("fir4_in"), , %59 --> main114
+ main114: imm_int 0, %58, --> main113
+ main113: store int32, 12("fir4_in"), , %58 --> main112
+ main112: imm_int 0, %57, --> main111
+ main111: store int32, 16("fir4_in"), , %57 --> main110
+ main110: imm_int 0, %56, --> main109
+ main11: store int32, 216("fir4_in"), , %7 --> main10
+ main109: store int32, 20("fir4_in"), , %56 --> main108
+ main108: imm_int 0, %55, --> main107
+ main107: store int32, 24("fir4_in"), , %55 --> main106
+ main106: imm_int 0, %54, --> main105
+ main105: store int32, 28("fir4_in"), , %54 --> main104
+ main104: imm_int 0, %53, --> main103
+ main103: store int32, 32("fir4_in"), , %53 --> main102
+ main102: imm_int 0, %52, --> main101
+ main101: store int32, 36("fir4_in"), , %52 --> main100
+ main100: imm_int 0, %51, --> main99
+ main10: imm_int 4096, %6, --> main9
+ main1: mov %1, %0 --> main0
+ main0: return %1
+
+
--- /dev/null
+int fir4_c[] = {1129,60034,64720,5595,494,59867,65370,5724,5724,65370,59867,494,5595,64720,60034,1129};\r
+int fir4_in[] = {1, 0, 16384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7986, 8993, 1808, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096};\r
+\r
+int fir4(int fir4_in[], int fir4_c[], int fir4_out[], int size) {\r
+ int i,j, tmp1, tmp2, tmp3, tmp4;\r
+ int x[16];\r
+ int adx = 0;\r
+ int res = 0;\r
+ \r
+ for(i = 0; i < 16; i = i+1){\r
+ x[i] = 0;\r
+ }\r
+ \r
+ for (j = 0; j < size; j = j+1) {\r
+ x[adx] = fir4_in[j];\r
+ res = 0;\r
+ \r
+ for(i = 0; i < 16; i = i+4){\r
+ tmp1 = (x[adx]*fir4_c[i]);\r
+ tmp2 = (x[(adx+1)%16]*fir4_c[i+1]);\r
+ tmp3 = (x[(adx+2)%16]*fir4_c[i+2]);\r
+ tmp4 = (x[(adx+3)%16]*fir4_c[i+3]);\r
+ res = res + tmp1 + tmp2 + tmp3 + tmp4;\r
+ adx = (adx+4)%16;\r
+ }\r
+ adx=(adx+1)%16;\r
+ fir4_out[j] = res >> 16;\r
+ }\r
+ return 0;\r
+}\r
+\r
+int main(){\r
+ int fir4_out[16];\r
+ return fir4(fir4_in,fir4_c,fir4_out,16);\r
+}\r
--- /dev/null
+int fir4_c[] = {1129,60034,64720,5595,494,59867,65370,5724,5724,65370,59867,494,5595,64720,60034,1129};\r
+int fir4_in[] = {0, 0, 16384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7986, 8993, 1808, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096};\r
+\r
+int fir4(int fir4_in[], int fir4_c[], int fir4_out[], int size) {\r
+ int i,j, tmp1, tmp2, tmp3, tmp4;\r
+ int x[16];\r
+ int adx = 0;\r
+ int res = 0;\r
+ \r
+ for(i = 0; i < 16; i = i+1){\r
+ x[i] = 0;\r
+ }\r
+ \r
+ for (j = 0; j < size; j = j+1) {\r
+ x[adx] = fir4_in[j];\r
+ res = 0;\r
+ \r
+ for(i = 0; i < 16; i = i+4){\r
+ tmp1 = (x[adx]*fir4_c[i]);\r
+ tmp2 = (x[(adx+1)%16]*fir4_c[i+1]);\r
+ tmp3 = (x[(adx+2)%16]*fir4_c[i+2]);\r
+ tmp4 = (x[(adx+3)%16]*fir4_c[i+3]);\r
+ res = res + tmp1 + tmp2 + tmp3 + tmp4;\r
+ adx = (adx+4)%16;\r
+ }\r
+ adx=(adx+1)%16;\r
+ fir4_out[j] = res >> 16;\r
+ }\r
+ return 0;\r
+}\r
+\r
+int main(){\r
+ int fir4_out[16];\r
+ return fir4(fir4_in,fir4_c,fir4_out,16);\r
+}\r
--- /dev/null
+Fatal error: exception Assert_failure("src/RTLabs/RTLabsToRTL.ml", 23, 9)
--- /dev/null
+# extern __builtin_varargs_start: int -> void
+# extern __builtin_va_start: int -> int -> void
+# extern __builtin_va_end: int -> void
+# extern __builtin_va_copy: int -> int -> void
+# extern __builtin_va_arg: int -> int -> void
+# extern __builtin_types_compatible_p: int -> int -> int
+# extern __builtin_tanl: float -> float
+# extern __builtin_tanhl: float -> float
+# extern __builtin_tanhf: float -> float
+# extern __builtin_tanh: float -> float
+# extern __builtin_tanf: float -> float
+# extern __builtin_tan: float -> float
+# extern __builtin_strspn: int -> int -> int
+# extern __builtin_strpbrk: int -> int -> int
+# extern __builtin_strncpy: int -> int -> int -> int
+# extern __builtin_strncmp: int -> int -> int -> int
+# extern __builtin_strncat: int -> int -> int -> int
+# extern __builtin_strcspn: int -> int -> int
+# extern __builtin_strcpy: int -> int -> int
+# extern __builtin_strcmp: int -> int -> int
+# extern __builtin_strchr: int -> int -> int
+# extern __builtin_stpcpy: int -> int -> int
+# extern __builtin_stdarg_start: int -> void
+# extern __builtin_sqrtl: float -> float
+# extern __builtin_sqrtf: float -> float
+# extern __builtin_sqrt: float -> float
+# extern __builtin_sinl: float -> float
+# extern __builtin_sinhl: float -> float
+# extern __builtin_sinhf: float -> float
+# extern __builtin_sinh: float -> float
+# extern __builtin_sinf: float -> float
+# extern __builtin_sin: float -> float
+# extern __builtin_return_address: int -> int
+# extern __builtin_return: int -> void
+# extern __builtin_powil: float -> int -> float
+# extern __builtin_powif: float -> int -> float
+# extern __builtin_powi: float -> int -> float
+# extern __builtin_popcountll: int -> int
+# extern __builtin_popcountl: int -> int
+# extern __builtin_popcount: int -> int
+# extern __builtin_parityll: int -> int
+# extern __builtin_parityl: int -> int
+# extern __builtin_parity: int -> int
+# extern __builtin_object_size: int -> int -> int
+# extern __builtin_next_arg: int
+# extern __builtin_nansl: int -> float
+# extern __builtin_nansf: int -> float
+# extern __builtin_nans: int -> float
+# extern __builtin_nanl: int -> float
+# extern __builtin_nanf: int -> float
+# extern __builtin_nan: int -> float
+# extern __builtin_modfl: float -> int -> float
+# extern __builtin_modff: float -> int -> float
+# extern __builtin_mempcpy: int -> int -> int -> int
+# extern __builtin_memcpy: int -> int -> int -> int
+# extern __builtin_logl: float -> float
+# extern __builtin_logf: float -> float
+# extern __builtin_log10l: float -> float
+# extern __builtin_log10f: float -> float
+# extern __builtin_log10: float -> float
+# extern __builtin_log: float -> float
+# extern __builtin_ldexpl: float -> int -> float
+# extern __builtin_ldexpf: float -> int -> float
+# extern __builtin_ldexp: float -> int -> float
+# extern __builtin_infl: float
+# extern __builtin_inff: float
+# extern __builtin_inf: float
+# extern __builtin_huge_vall: float
+# extern __builtin_huge_valf: float
+# extern __builtin_huge_val: float
+# extern __builtin_frexpl: float -> int -> float
+# extern __builtin_frexpf: float -> int -> float
+# extern __builtin_frexp: float -> int -> float
+# extern __builtin_frame_address: int -> int
+# extern __builtin_fmodl: float -> float
+# extern __builtin_fmodf: float -> float
+# extern __builtin_fmod: float -> float
+# extern __builtin_floorl: float -> float
+# extern __builtin_floorf: float -> float
+# extern __builtin_floor: float -> float
+# extern __builtin_ffsll: int -> int
+# extern __builtin_ffsl: int -> int
+# extern __builtin_ffs: int -> int
+# extern __builtin_fabsl: float -> float
+# extern __builtin_fabsf: float -> float
+# extern __builtin_fabs: float -> float
+# extern __builtin_expl: float -> float
+# extern __builtin_expf: float -> float
+# extern __builtin_expect: int -> int -> int
+# extern __builtin_exp: float -> float
+# extern __builtin_ctzll: int -> int
+# extern __builtin_ctzl: int -> int
+# extern __builtin_ctz: int -> int
+# extern __builtin_cosl: float -> float
+# extern __builtin_coshl: float -> float
+# extern __builtin_coshf: float -> float
+# extern __builtin_cosh: float -> float
+# extern __builtin_cosf: float -> float
+# extern __builtin_cos: float -> float
+# extern __builtin_constant_p: int -> int
+# extern __builtin_clzll: int -> int
+# extern __builtin_clzl: int -> int
+# extern __builtin_clz: int -> int
+# extern __builtin_ceill: float -> float
+# extern __builtin_ceilf: float -> float
+# extern __builtin_ceil: float -> float
+# extern __builtin_atanl: float -> float
+# extern __builtin_atanf: float -> float
+# extern __builtin_atan2l: float -> float -> float
+# extern __builtin_atan2f: float -> float -> float
+# extern __builtin_atan2: float -> float -> float
+# extern __builtin_atan: float -> float
+# extern __builtin_asinl: float -> float
+# extern __builtin_asinf: float -> float
+# extern __builtin_asin: float -> float
+# extern __builtin_alloca: int -> int
+# extern __builtin_acosl: float -> float
+# extern __builtin_acosf: float -> float
+# extern __builtin_acos: float -> float
+# extern __builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+# extern __builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+# extern __builtin___vprintf_chk: int -> int -> int -> int
+# extern __builtin___vfprintf_chk: int -> int -> int -> int -> int
+# extern __builtin___strncpy_chk: int -> int -> int -> int -> int
+# extern __builtin___strncat_chk: int -> int -> int -> int -> int
+# extern __builtin___strcpy_chk: int -> int -> int -> int
+# extern __builtin___strcat_chk: int -> int -> int -> int
+# extern __builtin___stpcpy_chk: int -> int -> int -> int
+# extern __builtin___memset_chk: int -> int -> int -> int -> int
+# extern __builtin___mempcpy_chk: int -> int -> int -> int -> int
+# extern __builtin___memmove_chk: int -> int -> int -> int -> int
+# extern __builtin___memcpy_chk: int -> int -> int -> int -> int
+
+# begin preamble
+.data
+globals:
+.space 384
+nl:
+.asciiz "\n"
+.align 2
+.text
+main:
+la $gp, globals
+j main36
+print_int:
+li $v0, 1
+syscall
+jr $ra
+print_intln:
+li $v0, 1
+syscall
+la $a0, nl
+li $v0, 4
+syscall
+jr $ra
+scan_int:
+li $v0, 5
+syscall
+jr $ra
+alloc:
+li $v0, 9
+syscall
+jr $ra
+
+pow2:
+li $v0, 1
+sllv $v0, $v0, $a0
+jr $ra
+
+mod:
+beqz $a0, mod0
+beqz $a1, mod0
+li $t2, 0
+mod_t0:
+bgtz $a0, mod_a0_pos
+neg $t0, $a0
+addi $t2, $t2, 1
+j mod_t1
+mod_a0_pos:
+move $t0, $a0
+mod_t1:
+bgtz $a1, mod_a1_pos
+neg $t1, $a1
+addi $t2, $t2, 2
+j mod_main
+mod_a1_pos:
+move $t1, $a1
+mod_main:
+rem $v0, $t0, $t1
+beqz $t2, mod_exit
+addi $t2, -1
+beqz $t2, mod_case1
+addi $t2, -1
+beqz $t2, mod_case2
+neg $v0, $v0
+j mod_exit
+mod_case1:
+sub $v0, $a1, $v0
+j mod_exit
+mod_case2:
+add $v0, $a1, $v0
+j mod_exit
+mod0:
+li $v0, 0
+mod_exit:
+jr $ra
+
+toint:
+# $a0: size
+# $a1: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+jal pow2
+move $a0, $a1
+move $a1, $v0
+jal mod
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 8
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 16
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+sign_ext:
+# $a0: size
+# $a1: int to extend
+li $v0, 32
+sub $a0, $v0, $a0
+sllv $v0, $a1, $a0
+srav $v0, $v0, $a0
+jr $ra
+
+ofint:
+# $a0: signedness
+# $a1: size
+# $a2: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+beqz $a0, ofint_unsigned
+move $a0, $a1
+move $a1, $a2
+jal sign_ext
+j ofint_exit
+ofint_unsigned:
+move $v0, $a2
+ofint_exit:
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+# end preamble
+
+
+# begin init
+init97:
+c9:
+c8:
+li $a2, 0
+init40:
+li $a0, 0
+c7:
+li $v0, 16
+slt $v0, $a2, $v0
+seq $v0, $v0, $zero
+beq $v0, $a0, init34
+jr $ra
+init34:
+c5:
+li $a1, 2
+li $v0, 4
+mulo $a0, $a2, $v0
+move $v0, $gp
+add $v0, $v0, $a0
+sw $a1, 0($v0)
+c4:
+li $a1, 2
+li $v0, 4
+mulo $a0, $a2, $v0
+move $v0, $gp
+add $v0, $v0, $a0
+sw $a1, 64($v0)
+c3:
+li $a1, 2
+li $v0, 4
+mulo $a0, $a2, $v0
+move $v0, $gp
+add $v0, $v0, $a0
+sw $a1, 128($v0)
+c2:
+li $a1, 2
+li $v0, 4
+mulo $a0, $a2, $v0
+move $v0, $gp
+add $v0, $v0, $a0
+sw $a1, 192($v0)
+c1:
+li $a1, 2
+li $v0, 4
+mulo $a0, $a2, $v0
+move $v0, $gp
+add $v0, $v0, $a0
+sw $a1, 256($v0)
+c0:
+li $a1, 2
+li $v0, 4
+mulo $a0, $a2, $v0
+move $v0, $gp
+add $v0, $v0, $a0
+sw $a1, 320($v0)
+c6:
+li $v0, 1
+add $a2, $a2, $v0
+j init40
+# end init
+
+
+# begin comp_fir_complexe
+comp_fir_complexe265:
+addi $sp, $sp, -188
+sw $ra, 172($sp)
+sw $s7, 168($sp)
+sw $s6, 164($sp)
+sw $s5, 160($sp)
+sw $s4, 156($sp)
+sw $s3, 152($sp)
+sw $s2, 148($sp)
+sw $s1, 144($sp)
+sw $s0, 140($sp)
+sw $a0, 128($sp)
+sw $a1, 132($sp)
+move $s6, $a2
+move $s5, $a3
+lw $v1, 176($sp)
+sw $v1, 136($sp)
+lw $s7, 180($sp)
+lw $s4, 184($sp)
+c39:
+c38:
+li $a1, 0
+comp_fir_complexe127:
+li $a0, 0
+c37:
+li $v0, 16
+slt $v0, $a1, $v0
+seq $v0, $v0, $zero
+beq $v0, $a0, comp_fir_complexe121
+c33:
+li $v0, 0
+c32:
+li $s0, 0
+c31:
+li $s3, 0
+c30:
+c29:
+li $s2, 0
+comp_fir_complexe96:
+li $a1, 0
+c28:
+slt $a0, $s2, $s4
+seq $a0, $a0, $zero
+beq $a0, $a1, comp_fir_complexe91
+c10:
+li $v0, 0
+lw $ra, 172($sp)
+lw $s7, 168($sp)
+lw $s6, 164($sp)
+lw $s5, 160($sp)
+lw $s4, 156($sp)
+lw $s3, 152($sp)
+lw $s2, 148($sp)
+lw $s1, 144($sp)
+lw $s0, 140($sp)
+addi $sp, $sp, 188
+jr $ra
+comp_fir_complexe91:
+c26:
+li $a0, 4
+mulo $a0, $s2, $a0
+lw $v1, 128($sp)
+add $a0, $v1, $a0
+lw $a2, 0($a0)
+move $a1, $sp
+li $a0, 4
+mulo $a0, $v0, $a0
+add $a0, $a1, $a0
+sw $a2, 0($a0)
+c25:
+li $a0, 4
+mulo $a0, $s2, $a0
+lw $v1, 132($sp)
+add $a0, $v1, $a0
+lw $a2, 0($a0)
+move $a1, $sp
+addi $a1, $a1, 64
+li $a0, 4
+mulo $a0, $v0, $a0
+add $a0, $a1, $a0
+sw $a2, 0($a0)
+c24:
+c23:
+li $s1, 0
+comp_fir_complexe72:
+li $a1, 0
+c22:
+li $a0, 16
+slt $a0, $s1, $a0
+seq $a0, $a0, $zero
+beq $a0, $a1, comp_fir_complexe66
+c13:
+li $a0, 1
+add $a0, $v0, $a0
+li $a1, 16
+la $v0, mod
+jalr $v0
+c12:
+li $a0, 4
+mulo $a0, $s2, $a0
+lw $v1, 136($sp)
+add $a0, $v1, $a0
+sw $s0, 0($a0)
+c11:
+li $a0, 4
+mulo $a0, $s2, $a0
+add $a0, $s7, $a0
+sw $s3, 0($a0)
+c27:
+li $a0, 1
+add $s2, $s2, $a0
+j comp_fir_complexe96
+comp_fir_complexe66:
+c20:
+move $a1, $sp
+li $a0, 4
+mulo $a0, $v0, $a0
+add $a0, $a1, $a0
+lw $a2, 0($a0)
+c19:
+move $a1, $sp
+addi $a1, $a1, 64
+li $a0, 4
+mulo $a0, $v0, $a0
+add $a0, $a1, $a0
+lw $a3, 0($a0)
+c18:
+li $a0, 4
+mulo $a0, $s1, $a0
+add $a0, $s6, $a0
+lw $a0, 0($a0)
+mulo $a1, $a2, $a0
+li $a0, 4
+mulo $a0, $s1, $a0
+add $a0, $s5, $a0
+lw $a0, 0($a0)
+mulo $a0, $a3, $a0
+sub $a1, $a1, $a0
+li $a0, 4
+srav $a1, $a1, $a0
+c17:
+li $a0, 4
+mulo $a0, $s1, $a0
+add $a0, $s5, $a0
+lw $a0, 0($a0)
+mulo $a2, $a2, $a0
+li $a0, 4
+mulo $a0, $s1, $a0
+add $a0, $s6, $a0
+lw $a0, 0($a0)
+mulo $a0, $a3, $a0
+add $a2, $a2, $a0
+li $a0, 4
+srav $a0, $a2, $a0
+c16:
+add $s0, $s0, $a1
+c15:
+add $s3, $s3, $a0
+c14:
+li $a0, 1
+add $a0, $v0, $a0
+li $a1, 16
+la $v0, mod
+jalr $v0
+c21:
+li $a0, 1
+add $s1, $s1, $a0
+j comp_fir_complexe72
+comp_fir_complexe121:
+c35:
+move $a0, $sp
+li $v0, 4
+mulo $v0, $a1, $v0
+add $v0, $a0, $v0
+sw $zero, 0($v0)
+c34:
+move $a0, $sp
+addi $a0, $a0, 64
+li $v0, 4
+mulo $v0, $a1, $v0
+add $v0, $a0, $v0
+sw $zero, 0($v0)
+c36:
+li $v0, 1
+add $a1, $a1, $v0
+j comp_fir_complexe127
+# end comp_fir_complexe
+
+
+# begin _main
+main36:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+c42:
+la $v0, init97
+jalr $v0
+c41:
+move $a0, $gp
+move $a1, $gp
+addi $a1, $a1, 64
+move $a2, $gp
+addi $a2, $a2, 128
+move $a3, $gp
+addi $a3, $a3, 192
+move $v0, $gp
+addi $v0, $v0, 256
+addi $gp, $gp, 320
+li $t1, 16
+la $t0, comp_fir_complexe265
+sw $v0, -12($sp)
+sw $gp, -8($sp)
+sw $t1, -4($sp)
+jalr $t0
+c40:
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+# end _main
--- /dev/null
+int t1[16];
+
+int t2[16];
+
+int t3[16];
+
+int t4[16];
+
+int t5[16];
+
+int t6[16];
+
+extern void *__builtin___memcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memmove_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___mempcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memset_chk(void *, int, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___stpcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcat_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strncat_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___strncpy_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern int __builtin___vfprintf_chk(void *, int, unsigned char *, void *);
+
+extern int __builtin___vprintf_chk(int, unsigned char *, void *);
+
+extern int __builtin___vsnprintf_chk(unsigned char *, unsigned int, int, unsigned int, unsigned char *, void *);
+
+extern int __builtin___vsprintf_chk(unsigned char *, int, unsigned int, unsigned char *, void *);
+
+extern double __builtin_acos(double);
+
+extern float __builtin_acosf(float);
+
+extern double __builtin_acosl(double);
+
+extern void *__builtin_alloca(unsigned int);
+
+extern double __builtin_asin(double);
+
+extern float __builtin_asinf(float);
+
+extern double __builtin_asinl(double);
+
+extern double __builtin_atan(double);
+
+extern float __builtin_atanf(float);
+
+extern double __builtin_atanl(double);
+
+extern double __builtin_atan2(double, double);
+
+extern float __builtin_atan2f(float, float);
+
+extern double __builtin_atan2l(double, double);
+
+extern double __builtin_ceil(double);
+
+extern float __builtin_ceilf(float);
+
+extern double __builtin_ceill(double);
+
+extern double __builtin_cos(double);
+
+extern float __builtin_cosf(float);
+
+extern double __builtin_cosl(double);
+
+extern double __builtin_cosh(double);
+
+extern float __builtin_coshf(float);
+
+extern double __builtin_coshl(double);
+
+extern int __builtin_clz(unsigned int);
+
+extern int __builtin_clzl(unsigned int);
+
+extern int __builtin_clzll(unsigned int);
+
+extern int __builtin_constant_p(int);
+
+extern int __builtin_ctz(unsigned int);
+
+extern int __builtin_ctzl(unsigned int);
+
+extern int __builtin_ctzll(unsigned int);
+
+extern double __builtin_exp(double);
+
+extern float __builtin_expf(float);
+
+extern double __builtin_expl(double);
+
+extern int __builtin_expect(int, int);
+
+extern double __builtin_fabs(double);
+
+extern float __builtin_fabsf(float);
+
+extern double __builtin_fabsl(double);
+
+extern int __builtin_ffs(unsigned int);
+
+extern int __builtin_ffsl(unsigned int);
+
+extern int __builtin_ffsll(unsigned int);
+
+extern void *__builtin_frame_address(unsigned int);
+
+extern double __builtin_floor(double);
+
+extern float __builtin_floorf(float);
+
+extern double __builtin_floorl(double);
+
+extern double __builtin_huge_val(void);
+
+extern float __builtin_huge_valf(void);
+
+extern double __builtin_huge_vall(void);
+
+extern double __builtin_inf(void);
+
+extern float __builtin_inff(void);
+
+extern double __builtin_infl(void);
+
+extern void *__builtin_memcpy(void *, void *, unsigned int);
+
+extern void *__builtin_mempcpy(void *, void *, unsigned int);
+
+extern double __builtin_fmod(double);
+
+extern float __builtin_fmodf(float);
+
+extern double __builtin_fmodl(double);
+
+extern double __builtin_frexp(double, int *);
+
+extern float __builtin_frexpf(float, int *);
+
+extern double __builtin_frexpl(double, int *);
+
+extern double __builtin_ldexp(double, int);
+
+extern float __builtin_ldexpf(float, int);
+
+extern double __builtin_ldexpl(double, int);
+
+extern double __builtin_log(double);
+
+extern float __builtin_logf(float);
+
+extern double __builtin_logl(double);
+
+extern double __builtin_log10(double);
+
+extern float __builtin_log10f(float);
+
+extern double __builtin_log10l(double);
+
+extern float __builtin_modff(float, float *);
+
+extern double __builtin_modfl(double, double *);
+
+extern double __builtin_nan(unsigned char *);
+
+extern float __builtin_nanf(unsigned char *);
+
+extern double __builtin_nanl(unsigned char *);
+
+extern double __builtin_nans(unsigned char *);
+
+extern float __builtin_nansf(unsigned char *);
+
+extern double __builtin_nansl(unsigned char *);
+
+extern void *__builtin_next_arg(void);
+
+extern unsigned int __builtin_object_size(void *, int);
+
+extern int __builtin_parity(unsigned int);
+
+extern int __builtin_parityl(unsigned int);
+
+extern int __builtin_parityll(unsigned int);
+
+extern int __builtin_popcount(unsigned int);
+
+extern int __builtin_popcountl(unsigned int);
+
+extern int __builtin_popcountll(unsigned int);
+
+extern double __builtin_powi(double, int);
+
+extern float __builtin_powif(float, int);
+
+extern double __builtin_powil(double, int);
+
+extern void __builtin_return(void *);
+
+extern void *__builtin_return_address(unsigned int);
+
+extern double __builtin_sin(double);
+
+extern float __builtin_sinf(float);
+
+extern double __builtin_sinl(double);
+
+extern double __builtin_sinh(double);
+
+extern float __builtin_sinhf(float);
+
+extern double __builtin_sinhl(double);
+
+extern double __builtin_sqrt(double);
+
+extern float __builtin_sqrtf(float);
+
+extern double __builtin_sqrtl(double);
+
+extern unsigned char *__builtin_stpcpy(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strchr(unsigned char *, unsigned char);
+
+extern int __builtin_strcmp(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strcpy(unsigned char *, unsigned char *);
+
+extern unsigned int __builtin_strcspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strncat(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strncmp(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin_strncpy(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strpbrk(unsigned char *, unsigned char *);
+
+extern int __builtin_types_compatible_p(unsigned int, unsigned int);
+
+extern double __builtin_tan(double);
+
+extern float __builtin_tanf(float);
+
+extern double __builtin_tanl(double);
+
+extern double __builtin_tanh(double);
+
+extern float __builtin_tanhf(float);
+
+extern double __builtin_tanhl(double);
+
+extern void __builtin_va_end(void *);
+
+extern void __builtin_varargs_start(void *);
+
+extern void __builtin_va_start(void *, void *);
+
+extern void __builtin_stdarg_start(void *);
+
+extern void __builtin_va_arg(void *, unsigned int);
+
+extern void __builtin_va_copy(void *, void *);
+
+void init(void)
+{
+ int i;
+ c9:
+ for (({ c8: i = 0; }); (/* c7 */ i < 16); ({ c6: i = i + 1; })) {
+ c5:
+ t1[i] = 2;
+ c4:
+ t2[i] = 2;
+ c3:
+ t3[i] = 2;
+ c2:
+ t4[i] = 2;
+ c1:
+ t5[i] = 2;
+ c0:
+ t6[i] = 2;
+ }
+}
+
+int comp_fir_complexe(int *in_re, int *in_im, int *c_re, int *c_im, int *out_re, int *out_im, int size)
+{
+ int i;
+ int j;
+ int res_re;
+ int res_im;
+ int tmp_im;
+ int tmp_re;
+ int tmp_x_re;
+ int tmp_x_im;
+ int x_re[16];
+ int x_im[16];
+ int ii;
+ int adx;
+ c39:
+ for (({ c38: ii = 0; }); (/* c37 */ ii < 16); ({ c36: ii = ii + 1; })) {
+ c35:
+ x_re[ii] = 0;
+ c34:
+ x_im[ii] = 0;
+ }
+ c33:
+ adx = 0;
+ c32:
+ res_re = 0;
+ c31:
+ res_im = 0;
+ c30:
+ for (({ c29: j = 0; }); (/* c28 */ j < size); ({ c27: j = j + 1; })) {
+ c26:
+ x_re[adx] = in_re[j];
+ c25:
+ x_im[adx] = in_im[j];
+ c24:
+ for (({ c23: i = 0; }); (/* c22 */ i < 16); ({ c21: i = i + 1; })) {
+ c20:
+ tmp_x_re = x_re[adx];
+ c19:
+ tmp_x_im = x_im[adx];
+ c18:
+ tmp_re = (tmp_x_re * c_re[i] - tmp_x_im * c_im[i]) >> 4;
+ c17:
+ tmp_im = (tmp_x_re * c_im[i] + tmp_x_im * c_re[i]) >> 4;
+ c16:
+ res_re = res_re + tmp_re;
+ c15:
+ res_im = res_im + tmp_im;
+ c14:
+ adx = (adx + 1) % 16;
+ }
+ c13:
+ adx = (adx + 1) % 16;
+ c12:
+ out_re[j] = res_re;
+ c11:
+ out_im[j] = res_im;
+ }
+ c10:
+ return 0;
+}
+
+int main(void)
+{
+ int t;
+ c42:
+ init();
+ c41:
+ t = comp_fir_complexe(t1, t2, t3, t4, t5, t6, 16);
+ c40:
+ return t;
+}
+
+
--- /dev/null
+
+var "t1" {[64]}
+var "t2" {[64]}
+var "t3" {[64]}
+var "t4" {[64]}
+var "t5" {[64]}
+var "t6" {[64]}
+
+
+extern "__builtin___memcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memmove_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___mempcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memset_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___stpcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcat_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strncat_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___strncpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vfprintf_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vprintf_chk" : int -> int -> int -> int
+
+
+extern "__builtin___vsnprintf_chk" : int -> int -> int -> int -> int -> int -> int
+
+
+extern "__builtin___vsprintf_chk" : int -> int -> int -> int -> int -> int
+
+
+extern "__builtin_acos" : float -> float
+
+
+extern "__builtin_acosf" : float -> float
+
+
+extern "__builtin_acosl" : float -> float
+
+
+extern "__builtin_alloca" : int -> int
+
+
+extern "__builtin_asin" : float -> float
+
+
+extern "__builtin_asinf" : float -> float
+
+
+extern "__builtin_asinl" : float -> float
+
+
+extern "__builtin_atan" : float -> float
+
+
+extern "__builtin_atanf" : float -> float
+
+
+extern "__builtin_atanl" : float -> float
+
+
+extern "__builtin_atan2" : float -> float -> float
+
+
+extern "__builtin_atan2f" : float -> float -> float
+
+
+extern "__builtin_atan2l" : float -> float -> float
+
+
+extern "__builtin_ceil" : float -> float
+
+
+extern "__builtin_ceilf" : float -> float
+
+
+extern "__builtin_ceill" : float -> float
+
+
+extern "__builtin_cos" : float -> float
+
+
+extern "__builtin_cosf" : float -> float
+
+
+extern "__builtin_cosl" : float -> float
+
+
+extern "__builtin_cosh" : float -> float
+
+
+extern "__builtin_coshf" : float -> float
+
+
+extern "__builtin_coshl" : float -> float
+
+
+extern "__builtin_clz" : int -> int
+
+
+extern "__builtin_clzl" : int -> int
+
+
+extern "__builtin_clzll" : int -> int
+
+
+extern "__builtin_constant_p" : int -> int
+
+
+extern "__builtin_ctz" : int -> int
+
+
+extern "__builtin_ctzl" : int -> int
+
+
+extern "__builtin_ctzll" : int -> int
+
+
+extern "__builtin_exp" : float -> float
+
+
+extern "__builtin_expf" : float -> float
+
+
+extern "__builtin_expl" : float -> float
+
+
+extern "__builtin_expect" : int -> int -> int
+
+
+extern "__builtin_fabs" : float -> float
+
+
+extern "__builtin_fabsf" : float -> float
+
+
+extern "__builtin_fabsl" : float -> float
+
+
+extern "__builtin_ffs" : int -> int
+
+
+extern "__builtin_ffsl" : int -> int
+
+
+extern "__builtin_ffsll" : int -> int
+
+
+extern "__builtin_frame_address" : int -> int
+
+
+extern "__builtin_floor" : float -> float
+
+
+extern "__builtin_floorf" : float -> float
+
+
+extern "__builtin_floorl" : float -> float
+
+
+extern "__builtin_huge_val" : float
+
+
+extern "__builtin_huge_valf" : float
+
+
+extern "__builtin_huge_vall" : float
+
+
+extern "__builtin_inf" : float
+
+
+extern "__builtin_inff" : float
+
+
+extern "__builtin_infl" : float
+
+
+extern "__builtin_memcpy" : int -> int -> int -> int
+
+
+extern "__builtin_mempcpy" : int -> int -> int -> int
+
+
+extern "__builtin_fmod" : float -> float
+
+
+extern "__builtin_fmodf" : float -> float
+
+
+extern "__builtin_fmodl" : float -> float
+
+
+extern "__builtin_frexp" : float -> int -> float
+
+
+extern "__builtin_frexpf" : float -> int -> float
+
+
+extern "__builtin_frexpl" : float -> int -> float
+
+
+extern "__builtin_ldexp" : float -> int -> float
+
+
+extern "__builtin_ldexpf" : float -> int -> float
+
+
+extern "__builtin_ldexpl" : float -> int -> float
+
+
+extern "__builtin_log" : float -> float
+
+
+extern "__builtin_logf" : float -> float
+
+
+extern "__builtin_logl" : float -> float
+
+
+extern "__builtin_log10" : float -> float
+
+
+extern "__builtin_log10f" : float -> float
+
+
+extern "__builtin_log10l" : float -> float
+
+
+extern "__builtin_modff" : float -> int -> float
+
+
+extern "__builtin_modfl" : float -> int -> float
+
+
+extern "__builtin_nan" : int -> float
+
+
+extern "__builtin_nanf" : int -> float
+
+
+extern "__builtin_nanl" : int -> float
+
+
+extern "__builtin_nans" : int -> float
+
+
+extern "__builtin_nansf" : int -> float
+
+
+extern "__builtin_nansl" : int -> float
+
+
+extern "__builtin_next_arg" : int
+
+
+extern "__builtin_object_size" : int -> int -> int
+
+
+extern "__builtin_parity" : int -> int
+
+
+extern "__builtin_parityl" : int -> int
+
+
+extern "__builtin_parityll" : int -> int
+
+
+extern "__builtin_popcount" : int -> int
+
+
+extern "__builtin_popcountl" : int -> int
+
+
+extern "__builtin_popcountll" : int -> int
+
+
+extern "__builtin_powi" : float -> int -> float
+
+
+extern "__builtin_powif" : float -> int -> float
+
+
+extern "__builtin_powil" : float -> int -> float
+
+
+extern "__builtin_return" : int -> void
+
+
+extern "__builtin_return_address" : int -> int
+
+
+extern "__builtin_sin" : float -> float
+
+
+extern "__builtin_sinf" : float -> float
+
+
+extern "__builtin_sinl" : float -> float
+
+
+extern "__builtin_sinh" : float -> float
+
+
+extern "__builtin_sinhf" : float -> float
+
+
+extern "__builtin_sinhl" : float -> float
+
+
+extern "__builtin_sqrt" : float -> float
+
+
+extern "__builtin_sqrtf" : float -> float
+
+
+extern "__builtin_sqrtl" : float -> float
+
+
+extern "__builtin_stpcpy" : int -> int -> int
+
+
+extern "__builtin_strchr" : int -> int -> int
+
+
+extern "__builtin_strcmp" : int -> int -> int
+
+
+extern "__builtin_strcpy" : int -> int -> int
+
+
+extern "__builtin_strcspn" : int -> int -> int
+
+
+extern "__builtin_strncat" : int -> int -> int -> int
+
+
+extern "__builtin_strncmp" : int -> int -> int -> int
+
+
+extern "__builtin_strncpy" : int -> int -> int -> int
+
+
+extern "__builtin_strspn" : int -> int -> int
+
+
+extern "__builtin_strpbrk" : int -> int -> int
+
+
+extern "__builtin_types_compatible_p" : int -> int -> int
+
+
+extern "__builtin_tan" : float -> float
+
+
+extern "__builtin_tanf" : float -> float
+
+
+extern "__builtin_tanl" : float -> float
+
+
+extern "__builtin_tanh" : float -> float
+
+
+extern "__builtin_tanhf" : float -> float
+
+
+extern "__builtin_tanhl" : float -> float
+
+
+extern "__builtin_va_end" : int -> void
+
+
+extern "__builtin_varargs_start" : int -> void
+
+
+extern "__builtin_va_start" : int -> int -> void
+
+
+extern "__builtin_stdarg_start" : int -> void
+
+
+extern "__builtin_va_arg" : int -> int -> void
+
+
+extern "__builtin_va_copy" : int -> int -> void
+
+
+"init" () : void {
+
+ stack 0;
+
+ var i;
+
+ c9:
+ c8:
+ i = 0;
+ block {
+ loop {
+ if (!(/* c7 */ i < 16)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c5:
+ int32["t1" + (i * 4)] = 2;
+ c4:
+ int32["t2" + (i * 4)] = 2;
+ c3:
+ int32["t3" + (i * 4)] = 2;
+ c2:
+ int32["t4" + (i * 4)] = 2;
+ c1:
+ int32["t5" + (i * 4)] = 2;
+ c0:
+ int32["t6" + (i * 4)] = 2;
+ }
+ c6:
+ i = i + 1;
+ }
+ }
+
+}
+
+
+"comp_fir_complexe" (in_re, in_im, c_re, c_im, out_re, out_im, size) : int -> int -> int -> int -> int -> int -> int -> int {
+
+ stack 128;
+
+ var res_im, ii, tmp_x_im, tmp_re, j, i, res_re, tmp_im, tmp_x_re, adx;
+
+ c39:
+ c38:
+ ii = 0;
+ block {
+ loop {
+ if (!(/* c37 */ ii < 16)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c35:
+ int32[&0 + (ii * 4)] = 0;
+ c34:
+ int32[&64 + (ii * 4)] = 0;
+ }
+ c36:
+ ii = ii + 1;
+ }
+ }
+ c33:
+ adx = 0;
+ c32:
+ res_re = 0;
+ c31:
+ res_im = 0;
+ c30:
+ c29:
+ j = 0;
+ block {
+ loop {
+ if (!(/* c28 */ j < size)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c26:
+ int32[&0 + (adx * 4)] = int32[in_re + (j * 4)];
+ c25:
+ int32[&64 + (adx * 4)] = int32[in_im + (j * 4)];
+ c24:
+ c23:
+ i = 0;
+ block {
+ loop {
+ if (!(/* c22 */ i < 16)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c20:
+ tmp_x_re = int32[&0 + (adx * 4)];
+ c19:
+ tmp_x_im = int32[&64 + (adx * 4)];
+ c18:
+ tmp_re = ((tmp_x_re * int32[c_re + (i * 4)]) - (tmp_x_im * int32[c_im + (i * 4)])) >> 4;
+ c17:
+ tmp_im = ((tmp_x_re * int32[c_im + (i * 4)]) + (tmp_x_im * int32[c_re + (i * 4)])) >> 4;
+ c16:
+ res_re = res_re + tmp_re;
+ c15:
+ res_im = res_im + tmp_im;
+ c14:
+ adx = (adx + 1) % 16;
+ }
+ c21:
+ i = i + 1;
+ }
+ }
+ c13:
+ adx = (adx + 1) % 16;
+ c12:
+ int32[out_re + (j * 4)] = res_re;
+ c11:
+ int32[out_im + (j * 4)] = res_im;
+ }
+ c27:
+ j = j + 1;
+ }
+ }
+ c10:
+ return 0;
+
+}
+
+
+"main" () : int {
+
+ stack 0;
+
+ var t;
+
+ c42:
+ "init"() : void;
+ c41:
+ t = "comp_fir_complexe"("t1", "t2", "t3", "t4", "t5", "t6", 16) : int -> int -> int -> int -> int -> int -> int -> int;
+ c40:
+ return t;
+
+}
+
+
--- /dev/null
+program
+
+globals 384
+
+procedure init(0)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39
+entry init97
+init97 : newframe --> init96
+init96 : move %39, $ra --> init95
+init95 : move %38, $s7 --> init94
+init94 : move %37, $s6 --> init93
+init93 : move %36, $s5 --> init92
+init92 : move %35, $s4 --> init91
+init91 : move %34, $s3 --> init90
+init90 : move %33, $s2 --> init89
+init89 : move %32, $s1 --> init88
+init88 : move %31, $s0 --> init87
+init87 : li %0, 0 --> init86
+init86 : li %1, 0 --> init85
+init85 : li %2, 0 --> init84
+init84 : li %3, 0 --> init83
+init83 : li %4, 0 --> init82
+init82 : li %5, 0 --> init81
+init81 : li %6, 0 --> init80
+init80 : li %7, 0 --> init79
+init79 : li %8, 0 --> init78
+init78 : li %9, 0 --> init77
+init77 : li %10, 0 --> init76
+init76 : li %11, 0 --> init75
+init75 : li %12, 0 --> init74
+init74 : li %13, 0 --> init73
+init73 : li %14, 0 --> init72
+init72 : li %15, 0 --> init71
+init71 : li %16, 0 --> init70
+init70 : li %17, 0 --> init69
+init69 : li %18, 0 --> init68
+init68 : li %19, 0 --> init67
+init67 : li %20, 0 --> init66
+init66 : li %21, 0 --> init65
+init65 : li %22, 0 --> init64
+init64 : li %23, 0 --> init63
+init63 : li %24, 0 --> init62
+init62 : li %25, 0 --> init61
+init61 : li %26, 0 --> init60
+init60 : li %27, 0 --> init59
+init59 : li %28, 0 --> init58
+init58 : li %29, 0 --> init57
+init57 : li %30, 0 --> init43
+init43 : emit c9 --> init42
+init42 : emit c8 --> init41
+init41 : li %0, 0 --> init1
+init1 : j --> init40
+init40 : li %21, 0 --> init39
+init39 : emit c7 --> init38
+init38 : li %23, 16 --> init37
+init37 : slt %22, %0, %23 --> init36
+init36 : li %29, 0 --> init54
+init54 : seq %20, %22, %29 --> init35
+init35 : beq %20, %21 --> init34, init0
+init0 : j --> init108
+init108: move $ra, %39 --> init107
+init107: move $s7, %38 --> init106
+init106: move $s6, %37 --> init105
+init105: move $s5, %36 --> init104
+init104: move $s4, %35 --> init103
+init103: move $s3, %34 --> init102
+init102: move $s2, %33 --> init101
+init101: move $s1, %32 --> init100
+init100: move $s0, %31 --> init99
+init99 : delframe --> init98
+init98 : jr $ra
+init34 : emit c5 --> init33
+init33 : li %17, 2 --> init32
+init32 : li %19, 4 --> init31
+init31 : mulo %18, %0, %19 --> init30
+init30 : move %28, $gp --> init113
+init113: move %28, %28 --> init53
+init53 : add %28, %28, %18 --> init52
+init52 : sw %17, 0(%28) --> init29
+init29 : emit c4 --> init28
+init28 : li %14, 2 --> init27
+init27 : li %16, 4 --> init26
+init26 : mulo %15, %0, %16 --> init25
+init25 : move %27, $gp --> init112
+init112: move %27, %27 --> init51
+init51 : add %27, %27, %15 --> init50
+init50 : sw %14, 64(%27) --> init24
+init24 : emit c3 --> init23
+init23 : li %11, 2 --> init22
+init22 : li %13, 4 --> init21
+init21 : mulo %12, %0, %13 --> init20
+init20 : move %26, $gp --> init111
+init111: move %26, %26 --> init49
+init49 : add %26, %26, %12 --> init48
+init48 : sw %11, 128(%26) --> init19
+init19 : emit c2 --> init18
+init18 : li %8, 2 --> init17
+init17 : li %10, 4 --> init16
+init16 : mulo %9, %0, %10 --> init15
+init15 : move %25, $gp --> init110
+init110: move %25, %25 --> init47
+init47 : add %25, %25, %9 --> init46
+init46 : sw %8, 192(%25) --> init14
+init14 : emit c1 --> init13
+init13 : li %5, 2 --> init12
+init12 : li %7, 4 --> init11
+init11 : mulo %6, %0, %7 --> init10
+init10 : move %24, $gp --> init109
+init109: move %24, %24 --> init45
+init45 : add %24, %24, %6 --> init44
+init44 : sw %5, 256(%24) --> init9
+init9 : emit c0 --> init8
+init8 : li %2, 2 --> init7
+init7 : li %4, 4 --> init6
+init6 : mulo %3, %0, %4 --> init5
+init5 : move %30, $gp --> init114
+init114: move %30, %30 --> init56
+init56 : add %30, %30, %3 --> init55
+init55 : sw %2, 320(%30) --> init4
+init4 : emit c6 --> init3
+init3 : li %1, 1 --> init2
+init2 : add %0, %0, %1 --> init1
+
+procedure comp_fir_complexe(7)
+stacksize 128
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78, %79, %80, %81, %82, %83,
+ %84, %85, %86, %87, %88, %89, %90,
+ %91, %92, %93, %94, %95, %96, %97,
+ %98, %99, %100, %101, %102, %103, %104,
+ %105, %106, %107, %108, %109, %110, %111,
+ %112, %113, %114, %115
+entry comp_fir_complexe265
+comp_fir_complexe265: newframe --> comp_fir_complexe264
+comp_fir_complexe264: move %115, $ra --> comp_fir_complexe263
+comp_fir_complexe263: move %114, $s7 --> comp_fir_complexe262
+comp_fir_complexe262: move %113, $s6 --> comp_fir_complexe261
+comp_fir_complexe261: move %112, $s5 --> comp_fir_complexe260
+comp_fir_complexe260: move %111, $s4 --> comp_fir_complexe259
+comp_fir_complexe259: move %110, $s3 --> comp_fir_complexe258
+comp_fir_complexe258: move %109, $s2 --> comp_fir_complexe257
+comp_fir_complexe257: move %108, $s1 --> comp_fir_complexe256
+comp_fir_complexe256: move %107, $s0 --> comp_fir_complexe255
+comp_fir_complexe255: move %0, $a0 --> comp_fir_complexe254
+comp_fir_complexe254: move %1, $a1 --> comp_fir_complexe253
+comp_fir_complexe253: move %2, $a2 --> comp_fir_complexe252
+comp_fir_complexe252: move %3, $a3 --> comp_fir_complexe251
+comp_fir_complexe251: gets %4, in(8) --> comp_fir_complexe250
+comp_fir_complexe250: gets %5, in(4) --> comp_fir_complexe249
+comp_fir_complexe249: gets %6, in(0) --> comp_fir_complexe248
+comp_fir_complexe248: li %7, 0 --> comp_fir_complexe247
+comp_fir_complexe247: li %8, 0 --> comp_fir_complexe246
+comp_fir_complexe246: li %9, 0 --> comp_fir_complexe245
+comp_fir_complexe245: li %10, 0 --> comp_fir_complexe244
+comp_fir_complexe244: li %11, 0 --> comp_fir_complexe243
+comp_fir_complexe243: li %12, 0 --> comp_fir_complexe242
+comp_fir_complexe242: li %13, 0 --> comp_fir_complexe241
+comp_fir_complexe241: li %14, 0 --> comp_fir_complexe240
+comp_fir_complexe240: li %15, 0 --> comp_fir_complexe239
+comp_fir_complexe239: li %16, 0 --> comp_fir_complexe238
+comp_fir_complexe238: li %18, 0 --> comp_fir_complexe237
+comp_fir_complexe237: li %19, 0 --> comp_fir_complexe236
+comp_fir_complexe236: li %20, 0 --> comp_fir_complexe235
+comp_fir_complexe235: li %21, 0 --> comp_fir_complexe234
+comp_fir_complexe234: li %22, 0 --> comp_fir_complexe233
+comp_fir_complexe233: li %23, 0 --> comp_fir_complexe232
+comp_fir_complexe232: li %24, 0 --> comp_fir_complexe231
+comp_fir_complexe231: li %25, 0 --> comp_fir_complexe230
+comp_fir_complexe230: li %26, 0 --> comp_fir_complexe229
+comp_fir_complexe229: li %27, 0 --> comp_fir_complexe228
+comp_fir_complexe228: li %28, 0 --> comp_fir_complexe227
+comp_fir_complexe227: li %29, 0 --> comp_fir_complexe226
+comp_fir_complexe226: li %30, 0 --> comp_fir_complexe225
+comp_fir_complexe225: li %31, 0 --> comp_fir_complexe224
+comp_fir_complexe224: li %32, 0 --> comp_fir_complexe223
+comp_fir_complexe223: li %33, 0 --> comp_fir_complexe222
+comp_fir_complexe222: li %34, 0 --> comp_fir_complexe221
+comp_fir_complexe221: li %35, 0 --> comp_fir_complexe220
+comp_fir_complexe220: li %36, 0 --> comp_fir_complexe219
+comp_fir_complexe219: li %37, 0 --> comp_fir_complexe218
+comp_fir_complexe218: li %38, 0 --> comp_fir_complexe217
+comp_fir_complexe217: li %39, 0 --> comp_fir_complexe216
+comp_fir_complexe216: li %40, 0 --> comp_fir_complexe215
+comp_fir_complexe215: li %41, 0 --> comp_fir_complexe214
+comp_fir_complexe214: li %42, 0 --> comp_fir_complexe213
+comp_fir_complexe213: li %43, 0 --> comp_fir_complexe212
+comp_fir_complexe212: li %44, 0 --> comp_fir_complexe211
+comp_fir_complexe211: li %45, 0 --> comp_fir_complexe210
+comp_fir_complexe210: li %46, 0 --> comp_fir_complexe209
+comp_fir_complexe209: li %47, 0 --> comp_fir_complexe208
+comp_fir_complexe208: li %48, 0 --> comp_fir_complexe207
+comp_fir_complexe207: li %49, 0 --> comp_fir_complexe206
+comp_fir_complexe206: li %50, 0 --> comp_fir_complexe205
+comp_fir_complexe205: li %51, 0 --> comp_fir_complexe204
+comp_fir_complexe204: li %52, 0 --> comp_fir_complexe203
+comp_fir_complexe203: li %53, 0 --> comp_fir_complexe202
+comp_fir_complexe202: li %54, 0 --> comp_fir_complexe201
+comp_fir_complexe201: li %55, 0 --> comp_fir_complexe200
+comp_fir_complexe200: li %56, 0 --> comp_fir_complexe199
+comp_fir_complexe199: li %57, 0 --> comp_fir_complexe198
+comp_fir_complexe198: li %58, 0 --> comp_fir_complexe197
+comp_fir_complexe197: li %59, 0 --> comp_fir_complexe196
+comp_fir_complexe196: li %60, 0 --> comp_fir_complexe195
+comp_fir_complexe195: li %61, 0 --> comp_fir_complexe194
+comp_fir_complexe194: li %62, 0 --> comp_fir_complexe193
+comp_fir_complexe193: li %63, 0 --> comp_fir_complexe192
+comp_fir_complexe192: li %64, 0 --> comp_fir_complexe191
+comp_fir_complexe191: li %65, 0 --> comp_fir_complexe190
+comp_fir_complexe190: li %66, 0 --> comp_fir_complexe189
+comp_fir_complexe189: li %67, 0 --> comp_fir_complexe188
+comp_fir_complexe188: li %68, 0 --> comp_fir_complexe187
+comp_fir_complexe187: li %69, 0 --> comp_fir_complexe186
+comp_fir_complexe186: li %70, 0 --> comp_fir_complexe185
+comp_fir_complexe185: li %71, 0 --> comp_fir_complexe184
+comp_fir_complexe184: li %72, 0 --> comp_fir_complexe183
+comp_fir_complexe183: li %73, 0 --> comp_fir_complexe182
+comp_fir_complexe182: li %74, 0 --> comp_fir_complexe181
+comp_fir_complexe181: li %75, 0 --> comp_fir_complexe180
+comp_fir_complexe180: li %76, 0 --> comp_fir_complexe179
+comp_fir_complexe179: li %77, 0 --> comp_fir_complexe178
+comp_fir_complexe178: li %78, 0 --> comp_fir_complexe177
+comp_fir_complexe177: li %79, 0 --> comp_fir_complexe176
+comp_fir_complexe176: li %80, 0 --> comp_fir_complexe175
+comp_fir_complexe175: li %81, 0 --> comp_fir_complexe174
+comp_fir_complexe174: li %82, 0 --> comp_fir_complexe173
+comp_fir_complexe173: li %83, 0 --> comp_fir_complexe172
+comp_fir_complexe172: li %84, 0 --> comp_fir_complexe171
+comp_fir_complexe171: li %85, 0 --> comp_fir_complexe170
+comp_fir_complexe170: li %86, 0 --> comp_fir_complexe169
+comp_fir_complexe169: li %87, 0 --> comp_fir_complexe168
+comp_fir_complexe168: li %88, 0 --> comp_fir_complexe167
+comp_fir_complexe167: li %89, 0 --> comp_fir_complexe166
+comp_fir_complexe166: li %90, 0 --> comp_fir_complexe165
+comp_fir_complexe165: li %91, 0 --> comp_fir_complexe164
+comp_fir_complexe164: li %92, 0 --> comp_fir_complexe163
+comp_fir_complexe163: li %93, 0 --> comp_fir_complexe162
+comp_fir_complexe162: li %94, 0 --> comp_fir_complexe161
+comp_fir_complexe161: li %95, 0 --> comp_fir_complexe160
+comp_fir_complexe160: li %96, 0 --> comp_fir_complexe159
+comp_fir_complexe159: li %97, 0 --> comp_fir_complexe158
+comp_fir_complexe158: li %98, 0 --> comp_fir_complexe157
+comp_fir_complexe157: li %99, 0 --> comp_fir_complexe156
+comp_fir_complexe156: li %100, 0 --> comp_fir_complexe155
+comp_fir_complexe155: li %101, 0 --> comp_fir_complexe154
+comp_fir_complexe154: li %102, 0 --> comp_fir_complexe153
+comp_fir_complexe153: li %103, 0 --> comp_fir_complexe152
+comp_fir_complexe152: li %104, 0 --> comp_fir_complexe151
+comp_fir_complexe151: li %105, 0 --> comp_fir_complexe150
+comp_fir_complexe150: li %106, 0 --> comp_fir_complexe130
+comp_fir_complexe130: emit c39 --> comp_fir_complexe129
+comp_fir_complexe129: emit c38 --> comp_fir_complexe128
+comp_fir_complexe128: li %8, 0 --> comp_fir_complexe106
+comp_fir_complexe106: j --> comp_fir_complexe127
+comp_fir_complexe127: li %85, 0 --> comp_fir_complexe126
+comp_fir_complexe126: emit c37 --> comp_fir_complexe125
+comp_fir_complexe125: li %87, 16 --> comp_fir_complexe124
+comp_fir_complexe124: slt %86, %8, %87 --> comp_fir_complexe123
+comp_fir_complexe123: li %91, 0 --> comp_fir_complexe134
+comp_fir_complexe134: seq %84, %86, %91 --> comp_fir_complexe122
+comp_fir_complexe122: beq %84, %85 --> comp_fir_complexe121, comp_fir_complexe105
+comp_fir_complexe105: emit c33 --> comp_fir_complexe104
+comp_fir_complexe104: li %16, 0 --> comp_fir_complexe103
+comp_fir_complexe103: emit c32 --> comp_fir_complexe102
+comp_fir_complexe102: li %13, 0 --> comp_fir_complexe101
+comp_fir_complexe101: emit c31 --> comp_fir_complexe100
+comp_fir_complexe100: li %7, 0 --> comp_fir_complexe99
+comp_fir_complexe99 : emit c30 --> comp_fir_complexe98
+comp_fir_complexe98 : emit c29 --> comp_fir_complexe97
+comp_fir_complexe97 : li %11, 0 --> comp_fir_complexe3
+comp_fir_complexe3 : j --> comp_fir_complexe96
+comp_fir_complexe96 : li %73, 0 --> comp_fir_complexe95
+comp_fir_complexe95 : emit c28 --> comp_fir_complexe94
+comp_fir_complexe94 : slt %74, %11, %6 --> comp_fir_complexe93
+comp_fir_complexe93 : li %106, 0 --> comp_fir_complexe149
+comp_fir_complexe149: seq %72, %74, %106 --> comp_fir_complexe92
+comp_fir_complexe92 : beq %72, %73 --> comp_fir_complexe91, comp_fir_complexe2
+comp_fir_complexe2 : emit c10 --> comp_fir_complexe1
+comp_fir_complexe1 : li %17, 0 --> comp_fir_complexe0
+comp_fir_complexe0 : j --> comp_fir_complexe277
+comp_fir_complexe277: move $v0, %17 --> comp_fir_complexe276
+comp_fir_complexe276: move $ra, %115 --> comp_fir_complexe275
+comp_fir_complexe275: move $s7, %114 --> comp_fir_complexe274
+comp_fir_complexe274: move $s6, %113 --> comp_fir_complexe273
+comp_fir_complexe273: move $s5, %112 --> comp_fir_complexe272
+comp_fir_complexe272: move $s4, %111 --> comp_fir_complexe271
+comp_fir_complexe271: move $s3, %110 --> comp_fir_complexe270
+comp_fir_complexe270: move $s2, %109 --> comp_fir_complexe269
+comp_fir_complexe269: move $s1, %108 --> comp_fir_complexe268
+comp_fir_complexe268: move $s0, %107 --> comp_fir_complexe267
+comp_fir_complexe267: delframe --> comp_fir_complexe266
+comp_fir_complexe266: jr $ra (xmits $v0)
+comp_fir_complexe91 : emit c26 --> comp_fir_complexe90
+comp_fir_complexe90 : li %71, 4 --> comp_fir_complexe89
+comp_fir_complexe89 : mulo %70, %11, %71 --> comp_fir_complexe88
+comp_fir_complexe88 : add %105, %0, %70 --> comp_fir_complexe148
+comp_fir_complexe148: lw %66, 0(%105) --> comp_fir_complexe87
+comp_fir_complexe87 : move %67, $sp --> comp_fir_complexe291
+comp_fir_complexe291: move %67, %67 --> comp_fir_complexe86
+comp_fir_complexe86 : li %69, 4 --> comp_fir_complexe85
+comp_fir_complexe85 : mulo %68, %16, %69 --> comp_fir_complexe84
+comp_fir_complexe84 : add %104, %67, %68 --> comp_fir_complexe147
+comp_fir_complexe147: sw %66, 0(%104) --> comp_fir_complexe83
+comp_fir_complexe83 : emit c25 --> comp_fir_complexe82
+comp_fir_complexe82 : li %65, 4 --> comp_fir_complexe81
+comp_fir_complexe81 : mulo %64, %11, %65 --> comp_fir_complexe80
+comp_fir_complexe80 : add %103, %1, %64 --> comp_fir_complexe146
+comp_fir_complexe146: lw %60, 0(%103) --> comp_fir_complexe79
+comp_fir_complexe79 : move %61, $sp --> comp_fir_complexe290
+comp_fir_complexe290: addi %61, %61, 64 --> comp_fir_complexe78
+comp_fir_complexe78 : li %63, 4 --> comp_fir_complexe77
+comp_fir_complexe77 : mulo %62, %16, %63 --> comp_fir_complexe76
+comp_fir_complexe76 : add %102, %61, %62 --> comp_fir_complexe145
+comp_fir_complexe145: sw %60, 0(%102) --> comp_fir_complexe75
+comp_fir_complexe75 : emit c24 --> comp_fir_complexe74
+comp_fir_complexe74 : emit c23 --> comp_fir_complexe73
+comp_fir_complexe73 : li %12, 0 --> comp_fir_complexe20
+comp_fir_complexe20 : j --> comp_fir_complexe72
+comp_fir_complexe72 : li %57, 0 --> comp_fir_complexe71
+comp_fir_complexe71 : emit c22 --> comp_fir_complexe70
+comp_fir_complexe70 : li %59, 16 --> comp_fir_complexe69
+comp_fir_complexe69 : slt %58, %12, %59 --> comp_fir_complexe68
+comp_fir_complexe68 : li %100, 0 --> comp_fir_complexe143
+comp_fir_complexe143: seq %56, %58, %100 --> comp_fir_complexe67
+comp_fir_complexe67 : beq %56, %57 --> comp_fir_complexe66, comp_fir_complexe19
+comp_fir_complexe19 : emit c13 --> comp_fir_complexe18
+comp_fir_complexe18 : li %25, 1 --> comp_fir_complexe17
+comp_fir_complexe17 : add %23, %16, %25 --> comp_fir_complexe16
+comp_fir_complexe16 : li %24, 16 --> comp_fir_complexe15
+comp_fir_complexe15 : la %92, mod --> comp_fir_complexe135
+comp_fir_complexe135: j --> comp_fir_complexe283
+comp_fir_complexe283: move $a0, %23 --> comp_fir_complexe282
+comp_fir_complexe282: move $a1, %24 --> comp_fir_complexe281
+comp_fir_complexe281: call %92(2) --> comp_fir_complexe280
+comp_fir_complexe280: move %16, $v0 --> comp_fir_complexe14
+comp_fir_complexe14 : emit c12 --> comp_fir_complexe13
+comp_fir_complexe13 : li %22, 4 --> comp_fir_complexe12
+comp_fir_complexe12 : mulo %21, %11, %22 --> comp_fir_complexe11
+comp_fir_complexe11 : add %88, %4, %21 --> comp_fir_complexe131
+comp_fir_complexe131: sw %13, 0(%88) --> comp_fir_complexe10
+comp_fir_complexe10 : emit c11 --> comp_fir_complexe9
+comp_fir_complexe9 : li %20, 4 --> comp_fir_complexe8
+comp_fir_complexe8 : mulo %19, %11, %20 --> comp_fir_complexe7
+comp_fir_complexe7 : add %101, %5, %19 --> comp_fir_complexe144
+comp_fir_complexe144: sw %7, 0(%101) --> comp_fir_complexe6
+comp_fir_complexe6 : emit c27 --> comp_fir_complexe5
+comp_fir_complexe5 : li %18, 1 --> comp_fir_complexe4
+comp_fir_complexe4 : add %11, %11, %18 --> comp_fir_complexe3
+comp_fir_complexe66 : emit c20 --> comp_fir_complexe65
+comp_fir_complexe65 : move %53, $sp --> comp_fir_complexe289
+comp_fir_complexe289: move %53, %53 --> comp_fir_complexe64
+comp_fir_complexe64 : li %55, 4 --> comp_fir_complexe63
+comp_fir_complexe63 : mulo %54, %16, %55 --> comp_fir_complexe62
+comp_fir_complexe62 : add %99, %53, %54 --> comp_fir_complexe142
+comp_fir_complexe142: lw %15, 0(%99) --> comp_fir_complexe61
+comp_fir_complexe61 : emit c19 --> comp_fir_complexe60
+comp_fir_complexe60 : move %50, $sp --> comp_fir_complexe288
+comp_fir_complexe288: addi %50, %50, 64 --> comp_fir_complexe59
+comp_fir_complexe59 : li %52, 4 --> comp_fir_complexe58
+comp_fir_complexe58 : mulo %51, %16, %52 --> comp_fir_complexe57
+comp_fir_complexe57 : add %98, %50, %51 --> comp_fir_complexe141
+comp_fir_complexe141: lw %9, 0(%98) --> comp_fir_complexe56
+comp_fir_complexe56 : emit c18 --> comp_fir_complexe55
+comp_fir_complexe55 : li %49, 4 --> comp_fir_complexe54
+comp_fir_complexe54 : mulo %48, %12, %49 --> comp_fir_complexe53
+comp_fir_complexe53 : add %97, %2, %48 --> comp_fir_complexe140
+comp_fir_complexe140: lw %47, 0(%97) --> comp_fir_complexe52
+comp_fir_complexe52 : mulo %42, %15, %47 --> comp_fir_complexe51
+comp_fir_complexe51 : li %46, 4 --> comp_fir_complexe50
+comp_fir_complexe50 : mulo %45, %12, %46 --> comp_fir_complexe49
+comp_fir_complexe49 : add %96, %3, %45 --> comp_fir_complexe139
+comp_fir_complexe139: lw %44, 0(%96) --> comp_fir_complexe48
+comp_fir_complexe48 : mulo %43, %9, %44 --> comp_fir_complexe47
+comp_fir_complexe47 : sub %40, %42, %43 --> comp_fir_complexe46
+comp_fir_complexe46 : li %41, 4 --> comp_fir_complexe45
+comp_fir_complexe45 : srav %10, %40, %41 --> comp_fir_complexe44
+comp_fir_complexe44 : emit c17 --> comp_fir_complexe43
+comp_fir_complexe43 : li %39, 4 --> comp_fir_complexe42
+comp_fir_complexe42 : mulo %38, %12, %39 --> comp_fir_complexe41
+comp_fir_complexe41 : add %95, %3, %38 --> comp_fir_complexe138
+comp_fir_complexe138: lw %37, 0(%95) --> comp_fir_complexe40
+comp_fir_complexe40 : mulo %32, %15, %37 --> comp_fir_complexe39
+comp_fir_complexe39 : li %36, 4 --> comp_fir_complexe38
+comp_fir_complexe38 : mulo %35, %12, %36 --> comp_fir_complexe37
+comp_fir_complexe37 : add %94, %2, %35 --> comp_fir_complexe137
+comp_fir_complexe137: lw %34, 0(%94) --> comp_fir_complexe36
+comp_fir_complexe36 : mulo %33, %9, %34 --> comp_fir_complexe35
+comp_fir_complexe35 : add %30, %32, %33 --> comp_fir_complexe34
+comp_fir_complexe34 : li %31, 4 --> comp_fir_complexe33
+comp_fir_complexe33 : srav %14, %30, %31 --> comp_fir_complexe32
+comp_fir_complexe32 : emit c16 --> comp_fir_complexe31
+comp_fir_complexe31 : add %13, %13, %10 --> comp_fir_complexe30
+comp_fir_complexe30 : emit c15 --> comp_fir_complexe29
+comp_fir_complexe29 : add %7, %7, %14 --> comp_fir_complexe28
+comp_fir_complexe28 : emit c14 --> comp_fir_complexe27
+comp_fir_complexe27 : li %29, 1 --> comp_fir_complexe26
+comp_fir_complexe26 : add %27, %16, %29 --> comp_fir_complexe25
+comp_fir_complexe25 : li %28, 16 --> comp_fir_complexe24
+comp_fir_complexe24 : la %93, mod --> comp_fir_complexe136
+comp_fir_complexe136: j --> comp_fir_complexe287
+comp_fir_complexe287: move $a0, %27 --> comp_fir_complexe286
+comp_fir_complexe286: move $a1, %28 --> comp_fir_complexe285
+comp_fir_complexe285: call %93(2) --> comp_fir_complexe284
+comp_fir_complexe284: move %16, $v0 --> comp_fir_complexe23
+comp_fir_complexe23 : emit c21 --> comp_fir_complexe22
+comp_fir_complexe22 : li %26, 1 --> comp_fir_complexe21
+comp_fir_complexe21 : add %12, %12, %26 --> comp_fir_complexe20
+comp_fir_complexe121: emit c35 --> comp_fir_complexe120
+comp_fir_complexe120: li %80, 0 --> comp_fir_complexe119
+comp_fir_complexe119: move %81, $sp --> comp_fir_complexe279
+comp_fir_complexe279: move %81, %81 --> comp_fir_complexe118
+comp_fir_complexe118: li %83, 4 --> comp_fir_complexe117
+comp_fir_complexe117: mulo %82, %8, %83 --> comp_fir_complexe116
+comp_fir_complexe116: add %90, %81, %82 --> comp_fir_complexe133
+comp_fir_complexe133: sw %80, 0(%90) --> comp_fir_complexe115
+comp_fir_complexe115: emit c34 --> comp_fir_complexe114
+comp_fir_complexe114: li %76, 0 --> comp_fir_complexe113
+comp_fir_complexe113: move %77, $sp --> comp_fir_complexe278
+comp_fir_complexe278: addi %77, %77, 64 --> comp_fir_complexe112
+comp_fir_complexe112: li %79, 4 --> comp_fir_complexe111
+comp_fir_complexe111: mulo %78, %8, %79 --> comp_fir_complexe110
+comp_fir_complexe110: add %89, %77, %78 --> comp_fir_complexe132
+comp_fir_complexe132: sw %76, 0(%89) --> comp_fir_complexe109
+comp_fir_complexe109: emit c36 --> comp_fir_complexe108
+comp_fir_complexe108: li %75, 1 --> comp_fir_complexe107
+comp_fir_complexe107: add %8, %8, %75 --> comp_fir_complexe106
+
+procedure _main(0)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20
+entry main36
+main36: newframe --> main35
+main35: move %20, $ra --> main34
+main34: move %19, $s7 --> main33
+main33: move %18, $s6 --> main32
+main32: move %17, $s5 --> main31
+main31: move %16, $s4 --> main30
+main30: move %15, $s3 --> main29
+main29: move %14, $s2 --> main28
+main28: move %13, $s1 --> main27
+main27: move %12, $s0 --> main26
+main26: li %0, 0 --> main25
+main25: li %2, 0 --> main24
+main24: li %3, 0 --> main23
+main23: li %4, 0 --> main22
+main22: li %5, 0 --> main21
+main21: li %6, 0 --> main20
+main20: li %7, 0 --> main19
+main19: li %8, 0 --> main18
+main18: li %9, 0 --> main17
+main17: li %10, 0 --> main16
+main16: li %11, 0 --> main13
+main13: emit c42 --> main12
+main12: la %10, init --> main14
+main14: j --> main51
+main51: call %10(0) --> main50
+main50: move %9, $v0 --> main11
+main11: emit c41 --> main10
+main10: move %2, $gp --> main49
+main49: move %2, %2 --> main9
+main9 : move %3, $gp --> main65
+main65: addi %3, %3, 64 --> main8
+main8 : move %4, $gp --> main64
+main64: addi %4, %4, 128 --> main7
+main7 : move %5, $gp --> main63
+main63: addi %5, %5, 192 --> main6
+main6 : move %6, $gp --> main62
+main62: addi %6, %6, 256 --> main5
+main5 : move %7, $gp --> main61
+main61: addi %7, %7, 320 --> main4
+main4 : li %8, 16 --> main3
+main3 : la %11, comp_fir_complexe --> main15
+main15: j --> main60
+main60: move $a0, %2 --> main59
+main59: move $a1, %3 --> main58
+main58: move $a2, %4 --> main57
+main57: move $a3, %5 --> main56
+main56: sets out(8), %6 --> main55
+main55: sets out(4), %7 --> main54
+main54: sets out(0), %8 --> main53
+main53: call %11(7) --> main52
+main52: move %0, $v0 --> main2
+main2 : emit c40 --> main1
+main1 : move %1, %0 --> main0
+main0 : j --> main48
+main48: move $v0, %1 --> main47
+main47: move $ra, %20 --> main46
+main46: move $s7, %19 --> main45
+main45: move $s6, %18 --> main44
+main44: move $s5, %17 --> main43
+main43: move $s4, %16 --> main42
+main42: move $s3, %15 --> main41
+main41: move $s2, %14 --> main40
+main40: move $s1, %13 --> main39
+main39: move $s0, %12 --> main38
+main38: delframe --> main37
+main37: jr $ra (xmits $v0)
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 384
+
+procedure init(0)
+var 0
+init97:
+newframe
+c9:
+c8:
+li $a2, 0
+init40:
+li $a0, 0
+c7:
+li $v0, 16
+slt $v0, $a2, $v0
+seq $v0, $v0, $zero
+beq $v0, $a0, init34
+delframe
+jr $ra
+init34:
+c5:
+li $a1, 2
+li $v0, 4
+mulo $a0, $a2, $v0
+move $v0, $gp
+add $v0, $v0, $a0
+sw $a1, 0($v0)
+c4:
+li $a1, 2
+li $v0, 4
+mulo $a0, $a2, $v0
+move $v0, $gp
+add $v0, $v0, $a0
+sw $a1, 64($v0)
+c3:
+li $a1, 2
+li $v0, 4
+mulo $a0, $a2, $v0
+move $v0, $gp
+add $v0, $v0, $a0
+sw $a1, 128($v0)
+c2:
+li $a1, 2
+li $v0, 4
+mulo $a0, $a2, $v0
+move $v0, $gp
+add $v0, $v0, $a0
+sw $a1, 192($v0)
+c1:
+li $a1, 2
+li $v0, 4
+mulo $a0, $a2, $v0
+move $v0, $gp
+add $v0, $v0, $a0
+sw $a1, 256($v0)
+c0:
+li $a1, 2
+li $v0, 4
+mulo $a0, $a2, $v0
+move $v0, $gp
+add $v0, $v0, $a0
+sw $a1, 320($v0)
+c6:
+li $v0, 1
+add $a2, $a2, $v0
+j init40
+
+procedure comp_fir_complexe(7)
+var 188
+comp_fir_complexe265:
+newframe
+sw $ra, 172($sp)
+sw $s7, 168($sp)
+sw $s6, 164($sp)
+sw $s5, 160($sp)
+sw $s4, 156($sp)
+sw $s3, 152($sp)
+sw $s2, 148($sp)
+sw $s1, 144($sp)
+sw $s0, 140($sp)
+sw $a0, 128($sp)
+sw $a1, 132($sp)
+move $s6, $a2
+move $s5, $a3
+lw $v1, 176($sp)
+sw $v1, 136($sp)
+lw $s7, 180($sp)
+lw $s4, 184($sp)
+c39:
+c38:
+li $a1, 0
+comp_fir_complexe127:
+li $a0, 0
+c37:
+li $v0, 16
+slt $v0, $a1, $v0
+seq $v0, $v0, $zero
+beq $v0, $a0, comp_fir_complexe121
+c33:
+li $v0, 0
+c32:
+li $s0, 0
+c31:
+li $s3, 0
+c30:
+c29:
+li $s2, 0
+comp_fir_complexe96:
+li $a1, 0
+c28:
+slt $a0, $s2, $s4
+seq $a0, $a0, $zero
+beq $a0, $a1, comp_fir_complexe91
+c10:
+li $v0, 0
+lw $ra, 172($sp)
+lw $s7, 168($sp)
+lw $s6, 164($sp)
+lw $s5, 160($sp)
+lw $s4, 156($sp)
+lw $s3, 152($sp)
+lw $s2, 148($sp)
+lw $s1, 144($sp)
+lw $s0, 140($sp)
+delframe
+jr $ra
+comp_fir_complexe91:
+c26:
+li $a0, 4
+mulo $a0, $s2, $a0
+lw $v1, 128($sp)
+add $a0, $v1, $a0
+lw $a2, 0($a0)
+move $a1, $sp
+li $a0, 4
+mulo $a0, $v0, $a0
+add $a0, $a1, $a0
+sw $a2, 0($a0)
+c25:
+li $a0, 4
+mulo $a0, $s2, $a0
+lw $v1, 132($sp)
+add $a0, $v1, $a0
+lw $a2, 0($a0)
+move $a1, $sp
+addi $a1, $a1, 64
+li $a0, 4
+mulo $a0, $v0, $a0
+add $a0, $a1, $a0
+sw $a2, 0($a0)
+c24:
+c23:
+li $s1, 0
+comp_fir_complexe72:
+li $a1, 0
+c22:
+li $a0, 16
+slt $a0, $s1, $a0
+seq $a0, $a0, $zero
+beq $a0, $a1, comp_fir_complexe66
+c13:
+li $a0, 1
+add $a0, $v0, $a0
+li $a1, 16
+la $v0, mod
+call $v0
+c12:
+li $a0, 4
+mulo $a0, $s2, $a0
+lw $v1, 136($sp)
+add $a0, $v1, $a0
+sw $s0, 0($a0)
+c11:
+li $a0, 4
+mulo $a0, $s2, $a0
+add $a0, $s7, $a0
+sw $s3, 0($a0)
+c27:
+li $a0, 1
+add $s2, $s2, $a0
+j comp_fir_complexe96
+comp_fir_complexe66:
+c20:
+move $a1, $sp
+li $a0, 4
+mulo $a0, $v0, $a0
+add $a0, $a1, $a0
+lw $a2, 0($a0)
+c19:
+move $a1, $sp
+addi $a1, $a1, 64
+li $a0, 4
+mulo $a0, $v0, $a0
+add $a0, $a1, $a0
+lw $a3, 0($a0)
+c18:
+li $a0, 4
+mulo $a0, $s1, $a0
+add $a0, $s6, $a0
+lw $a0, 0($a0)
+mulo $a1, $a2, $a0
+li $a0, 4
+mulo $a0, $s1, $a0
+add $a0, $s5, $a0
+lw $a0, 0($a0)
+mulo $a0, $a3, $a0
+sub $a1, $a1, $a0
+li $a0, 4
+srav $a1, $a1, $a0
+c17:
+li $a0, 4
+mulo $a0, $s1, $a0
+add $a0, $s5, $a0
+lw $a0, 0($a0)
+mulo $a2, $a2, $a0
+li $a0, 4
+mulo $a0, $s1, $a0
+add $a0, $s6, $a0
+lw $a0, 0($a0)
+mulo $a0, $a3, $a0
+add $a2, $a2, $a0
+li $a0, 4
+srav $a0, $a2, $a0
+c16:
+add $s0, $s0, $a1
+c15:
+add $s3, $s3, $a0
+c14:
+li $a0, 1
+add $a0, $v0, $a0
+li $a1, 16
+la $v0, mod
+call $v0
+c21:
+li $a0, 1
+add $s1, $s1, $a0
+j comp_fir_complexe72
+comp_fir_complexe121:
+c35:
+move $a0, $sp
+li $v0, 4
+mulo $v0, $a1, $v0
+add $v0, $a0, $v0
+sw $zero, 0($v0)
+c34:
+move $a0, $sp
+addi $a0, $a0, 64
+li $v0, 4
+mulo $v0, $a1, $v0
+add $v0, $a0, $v0
+sw $zero, 0($v0)
+c36:
+li $v0, 1
+add $a1, $a1, $v0
+j comp_fir_complexe127
+
+procedure _main(0)
+var 4
+main36:
+newframe
+sw $ra, 0($sp)
+c42:
+la $v0, init
+call $v0
+c41:
+move $a0, $gp
+move $a1, $gp
+addi $a1, $a1, 64
+move $a2, $gp
+addi $a2, $a2, 128
+move $a3, $gp
+addi $a3, $a3, 192
+move $v0, $gp
+addi $v0, $v0, 256
+addi $gp, $gp, 320
+li $t1, 16
+la $t0, comp_fir_complexe
+sw $v0, -12($sp)
+sw $gp, -8($sp)
+sw $t1, -4($sp)
+call $t0
+c40:
+lw $ra, 0($sp)
+delframe
+jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 384
+
+procedure init(0)
+var 0
+entry init97
+init97 : newframe --> init96
+init96 : j --> init95
+init95 : j --> init94
+init94 : j --> init93
+init93 : j --> init92
+init92 : j --> init91
+init91 : j --> init90
+init90 : j --> init89
+init89 : j --> init88
+init88 : j --> init87
+init87 : j --> init86
+init86 : j --> init85
+init85 : j --> init84
+init84 : j --> init83
+init83 : j --> init82
+init82 : j --> init81
+init81 : j --> init80
+init80 : j --> init79
+init79 : j --> init78
+init78 : j --> init77
+init77 : j --> init76
+init76 : j --> init75
+init75 : j --> init74
+init74 : j --> init73
+init73 : j --> init72
+init72 : j --> init71
+init71 : j --> init70
+init70 : j --> init69
+init69 : j --> init68
+init68 : j --> init67
+init67 : j --> init66
+init66 : j --> init65
+init65 : j --> init64
+init64 : j --> init63
+init63 : j --> init62
+init62 : j --> init61
+init61 : j --> init60
+init60 : j --> init59
+init59 : j --> init58
+init58 : j --> init57
+init57 : j --> init43
+init43 : emit c9 --> init42
+init42 : emit c8 --> init41
+init41 : li $a2, 0 --> init1
+init1 : j --> init40
+init40 : li $a0, 0 --> init39
+init39 : emit c7 --> init38
+init38 : li $v0, 16 --> init37
+init37 : slt $v0, $a2, $v0 --> init36
+init36 : j --> init54
+init54 : seq $v0, $v0, $zero --> init35
+init35 : beq $v0, $a0 --> init34, init0
+init0 : j --> init108
+init108: j --> init107
+init107: j --> init106
+init106: j --> init105
+init105: j --> init104
+init104: j --> init103
+init103: j --> init102
+init102: j --> init101
+init101: j --> init100
+init100: j --> init99
+init99 : delframe --> init98
+init98 : jr $ra
+init34 : emit c5 --> init33
+init33 : li $a1, 2 --> init32
+init32 : li $v0, 4 --> init31
+init31 : mulo $a0, $a2, $v0 --> init30
+init30 : move $v0, $gp --> init113
+init113: j --> init53
+init53 : add $v0, $v0, $a0 --> init52
+init52 : lw $a1, 0($v0) --> init29
+init29 : emit c4 --> init28
+init28 : li $a1, 2 --> init27
+init27 : li $v0, 4 --> init26
+init26 : mulo $a0, $a2, $v0 --> init25
+init25 : move $v0, $gp --> init112
+init112: j --> init51
+init51 : add $v0, $v0, $a0 --> init50
+init50 : lw $a1, 64($v0) --> init24
+init24 : emit c3 --> init23
+init23 : li $a1, 2 --> init22
+init22 : li $v0, 4 --> init21
+init21 : mulo $a0, $a2, $v0 --> init20
+init20 : move $v0, $gp --> init111
+init111: j --> init49
+init49 : add $v0, $v0, $a0 --> init48
+init48 : lw $a1, 128($v0) --> init19
+init19 : emit c2 --> init18
+init18 : li $a1, 2 --> init17
+init17 : li $v0, 4 --> init16
+init16 : mulo $a0, $a2, $v0 --> init15
+init15 : move $v0, $gp --> init110
+init110: j --> init47
+init47 : add $v0, $v0, $a0 --> init46
+init46 : lw $a1, 192($v0) --> init14
+init14 : emit c1 --> init13
+init13 : li $a1, 2 --> init12
+init12 : li $v0, 4 --> init11
+init11 : mulo $a0, $a2, $v0 --> init10
+init10 : move $v0, $gp --> init109
+init109: j --> init45
+init45 : add $v0, $v0, $a0 --> init44
+init44 : lw $a1, 256($v0) --> init9
+init9 : emit c0 --> init8
+init8 : li $a1, 2 --> init7
+init7 : li $v0, 4 --> init6
+init6 : mulo $a0, $a2, $v0 --> init5
+init5 : move $v0, $gp --> init114
+init114: j --> init56
+init56 : add $v0, $v0, $a0 --> init55
+init55 : lw $a1, 320($v0) --> init4
+init4 : emit c6 --> init3
+init3 : li $v0, 1 --> init2
+init2 : add $a2, $a2, $v0 --> init1
+
+procedure comp_fir_complexe(7)
+var 188
+entry comp_fir_complexe265
+comp_fir_complexe265: newframe --> comp_fir_complexe264
+comp_fir_complexe264: lw $ra, 172($sp) --> comp_fir_complexe263
+comp_fir_complexe263: lw $s7, 168($sp) --> comp_fir_complexe262
+comp_fir_complexe262: lw $s6, 164($sp) --> comp_fir_complexe261
+comp_fir_complexe261: lw $s5, 160($sp) --> comp_fir_complexe260
+comp_fir_complexe260: lw $s4, 156($sp) --> comp_fir_complexe259
+comp_fir_complexe259: lw $s3, 152($sp) --> comp_fir_complexe258
+comp_fir_complexe258: lw $s2, 148($sp) --> comp_fir_complexe257
+comp_fir_complexe257: lw $s1, 144($sp) --> comp_fir_complexe256
+comp_fir_complexe256: lw $s0, 140($sp) --> comp_fir_complexe255
+comp_fir_complexe255: lw $a0, 128($sp) --> comp_fir_complexe254
+comp_fir_complexe254: lw $a1, 132($sp) --> comp_fir_complexe253
+comp_fir_complexe253: move $s6, $a2 --> comp_fir_complexe252
+comp_fir_complexe252: move $s5, $a3 --> comp_fir_complexe251
+comp_fir_complexe251: lw $v1, 176($sp) --> comp_fir_complexe293
+comp_fir_complexe293: lw $v1, 136($sp) --> comp_fir_complexe250
+comp_fir_complexe250: lw $s7, 180($sp) --> comp_fir_complexe249
+comp_fir_complexe249: lw $s4, 184($sp) --> comp_fir_complexe248
+comp_fir_complexe248: j --> comp_fir_complexe247
+comp_fir_complexe247: j --> comp_fir_complexe246
+comp_fir_complexe246: j --> comp_fir_complexe245
+comp_fir_complexe245: j --> comp_fir_complexe244
+comp_fir_complexe244: j --> comp_fir_complexe243
+comp_fir_complexe243: j --> comp_fir_complexe242
+comp_fir_complexe242: j --> comp_fir_complexe241
+comp_fir_complexe241: j --> comp_fir_complexe240
+comp_fir_complexe240: j --> comp_fir_complexe239
+comp_fir_complexe239: j --> comp_fir_complexe238
+comp_fir_complexe238: j --> comp_fir_complexe237
+comp_fir_complexe237: j --> comp_fir_complexe236
+comp_fir_complexe236: j --> comp_fir_complexe235
+comp_fir_complexe235: j --> comp_fir_complexe234
+comp_fir_complexe234: j --> comp_fir_complexe233
+comp_fir_complexe233: j --> comp_fir_complexe232
+comp_fir_complexe232: j --> comp_fir_complexe231
+comp_fir_complexe231: j --> comp_fir_complexe230
+comp_fir_complexe230: j --> comp_fir_complexe229
+comp_fir_complexe229: j --> comp_fir_complexe228
+comp_fir_complexe228: j --> comp_fir_complexe227
+comp_fir_complexe227: j --> comp_fir_complexe226
+comp_fir_complexe226: j --> comp_fir_complexe225
+comp_fir_complexe225: j --> comp_fir_complexe224
+comp_fir_complexe224: j --> comp_fir_complexe223
+comp_fir_complexe223: j --> comp_fir_complexe222
+comp_fir_complexe222: j --> comp_fir_complexe221
+comp_fir_complexe221: j --> comp_fir_complexe220
+comp_fir_complexe220: j --> comp_fir_complexe219
+comp_fir_complexe219: j --> comp_fir_complexe218
+comp_fir_complexe218: j --> comp_fir_complexe217
+comp_fir_complexe217: j --> comp_fir_complexe216
+comp_fir_complexe216: j --> comp_fir_complexe215
+comp_fir_complexe215: j --> comp_fir_complexe214
+comp_fir_complexe214: j --> comp_fir_complexe213
+comp_fir_complexe213: j --> comp_fir_complexe212
+comp_fir_complexe212: j --> comp_fir_complexe211
+comp_fir_complexe211: j --> comp_fir_complexe210
+comp_fir_complexe210: j --> comp_fir_complexe209
+comp_fir_complexe209: j --> comp_fir_complexe208
+comp_fir_complexe208: j --> comp_fir_complexe207
+comp_fir_complexe207: j --> comp_fir_complexe206
+comp_fir_complexe206: j --> comp_fir_complexe205
+comp_fir_complexe205: j --> comp_fir_complexe204
+comp_fir_complexe204: j --> comp_fir_complexe203
+comp_fir_complexe203: j --> comp_fir_complexe202
+comp_fir_complexe202: j --> comp_fir_complexe201
+comp_fir_complexe201: j --> comp_fir_complexe200
+comp_fir_complexe200: j --> comp_fir_complexe199
+comp_fir_complexe199: j --> comp_fir_complexe198
+comp_fir_complexe198: j --> comp_fir_complexe197
+comp_fir_complexe197: j --> comp_fir_complexe196
+comp_fir_complexe196: j --> comp_fir_complexe195
+comp_fir_complexe195: j --> comp_fir_complexe194
+comp_fir_complexe194: j --> comp_fir_complexe193
+comp_fir_complexe193: j --> comp_fir_complexe192
+comp_fir_complexe192: j --> comp_fir_complexe191
+comp_fir_complexe191: j --> comp_fir_complexe190
+comp_fir_complexe190: j --> comp_fir_complexe189
+comp_fir_complexe189: j --> comp_fir_complexe188
+comp_fir_complexe188: j --> comp_fir_complexe187
+comp_fir_complexe187: j --> comp_fir_complexe186
+comp_fir_complexe186: j --> comp_fir_complexe185
+comp_fir_complexe185: j --> comp_fir_complexe184
+comp_fir_complexe184: j --> comp_fir_complexe183
+comp_fir_complexe183: j --> comp_fir_complexe182
+comp_fir_complexe182: j --> comp_fir_complexe181
+comp_fir_complexe181: j --> comp_fir_complexe180
+comp_fir_complexe180: j --> comp_fir_complexe179
+comp_fir_complexe179: j --> comp_fir_complexe178
+comp_fir_complexe178: j --> comp_fir_complexe177
+comp_fir_complexe177: j --> comp_fir_complexe176
+comp_fir_complexe176: j --> comp_fir_complexe175
+comp_fir_complexe175: j --> comp_fir_complexe174
+comp_fir_complexe174: j --> comp_fir_complexe173
+comp_fir_complexe173: j --> comp_fir_complexe172
+comp_fir_complexe172: j --> comp_fir_complexe171
+comp_fir_complexe171: j --> comp_fir_complexe170
+comp_fir_complexe170: j --> comp_fir_complexe169
+comp_fir_complexe169: j --> comp_fir_complexe168
+comp_fir_complexe168: j --> comp_fir_complexe167
+comp_fir_complexe167: j --> comp_fir_complexe166
+comp_fir_complexe166: j --> comp_fir_complexe165
+comp_fir_complexe165: j --> comp_fir_complexe164
+comp_fir_complexe164: j --> comp_fir_complexe163
+comp_fir_complexe163: j --> comp_fir_complexe162
+comp_fir_complexe162: j --> comp_fir_complexe161
+comp_fir_complexe161: j --> comp_fir_complexe160
+comp_fir_complexe160: j --> comp_fir_complexe159
+comp_fir_complexe159: j --> comp_fir_complexe158
+comp_fir_complexe158: j --> comp_fir_complexe157
+comp_fir_complexe157: j --> comp_fir_complexe156
+comp_fir_complexe156: j --> comp_fir_complexe155
+comp_fir_complexe155: j --> comp_fir_complexe154
+comp_fir_complexe154: j --> comp_fir_complexe153
+comp_fir_complexe153: j --> comp_fir_complexe152
+comp_fir_complexe152: j --> comp_fir_complexe151
+comp_fir_complexe151: j --> comp_fir_complexe150
+comp_fir_complexe150: j --> comp_fir_complexe130
+comp_fir_complexe130: emit c39 --> comp_fir_complexe129
+comp_fir_complexe129: emit c38 --> comp_fir_complexe128
+comp_fir_complexe128: li $a1, 0 --> comp_fir_complexe106
+comp_fir_complexe106: j --> comp_fir_complexe127
+comp_fir_complexe127: li $a0, 0 --> comp_fir_complexe126
+comp_fir_complexe126: emit c37 --> comp_fir_complexe125
+comp_fir_complexe125: li $v0, 16 --> comp_fir_complexe124
+comp_fir_complexe124: slt $v0, $a1, $v0 --> comp_fir_complexe123
+comp_fir_complexe123: j --> comp_fir_complexe134
+comp_fir_complexe134: seq $v0, $v0, $zero --> comp_fir_complexe122
+comp_fir_complexe122: beq $v0, $a0 --> comp_fir_complexe121, comp_fir_complexe105
+comp_fir_complexe105: emit c33 --> comp_fir_complexe104
+comp_fir_complexe104: li $v0, 0 --> comp_fir_complexe103
+comp_fir_complexe103: emit c32 --> comp_fir_complexe102
+comp_fir_complexe102: li $s0, 0 --> comp_fir_complexe101
+comp_fir_complexe101: emit c31 --> comp_fir_complexe100
+comp_fir_complexe100: li $s3, 0 --> comp_fir_complexe99
+comp_fir_complexe99 : emit c30 --> comp_fir_complexe98
+comp_fir_complexe98 : emit c29 --> comp_fir_complexe97
+comp_fir_complexe97 : li $s2, 0 --> comp_fir_complexe3
+comp_fir_complexe3 : j --> comp_fir_complexe96
+comp_fir_complexe96 : li $a1, 0 --> comp_fir_complexe95
+comp_fir_complexe95 : emit c28 --> comp_fir_complexe94
+comp_fir_complexe94 : slt $a0, $s2, $s4 --> comp_fir_complexe93
+comp_fir_complexe93 : j --> comp_fir_complexe149
+comp_fir_complexe149: seq $a0, $a0, $zero --> comp_fir_complexe92
+comp_fir_complexe92 : beq $a0, $a1 --> comp_fir_complexe91, comp_fir_complexe2
+comp_fir_complexe2 : emit c10 --> comp_fir_complexe1
+comp_fir_complexe1 : li $v0, 0 --> comp_fir_complexe0
+comp_fir_complexe0 : j --> comp_fir_complexe277
+comp_fir_complexe277: j --> comp_fir_complexe276
+comp_fir_complexe276: lw $ra, 172($sp) --> comp_fir_complexe275
+comp_fir_complexe275: lw $s7, 168($sp) --> comp_fir_complexe274
+comp_fir_complexe274: lw $s6, 164($sp) --> comp_fir_complexe273
+comp_fir_complexe273: lw $s5, 160($sp) --> comp_fir_complexe272
+comp_fir_complexe272: lw $s4, 156($sp) --> comp_fir_complexe271
+comp_fir_complexe271: lw $s3, 152($sp) --> comp_fir_complexe270
+comp_fir_complexe270: lw $s2, 148($sp) --> comp_fir_complexe269
+comp_fir_complexe269: lw $s1, 144($sp) --> comp_fir_complexe268
+comp_fir_complexe268: lw $s0, 140($sp) --> comp_fir_complexe267
+comp_fir_complexe267: delframe --> comp_fir_complexe266
+comp_fir_complexe266: jr $ra
+comp_fir_complexe91 : emit c26 --> comp_fir_complexe90
+comp_fir_complexe90 : li $a0, 4 --> comp_fir_complexe89
+comp_fir_complexe89 : mulo $a0, $s2, $a0 --> comp_fir_complexe88
+comp_fir_complexe88 : lw $v1, 128($sp) --> comp_fir_complexe295
+comp_fir_complexe295: add $a0, $v1, $a0 --> comp_fir_complexe148
+comp_fir_complexe148: lw $a2, 0($a0) --> comp_fir_complexe87
+comp_fir_complexe87 : move $a1, $sp --> comp_fir_complexe291
+comp_fir_complexe291: j --> comp_fir_complexe86
+comp_fir_complexe86 : li $a0, 4 --> comp_fir_complexe85
+comp_fir_complexe85 : mulo $a0, $v0, $a0 --> comp_fir_complexe84
+comp_fir_complexe84 : add $a0, $a1, $a0 --> comp_fir_complexe147
+comp_fir_complexe147: lw $a2, 0($a0) --> comp_fir_complexe83
+comp_fir_complexe83 : emit c25 --> comp_fir_complexe82
+comp_fir_complexe82 : li $a0, 4 --> comp_fir_complexe81
+comp_fir_complexe81 : mulo $a0, $s2, $a0 --> comp_fir_complexe80
+comp_fir_complexe80 : lw $v1, 132($sp) --> comp_fir_complexe294
+comp_fir_complexe294: add $a0, $v1, $a0 --> comp_fir_complexe146
+comp_fir_complexe146: lw $a2, 0($a0) --> comp_fir_complexe79
+comp_fir_complexe79 : move $a1, $sp --> comp_fir_complexe290
+comp_fir_complexe290: addi $a1, $a1, 64 --> comp_fir_complexe78
+comp_fir_complexe78 : li $a0, 4 --> comp_fir_complexe77
+comp_fir_complexe77 : mulo $a0, $v0, $a0 --> comp_fir_complexe76
+comp_fir_complexe76 : add $a0, $a1, $a0 --> comp_fir_complexe145
+comp_fir_complexe145: lw $a2, 0($a0) --> comp_fir_complexe75
+comp_fir_complexe75 : emit c24 --> comp_fir_complexe74
+comp_fir_complexe74 : emit c23 --> comp_fir_complexe73
+comp_fir_complexe73 : li $s1, 0 --> comp_fir_complexe20
+comp_fir_complexe20 : j --> comp_fir_complexe72
+comp_fir_complexe72 : li $a1, 0 --> comp_fir_complexe71
+comp_fir_complexe71 : emit c22 --> comp_fir_complexe70
+comp_fir_complexe70 : li $a0, 16 --> comp_fir_complexe69
+comp_fir_complexe69 : slt $a0, $s1, $a0 --> comp_fir_complexe68
+comp_fir_complexe68 : j --> comp_fir_complexe143
+comp_fir_complexe143: seq $a0, $a0, $zero --> comp_fir_complexe67
+comp_fir_complexe67 : beq $a0, $a1 --> comp_fir_complexe66, comp_fir_complexe19
+comp_fir_complexe19 : emit c13 --> comp_fir_complexe18
+comp_fir_complexe18 : li $a0, 1 --> comp_fir_complexe17
+comp_fir_complexe17 : add $a0, $v0, $a0 --> comp_fir_complexe16
+comp_fir_complexe16 : li $a1, 16 --> comp_fir_complexe15
+comp_fir_complexe15 : la $v0, mod --> comp_fir_complexe135
+comp_fir_complexe135: j --> comp_fir_complexe283
+comp_fir_complexe283: j --> comp_fir_complexe282
+comp_fir_complexe282: j --> comp_fir_complexe281
+comp_fir_complexe281: call $v0 --> comp_fir_complexe280
+comp_fir_complexe280: j --> comp_fir_complexe14
+comp_fir_complexe14 : emit c12 --> comp_fir_complexe13
+comp_fir_complexe13 : li $a0, 4 --> comp_fir_complexe12
+comp_fir_complexe12 : mulo $a0, $s2, $a0 --> comp_fir_complexe11
+comp_fir_complexe11 : lw $v1, 136($sp) --> comp_fir_complexe292
+comp_fir_complexe292: add $a0, $v1, $a0 --> comp_fir_complexe131
+comp_fir_complexe131: lw $s0, 0($a0) --> comp_fir_complexe10
+comp_fir_complexe10 : emit c11 --> comp_fir_complexe9
+comp_fir_complexe9 : li $a0, 4 --> comp_fir_complexe8
+comp_fir_complexe8 : mulo $a0, $s2, $a0 --> comp_fir_complexe7
+comp_fir_complexe7 : add $a0, $s7, $a0 --> comp_fir_complexe144
+comp_fir_complexe144: lw $s3, 0($a0) --> comp_fir_complexe6
+comp_fir_complexe6 : emit c27 --> comp_fir_complexe5
+comp_fir_complexe5 : li $a0, 1 --> comp_fir_complexe4
+comp_fir_complexe4 : add $s2, $s2, $a0 --> comp_fir_complexe3
+comp_fir_complexe66 : emit c20 --> comp_fir_complexe65
+comp_fir_complexe65 : move $a1, $sp --> comp_fir_complexe289
+comp_fir_complexe289: j --> comp_fir_complexe64
+comp_fir_complexe64 : li $a0, 4 --> comp_fir_complexe63
+comp_fir_complexe63 : mulo $a0, $v0, $a0 --> comp_fir_complexe62
+comp_fir_complexe62 : add $a0, $a1, $a0 --> comp_fir_complexe142
+comp_fir_complexe142: lw $a2, 0($a0) --> comp_fir_complexe61
+comp_fir_complexe61 : emit c19 --> comp_fir_complexe60
+comp_fir_complexe60 : move $a1, $sp --> comp_fir_complexe288
+comp_fir_complexe288: addi $a1, $a1, 64 --> comp_fir_complexe59
+comp_fir_complexe59 : li $a0, 4 --> comp_fir_complexe58
+comp_fir_complexe58 : mulo $a0, $v0, $a0 --> comp_fir_complexe57
+comp_fir_complexe57 : add $a0, $a1, $a0 --> comp_fir_complexe141
+comp_fir_complexe141: lw $a3, 0($a0) --> comp_fir_complexe56
+comp_fir_complexe56 : emit c18 --> comp_fir_complexe55
+comp_fir_complexe55 : li $a0, 4 --> comp_fir_complexe54
+comp_fir_complexe54 : mulo $a0, $s1, $a0 --> comp_fir_complexe53
+comp_fir_complexe53 : add $a0, $s6, $a0 --> comp_fir_complexe140
+comp_fir_complexe140: lw $a0, 0($a0) --> comp_fir_complexe52
+comp_fir_complexe52 : mulo $a1, $a2, $a0 --> comp_fir_complexe51
+comp_fir_complexe51 : li $a0, 4 --> comp_fir_complexe50
+comp_fir_complexe50 : mulo $a0, $s1, $a0 --> comp_fir_complexe49
+comp_fir_complexe49 : add $a0, $s5, $a0 --> comp_fir_complexe139
+comp_fir_complexe139: lw $a0, 0($a0) --> comp_fir_complexe48
+comp_fir_complexe48 : mulo $a0, $a3, $a0 --> comp_fir_complexe47
+comp_fir_complexe47 : sub $a1, $a1, $a0 --> comp_fir_complexe46
+comp_fir_complexe46 : li $a0, 4 --> comp_fir_complexe45
+comp_fir_complexe45 : srav $a1, $a1, $a0 --> comp_fir_complexe44
+comp_fir_complexe44 : emit c17 --> comp_fir_complexe43
+comp_fir_complexe43 : li $a0, 4 --> comp_fir_complexe42
+comp_fir_complexe42 : mulo $a0, $s1, $a0 --> comp_fir_complexe41
+comp_fir_complexe41 : add $a0, $s5, $a0 --> comp_fir_complexe138
+comp_fir_complexe138: lw $a0, 0($a0) --> comp_fir_complexe40
+comp_fir_complexe40 : mulo $a2, $a2, $a0 --> comp_fir_complexe39
+comp_fir_complexe39 : li $a0, 4 --> comp_fir_complexe38
+comp_fir_complexe38 : mulo $a0, $s1, $a0 --> comp_fir_complexe37
+comp_fir_complexe37 : add $a0, $s6, $a0 --> comp_fir_complexe137
+comp_fir_complexe137: lw $a0, 0($a0) --> comp_fir_complexe36
+comp_fir_complexe36 : mulo $a0, $a3, $a0 --> comp_fir_complexe35
+comp_fir_complexe35 : add $a2, $a2, $a0 --> comp_fir_complexe34
+comp_fir_complexe34 : li $a0, 4 --> comp_fir_complexe33
+comp_fir_complexe33 : srav $a0, $a2, $a0 --> comp_fir_complexe32
+comp_fir_complexe32 : emit c16 --> comp_fir_complexe31
+comp_fir_complexe31 : add $s0, $s0, $a1 --> comp_fir_complexe30
+comp_fir_complexe30 : emit c15 --> comp_fir_complexe29
+comp_fir_complexe29 : add $s3, $s3, $a0 --> comp_fir_complexe28
+comp_fir_complexe28 : emit c14 --> comp_fir_complexe27
+comp_fir_complexe27 : li $a0, 1 --> comp_fir_complexe26
+comp_fir_complexe26 : add $a0, $v0, $a0 --> comp_fir_complexe25
+comp_fir_complexe25 : li $a1, 16 --> comp_fir_complexe24
+comp_fir_complexe24 : la $v0, mod --> comp_fir_complexe136
+comp_fir_complexe136: j --> comp_fir_complexe287
+comp_fir_complexe287: j --> comp_fir_complexe286
+comp_fir_complexe286: j --> comp_fir_complexe285
+comp_fir_complexe285: call $v0 --> comp_fir_complexe284
+comp_fir_complexe284: j --> comp_fir_complexe23
+comp_fir_complexe23 : emit c21 --> comp_fir_complexe22
+comp_fir_complexe22 : li $a0, 1 --> comp_fir_complexe21
+comp_fir_complexe21 : add $s1, $s1, $a0 --> comp_fir_complexe20
+comp_fir_complexe121: emit c35 --> comp_fir_complexe120
+comp_fir_complexe120: j --> comp_fir_complexe119
+comp_fir_complexe119: move $a0, $sp --> comp_fir_complexe279
+comp_fir_complexe279: j --> comp_fir_complexe118
+comp_fir_complexe118: li $v0, 4 --> comp_fir_complexe117
+comp_fir_complexe117: mulo $v0, $a1, $v0 --> comp_fir_complexe116
+comp_fir_complexe116: add $v0, $a0, $v0 --> comp_fir_complexe133
+comp_fir_complexe133: lw $zero, 0($v0) --> comp_fir_complexe115
+comp_fir_complexe115: emit c34 --> comp_fir_complexe114
+comp_fir_complexe114: j --> comp_fir_complexe113
+comp_fir_complexe113: move $a0, $sp --> comp_fir_complexe278
+comp_fir_complexe278: addi $a0, $a0, 64 --> comp_fir_complexe112
+comp_fir_complexe112: li $v0, 4 --> comp_fir_complexe111
+comp_fir_complexe111: mulo $v0, $a1, $v0 --> comp_fir_complexe110
+comp_fir_complexe110: add $v0, $a0, $v0 --> comp_fir_complexe132
+comp_fir_complexe132: lw $zero, 0($v0) --> comp_fir_complexe109
+comp_fir_complexe109: emit c36 --> comp_fir_complexe108
+comp_fir_complexe108: li $v0, 1 --> comp_fir_complexe107
+comp_fir_complexe107: add $a1, $a1, $v0 --> comp_fir_complexe106
+
+procedure _main(0)
+var 4
+entry main36
+main36: newframe --> main35
+main35: lw $ra, 0($sp) --> main34
+main34: j --> main33
+main33: j --> main32
+main32: j --> main31
+main31: j --> main30
+main30: j --> main29
+main29: j --> main28
+main28: j --> main27
+main27: j --> main26
+main26: j --> main25
+main25: j --> main24
+main24: j --> main23
+main23: j --> main22
+main22: j --> main21
+main21: j --> main20
+main20: j --> main19
+main19: j --> main18
+main18: j --> main17
+main17: j --> main16
+main16: j --> main13
+main13: emit c42 --> main12
+main12: la $v0, init --> main14
+main14: j --> main51
+main51: call $v0 --> main50
+main50: j --> main11
+main11: emit c41 --> main10
+main10: move $a0, $gp --> main49
+main49: j --> main9
+main9 : move $a1, $gp --> main65
+main65: addi $a1, $a1, 64 --> main8
+main8 : move $a2, $gp --> main64
+main64: addi $a2, $a2, 128 --> main7
+main7 : move $a3, $gp --> main63
+main63: addi $a3, $a3, 192 --> main6
+main6 : move $v0, $gp --> main62
+main62: addi $v0, $v0, 256 --> main5
+main5 : j --> main61
+main61: addi $gp, $gp, 320 --> main4
+main4 : li $t1, 16 --> main3
+main3 : la $t0, comp_fir_complexe --> main15
+main15: j --> main60
+main60: j --> main59
+main59: j --> main58
+main58: j --> main57
+main57: j --> main56
+main56: lw $v0, -12($sp) --> main55
+main55: lw $gp, -8($sp) --> main54
+main54: lw $t1, -4($sp) --> main53
+main53: call $t0 --> main52
+main52: j --> main2
+main2 : emit c40 --> main1
+main1 : j --> main0
+main0 : j --> main48
+main48: j --> main47
+main47: lw $ra, 0($sp) --> main46
+main46: j --> main45
+main45: j --> main44
+main44: j --> main43
+main43: j --> main42
+main42: j --> main41
+main41: j --> main40
+main40: j --> main39
+main39: j --> main38
+main38: delframe --> main37
+main37: jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 384
+
+procedure init()
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30
+entry init87
+init87: li %0, 0 --> init86
+init86: li %1, 0 --> init85
+init85: li %2, 0 --> init84
+init84: li %3, 0 --> init83
+init83: li %4, 0 --> init82
+init82: li %5, 0 --> init81
+init81: li %6, 0 --> init80
+init80: li %7, 0 --> init79
+init79: li %8, 0 --> init78
+init78: li %9, 0 --> init77
+init77: li %10, 0 --> init76
+init76: li %11, 0 --> init75
+init75: li %12, 0 --> init74
+init74: li %13, 0 --> init73
+init73: li %14, 0 --> init72
+init72: li %15, 0 --> init71
+init71: li %16, 0 --> init70
+init70: li %17, 0 --> init69
+init69: li %18, 0 --> init68
+init68: li %19, 0 --> init67
+init67: li %20, 0 --> init66
+init66: li %21, 0 --> init65
+init65: li %22, 0 --> init64
+init64: li %23, 0 --> init63
+init63: li %24, 0 --> init62
+init62: li %25, 0 --> init61
+init61: li %26, 0 --> init60
+init60: li %27, 0 --> init59
+init59: li %28, 0 --> init58
+init58: li %29, 0 --> init57
+init57: li %30, 0 --> init43
+init43: emit c9 --> init42
+init42: emit c8 --> init41
+init41: li %0, 0 --> init1
+init1 : j --> init40
+init40: li %21, 0 --> init39
+init39: emit c7 --> init38
+init38: li %23, 16 --> init37
+init37: slt %22, %0, %23 --> init36
+init36: li %29, 0 --> init54
+init54: seq %20, %22, %29 --> init35
+init35: beq %20, %21 --> init34, init0
+init0 : return
+init34: emit c5 --> init33
+init33: li %17, 2 --> init32
+init32: li %19, 4 --> init31
+init31: mulo %18, %0, %19 --> init30
+init30: addi %28, GLOBALS, 0 --> init53
+init53: add %28, %28, %18 --> init52
+init52: sw %17, 0(%28) --> init29
+init29: emit c4 --> init28
+init28: li %14, 2 --> init27
+init27: li %16, 4 --> init26
+init26: mulo %15, %0, %16 --> init25
+init25: addi %27, GLOBALS, 0 --> init51
+init51: add %27, %27, %15 --> init50
+init50: sw %14, 64(%27) --> init24
+init24: emit c3 --> init23
+init23: li %11, 2 --> init22
+init22: li %13, 4 --> init21
+init21: mulo %12, %0, %13 --> init20
+init20: addi %26, GLOBALS, 0 --> init49
+init49: add %26, %26, %12 --> init48
+init48: sw %11, 128(%26) --> init19
+init19: emit c2 --> init18
+init18: li %8, 2 --> init17
+init17: li %10, 4 --> init16
+init16: mulo %9, %0, %10 --> init15
+init15: addi %25, GLOBALS, 0 --> init47
+init47: add %25, %25, %9 --> init46
+init46: sw %8, 192(%25) --> init14
+init14: emit c1 --> init13
+init13: li %5, 2 --> init12
+init12: li %7, 4 --> init11
+init11: mulo %6, %0, %7 --> init10
+init10: addi %24, GLOBALS, 0 --> init45
+init45: add %24, %24, %6 --> init44
+init44: sw %5, 256(%24) --> init9
+init9 : emit c0 --> init8
+init8 : li %2, 2 --> init7
+init7 : li %4, 4 --> init6
+init6 : mulo %3, %0, %4 --> init5
+init5 : addi %30, GLOBALS, 0 --> init56
+init56: add %30, %30, %3 --> init55
+init55: sw %2, 320(%30) --> init4
+init4 : emit c6 --> init3
+init3 : li %1, 1 --> init2
+init2 : add %0, %0, %1 --> init1
+
+function comp_fir_complexe(%0; %1; %2; %3; %4; %5; %6) : %17
+stacksize 128
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78, %79, %80, %81, %82, %83,
+ %84, %85, %86, %87, %88, %89, %90,
+ %91, %92, %93, %94, %95, %96, %97,
+ %98, %99, %100, %101, %102, %103, %104,
+ %105, %106
+entry comp_fir_complexe248
+comp_fir_complexe248: li %7, 0 --> comp_fir_complexe247
+comp_fir_complexe247: li %8, 0 --> comp_fir_complexe246
+comp_fir_complexe246: li %9, 0 --> comp_fir_complexe245
+comp_fir_complexe245: li %10, 0 --> comp_fir_complexe244
+comp_fir_complexe244: li %11, 0 --> comp_fir_complexe243
+comp_fir_complexe243: li %12, 0 --> comp_fir_complexe242
+comp_fir_complexe242: li %13, 0 --> comp_fir_complexe241
+comp_fir_complexe241: li %14, 0 --> comp_fir_complexe240
+comp_fir_complexe240: li %15, 0 --> comp_fir_complexe239
+comp_fir_complexe239: li %16, 0 --> comp_fir_complexe238
+comp_fir_complexe238: li %18, 0 --> comp_fir_complexe237
+comp_fir_complexe237: li %19, 0 --> comp_fir_complexe236
+comp_fir_complexe236: li %20, 0 --> comp_fir_complexe235
+comp_fir_complexe235: li %21, 0 --> comp_fir_complexe234
+comp_fir_complexe234: li %22, 0 --> comp_fir_complexe233
+comp_fir_complexe233: li %23, 0 --> comp_fir_complexe232
+comp_fir_complexe232: li %24, 0 --> comp_fir_complexe231
+comp_fir_complexe231: li %25, 0 --> comp_fir_complexe230
+comp_fir_complexe230: li %26, 0 --> comp_fir_complexe229
+comp_fir_complexe229: li %27, 0 --> comp_fir_complexe228
+comp_fir_complexe228: li %28, 0 --> comp_fir_complexe227
+comp_fir_complexe227: li %29, 0 --> comp_fir_complexe226
+comp_fir_complexe226: li %30, 0 --> comp_fir_complexe225
+comp_fir_complexe225: li %31, 0 --> comp_fir_complexe224
+comp_fir_complexe224: li %32, 0 --> comp_fir_complexe223
+comp_fir_complexe223: li %33, 0 --> comp_fir_complexe222
+comp_fir_complexe222: li %34, 0 --> comp_fir_complexe221
+comp_fir_complexe221: li %35, 0 --> comp_fir_complexe220
+comp_fir_complexe220: li %36, 0 --> comp_fir_complexe219
+comp_fir_complexe219: li %37, 0 --> comp_fir_complexe218
+comp_fir_complexe218: li %38, 0 --> comp_fir_complexe217
+comp_fir_complexe217: li %39, 0 --> comp_fir_complexe216
+comp_fir_complexe216: li %40, 0 --> comp_fir_complexe215
+comp_fir_complexe215: li %41, 0 --> comp_fir_complexe214
+comp_fir_complexe214: li %42, 0 --> comp_fir_complexe213
+comp_fir_complexe213: li %43, 0 --> comp_fir_complexe212
+comp_fir_complexe212: li %44, 0 --> comp_fir_complexe211
+comp_fir_complexe211: li %45, 0 --> comp_fir_complexe210
+comp_fir_complexe210: li %46, 0 --> comp_fir_complexe209
+comp_fir_complexe209: li %47, 0 --> comp_fir_complexe208
+comp_fir_complexe208: li %48, 0 --> comp_fir_complexe207
+comp_fir_complexe207: li %49, 0 --> comp_fir_complexe206
+comp_fir_complexe206: li %50, 0 --> comp_fir_complexe205
+comp_fir_complexe205: li %51, 0 --> comp_fir_complexe204
+comp_fir_complexe204: li %52, 0 --> comp_fir_complexe203
+comp_fir_complexe203: li %53, 0 --> comp_fir_complexe202
+comp_fir_complexe202: li %54, 0 --> comp_fir_complexe201
+comp_fir_complexe201: li %55, 0 --> comp_fir_complexe200
+comp_fir_complexe200: li %56, 0 --> comp_fir_complexe199
+comp_fir_complexe199: li %57, 0 --> comp_fir_complexe198
+comp_fir_complexe198: li %58, 0 --> comp_fir_complexe197
+comp_fir_complexe197: li %59, 0 --> comp_fir_complexe196
+comp_fir_complexe196: li %60, 0 --> comp_fir_complexe195
+comp_fir_complexe195: li %61, 0 --> comp_fir_complexe194
+comp_fir_complexe194: li %62, 0 --> comp_fir_complexe193
+comp_fir_complexe193: li %63, 0 --> comp_fir_complexe192
+comp_fir_complexe192: li %64, 0 --> comp_fir_complexe191
+comp_fir_complexe191: li %65, 0 --> comp_fir_complexe190
+comp_fir_complexe190: li %66, 0 --> comp_fir_complexe189
+comp_fir_complexe189: li %67, 0 --> comp_fir_complexe188
+comp_fir_complexe188: li %68, 0 --> comp_fir_complexe187
+comp_fir_complexe187: li %69, 0 --> comp_fir_complexe186
+comp_fir_complexe186: li %70, 0 --> comp_fir_complexe185
+comp_fir_complexe185: li %71, 0 --> comp_fir_complexe184
+comp_fir_complexe184: li %72, 0 --> comp_fir_complexe183
+comp_fir_complexe183: li %73, 0 --> comp_fir_complexe182
+comp_fir_complexe182: li %74, 0 --> comp_fir_complexe181
+comp_fir_complexe181: li %75, 0 --> comp_fir_complexe180
+comp_fir_complexe180: li %76, 0 --> comp_fir_complexe179
+comp_fir_complexe179: li %77, 0 --> comp_fir_complexe178
+comp_fir_complexe178: li %78, 0 --> comp_fir_complexe177
+comp_fir_complexe177: li %79, 0 --> comp_fir_complexe176
+comp_fir_complexe176: li %80, 0 --> comp_fir_complexe175
+comp_fir_complexe175: li %81, 0 --> comp_fir_complexe174
+comp_fir_complexe174: li %82, 0 --> comp_fir_complexe173
+comp_fir_complexe173: li %83, 0 --> comp_fir_complexe172
+comp_fir_complexe172: li %84, 0 --> comp_fir_complexe171
+comp_fir_complexe171: li %85, 0 --> comp_fir_complexe170
+comp_fir_complexe170: li %86, 0 --> comp_fir_complexe169
+comp_fir_complexe169: li %87, 0 --> comp_fir_complexe168
+comp_fir_complexe168: li %88, 0 --> comp_fir_complexe167
+comp_fir_complexe167: li %89, 0 --> comp_fir_complexe166
+comp_fir_complexe166: li %90, 0 --> comp_fir_complexe165
+comp_fir_complexe165: li %91, 0 --> comp_fir_complexe164
+comp_fir_complexe164: li %92, 0 --> comp_fir_complexe163
+comp_fir_complexe163: li %93, 0 --> comp_fir_complexe162
+comp_fir_complexe162: li %94, 0 --> comp_fir_complexe161
+comp_fir_complexe161: li %95, 0 --> comp_fir_complexe160
+comp_fir_complexe160: li %96, 0 --> comp_fir_complexe159
+comp_fir_complexe159: li %97, 0 --> comp_fir_complexe158
+comp_fir_complexe158: li %98, 0 --> comp_fir_complexe157
+comp_fir_complexe157: li %99, 0 --> comp_fir_complexe156
+comp_fir_complexe156: li %100, 0 --> comp_fir_complexe155
+comp_fir_complexe155: li %101, 0 --> comp_fir_complexe154
+comp_fir_complexe154: li %102, 0 --> comp_fir_complexe153
+comp_fir_complexe153: li %103, 0 --> comp_fir_complexe152
+comp_fir_complexe152: li %104, 0 --> comp_fir_complexe151
+comp_fir_complexe151: li %105, 0 --> comp_fir_complexe150
+comp_fir_complexe150: li %106, 0 --> comp_fir_complexe130
+comp_fir_complexe130: emit c39 --> comp_fir_complexe129
+comp_fir_complexe129: emit c38 --> comp_fir_complexe128
+comp_fir_complexe128: li %8, 0 --> comp_fir_complexe106
+comp_fir_complexe106: j --> comp_fir_complexe127
+comp_fir_complexe127: li %85, 0 --> comp_fir_complexe126
+comp_fir_complexe126: emit c37 --> comp_fir_complexe125
+comp_fir_complexe125: li %87, 16 --> comp_fir_complexe124
+comp_fir_complexe124: slt %86, %8, %87 --> comp_fir_complexe123
+comp_fir_complexe123: li %91, 0 --> comp_fir_complexe134
+comp_fir_complexe134: seq %84, %86, %91 --> comp_fir_complexe122
+comp_fir_complexe122: beq %84, %85 --> comp_fir_complexe121, comp_fir_complexe105
+comp_fir_complexe105: emit c33 --> comp_fir_complexe104
+comp_fir_complexe104: li %16, 0 --> comp_fir_complexe103
+comp_fir_complexe103: emit c32 --> comp_fir_complexe102
+comp_fir_complexe102: li %13, 0 --> comp_fir_complexe101
+comp_fir_complexe101: emit c31 --> comp_fir_complexe100
+comp_fir_complexe100: li %7, 0 --> comp_fir_complexe99
+comp_fir_complexe99 : emit c30 --> comp_fir_complexe98
+comp_fir_complexe98 : emit c29 --> comp_fir_complexe97
+comp_fir_complexe97 : li %11, 0 --> comp_fir_complexe3
+comp_fir_complexe3 : j --> comp_fir_complexe96
+comp_fir_complexe96 : li %73, 0 --> comp_fir_complexe95
+comp_fir_complexe95 : emit c28 --> comp_fir_complexe94
+comp_fir_complexe94 : slt %74, %11, %6 --> comp_fir_complexe93
+comp_fir_complexe93 : li %106, 0 --> comp_fir_complexe149
+comp_fir_complexe149: seq %72, %74, %106 --> comp_fir_complexe92
+comp_fir_complexe92 : beq %72, %73 --> comp_fir_complexe91, comp_fir_complexe2
+comp_fir_complexe2 : emit c10 --> comp_fir_complexe1
+comp_fir_complexe1 : li %17, 0 --> comp_fir_complexe0
+comp_fir_complexe0 : return %17
+comp_fir_complexe91 : emit c26 --> comp_fir_complexe90
+comp_fir_complexe90 : li %71, 4 --> comp_fir_complexe89
+comp_fir_complexe89 : mulo %70, %11, %71 --> comp_fir_complexe88
+comp_fir_complexe88 : add %105, %0, %70 --> comp_fir_complexe148
+comp_fir_complexe148: lw %66, 0(%105) --> comp_fir_complexe87
+comp_fir_complexe87 : addi %67, STACK, 0 --> comp_fir_complexe86
+comp_fir_complexe86 : li %69, 4 --> comp_fir_complexe85
+comp_fir_complexe85 : mulo %68, %16, %69 --> comp_fir_complexe84
+comp_fir_complexe84 : add %104, %67, %68 --> comp_fir_complexe147
+comp_fir_complexe147: sw %66, 0(%104) --> comp_fir_complexe83
+comp_fir_complexe83 : emit c25 --> comp_fir_complexe82
+comp_fir_complexe82 : li %65, 4 --> comp_fir_complexe81
+comp_fir_complexe81 : mulo %64, %11, %65 --> comp_fir_complexe80
+comp_fir_complexe80 : add %103, %1, %64 --> comp_fir_complexe146
+comp_fir_complexe146: lw %60, 0(%103) --> comp_fir_complexe79
+comp_fir_complexe79 : addi %61, STACK, 64 --> comp_fir_complexe78
+comp_fir_complexe78 : li %63, 4 --> comp_fir_complexe77
+comp_fir_complexe77 : mulo %62, %16, %63 --> comp_fir_complexe76
+comp_fir_complexe76 : add %102, %61, %62 --> comp_fir_complexe145
+comp_fir_complexe145: sw %60, 0(%102) --> comp_fir_complexe75
+comp_fir_complexe75 : emit c24 --> comp_fir_complexe74
+comp_fir_complexe74 : emit c23 --> comp_fir_complexe73
+comp_fir_complexe73 : li %12, 0 --> comp_fir_complexe20
+comp_fir_complexe20 : j --> comp_fir_complexe72
+comp_fir_complexe72 : li %57, 0 --> comp_fir_complexe71
+comp_fir_complexe71 : emit c22 --> comp_fir_complexe70
+comp_fir_complexe70 : li %59, 16 --> comp_fir_complexe69
+comp_fir_complexe69 : slt %58, %12, %59 --> comp_fir_complexe68
+comp_fir_complexe68 : li %100, 0 --> comp_fir_complexe143
+comp_fir_complexe143: seq %56, %58, %100 --> comp_fir_complexe67
+comp_fir_complexe67 : beq %56, %57 --> comp_fir_complexe66, comp_fir_complexe19
+comp_fir_complexe19 : emit c13 --> comp_fir_complexe18
+comp_fir_complexe18 : li %25, 1 --> comp_fir_complexe17
+comp_fir_complexe17 : add %23, %16, %25 --> comp_fir_complexe16
+comp_fir_complexe16 : li %24, 16 --> comp_fir_complexe15
+comp_fir_complexe15 : la %92, mod --> comp_fir_complexe135
+comp_fir_complexe135: call %16, %92(%23, %24) --> comp_fir_complexe14
+comp_fir_complexe14 : emit c12 --> comp_fir_complexe13
+comp_fir_complexe13 : li %22, 4 --> comp_fir_complexe12
+comp_fir_complexe12 : mulo %21, %11, %22 --> comp_fir_complexe11
+comp_fir_complexe11 : add %88, %4, %21 --> comp_fir_complexe131
+comp_fir_complexe131: sw %13, 0(%88) --> comp_fir_complexe10
+comp_fir_complexe10 : emit c11 --> comp_fir_complexe9
+comp_fir_complexe9 : li %20, 4 --> comp_fir_complexe8
+comp_fir_complexe8 : mulo %19, %11, %20 --> comp_fir_complexe7
+comp_fir_complexe7 : add %101, %5, %19 --> comp_fir_complexe144
+comp_fir_complexe144: sw %7, 0(%101) --> comp_fir_complexe6
+comp_fir_complexe6 : emit c27 --> comp_fir_complexe5
+comp_fir_complexe5 : li %18, 1 --> comp_fir_complexe4
+comp_fir_complexe4 : add %11, %11, %18 --> comp_fir_complexe3
+comp_fir_complexe66 : emit c20 --> comp_fir_complexe65
+comp_fir_complexe65 : addi %53, STACK, 0 --> comp_fir_complexe64
+comp_fir_complexe64 : li %55, 4 --> comp_fir_complexe63
+comp_fir_complexe63 : mulo %54, %16, %55 --> comp_fir_complexe62
+comp_fir_complexe62 : add %99, %53, %54 --> comp_fir_complexe142
+comp_fir_complexe142: lw %15, 0(%99) --> comp_fir_complexe61
+comp_fir_complexe61 : emit c19 --> comp_fir_complexe60
+comp_fir_complexe60 : addi %50, STACK, 64 --> comp_fir_complexe59
+comp_fir_complexe59 : li %52, 4 --> comp_fir_complexe58
+comp_fir_complexe58 : mulo %51, %16, %52 --> comp_fir_complexe57
+comp_fir_complexe57 : add %98, %50, %51 --> comp_fir_complexe141
+comp_fir_complexe141: lw %9, 0(%98) --> comp_fir_complexe56
+comp_fir_complexe56 : emit c18 --> comp_fir_complexe55
+comp_fir_complexe55 : li %49, 4 --> comp_fir_complexe54
+comp_fir_complexe54 : mulo %48, %12, %49 --> comp_fir_complexe53
+comp_fir_complexe53 : add %97, %2, %48 --> comp_fir_complexe140
+comp_fir_complexe140: lw %47, 0(%97) --> comp_fir_complexe52
+comp_fir_complexe52 : mulo %42, %15, %47 --> comp_fir_complexe51
+comp_fir_complexe51 : li %46, 4 --> comp_fir_complexe50
+comp_fir_complexe50 : mulo %45, %12, %46 --> comp_fir_complexe49
+comp_fir_complexe49 : add %96, %3, %45 --> comp_fir_complexe139
+comp_fir_complexe139: lw %44, 0(%96) --> comp_fir_complexe48
+comp_fir_complexe48 : mulo %43, %9, %44 --> comp_fir_complexe47
+comp_fir_complexe47 : sub %40, %42, %43 --> comp_fir_complexe46
+comp_fir_complexe46 : li %41, 4 --> comp_fir_complexe45
+comp_fir_complexe45 : srav %10, %40, %41 --> comp_fir_complexe44
+comp_fir_complexe44 : emit c17 --> comp_fir_complexe43
+comp_fir_complexe43 : li %39, 4 --> comp_fir_complexe42
+comp_fir_complexe42 : mulo %38, %12, %39 --> comp_fir_complexe41
+comp_fir_complexe41 : add %95, %3, %38 --> comp_fir_complexe138
+comp_fir_complexe138: lw %37, 0(%95) --> comp_fir_complexe40
+comp_fir_complexe40 : mulo %32, %15, %37 --> comp_fir_complexe39
+comp_fir_complexe39 : li %36, 4 --> comp_fir_complexe38
+comp_fir_complexe38 : mulo %35, %12, %36 --> comp_fir_complexe37
+comp_fir_complexe37 : add %94, %2, %35 --> comp_fir_complexe137
+comp_fir_complexe137: lw %34, 0(%94) --> comp_fir_complexe36
+comp_fir_complexe36 : mulo %33, %9, %34 --> comp_fir_complexe35
+comp_fir_complexe35 : add %30, %32, %33 --> comp_fir_complexe34
+comp_fir_complexe34 : li %31, 4 --> comp_fir_complexe33
+comp_fir_complexe33 : srav %14, %30, %31 --> comp_fir_complexe32
+comp_fir_complexe32 : emit c16 --> comp_fir_complexe31
+comp_fir_complexe31 : add %13, %13, %10 --> comp_fir_complexe30
+comp_fir_complexe30 : emit c15 --> comp_fir_complexe29
+comp_fir_complexe29 : add %7, %7, %14 --> comp_fir_complexe28
+comp_fir_complexe28 : emit c14 --> comp_fir_complexe27
+comp_fir_complexe27 : li %29, 1 --> comp_fir_complexe26
+comp_fir_complexe26 : add %27, %16, %29 --> comp_fir_complexe25
+comp_fir_complexe25 : li %28, 16 --> comp_fir_complexe24
+comp_fir_complexe24 : la %93, mod --> comp_fir_complexe136
+comp_fir_complexe136: call %16, %93(%27, %28) --> comp_fir_complexe23
+comp_fir_complexe23 : emit c21 --> comp_fir_complexe22
+comp_fir_complexe22 : li %26, 1 --> comp_fir_complexe21
+comp_fir_complexe21 : add %12, %12, %26 --> comp_fir_complexe20
+comp_fir_complexe121: emit c35 --> comp_fir_complexe120
+comp_fir_complexe120: li %80, 0 --> comp_fir_complexe119
+comp_fir_complexe119: addi %81, STACK, 0 --> comp_fir_complexe118
+comp_fir_complexe118: li %83, 4 --> comp_fir_complexe117
+comp_fir_complexe117: mulo %82, %8, %83 --> comp_fir_complexe116
+comp_fir_complexe116: add %90, %81, %82 --> comp_fir_complexe133
+comp_fir_complexe133: sw %80, 0(%90) --> comp_fir_complexe115
+comp_fir_complexe115: emit c34 --> comp_fir_complexe114
+comp_fir_complexe114: li %76, 0 --> comp_fir_complexe113
+comp_fir_complexe113: addi %77, STACK, 64 --> comp_fir_complexe112
+comp_fir_complexe112: li %79, 4 --> comp_fir_complexe111
+comp_fir_complexe111: mulo %78, %8, %79 --> comp_fir_complexe110
+comp_fir_complexe110: add %89, %77, %78 --> comp_fir_complexe132
+comp_fir_complexe132: sw %76, 0(%89) --> comp_fir_complexe109
+comp_fir_complexe109: emit c36 --> comp_fir_complexe108
+comp_fir_complexe108: li %75, 1 --> comp_fir_complexe107
+comp_fir_complexe107: add %8, %8, %75 --> comp_fir_complexe106
+
+function _main() : %1
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11
+entry main26
+main26: li %0, 0 --> main25
+main25: li %2, 0 --> main24
+main24: li %3, 0 --> main23
+main23: li %4, 0 --> main22
+main22: li %5, 0 --> main21
+main21: li %6, 0 --> main20
+main20: li %7, 0 --> main19
+main19: li %8, 0 --> main18
+main18: li %9, 0 --> main17
+main17: li %10, 0 --> main16
+main16: li %11, 0 --> main13
+main13: emit c42 --> main12
+main12: la %10, init --> main14
+main14: call %9, %10() --> main11
+main11: emit c41 --> main10
+main10: addi %2, GLOBALS, 0 --> main9
+main9 : addi %3, GLOBALS, 64 --> main8
+main8 : addi %4, GLOBALS, 128 --> main7
+main7 : addi %5, GLOBALS, 192 --> main6
+main6 : addi %6, GLOBALS, 256 --> main5
+main5 : addi %7, GLOBALS, 320 --> main4
+main4 : li %8, 16 --> main3
+main3 : la %11, comp_fir_complexe --> main15
+main15: call %0, %11(%2, %3, %4, %5, %6, %7, %8) --> main2
+main2 : emit c40 --> main1
+main1 : move %1, %0 --> main0
+main0 : return %1
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program: (main function is "main")
+
+
+ globals:
+ "t1" = {[64]}
+ "t2" = {[64]}
+ "t3" = {[64]}
+ "t4" = {[64]}
+ "t5" = {[64]}
+ "t6" = {[64]}
+
+
+ "__builtin___memcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memmove_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___mempcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memset_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___stpcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strcat_chk": int -> int -> int -> int
+
+
+ "__builtin___strcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strncat_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___strncpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vfprintf_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vprintf_chk": int -> int -> int -> int
+
+
+ "__builtin___vsnprintf_chk": int -> int -> int -> int -> int -> int -> int
+
+
+ "__builtin___vsprintf_chk": int -> int -> int -> int -> int -> int
+
+
+ "__builtin_acos": float -> float
+
+
+ "__builtin_acosf": float -> float
+
+
+ "__builtin_acosl": float -> float
+
+
+ "__builtin_alloca": int -> int
+
+
+ "__builtin_asin": float -> float
+
+
+ "__builtin_asinf": float -> float
+
+
+ "__builtin_asinl": float -> float
+
+
+ "__builtin_atan": float -> float
+
+
+ "__builtin_atanf": float -> float
+
+
+ "__builtin_atanl": float -> float
+
+
+ "__builtin_atan2": float -> float -> float
+
+
+ "__builtin_atan2f": float -> float -> float
+
+
+ "__builtin_atan2l": float -> float -> float
+
+
+ "__builtin_ceil": float -> float
+
+
+ "__builtin_ceilf": float -> float
+
+
+ "__builtin_ceill": float -> float
+
+
+ "__builtin_cos": float -> float
+
+
+ "__builtin_cosf": float -> float
+
+
+ "__builtin_cosl": float -> float
+
+
+ "__builtin_cosh": float -> float
+
+
+ "__builtin_coshf": float -> float
+
+
+ "__builtin_coshl": float -> float
+
+
+ "__builtin_clz": int -> int
+
+
+ "__builtin_clzl": int -> int
+
+
+ "__builtin_clzll": int -> int
+
+
+ "__builtin_constant_p": int -> int
+
+
+ "__builtin_ctz": int -> int
+
+
+ "__builtin_ctzl": int -> int
+
+
+ "__builtin_ctzll": int -> int
+
+
+ "__builtin_exp": float -> float
+
+
+ "__builtin_expf": float -> float
+
+
+ "__builtin_expl": float -> float
+
+
+ "__builtin_expect": int -> int -> int
+
+
+ "__builtin_fabs": float -> float
+
+
+ "__builtin_fabsf": float -> float
+
+
+ "__builtin_fabsl": float -> float
+
+
+ "__builtin_ffs": int -> int
+
+
+ "__builtin_ffsl": int -> int
+
+
+ "__builtin_ffsll": int -> int
+
+
+ "__builtin_frame_address": int -> int
+
+
+ "__builtin_floor": float -> float
+
+
+ "__builtin_floorf": float -> float
+
+
+ "__builtin_floorl": float -> float
+
+
+ "__builtin_huge_val": float
+
+
+ "__builtin_huge_valf": float
+
+
+ "__builtin_huge_vall": float
+
+
+ "__builtin_inf": float
+
+
+ "__builtin_inff": float
+
+
+ "__builtin_infl": float
+
+
+ "__builtin_memcpy": int -> int -> int -> int
+
+
+ "__builtin_mempcpy": int -> int -> int -> int
+
+
+ "__builtin_fmod": float -> float
+
+
+ "__builtin_fmodf": float -> float
+
+
+ "__builtin_fmodl": float -> float
+
+
+ "__builtin_frexp": float -> int -> float
+
+
+ "__builtin_frexpf": float -> int -> float
+
+
+ "__builtin_frexpl": float -> int -> float
+
+
+ "__builtin_ldexp": float -> int -> float
+
+
+ "__builtin_ldexpf": float -> int -> float
+
+
+ "__builtin_ldexpl": float -> int -> float
+
+
+ "__builtin_log": float -> float
+
+
+ "__builtin_logf": float -> float
+
+
+ "__builtin_logl": float -> float
+
+
+ "__builtin_log10": float -> float
+
+
+ "__builtin_log10f": float -> float
+
+
+ "__builtin_log10l": float -> float
+
+
+ "__builtin_modff": float -> int -> float
+
+
+ "__builtin_modfl": float -> int -> float
+
+
+ "__builtin_nan": int -> float
+
+
+ "__builtin_nanf": int -> float
+
+
+ "__builtin_nanl": int -> float
+
+
+ "__builtin_nans": int -> float
+
+
+ "__builtin_nansf": int -> float
+
+
+ "__builtin_nansl": int -> float
+
+
+ "__builtin_next_arg": int
+
+
+ "__builtin_object_size": int -> int -> int
+
+
+ "__builtin_parity": int -> int
+
+
+ "__builtin_parityl": int -> int
+
+
+ "__builtin_parityll": int -> int
+
+
+ "__builtin_popcount": int -> int
+
+
+ "__builtin_popcountl": int -> int
+
+
+ "__builtin_popcountll": int -> int
+
+
+ "__builtin_powi": float -> int -> float
+
+
+ "__builtin_powif": float -> int -> float
+
+
+ "__builtin_powil": float -> int -> float
+
+
+ "__builtin_return": int -> void
+
+
+ "__builtin_return_address": int -> int
+
+
+ "__builtin_sin": float -> float
+
+
+ "__builtin_sinf": float -> float
+
+
+ "__builtin_sinl": float -> float
+
+
+ "__builtin_sinh": float -> float
+
+
+ "__builtin_sinhf": float -> float
+
+
+ "__builtin_sinhl": float -> float
+
+
+ "__builtin_sqrt": float -> float
+
+
+ "__builtin_sqrtf": float -> float
+
+
+ "__builtin_sqrtl": float -> float
+
+
+ "__builtin_stpcpy": int -> int -> int
+
+
+ "__builtin_strchr": int -> int -> int
+
+
+ "__builtin_strcmp": int -> int -> int
+
+
+ "__builtin_strcpy": int -> int -> int
+
+
+ "__builtin_strcspn": int -> int -> int
+
+
+ "__builtin_strncat": int -> int -> int -> int
+
+
+ "__builtin_strncmp": int -> int -> int -> int
+
+
+ "__builtin_strncpy": int -> int -> int -> int
+
+
+ "__builtin_strspn": int -> int -> int
+
+
+ "__builtin_strpbrk": int -> int -> int
+
+
+ "__builtin_types_compatible_p": int -> int -> int
+
+
+ "__builtin_tan": float -> float
+
+
+ "__builtin_tanf": float -> float
+
+
+ "__builtin_tanl": float -> float
+
+
+ "__builtin_tanh": float -> float
+
+
+ "__builtin_tanhf": float -> float
+
+
+ "__builtin_tanhl": float -> float
+
+
+ "__builtin_va_end": int -> void
+
+
+ "__builtin_varargs_start": int -> void
+
+
+ "__builtin_va_start": int -> int -> void
+
+
+ "__builtin_stdarg_start": int -> void
+
+
+ "__builtin_va_arg": int -> int -> void
+
+
+ "__builtin_va_copy": int -> int -> void
+
+
+ "init"(): void
+ locals: %0, %1, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23
+ stacksize: 0
+ entry: init43
+ exit: init0
+
+ init9: emit c0 --> init8
+ init8: imm_int 2, %2, --> init7
+ init7: imm_int 4, %4, --> init6
+ init6: mul %3, %0, %4 --> init5
+ init5: store int32, add, 0("t6"), %3, %2 --> init4
+ init43: emit c9 --> init42
+ init42: emit c8 --> init41
+ init41: imm_int 0, %0, --> init1
+ init40: imm_int 0, %21, --> init39
+ init4: emit c6 --> init3
+ init39: emit c7 --> init38
+ init38: imm_int 16, %23, --> init37
+ init37: lt %22, %0, %23 --> init36
+ init36: notbool %20, %22 --> init35
+ init35: eq %20, %21 --> init34, init0
+ init34: emit c5 --> init33
+ init33: imm_int 2, %17, --> init32
+ init32: imm_int 4, %19, --> init31
+ init31: mul %18, %0, %19 --> init30
+ init30: store int32, add, 0("t1"), %18, %17 --> init29
+ init3: imm_int 1, %1, --> init2
+ init29: emit c4 --> init28
+ init28: imm_int 2, %14, --> init27
+ init27: imm_int 4, %16, --> init26
+ init26: mul %15, %0, %16 --> init25
+ init25: store int32, add, 0("t2"), %15, %14 --> init24
+ init24: emit c3 --> init23
+ init23: imm_int 2, %11, --> init22
+ init22: imm_int 4, %13, --> init21
+ init21: mul %12, %0, %13 --> init20
+ init20: store int32, add, 0("t3"), %12, %11 --> init19
+ init2: add %0, %0, %1 --> init1
+ init19: emit c2 --> init18
+ init18: imm_int 2, %8, --> init17
+ init17: imm_int 4, %10, --> init16
+ init16: mul %9, %0, %10 --> init15
+ init15: store int32, add, 0("t4"), %9, %8 --> init14
+ init14: emit c1 --> init13
+ init13: imm_int 2, %5, --> init12
+ init12: imm_int 4, %7, --> init11
+ init11: mul %6, %0, %7 --> init10
+ init10: store int32, add, 0("t5"), %6, %5 --> init9
+ init1: --> init40
+ init0: return
+
+
+ "comp_fir_complexe"(%0, %1, %2, %3, %4, %5, %6): int -> int -> int -> int -> int -> int -> int -> int
+ locals: %17, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31, %32, %33, %34, %35, %36, %37, %38, %39, %40, %41, %42, %43, %44, %45, %46, %47, %48, %49, %50, %51, %52, %53, %54, %55, %56, %57, %58, %59, %60, %61, %62, %63, %64, %65, %66, %67, %68, %69, %70, %71, %72, %73, %74, %75, %76, %77, %78, %79, %80, %81, %82, %83, %84, %85, %86, %87
+ result: %17
+ stacksize: 128
+ entry: comp_fir_complexe130
+ exit: comp_fir_complexe0
+
+ comp_fir_complexe99: emit c30 --> comp_fir_complexe98
+ comp_fir_complexe98: emit c29 --> comp_fir_complexe97
+ comp_fir_complexe97: imm_int 0, %11, --> comp_fir_complexe3
+ comp_fir_complexe96: imm_int 0, %73, --> comp_fir_complexe95
+ comp_fir_complexe95: emit c28 --> comp_fir_complexe94
+ comp_fir_complexe94: lt %74, %11, %6 --> comp_fir_complexe93
+ comp_fir_complexe93: notbool %72, %74 --> comp_fir_complexe92
+ comp_fir_complexe92: eq %72, %73 --> comp_fir_complexe91, comp_fir_complexe2
+ comp_fir_complexe91: emit c26 --> comp_fir_complexe90
+ comp_fir_complexe90: imm_int 4, %71, --> comp_fir_complexe89
+ comp_fir_complexe9: imm_int 4, %20, --> comp_fir_complexe8
+ comp_fir_complexe89: mul %70, %11, %71 --> comp_fir_complexe88
+ comp_fir_complexe88: load int32, add, %0, %70, %66 --> comp_fir_complexe87
+ comp_fir_complexe87: imm_addr 0($sp), %67, --> comp_fir_complexe86
+ comp_fir_complexe86: imm_int 4, %69, --> comp_fir_complexe85
+ comp_fir_complexe85: mul %68, %16, %69 --> comp_fir_complexe84
+ comp_fir_complexe84: store int32, add, %67, %68, %66 --> comp_fir_complexe83
+ comp_fir_complexe83: emit c25 --> comp_fir_complexe82
+ comp_fir_complexe82: imm_int 4, %65, --> comp_fir_complexe81
+ comp_fir_complexe81: mul %64, %11, %65 --> comp_fir_complexe80
+ comp_fir_complexe80: load int32, add, %1, %64, %60 --> comp_fir_complexe79
+ comp_fir_complexe8: mul %19, %11, %20 --> comp_fir_complexe7
+ comp_fir_complexe79: imm_addr 64($sp), %61, --> comp_fir_complexe78
+ comp_fir_complexe78: imm_int 4, %63, --> comp_fir_complexe77
+ comp_fir_complexe77: mul %62, %16, %63 --> comp_fir_complexe76
+ comp_fir_complexe76: store int32, add, %61, %62, %60 --> comp_fir_complexe75
+ comp_fir_complexe75: emit c24 --> comp_fir_complexe74
+ comp_fir_complexe74: emit c23 --> comp_fir_complexe73
+ comp_fir_complexe73: imm_int 0, %12, --> comp_fir_complexe20
+ comp_fir_complexe72: imm_int 0, %57, --> comp_fir_complexe71
+ comp_fir_complexe71: emit c22 --> comp_fir_complexe70
+ comp_fir_complexe70: imm_int 16, %59, --> comp_fir_complexe69
+ comp_fir_complexe7: store int32, add, %5, %19, %7 --> comp_fir_complexe6
+ comp_fir_complexe69: lt %58, %12, %59 --> comp_fir_complexe68
+ comp_fir_complexe68: notbool %56, %58 --> comp_fir_complexe67
+ comp_fir_complexe67: eq %56, %57 --> comp_fir_complexe66, comp_fir_complexe19
+ comp_fir_complexe66: emit c20 --> comp_fir_complexe65
+ comp_fir_complexe65: imm_addr 0($sp), %53, --> comp_fir_complexe64
+ comp_fir_complexe64: imm_int 4, %55, --> comp_fir_complexe63
+ comp_fir_complexe63: mul %54, %16, %55 --> comp_fir_complexe62
+ comp_fir_complexe62: load int32, add, %53, %54, %15 --> comp_fir_complexe61
+ comp_fir_complexe61: emit c19 --> comp_fir_complexe60
+ comp_fir_complexe60: imm_addr 64($sp), %50, --> comp_fir_complexe59
+ comp_fir_complexe6: emit c27 --> comp_fir_complexe5
+ comp_fir_complexe59: imm_int 4, %52, --> comp_fir_complexe58
+ comp_fir_complexe58: mul %51, %16, %52 --> comp_fir_complexe57
+ comp_fir_complexe57: load int32, add, %50, %51, %9 --> comp_fir_complexe56
+ comp_fir_complexe56: emit c18 --> comp_fir_complexe55
+ comp_fir_complexe55: imm_int 4, %49, --> comp_fir_complexe54
+ comp_fir_complexe54: mul %48, %12, %49 --> comp_fir_complexe53
+ comp_fir_complexe53: load int32, add, %2, %48, %47 --> comp_fir_complexe52
+ comp_fir_complexe52: mul %42, %15, %47 --> comp_fir_complexe51
+ comp_fir_complexe51: imm_int 4, %46, --> comp_fir_complexe50
+ comp_fir_complexe50: mul %45, %12, %46 --> comp_fir_complexe49
+ comp_fir_complexe5: imm_int 1, %18, --> comp_fir_complexe4
+ comp_fir_complexe49: load int32, add, %3, %45, %44 --> comp_fir_complexe48
+ comp_fir_complexe48: mul %43, %9, %44 --> comp_fir_complexe47
+ comp_fir_complexe47: sub %40, %42, %43 --> comp_fir_complexe46
+ comp_fir_complexe46: imm_int 4, %41, --> comp_fir_complexe45
+ comp_fir_complexe45: shr %10, %40, %41 --> comp_fir_complexe44
+ comp_fir_complexe44: emit c17 --> comp_fir_complexe43
+ comp_fir_complexe43: imm_int 4, %39, --> comp_fir_complexe42
+ comp_fir_complexe42: mul %38, %12, %39 --> comp_fir_complexe41
+ comp_fir_complexe41: load int32, add, %3, %38, %37 --> comp_fir_complexe40
+ comp_fir_complexe40: mul %32, %15, %37 --> comp_fir_complexe39
+ comp_fir_complexe4: add %11, %11, %18 --> comp_fir_complexe3
+ comp_fir_complexe39: imm_int 4, %36, --> comp_fir_complexe38
+ comp_fir_complexe38: mul %35, %12, %36 --> comp_fir_complexe37
+ comp_fir_complexe37: load int32, add, %2, %35, %34 --> comp_fir_complexe36
+ comp_fir_complexe36: mul %33, %9, %34 --> comp_fir_complexe35
+ comp_fir_complexe35: add %30, %32, %33 --> comp_fir_complexe34
+ comp_fir_complexe34: imm_int 4, %31, --> comp_fir_complexe33
+ comp_fir_complexe33: shr %14, %30, %31 --> comp_fir_complexe32
+ comp_fir_complexe32: emit c16 --> comp_fir_complexe31
+ comp_fir_complexe31: add %13, %13, %10 --> comp_fir_complexe30
+ comp_fir_complexe30: emit c15 --> comp_fir_complexe29
+ comp_fir_complexe3: --> comp_fir_complexe96
+ comp_fir_complexe29: add %7, %7, %14 --> comp_fir_complexe28
+ comp_fir_complexe28: emit c14 --> comp_fir_complexe27
+ comp_fir_complexe27: imm_int 1, %29, --> comp_fir_complexe26
+ comp_fir_complexe26: add %27, %16, %29 --> comp_fir_complexe25
+ comp_fir_complexe25: imm_int 16, %28, --> comp_fir_complexe24
+ comp_fir_complexe24: mod %16, %27, %28 --> comp_fir_complexe23
+ comp_fir_complexe23: emit c21 --> comp_fir_complexe22
+ comp_fir_complexe22: imm_int 1, %26, --> comp_fir_complexe21
+ comp_fir_complexe21: add %12, %12, %26 --> comp_fir_complexe20
+ comp_fir_complexe20: --> comp_fir_complexe72
+ comp_fir_complexe2: emit c10 --> comp_fir_complexe1
+ comp_fir_complexe19: emit c13 --> comp_fir_complexe18
+ comp_fir_complexe18: imm_int 1, %25, --> comp_fir_complexe17
+ comp_fir_complexe17: add %23, %16, %25 --> comp_fir_complexe16
+ comp_fir_complexe16: imm_int 16, %24, --> comp_fir_complexe15
+ comp_fir_complexe15: mod %16, %23, %24 --> comp_fir_complexe14
+ comp_fir_complexe14: emit c12 --> comp_fir_complexe13
+ comp_fir_complexe130: emit c39 --> comp_fir_complexe129
+ comp_fir_complexe13: imm_int 4, %22, --> comp_fir_complexe12
+ comp_fir_complexe129: emit c38 --> comp_fir_complexe128
+ comp_fir_complexe128: imm_int 0, %8, --> comp_fir_complexe106
+ comp_fir_complexe127: imm_int 0, %85, --> comp_fir_complexe126
+ comp_fir_complexe126: emit c37 --> comp_fir_complexe125
+ comp_fir_complexe125: imm_int 16, %87, --> comp_fir_complexe124
+ comp_fir_complexe124: lt %86, %8, %87 --> comp_fir_complexe123
+ comp_fir_complexe123: notbool %84, %86 --> comp_fir_complexe122
+ comp_fir_complexe122: eq %84, %85 --> comp_fir_complexe121, comp_fir_complexe105
+ comp_fir_complexe121: emit c35 --> comp_fir_complexe120
+ comp_fir_complexe120: imm_int 0, %80, --> comp_fir_complexe119
+ comp_fir_complexe12: mul %21, %11, %22 --> comp_fir_complexe11
+ comp_fir_complexe119: imm_addr 0($sp), %81, --> comp_fir_complexe118
+ comp_fir_complexe118: imm_int 4, %83, --> comp_fir_complexe117
+ comp_fir_complexe117: mul %82, %8, %83 --> comp_fir_complexe116
+ comp_fir_complexe116: store int32, add, %81, %82, %80 --> comp_fir_complexe115
+ comp_fir_complexe115: emit c34 --> comp_fir_complexe114
+ comp_fir_complexe114: imm_int 0, %76, --> comp_fir_complexe113
+ comp_fir_complexe113: imm_addr 64($sp), %77, --> comp_fir_complexe112
+ comp_fir_complexe112: imm_int 4, %79, --> comp_fir_complexe111
+ comp_fir_complexe111: mul %78, %8, %79 --> comp_fir_complexe110
+ comp_fir_complexe110: store int32, add, %77, %78, %76 --> comp_fir_complexe109
+ comp_fir_complexe11: store int32, add, %4, %21, %13 --> comp_fir_complexe10
+ comp_fir_complexe109: emit c36 --> comp_fir_complexe108
+ comp_fir_complexe108: imm_int 1, %75, --> comp_fir_complexe107
+ comp_fir_complexe107: add %8, %8, %75 --> comp_fir_complexe106
+ comp_fir_complexe106: --> comp_fir_complexe127
+ comp_fir_complexe105: emit c33 --> comp_fir_complexe104
+ comp_fir_complexe104: imm_int 0, %16, --> comp_fir_complexe103
+ comp_fir_complexe103: emit c32 --> comp_fir_complexe102
+ comp_fir_complexe102: imm_int 0, %13, --> comp_fir_complexe101
+ comp_fir_complexe101: emit c31 --> comp_fir_complexe100
+ comp_fir_complexe100: imm_int 0, %7, --> comp_fir_complexe99
+ comp_fir_complexe10: emit c11 --> comp_fir_complexe9
+ comp_fir_complexe1: imm_int 0, %17, --> comp_fir_complexe0
+ comp_fir_complexe0: return %17
+
+
+ "main"(): int
+ locals: %1, %0, %2, %3, %4, %5, %6, %7, %8, %9
+ result: %1
+ stacksize: 0
+ entry: main13
+ exit: main0
+
+ main9: imm_addr "t2", %3, --> main8
+ main8: imm_addr "t3", %4, --> main7
+ main7: imm_addr "t4", %5, --> main6
+ main6: imm_addr "t5", %6, --> main5
+ main5: imm_addr "t6", %7, --> main4
+ main4: imm_int 16, %8, --> main3
+ main3: call "comp_fir_complexe", %2, %3, %4, %5, %6, %7, %8, %0: int -> int -> int -> int -> int -> int -> int -> int --> main2
+ main2: emit c40 --> main1
+ main13: emit c42 --> main12
+ main12: call "init", , %9: void --> main11
+ main11: emit c41 --> main10
+ main10: imm_addr "t1", %2, --> main9
+ main1: mov %1, %0 --> main0
+ main0: return %1
+
+
--- /dev/null
+int t1[16];\r
+int t2[16];\r
+int t3[16];\r
+int t4[16];\r
+int t5[16];\r
+int t6[16];\r
+\r
+void init(){\r
+ int i;\r
+ for(i=0;i<16;i++){\r
+ t1[i] = 2;\r
+ t2[i] = 2;\r
+ t3[i] = 2;\r
+ t4[i] = 2;\r
+ t5[i] = 2;\r
+ t6[i] = 2;\r
+ }\r
+}\r
+\r
+int comp_fir_complexe(int in_re[], int in_im[], int c_re[], int c_im[], int out_re[], int out_im[], int size) {\r
+ int i,j,res_re,res_im,tmp_im,tmp_re,tmp_x_re,tmp_x_im;\r
+ int x_re[16];\r
+ int x_im[16];\r
+ int ii;\r
+ for(ii=0;ii<16;ii++){x_re[ii]=0;x_im[ii]=0;}\r
+ int adx = 0;\r
+ res_re = 0; res_im = 0;\r
+ for (j=0;j<size;j=j+1) {\r
+ x_re[adx]=in_re[j];\r
+ x_im[adx]=in_im[j];\r
+\r
+ for(i=0;i<16;i=i+1){\r
+ tmp_x_re = x_re[adx];\r
+ tmp_x_im = x_im[adx];\r
+ tmp_re = (tmp_x_re*c_re[i]-tmp_x_im*c_im[i])>>4;\r
+ tmp_im = (tmp_x_re*c_im[i]+tmp_x_im*c_re[i])>>4;\r
+ res_re = res_re + tmp_re;\r
+ res_im = res_im + tmp_im;\r
+ adx=(adx+1)%16;\r
+ }\r
+\r
+ adx=(adx+1)%16;\r
+\r
+ out_re[j]=res_re;\r
+ out_im[j]=res_im;\r
+ }\r
+ return 0;\r
+}\r
+int main(){\r
+ init();\r
+ return comp_fir_complexe(t1,t2,t3,t4,t5,t6,16);\r
+}\r
--- /dev/null
+int t1[16];\r
+int t2[16];\r
+int t3[16];\r
+int t4[16];\r
+int t5[16];\r
+int t6[16];\r
+\r
+void init(){\r
+ int i;\r
+ for(i=0;i<16;i++){\r
+ t1[i] = 2;\r
+ t2[i] = 2;\r
+ t3[i] = 2;\r
+ t4[i] = 2;\r
+ t5[i] = 2;\r
+ t6[i] = 2;\r
+ }\r
+}\r
+\r
+int comp_fir_complexe(int in_re[], int in_im[], int c_re[], int c_im[], int out_re[], int out_im[], int size) {\r
+ int i,j,res_re,res_im,tmp_im,tmp_re,tmp_x_re,tmp_x_im;\r
+ int x_re[16];\r
+ int x_im[16];\r
+ int ii;\r
+ for(ii=0;ii<16;ii++){x_re[ii]=0;x_im[ii]=0;}\r
+ int adx = 0;\r
+ res_re = 0; res_im = 0;\r
+ for (j=0;j<size;j=j+1) {\r
+ x_re[adx]=in_re[j];\r
+ x_im[adx]=in_im[j];\r
+\r
+ for(i=0;i<16;i=i+1){\r
+ tmp_x_re = x_re[adx];\r
+ tmp_x_im = x_im[adx];\r
+ tmp_re = (tmp_x_re*c_re[i]-tmp_x_im*c_im[i])>>4;\r
+ tmp_im = (tmp_x_re*c_im[i]+tmp_x_im*c_re[i])>>4;\r
+ res_re = res_re + tmp_re;\r
+ res_im = res_im + tmp_im;\r
+ adx=(adx+1)%16;\r
+ }\r
+\r
+ adx=(adx+1)%16;\r
+\r
+ out_re[j]=res_re;\r
+ out_im[j]=res_im;\r
+ }\r
+ return 0;\r
+}\r
+int main(){\r
+ init();\r
+ return comp_fir_complexe(t1,t2,t3,t4,t5,t6,16);\r
+}\r
--- /dev/null
+Global Error (Translation RTLabs -> RTL):
+ Store mode not supported.
--- /dev/null
+# extern __builtin_varargs_start: int -> void
+# extern __builtin_va_start: int -> int -> void
+# extern __builtin_va_end: int -> void
+# extern __builtin_va_copy: int -> int -> void
+# extern __builtin_va_arg: int -> int -> void
+# extern __builtin_types_compatible_p: int -> int -> int
+# extern __builtin_tanl: float -> float
+# extern __builtin_tanhl: float -> float
+# extern __builtin_tanhf: float -> float
+# extern __builtin_tanh: float -> float
+# extern __builtin_tanf: float -> float
+# extern __builtin_tan: float -> float
+# extern __builtin_strspn: int -> int -> int
+# extern __builtin_strpbrk: int -> int -> int
+# extern __builtin_strncpy: int -> int -> int -> int
+# extern __builtin_strncmp: int -> int -> int -> int
+# extern __builtin_strncat: int -> int -> int -> int
+# extern __builtin_strcspn: int -> int -> int
+# extern __builtin_strcpy: int -> int -> int
+# extern __builtin_strcmp: int -> int -> int
+# extern __builtin_strchr: int -> int -> int
+# extern __builtin_stpcpy: int -> int -> int
+# extern __builtin_stdarg_start: int -> void
+# extern __builtin_sqrtl: float -> float
+# extern __builtin_sqrtf: float -> float
+# extern __builtin_sqrt: float -> float
+# extern __builtin_sinl: float -> float
+# extern __builtin_sinhl: float -> float
+# extern __builtin_sinhf: float -> float
+# extern __builtin_sinh: float -> float
+# extern __builtin_sinf: float -> float
+# extern __builtin_sin: float -> float
+# extern __builtin_return_address: int -> int
+# extern __builtin_return: int -> void
+# extern __builtin_powil: float -> int -> float
+# extern __builtin_powif: float -> int -> float
+# extern __builtin_powi: float -> int -> float
+# extern __builtin_popcountll: int -> int
+# extern __builtin_popcountl: int -> int
+# extern __builtin_popcount: int -> int
+# extern __builtin_parityll: int -> int
+# extern __builtin_parityl: int -> int
+# extern __builtin_parity: int -> int
+# extern __builtin_object_size: int -> int -> int
+# extern __builtin_next_arg: int
+# extern __builtin_nansl: int -> float
+# extern __builtin_nansf: int -> float
+# extern __builtin_nans: int -> float
+# extern __builtin_nanl: int -> float
+# extern __builtin_nanf: int -> float
+# extern __builtin_nan: int -> float
+# extern __builtin_modfl: float -> int -> float
+# extern __builtin_modff: float -> int -> float
+# extern __builtin_mempcpy: int -> int -> int -> int
+# extern __builtin_memcpy: int -> int -> int -> int
+# extern __builtin_logl: float -> float
+# extern __builtin_logf: float -> float
+# extern __builtin_log10l: float -> float
+# extern __builtin_log10f: float -> float
+# extern __builtin_log10: float -> float
+# extern __builtin_log: float -> float
+# extern __builtin_ldexpl: float -> int -> float
+# extern __builtin_ldexpf: float -> int -> float
+# extern __builtin_ldexp: float -> int -> float
+# extern __builtin_infl: float
+# extern __builtin_inff: float
+# extern __builtin_inf: float
+# extern __builtin_huge_vall: float
+# extern __builtin_huge_valf: float
+# extern __builtin_huge_val: float
+# extern __builtin_frexpl: float -> int -> float
+# extern __builtin_frexpf: float -> int -> float
+# extern __builtin_frexp: float -> int -> float
+# extern __builtin_frame_address: int -> int
+# extern __builtin_fmodl: float -> float
+# extern __builtin_fmodf: float -> float
+# extern __builtin_fmod: float -> float
+# extern __builtin_floorl: float -> float
+# extern __builtin_floorf: float -> float
+# extern __builtin_floor: float -> float
+# extern __builtin_ffsll: int -> int
+# extern __builtin_ffsl: int -> int
+# extern __builtin_ffs: int -> int
+# extern __builtin_fabsl: float -> float
+# extern __builtin_fabsf: float -> float
+# extern __builtin_fabs: float -> float
+# extern __builtin_expl: float -> float
+# extern __builtin_expf: float -> float
+# extern __builtin_expect: int -> int -> int
+# extern __builtin_exp: float -> float
+# extern __builtin_ctzll: int -> int
+# extern __builtin_ctzl: int -> int
+# extern __builtin_ctz: int -> int
+# extern __builtin_cosl: float -> float
+# extern __builtin_coshl: float -> float
+# extern __builtin_coshf: float -> float
+# extern __builtin_cosh: float -> float
+# extern __builtin_cosf: float -> float
+# extern __builtin_cos: float -> float
+# extern __builtin_constant_p: int -> int
+# extern __builtin_clzll: int -> int
+# extern __builtin_clzl: int -> int
+# extern __builtin_clz: int -> int
+# extern __builtin_ceill: float -> float
+# extern __builtin_ceilf: float -> float
+# extern __builtin_ceil: float -> float
+# extern __builtin_atanl: float -> float
+# extern __builtin_atanf: float -> float
+# extern __builtin_atan2l: float -> float -> float
+# extern __builtin_atan2f: float -> float -> float
+# extern __builtin_atan2: float -> float -> float
+# extern __builtin_atan: float -> float
+# extern __builtin_asinl: float -> float
+# extern __builtin_asinf: float -> float
+# extern __builtin_asin: float -> float
+# extern __builtin_alloca: int -> int
+# extern __builtin_acosl: float -> float
+# extern __builtin_acosf: float -> float
+# extern __builtin_acos: float -> float
+# extern __builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+# extern __builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+# extern __builtin___vprintf_chk: int -> int -> int -> int
+# extern __builtin___vfprintf_chk: int -> int -> int -> int -> int
+# extern __builtin___strncpy_chk: int -> int -> int -> int -> int
+# extern __builtin___strncat_chk: int -> int -> int -> int -> int
+# extern __builtin___strcpy_chk: int -> int -> int -> int
+# extern __builtin___strcat_chk: int -> int -> int -> int
+# extern __builtin___stpcpy_chk: int -> int -> int -> int
+# extern __builtin___memset_chk: int -> int -> int -> int -> int
+# extern __builtin___mempcpy_chk: int -> int -> int -> int -> int
+# extern __builtin___memmove_chk: int -> int -> int -> int -> int
+# extern __builtin___memcpy_chk: int -> int -> int -> int -> int
+
+# begin preamble
+.data
+globals:
+.space 0
+nl:
+.asciiz "\n"
+.align 2
+.text
+main:
+la $gp, globals
+j main85
+print_int:
+li $v0, 1
+syscall
+jr $ra
+print_intln:
+li $v0, 1
+syscall
+la $a0, nl
+li $v0, 4
+syscall
+jr $ra
+scan_int:
+li $v0, 5
+syscall
+jr $ra
+alloc:
+li $v0, 9
+syscall
+jr $ra
+
+pow2:
+li $v0, 1
+sllv $v0, $v0, $a0
+jr $ra
+
+mod:
+beqz $a0, mod0
+beqz $a1, mod0
+li $t2, 0
+mod_t0:
+bgtz $a0, mod_a0_pos
+neg $t0, $a0
+addi $t2, $t2, 1
+j mod_t1
+mod_a0_pos:
+move $t0, $a0
+mod_t1:
+bgtz $a1, mod_a1_pos
+neg $t1, $a1
+addi $t2, $t2, 2
+j mod_main
+mod_a1_pos:
+move $t1, $a1
+mod_main:
+rem $v0, $t0, $t1
+beqz $t2, mod_exit
+addi $t2, -1
+beqz $t2, mod_case1
+addi $t2, -1
+beqz $t2, mod_case2
+neg $v0, $v0
+j mod_exit
+mod_case1:
+sub $v0, $a1, $v0
+j mod_exit
+mod_case2:
+add $v0, $a1, $v0
+j mod_exit
+mod0:
+li $v0, 0
+mod_exit:
+jr $ra
+
+toint:
+# $a0: size
+# $a1: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+jal pow2
+move $a0, $a1
+move $a1, $v0
+jal mod
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 8
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 16
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+sign_ext:
+# $a0: size
+# $a1: int to extend
+li $v0, 32
+sub $a0, $v0, $a0
+sllv $v0, $a1, $a0
+srav $v0, $v0, $a0
+jr $ra
+
+ofint:
+# $a0: signedness
+# $a1: size
+# $a2: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+beqz $a0, ofint_unsigned
+move $a0, $a1
+move $a1, $a2
+jal sign_ext
+j ofint_exit
+ofint_unsigned:
+move $v0, $a2
+ofint_exit:
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+# end preamble
+
+
+# begin for_loopParalAsync
+for_loopParalAsync94:
+c29:
+li $v0, 0
+c28:
+li $a2, 0
+c27:
+li $a0, 3
+add $a2, $a2, $a0
+c26:
+li $a0, 2
+mulo $a2, $a2, $a0
+c25:
+li $a0, 3
+div $a2, $a2, $a0
+c24:
+li $a0, 8
+add $a2, $a2, $a0
+c23:
+c22:
+li $a1, 0
+for_loopParalAsync37:
+li $a3, 0
+c21:
+li $a0, 20
+slt $a0, $a1, $a0
+seq $a0, $a0, $zero
+beq $a0, $a3, for_loopParalAsync31
+c16:
+c15:
+li $a1, 1
+for_loopParalAsync16:
+li $a3, 0
+c14:
+slt $a0, $a1, $a2
+seq $a0, $a0, $zero
+beq $a0, $a3, for_loopParalAsync11
+c10:
+jr $ra
+for_loopParalAsync11:
+c12:
+c11:
+c13:
+li $a0, 1
+add $a1, $a1, $a0
+j for_loopParalAsync16
+for_loopParalAsync31:
+c19:
+li $a0, 1
+add $v0, $v0, $a0
+c18:
+c17:
+c20:
+li $a0, 1
+add $a1, $a1, $a0
+j for_loopParalAsync37
+# end for_loopParalAsync
+
+
+# begin for_incrParam
+for_incrParam49:
+c86:
+add $a3, $a0, $a1
+c85:
+c84:
+c83:
+li $v0, 4
+sub $v0, $a3, $v0
+for_incrParam15:
+li $t0, 0
+c82:
+li $a2, 6
+add $a2, $a1, $a2
+slt $a2, $v0, $a2
+seq $a2, $a2, $zero
+beq $a2, $t0, for_incrParam8
+c79:
+jr $ra
+for_incrParam8:
+c80:
+add $v0, $v0, $a3
+add $v0, $v0, $a0
+c81:
+add $v0, $v0, $a0
+j for_incrParam15
+# end for_incrParam
+
+
+# begin for_incr
+for_incr44:
+c78:
+li $v0, 0
+c77:
+c76:
+li $a2, 3
+add $a2, $a0, $a2
+for_incr15:
+li $a3, 0
+c75:
+li $a0, 2
+mulo $a0, $a1, $a0
+sle $a0, $a2, $a0
+seq $a0, $a0, $zero
+beq $a0, $a3, for_incr8
+c72:
+jr $ra
+for_incr8:
+c73:
+sub $v0, $v0, $a2
+c74:
+li $a0, 1
+add $a2, $a2, $a0
+j for_incr15
+# end for_incr
+
+
+# begin for_imbriq
+for_imbriq64:
+addi $sp, $sp, -24
+sw $ra, 20($sp)
+sw $s4, 16($sp)
+sw $s3, 12($sp)
+sw $s2, 8($sp)
+sw $s1, 4($sp)
+sw $s0, 0($sp)
+move $s4, $a0
+move $s3, $a1
+c71:
+li $s0, 0
+c70:
+c69:
+li $s1, 0
+for_imbriq29:
+li $a0, 0
+c68:
+li $v0, 23
+slt $v0, $s1, $v0
+seq $v0, $v0, $zero
+beq $v0, $a0, for_imbriq23
+c59:
+move $v0, $s0
+lw $ra, 20($sp)
+lw $s4, 16($sp)
+lw $s3, 12($sp)
+lw $s2, 8($sp)
+lw $s1, 4($sp)
+lw $s0, 0($sp)
+addi $sp, $sp, 24
+jr $ra
+for_imbriq23:
+c66:
+li $v0, 0
+c65:
+c64:
+li $s2, 1
+for_imbriq18:
+li $a1, 0
+c63:
+li $a0, 12
+slt $a0, $s2, $a0
+seq $a0, $a0, $zero
+beq $a0, $a1, for_imbriq12
+c67:
+add $s1, $s1, $s4
+j for_imbriq29
+for_imbriq12:
+c61:
+add $s0, $s0, $v0
+c60:
+la $a2, mod
+move $a0, $v0
+move $a1, $s2
+jalr $a2
+c62:
+add $s2, $s2, $s3
+j for_imbriq18
+# end for_imbriq
+
+
+# begin for_fortSimple
+for_fortSimple41:
+c58:
+li $t0, 0
+c57:
+c56:
+move $a3, $a0
+for_fortSimple14:
+li $t1, 0
+c55:
+slt $v0, $a3, $a1
+seq $v0, $v0, $zero
+beq $v0, $t1, for_fortSimple9
+c52:
+add $v0, $t0, $a0
+c51:
+jr $ra
+for_fortSimple9:
+c53:
+add $t0, $t0, $a3
+c54:
+add $a3, $a3, $a2
+j for_fortSimple14
+# end for_fortSimple
+
+
+# begin for_forfor
+for_forfor44:
+c94:
+c93:
+li $a1, 0
+c92:
+li $v0, 0
+for_forfor18:
+li $a2, 0
+c91:
+li $a0, 10
+slt $a0, $a1, $a0
+seq $a0, $a0, $zero
+beq $a0, $a2, for_forfor12
+c87:
+jr $ra
+for_forfor12:
+c89:
+li $a0, 1
+add $v0, $v0, $a0
+c88:
+li $a0, 1
+add $v0, $v0, $a0
+c90:
+li $a0, 1
+add $a1, $a1, $a0
+j for_forfor18
+# end for_forfor
+
+
+# begin for_ex
+for_ex43:
+c50:
+li $v0, 0
+c49:
+c48:
+li $a3, 3
+add $a3, $a0, $a3
+for_ex14:
+li $t0, 0
+c47:
+li $a0, 2
+mulo $a0, $a1, $a0
+sle $a0, $a3, $a0
+seq $a0, $a0, $zero
+beq $a0, $t0, for_ex7
+c44:
+jr $ra
+for_ex7:
+c45:
+sub $v0, $v0, $a3
+c46:
+add $a3, $a3, $a2
+j for_ex14
+# end for_ex
+
+
+# begin for_double
+for_double64:
+c43:
+li $a1, 0
+c42:
+li $a2, 0
+c41:
+c40:
+li $a3, 0
+for_double29:
+li $t0, 0
+c39:
+li $v0, 12
+slt $v0, $a3, $v0
+seq $v0, $v0, $zero
+beq $v0, $t0, for_double23
+c36:
+c35:
+li $a3, 0
+for_double15:
+li $t0, 0
+c34:
+li $v0, 5
+slt $v0, $a3, $v0
+seq $v0, $v0, $zero
+beq $v0, $t0, for_double9
+c31:
+mulo $v0, $a1, $a2
+c30:
+jr $ra
+for_double9:
+c32:
+add $a2, $a2, $a3
+c33:
+add $a3, $a3, $a0
+j for_double15
+for_double23:
+c37:
+add $a1, $a1, $a3
+c38:
+add $a3, $a3, $a0
+j for_double29
+# end for_double
+
+
+# begin for_2
+for_253:
+c9:
+li $a2, 0
+c8:
+li $v0, 2
+mulo $v0, $a0, $v0
+c7:
+li $a3, 4
+mulo $a0, $a0, $a3
+c6:
+li $a3, 1
+add $a1, $a1, $a3
+c5:
+c4:
+for_213:
+li $t0, 0
+c3:
+slt $a3, $v0, $a0
+seq $a3, $a3, $zero
+beq $a3, $t0, for_28
+c0:
+li $v0, 1
+add $v0, $a2, $v0
+jr $ra
+for_28:
+c1:
+add $a2, $a2, $v0
+c2:
+add $v0, $v0, $a1
+j for_213
+# end for_2
+
+
+# begin _main
+main85:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+c104:
+li $a0, 3
+li $a1, 1
+la $v0, for_253
+jalr $v0
+c103:
+li $a0, 1
+li $a1, 2
+li $a2, 3
+la $v0, for_loopParalAsync94
+jalr $v0
+c102:
+li $a0, 1
+la $v0, for_double64
+jalr $v0
+c101:
+li $a0, 2
+li $a1, 10
+li $a2, 1
+la $v0, for_ex43
+jalr $v0
+c100:
+li $a0, 2
+li $a1, 10
+li $a2, 1
+la $v0, for_fortSimple41
+jalr $v0
+c99:
+li $a0, 2
+li $a1, 3
+la $v0, for_imbriq64
+jalr $v0
+c98:
+li $a0, 2
+li $a1, 3
+la $v0, for_incr44
+jalr $v0
+c97:
+li $a0, 2
+li $a1, 3
+la $v0, for_incrParam49
+jalr $v0
+c96:
+la $v0, for_forfor44
+jalr $v0
+c95:
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+# end _main
--- /dev/null
+extern void *__builtin___memcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memmove_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___mempcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memset_chk(void *, int, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___stpcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcat_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strncat_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___strncpy_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern int __builtin___vfprintf_chk(void *, int, unsigned char *, void *);
+
+extern int __builtin___vprintf_chk(int, unsigned char *, void *);
+
+extern int __builtin___vsnprintf_chk(unsigned char *, unsigned int, int, unsigned int, unsigned char *, void *);
+
+extern int __builtin___vsprintf_chk(unsigned char *, int, unsigned int, unsigned char *, void *);
+
+extern double __builtin_acos(double);
+
+extern float __builtin_acosf(float);
+
+extern double __builtin_acosl(double);
+
+extern void *__builtin_alloca(unsigned int);
+
+extern double __builtin_asin(double);
+
+extern float __builtin_asinf(float);
+
+extern double __builtin_asinl(double);
+
+extern double __builtin_atan(double);
+
+extern float __builtin_atanf(float);
+
+extern double __builtin_atanl(double);
+
+extern double __builtin_atan2(double, double);
+
+extern float __builtin_atan2f(float, float);
+
+extern double __builtin_atan2l(double, double);
+
+extern double __builtin_ceil(double);
+
+extern float __builtin_ceilf(float);
+
+extern double __builtin_ceill(double);
+
+extern double __builtin_cos(double);
+
+extern float __builtin_cosf(float);
+
+extern double __builtin_cosl(double);
+
+extern double __builtin_cosh(double);
+
+extern float __builtin_coshf(float);
+
+extern double __builtin_coshl(double);
+
+extern int __builtin_clz(unsigned int);
+
+extern int __builtin_clzl(unsigned int);
+
+extern int __builtin_clzll(unsigned int);
+
+extern int __builtin_constant_p(int);
+
+extern int __builtin_ctz(unsigned int);
+
+extern int __builtin_ctzl(unsigned int);
+
+extern int __builtin_ctzll(unsigned int);
+
+extern double __builtin_exp(double);
+
+extern float __builtin_expf(float);
+
+extern double __builtin_expl(double);
+
+extern int __builtin_expect(int, int);
+
+extern double __builtin_fabs(double);
+
+extern float __builtin_fabsf(float);
+
+extern double __builtin_fabsl(double);
+
+extern int __builtin_ffs(unsigned int);
+
+extern int __builtin_ffsl(unsigned int);
+
+extern int __builtin_ffsll(unsigned int);
+
+extern void *__builtin_frame_address(unsigned int);
+
+extern double __builtin_floor(double);
+
+extern float __builtin_floorf(float);
+
+extern double __builtin_floorl(double);
+
+extern double __builtin_huge_val(void);
+
+extern float __builtin_huge_valf(void);
+
+extern double __builtin_huge_vall(void);
+
+extern double __builtin_inf(void);
+
+extern float __builtin_inff(void);
+
+extern double __builtin_infl(void);
+
+extern void *__builtin_memcpy(void *, void *, unsigned int);
+
+extern void *__builtin_mempcpy(void *, void *, unsigned int);
+
+extern double __builtin_fmod(double);
+
+extern float __builtin_fmodf(float);
+
+extern double __builtin_fmodl(double);
+
+extern double __builtin_frexp(double, int *);
+
+extern float __builtin_frexpf(float, int *);
+
+extern double __builtin_frexpl(double, int *);
+
+extern double __builtin_ldexp(double, int);
+
+extern float __builtin_ldexpf(float, int);
+
+extern double __builtin_ldexpl(double, int);
+
+extern double __builtin_log(double);
+
+extern float __builtin_logf(float);
+
+extern double __builtin_logl(double);
+
+extern double __builtin_log10(double);
+
+extern float __builtin_log10f(float);
+
+extern double __builtin_log10l(double);
+
+extern float __builtin_modff(float, float *);
+
+extern double __builtin_modfl(double, double *);
+
+extern double __builtin_nan(unsigned char *);
+
+extern float __builtin_nanf(unsigned char *);
+
+extern double __builtin_nanl(unsigned char *);
+
+extern double __builtin_nans(unsigned char *);
+
+extern float __builtin_nansf(unsigned char *);
+
+extern double __builtin_nansl(unsigned char *);
+
+extern void *__builtin_next_arg(void);
+
+extern unsigned int __builtin_object_size(void *, int);
+
+extern int __builtin_parity(unsigned int);
+
+extern int __builtin_parityl(unsigned int);
+
+extern int __builtin_parityll(unsigned int);
+
+extern int __builtin_popcount(unsigned int);
+
+extern int __builtin_popcountl(unsigned int);
+
+extern int __builtin_popcountll(unsigned int);
+
+extern double __builtin_powi(double, int);
+
+extern float __builtin_powif(float, int);
+
+extern double __builtin_powil(double, int);
+
+extern void __builtin_return(void *);
+
+extern void *__builtin_return_address(unsigned int);
+
+extern double __builtin_sin(double);
+
+extern float __builtin_sinf(float);
+
+extern double __builtin_sinl(double);
+
+extern double __builtin_sinh(double);
+
+extern float __builtin_sinhf(float);
+
+extern double __builtin_sinhl(double);
+
+extern double __builtin_sqrt(double);
+
+extern float __builtin_sqrtf(float);
+
+extern double __builtin_sqrtl(double);
+
+extern unsigned char *__builtin_stpcpy(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strchr(unsigned char *, unsigned char);
+
+extern int __builtin_strcmp(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strcpy(unsigned char *, unsigned char *);
+
+extern unsigned int __builtin_strcspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strncat(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strncmp(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin_strncpy(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strpbrk(unsigned char *, unsigned char *);
+
+extern int __builtin_types_compatible_p(unsigned int, unsigned int);
+
+extern double __builtin_tan(double);
+
+extern float __builtin_tanf(float);
+
+extern double __builtin_tanl(double);
+
+extern double __builtin_tanh(double);
+
+extern float __builtin_tanhf(float);
+
+extern double __builtin_tanhl(double);
+
+extern void __builtin_va_end(void *);
+
+extern void __builtin_varargs_start(void *);
+
+extern void __builtin_va_start(void *, void *);
+
+extern void __builtin_stdarg_start(void *);
+
+extern void __builtin_va_arg(void *, unsigned int);
+
+extern void __builtin_va_copy(void *, void *);
+
+int for_2(int a, int b)
+{
+ int i;
+ int min;
+ int max;
+ int pas;
+ int resul;
+ c9:
+ resul = 0;
+ c8:
+ min = a * 2;
+ c7:
+ max = a * 4;
+ c6:
+ pas = b + 1;
+ c5:
+ for (({ c4: i = min; }); (/* c3 */ i < max); ({ c2: i = i + pas; })) {
+ c1:
+ resul = resul + i;
+ }
+ c0:
+ return resul + 1;
+}
+
+int for_loopParalAsync(int a, int b, int c)
+{
+ int i;
+ int j;
+ int x;
+ int y;
+ int z;
+ c29:
+ x = 0;
+ c28:
+ a = 0;
+ c27:
+ a = a + 3;
+ c26:
+ a = a * 2;
+ c25:
+ a = a / 3;
+ c24:
+ a = a + 8;
+ c23:
+ for (({ c22: i = 0; }); (/* c21 */ i < 20); ({ c20: i = i + 1; })) {
+ c19:
+ x = x + 1;
+ c18:
+ b = b + 2;
+ c17:
+ y = b / x;
+ }
+ c16:
+ for (({ c15: j = 1; }); (/* c14 */ j < a); ({ c13: j = j + 1; })) {
+ c12:
+ c = c * 2;
+ c11:
+ z = c / j;
+ }
+ c10:
+ return x;
+}
+
+int for_double(int pas)
+{
+ int i;
+ int j;
+ int result;
+ int a;
+ int b;
+ c43:
+ a = 0;
+ c42:
+ b = 0;
+ c41:
+ for (({ c40: i = 0; }); (/* c39 */ i < 12); ({ c38: i = i + pas; })) {
+ c37:
+ a = a + i;
+ }
+ c36:
+ for (({ c35: j = 0; }); (/* c34 */ j < 5); ({ c33: j = j + pas; })) {
+ c32:
+ b = b + j;
+ }
+ c31:
+ result = a * b;
+ c30:
+ return result;
+}
+
+int for_ex(int b, int e, int pas)
+{
+ int i;
+ int res;
+ c50:
+ res = 0;
+ c49:
+ for (({ c48:
+ i = b + 3; });
+ (/* c47 */
+ i <= e * 2);
+ ({ c46:
+ i = i + pas; })) {
+ c45:
+ res = res - i;
+ }
+ c44:
+ return res;
+}
+
+int for_fortSimple(int a, int b, int pas)
+{
+ int res;
+ int i;
+ int sortie;
+ int c;
+ c58:
+ res = 0;
+ c57:
+ for (({ c56: i = a; }); (/* c55 */ i < b); ({ c54: i = i + pas; })) {
+ c53:
+ res = res + i;
+ }
+ c52:
+ sortie = res + a;
+ c51:
+ return sortie;
+}
+
+int for_imbriq(int pas1, int pas2)
+{
+ int i;
+ int j;
+ int a;
+ int b;
+ c71:
+ a = 0;
+ c70:
+ for (({ c69: i = 0; }); (/* c68 */ i < 23); ({ c67: i = i + pas1; })) {
+ c66:
+ b = 0;
+ c65:
+ for (({ c64: j = 1; }); (/* c63 */ j < 12); ({ c62: j = j + pas2; })) {
+ c61:
+ a = a + b;
+ c60:
+ b = b % j;
+ }
+ }
+ c59:
+ return a;
+}
+
+int for_incr(int b, int e)
+{
+ int i;
+ int res;
+ c78:
+ res = 0;
+ c77:
+ for (({ c76:
+ i = b + 3; });
+ (/* c75 */
+ i <= e * 2);
+ ({ c74:
+ i = i + 1; })) {
+ c73:
+ res = res - i;
+ }
+ c72:
+ return res;
+}
+
+int for_incrParam(int a, int b)
+{
+ int i;
+ int z;
+ int c;
+ c86:
+ z = a + b;
+ c85:
+ c = 3 * z;
+ c84:
+ for (({ c83: i = z - 4; }); (/* c82 */ i < b + 6); ({ c81: i = i + a; })) {
+ c80:
+ i = (i + z) + a;
+ }
+ c79:
+ return i;
+}
+
+int for_forfor(void)
+{
+ int i;
+ int j;
+ c94:
+ for (({ c93:
+ i = 0; }), ({ c92:
+ j = 0; });
+ (/* c91 */
+ i < 10);
+ ({ c90:
+ i = i + 1; })) {
+ c89:
+ j = j + 1;
+ c88:
+ j = j + 1;
+ }
+ c87:
+ return j;
+}
+
+int main(void)
+{
+ int a;
+ c104:
+ a = for_2(3, 1);
+ c103:
+ a = for_loopParalAsync(1, 2, 3);
+ c102:
+ a = for_double(1);
+ c101:
+ a = for_ex(2, 10, 1);
+ c100:
+ a = for_fortSimple(2, 10, 1);
+ c99:
+ a = for_imbriq(2, 3);
+ c98:
+ a = for_incr(2, 3);
+ c97:
+ a = for_incrParam(2, 3);
+ c96:
+ a = for_forfor();
+ c95:
+ return a;
+}
+
+
--- /dev/null
+
+
+
+extern "__builtin___memcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memmove_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___mempcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memset_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___stpcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcat_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strncat_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___strncpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vfprintf_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vprintf_chk" : int -> int -> int -> int
+
+
+extern "__builtin___vsnprintf_chk" : int -> int -> int -> int -> int -> int -> int
+
+
+extern "__builtin___vsprintf_chk" : int -> int -> int -> int -> int -> int
+
+
+extern "__builtin_acos" : float -> float
+
+
+extern "__builtin_acosf" : float -> float
+
+
+extern "__builtin_acosl" : float -> float
+
+
+extern "__builtin_alloca" : int -> int
+
+
+extern "__builtin_asin" : float -> float
+
+
+extern "__builtin_asinf" : float -> float
+
+
+extern "__builtin_asinl" : float -> float
+
+
+extern "__builtin_atan" : float -> float
+
+
+extern "__builtin_atanf" : float -> float
+
+
+extern "__builtin_atanl" : float -> float
+
+
+extern "__builtin_atan2" : float -> float -> float
+
+
+extern "__builtin_atan2f" : float -> float -> float
+
+
+extern "__builtin_atan2l" : float -> float -> float
+
+
+extern "__builtin_ceil" : float -> float
+
+
+extern "__builtin_ceilf" : float -> float
+
+
+extern "__builtin_ceill" : float -> float
+
+
+extern "__builtin_cos" : float -> float
+
+
+extern "__builtin_cosf" : float -> float
+
+
+extern "__builtin_cosl" : float -> float
+
+
+extern "__builtin_cosh" : float -> float
+
+
+extern "__builtin_coshf" : float -> float
+
+
+extern "__builtin_coshl" : float -> float
+
+
+extern "__builtin_clz" : int -> int
+
+
+extern "__builtin_clzl" : int -> int
+
+
+extern "__builtin_clzll" : int -> int
+
+
+extern "__builtin_constant_p" : int -> int
+
+
+extern "__builtin_ctz" : int -> int
+
+
+extern "__builtin_ctzl" : int -> int
+
+
+extern "__builtin_ctzll" : int -> int
+
+
+extern "__builtin_exp" : float -> float
+
+
+extern "__builtin_expf" : float -> float
+
+
+extern "__builtin_expl" : float -> float
+
+
+extern "__builtin_expect" : int -> int -> int
+
+
+extern "__builtin_fabs" : float -> float
+
+
+extern "__builtin_fabsf" : float -> float
+
+
+extern "__builtin_fabsl" : float -> float
+
+
+extern "__builtin_ffs" : int -> int
+
+
+extern "__builtin_ffsl" : int -> int
+
+
+extern "__builtin_ffsll" : int -> int
+
+
+extern "__builtin_frame_address" : int -> int
+
+
+extern "__builtin_floor" : float -> float
+
+
+extern "__builtin_floorf" : float -> float
+
+
+extern "__builtin_floorl" : float -> float
+
+
+extern "__builtin_huge_val" : float
+
+
+extern "__builtin_huge_valf" : float
+
+
+extern "__builtin_huge_vall" : float
+
+
+extern "__builtin_inf" : float
+
+
+extern "__builtin_inff" : float
+
+
+extern "__builtin_infl" : float
+
+
+extern "__builtin_memcpy" : int -> int -> int -> int
+
+
+extern "__builtin_mempcpy" : int -> int -> int -> int
+
+
+extern "__builtin_fmod" : float -> float
+
+
+extern "__builtin_fmodf" : float -> float
+
+
+extern "__builtin_fmodl" : float -> float
+
+
+extern "__builtin_frexp" : float -> int -> float
+
+
+extern "__builtin_frexpf" : float -> int -> float
+
+
+extern "__builtin_frexpl" : float -> int -> float
+
+
+extern "__builtin_ldexp" : float -> int -> float
+
+
+extern "__builtin_ldexpf" : float -> int -> float
+
+
+extern "__builtin_ldexpl" : float -> int -> float
+
+
+extern "__builtin_log" : float -> float
+
+
+extern "__builtin_logf" : float -> float
+
+
+extern "__builtin_logl" : float -> float
+
+
+extern "__builtin_log10" : float -> float
+
+
+extern "__builtin_log10f" : float -> float
+
+
+extern "__builtin_log10l" : float -> float
+
+
+extern "__builtin_modff" : float -> int -> float
+
+
+extern "__builtin_modfl" : float -> int -> float
+
+
+extern "__builtin_nan" : int -> float
+
+
+extern "__builtin_nanf" : int -> float
+
+
+extern "__builtin_nanl" : int -> float
+
+
+extern "__builtin_nans" : int -> float
+
+
+extern "__builtin_nansf" : int -> float
+
+
+extern "__builtin_nansl" : int -> float
+
+
+extern "__builtin_next_arg" : int
+
+
+extern "__builtin_object_size" : int -> int -> int
+
+
+extern "__builtin_parity" : int -> int
+
+
+extern "__builtin_parityl" : int -> int
+
+
+extern "__builtin_parityll" : int -> int
+
+
+extern "__builtin_popcount" : int -> int
+
+
+extern "__builtin_popcountl" : int -> int
+
+
+extern "__builtin_popcountll" : int -> int
+
+
+extern "__builtin_powi" : float -> int -> float
+
+
+extern "__builtin_powif" : float -> int -> float
+
+
+extern "__builtin_powil" : float -> int -> float
+
+
+extern "__builtin_return" : int -> void
+
+
+extern "__builtin_return_address" : int -> int
+
+
+extern "__builtin_sin" : float -> float
+
+
+extern "__builtin_sinf" : float -> float
+
+
+extern "__builtin_sinl" : float -> float
+
+
+extern "__builtin_sinh" : float -> float
+
+
+extern "__builtin_sinhf" : float -> float
+
+
+extern "__builtin_sinhl" : float -> float
+
+
+extern "__builtin_sqrt" : float -> float
+
+
+extern "__builtin_sqrtf" : float -> float
+
+
+extern "__builtin_sqrtl" : float -> float
+
+
+extern "__builtin_stpcpy" : int -> int -> int
+
+
+extern "__builtin_strchr" : int -> int -> int
+
+
+extern "__builtin_strcmp" : int -> int -> int
+
+
+extern "__builtin_strcpy" : int -> int -> int
+
+
+extern "__builtin_strcspn" : int -> int -> int
+
+
+extern "__builtin_strncat" : int -> int -> int -> int
+
+
+extern "__builtin_strncmp" : int -> int -> int -> int
+
+
+extern "__builtin_strncpy" : int -> int -> int -> int
+
+
+extern "__builtin_strspn" : int -> int -> int
+
+
+extern "__builtin_strpbrk" : int -> int -> int
+
+
+extern "__builtin_types_compatible_p" : int -> int -> int
+
+
+extern "__builtin_tan" : float -> float
+
+
+extern "__builtin_tanf" : float -> float
+
+
+extern "__builtin_tanl" : float -> float
+
+
+extern "__builtin_tanh" : float -> float
+
+
+extern "__builtin_tanhf" : float -> float
+
+
+extern "__builtin_tanhl" : float -> float
+
+
+extern "__builtin_va_end" : int -> void
+
+
+extern "__builtin_varargs_start" : int -> void
+
+
+extern "__builtin_va_start" : int -> int -> void
+
+
+extern "__builtin_stdarg_start" : int -> void
+
+
+extern "__builtin_va_arg" : int -> int -> void
+
+
+extern "__builtin_va_copy" : int -> int -> void
+
+
+"for_2" (a, b) : int -> int -> int {
+
+ stack 0;
+
+ var max, pas, i, resul, min;
+
+ c9:
+ resul = 0;
+ c8:
+ min = a * 2;
+ c7:
+ max = a * 4;
+ c6:
+ pas = b + 1;
+ c5:
+ c4:
+ i = min;
+ block {
+ loop {
+ if (!(/* c3 */ i < max)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c1:
+ resul = resul + i;
+ }
+ c2:
+ i = i + pas;
+ }
+ }
+ c0:
+ return resul + 1;
+
+}
+
+
+"for_loopParalAsync" (a, b, c) : int -> int -> int -> int {
+
+ stack 0;
+
+ var z, y, x, j, i;
+
+ c29:
+ x = 0;
+ c28:
+ a = 0;
+ c27:
+ a = a + 3;
+ c26:
+ a = a * 2;
+ c25:
+ a = a / 3;
+ c24:
+ a = a + 8;
+ c23:
+ c22:
+ i = 0;
+ block {
+ loop {
+ if (!(/* c21 */ i < 20)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c19:
+ x = x + 1;
+ c18:
+ b = b + 2;
+ c17:
+ y = b / x;
+ }
+ c20:
+ i = i + 1;
+ }
+ }
+ c16:
+ c15:
+ j = 1;
+ block {
+ loop {
+ if (!(/* c14 */ j < a)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c12:
+ c = c * 2;
+ c11:
+ z = c / j;
+ }
+ c13:
+ j = j + 1;
+ }
+ }
+ c10:
+ return x;
+
+}
+
+
+"for_double" (pas) : int -> int {
+
+ stack 0;
+
+ var j, i, result, b, a;
+
+ c43:
+ a = 0;
+ c42:
+ b = 0;
+ c41:
+ c40:
+ i = 0;
+ block {
+ loop {
+ if (!(/* c39 */ i < 12)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c37:
+ a = a + i;
+ }
+ c38:
+ i = i + pas;
+ }
+ }
+ c36:
+ c35:
+ j = 0;
+ block {
+ loop {
+ if (!(/* c34 */ j < 5)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c32:
+ b = b + j;
+ }
+ c33:
+ j = j + pas;
+ }
+ }
+ c31:
+ result = a * b;
+ c30:
+ return result;
+
+}
+
+
+"for_ex" (b, e, pas) : int -> int -> int -> int {
+
+ stack 0;
+
+ var res, i;
+
+ c50:
+ res = 0;
+ c49:
+ c48:
+ i = b + 3;
+ block {
+ loop {
+ if (!(/* c47 */ i <= (e * 2))) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c45:
+ res = res - i;
+ }
+ c46:
+ i = i + pas;
+ }
+ }
+ c44:
+ return res;
+
+}
+
+
+"for_fortSimple" (a, b, pas) : int -> int -> int -> int {
+
+ stack 0;
+
+ var res, sortie, i, c;
+
+ c58:
+ res = 0;
+ c57:
+ c56:
+ i = a;
+ block {
+ loop {
+ if (!(/* c55 */ i < b)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c53:
+ res = res + i;
+ }
+ c54:
+ i = i + pas;
+ }
+ }
+ c52:
+ sortie = res + a;
+ c51:
+ return sortie;
+
+}
+
+
+"for_imbriq" (pas1, pas2) : int -> int -> int {
+
+ stack 0;
+
+ var j, i, b, a;
+
+ c71:
+ a = 0;
+ c70:
+ c69:
+ i = 0;
+ block {
+ loop {
+ if (!(/* c68 */ i < 23)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c66:
+ b = 0;
+ c65:
+ c64:
+ j = 1;
+ block {
+ loop {
+ if (!(/* c63 */ j < 12)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c61:
+ a = a + b;
+ c60:
+ b = b % j;
+ }
+ c62:
+ j = j + pas2;
+ }
+ }
+ }
+ c67:
+ i = i + pas1;
+ }
+ }
+ c59:
+ return a;
+
+}
+
+
+"for_incr" (b, e) : int -> int -> int {
+
+ stack 0;
+
+ var res, i;
+
+ c78:
+ res = 0;
+ c77:
+ c76:
+ i = b + 3;
+ block {
+ loop {
+ if (!(/* c75 */ i <= (e * 2))) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c73:
+ res = res - i;
+ }
+ c74:
+ i = i + 1;
+ }
+ }
+ c72:
+ return res;
+
+}
+
+
+"for_incrParam" (a, b) : int -> int -> int {
+
+ stack 0;
+
+ var z, i, c;
+
+ c86:
+ z = a + b;
+ c85:
+ c = 3 * z;
+ c84:
+ c83:
+ i = z - 4;
+ block {
+ loop {
+ if (!(/* c82 */ i < (b + 6))) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c80:
+ i = (i + z) + a;
+ }
+ c81:
+ i = i + a;
+ }
+ }
+ c79:
+ return i;
+
+}
+
+
+"for_forfor" () : int {
+
+ stack 0;
+
+ var j, i;
+
+ c94:
+ c93:
+ i = 0;
+ c92:
+ j = 0;
+ block {
+ loop {
+ if (!(/* c91 */ i < 10)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c89:
+ j = j + 1;
+ c88:
+ j = j + 1;
+ }
+ c90:
+ i = i + 1;
+ }
+ }
+ c87:
+ return j;
+
+}
+
+
+"main" () : int {
+
+ stack 0;
+
+ var a;
+
+ c104:
+ a = "for_2"(3, 1) : int -> int -> int;
+ c103:
+ a = "for_loopParalAsync"(1, 2, 3) : int -> int -> int -> int;
+ c102:
+ a = "for_double"(1) : int -> int;
+ c101:
+ a = "for_ex"(2, 10, 1) : int -> int -> int -> int;
+ c100:
+ a = "for_fortSimple"(2, 10, 1) : int -> int -> int -> int;
+ c99:
+ a = "for_imbriq"(2, 3) : int -> int -> int;
+ c98:
+ a = "for_incr"(2, 3) : int -> int -> int;
+ c97:
+ a = "for_incrParam"(2, 3) : int -> int -> int;
+ c96:
+ a = "for_forfor"() : int;
+ c95:
+ return a;
+
+}
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure for_loopParalAsync(3)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35
+entry for_loopParalAsync94
+for_loopParalAsync94 : newframe --> for_loopParalAsync93
+for_loopParalAsync93 : move %35, $ra --> for_loopParalAsync92
+for_loopParalAsync92 : move %34, $s7 --> for_loopParalAsync91
+for_loopParalAsync91 : move %33, $s6 --> for_loopParalAsync90
+for_loopParalAsync90 : move %32, $s5 --> for_loopParalAsync89
+for_loopParalAsync89 : move %31, $s4 --> for_loopParalAsync88
+for_loopParalAsync88 : move %30, $s3 --> for_loopParalAsync87
+for_loopParalAsync87 : move %29, $s2 --> for_loopParalAsync86
+for_loopParalAsync86 : move %28, $s1 --> for_loopParalAsync85
+for_loopParalAsync85 : move %27, $s0 --> for_loopParalAsync84
+for_loopParalAsync84 : move %0, $a0 --> for_loopParalAsync83
+for_loopParalAsync83 : move %1, $a1 --> for_loopParalAsync82
+for_loopParalAsync82 : move %2, $a2 --> for_loopParalAsync81
+for_loopParalAsync81 : li %3, 0 --> for_loopParalAsync80
+for_loopParalAsync80 : li %4, 0 --> for_loopParalAsync79
+for_loopParalAsync79 : li %5, 0 --> for_loopParalAsync78
+for_loopParalAsync78 : li %6, 0 --> for_loopParalAsync77
+for_loopParalAsync77 : li %7, 0 --> for_loopParalAsync76
+for_loopParalAsync76 : li %9, 0 --> for_loopParalAsync75
+for_loopParalAsync75 : li %10, 0 --> for_loopParalAsync74
+for_loopParalAsync74 : li %11, 0 --> for_loopParalAsync73
+for_loopParalAsync73 : li %12, 0 --> for_loopParalAsync72
+for_loopParalAsync72 : li %13, 0 --> for_loopParalAsync71
+for_loopParalAsync71 : li %14, 0 --> for_loopParalAsync70
+for_loopParalAsync70 : li %15, 0 --> for_loopParalAsync69
+for_loopParalAsync69 : li %16, 0 --> for_loopParalAsync68
+for_loopParalAsync68 : li %17, 0 --> for_loopParalAsync67
+for_loopParalAsync67 : li %18, 0 --> for_loopParalAsync66
+for_loopParalAsync66 : li %19, 0 --> for_loopParalAsync65
+for_loopParalAsync65 : li %20, 0 --> for_loopParalAsync64
+for_loopParalAsync64 : li %21, 0 --> for_loopParalAsync63
+for_loopParalAsync63 : li %22, 0 --> for_loopParalAsync62
+for_loopParalAsync62 : li %23, 0 --> for_loopParalAsync61
+for_loopParalAsync61 : li %24, 0 --> for_loopParalAsync60
+for_loopParalAsync60 : li %25, 0 --> for_loopParalAsync59
+for_loopParalAsync59 : li %26, 0 --> for_loopParalAsync56
+for_loopParalAsync56 : emit c29 --> for_loopParalAsync55
+for_loopParalAsync55 : li %5, 0 --> for_loopParalAsync54
+for_loopParalAsync54 : emit c28 --> for_loopParalAsync53
+for_loopParalAsync53 : li %0, 0 --> for_loopParalAsync52
+for_loopParalAsync52 : emit c27 --> for_loopParalAsync51
+for_loopParalAsync51 : li %24, 3 --> for_loopParalAsync50
+for_loopParalAsync50 : add %0, %0, %24 --> for_loopParalAsync49
+for_loopParalAsync49 : emit c26 --> for_loopParalAsync48
+for_loopParalAsync48 : li %23, 2 --> for_loopParalAsync47
+for_loopParalAsync47 : mulo %0, %0, %23 --> for_loopParalAsync46
+for_loopParalAsync46 : emit c25 --> for_loopParalAsync45
+for_loopParalAsync45 : li %22, 3 --> for_loopParalAsync44
+for_loopParalAsync44 : div %0, %0, %22 --> for_loopParalAsync43
+for_loopParalAsync43 : emit c24 --> for_loopParalAsync42
+for_loopParalAsync42 : li %21, 8 --> for_loopParalAsync41
+for_loopParalAsync41 : add %0, %0, %21 --> for_loopParalAsync40
+for_loopParalAsync40 : emit c23 --> for_loopParalAsync39
+for_loopParalAsync39 : emit c22 --> for_loopParalAsync38
+for_loopParalAsync38 : li %7, 0 --> for_loopParalAsync20
+for_loopParalAsync20 : j --> for_loopParalAsync37
+for_loopParalAsync37 : li %18, 0 --> for_loopParalAsync36
+for_loopParalAsync36 : emit c21 --> for_loopParalAsync35
+for_loopParalAsync35 : li %20, 20 --> for_loopParalAsync34
+for_loopParalAsync34 : slt %19, %7, %20 --> for_loopParalAsync33
+for_loopParalAsync33 : li %26, 0 --> for_loopParalAsync58
+for_loopParalAsync58 : seq %17, %19, %26 --> for_loopParalAsync32
+for_loopParalAsync32 : beq %17, %18 --> for_loopParalAsync31, for_loopParalAsync19
+for_loopParalAsync19 : emit c16 --> for_loopParalAsync18
+for_loopParalAsync18 : emit c15 --> for_loopParalAsync17
+for_loopParalAsync17 : li %6, 1 --> for_loopParalAsync3
+for_loopParalAsync3 : j --> for_loopParalAsync16
+for_loopParalAsync16 : li %12, 0 --> for_loopParalAsync15
+for_loopParalAsync15 : emit c14 --> for_loopParalAsync14
+for_loopParalAsync14 : slt %13, %6, %0 --> for_loopParalAsync13
+for_loopParalAsync13 : li %25, 0 --> for_loopParalAsync57
+for_loopParalAsync57 : seq %11, %13, %25 --> for_loopParalAsync12
+for_loopParalAsync12 : beq %11, %12 --> for_loopParalAsync11, for_loopParalAsync2
+for_loopParalAsync2 : emit c10 --> for_loopParalAsync1
+for_loopParalAsync1 : move %8, %5 --> for_loopParalAsync0
+for_loopParalAsync0 : j --> for_loopParalAsync106
+for_loopParalAsync106: move $v0, %8 --> for_loopParalAsync105
+for_loopParalAsync105: move $ra, %35 --> for_loopParalAsync104
+for_loopParalAsync104: move $s7, %34 --> for_loopParalAsync103
+for_loopParalAsync103: move $s6, %33 --> for_loopParalAsync102
+for_loopParalAsync102: move $s5, %32 --> for_loopParalAsync101
+for_loopParalAsync101: move $s4, %31 --> for_loopParalAsync100
+for_loopParalAsync100: move $s3, %30 --> for_loopParalAsync99
+for_loopParalAsync99 : move $s2, %29 --> for_loopParalAsync98
+for_loopParalAsync98 : move $s1, %28 --> for_loopParalAsync97
+for_loopParalAsync97 : move $s0, %27 --> for_loopParalAsync96
+for_loopParalAsync96 : delframe --> for_loopParalAsync95
+for_loopParalAsync95 : jr $ra (xmits $v0)
+for_loopParalAsync11 : emit c12 --> for_loopParalAsync10
+for_loopParalAsync10 : li %10, 2 --> for_loopParalAsync9
+for_loopParalAsync9 : mulo %2, %2, %10 --> for_loopParalAsync8
+for_loopParalAsync8 : emit c11 --> for_loopParalAsync7
+for_loopParalAsync7 : div %3, %2, %6 --> for_loopParalAsync6
+for_loopParalAsync6 : emit c13 --> for_loopParalAsync5
+for_loopParalAsync5 : li %9, 1 --> for_loopParalAsync4
+for_loopParalAsync4 : add %6, %6, %9 --> for_loopParalAsync3
+for_loopParalAsync31 : emit c19 --> for_loopParalAsync30
+for_loopParalAsync30 : li %16, 1 --> for_loopParalAsync29
+for_loopParalAsync29 : add %5, %5, %16 --> for_loopParalAsync28
+for_loopParalAsync28 : emit c18 --> for_loopParalAsync27
+for_loopParalAsync27 : li %15, 2 --> for_loopParalAsync26
+for_loopParalAsync26 : add %1, %1, %15 --> for_loopParalAsync25
+for_loopParalAsync25 : emit c17 --> for_loopParalAsync24
+for_loopParalAsync24 : div %4, %1, %5 --> for_loopParalAsync23
+for_loopParalAsync23 : emit c20 --> for_loopParalAsync22
+for_loopParalAsync22 : li %14, 1 --> for_loopParalAsync21
+for_loopParalAsync21 : add %7, %7, %14 --> for_loopParalAsync20
+
+procedure for_incrParam(2)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23
+entry for_incrParam49
+for_incrParam49: newframe --> for_incrParam48
+for_incrParam48: move %23, $ra --> for_incrParam47
+for_incrParam47: move %22, $s7 --> for_incrParam46
+for_incrParam46: move %21, $s6 --> for_incrParam45
+for_incrParam45: move %20, $s5 --> for_incrParam44
+for_incrParam44: move %19, $s4 --> for_incrParam43
+for_incrParam43: move %18, $s3 --> for_incrParam42
+for_incrParam42: move %17, $s2 --> for_incrParam41
+for_incrParam41: move %16, $s1 --> for_incrParam40
+for_incrParam40: move %15, $s0 --> for_incrParam39
+for_incrParam39: move %0, $a0 --> for_incrParam38
+for_incrParam38: move %1, $a1 --> for_incrParam37
+for_incrParam37: li %2, 0 --> for_incrParam36
+for_incrParam36: li %3, 0 --> for_incrParam35
+for_incrParam35: li %4, 0 --> for_incrParam34
+for_incrParam34: li %6, 0 --> for_incrParam33
+for_incrParam33: li %7, 0 --> for_incrParam32
+for_incrParam32: li %8, 0 --> for_incrParam31
+for_incrParam31: li %9, 0 --> for_incrParam30
+for_incrParam30: li %10, 0 --> for_incrParam29
+for_incrParam29: li %11, 0 --> for_incrParam28
+for_incrParam28: li %12, 0 --> for_incrParam27
+for_incrParam27: li %13, 0 --> for_incrParam26
+for_incrParam26: li %14, 0 --> for_incrParam24
+for_incrParam24: emit c86 --> for_incrParam23
+for_incrParam23: add %2, %0, %1 --> for_incrParam22
+for_incrParam22: emit c85 --> for_incrParam21
+for_incrParam21: li %13, 3 --> for_incrParam20
+for_incrParam20: mulo %4, %13, %2 --> for_incrParam19
+for_incrParam19: emit c84 --> for_incrParam18
+for_incrParam18: emit c83 --> for_incrParam17
+for_incrParam17: li %12, 4 --> for_incrParam16
+for_incrParam16: sub %3, %2, %12 --> for_incrParam3
+for_incrParam3 : j --> for_incrParam15
+for_incrParam15: li %8, 0 --> for_incrParam14
+for_incrParam14: emit c82 --> for_incrParam13
+for_incrParam13: li %11, 6 --> for_incrParam12
+for_incrParam12: add %10, %1, %11 --> for_incrParam11
+for_incrParam11: slt %9, %3, %10 --> for_incrParam10
+for_incrParam10: li %14, 0 --> for_incrParam25
+for_incrParam25: seq %7, %9, %14 --> for_incrParam9
+for_incrParam9 : beq %7, %8 --> for_incrParam8, for_incrParam2
+for_incrParam2 : emit c79 --> for_incrParam1
+for_incrParam1 : move %5, %3 --> for_incrParam0
+for_incrParam0 : j --> for_incrParam61
+for_incrParam61: move $v0, %5 --> for_incrParam60
+for_incrParam60: move $ra, %23 --> for_incrParam59
+for_incrParam59: move $s7, %22 --> for_incrParam58
+for_incrParam58: move $s6, %21 --> for_incrParam57
+for_incrParam57: move $s5, %20 --> for_incrParam56
+for_incrParam56: move $s4, %19 --> for_incrParam55
+for_incrParam55: move $s3, %18 --> for_incrParam54
+for_incrParam54: move $s2, %17 --> for_incrParam53
+for_incrParam53: move $s1, %16 --> for_incrParam52
+for_incrParam52: move $s0, %15 --> for_incrParam51
+for_incrParam51: delframe --> for_incrParam50
+for_incrParam50: jr $ra (xmits $v0)
+for_incrParam8 : emit c80 --> for_incrParam7
+for_incrParam7 : add %6, %3, %2 --> for_incrParam6
+for_incrParam6 : add %3, %6, %0 --> for_incrParam5
+for_incrParam5 : emit c81 --> for_incrParam4
+for_incrParam4 : add %3, %3, %0 --> for_incrParam3
+
+procedure for_incr(2)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21
+entry for_incr44
+for_incr44: newframe --> for_incr43
+for_incr43: move %21, $ra --> for_incr42
+for_incr42: move %20, $s7 --> for_incr41
+for_incr41: move %19, $s6 --> for_incr40
+for_incr40: move %18, $s5 --> for_incr39
+for_incr39: move %17, $s4 --> for_incr38
+for_incr38: move %16, $s3 --> for_incr37
+for_incr37: move %15, $s2 --> for_incr36
+for_incr36: move %14, $s1 --> for_incr35
+for_incr35: move %13, $s0 --> for_incr34
+for_incr34: move %0, $a0 --> for_incr33
+for_incr33: move %1, $a1 --> for_incr32
+for_incr32: li %2, 0 --> for_incr31
+for_incr31: li %3, 0 --> for_incr30
+for_incr30: li %5, 0 --> for_incr29
+for_incr29: li %6, 0 --> for_incr28
+for_incr28: li %7, 0 --> for_incr27
+for_incr27: li %8, 0 --> for_incr26
+for_incr26: li %9, 0 --> for_incr25
+for_incr25: li %10, 0 --> for_incr24
+for_incr24: li %11, 0 --> for_incr23
+for_incr23: li %12, 0 --> for_incr21
+for_incr21: emit c78 --> for_incr20
+for_incr20: li %2, 0 --> for_incr19
+for_incr19: emit c77 --> for_incr18
+for_incr18: emit c76 --> for_incr17
+for_incr17: li %11, 3 --> for_incr16
+for_incr16: add %3, %0, %11 --> for_incr3
+for_incr3 : j --> for_incr15
+for_incr15: li %7, 0 --> for_incr14
+for_incr14: emit c75 --> for_incr13
+for_incr13: li %10, 2 --> for_incr12
+for_incr12: mulo %9, %1, %10 --> for_incr11
+for_incr11: sle %8, %3, %9 --> for_incr10
+for_incr10: li %12, 0 --> for_incr22
+for_incr22: seq %6, %8, %12 --> for_incr9
+for_incr9 : beq %6, %7 --> for_incr8, for_incr2
+for_incr2 : emit c72 --> for_incr1
+for_incr1 : move %4, %2 --> for_incr0
+for_incr0 : j --> for_incr56
+for_incr56: move $v0, %4 --> for_incr55
+for_incr55: move $ra, %21 --> for_incr54
+for_incr54: move $s7, %20 --> for_incr53
+for_incr53: move $s6, %19 --> for_incr52
+for_incr52: move $s5, %18 --> for_incr51
+for_incr51: move $s4, %17 --> for_incr50
+for_incr50: move $s3, %16 --> for_incr49
+for_incr49: move $s2, %15 --> for_incr48
+for_incr48: move $s1, %14 --> for_incr47
+for_incr47: move $s0, %13 --> for_incr46
+for_incr46: delframe --> for_incr45
+for_incr45: jr $ra (xmits $v0)
+for_incr8 : emit c73 --> for_incr7
+for_incr7 : sub %2, %2, %3 --> for_incr6
+for_incr6 : emit c74 --> for_incr5
+for_incr5 : li %5, 1 --> for_incr4
+for_incr4 : add %3, %3, %5 --> for_incr3
+
+procedure for_imbriq(2)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26
+entry for_imbriq64
+for_imbriq64: newframe --> for_imbriq63
+for_imbriq63: move %26, $ra --> for_imbriq62
+for_imbriq62: move %25, $s7 --> for_imbriq61
+for_imbriq61: move %24, $s6 --> for_imbriq60
+for_imbriq60: move %23, $s5 --> for_imbriq59
+for_imbriq59: move %22, $s4 --> for_imbriq58
+for_imbriq58: move %21, $s3 --> for_imbriq57
+for_imbriq57: move %20, $s2 --> for_imbriq56
+for_imbriq56: move %19, $s1 --> for_imbriq55
+for_imbriq55: move %18, $s0 --> for_imbriq54
+for_imbriq54: move %0, $a0 --> for_imbriq53
+for_imbriq53: move %1, $a1 --> for_imbriq52
+for_imbriq52: li %2, 0 --> for_imbriq51
+for_imbriq51: li %3, 0 --> for_imbriq50
+for_imbriq50: li %4, 0 --> for_imbriq49
+for_imbriq49: li %5, 0 --> for_imbriq48
+for_imbriq48: li %7, 0 --> for_imbriq47
+for_imbriq47: li %8, 0 --> for_imbriq46
+for_imbriq46: li %9, 0 --> for_imbriq45
+for_imbriq45: li %10, 0 --> for_imbriq44
+for_imbriq44: li %11, 0 --> for_imbriq43
+for_imbriq43: li %12, 0 --> for_imbriq42
+for_imbriq42: li %13, 0 --> for_imbriq41
+for_imbriq41: li %14, 0 --> for_imbriq40
+for_imbriq40: li %15, 0 --> for_imbriq39
+for_imbriq39: li %16, 0 --> for_imbriq38
+for_imbriq38: li %17, 0 --> for_imbriq34
+for_imbriq34: emit c71 --> for_imbriq33
+for_imbriq33: li %5, 0 --> for_imbriq32
+for_imbriq32: emit c70 --> for_imbriq31
+for_imbriq31: emit c69 --> for_imbriq30
+for_imbriq30: li %3, 0 --> for_imbriq3
+for_imbriq3 : j --> for_imbriq29
+for_imbriq29: li %12, 0 --> for_imbriq28
+for_imbriq28: emit c68 --> for_imbriq27
+for_imbriq27: li %14, 23 --> for_imbriq26
+for_imbriq26: slt %13, %3, %14 --> for_imbriq25
+for_imbriq25: li %16, 0 --> for_imbriq36
+for_imbriq36: seq %11, %13, %16 --> for_imbriq24
+for_imbriq24: beq %11, %12 --> for_imbriq23, for_imbriq2
+for_imbriq2 : emit c59 --> for_imbriq1
+for_imbriq1 : move %6, %5 --> for_imbriq0
+for_imbriq0 : j --> for_imbriq76
+for_imbriq76: move $v0, %6 --> for_imbriq75
+for_imbriq75: move $ra, %26 --> for_imbriq74
+for_imbriq74: move $s7, %25 --> for_imbriq73
+for_imbriq73: move $s6, %24 --> for_imbriq72
+for_imbriq72: move $s5, %23 --> for_imbriq71
+for_imbriq71: move $s4, %22 --> for_imbriq70
+for_imbriq70: move $s3, %21 --> for_imbriq69
+for_imbriq69: move $s2, %20 --> for_imbriq68
+for_imbriq68: move $s1, %19 --> for_imbriq67
+for_imbriq67: move $s0, %18 --> for_imbriq66
+for_imbriq66: delframe --> for_imbriq65
+for_imbriq65: jr $ra (xmits $v0)
+for_imbriq23: emit c66 --> for_imbriq22
+for_imbriq22: li %4, 0 --> for_imbriq21
+for_imbriq21: emit c65 --> for_imbriq20
+for_imbriq20: emit c64 --> for_imbriq19
+for_imbriq19: li %2, 1 --> for_imbriq6
+for_imbriq6 : j --> for_imbriq18
+for_imbriq18: li %8, 0 --> for_imbriq17
+for_imbriq17: emit c63 --> for_imbriq16
+for_imbriq16: li %10, 12 --> for_imbriq15
+for_imbriq15: slt %9, %2, %10 --> for_imbriq14
+for_imbriq14: li %15, 0 --> for_imbriq35
+for_imbriq35: seq %7, %9, %15 --> for_imbriq13
+for_imbriq13: beq %7, %8 --> for_imbriq12, for_imbriq5
+for_imbriq5 : emit c67 --> for_imbriq4
+for_imbriq4 : add %3, %3, %0 --> for_imbriq3
+for_imbriq12: emit c61 --> for_imbriq11
+for_imbriq11: add %5, %5, %4 --> for_imbriq10
+for_imbriq10: emit c60 --> for_imbriq9
+for_imbriq9 : la %17, mod --> for_imbriq37
+for_imbriq37: j --> for_imbriq80
+for_imbriq80: move $a0, %4 --> for_imbriq79
+for_imbriq79: move $a1, %2 --> for_imbriq78
+for_imbriq78: call %17(2) --> for_imbriq77
+for_imbriq77: move %4, $v0 --> for_imbriq8
+for_imbriq8 : emit c62 --> for_imbriq7
+for_imbriq7 : add %2, %2, %1 --> for_imbriq6
+
+procedure for_fortSimple(3)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20
+entry for_fortSimple41
+for_fortSimple41: newframe --> for_fortSimple40
+for_fortSimple40: move %20, $ra --> for_fortSimple39
+for_fortSimple39: move %19, $s7 --> for_fortSimple38
+for_fortSimple38: move %18, $s6 --> for_fortSimple37
+for_fortSimple37: move %17, $s5 --> for_fortSimple36
+for_fortSimple36: move %16, $s4 --> for_fortSimple35
+for_fortSimple35: move %15, $s3 --> for_fortSimple34
+for_fortSimple34: move %14, $s2 --> for_fortSimple33
+for_fortSimple33: move %13, $s1 --> for_fortSimple32
+for_fortSimple32: move %12, $s0 --> for_fortSimple31
+for_fortSimple31: move %0, $a0 --> for_fortSimple30
+for_fortSimple30: move %1, $a1 --> for_fortSimple29
+for_fortSimple29: move %2, $a2 --> for_fortSimple28
+for_fortSimple28: li %3, 0 --> for_fortSimple27
+for_fortSimple27: li %4, 0 --> for_fortSimple26
+for_fortSimple26: li %5, 0 --> for_fortSimple25
+for_fortSimple25: li %6, 0 --> for_fortSimple24
+for_fortSimple24: li %8, 0 --> for_fortSimple23
+for_fortSimple23: li %9, 0 --> for_fortSimple22
+for_fortSimple22: li %10, 0 --> for_fortSimple21
+for_fortSimple21: li %11, 0 --> for_fortSimple19
+for_fortSimple19: emit c58 --> for_fortSimple18
+for_fortSimple18: li %3, 0 --> for_fortSimple17
+for_fortSimple17: emit c57 --> for_fortSimple16
+for_fortSimple16: emit c56 --> for_fortSimple15
+for_fortSimple15: move %5, %0 --> for_fortSimple5
+for_fortSimple5 : j --> for_fortSimple14
+for_fortSimple14: li %9, 0 --> for_fortSimple13
+for_fortSimple13: emit c55 --> for_fortSimple12
+for_fortSimple12: slt %10, %5, %1 --> for_fortSimple11
+for_fortSimple11: li %11, 0 --> for_fortSimple20
+for_fortSimple20: seq %8, %10, %11 --> for_fortSimple10
+for_fortSimple10: beq %8, %9 --> for_fortSimple9, for_fortSimple4
+for_fortSimple4 : emit c52 --> for_fortSimple3
+for_fortSimple3 : add %4, %3, %0 --> for_fortSimple2
+for_fortSimple2 : emit c51 --> for_fortSimple1
+for_fortSimple1 : move %7, %4 --> for_fortSimple0
+for_fortSimple0 : j --> for_fortSimple53
+for_fortSimple53: move $v0, %7 --> for_fortSimple52
+for_fortSimple52: move $ra, %20 --> for_fortSimple51
+for_fortSimple51: move $s7, %19 --> for_fortSimple50
+for_fortSimple50: move $s6, %18 --> for_fortSimple49
+for_fortSimple49: move $s5, %17 --> for_fortSimple48
+for_fortSimple48: move $s4, %16 --> for_fortSimple47
+for_fortSimple47: move $s3, %15 --> for_fortSimple46
+for_fortSimple46: move $s2, %14 --> for_fortSimple45
+for_fortSimple45: move $s1, %13 --> for_fortSimple44
+for_fortSimple44: move $s0, %12 --> for_fortSimple43
+for_fortSimple43: delframe --> for_fortSimple42
+for_fortSimple42: jr $ra (xmits $v0)
+for_fortSimple9 : emit c53 --> for_fortSimple8
+for_fortSimple8 : add %3, %3, %5 --> for_fortSimple7
+for_fortSimple7 : emit c54 --> for_fortSimple6
+for_fortSimple6 : add %5, %5, %2 --> for_fortSimple5
+
+procedure for_forfor(0)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19
+entry for_forfor44
+for_forfor44: newframe --> for_forfor43
+for_forfor43: move %19, $ra --> for_forfor42
+for_forfor42: move %18, $s7 --> for_forfor41
+for_forfor41: move %17, $s6 --> for_forfor40
+for_forfor40: move %16, $s5 --> for_forfor39
+for_forfor39: move %15, $s4 --> for_forfor38
+for_forfor38: move %14, $s3 --> for_forfor37
+for_forfor37: move %13, $s2 --> for_forfor36
+for_forfor36: move %12, $s1 --> for_forfor35
+for_forfor35: move %11, $s0 --> for_forfor34
+for_forfor34: li %0, 0 --> for_forfor33
+for_forfor33: li %1, 0 --> for_forfor32
+for_forfor32: li %3, 0 --> for_forfor31
+for_forfor31: li %4, 0 --> for_forfor30
+for_forfor30: li %5, 0 --> for_forfor29
+for_forfor29: li %6, 0 --> for_forfor28
+for_forfor28: li %7, 0 --> for_forfor27
+for_forfor27: li %8, 0 --> for_forfor26
+for_forfor26: li %9, 0 --> for_forfor25
+for_forfor25: li %10, 0 --> for_forfor23
+for_forfor23: emit c94 --> for_forfor22
+for_forfor22: emit c93 --> for_forfor21
+for_forfor21: li %1, 0 --> for_forfor20
+for_forfor20: emit c92 --> for_forfor19
+for_forfor19: li %0, 0 --> for_forfor3
+for_forfor3 : j --> for_forfor18
+for_forfor18: li %7, 0 --> for_forfor17
+for_forfor17: emit c91 --> for_forfor16
+for_forfor16: li %9, 10 --> for_forfor15
+for_forfor15: slt %8, %1, %9 --> for_forfor14
+for_forfor14: li %10, 0 --> for_forfor24
+for_forfor24: seq %6, %8, %10 --> for_forfor13
+for_forfor13: beq %6, %7 --> for_forfor12, for_forfor2
+for_forfor2 : emit c87 --> for_forfor1
+for_forfor1 : move %2, %0 --> for_forfor0
+for_forfor0 : j --> for_forfor56
+for_forfor56: move $v0, %2 --> for_forfor55
+for_forfor55: move $ra, %19 --> for_forfor54
+for_forfor54: move $s7, %18 --> for_forfor53
+for_forfor53: move $s6, %17 --> for_forfor52
+for_forfor52: move $s5, %16 --> for_forfor51
+for_forfor51: move $s4, %15 --> for_forfor50
+for_forfor50: move $s3, %14 --> for_forfor49
+for_forfor49: move $s2, %13 --> for_forfor48
+for_forfor48: move $s1, %12 --> for_forfor47
+for_forfor47: move $s0, %11 --> for_forfor46
+for_forfor46: delframe --> for_forfor45
+for_forfor45: jr $ra (xmits $v0)
+for_forfor12: emit c89 --> for_forfor11
+for_forfor11: li %5, 1 --> for_forfor10
+for_forfor10: add %0, %0, %5 --> for_forfor9
+for_forfor9 : emit c88 --> for_forfor8
+for_forfor8 : li %4, 1 --> for_forfor7
+for_forfor7 : add %0, %0, %4 --> for_forfor6
+for_forfor6 : emit c90 --> for_forfor5
+for_forfor5 : li %3, 1 --> for_forfor4
+for_forfor4 : add %1, %1, %3 --> for_forfor3
+
+procedure for_ex(3)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21
+entry for_ex43
+for_ex43: newframe --> for_ex42
+for_ex42: move %21, $ra --> for_ex41
+for_ex41: move %20, $s7 --> for_ex40
+for_ex40: move %19, $s6 --> for_ex39
+for_ex39: move %18, $s5 --> for_ex38
+for_ex38: move %17, $s4 --> for_ex37
+for_ex37: move %16, $s3 --> for_ex36
+for_ex36: move %15, $s2 --> for_ex35
+for_ex35: move %14, $s1 --> for_ex34
+for_ex34: move %13, $s0 --> for_ex33
+for_ex33: move %0, $a0 --> for_ex32
+for_ex32: move %1, $a1 --> for_ex31
+for_ex31: move %2, $a2 --> for_ex30
+for_ex30: li %3, 0 --> for_ex29
+for_ex29: li %4, 0 --> for_ex28
+for_ex28: li %6, 0 --> for_ex27
+for_ex27: li %7, 0 --> for_ex26
+for_ex26: li %8, 0 --> for_ex25
+for_ex25: li %9, 0 --> for_ex24
+for_ex24: li %10, 0 --> for_ex23
+for_ex23: li %11, 0 --> for_ex22
+for_ex22: li %12, 0 --> for_ex20
+for_ex20: emit c50 --> for_ex19
+for_ex19: li %3, 0 --> for_ex18
+for_ex18: emit c49 --> for_ex17
+for_ex17: emit c48 --> for_ex16
+for_ex16: li %11, 3 --> for_ex15
+for_ex15: add %4, %0, %11 --> for_ex3
+for_ex3 : j --> for_ex14
+for_ex14: li %7, 0 --> for_ex13
+for_ex13: emit c47 --> for_ex12
+for_ex12: li %10, 2 --> for_ex11
+for_ex11: mulo %9, %1, %10 --> for_ex10
+for_ex10: sle %8, %4, %9 --> for_ex9
+for_ex9 : li %12, 0 --> for_ex21
+for_ex21: seq %6, %8, %12 --> for_ex8
+for_ex8 : beq %6, %7 --> for_ex7, for_ex2
+for_ex2 : emit c44 --> for_ex1
+for_ex1 : move %5, %3 --> for_ex0
+for_ex0 : j --> for_ex55
+for_ex55: move $v0, %5 --> for_ex54
+for_ex54: move $ra, %21 --> for_ex53
+for_ex53: move $s7, %20 --> for_ex52
+for_ex52: move $s6, %19 --> for_ex51
+for_ex51: move $s5, %18 --> for_ex50
+for_ex50: move $s4, %17 --> for_ex49
+for_ex49: move $s3, %16 --> for_ex48
+for_ex48: move $s2, %15 --> for_ex47
+for_ex47: move $s1, %14 --> for_ex46
+for_ex46: move $s0, %13 --> for_ex45
+for_ex45: delframe --> for_ex44
+for_ex44: jr $ra (xmits $v0)
+for_ex7 : emit c45 --> for_ex6
+for_ex6 : sub %3, %3, %4 --> for_ex5
+for_ex5 : emit c46 --> for_ex4
+for_ex4 : add %4, %4, %2 --> for_ex3
+
+procedure for_double(1)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25
+entry for_double64
+for_double64: newframe --> for_double63
+for_double63: move %25, $ra --> for_double62
+for_double62: move %24, $s7 --> for_double61
+for_double61: move %23, $s6 --> for_double60
+for_double60: move %22, $s5 --> for_double59
+for_double59: move %21, $s4 --> for_double58
+for_double58: move %20, $s3 --> for_double57
+for_double57: move %19, $s2 --> for_double56
+for_double56: move %18, $s1 --> for_double55
+for_double55: move %17, $s0 --> for_double54
+for_double54: move %0, $a0 --> for_double53
+for_double53: li %1, 0 --> for_double52
+for_double52: li %2, 0 --> for_double51
+for_double51: li %3, 0 --> for_double50
+for_double50: li %4, 0 --> for_double49
+for_double49: li %5, 0 --> for_double48
+for_double48: li %7, 0 --> for_double47
+for_double47: li %8, 0 --> for_double46
+for_double46: li %9, 0 --> for_double45
+for_double45: li %10, 0 --> for_double44
+for_double44: li %11, 0 --> for_double43
+for_double43: li %12, 0 --> for_double42
+for_double42: li %13, 0 --> for_double41
+for_double41: li %14, 0 --> for_double40
+for_double40: li %15, 0 --> for_double39
+for_double39: li %16, 0 --> for_double36
+for_double36: emit c43 --> for_double35
+for_double35: li %5, 0 --> for_double34
+for_double34: emit c42 --> for_double33
+for_double33: li %4, 0 --> for_double32
+for_double32: emit c41 --> for_double31
+for_double31: emit c40 --> for_double30
+for_double30: li %2, 0 --> for_double19
+for_double19: j --> for_double29
+for_double29: li %12, 0 --> for_double28
+for_double28: emit c39 --> for_double27
+for_double27: li %14, 12 --> for_double26
+for_double26: slt %13, %2, %14 --> for_double25
+for_double25: li %16, 0 --> for_double38
+for_double38: seq %11, %13, %16 --> for_double24
+for_double24: beq %11, %12 --> for_double23, for_double18
+for_double18: emit c36 --> for_double17
+for_double17: emit c35 --> for_double16
+for_double16: li %1, 0 --> for_double5
+for_double5 : j --> for_double15
+for_double15: li %8, 0 --> for_double14
+for_double14: emit c34 --> for_double13
+for_double13: li %10, 5 --> for_double12
+for_double12: slt %9, %1, %10 --> for_double11
+for_double11: li %15, 0 --> for_double37
+for_double37: seq %7, %9, %15 --> for_double10
+for_double10: beq %7, %8 --> for_double9, for_double4
+for_double4 : emit c31 --> for_double3
+for_double3 : mulo %3, %5, %4 --> for_double2
+for_double2 : emit c30 --> for_double1
+for_double1 : move %6, %3 --> for_double0
+for_double0 : j --> for_double76
+for_double76: move $v0, %6 --> for_double75
+for_double75: move $ra, %25 --> for_double74
+for_double74: move $s7, %24 --> for_double73
+for_double73: move $s6, %23 --> for_double72
+for_double72: move $s5, %22 --> for_double71
+for_double71: move $s4, %21 --> for_double70
+for_double70: move $s3, %20 --> for_double69
+for_double69: move $s2, %19 --> for_double68
+for_double68: move $s1, %18 --> for_double67
+for_double67: move $s0, %17 --> for_double66
+for_double66: delframe --> for_double65
+for_double65: jr $ra (xmits $v0)
+for_double9 : emit c32 --> for_double8
+for_double8 : add %4, %4, %1 --> for_double7
+for_double7 : emit c33 --> for_double6
+for_double6 : add %1, %1, %0 --> for_double5
+for_double23: emit c37 --> for_double22
+for_double22: add %5, %5, %2 --> for_double21
+for_double21: emit c38 --> for_double20
+for_double20: add %2, %2, %0 --> for_double19
+
+procedure for_2(2)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24
+entry for_253
+for_253: newframe --> for_252
+for_252: move %24, $ra --> for_251
+for_251: move %23, $s7 --> for_250
+for_250: move %22, $s6 --> for_249
+for_249: move %21, $s5 --> for_248
+for_248: move %20, $s4 --> for_247
+for_247: move %19, $s3 --> for_246
+for_246: move %18, $s2 --> for_245
+for_245: move %17, $s1 --> for_244
+for_244: move %16, $s0 --> for_243
+for_243: move %0, $a0 --> for_242
+for_242: move %1, $a1 --> for_241
+for_241: li %2, 0 --> for_240
+for_240: li %3, 0 --> for_239
+for_239: li %4, 0 --> for_238
+for_238: li %5, 0 --> for_237
+for_237: li %6, 0 --> for_236
+for_236: li %8, 0 --> for_235
+for_235: li %9, 0 --> for_234
+for_234: li %10, 0 --> for_233
+for_233: li %11, 0 --> for_232
+for_232: li %12, 0 --> for_231
+for_231: li %13, 0 --> for_230
+for_230: li %14, 0 --> for_229
+for_229: li %15, 0 --> for_227
+for_227: emit c9 --> for_226
+for_226: li %5, 0 --> for_225
+for_225: emit c8 --> for_224
+for_224: li %14, 2 --> for_223
+for_223: mulo %6, %0, %14 --> for_222
+for_222: emit c7 --> for_221
+for_221: li %13, 4 --> for_220
+for_220: mulo %2, %0, %13 --> for_219
+for_219: emit c6 --> for_218
+for_218: li %12, 1 --> for_217
+for_217: add %3, %1, %12 --> for_216
+for_216: emit c5 --> for_215
+for_215: emit c4 --> for_214
+for_214: move %4, %6 --> for_24
+for_24 : j --> for_213
+for_213: li %10, 0 --> for_212
+for_212: emit c3 --> for_211
+for_211: slt %11, %4, %2 --> for_210
+for_210: li %15, 0 --> for_228
+for_228: seq %9, %11, %15 --> for_29
+for_29 : beq %9, %10 --> for_28, for_23
+for_23 : emit c0 --> for_22
+for_22 : li %8, 1 --> for_21
+for_21 : add %7, %5, %8 --> for_20
+for_20 : j --> for_265
+for_265: move $v0, %7 --> for_264
+for_264: move $ra, %24 --> for_263
+for_263: move $s7, %23 --> for_262
+for_262: move $s6, %22 --> for_261
+for_261: move $s5, %21 --> for_260
+for_260: move $s4, %20 --> for_259
+for_259: move $s3, %19 --> for_258
+for_258: move $s2, %18 --> for_257
+for_257: move $s1, %17 --> for_256
+for_256: move $s0, %16 --> for_255
+for_255: delframe --> for_254
+for_254: jr $ra (xmits $v0)
+for_28 : emit c1 --> for_27
+for_27 : add %5, %5, %4 --> for_26
+for_26 : emit c2 --> for_25
+for_25 : add %4, %4, %3 --> for_24
+
+procedure _main(0)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37
+entry main85
+main85 : newframe --> main84
+main84 : move %37, $ra --> main83
+main83 : move %36, $s7 --> main82
+main82 : move %35, $s6 --> main81
+main81 : move %34, $s5 --> main80
+main80 : move %33, $s4 --> main79
+main79 : move %32, $s3 --> main78
+main78 : move %31, $s2 --> main77
+main77 : move %30, $s1 --> main76
+main76 : move %29, $s0 --> main75
+main75 : li %0, 0 --> main74
+main74 : li %2, 0 --> main73
+main73 : li %3, 0 --> main72
+main72 : li %4, 0 --> main71
+main71 : li %5, 0 --> main70
+main70 : li %6, 0 --> main69
+main69 : li %7, 0 --> main68
+main68 : li %8, 0 --> main67
+main67 : li %9, 0 --> main66
+main66 : li %10, 0 --> main65
+main65 : li %11, 0 --> main64
+main64 : li %12, 0 --> main63
+main63 : li %13, 0 --> main62
+main62 : li %14, 0 --> main61
+main61 : li %15, 0 --> main60
+main60 : li %16, 0 --> main59
+main59 : li %17, 0 --> main58
+main58 : li %18, 0 --> main57
+main57 : li %19, 0 --> main56
+main56 : li %20, 0 --> main55
+main55 : li %21, 0 --> main54
+main54 : li %22, 0 --> main53
+main53 : li %23, 0 --> main52
+main52 : li %24, 0 --> main51
+main51 : li %25, 0 --> main50
+main50 : li %26, 0 --> main49
+main49 : li %27, 0 --> main48
+main48 : li %28, 0 --> main38
+main38 : emit c104 --> main37
+main37 : li %18, 3 --> main36
+main36 : li %19, 1 --> main35
+main35 : la %26, for_2 --> main45
+main45 : j --> main125
+main125: move $a0, %18 --> main124
+main124: move $a1, %19 --> main123
+main123: call %26(2) --> main122
+main122: move %0, $v0 --> main34
+main34 : emit c103 --> main33
+main33 : li %15, 1 --> main32
+main32 : li %16, 2 --> main31
+main31 : li %17, 3 --> main30
+main30 : la %25, for_loopParalAsync --> main44
+main44 : j --> main121
+main121: move $a0, %15 --> main120
+main120: move $a1, %16 --> main119
+main119: move $a2, %17 --> main118
+main118: call %25(3) --> main117
+main117: move %0, $v0 --> main29
+main29 : emit c102 --> main28
+main28 : li %14, 1 --> main27
+main27 : la %23, for_double --> main42
+main42 : j --> main114
+main114: move $a0, %14 --> main113
+main113: call %23(1) --> main112
+main112: move %0, $v0 --> main26
+main26 : emit c101 --> main25
+main25 : li %11, 2 --> main24
+main24 : li %12, 10 --> main23
+main23 : li %13, 1 --> main22
+main22 : la %22, for_ex --> main41
+main41 : j --> main111
+main111: move $a0, %11 --> main110
+main110: move $a1, %12 --> main109
+main109: move $a2, %13 --> main108
+main108: call %22(3) --> main107
+main107: move %0, $v0 --> main21
+main21 : emit c100 --> main20
+main20 : li %8, 2 --> main19
+main19 : li %9, 10 --> main18
+main18 : li %10, 1 --> main17
+main17 : la %21, for_fortSimple --> main40
+main40 : j --> main106
+main106: move $a0, %8 --> main105
+main105: move $a1, %9 --> main104
+main104: move $a2, %10 --> main103
+main103: call %21(3) --> main102
+main102: move %0, $v0 --> main16
+main16 : emit c99 --> main15
+main15 : li %6, 2 --> main14
+main14 : li %7, 3 --> main13
+main13 : la %20, for_imbriq --> main39
+main39 : j --> main101
+main101: move $a0, %6 --> main100
+main100: move $a1, %7 --> main99
+main99 : call %20(2) --> main98
+main98 : move %0, $v0 --> main12
+main12 : emit c98 --> main11
+main11 : li %4, 2 --> main10
+main10 : li %5, 3 --> main9
+main9 : la %28, for_incr --> main47
+main47 : j --> main133
+main133: move $a0, %4 --> main132
+main132: move $a1, %5 --> main131
+main131: call %28(2) --> main130
+main130: move %0, $v0 --> main8
+main8 : emit c97 --> main7
+main7 : li %2, 2 --> main6
+main6 : li %3, 3 --> main5
+main5 : la %27, for_incrParam --> main46
+main46 : j --> main129
+main129: move $a0, %2 --> main128
+main128: move $a1, %3 --> main127
+main127: call %27(2) --> main126
+main126: move %0, $v0 --> main4
+main4 : emit c96 --> main3
+main3 : la %24, for_forfor --> main43
+main43 : j --> main116
+main116: call %24(0) --> main115
+main115: move %0, $v0 --> main2
+main2 : emit c95 --> main1
+main1 : move %1, %0 --> main0
+main0 : j --> main97
+main97 : move $v0, %1 --> main96
+main96 : move $ra, %37 --> main95
+main95 : move $s7, %36 --> main94
+main94 : move $s6, %35 --> main93
+main93 : move $s5, %34 --> main92
+main92 : move $s4, %33 --> main91
+main91 : move $s3, %32 --> main90
+main90 : move $s2, %31 --> main89
+main89 : move $s1, %30 --> main88
+main88 : move $s0, %29 --> main87
+main87 : delframe --> main86
+main86 : jr $ra (xmits $v0)
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure for_loopParalAsync(3)
+var 0
+for_loopParalAsync94:
+newframe
+c29:
+li $v0, 0
+c28:
+li $a2, 0
+c27:
+li $a0, 3
+add $a2, $a2, $a0
+c26:
+li $a0, 2
+mulo $a2, $a2, $a0
+c25:
+li $a0, 3
+div $a2, $a2, $a0
+c24:
+li $a0, 8
+add $a2, $a2, $a0
+c23:
+c22:
+li $a1, 0
+for_loopParalAsync37:
+li $a3, 0
+c21:
+li $a0, 20
+slt $a0, $a1, $a0
+seq $a0, $a0, $zero
+beq $a0, $a3, for_loopParalAsync31
+c16:
+c15:
+li $a1, 1
+for_loopParalAsync16:
+li $a3, 0
+c14:
+slt $a0, $a1, $a2
+seq $a0, $a0, $zero
+beq $a0, $a3, for_loopParalAsync11
+c10:
+delframe
+jr $ra
+for_loopParalAsync11:
+c12:
+c11:
+c13:
+li $a0, 1
+add $a1, $a1, $a0
+j for_loopParalAsync16
+for_loopParalAsync31:
+c19:
+li $a0, 1
+add $v0, $v0, $a0
+c18:
+c17:
+c20:
+li $a0, 1
+add $a1, $a1, $a0
+j for_loopParalAsync37
+
+procedure for_incrParam(2)
+var 0
+for_incrParam49:
+newframe
+c86:
+add $a3, $a0, $a1
+c85:
+c84:
+c83:
+li $v0, 4
+sub $v0, $a3, $v0
+for_incrParam15:
+li $t0, 0
+c82:
+li $a2, 6
+add $a2, $a1, $a2
+slt $a2, $v0, $a2
+seq $a2, $a2, $zero
+beq $a2, $t0, for_incrParam8
+c79:
+delframe
+jr $ra
+for_incrParam8:
+c80:
+add $v0, $v0, $a3
+add $v0, $v0, $a0
+c81:
+add $v0, $v0, $a0
+j for_incrParam15
+
+procedure for_incr(2)
+var 0
+for_incr44:
+newframe
+c78:
+li $v0, 0
+c77:
+c76:
+li $a2, 3
+add $a2, $a0, $a2
+for_incr15:
+li $a3, 0
+c75:
+li $a0, 2
+mulo $a0, $a1, $a0
+sle $a0, $a2, $a0
+seq $a0, $a0, $zero
+beq $a0, $a3, for_incr8
+c72:
+delframe
+jr $ra
+for_incr8:
+c73:
+sub $v0, $v0, $a2
+c74:
+li $a0, 1
+add $a2, $a2, $a0
+j for_incr15
+
+procedure for_imbriq(2)
+var 24
+for_imbriq64:
+newframe
+sw $ra, 20($sp)
+sw $s4, 16($sp)
+sw $s3, 12($sp)
+sw $s2, 8($sp)
+sw $s1, 4($sp)
+sw $s0, 0($sp)
+move $s4, $a0
+move $s3, $a1
+c71:
+li $s0, 0
+c70:
+c69:
+li $s1, 0
+for_imbriq29:
+li $a0, 0
+c68:
+li $v0, 23
+slt $v0, $s1, $v0
+seq $v0, $v0, $zero
+beq $v0, $a0, for_imbriq23
+c59:
+move $v0, $s0
+lw $ra, 20($sp)
+lw $s4, 16($sp)
+lw $s3, 12($sp)
+lw $s2, 8($sp)
+lw $s1, 4($sp)
+lw $s0, 0($sp)
+delframe
+jr $ra
+for_imbriq23:
+c66:
+li $v0, 0
+c65:
+c64:
+li $s2, 1
+for_imbriq18:
+li $a1, 0
+c63:
+li $a0, 12
+slt $a0, $s2, $a0
+seq $a0, $a0, $zero
+beq $a0, $a1, for_imbriq12
+c67:
+add $s1, $s1, $s4
+j for_imbriq29
+for_imbriq12:
+c61:
+add $s0, $s0, $v0
+c60:
+la $a2, mod
+move $a0, $v0
+move $a1, $s2
+call $a2
+c62:
+add $s2, $s2, $s3
+j for_imbriq18
+
+procedure for_fortSimple(3)
+var 0
+for_fortSimple41:
+newframe
+c58:
+li $t0, 0
+c57:
+c56:
+move $a3, $a0
+for_fortSimple14:
+li $t1, 0
+c55:
+slt $v0, $a3, $a1
+seq $v0, $v0, $zero
+beq $v0, $t1, for_fortSimple9
+c52:
+add $v0, $t0, $a0
+c51:
+delframe
+jr $ra
+for_fortSimple9:
+c53:
+add $t0, $t0, $a3
+c54:
+add $a3, $a3, $a2
+j for_fortSimple14
+
+procedure for_forfor(0)
+var 0
+for_forfor44:
+newframe
+c94:
+c93:
+li $a1, 0
+c92:
+li $v0, 0
+for_forfor18:
+li $a2, 0
+c91:
+li $a0, 10
+slt $a0, $a1, $a0
+seq $a0, $a0, $zero
+beq $a0, $a2, for_forfor12
+c87:
+delframe
+jr $ra
+for_forfor12:
+c89:
+li $a0, 1
+add $v0, $v0, $a0
+c88:
+li $a0, 1
+add $v0, $v0, $a0
+c90:
+li $a0, 1
+add $a1, $a1, $a0
+j for_forfor18
+
+procedure for_ex(3)
+var 0
+for_ex43:
+newframe
+c50:
+li $v0, 0
+c49:
+c48:
+li $a3, 3
+add $a3, $a0, $a3
+for_ex14:
+li $t0, 0
+c47:
+li $a0, 2
+mulo $a0, $a1, $a0
+sle $a0, $a3, $a0
+seq $a0, $a0, $zero
+beq $a0, $t0, for_ex7
+c44:
+delframe
+jr $ra
+for_ex7:
+c45:
+sub $v0, $v0, $a3
+c46:
+add $a3, $a3, $a2
+j for_ex14
+
+procedure for_double(1)
+var 0
+for_double64:
+newframe
+c43:
+li $a1, 0
+c42:
+li $a2, 0
+c41:
+c40:
+li $a3, 0
+for_double29:
+li $t0, 0
+c39:
+li $v0, 12
+slt $v0, $a3, $v0
+seq $v0, $v0, $zero
+beq $v0, $t0, for_double23
+c36:
+c35:
+li $a3, 0
+for_double15:
+li $t0, 0
+c34:
+li $v0, 5
+slt $v0, $a3, $v0
+seq $v0, $v0, $zero
+beq $v0, $t0, for_double9
+c31:
+mulo $v0, $a1, $a2
+c30:
+delframe
+jr $ra
+for_double9:
+c32:
+add $a2, $a2, $a3
+c33:
+add $a3, $a3, $a0
+j for_double15
+for_double23:
+c37:
+add $a1, $a1, $a3
+c38:
+add $a3, $a3, $a0
+j for_double29
+
+procedure for_2(2)
+var 0
+for_253:
+newframe
+c9:
+li $a2, 0
+c8:
+li $v0, 2
+mulo $v0, $a0, $v0
+c7:
+li $a3, 4
+mulo $a0, $a0, $a3
+c6:
+li $a3, 1
+add $a1, $a1, $a3
+c5:
+c4:
+for_213:
+li $t0, 0
+c3:
+slt $a3, $v0, $a0
+seq $a3, $a3, $zero
+beq $a3, $t0, for_28
+c0:
+li $v0, 1
+add $v0, $a2, $v0
+delframe
+jr $ra
+for_28:
+c1:
+add $a2, $a2, $v0
+c2:
+add $v0, $v0, $a1
+j for_213
+
+procedure _main(0)
+var 4
+main85:
+newframe
+sw $ra, 0($sp)
+c104:
+li $a0, 3
+li $a1, 1
+la $v0, for_2
+call $v0
+c103:
+li $a0, 1
+li $a1, 2
+li $a2, 3
+la $v0, for_loopParalAsync
+call $v0
+c102:
+li $a0, 1
+la $v0, for_double
+call $v0
+c101:
+li $a0, 2
+li $a1, 10
+li $a2, 1
+la $v0, for_ex
+call $v0
+c100:
+li $a0, 2
+li $a1, 10
+li $a2, 1
+la $v0, for_fortSimple
+call $v0
+c99:
+li $a0, 2
+li $a1, 3
+la $v0, for_imbriq
+call $v0
+c98:
+li $a0, 2
+li $a1, 3
+la $v0, for_incr
+call $v0
+c97:
+li $a0, 2
+li $a1, 3
+la $v0, for_incrParam
+call $v0
+c96:
+la $v0, for_forfor
+call $v0
+c95:
+lw $ra, 0($sp)
+delframe
+jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure for_loopParalAsync(3)
+var 0
+entry for_loopParalAsync94
+for_loopParalAsync94 : newframe --> for_loopParalAsync93
+for_loopParalAsync93 : j --> for_loopParalAsync92
+for_loopParalAsync92 : j --> for_loopParalAsync91
+for_loopParalAsync91 : j --> for_loopParalAsync90
+for_loopParalAsync90 : j --> for_loopParalAsync89
+for_loopParalAsync89 : j --> for_loopParalAsync88
+for_loopParalAsync88 : j --> for_loopParalAsync87
+for_loopParalAsync87 : j --> for_loopParalAsync86
+for_loopParalAsync86 : j --> for_loopParalAsync85
+for_loopParalAsync85 : j --> for_loopParalAsync84
+for_loopParalAsync84 : j --> for_loopParalAsync83
+for_loopParalAsync83 : j --> for_loopParalAsync82
+for_loopParalAsync82 : j --> for_loopParalAsync81
+for_loopParalAsync81 : j --> for_loopParalAsync80
+for_loopParalAsync80 : j --> for_loopParalAsync79
+for_loopParalAsync79 : j --> for_loopParalAsync78
+for_loopParalAsync78 : j --> for_loopParalAsync77
+for_loopParalAsync77 : j --> for_loopParalAsync76
+for_loopParalAsync76 : j --> for_loopParalAsync75
+for_loopParalAsync75 : j --> for_loopParalAsync74
+for_loopParalAsync74 : j --> for_loopParalAsync73
+for_loopParalAsync73 : j --> for_loopParalAsync72
+for_loopParalAsync72 : j --> for_loopParalAsync71
+for_loopParalAsync71 : j --> for_loopParalAsync70
+for_loopParalAsync70 : j --> for_loopParalAsync69
+for_loopParalAsync69 : j --> for_loopParalAsync68
+for_loopParalAsync68 : j --> for_loopParalAsync67
+for_loopParalAsync67 : j --> for_loopParalAsync66
+for_loopParalAsync66 : j --> for_loopParalAsync65
+for_loopParalAsync65 : j --> for_loopParalAsync64
+for_loopParalAsync64 : j --> for_loopParalAsync63
+for_loopParalAsync63 : j --> for_loopParalAsync62
+for_loopParalAsync62 : j --> for_loopParalAsync61
+for_loopParalAsync61 : j --> for_loopParalAsync60
+for_loopParalAsync60 : j --> for_loopParalAsync59
+for_loopParalAsync59 : j --> for_loopParalAsync56
+for_loopParalAsync56 : emit c29 --> for_loopParalAsync55
+for_loopParalAsync55 : li $v0, 0 --> for_loopParalAsync54
+for_loopParalAsync54 : emit c28 --> for_loopParalAsync53
+for_loopParalAsync53 : li $a2, 0 --> for_loopParalAsync52
+for_loopParalAsync52 : emit c27 --> for_loopParalAsync51
+for_loopParalAsync51 : li $a0, 3 --> for_loopParalAsync50
+for_loopParalAsync50 : add $a2, $a2, $a0 --> for_loopParalAsync49
+for_loopParalAsync49 : emit c26 --> for_loopParalAsync48
+for_loopParalAsync48 : li $a0, 2 --> for_loopParalAsync47
+for_loopParalAsync47 : mulo $a2, $a2, $a0 --> for_loopParalAsync46
+for_loopParalAsync46 : emit c25 --> for_loopParalAsync45
+for_loopParalAsync45 : li $a0, 3 --> for_loopParalAsync44
+for_loopParalAsync44 : div $a2, $a2, $a0 --> for_loopParalAsync43
+for_loopParalAsync43 : emit c24 --> for_loopParalAsync42
+for_loopParalAsync42 : li $a0, 8 --> for_loopParalAsync41
+for_loopParalAsync41 : add $a2, $a2, $a0 --> for_loopParalAsync40
+for_loopParalAsync40 : emit c23 --> for_loopParalAsync39
+for_loopParalAsync39 : emit c22 --> for_loopParalAsync38
+for_loopParalAsync38 : li $a1, 0 --> for_loopParalAsync20
+for_loopParalAsync20 : j --> for_loopParalAsync37
+for_loopParalAsync37 : li $a3, 0 --> for_loopParalAsync36
+for_loopParalAsync36 : emit c21 --> for_loopParalAsync35
+for_loopParalAsync35 : li $a0, 20 --> for_loopParalAsync34
+for_loopParalAsync34 : slt $a0, $a1, $a0 --> for_loopParalAsync33
+for_loopParalAsync33 : j --> for_loopParalAsync58
+for_loopParalAsync58 : seq $a0, $a0, $zero --> for_loopParalAsync32
+for_loopParalAsync32 : beq $a0, $a3 --> for_loopParalAsync31, for_loopParalAsync19
+for_loopParalAsync19 : emit c16 --> for_loopParalAsync18
+for_loopParalAsync18 : emit c15 --> for_loopParalAsync17
+for_loopParalAsync17 : li $a1, 1 --> for_loopParalAsync3
+for_loopParalAsync3 : j --> for_loopParalAsync16
+for_loopParalAsync16 : li $a3, 0 --> for_loopParalAsync15
+for_loopParalAsync15 : emit c14 --> for_loopParalAsync14
+for_loopParalAsync14 : slt $a0, $a1, $a2 --> for_loopParalAsync13
+for_loopParalAsync13 : j --> for_loopParalAsync57
+for_loopParalAsync57 : seq $a0, $a0, $zero --> for_loopParalAsync12
+for_loopParalAsync12 : beq $a0, $a3 --> for_loopParalAsync11, for_loopParalAsync2
+for_loopParalAsync2 : emit c10 --> for_loopParalAsync1
+for_loopParalAsync1 : j --> for_loopParalAsync0
+for_loopParalAsync0 : j --> for_loopParalAsync106
+for_loopParalAsync106: j --> for_loopParalAsync105
+for_loopParalAsync105: j --> for_loopParalAsync104
+for_loopParalAsync104: j --> for_loopParalAsync103
+for_loopParalAsync103: j --> for_loopParalAsync102
+for_loopParalAsync102: j --> for_loopParalAsync101
+for_loopParalAsync101: j --> for_loopParalAsync100
+for_loopParalAsync100: j --> for_loopParalAsync99
+for_loopParalAsync99 : j --> for_loopParalAsync98
+for_loopParalAsync98 : j --> for_loopParalAsync97
+for_loopParalAsync97 : j --> for_loopParalAsync96
+for_loopParalAsync96 : delframe --> for_loopParalAsync95
+for_loopParalAsync95 : jr $ra
+for_loopParalAsync11 : emit c12 --> for_loopParalAsync10
+for_loopParalAsync10 : j --> for_loopParalAsync9
+for_loopParalAsync9 : j --> for_loopParalAsync8
+for_loopParalAsync8 : emit c11 --> for_loopParalAsync7
+for_loopParalAsync7 : j --> for_loopParalAsync6
+for_loopParalAsync6 : emit c13 --> for_loopParalAsync5
+for_loopParalAsync5 : li $a0, 1 --> for_loopParalAsync4
+for_loopParalAsync4 : add $a1, $a1, $a0 --> for_loopParalAsync3
+for_loopParalAsync31 : emit c19 --> for_loopParalAsync30
+for_loopParalAsync30 : li $a0, 1 --> for_loopParalAsync29
+for_loopParalAsync29 : add $v0, $v0, $a0 --> for_loopParalAsync28
+for_loopParalAsync28 : emit c18 --> for_loopParalAsync27
+for_loopParalAsync27 : j --> for_loopParalAsync26
+for_loopParalAsync26 : j --> for_loopParalAsync25
+for_loopParalAsync25 : emit c17 --> for_loopParalAsync24
+for_loopParalAsync24 : j --> for_loopParalAsync23
+for_loopParalAsync23 : emit c20 --> for_loopParalAsync22
+for_loopParalAsync22 : li $a0, 1 --> for_loopParalAsync21
+for_loopParalAsync21 : add $a1, $a1, $a0 --> for_loopParalAsync20
+
+procedure for_incrParam(2)
+var 0
+entry for_incrParam49
+for_incrParam49: newframe --> for_incrParam48
+for_incrParam48: j --> for_incrParam47
+for_incrParam47: j --> for_incrParam46
+for_incrParam46: j --> for_incrParam45
+for_incrParam45: j --> for_incrParam44
+for_incrParam44: j --> for_incrParam43
+for_incrParam43: j --> for_incrParam42
+for_incrParam42: j --> for_incrParam41
+for_incrParam41: j --> for_incrParam40
+for_incrParam40: j --> for_incrParam39
+for_incrParam39: j --> for_incrParam38
+for_incrParam38: j --> for_incrParam37
+for_incrParam37: j --> for_incrParam36
+for_incrParam36: j --> for_incrParam35
+for_incrParam35: j --> for_incrParam34
+for_incrParam34: j --> for_incrParam33
+for_incrParam33: j --> for_incrParam32
+for_incrParam32: j --> for_incrParam31
+for_incrParam31: j --> for_incrParam30
+for_incrParam30: j --> for_incrParam29
+for_incrParam29: j --> for_incrParam28
+for_incrParam28: j --> for_incrParam27
+for_incrParam27: j --> for_incrParam26
+for_incrParam26: j --> for_incrParam24
+for_incrParam24: emit c86 --> for_incrParam23
+for_incrParam23: add $a3, $a0, $a1 --> for_incrParam22
+for_incrParam22: emit c85 --> for_incrParam21
+for_incrParam21: j --> for_incrParam20
+for_incrParam20: j --> for_incrParam19
+for_incrParam19: emit c84 --> for_incrParam18
+for_incrParam18: emit c83 --> for_incrParam17
+for_incrParam17: li $v0, 4 --> for_incrParam16
+for_incrParam16: sub $v0, $a3, $v0 --> for_incrParam3
+for_incrParam3 : j --> for_incrParam15
+for_incrParam15: li $t0, 0 --> for_incrParam14
+for_incrParam14: emit c82 --> for_incrParam13
+for_incrParam13: li $a2, 6 --> for_incrParam12
+for_incrParam12: add $a2, $a1, $a2 --> for_incrParam11
+for_incrParam11: slt $a2, $v0, $a2 --> for_incrParam10
+for_incrParam10: j --> for_incrParam25
+for_incrParam25: seq $a2, $a2, $zero --> for_incrParam9
+for_incrParam9 : beq $a2, $t0 --> for_incrParam8, for_incrParam2
+for_incrParam2 : emit c79 --> for_incrParam1
+for_incrParam1 : j --> for_incrParam0
+for_incrParam0 : j --> for_incrParam61
+for_incrParam61: j --> for_incrParam60
+for_incrParam60: j --> for_incrParam59
+for_incrParam59: j --> for_incrParam58
+for_incrParam58: j --> for_incrParam57
+for_incrParam57: j --> for_incrParam56
+for_incrParam56: j --> for_incrParam55
+for_incrParam55: j --> for_incrParam54
+for_incrParam54: j --> for_incrParam53
+for_incrParam53: j --> for_incrParam52
+for_incrParam52: j --> for_incrParam51
+for_incrParam51: delframe --> for_incrParam50
+for_incrParam50: jr $ra
+for_incrParam8 : emit c80 --> for_incrParam7
+for_incrParam7 : add $v0, $v0, $a3 --> for_incrParam6
+for_incrParam6 : add $v0, $v0, $a0 --> for_incrParam5
+for_incrParam5 : emit c81 --> for_incrParam4
+for_incrParam4 : add $v0, $v0, $a0 --> for_incrParam3
+
+procedure for_incr(2)
+var 0
+entry for_incr44
+for_incr44: newframe --> for_incr43
+for_incr43: j --> for_incr42
+for_incr42: j --> for_incr41
+for_incr41: j --> for_incr40
+for_incr40: j --> for_incr39
+for_incr39: j --> for_incr38
+for_incr38: j --> for_incr37
+for_incr37: j --> for_incr36
+for_incr36: j --> for_incr35
+for_incr35: j --> for_incr34
+for_incr34: j --> for_incr33
+for_incr33: j --> for_incr32
+for_incr32: j --> for_incr31
+for_incr31: j --> for_incr30
+for_incr30: j --> for_incr29
+for_incr29: j --> for_incr28
+for_incr28: j --> for_incr27
+for_incr27: j --> for_incr26
+for_incr26: j --> for_incr25
+for_incr25: j --> for_incr24
+for_incr24: j --> for_incr23
+for_incr23: j --> for_incr21
+for_incr21: emit c78 --> for_incr20
+for_incr20: li $v0, 0 --> for_incr19
+for_incr19: emit c77 --> for_incr18
+for_incr18: emit c76 --> for_incr17
+for_incr17: li $a2, 3 --> for_incr16
+for_incr16: add $a2, $a0, $a2 --> for_incr3
+for_incr3 : j --> for_incr15
+for_incr15: li $a3, 0 --> for_incr14
+for_incr14: emit c75 --> for_incr13
+for_incr13: li $a0, 2 --> for_incr12
+for_incr12: mulo $a0, $a1, $a0 --> for_incr11
+for_incr11: sle $a0, $a2, $a0 --> for_incr10
+for_incr10: j --> for_incr22
+for_incr22: seq $a0, $a0, $zero --> for_incr9
+for_incr9 : beq $a0, $a3 --> for_incr8, for_incr2
+for_incr2 : emit c72 --> for_incr1
+for_incr1 : j --> for_incr0
+for_incr0 : j --> for_incr56
+for_incr56: j --> for_incr55
+for_incr55: j --> for_incr54
+for_incr54: j --> for_incr53
+for_incr53: j --> for_incr52
+for_incr52: j --> for_incr51
+for_incr51: j --> for_incr50
+for_incr50: j --> for_incr49
+for_incr49: j --> for_incr48
+for_incr48: j --> for_incr47
+for_incr47: j --> for_incr46
+for_incr46: delframe --> for_incr45
+for_incr45: jr $ra
+for_incr8 : emit c73 --> for_incr7
+for_incr7 : sub $v0, $v0, $a2 --> for_incr6
+for_incr6 : emit c74 --> for_incr5
+for_incr5 : li $a0, 1 --> for_incr4
+for_incr4 : add $a2, $a2, $a0 --> for_incr3
+
+procedure for_imbriq(2)
+var 24
+entry for_imbriq64
+for_imbriq64: newframe --> for_imbriq63
+for_imbriq63: lw $ra, 20($sp) --> for_imbriq62
+for_imbriq62: j --> for_imbriq61
+for_imbriq61: j --> for_imbriq60
+for_imbriq60: j --> for_imbriq59
+for_imbriq59: lw $s4, 16($sp) --> for_imbriq58
+for_imbriq58: lw $s3, 12($sp) --> for_imbriq57
+for_imbriq57: lw $s2, 8($sp) --> for_imbriq56
+for_imbriq56: lw $s1, 4($sp) --> for_imbriq55
+for_imbriq55: lw $s0, 0($sp) --> for_imbriq54
+for_imbriq54: move $s4, $a0 --> for_imbriq53
+for_imbriq53: move $s3, $a1 --> for_imbriq52
+for_imbriq52: j --> for_imbriq51
+for_imbriq51: j --> for_imbriq50
+for_imbriq50: j --> for_imbriq49
+for_imbriq49: j --> for_imbriq48
+for_imbriq48: j --> for_imbriq47
+for_imbriq47: j --> for_imbriq46
+for_imbriq46: j --> for_imbriq45
+for_imbriq45: j --> for_imbriq44
+for_imbriq44: j --> for_imbriq43
+for_imbriq43: j --> for_imbriq42
+for_imbriq42: j --> for_imbriq41
+for_imbriq41: j --> for_imbriq40
+for_imbriq40: j --> for_imbriq39
+for_imbriq39: j --> for_imbriq38
+for_imbriq38: j --> for_imbriq34
+for_imbriq34: emit c71 --> for_imbriq33
+for_imbriq33: li $s0, 0 --> for_imbriq32
+for_imbriq32: emit c70 --> for_imbriq31
+for_imbriq31: emit c69 --> for_imbriq30
+for_imbriq30: li $s1, 0 --> for_imbriq3
+for_imbriq3 : j --> for_imbriq29
+for_imbriq29: li $a0, 0 --> for_imbriq28
+for_imbriq28: emit c68 --> for_imbriq27
+for_imbriq27: li $v0, 23 --> for_imbriq26
+for_imbriq26: slt $v0, $s1, $v0 --> for_imbriq25
+for_imbriq25: j --> for_imbriq36
+for_imbriq36: seq $v0, $v0, $zero --> for_imbriq24
+for_imbriq24: beq $v0, $a0 --> for_imbriq23, for_imbriq2
+for_imbriq2 : emit c59 --> for_imbriq1
+for_imbriq1 : j --> for_imbriq0
+for_imbriq0 : j --> for_imbriq76
+for_imbriq76: move $v0, $s0 --> for_imbriq75
+for_imbriq75: lw $ra, 20($sp) --> for_imbriq74
+for_imbriq74: j --> for_imbriq73
+for_imbriq73: j --> for_imbriq72
+for_imbriq72: j --> for_imbriq71
+for_imbriq71: lw $s4, 16($sp) --> for_imbriq70
+for_imbriq70: lw $s3, 12($sp) --> for_imbriq69
+for_imbriq69: lw $s2, 8($sp) --> for_imbriq68
+for_imbriq68: lw $s1, 4($sp) --> for_imbriq67
+for_imbriq67: lw $s0, 0($sp) --> for_imbriq66
+for_imbriq66: delframe --> for_imbriq65
+for_imbriq65: jr $ra
+for_imbriq23: emit c66 --> for_imbriq22
+for_imbriq22: li $v0, 0 --> for_imbriq21
+for_imbriq21: emit c65 --> for_imbriq20
+for_imbriq20: emit c64 --> for_imbriq19
+for_imbriq19: li $s2, 1 --> for_imbriq6
+for_imbriq6 : j --> for_imbriq18
+for_imbriq18: li $a1, 0 --> for_imbriq17
+for_imbriq17: emit c63 --> for_imbriq16
+for_imbriq16: li $a0, 12 --> for_imbriq15
+for_imbriq15: slt $a0, $s2, $a0 --> for_imbriq14
+for_imbriq14: j --> for_imbriq35
+for_imbriq35: seq $a0, $a0, $zero --> for_imbriq13
+for_imbriq13: beq $a0, $a1 --> for_imbriq12, for_imbriq5
+for_imbriq5 : emit c67 --> for_imbriq4
+for_imbriq4 : add $s1, $s1, $s4 --> for_imbriq3
+for_imbriq12: emit c61 --> for_imbriq11
+for_imbriq11: add $s0, $s0, $v0 --> for_imbriq10
+for_imbriq10: emit c60 --> for_imbriq9
+for_imbriq9 : la $a2, mod --> for_imbriq37
+for_imbriq37: j --> for_imbriq80
+for_imbriq80: move $a0, $v0 --> for_imbriq79
+for_imbriq79: move $a1, $s2 --> for_imbriq78
+for_imbriq78: call $a2 --> for_imbriq77
+for_imbriq77: j --> for_imbriq8
+for_imbriq8 : emit c62 --> for_imbriq7
+for_imbriq7 : add $s2, $s2, $s3 --> for_imbriq6
+
+procedure for_fortSimple(3)
+var 0
+entry for_fortSimple41
+for_fortSimple41: newframe --> for_fortSimple40
+for_fortSimple40: j --> for_fortSimple39
+for_fortSimple39: j --> for_fortSimple38
+for_fortSimple38: j --> for_fortSimple37
+for_fortSimple37: j --> for_fortSimple36
+for_fortSimple36: j --> for_fortSimple35
+for_fortSimple35: j --> for_fortSimple34
+for_fortSimple34: j --> for_fortSimple33
+for_fortSimple33: j --> for_fortSimple32
+for_fortSimple32: j --> for_fortSimple31
+for_fortSimple31: j --> for_fortSimple30
+for_fortSimple30: j --> for_fortSimple29
+for_fortSimple29: j --> for_fortSimple28
+for_fortSimple28: j --> for_fortSimple27
+for_fortSimple27: j --> for_fortSimple26
+for_fortSimple26: j --> for_fortSimple25
+for_fortSimple25: j --> for_fortSimple24
+for_fortSimple24: j --> for_fortSimple23
+for_fortSimple23: j --> for_fortSimple22
+for_fortSimple22: j --> for_fortSimple21
+for_fortSimple21: j --> for_fortSimple19
+for_fortSimple19: emit c58 --> for_fortSimple18
+for_fortSimple18: li $t0, 0 --> for_fortSimple17
+for_fortSimple17: emit c57 --> for_fortSimple16
+for_fortSimple16: emit c56 --> for_fortSimple15
+for_fortSimple15: move $a3, $a0 --> for_fortSimple5
+for_fortSimple5 : j --> for_fortSimple14
+for_fortSimple14: li $t1, 0 --> for_fortSimple13
+for_fortSimple13: emit c55 --> for_fortSimple12
+for_fortSimple12: slt $v0, $a3, $a1 --> for_fortSimple11
+for_fortSimple11: j --> for_fortSimple20
+for_fortSimple20: seq $v0, $v0, $zero --> for_fortSimple10
+for_fortSimple10: beq $v0, $t1 --> for_fortSimple9, for_fortSimple4
+for_fortSimple4 : emit c52 --> for_fortSimple3
+for_fortSimple3 : add $v0, $t0, $a0 --> for_fortSimple2
+for_fortSimple2 : emit c51 --> for_fortSimple1
+for_fortSimple1 : j --> for_fortSimple0
+for_fortSimple0 : j --> for_fortSimple53
+for_fortSimple53: j --> for_fortSimple52
+for_fortSimple52: j --> for_fortSimple51
+for_fortSimple51: j --> for_fortSimple50
+for_fortSimple50: j --> for_fortSimple49
+for_fortSimple49: j --> for_fortSimple48
+for_fortSimple48: j --> for_fortSimple47
+for_fortSimple47: j --> for_fortSimple46
+for_fortSimple46: j --> for_fortSimple45
+for_fortSimple45: j --> for_fortSimple44
+for_fortSimple44: j --> for_fortSimple43
+for_fortSimple43: delframe --> for_fortSimple42
+for_fortSimple42: jr $ra
+for_fortSimple9 : emit c53 --> for_fortSimple8
+for_fortSimple8 : add $t0, $t0, $a3 --> for_fortSimple7
+for_fortSimple7 : emit c54 --> for_fortSimple6
+for_fortSimple6 : add $a3, $a3, $a2 --> for_fortSimple5
+
+procedure for_forfor(0)
+var 0
+entry for_forfor44
+for_forfor44: newframe --> for_forfor43
+for_forfor43: j --> for_forfor42
+for_forfor42: j --> for_forfor41
+for_forfor41: j --> for_forfor40
+for_forfor40: j --> for_forfor39
+for_forfor39: j --> for_forfor38
+for_forfor38: j --> for_forfor37
+for_forfor37: j --> for_forfor36
+for_forfor36: j --> for_forfor35
+for_forfor35: j --> for_forfor34
+for_forfor34: j --> for_forfor33
+for_forfor33: j --> for_forfor32
+for_forfor32: j --> for_forfor31
+for_forfor31: j --> for_forfor30
+for_forfor30: j --> for_forfor29
+for_forfor29: j --> for_forfor28
+for_forfor28: j --> for_forfor27
+for_forfor27: j --> for_forfor26
+for_forfor26: j --> for_forfor25
+for_forfor25: j --> for_forfor23
+for_forfor23: emit c94 --> for_forfor22
+for_forfor22: emit c93 --> for_forfor21
+for_forfor21: li $a1, 0 --> for_forfor20
+for_forfor20: emit c92 --> for_forfor19
+for_forfor19: li $v0, 0 --> for_forfor3
+for_forfor3 : j --> for_forfor18
+for_forfor18: li $a2, 0 --> for_forfor17
+for_forfor17: emit c91 --> for_forfor16
+for_forfor16: li $a0, 10 --> for_forfor15
+for_forfor15: slt $a0, $a1, $a0 --> for_forfor14
+for_forfor14: j --> for_forfor24
+for_forfor24: seq $a0, $a0, $zero --> for_forfor13
+for_forfor13: beq $a0, $a2 --> for_forfor12, for_forfor2
+for_forfor2 : emit c87 --> for_forfor1
+for_forfor1 : j --> for_forfor0
+for_forfor0 : j --> for_forfor56
+for_forfor56: j --> for_forfor55
+for_forfor55: j --> for_forfor54
+for_forfor54: j --> for_forfor53
+for_forfor53: j --> for_forfor52
+for_forfor52: j --> for_forfor51
+for_forfor51: j --> for_forfor50
+for_forfor50: j --> for_forfor49
+for_forfor49: j --> for_forfor48
+for_forfor48: j --> for_forfor47
+for_forfor47: j --> for_forfor46
+for_forfor46: delframe --> for_forfor45
+for_forfor45: jr $ra
+for_forfor12: emit c89 --> for_forfor11
+for_forfor11: li $a0, 1 --> for_forfor10
+for_forfor10: add $v0, $v0, $a0 --> for_forfor9
+for_forfor9 : emit c88 --> for_forfor8
+for_forfor8 : li $a0, 1 --> for_forfor7
+for_forfor7 : add $v0, $v0, $a0 --> for_forfor6
+for_forfor6 : emit c90 --> for_forfor5
+for_forfor5 : li $a0, 1 --> for_forfor4
+for_forfor4 : add $a1, $a1, $a0 --> for_forfor3
+
+procedure for_ex(3)
+var 0
+entry for_ex43
+for_ex43: newframe --> for_ex42
+for_ex42: j --> for_ex41
+for_ex41: j --> for_ex40
+for_ex40: j --> for_ex39
+for_ex39: j --> for_ex38
+for_ex38: j --> for_ex37
+for_ex37: j --> for_ex36
+for_ex36: j --> for_ex35
+for_ex35: j --> for_ex34
+for_ex34: j --> for_ex33
+for_ex33: j --> for_ex32
+for_ex32: j --> for_ex31
+for_ex31: j --> for_ex30
+for_ex30: j --> for_ex29
+for_ex29: j --> for_ex28
+for_ex28: j --> for_ex27
+for_ex27: j --> for_ex26
+for_ex26: j --> for_ex25
+for_ex25: j --> for_ex24
+for_ex24: j --> for_ex23
+for_ex23: j --> for_ex22
+for_ex22: j --> for_ex20
+for_ex20: emit c50 --> for_ex19
+for_ex19: li $v0, 0 --> for_ex18
+for_ex18: emit c49 --> for_ex17
+for_ex17: emit c48 --> for_ex16
+for_ex16: li $a3, 3 --> for_ex15
+for_ex15: add $a3, $a0, $a3 --> for_ex3
+for_ex3 : j --> for_ex14
+for_ex14: li $t0, 0 --> for_ex13
+for_ex13: emit c47 --> for_ex12
+for_ex12: li $a0, 2 --> for_ex11
+for_ex11: mulo $a0, $a1, $a0 --> for_ex10
+for_ex10: sle $a0, $a3, $a0 --> for_ex9
+for_ex9 : j --> for_ex21
+for_ex21: seq $a0, $a0, $zero --> for_ex8
+for_ex8 : beq $a0, $t0 --> for_ex7, for_ex2
+for_ex2 : emit c44 --> for_ex1
+for_ex1 : j --> for_ex0
+for_ex0 : j --> for_ex55
+for_ex55: j --> for_ex54
+for_ex54: j --> for_ex53
+for_ex53: j --> for_ex52
+for_ex52: j --> for_ex51
+for_ex51: j --> for_ex50
+for_ex50: j --> for_ex49
+for_ex49: j --> for_ex48
+for_ex48: j --> for_ex47
+for_ex47: j --> for_ex46
+for_ex46: j --> for_ex45
+for_ex45: delframe --> for_ex44
+for_ex44: jr $ra
+for_ex7 : emit c45 --> for_ex6
+for_ex6 : sub $v0, $v0, $a3 --> for_ex5
+for_ex5 : emit c46 --> for_ex4
+for_ex4 : add $a3, $a3, $a2 --> for_ex3
+
+procedure for_double(1)
+var 0
+entry for_double64
+for_double64: newframe --> for_double63
+for_double63: j --> for_double62
+for_double62: j --> for_double61
+for_double61: j --> for_double60
+for_double60: j --> for_double59
+for_double59: j --> for_double58
+for_double58: j --> for_double57
+for_double57: j --> for_double56
+for_double56: j --> for_double55
+for_double55: j --> for_double54
+for_double54: j --> for_double53
+for_double53: j --> for_double52
+for_double52: j --> for_double51
+for_double51: j --> for_double50
+for_double50: j --> for_double49
+for_double49: j --> for_double48
+for_double48: j --> for_double47
+for_double47: j --> for_double46
+for_double46: j --> for_double45
+for_double45: j --> for_double44
+for_double44: j --> for_double43
+for_double43: j --> for_double42
+for_double42: j --> for_double41
+for_double41: j --> for_double40
+for_double40: j --> for_double39
+for_double39: j --> for_double36
+for_double36: emit c43 --> for_double35
+for_double35: li $a1, 0 --> for_double34
+for_double34: emit c42 --> for_double33
+for_double33: li $a2, 0 --> for_double32
+for_double32: emit c41 --> for_double31
+for_double31: emit c40 --> for_double30
+for_double30: li $a3, 0 --> for_double19
+for_double19: j --> for_double29
+for_double29: li $t0, 0 --> for_double28
+for_double28: emit c39 --> for_double27
+for_double27: li $v0, 12 --> for_double26
+for_double26: slt $v0, $a3, $v0 --> for_double25
+for_double25: j --> for_double38
+for_double38: seq $v0, $v0, $zero --> for_double24
+for_double24: beq $v0, $t0 --> for_double23, for_double18
+for_double18: emit c36 --> for_double17
+for_double17: emit c35 --> for_double16
+for_double16: li $a3, 0 --> for_double5
+for_double5 : j --> for_double15
+for_double15: li $t0, 0 --> for_double14
+for_double14: emit c34 --> for_double13
+for_double13: li $v0, 5 --> for_double12
+for_double12: slt $v0, $a3, $v0 --> for_double11
+for_double11: j --> for_double37
+for_double37: seq $v0, $v0, $zero --> for_double10
+for_double10: beq $v0, $t0 --> for_double9, for_double4
+for_double4 : emit c31 --> for_double3
+for_double3 : mulo $v0, $a1, $a2 --> for_double2
+for_double2 : emit c30 --> for_double1
+for_double1 : j --> for_double0
+for_double0 : j --> for_double76
+for_double76: j --> for_double75
+for_double75: j --> for_double74
+for_double74: j --> for_double73
+for_double73: j --> for_double72
+for_double72: j --> for_double71
+for_double71: j --> for_double70
+for_double70: j --> for_double69
+for_double69: j --> for_double68
+for_double68: j --> for_double67
+for_double67: j --> for_double66
+for_double66: delframe --> for_double65
+for_double65: jr $ra
+for_double9 : emit c32 --> for_double8
+for_double8 : add $a2, $a2, $a3 --> for_double7
+for_double7 : emit c33 --> for_double6
+for_double6 : add $a3, $a3, $a0 --> for_double5
+for_double23: emit c37 --> for_double22
+for_double22: add $a1, $a1, $a3 --> for_double21
+for_double21: emit c38 --> for_double20
+for_double20: add $a3, $a3, $a0 --> for_double19
+
+procedure for_2(2)
+var 0
+entry for_253
+for_253: newframe --> for_252
+for_252: j --> for_251
+for_251: j --> for_250
+for_250: j --> for_249
+for_249: j --> for_248
+for_248: j --> for_247
+for_247: j --> for_246
+for_246: j --> for_245
+for_245: j --> for_244
+for_244: j --> for_243
+for_243: j --> for_242
+for_242: j --> for_241
+for_241: j --> for_240
+for_240: j --> for_239
+for_239: j --> for_238
+for_238: j --> for_237
+for_237: j --> for_236
+for_236: j --> for_235
+for_235: j --> for_234
+for_234: j --> for_233
+for_233: j --> for_232
+for_232: j --> for_231
+for_231: j --> for_230
+for_230: j --> for_229
+for_229: j --> for_227
+for_227: emit c9 --> for_226
+for_226: li $a2, 0 --> for_225
+for_225: emit c8 --> for_224
+for_224: li $v0, 2 --> for_223
+for_223: mulo $v0, $a0, $v0 --> for_222
+for_222: emit c7 --> for_221
+for_221: li $a3, 4 --> for_220
+for_220: mulo $a0, $a0, $a3 --> for_219
+for_219: emit c6 --> for_218
+for_218: li $a3, 1 --> for_217
+for_217: add $a1, $a1, $a3 --> for_216
+for_216: emit c5 --> for_215
+for_215: emit c4 --> for_214
+for_214: j --> for_24
+for_24 : j --> for_213
+for_213: li $t0, 0 --> for_212
+for_212: emit c3 --> for_211
+for_211: slt $a3, $v0, $a0 --> for_210
+for_210: j --> for_228
+for_228: seq $a3, $a3, $zero --> for_29
+for_29 : beq $a3, $t0 --> for_28, for_23
+for_23 : emit c0 --> for_22
+for_22 : li $v0, 1 --> for_21
+for_21 : add $v0, $a2, $v0 --> for_20
+for_20 : j --> for_265
+for_265: j --> for_264
+for_264: j --> for_263
+for_263: j --> for_262
+for_262: j --> for_261
+for_261: j --> for_260
+for_260: j --> for_259
+for_259: j --> for_258
+for_258: j --> for_257
+for_257: j --> for_256
+for_256: j --> for_255
+for_255: delframe --> for_254
+for_254: jr $ra
+for_28 : emit c1 --> for_27
+for_27 : add $a2, $a2, $v0 --> for_26
+for_26 : emit c2 --> for_25
+for_25 : add $v0, $v0, $a1 --> for_24
+
+procedure _main(0)
+var 4
+entry main85
+main85 : newframe --> main84
+main84 : lw $ra, 0($sp) --> main83
+main83 : j --> main82
+main82 : j --> main81
+main81 : j --> main80
+main80 : j --> main79
+main79 : j --> main78
+main78 : j --> main77
+main77 : j --> main76
+main76 : j --> main75
+main75 : j --> main74
+main74 : j --> main73
+main73 : j --> main72
+main72 : j --> main71
+main71 : j --> main70
+main70 : j --> main69
+main69 : j --> main68
+main68 : j --> main67
+main67 : j --> main66
+main66 : j --> main65
+main65 : j --> main64
+main64 : j --> main63
+main63 : j --> main62
+main62 : j --> main61
+main61 : j --> main60
+main60 : j --> main59
+main59 : j --> main58
+main58 : j --> main57
+main57 : j --> main56
+main56 : j --> main55
+main55 : j --> main54
+main54 : j --> main53
+main53 : j --> main52
+main52 : j --> main51
+main51 : j --> main50
+main50 : j --> main49
+main49 : j --> main48
+main48 : j --> main38
+main38 : emit c104 --> main37
+main37 : li $a0, 3 --> main36
+main36 : li $a1, 1 --> main35
+main35 : la $v0, for_2 --> main45
+main45 : j --> main125
+main125: j --> main124
+main124: j --> main123
+main123: call $v0 --> main122
+main122: j --> main34
+main34 : emit c103 --> main33
+main33 : li $a0, 1 --> main32
+main32 : li $a1, 2 --> main31
+main31 : li $a2, 3 --> main30
+main30 : la $v0, for_loopParalAsync --> main44
+main44 : j --> main121
+main121: j --> main120
+main120: j --> main119
+main119: j --> main118
+main118: call $v0 --> main117
+main117: j --> main29
+main29 : emit c102 --> main28
+main28 : li $a0, 1 --> main27
+main27 : la $v0, for_double --> main42
+main42 : j --> main114
+main114: j --> main113
+main113: call $v0 --> main112
+main112: j --> main26
+main26 : emit c101 --> main25
+main25 : li $a0, 2 --> main24
+main24 : li $a1, 10 --> main23
+main23 : li $a2, 1 --> main22
+main22 : la $v0, for_ex --> main41
+main41 : j --> main111
+main111: j --> main110
+main110: j --> main109
+main109: j --> main108
+main108: call $v0 --> main107
+main107: j --> main21
+main21 : emit c100 --> main20
+main20 : li $a0, 2 --> main19
+main19 : li $a1, 10 --> main18
+main18 : li $a2, 1 --> main17
+main17 : la $v0, for_fortSimple --> main40
+main40 : j --> main106
+main106: j --> main105
+main105: j --> main104
+main104: j --> main103
+main103: call $v0 --> main102
+main102: j --> main16
+main16 : emit c99 --> main15
+main15 : li $a0, 2 --> main14
+main14 : li $a1, 3 --> main13
+main13 : la $v0, for_imbriq --> main39
+main39 : j --> main101
+main101: j --> main100
+main100: j --> main99
+main99 : call $v0 --> main98
+main98 : j --> main12
+main12 : emit c98 --> main11
+main11 : li $a0, 2 --> main10
+main10 : li $a1, 3 --> main9
+main9 : la $v0, for_incr --> main47
+main47 : j --> main133
+main133: j --> main132
+main132: j --> main131
+main131: call $v0 --> main130
+main130: j --> main8
+main8 : emit c97 --> main7
+main7 : li $a0, 2 --> main6
+main6 : li $a1, 3 --> main5
+main5 : la $v0, for_incrParam --> main46
+main46 : j --> main129
+main129: j --> main128
+main128: j --> main127
+main127: call $v0 --> main126
+main126: j --> main4
+main4 : emit c96 --> main3
+main3 : la $v0, for_forfor --> main43
+main43 : j --> main116
+main116: call $v0 --> main115
+main115: j --> main2
+main2 : emit c95 --> main1
+main1 : j --> main0
+main0 : j --> main97
+main97 : j --> main96
+main96 : lw $ra, 0($sp) --> main95
+main95 : j --> main94
+main94 : j --> main93
+main93 : j --> main92
+main92 : j --> main91
+main91 : j --> main90
+main90 : j --> main89
+main89 : j --> main88
+main88 : j --> main87
+main87 : delframe --> main86
+main86 : jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 0
+
+function for_loopParalAsync(%0; %1; %2) : %8
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26
+entry for_loopParalAsync81
+for_loopParalAsync81: li %3, 0 --> for_loopParalAsync80
+for_loopParalAsync80: li %4, 0 --> for_loopParalAsync79
+for_loopParalAsync79: li %5, 0 --> for_loopParalAsync78
+for_loopParalAsync78: li %6, 0 --> for_loopParalAsync77
+for_loopParalAsync77: li %7, 0 --> for_loopParalAsync76
+for_loopParalAsync76: li %9, 0 --> for_loopParalAsync75
+for_loopParalAsync75: li %10, 0 --> for_loopParalAsync74
+for_loopParalAsync74: li %11, 0 --> for_loopParalAsync73
+for_loopParalAsync73: li %12, 0 --> for_loopParalAsync72
+for_loopParalAsync72: li %13, 0 --> for_loopParalAsync71
+for_loopParalAsync71: li %14, 0 --> for_loopParalAsync70
+for_loopParalAsync70: li %15, 0 --> for_loopParalAsync69
+for_loopParalAsync69: li %16, 0 --> for_loopParalAsync68
+for_loopParalAsync68: li %17, 0 --> for_loopParalAsync67
+for_loopParalAsync67: li %18, 0 --> for_loopParalAsync66
+for_loopParalAsync66: li %19, 0 --> for_loopParalAsync65
+for_loopParalAsync65: li %20, 0 --> for_loopParalAsync64
+for_loopParalAsync64: li %21, 0 --> for_loopParalAsync63
+for_loopParalAsync63: li %22, 0 --> for_loopParalAsync62
+for_loopParalAsync62: li %23, 0 --> for_loopParalAsync61
+for_loopParalAsync61: li %24, 0 --> for_loopParalAsync60
+for_loopParalAsync60: li %25, 0 --> for_loopParalAsync59
+for_loopParalAsync59: li %26, 0 --> for_loopParalAsync56
+for_loopParalAsync56: emit c29 --> for_loopParalAsync55
+for_loopParalAsync55: li %5, 0 --> for_loopParalAsync54
+for_loopParalAsync54: emit c28 --> for_loopParalAsync53
+for_loopParalAsync53: li %0, 0 --> for_loopParalAsync52
+for_loopParalAsync52: emit c27 --> for_loopParalAsync51
+for_loopParalAsync51: li %24, 3 --> for_loopParalAsync50
+for_loopParalAsync50: add %0, %0, %24 --> for_loopParalAsync49
+for_loopParalAsync49: emit c26 --> for_loopParalAsync48
+for_loopParalAsync48: li %23, 2 --> for_loopParalAsync47
+for_loopParalAsync47: mulo %0, %0, %23 --> for_loopParalAsync46
+for_loopParalAsync46: emit c25 --> for_loopParalAsync45
+for_loopParalAsync45: li %22, 3 --> for_loopParalAsync44
+for_loopParalAsync44: div %0, %0, %22 --> for_loopParalAsync43
+for_loopParalAsync43: emit c24 --> for_loopParalAsync42
+for_loopParalAsync42: li %21, 8 --> for_loopParalAsync41
+for_loopParalAsync41: add %0, %0, %21 --> for_loopParalAsync40
+for_loopParalAsync40: emit c23 --> for_loopParalAsync39
+for_loopParalAsync39: emit c22 --> for_loopParalAsync38
+for_loopParalAsync38: li %7, 0 --> for_loopParalAsync20
+for_loopParalAsync20: j --> for_loopParalAsync37
+for_loopParalAsync37: li %18, 0 --> for_loopParalAsync36
+for_loopParalAsync36: emit c21 --> for_loopParalAsync35
+for_loopParalAsync35: li %20, 20 --> for_loopParalAsync34
+for_loopParalAsync34: slt %19, %7, %20 --> for_loopParalAsync33
+for_loopParalAsync33: li %26, 0 --> for_loopParalAsync58
+for_loopParalAsync58: seq %17, %19, %26 --> for_loopParalAsync32
+for_loopParalAsync32: beq %17, %18 --> for_loopParalAsync31, for_loopParalAsync19
+for_loopParalAsync19: emit c16 --> for_loopParalAsync18
+for_loopParalAsync18: emit c15 --> for_loopParalAsync17
+for_loopParalAsync17: li %6, 1 --> for_loopParalAsync3
+for_loopParalAsync3 : j --> for_loopParalAsync16
+for_loopParalAsync16: li %12, 0 --> for_loopParalAsync15
+for_loopParalAsync15: emit c14 --> for_loopParalAsync14
+for_loopParalAsync14: slt %13, %6, %0 --> for_loopParalAsync13
+for_loopParalAsync13: li %25, 0 --> for_loopParalAsync57
+for_loopParalAsync57: seq %11, %13, %25 --> for_loopParalAsync12
+for_loopParalAsync12: beq %11, %12 --> for_loopParalAsync11, for_loopParalAsync2
+for_loopParalAsync2 : emit c10 --> for_loopParalAsync1
+for_loopParalAsync1 : move %8, %5 --> for_loopParalAsync0
+for_loopParalAsync0 : return %8
+for_loopParalAsync11: emit c12 --> for_loopParalAsync10
+for_loopParalAsync10: li %10, 2 --> for_loopParalAsync9
+for_loopParalAsync9 : mulo %2, %2, %10 --> for_loopParalAsync8
+for_loopParalAsync8 : emit c11 --> for_loopParalAsync7
+for_loopParalAsync7 : div %3, %2, %6 --> for_loopParalAsync6
+for_loopParalAsync6 : emit c13 --> for_loopParalAsync5
+for_loopParalAsync5 : li %9, 1 --> for_loopParalAsync4
+for_loopParalAsync4 : add %6, %6, %9 --> for_loopParalAsync3
+for_loopParalAsync31: emit c19 --> for_loopParalAsync30
+for_loopParalAsync30: li %16, 1 --> for_loopParalAsync29
+for_loopParalAsync29: add %5, %5, %16 --> for_loopParalAsync28
+for_loopParalAsync28: emit c18 --> for_loopParalAsync27
+for_loopParalAsync27: li %15, 2 --> for_loopParalAsync26
+for_loopParalAsync26: add %1, %1, %15 --> for_loopParalAsync25
+for_loopParalAsync25: emit c17 --> for_loopParalAsync24
+for_loopParalAsync24: div %4, %1, %5 --> for_loopParalAsync23
+for_loopParalAsync23: emit c20 --> for_loopParalAsync22
+for_loopParalAsync22: li %14, 1 --> for_loopParalAsync21
+for_loopParalAsync21: add %7, %7, %14 --> for_loopParalAsync20
+
+function for_incrParam(%0; %1) : %5
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14
+entry for_incrParam37
+for_incrParam37: li %2, 0 --> for_incrParam36
+for_incrParam36: li %3, 0 --> for_incrParam35
+for_incrParam35: li %4, 0 --> for_incrParam34
+for_incrParam34: li %6, 0 --> for_incrParam33
+for_incrParam33: li %7, 0 --> for_incrParam32
+for_incrParam32: li %8, 0 --> for_incrParam31
+for_incrParam31: li %9, 0 --> for_incrParam30
+for_incrParam30: li %10, 0 --> for_incrParam29
+for_incrParam29: li %11, 0 --> for_incrParam28
+for_incrParam28: li %12, 0 --> for_incrParam27
+for_incrParam27: li %13, 0 --> for_incrParam26
+for_incrParam26: li %14, 0 --> for_incrParam24
+for_incrParam24: emit c86 --> for_incrParam23
+for_incrParam23: add %2, %0, %1 --> for_incrParam22
+for_incrParam22: emit c85 --> for_incrParam21
+for_incrParam21: li %13, 3 --> for_incrParam20
+for_incrParam20: mulo %4, %13, %2 --> for_incrParam19
+for_incrParam19: emit c84 --> for_incrParam18
+for_incrParam18: emit c83 --> for_incrParam17
+for_incrParam17: li %12, 4 --> for_incrParam16
+for_incrParam16: sub %3, %2, %12 --> for_incrParam3
+for_incrParam3 : j --> for_incrParam15
+for_incrParam15: li %8, 0 --> for_incrParam14
+for_incrParam14: emit c82 --> for_incrParam13
+for_incrParam13: li %11, 6 --> for_incrParam12
+for_incrParam12: add %10, %1, %11 --> for_incrParam11
+for_incrParam11: slt %9, %3, %10 --> for_incrParam10
+for_incrParam10: li %14, 0 --> for_incrParam25
+for_incrParam25: seq %7, %9, %14 --> for_incrParam9
+for_incrParam9 : beq %7, %8 --> for_incrParam8, for_incrParam2
+for_incrParam2 : emit c79 --> for_incrParam1
+for_incrParam1 : move %5, %3 --> for_incrParam0
+for_incrParam0 : return %5
+for_incrParam8 : emit c80 --> for_incrParam7
+for_incrParam7 : add %6, %3, %2 --> for_incrParam6
+for_incrParam6 : add %3, %6, %0 --> for_incrParam5
+for_incrParam5 : emit c81 --> for_incrParam4
+for_incrParam4 : add %3, %3, %0 --> for_incrParam3
+
+function for_incr(%0; %1) : %4
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12
+entry for_incr32
+for_incr32: li %2, 0 --> for_incr31
+for_incr31: li %3, 0 --> for_incr30
+for_incr30: li %5, 0 --> for_incr29
+for_incr29: li %6, 0 --> for_incr28
+for_incr28: li %7, 0 --> for_incr27
+for_incr27: li %8, 0 --> for_incr26
+for_incr26: li %9, 0 --> for_incr25
+for_incr25: li %10, 0 --> for_incr24
+for_incr24: li %11, 0 --> for_incr23
+for_incr23: li %12, 0 --> for_incr21
+for_incr21: emit c78 --> for_incr20
+for_incr20: li %2, 0 --> for_incr19
+for_incr19: emit c77 --> for_incr18
+for_incr18: emit c76 --> for_incr17
+for_incr17: li %11, 3 --> for_incr16
+for_incr16: add %3, %0, %11 --> for_incr3
+for_incr3 : j --> for_incr15
+for_incr15: li %7, 0 --> for_incr14
+for_incr14: emit c75 --> for_incr13
+for_incr13: li %10, 2 --> for_incr12
+for_incr12: mulo %9, %1, %10 --> for_incr11
+for_incr11: sle %8, %3, %9 --> for_incr10
+for_incr10: li %12, 0 --> for_incr22
+for_incr22: seq %6, %8, %12 --> for_incr9
+for_incr9 : beq %6, %7 --> for_incr8, for_incr2
+for_incr2 : emit c72 --> for_incr1
+for_incr1 : move %4, %2 --> for_incr0
+for_incr0 : return %4
+for_incr8 : emit c73 --> for_incr7
+for_incr7 : sub %2, %2, %3 --> for_incr6
+for_incr6 : emit c74 --> for_incr5
+for_incr5 : li %5, 1 --> for_incr4
+for_incr4 : add %3, %3, %5 --> for_incr3
+
+function for_imbriq(%0; %1) : %6
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17
+entry for_imbriq52
+for_imbriq52: li %2, 0 --> for_imbriq51
+for_imbriq51: li %3, 0 --> for_imbriq50
+for_imbriq50: li %4, 0 --> for_imbriq49
+for_imbriq49: li %5, 0 --> for_imbriq48
+for_imbriq48: li %7, 0 --> for_imbriq47
+for_imbriq47: li %8, 0 --> for_imbriq46
+for_imbriq46: li %9, 0 --> for_imbriq45
+for_imbriq45: li %10, 0 --> for_imbriq44
+for_imbriq44: li %11, 0 --> for_imbriq43
+for_imbriq43: li %12, 0 --> for_imbriq42
+for_imbriq42: li %13, 0 --> for_imbriq41
+for_imbriq41: li %14, 0 --> for_imbriq40
+for_imbriq40: li %15, 0 --> for_imbriq39
+for_imbriq39: li %16, 0 --> for_imbriq38
+for_imbriq38: li %17, 0 --> for_imbriq34
+for_imbriq34: emit c71 --> for_imbriq33
+for_imbriq33: li %5, 0 --> for_imbriq32
+for_imbriq32: emit c70 --> for_imbriq31
+for_imbriq31: emit c69 --> for_imbriq30
+for_imbriq30: li %3, 0 --> for_imbriq3
+for_imbriq3 : j --> for_imbriq29
+for_imbriq29: li %12, 0 --> for_imbriq28
+for_imbriq28: emit c68 --> for_imbriq27
+for_imbriq27: li %14, 23 --> for_imbriq26
+for_imbriq26: slt %13, %3, %14 --> for_imbriq25
+for_imbriq25: li %16, 0 --> for_imbriq36
+for_imbriq36: seq %11, %13, %16 --> for_imbriq24
+for_imbriq24: beq %11, %12 --> for_imbriq23, for_imbriq2
+for_imbriq2 : emit c59 --> for_imbriq1
+for_imbriq1 : move %6, %5 --> for_imbriq0
+for_imbriq0 : return %6
+for_imbriq23: emit c66 --> for_imbriq22
+for_imbriq22: li %4, 0 --> for_imbriq21
+for_imbriq21: emit c65 --> for_imbriq20
+for_imbriq20: emit c64 --> for_imbriq19
+for_imbriq19: li %2, 1 --> for_imbriq6
+for_imbriq6 : j --> for_imbriq18
+for_imbriq18: li %8, 0 --> for_imbriq17
+for_imbriq17: emit c63 --> for_imbriq16
+for_imbriq16: li %10, 12 --> for_imbriq15
+for_imbriq15: slt %9, %2, %10 --> for_imbriq14
+for_imbriq14: li %15, 0 --> for_imbriq35
+for_imbriq35: seq %7, %9, %15 --> for_imbriq13
+for_imbriq13: beq %7, %8 --> for_imbriq12, for_imbriq5
+for_imbriq5 : emit c67 --> for_imbriq4
+for_imbriq4 : add %3, %3, %0 --> for_imbriq3
+for_imbriq12: emit c61 --> for_imbriq11
+for_imbriq11: add %5, %5, %4 --> for_imbriq10
+for_imbriq10: emit c60 --> for_imbriq9
+for_imbriq9 : la %17, mod --> for_imbriq37
+for_imbriq37: call %4, %17(%4, %2) --> for_imbriq8
+for_imbriq8 : emit c62 --> for_imbriq7
+for_imbriq7 : add %2, %2, %1 --> for_imbriq6
+
+function for_fortSimple(%0; %1; %2) : %7
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11
+entry for_fortSimple28
+for_fortSimple28: li %3, 0 --> for_fortSimple27
+for_fortSimple27: li %4, 0 --> for_fortSimple26
+for_fortSimple26: li %5, 0 --> for_fortSimple25
+for_fortSimple25: li %6, 0 --> for_fortSimple24
+for_fortSimple24: li %8, 0 --> for_fortSimple23
+for_fortSimple23: li %9, 0 --> for_fortSimple22
+for_fortSimple22: li %10, 0 --> for_fortSimple21
+for_fortSimple21: li %11, 0 --> for_fortSimple19
+for_fortSimple19: emit c58 --> for_fortSimple18
+for_fortSimple18: li %3, 0 --> for_fortSimple17
+for_fortSimple17: emit c57 --> for_fortSimple16
+for_fortSimple16: emit c56 --> for_fortSimple15
+for_fortSimple15: move %5, %0 --> for_fortSimple5
+for_fortSimple5 : j --> for_fortSimple14
+for_fortSimple14: li %9, 0 --> for_fortSimple13
+for_fortSimple13: emit c55 --> for_fortSimple12
+for_fortSimple12: slt %10, %5, %1 --> for_fortSimple11
+for_fortSimple11: li %11, 0 --> for_fortSimple20
+for_fortSimple20: seq %8, %10, %11 --> for_fortSimple10
+for_fortSimple10: beq %8, %9 --> for_fortSimple9, for_fortSimple4
+for_fortSimple4 : emit c52 --> for_fortSimple3
+for_fortSimple3 : add %4, %3, %0 --> for_fortSimple2
+for_fortSimple2 : emit c51 --> for_fortSimple1
+for_fortSimple1 : move %7, %4 --> for_fortSimple0
+for_fortSimple0 : return %7
+for_fortSimple9 : emit c53 --> for_fortSimple8
+for_fortSimple8 : add %3, %3, %5 --> for_fortSimple7
+for_fortSimple7 : emit c54 --> for_fortSimple6
+for_fortSimple6 : add %5, %5, %2 --> for_fortSimple5
+
+function for_forfor() : %2
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10
+entry for_forfor34
+for_forfor34: li %0, 0 --> for_forfor33
+for_forfor33: li %1, 0 --> for_forfor32
+for_forfor32: li %3, 0 --> for_forfor31
+for_forfor31: li %4, 0 --> for_forfor30
+for_forfor30: li %5, 0 --> for_forfor29
+for_forfor29: li %6, 0 --> for_forfor28
+for_forfor28: li %7, 0 --> for_forfor27
+for_forfor27: li %8, 0 --> for_forfor26
+for_forfor26: li %9, 0 --> for_forfor25
+for_forfor25: li %10, 0 --> for_forfor23
+for_forfor23: emit c94 --> for_forfor22
+for_forfor22: emit c93 --> for_forfor21
+for_forfor21: li %1, 0 --> for_forfor20
+for_forfor20: emit c92 --> for_forfor19
+for_forfor19: li %0, 0 --> for_forfor3
+for_forfor3 : j --> for_forfor18
+for_forfor18: li %7, 0 --> for_forfor17
+for_forfor17: emit c91 --> for_forfor16
+for_forfor16: li %9, 10 --> for_forfor15
+for_forfor15: slt %8, %1, %9 --> for_forfor14
+for_forfor14: li %10, 0 --> for_forfor24
+for_forfor24: seq %6, %8, %10 --> for_forfor13
+for_forfor13: beq %6, %7 --> for_forfor12, for_forfor2
+for_forfor2 : emit c87 --> for_forfor1
+for_forfor1 : move %2, %0 --> for_forfor0
+for_forfor0 : return %2
+for_forfor12: emit c89 --> for_forfor11
+for_forfor11: li %5, 1 --> for_forfor10
+for_forfor10: add %0, %0, %5 --> for_forfor9
+for_forfor9 : emit c88 --> for_forfor8
+for_forfor8 : li %4, 1 --> for_forfor7
+for_forfor7 : add %0, %0, %4 --> for_forfor6
+for_forfor6 : emit c90 --> for_forfor5
+for_forfor5 : li %3, 1 --> for_forfor4
+for_forfor4 : add %1, %1, %3 --> for_forfor3
+
+function for_ex(%0; %1; %2) : %5
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12
+entry for_ex30
+for_ex30: li %3, 0 --> for_ex29
+for_ex29: li %4, 0 --> for_ex28
+for_ex28: li %6, 0 --> for_ex27
+for_ex27: li %7, 0 --> for_ex26
+for_ex26: li %8, 0 --> for_ex25
+for_ex25: li %9, 0 --> for_ex24
+for_ex24: li %10, 0 --> for_ex23
+for_ex23: li %11, 0 --> for_ex22
+for_ex22: li %12, 0 --> for_ex20
+for_ex20: emit c50 --> for_ex19
+for_ex19: li %3, 0 --> for_ex18
+for_ex18: emit c49 --> for_ex17
+for_ex17: emit c48 --> for_ex16
+for_ex16: li %11, 3 --> for_ex15
+for_ex15: add %4, %0, %11 --> for_ex3
+for_ex3 : j --> for_ex14
+for_ex14: li %7, 0 --> for_ex13
+for_ex13: emit c47 --> for_ex12
+for_ex12: li %10, 2 --> for_ex11
+for_ex11: mulo %9, %1, %10 --> for_ex10
+for_ex10: sle %8, %4, %9 --> for_ex9
+for_ex9 : li %12, 0 --> for_ex21
+for_ex21: seq %6, %8, %12 --> for_ex8
+for_ex8 : beq %6, %7 --> for_ex7, for_ex2
+for_ex2 : emit c44 --> for_ex1
+for_ex1 : move %5, %3 --> for_ex0
+for_ex0 : return %5
+for_ex7 : emit c45 --> for_ex6
+for_ex6 : sub %3, %3, %4 --> for_ex5
+for_ex5 : emit c46 --> for_ex4
+for_ex4 : add %4, %4, %2 --> for_ex3
+
+function for_double(%0) : %6
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16
+entry for_double53
+for_double53: li %1, 0 --> for_double52
+for_double52: li %2, 0 --> for_double51
+for_double51: li %3, 0 --> for_double50
+for_double50: li %4, 0 --> for_double49
+for_double49: li %5, 0 --> for_double48
+for_double48: li %7, 0 --> for_double47
+for_double47: li %8, 0 --> for_double46
+for_double46: li %9, 0 --> for_double45
+for_double45: li %10, 0 --> for_double44
+for_double44: li %11, 0 --> for_double43
+for_double43: li %12, 0 --> for_double42
+for_double42: li %13, 0 --> for_double41
+for_double41: li %14, 0 --> for_double40
+for_double40: li %15, 0 --> for_double39
+for_double39: li %16, 0 --> for_double36
+for_double36: emit c43 --> for_double35
+for_double35: li %5, 0 --> for_double34
+for_double34: emit c42 --> for_double33
+for_double33: li %4, 0 --> for_double32
+for_double32: emit c41 --> for_double31
+for_double31: emit c40 --> for_double30
+for_double30: li %2, 0 --> for_double19
+for_double19: j --> for_double29
+for_double29: li %12, 0 --> for_double28
+for_double28: emit c39 --> for_double27
+for_double27: li %14, 12 --> for_double26
+for_double26: slt %13, %2, %14 --> for_double25
+for_double25: li %16, 0 --> for_double38
+for_double38: seq %11, %13, %16 --> for_double24
+for_double24: beq %11, %12 --> for_double23, for_double18
+for_double18: emit c36 --> for_double17
+for_double17: emit c35 --> for_double16
+for_double16: li %1, 0 --> for_double5
+for_double5 : j --> for_double15
+for_double15: li %8, 0 --> for_double14
+for_double14: emit c34 --> for_double13
+for_double13: li %10, 5 --> for_double12
+for_double12: slt %9, %1, %10 --> for_double11
+for_double11: li %15, 0 --> for_double37
+for_double37: seq %7, %9, %15 --> for_double10
+for_double10: beq %7, %8 --> for_double9, for_double4
+for_double4 : emit c31 --> for_double3
+for_double3 : mulo %3, %5, %4 --> for_double2
+for_double2 : emit c30 --> for_double1
+for_double1 : move %6, %3 --> for_double0
+for_double0 : return %6
+for_double9 : emit c32 --> for_double8
+for_double8 : add %4, %4, %1 --> for_double7
+for_double7 : emit c33 --> for_double6
+for_double6 : add %1, %1, %0 --> for_double5
+for_double23: emit c37 --> for_double22
+for_double22: add %5, %5, %2 --> for_double21
+for_double21: emit c38 --> for_double20
+for_double20: add %2, %2, %0 --> for_double19
+
+function for_2(%0; %1) : %7
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15
+entry for_241
+for_241: li %2, 0 --> for_240
+for_240: li %3, 0 --> for_239
+for_239: li %4, 0 --> for_238
+for_238: li %5, 0 --> for_237
+for_237: li %6, 0 --> for_236
+for_236: li %8, 0 --> for_235
+for_235: li %9, 0 --> for_234
+for_234: li %10, 0 --> for_233
+for_233: li %11, 0 --> for_232
+for_232: li %12, 0 --> for_231
+for_231: li %13, 0 --> for_230
+for_230: li %14, 0 --> for_229
+for_229: li %15, 0 --> for_227
+for_227: emit c9 --> for_226
+for_226: li %5, 0 --> for_225
+for_225: emit c8 --> for_224
+for_224: li %14, 2 --> for_223
+for_223: mulo %6, %0, %14 --> for_222
+for_222: emit c7 --> for_221
+for_221: li %13, 4 --> for_220
+for_220: mulo %2, %0, %13 --> for_219
+for_219: emit c6 --> for_218
+for_218: li %12, 1 --> for_217
+for_217: add %3, %1, %12 --> for_216
+for_216: emit c5 --> for_215
+for_215: emit c4 --> for_214
+for_214: move %4, %6 --> for_24
+for_24 : j --> for_213
+for_213: li %10, 0 --> for_212
+for_212: emit c3 --> for_211
+for_211: slt %11, %4, %2 --> for_210
+for_210: li %15, 0 --> for_228
+for_228: seq %9, %11, %15 --> for_29
+for_29 : beq %9, %10 --> for_28, for_23
+for_23 : emit c0 --> for_22
+for_22 : li %8, 1 --> for_21
+for_21 : add %7, %5, %8 --> for_20
+for_20 : return %7
+for_28 : emit c1 --> for_27
+for_27 : add %5, %5, %4 --> for_26
+for_26 : emit c2 --> for_25
+for_25 : add %4, %4, %3 --> for_24
+
+function _main() : %1
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28
+entry main75
+main75: li %0, 0 --> main74
+main74: li %2, 0 --> main73
+main73: li %3, 0 --> main72
+main72: li %4, 0 --> main71
+main71: li %5, 0 --> main70
+main70: li %6, 0 --> main69
+main69: li %7, 0 --> main68
+main68: li %8, 0 --> main67
+main67: li %9, 0 --> main66
+main66: li %10, 0 --> main65
+main65: li %11, 0 --> main64
+main64: li %12, 0 --> main63
+main63: li %13, 0 --> main62
+main62: li %14, 0 --> main61
+main61: li %15, 0 --> main60
+main60: li %16, 0 --> main59
+main59: li %17, 0 --> main58
+main58: li %18, 0 --> main57
+main57: li %19, 0 --> main56
+main56: li %20, 0 --> main55
+main55: li %21, 0 --> main54
+main54: li %22, 0 --> main53
+main53: li %23, 0 --> main52
+main52: li %24, 0 --> main51
+main51: li %25, 0 --> main50
+main50: li %26, 0 --> main49
+main49: li %27, 0 --> main48
+main48: li %28, 0 --> main38
+main38: emit c104 --> main37
+main37: li %18, 3 --> main36
+main36: li %19, 1 --> main35
+main35: la %26, for_2 --> main45
+main45: call %0, %26(%18, %19) --> main34
+main34: emit c103 --> main33
+main33: li %15, 1 --> main32
+main32: li %16, 2 --> main31
+main31: li %17, 3 --> main30
+main30: la %25, for_loopParalAsync --> main44
+main44: call %0, %25(%15, %16, %17) --> main29
+main29: emit c102 --> main28
+main28: li %14, 1 --> main27
+main27: la %23, for_double --> main42
+main42: call %0, %23(%14) --> main26
+main26: emit c101 --> main25
+main25: li %11, 2 --> main24
+main24: li %12, 10 --> main23
+main23: li %13, 1 --> main22
+main22: la %22, for_ex --> main41
+main41: call %0, %22(%11, %12, %13) --> main21
+main21: emit c100 --> main20
+main20: li %8, 2 --> main19
+main19: li %9, 10 --> main18
+main18: li %10, 1 --> main17
+main17: la %21, for_fortSimple --> main40
+main40: call %0, %21(%8, %9, %10) --> main16
+main16: emit c99 --> main15
+main15: li %6, 2 --> main14
+main14: li %7, 3 --> main13
+main13: la %20, for_imbriq --> main39
+main39: call %0, %20(%6, %7) --> main12
+main12: emit c98 --> main11
+main11: li %4, 2 --> main10
+main10: li %5, 3 --> main9
+main9 : la %28, for_incr --> main47
+main47: call %0, %28(%4, %5) --> main8
+main8 : emit c97 --> main7
+main7 : li %2, 2 --> main6
+main6 : li %3, 3 --> main5
+main5 : la %27, for_incrParam --> main46
+main46: call %0, %27(%2, %3) --> main4
+main4 : emit c96 --> main3
+main3 : la %24, for_forfor --> main43
+main43: call %0, %24() --> main2
+main2 : emit c95 --> main1
+main1 : move %1, %0 --> main0
+main0 : return %1
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program: (main function is "main")
+
+
+ globals:
+
+
+ "__builtin___memcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memmove_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___mempcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memset_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___stpcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strcat_chk": int -> int -> int -> int
+
+
+ "__builtin___strcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strncat_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___strncpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vfprintf_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vprintf_chk": int -> int -> int -> int
+
+
+ "__builtin___vsnprintf_chk": int -> int -> int -> int -> int -> int -> int
+
+
+ "__builtin___vsprintf_chk": int -> int -> int -> int -> int -> int
+
+
+ "__builtin_acos": float -> float
+
+
+ "__builtin_acosf": float -> float
+
+
+ "__builtin_acosl": float -> float
+
+
+ "__builtin_alloca": int -> int
+
+
+ "__builtin_asin": float -> float
+
+
+ "__builtin_asinf": float -> float
+
+
+ "__builtin_asinl": float -> float
+
+
+ "__builtin_atan": float -> float
+
+
+ "__builtin_atanf": float -> float
+
+
+ "__builtin_atanl": float -> float
+
+
+ "__builtin_atan2": float -> float -> float
+
+
+ "__builtin_atan2f": float -> float -> float
+
+
+ "__builtin_atan2l": float -> float -> float
+
+
+ "__builtin_ceil": float -> float
+
+
+ "__builtin_ceilf": float -> float
+
+
+ "__builtin_ceill": float -> float
+
+
+ "__builtin_cos": float -> float
+
+
+ "__builtin_cosf": float -> float
+
+
+ "__builtin_cosl": float -> float
+
+
+ "__builtin_cosh": float -> float
+
+
+ "__builtin_coshf": float -> float
+
+
+ "__builtin_coshl": float -> float
+
+
+ "__builtin_clz": int -> int
+
+
+ "__builtin_clzl": int -> int
+
+
+ "__builtin_clzll": int -> int
+
+
+ "__builtin_constant_p": int -> int
+
+
+ "__builtin_ctz": int -> int
+
+
+ "__builtin_ctzl": int -> int
+
+
+ "__builtin_ctzll": int -> int
+
+
+ "__builtin_exp": float -> float
+
+
+ "__builtin_expf": float -> float
+
+
+ "__builtin_expl": float -> float
+
+
+ "__builtin_expect": int -> int -> int
+
+
+ "__builtin_fabs": float -> float
+
+
+ "__builtin_fabsf": float -> float
+
+
+ "__builtin_fabsl": float -> float
+
+
+ "__builtin_ffs": int -> int
+
+
+ "__builtin_ffsl": int -> int
+
+
+ "__builtin_ffsll": int -> int
+
+
+ "__builtin_frame_address": int -> int
+
+
+ "__builtin_floor": float -> float
+
+
+ "__builtin_floorf": float -> float
+
+
+ "__builtin_floorl": float -> float
+
+
+ "__builtin_huge_val": float
+
+
+ "__builtin_huge_valf": float
+
+
+ "__builtin_huge_vall": float
+
+
+ "__builtin_inf": float
+
+
+ "__builtin_inff": float
+
+
+ "__builtin_infl": float
+
+
+ "__builtin_memcpy": int -> int -> int -> int
+
+
+ "__builtin_mempcpy": int -> int -> int -> int
+
+
+ "__builtin_fmod": float -> float
+
+
+ "__builtin_fmodf": float -> float
+
+
+ "__builtin_fmodl": float -> float
+
+
+ "__builtin_frexp": float -> int -> float
+
+
+ "__builtin_frexpf": float -> int -> float
+
+
+ "__builtin_frexpl": float -> int -> float
+
+
+ "__builtin_ldexp": float -> int -> float
+
+
+ "__builtin_ldexpf": float -> int -> float
+
+
+ "__builtin_ldexpl": float -> int -> float
+
+
+ "__builtin_log": float -> float
+
+
+ "__builtin_logf": float -> float
+
+
+ "__builtin_logl": float -> float
+
+
+ "__builtin_log10": float -> float
+
+
+ "__builtin_log10f": float -> float
+
+
+ "__builtin_log10l": float -> float
+
+
+ "__builtin_modff": float -> int -> float
+
+
+ "__builtin_modfl": float -> int -> float
+
+
+ "__builtin_nan": int -> float
+
+
+ "__builtin_nanf": int -> float
+
+
+ "__builtin_nanl": int -> float
+
+
+ "__builtin_nans": int -> float
+
+
+ "__builtin_nansf": int -> float
+
+
+ "__builtin_nansl": int -> float
+
+
+ "__builtin_next_arg": int
+
+
+ "__builtin_object_size": int -> int -> int
+
+
+ "__builtin_parity": int -> int
+
+
+ "__builtin_parityl": int -> int
+
+
+ "__builtin_parityll": int -> int
+
+
+ "__builtin_popcount": int -> int
+
+
+ "__builtin_popcountl": int -> int
+
+
+ "__builtin_popcountll": int -> int
+
+
+ "__builtin_powi": float -> int -> float
+
+
+ "__builtin_powif": float -> int -> float
+
+
+ "__builtin_powil": float -> int -> float
+
+
+ "__builtin_return": int -> void
+
+
+ "__builtin_return_address": int -> int
+
+
+ "__builtin_sin": float -> float
+
+
+ "__builtin_sinf": float -> float
+
+
+ "__builtin_sinl": float -> float
+
+
+ "__builtin_sinh": float -> float
+
+
+ "__builtin_sinhf": float -> float
+
+
+ "__builtin_sinhl": float -> float
+
+
+ "__builtin_sqrt": float -> float
+
+
+ "__builtin_sqrtf": float -> float
+
+
+ "__builtin_sqrtl": float -> float
+
+
+ "__builtin_stpcpy": int -> int -> int
+
+
+ "__builtin_strchr": int -> int -> int
+
+
+ "__builtin_strcmp": int -> int -> int
+
+
+ "__builtin_strcpy": int -> int -> int
+
+
+ "__builtin_strcspn": int -> int -> int
+
+
+ "__builtin_strncat": int -> int -> int -> int
+
+
+ "__builtin_strncmp": int -> int -> int -> int
+
+
+ "__builtin_strncpy": int -> int -> int -> int
+
+
+ "__builtin_strspn": int -> int -> int
+
+
+ "__builtin_strpbrk": int -> int -> int
+
+
+ "__builtin_types_compatible_p": int -> int -> int
+
+
+ "__builtin_tan": float -> float
+
+
+ "__builtin_tanf": float -> float
+
+
+ "__builtin_tanl": float -> float
+
+
+ "__builtin_tanh": float -> float
+
+
+ "__builtin_tanhf": float -> float
+
+
+ "__builtin_tanhl": float -> float
+
+
+ "__builtin_va_end": int -> void
+
+
+ "__builtin_varargs_start": int -> void
+
+
+ "__builtin_va_start": int -> int -> void
+
+
+ "__builtin_stdarg_start": int -> void
+
+
+ "__builtin_va_arg": int -> int -> void
+
+
+ "__builtin_va_copy": int -> int -> void
+
+
+ "for_2"(%0, %1): int -> int -> int
+ locals: %7, %2, %3, %4, %5, %6, %8, %9, %10, %11, %12, %13, %14
+ result: %7
+ stacksize: 0
+ entry: for_227
+ exit: for_20
+
+ for_29: eq %9, %10 --> for_28, for_23
+ for_28: emit c1 --> for_27
+ for_27: add %5, %5, %4 --> for_26
+ for_26: emit c2 --> for_25
+ for_25: add %4, %4, %3 --> for_24
+ for_24: --> for_213
+ for_23: emit c0 --> for_22
+ for_227: emit c9 --> for_226
+ for_226: imm_int 0, %5, --> for_225
+ for_225: emit c8 --> for_224
+ for_224: imm_int 2, %14, --> for_223
+ for_223: mul %6, %0, %14 --> for_222
+ for_222: emit c7 --> for_221
+ for_221: imm_int 4, %13, --> for_220
+ for_220: mul %2, %0, %13 --> for_219
+ for_22: imm_int 1, %8, --> for_21
+ for_219: emit c6 --> for_218
+ for_218: imm_int 1, %12, --> for_217
+ for_217: add %3, %1, %12 --> for_216
+ for_216: emit c5 --> for_215
+ for_215: emit c4 --> for_214
+ for_214: mov %4, %6 --> for_24
+ for_213: imm_int 0, %10, --> for_212
+ for_212: emit c3 --> for_211
+ for_211: lt %11, %4, %2 --> for_210
+ for_210: notbool %9, %11 --> for_29
+ for_21: add %7, %5, %8 --> for_20
+ for_20: return %7
+
+
+ "for_loopParalAsync"(%0, %1, %2): int -> int -> int -> int
+ locals: %8, %3, %4, %5, %6, %7, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24
+ result: %8
+ stacksize: 0
+ entry: for_loopParalAsync56
+ exit: for_loopParalAsync0
+
+ for_loopParalAsync9: mul %2, %2, %10 --> for_loopParalAsync8
+ for_loopParalAsync8: emit c11 --> for_loopParalAsync7
+ for_loopParalAsync7: div %3, %2, %6 --> for_loopParalAsync6
+ for_loopParalAsync6: emit c13 --> for_loopParalAsync5
+ for_loopParalAsync56: emit c29 --> for_loopParalAsync55
+ for_loopParalAsync55: imm_int 0, %5, --> for_loopParalAsync54
+ for_loopParalAsync54: emit c28 --> for_loopParalAsync53
+ for_loopParalAsync53: imm_int 0, %0, --> for_loopParalAsync52
+ for_loopParalAsync52: emit c27 --> for_loopParalAsync51
+ for_loopParalAsync51: imm_int 3, %24, --> for_loopParalAsync50
+ for_loopParalAsync50: add %0, %0, %24 --> for_loopParalAsync49
+ for_loopParalAsync5: imm_int 1, %9, --> for_loopParalAsync4
+ for_loopParalAsync49: emit c26 --> for_loopParalAsync48
+ for_loopParalAsync48: imm_int 2, %23, --> for_loopParalAsync47
+ for_loopParalAsync47: mul %0, %0, %23 --> for_loopParalAsync46
+ for_loopParalAsync46: emit c25 --> for_loopParalAsync45
+ for_loopParalAsync45: imm_int 3, %22, --> for_loopParalAsync44
+ for_loopParalAsync44: div %0, %0, %22 --> for_loopParalAsync43
+ for_loopParalAsync43: emit c24 --> for_loopParalAsync42
+ for_loopParalAsync42: imm_int 8, %21, --> for_loopParalAsync41
+ for_loopParalAsync41: add %0, %0, %21 --> for_loopParalAsync40
+ for_loopParalAsync40: emit c23 --> for_loopParalAsync39
+ for_loopParalAsync4: add %6, %6, %9 --> for_loopParalAsync3
+ for_loopParalAsync39: emit c22 --> for_loopParalAsync38
+ for_loopParalAsync38: imm_int 0, %7, --> for_loopParalAsync20
+ for_loopParalAsync37: imm_int 0, %18, --> for_loopParalAsync36
+ for_loopParalAsync36: emit c21 --> for_loopParalAsync35
+ for_loopParalAsync35: imm_int 20, %20, --> for_loopParalAsync34
+ for_loopParalAsync34: lt %19, %7, %20 --> for_loopParalAsync33
+ for_loopParalAsync33: notbool %17, %19 --> for_loopParalAsync32
+ for_loopParalAsync32: eq %17, %18 --> for_loopParalAsync31, for_loopParalAsync19
+ for_loopParalAsync31: emit c19 --> for_loopParalAsync30
+ for_loopParalAsync30: imm_int 1, %16, --> for_loopParalAsync29
+ for_loopParalAsync3: --> for_loopParalAsync16
+ for_loopParalAsync29: add %5, %5, %16 --> for_loopParalAsync28
+ for_loopParalAsync28: emit c18 --> for_loopParalAsync27
+ for_loopParalAsync27: imm_int 2, %15, --> for_loopParalAsync26
+ for_loopParalAsync26: add %1, %1, %15 --> for_loopParalAsync25
+ for_loopParalAsync25: emit c17 --> for_loopParalAsync24
+ for_loopParalAsync24: div %4, %1, %5 --> for_loopParalAsync23
+ for_loopParalAsync23: emit c20 --> for_loopParalAsync22
+ for_loopParalAsync22: imm_int 1, %14, --> for_loopParalAsync21
+ for_loopParalAsync21: add %7, %7, %14 --> for_loopParalAsync20
+ for_loopParalAsync20: --> for_loopParalAsync37
+ for_loopParalAsync2: emit c10 --> for_loopParalAsync1
+ for_loopParalAsync19: emit c16 --> for_loopParalAsync18
+ for_loopParalAsync18: emit c15 --> for_loopParalAsync17
+ for_loopParalAsync17: imm_int 1, %6, --> for_loopParalAsync3
+ for_loopParalAsync16: imm_int 0, %12, --> for_loopParalAsync15
+ for_loopParalAsync15: emit c14 --> for_loopParalAsync14
+ for_loopParalAsync14: lt %13, %6, %0 --> for_loopParalAsync13
+ for_loopParalAsync13: notbool %11, %13 --> for_loopParalAsync12
+ for_loopParalAsync12: eq %11, %12 --> for_loopParalAsync11, for_loopParalAsync2
+ for_loopParalAsync11: emit c12 --> for_loopParalAsync10
+ for_loopParalAsync10: imm_int 2, %10, --> for_loopParalAsync9
+ for_loopParalAsync1: mov %8, %5 --> for_loopParalAsync0
+ for_loopParalAsync0: return %8
+
+
+ "for_double"(%0): int -> int
+ locals: %6, %1, %2, %3, %4, %5, %7, %8, %9, %10, %11, %12, %13, %14
+ result: %6
+ stacksize: 0
+ entry: for_double36
+ exit: for_double0
+
+ for_double9: emit c32 --> for_double8
+ for_double8: add %4, %4, %1 --> for_double7
+ for_double7: emit c33 --> for_double6
+ for_double6: add %1, %1, %0 --> for_double5
+ for_double5: --> for_double15
+ for_double4: emit c31 --> for_double3
+ for_double36: emit c43 --> for_double35
+ for_double35: imm_int 0, %5, --> for_double34
+ for_double34: emit c42 --> for_double33
+ for_double33: imm_int 0, %4, --> for_double32
+ for_double32: emit c41 --> for_double31
+ for_double31: emit c40 --> for_double30
+ for_double30: imm_int 0, %2, --> for_double19
+ for_double3: mul %3, %5, %4 --> for_double2
+ for_double29: imm_int 0, %12, --> for_double28
+ for_double28: emit c39 --> for_double27
+ for_double27: imm_int 12, %14, --> for_double26
+ for_double26: lt %13, %2, %14 --> for_double25
+ for_double25: notbool %11, %13 --> for_double24
+ for_double24: eq %11, %12 --> for_double23, for_double18
+ for_double23: emit c37 --> for_double22
+ for_double22: add %5, %5, %2 --> for_double21
+ for_double21: emit c38 --> for_double20
+ for_double20: add %2, %2, %0 --> for_double19
+ for_double2: emit c30 --> for_double1
+ for_double19: --> for_double29
+ for_double18: emit c36 --> for_double17
+ for_double17: emit c35 --> for_double16
+ for_double16: imm_int 0, %1, --> for_double5
+ for_double15: imm_int 0, %8, --> for_double14
+ for_double14: emit c34 --> for_double13
+ for_double13: imm_int 5, %10, --> for_double12
+ for_double12: lt %9, %1, %10 --> for_double11
+ for_double11: notbool %7, %9 --> for_double10
+ for_double10: eq %7, %8 --> for_double9, for_double4
+ for_double1: mov %6, %3 --> for_double0
+ for_double0: return %6
+
+
+ "for_ex"(%0, %1, %2): int -> int -> int -> int
+ locals: %5, %3, %4, %6, %7, %8, %9, %10, %11
+ result: %5
+ stacksize: 0
+ entry: for_ex20
+ exit: for_ex0
+
+ for_ex9: notbool %6, %8 --> for_ex8
+ for_ex8: eq %6, %7 --> for_ex7, for_ex2
+ for_ex7: emit c45 --> for_ex6
+ for_ex6: sub %3, %3, %4 --> for_ex5
+ for_ex5: emit c46 --> for_ex4
+ for_ex4: add %4, %4, %2 --> for_ex3
+ for_ex3: --> for_ex14
+ for_ex20: emit c50 --> for_ex19
+ for_ex2: emit c44 --> for_ex1
+ for_ex19: imm_int 0, %3, --> for_ex18
+ for_ex18: emit c49 --> for_ex17
+ for_ex17: emit c48 --> for_ex16
+ for_ex16: imm_int 3, %11, --> for_ex15
+ for_ex15: add %4, %0, %11 --> for_ex3
+ for_ex14: imm_int 0, %7, --> for_ex13
+ for_ex13: emit c47 --> for_ex12
+ for_ex12: imm_int 2, %10, --> for_ex11
+ for_ex11: mul %9, %1, %10 --> for_ex10
+ for_ex10: le %8, %4, %9 --> for_ex9
+ for_ex1: mov %5, %3 --> for_ex0
+ for_ex0: return %5
+
+
+ "for_fortSimple"(%0, %1, %2): int -> int -> int -> int
+ locals: %7, %3, %4, %5, %6, %8, %9, %10
+ result: %7
+ stacksize: 0
+ entry: for_fortSimple19
+ exit: for_fortSimple0
+
+ for_fortSimple9: emit c53 --> for_fortSimple8
+ for_fortSimple8: add %3, %3, %5 --> for_fortSimple7
+ for_fortSimple7: emit c54 --> for_fortSimple6
+ for_fortSimple6: add %5, %5, %2 --> for_fortSimple5
+ for_fortSimple5: --> for_fortSimple14
+ for_fortSimple4: emit c52 --> for_fortSimple3
+ for_fortSimple3: add %4, %3, %0 --> for_fortSimple2
+ for_fortSimple2: emit c51 --> for_fortSimple1
+ for_fortSimple19: emit c58 --> for_fortSimple18
+ for_fortSimple18: imm_int 0, %3, --> for_fortSimple17
+ for_fortSimple17: emit c57 --> for_fortSimple16
+ for_fortSimple16: emit c56 --> for_fortSimple15
+ for_fortSimple15: mov %5, %0 --> for_fortSimple5
+ for_fortSimple14: imm_int 0, %9, --> for_fortSimple13
+ for_fortSimple13: emit c55 --> for_fortSimple12
+ for_fortSimple12: lt %10, %5, %1 --> for_fortSimple11
+ for_fortSimple11: notbool %8, %10 --> for_fortSimple10
+ for_fortSimple10: eq %8, %9 --> for_fortSimple9, for_fortSimple4
+ for_fortSimple1: mov %7, %4 --> for_fortSimple0
+ for_fortSimple0: return %7
+
+
+ "for_imbriq"(%0, %1): int -> int -> int
+ locals: %6, %2, %3, %4, %5, %7, %8, %9, %10, %11, %12, %13, %14
+ result: %6
+ stacksize: 0
+ entry: for_imbriq34
+ exit: for_imbriq0
+
+ for_imbriq9: mod %4, %4, %2 --> for_imbriq8
+ for_imbriq8: emit c62 --> for_imbriq7
+ for_imbriq7: add %2, %2, %1 --> for_imbriq6
+ for_imbriq6: --> for_imbriq18
+ for_imbriq5: emit c67 --> for_imbriq4
+ for_imbriq4: add %3, %3, %0 --> for_imbriq3
+ for_imbriq34: emit c71 --> for_imbriq33
+ for_imbriq33: imm_int 0, %5, --> for_imbriq32
+ for_imbriq32: emit c70 --> for_imbriq31
+ for_imbriq31: emit c69 --> for_imbriq30
+ for_imbriq30: imm_int 0, %3, --> for_imbriq3
+ for_imbriq3: --> for_imbriq29
+ for_imbriq29: imm_int 0, %12, --> for_imbriq28
+ for_imbriq28: emit c68 --> for_imbriq27
+ for_imbriq27: imm_int 23, %14, --> for_imbriq26
+ for_imbriq26: lt %13, %3, %14 --> for_imbriq25
+ for_imbriq25: notbool %11, %13 --> for_imbriq24
+ for_imbriq24: eq %11, %12 --> for_imbriq23, for_imbriq2
+ for_imbriq23: emit c66 --> for_imbriq22
+ for_imbriq22: imm_int 0, %4, --> for_imbriq21
+ for_imbriq21: emit c65 --> for_imbriq20
+ for_imbriq20: emit c64 --> for_imbriq19
+ for_imbriq2: emit c59 --> for_imbriq1
+ for_imbriq19: imm_int 1, %2, --> for_imbriq6
+ for_imbriq18: imm_int 0, %8, --> for_imbriq17
+ for_imbriq17: emit c63 --> for_imbriq16
+ for_imbriq16: imm_int 12, %10, --> for_imbriq15
+ for_imbriq15: lt %9, %2, %10 --> for_imbriq14
+ for_imbriq14: notbool %7, %9 --> for_imbriq13
+ for_imbriq13: eq %7, %8 --> for_imbriq12, for_imbriq5
+ for_imbriq12: emit c61 --> for_imbriq11
+ for_imbriq11: add %5, %5, %4 --> for_imbriq10
+ for_imbriq10: emit c60 --> for_imbriq9
+ for_imbriq1: mov %6, %5 --> for_imbriq0
+ for_imbriq0: return %6
+
+
+ "for_incr"(%0, %1): int -> int -> int
+ locals: %4, %2, %3, %5, %6, %7, %8, %9, %10, %11
+ result: %4
+ stacksize: 0
+ entry: for_incr21
+ exit: for_incr0
+
+ for_incr9: eq %6, %7 --> for_incr8, for_incr2
+ for_incr8: emit c73 --> for_incr7
+ for_incr7: sub %2, %2, %3 --> for_incr6
+ for_incr6: emit c74 --> for_incr5
+ for_incr5: imm_int 1, %5, --> for_incr4
+ for_incr4: add %3, %3, %5 --> for_incr3
+ for_incr3: --> for_incr15
+ for_incr21: emit c78 --> for_incr20
+ for_incr20: imm_int 0, %2, --> for_incr19
+ for_incr2: emit c72 --> for_incr1
+ for_incr19: emit c77 --> for_incr18
+ for_incr18: emit c76 --> for_incr17
+ for_incr17: imm_int 3, %11, --> for_incr16
+ for_incr16: add %3, %0, %11 --> for_incr3
+ for_incr15: imm_int 0, %7, --> for_incr14
+ for_incr14: emit c75 --> for_incr13
+ for_incr13: imm_int 2, %10, --> for_incr12
+ for_incr12: mul %9, %1, %10 --> for_incr11
+ for_incr11: le %8, %3, %9 --> for_incr10
+ for_incr10: notbool %6, %8 --> for_incr9
+ for_incr1: mov %4, %2 --> for_incr0
+ for_incr0: return %4
+
+
+ "for_incrParam"(%0, %1): int -> int -> int
+ locals: %5, %2, %3, %4, %6, %7, %8, %9, %10, %11, %12, %13
+ result: %5
+ stacksize: 0
+ entry: for_incrParam24
+ exit: for_incrParam0
+
+ for_incrParam9: eq %7, %8 --> for_incrParam8, for_incrParam2
+ for_incrParam8: emit c80 --> for_incrParam7
+ for_incrParam7: add %6, %3, %2 --> for_incrParam6
+ for_incrParam6: add %3, %6, %0 --> for_incrParam5
+ for_incrParam5: emit c81 --> for_incrParam4
+ for_incrParam4: add %3, %3, %0 --> for_incrParam3
+ for_incrParam3: --> for_incrParam15
+ for_incrParam24: emit c86 --> for_incrParam23
+ for_incrParam23: add %2, %0, %1 --> for_incrParam22
+ for_incrParam22: emit c85 --> for_incrParam21
+ for_incrParam21: imm_int 3, %13, --> for_incrParam20
+ for_incrParam20: mul %4, %13, %2 --> for_incrParam19
+ for_incrParam2: emit c79 --> for_incrParam1
+ for_incrParam19: emit c84 --> for_incrParam18
+ for_incrParam18: emit c83 --> for_incrParam17
+ for_incrParam17: imm_int 4, %12, --> for_incrParam16
+ for_incrParam16: sub %3, %2, %12 --> for_incrParam3
+ for_incrParam15: imm_int 0, %8, --> for_incrParam14
+ for_incrParam14: emit c82 --> for_incrParam13
+ for_incrParam13: imm_int 6, %11, --> for_incrParam12
+ for_incrParam12: add %10, %1, %11 --> for_incrParam11
+ for_incrParam11: lt %9, %3, %10 --> for_incrParam10
+ for_incrParam10: notbool %7, %9 --> for_incrParam9
+ for_incrParam1: mov %5, %3 --> for_incrParam0
+ for_incrParam0: return %5
+
+
+ "for_forfor"(): int
+ locals: %2, %0, %1, %3, %4, %5, %6, %7, %8, %9
+ result: %2
+ stacksize: 0
+ entry: for_forfor23
+ exit: for_forfor0
+
+ for_forfor9: emit c88 --> for_forfor8
+ for_forfor8: imm_int 1, %4, --> for_forfor7
+ for_forfor7: add %0, %0, %4 --> for_forfor6
+ for_forfor6: emit c90 --> for_forfor5
+ for_forfor5: imm_int 1, %3, --> for_forfor4
+ for_forfor4: add %1, %1, %3 --> for_forfor3
+ for_forfor3: --> for_forfor18
+ for_forfor23: emit c94 --> for_forfor22
+ for_forfor22: emit c93 --> for_forfor21
+ for_forfor21: imm_int 0, %1, --> for_forfor20
+ for_forfor20: emit c92 --> for_forfor19
+ for_forfor2: emit c87 --> for_forfor1
+ for_forfor19: imm_int 0, %0, --> for_forfor3
+ for_forfor18: imm_int 0, %7, --> for_forfor17
+ for_forfor17: emit c91 --> for_forfor16
+ for_forfor16: imm_int 10, %9, --> for_forfor15
+ for_forfor15: lt %8, %1, %9 --> for_forfor14
+ for_forfor14: notbool %6, %8 --> for_forfor13
+ for_forfor13: eq %6, %7 --> for_forfor12, for_forfor2
+ for_forfor12: emit c89 --> for_forfor11
+ for_forfor11: imm_int 1, %5, --> for_forfor10
+ for_forfor10: add %0, %0, %5 --> for_forfor9
+ for_forfor1: mov %2, %0 --> for_forfor0
+ for_forfor0: return %2
+
+
+ "main"(): int
+ locals: %1, %0, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19
+ result: %1
+ stacksize: 0
+ entry: main38
+ exit: main0
+
+ main9: call "for_incr", %4, %5, %0: int -> int -> int --> main8
+ main8: emit c97 --> main7
+ main7: imm_int 2, %2, --> main6
+ main6: imm_int 3, %3, --> main5
+ main5: call "for_incrParam", %2, %3, %0: int -> int -> int --> main4
+ main4: emit c96 --> main3
+ main38: emit c104 --> main37
+ main37: imm_int 3, %18, --> main36
+ main36: imm_int 1, %19, --> main35
+ main35: call "for_2", %18, %19, %0: int -> int -> int --> main34
+ main34: emit c103 --> main33
+ main33: imm_int 1, %15, --> main32
+ main32: imm_int 2, %16, --> main31
+ main31: imm_int 3, %17, --> main30
+ main30: call "for_loopParalAsync", %15, %16, %17, %0: int -> int -> int -> int --> main29
+ main3: call "for_forfor", , %0: int --> main2
+ main29: emit c102 --> main28
+ main28: imm_int 1, %14, --> main27
+ main27: call "for_double", %14, %0: int -> int --> main26
+ main26: emit c101 --> main25
+ main25: imm_int 2, %11, --> main24
+ main24: imm_int 10, %12, --> main23
+ main23: imm_int 1, %13, --> main22
+ main22: call "for_ex", %11, %12, %13, %0: int -> int -> int -> int --> main21
+ main21: emit c100 --> main20
+ main20: imm_int 2, %8, --> main19
+ main2: emit c95 --> main1
+ main19: imm_int 10, %9, --> main18
+ main18: imm_int 1, %10, --> main17
+ main17: call "for_fortSimple", %8, %9, %10, %0: int -> int -> int -> int --> main16
+ main16: emit c99 --> main15
+ main15: imm_int 2, %6, --> main14
+ main14: imm_int 3, %7, --> main13
+ main13: call "for_imbriq", %6, %7, %0: int -> int -> int --> main12
+ main12: emit c98 --> main11
+ main11: imm_int 2, %4, --> main10
+ main10: imm_int 3, %5, --> main9
+ main1: mov %1, %0 --> main0
+ main0: return %1
+
+
--- /dev/null
+int for_2(int a,int b){\r
+ int i,min,max,pas,resul;\r
+ resul = 0;\r
+ min = a*2;\r
+ max = a*4;\r
+ pas=b+1;\r
+ for(i=min;i<max;i=i+pas){\r
+ resul=resul+i;\r
+ }\r
+ return resul+1;\r
+}\r
+\r
+int for_loopParalAsync (int a, int b, int c) {\r
+ int i, j, x, y,z;\r
+ x=0;\r
+ a=0;\r
+ a=a+3;\r
+ a=a*2;\r
+ a=a/3;\r
+ a=a+8;\r
+ for (i=0; i<20; i = i+1) {\r
+ x=x+1;\r
+ b=b+2;\r
+ y=b/x;\r
+ }\r
+ for (j=1; j<a; j = j+1) {\r
+ c=c*2;\r
+ z=c/j;\r
+ }\r
+ return x;\r
+}\r
+\r
+int for_double(int pas){\r
+ int i,j, result, a, b;\r
+ a = 0;\r
+ b = 0;\r
+ for(i=0;i<12;i=i+pas){\r
+ a=a+i;\r
+ }\r
+ for(j=0;j<5;j=j+pas){\r
+ b=b+j;\r
+ }\r
+ result = a*b;\r
+ return result;\r
+}\r
+\r
+int for_ex(int b,int e,int pas){\r
+ int i,res;\r
+ res=0;\r
+ for(i=b+3;i<=e*2;i=i+pas){\r
+ res=res-i;\r
+ }\r
+ return res;\r
+}\r
+\r
+int for_fortSimple(int a, int b,int pas){\r
+ int res,i,sortie, c;\r
+ res=0;\r
+ for(i=a;i<b;i=i+pas){\r
+ res=res+i;\r
+ }\r
+ sortie=res+a;\r
+ return sortie;\r
+}\r
+\r
+int for_imbriq(int pas1,int pas2){\r
+ int i,j,a,b;\r
+ a=0;\r
+ for(i=0;i<23;i=i+pas1){\r
+ b=0;\r
+ for(j=1;j<12;j=j+pas2){\r
+ a=a+b;\r
+ b=b%j;\r
+ }\r
+ }\r
+ return a;\r
+}\r
+\r
+int for_incr(int b,int e){\r
+ int i,res;\r
+ res=0;\r
+ for(i=b+3;i<=e*2;i=i+1){\r
+ res=res-i;\r
+ }\r
+ return res;\r
+}\r
+\r
+int for_incrParam(int a, int b){\r
+ int i,z,c;\r
+ z= a+b;\r
+ c= 3*z;\r
+ for(i=z-4;i<b+6;i=i+a){\r
+ i=i+z+a;\r
+ }\r
+ return i;\r
+}\r
+\r
+int for_forfor (){\r
+ int i,j;\r
+ for (i=0,j=0;i<10;i=i+1) {j=j+1;j=j+1;}\r
+ return j;\r
+}\r
+\r
+int main(){\r
+ int a;\r
+ a = for_2(3,1);\r
+ a = for_loopParalAsync(1,2,3);\r
+ a = for_double(1);\r
+ a = for_ex(2,10,1);\r
+ a = for_fortSimple(2,10,1);\r
+ a = for_imbriq(2,3);\r
+ a = for_incr(2,3);\r
+ a = for_incrParam(2,3);\r
+ a = for_forfor();\r
+ return a;\r
+}\r
--- /dev/null
+int for_2(int a,int b){\r
+ int i,min,max,pas,resul;\r
+ resul = 0;\r
+ min = a*2;\r
+ max = a*4;\r
+ pas=b+1;\r
+ for(i=min;i<max;i=i+pas){\r
+ resul=resul+i;\r
+ }\r
+ return resul+1;\r
+}\r
+\r
+int for_loopParalAsync (int a, int b, int c) {\r
+ int i, j, x, y,z;\r
+ x=0;\r
+ a=0;\r
+ a=a+3;\r
+ a=a*2;\r
+ a=a/3;\r
+ a=a+8;\r
+ for (i=0; i<20; i = i+1) {\r
+ x=x+1;\r
+ b=b+2;\r
+ y=b/x;\r
+ }\r
+ for (j=1; j<a; j = j+1) {\r
+ c=c*2;\r
+ z=c/j;\r
+ }\r
+ return x;\r
+}\r
+\r
+int for_double(int pas){\r
+ int i,j, result, a, b;\r
+ a = 0;\r
+ b = 0;\r
+ for(i=0;i<12;i=i+pas){\r
+ a=a+i;\r
+ }\r
+ for(j=0;j<5;j=j+pas){\r
+ b=b+j;\r
+ }\r
+ result = a*b;\r
+ return result;\r
+}\r
+\r
+int for_ex(int b,int e,int pas){\r
+ int i,res;\r
+ res=0;\r
+ for(i=b+3;i<=e*2;i=i+pas){\r
+ res=res-i;\r
+ }\r
+ return res;\r
+}\r
+\r
+int for_fortSimple(int a, int b,int pas){\r
+ int res,i,sortie, c;\r
+ res=0;\r
+ for(i=a;i<b;i=i+pas){\r
+ res=res+i;\r
+ }\r
+ sortie=res+a;\r
+ return sortie;\r
+}\r
+\r
+int for_imbriq(int pas1,int pas2){\r
+ int i,j,a,b;\r
+ a=0;\r
+ for(i=0;i<23;i=i+pas1){\r
+ b=0;\r
+ for(j=1;j<12;j=j+pas2){\r
+ a=a+b;\r
+ b=b%j;\r
+ }\r
+ }\r
+ return a;\r
+}\r
+\r
+int for_incr(int b,int e){\r
+ int i,res;\r
+ res=0;\r
+ for(i=b+3;i<=e*2;i=i+1){\r
+ res=res-i;\r
+ }\r
+ return res;\r
+}\r
+\r
+int for_incrParam(int a, int b){\r
+ int i,z,c;\r
+ z= a+b;\r
+ c= 3*z;\r
+ for(i=z-4;i<b+6;i=i+a){\r
+ i=i+z+a;\r
+ }\r
+ return i;\r
+}\r
+\r
+int for_forfor (){\r
+ int i,j;\r
+ for (i=0,j=0;i<10;i=i+1) {j=j+1;j=j+1;}\r
+ return j;\r
+}\r
+\r
+int main(){\r
+ int a;\r
+ a = for_2(3,1);\r
+ a = for_loopParalAsync(1,2,3);\r
+ a = for_double(1);\r
+ a = for_ex(2,10,1);\r
+ a = for_fortSimple(2,10,1);\r
+ a = for_imbriq(2,3);\r
+ a = for_incr(2,3);\r
+ a = for_incrParam(2,3);\r
+ a = for_forfor();\r
+ return a;\r
+}\r
--- /dev/null
+Fatal error: exception Assert_failure("src/RTLabs/RTLabsToRTL.ml", 23, 9)
--- /dev/null
+.data
+globals:
+.space 0
+nl:
+.asciiz "\n"
+.align 2
+.text
+main:
+la $gp, globals
+j main91
+write:
+li $v0, 1
+syscall
+jr $ra
+writeln:
+li $v0, 1
+syscall
+la $a0, nl
+li $v0, 4
+syscall
+jr $ra
+readln:
+li $v0, 5
+syscall
+jr $ra
+alloc:
+li $v0, 9
+syscall
+jr $ra
+
+# begin if_ual
+if_ual84:
+li $v0, 0
+c74:
+li $a3, 0
+seq $a3, $a0, $a3
+beq $a3, $zero, if_ual43
+c73:
+addu $v0, $a1, $a2
+if_ual2:
+c62:
+jr $ra
+if_ual43:
+c72:
+li $a3, 1
+seq $a3, $a0, $a3
+beq $a3, $zero, if_ual36
+c71:
+subu $v0, $a1, $a2
+j if_ual2
+if_ual36:
+c70:
+li $a3, 2
+seq $a3, $a0, $a3
+beq $a3, $zero, if_ual19
+c69:
+c68:
+beq $a1, $zero, if_ual20
+c67:
+beq $a2, $zero, if_ual21
+li $v0, 1
+j if_ual2
+if_ual21:
+li $v0, 0
+j if_ual2
+if_ual20:
+li $v0, 0
+j if_ual2
+if_ual19:
+c66:
+li $a3, 3
+seq $a0, $a0, $a3
+beq $a0, $zero, if_ual2
+c65:
+c64:
+beq $a1, $zero, if_ual7
+li $v0, 1
+j if_ual2
+if_ual7:
+c63:
+beq $a2, $zero, if_ual3
+li $v0, 1
+j if_ual2
+if_ual3:
+li $v0, 0
+j if_ual2
+# end if_ual
+
+# begin if_test
+if_test55:
+c61:
+li $v0, 0
+c60:
+c59:
+c58:
+c57:
+c56:
+slt $t0, $a0, $a1
+beq $t0, $zero, if_test15
+c55:
+addu $v0, $a0, $a1
+if_test15:
+c54:
+slt $a0, $a2, $a3
+beq $a0, $zero, if_test7
+c53:
+c52:
+if_test7:
+c51:
+c50:
+c49:
+jr $ra
+# end if_test
+
+# begin if_sansElse
+if_sansElse25:
+c48:
+li $v0, 0
+c47:
+slt $a1, $a0, $a1
+beq $a1, $zero, if_sansElse2
+c46:
+move $v0, $a0
+if_sansElse2:
+c45:
+jr $ra
+# end if_sansElse
+
+# begin if_prog
+if_prog30:
+c44:
+addu $v0, $a1, $a0
+c43:
+li $a0, 0
+slt $v0, $v0, $zero
+beq $v0, $a0, if_prog4
+c42:
+li $v0, 2
+if_prog2:
+c40:
+jr $ra
+if_prog4:
+c41:
+li $v0, 3
+j if_prog2
+# end if_prog
+
+# begin if_min
+if_min25:
+move $v0, $a1
+c39:
+sgt $a1, $a0, $v0
+beq $a1, $zero, if_min4
+c38:
+if_min2:
+c36:
+jr $ra
+if_min4:
+c37:
+move $v0, $a0
+j if_min2
+# end if_min
+
+# begin if_jian
+if_jian92:
+addiu $sp, $sp, -20
+lw $t4, 0($sp)
+lw $t3, 4($sp)
+lw $t2, 8($sp)
+lw $t0, 12($sp)
+lw $t1, 16($sp)
+li $v0, 0
+c15:
+addu $a0, $a0, $a1
+slt $t5, $a0, $a2
+c14:
+addu $a1, $a3, $t4
+c13:
+li $a0, 1
+addu $a2, $a2, $a0
+c12:
+li $a0, 1
+seq $a0, $t1, $a0
+beq $a0, $zero, if_jian8
+c11:
+beq $t5, $zero, if_jian30
+c10:
+addu $v0, $a2, $a3
+if_jian24:
+c7:
+li $a1, 0
+c6:
+li $a0, 0
+seq $a0, $t5, $a0
+beq $a0, $a1, if_jian12
+li $a0, 0
+c5:
+beq $t0, $a0, if_jian13
+li $a0, 1
+if_jian11:
+beq $a0, $zero, if_jian2
+c4:
+if_jian2:
+c0:
+addiu $sp, $sp, 20
+jr $ra
+if_jian13:
+li $a0, 0
+j if_jian11
+if_jian12:
+li $a0, 0
+j if_jian11
+if_jian30:
+c9:
+li $a0, 0
+seq $a0, $t0, $a0
+beq $a0, $zero, if_jian24
+c8:
+addu $v0, $a1, $a3
+j if_jian24
+if_jian8:
+c3:
+addu $v0, $a2, $t4
+c2:
+addu $v0, $v0, $t3
+c1:
+addu $v0, $v0, $t2
+j if_jian2
+# end if_jian
+
+# begin if_imbriq2
+if_imbriq234:
+move $v0, $a0
+c35:
+slt $a0, $v0, $a1
+beq $a0, $zero, if_imbriq24
+c34:
+slt $v0, $a1, $a2
+beq $v0, $zero, if_imbriq26
+c33:
+move $v0, $a1
+if_imbriq22:
+c30:
+jr $ra
+if_imbriq26:
+c32:
+li $v0, 47
+j if_imbriq22
+if_imbriq24:
+c31:
+j if_imbriq22
+# end if_imbriq2
+
+# begin if_imbriq1
+if_imbriq134:
+move $v0, $a2
+c29:
+slt $a2, $a0, $a1
+beq $a2, $zero, if_imbriq14
+c28:
+slt $a0, $a1, $v0
+beq $a0, $zero, if_imbriq16
+c27:
+move $v0, $a1
+if_imbriq12:
+c24:
+jr $ra
+if_imbriq16:
+c26:
+j if_imbriq12
+if_imbriq14:
+c25:
+move $v0, $a0
+j if_imbriq12
+# end if_imbriq1
+
+# begin if_exSimple
+if_exSimple39:
+c23:
+slt $v0, $a0, $a1
+beq $v0, $zero, if_exSimple9
+c22:
+addu $v0, $a0, $a1
+c21:
+li $a0, 2
+mul $v0, $a0, $v0
+c20:
+if_exSimple2:
+c16:
+jr $ra
+if_exSimple9:
+c19:
+li $v0, 2
+mul $v0, $v0, $a1
+c18:
+addu $v0, $v0, $a0
+c17:
+addu $v0, $v0, $a1
+j if_exSimple2
+# end if_exSimple
+
+# begin _main
+main91:
+addiu $sp, $sp, -4
+sw $ra, 0($sp)
+c84:
+li $a0, 1
+li $a1, 2
+li $a2, 3
+li $a3, 4
+li $t3, 5
+li $t2, 6
+li $t1, 7
+li $t0, 8
+li $v0, 9
+sw $t3, -20($sp)
+sw $t2, -16($sp)
+sw $t1, -12($sp)
+sw $t0, -8($sp)
+sw $v0, -4($sp)
+jal if_jian92
+c83:
+li $a0, 1
+li $a1, 2
+jal if_exSimple39
+c82:
+li $a0, 1
+li $a1, 2
+li $a2, 3
+jal if_imbriq134
+c81:
+li $a0, 1
+li $a1, 2
+li $a2, 3
+jal if_imbriq234
+c80:
+li $a0, 1
+li $a1, 2
+jal if_min25
+c79:
+li $a0, 1
+li $a1, 2
+jal if_prog30
+c78:
+li $a0, 1
+li $a1, 2
+jal if_sansElse25
+c77:
+li $a0, 1
+li $a1, 2
+li $a2, 3
+li $a3, 4
+jal if_test55
+c76:
+li $a0, 1
+li $a1, 2
+li $a2, 3
+jal if_ual84
+c75:
+lw $ra, 0($sp)
+addiu $sp, $sp, 4
+jr $ra
+# end _main
--- /dev/null
+extern void *__builtin___memcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memmove_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___mempcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memset_chk(void *, int, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___stpcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcat_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strncat_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___strncpy_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern int __builtin___vfprintf_chk(void *, int, unsigned char *, void *);
+
+extern int __builtin___vprintf_chk(int, unsigned char *, void *);
+
+extern int __builtin___vsnprintf_chk(unsigned char *, unsigned int, int, unsigned int, unsigned char *, void *);
+
+extern int __builtin___vsprintf_chk(unsigned char *, int, unsigned int, unsigned char *, void *);
+
+extern double __builtin_acos(double);
+
+extern float __builtin_acosf(float);
+
+extern double __builtin_acosl(double);
+
+extern void *__builtin_alloca(unsigned int);
+
+extern double __builtin_asin(double);
+
+extern float __builtin_asinf(float);
+
+extern double __builtin_asinl(double);
+
+extern double __builtin_atan(double);
+
+extern float __builtin_atanf(float);
+
+extern double __builtin_atanl(double);
+
+extern double __builtin_atan2(double, double);
+
+extern float __builtin_atan2f(float, float);
+
+extern double __builtin_atan2l(double, double);
+
+extern double __builtin_ceil(double);
+
+extern float __builtin_ceilf(float);
+
+extern double __builtin_ceill(double);
+
+extern double __builtin_cos(double);
+
+extern float __builtin_cosf(float);
+
+extern double __builtin_cosl(double);
+
+extern double __builtin_cosh(double);
+
+extern float __builtin_coshf(float);
+
+extern double __builtin_coshl(double);
+
+extern int __builtin_clz(unsigned int);
+
+extern int __builtin_clzl(unsigned int);
+
+extern int __builtin_clzll(unsigned int);
+
+extern int __builtin_constant_p(int);
+
+extern int __builtin_ctz(unsigned int);
+
+extern int __builtin_ctzl(unsigned int);
+
+extern int __builtin_ctzll(unsigned int);
+
+extern double __builtin_exp(double);
+
+extern float __builtin_expf(float);
+
+extern double __builtin_expl(double);
+
+extern int __builtin_expect(int, int);
+
+extern double __builtin_fabs(double);
+
+extern float __builtin_fabsf(float);
+
+extern double __builtin_fabsl(double);
+
+extern int __builtin_ffs(unsigned int);
+
+extern int __builtin_ffsl(unsigned int);
+
+extern int __builtin_ffsll(unsigned int);
+
+extern void *__builtin_frame_address(unsigned int);
+
+extern double __builtin_floor(double);
+
+extern float __builtin_floorf(float);
+
+extern double __builtin_floorl(double);
+
+extern double __builtin_huge_val(void);
+
+extern float __builtin_huge_valf(void);
+
+extern double __builtin_huge_vall(void);
+
+extern double __builtin_inf(void);
+
+extern float __builtin_inff(void);
+
+extern double __builtin_infl(void);
+
+extern void *__builtin_memcpy(void *, void *, unsigned int);
+
+extern void *__builtin_mempcpy(void *, void *, unsigned int);
+
+extern double __builtin_fmod(double);
+
+extern float __builtin_fmodf(float);
+
+extern double __builtin_fmodl(double);
+
+extern double __builtin_frexp(double, int *);
+
+extern float __builtin_frexpf(float, int *);
+
+extern double __builtin_frexpl(double, int *);
+
+extern double __builtin_ldexp(double, int);
+
+extern float __builtin_ldexpf(float, int);
+
+extern double __builtin_ldexpl(double, int);
+
+extern double __builtin_log(double);
+
+extern float __builtin_logf(float);
+
+extern double __builtin_logl(double);
+
+extern double __builtin_log10(double);
+
+extern float __builtin_log10f(float);
+
+extern double __builtin_log10l(double);
+
+extern float __builtin_modff(float, float *);
+
+extern double __builtin_modfl(double, double *);
+
+extern double __builtin_nan(unsigned char *);
+
+extern float __builtin_nanf(unsigned char *);
+
+extern double __builtin_nanl(unsigned char *);
+
+extern double __builtin_nans(unsigned char *);
+
+extern float __builtin_nansf(unsigned char *);
+
+extern double __builtin_nansl(unsigned char *);
+
+extern void *__builtin_next_arg(void);
+
+extern unsigned int __builtin_object_size(void *, int);
+
+extern int __builtin_parity(unsigned int);
+
+extern int __builtin_parityl(unsigned int);
+
+extern int __builtin_parityll(unsigned int);
+
+extern int __builtin_popcount(unsigned int);
+
+extern int __builtin_popcountl(unsigned int);
+
+extern int __builtin_popcountll(unsigned int);
+
+extern double __builtin_powi(double, int);
+
+extern float __builtin_powif(float, int);
+
+extern double __builtin_powil(double, int);
+
+extern void __builtin_return(void *);
+
+extern void *__builtin_return_address(unsigned int);
+
+extern double __builtin_sin(double);
+
+extern float __builtin_sinf(float);
+
+extern double __builtin_sinl(double);
+
+extern double __builtin_sinh(double);
+
+extern float __builtin_sinhf(float);
+
+extern double __builtin_sinhl(double);
+
+extern double __builtin_sqrt(double);
+
+extern float __builtin_sqrtf(float);
+
+extern double __builtin_sqrtl(double);
+
+extern unsigned char *__builtin_stpcpy(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strchr(unsigned char *, unsigned char);
+
+extern int __builtin_strcmp(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strcpy(unsigned char *, unsigned char *);
+
+extern unsigned int __builtin_strcspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strncat(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strncmp(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin_strncpy(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strpbrk(unsigned char *, unsigned char *);
+
+extern int __builtin_types_compatible_p(unsigned int, unsigned int);
+
+extern double __builtin_tan(double);
+
+extern float __builtin_tanf(float);
+
+extern double __builtin_tanl(double);
+
+extern double __builtin_tanh(double);
+
+extern float __builtin_tanhf(float);
+
+extern double __builtin_tanhl(double);
+
+extern void __builtin_va_end(void *);
+
+extern void __builtin_varargs_start(void *);
+
+extern void __builtin_va_start(void *, void *);
+
+extern void __builtin_stdarg_start(void *);
+
+extern void __builtin_va_arg(void *, unsigned int);
+
+extern void __builtin_va_copy(void *, void *);
+
+int if_jian(int a, int b, int c, int d, int e, int f, int g, int x, int y)
+{
+ int u;
+ int v;
+ int t1;
+ int t2;
+ int t3;
+ int t4;
+ int t5;
+ c15:
+ t1 = a + b < c;
+ c14:
+ t2 = d + e;
+ c13:
+ t3 = c + 1;
+ c12:
+ if (y == 1) {
+ c11:
+ if (t1) {
+ c10:
+ u = t3 + d;
+ } else {
+ c9:
+ if (!x) {
+ c8:
+ u = t2 + d;
+ }
+ }
+ c7:
+ if ((/* c6 */ !t1) && (/* c5 */ x)) {
+ c4:
+ v = t2 + e;
+ }
+ } else {
+ c3:
+ t4 = t3 + e;
+ c2:
+ t5 = t4 + f;
+ c1:
+ u = t5 + g;
+ }
+ c0:
+ return u;
+}
+
+int if_exSimple(int a, int b)
+{
+ int g;
+ int e;
+ int f;
+ c23:
+ if (a < b) {
+ c22:
+ e = a + b;
+ c21:
+ e = 2 * e;
+ c20:
+ g = e;
+ } else {
+ c19:
+ f = 2 * b;
+ c18:
+ f = f + a;
+ c17:
+ g = f + b;
+ }
+ c16:
+ return g;
+}
+
+int if_imbriq1(int a, int b, int c)
+{
+ int result;
+ c29:
+ if (a < b) {
+ c28:
+ if (b < c) {
+ c27:
+ result = b;
+ } else {
+ c26:
+ result = c;
+ }
+ } else {
+ c25:
+ result = a;
+ }
+ c24:
+ return result;
+}
+
+int if_imbriq2(int a, int b, int c)
+{
+ int result;
+ c35:
+ if (a < b) {
+ c34:
+ if (b < c) {
+ c33:
+ result = b;
+ } else {
+ c32:
+ result = 47;
+ }
+ } else {
+ c31:
+ result = a;
+ }
+ c30:
+ return result;
+}
+
+int if_min(int a, int b)
+{
+ int min;
+ c39:
+ if (a > b) {
+ c38:
+ min = b;
+ } else {
+ c37:
+ min = a;
+ }
+ c36:
+ return min;
+}
+
+int if_prog(int j, int i)
+{
+ int a;
+ int b;
+ c44:
+ a = i + j;
+ c43:
+ if (a < 0) {
+ c42:
+ b = 2;
+ } else {
+ c41:
+ b = 3;
+ }
+ c40:
+ return b;
+}
+
+int if_sansElse(int a, int b)
+{
+ int c;
+ c48:
+ c = 0;
+ c47:
+ if (a < b) {
+ c46:
+ c = a;
+ }
+ c45:
+ return c;
+}
+
+int if_test(int a, int b, int x, int y)
+{
+ int c;
+ int d;
+ int v;
+ int w;
+ int z;
+ c61:
+ c = 0;
+ c60:
+ d = 0;
+ c59:
+ v = 0;
+ c58:
+ w = 0;
+ c57:
+ z = 0;
+ c56:
+ if (a < b) {
+ c55:
+ c = a + b;
+ }
+ c54:
+ if (x < y) {
+ c53:
+ z = x + y;
+ c52:
+ w = z + x;
+ }
+ c51:
+ d = c + 1;
+ c50:
+ v = c + w;
+ c49:
+ return c;
+}
+
+int if_ual(int op, int a, int b)
+{
+ int result;
+ c74:
+ if (op == 0) {
+ c73:
+ result = a + b;
+ } else {
+ c72:
+ if (op == 1) {
+ c71:
+ result = a - b;
+ } else {
+ c70:
+ if (op == 2) {
+ c69:
+ result = (/* c68 */ a) && (/* c67 */ b);
+ } else {
+ c66:
+ if (op == 3) {
+ c65:
+ result = (/* c64 */ a) || (/* c63 */ b);
+ }
+ }
+ }
+ }
+ c62:
+ return result;
+}
+
+int main(void)
+{
+ int a;
+ c84:
+ a = if_jian(1, 2, 3, 4, 5, 6, 7, 8, 9);
+ c83:
+ a = if_exSimple(1, 2);
+ c82:
+ a = if_imbriq1(1, 2, 3);
+ c81:
+ a = if_imbriq2(1, 2, 3);
+ c80:
+ a = if_min(1, 2);
+ c79:
+ a = if_prog(1, 2);
+ c78:
+ a = if_sansElse(1, 2);
+ c77:
+ a = if_test(1, 2, 3, 4);
+ c76:
+ a = if_ual(1, 2, 3);
+ c75:
+ return a;
+}
+
+
--- /dev/null
+
+
+
+extern "__builtin___memcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memmove_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___mempcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memset_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___stpcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcat_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strncat_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___strncpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vfprintf_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vprintf_chk" : int -> int -> int -> int
+
+
+extern "__builtin___vsnprintf_chk" : int -> int -> int -> int -> int -> int -> int
+
+
+extern "__builtin___vsprintf_chk" : int -> int -> int -> int -> int -> int
+
+
+extern "__builtin_acos" : float -> float
+
+
+extern "__builtin_acosf" : float -> float
+
+
+extern "__builtin_acosl" : float -> float
+
+
+extern "__builtin_alloca" : int -> int
+
+
+extern "__builtin_asin" : float -> float
+
+
+extern "__builtin_asinf" : float -> float
+
+
+extern "__builtin_asinl" : float -> float
+
+
+extern "__builtin_atan" : float -> float
+
+
+extern "__builtin_atanf" : float -> float
+
+
+extern "__builtin_atanl" : float -> float
+
+
+extern "__builtin_atan2" : float -> float -> float
+
+
+extern "__builtin_atan2f" : float -> float -> float
+
+
+extern "__builtin_atan2l" : float -> float -> float
+
+
+extern "__builtin_ceil" : float -> float
+
+
+extern "__builtin_ceilf" : float -> float
+
+
+extern "__builtin_ceill" : float -> float
+
+
+extern "__builtin_cos" : float -> float
+
+
+extern "__builtin_cosf" : float -> float
+
+
+extern "__builtin_cosl" : float -> float
+
+
+extern "__builtin_cosh" : float -> float
+
+
+extern "__builtin_coshf" : float -> float
+
+
+extern "__builtin_coshl" : float -> float
+
+
+extern "__builtin_clz" : int -> int
+
+
+extern "__builtin_clzl" : int -> int
+
+
+extern "__builtin_clzll" : int -> int
+
+
+extern "__builtin_constant_p" : int -> int
+
+
+extern "__builtin_ctz" : int -> int
+
+
+extern "__builtin_ctzl" : int -> int
+
+
+extern "__builtin_ctzll" : int -> int
+
+
+extern "__builtin_exp" : float -> float
+
+
+extern "__builtin_expf" : float -> float
+
+
+extern "__builtin_expl" : float -> float
+
+
+extern "__builtin_expect" : int -> int -> int
+
+
+extern "__builtin_fabs" : float -> float
+
+
+extern "__builtin_fabsf" : float -> float
+
+
+extern "__builtin_fabsl" : float -> float
+
+
+extern "__builtin_ffs" : int -> int
+
+
+extern "__builtin_ffsl" : int -> int
+
+
+extern "__builtin_ffsll" : int -> int
+
+
+extern "__builtin_frame_address" : int -> int
+
+
+extern "__builtin_floor" : float -> float
+
+
+extern "__builtin_floorf" : float -> float
+
+
+extern "__builtin_floorl" : float -> float
+
+
+extern "__builtin_huge_val" : float
+
+
+extern "__builtin_huge_valf" : float
+
+
+extern "__builtin_huge_vall" : float
+
+
+extern "__builtin_inf" : float
+
+
+extern "__builtin_inff" : float
+
+
+extern "__builtin_infl" : float
+
+
+extern "__builtin_memcpy" : int -> int -> int -> int
+
+
+extern "__builtin_mempcpy" : int -> int -> int -> int
+
+
+extern "__builtin_fmod" : float -> float
+
+
+extern "__builtin_fmodf" : float -> float
+
+
+extern "__builtin_fmodl" : float -> float
+
+
+extern "__builtin_frexp" : float -> int -> float
+
+
+extern "__builtin_frexpf" : float -> int -> float
+
+
+extern "__builtin_frexpl" : float -> int -> float
+
+
+extern "__builtin_ldexp" : float -> int -> float
+
+
+extern "__builtin_ldexpf" : float -> int -> float
+
+
+extern "__builtin_ldexpl" : float -> int -> float
+
+
+extern "__builtin_log" : float -> float
+
+
+extern "__builtin_logf" : float -> float
+
+
+extern "__builtin_logl" : float -> float
+
+
+extern "__builtin_log10" : float -> float
+
+
+extern "__builtin_log10f" : float -> float
+
+
+extern "__builtin_log10l" : float -> float
+
+
+extern "__builtin_modff" : float -> int -> float
+
+
+extern "__builtin_modfl" : float -> int -> float
+
+
+extern "__builtin_nan" : int -> float
+
+
+extern "__builtin_nanf" : int -> float
+
+
+extern "__builtin_nanl" : int -> float
+
+
+extern "__builtin_nans" : int -> float
+
+
+extern "__builtin_nansf" : int -> float
+
+
+extern "__builtin_nansl" : int -> float
+
+
+extern "__builtin_next_arg" : int
+
+
+extern "__builtin_object_size" : int -> int -> int
+
+
+extern "__builtin_parity" : int -> int
+
+
+extern "__builtin_parityl" : int -> int
+
+
+extern "__builtin_parityll" : int -> int
+
+
+extern "__builtin_popcount" : int -> int
+
+
+extern "__builtin_popcountl" : int -> int
+
+
+extern "__builtin_popcountll" : int -> int
+
+
+extern "__builtin_powi" : float -> int -> float
+
+
+extern "__builtin_powif" : float -> int -> float
+
+
+extern "__builtin_powil" : float -> int -> float
+
+
+extern "__builtin_return" : int -> void
+
+
+extern "__builtin_return_address" : int -> int
+
+
+extern "__builtin_sin" : float -> float
+
+
+extern "__builtin_sinf" : float -> float
+
+
+extern "__builtin_sinl" : float -> float
+
+
+extern "__builtin_sinh" : float -> float
+
+
+extern "__builtin_sinhf" : float -> float
+
+
+extern "__builtin_sinhl" : float -> float
+
+
+extern "__builtin_sqrt" : float -> float
+
+
+extern "__builtin_sqrtf" : float -> float
+
+
+extern "__builtin_sqrtl" : float -> float
+
+
+extern "__builtin_stpcpy" : int -> int -> int
+
+
+extern "__builtin_strchr" : int -> int -> int
+
+
+extern "__builtin_strcmp" : int -> int -> int
+
+
+extern "__builtin_strcpy" : int -> int -> int
+
+
+extern "__builtin_strcspn" : int -> int -> int
+
+
+extern "__builtin_strncat" : int -> int -> int -> int
+
+
+extern "__builtin_strncmp" : int -> int -> int -> int
+
+
+extern "__builtin_strncpy" : int -> int -> int -> int
+
+
+extern "__builtin_strspn" : int -> int -> int
+
+
+extern "__builtin_strpbrk" : int -> int -> int
+
+
+extern "__builtin_types_compatible_p" : int -> int -> int
+
+
+extern "__builtin_tan" : float -> float
+
+
+extern "__builtin_tanf" : float -> float
+
+
+extern "__builtin_tanl" : float -> float
+
+
+extern "__builtin_tanh" : float -> float
+
+
+extern "__builtin_tanhf" : float -> float
+
+
+extern "__builtin_tanhl" : float -> float
+
+
+extern "__builtin_va_end" : int -> void
+
+
+extern "__builtin_varargs_start" : int -> void
+
+
+extern "__builtin_va_start" : int -> int -> void
+
+
+extern "__builtin_stdarg_start" : int -> void
+
+
+extern "__builtin_va_arg" : int -> int -> void
+
+
+extern "__builtin_va_copy" : int -> int -> void
+
+
+"if_jian" (a, b, c, d, e, f, g, x, y) : int -> int -> int -> int -> int -> int -> int -> int -> int -> int {
+
+ stack 0;
+
+ var u, v, t1, t2, t3, t4, t5;
+
+ c15:
+ t1 = (a + b) < c;
+ c14:
+ t2 = d + e;
+ c13:
+ t3 = c + 1;
+ c12:
+ if (y == 1) {
+ c11:
+ if (t1) {
+ c10:
+ u = t3 + d;
+ }
+ else {
+ c9:
+ if (!x) {
+ c8:
+ u = t2 + d;
+ }
+ else {
+ }
+ }
+ c7:
+ if ((/* c6 */ !t1) ? ((/* c5 */ x) ? 1 : 0) : 0) {
+ c4:
+ v = t2 + e;
+ }
+ else {
+ }
+ }
+ else {
+ c3:
+ t4 = t3 + e;
+ c2:
+ t5 = t4 + f;
+ c1:
+ u = t5 + g;
+ }
+ c0:
+ return u;
+
+}
+
+
+"if_exSimple" (a, b) : int -> int -> int {
+
+ stack 0;
+
+ var g, e, f;
+
+ c23:
+ if (a < b) {
+ c22:
+ e = a + b;
+ c21:
+ e = 2 * e;
+ c20:
+ g = e;
+ }
+ else {
+ c19:
+ f = 2 * b;
+ c18:
+ f = f + a;
+ c17:
+ g = f + b;
+ }
+ c16:
+ return g;
+
+}
+
+
+"if_imbriq1" (a, b, c) : int -> int -> int -> int {
+
+ stack 0;
+
+ var result;
+
+ c29:
+ if (a < b) {
+ c28:
+ if (b < c) {
+ c27:
+ result = b;
+ }
+ else {
+ c26:
+ result = c;
+ }
+ }
+ else {
+ c25:
+ result = a;
+ }
+ c24:
+ return result;
+
+}
+
+
+"if_imbriq2" (a, b, c) : int -> int -> int -> int {
+
+ stack 0;
+
+ var result;
+
+ c35:
+ if (a < b) {
+ c34:
+ if (b < c) {
+ c33:
+ result = b;
+ }
+ else {
+ c32:
+ result = 47;
+ }
+ }
+ else {
+ c31:
+ result = a;
+ }
+ c30:
+ return result;
+
+}
+
+
+"if_min" (a, b) : int -> int -> int {
+
+ stack 0;
+
+ var min;
+
+ c39:
+ if (a > b) {
+ c38:
+ min = b;
+ }
+ else {
+ c37:
+ min = a;
+ }
+ c36:
+ return min;
+
+}
+
+
+"if_prog" (j, i) : int -> int -> int {
+
+ stack 0;
+
+ var a, b;
+
+ c44:
+ a = i + j;
+ c43:
+ if (a < 0) {
+ c42:
+ b = 2;
+ }
+ else {
+ c41:
+ b = 3;
+ }
+ c40:
+ return b;
+
+}
+
+
+"if_sansElse" (a, b) : int -> int -> int {
+
+ stack 0;
+
+ var c;
+
+ c48:
+ c = 0;
+ c47:
+ if (a < b) {
+ c46:
+ c = a;
+ }
+ else {
+ }
+ c45:
+ return c;
+
+}
+
+
+"if_test" (a, b, x, y) : int -> int -> int -> int -> int {
+
+ stack 0;
+
+ var c, d, v, w, z;
+
+ c61:
+ c = 0;
+ c60:
+ d = 0;
+ c59:
+ v = 0;
+ c58:
+ w = 0;
+ c57:
+ z = 0;
+ c56:
+ if (a < b) {
+ c55:
+ c = a + b;
+ }
+ else {
+ }
+ c54:
+ if (x < y) {
+ c53:
+ z = x + y;
+ c52:
+ w = z + x;
+ }
+ else {
+ }
+ c51:
+ d = c + 1;
+ c50:
+ v = c + w;
+ c49:
+ return c;
+
+}
+
+
+"if_ual" (op, a, b) : int -> int -> int -> int {
+
+ stack 0;
+
+ var result;
+
+ c74:
+ if (op == 0) {
+ c73:
+ result = a + b;
+ }
+ else {
+ c72:
+ if (op == 1) {
+ c71:
+ result = a - b;
+ }
+ else {
+ c70:
+ if (op == 2) {
+ c69:
+ result = (/* c68 */ a) ? ((/* c67 */ b) ? 1 : 0) : 0;
+ }
+ else {
+ c66:
+ if (op == 3) {
+ c65:
+ result = (/* c64 */ a) ? 1 : ((/* c63 */ b) ? 1 : 0);
+ }
+ else {
+ }
+ }
+ }
+ }
+ c62:
+ return result;
+
+}
+
+
+"main" () : int {
+
+ stack 0;
+
+ var a;
+
+ c84:
+ a = "if_jian"(1, 2, 3, 4, 5, 6, 7, 8, 9) : int -> int -> int -> int -> int -> int -> int -> int -> int -> int;
+ c83:
+ a = "if_exSimple"(1, 2) : int -> int -> int;
+ c82:
+ a = "if_imbriq1"(1, 2, 3) : int -> int -> int -> int;
+ c81:
+ a = "if_imbriq2"(1, 2, 3) : int -> int -> int -> int;
+ c80:
+ a = "if_min"(1, 2) : int -> int -> int;
+ c79:
+ a = "if_prog"(1, 2) : int -> int -> int;
+ c78:
+ a = "if_sansElse"(1, 2) : int -> int -> int;
+ c77:
+ a = "if_test"(1, 2, 3, 4) : int -> int -> int -> int -> int;
+ c76:
+ a = "if_ual"(1, 2, 3) : int -> int -> int -> int;
+ c75:
+ return a;
+
+}
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure if_ual(3)
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33
+entry if_ual84
+if_ual84: newframe --> if_ual83
+if_ual83: move %33, $ra --> if_ual82
+if_ual82: move %32, $s7 --> if_ual81
+if_ual81: move %31, $s6 --> if_ual80
+if_ual80: move %30, $s5 --> if_ual79
+if_ual79: move %29, $s4 --> if_ual78
+if_ual78: move %28, $s3 --> if_ual77
+if_ual77: move %27, $s2 --> if_ual76
+if_ual76: move %26, $s1 --> if_ual75
+if_ual75: move %25, $s0 --> if_ual74
+if_ual74: move %0, $a0 --> if_ual73
+if_ual73: move %1, $a1 --> if_ual72
+if_ual72: move %2, $a2 --> if_ual71
+if_ual71: li %3, 0 --> if_ual70
+if_ual70: li %5, 0 --> if_ual69
+if_ual69: li %6, 0 --> if_ual68
+if_ual68: li %7, 0 --> if_ual67
+if_ual67: li %8, 0 --> if_ual66
+if_ual66: li %9, 0 --> if_ual65
+if_ual65: li %10, 0 --> if_ual64
+if_ual64: li %11, 0 --> if_ual63
+if_ual63: li %12, 0 --> if_ual62
+if_ual62: li %13, 0 --> if_ual61
+if_ual61: li %14, 0 --> if_ual60
+if_ual60: li %15, 0 --> if_ual59
+if_ual59: li %16, 0 --> if_ual58
+if_ual58: li %17, 0 --> if_ual57
+if_ual57: li %18, 0 --> if_ual56
+if_ual56: li %19, 0 --> if_ual55
+if_ual55: li %20, 0 --> if_ual54
+if_ual54: li %21, 0 --> if_ual53
+if_ual53: li %22, 0 --> if_ual52
+if_ual52: li %23, 0 --> if_ual51
+if_ual51: li %24, 0 --> if_ual50
+if_ual50: emit c74 --> if_ual49
+if_ual49: li %23, 0 --> if_ual48
+if_ual48: li %24, 0 --> if_ual47
+if_ual47: seq %22, %0, %24 --> if_ual46
+if_ual46: beq %22, %23 --> if_ual43, if_ual45
+if_ual45: emit c73 --> if_ual44
+if_ual44: addu %3, %1, %2 --> if_ual2
+if_ual2 : emit c62 --> if_ual1
+if_ual1 : move %4, %3 --> if_ual0
+if_ual0 : j --> if_ual96
+if_ual96: move $v0, %4 --> if_ual95
+if_ual95: move $ra, %33 --> if_ual94
+if_ual94: move $s7, %32 --> if_ual93
+if_ual93: move $s6, %31 --> if_ual92
+if_ual92: move $s5, %30 --> if_ual91
+if_ual91: move $s4, %29 --> if_ual90
+if_ual90: move $s3, %28 --> if_ual89
+if_ual89: move $s2, %27 --> if_ual88
+if_ual88: move $s1, %26 --> if_ual87
+if_ual87: move $s0, %25 --> if_ual86
+if_ual86: delframe --> if_ual85
+if_ual85: jr $ra (xmits $v0)
+if_ual43: emit c72 --> if_ual42
+if_ual42: li %20, 0 --> if_ual41
+if_ual41: li %21, 1 --> if_ual40
+if_ual40: seq %19, %0, %21 --> if_ual39
+if_ual39: beq %19, %20 --> if_ual36, if_ual38
+if_ual38: emit c71 --> if_ual37
+if_ual37: subu %3, %1, %2 --> if_ual2
+if_ual36: emit c70 --> if_ual35
+if_ual35: li %17, 0 --> if_ual34
+if_ual34: li %18, 2 --> if_ual33
+if_ual33: seq %16, %0, %18 --> if_ual32
+if_ual32: beq %16, %17 --> if_ual19, if_ual31
+if_ual31: emit c69 --> if_ual30
+if_ual30: li %15, 0 --> if_ual29
+if_ual29: emit c68 --> if_ual28
+if_ual28: move %14, %1 --> if_ual27
+if_ual27: beq %14, %15 --> if_ual20, if_ual26
+if_ual26: li %13, 0 --> if_ual25
+if_ual25: emit c67 --> if_ual24
+if_ual24: move %12, %2 --> if_ual23
+if_ual23: beq %12, %13 --> if_ual21, if_ual22
+if_ual22: li %3, 1 --> if_ual2
+if_ual21: li %3, 0 --> if_ual2
+if_ual20: li %3, 0 --> if_ual2
+if_ual19: emit c66 --> if_ual18
+if_ual18: li %10, 0 --> if_ual17
+if_ual17: li %11, 3 --> if_ual16
+if_ual16: seq %9, %0, %11 --> if_ual15
+if_ual15: beq %9, %10 --> if_ual2, if_ual14
+if_ual14: emit c65 --> if_ual13
+if_ual13: li %8, 0 --> if_ual12
+if_ual12: emit c64 --> if_ual11
+if_ual11: move %7, %1 --> if_ual10
+if_ual10: beq %7, %8 --> if_ual8, if_ual9
+if_ual9 : li %3, 1 --> if_ual2
+if_ual8 : li %6, 0 --> if_ual7
+if_ual7 : emit c63 --> if_ual6
+if_ual6 : move %5, %2 --> if_ual5
+if_ual5 : beq %5, %6 --> if_ual3, if_ual4
+if_ual4 : li %3, 1 --> if_ual2
+if_ual3 : li %3, 0 --> if_ual2
+
+procedure if_test(4)
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23
+entry if_test55
+if_test55: newframe --> if_test54
+if_test54: move %23, $ra --> if_test53
+if_test53: move %22, $s7 --> if_test52
+if_test52: move %21, $s6 --> if_test51
+if_test51: move %20, $s5 --> if_test50
+if_test50: move %19, $s4 --> if_test49
+if_test49: move %18, $s3 --> if_test48
+if_test48: move %17, $s2 --> if_test47
+if_test47: move %16, $s1 --> if_test46
+if_test46: move %15, $s0 --> if_test45
+if_test45: move %0, $a0 --> if_test44
+if_test44: move %1, $a1 --> if_test43
+if_test43: move %2, $a2 --> if_test42
+if_test42: move %3, $a3 --> if_test41
+if_test41: li %4, 0 --> if_test40
+if_test40: li %5, 0 --> if_test39
+if_test39: li %6, 0 --> if_test38
+if_test38: li %7, 0 --> if_test37
+if_test37: li %8, 0 --> if_test36
+if_test36: li %10, 0 --> if_test35
+if_test35: li %11, 0 --> if_test34
+if_test34: li %12, 0 --> if_test33
+if_test33: li %13, 0 --> if_test32
+if_test32: li %14, 0 --> if_test31
+if_test31: emit c61 --> if_test30
+if_test30: li %4, 0 --> if_test29
+if_test29: emit c60 --> if_test28
+if_test28: li %5, 0 --> if_test27
+if_test27: emit c59 --> if_test26
+if_test26: li %6, 0 --> if_test25
+if_test25: emit c58 --> if_test24
+if_test24: li %7, 0 --> if_test23
+if_test23: emit c57 --> if_test22
+if_test22: li %8, 0 --> if_test21
+if_test21: emit c56 --> if_test20
+if_test20: li %14, 0 --> if_test19
+if_test19: slt %13, %0, %1 --> if_test18
+if_test18: beq %13, %14 --> if_test15, if_test17
+if_test17: emit c55 --> if_test16
+if_test16: addu %4, %0, %1 --> if_test15
+if_test15: emit c54 --> if_test14
+if_test14: li %12, 0 --> if_test13
+if_test13: slt %11, %2, %3 --> if_test12
+if_test12: beq %11, %12 --> if_test7, if_test11
+if_test11: emit c53 --> if_test10
+if_test10: addu %8, %2, %3 --> if_test9
+if_test9 : emit c52 --> if_test8
+if_test8 : addu %7, %8, %2 --> if_test7
+if_test7 : emit c51 --> if_test6
+if_test6 : li %10, 1 --> if_test5
+if_test5 : addu %5, %4, %10 --> if_test4
+if_test4 : emit c50 --> if_test3
+if_test3 : addu %6, %4, %7 --> if_test2
+if_test2 : emit c49 --> if_test1
+if_test1 : move %9, %4 --> if_test0
+if_test0 : j --> if_test67
+if_test67: move $v0, %9 --> if_test66
+if_test66: move $ra, %23 --> if_test65
+if_test65: move $s7, %22 --> if_test64
+if_test64: move $s6, %21 --> if_test63
+if_test63: move $s5, %20 --> if_test62
+if_test62: move $s4, %19 --> if_test61
+if_test61: move $s3, %18 --> if_test60
+if_test60: move $s2, %17 --> if_test59
+if_test59: move $s1, %16 --> if_test58
+if_test58: move $s0, %15 --> if_test57
+if_test57: delframe --> if_test56
+if_test56: jr $ra (xmits $v0)
+
+procedure if_sansElse(2)
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14
+entry if_sansElse25
+if_sansElse25: newframe --> if_sansElse24
+if_sansElse24: move %14, $ra --> if_sansElse23
+if_sansElse23: move %13, $s7 --> if_sansElse22
+if_sansElse22: move %12, $s6 --> if_sansElse21
+if_sansElse21: move %11, $s5 --> if_sansElse20
+if_sansElse20: move %10, $s4 --> if_sansElse19
+if_sansElse19: move %9, $s3 --> if_sansElse18
+if_sansElse18: move %8, $s2 --> if_sansElse17
+if_sansElse17: move %7, $s1 --> if_sansElse16
+if_sansElse16: move %6, $s0 --> if_sansElse15
+if_sansElse15: move %0, $a0 --> if_sansElse14
+if_sansElse14: move %1, $a1 --> if_sansElse13
+if_sansElse13: li %2, 0 --> if_sansElse12
+if_sansElse12: li %4, 0 --> if_sansElse11
+if_sansElse11: li %5, 0 --> if_sansElse10
+if_sansElse10: emit c48 --> if_sansElse9
+if_sansElse9 : li %2, 0 --> if_sansElse8
+if_sansElse8 : emit c47 --> if_sansElse7
+if_sansElse7 : li %5, 0 --> if_sansElse6
+if_sansElse6 : slt %4, %0, %1 --> if_sansElse5
+if_sansElse5 : beq %4, %5 --> if_sansElse2, if_sansElse4
+if_sansElse4 : emit c46 --> if_sansElse3
+if_sansElse3 : move %2, %0 --> if_sansElse2
+if_sansElse2 : emit c45 --> if_sansElse1
+if_sansElse1 : move %3, %2 --> if_sansElse0
+if_sansElse0 : j --> if_sansElse37
+if_sansElse37: move $v0, %3 --> if_sansElse36
+if_sansElse36: move $ra, %14 --> if_sansElse35
+if_sansElse35: move $s7, %13 --> if_sansElse34
+if_sansElse34: move $s6, %12 --> if_sansElse33
+if_sansElse33: move $s5, %11 --> if_sansElse32
+if_sansElse32: move $s4, %10 --> if_sansElse31
+if_sansElse31: move $s3, %9 --> if_sansElse30
+if_sansElse30: move $s2, %8 --> if_sansElse29
+if_sansElse29: move $s1, %7 --> if_sansElse28
+if_sansElse28: move $s0, %6 --> if_sansElse27
+if_sansElse27: delframe --> if_sansElse26
+if_sansElse26: jr $ra (xmits $v0)
+
+procedure if_prog(2)
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16
+entry if_prog30
+if_prog30: newframe --> if_prog29
+if_prog29: move %16, $ra --> if_prog28
+if_prog28: move %15, $s7 --> if_prog27
+if_prog27: move %14, $s6 --> if_prog26
+if_prog26: move %13, $s5 --> if_prog25
+if_prog25: move %12, $s4 --> if_prog24
+if_prog24: move %11, $s3 --> if_prog23
+if_prog23: move %10, $s2 --> if_prog22
+if_prog22: move %9, $s1 --> if_prog21
+if_prog21: move %8, $s0 --> if_prog20
+if_prog20: move %0, $a0 --> if_prog19
+if_prog19: move %1, $a1 --> if_prog18
+if_prog18: li %2, 0 --> if_prog17
+if_prog17: li %3, 0 --> if_prog16
+if_prog16: li %5, 0 --> if_prog15
+if_prog15: li %6, 0 --> if_prog14
+if_prog14: li %7, 0 --> if_prog13
+if_prog13: emit c44 --> if_prog12
+if_prog12: addu %2, %1, %0 --> if_prog11
+if_prog11: emit c43 --> if_prog10
+if_prog10: li %6, 0 --> if_prog9
+if_prog9 : li %7, 0 --> if_prog8
+if_prog8 : slt %5, %2, %7 --> if_prog7
+if_prog7 : beq %5, %6 --> if_prog4, if_prog6
+if_prog6 : emit c42 --> if_prog5
+if_prog5 : li %3, 2 --> if_prog2
+if_prog2 : emit c40 --> if_prog1
+if_prog1 : move %4, %3 --> if_prog0
+if_prog0 : j --> if_prog42
+if_prog42: move $v0, %4 --> if_prog41
+if_prog41: move $ra, %16 --> if_prog40
+if_prog40: move $s7, %15 --> if_prog39
+if_prog39: move $s6, %14 --> if_prog38
+if_prog38: move $s5, %13 --> if_prog37
+if_prog37: move $s4, %12 --> if_prog36
+if_prog36: move $s3, %11 --> if_prog35
+if_prog35: move $s2, %10 --> if_prog34
+if_prog34: move $s1, %9 --> if_prog33
+if_prog33: move $s0, %8 --> if_prog32
+if_prog32: delframe --> if_prog31
+if_prog31: jr $ra (xmits $v0)
+if_prog4 : emit c41 --> if_prog3
+if_prog3 : li %3, 3 --> if_prog2
+
+procedure if_min(2)
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14
+entry if_min25
+if_min25: newframe --> if_min24
+if_min24: move %14, $ra --> if_min23
+if_min23: move %13, $s7 --> if_min22
+if_min22: move %12, $s6 --> if_min21
+if_min21: move %11, $s5 --> if_min20
+if_min20: move %10, $s4 --> if_min19
+if_min19: move %9, $s3 --> if_min18
+if_min18: move %8, $s2 --> if_min17
+if_min17: move %7, $s1 --> if_min16
+if_min16: move %6, $s0 --> if_min15
+if_min15: move %0, $a0 --> if_min14
+if_min14: move %1, $a1 --> if_min13
+if_min13: li %2, 0 --> if_min12
+if_min12: li %4, 0 --> if_min11
+if_min11: li %5, 0 --> if_min10
+if_min10: emit c39 --> if_min9
+if_min9 : li %5, 0 --> if_min8
+if_min8 : sgt %4, %0, %1 --> if_min7
+if_min7 : beq %4, %5 --> if_min4, if_min6
+if_min6 : emit c38 --> if_min5
+if_min5 : move %2, %1 --> if_min2
+if_min2 : emit c36 --> if_min1
+if_min1 : move %3, %2 --> if_min0
+if_min0 : j --> if_min37
+if_min37: move $v0, %3 --> if_min36
+if_min36: move $ra, %14 --> if_min35
+if_min35: move $s7, %13 --> if_min34
+if_min34: move $s6, %12 --> if_min33
+if_min33: move $s5, %11 --> if_min32
+if_min32: move $s4, %10 --> if_min31
+if_min31: move $s3, %9 --> if_min30
+if_min30: move $s2, %8 --> if_min29
+if_min29: move $s1, %7 --> if_min28
+if_min28: move $s0, %6 --> if_min27
+if_min27: delframe --> if_min26
+if_min26: jr $ra (xmits $v0)
+if_min4 : emit c37 --> if_min3
+if_min3 : move %2, %0 --> if_min2
+
+procedure if_jian(9)
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41
+entry if_jian92
+if_jian92 : newframe --> if_jian91
+if_jian91 : move %41, $ra --> if_jian90
+if_jian90 : move %40, $s7 --> if_jian89
+if_jian89 : move %39, $s6 --> if_jian88
+if_jian88 : move %38, $s5 --> if_jian87
+if_jian87 : move %37, $s4 --> if_jian86
+if_jian86 : move %36, $s3 --> if_jian85
+if_jian85 : move %35, $s2 --> if_jian84
+if_jian84 : move %34, $s1 --> if_jian83
+if_jian83 : move %33, $s0 --> if_jian82
+if_jian82 : move %0, $a0 --> if_jian81
+if_jian81 : move %1, $a1 --> if_jian80
+if_jian80 : move %2, $a2 --> if_jian79
+if_jian79 : move %3, $a3 --> if_jian78
+if_jian78 : gets %4, in(16) --> if_jian77
+if_jian77 : gets %5, in(12) --> if_jian76
+if_jian76 : gets %6, in(8) --> if_jian75
+if_jian75 : gets %7, in(4) --> if_jian74
+if_jian74 : gets %8, in(0) --> if_jian73
+if_jian73 : li %9, 0 --> if_jian72
+if_jian72 : li %10, 0 --> if_jian71
+if_jian71 : li %11, 0 --> if_jian70
+if_jian70 : li %12, 0 --> if_jian69
+if_jian69 : li %13, 0 --> if_jian68
+if_jian68 : li %14, 0 --> if_jian67
+if_jian67 : li %15, 0 --> if_jian66
+if_jian66 : li %17, 0 --> if_jian65
+if_jian65 : li %18, 0 --> if_jian64
+if_jian64 : li %19, 0 --> if_jian63
+if_jian63 : li %20, 0 --> if_jian62
+if_jian62 : li %21, 0 --> if_jian61
+if_jian61 : li %22, 0 --> if_jian60
+if_jian60 : li %23, 0 --> if_jian59
+if_jian59 : li %24, 0 --> if_jian58
+if_jian58 : li %25, 0 --> if_jian57
+if_jian57 : li %26, 0 --> if_jian56
+if_jian56 : li %27, 0 --> if_jian55
+if_jian55 : li %28, 0 --> if_jian54
+if_jian54 : li %29, 0 --> if_jian53
+if_jian53 : li %30, 0 --> if_jian52
+if_jian52 : li %31, 0 --> if_jian51
+if_jian51 : li %32, 0 --> if_jian48
+if_jian48 : emit c15 --> if_jian47
+if_jian47 : addu %30, %0, %1 --> if_jian46
+if_jian46 : slt %11, %30, %2 --> if_jian45
+if_jian45 : emit c14 --> if_jian44
+if_jian44 : addu %12, %3, %4 --> if_jian43
+if_jian43 : emit c13 --> if_jian42
+if_jian42 : li %29, 1 --> if_jian41
+if_jian41 : addu %13, %2, %29 --> if_jian40
+if_jian40 : emit c12 --> if_jian39
+if_jian39 : li %27, 0 --> if_jian38
+if_jian38 : li %28, 1 --> if_jian37
+if_jian37 : seq %26, %8, %28 --> if_jian36
+if_jian36 : beq %26, %27 --> if_jian8, if_jian35
+if_jian35 : emit c11 --> if_jian34
+if_jian34 : li %25, 0 --> if_jian33
+if_jian33 : beq %11, %25 --> if_jian30, if_jian32
+if_jian32 : emit c10 --> if_jian31
+if_jian31 : addu %9, %13, %3 --> if_jian24
+if_jian24 : emit c7 --> if_jian23
+if_jian23 : li %18, 0 --> if_jian22
+if_jian22 : li %22, 0 --> if_jian21
+if_jian21 : emit c6 --> if_jian20
+if_jian20 : li %31, 0 --> if_jian49
+if_jian49 : seq %21, %11, %31 --> if_jian19
+if_jian19 : beq %21, %22 --> if_jian12, if_jian18
+if_jian18 : li %20, 0 --> if_jian17
+if_jian17 : emit c5 --> if_jian16
+if_jian16 : move %19, %7 --> if_jian15
+if_jian15 : beq %19, %20 --> if_jian13, if_jian14
+if_jian14 : li %17, 1 --> if_jian11
+if_jian11 : beq %17, %18 --> if_jian2, if_jian10
+if_jian10 : emit c4 --> if_jian9
+if_jian9 : addu %10, %12, %4 --> if_jian2
+if_jian2 : emit c0 --> if_jian1
+if_jian1 : move %16, %9 --> if_jian0
+if_jian0 : j --> if_jian104
+if_jian104: move $v0, %16 --> if_jian103
+if_jian103: move $ra, %41 --> if_jian102
+if_jian102: move $s7, %40 --> if_jian101
+if_jian101: move $s6, %39 --> if_jian100
+if_jian100: move $s5, %38 --> if_jian99
+if_jian99 : move $s4, %37 --> if_jian98
+if_jian98 : move $s3, %36 --> if_jian97
+if_jian97 : move $s2, %35 --> if_jian96
+if_jian96 : move $s1, %34 --> if_jian95
+if_jian95 : move $s0, %33 --> if_jian94
+if_jian94 : delframe --> if_jian93
+if_jian93 : jr $ra (xmits $v0)
+if_jian13 : li %17, 0 --> if_jian11
+if_jian12 : li %17, 0 --> if_jian11
+if_jian30 : emit c9 --> if_jian29
+if_jian29 : li %24, 0 --> if_jian28
+if_jian28 : li %32, 0 --> if_jian50
+if_jian50 : seq %23, %7, %32 --> if_jian27
+if_jian27 : beq %23, %24 --> if_jian24, if_jian26
+if_jian26 : emit c8 --> if_jian25
+if_jian25 : addu %9, %12, %3 --> if_jian24
+if_jian8 : emit c3 --> if_jian7
+if_jian7 : addu %14, %13, %4 --> if_jian6
+if_jian6 : emit c2 --> if_jian5
+if_jian5 : addu %15, %14, %5 --> if_jian4
+if_jian4 : emit c1 --> if_jian3
+if_jian3 : addu %9, %15, %6 --> if_jian2
+
+procedure if_imbriq2(3)
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17
+entry if_imbriq234
+if_imbriq234: newframe --> if_imbriq233
+if_imbriq233: move %17, $ra --> if_imbriq232
+if_imbriq232: move %16, $s7 --> if_imbriq231
+if_imbriq231: move %15, $s6 --> if_imbriq230
+if_imbriq230: move %14, $s5 --> if_imbriq229
+if_imbriq229: move %13, $s4 --> if_imbriq228
+if_imbriq228: move %12, $s3 --> if_imbriq227
+if_imbriq227: move %11, $s2 --> if_imbriq226
+if_imbriq226: move %10, $s1 --> if_imbriq225
+if_imbriq225: move %9, $s0 --> if_imbriq224
+if_imbriq224: move %0, $a0 --> if_imbriq223
+if_imbriq223: move %1, $a1 --> if_imbriq222
+if_imbriq222: move %2, $a2 --> if_imbriq221
+if_imbriq221: li %3, 0 --> if_imbriq220
+if_imbriq220: li %5, 0 --> if_imbriq219
+if_imbriq219: li %6, 0 --> if_imbriq218
+if_imbriq218: li %7, 0 --> if_imbriq217
+if_imbriq217: li %8, 0 --> if_imbriq216
+if_imbriq216: emit c35 --> if_imbriq215
+if_imbriq215: li %8, 0 --> if_imbriq214
+if_imbriq214: slt %7, %0, %1 --> if_imbriq213
+if_imbriq213: beq %7, %8 --> if_imbriq24, if_imbriq212
+if_imbriq212: emit c34 --> if_imbriq211
+if_imbriq211: li %6, 0 --> if_imbriq210
+if_imbriq210: slt %5, %1, %2 --> if_imbriq29
+if_imbriq29 : beq %5, %6 --> if_imbriq26, if_imbriq28
+if_imbriq28 : emit c33 --> if_imbriq27
+if_imbriq27 : move %3, %1 --> if_imbriq22
+if_imbriq22 : emit c30 --> if_imbriq21
+if_imbriq21 : move %4, %3 --> if_imbriq20
+if_imbriq20 : j --> if_imbriq246
+if_imbriq246: move $v0, %4 --> if_imbriq245
+if_imbriq245: move $ra, %17 --> if_imbriq244
+if_imbriq244: move $s7, %16 --> if_imbriq243
+if_imbriq243: move $s6, %15 --> if_imbriq242
+if_imbriq242: move $s5, %14 --> if_imbriq241
+if_imbriq241: move $s4, %13 --> if_imbriq240
+if_imbriq240: move $s3, %12 --> if_imbriq239
+if_imbriq239: move $s2, %11 --> if_imbriq238
+if_imbriq238: move $s1, %10 --> if_imbriq237
+if_imbriq237: move $s0, %9 --> if_imbriq236
+if_imbriq236: delframe --> if_imbriq235
+if_imbriq235: jr $ra (xmits $v0)
+if_imbriq26 : emit c32 --> if_imbriq25
+if_imbriq25 : li %3, 47 --> if_imbriq22
+if_imbriq24 : emit c31 --> if_imbriq23
+if_imbriq23 : move %3, %0 --> if_imbriq22
+
+procedure if_imbriq1(3)
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17
+entry if_imbriq134
+if_imbriq134: newframe --> if_imbriq133
+if_imbriq133: move %17, $ra --> if_imbriq132
+if_imbriq132: move %16, $s7 --> if_imbriq131
+if_imbriq131: move %15, $s6 --> if_imbriq130
+if_imbriq130: move %14, $s5 --> if_imbriq129
+if_imbriq129: move %13, $s4 --> if_imbriq128
+if_imbriq128: move %12, $s3 --> if_imbriq127
+if_imbriq127: move %11, $s2 --> if_imbriq126
+if_imbriq126: move %10, $s1 --> if_imbriq125
+if_imbriq125: move %9, $s0 --> if_imbriq124
+if_imbriq124: move %0, $a0 --> if_imbriq123
+if_imbriq123: move %1, $a1 --> if_imbriq122
+if_imbriq122: move %2, $a2 --> if_imbriq121
+if_imbriq121: li %3, 0 --> if_imbriq120
+if_imbriq120: li %5, 0 --> if_imbriq119
+if_imbriq119: li %6, 0 --> if_imbriq118
+if_imbriq118: li %7, 0 --> if_imbriq117
+if_imbriq117: li %8, 0 --> if_imbriq116
+if_imbriq116: emit c29 --> if_imbriq115
+if_imbriq115: li %8, 0 --> if_imbriq114
+if_imbriq114: slt %7, %0, %1 --> if_imbriq113
+if_imbriq113: beq %7, %8 --> if_imbriq14, if_imbriq112
+if_imbriq112: emit c28 --> if_imbriq111
+if_imbriq111: li %6, 0 --> if_imbriq110
+if_imbriq110: slt %5, %1, %2 --> if_imbriq19
+if_imbriq19 : beq %5, %6 --> if_imbriq16, if_imbriq18
+if_imbriq18 : emit c27 --> if_imbriq17
+if_imbriq17 : move %3, %1 --> if_imbriq12
+if_imbriq12 : emit c24 --> if_imbriq11
+if_imbriq11 : move %4, %3 --> if_imbriq10
+if_imbriq10 : j --> if_imbriq146
+if_imbriq146: move $v0, %4 --> if_imbriq145
+if_imbriq145: move $ra, %17 --> if_imbriq144
+if_imbriq144: move $s7, %16 --> if_imbriq143
+if_imbriq143: move $s6, %15 --> if_imbriq142
+if_imbriq142: move $s5, %14 --> if_imbriq141
+if_imbriq141: move $s4, %13 --> if_imbriq140
+if_imbriq140: move $s3, %12 --> if_imbriq139
+if_imbriq139: move $s2, %11 --> if_imbriq138
+if_imbriq138: move $s1, %10 --> if_imbriq137
+if_imbriq137: move $s0, %9 --> if_imbriq136
+if_imbriq136: delframe --> if_imbriq135
+if_imbriq135: jr $ra (xmits $v0)
+if_imbriq16 : emit c26 --> if_imbriq15
+if_imbriq15 : move %3, %2 --> if_imbriq12
+if_imbriq14 : emit c25 --> if_imbriq13
+if_imbriq13 : move %3, %0 --> if_imbriq12
+
+procedure if_exSimple(2)
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18
+entry if_exSimple39
+if_exSimple39: newframe --> if_exSimple38
+if_exSimple38: move %18, $ra --> if_exSimple37
+if_exSimple37: move %17, $s7 --> if_exSimple36
+if_exSimple36: move %16, $s6 --> if_exSimple35
+if_exSimple35: move %15, $s5 --> if_exSimple34
+if_exSimple34: move %14, $s4 --> if_exSimple33
+if_exSimple33: move %13, $s3 --> if_exSimple32
+if_exSimple32: move %12, $s2 --> if_exSimple31
+if_exSimple31: move %11, $s1 --> if_exSimple30
+if_exSimple30: move %10, $s0 --> if_exSimple29
+if_exSimple29: move %0, $a0 --> if_exSimple28
+if_exSimple28: move %1, $a1 --> if_exSimple27
+if_exSimple27: li %2, 0 --> if_exSimple26
+if_exSimple26: li %3, 0 --> if_exSimple25
+if_exSimple25: li %4, 0 --> if_exSimple24
+if_exSimple24: li %6, 0 --> if_exSimple23
+if_exSimple23: li %7, 0 --> if_exSimple22
+if_exSimple22: li %8, 0 --> if_exSimple21
+if_exSimple21: li %9, 0 --> if_exSimple20
+if_exSimple20: emit c23 --> if_exSimple19
+if_exSimple19: li %9, 0 --> if_exSimple18
+if_exSimple18: slt %8, %0, %1 --> if_exSimple17
+if_exSimple17: beq %8, %9 --> if_exSimple9, if_exSimple16
+if_exSimple16: emit c22 --> if_exSimple15
+if_exSimple15: addu %3, %0, %1 --> if_exSimple14
+if_exSimple14: emit c21 --> if_exSimple13
+if_exSimple13: li %7, 2 --> if_exSimple12
+if_exSimple12: mul %3, %7, %3 --> if_exSimple11
+if_exSimple11: emit c20 --> if_exSimple10
+if_exSimple10: move %2, %3 --> if_exSimple2
+if_exSimple2 : emit c16 --> if_exSimple1
+if_exSimple1 : move %5, %2 --> if_exSimple0
+if_exSimple0 : j --> if_exSimple51
+if_exSimple51: move $v0, %5 --> if_exSimple50
+if_exSimple50: move $ra, %18 --> if_exSimple49
+if_exSimple49: move $s7, %17 --> if_exSimple48
+if_exSimple48: move $s6, %16 --> if_exSimple47
+if_exSimple47: move $s5, %15 --> if_exSimple46
+if_exSimple46: move $s4, %14 --> if_exSimple45
+if_exSimple45: move $s3, %13 --> if_exSimple44
+if_exSimple44: move $s2, %12 --> if_exSimple43
+if_exSimple43: move $s1, %11 --> if_exSimple42
+if_exSimple42: move $s0, %10 --> if_exSimple41
+if_exSimple41: delframe --> if_exSimple40
+if_exSimple40: jr $ra (xmits $v0)
+if_exSimple9 : emit c19 --> if_exSimple8
+if_exSimple8 : li %6, 2 --> if_exSimple7
+if_exSimple7 : mul %4, %6, %1 --> if_exSimple6
+if_exSimple6 : emit c18 --> if_exSimple5
+if_exSimple5 : addu %4, %4, %0 --> if_exSimple4
+if_exSimple4 : emit c17 --> if_exSimple3
+if_exSimple3 : addu %2, %4, %1 --> if_exSimple2
+
+procedure _main(0)
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40
+entry main91
+main91 : newframe --> main90
+main90 : move %40, $ra --> main89
+main89 : move %39, $s7 --> main88
+main88 : move %38, $s6 --> main87
+main87 : move %37, $s5 --> main86
+main86 : move %36, $s4 --> main85
+main85 : move %35, $s3 --> main84
+main84 : move %34, $s2 --> main83
+main83 : move %33, $s1 --> main82
+main82 : move %32, $s0 --> main81
+main81 : li %0, 0 --> main80
+main80 : li %2, 0 --> main79
+main79 : li %3, 0 --> main78
+main78 : li %4, 0 --> main77
+main77 : li %5, 0 --> main76
+main76 : li %6, 0 --> main75
+main75 : li %7, 0 --> main74
+main74 : li %8, 0 --> main73
+main73 : li %9, 0 --> main72
+main72 : li %10, 0 --> main71
+main71 : li %11, 0 --> main70
+main70 : li %12, 0 --> main69
+main69 : li %13, 0 --> main68
+main68 : li %14, 0 --> main67
+main67 : li %15, 0 --> main66
+main66 : li %16, 0 --> main65
+main65 : li %17, 0 --> main64
+main64 : li %18, 0 --> main63
+main63 : li %19, 0 --> main62
+main62 : li %20, 0 --> main61
+main61 : li %21, 0 --> main60
+main60 : li %22, 0 --> main59
+main59 : li %23, 0 --> main58
+main58 : li %24, 0 --> main57
+main57 : li %25, 0 --> main56
+main56 : li %26, 0 --> main55
+main55 : li %27, 0 --> main54
+main54 : li %28, 0 --> main53
+main53 : li %29, 0 --> main52
+main52 : li %30, 0 --> main51
+main51 : li %31, 0 --> main50
+main50 : emit c84 --> main49
+main49 : li %23, 1 --> main48
+main48 : li %24, 2 --> main47
+main47 : li %25, 3 --> main46
+main46 : li %26, 4 --> main45
+main45 : li %27, 5 --> main44
+main44 : li %28, 6 --> main43
+main43 : li %29, 7 --> main42
+main42 : li %30, 8 --> main41
+main41 : li %31, 9 --> main40
+main40 : j --> main145
+main145: move $a0, %23 --> main144
+main144: move $a1, %24 --> main143
+main143: move $a2, %25 --> main142
+main142: move $a3, %26 --> main141
+main141: sets out(16), %27 --> main140
+main140: sets out(12), %28 --> main139
+main139: sets out(8), %29 --> main138
+main138: sets out(4), %30 --> main137
+main137: sets out(0), %31 --> main136
+main136: call if_jian(9) --> main135
+main135: move %0, $v0 --> main39
+main39 : emit c83 --> main38
+main38 : li %21, 1 --> main37
+main37 : li %22, 2 --> main36
+main36 : j --> main134
+main134: move $a0, %21 --> main133
+main133: move $a1, %22 --> main132
+main132: call if_exSimple(2) --> main131
+main131: move %0, $v0 --> main35
+main35 : emit c82 --> main34
+main34 : li %18, 1 --> main33
+main33 : li %19, 2 --> main32
+main32 : li %20, 3 --> main31
+main31 : j --> main130
+main130: move $a0, %18 --> main129
+main129: move $a1, %19 --> main128
+main128: move $a2, %20 --> main127
+main127: call if_imbriq1(3) --> main126
+main126: move %0, $v0 --> main30
+main30 : emit c81 --> main29
+main29 : li %15, 1 --> main28
+main28 : li %16, 2 --> main27
+main27 : li %17, 3 --> main26
+main26 : j --> main120
+main120: move $a0, %15 --> main119
+main119: move $a1, %16 --> main118
+main118: move $a2, %17 --> main117
+main117: call if_imbriq2(3) --> main116
+main116: move %0, $v0 --> main25
+main25 : emit c80 --> main24
+main24 : li %13, 1 --> main23
+main23 : li %14, 2 --> main22
+main22 : j --> main115
+main115: move $a0, %13 --> main114
+main114: move $a1, %14 --> main113
+main113: call if_min(2) --> main112
+main112: move %0, $v0 --> main21
+main21 : emit c79 --> main20
+main20 : li %11, 1 --> main19
+main19 : li %12, 2 --> main18
+main18 : j --> main111
+main111: move $a0, %11 --> main110
+main110: move $a1, %12 --> main109
+main109: call if_prog(2) --> main108
+main108: move %0, $v0 --> main17
+main17 : emit c78 --> main16
+main16 : li %9, 1 --> main15
+main15 : li %10, 2 --> main14
+main14 : j --> main107
+main107: move $a0, %9 --> main106
+main106: move $a1, %10 --> main105
+main105: call if_sansElse(2) --> main104
+main104: move %0, $v0 --> main13
+main13 : emit c77 --> main12
+main12 : li %5, 1 --> main11
+main11 : li %6, 2 --> main10
+main10 : li %7, 3 --> main9
+main9 : li %8, 4 --> main8
+main8 : j --> main151
+main151: move $a0, %5 --> main150
+main150: move $a1, %6 --> main149
+main149: move $a2, %7 --> main148
+main148: move $a3, %8 --> main147
+main147: call if_test(4) --> main146
+main146: move %0, $v0 --> main7
+main7 : emit c76 --> main6
+main6 : li %2, 1 --> main5
+main5 : li %3, 2 --> main4
+main4 : li %4, 3 --> main3
+main3 : j --> main125
+main125: move $a0, %2 --> main124
+main124: move $a1, %3 --> main123
+main123: move $a2, %4 --> main122
+main122: call if_ual(3) --> main121
+main121: move %0, $v0 --> main2
+main2 : emit c75 --> main1
+main1 : move %1, %0 --> main0
+main0 : j --> main103
+main103: move $v0, %1 --> main102
+main102: move $ra, %40 --> main101
+main101: move $s7, %39 --> main100
+main100: move $s6, %38 --> main99
+main99 : move $s5, %37 --> main98
+main98 : move $s4, %36 --> main97
+main97 : move $s3, %35 --> main96
+main96 : move $s2, %34 --> main95
+main95 : move $s1, %33 --> main94
+main94 : move $s0, %32 --> main93
+main93 : delframe --> main92
+main92 : jr $ra (xmits $v0)
+
--- /dev/null
+program
+
+globals 0
+
+procedure if_ual(3)
+var 0
+if_ual84:
+newframe
+li $v0, 0
+c74:
+li $a3, 0
+seq $a3, $a0, $a3
+beq $a3, $zero, if_ual43
+c73:
+addu $v0, $a1, $a2
+if_ual2:
+c62:
+delframe
+jr $ra
+if_ual43:
+c72:
+li $a3, 1
+seq $a3, $a0, $a3
+beq $a3, $zero, if_ual36
+c71:
+subu $v0, $a1, $a2
+j if_ual2
+if_ual36:
+c70:
+li $a3, 2
+seq $a3, $a0, $a3
+beq $a3, $zero, if_ual19
+c69:
+c68:
+beq $a1, $zero, if_ual20
+c67:
+beq $a2, $zero, if_ual21
+li $v0, 1
+j if_ual2
+if_ual21:
+li $v0, 0
+j if_ual2
+if_ual20:
+li $v0, 0
+j if_ual2
+if_ual19:
+c66:
+li $a3, 3
+seq $a0, $a0, $a3
+beq $a0, $zero, if_ual2
+c65:
+c64:
+beq $a1, $zero, if_ual7
+li $v0, 1
+j if_ual2
+if_ual7:
+c63:
+beq $a2, $zero, if_ual3
+li $v0, 1
+j if_ual2
+if_ual3:
+li $v0, 0
+j if_ual2
+
+procedure if_test(4)
+var 0
+if_test55:
+newframe
+c61:
+li $v0, 0
+c60:
+c59:
+c58:
+c57:
+c56:
+slt $t0, $a0, $a1
+beq $t0, $zero, if_test15
+c55:
+addu $v0, $a0, $a1
+if_test15:
+c54:
+slt $a0, $a2, $a3
+beq $a0, $zero, if_test7
+c53:
+c52:
+if_test7:
+c51:
+c50:
+c49:
+delframe
+jr $ra
+
+procedure if_sansElse(2)
+var 0
+if_sansElse25:
+newframe
+c48:
+li $v0, 0
+c47:
+slt $a1, $a0, $a1
+beq $a1, $zero, if_sansElse2
+c46:
+move $v0, $a0
+if_sansElse2:
+c45:
+delframe
+jr $ra
+
+procedure if_prog(2)
+var 0
+if_prog30:
+newframe
+c44:
+addu $v0, $a1, $a0
+c43:
+li $a0, 0
+slt $v0, $v0, $zero
+beq $v0, $a0, if_prog4
+c42:
+li $v0, 2
+if_prog2:
+c40:
+delframe
+jr $ra
+if_prog4:
+c41:
+li $v0, 3
+j if_prog2
+
+procedure if_min(2)
+var 0
+if_min25:
+newframe
+move $v0, $a1
+c39:
+sgt $a1, $a0, $v0
+beq $a1, $zero, if_min4
+c38:
+if_min2:
+c36:
+delframe
+jr $ra
+if_min4:
+c37:
+move $v0, $a0
+j if_min2
+
+procedure if_jian(9)
+var 0
+if_jian92:
+newframe
+gets $t4, in(16)
+gets $t3, in(12)
+gets $t2, in(8)
+gets $t0, in(4)
+gets $t1, in(0)
+li $v0, 0
+c15:
+addu $a0, $a0, $a1
+slt $t5, $a0, $a2
+c14:
+addu $a1, $a3, $t4
+c13:
+li $a0, 1
+addu $a2, $a2, $a0
+c12:
+li $a0, 1
+seq $a0, $t1, $a0
+beq $a0, $zero, if_jian8
+c11:
+beq $t5, $zero, if_jian30
+c10:
+addu $v0, $a2, $a3
+if_jian24:
+c7:
+li $a1, 0
+c6:
+li $a0, 0
+seq $a0, $t5, $a0
+beq $a0, $a1, if_jian12
+li $a0, 0
+c5:
+beq $t0, $a0, if_jian13
+li $a0, 1
+if_jian11:
+beq $a0, $zero, if_jian2
+c4:
+if_jian2:
+c0:
+delframe
+jr $ra
+if_jian13:
+li $a0, 0
+j if_jian11
+if_jian12:
+li $a0, 0
+j if_jian11
+if_jian30:
+c9:
+li $a0, 0
+seq $a0, $t0, $a0
+beq $a0, $zero, if_jian24
+c8:
+addu $v0, $a1, $a3
+j if_jian24
+if_jian8:
+c3:
+addu $v0, $a2, $t4
+c2:
+addu $v0, $v0, $t3
+c1:
+addu $v0, $v0, $t2
+j if_jian2
+
+procedure if_imbriq2(3)
+var 0
+if_imbriq234:
+newframe
+move $v0, $a0
+c35:
+slt $a0, $v0, $a1
+beq $a0, $zero, if_imbriq24
+c34:
+slt $v0, $a1, $a2
+beq $v0, $zero, if_imbriq26
+c33:
+move $v0, $a1
+if_imbriq22:
+c30:
+delframe
+jr $ra
+if_imbriq26:
+c32:
+li $v0, 47
+j if_imbriq22
+if_imbriq24:
+c31:
+j if_imbriq22
+
+procedure if_imbriq1(3)
+var 0
+if_imbriq134:
+newframe
+move $v0, $a2
+c29:
+slt $a2, $a0, $a1
+beq $a2, $zero, if_imbriq14
+c28:
+slt $a0, $a1, $v0
+beq $a0, $zero, if_imbriq16
+c27:
+move $v0, $a1
+if_imbriq12:
+c24:
+delframe
+jr $ra
+if_imbriq16:
+c26:
+j if_imbriq12
+if_imbriq14:
+c25:
+move $v0, $a0
+j if_imbriq12
+
+procedure if_exSimple(2)
+var 0
+if_exSimple39:
+newframe
+c23:
+slt $v0, $a0, $a1
+beq $v0, $zero, if_exSimple9
+c22:
+addu $v0, $a0, $a1
+c21:
+li $a0, 2
+mul $v0, $a0, $v0
+c20:
+if_exSimple2:
+c16:
+delframe
+jr $ra
+if_exSimple9:
+c19:
+li $v0, 2
+mul $v0, $v0, $a1
+c18:
+addu $v0, $v0, $a0
+c17:
+addu $v0, $v0, $a1
+j if_exSimple2
+
+procedure _main(0)
+var 4
+main91:
+newframe
+sets local(0), $ra
+c84:
+li $a0, 1
+li $a1, 2
+li $a2, 3
+li $a3, 4
+li $t3, 5
+li $t2, 6
+li $t1, 7
+li $t0, 8
+li $v0, 9
+sets out(16), $t3
+sets out(12), $t2
+sets out(8), $t1
+sets out(4), $t0
+sets out(0), $v0
+call if_jian
+c83:
+li $a0, 1
+li $a1, 2
+call if_exSimple
+c82:
+li $a0, 1
+li $a1, 2
+li $a2, 3
+call if_imbriq1
+c81:
+li $a0, 1
+li $a1, 2
+li $a2, 3
+call if_imbriq2
+c80:
+li $a0, 1
+li $a1, 2
+call if_min
+c79:
+li $a0, 1
+li $a1, 2
+call if_prog
+c78:
+li $a0, 1
+li $a1, 2
+call if_sansElse
+c77:
+li $a0, 1
+li $a1, 2
+li $a2, 3
+li $a3, 4
+call if_test
+c76:
+li $a0, 1
+li $a1, 2
+li $a2, 3
+call if_ual
+c75:
+gets $ra, local(0)
+delframe
+jr $ra
+
--- /dev/null
+program
+
+globals 0
+
+procedure if_ual(3)
+var 0
+entry if_ual84
+if_ual84: newframe --> if_ual83
+if_ual83: j --> if_ual82
+if_ual82: j --> if_ual81
+if_ual81: j --> if_ual80
+if_ual80: j --> if_ual79
+if_ual79: j --> if_ual78
+if_ual78: j --> if_ual77
+if_ual77: j --> if_ual76
+if_ual76: j --> if_ual75
+if_ual75: j --> if_ual74
+if_ual74: j --> if_ual73
+if_ual73: j --> if_ual72
+if_ual72: j --> if_ual71
+if_ual71: li $v0, 0 --> if_ual70
+if_ual70: j --> if_ual69
+if_ual69: j --> if_ual68
+if_ual68: j --> if_ual67
+if_ual67: j --> if_ual66
+if_ual66: j --> if_ual65
+if_ual65: j --> if_ual64
+if_ual64: j --> if_ual63
+if_ual63: j --> if_ual62
+if_ual62: j --> if_ual61
+if_ual61: j --> if_ual60
+if_ual60: j --> if_ual59
+if_ual59: j --> if_ual58
+if_ual58: j --> if_ual57
+if_ual57: j --> if_ual56
+if_ual56: j --> if_ual55
+if_ual55: j --> if_ual54
+if_ual54: j --> if_ual53
+if_ual53: j --> if_ual52
+if_ual52: j --> if_ual51
+if_ual51: j --> if_ual50
+if_ual50: emit c74 --> if_ual49
+if_ual49: j --> if_ual48
+if_ual48: li $a3, 0 --> if_ual47
+if_ual47: seq $a3, $a0, $a3 --> if_ual46
+if_ual46: beq $a3, $zero --> if_ual43, if_ual45
+if_ual45: emit c73 --> if_ual44
+if_ual44: addu $v0, $a1, $a2 --> if_ual2
+if_ual2 : emit c62 --> if_ual1
+if_ual1 : j --> if_ual0
+if_ual0 : j --> if_ual96
+if_ual96: j --> if_ual95
+if_ual95: j --> if_ual94
+if_ual94: j --> if_ual93
+if_ual93: j --> if_ual92
+if_ual92: j --> if_ual91
+if_ual91: j --> if_ual90
+if_ual90: j --> if_ual89
+if_ual89: j --> if_ual88
+if_ual88: j --> if_ual87
+if_ual87: j --> if_ual86
+if_ual86: delframe --> if_ual85
+if_ual85: jr $ra
+if_ual43: emit c72 --> if_ual42
+if_ual42: j --> if_ual41
+if_ual41: li $a3, 1 --> if_ual40
+if_ual40: seq $a3, $a0, $a3 --> if_ual39
+if_ual39: beq $a3, $zero --> if_ual36, if_ual38
+if_ual38: emit c71 --> if_ual37
+if_ual37: subu $v0, $a1, $a2 --> if_ual2
+if_ual36: emit c70 --> if_ual35
+if_ual35: j --> if_ual34
+if_ual34: li $a3, 2 --> if_ual33
+if_ual33: seq $a3, $a0, $a3 --> if_ual32
+if_ual32: beq $a3, $zero --> if_ual19, if_ual31
+if_ual31: emit c69 --> if_ual30
+if_ual30: j --> if_ual29
+if_ual29: emit c68 --> if_ual28
+if_ual28: j --> if_ual27
+if_ual27: beq $a1, $zero --> if_ual20, if_ual26
+if_ual26: j --> if_ual25
+if_ual25: emit c67 --> if_ual24
+if_ual24: j --> if_ual23
+if_ual23: beq $a2, $zero --> if_ual21, if_ual22
+if_ual22: li $v0, 1 --> if_ual2
+if_ual21: li $v0, 0 --> if_ual2
+if_ual20: li $v0, 0 --> if_ual2
+if_ual19: emit c66 --> if_ual18
+if_ual18: j --> if_ual17
+if_ual17: li $a3, 3 --> if_ual16
+if_ual16: seq $a0, $a0, $a3 --> if_ual15
+if_ual15: beq $a0, $zero --> if_ual2, if_ual14
+if_ual14: emit c65 --> if_ual13
+if_ual13: j --> if_ual12
+if_ual12: emit c64 --> if_ual11
+if_ual11: j --> if_ual10
+if_ual10: beq $a1, $zero --> if_ual8, if_ual9
+if_ual9 : li $v0, 1 --> if_ual2
+if_ual8 : j --> if_ual7
+if_ual7 : emit c63 --> if_ual6
+if_ual6 : j --> if_ual5
+if_ual5 : beq $a2, $zero --> if_ual3, if_ual4
+if_ual4 : li $v0, 1 --> if_ual2
+if_ual3 : li $v0, 0 --> if_ual2
+
+procedure if_test(4)
+var 0
+entry if_test55
+if_test55: newframe --> if_test54
+if_test54: j --> if_test53
+if_test53: j --> if_test52
+if_test52: j --> if_test51
+if_test51: j --> if_test50
+if_test50: j --> if_test49
+if_test49: j --> if_test48
+if_test48: j --> if_test47
+if_test47: j --> if_test46
+if_test46: j --> if_test45
+if_test45: j --> if_test44
+if_test44: j --> if_test43
+if_test43: j --> if_test42
+if_test42: j --> if_test41
+if_test41: j --> if_test40
+if_test40: j --> if_test39
+if_test39: j --> if_test38
+if_test38: j --> if_test37
+if_test37: j --> if_test36
+if_test36: j --> if_test35
+if_test35: j --> if_test34
+if_test34: j --> if_test33
+if_test33: j --> if_test32
+if_test32: j --> if_test31
+if_test31: emit c61 --> if_test30
+if_test30: li $v0, 0 --> if_test29
+if_test29: emit c60 --> if_test28
+if_test28: j --> if_test27
+if_test27: emit c59 --> if_test26
+if_test26: j --> if_test25
+if_test25: emit c58 --> if_test24
+if_test24: j --> if_test23
+if_test23: emit c57 --> if_test22
+if_test22: j --> if_test21
+if_test21: emit c56 --> if_test20
+if_test20: j --> if_test19
+if_test19: slt $t0, $a0, $a1 --> if_test18
+if_test18: beq $t0, $zero --> if_test15, if_test17
+if_test17: emit c55 --> if_test16
+if_test16: addu $v0, $a0, $a1 --> if_test15
+if_test15: emit c54 --> if_test14
+if_test14: j --> if_test13
+if_test13: slt $a0, $a2, $a3 --> if_test12
+if_test12: beq $a0, $zero --> if_test7, if_test11
+if_test11: emit c53 --> if_test10
+if_test10: j --> if_test9
+if_test9 : emit c52 --> if_test8
+if_test8 : j --> if_test7
+if_test7 : emit c51 --> if_test6
+if_test6 : j --> if_test5
+if_test5 : j --> if_test4
+if_test4 : emit c50 --> if_test3
+if_test3 : j --> if_test2
+if_test2 : emit c49 --> if_test1
+if_test1 : j --> if_test0
+if_test0 : j --> if_test67
+if_test67: j --> if_test66
+if_test66: j --> if_test65
+if_test65: j --> if_test64
+if_test64: j --> if_test63
+if_test63: j --> if_test62
+if_test62: j --> if_test61
+if_test61: j --> if_test60
+if_test60: j --> if_test59
+if_test59: j --> if_test58
+if_test58: j --> if_test57
+if_test57: delframe --> if_test56
+if_test56: jr $ra
+
+procedure if_sansElse(2)
+var 0
+entry if_sansElse25
+if_sansElse25: newframe --> if_sansElse24
+if_sansElse24: j --> if_sansElse23
+if_sansElse23: j --> if_sansElse22
+if_sansElse22: j --> if_sansElse21
+if_sansElse21: j --> if_sansElse20
+if_sansElse20: j --> if_sansElse19
+if_sansElse19: j --> if_sansElse18
+if_sansElse18: j --> if_sansElse17
+if_sansElse17: j --> if_sansElse16
+if_sansElse16: j --> if_sansElse15
+if_sansElse15: j --> if_sansElse14
+if_sansElse14: j --> if_sansElse13
+if_sansElse13: j --> if_sansElse12
+if_sansElse12: j --> if_sansElse11
+if_sansElse11: j --> if_sansElse10
+if_sansElse10: emit c48 --> if_sansElse9
+if_sansElse9 : li $v0, 0 --> if_sansElse8
+if_sansElse8 : emit c47 --> if_sansElse7
+if_sansElse7 : j --> if_sansElse6
+if_sansElse6 : slt $a1, $a0, $a1 --> if_sansElse5
+if_sansElse5 : beq $a1, $zero --> if_sansElse2, if_sansElse4
+if_sansElse4 : emit c46 --> if_sansElse3
+if_sansElse3 : move $v0, $a0 --> if_sansElse2
+if_sansElse2 : emit c45 --> if_sansElse1
+if_sansElse1 : j --> if_sansElse0
+if_sansElse0 : j --> if_sansElse37
+if_sansElse37: j --> if_sansElse36
+if_sansElse36: j --> if_sansElse35
+if_sansElse35: j --> if_sansElse34
+if_sansElse34: j --> if_sansElse33
+if_sansElse33: j --> if_sansElse32
+if_sansElse32: j --> if_sansElse31
+if_sansElse31: j --> if_sansElse30
+if_sansElse30: j --> if_sansElse29
+if_sansElse29: j --> if_sansElse28
+if_sansElse28: j --> if_sansElse27
+if_sansElse27: delframe --> if_sansElse26
+if_sansElse26: jr $ra
+
+procedure if_prog(2)
+var 0
+entry if_prog30
+if_prog30: newframe --> if_prog29
+if_prog29: j --> if_prog28
+if_prog28: j --> if_prog27
+if_prog27: j --> if_prog26
+if_prog26: j --> if_prog25
+if_prog25: j --> if_prog24
+if_prog24: j --> if_prog23
+if_prog23: j --> if_prog22
+if_prog22: j --> if_prog21
+if_prog21: j --> if_prog20
+if_prog20: j --> if_prog19
+if_prog19: j --> if_prog18
+if_prog18: j --> if_prog17
+if_prog17: j --> if_prog16
+if_prog16: j --> if_prog15
+if_prog15: j --> if_prog14
+if_prog14: j --> if_prog13
+if_prog13: emit c44 --> if_prog12
+if_prog12: addu $v0, $a1, $a0 --> if_prog11
+if_prog11: emit c43 --> if_prog10
+if_prog10: li $a0, 0 --> if_prog9
+if_prog9 : j --> if_prog8
+if_prog8 : slt $v0, $v0, $zero --> if_prog7
+if_prog7 : beq $v0, $a0 --> if_prog4, if_prog6
+if_prog6 : emit c42 --> if_prog5
+if_prog5 : li $v0, 2 --> if_prog2
+if_prog2 : emit c40 --> if_prog1
+if_prog1 : j --> if_prog0
+if_prog0 : j --> if_prog42
+if_prog42: j --> if_prog41
+if_prog41: j --> if_prog40
+if_prog40: j --> if_prog39
+if_prog39: j --> if_prog38
+if_prog38: j --> if_prog37
+if_prog37: j --> if_prog36
+if_prog36: j --> if_prog35
+if_prog35: j --> if_prog34
+if_prog34: j --> if_prog33
+if_prog33: j --> if_prog32
+if_prog32: delframe --> if_prog31
+if_prog31: jr $ra
+if_prog4 : emit c41 --> if_prog3
+if_prog3 : li $v0, 3 --> if_prog2
+
+procedure if_min(2)
+var 0
+entry if_min25
+if_min25: newframe --> if_min24
+if_min24: j --> if_min23
+if_min23: j --> if_min22
+if_min22: j --> if_min21
+if_min21: j --> if_min20
+if_min20: j --> if_min19
+if_min19: j --> if_min18
+if_min18: j --> if_min17
+if_min17: j --> if_min16
+if_min16: j --> if_min15
+if_min15: j --> if_min14
+if_min14: move $v0, $a1 --> if_min13
+if_min13: j --> if_min12
+if_min12: j --> if_min11
+if_min11: j --> if_min10
+if_min10: emit c39 --> if_min9
+if_min9 : j --> if_min8
+if_min8 : sgt $a1, $a0, $v0 --> if_min7
+if_min7 : beq $a1, $zero --> if_min4, if_min6
+if_min6 : emit c38 --> if_min5
+if_min5 : j --> if_min2
+if_min2 : emit c36 --> if_min1
+if_min1 : j --> if_min0
+if_min0 : j --> if_min37
+if_min37: j --> if_min36
+if_min36: j --> if_min35
+if_min35: j --> if_min34
+if_min34: j --> if_min33
+if_min33: j --> if_min32
+if_min32: j --> if_min31
+if_min31: j --> if_min30
+if_min30: j --> if_min29
+if_min29: j --> if_min28
+if_min28: j --> if_min27
+if_min27: delframe --> if_min26
+if_min26: jr $ra
+if_min4 : emit c37 --> if_min3
+if_min3 : move $v0, $a0 --> if_min2
+
+procedure if_jian(9)
+var 0
+entry if_jian92
+if_jian92 : newframe --> if_jian91
+if_jian91 : j --> if_jian90
+if_jian90 : j --> if_jian89
+if_jian89 : j --> if_jian88
+if_jian88 : j --> if_jian87
+if_jian87 : j --> if_jian86
+if_jian86 : j --> if_jian85
+if_jian85 : j --> if_jian84
+if_jian84 : j --> if_jian83
+if_jian83 : j --> if_jian82
+if_jian82 : j --> if_jian81
+if_jian81 : j --> if_jian80
+if_jian80 : j --> if_jian79
+if_jian79 : j --> if_jian78
+if_jian78 : gets $t4, in(16) --> if_jian77
+if_jian77 : gets $t3, in(12) --> if_jian76
+if_jian76 : gets $t2, in(8) --> if_jian75
+if_jian75 : gets $t0, in(4) --> if_jian74
+if_jian74 : gets $t1, in(0) --> if_jian73
+if_jian73 : li $v0, 0 --> if_jian72
+if_jian72 : j --> if_jian71
+if_jian71 : j --> if_jian70
+if_jian70 : j --> if_jian69
+if_jian69 : j --> if_jian68
+if_jian68 : j --> if_jian67
+if_jian67 : j --> if_jian66
+if_jian66 : j --> if_jian65
+if_jian65 : j --> if_jian64
+if_jian64 : j --> if_jian63
+if_jian63 : j --> if_jian62
+if_jian62 : j --> if_jian61
+if_jian61 : j --> if_jian60
+if_jian60 : j --> if_jian59
+if_jian59 : j --> if_jian58
+if_jian58 : j --> if_jian57
+if_jian57 : j --> if_jian56
+if_jian56 : j --> if_jian55
+if_jian55 : j --> if_jian54
+if_jian54 : j --> if_jian53
+if_jian53 : j --> if_jian52
+if_jian52 : j --> if_jian51
+if_jian51 : j --> if_jian48
+if_jian48 : emit c15 --> if_jian47
+if_jian47 : addu $a0, $a0, $a1 --> if_jian46
+if_jian46 : slt $t5, $a0, $a2 --> if_jian45
+if_jian45 : emit c14 --> if_jian44
+if_jian44 : addu $a1, $a3, $t4 --> if_jian43
+if_jian43 : emit c13 --> if_jian42
+if_jian42 : li $a0, 1 --> if_jian41
+if_jian41 : addu $a2, $a2, $a0 --> if_jian40
+if_jian40 : emit c12 --> if_jian39
+if_jian39 : j --> if_jian38
+if_jian38 : li $a0, 1 --> if_jian37
+if_jian37 : seq $a0, $t1, $a0 --> if_jian36
+if_jian36 : beq $a0, $zero --> if_jian8, if_jian35
+if_jian35 : emit c11 --> if_jian34
+if_jian34 : j --> if_jian33
+if_jian33 : beq $t5, $zero --> if_jian30, if_jian32
+if_jian32 : emit c10 --> if_jian31
+if_jian31 : addu $v0, $a2, $a3 --> if_jian24
+if_jian24 : emit c7 --> if_jian23
+if_jian23 : j --> if_jian22
+if_jian22 : li $a1, 0 --> if_jian21
+if_jian21 : emit c6 --> if_jian20
+if_jian20 : li $a0, 0 --> if_jian49
+if_jian49 : seq $a0, $t5, $a0 --> if_jian19
+if_jian19 : beq $a0, $a1 --> if_jian12, if_jian18
+if_jian18 : li $a0, 0 --> if_jian17
+if_jian17 : emit c5 --> if_jian16
+if_jian16 : j --> if_jian15
+if_jian15 : beq $t0, $a0 --> if_jian13, if_jian14
+if_jian14 : li $a0, 1 --> if_jian11
+if_jian11 : beq $a0, $zero --> if_jian2, if_jian10
+if_jian10 : emit c4 --> if_jian9
+if_jian9 : j --> if_jian2
+if_jian2 : emit c0 --> if_jian1
+if_jian1 : j --> if_jian0
+if_jian0 : j --> if_jian104
+if_jian104: j --> if_jian103
+if_jian103: j --> if_jian102
+if_jian102: j --> if_jian101
+if_jian101: j --> if_jian100
+if_jian100: j --> if_jian99
+if_jian99 : j --> if_jian98
+if_jian98 : j --> if_jian97
+if_jian97 : j --> if_jian96
+if_jian96 : j --> if_jian95
+if_jian95 : j --> if_jian94
+if_jian94 : delframe --> if_jian93
+if_jian93 : jr $ra
+if_jian13 : li $a0, 0 --> if_jian11
+if_jian12 : li $a0, 0 --> if_jian11
+if_jian30 : emit c9 --> if_jian29
+if_jian29 : j --> if_jian28
+if_jian28 : li $a0, 0 --> if_jian50
+if_jian50 : seq $a0, $t0, $a0 --> if_jian27
+if_jian27 : beq $a0, $zero --> if_jian24, if_jian26
+if_jian26 : emit c8 --> if_jian25
+if_jian25 : addu $v0, $a1, $a3 --> if_jian24
+if_jian8 : emit c3 --> if_jian7
+if_jian7 : addu $v0, $a2, $t4 --> if_jian6
+if_jian6 : emit c2 --> if_jian5
+if_jian5 : addu $v0, $v0, $t3 --> if_jian4
+if_jian4 : emit c1 --> if_jian3
+if_jian3 : addu $v0, $v0, $t2 --> if_jian2
+
+procedure if_imbriq2(3)
+var 0
+entry if_imbriq234
+if_imbriq234: newframe --> if_imbriq233
+if_imbriq233: j --> if_imbriq232
+if_imbriq232: j --> if_imbriq231
+if_imbriq231: j --> if_imbriq230
+if_imbriq230: j --> if_imbriq229
+if_imbriq229: j --> if_imbriq228
+if_imbriq228: j --> if_imbriq227
+if_imbriq227: j --> if_imbriq226
+if_imbriq226: j --> if_imbriq225
+if_imbriq225: j --> if_imbriq224
+if_imbriq224: move $v0, $a0 --> if_imbriq223
+if_imbriq223: j --> if_imbriq222
+if_imbriq222: j --> if_imbriq221
+if_imbriq221: j --> if_imbriq220
+if_imbriq220: j --> if_imbriq219
+if_imbriq219: j --> if_imbriq218
+if_imbriq218: j --> if_imbriq217
+if_imbriq217: j --> if_imbriq216
+if_imbriq216: emit c35 --> if_imbriq215
+if_imbriq215: j --> if_imbriq214
+if_imbriq214: slt $a0, $v0, $a1 --> if_imbriq213
+if_imbriq213: beq $a0, $zero --> if_imbriq24, if_imbriq212
+if_imbriq212: emit c34 --> if_imbriq211
+if_imbriq211: j --> if_imbriq210
+if_imbriq210: slt $v0, $a1, $a2 --> if_imbriq29
+if_imbriq29 : beq $v0, $zero --> if_imbriq26, if_imbriq28
+if_imbriq28 : emit c33 --> if_imbriq27
+if_imbriq27 : move $v0, $a1 --> if_imbriq22
+if_imbriq22 : emit c30 --> if_imbriq21
+if_imbriq21 : j --> if_imbriq20
+if_imbriq20 : j --> if_imbriq246
+if_imbriq246: j --> if_imbriq245
+if_imbriq245: j --> if_imbriq244
+if_imbriq244: j --> if_imbriq243
+if_imbriq243: j --> if_imbriq242
+if_imbriq242: j --> if_imbriq241
+if_imbriq241: j --> if_imbriq240
+if_imbriq240: j --> if_imbriq239
+if_imbriq239: j --> if_imbriq238
+if_imbriq238: j --> if_imbriq237
+if_imbriq237: j --> if_imbriq236
+if_imbriq236: delframe --> if_imbriq235
+if_imbriq235: jr $ra
+if_imbriq26 : emit c32 --> if_imbriq25
+if_imbriq25 : li $v0, 47 --> if_imbriq22
+if_imbriq24 : emit c31 --> if_imbriq23
+if_imbriq23 : j --> if_imbriq22
+
+procedure if_imbriq1(3)
+var 0
+entry if_imbriq134
+if_imbriq134: newframe --> if_imbriq133
+if_imbriq133: j --> if_imbriq132
+if_imbriq132: j --> if_imbriq131
+if_imbriq131: j --> if_imbriq130
+if_imbriq130: j --> if_imbriq129
+if_imbriq129: j --> if_imbriq128
+if_imbriq128: j --> if_imbriq127
+if_imbriq127: j --> if_imbriq126
+if_imbriq126: j --> if_imbriq125
+if_imbriq125: j --> if_imbriq124
+if_imbriq124: j --> if_imbriq123
+if_imbriq123: j --> if_imbriq122
+if_imbriq122: move $v0, $a2 --> if_imbriq121
+if_imbriq121: j --> if_imbriq120
+if_imbriq120: j --> if_imbriq119
+if_imbriq119: j --> if_imbriq118
+if_imbriq118: j --> if_imbriq117
+if_imbriq117: j --> if_imbriq116
+if_imbriq116: emit c29 --> if_imbriq115
+if_imbriq115: j --> if_imbriq114
+if_imbriq114: slt $a2, $a0, $a1 --> if_imbriq113
+if_imbriq113: beq $a2, $zero --> if_imbriq14, if_imbriq112
+if_imbriq112: emit c28 --> if_imbriq111
+if_imbriq111: j --> if_imbriq110
+if_imbriq110: slt $a0, $a1, $v0 --> if_imbriq19
+if_imbriq19 : beq $a0, $zero --> if_imbriq16, if_imbriq18
+if_imbriq18 : emit c27 --> if_imbriq17
+if_imbriq17 : move $v0, $a1 --> if_imbriq12
+if_imbriq12 : emit c24 --> if_imbriq11
+if_imbriq11 : j --> if_imbriq10
+if_imbriq10 : j --> if_imbriq146
+if_imbriq146: j --> if_imbriq145
+if_imbriq145: j --> if_imbriq144
+if_imbriq144: j --> if_imbriq143
+if_imbriq143: j --> if_imbriq142
+if_imbriq142: j --> if_imbriq141
+if_imbriq141: j --> if_imbriq140
+if_imbriq140: j --> if_imbriq139
+if_imbriq139: j --> if_imbriq138
+if_imbriq138: j --> if_imbriq137
+if_imbriq137: j --> if_imbriq136
+if_imbriq136: delframe --> if_imbriq135
+if_imbriq135: jr $ra
+if_imbriq16 : emit c26 --> if_imbriq15
+if_imbriq15 : j --> if_imbriq12
+if_imbriq14 : emit c25 --> if_imbriq13
+if_imbriq13 : move $v0, $a0 --> if_imbriq12
+
+procedure if_exSimple(2)
+var 0
+entry if_exSimple39
+if_exSimple39: newframe --> if_exSimple38
+if_exSimple38: j --> if_exSimple37
+if_exSimple37: j --> if_exSimple36
+if_exSimple36: j --> if_exSimple35
+if_exSimple35: j --> if_exSimple34
+if_exSimple34: j --> if_exSimple33
+if_exSimple33: j --> if_exSimple32
+if_exSimple32: j --> if_exSimple31
+if_exSimple31: j --> if_exSimple30
+if_exSimple30: j --> if_exSimple29
+if_exSimple29: j --> if_exSimple28
+if_exSimple28: j --> if_exSimple27
+if_exSimple27: j --> if_exSimple26
+if_exSimple26: j --> if_exSimple25
+if_exSimple25: j --> if_exSimple24
+if_exSimple24: j --> if_exSimple23
+if_exSimple23: j --> if_exSimple22
+if_exSimple22: j --> if_exSimple21
+if_exSimple21: j --> if_exSimple20
+if_exSimple20: emit c23 --> if_exSimple19
+if_exSimple19: j --> if_exSimple18
+if_exSimple18: slt $v0, $a0, $a1 --> if_exSimple17
+if_exSimple17: beq $v0, $zero --> if_exSimple9, if_exSimple16
+if_exSimple16: emit c22 --> if_exSimple15
+if_exSimple15: addu $v0, $a0, $a1 --> if_exSimple14
+if_exSimple14: emit c21 --> if_exSimple13
+if_exSimple13: li $a0, 2 --> if_exSimple12
+if_exSimple12: mul $v0, $a0, $v0 --> if_exSimple11
+if_exSimple11: emit c20 --> if_exSimple10
+if_exSimple10: j --> if_exSimple2
+if_exSimple2 : emit c16 --> if_exSimple1
+if_exSimple1 : j --> if_exSimple0
+if_exSimple0 : j --> if_exSimple51
+if_exSimple51: j --> if_exSimple50
+if_exSimple50: j --> if_exSimple49
+if_exSimple49: j --> if_exSimple48
+if_exSimple48: j --> if_exSimple47
+if_exSimple47: j --> if_exSimple46
+if_exSimple46: j --> if_exSimple45
+if_exSimple45: j --> if_exSimple44
+if_exSimple44: j --> if_exSimple43
+if_exSimple43: j --> if_exSimple42
+if_exSimple42: j --> if_exSimple41
+if_exSimple41: delframe --> if_exSimple40
+if_exSimple40: jr $ra
+if_exSimple9 : emit c19 --> if_exSimple8
+if_exSimple8 : li $v0, 2 --> if_exSimple7
+if_exSimple7 : mul $v0, $v0, $a1 --> if_exSimple6
+if_exSimple6 : emit c18 --> if_exSimple5
+if_exSimple5 : addu $v0, $v0, $a0 --> if_exSimple4
+if_exSimple4 : emit c17 --> if_exSimple3
+if_exSimple3 : addu $v0, $v0, $a1 --> if_exSimple2
+
+procedure _main(0)
+var 4
+entry main91
+main91 : newframe --> main90
+main90 : sets local(0), $ra --> main89
+main89 : j --> main88
+main88 : j --> main87
+main87 : j --> main86
+main86 : j --> main85
+main85 : j --> main84
+main84 : j --> main83
+main83 : j --> main82
+main82 : j --> main81
+main81 : j --> main80
+main80 : j --> main79
+main79 : j --> main78
+main78 : j --> main77
+main77 : j --> main76
+main76 : j --> main75
+main75 : j --> main74
+main74 : j --> main73
+main73 : j --> main72
+main72 : j --> main71
+main71 : j --> main70
+main70 : j --> main69
+main69 : j --> main68
+main68 : j --> main67
+main67 : j --> main66
+main66 : j --> main65
+main65 : j --> main64
+main64 : j --> main63
+main63 : j --> main62
+main62 : j --> main61
+main61 : j --> main60
+main60 : j --> main59
+main59 : j --> main58
+main58 : j --> main57
+main57 : j --> main56
+main56 : j --> main55
+main55 : j --> main54
+main54 : j --> main53
+main53 : j --> main52
+main52 : j --> main51
+main51 : j --> main50
+main50 : emit c84 --> main49
+main49 : li $a0, 1 --> main48
+main48 : li $a1, 2 --> main47
+main47 : li $a2, 3 --> main46
+main46 : li $a3, 4 --> main45
+main45 : li $t3, 5 --> main44
+main44 : li $t2, 6 --> main43
+main43 : li $t1, 7 --> main42
+main42 : li $t0, 8 --> main41
+main41 : li $v0, 9 --> main40
+main40 : j --> main145
+main145: j --> main144
+main144: j --> main143
+main143: j --> main142
+main142: j --> main141
+main141: sets out(16), $t3 --> main140
+main140: sets out(12), $t2 --> main139
+main139: sets out(8), $t1 --> main138
+main138: sets out(4), $t0 --> main137
+main137: sets out(0), $v0 --> main136
+main136: call if_jian --> main135
+main135: j --> main39
+main39 : emit c83 --> main38
+main38 : li $a0, 1 --> main37
+main37 : li $a1, 2 --> main36
+main36 : j --> main134
+main134: j --> main133
+main133: j --> main132
+main132: call if_exSimple --> main131
+main131: j --> main35
+main35 : emit c82 --> main34
+main34 : li $a0, 1 --> main33
+main33 : li $a1, 2 --> main32
+main32 : li $a2, 3 --> main31
+main31 : j --> main130
+main130: j --> main129
+main129: j --> main128
+main128: j --> main127
+main127: call if_imbriq1 --> main126
+main126: j --> main30
+main30 : emit c81 --> main29
+main29 : li $a0, 1 --> main28
+main28 : li $a1, 2 --> main27
+main27 : li $a2, 3 --> main26
+main26 : j --> main120
+main120: j --> main119
+main119: j --> main118
+main118: j --> main117
+main117: call if_imbriq2 --> main116
+main116: j --> main25
+main25 : emit c80 --> main24
+main24 : li $a0, 1 --> main23
+main23 : li $a1, 2 --> main22
+main22 : j --> main115
+main115: j --> main114
+main114: j --> main113
+main113: call if_min --> main112
+main112: j --> main21
+main21 : emit c79 --> main20
+main20 : li $a0, 1 --> main19
+main19 : li $a1, 2 --> main18
+main18 : j --> main111
+main111: j --> main110
+main110: j --> main109
+main109: call if_prog --> main108
+main108: j --> main17
+main17 : emit c78 --> main16
+main16 : li $a0, 1 --> main15
+main15 : li $a1, 2 --> main14
+main14 : j --> main107
+main107: j --> main106
+main106: j --> main105
+main105: call if_sansElse --> main104
+main104: j --> main13
+main13 : emit c77 --> main12
+main12 : li $a0, 1 --> main11
+main11 : li $a1, 2 --> main10
+main10 : li $a2, 3 --> main9
+main9 : li $a3, 4 --> main8
+main8 : j --> main151
+main151: j --> main150
+main150: j --> main149
+main149: j --> main148
+main148: j --> main147
+main147: call if_test --> main146
+main146: j --> main7
+main7 : emit c76 --> main6
+main6 : li $a0, 1 --> main5
+main5 : li $a1, 2 --> main4
+main4 : li $a2, 3 --> main3
+main3 : j --> main125
+main125: j --> main124
+main124: j --> main123
+main123: j --> main122
+main122: call if_ual --> main121
+main121: j --> main2
+main2 : emit c75 --> main1
+main1 : j --> main0
+main0 : j --> main103
+main103: j --> main102
+main102: gets $ra, local(0) --> main101
+main101: j --> main100
+main100: j --> main99
+main99 : j --> main98
+main98 : j --> main97
+main97 : j --> main96
+main96 : j --> main95
+main95 : j --> main94
+main94 : j --> main93
+main93 : delframe --> main92
+main92 : jr $ra
+
--- /dev/null
+program
+
+globals 0
+
+function if_ual(%0; %1; %2) : %4
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24
+entry if_ual71
+exit if_ual0
+if_ual71: li %3, 0 --> if_ual70
+if_ual70: li %5, 0 --> if_ual69
+if_ual69: li %6, 0 --> if_ual68
+if_ual68: li %7, 0 --> if_ual67
+if_ual67: li %8, 0 --> if_ual66
+if_ual66: li %9, 0 --> if_ual65
+if_ual65: li %10, 0 --> if_ual64
+if_ual64: li %11, 0 --> if_ual63
+if_ual63: li %12, 0 --> if_ual62
+if_ual62: li %13, 0 --> if_ual61
+if_ual61: li %14, 0 --> if_ual60
+if_ual60: li %15, 0 --> if_ual59
+if_ual59: li %16, 0 --> if_ual58
+if_ual58: li %17, 0 --> if_ual57
+if_ual57: li %18, 0 --> if_ual56
+if_ual56: li %19, 0 --> if_ual55
+if_ual55: li %20, 0 --> if_ual54
+if_ual54: li %21, 0 --> if_ual53
+if_ual53: li %22, 0 --> if_ual52
+if_ual52: li %23, 0 --> if_ual51
+if_ual51: li %24, 0 --> if_ual50
+if_ual50: emit c74 --> if_ual49
+if_ual49: li %23, 0 --> if_ual48
+if_ual48: li %24, 0 --> if_ual47
+if_ual47: seq %22, %0, %24 --> if_ual46
+if_ual46: beq %22, %23 --> if_ual43, if_ual45
+if_ual45: emit c73 --> if_ual44
+if_ual44: addu %3, %1, %2 --> if_ual2
+if_ual2 : emit c62 --> if_ual1
+if_ual1 : move %4, %3 --> if_ual0
+if_ual43: emit c72 --> if_ual42
+if_ual42: li %20, 0 --> if_ual41
+if_ual41: li %21, 1 --> if_ual40
+if_ual40: seq %19, %0, %21 --> if_ual39
+if_ual39: beq %19, %20 --> if_ual36, if_ual38
+if_ual38: emit c71 --> if_ual37
+if_ual37: subu %3, %1, %2 --> if_ual2
+if_ual36: emit c70 --> if_ual35
+if_ual35: li %17, 0 --> if_ual34
+if_ual34: li %18, 2 --> if_ual33
+if_ual33: seq %16, %0, %18 --> if_ual32
+if_ual32: beq %16, %17 --> if_ual19, if_ual31
+if_ual31: emit c69 --> if_ual30
+if_ual30: li %15, 0 --> if_ual29
+if_ual29: emit c68 --> if_ual28
+if_ual28: move %14, %1 --> if_ual27
+if_ual27: beq %14, %15 --> if_ual20, if_ual26
+if_ual26: li %13, 0 --> if_ual25
+if_ual25: emit c67 --> if_ual24
+if_ual24: move %12, %2 --> if_ual23
+if_ual23: beq %12, %13 --> if_ual21, if_ual22
+if_ual22: li %3, 1 --> if_ual2
+if_ual21: li %3, 0 --> if_ual2
+if_ual20: li %3, 0 --> if_ual2
+if_ual19: emit c66 --> if_ual18
+if_ual18: li %10, 0 --> if_ual17
+if_ual17: li %11, 3 --> if_ual16
+if_ual16: seq %9, %0, %11 --> if_ual15
+if_ual15: beq %9, %10 --> if_ual2, if_ual14
+if_ual14: emit c65 --> if_ual13
+if_ual13: li %8, 0 --> if_ual12
+if_ual12: emit c64 --> if_ual11
+if_ual11: move %7, %1 --> if_ual10
+if_ual10: beq %7, %8 --> if_ual8, if_ual9
+if_ual9 : li %3, 1 --> if_ual2
+if_ual8 : li %6, 0 --> if_ual7
+if_ual7 : emit c63 --> if_ual6
+if_ual6 : move %5, %2 --> if_ual5
+if_ual5 : beq %5, %6 --> if_ual3, if_ual4
+if_ual4 : li %3, 1 --> if_ual2
+if_ual3 : li %3, 0 --> if_ual2
+
+function if_test(%0; %1; %2; %3) : %9
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14
+entry if_test41
+exit if_test0
+if_test41: li %4, 0 --> if_test40
+if_test40: li %5, 0 --> if_test39
+if_test39: li %6, 0 --> if_test38
+if_test38: li %7, 0 --> if_test37
+if_test37: li %8, 0 --> if_test36
+if_test36: li %10, 0 --> if_test35
+if_test35: li %11, 0 --> if_test34
+if_test34: li %12, 0 --> if_test33
+if_test33: li %13, 0 --> if_test32
+if_test32: li %14, 0 --> if_test31
+if_test31: emit c61 --> if_test30
+if_test30: li %4, 0 --> if_test29
+if_test29: emit c60 --> if_test28
+if_test28: li %5, 0 --> if_test27
+if_test27: emit c59 --> if_test26
+if_test26: li %6, 0 --> if_test25
+if_test25: emit c58 --> if_test24
+if_test24: li %7, 0 --> if_test23
+if_test23: emit c57 --> if_test22
+if_test22: li %8, 0 --> if_test21
+if_test21: emit c56 --> if_test20
+if_test20: li %14, 0 --> if_test19
+if_test19: slt %13, %0, %1 --> if_test18
+if_test18: beq %13, %14 --> if_test15, if_test17
+if_test17: emit c55 --> if_test16
+if_test16: addu %4, %0, %1 --> if_test15
+if_test15: emit c54 --> if_test14
+if_test14: li %12, 0 --> if_test13
+if_test13: slt %11, %2, %3 --> if_test12
+if_test12: beq %11, %12 --> if_test7, if_test11
+if_test11: emit c53 --> if_test10
+if_test10: addu %8, %2, %3 --> if_test9
+if_test9 : emit c52 --> if_test8
+if_test8 : addu %7, %8, %2 --> if_test7
+if_test7 : emit c51 --> if_test6
+if_test6 : li %10, 1 --> if_test5
+if_test5 : addu %5, %4, %10 --> if_test4
+if_test4 : emit c50 --> if_test3
+if_test3 : addu %6, %4, %7 --> if_test2
+if_test2 : emit c49 --> if_test1
+if_test1 : move %9, %4 --> if_test0
+
+function if_sansElse(%0; %1) : %3
+var %0, %1, %2, %3, %4, %5
+entry if_sansElse13
+exit if_sansElse0
+if_sansElse13: li %2, 0 --> if_sansElse12
+if_sansElse12: li %4, 0 --> if_sansElse11
+if_sansElse11: li %5, 0 --> if_sansElse10
+if_sansElse10: emit c48 --> if_sansElse9
+if_sansElse9 : li %2, 0 --> if_sansElse8
+if_sansElse8 : emit c47 --> if_sansElse7
+if_sansElse7 : li %5, 0 --> if_sansElse6
+if_sansElse6 : slt %4, %0, %1 --> if_sansElse5
+if_sansElse5 : beq %4, %5 --> if_sansElse2, if_sansElse4
+if_sansElse4 : emit c46 --> if_sansElse3
+if_sansElse3 : move %2, %0 --> if_sansElse2
+if_sansElse2 : emit c45 --> if_sansElse1
+if_sansElse1 : move %3, %2 --> if_sansElse0
+
+function if_prog(%0; %1) : %4
+var %0, %1, %2, %3, %4, %5, %6,
+ %7
+entry if_prog18
+exit if_prog0
+if_prog18: li %2, 0 --> if_prog17
+if_prog17: li %3, 0 --> if_prog16
+if_prog16: li %5, 0 --> if_prog15
+if_prog15: li %6, 0 --> if_prog14
+if_prog14: li %7, 0 --> if_prog13
+if_prog13: emit c44 --> if_prog12
+if_prog12: addu %2, %1, %0 --> if_prog11
+if_prog11: emit c43 --> if_prog10
+if_prog10: li %6, 0 --> if_prog9
+if_prog9 : li %7, 0 --> if_prog8
+if_prog8 : slt %5, %2, %7 --> if_prog7
+if_prog7 : beq %5, %6 --> if_prog4, if_prog6
+if_prog6 : emit c42 --> if_prog5
+if_prog5 : li %3, 2 --> if_prog2
+if_prog2 : emit c40 --> if_prog1
+if_prog1 : move %4, %3 --> if_prog0
+if_prog4 : emit c41 --> if_prog3
+if_prog3 : li %3, 3 --> if_prog2
+
+function if_min(%0; %1) : %3
+var %0, %1, %2, %3, %4, %5
+entry if_min13
+exit if_min0
+if_min13: li %2, 0 --> if_min12
+if_min12: li %4, 0 --> if_min11
+if_min11: li %5, 0 --> if_min10
+if_min10: emit c39 --> if_min9
+if_min9 : li %5, 0 --> if_min8
+if_min8 : sgt %4, %0, %1 --> if_min7
+if_min7 : beq %4, %5 --> if_min4, if_min6
+if_min6 : emit c38 --> if_min5
+if_min5 : move %2, %1 --> if_min2
+if_min2 : emit c36 --> if_min1
+if_min1 : move %3, %2 --> if_min0
+if_min4 : emit c37 --> if_min3
+if_min3 : move %2, %0 --> if_min2
+
+function if_jian(%0; %1; %2; %3; %4; %5; %6; %7; %8) : %16
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32
+entry if_jian73
+exit if_jian0
+if_jian73: li %9, 0 --> if_jian72
+if_jian72: li %10, 0 --> if_jian71
+if_jian71: li %11, 0 --> if_jian70
+if_jian70: li %12, 0 --> if_jian69
+if_jian69: li %13, 0 --> if_jian68
+if_jian68: li %14, 0 --> if_jian67
+if_jian67: li %15, 0 --> if_jian66
+if_jian66: li %17, 0 --> if_jian65
+if_jian65: li %18, 0 --> if_jian64
+if_jian64: li %19, 0 --> if_jian63
+if_jian63: li %20, 0 --> if_jian62
+if_jian62: li %21, 0 --> if_jian61
+if_jian61: li %22, 0 --> if_jian60
+if_jian60: li %23, 0 --> if_jian59
+if_jian59: li %24, 0 --> if_jian58
+if_jian58: li %25, 0 --> if_jian57
+if_jian57: li %26, 0 --> if_jian56
+if_jian56: li %27, 0 --> if_jian55
+if_jian55: li %28, 0 --> if_jian54
+if_jian54: li %29, 0 --> if_jian53
+if_jian53: li %30, 0 --> if_jian52
+if_jian52: li %31, 0 --> if_jian51
+if_jian51: li %32, 0 --> if_jian48
+if_jian48: emit c15 --> if_jian47
+if_jian47: addu %30, %0, %1 --> if_jian46
+if_jian46: slt %11, %30, %2 --> if_jian45
+if_jian45: emit c14 --> if_jian44
+if_jian44: addu %12, %3, %4 --> if_jian43
+if_jian43: emit c13 --> if_jian42
+if_jian42: li %29, 1 --> if_jian41
+if_jian41: addu %13, %2, %29 --> if_jian40
+if_jian40: emit c12 --> if_jian39
+if_jian39: li %27, 0 --> if_jian38
+if_jian38: li %28, 1 --> if_jian37
+if_jian37: seq %26, %8, %28 --> if_jian36
+if_jian36: beq %26, %27 --> if_jian8, if_jian35
+if_jian35: emit c11 --> if_jian34
+if_jian34: li %25, 0 --> if_jian33
+if_jian33: beq %11, %25 --> if_jian30, if_jian32
+if_jian32: emit c10 --> if_jian31
+if_jian31: addu %9, %13, %3 --> if_jian24
+if_jian24: emit c7 --> if_jian23
+if_jian23: li %18, 0 --> if_jian22
+if_jian22: li %22, 0 --> if_jian21
+if_jian21: emit c6 --> if_jian20
+if_jian20: li %31, 0 --> if_jian49
+if_jian49: seq %21, %11, %31 --> if_jian19
+if_jian19: beq %21, %22 --> if_jian12, if_jian18
+if_jian18: li %20, 0 --> if_jian17
+if_jian17: emit c5 --> if_jian16
+if_jian16: move %19, %7 --> if_jian15
+if_jian15: beq %19, %20 --> if_jian13, if_jian14
+if_jian14: li %17, 1 --> if_jian11
+if_jian11: beq %17, %18 --> if_jian2, if_jian10
+if_jian10: emit c4 --> if_jian9
+if_jian9 : addu %10, %12, %4 --> if_jian2
+if_jian2 : emit c0 --> if_jian1
+if_jian1 : move %16, %9 --> if_jian0
+if_jian13: li %17, 0 --> if_jian11
+if_jian12: li %17, 0 --> if_jian11
+if_jian30: emit c9 --> if_jian29
+if_jian29: li %24, 0 --> if_jian28
+if_jian28: li %32, 0 --> if_jian50
+if_jian50: seq %23, %7, %32 --> if_jian27
+if_jian27: beq %23, %24 --> if_jian24, if_jian26
+if_jian26: emit c8 --> if_jian25
+if_jian25: addu %9, %12, %3 --> if_jian24
+if_jian8 : emit c3 --> if_jian7
+if_jian7 : addu %14, %13, %4 --> if_jian6
+if_jian6 : emit c2 --> if_jian5
+if_jian5 : addu %15, %14, %5 --> if_jian4
+if_jian4 : emit c1 --> if_jian3
+if_jian3 : addu %9, %15, %6 --> if_jian2
+
+function if_imbriq2(%0; %1; %2) : %4
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8
+entry if_imbriq221
+exit if_imbriq20
+if_imbriq221: li %3, 0 --> if_imbriq220
+if_imbriq220: li %5, 0 --> if_imbriq219
+if_imbriq219: li %6, 0 --> if_imbriq218
+if_imbriq218: li %7, 0 --> if_imbriq217
+if_imbriq217: li %8, 0 --> if_imbriq216
+if_imbriq216: emit c35 --> if_imbriq215
+if_imbriq215: li %8, 0 --> if_imbriq214
+if_imbriq214: slt %7, %0, %1 --> if_imbriq213
+if_imbriq213: beq %7, %8 --> if_imbriq24, if_imbriq212
+if_imbriq212: emit c34 --> if_imbriq211
+if_imbriq211: li %6, 0 --> if_imbriq210
+if_imbriq210: slt %5, %1, %2 --> if_imbriq29
+if_imbriq29 : beq %5, %6 --> if_imbriq26, if_imbriq28
+if_imbriq28 : emit c33 --> if_imbriq27
+if_imbriq27 : move %3, %1 --> if_imbriq22
+if_imbriq22 : emit c30 --> if_imbriq21
+if_imbriq21 : move %4, %3 --> if_imbriq20
+if_imbriq26 : emit c32 --> if_imbriq25
+if_imbriq25 : li %3, 47 --> if_imbriq22
+if_imbriq24 : emit c31 --> if_imbriq23
+if_imbriq23 : move %3, %0 --> if_imbriq22
+
+function if_imbriq1(%0; %1; %2) : %4
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8
+entry if_imbriq121
+exit if_imbriq10
+if_imbriq121: li %3, 0 --> if_imbriq120
+if_imbriq120: li %5, 0 --> if_imbriq119
+if_imbriq119: li %6, 0 --> if_imbriq118
+if_imbriq118: li %7, 0 --> if_imbriq117
+if_imbriq117: li %8, 0 --> if_imbriq116
+if_imbriq116: emit c29 --> if_imbriq115
+if_imbriq115: li %8, 0 --> if_imbriq114
+if_imbriq114: slt %7, %0, %1 --> if_imbriq113
+if_imbriq113: beq %7, %8 --> if_imbriq14, if_imbriq112
+if_imbriq112: emit c28 --> if_imbriq111
+if_imbriq111: li %6, 0 --> if_imbriq110
+if_imbriq110: slt %5, %1, %2 --> if_imbriq19
+if_imbriq19 : beq %5, %6 --> if_imbriq16, if_imbriq18
+if_imbriq18 : emit c27 --> if_imbriq17
+if_imbriq17 : move %3, %1 --> if_imbriq12
+if_imbriq12 : emit c24 --> if_imbriq11
+if_imbriq11 : move %4, %3 --> if_imbriq10
+if_imbriq16 : emit c26 --> if_imbriq15
+if_imbriq15 : move %3, %2 --> if_imbriq12
+if_imbriq14 : emit c25 --> if_imbriq13
+if_imbriq13 : move %3, %0 --> if_imbriq12
+
+function if_exSimple(%0; %1) : %5
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9
+entry if_exSimple27
+exit if_exSimple0
+if_exSimple27: li %2, 0 --> if_exSimple26
+if_exSimple26: li %3, 0 --> if_exSimple25
+if_exSimple25: li %4, 0 --> if_exSimple24
+if_exSimple24: li %6, 0 --> if_exSimple23
+if_exSimple23: li %7, 0 --> if_exSimple22
+if_exSimple22: li %8, 0 --> if_exSimple21
+if_exSimple21: li %9, 0 --> if_exSimple20
+if_exSimple20: emit c23 --> if_exSimple19
+if_exSimple19: li %9, 0 --> if_exSimple18
+if_exSimple18: slt %8, %0, %1 --> if_exSimple17
+if_exSimple17: beq %8, %9 --> if_exSimple9, if_exSimple16
+if_exSimple16: emit c22 --> if_exSimple15
+if_exSimple15: addu %3, %0, %1 --> if_exSimple14
+if_exSimple14: emit c21 --> if_exSimple13
+if_exSimple13: li %7, 2 --> if_exSimple12
+if_exSimple12: mul %3, %7, %3 --> if_exSimple11
+if_exSimple11: emit c20 --> if_exSimple10
+if_exSimple10: move %2, %3 --> if_exSimple2
+if_exSimple2 : emit c16 --> if_exSimple1
+if_exSimple1 : move %5, %2 --> if_exSimple0
+if_exSimple9 : emit c19 --> if_exSimple8
+if_exSimple8 : li %6, 2 --> if_exSimple7
+if_exSimple7 : mul %4, %6, %1 --> if_exSimple6
+if_exSimple6 : emit c18 --> if_exSimple5
+if_exSimple5 : addu %4, %4, %0 --> if_exSimple4
+if_exSimple4 : emit c17 --> if_exSimple3
+if_exSimple3 : addu %2, %4, %1 --> if_exSimple2
+
+function _main() : %1
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31
+entry main81
+exit main0
+main81: li %0, 0 --> main80
+main80: li %2, 0 --> main79
+main79: li %3, 0 --> main78
+main78: li %4, 0 --> main77
+main77: li %5, 0 --> main76
+main76: li %6, 0 --> main75
+main75: li %7, 0 --> main74
+main74: li %8, 0 --> main73
+main73: li %9, 0 --> main72
+main72: li %10, 0 --> main71
+main71: li %11, 0 --> main70
+main70: li %12, 0 --> main69
+main69: li %13, 0 --> main68
+main68: li %14, 0 --> main67
+main67: li %15, 0 --> main66
+main66: li %16, 0 --> main65
+main65: li %17, 0 --> main64
+main64: li %18, 0 --> main63
+main63: li %19, 0 --> main62
+main62: li %20, 0 --> main61
+main61: li %21, 0 --> main60
+main60: li %22, 0 --> main59
+main59: li %23, 0 --> main58
+main58: li %24, 0 --> main57
+main57: li %25, 0 --> main56
+main56: li %26, 0 --> main55
+main55: li %27, 0 --> main54
+main54: li %28, 0 --> main53
+main53: li %29, 0 --> main52
+main52: li %30, 0 --> main51
+main51: li %31, 0 --> main50
+main50: emit c84 --> main49
+main49: li %23, 1 --> main48
+main48: li %24, 2 --> main47
+main47: li %25, 3 --> main46
+main46: li %26, 4 --> main45
+main45: li %27, 5 --> main44
+main44: li %28, 6 --> main43
+main43: li %29, 7 --> main42
+main42: li %30, 8 --> main41
+main41: li %31, 9 --> main40
+main40: call %0, if_jian(%23, %24, %25, %26, %27, %28, %29, %30, %31) --> main39
+main39: emit c83 --> main38
+main38: li %21, 1 --> main37
+main37: li %22, 2 --> main36
+main36: call %0, if_exSimple(%21, %22) --> main35
+main35: emit c82 --> main34
+main34: li %18, 1 --> main33
+main33: li %19, 2 --> main32
+main32: li %20, 3 --> main31
+main31: call %0, if_imbriq1(%18, %19, %20) --> main30
+main30: emit c81 --> main29
+main29: li %15, 1 --> main28
+main28: li %16, 2 --> main27
+main27: li %17, 3 --> main26
+main26: call %0, if_imbriq2(%15, %16, %17) --> main25
+main25: emit c80 --> main24
+main24: li %13, 1 --> main23
+main23: li %14, 2 --> main22
+main22: call %0, if_min(%13, %14) --> main21
+main21: emit c79 --> main20
+main20: li %11, 1 --> main19
+main19: li %12, 2 --> main18
+main18: call %0, if_prog(%11, %12) --> main17
+main17: emit c78 --> main16
+main16: li %9, 1 --> main15
+main15: li %10, 2 --> main14
+main14: call %0, if_sansElse(%9, %10) --> main13
+main13: emit c77 --> main12
+main12: li %5, 1 --> main11
+main11: li %6, 2 --> main10
+main10: li %7, 3 --> main9
+main9 : li %8, 4 --> main8
+main8 : call %0, if_test(%5, %6, %7, %8) --> main7
+main7 : emit c76 --> main6
+main6 : li %2, 1 --> main5
+main5 : li %3, 2 --> main4
+main4 : li %4, 3 --> main3
+main3 : call %0, if_ual(%2, %3, %4) --> main2
+main2 : emit c75 --> main1
+main1 : move %1, %0 --> main0
+
--- /dev/null
+program: (main function is "main")
+
+
+ globals:
+
+
+ "__builtin___memcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memmove_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___mempcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memset_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___stpcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strcat_chk": int -> int -> int -> int
+
+
+ "__builtin___strcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strncat_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___strncpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vfprintf_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vprintf_chk": int -> int -> int -> int
+
+
+ "__builtin___vsnprintf_chk": int -> int -> int -> int -> int -> int -> int
+
+
+ "__builtin___vsprintf_chk": int -> int -> int -> int -> int -> int
+
+
+ "__builtin_acos": float -> float
+
+
+ "__builtin_acosf": float -> float
+
+
+ "__builtin_acosl": float -> float
+
+
+ "__builtin_alloca": int -> int
+
+
+ "__builtin_asin": float -> float
+
+
+ "__builtin_asinf": float -> float
+
+
+ "__builtin_asinl": float -> float
+
+
+ "__builtin_atan": float -> float
+
+
+ "__builtin_atanf": float -> float
+
+
+ "__builtin_atanl": float -> float
+
+
+ "__builtin_atan2": float -> float -> float
+
+
+ "__builtin_atan2f": float -> float -> float
+
+
+ "__builtin_atan2l": float -> float -> float
+
+
+ "__builtin_ceil": float -> float
+
+
+ "__builtin_ceilf": float -> float
+
+
+ "__builtin_ceill": float -> float
+
+
+ "__builtin_cos": float -> float
+
+
+ "__builtin_cosf": float -> float
+
+
+ "__builtin_cosl": float -> float
+
+
+ "__builtin_cosh": float -> float
+
+
+ "__builtin_coshf": float -> float
+
+
+ "__builtin_coshl": float -> float
+
+
+ "__builtin_clz": int -> int
+
+
+ "__builtin_clzl": int -> int
+
+
+ "__builtin_clzll": int -> int
+
+
+ "__builtin_constant_p": int -> int
+
+
+ "__builtin_ctz": int -> int
+
+
+ "__builtin_ctzl": int -> int
+
+
+ "__builtin_ctzll": int -> int
+
+
+ "__builtin_exp": float -> float
+
+
+ "__builtin_expf": float -> float
+
+
+ "__builtin_expl": float -> float
+
+
+ "__builtin_expect": int -> int -> int
+
+
+ "__builtin_fabs": float -> float
+
+
+ "__builtin_fabsf": float -> float
+
+
+ "__builtin_fabsl": float -> float
+
+
+ "__builtin_ffs": int -> int
+
+
+ "__builtin_ffsl": int -> int
+
+
+ "__builtin_ffsll": int -> int
+
+
+ "__builtin_frame_address": int -> int
+
+
+ "__builtin_floor": float -> float
+
+
+ "__builtin_floorf": float -> float
+
+
+ "__builtin_floorl": float -> float
+
+
+ "__builtin_huge_val": float
+
+
+ "__builtin_huge_valf": float
+
+
+ "__builtin_huge_vall": float
+
+
+ "__builtin_inf": float
+
+
+ "__builtin_inff": float
+
+
+ "__builtin_infl": float
+
+
+ "__builtin_memcpy": int -> int -> int -> int
+
+
+ "__builtin_mempcpy": int -> int -> int -> int
+
+
+ "__builtin_fmod": float -> float
+
+
+ "__builtin_fmodf": float -> float
+
+
+ "__builtin_fmodl": float -> float
+
+
+ "__builtin_frexp": float -> int -> float
+
+
+ "__builtin_frexpf": float -> int -> float
+
+
+ "__builtin_frexpl": float -> int -> float
+
+
+ "__builtin_ldexp": float -> int -> float
+
+
+ "__builtin_ldexpf": float -> int -> float
+
+
+ "__builtin_ldexpl": float -> int -> float
+
+
+ "__builtin_log": float -> float
+
+
+ "__builtin_logf": float -> float
+
+
+ "__builtin_logl": float -> float
+
+
+ "__builtin_log10": float -> float
+
+
+ "__builtin_log10f": float -> float
+
+
+ "__builtin_log10l": float -> float
+
+
+ "__builtin_modff": float -> int -> float
+
+
+ "__builtin_modfl": float -> int -> float
+
+
+ "__builtin_nan": int -> float
+
+
+ "__builtin_nanf": int -> float
+
+
+ "__builtin_nanl": int -> float
+
+
+ "__builtin_nans": int -> float
+
+
+ "__builtin_nansf": int -> float
+
+
+ "__builtin_nansl": int -> float
+
+
+ "__builtin_next_arg": int
+
+
+ "__builtin_object_size": int -> int -> int
+
+
+ "__builtin_parity": int -> int
+
+
+ "__builtin_parityl": int -> int
+
+
+ "__builtin_parityll": int -> int
+
+
+ "__builtin_popcount": int -> int
+
+
+ "__builtin_popcountl": int -> int
+
+
+ "__builtin_popcountll": int -> int
+
+
+ "__builtin_powi": float -> int -> float
+
+
+ "__builtin_powif": float -> int -> float
+
+
+ "__builtin_powil": float -> int -> float
+
+
+ "__builtin_return": int -> void
+
+
+ "__builtin_return_address": int -> int
+
+
+ "__builtin_sin": float -> float
+
+
+ "__builtin_sinf": float -> float
+
+
+ "__builtin_sinl": float -> float
+
+
+ "__builtin_sinh": float -> float
+
+
+ "__builtin_sinhf": float -> float
+
+
+ "__builtin_sinhl": float -> float
+
+
+ "__builtin_sqrt": float -> float
+
+
+ "__builtin_sqrtf": float -> float
+
+
+ "__builtin_sqrtl": float -> float
+
+
+ "__builtin_stpcpy": int -> int -> int
+
+
+ "__builtin_strchr": int -> int -> int
+
+
+ "__builtin_strcmp": int -> int -> int
+
+
+ "__builtin_strcpy": int -> int -> int
+
+
+ "__builtin_strcspn": int -> int -> int
+
+
+ "__builtin_strncat": int -> int -> int -> int
+
+
+ "__builtin_strncmp": int -> int -> int -> int
+
+
+ "__builtin_strncpy": int -> int -> int -> int
+
+
+ "__builtin_strspn": int -> int -> int
+
+
+ "__builtin_strpbrk": int -> int -> int
+
+
+ "__builtin_types_compatible_p": int -> int -> int
+
+
+ "__builtin_tan": float -> float
+
+
+ "__builtin_tanf": float -> float
+
+
+ "__builtin_tanl": float -> float
+
+
+ "__builtin_tanh": float -> float
+
+
+ "__builtin_tanhf": float -> float
+
+
+ "__builtin_tanhl": float -> float
+
+
+ "__builtin_va_end": int -> void
+
+
+ "__builtin_varargs_start": int -> void
+
+
+ "__builtin_va_start": int -> int -> void
+
+
+ "__builtin_stdarg_start": int -> void
+
+
+ "__builtin_va_arg": int -> int -> void
+
+
+ "__builtin_va_copy": int -> int -> void
+
+
+ "if_jian"(%0, %1, %2, %3, %4, %5, %6, %7, %8): int -> int -> int -> int -> int -> int -> int -> int -> int -> int
+ locals: %16, %9, %10, %11, %12, %13, %14, %15, %17, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30
+ result: %16
+ stacksize: 0
+ entry: if_jian48
+ exit: if_jian0
+
+ if_jian9: add %10, %12, %4 --> if_jian2
+ if_jian8: emit c3 --> if_jian7
+ if_jian7: add %14, %13, %4 --> if_jian6
+ if_jian6: emit c2 --> if_jian5
+ if_jian5: add %15, %14, %5 --> if_jian4
+ if_jian48: emit c15 --> if_jian47
+ if_jian47: add %30, %0, %1 --> if_jian46
+ if_jian46: lt %11, %30, %2 --> if_jian45
+ if_jian45: emit c14 --> if_jian44
+ if_jian44: add %12, %3, %4 --> if_jian43
+ if_jian43: emit c13 --> if_jian42
+ if_jian42: imm_int 1, %29, --> if_jian41
+ if_jian41: add %13, %2, %29 --> if_jian40
+ if_jian40: emit c12 --> if_jian39
+ if_jian4: emit c1 --> if_jian3
+ if_jian39: imm_int 0, %27, --> if_jian38
+ if_jian38: imm_int 1, %28, --> if_jian37
+ if_jian37: eq %26, %8, %28 --> if_jian36
+ if_jian36: eq %26, %27 --> if_jian8, if_jian35
+ if_jian35: emit c11 --> if_jian34
+ if_jian34: imm_int 0, %25, --> if_jian33
+ if_jian33: eq %11, %25 --> if_jian30, if_jian32
+ if_jian32: emit c10 --> if_jian31
+ if_jian31: add %9, %13, %3 --> if_jian24
+ if_jian30: emit c9 --> if_jian29
+ if_jian3: add %9, %15, %6 --> if_jian2
+ if_jian29: imm_int 0, %24, --> if_jian28
+ if_jian28: notbool %23, %7 --> if_jian27
+ if_jian27: eq %23, %24 --> if_jian24, if_jian26
+ if_jian26: emit c8 --> if_jian25
+ if_jian25: add %9, %12, %3 --> if_jian24
+ if_jian24: emit c7 --> if_jian23
+ if_jian23: imm_int 0, %18, --> if_jian22
+ if_jian22: imm_int 0, %22, --> if_jian21
+ if_jian21: emit c6 --> if_jian20
+ if_jian20: notbool %21, %11 --> if_jian19
+ if_jian2: emit c0 --> if_jian1
+ if_jian19: eq %21, %22 --> if_jian12, if_jian18
+ if_jian18: imm_int 0, %20, --> if_jian17
+ if_jian17: emit c5 --> if_jian16
+ if_jian16: mov %19, %7 --> if_jian15
+ if_jian15: eq %19, %20 --> if_jian13, if_jian14
+ if_jian14: imm_int 1, %17, --> if_jian11
+ if_jian13: imm_int 0, %17, --> if_jian11
+ if_jian12: imm_int 0, %17, --> if_jian11
+ if_jian11: eq %17, %18 --> if_jian2, if_jian10
+ if_jian10: emit c4 --> if_jian9
+ if_jian1: mov %16, %9 --> if_jian0
+ if_jian0: return %16
+
+
+ "if_exSimple"(%0, %1): int -> int -> int
+ locals: %5, %2, %3, %4, %6, %7, %8, %9
+ result: %5
+ stacksize: 0
+ entry: if_exSimple20
+ exit: if_exSimple0
+
+ if_exSimple9: emit c19 --> if_exSimple8
+ if_exSimple8: imm_int 2, %6, --> if_exSimple7
+ if_exSimple7: mul %4, %6, %1 --> if_exSimple6
+ if_exSimple6: emit c18 --> if_exSimple5
+ if_exSimple5: add %4, %4, %0 --> if_exSimple4
+ if_exSimple4: emit c17 --> if_exSimple3
+ if_exSimple3: add %2, %4, %1 --> if_exSimple2
+ if_exSimple20: emit c23 --> if_exSimple19
+ if_exSimple2: emit c16 --> if_exSimple1
+ if_exSimple19: imm_int 0, %9, --> if_exSimple18
+ if_exSimple18: lt %8, %0, %1 --> if_exSimple17
+ if_exSimple17: eq %8, %9 --> if_exSimple9, if_exSimple16
+ if_exSimple16: emit c22 --> if_exSimple15
+ if_exSimple15: add %3, %0, %1 --> if_exSimple14
+ if_exSimple14: emit c21 --> if_exSimple13
+ if_exSimple13: imm_int 2, %7, --> if_exSimple12
+ if_exSimple12: mul %3, %7, %3 --> if_exSimple11
+ if_exSimple11: emit c20 --> if_exSimple10
+ if_exSimple10: mov %2, %3 --> if_exSimple2
+ if_exSimple1: mov %5, %2 --> if_exSimple0
+ if_exSimple0: return %5
+
+
+ "if_imbriq1"(%0, %1, %2): int -> int -> int -> int
+ locals: %4, %3, %5, %6, %7, %8
+ result: %4
+ stacksize: 0
+ entry: if_imbriq116
+ exit: if_imbriq10
+
+ if_imbriq19: eq %5, %6 --> if_imbriq16, if_imbriq18
+ if_imbriq18: emit c27 --> if_imbriq17
+ if_imbriq17: mov %3, %1 --> if_imbriq12
+ if_imbriq16: emit c26 --> if_imbriq15
+ if_imbriq15: mov %3, %2 --> if_imbriq12
+ if_imbriq14: emit c25 --> if_imbriq13
+ if_imbriq13: mov %3, %0 --> if_imbriq12
+ if_imbriq12: emit c24 --> if_imbriq11
+ if_imbriq116: emit c29 --> if_imbriq115
+ if_imbriq115: imm_int 0, %8, --> if_imbriq114
+ if_imbriq114: lt %7, %0, %1 --> if_imbriq113
+ if_imbriq113: eq %7, %8 --> if_imbriq14, if_imbriq112
+ if_imbriq112: emit c28 --> if_imbriq111
+ if_imbriq111: imm_int 0, %6, --> if_imbriq110
+ if_imbriq110: lt %5, %1, %2 --> if_imbriq19
+ if_imbriq11: mov %4, %3 --> if_imbriq10
+ if_imbriq10: return %4
+
+
+ "if_imbriq2"(%0, %1, %2): int -> int -> int -> int
+ locals: %4, %3, %5, %6, %7, %8
+ result: %4
+ stacksize: 0
+ entry: if_imbriq216
+ exit: if_imbriq20
+
+ if_imbriq29: eq %5, %6 --> if_imbriq26, if_imbriq28
+ if_imbriq28: emit c33 --> if_imbriq27
+ if_imbriq27: mov %3, %1 --> if_imbriq22
+ if_imbriq26: emit c32 --> if_imbriq25
+ if_imbriq25: imm_int 47, %3, --> if_imbriq22
+ if_imbriq24: emit c31 --> if_imbriq23
+ if_imbriq23: mov %3, %0 --> if_imbriq22
+ if_imbriq22: emit c30 --> if_imbriq21
+ if_imbriq216: emit c35 --> if_imbriq215
+ if_imbriq215: imm_int 0, %8, --> if_imbriq214
+ if_imbriq214: lt %7, %0, %1 --> if_imbriq213
+ if_imbriq213: eq %7, %8 --> if_imbriq24, if_imbriq212
+ if_imbriq212: emit c34 --> if_imbriq211
+ if_imbriq211: imm_int 0, %6, --> if_imbriq210
+ if_imbriq210: lt %5, %1, %2 --> if_imbriq29
+ if_imbriq21: mov %4, %3 --> if_imbriq20
+ if_imbriq20: return %4
+
+
+ "if_min"(%0, %1): int -> int -> int
+ locals: %3, %2, %4, %5
+ result: %3
+ stacksize: 0
+ entry: if_min10
+ exit: if_min0
+
+ if_min9: imm_int 0, %5, --> if_min8
+ if_min8: gt %4, %0, %1 --> if_min7
+ if_min7: eq %4, %5 --> if_min4, if_min6
+ if_min6: emit c38 --> if_min5
+ if_min5: mov %2, %1 --> if_min2
+ if_min4: emit c37 --> if_min3
+ if_min3: mov %2, %0 --> if_min2
+ if_min2: emit c36 --> if_min1
+ if_min10: emit c39 --> if_min9
+ if_min1: mov %3, %2 --> if_min0
+ if_min0: return %3
+
+
+ "if_prog"(%0, %1): int -> int -> int
+ locals: %4, %2, %3, %5, %6, %7
+ result: %4
+ stacksize: 0
+ entry: if_prog13
+ exit: if_prog0
+
+ if_prog9: imm_int 0, %7, --> if_prog8
+ if_prog8: lt %5, %2, %7 --> if_prog7
+ if_prog7: eq %5, %6 --> if_prog4, if_prog6
+ if_prog6: emit c42 --> if_prog5
+ if_prog5: imm_int 2, %3, --> if_prog2
+ if_prog4: emit c41 --> if_prog3
+ if_prog3: imm_int 3, %3, --> if_prog2
+ if_prog2: emit c40 --> if_prog1
+ if_prog13: emit c44 --> if_prog12
+ if_prog12: add %2, %1, %0 --> if_prog11
+ if_prog11: emit c43 --> if_prog10
+ if_prog10: imm_int 0, %6, --> if_prog9
+ if_prog1: mov %4, %3 --> if_prog0
+ if_prog0: return %4
+
+
+ "if_sansElse"(%0, %1): int -> int -> int
+ locals: %3, %2, %4, %5
+ result: %3
+ stacksize: 0
+ entry: if_sansElse10
+ exit: if_sansElse0
+
+ if_sansElse9: imm_int 0, %2, --> if_sansElse8
+ if_sansElse8: emit c47 --> if_sansElse7
+ if_sansElse7: imm_int 0, %5, --> if_sansElse6
+ if_sansElse6: lt %4, %0, %1 --> if_sansElse5
+ if_sansElse5: eq %4, %5 --> if_sansElse2, if_sansElse4
+ if_sansElse4: emit c46 --> if_sansElse3
+ if_sansElse3: mov %2, %0 --> if_sansElse2
+ if_sansElse2: emit c45 --> if_sansElse1
+ if_sansElse10: emit c48 --> if_sansElse9
+ if_sansElse1: mov %3, %2 --> if_sansElse0
+ if_sansElse0: return %3
+
+
+ "if_test"(%0, %1, %2, %3): int -> int -> int -> int -> int
+ locals: %9, %4, %5, %6, %7, %8, %10, %11, %12, %13, %14
+ result: %9
+ stacksize: 0
+ entry: if_test31
+ exit: if_test0
+
+ if_test9: emit c52 --> if_test8
+ if_test8: add %7, %8, %2 --> if_test7
+ if_test7: emit c51 --> if_test6
+ if_test6: imm_int 1, %10, --> if_test5
+ if_test5: add %5, %4, %10 --> if_test4
+ if_test4: emit c50 --> if_test3
+ if_test31: emit c61 --> if_test30
+ if_test30: imm_int 0, %4, --> if_test29
+ if_test3: add %6, %4, %7 --> if_test2
+ if_test29: emit c60 --> if_test28
+ if_test28: imm_int 0, %5, --> if_test27
+ if_test27: emit c59 --> if_test26
+ if_test26: imm_int 0, %6, --> if_test25
+ if_test25: emit c58 --> if_test24
+ if_test24: imm_int 0, %7, --> if_test23
+ if_test23: emit c57 --> if_test22
+ if_test22: imm_int 0, %8, --> if_test21
+ if_test21: emit c56 --> if_test20
+ if_test20: imm_int 0, %14, --> if_test19
+ if_test2: emit c49 --> if_test1
+ if_test19: lt %13, %0, %1 --> if_test18
+ if_test18: eq %13, %14 --> if_test15, if_test17
+ if_test17: emit c55 --> if_test16
+ if_test16: add %4, %0, %1 --> if_test15
+ if_test15: emit c54 --> if_test14
+ if_test14: imm_int 0, %12, --> if_test13
+ if_test13: lt %11, %2, %3 --> if_test12
+ if_test12: eq %11, %12 --> if_test7, if_test11
+ if_test11: emit c53 --> if_test10
+ if_test10: add %8, %2, %3 --> if_test9
+ if_test1: mov %9, %4 --> if_test0
+ if_test0: return %9
+
+
+ "if_ual"(%0, %1, %2): int -> int -> int -> int
+ locals: %4, %3, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24
+ result: %4
+ stacksize: 0
+ entry: if_ual50
+ exit: if_ual0
+
+ if_ual9: imm_int 1, %3, --> if_ual2
+ if_ual8: imm_int 0, %6, --> if_ual7
+ if_ual7: emit c63 --> if_ual6
+ if_ual6: mov %5, %2 --> if_ual5
+ if_ual50: emit c74 --> if_ual49
+ if_ual5: eq %5, %6 --> if_ual3, if_ual4
+ if_ual49: imm_int 0, %23, --> if_ual48
+ if_ual48: imm_int 0, %24, --> if_ual47
+ if_ual47: eq %22, %0, %24 --> if_ual46
+ if_ual46: eq %22, %23 --> if_ual43, if_ual45
+ if_ual45: emit c73 --> if_ual44
+ if_ual44: add %3, %1, %2 --> if_ual2
+ if_ual43: emit c72 --> if_ual42
+ if_ual42: imm_int 0, %20, --> if_ual41
+ if_ual41: imm_int 1, %21, --> if_ual40
+ if_ual40: eq %19, %0, %21 --> if_ual39
+ if_ual4: imm_int 1, %3, --> if_ual2
+ if_ual39: eq %19, %20 --> if_ual36, if_ual38
+ if_ual38: emit c71 --> if_ual37
+ if_ual37: sub %3, %1, %2 --> if_ual2
+ if_ual36: emit c70 --> if_ual35
+ if_ual35: imm_int 0, %17, --> if_ual34
+ if_ual34: imm_int 2, %18, --> if_ual33
+ if_ual33: eq %16, %0, %18 --> if_ual32
+ if_ual32: eq %16, %17 --> if_ual19, if_ual31
+ if_ual31: emit c69 --> if_ual30
+ if_ual30: imm_int 0, %15, --> if_ual29
+ if_ual3: imm_int 0, %3, --> if_ual2
+ if_ual29: emit c68 --> if_ual28
+ if_ual28: mov %14, %1 --> if_ual27
+ if_ual27: eq %14, %15 --> if_ual20, if_ual26
+ if_ual26: imm_int 0, %13, --> if_ual25
+ if_ual25: emit c67 --> if_ual24
+ if_ual24: mov %12, %2 --> if_ual23
+ if_ual23: eq %12, %13 --> if_ual21, if_ual22
+ if_ual22: imm_int 1, %3, --> if_ual2
+ if_ual21: imm_int 0, %3, --> if_ual2
+ if_ual20: imm_int 0, %3, --> if_ual2
+ if_ual2: emit c62 --> if_ual1
+ if_ual19: emit c66 --> if_ual18
+ if_ual18: imm_int 0, %10, --> if_ual17
+ if_ual17: imm_int 3, %11, --> if_ual16
+ if_ual16: eq %9, %0, %11 --> if_ual15
+ if_ual15: eq %9, %10 --> if_ual2, if_ual14
+ if_ual14: emit c65 --> if_ual13
+ if_ual13: imm_int 0, %8, --> if_ual12
+ if_ual12: emit c64 --> if_ual11
+ if_ual11: mov %7, %1 --> if_ual10
+ if_ual10: eq %7, %8 --> if_ual8, if_ual9
+ if_ual1: mov %4, %3 --> if_ual0
+ if_ual0: return %4
+
+
+ "main"(): int
+ locals: %1, %0, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31
+ result: %1
+ stacksize: 0
+ entry: main50
+ exit: main0
+
+ main9: imm_int 4, %8, --> main8
+ main8: call "if_test", %5, %6, %7, %8, %0: int -> int -> int -> int -> int --> main7
+ main7: emit c76 --> main6
+ main6: imm_int 1, %2, --> main5
+ main50: emit c84 --> main49
+ main5: imm_int 2, %3, --> main4
+ main49: imm_int 1, %23, --> main48
+ main48: imm_int 2, %24, --> main47
+ main47: imm_int 3, %25, --> main46
+ main46: imm_int 4, %26, --> main45
+ main45: imm_int 5, %27, --> main44
+ main44: imm_int 6, %28, --> main43
+ main43: imm_int 7, %29, --> main42
+ main42: imm_int 8, %30, --> main41
+ main41: imm_int 9, %31, --> main40
+ main40: call "if_jian", %23, %24, %25, %26, %27, %28, %29, %30, %31, %0: int -> int -> int -> int -> int -> int -> int -> int -> int -> int --> main39
+ main4: imm_int 3, %4, --> main3
+ main39: emit c83 --> main38
+ main38: imm_int 1, %21, --> main37
+ main37: imm_int 2, %22, --> main36
+ main36: call "if_exSimple", %21, %22, %0: int -> int -> int --> main35
+ main35: emit c82 --> main34
+ main34: imm_int 1, %18, --> main33
+ main33: imm_int 2, %19, --> main32
+ main32: imm_int 3, %20, --> main31
+ main31: call "if_imbriq1", %18, %19, %20, %0: int -> int -> int -> int --> main30
+ main30: emit c81 --> main29
+ main3: call "if_ual", %2, %3, %4, %0: int -> int -> int -> int --> main2
+ main29: imm_int 1, %15, --> main28
+ main28: imm_int 2, %16, --> main27
+ main27: imm_int 3, %17, --> main26
+ main26: call "if_imbriq2", %15, %16, %17, %0: int -> int -> int -> int --> main25
+ main25: emit c80 --> main24
+ main24: imm_int 1, %13, --> main23
+ main23: imm_int 2, %14, --> main22
+ main22: call "if_min", %13, %14, %0: int -> int -> int --> main21
+ main21: emit c79 --> main20
+ main20: imm_int 1, %11, --> main19
+ main2: emit c75 --> main1
+ main19: imm_int 2, %12, --> main18
+ main18: call "if_prog", %11, %12, %0: int -> int -> int --> main17
+ main17: emit c78 --> main16
+ main16: imm_int 1, %9, --> main15
+ main15: imm_int 2, %10, --> main14
+ main14: call "if_sansElse", %9, %10, %0: int -> int -> int --> main13
+ main13: emit c77 --> main12
+ main12: imm_int 1, %5, --> main11
+ main11: imm_int 2, %6, --> main10
+ main10: imm_int 3, %7, --> main9
+ main1: mov %1, %0 --> main0
+ main0: return %1
+
+
--- /dev/null
+int if_jian(int a, int b, int c, int d, int e, int f,int g, int x, int y){\r
+ int u,v;\r
+ int t1,t2,t3,t4,t5;\r
+ \r
+ t1 = (a+b)<c;\r
+ t2 = d + e;\r
+ t3 = c + 1;\r
+\r
+ if(y==1){\r
+ if(t1)\r
+ u = t3 +d;\r
+ else if (!x)\r
+ u = t2 + d;\r
+ if(!t1 && x)\r
+ v = t2 + e;\r
+ }\r
+ else{\r
+ t4 = t3 + e;\r
+ t5 = t4 + f;\r
+ u = t5 + g;\r
+ }\r
+ return u;\r
+}\r
+\r
+int if_exSimple (int a, int b) {\r
+ int g;\r
+ if (a<b) {\r
+ int e;\r
+ e = a+b;\r
+ e = 2*e;\r
+ g = e;\r
+ }\r
+ else {\r
+ int f;\r
+ f = 2*b;\r
+ f = f+a;\r
+ g = f+b;\r
+ }\r
+ return g; \r
+}\r
+\r
+int if_imbriq1 (int a, int b, int c) {\r
+ int result;\r
+ if (a < b) {\r
+ if (b < c) {\r
+ result = b;\r
+ }\r
+ else {\r
+ result = c;\r
+ }\r
+ }\r
+ else {\r
+ result = a;\r
+ }\r
+ return result;\r
+}\r
+\r
+int if_imbriq2 (int a, int b, int c) {\r
+ int result;\r
+ if (a < b) {\r
+ if (b < c) {\r
+ result = b;\r
+ }\r
+ else {\r
+ result = 47;\r
+ }\r
+ }\r
+ else {\r
+ result = a;\r
+ }\r
+ return result;\r
+}\r
+\r
+int if_min (int a, int b) {\r
+ int min;\r
+ if (a > b) {\r
+ min=b;\r
+ }\r
+ else {\r
+ min=a;\r
+ }\r
+ return min;\r
+}\r
+\r
+int if_prog(int j,int i){\r
+ int a,b;\r
+ a=i+j;\r
+ if(a<0){\r
+ b=2;\r
+ }\r
+ else {\r
+ b=3;\r
+ }\r
+ return b;\r
+}\r
+\r
+int if_sansElse (int a, int b) {\r
+ int c = 0;\r
+ if (a < b) {\r
+ c = a;\r
+ }\r
+ return c;\r
+}\r
+\r
+int if_test(int a, int b, int x, int y) {\r
+ int c =0, d=0, v=0, w=0, z = 0;\r
+ if (a<b) {\r
+ c = a+b;\r
+ }\r
+ if (x<y) {\r
+ z = x+y;\r
+ w = z+x;\r
+ }\r
+ d = c+1;\r
+ v = c+w;\r
+ return c; \r
+}\r
+\r
+int if_ual (int op, int a, int b) {\r
+ int result;\r
+ if (op == 0) {\r
+ result = a+b;\r
+ }\r
+ else {\r
+ if (op == 1) {\r
+ result = a-b;\r
+ }\r
+ else {\r
+ if (op == 2) {\r
+ result = a&&b;\r
+ }\r
+ else {\r
+ if (op == 3) {\r
+ result = a||b;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+int main(){\r
+ int a;\r
+ a=if_jian(1,2,3,4,5,6,7,8,9);\r
+ a=if_exSimple(1,2);\r
+ a=if_imbriq1(1,2,3);\r
+ a=if_imbriq2(1,2,3);\r
+ a=if_min(1,2);\r
+ a=if_prog(1,2);\r
+ a=if_sansElse(1,2);\r
+ a=if_test(1,2,3,4);\r
+ a=if_ual(1,2,3);\r
+ return a;\r
+}\r
--- /dev/null
+int if_jian(int a, int b, int c, int d, int e, int f,int g, int x, int y){\r
+ int u,v;\r
+ int t1,t2,t3,t4,t5;\r
+ \r
+ t1 = (a+b)<c;\r
+ t2 = d + e;\r
+ t3 = c + 1;\r
+\r
+ if(y==1){\r
+ if(t1)\r
+ u = t3 +d;\r
+ else if (!x)\r
+ u = t2 + d;\r
+ if(!t1 && x)\r
+ v = t2 + e;\r
+ }\r
+ else{\r
+ t4 = t3 + e;\r
+ t5 = t4 + f;\r
+ u = t5 + g;\r
+ }\r
+ return u;\r
+}\r
+\r
+int if_exSimple (int a, int b) {\r
+ int g;\r
+ if (a<b) {\r
+ int e;\r
+ e = a+b;\r
+ e = 2*e;\r
+ g = e;\r
+ }\r
+ else {\r
+ int f;\r
+ f = 2*b;\r
+ f = f+a;\r
+ g = f+b;\r
+ }\r
+ return g; \r
+}\r
+\r
+int if_imbriq1 (int a, int b, int c) {\r
+ int result;\r
+ if (a < b) {\r
+ if (b < c) {\r
+ result = b;\r
+ }\r
+ else {\r
+ result = c;\r
+ }\r
+ }\r
+ else {\r
+ result = a;\r
+ }\r
+ return result;\r
+}\r
+\r
+int if_imbriq2 (int a, int b, int c) {\r
+ int result;\r
+ if (a < b) {\r
+ if (b < c) {\r
+ result = b;\r
+ }\r
+ else {\r
+ result = 47;\r
+ }\r
+ }\r
+ else {\r
+ result = a;\r
+ }\r
+ return result;\r
+}\r
+\r
+int if_min (int a, int b) {\r
+ int min;\r
+ if (a > b) {\r
+ min=b;\r
+ }\r
+ else {\r
+ min=a;\r
+ }\r
+ return min;\r
+}\r
+\r
+int if_prog(int j,int i){\r
+ int a,b;\r
+ a=i+j;\r
+ if(a<0){\r
+ b=2;\r
+ }\r
+ else {\r
+ b=3;\r
+ }\r
+ return b;\r
+}\r
+\r
+int if_sansElse (int a, int b) {\r
+ int c = 0;\r
+ if (a < b) {\r
+ c = a;\r
+ }\r
+ return c;\r
+}\r
+\r
+int if_test(int a, int b, int x, int y) {\r
+ int c =0, d=0, v=0, w=0, z = 0;\r
+ if (a<b) {\r
+ c = a+b;\r
+ }\r
+ if (x<y) {\r
+ z = x+y;\r
+ w = z+x;\r
+ }\r
+ d = c+1;\r
+ v = c+w;\r
+ return c; \r
+}\r
+\r
+int if_ual (int op, int a, int b) {\r
+ int result;\r
+ if (op == 0) {\r
+ result = a+b;\r
+ }\r
+ else {\r
+ if (op == 1) {\r
+ result = a-b;\r
+ }\r
+ else {\r
+ if (op == 2) {\r
+ result = a&&b;\r
+ }\r
+ else {\r
+ if (op == 3) {\r
+ result = a||b;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return result;\r
+}\r
+\r
+int main(){\r
+ int a;\r
+ a=if_jian(1,2,3,4,5,6,7,8,9);\r
+ a=if_exSimple(1,2);\r
+ a=if_imbriq1(1,2,3);\r
+ a=if_imbriq2(1,2,3);\r
+ a=if_min(1,2);\r
+ a=if_prog(1,2);\r
+ a=if_sansElse(1,2);\r
+ a=if_test(1,2,3,4);\r
+ a=if_ual(1,2,3);\r
+ return a;\r
+}\r
--- /dev/null
+Warning (during instrumentation):
+ Clight instrumentation is not implemented yet.
+Checking execution traces...OK.
+ing has cost 0.
+Warning: branching to if_jian12 has cost 1; continuing has cost 3.
+Warning: branching to if_jian13 has cost 2; continuing has cost 3.
+Call(func,stop)
+Regular(seq,stop)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(assign t1,seq)
+Regular(skip,seq)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(assign t2,seq)
+Regular(skip,seq)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(assign t3,seq)
+Regular(skip,seq)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(ifthenelse,seq)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(assign t4,seq)
+Regular(skip,seq)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(assign t5,seq)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(assign u,seq)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(22),call)
+Regular(skip,seq)
+Regular(seq,stop)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(ifthenelse,seq)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(assign e,seq)
+Regular(skip,seq)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(assign e,seq)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(assign g,seq)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(6),call)
+Regular(skip,seq)
+Regular(seq,stop)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(ifthenelse,seq)
+Regular(cost,seq)
+Regular(ifthenelse,seq)
+Regular(cost,seq)
+Regular(assign result,seq)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(seq,stop)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(ifthenelse,seq)
+Regular(cost,seq)
+Regular(ifthenelse,seq)
+Regular(cost,seq)
+Regular(assign result,seq)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(2),call)
+Regular(skip,seq)
+Regular(seq,stop)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(ifthenelse,seq)
+Regular(cost,seq)
+Regular(assign min,seq)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(seq,stop)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(assign a,seq)
+Regular(skip,seq)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(ifthenelse,seq)
+Regular(cost,seq)
+Regular(assign b,seq)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(seq,stop)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(assign c,seq)
+Regular(skip,seq)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(ifthenelse,seq)
+Regular(cost,seq)
+Regular(assign c,seq)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(1),call)
+Regular(skip,seq)
+Regular(seq,stop)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(assign c,seq)
+Regular(skip,seq)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(assign d,seq)
+Regular(skip,seq)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(assign v,seq)
+Regular(skip,seq)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(assign w,seq)
+Regular(skip,seq)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(assign z,seq)
+Regular(skip,seq)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(ifthenelse,seq)
+Regular(cost,seq)
+Regular(assign c,seq)
+Regular(skip,seq)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(ifthenelse,seq)
+Regular(seq,seq)
+Regular(cost,seq)
+Regular(assign z,seq)
+Regular(skip,seq)
+Regular(cost,seq)
+Regular(assign w,seq)
+Regular(skip,seq)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(assign d,seq)
+Regular(skip,seq)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(assign v,seq)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(3),call)
+Regular(skip,seq)
+Regular(seq,stop)
+Regular(cost,seq)
+Regular(call,seq)
+Call(func,call)
+Regular(seq,call)
+Regular(cost,seq)
+Regular(ifthenelse,seq)
+Regular(cost,seq)
+Regular(ifthenelse,seq)
+Regular(cost,seq)
+Regular(assign result,seq)
+Regular(skip,seq)
+Regular(cost,call)
+Regular(return,call)
+Return(Int(-1),call)
+Regular(skip,seq)
+Regular(cost,stop)
+Regular(return,stop)
+Result: Int(-1)
+Memory dump:
+n = 54
+block 1 : Free.
+
+block 2 : Free.
+
+block 3 : Free.
+
+block 4 : Free.
+
+block 5 : Free.
+
+block 6 : Free.
+
+block 7 : Free.
+
+block 8 : Free.
+
+block 9 : Free.
+
+block 10 : Free.
+
+block 11 : Free.
+
+block 12 : Free.
+
+block 13 : Free.
+
+block 14 : Free.
+
+block 15 : Free.
+
+block 16 : Free.
+
+block 17 : Free.
+
+block 18 : Free.
+
+block 19 : Free.
+
+block 20 : Free.
+
+block 21 : Free.
+
+block 22 : Free.
+
+block 23 : Free.
+
+block 24 : Free.
+
+block 25 : Free.
+
+block 26 : Free.
+
+block 27 : Free.
+
+block 28 : Free.
+
+block 29 : Free.
+
+block 30 : Free.
+
+block 31 : Free.
+
+block 32 : Free.
+
+block 33 : Free.
+
+block 34 : Free.
+
+block 35 : Free.
+
+block 36 : Free.
+
+block 37 : Free.
+
+block 38 : Free.
+
+block 39 : Free.
+
+block 40 : Free.
+
+block 41 : Free.
+
+block 42 : Free.
+
+block 43 : Free.
+
+block 44 : Free.
+
+block 45 : Free.
+
+block 46 : Free.
+
+block 47 : Free.
+
+block 48 : Free.
+
+block 49 : Free.
+
+block 50 : Free.
+
+block 51 : Free.
+
+block 52 : Free.
+
+block 53 : Free.
+
+State_call { function() - stop }
+State_regular { seq - stop }
+State_regular { cost - seq::cont }
+State_regular { call - seq::cont }
+State_call { function(Int(1),Int(2),Int(3),Int(4),Int(5),Int(6),Int(7),Int(8),Int(9)) - returnto }
+State_regular { seq - returnto }
+State_regular { cost - seq::cont }
+State_regular { assign - seq::cont }
+State_regular { skip - seq::cont }
+State_regular { seq - returnto }
+State_regular { cost - seq::cont }
+State_regular { assign - seq::cont }
+State_regular { skip - seq::cont }
+State_regular { seq - returnto }
+State_regular { cost - seq::cont }
+State_regular { assign - seq::cont }
+State_regular { skip - seq::cont }
+State_regular { seq - returnto }
+State_regular { cost - cost::cont }
+State_regular { ifthenelse - cost::cont }
+State_regular { seq - cost::cont }
+State_regular { cost - seq::cont }
+State_regular { assign - seq::cont }
+State_regular { skip - seq::cont }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { assign - cost::cont }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { assign - cost::cont }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(22) - returnto }
+State_regular { skip - seq::cont }
+State_regular { seq - stop }
+State_regular { cost - seq::cont }
+State_regular { call - seq::cont }
+State_call { function(Int(1),Int(2)) - returnto }
+State_regular { seq - returnto }
+State_regular { cost - cost::cont }
+State_regular { ifthenelse - cost::cont }
+State_regular { seq - cost::cont }
+State_regular { cost - seq::cont }
+State_regular { assign - seq::cont }
+State_regular { skip - seq::cont }
+State_regular { seq - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { assign - cost::cont }
+State_regular { skip - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { assign - cost::cont }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(6) - returnto }
+State_regular { skip - seq::cont }
+State_regular { seq - stop }
+State_regular { cost - seq::cont }
+State_regular { call - seq::cont }
+State_call { function(Int(1),Int(2),Int(3)) - returnto }
+State_regular { seq - returnto }
+State_regular { cost - cost::cont }
+State_regular { ifthenelse - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { ifthenelse - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { assign - cost::cont }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - seq::cont }
+State_regular { seq - stop }
+State_regular { cost - seq::cont }
+State_regular { call - seq::cont }
+State_call { function(Int(1),Int(2),Int(3)) - returnto }
+State_regular { seq - returnto }
+State_regular { cost - cost::cont }
+State_regular { ifthenelse - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { ifthenelse - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { assign - cost::cont }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(2) - returnto }
+State_regular { skip - seq::cont }
+State_regular { seq - stop }
+State_regular { cost - seq::cont }
+State_regular { call - seq::cont }
+State_call { function(Int(1),Int(2)) - returnto }
+State_regular { seq - returnto }
+State_regular { cost - cost::cont }
+State_regular { ifthenelse - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { assign - cost::cont }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - seq::cont }
+State_regular { seq - stop }
+State_regular { cost - seq::cont }
+State_regular { call - seq::cont }
+State_call { function(Int(1),Int(2)) - returnto }
+State_regular { seq - returnto }
+State_regular { cost - seq::cont }
+State_regular { assign - seq::cont }
+State_regular { skip - seq::cont }
+State_regular { seq - returnto }
+State_regular { cost - cost::cont }
+State_regular { ifthenelse - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { assign - cost::cont }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - seq::cont }
+State_regular { seq - stop }
+State_regular { cost - seq::cont }
+State_regular { call - seq::cont }
+State_call { function(Int(1),Int(2)) - returnto }
+State_regular { seq - returnto }
+State_regular { cost - seq::cont }
+State_regular { assign - seq::cont }
+State_regular { skip - seq::cont }
+State_regular { seq - returnto }
+State_regular { cost - cost::cont }
+State_regular { ifthenelse - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { assign - cost::cont }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(1) - returnto }
+State_regular { skip - seq::cont }
+State_regular { seq - stop }
+State_regular { cost - seq::cont }
+State_regular { call - seq::cont }
+State_call { function(Int(1),Int(2),Int(3),Int(4)) - returnto }
+State_regular { seq - returnto }
+State_regular { cost - seq::cont }
+State_regular { assign - seq::cont }
+State_regular { skip - seq::cont }
+State_regular { seq - returnto }
+State_regular { cost - seq::cont }
+State_regular { assign - seq::cont }
+State_regular { skip - seq::cont }
+State_regular { seq - returnto }
+State_regular { cost - seq::cont }
+State_regular { assign - seq::cont }
+State_regular { skip - seq::cont }
+State_regular { seq - returnto }
+State_regular { cost - seq::cont }
+State_regular { assign - seq::cont }
+State_regular { skip - seq::cont }
+State_regular { seq - returnto }
+State_regular { cost - seq::cont }
+State_regular { assign - seq::cont }
+State_regular { skip - seq::cont }
+State_regular { seq - returnto }
+State_regular { cost - seq::cont }
+State_regular { ifthenelse - seq::cont }
+State_regular { cost - seq::cont }
+State_regular { assign - seq::cont }
+State_regular { skip - seq::cont }
+State_regular { seq - returnto }
+State_regular { cost - seq::cont }
+State_regular { ifthenelse - seq::cont }
+State_regular { seq - seq::cont }
+State_regular { cost - cost::cont }
+State_regular { assign - cost::cont }
+State_regular { skip - cost::cont }
+State_regular { cost - seq::cont }
+State_regular { assign - seq::cont }
+State_regular { skip - seq::cont }
+State_regular { seq - returnto }
+State_regular { cost - seq::cont }
+State_regular { assign - seq::cont }
+State_regular { skip - seq::cont }
+State_regular { seq - returnto }
+State_regular { cost - cost::cont }
+State_regular { assign - cost::cont }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(3) - returnto }
+State_regular { skip - seq::cont }
+State_regular { seq - stop }
+State_regular { cost - cost::cont }
+State_regular { call - cost::cont }
+State_call { function(Int(1),Int(2),Int(3)) - returnto }
+State_regular { seq - returnto }
+State_regular { cost - cost::cont }
+State_regular { ifthenelse - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { ifthenelse - cost::cont }
+State_regular { cost - cost::cont }
+State_regular { assign - cost::cont }
+State_regular { skip - cost::cont }
+State_regular { cost - returnto }
+State_regular { return - returnto }
+State_return { Int(-1) - returnto }
+State_regular { skip - cost::cont }
+State_regular { cost - stop }
+State_regular { return - stop }
+Result: Int(-1)
+Memory dump:
+n = 11
+block 1 : Free.
+
+block 2 : Free.
+
+block 3 : Free.
+
+block 4 : Free.
+
+block 5 : Free.
+
+block 6 : Free.
+
+block 7 : Free.
+
+block 8 : Free.
+
+block 9 : Free.
+
+block 10 : Free.
+
--- /dev/null
+# extern __builtin_varargs_start: int -> void
+# extern __builtin_va_start: int -> int -> void
+# extern __builtin_va_end: int -> void
+# extern __builtin_va_copy: int -> int -> void
+# extern __builtin_va_arg: int -> int -> void
+# extern __builtin_types_compatible_p: int -> int -> int
+# extern __builtin_tanl: float -> float
+# extern __builtin_tanhl: float -> float
+# extern __builtin_tanhf: float -> float
+# extern __builtin_tanh: float -> float
+# extern __builtin_tanf: float -> float
+# extern __builtin_tan: float -> float
+# extern __builtin_strspn: int -> int -> int
+# extern __builtin_strpbrk: int -> int -> int
+# extern __builtin_strncpy: int -> int -> int -> int
+# extern __builtin_strncmp: int -> int -> int -> int
+# extern __builtin_strncat: int -> int -> int -> int
+# extern __builtin_strcspn: int -> int -> int
+# extern __builtin_strcpy: int -> int -> int
+# extern __builtin_strcmp: int -> int -> int
+# extern __builtin_strchr: int -> int -> int
+# extern __builtin_stpcpy: int -> int -> int
+# extern __builtin_stdarg_start: int -> void
+# extern __builtin_sqrtl: float -> float
+# extern __builtin_sqrtf: float -> float
+# extern __builtin_sqrt: float -> float
+# extern __builtin_sinl: float -> float
+# extern __builtin_sinhl: float -> float
+# extern __builtin_sinhf: float -> float
+# extern __builtin_sinh: float -> float
+# extern __builtin_sinf: float -> float
+# extern __builtin_sin: float -> float
+# extern __builtin_return_address: int -> int
+# extern __builtin_return: int -> void
+# extern __builtin_powil: float -> int -> float
+# extern __builtin_powif: float -> int -> float
+# extern __builtin_powi: float -> int -> float
+# extern __builtin_popcountll: int -> int
+# extern __builtin_popcountl: int -> int
+# extern __builtin_popcount: int -> int
+# extern __builtin_parityll: int -> int
+# extern __builtin_parityl: int -> int
+# extern __builtin_parity: int -> int
+# extern __builtin_object_size: int -> int -> int
+# extern __builtin_next_arg: int
+# extern __builtin_nansl: int -> float
+# extern __builtin_nansf: int -> float
+# extern __builtin_nans: int -> float
+# extern __builtin_nanl: int -> float
+# extern __builtin_nanf: int -> float
+# extern __builtin_nan: int -> float
+# extern __builtin_modfl: float -> int -> float
+# extern __builtin_modff: float -> int -> float
+# extern __builtin_mempcpy: int -> int -> int -> int
+# extern __builtin_memcpy: int -> int -> int -> int
+# extern __builtin_logl: float -> float
+# extern __builtin_logf: float -> float
+# extern __builtin_log10l: float -> float
+# extern __builtin_log10f: float -> float
+# extern __builtin_log10: float -> float
+# extern __builtin_log: float -> float
+# extern __builtin_ldexpl: float -> int -> float
+# extern __builtin_ldexpf: float -> int -> float
+# extern __builtin_ldexp: float -> int -> float
+# extern __builtin_infl: float
+# extern __builtin_inff: float
+# extern __builtin_inf: float
+# extern __builtin_huge_vall: float
+# extern __builtin_huge_valf: float
+# extern __builtin_huge_val: float
+# extern __builtin_frexpl: float -> int -> float
+# extern __builtin_frexpf: float -> int -> float
+# extern __builtin_frexp: float -> int -> float
+# extern __builtin_frame_address: int -> int
+# extern __builtin_fmodl: float -> float
+# extern __builtin_fmodf: float -> float
+# extern __builtin_fmod: float -> float
+# extern __builtin_floorl: float -> float
+# extern __builtin_floorf: float -> float
+# extern __builtin_floor: float -> float
+# extern __builtin_ffsll: int -> int
+# extern __builtin_ffsl: int -> int
+# extern __builtin_ffs: int -> int
+# extern __builtin_fabsl: float -> float
+# extern __builtin_fabsf: float -> float
+# extern __builtin_fabs: float -> float
+# extern __builtin_expl: float -> float
+# extern __builtin_expf: float -> float
+# extern __builtin_expect: int -> int -> int
+# extern __builtin_exp: float -> float
+# extern __builtin_ctzll: int -> int
+# extern __builtin_ctzl: int -> int
+# extern __builtin_ctz: int -> int
+# extern __builtin_cosl: float -> float
+# extern __builtin_coshl: float -> float
+# extern __builtin_coshf: float -> float
+# extern __builtin_cosh: float -> float
+# extern __builtin_cosf: float -> float
+# extern __builtin_cos: float -> float
+# extern __builtin_constant_p: int -> int
+# extern __builtin_clzll: int -> int
+# extern __builtin_clzl: int -> int
+# extern __builtin_clz: int -> int
+# extern __builtin_ceill: float -> float
+# extern __builtin_ceilf: float -> float
+# extern __builtin_ceil: float -> float
+# extern __builtin_atanl: float -> float
+# extern __builtin_atanf: float -> float
+# extern __builtin_atan2l: float -> float -> float
+# extern __builtin_atan2f: float -> float -> float
+# extern __builtin_atan2: float -> float -> float
+# extern __builtin_atan: float -> float
+# extern __builtin_asinl: float -> float
+# extern __builtin_asinf: float -> float
+# extern __builtin_asin: float -> float
+# extern __builtin_alloca: int -> int
+# extern __builtin_acosl: float -> float
+# extern __builtin_acosf: float -> float
+# extern __builtin_acos: float -> float
+# extern __builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+# extern __builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+# extern __builtin___vprintf_chk: int -> int -> int -> int
+# extern __builtin___vfprintf_chk: int -> int -> int -> int -> int
+# extern __builtin___strncpy_chk: int -> int -> int -> int -> int
+# extern __builtin___strncat_chk: int -> int -> int -> int -> int
+# extern __builtin___strcpy_chk: int -> int -> int -> int
+# extern __builtin___strcat_chk: int -> int -> int -> int
+# extern __builtin___stpcpy_chk: int -> int -> int -> int
+# extern __builtin___memset_chk: int -> int -> int -> int -> int
+# extern __builtin___mempcpy_chk: int -> int -> int -> int -> int
+# extern __builtin___memmove_chk: int -> int -> int -> int -> int
+# extern __builtin___memcpy_chk: int -> int -> int -> int -> int
+
+# begin preamble
+.data
+globals:
+.space 0
+nl:
+.asciiz "\n"
+.align 2
+.text
+main:
+la $gp, globals
+j main171
+print_int:
+li $v0, 1
+syscall
+jr $ra
+print_intln:
+li $v0, 1
+syscall
+la $a0, nl
+li $v0, 4
+syscall
+jr $ra
+scan_int:
+li $v0, 5
+syscall
+jr $ra
+alloc:
+li $v0, 9
+syscall
+jr $ra
+
+pow2:
+li $v0, 1
+sllv $v0, $v0, $a0
+jr $ra
+
+mod:
+beqz $a0, mod0
+beqz $a1, mod0
+li $t2, 0
+mod_t0:
+bgtz $a0, mod_a0_pos
+neg $t0, $a0
+addi $t2, $t2, 1
+j mod_t1
+mod_a0_pos:
+move $t0, $a0
+mod_t1:
+bgtz $a1, mod_a1_pos
+neg $t1, $a1
+addi $t2, $t2, 2
+j mod_main
+mod_a1_pos:
+move $t1, $a1
+mod_main:
+rem $v0, $t0, $t1
+beqz $t2, mod_exit
+addi $t2, -1
+beqz $t2, mod_case1
+addi $t2, -1
+beqz $t2, mod_case2
+neg $v0, $v0
+j mod_exit
+mod_case1:
+sub $v0, $a1, $v0
+j mod_exit
+mod_case2:
+add $v0, $a1, $v0
+j mod_exit
+mod0:
+li $v0, 0
+mod_exit:
+jr $ra
+
+toint:
+# $a0: size
+# $a1: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+jal pow2
+move $a0, $a1
+move $a1, $v0
+jal mod
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 8
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 16
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+sign_ext:
+# $a0: size
+# $a1: int to extend
+li $v0, 32
+sub $a0, $v0, $a0
+sllv $v0, $a1, $a0
+srav $v0, $v0, $a0
+jr $ra
+
+ofint:
+# $a0: signedness
+# $a1: size
+# $a2: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+beqz $a0, ofint_unsigned
+move $a0, $a1
+move $a1, $a2
+jal sign_ext
+j ofint_exit
+ofint_unsigned:
+move $v0, $a2
+ofint_exit:
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+# end preamble
+
+
+# begin tri
+tri121:
+c12:
+c11:
+c10:
+li $t0, 0
+tri53:
+li $a2, 0
+c9:
+slt $v0, $t0, $a1
+seq $v0, $v0, $zero
+beq $v0, $a2, tri48
+jr $ra
+tri48:
+c7:
+c6:
+li $t1, 1
+tri45:
+li $a2, 0
+c5:
+sub $v0, $a1, $t0
+slt $v0, $t1, $v0
+seq $v0, $v0, $zero
+beq $v0, $a2, tri39
+c8:
+li $v0, 1
+add $t0, $t0, $v0
+j tri53
+tri39:
+c3:
+li $v0, 4
+mulo $v0, $t1, $v0
+add $v0, $a0, $v0
+lw $a3, 0($v0)
+li $v0, 1
+sub $a2, $t1, $v0
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+lw $v0, 0($v0)
+slt $v0, $a3, $v0
+beq $v0, $zero, tri8
+c2:
+li $v0, 1
+sub $a2, $t1, $v0
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+lw $t2, 0($v0)
+c1:
+li $v0, 4
+mulo $v0, $t1, $v0
+add $v0, $a0, $v0
+lw $a3, 0($v0)
+li $v0, 1
+sub $a2, $t1, $v0
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+sw $a3, 0($v0)
+c0:
+li $v0, 4
+mulo $v0, $t1, $v0
+add $v0, $a0, $v0
+sw $t2, 0($v0)
+tri8:
+c4:
+li $v0, 1
+add $t1, $t1, $v0
+j tri45
+# end tri
+
+
+# begin _main
+main171:
+addi $sp, $sp, -44
+sw $ra, 40($sp)
+c24:
+li $a1, 10
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c23:
+li $a2, 9
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c22:
+li $a2, 8
+move $a1, $sp
+li $a0, 2
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c21:
+li $a2, 7
+move $a1, $sp
+li $a0, 3
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c20:
+li $a2, 6
+move $a1, $sp
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c19:
+li $a2, 5
+move $a1, $sp
+li $a0, 5
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c18:
+li $a2, 4
+move $a1, $sp
+li $a0, 6
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c17:
+li $a2, 3
+move $a1, $sp
+li $a0, 7
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c16:
+li $a2, 2
+move $a1, $sp
+li $a0, 8
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c15:
+li $a2, 1
+move $a1, $sp
+li $a0, 9
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c14:
+move $a0, $sp
+li $a1, 10
+la $v0, tri121
+jalr $v0
+c13:
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $sp, $v0
+lw $v0, 0($v0)
+lw $ra, 40($sp)
+addi $sp, $sp, 44
+jr $ra
+# end _main
--- /dev/null
+extern void *__builtin___memcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memmove_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___mempcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memset_chk(void *, int, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___stpcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcat_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strncat_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___strncpy_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern int __builtin___vfprintf_chk(void *, int, unsigned char *, void *);
+
+extern int __builtin___vprintf_chk(int, unsigned char *, void *);
+
+extern int __builtin___vsnprintf_chk(unsigned char *, unsigned int, int, unsigned int, unsigned char *, void *);
+
+extern int __builtin___vsprintf_chk(unsigned char *, int, unsigned int, unsigned char *, void *);
+
+extern double __builtin_acos(double);
+
+extern float __builtin_acosf(float);
+
+extern double __builtin_acosl(double);
+
+extern void *__builtin_alloca(unsigned int);
+
+extern double __builtin_asin(double);
+
+extern float __builtin_asinf(float);
+
+extern double __builtin_asinl(double);
+
+extern double __builtin_atan(double);
+
+extern float __builtin_atanf(float);
+
+extern double __builtin_atanl(double);
+
+extern double __builtin_atan2(double, double);
+
+extern float __builtin_atan2f(float, float);
+
+extern double __builtin_atan2l(double, double);
+
+extern double __builtin_ceil(double);
+
+extern float __builtin_ceilf(float);
+
+extern double __builtin_ceill(double);
+
+extern double __builtin_cos(double);
+
+extern float __builtin_cosf(float);
+
+extern double __builtin_cosl(double);
+
+extern double __builtin_cosh(double);
+
+extern float __builtin_coshf(float);
+
+extern double __builtin_coshl(double);
+
+extern int __builtin_clz(unsigned int);
+
+extern int __builtin_clzl(unsigned int);
+
+extern int __builtin_clzll(unsigned int);
+
+extern int __builtin_constant_p(int);
+
+extern int __builtin_ctz(unsigned int);
+
+extern int __builtin_ctzl(unsigned int);
+
+extern int __builtin_ctzll(unsigned int);
+
+extern double __builtin_exp(double);
+
+extern float __builtin_expf(float);
+
+extern double __builtin_expl(double);
+
+extern int __builtin_expect(int, int);
+
+extern double __builtin_fabs(double);
+
+extern float __builtin_fabsf(float);
+
+extern double __builtin_fabsl(double);
+
+extern int __builtin_ffs(unsigned int);
+
+extern int __builtin_ffsl(unsigned int);
+
+extern int __builtin_ffsll(unsigned int);
+
+extern void *__builtin_frame_address(unsigned int);
+
+extern double __builtin_floor(double);
+
+extern float __builtin_floorf(float);
+
+extern double __builtin_floorl(double);
+
+extern double __builtin_huge_val(void);
+
+extern float __builtin_huge_valf(void);
+
+extern double __builtin_huge_vall(void);
+
+extern double __builtin_inf(void);
+
+extern float __builtin_inff(void);
+
+extern double __builtin_infl(void);
+
+extern void *__builtin_memcpy(void *, void *, unsigned int);
+
+extern void *__builtin_mempcpy(void *, void *, unsigned int);
+
+extern double __builtin_fmod(double);
+
+extern float __builtin_fmodf(float);
+
+extern double __builtin_fmodl(double);
+
+extern double __builtin_frexp(double, int *);
+
+extern float __builtin_frexpf(float, int *);
+
+extern double __builtin_frexpl(double, int *);
+
+extern double __builtin_ldexp(double, int);
+
+extern float __builtin_ldexpf(float, int);
+
+extern double __builtin_ldexpl(double, int);
+
+extern double __builtin_log(double);
+
+extern float __builtin_logf(float);
+
+extern double __builtin_logl(double);
+
+extern double __builtin_log10(double);
+
+extern float __builtin_log10f(float);
+
+extern double __builtin_log10l(double);
+
+extern float __builtin_modff(float, float *);
+
+extern double __builtin_modfl(double, double *);
+
+extern double __builtin_nan(unsigned char *);
+
+extern float __builtin_nanf(unsigned char *);
+
+extern double __builtin_nanl(unsigned char *);
+
+extern double __builtin_nans(unsigned char *);
+
+extern float __builtin_nansf(unsigned char *);
+
+extern double __builtin_nansl(unsigned char *);
+
+extern void *__builtin_next_arg(void);
+
+extern unsigned int __builtin_object_size(void *, int);
+
+extern int __builtin_parity(unsigned int);
+
+extern int __builtin_parityl(unsigned int);
+
+extern int __builtin_parityll(unsigned int);
+
+extern int __builtin_popcount(unsigned int);
+
+extern int __builtin_popcountl(unsigned int);
+
+extern int __builtin_popcountll(unsigned int);
+
+extern double __builtin_powi(double, int);
+
+extern float __builtin_powif(float, int);
+
+extern double __builtin_powil(double, int);
+
+extern void __builtin_return(void *);
+
+extern void *__builtin_return_address(unsigned int);
+
+extern double __builtin_sin(double);
+
+extern float __builtin_sinf(float);
+
+extern double __builtin_sinl(double);
+
+extern double __builtin_sinh(double);
+
+extern float __builtin_sinhf(float);
+
+extern double __builtin_sinhl(double);
+
+extern double __builtin_sqrt(double);
+
+extern float __builtin_sqrtf(float);
+
+extern double __builtin_sqrtl(double);
+
+extern unsigned char *__builtin_stpcpy(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strchr(unsigned char *, unsigned char);
+
+extern int __builtin_strcmp(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strcpy(unsigned char *, unsigned char *);
+
+extern unsigned int __builtin_strcspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strncat(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strncmp(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin_strncpy(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strpbrk(unsigned char *, unsigned char *);
+
+extern int __builtin_types_compatible_p(unsigned int, unsigned int);
+
+extern double __builtin_tan(double);
+
+extern float __builtin_tanf(float);
+
+extern double __builtin_tanl(double);
+
+extern double __builtin_tanh(double);
+
+extern float __builtin_tanhf(float);
+
+extern double __builtin_tanhl(double);
+
+extern void __builtin_va_end(void *);
+
+extern void __builtin_varargs_start(void *);
+
+extern void __builtin_va_start(void *, void *);
+
+extern void __builtin_stdarg_start(void *);
+
+extern void __builtin_va_arg(void *, unsigned int);
+
+extern void __builtin_va_copy(void *, void *);
+
+void tri(int *t, int n)
+{
+ int i;
+ int j;
+ int tmp;
+ c12:
+ tmp = 0;
+ c11:
+ for (({ c10: i = 0; }); (/* c9 */ i < n); ({ c8: i = i + 1; })) {
+ c7:
+ for (({ c6: j = 1; }); (/* c5 */ j < n - i); ({ c4: j = j + 1; })) {
+ c3:
+ if (t[j] < t[(j - 1)]) {
+ c2:
+ tmp = t[(j - 1)];
+ c1:
+ t[(j - 1)] = t[j];
+ c0:
+ t[j] = tmp;
+ }
+ }
+ }
+}
+
+int main(void)
+{
+ int t[10];
+ c24:
+ t[0] = 10;
+ c23:
+ t[1] = 9;
+ c22:
+ t[2] = 8;
+ c21:
+ t[3] = 7;
+ c20:
+ t[4] = 6;
+ c19:
+ t[5] = 5;
+ c18:
+ t[6] = 4;
+ c17:
+ t[7] = 3;
+ c16:
+ t[8] = 2;
+ c15:
+ t[9] = 1;
+ c14:
+ tri(t, 10);
+ c13:
+ return t[0];
+}
+
+
--- /dev/null
+
+
+
+extern "__builtin___memcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memmove_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___mempcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memset_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___stpcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcat_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strncat_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___strncpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vfprintf_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vprintf_chk" : int -> int -> int -> int
+
+
+extern "__builtin___vsnprintf_chk" : int -> int -> int -> int -> int -> int -> int
+
+
+extern "__builtin___vsprintf_chk" : int -> int -> int -> int -> int -> int
+
+
+extern "__builtin_acos" : float -> float
+
+
+extern "__builtin_acosf" : float -> float
+
+
+extern "__builtin_acosl" : float -> float
+
+
+extern "__builtin_alloca" : int -> int
+
+
+extern "__builtin_asin" : float -> float
+
+
+extern "__builtin_asinf" : float -> float
+
+
+extern "__builtin_asinl" : float -> float
+
+
+extern "__builtin_atan" : float -> float
+
+
+extern "__builtin_atanf" : float -> float
+
+
+extern "__builtin_atanl" : float -> float
+
+
+extern "__builtin_atan2" : float -> float -> float
+
+
+extern "__builtin_atan2f" : float -> float -> float
+
+
+extern "__builtin_atan2l" : float -> float -> float
+
+
+extern "__builtin_ceil" : float -> float
+
+
+extern "__builtin_ceilf" : float -> float
+
+
+extern "__builtin_ceill" : float -> float
+
+
+extern "__builtin_cos" : float -> float
+
+
+extern "__builtin_cosf" : float -> float
+
+
+extern "__builtin_cosl" : float -> float
+
+
+extern "__builtin_cosh" : float -> float
+
+
+extern "__builtin_coshf" : float -> float
+
+
+extern "__builtin_coshl" : float -> float
+
+
+extern "__builtin_clz" : int -> int
+
+
+extern "__builtin_clzl" : int -> int
+
+
+extern "__builtin_clzll" : int -> int
+
+
+extern "__builtin_constant_p" : int -> int
+
+
+extern "__builtin_ctz" : int -> int
+
+
+extern "__builtin_ctzl" : int -> int
+
+
+extern "__builtin_ctzll" : int -> int
+
+
+extern "__builtin_exp" : float -> float
+
+
+extern "__builtin_expf" : float -> float
+
+
+extern "__builtin_expl" : float -> float
+
+
+extern "__builtin_expect" : int -> int -> int
+
+
+extern "__builtin_fabs" : float -> float
+
+
+extern "__builtin_fabsf" : float -> float
+
+
+extern "__builtin_fabsl" : float -> float
+
+
+extern "__builtin_ffs" : int -> int
+
+
+extern "__builtin_ffsl" : int -> int
+
+
+extern "__builtin_ffsll" : int -> int
+
+
+extern "__builtin_frame_address" : int -> int
+
+
+extern "__builtin_floor" : float -> float
+
+
+extern "__builtin_floorf" : float -> float
+
+
+extern "__builtin_floorl" : float -> float
+
+
+extern "__builtin_huge_val" : float
+
+
+extern "__builtin_huge_valf" : float
+
+
+extern "__builtin_huge_vall" : float
+
+
+extern "__builtin_inf" : float
+
+
+extern "__builtin_inff" : float
+
+
+extern "__builtin_infl" : float
+
+
+extern "__builtin_memcpy" : int -> int -> int -> int
+
+
+extern "__builtin_mempcpy" : int -> int -> int -> int
+
+
+extern "__builtin_fmod" : float -> float
+
+
+extern "__builtin_fmodf" : float -> float
+
+
+extern "__builtin_fmodl" : float -> float
+
+
+extern "__builtin_frexp" : float -> int -> float
+
+
+extern "__builtin_frexpf" : float -> int -> float
+
+
+extern "__builtin_frexpl" : float -> int -> float
+
+
+extern "__builtin_ldexp" : float -> int -> float
+
+
+extern "__builtin_ldexpf" : float -> int -> float
+
+
+extern "__builtin_ldexpl" : float -> int -> float
+
+
+extern "__builtin_log" : float -> float
+
+
+extern "__builtin_logf" : float -> float
+
+
+extern "__builtin_logl" : float -> float
+
+
+extern "__builtin_log10" : float -> float
+
+
+extern "__builtin_log10f" : float -> float
+
+
+extern "__builtin_log10l" : float -> float
+
+
+extern "__builtin_modff" : float -> int -> float
+
+
+extern "__builtin_modfl" : float -> int -> float
+
+
+extern "__builtin_nan" : int -> float
+
+
+extern "__builtin_nanf" : int -> float
+
+
+extern "__builtin_nanl" : int -> float
+
+
+extern "__builtin_nans" : int -> float
+
+
+extern "__builtin_nansf" : int -> float
+
+
+extern "__builtin_nansl" : int -> float
+
+
+extern "__builtin_next_arg" : int
+
+
+extern "__builtin_object_size" : int -> int -> int
+
+
+extern "__builtin_parity" : int -> int
+
+
+extern "__builtin_parityl" : int -> int
+
+
+extern "__builtin_parityll" : int -> int
+
+
+extern "__builtin_popcount" : int -> int
+
+
+extern "__builtin_popcountl" : int -> int
+
+
+extern "__builtin_popcountll" : int -> int
+
+
+extern "__builtin_powi" : float -> int -> float
+
+
+extern "__builtin_powif" : float -> int -> float
+
+
+extern "__builtin_powil" : float -> int -> float
+
+
+extern "__builtin_return" : int -> void
+
+
+extern "__builtin_return_address" : int -> int
+
+
+extern "__builtin_sin" : float -> float
+
+
+extern "__builtin_sinf" : float -> float
+
+
+extern "__builtin_sinl" : float -> float
+
+
+extern "__builtin_sinh" : float -> float
+
+
+extern "__builtin_sinhf" : float -> float
+
+
+extern "__builtin_sinhl" : float -> float
+
+
+extern "__builtin_sqrt" : float -> float
+
+
+extern "__builtin_sqrtf" : float -> float
+
+
+extern "__builtin_sqrtl" : float -> float
+
+
+extern "__builtin_stpcpy" : int -> int -> int
+
+
+extern "__builtin_strchr" : int -> int -> int
+
+
+extern "__builtin_strcmp" : int -> int -> int
+
+
+extern "__builtin_strcpy" : int -> int -> int
+
+
+extern "__builtin_strcspn" : int -> int -> int
+
+
+extern "__builtin_strncat" : int -> int -> int -> int
+
+
+extern "__builtin_strncmp" : int -> int -> int -> int
+
+
+extern "__builtin_strncpy" : int -> int -> int -> int
+
+
+extern "__builtin_strspn" : int -> int -> int
+
+
+extern "__builtin_strpbrk" : int -> int -> int
+
+
+extern "__builtin_types_compatible_p" : int -> int -> int
+
+
+extern "__builtin_tan" : float -> float
+
+
+extern "__builtin_tanf" : float -> float
+
+
+extern "__builtin_tanl" : float -> float
+
+
+extern "__builtin_tanh" : float -> float
+
+
+extern "__builtin_tanhf" : float -> float
+
+
+extern "__builtin_tanhl" : float -> float
+
+
+extern "__builtin_va_end" : int -> void
+
+
+extern "__builtin_varargs_start" : int -> void
+
+
+extern "__builtin_va_start" : int -> int -> void
+
+
+extern "__builtin_stdarg_start" : int -> void
+
+
+extern "__builtin_va_arg" : int -> int -> void
+
+
+extern "__builtin_va_copy" : int -> int -> void
+
+
+"tri" (t, n) : int -> int -> void {
+
+ stack 0;
+
+ var tmp, j, i;
+
+ c12:
+ tmp = 0;
+ c11:
+ c10:
+ i = 0;
+ block {
+ loop {
+ if (!(/* c9 */ i < n)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c7:
+ c6:
+ j = 1;
+ block {
+ loop {
+ if (!(/* c5 */ j < (n - i))) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c3:
+ if (int32[t + (j * 4)] < int32[t + ((j - 1) * 4)]) {
+ c2:
+ tmp = int32[t + ((j - 1) * 4)];
+ c1:
+ int32[t + ((j - 1) * 4)] = int32[t + (j * 4)];
+ c0:
+ int32[t + (j * 4)] = tmp;
+ }
+ else {
+ }
+ }
+ c4:
+ j = j + 1;
+ }
+ }
+ }
+ c8:
+ i = i + 1;
+ }
+ }
+
+}
+
+
+"main" () : int {
+
+ stack 40;
+
+ c24:
+ int32[&0 + (0 * 4)] = 10;
+ c23:
+ int32[&0 + (1 * 4)] = 9;
+ c22:
+ int32[&0 + (2 * 4)] = 8;
+ c21:
+ int32[&0 + (3 * 4)] = 7;
+ c20:
+ int32[&0 + (4 * 4)] = 6;
+ c19:
+ int32[&0 + (5 * 4)] = 5;
+ c18:
+ int32[&0 + (6 * 4)] = 4;
+ c17:
+ int32[&0 + (7 * 4)] = 3;
+ c16:
+ int32[&0 + (8 * 4)] = 2;
+ c15:
+ int32[&0 + (9 * 4)] = 1;
+ c14:
+ "tri"(&0, 10) : int -> int -> void;
+ c13:
+ return int32[&0 + (0 * 4)];
+
+}
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure tri(2)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53
+entry tri121
+tri121: newframe --> tri120
+tri120: move %53, $ra --> tri119
+tri119: move %52, $s7 --> tri118
+tri118: move %51, $s6 --> tri117
+tri117: move %50, $s5 --> tri116
+tri116: move %49, $s4 --> tri115
+tri115: move %48, $s3 --> tri114
+tri114: move %47, $s2 --> tri113
+tri113: move %46, $s1 --> tri112
+tri112: move %45, $s0 --> tri111
+tri111: move %0, $a0 --> tri110
+tri110: move %1, $a1 --> tri109
+tri109: li %2, 0 --> tri108
+tri108: li %3, 0 --> tri107
+tri107: li %4, 0 --> tri106
+tri106: li %5, 0 --> tri105
+tri105: li %6, 0 --> tri104
+tri104: li %7, 0 --> tri103
+tri103: li %8, 0 --> tri102
+tri102: li %9, 0 --> tri101
+tri101: li %10, 0 --> tri100
+tri100: li %11, 0 --> tri99
+tri99 : li %12, 0 --> tri98
+tri98 : li %13, 0 --> tri97
+tri97 : li %14, 0 --> tri96
+tri96 : li %15, 0 --> tri95
+tri95 : li %16, 0 --> tri94
+tri94 : li %17, 0 --> tri93
+tri93 : li %18, 0 --> tri92
+tri92 : li %19, 0 --> tri91
+tri91 : li %20, 0 --> tri90
+tri90 : li %21, 0 --> tri89
+tri89 : li %22, 0 --> tri88
+tri88 : li %23, 0 --> tri87
+tri87 : li %24, 0 --> tri86
+tri86 : li %25, 0 --> tri85
+tri85 : li %26, 0 --> tri84
+tri84 : li %27, 0 --> tri83
+tri83 : li %28, 0 --> tri82
+tri82 : li %29, 0 --> tri81
+tri81 : li %30, 0 --> tri80
+tri80 : li %31, 0 --> tri79
+tri79 : li %32, 0 --> tri78
+tri78 : li %33, 0 --> tri77
+tri77 : li %34, 0 --> tri76
+tri76 : li %35, 0 --> tri75
+tri75 : li %36, 0 --> tri74
+tri74 : li %37, 0 --> tri73
+tri73 : li %38, 0 --> tri72
+tri72 : li %39, 0 --> tri71
+tri71 : li %40, 0 --> tri70
+tri70 : li %41, 0 --> tri69
+tri69 : li %42, 0 --> tri68
+tri68 : li %43, 0 --> tri67
+tri67 : li %44, 0 --> tri58
+tri58 : emit c12 --> tri57
+tri57 : li %2, 0 --> tri56
+tri56 : emit c11 --> tri55
+tri55 : emit c10 --> tri54
+tri54 : li %4, 0 --> tri1
+tri1 : j --> tri53
+tri53 : li %35, 0 --> tri52
+tri52 : emit c9 --> tri51
+tri51 : slt %36, %4, %1 --> tri50
+tri50 : li %43, 0 --> tri65
+tri65 : seq %34, %36, %43 --> tri49
+tri49 : beq %34, %35 --> tri48, tri0
+tri0 : j --> tri132
+tri132: move $ra, %53 --> tri131
+tri131: move $s7, %52 --> tri130
+tri130: move $s6, %51 --> tri129
+tri129: move $s5, %50 --> tri128
+tri128: move $s4, %49 --> tri127
+tri127: move $s3, %48 --> tri126
+tri126: move $s2, %47 --> tri125
+tri125: move $s1, %46 --> tri124
+tri124: move $s0, %45 --> tri123
+tri123: delframe --> tri122
+tri122: jr $ra
+tri48 : emit c7 --> tri47
+tri47 : emit c6 --> tri46
+tri46 : li %3, 1 --> tri5
+tri5 : j --> tri45
+tri45 : li %31, 0 --> tri44
+tri44 : emit c5 --> tri43
+tri43 : sub %33, %1, %4 --> tri42
+tri42 : slt %32, %3, %33 --> tri41
+tri41 : li %42, 0 --> tri64
+tri64 : seq %30, %32, %42 --> tri40
+tri40 : beq %30, %31 --> tri39, tri4
+tri4 : emit c8 --> tri3
+tri3 : li %5, 1 --> tri2
+tri2 : add %4, %4, %5 --> tri1
+tri39 : emit c3 --> tri38
+tri38 : li %21, 0 --> tri37
+tri37 : li %29, 4 --> tri36
+tri36 : mulo %28, %3, %29 --> tri35
+tri35 : add %41, %0, %28 --> tri63
+tri63 : lw %22, 0(%41) --> tri34
+tri34 : li %27, 1 --> tri33
+tri33 : sub %25, %3, %27 --> tri32
+tri32 : li %26, 4 --> tri31
+tri31 : mulo %24, %25, %26 --> tri30
+tri30 : add %40, %0, %24 --> tri62
+tri62 : lw %23, 0(%40) --> tri29
+tri29 : slt %20, %22, %23 --> tri28
+tri28 : beq %20, %21 --> tri8, tri27
+tri27 : emit c2 --> tri26
+tri26 : li %19, 1 --> tri25
+tri25 : sub %17, %3, %19 --> tri24
+tri24 : li %18, 4 --> tri23
+tri23 : mulo %16, %17, %18 --> tri22
+tri22 : add %39, %0, %16 --> tri61
+tri61 : lw %2, 0(%39) --> tri21
+tri21 : emit c1 --> tri20
+tri20 : li %15, 4 --> tri19
+tri19 : mulo %14, %3, %15 --> tri18
+tri18 : add %38, %0, %14 --> tri60
+tri60 : lw %9, 0(%38) --> tri17
+tri17 : li %13, 1 --> tri16
+tri16 : sub %11, %3, %13 --> tri15
+tri15 : li %12, 4 --> tri14
+tri14 : mulo %10, %11, %12 --> tri13
+tri13 : add %37, %0, %10 --> tri59
+tri59 : sw %9, 0(%37) --> tri12
+tri12 : emit c0 --> tri11
+tri11 : li %8, 4 --> tri10
+tri10 : mulo %7, %3, %8 --> tri9
+tri9 : add %44, %0, %7 --> tri66
+tri66 : sw %2, 0(%44) --> tri8
+tri8 : emit c4 --> tri7
+tri7 : li %6, 1 --> tri6
+tri6 : add %3, %3, %6 --> tri5
+
+procedure _main(0)
+stacksize 40
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78
+entry main171
+main171: newframe --> main170
+main170: move %78, $ra --> main169
+main169: move %77, $s7 --> main168
+main168: move %76, $s6 --> main167
+main167: move %75, $s5 --> main166
+main166: move %74, $s4 --> main165
+main165: move %73, $s3 --> main164
+main164: move %72, $s2 --> main163
+main163: move %71, $s1 --> main162
+main162: move %70, $s0 --> main161
+main161: li %1, 0 --> main160
+main160: li %2, 0 --> main159
+main159: li %3, 0 --> main158
+main158: li %4, 0 --> main157
+main157: li %5, 0 --> main156
+main156: li %6, 0 --> main155
+main155: li %7, 0 --> main154
+main154: li %8, 0 --> main153
+main153: li %9, 0 --> main152
+main152: li %10, 0 --> main151
+main151: li %11, 0 --> main150
+main150: li %12, 0 --> main149
+main149: li %13, 0 --> main148
+main148: li %14, 0 --> main147
+main147: li %15, 0 --> main146
+main146: li %16, 0 --> main145
+main145: li %17, 0 --> main144
+main144: li %18, 0 --> main143
+main143: li %19, 0 --> main142
+main142: li %20, 0 --> main141
+main141: li %21, 0 --> main140
+main140: li %22, 0 --> main139
+main139: li %23, 0 --> main138
+main138: li %24, 0 --> main137
+main137: li %25, 0 --> main136
+main136: li %26, 0 --> main135
+main135: li %27, 0 --> main134
+main134: li %28, 0 --> main133
+main133: li %29, 0 --> main132
+main132: li %30, 0 --> main131
+main131: li %31, 0 --> main130
+main130: li %32, 0 --> main129
+main129: li %33, 0 --> main128
+main128: li %34, 0 --> main127
+main127: li %35, 0 --> main126
+main126: li %36, 0 --> main125
+main125: li %37, 0 --> main124
+main124: li %38, 0 --> main123
+main123: li %39, 0 --> main122
+main122: li %40, 0 --> main121
+main121: li %41, 0 --> main120
+main120: li %42, 0 --> main119
+main119: li %43, 0 --> main118
+main118: li %44, 0 --> main117
+main117: li %45, 0 --> main116
+main116: li %46, 0 --> main115
+main115: li %47, 0 --> main114
+main114: li %48, 0 --> main113
+main113: li %49, 0 --> main112
+main112: li %50, 0 --> main111
+main111: li %51, 0 --> main110
+main110: li %52, 0 --> main109
+main109: li %53, 0 --> main108
+main108: li %54, 0 --> main107
+main107: li %55, 0 --> main106
+main106: li %56, 0 --> main105
+main105: li %57, 0 --> main104
+main104: li %58, 0 --> main103
+main103: li %59, 0 --> main102
+main102: li %60, 0 --> main101
+main101: li %61, 0 --> main100
+main100: li %62, 0 --> main99
+main99 : li %63, 0 --> main98
+main98 : li %64, 0 --> main97
+main97 : li %65, 0 --> main96
+main96 : li %66, 0 --> main95
+main95 : li %67, 0 --> main94
+main94 : li %68, 0 --> main93
+main93 : li %69, 0 --> main80
+main80 : emit c24 --> main79
+main79 : li %53, 10 --> main78
+main78 : move %54, $sp --> main194
+main194: move %54, %54 --> main77
+main77 : li %56, 0 --> main76
+main76 : li %57, 4 --> main75
+main75 : mulo %55, %56, %57 --> main74
+main74 : add %69, %54, %55 --> main92
+main92 : sw %53, 0(%69) --> main73
+main73 : emit c23 --> main72
+main72 : li %48, 9 --> main71
+main71 : move %49, $sp --> main193
+main193: move %49, %49 --> main70
+main70 : li %51, 1 --> main69
+main69 : li %52, 4 --> main68
+main68 : mulo %50, %51, %52 --> main67
+main67 : add %67, %49, %50 --> main90
+main90 : sw %48, 0(%67) --> main66
+main66 : emit c22 --> main65
+main65 : li %43, 8 --> main64
+main64 : move %44, $sp --> main192
+main192: move %44, %44 --> main63
+main63 : li %46, 2 --> main62
+main62 : li %47, 4 --> main61
+main61 : mulo %45, %46, %47 --> main60
+main60 : add %66, %44, %45 --> main89
+main89 : sw %43, 0(%66) --> main59
+main59 : emit c21 --> main58
+main58 : li %38, 7 --> main57
+main57 : move %39, $sp --> main191
+main191: move %39, %39 --> main56
+main56 : li %41, 3 --> main55
+main55 : li %42, 4 --> main54
+main54 : mulo %40, %41, %42 --> main53
+main53 : add %65, %39, %40 --> main88
+main88 : sw %38, 0(%65) --> main52
+main52 : emit c20 --> main51
+main51 : li %33, 6 --> main50
+main50 : move %34, $sp --> main190
+main190: move %34, %34 --> main49
+main49 : li %36, 4 --> main48
+main48 : li %37, 4 --> main47
+main47 : mulo %35, %36, %37 --> main46
+main46 : add %64, %34, %35 --> main87
+main87 : sw %33, 0(%64) --> main45
+main45 : emit c19 --> main44
+main44 : li %28, 5 --> main43
+main43 : move %29, $sp --> main188
+main188: move %29, %29 --> main42
+main42 : li %31, 5 --> main41
+main41 : li %32, 4 --> main40
+main40 : mulo %30, %31, %32 --> main39
+main39 : add %63, %29, %30 --> main86
+main86 : sw %28, 0(%63) --> main38
+main38 : emit c18 --> main37
+main37 : li %23, 4 --> main36
+main36 : move %24, $sp --> main187
+main187: move %24, %24 --> main35
+main35 : li %26, 6 --> main34
+main34 : li %27, 4 --> main33
+main33 : mulo %25, %26, %27 --> main32
+main32 : add %62, %24, %25 --> main85
+main85 : sw %23, 0(%62) --> main31
+main31 : emit c17 --> main30
+main30 : li %18, 3 --> main29
+main29 : move %19, $sp --> main186
+main186: move %19, %19 --> main28
+main28 : li %21, 7 --> main27
+main27 : li %22, 4 --> main26
+main26 : mulo %20, %21, %22 --> main25
+main25 : add %61, %19, %20 --> main84
+main84 : sw %18, 0(%61) --> main24
+main24 : emit c16 --> main23
+main23 : li %13, 2 --> main22
+main22 : move %14, $sp --> main185
+main185: move %14, %14 --> main21
+main21 : li %16, 8 --> main20
+main20 : li %17, 4 --> main19
+main19 : mulo %15, %16, %17 --> main18
+main18 : add %60, %14, %15 --> main83
+main83 : sw %13, 0(%60) --> main17
+main17 : emit c15 --> main16
+main16 : li %8, 1 --> main15
+main15 : move %9, $sp --> main184
+main184: move %9, %9 --> main14
+main14 : li %11, 9 --> main13
+main13 : li %12, 4 --> main12
+main12 : mulo %10, %11, %12 --> main11
+main11 : add %59, %9, %10 --> main82
+main82 : sw %8, 0(%59) --> main10
+main10 : emit c14 --> main9
+main9 : move %5, $sp --> main195
+main195: move %5, %5 --> main8
+main8 : li %6, 10 --> main7
+main7 : la %68, tri --> main91
+main91 : j --> main199
+main199: move $a0, %5 --> main198
+main198: move $a1, %6 --> main197
+main197: call %68(2) --> main196
+main196: move %7, $v0 --> main6
+main6 : emit c13 --> main5
+main5 : move %1, $sp --> main189
+main189: move %1, %1 --> main4
+main4 : li %3, 0 --> main3
+main3 : li %4, 4 --> main2
+main2 : mulo %2, %3, %4 --> main1
+main1 : add %58, %1, %2 --> main81
+main81 : lw %0, 0(%58) --> main0
+main0 : j --> main183
+main183: move $v0, %0 --> main182
+main182: move $ra, %78 --> main181
+main181: move $s7, %77 --> main180
+main180: move $s6, %76 --> main179
+main179: move $s5, %75 --> main178
+main178: move $s4, %74 --> main177
+main177: move $s3, %73 --> main176
+main176: move $s2, %72 --> main175
+main175: move $s1, %71 --> main174
+main174: move $s0, %70 --> main173
+main173: delframe --> main172
+main172: jr $ra (xmits $v0)
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure tri(2)
+var 0
+tri121:
+newframe
+c12:
+c11:
+c10:
+li $t0, 0
+tri53:
+li $a2, 0
+c9:
+slt $v0, $t0, $a1
+seq $v0, $v0, $zero
+beq $v0, $a2, tri48
+delframe
+jr $ra
+tri48:
+c7:
+c6:
+li $t1, 1
+tri45:
+li $a2, 0
+c5:
+sub $v0, $a1, $t0
+slt $v0, $t1, $v0
+seq $v0, $v0, $zero
+beq $v0, $a2, tri39
+c8:
+li $v0, 1
+add $t0, $t0, $v0
+j tri53
+tri39:
+c3:
+li $v0, 4
+mulo $v0, $t1, $v0
+add $v0, $a0, $v0
+lw $a3, 0($v0)
+li $v0, 1
+sub $a2, $t1, $v0
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+lw $v0, 0($v0)
+slt $v0, $a3, $v0
+beq $v0, $zero, tri8
+c2:
+li $v0, 1
+sub $a2, $t1, $v0
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+lw $t2, 0($v0)
+c1:
+li $v0, 4
+mulo $v0, $t1, $v0
+add $v0, $a0, $v0
+lw $a3, 0($v0)
+li $v0, 1
+sub $a2, $t1, $v0
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+sw $a3, 0($v0)
+c0:
+li $v0, 4
+mulo $v0, $t1, $v0
+add $v0, $a0, $v0
+sw $t2, 0($v0)
+tri8:
+c4:
+li $v0, 1
+add $t1, $t1, $v0
+j tri45
+
+procedure _main(0)
+var 44
+main171:
+newframe
+sw $ra, 40($sp)
+c24:
+li $a1, 10
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c23:
+li $a2, 9
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c22:
+li $a2, 8
+move $a1, $sp
+li $a0, 2
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c21:
+li $a2, 7
+move $a1, $sp
+li $a0, 3
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c20:
+li $a2, 6
+move $a1, $sp
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c19:
+li $a2, 5
+move $a1, $sp
+li $a0, 5
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c18:
+li $a2, 4
+move $a1, $sp
+li $a0, 6
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c17:
+li $a2, 3
+move $a1, $sp
+li $a0, 7
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c16:
+li $a2, 2
+move $a1, $sp
+li $a0, 8
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c15:
+li $a2, 1
+move $a1, $sp
+li $a0, 9
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $a2, 0($v0)
+c14:
+move $a0, $sp
+li $a1, 10
+la $v0, tri
+call $v0
+c13:
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $sp, $v0
+lw $v0, 0($v0)
+lw $ra, 40($sp)
+delframe
+jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure tri(2)
+var 0
+entry tri121
+tri121: newframe --> tri120
+tri120: j --> tri119
+tri119: j --> tri118
+tri118: j --> tri117
+tri117: j --> tri116
+tri116: j --> tri115
+tri115: j --> tri114
+tri114: j --> tri113
+tri113: j --> tri112
+tri112: j --> tri111
+tri111: j --> tri110
+tri110: j --> tri109
+tri109: j --> tri108
+tri108: j --> tri107
+tri107: j --> tri106
+tri106: j --> tri105
+tri105: j --> tri104
+tri104: j --> tri103
+tri103: j --> tri102
+tri102: j --> tri101
+tri101: j --> tri100
+tri100: j --> tri99
+tri99 : j --> tri98
+tri98 : j --> tri97
+tri97 : j --> tri96
+tri96 : j --> tri95
+tri95 : j --> tri94
+tri94 : j --> tri93
+tri93 : j --> tri92
+tri92 : j --> tri91
+tri91 : j --> tri90
+tri90 : j --> tri89
+tri89 : j --> tri88
+tri88 : j --> tri87
+tri87 : j --> tri86
+tri86 : j --> tri85
+tri85 : j --> tri84
+tri84 : j --> tri83
+tri83 : j --> tri82
+tri82 : j --> tri81
+tri81 : j --> tri80
+tri80 : j --> tri79
+tri79 : j --> tri78
+tri78 : j --> tri77
+tri77 : j --> tri76
+tri76 : j --> tri75
+tri75 : j --> tri74
+tri74 : j --> tri73
+tri73 : j --> tri72
+tri72 : j --> tri71
+tri71 : j --> tri70
+tri70 : j --> tri69
+tri69 : j --> tri68
+tri68 : j --> tri67
+tri67 : j --> tri58
+tri58 : emit c12 --> tri57
+tri57 : j --> tri56
+tri56 : emit c11 --> tri55
+tri55 : emit c10 --> tri54
+tri54 : li $t0, 0 --> tri1
+tri1 : j --> tri53
+tri53 : li $a2, 0 --> tri52
+tri52 : emit c9 --> tri51
+tri51 : slt $v0, $t0, $a1 --> tri50
+tri50 : j --> tri65
+tri65 : seq $v0, $v0, $zero --> tri49
+tri49 : beq $v0, $a2 --> tri48, tri0
+tri0 : j --> tri132
+tri132: j --> tri131
+tri131: j --> tri130
+tri130: j --> tri129
+tri129: j --> tri128
+tri128: j --> tri127
+tri127: j --> tri126
+tri126: j --> tri125
+tri125: j --> tri124
+tri124: j --> tri123
+tri123: delframe --> tri122
+tri122: jr $ra
+tri48 : emit c7 --> tri47
+tri47 : emit c6 --> tri46
+tri46 : li $t1, 1 --> tri5
+tri5 : j --> tri45
+tri45 : li $a2, 0 --> tri44
+tri44 : emit c5 --> tri43
+tri43 : sub $v0, $a1, $t0 --> tri42
+tri42 : slt $v0, $t1, $v0 --> tri41
+tri41 : j --> tri64
+tri64 : seq $v0, $v0, $zero --> tri40
+tri40 : beq $v0, $a2 --> tri39, tri4
+tri4 : emit c8 --> tri3
+tri3 : li $v0, 1 --> tri2
+tri2 : add $t0, $t0, $v0 --> tri1
+tri39 : emit c3 --> tri38
+tri38 : j --> tri37
+tri37 : li $v0, 4 --> tri36
+tri36 : mulo $v0, $t1, $v0 --> tri35
+tri35 : add $v0, $a0, $v0 --> tri63
+tri63 : lw $a3, 0($v0) --> tri34
+tri34 : li $v0, 1 --> tri33
+tri33 : sub $a2, $t1, $v0 --> tri32
+tri32 : li $v0, 4 --> tri31
+tri31 : mulo $v0, $a2, $v0 --> tri30
+tri30 : add $v0, $a0, $v0 --> tri62
+tri62 : lw $v0, 0($v0) --> tri29
+tri29 : slt $v0, $a3, $v0 --> tri28
+tri28 : beq $v0, $zero --> tri8, tri27
+tri27 : emit c2 --> tri26
+tri26 : li $v0, 1 --> tri25
+tri25 : sub $a2, $t1, $v0 --> tri24
+tri24 : li $v0, 4 --> tri23
+tri23 : mulo $v0, $a2, $v0 --> tri22
+tri22 : add $v0, $a0, $v0 --> tri61
+tri61 : lw $t2, 0($v0) --> tri21
+tri21 : emit c1 --> tri20
+tri20 : li $v0, 4 --> tri19
+tri19 : mulo $v0, $t1, $v0 --> tri18
+tri18 : add $v0, $a0, $v0 --> tri60
+tri60 : lw $a3, 0($v0) --> tri17
+tri17 : li $v0, 1 --> tri16
+tri16 : sub $a2, $t1, $v0 --> tri15
+tri15 : li $v0, 4 --> tri14
+tri14 : mulo $v0, $a2, $v0 --> tri13
+tri13 : add $v0, $a0, $v0 --> tri59
+tri59 : lw $a3, 0($v0) --> tri12
+tri12 : emit c0 --> tri11
+tri11 : li $v0, 4 --> tri10
+tri10 : mulo $v0, $t1, $v0 --> tri9
+tri9 : add $v0, $a0, $v0 --> tri66
+tri66 : lw $t2, 0($v0) --> tri8
+tri8 : emit c4 --> tri7
+tri7 : li $v0, 1 --> tri6
+tri6 : add $t1, $t1, $v0 --> tri5
+
+procedure _main(0)
+var 44
+entry main171
+main171: newframe --> main170
+main170: lw $ra, 40($sp) --> main169
+main169: j --> main168
+main168: j --> main167
+main167: j --> main166
+main166: j --> main165
+main165: j --> main164
+main164: j --> main163
+main163: j --> main162
+main162: j --> main161
+main161: j --> main160
+main160: j --> main159
+main159: j --> main158
+main158: j --> main157
+main157: j --> main156
+main156: j --> main155
+main155: j --> main154
+main154: j --> main153
+main153: j --> main152
+main152: j --> main151
+main151: j --> main150
+main150: j --> main149
+main149: j --> main148
+main148: j --> main147
+main147: j --> main146
+main146: j --> main145
+main145: j --> main144
+main144: j --> main143
+main143: j --> main142
+main142: j --> main141
+main141: j --> main140
+main140: j --> main139
+main139: j --> main138
+main138: j --> main137
+main137: j --> main136
+main136: j --> main135
+main135: j --> main134
+main134: j --> main133
+main133: j --> main132
+main132: j --> main131
+main131: j --> main130
+main130: j --> main129
+main129: j --> main128
+main128: j --> main127
+main127: j --> main126
+main126: j --> main125
+main125: j --> main124
+main124: j --> main123
+main123: j --> main122
+main122: j --> main121
+main121: j --> main120
+main120: j --> main119
+main119: j --> main118
+main118: j --> main117
+main117: j --> main116
+main116: j --> main115
+main115: j --> main114
+main114: j --> main113
+main113: j --> main112
+main112: j --> main111
+main111: j --> main110
+main110: j --> main109
+main109: j --> main108
+main108: j --> main107
+main107: j --> main106
+main106: j --> main105
+main105: j --> main104
+main104: j --> main103
+main103: j --> main102
+main102: j --> main101
+main101: j --> main100
+main100: j --> main99
+main99 : j --> main98
+main98 : j --> main97
+main97 : j --> main96
+main96 : j --> main95
+main95 : j --> main94
+main94 : j --> main93
+main93 : j --> main80
+main80 : emit c24 --> main79
+main79 : li $a1, 10 --> main78
+main78 : move $a0, $sp --> main194
+main194: j --> main77
+main77 : j --> main76
+main76 : li $v0, 4 --> main75
+main75 : mulo $v0, $zero, $v0 --> main74
+main74 : add $v0, $a0, $v0 --> main92
+main92 : lw $a1, 0($v0) --> main73
+main73 : emit c23 --> main72
+main72 : li $a2, 9 --> main71
+main71 : move $a1, $sp --> main193
+main193: j --> main70
+main70 : li $a0, 1 --> main69
+main69 : li $v0, 4 --> main68
+main68 : mulo $v0, $a0, $v0 --> main67
+main67 : add $v0, $a1, $v0 --> main90
+main90 : lw $a2, 0($v0) --> main66
+main66 : emit c22 --> main65
+main65 : li $a2, 8 --> main64
+main64 : move $a1, $sp --> main192
+main192: j --> main63
+main63 : li $a0, 2 --> main62
+main62 : li $v0, 4 --> main61
+main61 : mulo $v0, $a0, $v0 --> main60
+main60 : add $v0, $a1, $v0 --> main89
+main89 : lw $a2, 0($v0) --> main59
+main59 : emit c21 --> main58
+main58 : li $a2, 7 --> main57
+main57 : move $a1, $sp --> main191
+main191: j --> main56
+main56 : li $a0, 3 --> main55
+main55 : li $v0, 4 --> main54
+main54 : mulo $v0, $a0, $v0 --> main53
+main53 : add $v0, $a1, $v0 --> main88
+main88 : lw $a2, 0($v0) --> main52
+main52 : emit c20 --> main51
+main51 : li $a2, 6 --> main50
+main50 : move $a1, $sp --> main190
+main190: j --> main49
+main49 : li $a0, 4 --> main48
+main48 : li $v0, 4 --> main47
+main47 : mulo $v0, $a0, $v0 --> main46
+main46 : add $v0, $a1, $v0 --> main87
+main87 : lw $a2, 0($v0) --> main45
+main45 : emit c19 --> main44
+main44 : li $a2, 5 --> main43
+main43 : move $a1, $sp --> main188
+main188: j --> main42
+main42 : li $a0, 5 --> main41
+main41 : li $v0, 4 --> main40
+main40 : mulo $v0, $a0, $v0 --> main39
+main39 : add $v0, $a1, $v0 --> main86
+main86 : lw $a2, 0($v0) --> main38
+main38 : emit c18 --> main37
+main37 : li $a2, 4 --> main36
+main36 : move $a1, $sp --> main187
+main187: j --> main35
+main35 : li $a0, 6 --> main34
+main34 : li $v0, 4 --> main33
+main33 : mulo $v0, $a0, $v0 --> main32
+main32 : add $v0, $a1, $v0 --> main85
+main85 : lw $a2, 0($v0) --> main31
+main31 : emit c17 --> main30
+main30 : li $a2, 3 --> main29
+main29 : move $a1, $sp --> main186
+main186: j --> main28
+main28 : li $a0, 7 --> main27
+main27 : li $v0, 4 --> main26
+main26 : mulo $v0, $a0, $v0 --> main25
+main25 : add $v0, $a1, $v0 --> main84
+main84 : lw $a2, 0($v0) --> main24
+main24 : emit c16 --> main23
+main23 : li $a2, 2 --> main22
+main22 : move $a1, $sp --> main185
+main185: j --> main21
+main21 : li $a0, 8 --> main20
+main20 : li $v0, 4 --> main19
+main19 : mulo $v0, $a0, $v0 --> main18
+main18 : add $v0, $a1, $v0 --> main83
+main83 : lw $a2, 0($v0) --> main17
+main17 : emit c15 --> main16
+main16 : li $a2, 1 --> main15
+main15 : move $a1, $sp --> main184
+main184: j --> main14
+main14 : li $a0, 9 --> main13
+main13 : li $v0, 4 --> main12
+main12 : mulo $v0, $a0, $v0 --> main11
+main11 : add $v0, $a1, $v0 --> main82
+main82 : lw $a2, 0($v0) --> main10
+main10 : emit c14 --> main9
+main9 : move $a0, $sp --> main195
+main195: j --> main8
+main8 : li $a1, 10 --> main7
+main7 : la $v0, tri --> main91
+main91 : j --> main199
+main199: j --> main198
+main198: j --> main197
+main197: call $v0 --> main196
+main196: j --> main6
+main6 : emit c13 --> main5
+main5 : j --> main189
+main189: j --> main4
+main4 : j --> main3
+main3 : li $v0, 4 --> main2
+main2 : mulo $v0, $zero, $v0 --> main1
+main1 : add $v0, $sp, $v0 --> main81
+main81 : lw $v0, 0($v0) --> main0
+main0 : j --> main183
+main183: j --> main182
+main182: lw $ra, 40($sp) --> main181
+main181: j --> main180
+main180: j --> main179
+main179: j --> main178
+main178: j --> main177
+main177: j --> main176
+main176: j --> main175
+main175: j --> main174
+main174: j --> main173
+main173: delframe --> main172
+main172: jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure tri(%0; %1)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44
+entry tri109
+tri109: li %2, 0 --> tri108
+tri108: li %3, 0 --> tri107
+tri107: li %4, 0 --> tri106
+tri106: li %5, 0 --> tri105
+tri105: li %6, 0 --> tri104
+tri104: li %7, 0 --> tri103
+tri103: li %8, 0 --> tri102
+tri102: li %9, 0 --> tri101
+tri101: li %10, 0 --> tri100
+tri100: li %11, 0 --> tri99
+tri99 : li %12, 0 --> tri98
+tri98 : li %13, 0 --> tri97
+tri97 : li %14, 0 --> tri96
+tri96 : li %15, 0 --> tri95
+tri95 : li %16, 0 --> tri94
+tri94 : li %17, 0 --> tri93
+tri93 : li %18, 0 --> tri92
+tri92 : li %19, 0 --> tri91
+tri91 : li %20, 0 --> tri90
+tri90 : li %21, 0 --> tri89
+tri89 : li %22, 0 --> tri88
+tri88 : li %23, 0 --> tri87
+tri87 : li %24, 0 --> tri86
+tri86 : li %25, 0 --> tri85
+tri85 : li %26, 0 --> tri84
+tri84 : li %27, 0 --> tri83
+tri83 : li %28, 0 --> tri82
+tri82 : li %29, 0 --> tri81
+tri81 : li %30, 0 --> tri80
+tri80 : li %31, 0 --> tri79
+tri79 : li %32, 0 --> tri78
+tri78 : li %33, 0 --> tri77
+tri77 : li %34, 0 --> tri76
+tri76 : li %35, 0 --> tri75
+tri75 : li %36, 0 --> tri74
+tri74 : li %37, 0 --> tri73
+tri73 : li %38, 0 --> tri72
+tri72 : li %39, 0 --> tri71
+tri71 : li %40, 0 --> tri70
+tri70 : li %41, 0 --> tri69
+tri69 : li %42, 0 --> tri68
+tri68 : li %43, 0 --> tri67
+tri67 : li %44, 0 --> tri58
+tri58 : emit c12 --> tri57
+tri57 : li %2, 0 --> tri56
+tri56 : emit c11 --> tri55
+tri55 : emit c10 --> tri54
+tri54 : li %4, 0 --> tri1
+tri1 : j --> tri53
+tri53 : li %35, 0 --> tri52
+tri52 : emit c9 --> tri51
+tri51 : slt %36, %4, %1 --> tri50
+tri50 : li %43, 0 --> tri65
+tri65 : seq %34, %36, %43 --> tri49
+tri49 : beq %34, %35 --> tri48, tri0
+tri0 : return
+tri48 : emit c7 --> tri47
+tri47 : emit c6 --> tri46
+tri46 : li %3, 1 --> tri5
+tri5 : j --> tri45
+tri45 : li %31, 0 --> tri44
+tri44 : emit c5 --> tri43
+tri43 : sub %33, %1, %4 --> tri42
+tri42 : slt %32, %3, %33 --> tri41
+tri41 : li %42, 0 --> tri64
+tri64 : seq %30, %32, %42 --> tri40
+tri40 : beq %30, %31 --> tri39, tri4
+tri4 : emit c8 --> tri3
+tri3 : li %5, 1 --> tri2
+tri2 : add %4, %4, %5 --> tri1
+tri39 : emit c3 --> tri38
+tri38 : li %21, 0 --> tri37
+tri37 : li %29, 4 --> tri36
+tri36 : mulo %28, %3, %29 --> tri35
+tri35 : add %41, %0, %28 --> tri63
+tri63 : lw %22, 0(%41) --> tri34
+tri34 : li %27, 1 --> tri33
+tri33 : sub %25, %3, %27 --> tri32
+tri32 : li %26, 4 --> tri31
+tri31 : mulo %24, %25, %26 --> tri30
+tri30 : add %40, %0, %24 --> tri62
+tri62 : lw %23, 0(%40) --> tri29
+tri29 : slt %20, %22, %23 --> tri28
+tri28 : beq %20, %21 --> tri8, tri27
+tri27 : emit c2 --> tri26
+tri26 : li %19, 1 --> tri25
+tri25 : sub %17, %3, %19 --> tri24
+tri24 : li %18, 4 --> tri23
+tri23 : mulo %16, %17, %18 --> tri22
+tri22 : add %39, %0, %16 --> tri61
+tri61 : lw %2, 0(%39) --> tri21
+tri21 : emit c1 --> tri20
+tri20 : li %15, 4 --> tri19
+tri19 : mulo %14, %3, %15 --> tri18
+tri18 : add %38, %0, %14 --> tri60
+tri60 : lw %9, 0(%38) --> tri17
+tri17 : li %13, 1 --> tri16
+tri16 : sub %11, %3, %13 --> tri15
+tri15 : li %12, 4 --> tri14
+tri14 : mulo %10, %11, %12 --> tri13
+tri13 : add %37, %0, %10 --> tri59
+tri59 : sw %9, 0(%37) --> tri12
+tri12 : emit c0 --> tri11
+tri11 : li %8, 4 --> tri10
+tri10 : mulo %7, %3, %8 --> tri9
+tri9 : add %44, %0, %7 --> tri66
+tri66 : sw %2, 0(%44) --> tri8
+tri8 : emit c4 --> tri7
+tri7 : li %6, 1 --> tri6
+tri6 : add %3, %3, %6 --> tri5
+
+function _main() : %0
+stacksize 40
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69
+entry main161
+main161: li %1, 0 --> main160
+main160: li %2, 0 --> main159
+main159: li %3, 0 --> main158
+main158: li %4, 0 --> main157
+main157: li %5, 0 --> main156
+main156: li %6, 0 --> main155
+main155: li %7, 0 --> main154
+main154: li %8, 0 --> main153
+main153: li %9, 0 --> main152
+main152: li %10, 0 --> main151
+main151: li %11, 0 --> main150
+main150: li %12, 0 --> main149
+main149: li %13, 0 --> main148
+main148: li %14, 0 --> main147
+main147: li %15, 0 --> main146
+main146: li %16, 0 --> main145
+main145: li %17, 0 --> main144
+main144: li %18, 0 --> main143
+main143: li %19, 0 --> main142
+main142: li %20, 0 --> main141
+main141: li %21, 0 --> main140
+main140: li %22, 0 --> main139
+main139: li %23, 0 --> main138
+main138: li %24, 0 --> main137
+main137: li %25, 0 --> main136
+main136: li %26, 0 --> main135
+main135: li %27, 0 --> main134
+main134: li %28, 0 --> main133
+main133: li %29, 0 --> main132
+main132: li %30, 0 --> main131
+main131: li %31, 0 --> main130
+main130: li %32, 0 --> main129
+main129: li %33, 0 --> main128
+main128: li %34, 0 --> main127
+main127: li %35, 0 --> main126
+main126: li %36, 0 --> main125
+main125: li %37, 0 --> main124
+main124: li %38, 0 --> main123
+main123: li %39, 0 --> main122
+main122: li %40, 0 --> main121
+main121: li %41, 0 --> main120
+main120: li %42, 0 --> main119
+main119: li %43, 0 --> main118
+main118: li %44, 0 --> main117
+main117: li %45, 0 --> main116
+main116: li %46, 0 --> main115
+main115: li %47, 0 --> main114
+main114: li %48, 0 --> main113
+main113: li %49, 0 --> main112
+main112: li %50, 0 --> main111
+main111: li %51, 0 --> main110
+main110: li %52, 0 --> main109
+main109: li %53, 0 --> main108
+main108: li %54, 0 --> main107
+main107: li %55, 0 --> main106
+main106: li %56, 0 --> main105
+main105: li %57, 0 --> main104
+main104: li %58, 0 --> main103
+main103: li %59, 0 --> main102
+main102: li %60, 0 --> main101
+main101: li %61, 0 --> main100
+main100: li %62, 0 --> main99
+main99 : li %63, 0 --> main98
+main98 : li %64, 0 --> main97
+main97 : li %65, 0 --> main96
+main96 : li %66, 0 --> main95
+main95 : li %67, 0 --> main94
+main94 : li %68, 0 --> main93
+main93 : li %69, 0 --> main80
+main80 : emit c24 --> main79
+main79 : li %53, 10 --> main78
+main78 : addi %54, STACK, 0 --> main77
+main77 : li %56, 0 --> main76
+main76 : li %57, 4 --> main75
+main75 : mulo %55, %56, %57 --> main74
+main74 : add %69, %54, %55 --> main92
+main92 : sw %53, 0(%69) --> main73
+main73 : emit c23 --> main72
+main72 : li %48, 9 --> main71
+main71 : addi %49, STACK, 0 --> main70
+main70 : li %51, 1 --> main69
+main69 : li %52, 4 --> main68
+main68 : mulo %50, %51, %52 --> main67
+main67 : add %67, %49, %50 --> main90
+main90 : sw %48, 0(%67) --> main66
+main66 : emit c22 --> main65
+main65 : li %43, 8 --> main64
+main64 : addi %44, STACK, 0 --> main63
+main63 : li %46, 2 --> main62
+main62 : li %47, 4 --> main61
+main61 : mulo %45, %46, %47 --> main60
+main60 : add %66, %44, %45 --> main89
+main89 : sw %43, 0(%66) --> main59
+main59 : emit c21 --> main58
+main58 : li %38, 7 --> main57
+main57 : addi %39, STACK, 0 --> main56
+main56 : li %41, 3 --> main55
+main55 : li %42, 4 --> main54
+main54 : mulo %40, %41, %42 --> main53
+main53 : add %65, %39, %40 --> main88
+main88 : sw %38, 0(%65) --> main52
+main52 : emit c20 --> main51
+main51 : li %33, 6 --> main50
+main50 : addi %34, STACK, 0 --> main49
+main49 : li %36, 4 --> main48
+main48 : li %37, 4 --> main47
+main47 : mulo %35, %36, %37 --> main46
+main46 : add %64, %34, %35 --> main87
+main87 : sw %33, 0(%64) --> main45
+main45 : emit c19 --> main44
+main44 : li %28, 5 --> main43
+main43 : addi %29, STACK, 0 --> main42
+main42 : li %31, 5 --> main41
+main41 : li %32, 4 --> main40
+main40 : mulo %30, %31, %32 --> main39
+main39 : add %63, %29, %30 --> main86
+main86 : sw %28, 0(%63) --> main38
+main38 : emit c18 --> main37
+main37 : li %23, 4 --> main36
+main36 : addi %24, STACK, 0 --> main35
+main35 : li %26, 6 --> main34
+main34 : li %27, 4 --> main33
+main33 : mulo %25, %26, %27 --> main32
+main32 : add %62, %24, %25 --> main85
+main85 : sw %23, 0(%62) --> main31
+main31 : emit c17 --> main30
+main30 : li %18, 3 --> main29
+main29 : addi %19, STACK, 0 --> main28
+main28 : li %21, 7 --> main27
+main27 : li %22, 4 --> main26
+main26 : mulo %20, %21, %22 --> main25
+main25 : add %61, %19, %20 --> main84
+main84 : sw %18, 0(%61) --> main24
+main24 : emit c16 --> main23
+main23 : li %13, 2 --> main22
+main22 : addi %14, STACK, 0 --> main21
+main21 : li %16, 8 --> main20
+main20 : li %17, 4 --> main19
+main19 : mulo %15, %16, %17 --> main18
+main18 : add %60, %14, %15 --> main83
+main83 : sw %13, 0(%60) --> main17
+main17 : emit c15 --> main16
+main16 : li %8, 1 --> main15
+main15 : addi %9, STACK, 0 --> main14
+main14 : li %11, 9 --> main13
+main13 : li %12, 4 --> main12
+main12 : mulo %10, %11, %12 --> main11
+main11 : add %59, %9, %10 --> main82
+main82 : sw %8, 0(%59) --> main10
+main10 : emit c14 --> main9
+main9 : addi %5, STACK, 0 --> main8
+main8 : li %6, 10 --> main7
+main7 : la %68, tri --> main91
+main91 : call %7, %68(%5, %6) --> main6
+main6 : emit c13 --> main5
+main5 : addi %1, STACK, 0 --> main4
+main4 : li %3, 0 --> main3
+main3 : li %4, 4 --> main2
+main2 : mulo %2, %3, %4 --> main1
+main1 : add %58, %1, %2 --> main81
+main81 : lw %0, 0(%58) --> main0
+main0 : return %0
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program: (main function is "main")
+
+
+ globals:
+
+
+ "__builtin___memcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memmove_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___mempcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memset_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___stpcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strcat_chk": int -> int -> int -> int
+
+
+ "__builtin___strcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strncat_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___strncpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vfprintf_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vprintf_chk": int -> int -> int -> int
+
+
+ "__builtin___vsnprintf_chk": int -> int -> int -> int -> int -> int -> int
+
+
+ "__builtin___vsprintf_chk": int -> int -> int -> int -> int -> int
+
+
+ "__builtin_acos": float -> float
+
+
+ "__builtin_acosf": float -> float
+
+
+ "__builtin_acosl": float -> float
+
+
+ "__builtin_alloca": int -> int
+
+
+ "__builtin_asin": float -> float
+
+
+ "__builtin_asinf": float -> float
+
+
+ "__builtin_asinl": float -> float
+
+
+ "__builtin_atan": float -> float
+
+
+ "__builtin_atanf": float -> float
+
+
+ "__builtin_atanl": float -> float
+
+
+ "__builtin_atan2": float -> float -> float
+
+
+ "__builtin_atan2f": float -> float -> float
+
+
+ "__builtin_atan2l": float -> float -> float
+
+
+ "__builtin_ceil": float -> float
+
+
+ "__builtin_ceilf": float -> float
+
+
+ "__builtin_ceill": float -> float
+
+
+ "__builtin_cos": float -> float
+
+
+ "__builtin_cosf": float -> float
+
+
+ "__builtin_cosl": float -> float
+
+
+ "__builtin_cosh": float -> float
+
+
+ "__builtin_coshf": float -> float
+
+
+ "__builtin_coshl": float -> float
+
+
+ "__builtin_clz": int -> int
+
+
+ "__builtin_clzl": int -> int
+
+
+ "__builtin_clzll": int -> int
+
+
+ "__builtin_constant_p": int -> int
+
+
+ "__builtin_ctz": int -> int
+
+
+ "__builtin_ctzl": int -> int
+
+
+ "__builtin_ctzll": int -> int
+
+
+ "__builtin_exp": float -> float
+
+
+ "__builtin_expf": float -> float
+
+
+ "__builtin_expl": float -> float
+
+
+ "__builtin_expect": int -> int -> int
+
+
+ "__builtin_fabs": float -> float
+
+
+ "__builtin_fabsf": float -> float
+
+
+ "__builtin_fabsl": float -> float
+
+
+ "__builtin_ffs": int -> int
+
+
+ "__builtin_ffsl": int -> int
+
+
+ "__builtin_ffsll": int -> int
+
+
+ "__builtin_frame_address": int -> int
+
+
+ "__builtin_floor": float -> float
+
+
+ "__builtin_floorf": float -> float
+
+
+ "__builtin_floorl": float -> float
+
+
+ "__builtin_huge_val": float
+
+
+ "__builtin_huge_valf": float
+
+
+ "__builtin_huge_vall": float
+
+
+ "__builtin_inf": float
+
+
+ "__builtin_inff": float
+
+
+ "__builtin_infl": float
+
+
+ "__builtin_memcpy": int -> int -> int -> int
+
+
+ "__builtin_mempcpy": int -> int -> int -> int
+
+
+ "__builtin_fmod": float -> float
+
+
+ "__builtin_fmodf": float -> float
+
+
+ "__builtin_fmodl": float -> float
+
+
+ "__builtin_frexp": float -> int -> float
+
+
+ "__builtin_frexpf": float -> int -> float
+
+
+ "__builtin_frexpl": float -> int -> float
+
+
+ "__builtin_ldexp": float -> int -> float
+
+
+ "__builtin_ldexpf": float -> int -> float
+
+
+ "__builtin_ldexpl": float -> int -> float
+
+
+ "__builtin_log": float -> float
+
+
+ "__builtin_logf": float -> float
+
+
+ "__builtin_logl": float -> float
+
+
+ "__builtin_log10": float -> float
+
+
+ "__builtin_log10f": float -> float
+
+
+ "__builtin_log10l": float -> float
+
+
+ "__builtin_modff": float -> int -> float
+
+
+ "__builtin_modfl": float -> int -> float
+
+
+ "__builtin_nan": int -> float
+
+
+ "__builtin_nanf": int -> float
+
+
+ "__builtin_nanl": int -> float
+
+
+ "__builtin_nans": int -> float
+
+
+ "__builtin_nansf": int -> float
+
+
+ "__builtin_nansl": int -> float
+
+
+ "__builtin_next_arg": int
+
+
+ "__builtin_object_size": int -> int -> int
+
+
+ "__builtin_parity": int -> int
+
+
+ "__builtin_parityl": int -> int
+
+
+ "__builtin_parityll": int -> int
+
+
+ "__builtin_popcount": int -> int
+
+
+ "__builtin_popcountl": int -> int
+
+
+ "__builtin_popcountll": int -> int
+
+
+ "__builtin_powi": float -> int -> float
+
+
+ "__builtin_powif": float -> int -> float
+
+
+ "__builtin_powil": float -> int -> float
+
+
+ "__builtin_return": int -> void
+
+
+ "__builtin_return_address": int -> int
+
+
+ "__builtin_sin": float -> float
+
+
+ "__builtin_sinf": float -> float
+
+
+ "__builtin_sinl": float -> float
+
+
+ "__builtin_sinh": float -> float
+
+
+ "__builtin_sinhf": float -> float
+
+
+ "__builtin_sinhl": float -> float
+
+
+ "__builtin_sqrt": float -> float
+
+
+ "__builtin_sqrtf": float -> float
+
+
+ "__builtin_sqrtl": float -> float
+
+
+ "__builtin_stpcpy": int -> int -> int
+
+
+ "__builtin_strchr": int -> int -> int
+
+
+ "__builtin_strcmp": int -> int -> int
+
+
+ "__builtin_strcpy": int -> int -> int
+
+
+ "__builtin_strcspn": int -> int -> int
+
+
+ "__builtin_strncat": int -> int -> int -> int
+
+
+ "__builtin_strncmp": int -> int -> int -> int
+
+
+ "__builtin_strncpy": int -> int -> int -> int
+
+
+ "__builtin_strspn": int -> int -> int
+
+
+ "__builtin_strpbrk": int -> int -> int
+
+
+ "__builtin_types_compatible_p": int -> int -> int
+
+
+ "__builtin_tan": float -> float
+
+
+ "__builtin_tanf": float -> float
+
+
+ "__builtin_tanl": float -> float
+
+
+ "__builtin_tanh": float -> float
+
+
+ "__builtin_tanhf": float -> float
+
+
+ "__builtin_tanhl": float -> float
+
+
+ "__builtin_va_end": int -> void
+
+
+ "__builtin_varargs_start": int -> void
+
+
+ "__builtin_va_start": int -> int -> void
+
+
+ "__builtin_stdarg_start": int -> void
+
+
+ "__builtin_va_arg": int -> int -> void
+
+
+ "__builtin_va_copy": int -> int -> void
+
+
+ "tri"(%0, %1): int -> int -> void
+ locals: %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31, %32, %33, %34, %35, %36
+ stacksize: 0
+ entry: tri58
+ exit: tri0
+
+ tri9: store int32, add, %0, %7, %2 --> tri8
+ tri8: emit c4 --> tri7
+ tri7: imm_int 1, %6, --> tri6
+ tri6: add %3, %3, %6 --> tri5
+ tri58: emit c12 --> tri57
+ tri57: imm_int 0, %2, --> tri56
+ tri56: emit c11 --> tri55
+ tri55: emit c10 --> tri54
+ tri54: imm_int 0, %4, --> tri1
+ tri53: imm_int 0, %35, --> tri52
+ tri52: emit c9 --> tri51
+ tri51: lt %36, %4, %1 --> tri50
+ tri50: notbool %34, %36 --> tri49
+ tri5: --> tri45
+ tri49: eq %34, %35 --> tri48, tri0
+ tri48: emit c7 --> tri47
+ tri47: emit c6 --> tri46
+ tri46: imm_int 1, %3, --> tri5
+ tri45: imm_int 0, %31, --> tri44
+ tri44: emit c5 --> tri43
+ tri43: sub %33, %1, %4 --> tri42
+ tri42: lt %32, %3, %33 --> tri41
+ tri41: notbool %30, %32 --> tri40
+ tri40: eq %30, %31 --> tri39, tri4
+ tri4: emit c8 --> tri3
+ tri39: emit c3 --> tri38
+ tri38: imm_int 0, %21, --> tri37
+ tri37: imm_int 4, %29, --> tri36
+ tri36: mul %28, %3, %29 --> tri35
+ tri35: load int32, add, %0, %28, %22 --> tri34
+ tri34: imm_int 1, %27, --> tri33
+ tri33: sub %25, %3, %27 --> tri32
+ tri32: imm_int 4, %26, --> tri31
+ tri31: mul %24, %25, %26 --> tri30
+ tri30: load int32, add, %0, %24, %23 --> tri29
+ tri3: imm_int 1, %5, --> tri2
+ tri29: lt %20, %22, %23 --> tri28
+ tri28: eq %20, %21 --> tri8, tri27
+ tri27: emit c2 --> tri26
+ tri26: imm_int 1, %19, --> tri25
+ tri25: sub %17, %3, %19 --> tri24
+ tri24: imm_int 4, %18, --> tri23
+ tri23: mul %16, %17, %18 --> tri22
+ tri22: load int32, add, %0, %16, %2 --> tri21
+ tri21: emit c1 --> tri20
+ tri20: imm_int 4, %15, --> tri19
+ tri2: add %4, %4, %5 --> tri1
+ tri19: mul %14, %3, %15 --> tri18
+ tri18: load int32, add, %0, %14, %9 --> tri17
+ tri17: imm_int 1, %13, --> tri16
+ tri16: sub %11, %3, %13 --> tri15
+ tri15: imm_int 4, %12, --> tri14
+ tri14: mul %10, %11, %12 --> tri13
+ tri13: store int32, add, %0, %10, %9 --> tri12
+ tri12: emit c0 --> tri11
+ tri11: imm_int 4, %8, --> tri10
+ tri10: mul %7, %3, %8 --> tri9
+ tri1: --> tri53
+ tri0: return
+
+
+ "main"(): int
+ locals: %0, %1, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31, %32, %33, %34, %35, %36, %37, %38, %39, %40, %41, %42, %43, %44, %45, %46, %47, %48, %49, %50, %51, %52, %53, %54, %55, %56, %57
+ result: %0
+ stacksize: 40
+ entry: main80
+ exit: main0
+
+ main9: imm_addr 0($sp), %5, --> main8
+ main80: emit c24 --> main79
+ main8: imm_int 10, %6, --> main7
+ main79: imm_int 10, %53, --> main78
+ main78: imm_addr 0($sp), %54, --> main77
+ main77: imm_int 0, %56, --> main76
+ main76: imm_int 4, %57, --> main75
+ main75: mul %55, %56, %57 --> main74
+ main74: store int32, add, %54, %55, %53 --> main73
+ main73: emit c23 --> main72
+ main72: imm_int 9, %48, --> main71
+ main71: imm_addr 0($sp), %49, --> main70
+ main70: imm_int 1, %51, --> main69
+ main7: call "tri", %5, %6, %7: int -> int -> void --> main6
+ main69: imm_int 4, %52, --> main68
+ main68: mul %50, %51, %52 --> main67
+ main67: store int32, add, %49, %50, %48 --> main66
+ main66: emit c22 --> main65
+ main65: imm_int 8, %43, --> main64
+ main64: imm_addr 0($sp), %44, --> main63
+ main63: imm_int 2, %46, --> main62
+ main62: imm_int 4, %47, --> main61
+ main61: mul %45, %46, %47 --> main60
+ main60: store int32, add, %44, %45, %43 --> main59
+ main6: emit c13 --> main5
+ main59: emit c21 --> main58
+ main58: imm_int 7, %38, --> main57
+ main57: imm_addr 0($sp), %39, --> main56
+ main56: imm_int 3, %41, --> main55
+ main55: imm_int 4, %42, --> main54
+ main54: mul %40, %41, %42 --> main53
+ main53: store int32, add, %39, %40, %38 --> main52
+ main52: emit c20 --> main51
+ main51: imm_int 6, %33, --> main50
+ main50: imm_addr 0($sp), %34, --> main49
+ main5: imm_addr 0($sp), %1, --> main4
+ main49: imm_int 4, %36, --> main48
+ main48: imm_int 4, %37, --> main47
+ main47: mul %35, %36, %37 --> main46
+ main46: store int32, add, %34, %35, %33 --> main45
+ main45: emit c19 --> main44
+ main44: imm_int 5, %28, --> main43
+ main43: imm_addr 0($sp), %29, --> main42
+ main42: imm_int 5, %31, --> main41
+ main41: imm_int 4, %32, --> main40
+ main40: mul %30, %31, %32 --> main39
+ main4: imm_int 0, %3, --> main3
+ main39: store int32, add, %29, %30, %28 --> main38
+ main38: emit c18 --> main37
+ main37: imm_int 4, %23, --> main36
+ main36: imm_addr 0($sp), %24, --> main35
+ main35: imm_int 6, %26, --> main34
+ main34: imm_int 4, %27, --> main33
+ main33: mul %25, %26, %27 --> main32
+ main32: store int32, add, %24, %25, %23 --> main31
+ main31: emit c17 --> main30
+ main30: imm_int 3, %18, --> main29
+ main3: imm_int 4, %4, --> main2
+ main29: imm_addr 0($sp), %19, --> main28
+ main28: imm_int 7, %21, --> main27
+ main27: imm_int 4, %22, --> main26
+ main26: mul %20, %21, %22 --> main25
+ main25: store int32, add, %19, %20, %18 --> main24
+ main24: emit c16 --> main23
+ main23: imm_int 2, %13, --> main22
+ main22: imm_addr 0($sp), %14, --> main21
+ main21: imm_int 8, %16, --> main20
+ main20: imm_int 4, %17, --> main19
+ main2: mul %2, %3, %4 --> main1
+ main19: mul %15, %16, %17 --> main18
+ main18: store int32, add, %14, %15, %13 --> main17
+ main17: emit c15 --> main16
+ main16: imm_int 1, %8, --> main15
+ main15: imm_addr 0($sp), %9, --> main14
+ main14: imm_int 9, %11, --> main13
+ main13: imm_int 4, %12, --> main12
+ main12: mul %10, %11, %12 --> main11
+ main11: store int32, add, %9, %10, %8 --> main10
+ main10: emit c14 --> main9
+ main1: load int32, add, %1, %2, %0 --> main0
+ main0: return %0
+
+
--- /dev/null
+void tri (int t[], int n) {\r
+ int i,j,tmp;\r
+ tmp = 0; \r
+\r
+ for(i = 0 ;i < n; i=i+1)\r
+ {\r
+ for(j = 1 ; j < n-i ; j=j+1)\r
+ {\r
+ if(t[j] < t[j-1])\r
+ {\r
+ tmp = t[j-1];\r
+ t[j-1] = t[j];\r
+ t[j] = tmp;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+int main(){\r
+ int t[10] = {10,9,8,7,6,5,4,3,2,1};\r
+ tri(t,10);\r
+ return t[0];\r
+}\r
--- /dev/null
+void tri (int t[], int n) {\r
+ int i,j,tmp;\r
+ tmp = 0; \r
+\r
+ for(i = 0 ;i < n; i=i+1)\r
+ {\r
+ for(j = 1 ; j < n-i ; j=j+1)\r
+ {\r
+ if(t[j] < t[j-1])\r
+ {\r
+ tmp = t[j-1];\r
+ t[j-1] = t[j];\r
+ t[j] = tmp;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+int main(){\r
+ int t[10] = {10,9,8,7,6,5,4,3,2,1};\r
+ tri(t,10);\r
+ return t[0];\r
+}\r
--- /dev/null
+Global Error (Translation RTLabs -> RTL):
+ Constant not supported.
--- /dev/null
+# extern __builtin_varargs_start: int -> void
+# extern __builtin_va_start: int -> int -> void
+# extern __builtin_va_end: int -> void
+# extern __builtin_va_copy: int -> int -> void
+# extern __builtin_va_arg: int -> int -> void
+# extern __builtin_types_compatible_p: int -> int -> int
+# extern __builtin_tanl: float -> float
+# extern __builtin_tanhl: float -> float
+# extern __builtin_tanhf: float -> float
+# extern __builtin_tanh: float -> float
+# extern __builtin_tanf: float -> float
+# extern __builtin_tan: float -> float
+# extern __builtin_strspn: int -> int -> int
+# extern __builtin_strpbrk: int -> int -> int
+# extern __builtin_strncpy: int -> int -> int -> int
+# extern __builtin_strncmp: int -> int -> int -> int
+# extern __builtin_strncat: int -> int -> int -> int
+# extern __builtin_strcspn: int -> int -> int
+# extern __builtin_strcpy: int -> int -> int
+# extern __builtin_strcmp: int -> int -> int
+# extern __builtin_strchr: int -> int -> int
+# extern __builtin_stpcpy: int -> int -> int
+# extern __builtin_stdarg_start: int -> void
+# extern __builtin_sqrtl: float -> float
+# extern __builtin_sqrtf: float -> float
+# extern __builtin_sqrt: float -> float
+# extern __builtin_sinl: float -> float
+# extern __builtin_sinhl: float -> float
+# extern __builtin_sinhf: float -> float
+# extern __builtin_sinh: float -> float
+# extern __builtin_sinf: float -> float
+# extern __builtin_sin: float -> float
+# extern __builtin_return_address: int -> int
+# extern __builtin_return: int -> void
+# extern __builtin_powil: float -> int -> float
+# extern __builtin_powif: float -> int -> float
+# extern __builtin_powi: float -> int -> float
+# extern __builtin_popcountll: int -> int
+# extern __builtin_popcountl: int -> int
+# extern __builtin_popcount: int -> int
+# extern __builtin_parityll: int -> int
+# extern __builtin_parityl: int -> int
+# extern __builtin_parity: int -> int
+# extern __builtin_object_size: int -> int -> int
+# extern __builtin_next_arg: int
+# extern __builtin_nansl: int -> float
+# extern __builtin_nansf: int -> float
+# extern __builtin_nans: int -> float
+# extern __builtin_nanl: int -> float
+# extern __builtin_nanf: int -> float
+# extern __builtin_nan: int -> float
+# extern __builtin_modfl: float -> int -> float
+# extern __builtin_modff: float -> int -> float
+# extern __builtin_mempcpy: int -> int -> int -> int
+# extern __builtin_memcpy: int -> int -> int -> int
+# extern __builtin_logl: float -> float
+# extern __builtin_logf: float -> float
+# extern __builtin_log10l: float -> float
+# extern __builtin_log10f: float -> float
+# extern __builtin_log10: float -> float
+# extern __builtin_log: float -> float
+# extern __builtin_ldexpl: float -> int -> float
+# extern __builtin_ldexpf: float -> int -> float
+# extern __builtin_ldexp: float -> int -> float
+# extern __builtin_infl: float
+# extern __builtin_inff: float
+# extern __builtin_inf: float
+# extern __builtin_huge_vall: float
+# extern __builtin_huge_valf: float
+# extern __builtin_huge_val: float
+# extern __builtin_frexpl: float -> int -> float
+# extern __builtin_frexpf: float -> int -> float
+# extern __builtin_frexp: float -> int -> float
+# extern __builtin_frame_address: int -> int
+# extern __builtin_fmodl: float -> float
+# extern __builtin_fmodf: float -> float
+# extern __builtin_fmod: float -> float
+# extern __builtin_floorl: float -> float
+# extern __builtin_floorf: float -> float
+# extern __builtin_floor: float -> float
+# extern __builtin_ffsll: int -> int
+# extern __builtin_ffsl: int -> int
+# extern __builtin_ffs: int -> int
+# extern __builtin_fabsl: float -> float
+# extern __builtin_fabsf: float -> float
+# extern __builtin_fabs: float -> float
+# extern __builtin_expl: float -> float
+# extern __builtin_expf: float -> float
+# extern __builtin_expect: int -> int -> int
+# extern __builtin_exp: float -> float
+# extern __builtin_ctzll: int -> int
+# extern __builtin_ctzl: int -> int
+# extern __builtin_ctz: int -> int
+# extern __builtin_cosl: float -> float
+# extern __builtin_coshl: float -> float
+# extern __builtin_coshf: float -> float
+# extern __builtin_cosh: float -> float
+# extern __builtin_cosf: float -> float
+# extern __builtin_cos: float -> float
+# extern __builtin_constant_p: int -> int
+# extern __builtin_clzll: int -> int
+# extern __builtin_clzl: int -> int
+# extern __builtin_clz: int -> int
+# extern __builtin_ceill: float -> float
+# extern __builtin_ceilf: float -> float
+# extern __builtin_ceil: float -> float
+# extern __builtin_atanl: float -> float
+# extern __builtin_atanf: float -> float
+# extern __builtin_atan2l: float -> float -> float
+# extern __builtin_atan2f: float -> float -> float
+# extern __builtin_atan2: float -> float -> float
+# extern __builtin_atan: float -> float
+# extern __builtin_asinl: float -> float
+# extern __builtin_asinf: float -> float
+# extern __builtin_asin: float -> float
+# extern __builtin_alloca: int -> int
+# extern __builtin_acosl: float -> float
+# extern __builtin_acosf: float -> float
+# extern __builtin_acos: float -> float
+# extern __builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+# extern __builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+# extern __builtin___vprintf_chk: int -> int -> int -> int
+# extern __builtin___vfprintf_chk: int -> int -> int -> int -> int
+# extern __builtin___strncpy_chk: int -> int -> int -> int -> int
+# extern __builtin___strncat_chk: int -> int -> int -> int -> int
+# extern __builtin___strcpy_chk: int -> int -> int -> int
+# extern __builtin___strcat_chk: int -> int -> int -> int
+# extern __builtin___stpcpy_chk: int -> int -> int -> int
+# extern __builtin___memset_chk: int -> int -> int -> int -> int
+# extern __builtin___mempcpy_chk: int -> int -> int -> int -> int
+# extern __builtin___memmove_chk: int -> int -> int -> int -> int
+# extern __builtin___memcpy_chk: int -> int -> int -> int -> int
+
+# begin preamble
+.data
+globals:
+.space 0
+nl:
+.asciiz "\n"
+.align 2
+.text
+main:
+la $gp, globals
+j main189
+print_int:
+li $v0, 1
+syscall
+jr $ra
+print_intln:
+li $v0, 1
+syscall
+la $a0, nl
+li $v0, 4
+syscall
+jr $ra
+scan_int:
+li $v0, 5
+syscall
+jr $ra
+alloc:
+li $v0, 9
+syscall
+jr $ra
+
+pow2:
+li $v0, 1
+sllv $v0, $v0, $a0
+jr $ra
+
+mod:
+beqz $a0, mod0
+beqz $a1, mod0
+li $t2, 0
+mod_t0:
+bgtz $a0, mod_a0_pos
+neg $t0, $a0
+addi $t2, $t2, 1
+j mod_t1
+mod_a0_pos:
+move $t0, $a0
+mod_t1:
+bgtz $a1, mod_a1_pos
+neg $t1, $a1
+addi $t2, $t2, 2
+j mod_main
+mod_a1_pos:
+move $t1, $a1
+mod_main:
+rem $v0, $t0, $t1
+beqz $t2, mod_exit
+addi $t2, -1
+beqz $t2, mod_case1
+addi $t2, -1
+beqz $t2, mod_case2
+neg $v0, $v0
+j mod_exit
+mod_case1:
+sub $v0, $a1, $v0
+j mod_exit
+mod_case2:
+add $v0, $a1, $v0
+j mod_exit
+mod0:
+li $v0, 0
+mod_exit:
+jr $ra
+
+toint:
+# $a0: size
+# $a1: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+jal pow2
+move $a0, $a1
+move $a1, $v0
+jal mod
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 8
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 16
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+sign_ext:
+# $a0: size
+# $a1: int to extend
+li $v0, 32
+sub $a0, $v0, $a0
+sllv $v0, $a1, $a0
+srav $v0, $v0, $a0
+jr $ra
+
+ofint:
+# $a0: signedness
+# $a1: size
+# $a2: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+beqz $a0, ofint_unsigned
+move $a0, $a1
+move $a1, $a2
+jal sign_ext
+j ofint_exit
+ofint_unsigned:
+move $v0, $a2
+ofint_exit:
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+# end preamble
+
+
+# begin array_LE
+array_LE38:
+c1:
+li $t0, 2
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+sw $t0, 0($v0)
+c0:
+li $a0, 78
+li $v0, 1
+add $a2, $a3, $v0
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a1, $v0
+sw $a0, 0($v0)
+jr $ra
+# end array_LE
+
+
+# begin _main
+main189:
+addi $sp, $sp, -44
+sw $ra, 40($sp)
+c13:
+li $a1, 0
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c12:
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c11:
+move $a1, $sp
+li $a0, 2
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c10:
+move $a1, $sp
+li $a0, 3
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c9:
+move $a1, $sp
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c8:
+li $a1, 0
+move $a0, $sp
+addi $a0, $a0, 20
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c7:
+move $a1, $sp
+addi $a1, $a1, 20
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c6:
+move $a1, $sp
+addi $a1, $a1, 20
+li $a0, 2
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c5:
+move $a1, $sp
+addi $a1, $a1, 20
+li $a0, 3
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c4:
+move $a1, $sp
+addi $a1, $a1, 20
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c3:
+move $a0, $sp
+move $a1, $sp
+addi $a1, $a1, 20
+li $a2, 0
+li $a3, 0
+la $v0, array_LE38
+jalr $v0
+c2:
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+lw $v0, 0($v0)
+addi $sp, $sp, 20
+li $a1, 1
+li $a0, 4
+mulo $a0, $a1, $a0
+add $a0, $sp, $a0
+lw $a0, 0($a0)
+add $v0, $v0, $a0
+lw $ra, 40($sp)
+addi $sp, $sp, 44
+jr $ra
+# end _main
--- /dev/null
+extern void *__builtin___memcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memmove_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___mempcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memset_chk(void *, int, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___stpcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcat_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strncat_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___strncpy_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern int __builtin___vfprintf_chk(void *, int, unsigned char *, void *);
+
+extern int __builtin___vprintf_chk(int, unsigned char *, void *);
+
+extern int __builtin___vsnprintf_chk(unsigned char *, unsigned int, int, unsigned int, unsigned char *, void *);
+
+extern int __builtin___vsprintf_chk(unsigned char *, int, unsigned int, unsigned char *, void *);
+
+extern double __builtin_acos(double);
+
+extern float __builtin_acosf(float);
+
+extern double __builtin_acosl(double);
+
+extern void *__builtin_alloca(unsigned int);
+
+extern double __builtin_asin(double);
+
+extern float __builtin_asinf(float);
+
+extern double __builtin_asinl(double);
+
+extern double __builtin_atan(double);
+
+extern float __builtin_atanf(float);
+
+extern double __builtin_atanl(double);
+
+extern double __builtin_atan2(double, double);
+
+extern float __builtin_atan2f(float, float);
+
+extern double __builtin_atan2l(double, double);
+
+extern double __builtin_ceil(double);
+
+extern float __builtin_ceilf(float);
+
+extern double __builtin_ceill(double);
+
+extern double __builtin_cos(double);
+
+extern float __builtin_cosf(float);
+
+extern double __builtin_cosl(double);
+
+extern double __builtin_cosh(double);
+
+extern float __builtin_coshf(float);
+
+extern double __builtin_coshl(double);
+
+extern int __builtin_clz(unsigned int);
+
+extern int __builtin_clzl(unsigned int);
+
+extern int __builtin_clzll(unsigned int);
+
+extern int __builtin_constant_p(int);
+
+extern int __builtin_ctz(unsigned int);
+
+extern int __builtin_ctzl(unsigned int);
+
+extern int __builtin_ctzll(unsigned int);
+
+extern double __builtin_exp(double);
+
+extern float __builtin_expf(float);
+
+extern double __builtin_expl(double);
+
+extern int __builtin_expect(int, int);
+
+extern double __builtin_fabs(double);
+
+extern float __builtin_fabsf(float);
+
+extern double __builtin_fabsl(double);
+
+extern int __builtin_ffs(unsigned int);
+
+extern int __builtin_ffsl(unsigned int);
+
+extern int __builtin_ffsll(unsigned int);
+
+extern void *__builtin_frame_address(unsigned int);
+
+extern double __builtin_floor(double);
+
+extern float __builtin_floorf(float);
+
+extern double __builtin_floorl(double);
+
+extern double __builtin_huge_val(void);
+
+extern float __builtin_huge_valf(void);
+
+extern double __builtin_huge_vall(void);
+
+extern double __builtin_inf(void);
+
+extern float __builtin_inff(void);
+
+extern double __builtin_infl(void);
+
+extern void *__builtin_memcpy(void *, void *, unsigned int);
+
+extern void *__builtin_mempcpy(void *, void *, unsigned int);
+
+extern double __builtin_fmod(double);
+
+extern float __builtin_fmodf(float);
+
+extern double __builtin_fmodl(double);
+
+extern double __builtin_frexp(double, int *);
+
+extern float __builtin_frexpf(float, int *);
+
+extern double __builtin_frexpl(double, int *);
+
+extern double __builtin_ldexp(double, int);
+
+extern float __builtin_ldexpf(float, int);
+
+extern double __builtin_ldexpl(double, int);
+
+extern double __builtin_log(double);
+
+extern float __builtin_logf(float);
+
+extern double __builtin_logl(double);
+
+extern double __builtin_log10(double);
+
+extern float __builtin_log10f(float);
+
+extern double __builtin_log10l(double);
+
+extern float __builtin_modff(float, float *);
+
+extern double __builtin_modfl(double, double *);
+
+extern double __builtin_nan(unsigned char *);
+
+extern float __builtin_nanf(unsigned char *);
+
+extern double __builtin_nanl(unsigned char *);
+
+extern double __builtin_nans(unsigned char *);
+
+extern float __builtin_nansf(unsigned char *);
+
+extern double __builtin_nansl(unsigned char *);
+
+extern void *__builtin_next_arg(void);
+
+extern unsigned int __builtin_object_size(void *, int);
+
+extern int __builtin_parity(unsigned int);
+
+extern int __builtin_parityl(unsigned int);
+
+extern int __builtin_parityll(unsigned int);
+
+extern int __builtin_popcount(unsigned int);
+
+extern int __builtin_popcountl(unsigned int);
+
+extern int __builtin_popcountll(unsigned int);
+
+extern double __builtin_powi(double, int);
+
+extern float __builtin_powif(float, int);
+
+extern double __builtin_powil(double, int);
+
+extern void __builtin_return(void *);
+
+extern void *__builtin_return_address(unsigned int);
+
+extern double __builtin_sin(double);
+
+extern float __builtin_sinf(float);
+
+extern double __builtin_sinl(double);
+
+extern double __builtin_sinh(double);
+
+extern float __builtin_sinhf(float);
+
+extern double __builtin_sinhl(double);
+
+extern double __builtin_sqrt(double);
+
+extern float __builtin_sqrtf(float);
+
+extern double __builtin_sqrtl(double);
+
+extern unsigned char *__builtin_stpcpy(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strchr(unsigned char *, unsigned char);
+
+extern int __builtin_strcmp(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strcpy(unsigned char *, unsigned char *);
+
+extern unsigned int __builtin_strcspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strncat(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strncmp(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin_strncpy(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strpbrk(unsigned char *, unsigned char *);
+
+extern int __builtin_types_compatible_p(unsigned int, unsigned int);
+
+extern double __builtin_tan(double);
+
+extern float __builtin_tanf(float);
+
+extern double __builtin_tanl(double);
+
+extern double __builtin_tanh(double);
+
+extern float __builtin_tanhf(float);
+
+extern double __builtin_tanhl(double);
+
+extern void __builtin_va_end(void *);
+
+extern void __builtin_varargs_start(void *);
+
+extern void __builtin_va_start(void *, void *);
+
+extern void __builtin_stdarg_start(void *);
+
+extern void __builtin_va_arg(void *, unsigned int);
+
+extern void __builtin_va_copy(void *, void *);
+
+void array_LE(int *tabLE, int *tabLE2, int i, int j)
+{
+ c1:
+ tabLE[i] = 2;
+ c0:
+ tabLE2[(j + 1)] = 78;
+}
+
+int main(void)
+{
+ int t1[5];
+ int t2[5];
+ c13:
+ t1[0] = 0;
+ c12:
+ t1[1] = 0;
+ c11:
+ t1[2] = 0;
+ c10:
+ t1[3] = 0;
+ c9:
+ t1[4] = 0;
+ c8:
+ t2[0] = 0;
+ c7:
+ t2[1] = 0;
+ c6:
+ t2[2] = 0;
+ c5:
+ t2[3] = 0;
+ c4:
+ t2[4] = 0;
+ c3:
+ array_LE(t1, t2, 0, 0);
+ c2:
+ return t1[0] + t2[1];
+}
+
+
--- /dev/null
+
+
+
+extern "__builtin___memcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memmove_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___mempcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memset_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___stpcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcat_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strncat_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___strncpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vfprintf_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vprintf_chk" : int -> int -> int -> int
+
+
+extern "__builtin___vsnprintf_chk" : int -> int -> int -> int -> int -> int -> int
+
+
+extern "__builtin___vsprintf_chk" : int -> int -> int -> int -> int -> int
+
+
+extern "__builtin_acos" : float -> float
+
+
+extern "__builtin_acosf" : float -> float
+
+
+extern "__builtin_acosl" : float -> float
+
+
+extern "__builtin_alloca" : int -> int
+
+
+extern "__builtin_asin" : float -> float
+
+
+extern "__builtin_asinf" : float -> float
+
+
+extern "__builtin_asinl" : float -> float
+
+
+extern "__builtin_atan" : float -> float
+
+
+extern "__builtin_atanf" : float -> float
+
+
+extern "__builtin_atanl" : float -> float
+
+
+extern "__builtin_atan2" : float -> float -> float
+
+
+extern "__builtin_atan2f" : float -> float -> float
+
+
+extern "__builtin_atan2l" : float -> float -> float
+
+
+extern "__builtin_ceil" : float -> float
+
+
+extern "__builtin_ceilf" : float -> float
+
+
+extern "__builtin_ceill" : float -> float
+
+
+extern "__builtin_cos" : float -> float
+
+
+extern "__builtin_cosf" : float -> float
+
+
+extern "__builtin_cosl" : float -> float
+
+
+extern "__builtin_cosh" : float -> float
+
+
+extern "__builtin_coshf" : float -> float
+
+
+extern "__builtin_coshl" : float -> float
+
+
+extern "__builtin_clz" : int -> int
+
+
+extern "__builtin_clzl" : int -> int
+
+
+extern "__builtin_clzll" : int -> int
+
+
+extern "__builtin_constant_p" : int -> int
+
+
+extern "__builtin_ctz" : int -> int
+
+
+extern "__builtin_ctzl" : int -> int
+
+
+extern "__builtin_ctzll" : int -> int
+
+
+extern "__builtin_exp" : float -> float
+
+
+extern "__builtin_expf" : float -> float
+
+
+extern "__builtin_expl" : float -> float
+
+
+extern "__builtin_expect" : int -> int -> int
+
+
+extern "__builtin_fabs" : float -> float
+
+
+extern "__builtin_fabsf" : float -> float
+
+
+extern "__builtin_fabsl" : float -> float
+
+
+extern "__builtin_ffs" : int -> int
+
+
+extern "__builtin_ffsl" : int -> int
+
+
+extern "__builtin_ffsll" : int -> int
+
+
+extern "__builtin_frame_address" : int -> int
+
+
+extern "__builtin_floor" : float -> float
+
+
+extern "__builtin_floorf" : float -> float
+
+
+extern "__builtin_floorl" : float -> float
+
+
+extern "__builtin_huge_val" : float
+
+
+extern "__builtin_huge_valf" : float
+
+
+extern "__builtin_huge_vall" : float
+
+
+extern "__builtin_inf" : float
+
+
+extern "__builtin_inff" : float
+
+
+extern "__builtin_infl" : float
+
+
+extern "__builtin_memcpy" : int -> int -> int -> int
+
+
+extern "__builtin_mempcpy" : int -> int -> int -> int
+
+
+extern "__builtin_fmod" : float -> float
+
+
+extern "__builtin_fmodf" : float -> float
+
+
+extern "__builtin_fmodl" : float -> float
+
+
+extern "__builtin_frexp" : float -> int -> float
+
+
+extern "__builtin_frexpf" : float -> int -> float
+
+
+extern "__builtin_frexpl" : float -> int -> float
+
+
+extern "__builtin_ldexp" : float -> int -> float
+
+
+extern "__builtin_ldexpf" : float -> int -> float
+
+
+extern "__builtin_ldexpl" : float -> int -> float
+
+
+extern "__builtin_log" : float -> float
+
+
+extern "__builtin_logf" : float -> float
+
+
+extern "__builtin_logl" : float -> float
+
+
+extern "__builtin_log10" : float -> float
+
+
+extern "__builtin_log10f" : float -> float
+
+
+extern "__builtin_log10l" : float -> float
+
+
+extern "__builtin_modff" : float -> int -> float
+
+
+extern "__builtin_modfl" : float -> int -> float
+
+
+extern "__builtin_nan" : int -> float
+
+
+extern "__builtin_nanf" : int -> float
+
+
+extern "__builtin_nanl" : int -> float
+
+
+extern "__builtin_nans" : int -> float
+
+
+extern "__builtin_nansf" : int -> float
+
+
+extern "__builtin_nansl" : int -> float
+
+
+extern "__builtin_next_arg" : int
+
+
+extern "__builtin_object_size" : int -> int -> int
+
+
+extern "__builtin_parity" : int -> int
+
+
+extern "__builtin_parityl" : int -> int
+
+
+extern "__builtin_parityll" : int -> int
+
+
+extern "__builtin_popcount" : int -> int
+
+
+extern "__builtin_popcountl" : int -> int
+
+
+extern "__builtin_popcountll" : int -> int
+
+
+extern "__builtin_powi" : float -> int -> float
+
+
+extern "__builtin_powif" : float -> int -> float
+
+
+extern "__builtin_powil" : float -> int -> float
+
+
+extern "__builtin_return" : int -> void
+
+
+extern "__builtin_return_address" : int -> int
+
+
+extern "__builtin_sin" : float -> float
+
+
+extern "__builtin_sinf" : float -> float
+
+
+extern "__builtin_sinl" : float -> float
+
+
+extern "__builtin_sinh" : float -> float
+
+
+extern "__builtin_sinhf" : float -> float
+
+
+extern "__builtin_sinhl" : float -> float
+
+
+extern "__builtin_sqrt" : float -> float
+
+
+extern "__builtin_sqrtf" : float -> float
+
+
+extern "__builtin_sqrtl" : float -> float
+
+
+extern "__builtin_stpcpy" : int -> int -> int
+
+
+extern "__builtin_strchr" : int -> int -> int
+
+
+extern "__builtin_strcmp" : int -> int -> int
+
+
+extern "__builtin_strcpy" : int -> int -> int
+
+
+extern "__builtin_strcspn" : int -> int -> int
+
+
+extern "__builtin_strncat" : int -> int -> int -> int
+
+
+extern "__builtin_strncmp" : int -> int -> int -> int
+
+
+extern "__builtin_strncpy" : int -> int -> int -> int
+
+
+extern "__builtin_strspn" : int -> int -> int
+
+
+extern "__builtin_strpbrk" : int -> int -> int
+
+
+extern "__builtin_types_compatible_p" : int -> int -> int
+
+
+extern "__builtin_tan" : float -> float
+
+
+extern "__builtin_tanf" : float -> float
+
+
+extern "__builtin_tanl" : float -> float
+
+
+extern "__builtin_tanh" : float -> float
+
+
+extern "__builtin_tanhf" : float -> float
+
+
+extern "__builtin_tanhl" : float -> float
+
+
+extern "__builtin_va_end" : int -> void
+
+
+extern "__builtin_varargs_start" : int -> void
+
+
+extern "__builtin_va_start" : int -> int -> void
+
+
+extern "__builtin_stdarg_start" : int -> void
+
+
+extern "__builtin_va_arg" : int -> int -> void
+
+
+extern "__builtin_va_copy" : int -> int -> void
+
+
+"array_LE" (tabLE, tabLE2, i, j) : int -> int -> int -> int -> void {
+
+ stack 0;
+
+ c1:
+ int32[tabLE + (i * 4)] = 2;
+ c0:
+ int32[tabLE2 + ((j + 1) * 4)] = 78;
+
+}
+
+
+"main" () : int {
+
+ stack 40;
+
+ c13:
+ int32[&0 + (0 * 4)] = 0;
+ c12:
+ int32[&0 + (1 * 4)] = 0;
+ c11:
+ int32[&0 + (2 * 4)] = 0;
+ c10:
+ int32[&0 + (3 * 4)] = 0;
+ c9:
+ int32[&0 + (4 * 4)] = 0;
+ c8:
+ int32[&20 + (0 * 4)] = 0;
+ c7:
+ int32[&20 + (1 * 4)] = 0;
+ c6:
+ int32[&20 + (2 * 4)] = 0;
+ c5:
+ int32[&20 + (3 * 4)] = 0;
+ c4:
+ int32[&20 + (4 * 4)] = 0;
+ c3:
+ "array_LE"(&0, &20, 0, 0) : int -> int -> int -> int -> void;
+ c2:
+ return int32[&0 + (0 * 4)] + int32[&20 + (1 * 4)];
+
+}
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure array_LE(4)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22
+entry array_LE38
+array_LE38: newframe --> array_LE37
+array_LE37: move %22, $ra --> array_LE36
+array_LE36: move %21, $s7 --> array_LE35
+array_LE35: move %20, $s6 --> array_LE34
+array_LE34: move %19, $s5 --> array_LE33
+array_LE33: move %18, $s4 --> array_LE32
+array_LE32: move %17, $s3 --> array_LE31
+array_LE31: move %16, $s2 --> array_LE30
+array_LE30: move %15, $s1 --> array_LE29
+array_LE29: move %14, $s0 --> array_LE28
+array_LE28: move %0, $a0 --> array_LE27
+array_LE27: move %1, $a1 --> array_LE26
+array_LE26: move %2, $a2 --> array_LE25
+array_LE25: move %3, $a3 --> array_LE24
+array_LE24: li %4, 0 --> array_LE23
+array_LE23: li %5, 0 --> array_LE22
+array_LE22: li %6, 0 --> array_LE21
+array_LE21: li %7, 0 --> array_LE20
+array_LE20: li %8, 0 --> array_LE19
+array_LE19: li %9, 0 --> array_LE18
+array_LE18: li %10, 0 --> array_LE17
+array_LE17: li %11, 0 --> array_LE16
+array_LE16: li %12, 0 --> array_LE15
+array_LE15: li %13, 0 --> array_LE12
+array_LE12: emit c1 --> array_LE11
+array_LE11: li %9, 2 --> array_LE10
+array_LE10: li %11, 4 --> array_LE9
+array_LE9 : mulo %10, %2, %11 --> array_LE8
+array_LE8 : add %13, %0, %10 --> array_LE14
+array_LE14: sw %9, 0(%13) --> array_LE7
+array_LE7 : emit c0 --> array_LE6
+array_LE6 : li %4, 78 --> array_LE5
+array_LE5 : li %8, 1 --> array_LE4
+array_LE4 : add %6, %3, %8 --> array_LE3
+array_LE3 : li %7, 4 --> array_LE2
+array_LE2 : mulo %5, %6, %7 --> array_LE1
+array_LE1 : add %12, %1, %5 --> array_LE13
+array_LE13: sw %4, 0(%12) --> array_LE0
+array_LE0 : j --> array_LE49
+array_LE49: move $ra, %22 --> array_LE48
+array_LE48: move $s7, %21 --> array_LE47
+array_LE47: move $s6, %20 --> array_LE46
+array_LE46: move $s5, %19 --> array_LE45
+array_LE45: move $s4, %18 --> array_LE44
+array_LE44: move $s3, %17 --> array_LE43
+array_LE43: move $s2, %16 --> array_LE42
+array_LE42: move $s1, %15 --> array_LE41
+array_LE41: move $s0, %14 --> array_LE40
+array_LE40: delframe --> array_LE39
+array_LE39: jr $ra
+
+procedure _main(0)
+stacksize 40
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78, %79, %80, %81, %82, %83,
+ %84, %85, %86, %87
+entry main189
+main189: newframe --> main188
+main188: move %87, $ra --> main187
+main187: move %86, $s7 --> main186
+main186: move %85, $s6 --> main185
+main185: move %84, $s5 --> main184
+main184: move %83, $s4 --> main183
+main183: move %82, $s3 --> main182
+main182: move %81, $s2 --> main181
+main181: move %80, $s1 --> main180
+main180: move %79, $s0 --> main179
+main179: li %1, 0 --> main178
+main178: li %2, 0 --> main177
+main177: li %3, 0 --> main176
+main176: li %4, 0 --> main175
+main175: li %5, 0 --> main174
+main174: li %6, 0 --> main173
+main173: li %7, 0 --> main172
+main172: li %8, 0 --> main171
+main171: li %9, 0 --> main170
+main170: li %10, 0 --> main169
+main169: li %11, 0 --> main168
+main168: li %12, 0 --> main167
+main167: li %13, 0 --> main166
+main166: li %14, 0 --> main165
+main165: li %15, 0 --> main164
+main164: li %16, 0 --> main163
+main163: li %17, 0 --> main162
+main162: li %18, 0 --> main161
+main161: li %19, 0 --> main160
+main160: li %20, 0 --> main159
+main159: li %21, 0 --> main158
+main158: li %22, 0 --> main157
+main157: li %23, 0 --> main156
+main156: li %24, 0 --> main155
+main155: li %25, 0 --> main154
+main154: li %26, 0 --> main153
+main153: li %27, 0 --> main152
+main152: li %28, 0 --> main151
+main151: li %29, 0 --> main150
+main150: li %30, 0 --> main149
+main149: li %31, 0 --> main148
+main148: li %32, 0 --> main147
+main147: li %33, 0 --> main146
+main146: li %34, 0 --> main145
+main145: li %35, 0 --> main144
+main144: li %36, 0 --> main143
+main143: li %37, 0 --> main142
+main142: li %38, 0 --> main141
+main141: li %39, 0 --> main140
+main140: li %40, 0 --> main139
+main139: li %41, 0 --> main138
+main138: li %42, 0 --> main137
+main137: li %43, 0 --> main136
+main136: li %44, 0 --> main135
+main135: li %45, 0 --> main134
+main134: li %46, 0 --> main133
+main133: li %47, 0 --> main132
+main132: li %48, 0 --> main131
+main131: li %49, 0 --> main130
+main130: li %50, 0 --> main129
+main129: li %51, 0 --> main128
+main128: li %52, 0 --> main127
+main127: li %53, 0 --> main126
+main126: li %54, 0 --> main125
+main125: li %55, 0 --> main124
+main124: li %56, 0 --> main123
+main123: li %57, 0 --> main122
+main122: li %58, 0 --> main121
+main121: li %59, 0 --> main120
+main120: li %60, 0 --> main119
+main119: li %61, 0 --> main118
+main118: li %62, 0 --> main117
+main117: li %63, 0 --> main116
+main116: li %64, 0 --> main115
+main115: li %65, 0 --> main114
+main114: li %66, 0 --> main113
+main113: li %67, 0 --> main112
+main112: li %68, 0 --> main111
+main111: li %69, 0 --> main110
+main110: li %70, 0 --> main109
+main109: li %71, 0 --> main108
+main108: li %72, 0 --> main107
+main107: li %73, 0 --> main106
+main106: li %74, 0 --> main105
+main105: li %75, 0 --> main104
+main104: li %76, 0 --> main103
+main103: li %77, 0 --> main102
+main102: li %78, 0 --> main88
+main88 : emit c13 --> main87
+main87 : li %61, 0 --> main86
+main86 : move %62, $sp --> main215
+main215: move %62, %62 --> main85
+main85 : li %64, 0 --> main84
+main84 : li %65, 4 --> main83
+main83 : mulo %63, %64, %65 --> main82
+main82 : add %78, %62, %63 --> main101
+main101: sw %61, 0(%78) --> main81
+main81 : emit c12 --> main80
+main80 : li %56, 0 --> main79
+main79 : move %57, $sp --> main214
+main214: move %57, %57 --> main78
+main78 : li %59, 1 --> main77
+main77 : li %60, 4 --> main76
+main76 : mulo %58, %59, %60 --> main75
+main75 : add %77, %57, %58 --> main100
+main100: sw %56, 0(%77) --> main74
+main74 : emit c11 --> main73
+main73 : li %51, 0 --> main72
+main72 : move %52, $sp --> main213
+main213: move %52, %52 --> main71
+main71 : li %54, 2 --> main70
+main70 : li %55, 4 --> main69
+main69 : mulo %53, %54, %55 --> main68
+main68 : add %75, %52, %53 --> main98
+main98 : sw %51, 0(%75) --> main67
+main67 : emit c10 --> main66
+main66 : li %46, 0 --> main65
+main65 : move %47, $sp --> main212
+main212: move %47, %47 --> main64
+main64 : li %49, 3 --> main63
+main63 : li %50, 4 --> main62
+main62 : mulo %48, %49, %50 --> main61
+main61 : add %74, %47, %48 --> main97
+main97 : sw %46, 0(%74) --> main60
+main60 : emit c9 --> main59
+main59 : li %41, 0 --> main58
+main58 : move %42, $sp --> main210
+main210: move %42, %42 --> main57
+main57 : li %44, 4 --> main56
+main56 : li %45, 4 --> main55
+main55 : mulo %43, %44, %45 --> main54
+main54 : add %73, %42, %43 --> main96
+main96 : sw %41, 0(%73) --> main53
+main53 : emit c8 --> main52
+main52 : li %36, 0 --> main51
+main51 : move %37, $sp --> main209
+main209: addi %37, %37, 20 --> main50
+main50 : li %39, 0 --> main49
+main49 : li %40, 4 --> main48
+main48 : mulo %38, %39, %40 --> main47
+main47 : add %72, %37, %38 --> main95
+main95 : sw %36, 0(%72) --> main46
+main46 : emit c7 --> main45
+main45 : li %31, 0 --> main44
+main44 : move %32, $sp --> main208
+main208: addi %32, %32, 20 --> main43
+main43 : li %34, 1 --> main42
+main42 : li %35, 4 --> main41
+main41 : mulo %33, %34, %35 --> main40
+main40 : add %71, %32, %33 --> main94
+main94 : sw %31, 0(%71) --> main39
+main39 : emit c6 --> main38
+main38 : li %26, 0 --> main37
+main37 : move %27, $sp --> main207
+main207: addi %27, %27, 20 --> main36
+main36 : li %29, 2 --> main35
+main35 : li %30, 4 --> main34
+main34 : mulo %28, %29, %30 --> main33
+main33 : add %70, %27, %28 --> main93
+main93 : sw %26, 0(%70) --> main32
+main32 : emit c5 --> main31
+main31 : li %21, 0 --> main30
+main30 : move %22, $sp --> main206
+main206: addi %22, %22, 20 --> main29
+main29 : li %24, 3 --> main28
+main28 : li %25, 4 --> main27
+main27 : mulo %23, %24, %25 --> main26
+main26 : add %69, %22, %23 --> main92
+main92 : sw %21, 0(%69) --> main25
+main25 : emit c4 --> main24
+main24 : li %16, 0 --> main23
+main23 : move %17, $sp --> main205
+main205: addi %17, %17, 20 --> main22
+main22 : li %19, 4 --> main21
+main21 : li %20, 4 --> main20
+main20 : mulo %18, %19, %20 --> main19
+main19 : add %67, %17, %18 --> main90
+main90 : sw %16, 0(%67) --> main18
+main18 : emit c3 --> main17
+main17 : move %11, $sp --> main204
+main204: move %11, %11 --> main16
+main16 : move %12, $sp --> main203
+main203: addi %12, %12, 20 --> main15
+main15 : li %13, 0 --> main14
+main14 : li %14, 0 --> main13
+main13 : la %66, array_LE --> main89
+main89 : j --> main221
+main221: move $a0, %11 --> main220
+main220: move $a1, %12 --> main219
+main219: move $a2, %13 --> main218
+main218: move $a3, %14 --> main217
+main217: call %66(4) --> main216
+main216: move %15, $v0 --> main12
+main12 : emit c2 --> main11
+main11 : move %7, $sp --> main202
+main202: move %7, %7 --> main10
+main10 : li %9, 0 --> main9
+main9 : li %10, 4 --> main8
+main8 : mulo %8, %9, %10 --> main7
+main7 : add %76, %7, %8 --> main99
+main99 : lw %1, 0(%76) --> main6
+main6 : move %3, $sp --> main211
+main211: addi %3, %3, 20 --> main5
+main5 : li %5, 1 --> main4
+main4 : li %6, 4 --> main3
+main3 : mulo %4, %5, %6 --> main2
+main2 : add %68, %3, %4 --> main91
+main91 : lw %2, 0(%68) --> main1
+main1 : add %0, %1, %2 --> main0
+main0 : j --> main201
+main201: move $v0, %0 --> main200
+main200: move $ra, %87 --> main199
+main199: move $s7, %86 --> main198
+main198: move $s6, %85 --> main197
+main197: move $s5, %84 --> main196
+main196: move $s4, %83 --> main195
+main195: move $s3, %82 --> main194
+main194: move $s2, %81 --> main193
+main193: move $s1, %80 --> main192
+main192: move $s0, %79 --> main191
+main191: delframe --> main190
+main190: jr $ra (xmits $v0)
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure array_LE(4)
+var 0
+array_LE38:
+newframe
+c1:
+li $t0, 2
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+sw $t0, 0($v0)
+c0:
+li $a0, 78
+li $v0, 1
+add $a2, $a3, $v0
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a1, $v0
+sw $a0, 0($v0)
+delframe
+jr $ra
+
+procedure _main(0)
+var 44
+main189:
+newframe
+sw $ra, 40($sp)
+c13:
+li $a1, 0
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c12:
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c11:
+move $a1, $sp
+li $a0, 2
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c10:
+move $a1, $sp
+li $a0, 3
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c9:
+move $a1, $sp
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c8:
+li $a1, 0
+move $a0, $sp
+addi $a0, $a0, 20
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c7:
+move $a1, $sp
+addi $a1, $a1, 20
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c6:
+move $a1, $sp
+addi $a1, $a1, 20
+li $a0, 2
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c5:
+move $a1, $sp
+addi $a1, $a1, 20
+li $a0, 3
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c4:
+move $a1, $sp
+addi $a1, $a1, 20
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c3:
+move $a0, $sp
+move $a1, $sp
+addi $a1, $a1, 20
+li $a2, 0
+li $a3, 0
+la $v0, array_LE
+call $v0
+c2:
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+lw $v0, 0($v0)
+addi $sp, $sp, 20
+li $a1, 1
+li $a0, 4
+mulo $a0, $a1, $a0
+add $a0, $sp, $a0
+lw $a0, 0($a0)
+add $v0, $v0, $a0
+lw $ra, 40($sp)
+delframe
+jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure array_LE(4)
+var 0
+entry array_LE38
+array_LE38: newframe --> array_LE37
+array_LE37: j --> array_LE36
+array_LE36: j --> array_LE35
+array_LE35: j --> array_LE34
+array_LE34: j --> array_LE33
+array_LE33: j --> array_LE32
+array_LE32: j --> array_LE31
+array_LE31: j --> array_LE30
+array_LE30: j --> array_LE29
+array_LE29: j --> array_LE28
+array_LE28: j --> array_LE27
+array_LE27: j --> array_LE26
+array_LE26: j --> array_LE25
+array_LE25: j --> array_LE24
+array_LE24: j --> array_LE23
+array_LE23: j --> array_LE22
+array_LE22: j --> array_LE21
+array_LE21: j --> array_LE20
+array_LE20: j --> array_LE19
+array_LE19: j --> array_LE18
+array_LE18: j --> array_LE17
+array_LE17: j --> array_LE16
+array_LE16: j --> array_LE15
+array_LE15: j --> array_LE12
+array_LE12: emit c1 --> array_LE11
+array_LE11: li $t0, 2 --> array_LE10
+array_LE10: li $v0, 4 --> array_LE9
+array_LE9 : mulo $v0, $a2, $v0 --> array_LE8
+array_LE8 : add $v0, $a0, $v0 --> array_LE14
+array_LE14: lw $t0, 0($v0) --> array_LE7
+array_LE7 : emit c0 --> array_LE6
+array_LE6 : li $a0, 78 --> array_LE5
+array_LE5 : li $v0, 1 --> array_LE4
+array_LE4 : add $a2, $a3, $v0 --> array_LE3
+array_LE3 : li $v0, 4 --> array_LE2
+array_LE2 : mulo $v0, $a2, $v0 --> array_LE1
+array_LE1 : add $v0, $a1, $v0 --> array_LE13
+array_LE13: lw $a0, 0($v0) --> array_LE0
+array_LE0 : j --> array_LE49
+array_LE49: j --> array_LE48
+array_LE48: j --> array_LE47
+array_LE47: j --> array_LE46
+array_LE46: j --> array_LE45
+array_LE45: j --> array_LE44
+array_LE44: j --> array_LE43
+array_LE43: j --> array_LE42
+array_LE42: j --> array_LE41
+array_LE41: j --> array_LE40
+array_LE40: delframe --> array_LE39
+array_LE39: jr $ra
+
+procedure _main(0)
+var 44
+entry main189
+main189: newframe --> main188
+main188: lw $ra, 40($sp) --> main187
+main187: j --> main186
+main186: j --> main185
+main185: j --> main184
+main184: j --> main183
+main183: j --> main182
+main182: j --> main181
+main181: j --> main180
+main180: j --> main179
+main179: j --> main178
+main178: j --> main177
+main177: j --> main176
+main176: j --> main175
+main175: j --> main174
+main174: j --> main173
+main173: j --> main172
+main172: j --> main171
+main171: j --> main170
+main170: j --> main169
+main169: j --> main168
+main168: j --> main167
+main167: j --> main166
+main166: j --> main165
+main165: j --> main164
+main164: j --> main163
+main163: j --> main162
+main162: j --> main161
+main161: j --> main160
+main160: j --> main159
+main159: j --> main158
+main158: j --> main157
+main157: j --> main156
+main156: j --> main155
+main155: j --> main154
+main154: j --> main153
+main153: j --> main152
+main152: j --> main151
+main151: j --> main150
+main150: j --> main149
+main149: j --> main148
+main148: j --> main147
+main147: j --> main146
+main146: j --> main145
+main145: j --> main144
+main144: j --> main143
+main143: j --> main142
+main142: j --> main141
+main141: j --> main140
+main140: j --> main139
+main139: j --> main138
+main138: j --> main137
+main137: j --> main136
+main136: j --> main135
+main135: j --> main134
+main134: j --> main133
+main133: j --> main132
+main132: j --> main131
+main131: j --> main130
+main130: j --> main129
+main129: j --> main128
+main128: j --> main127
+main127: j --> main126
+main126: j --> main125
+main125: j --> main124
+main124: j --> main123
+main123: j --> main122
+main122: j --> main121
+main121: j --> main120
+main120: j --> main119
+main119: j --> main118
+main118: j --> main117
+main117: j --> main116
+main116: j --> main115
+main115: j --> main114
+main114: j --> main113
+main113: j --> main112
+main112: j --> main111
+main111: j --> main110
+main110: j --> main109
+main109: j --> main108
+main108: j --> main107
+main107: j --> main106
+main106: j --> main105
+main105: j --> main104
+main104: j --> main103
+main103: j --> main102
+main102: j --> main88
+main88 : emit c13 --> main87
+main87 : li $a1, 0 --> main86
+main86 : move $a0, $sp --> main215
+main215: j --> main85
+main85 : j --> main84
+main84 : li $v0, 4 --> main83
+main83 : mulo $v0, $zero, $v0 --> main82
+main82 : add $v0, $a0, $v0 --> main101
+main101: lw $a1, 0($v0) --> main81
+main81 : emit c12 --> main80
+main80 : j --> main79
+main79 : move $a1, $sp --> main214
+main214: j --> main78
+main78 : li $a0, 1 --> main77
+main77 : li $v0, 4 --> main76
+main76 : mulo $v0, $a0, $v0 --> main75
+main75 : add $v0, $a1, $v0 --> main100
+main100: lw $zero, 0($v0) --> main74
+main74 : emit c11 --> main73
+main73 : j --> main72
+main72 : move $a1, $sp --> main213
+main213: j --> main71
+main71 : li $a0, 2 --> main70
+main70 : li $v0, 4 --> main69
+main69 : mulo $v0, $a0, $v0 --> main68
+main68 : add $v0, $a1, $v0 --> main98
+main98 : lw $zero, 0($v0) --> main67
+main67 : emit c10 --> main66
+main66 : j --> main65
+main65 : move $a1, $sp --> main212
+main212: j --> main64
+main64 : li $a0, 3 --> main63
+main63 : li $v0, 4 --> main62
+main62 : mulo $v0, $a0, $v0 --> main61
+main61 : add $v0, $a1, $v0 --> main97
+main97 : lw $zero, 0($v0) --> main60
+main60 : emit c9 --> main59
+main59 : j --> main58
+main58 : move $a1, $sp --> main210
+main210: j --> main57
+main57 : li $a0, 4 --> main56
+main56 : li $v0, 4 --> main55
+main55 : mulo $v0, $a0, $v0 --> main54
+main54 : add $v0, $a1, $v0 --> main96
+main96 : lw $zero, 0($v0) --> main53
+main53 : emit c8 --> main52
+main52 : li $a1, 0 --> main51
+main51 : move $a0, $sp --> main209
+main209: addi $a0, $a0, 20 --> main50
+main50 : j --> main49
+main49 : li $v0, 4 --> main48
+main48 : mulo $v0, $zero, $v0 --> main47
+main47 : add $v0, $a0, $v0 --> main95
+main95 : lw $a1, 0($v0) --> main46
+main46 : emit c7 --> main45
+main45 : j --> main44
+main44 : move $a1, $sp --> main208
+main208: addi $a1, $a1, 20 --> main43
+main43 : li $a0, 1 --> main42
+main42 : li $v0, 4 --> main41
+main41 : mulo $v0, $a0, $v0 --> main40
+main40 : add $v0, $a1, $v0 --> main94
+main94 : lw $zero, 0($v0) --> main39
+main39 : emit c6 --> main38
+main38 : j --> main37
+main37 : move $a1, $sp --> main207
+main207: addi $a1, $a1, 20 --> main36
+main36 : li $a0, 2 --> main35
+main35 : li $v0, 4 --> main34
+main34 : mulo $v0, $a0, $v0 --> main33
+main33 : add $v0, $a1, $v0 --> main93
+main93 : lw $zero, 0($v0) --> main32
+main32 : emit c5 --> main31
+main31 : j --> main30
+main30 : move $a1, $sp --> main206
+main206: addi $a1, $a1, 20 --> main29
+main29 : li $a0, 3 --> main28
+main28 : li $v0, 4 --> main27
+main27 : mulo $v0, $a0, $v0 --> main26
+main26 : add $v0, $a1, $v0 --> main92
+main92 : lw $zero, 0($v0) --> main25
+main25 : emit c4 --> main24
+main24 : j --> main23
+main23 : move $a1, $sp --> main205
+main205: addi $a1, $a1, 20 --> main22
+main22 : li $a0, 4 --> main21
+main21 : li $v0, 4 --> main20
+main20 : mulo $v0, $a0, $v0 --> main19
+main19 : add $v0, $a1, $v0 --> main90
+main90 : lw $zero, 0($v0) --> main18
+main18 : emit c3 --> main17
+main17 : move $a0, $sp --> main204
+main204: j --> main16
+main16 : move $a1, $sp --> main203
+main203: addi $a1, $a1, 20 --> main15
+main15 : li $a2, 0 --> main14
+main14 : li $a3, 0 --> main13
+main13 : la $v0, array_LE --> main89
+main89 : j --> main221
+main221: j --> main220
+main220: j --> main219
+main219: j --> main218
+main218: j --> main217
+main217: call $v0 --> main216
+main216: j --> main12
+main12 : emit c2 --> main11
+main11 : move $a0, $sp --> main202
+main202: j --> main10
+main10 : j --> main9
+main9 : li $v0, 4 --> main8
+main8 : mulo $v0, $zero, $v0 --> main7
+main7 : add $v0, $a0, $v0 --> main99
+main99 : lw $v0, 0($v0) --> main6
+main6 : j --> main211
+main211: addi $sp, $sp, 20 --> main5
+main5 : li $a1, 1 --> main4
+main4 : li $a0, 4 --> main3
+main3 : mulo $a0, $a1, $a0 --> main2
+main2 : add $a0, $sp, $a0 --> main91
+main91 : lw $a0, 0($a0) --> main1
+main1 : add $v0, $v0, $a0 --> main0
+main0 : j --> main201
+main201: j --> main200
+main200: lw $ra, 40($sp) --> main199
+main199: j --> main198
+main198: j --> main197
+main197: j --> main196
+main196: j --> main195
+main195: j --> main194
+main194: j --> main193
+main193: j --> main192
+main192: j --> main191
+main191: delframe --> main190
+main190: jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 0
+
+procedure array_LE(%0; %1; %2; %3)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13
+entry array_LE24
+array_LE24: li %4, 0 --> array_LE23
+array_LE23: li %5, 0 --> array_LE22
+array_LE22: li %6, 0 --> array_LE21
+array_LE21: li %7, 0 --> array_LE20
+array_LE20: li %8, 0 --> array_LE19
+array_LE19: li %9, 0 --> array_LE18
+array_LE18: li %10, 0 --> array_LE17
+array_LE17: li %11, 0 --> array_LE16
+array_LE16: li %12, 0 --> array_LE15
+array_LE15: li %13, 0 --> array_LE12
+array_LE12: emit c1 --> array_LE11
+array_LE11: li %9, 2 --> array_LE10
+array_LE10: li %11, 4 --> array_LE9
+array_LE9 : mulo %10, %2, %11 --> array_LE8
+array_LE8 : add %13, %0, %10 --> array_LE14
+array_LE14: sw %9, 0(%13) --> array_LE7
+array_LE7 : emit c0 --> array_LE6
+array_LE6 : li %4, 78 --> array_LE5
+array_LE5 : li %8, 1 --> array_LE4
+array_LE4 : add %6, %3, %8 --> array_LE3
+array_LE3 : li %7, 4 --> array_LE2
+array_LE2 : mulo %5, %6, %7 --> array_LE1
+array_LE1 : add %12, %1, %5 --> array_LE13
+array_LE13: sw %4, 0(%12) --> array_LE0
+array_LE0 : return
+
+function _main() : %0
+stacksize 40
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70, %71, %72, %73, %74, %75, %76,
+ %77, %78
+entry main179
+main179: li %1, 0 --> main178
+main178: li %2, 0 --> main177
+main177: li %3, 0 --> main176
+main176: li %4, 0 --> main175
+main175: li %5, 0 --> main174
+main174: li %6, 0 --> main173
+main173: li %7, 0 --> main172
+main172: li %8, 0 --> main171
+main171: li %9, 0 --> main170
+main170: li %10, 0 --> main169
+main169: li %11, 0 --> main168
+main168: li %12, 0 --> main167
+main167: li %13, 0 --> main166
+main166: li %14, 0 --> main165
+main165: li %15, 0 --> main164
+main164: li %16, 0 --> main163
+main163: li %17, 0 --> main162
+main162: li %18, 0 --> main161
+main161: li %19, 0 --> main160
+main160: li %20, 0 --> main159
+main159: li %21, 0 --> main158
+main158: li %22, 0 --> main157
+main157: li %23, 0 --> main156
+main156: li %24, 0 --> main155
+main155: li %25, 0 --> main154
+main154: li %26, 0 --> main153
+main153: li %27, 0 --> main152
+main152: li %28, 0 --> main151
+main151: li %29, 0 --> main150
+main150: li %30, 0 --> main149
+main149: li %31, 0 --> main148
+main148: li %32, 0 --> main147
+main147: li %33, 0 --> main146
+main146: li %34, 0 --> main145
+main145: li %35, 0 --> main144
+main144: li %36, 0 --> main143
+main143: li %37, 0 --> main142
+main142: li %38, 0 --> main141
+main141: li %39, 0 --> main140
+main140: li %40, 0 --> main139
+main139: li %41, 0 --> main138
+main138: li %42, 0 --> main137
+main137: li %43, 0 --> main136
+main136: li %44, 0 --> main135
+main135: li %45, 0 --> main134
+main134: li %46, 0 --> main133
+main133: li %47, 0 --> main132
+main132: li %48, 0 --> main131
+main131: li %49, 0 --> main130
+main130: li %50, 0 --> main129
+main129: li %51, 0 --> main128
+main128: li %52, 0 --> main127
+main127: li %53, 0 --> main126
+main126: li %54, 0 --> main125
+main125: li %55, 0 --> main124
+main124: li %56, 0 --> main123
+main123: li %57, 0 --> main122
+main122: li %58, 0 --> main121
+main121: li %59, 0 --> main120
+main120: li %60, 0 --> main119
+main119: li %61, 0 --> main118
+main118: li %62, 0 --> main117
+main117: li %63, 0 --> main116
+main116: li %64, 0 --> main115
+main115: li %65, 0 --> main114
+main114: li %66, 0 --> main113
+main113: li %67, 0 --> main112
+main112: li %68, 0 --> main111
+main111: li %69, 0 --> main110
+main110: li %70, 0 --> main109
+main109: li %71, 0 --> main108
+main108: li %72, 0 --> main107
+main107: li %73, 0 --> main106
+main106: li %74, 0 --> main105
+main105: li %75, 0 --> main104
+main104: li %76, 0 --> main103
+main103: li %77, 0 --> main102
+main102: li %78, 0 --> main88
+main88 : emit c13 --> main87
+main87 : li %61, 0 --> main86
+main86 : addi %62, STACK, 0 --> main85
+main85 : li %64, 0 --> main84
+main84 : li %65, 4 --> main83
+main83 : mulo %63, %64, %65 --> main82
+main82 : add %78, %62, %63 --> main101
+main101: sw %61, 0(%78) --> main81
+main81 : emit c12 --> main80
+main80 : li %56, 0 --> main79
+main79 : addi %57, STACK, 0 --> main78
+main78 : li %59, 1 --> main77
+main77 : li %60, 4 --> main76
+main76 : mulo %58, %59, %60 --> main75
+main75 : add %77, %57, %58 --> main100
+main100: sw %56, 0(%77) --> main74
+main74 : emit c11 --> main73
+main73 : li %51, 0 --> main72
+main72 : addi %52, STACK, 0 --> main71
+main71 : li %54, 2 --> main70
+main70 : li %55, 4 --> main69
+main69 : mulo %53, %54, %55 --> main68
+main68 : add %75, %52, %53 --> main98
+main98 : sw %51, 0(%75) --> main67
+main67 : emit c10 --> main66
+main66 : li %46, 0 --> main65
+main65 : addi %47, STACK, 0 --> main64
+main64 : li %49, 3 --> main63
+main63 : li %50, 4 --> main62
+main62 : mulo %48, %49, %50 --> main61
+main61 : add %74, %47, %48 --> main97
+main97 : sw %46, 0(%74) --> main60
+main60 : emit c9 --> main59
+main59 : li %41, 0 --> main58
+main58 : addi %42, STACK, 0 --> main57
+main57 : li %44, 4 --> main56
+main56 : li %45, 4 --> main55
+main55 : mulo %43, %44, %45 --> main54
+main54 : add %73, %42, %43 --> main96
+main96 : sw %41, 0(%73) --> main53
+main53 : emit c8 --> main52
+main52 : li %36, 0 --> main51
+main51 : addi %37, STACK, 20 --> main50
+main50 : li %39, 0 --> main49
+main49 : li %40, 4 --> main48
+main48 : mulo %38, %39, %40 --> main47
+main47 : add %72, %37, %38 --> main95
+main95 : sw %36, 0(%72) --> main46
+main46 : emit c7 --> main45
+main45 : li %31, 0 --> main44
+main44 : addi %32, STACK, 20 --> main43
+main43 : li %34, 1 --> main42
+main42 : li %35, 4 --> main41
+main41 : mulo %33, %34, %35 --> main40
+main40 : add %71, %32, %33 --> main94
+main94 : sw %31, 0(%71) --> main39
+main39 : emit c6 --> main38
+main38 : li %26, 0 --> main37
+main37 : addi %27, STACK, 20 --> main36
+main36 : li %29, 2 --> main35
+main35 : li %30, 4 --> main34
+main34 : mulo %28, %29, %30 --> main33
+main33 : add %70, %27, %28 --> main93
+main93 : sw %26, 0(%70) --> main32
+main32 : emit c5 --> main31
+main31 : li %21, 0 --> main30
+main30 : addi %22, STACK, 20 --> main29
+main29 : li %24, 3 --> main28
+main28 : li %25, 4 --> main27
+main27 : mulo %23, %24, %25 --> main26
+main26 : add %69, %22, %23 --> main92
+main92 : sw %21, 0(%69) --> main25
+main25 : emit c4 --> main24
+main24 : li %16, 0 --> main23
+main23 : addi %17, STACK, 20 --> main22
+main22 : li %19, 4 --> main21
+main21 : li %20, 4 --> main20
+main20 : mulo %18, %19, %20 --> main19
+main19 : add %67, %17, %18 --> main90
+main90 : sw %16, 0(%67) --> main18
+main18 : emit c3 --> main17
+main17 : addi %11, STACK, 0 --> main16
+main16 : addi %12, STACK, 20 --> main15
+main15 : li %13, 0 --> main14
+main14 : li %14, 0 --> main13
+main13 : la %66, array_LE --> main89
+main89 : call %15, %66(%11, %12, %13, %14) --> main12
+main12 : emit c2 --> main11
+main11 : addi %7, STACK, 0 --> main10
+main10 : li %9, 0 --> main9
+main9 : li %10, 4 --> main8
+main8 : mulo %8, %9, %10 --> main7
+main7 : add %76, %7, %8 --> main99
+main99 : lw %1, 0(%76) --> main6
+main6 : addi %3, STACK, 20 --> main5
+main5 : li %5, 1 --> main4
+main4 : li %6, 4 --> main3
+main3 : mulo %4, %5, %6 --> main2
+main2 : add %68, %3, %4 --> main91
+main91 : lw %2, 0(%68) --> main1
+main1 : add %0, %1, %2 --> main0
+main0 : return %0
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program: (main function is "main")
+
+
+ globals:
+
+
+ "__builtin___memcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memmove_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___mempcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memset_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___stpcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strcat_chk": int -> int -> int -> int
+
+
+ "__builtin___strcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strncat_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___strncpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vfprintf_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vprintf_chk": int -> int -> int -> int
+
+
+ "__builtin___vsnprintf_chk": int -> int -> int -> int -> int -> int -> int
+
+
+ "__builtin___vsprintf_chk": int -> int -> int -> int -> int -> int
+
+
+ "__builtin_acos": float -> float
+
+
+ "__builtin_acosf": float -> float
+
+
+ "__builtin_acosl": float -> float
+
+
+ "__builtin_alloca": int -> int
+
+
+ "__builtin_asin": float -> float
+
+
+ "__builtin_asinf": float -> float
+
+
+ "__builtin_asinl": float -> float
+
+
+ "__builtin_atan": float -> float
+
+
+ "__builtin_atanf": float -> float
+
+
+ "__builtin_atanl": float -> float
+
+
+ "__builtin_atan2": float -> float -> float
+
+
+ "__builtin_atan2f": float -> float -> float
+
+
+ "__builtin_atan2l": float -> float -> float
+
+
+ "__builtin_ceil": float -> float
+
+
+ "__builtin_ceilf": float -> float
+
+
+ "__builtin_ceill": float -> float
+
+
+ "__builtin_cos": float -> float
+
+
+ "__builtin_cosf": float -> float
+
+
+ "__builtin_cosl": float -> float
+
+
+ "__builtin_cosh": float -> float
+
+
+ "__builtin_coshf": float -> float
+
+
+ "__builtin_coshl": float -> float
+
+
+ "__builtin_clz": int -> int
+
+
+ "__builtin_clzl": int -> int
+
+
+ "__builtin_clzll": int -> int
+
+
+ "__builtin_constant_p": int -> int
+
+
+ "__builtin_ctz": int -> int
+
+
+ "__builtin_ctzl": int -> int
+
+
+ "__builtin_ctzll": int -> int
+
+
+ "__builtin_exp": float -> float
+
+
+ "__builtin_expf": float -> float
+
+
+ "__builtin_expl": float -> float
+
+
+ "__builtin_expect": int -> int -> int
+
+
+ "__builtin_fabs": float -> float
+
+
+ "__builtin_fabsf": float -> float
+
+
+ "__builtin_fabsl": float -> float
+
+
+ "__builtin_ffs": int -> int
+
+
+ "__builtin_ffsl": int -> int
+
+
+ "__builtin_ffsll": int -> int
+
+
+ "__builtin_frame_address": int -> int
+
+
+ "__builtin_floor": float -> float
+
+
+ "__builtin_floorf": float -> float
+
+
+ "__builtin_floorl": float -> float
+
+
+ "__builtin_huge_val": float
+
+
+ "__builtin_huge_valf": float
+
+
+ "__builtin_huge_vall": float
+
+
+ "__builtin_inf": float
+
+
+ "__builtin_inff": float
+
+
+ "__builtin_infl": float
+
+
+ "__builtin_memcpy": int -> int -> int -> int
+
+
+ "__builtin_mempcpy": int -> int -> int -> int
+
+
+ "__builtin_fmod": float -> float
+
+
+ "__builtin_fmodf": float -> float
+
+
+ "__builtin_fmodl": float -> float
+
+
+ "__builtin_frexp": float -> int -> float
+
+
+ "__builtin_frexpf": float -> int -> float
+
+
+ "__builtin_frexpl": float -> int -> float
+
+
+ "__builtin_ldexp": float -> int -> float
+
+
+ "__builtin_ldexpf": float -> int -> float
+
+
+ "__builtin_ldexpl": float -> int -> float
+
+
+ "__builtin_log": float -> float
+
+
+ "__builtin_logf": float -> float
+
+
+ "__builtin_logl": float -> float
+
+
+ "__builtin_log10": float -> float
+
+
+ "__builtin_log10f": float -> float
+
+
+ "__builtin_log10l": float -> float
+
+
+ "__builtin_modff": float -> int -> float
+
+
+ "__builtin_modfl": float -> int -> float
+
+
+ "__builtin_nan": int -> float
+
+
+ "__builtin_nanf": int -> float
+
+
+ "__builtin_nanl": int -> float
+
+
+ "__builtin_nans": int -> float
+
+
+ "__builtin_nansf": int -> float
+
+
+ "__builtin_nansl": int -> float
+
+
+ "__builtin_next_arg": int
+
+
+ "__builtin_object_size": int -> int -> int
+
+
+ "__builtin_parity": int -> int
+
+
+ "__builtin_parityl": int -> int
+
+
+ "__builtin_parityll": int -> int
+
+
+ "__builtin_popcount": int -> int
+
+
+ "__builtin_popcountl": int -> int
+
+
+ "__builtin_popcountll": int -> int
+
+
+ "__builtin_powi": float -> int -> float
+
+
+ "__builtin_powif": float -> int -> float
+
+
+ "__builtin_powil": float -> int -> float
+
+
+ "__builtin_return": int -> void
+
+
+ "__builtin_return_address": int -> int
+
+
+ "__builtin_sin": float -> float
+
+
+ "__builtin_sinf": float -> float
+
+
+ "__builtin_sinl": float -> float
+
+
+ "__builtin_sinh": float -> float
+
+
+ "__builtin_sinhf": float -> float
+
+
+ "__builtin_sinhl": float -> float
+
+
+ "__builtin_sqrt": float -> float
+
+
+ "__builtin_sqrtf": float -> float
+
+
+ "__builtin_sqrtl": float -> float
+
+
+ "__builtin_stpcpy": int -> int -> int
+
+
+ "__builtin_strchr": int -> int -> int
+
+
+ "__builtin_strcmp": int -> int -> int
+
+
+ "__builtin_strcpy": int -> int -> int
+
+
+ "__builtin_strcspn": int -> int -> int
+
+
+ "__builtin_strncat": int -> int -> int -> int
+
+
+ "__builtin_strncmp": int -> int -> int -> int
+
+
+ "__builtin_strncpy": int -> int -> int -> int
+
+
+ "__builtin_strspn": int -> int -> int
+
+
+ "__builtin_strpbrk": int -> int -> int
+
+
+ "__builtin_types_compatible_p": int -> int -> int
+
+
+ "__builtin_tan": float -> float
+
+
+ "__builtin_tanf": float -> float
+
+
+ "__builtin_tanl": float -> float
+
+
+ "__builtin_tanh": float -> float
+
+
+ "__builtin_tanhf": float -> float
+
+
+ "__builtin_tanhl": float -> float
+
+
+ "__builtin_va_end": int -> void
+
+
+ "__builtin_varargs_start": int -> void
+
+
+ "__builtin_va_start": int -> int -> void
+
+
+ "__builtin_stdarg_start": int -> void
+
+
+ "__builtin_va_arg": int -> int -> void
+
+
+ "__builtin_va_copy": int -> int -> void
+
+
+ "array_LE"(%0, %1, %2, %3): int -> int -> int -> int -> void
+ locals: %4, %5, %6, %7, %8, %9, %10, %11
+ stacksize: 0
+ entry: array_LE12
+ exit: array_LE0
+
+ array_LE9: mul %10, %2, %11 --> array_LE8
+ array_LE8: store int32, add, %0, %10, %9 --> array_LE7
+ array_LE7: emit c0 --> array_LE6
+ array_LE6: imm_int 78, %4, --> array_LE5
+ array_LE5: imm_int 1, %8, --> array_LE4
+ array_LE4: add %6, %3, %8 --> array_LE3
+ array_LE3: imm_int 4, %7, --> array_LE2
+ array_LE2: mul %5, %6, %7 --> array_LE1
+ array_LE12: emit c1 --> array_LE11
+ array_LE11: imm_int 2, %9, --> array_LE10
+ array_LE10: imm_int 4, %11, --> array_LE9
+ array_LE1: store int32, add, %1, %5, %4 --> array_LE0
+ array_LE0: return
+
+
+ "main"(): int
+ locals: %0, %1, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31, %32, %33, %34, %35, %36, %37, %38, %39, %40, %41, %42, %43, %44, %45, %46, %47, %48, %49, %50, %51, %52, %53, %54, %55, %56, %57, %58, %59, %60, %61, %62, %63, %64, %65
+ result: %0
+ stacksize: 40
+ entry: main88
+ exit: main0
+
+ main9: imm_int 4, %10, --> main8
+ main88: emit c13 --> main87
+ main87: imm_int 0, %61, --> main86
+ main86: imm_addr 0($sp), %62, --> main85
+ main85: imm_int 0, %64, --> main84
+ main84: imm_int 4, %65, --> main83
+ main83: mul %63, %64, %65 --> main82
+ main82: store int32, add, %62, %63, %61 --> main81
+ main81: emit c12 --> main80
+ main80: imm_int 0, %56, --> main79
+ main8: mul %8, %9, %10 --> main7
+ main79: imm_addr 0($sp), %57, --> main78
+ main78: imm_int 1, %59, --> main77
+ main77: imm_int 4, %60, --> main76
+ main76: mul %58, %59, %60 --> main75
+ main75: store int32, add, %57, %58, %56 --> main74
+ main74: emit c11 --> main73
+ main73: imm_int 0, %51, --> main72
+ main72: imm_addr 0($sp), %52, --> main71
+ main71: imm_int 2, %54, --> main70
+ main70: imm_int 4, %55, --> main69
+ main7: load int32, add, %7, %8, %1 --> main6
+ main69: mul %53, %54, %55 --> main68
+ main68: store int32, add, %52, %53, %51 --> main67
+ main67: emit c10 --> main66
+ main66: imm_int 0, %46, --> main65
+ main65: imm_addr 0($sp), %47, --> main64
+ main64: imm_int 3, %49, --> main63
+ main63: imm_int 4, %50, --> main62
+ main62: mul %48, %49, %50 --> main61
+ main61: store int32, add, %47, %48, %46 --> main60
+ main60: emit c9 --> main59
+ main6: imm_addr 20($sp), %3, --> main5
+ main59: imm_int 0, %41, --> main58
+ main58: imm_addr 0($sp), %42, --> main57
+ main57: imm_int 4, %44, --> main56
+ main56: imm_int 4, %45, --> main55
+ main55: mul %43, %44, %45 --> main54
+ main54: store int32, add, %42, %43, %41 --> main53
+ main53: emit c8 --> main52
+ main52: imm_int 0, %36, --> main51
+ main51: imm_addr 20($sp), %37, --> main50
+ main50: imm_int 0, %39, --> main49
+ main5: imm_int 1, %5, --> main4
+ main49: imm_int 4, %40, --> main48
+ main48: mul %38, %39, %40 --> main47
+ main47: store int32, add, %37, %38, %36 --> main46
+ main46: emit c7 --> main45
+ main45: imm_int 0, %31, --> main44
+ main44: imm_addr 20($sp), %32, --> main43
+ main43: imm_int 1, %34, --> main42
+ main42: imm_int 4, %35, --> main41
+ main41: mul %33, %34, %35 --> main40
+ main40: store int32, add, %32, %33, %31 --> main39
+ main4: imm_int 4, %6, --> main3
+ main39: emit c6 --> main38
+ main38: imm_int 0, %26, --> main37
+ main37: imm_addr 20($sp), %27, --> main36
+ main36: imm_int 2, %29, --> main35
+ main35: imm_int 4, %30, --> main34
+ main34: mul %28, %29, %30 --> main33
+ main33: store int32, add, %27, %28, %26 --> main32
+ main32: emit c5 --> main31
+ main31: imm_int 0, %21, --> main30
+ main30: imm_addr 20($sp), %22, --> main29
+ main3: mul %4, %5, %6 --> main2
+ main29: imm_int 3, %24, --> main28
+ main28: imm_int 4, %25, --> main27
+ main27: mul %23, %24, %25 --> main26
+ main26: store int32, add, %22, %23, %21 --> main25
+ main25: emit c4 --> main24
+ main24: imm_int 0, %16, --> main23
+ main23: imm_addr 20($sp), %17, --> main22
+ main22: imm_int 4, %19, --> main21
+ main21: imm_int 4, %20, --> main20
+ main20: mul %18, %19, %20 --> main19
+ main2: load int32, add, %3, %4, %2 --> main1
+ main19: store int32, add, %17, %18, %16 --> main18
+ main18: emit c3 --> main17
+ main17: imm_addr 0($sp), %11, --> main16
+ main16: imm_addr 20($sp), %12, --> main15
+ main15: imm_int 0, %13, --> main14
+ main14: imm_int 0, %14, --> main13
+ main13: call "array_LE", %11, %12, %13, %14, %15: int -> int -> int -> int -> void --> main12
+ main12: emit c2 --> main11
+ main11: imm_addr 0($sp), %7, --> main10
+ main10: imm_int 0, %9, --> main9
+ main1: add %0, %1, %2 --> main0
+ main0: return %0
+
+
--- /dev/null
+void array_LE (int tabLE[], int tabLE2[], int i, int j) {\r
+ tabLE[i] = 2;\r
+ tabLE2[j+1] = 78;\r
+}\r
+int main(){\r
+ int t1[5] = {0,0,0,0,0};\r
+ int t2[5] = {0,0,0,0,0};\r
+ array_LE(t1,t2,0,0);\r
+ return t1[0]+t2[1];\r
+}\r
--- /dev/null
+void array_LE (int tabLE[], int tabLE2[], int i, int j) {\r
+ tabLE[i] = 2;\r
+ tabLE2[j+1] = 78;\r
+}\r
+int main(){\r
+ int t1[5] = {0,0,0,0,0};\r
+ int t2[5] = {0,0,0,0,0};\r
+ array_LE(t1,t2,0,0);\r
+ return t1[0]+t2[1];\r
+}\r
--- /dev/null
+Global Error (Translation RTLabs -> RTL):
+ Constant not supported.
--- /dev/null
+# extern __builtin_varargs_start: int -> void
+# extern __builtin_va_start: int -> int -> void
+# extern __builtin_va_end: int -> void
+# extern __builtin_va_copy: int -> int -> void
+# extern __builtin_va_arg: int -> int -> void
+# extern __builtin_types_compatible_p: int -> int -> int
+# extern __builtin_tanl: float -> float
+# extern __builtin_tanhl: float -> float
+# extern __builtin_tanhf: float -> float
+# extern __builtin_tanh: float -> float
+# extern __builtin_tanf: float -> float
+# extern __builtin_tan: float -> float
+# extern __builtin_strspn: int -> int -> int
+# extern __builtin_strpbrk: int -> int -> int
+# extern __builtin_strncpy: int -> int -> int -> int
+# extern __builtin_strncmp: int -> int -> int -> int
+# extern __builtin_strncat: int -> int -> int -> int
+# extern __builtin_strcspn: int -> int -> int
+# extern __builtin_strcpy: int -> int -> int
+# extern __builtin_strcmp: int -> int -> int
+# extern __builtin_strchr: int -> int -> int
+# extern __builtin_stpcpy: int -> int -> int
+# extern __builtin_stdarg_start: int -> void
+# extern __builtin_sqrtl: float -> float
+# extern __builtin_sqrtf: float -> float
+# extern __builtin_sqrt: float -> float
+# extern __builtin_sinl: float -> float
+# extern __builtin_sinhl: float -> float
+# extern __builtin_sinhf: float -> float
+# extern __builtin_sinh: float -> float
+# extern __builtin_sinf: float -> float
+# extern __builtin_sin: float -> float
+# extern __builtin_return_address: int -> int
+# extern __builtin_return: int -> void
+# extern __builtin_powil: float -> int -> float
+# extern __builtin_powif: float -> int -> float
+# extern __builtin_powi: float -> int -> float
+# extern __builtin_popcountll: int -> int
+# extern __builtin_popcountl: int -> int
+# extern __builtin_popcount: int -> int
+# extern __builtin_parityll: int -> int
+# extern __builtin_parityl: int -> int
+# extern __builtin_parity: int -> int
+# extern __builtin_object_size: int -> int -> int
+# extern __builtin_next_arg: int
+# extern __builtin_nansl: int -> float
+# extern __builtin_nansf: int -> float
+# extern __builtin_nans: int -> float
+# extern __builtin_nanl: int -> float
+# extern __builtin_nanf: int -> float
+# extern __builtin_nan: int -> float
+# extern __builtin_modfl: float -> int -> float
+# extern __builtin_modff: float -> int -> float
+# extern __builtin_mempcpy: int -> int -> int -> int
+# extern __builtin_memcpy: int -> int -> int -> int
+# extern __builtin_logl: float -> float
+# extern __builtin_logf: float -> float
+# extern __builtin_log10l: float -> float
+# extern __builtin_log10f: float -> float
+# extern __builtin_log10: float -> float
+# extern __builtin_log: float -> float
+# extern __builtin_ldexpl: float -> int -> float
+# extern __builtin_ldexpf: float -> int -> float
+# extern __builtin_ldexp: float -> int -> float
+# extern __builtin_infl: float
+# extern __builtin_inff: float
+# extern __builtin_inf: float
+# extern __builtin_huge_vall: float
+# extern __builtin_huge_valf: float
+# extern __builtin_huge_val: float
+# extern __builtin_frexpl: float -> int -> float
+# extern __builtin_frexpf: float -> int -> float
+# extern __builtin_frexp: float -> int -> float
+# extern __builtin_frame_address: int -> int
+# extern __builtin_fmodl: float -> float
+# extern __builtin_fmodf: float -> float
+# extern __builtin_fmod: float -> float
+# extern __builtin_floorl: float -> float
+# extern __builtin_floorf: float -> float
+# extern __builtin_floor: float -> float
+# extern __builtin_ffsll: int -> int
+# extern __builtin_ffsl: int -> int
+# extern __builtin_ffs: int -> int
+# extern __builtin_fabsl: float -> float
+# extern __builtin_fabsf: float -> float
+# extern __builtin_fabs: float -> float
+# extern __builtin_expl: float -> float
+# extern __builtin_expf: float -> float
+# extern __builtin_expect: int -> int -> int
+# extern __builtin_exp: float -> float
+# extern __builtin_ctzll: int -> int
+# extern __builtin_ctzl: int -> int
+# extern __builtin_ctz: int -> int
+# extern __builtin_cosl: float -> float
+# extern __builtin_coshl: float -> float
+# extern __builtin_coshf: float -> float
+# extern __builtin_cosh: float -> float
+# extern __builtin_cosf: float -> float
+# extern __builtin_cos: float -> float
+# extern __builtin_constant_p: int -> int
+# extern __builtin_clzll: int -> int
+# extern __builtin_clzl: int -> int
+# extern __builtin_clz: int -> int
+# extern __builtin_ceill: float -> float
+# extern __builtin_ceilf: float -> float
+# extern __builtin_ceil: float -> float
+# extern __builtin_atanl: float -> float
+# extern __builtin_atanf: float -> float
+# extern __builtin_atan2l: float -> float -> float
+# extern __builtin_atan2f: float -> float -> float
+# extern __builtin_atan2: float -> float -> float
+# extern __builtin_atan: float -> float
+# extern __builtin_asinl: float -> float
+# extern __builtin_asinf: float -> float
+# extern __builtin_asin: float -> float
+# extern __builtin_alloca: int -> int
+# extern __builtin_acosl: float -> float
+# extern __builtin_acosf: float -> float
+# extern __builtin_acos: float -> float
+# extern __builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+# extern __builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+# extern __builtin___vprintf_chk: int -> int -> int -> int
+# extern __builtin___vfprintf_chk: int -> int -> int -> int -> int
+# extern __builtin___strncpy_chk: int -> int -> int -> int -> int
+# extern __builtin___strncat_chk: int -> int -> int -> int -> int
+# extern __builtin___strcpy_chk: int -> int -> int -> int
+# extern __builtin___strcat_chk: int -> int -> int -> int
+# extern __builtin___stpcpy_chk: int -> int -> int -> int
+# extern __builtin___memset_chk: int -> int -> int -> int -> int
+# extern __builtin___mempcpy_chk: int -> int -> int -> int -> int
+# extern __builtin___memmove_chk: int -> int -> int -> int -> int
+# extern __builtin___memcpy_chk: int -> int -> int -> int -> int
+
+# begin preamble
+.data
+globals:
+.space 20
+nl:
+.asciiz "\n"
+.align 2
+.text
+main:
+la $gp, globals
+j main120
+print_int:
+li $v0, 1
+syscall
+jr $ra
+print_intln:
+li $v0, 1
+syscall
+la $a0, nl
+li $v0, 4
+syscall
+jr $ra
+scan_int:
+li $v0, 5
+syscall
+jr $ra
+alloc:
+li $v0, 9
+syscall
+jr $ra
+
+pow2:
+li $v0, 1
+sllv $v0, $v0, $a0
+jr $ra
+
+mod:
+beqz $a0, mod0
+beqz $a1, mod0
+li $t2, 0
+mod_t0:
+bgtz $a0, mod_a0_pos
+neg $t0, $a0
+addi $t2, $t2, 1
+j mod_t1
+mod_a0_pos:
+move $t0, $a0
+mod_t1:
+bgtz $a1, mod_a1_pos
+neg $t1, $a1
+addi $t2, $t2, 2
+j mod_main
+mod_a1_pos:
+move $t1, $a1
+mod_main:
+rem $v0, $t0, $t1
+beqz $t2, mod_exit
+addi $t2, -1
+beqz $t2, mod_case1
+addi $t2, -1
+beqz $t2, mod_case2
+neg $v0, $v0
+j mod_exit
+mod_case1:
+sub $v0, $a1, $v0
+j mod_exit
+mod_case2:
+add $v0, $a1, $v0
+j mod_exit
+mod0:
+li $v0, 0
+mod_exit:
+jr $ra
+
+toint:
+# $a0: size
+# $a1: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+jal pow2
+move $a0, $a1
+move $a1, $v0
+jal mod
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 8
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 16
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+sign_ext:
+# $a0: size
+# $a1: int to extend
+li $v0, 32
+sub $a0, $v0, $a0
+sllv $v0, $a1, $a0
+srav $v0, $v0, $a0
+jr $ra
+
+ofint:
+# $a0: signedness
+# $a1: size
+# $a2: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+beqz $a0, ofint_unsigned
+move $a0, $a1
+move $a1, $a2
+jal sign_ext
+j ofint_exit
+ofint_unsigned:
+move $v0, $a2
+ofint_exit:
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+# end preamble
+
+
+# begin array_double
+array_double49:
+c2:
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a1, $v0
+lw $a2, 0($v0)
+c1:
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $a1, $v0
+lw $v0, 0($v0)
+add $a1, $v0, $a2
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c0:
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $a0, $v0
+lw $v0, 0($v0)
+jr $ra
+# end array_double
+
+
+# begin _main
+main120:
+addi $sp, $sp, -24
+sw $ra, 20($sp)
+li $a0, 13
+move $v0, $gp
+sw $a0, 0($v0)
+li $a0, 21
+move $v0, $gp
+sw $a0, 4($v0)
+li $a0, 34
+move $v0, $gp
+sw $a0, 8($v0)
+li $a0, 55
+move $v0, $gp
+sw $a0, 12($v0)
+li $a0, 89
+move $v0, $gp
+sw $a0, 16($v0)
+c9:
+li $a1, 0
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c8:
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c7:
+move $a1, $sp
+li $a0, 2
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c6:
+move $a1, $sp
+li $a0, 3
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c5:
+move $a1, $sp
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c4:
+move $a0, $sp
+move $a1, $gp
+li $a2, 0
+li $a3, 0
+la $v0, array_double49
+jalr $v0
+c3:
+lw $ra, 20($sp)
+addi $sp, $sp, 24
+jr $ra
+# end _main
--- /dev/null
+int t2[5] = { 13, 21, 34, 55, 89, };
+
+extern void *__builtin___memcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memmove_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___mempcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memset_chk(void *, int, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___stpcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcat_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strncat_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___strncpy_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern int __builtin___vfprintf_chk(void *, int, unsigned char *, void *);
+
+extern int __builtin___vprintf_chk(int, unsigned char *, void *);
+
+extern int __builtin___vsnprintf_chk(unsigned char *, unsigned int, int, unsigned int, unsigned char *, void *);
+
+extern int __builtin___vsprintf_chk(unsigned char *, int, unsigned int, unsigned char *, void *);
+
+extern double __builtin_acos(double);
+
+extern float __builtin_acosf(float);
+
+extern double __builtin_acosl(double);
+
+extern void *__builtin_alloca(unsigned int);
+
+extern double __builtin_asin(double);
+
+extern float __builtin_asinf(float);
+
+extern double __builtin_asinl(double);
+
+extern double __builtin_atan(double);
+
+extern float __builtin_atanf(float);
+
+extern double __builtin_atanl(double);
+
+extern double __builtin_atan2(double, double);
+
+extern float __builtin_atan2f(float, float);
+
+extern double __builtin_atan2l(double, double);
+
+extern double __builtin_ceil(double);
+
+extern float __builtin_ceilf(float);
+
+extern double __builtin_ceill(double);
+
+extern double __builtin_cos(double);
+
+extern float __builtin_cosf(float);
+
+extern double __builtin_cosl(double);
+
+extern double __builtin_cosh(double);
+
+extern float __builtin_coshf(float);
+
+extern double __builtin_coshl(double);
+
+extern int __builtin_clz(unsigned int);
+
+extern int __builtin_clzl(unsigned int);
+
+extern int __builtin_clzll(unsigned int);
+
+extern int __builtin_constant_p(int);
+
+extern int __builtin_ctz(unsigned int);
+
+extern int __builtin_ctzl(unsigned int);
+
+extern int __builtin_ctzll(unsigned int);
+
+extern double __builtin_exp(double);
+
+extern float __builtin_expf(float);
+
+extern double __builtin_expl(double);
+
+extern int __builtin_expect(int, int);
+
+extern double __builtin_fabs(double);
+
+extern float __builtin_fabsf(float);
+
+extern double __builtin_fabsl(double);
+
+extern int __builtin_ffs(unsigned int);
+
+extern int __builtin_ffsl(unsigned int);
+
+extern int __builtin_ffsll(unsigned int);
+
+extern void *__builtin_frame_address(unsigned int);
+
+extern double __builtin_floor(double);
+
+extern float __builtin_floorf(float);
+
+extern double __builtin_floorl(double);
+
+extern double __builtin_huge_val(void);
+
+extern float __builtin_huge_valf(void);
+
+extern double __builtin_huge_vall(void);
+
+extern double __builtin_inf(void);
+
+extern float __builtin_inff(void);
+
+extern double __builtin_infl(void);
+
+extern void *__builtin_memcpy(void *, void *, unsigned int);
+
+extern void *__builtin_mempcpy(void *, void *, unsigned int);
+
+extern double __builtin_fmod(double);
+
+extern float __builtin_fmodf(float);
+
+extern double __builtin_fmodl(double);
+
+extern double __builtin_frexp(double, int *);
+
+extern float __builtin_frexpf(float, int *);
+
+extern double __builtin_frexpl(double, int *);
+
+extern double __builtin_ldexp(double, int);
+
+extern float __builtin_ldexpf(float, int);
+
+extern double __builtin_ldexpl(double, int);
+
+extern double __builtin_log(double);
+
+extern float __builtin_logf(float);
+
+extern double __builtin_logl(double);
+
+extern double __builtin_log10(double);
+
+extern float __builtin_log10f(float);
+
+extern double __builtin_log10l(double);
+
+extern float __builtin_modff(float, float *);
+
+extern double __builtin_modfl(double, double *);
+
+extern double __builtin_nan(unsigned char *);
+
+extern float __builtin_nanf(unsigned char *);
+
+extern double __builtin_nanl(unsigned char *);
+
+extern double __builtin_nans(unsigned char *);
+
+extern float __builtin_nansf(unsigned char *);
+
+extern double __builtin_nansl(unsigned char *);
+
+extern void *__builtin_next_arg(void);
+
+extern unsigned int __builtin_object_size(void *, int);
+
+extern int __builtin_parity(unsigned int);
+
+extern int __builtin_parityl(unsigned int);
+
+extern int __builtin_parityll(unsigned int);
+
+extern int __builtin_popcount(unsigned int);
+
+extern int __builtin_popcountl(unsigned int);
+
+extern int __builtin_popcountll(unsigned int);
+
+extern double __builtin_powi(double, int);
+
+extern float __builtin_powif(float, int);
+
+extern double __builtin_powil(double, int);
+
+extern void __builtin_return(void *);
+
+extern void *__builtin_return_address(unsigned int);
+
+extern double __builtin_sin(double);
+
+extern float __builtin_sinf(float);
+
+extern double __builtin_sinl(double);
+
+extern double __builtin_sinh(double);
+
+extern float __builtin_sinhf(float);
+
+extern double __builtin_sinhl(double);
+
+extern double __builtin_sqrt(double);
+
+extern float __builtin_sqrtf(float);
+
+extern double __builtin_sqrtl(double);
+
+extern unsigned char *__builtin_stpcpy(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strchr(unsigned char *, unsigned char);
+
+extern int __builtin_strcmp(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strcpy(unsigned char *, unsigned char *);
+
+extern unsigned int __builtin_strcspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strncat(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strncmp(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin_strncpy(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strpbrk(unsigned char *, unsigned char *);
+
+extern int __builtin_types_compatible_p(unsigned int, unsigned int);
+
+extern double __builtin_tan(double);
+
+extern float __builtin_tanf(float);
+
+extern double __builtin_tanl(double);
+
+extern double __builtin_tanh(double);
+
+extern float __builtin_tanhf(float);
+
+extern double __builtin_tanhl(double);
+
+extern void __builtin_va_end(void *);
+
+extern void __builtin_varargs_start(void *);
+
+extern void __builtin_va_start(void *, void *);
+
+extern void __builtin_stdarg_start(void *);
+
+extern void __builtin_va_arg(void *, unsigned int);
+
+extern void __builtin_va_copy(void *, void *);
+
+int array_double(int *tableau1, int *tableau2, int i, int j)
+{
+ int a;
+ c2:
+ a = tableau2[i];
+ c1:
+ tableau1[j] = tableau2[j] + a;
+ c0:
+ return tableau1[j];
+}
+
+int main(void)
+{
+ int t1[5];
+ int t;
+ c9:
+ t1[0] = 0;
+ c8:
+ t1[1] = 0;
+ c7:
+ t1[2] = 0;
+ c6:
+ t1[3] = 0;
+ c5:
+ t1[4] = 0;
+ c4:
+ t = array_double(t1, t2, 0, 0);
+ c3:
+ return t;
+}
+
+
--- /dev/null
+
+var "t2" {13, 21, 34, 55, 89}
+
+
+extern "__builtin___memcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memmove_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___mempcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memset_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___stpcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcat_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strncat_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___strncpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vfprintf_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vprintf_chk" : int -> int -> int -> int
+
+
+extern "__builtin___vsnprintf_chk" : int -> int -> int -> int -> int -> int -> int
+
+
+extern "__builtin___vsprintf_chk" : int -> int -> int -> int -> int -> int
+
+
+extern "__builtin_acos" : float -> float
+
+
+extern "__builtin_acosf" : float -> float
+
+
+extern "__builtin_acosl" : float -> float
+
+
+extern "__builtin_alloca" : int -> int
+
+
+extern "__builtin_asin" : float -> float
+
+
+extern "__builtin_asinf" : float -> float
+
+
+extern "__builtin_asinl" : float -> float
+
+
+extern "__builtin_atan" : float -> float
+
+
+extern "__builtin_atanf" : float -> float
+
+
+extern "__builtin_atanl" : float -> float
+
+
+extern "__builtin_atan2" : float -> float -> float
+
+
+extern "__builtin_atan2f" : float -> float -> float
+
+
+extern "__builtin_atan2l" : float -> float -> float
+
+
+extern "__builtin_ceil" : float -> float
+
+
+extern "__builtin_ceilf" : float -> float
+
+
+extern "__builtin_ceill" : float -> float
+
+
+extern "__builtin_cos" : float -> float
+
+
+extern "__builtin_cosf" : float -> float
+
+
+extern "__builtin_cosl" : float -> float
+
+
+extern "__builtin_cosh" : float -> float
+
+
+extern "__builtin_coshf" : float -> float
+
+
+extern "__builtin_coshl" : float -> float
+
+
+extern "__builtin_clz" : int -> int
+
+
+extern "__builtin_clzl" : int -> int
+
+
+extern "__builtin_clzll" : int -> int
+
+
+extern "__builtin_constant_p" : int -> int
+
+
+extern "__builtin_ctz" : int -> int
+
+
+extern "__builtin_ctzl" : int -> int
+
+
+extern "__builtin_ctzll" : int -> int
+
+
+extern "__builtin_exp" : float -> float
+
+
+extern "__builtin_expf" : float -> float
+
+
+extern "__builtin_expl" : float -> float
+
+
+extern "__builtin_expect" : int -> int -> int
+
+
+extern "__builtin_fabs" : float -> float
+
+
+extern "__builtin_fabsf" : float -> float
+
+
+extern "__builtin_fabsl" : float -> float
+
+
+extern "__builtin_ffs" : int -> int
+
+
+extern "__builtin_ffsl" : int -> int
+
+
+extern "__builtin_ffsll" : int -> int
+
+
+extern "__builtin_frame_address" : int -> int
+
+
+extern "__builtin_floor" : float -> float
+
+
+extern "__builtin_floorf" : float -> float
+
+
+extern "__builtin_floorl" : float -> float
+
+
+extern "__builtin_huge_val" : float
+
+
+extern "__builtin_huge_valf" : float
+
+
+extern "__builtin_huge_vall" : float
+
+
+extern "__builtin_inf" : float
+
+
+extern "__builtin_inff" : float
+
+
+extern "__builtin_infl" : float
+
+
+extern "__builtin_memcpy" : int -> int -> int -> int
+
+
+extern "__builtin_mempcpy" : int -> int -> int -> int
+
+
+extern "__builtin_fmod" : float -> float
+
+
+extern "__builtin_fmodf" : float -> float
+
+
+extern "__builtin_fmodl" : float -> float
+
+
+extern "__builtin_frexp" : float -> int -> float
+
+
+extern "__builtin_frexpf" : float -> int -> float
+
+
+extern "__builtin_frexpl" : float -> int -> float
+
+
+extern "__builtin_ldexp" : float -> int -> float
+
+
+extern "__builtin_ldexpf" : float -> int -> float
+
+
+extern "__builtin_ldexpl" : float -> int -> float
+
+
+extern "__builtin_log" : float -> float
+
+
+extern "__builtin_logf" : float -> float
+
+
+extern "__builtin_logl" : float -> float
+
+
+extern "__builtin_log10" : float -> float
+
+
+extern "__builtin_log10f" : float -> float
+
+
+extern "__builtin_log10l" : float -> float
+
+
+extern "__builtin_modff" : float -> int -> float
+
+
+extern "__builtin_modfl" : float -> int -> float
+
+
+extern "__builtin_nan" : int -> float
+
+
+extern "__builtin_nanf" : int -> float
+
+
+extern "__builtin_nanl" : int -> float
+
+
+extern "__builtin_nans" : int -> float
+
+
+extern "__builtin_nansf" : int -> float
+
+
+extern "__builtin_nansl" : int -> float
+
+
+extern "__builtin_next_arg" : int
+
+
+extern "__builtin_object_size" : int -> int -> int
+
+
+extern "__builtin_parity" : int -> int
+
+
+extern "__builtin_parityl" : int -> int
+
+
+extern "__builtin_parityll" : int -> int
+
+
+extern "__builtin_popcount" : int -> int
+
+
+extern "__builtin_popcountl" : int -> int
+
+
+extern "__builtin_popcountll" : int -> int
+
+
+extern "__builtin_powi" : float -> int -> float
+
+
+extern "__builtin_powif" : float -> int -> float
+
+
+extern "__builtin_powil" : float -> int -> float
+
+
+extern "__builtin_return" : int -> void
+
+
+extern "__builtin_return_address" : int -> int
+
+
+extern "__builtin_sin" : float -> float
+
+
+extern "__builtin_sinf" : float -> float
+
+
+extern "__builtin_sinl" : float -> float
+
+
+extern "__builtin_sinh" : float -> float
+
+
+extern "__builtin_sinhf" : float -> float
+
+
+extern "__builtin_sinhl" : float -> float
+
+
+extern "__builtin_sqrt" : float -> float
+
+
+extern "__builtin_sqrtf" : float -> float
+
+
+extern "__builtin_sqrtl" : float -> float
+
+
+extern "__builtin_stpcpy" : int -> int -> int
+
+
+extern "__builtin_strchr" : int -> int -> int
+
+
+extern "__builtin_strcmp" : int -> int -> int
+
+
+extern "__builtin_strcpy" : int -> int -> int
+
+
+extern "__builtin_strcspn" : int -> int -> int
+
+
+extern "__builtin_strncat" : int -> int -> int -> int
+
+
+extern "__builtin_strncmp" : int -> int -> int -> int
+
+
+extern "__builtin_strncpy" : int -> int -> int -> int
+
+
+extern "__builtin_strspn" : int -> int -> int
+
+
+extern "__builtin_strpbrk" : int -> int -> int
+
+
+extern "__builtin_types_compatible_p" : int -> int -> int
+
+
+extern "__builtin_tan" : float -> float
+
+
+extern "__builtin_tanf" : float -> float
+
+
+extern "__builtin_tanl" : float -> float
+
+
+extern "__builtin_tanh" : float -> float
+
+
+extern "__builtin_tanhf" : float -> float
+
+
+extern "__builtin_tanhl" : float -> float
+
+
+extern "__builtin_va_end" : int -> void
+
+
+extern "__builtin_varargs_start" : int -> void
+
+
+extern "__builtin_va_start" : int -> int -> void
+
+
+extern "__builtin_stdarg_start" : int -> void
+
+
+extern "__builtin_va_arg" : int -> int -> void
+
+
+extern "__builtin_va_copy" : int -> int -> void
+
+
+"array_double" (tableau1, tableau2, i, j) : int -> int -> int -> int -> int {
+
+ stack 0;
+
+ var a;
+
+ c2:
+ a = int32[tableau2 + (i * 4)];
+ c1:
+ int32[tableau1 + (j * 4)] = int32[tableau2 + (j * 4)] + a;
+ c0:
+ return int32[tableau1 + (j * 4)];
+
+}
+
+
+"main" () : int {
+
+ stack 20;
+
+ var t;
+
+ c9:
+ int32[&0 + (0 * 4)] = 0;
+ c8:
+ int32[&0 + (1 * 4)] = 0;
+ c7:
+ int32[&0 + (2 * 4)] = 0;
+ c6:
+ int32[&0 + (3 * 4)] = 0;
+ c5:
+ int32[&0 + (4 * 4)] = 0;
+ c4:
+ t = "array_double"(&0, "t2", 0, 0) : int -> int -> int -> int -> int;
+ c3:
+ return t;
+
+}
+
+
--- /dev/null
+program
+
+globals 20
+
+procedure array_double(4)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28
+entry array_double49
+array_double49: newframe --> array_double48
+array_double48: move %28, $ra --> array_double47
+array_double47: move %27, $s7 --> array_double46
+array_double46: move %26, $s6 --> array_double45
+array_double45: move %25, $s5 --> array_double44
+array_double44: move %24, $s4 --> array_double43
+array_double43: move %23, $s3 --> array_double42
+array_double42: move %22, $s2 --> array_double41
+array_double41: move %21, $s1 --> array_double40
+array_double40: move %20, $s0 --> array_double39
+array_double39: move %0, $a0 --> array_double38
+array_double38: move %1, $a1 --> array_double37
+array_double37: move %2, $a2 --> array_double36
+array_double36: move %3, $a3 --> array_double35
+array_double35: li %4, 0 --> array_double34
+array_double34: li %6, 0 --> array_double33
+array_double33: li %7, 0 --> array_double32
+array_double32: li %8, 0 --> array_double31
+array_double31: li %9, 0 --> array_double30
+array_double30: li %10, 0 --> array_double29
+array_double29: li %11, 0 --> array_double28
+array_double28: li %12, 0 --> array_double27
+array_double27: li %13, 0 --> array_double26
+array_double26: li %14, 0 --> array_double25
+array_double25: li %15, 0 --> array_double24
+array_double24: li %16, 0 --> array_double23
+array_double23: li %17, 0 --> array_double22
+array_double22: li %18, 0 --> array_double21
+array_double21: li %19, 0 --> array_double16
+array_double16: emit c2 --> array_double15
+array_double15: li %15, 4 --> array_double14
+array_double14: mulo %14, %2, %15 --> array_double13
+array_double13: add %17, %1, %14 --> array_double18
+array_double18: lw %4, 0(%17) --> array_double12
+array_double12: emit c1 --> array_double11
+array_double11: li %13, 4 --> array_double10
+array_double10: mulo %12, %3, %13 --> array_double9
+array_double9 : add %19, %1, %12 --> array_double20
+array_double20: lw %11, 0(%19) --> array_double8
+array_double8 : add %8, %11, %4 --> array_double7
+array_double7 : li %10, 4 --> array_double6
+array_double6 : mulo %9, %3, %10 --> array_double5
+array_double5 : add %18, %0, %9 --> array_double19
+array_double19: sw %8, 0(%18) --> array_double4
+array_double4 : emit c0 --> array_double3
+array_double3 : li %7, 4 --> array_double2
+array_double2 : mulo %6, %3, %7 --> array_double1
+array_double1 : add %16, %0, %6 --> array_double17
+array_double17: lw %5, 0(%16) --> array_double0
+array_double0 : j --> array_double61
+array_double61: move $v0, %5 --> array_double60
+array_double60: move $ra, %28 --> array_double59
+array_double59: move $s7, %27 --> array_double58
+array_double58: move $s6, %26 --> array_double57
+array_double57: move $s5, %25 --> array_double56
+array_double56: move $s4, %24 --> array_double55
+array_double55: move $s3, %23 --> array_double54
+array_double54: move $s2, %22 --> array_double53
+array_double53: move $s1, %21 --> array_double52
+array_double52: move $s0, %20 --> array_double51
+array_double51: delframe --> array_double50
+array_double50: jr $ra (xmits $v0)
+
+procedure _main(0)
+stacksize 20
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55
+entry main120
+main120: newframe --> main119
+main119: move %55, $ra --> main118
+main118: move %54, $s7 --> main117
+main117: move %53, $s6 --> main116
+main116: move %52, $s5 --> main115
+main115: move %51, $s4 --> main114
+main114: move %50, $s3 --> main113
+main113: move %49, $s2 --> main112
+main112: move %48, $s1 --> main111
+main111: move %47, $s0 --> main110
+main110: li %0, 0 --> main109
+main109: li %2, 0 --> main108
+main108: li %3, 0 --> main107
+main107: li %4, 0 --> main106
+main106: li %5, 0 --> main105
+main105: li %6, 0 --> main104
+main104: li %7, 0 --> main103
+main103: li %8, 0 --> main102
+main102: li %9, 0 --> main101
+main101: li %10, 0 --> main100
+main100: li %11, 0 --> main99
+main99 : li %12, 0 --> main98
+main98 : li %13, 0 --> main97
+main97 : li %14, 0 --> main96
+main96 : li %15, 0 --> main95
+main95 : li %16, 0 --> main94
+main94 : li %17, 0 --> main93
+main93 : li %18, 0 --> main92
+main92 : li %19, 0 --> main91
+main91 : li %20, 0 --> main90
+main90 : li %21, 0 --> main89
+main89 : li %22, 0 --> main88
+main88 : li %23, 0 --> main87
+main87 : li %24, 0 --> main86
+main86 : li %25, 0 --> main85
+main85 : li %26, 0 --> main84
+main84 : li %27, 0 --> main83
+main83 : li %28, 0 --> main82
+main82 : li %29, 0 --> main81
+main81 : li %30, 0 --> main80
+main80 : li %31, 0 --> main79
+main79 : li %32, 0 --> main78
+main78 : li %33, 0 --> main77
+main77 : li %34, 0 --> main76
+main76 : li %35, 0 --> main75
+main75 : li %36, 0 --> main74
+main74 : li %37, 0 --> main73
+main73 : li %38, 0 --> main72
+main72 : li %39, 0 --> main71
+main71 : li %40, 0 --> main70
+main70 : li %41, 0 --> main69
+main69 : li %42, 0 --> main68
+main68 : li %43, 0 --> main67
+main67 : li %44, 0 --> main66
+main66 : li %45, 0 --> main65
+main65 : li %46, 0 --> main53
+main53 : li %35, 13 --> main52
+main52 : move %45, $gp --> main142
+main142: move %45, %45 --> main63
+main63 : sw %35, 0(%45) --> main51
+main51 : li %34, 21 --> main50
+main50 : move %44, $gp --> main141
+main141: move %44, %44 --> main62
+main62 : sw %34, 4(%44) --> main49
+main49 : li %33, 34 --> main48
+main48 : move %43, $gp --> main140
+main140: move %43, %43 --> main61
+main61 : sw %33, 8(%43) --> main47
+main47 : li %32, 55 --> main46
+main46 : move %42, $gp --> main139
+main139: move %42, %42 --> main60
+main60 : sw %32, 12(%42) --> main45
+main45 : li %31, 89 --> main44
+main44 : move %41, $gp --> main138
+main138: move %41, %41 --> main59
+main59 : sw %31, 16(%41) --> main43
+main43 : emit c9 --> main42
+main42 : li %26, 0 --> main41
+main41 : move %27, $sp --> main137
+main137: move %27, %27 --> main40
+main40 : li %29, 0 --> main39
+main39 : li %30, 4 --> main38
+main38 : mulo %28, %29, %30 --> main37
+main37 : add %40, %27, %28 --> main58
+main58 : sw %26, 0(%40) --> main36
+main36 : emit c8 --> main35
+main35 : li %21, 0 --> main34
+main34 : move %22, $sp --> main136
+main136: move %22, %22 --> main33
+main33 : li %24, 1 --> main32
+main32 : li %25, 4 --> main31
+main31 : mulo %23, %24, %25 --> main30
+main30 : add %39, %22, %23 --> main57
+main57 : sw %21, 0(%39) --> main29
+main29 : emit c7 --> main28
+main28 : li %16, 0 --> main27
+main27 : move %17, $sp --> main135
+main135: move %17, %17 --> main26
+main26 : li %19, 2 --> main25
+main25 : li %20, 4 --> main24
+main24 : mulo %18, %19, %20 --> main23
+main23 : add %37, %17, %18 --> main55
+main55 : sw %16, 0(%37) --> main22
+main22 : emit c6 --> main21
+main21 : li %11, 0 --> main20
+main20 : move %12, $sp --> main134
+main134: move %12, %12 --> main19
+main19 : li %14, 3 --> main18
+main18 : li %15, 4 --> main17
+main17 : mulo %13, %14, %15 --> main16
+main16 : add %36, %12, %13 --> main54
+main54 : sw %11, 0(%36) --> main15
+main15 : emit c5 --> main14
+main14 : li %6, 0 --> main13
+main13 : move %7, $sp --> main133
+main133: move %7, %7 --> main12
+main12 : li %9, 4 --> main11
+main11 : li %10, 4 --> main10
+main10 : mulo %8, %9, %10 --> main9
+main9 : add %46, %7, %8 --> main64
+main64 : sw %6, 0(%46) --> main8
+main8 : emit c4 --> main7
+main7 : move %2, $sp --> main150
+main150: move %2, %2 --> main6
+main6 : move %3, $gp --> main149
+main149: move %3, %3 --> main5
+main5 : li %4, 0 --> main4
+main4 : li %5, 0 --> main3
+main3 : la %38, array_double --> main56
+main56 : j --> main148
+main148: move $a0, %2 --> main147
+main147: move $a1, %3 --> main146
+main146: move $a2, %4 --> main145
+main145: move $a3, %5 --> main144
+main144: call %38(4) --> main143
+main143: move %0, $v0 --> main2
+main2 : emit c3 --> main1
+main1 : move %1, %0 --> main0
+main0 : j --> main132
+main132: move $v0, %1 --> main131
+main131: move $ra, %55 --> main130
+main130: move $s7, %54 --> main129
+main129: move $s6, %53 --> main128
+main128: move $s5, %52 --> main127
+main127: move $s4, %51 --> main126
+main126: move $s3, %50 --> main125
+main125: move $s2, %49 --> main124
+main124: move $s1, %48 --> main123
+main123: move $s0, %47 --> main122
+main122: delframe --> main121
+main121: jr $ra (xmits $v0)
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 20
+
+procedure array_double(4)
+var 0
+array_double49:
+newframe
+c2:
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a1, $v0
+lw $a2, 0($v0)
+c1:
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $a1, $v0
+lw $v0, 0($v0)
+add $a1, $v0, $a2
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c0:
+li $v0, 4
+mulo $v0, $a3, $v0
+add $v0, $a0, $v0
+lw $v0, 0($v0)
+delframe
+jr $ra
+
+procedure _main(0)
+var 24
+main120:
+newframe
+sw $ra, 20($sp)
+li $a0, 13
+move $v0, $gp
+sw $a0, 0($v0)
+li $a0, 21
+move $v0, $gp
+sw $a0, 4($v0)
+li $a0, 34
+move $v0, $gp
+sw $a0, 8($v0)
+li $a0, 55
+move $v0, $gp
+sw $a0, 12($v0)
+li $a0, 89
+move $v0, $gp
+sw $a0, 16($v0)
+c9:
+li $a1, 0
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c8:
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c7:
+move $a1, $sp
+li $a0, 2
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c6:
+move $a1, $sp
+li $a0, 3
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c5:
+move $a1, $sp
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c4:
+move $a0, $sp
+move $a1, $gp
+li $a2, 0
+li $a3, 0
+la $v0, array_double
+call $v0
+c3:
+lw $ra, 20($sp)
+delframe
+jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 20
+
+procedure array_double(4)
+var 0
+entry array_double49
+array_double49: newframe --> array_double48
+array_double48: j --> array_double47
+array_double47: j --> array_double46
+array_double46: j --> array_double45
+array_double45: j --> array_double44
+array_double44: j --> array_double43
+array_double43: j --> array_double42
+array_double42: j --> array_double41
+array_double41: j --> array_double40
+array_double40: j --> array_double39
+array_double39: j --> array_double38
+array_double38: j --> array_double37
+array_double37: j --> array_double36
+array_double36: j --> array_double35
+array_double35: j --> array_double34
+array_double34: j --> array_double33
+array_double33: j --> array_double32
+array_double32: j --> array_double31
+array_double31: j --> array_double30
+array_double30: j --> array_double29
+array_double29: j --> array_double28
+array_double28: j --> array_double27
+array_double27: j --> array_double26
+array_double26: j --> array_double25
+array_double25: j --> array_double24
+array_double24: j --> array_double23
+array_double23: j --> array_double22
+array_double22: j --> array_double21
+array_double21: j --> array_double16
+array_double16: emit c2 --> array_double15
+array_double15: li $v0, 4 --> array_double14
+array_double14: mulo $v0, $a2, $v0 --> array_double13
+array_double13: add $v0, $a1, $v0 --> array_double18
+array_double18: lw $a2, 0($v0) --> array_double12
+array_double12: emit c1 --> array_double11
+array_double11: li $v0, 4 --> array_double10
+array_double10: mulo $v0, $a3, $v0 --> array_double9
+array_double9 : add $v0, $a1, $v0 --> array_double20
+array_double20: lw $v0, 0($v0) --> array_double8
+array_double8 : add $a1, $v0, $a2 --> array_double7
+array_double7 : li $v0, 4 --> array_double6
+array_double6 : mulo $v0, $a3, $v0 --> array_double5
+array_double5 : add $v0, $a0, $v0 --> array_double19
+array_double19: lw $a1, 0($v0) --> array_double4
+array_double4 : emit c0 --> array_double3
+array_double3 : li $v0, 4 --> array_double2
+array_double2 : mulo $v0, $a3, $v0 --> array_double1
+array_double1 : add $v0, $a0, $v0 --> array_double17
+array_double17: lw $v0, 0($v0) --> array_double0
+array_double0 : j --> array_double61
+array_double61: j --> array_double60
+array_double60: j --> array_double59
+array_double59: j --> array_double58
+array_double58: j --> array_double57
+array_double57: j --> array_double56
+array_double56: j --> array_double55
+array_double55: j --> array_double54
+array_double54: j --> array_double53
+array_double53: j --> array_double52
+array_double52: j --> array_double51
+array_double51: delframe --> array_double50
+array_double50: jr $ra
+
+procedure _main(0)
+var 24
+entry main120
+main120: newframe --> main119
+main119: lw $ra, 20($sp) --> main118
+main118: j --> main117
+main117: j --> main116
+main116: j --> main115
+main115: j --> main114
+main114: j --> main113
+main113: j --> main112
+main112: j --> main111
+main111: j --> main110
+main110: j --> main109
+main109: j --> main108
+main108: j --> main107
+main107: j --> main106
+main106: j --> main105
+main105: j --> main104
+main104: j --> main103
+main103: j --> main102
+main102: j --> main101
+main101: j --> main100
+main100: j --> main99
+main99 : j --> main98
+main98 : j --> main97
+main97 : j --> main96
+main96 : j --> main95
+main95 : j --> main94
+main94 : j --> main93
+main93 : j --> main92
+main92 : j --> main91
+main91 : j --> main90
+main90 : j --> main89
+main89 : j --> main88
+main88 : j --> main87
+main87 : j --> main86
+main86 : j --> main85
+main85 : j --> main84
+main84 : j --> main83
+main83 : j --> main82
+main82 : j --> main81
+main81 : j --> main80
+main80 : j --> main79
+main79 : j --> main78
+main78 : j --> main77
+main77 : j --> main76
+main76 : j --> main75
+main75 : j --> main74
+main74 : j --> main73
+main73 : j --> main72
+main72 : j --> main71
+main71 : j --> main70
+main70 : j --> main69
+main69 : j --> main68
+main68 : j --> main67
+main67 : j --> main66
+main66 : j --> main65
+main65 : j --> main53
+main53 : li $a0, 13 --> main52
+main52 : move $v0, $gp --> main142
+main142: j --> main63
+main63 : lw $a0, 0($v0) --> main51
+main51 : li $a0, 21 --> main50
+main50 : move $v0, $gp --> main141
+main141: j --> main62
+main62 : lw $a0, 4($v0) --> main49
+main49 : li $a0, 34 --> main48
+main48 : move $v0, $gp --> main140
+main140: j --> main61
+main61 : lw $a0, 8($v0) --> main47
+main47 : li $a0, 55 --> main46
+main46 : move $v0, $gp --> main139
+main139: j --> main60
+main60 : lw $a0, 12($v0) --> main45
+main45 : li $a0, 89 --> main44
+main44 : move $v0, $gp --> main138
+main138: j --> main59
+main59 : lw $a0, 16($v0) --> main43
+main43 : emit c9 --> main42
+main42 : li $a1, 0 --> main41
+main41 : move $a0, $sp --> main137
+main137: j --> main40
+main40 : j --> main39
+main39 : li $v0, 4 --> main38
+main38 : mulo $v0, $zero, $v0 --> main37
+main37 : add $v0, $a0, $v0 --> main58
+main58 : lw $a1, 0($v0) --> main36
+main36 : emit c8 --> main35
+main35 : j --> main34
+main34 : move $a1, $sp --> main136
+main136: j --> main33
+main33 : li $a0, 1 --> main32
+main32 : li $v0, 4 --> main31
+main31 : mulo $v0, $a0, $v0 --> main30
+main30 : add $v0, $a1, $v0 --> main57
+main57 : lw $zero, 0($v0) --> main29
+main29 : emit c7 --> main28
+main28 : j --> main27
+main27 : move $a1, $sp --> main135
+main135: j --> main26
+main26 : li $a0, 2 --> main25
+main25 : li $v0, 4 --> main24
+main24 : mulo $v0, $a0, $v0 --> main23
+main23 : add $v0, $a1, $v0 --> main55
+main55 : lw $zero, 0($v0) --> main22
+main22 : emit c6 --> main21
+main21 : j --> main20
+main20 : move $a1, $sp --> main134
+main134: j --> main19
+main19 : li $a0, 3 --> main18
+main18 : li $v0, 4 --> main17
+main17 : mulo $v0, $a0, $v0 --> main16
+main16 : add $v0, $a1, $v0 --> main54
+main54 : lw $zero, 0($v0) --> main15
+main15 : emit c5 --> main14
+main14 : j --> main13
+main13 : move $a1, $sp --> main133
+main133: j --> main12
+main12 : li $a0, 4 --> main11
+main11 : li $v0, 4 --> main10
+main10 : mulo $v0, $a0, $v0 --> main9
+main9 : add $v0, $a1, $v0 --> main64
+main64 : lw $zero, 0($v0) --> main8
+main8 : emit c4 --> main7
+main7 : move $a0, $sp --> main150
+main150: j --> main6
+main6 : move $a1, $gp --> main149
+main149: j --> main5
+main5 : li $a2, 0 --> main4
+main4 : li $a3, 0 --> main3
+main3 : la $v0, array_double --> main56
+main56 : j --> main148
+main148: j --> main147
+main147: j --> main146
+main146: j --> main145
+main145: j --> main144
+main144: call $v0 --> main143
+main143: j --> main2
+main2 : emit c3 --> main1
+main1 : j --> main0
+main0 : j --> main132
+main132: j --> main131
+main131: lw $ra, 20($sp) --> main130
+main130: j --> main129
+main129: j --> main128
+main128: j --> main127
+main127: j --> main126
+main126: j --> main125
+main125: j --> main124
+main124: j --> main123
+main123: j --> main122
+main122: delframe --> main121
+main121: jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 20
+
+function array_double(%0; %1; %2; %3) : %5
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19
+entry array_double35
+array_double35: li %4, 0 --> array_double34
+array_double34: li %6, 0 --> array_double33
+array_double33: li %7, 0 --> array_double32
+array_double32: li %8, 0 --> array_double31
+array_double31: li %9, 0 --> array_double30
+array_double30: li %10, 0 --> array_double29
+array_double29: li %11, 0 --> array_double28
+array_double28: li %12, 0 --> array_double27
+array_double27: li %13, 0 --> array_double26
+array_double26: li %14, 0 --> array_double25
+array_double25: li %15, 0 --> array_double24
+array_double24: li %16, 0 --> array_double23
+array_double23: li %17, 0 --> array_double22
+array_double22: li %18, 0 --> array_double21
+array_double21: li %19, 0 --> array_double16
+array_double16: emit c2 --> array_double15
+array_double15: li %15, 4 --> array_double14
+array_double14: mulo %14, %2, %15 --> array_double13
+array_double13: add %17, %1, %14 --> array_double18
+array_double18: lw %4, 0(%17) --> array_double12
+array_double12: emit c1 --> array_double11
+array_double11: li %13, 4 --> array_double10
+array_double10: mulo %12, %3, %13 --> array_double9
+array_double9 : add %19, %1, %12 --> array_double20
+array_double20: lw %11, 0(%19) --> array_double8
+array_double8 : add %8, %11, %4 --> array_double7
+array_double7 : li %10, 4 --> array_double6
+array_double6 : mulo %9, %3, %10 --> array_double5
+array_double5 : add %18, %0, %9 --> array_double19
+array_double19: sw %8, 0(%18) --> array_double4
+array_double4 : emit c0 --> array_double3
+array_double3 : li %7, 4 --> array_double2
+array_double2 : mulo %6, %3, %7 --> array_double1
+array_double1 : add %16, %0, %6 --> array_double17
+array_double17: lw %5, 0(%16) --> array_double0
+array_double0 : return %5
+
+function _main() : %1
+stacksize 20
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46
+entry main110
+main110: li %0, 0 --> main109
+main109: li %2, 0 --> main108
+main108: li %3, 0 --> main107
+main107: li %4, 0 --> main106
+main106: li %5, 0 --> main105
+main105: li %6, 0 --> main104
+main104: li %7, 0 --> main103
+main103: li %8, 0 --> main102
+main102: li %9, 0 --> main101
+main101: li %10, 0 --> main100
+main100: li %11, 0 --> main99
+main99 : li %12, 0 --> main98
+main98 : li %13, 0 --> main97
+main97 : li %14, 0 --> main96
+main96 : li %15, 0 --> main95
+main95 : li %16, 0 --> main94
+main94 : li %17, 0 --> main93
+main93 : li %18, 0 --> main92
+main92 : li %19, 0 --> main91
+main91 : li %20, 0 --> main90
+main90 : li %21, 0 --> main89
+main89 : li %22, 0 --> main88
+main88 : li %23, 0 --> main87
+main87 : li %24, 0 --> main86
+main86 : li %25, 0 --> main85
+main85 : li %26, 0 --> main84
+main84 : li %27, 0 --> main83
+main83 : li %28, 0 --> main82
+main82 : li %29, 0 --> main81
+main81 : li %30, 0 --> main80
+main80 : li %31, 0 --> main79
+main79 : li %32, 0 --> main78
+main78 : li %33, 0 --> main77
+main77 : li %34, 0 --> main76
+main76 : li %35, 0 --> main75
+main75 : li %36, 0 --> main74
+main74 : li %37, 0 --> main73
+main73 : li %38, 0 --> main72
+main72 : li %39, 0 --> main71
+main71 : li %40, 0 --> main70
+main70 : li %41, 0 --> main69
+main69 : li %42, 0 --> main68
+main68 : li %43, 0 --> main67
+main67 : li %44, 0 --> main66
+main66 : li %45, 0 --> main65
+main65 : li %46, 0 --> main53
+main53 : li %35, 13 --> main52
+main52 : addi %45, GLOBALS, 0 --> main63
+main63 : sw %35, 0(%45) --> main51
+main51 : li %34, 21 --> main50
+main50 : addi %44, GLOBALS, 0 --> main62
+main62 : sw %34, 4(%44) --> main49
+main49 : li %33, 34 --> main48
+main48 : addi %43, GLOBALS, 0 --> main61
+main61 : sw %33, 8(%43) --> main47
+main47 : li %32, 55 --> main46
+main46 : addi %42, GLOBALS, 0 --> main60
+main60 : sw %32, 12(%42) --> main45
+main45 : li %31, 89 --> main44
+main44 : addi %41, GLOBALS, 0 --> main59
+main59 : sw %31, 16(%41) --> main43
+main43 : emit c9 --> main42
+main42 : li %26, 0 --> main41
+main41 : addi %27, STACK, 0 --> main40
+main40 : li %29, 0 --> main39
+main39 : li %30, 4 --> main38
+main38 : mulo %28, %29, %30 --> main37
+main37 : add %40, %27, %28 --> main58
+main58 : sw %26, 0(%40) --> main36
+main36 : emit c8 --> main35
+main35 : li %21, 0 --> main34
+main34 : addi %22, STACK, 0 --> main33
+main33 : li %24, 1 --> main32
+main32 : li %25, 4 --> main31
+main31 : mulo %23, %24, %25 --> main30
+main30 : add %39, %22, %23 --> main57
+main57 : sw %21, 0(%39) --> main29
+main29 : emit c7 --> main28
+main28 : li %16, 0 --> main27
+main27 : addi %17, STACK, 0 --> main26
+main26 : li %19, 2 --> main25
+main25 : li %20, 4 --> main24
+main24 : mulo %18, %19, %20 --> main23
+main23 : add %37, %17, %18 --> main55
+main55 : sw %16, 0(%37) --> main22
+main22 : emit c6 --> main21
+main21 : li %11, 0 --> main20
+main20 : addi %12, STACK, 0 --> main19
+main19 : li %14, 3 --> main18
+main18 : li %15, 4 --> main17
+main17 : mulo %13, %14, %15 --> main16
+main16 : add %36, %12, %13 --> main54
+main54 : sw %11, 0(%36) --> main15
+main15 : emit c5 --> main14
+main14 : li %6, 0 --> main13
+main13 : addi %7, STACK, 0 --> main12
+main12 : li %9, 4 --> main11
+main11 : li %10, 4 --> main10
+main10 : mulo %8, %9, %10 --> main9
+main9 : add %46, %7, %8 --> main64
+main64 : sw %6, 0(%46) --> main8
+main8 : emit c4 --> main7
+main7 : addi %2, STACK, 0 --> main6
+main6 : addi %3, GLOBALS, 0 --> main5
+main5 : li %4, 0 --> main4
+main4 : li %5, 0 --> main3
+main3 : la %38, array_double --> main56
+main56 : call %0, %38(%2, %3, %4, %5) --> main2
+main2 : emit c3 --> main1
+main1 : move %1, %0 --> main0
+main0 : return %1
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program: (main function is "main")
+
+
+ globals:
+ "t2" = {13, 21, 34, 55, 89}
+
+
+ "__builtin___memcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memmove_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___mempcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memset_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___stpcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strcat_chk": int -> int -> int -> int
+
+
+ "__builtin___strcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strncat_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___strncpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vfprintf_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vprintf_chk": int -> int -> int -> int
+
+
+ "__builtin___vsnprintf_chk": int -> int -> int -> int -> int -> int -> int
+
+
+ "__builtin___vsprintf_chk": int -> int -> int -> int -> int -> int
+
+
+ "__builtin_acos": float -> float
+
+
+ "__builtin_acosf": float -> float
+
+
+ "__builtin_acosl": float -> float
+
+
+ "__builtin_alloca": int -> int
+
+
+ "__builtin_asin": float -> float
+
+
+ "__builtin_asinf": float -> float
+
+
+ "__builtin_asinl": float -> float
+
+
+ "__builtin_atan": float -> float
+
+
+ "__builtin_atanf": float -> float
+
+
+ "__builtin_atanl": float -> float
+
+
+ "__builtin_atan2": float -> float -> float
+
+
+ "__builtin_atan2f": float -> float -> float
+
+
+ "__builtin_atan2l": float -> float -> float
+
+
+ "__builtin_ceil": float -> float
+
+
+ "__builtin_ceilf": float -> float
+
+
+ "__builtin_ceill": float -> float
+
+
+ "__builtin_cos": float -> float
+
+
+ "__builtin_cosf": float -> float
+
+
+ "__builtin_cosl": float -> float
+
+
+ "__builtin_cosh": float -> float
+
+
+ "__builtin_coshf": float -> float
+
+
+ "__builtin_coshl": float -> float
+
+
+ "__builtin_clz": int -> int
+
+
+ "__builtin_clzl": int -> int
+
+
+ "__builtin_clzll": int -> int
+
+
+ "__builtin_constant_p": int -> int
+
+
+ "__builtin_ctz": int -> int
+
+
+ "__builtin_ctzl": int -> int
+
+
+ "__builtin_ctzll": int -> int
+
+
+ "__builtin_exp": float -> float
+
+
+ "__builtin_expf": float -> float
+
+
+ "__builtin_expl": float -> float
+
+
+ "__builtin_expect": int -> int -> int
+
+
+ "__builtin_fabs": float -> float
+
+
+ "__builtin_fabsf": float -> float
+
+
+ "__builtin_fabsl": float -> float
+
+
+ "__builtin_ffs": int -> int
+
+
+ "__builtin_ffsl": int -> int
+
+
+ "__builtin_ffsll": int -> int
+
+
+ "__builtin_frame_address": int -> int
+
+
+ "__builtin_floor": float -> float
+
+
+ "__builtin_floorf": float -> float
+
+
+ "__builtin_floorl": float -> float
+
+
+ "__builtin_huge_val": float
+
+
+ "__builtin_huge_valf": float
+
+
+ "__builtin_huge_vall": float
+
+
+ "__builtin_inf": float
+
+
+ "__builtin_inff": float
+
+
+ "__builtin_infl": float
+
+
+ "__builtin_memcpy": int -> int -> int -> int
+
+
+ "__builtin_mempcpy": int -> int -> int -> int
+
+
+ "__builtin_fmod": float -> float
+
+
+ "__builtin_fmodf": float -> float
+
+
+ "__builtin_fmodl": float -> float
+
+
+ "__builtin_frexp": float -> int -> float
+
+
+ "__builtin_frexpf": float -> int -> float
+
+
+ "__builtin_frexpl": float -> int -> float
+
+
+ "__builtin_ldexp": float -> int -> float
+
+
+ "__builtin_ldexpf": float -> int -> float
+
+
+ "__builtin_ldexpl": float -> int -> float
+
+
+ "__builtin_log": float -> float
+
+
+ "__builtin_logf": float -> float
+
+
+ "__builtin_logl": float -> float
+
+
+ "__builtin_log10": float -> float
+
+
+ "__builtin_log10f": float -> float
+
+
+ "__builtin_log10l": float -> float
+
+
+ "__builtin_modff": float -> int -> float
+
+
+ "__builtin_modfl": float -> int -> float
+
+
+ "__builtin_nan": int -> float
+
+
+ "__builtin_nanf": int -> float
+
+
+ "__builtin_nanl": int -> float
+
+
+ "__builtin_nans": int -> float
+
+
+ "__builtin_nansf": int -> float
+
+
+ "__builtin_nansl": int -> float
+
+
+ "__builtin_next_arg": int
+
+
+ "__builtin_object_size": int -> int -> int
+
+
+ "__builtin_parity": int -> int
+
+
+ "__builtin_parityl": int -> int
+
+
+ "__builtin_parityll": int -> int
+
+
+ "__builtin_popcount": int -> int
+
+
+ "__builtin_popcountl": int -> int
+
+
+ "__builtin_popcountll": int -> int
+
+
+ "__builtin_powi": float -> int -> float
+
+
+ "__builtin_powif": float -> int -> float
+
+
+ "__builtin_powil": float -> int -> float
+
+
+ "__builtin_return": int -> void
+
+
+ "__builtin_return_address": int -> int
+
+
+ "__builtin_sin": float -> float
+
+
+ "__builtin_sinf": float -> float
+
+
+ "__builtin_sinl": float -> float
+
+
+ "__builtin_sinh": float -> float
+
+
+ "__builtin_sinhf": float -> float
+
+
+ "__builtin_sinhl": float -> float
+
+
+ "__builtin_sqrt": float -> float
+
+
+ "__builtin_sqrtf": float -> float
+
+
+ "__builtin_sqrtl": float -> float
+
+
+ "__builtin_stpcpy": int -> int -> int
+
+
+ "__builtin_strchr": int -> int -> int
+
+
+ "__builtin_strcmp": int -> int -> int
+
+
+ "__builtin_strcpy": int -> int -> int
+
+
+ "__builtin_strcspn": int -> int -> int
+
+
+ "__builtin_strncat": int -> int -> int -> int
+
+
+ "__builtin_strncmp": int -> int -> int -> int
+
+
+ "__builtin_strncpy": int -> int -> int -> int
+
+
+ "__builtin_strspn": int -> int -> int
+
+
+ "__builtin_strpbrk": int -> int -> int
+
+
+ "__builtin_types_compatible_p": int -> int -> int
+
+
+ "__builtin_tan": float -> float
+
+
+ "__builtin_tanf": float -> float
+
+
+ "__builtin_tanl": float -> float
+
+
+ "__builtin_tanh": float -> float
+
+
+ "__builtin_tanhf": float -> float
+
+
+ "__builtin_tanhl": float -> float
+
+
+ "__builtin_va_end": int -> void
+
+
+ "__builtin_varargs_start": int -> void
+
+
+ "__builtin_va_start": int -> int -> void
+
+
+ "__builtin_stdarg_start": int -> void
+
+
+ "__builtin_va_arg": int -> int -> void
+
+
+ "__builtin_va_copy": int -> int -> void
+
+
+ "array_double"(%0, %1, %2, %3): int -> int -> int -> int -> int
+ locals: %5, %4, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15
+ result: %5
+ stacksize: 0
+ entry: array_double16
+ exit: array_double0
+
+ array_double9: load int32, add, %1, %12, %11 --> array_double8
+ array_double8: add %8, %11, %4 --> array_double7
+ array_double7: imm_int 4, %10, --> array_double6
+ array_double6: mul %9, %3, %10 --> array_double5
+ array_double5: store int32, add, %0, %9, %8 --> array_double4
+ array_double4: emit c0 --> array_double3
+ array_double3: imm_int 4, %7, --> array_double2
+ array_double2: mul %6, %3, %7 --> array_double1
+ array_double16: emit c2 --> array_double15
+ array_double15: imm_int 4, %15, --> array_double14
+ array_double14: mul %14, %2, %15 --> array_double13
+ array_double13: load int32, add, %1, %14, %4 --> array_double12
+ array_double12: emit c1 --> array_double11
+ array_double11: imm_int 4, %13, --> array_double10
+ array_double10: mul %12, %3, %13 --> array_double9
+ array_double1: load int32, add, %0, %6, %5 --> array_double0
+ array_double0: return %5
+
+
+ "main"(): int
+ locals: %1, %0, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31, %32, %33, %34, %35
+ result: %1
+ stacksize: 20
+ entry: main53
+ exit: main0
+
+ main9: store int32, add, %7, %8, %6 --> main8
+ main8: emit c4 --> main7
+ main7: imm_addr 0($sp), %2, --> main6
+ main6: imm_addr "t2", %3, --> main5
+ main53: imm_int 13, %35, --> main52
+ main52: store int32, 0("t2"), , %35 --> main51
+ main51: imm_int 21, %34, --> main50
+ main50: store int32, 4("t2"), , %34 --> main49
+ main5: imm_int 0, %4, --> main4
+ main49: imm_int 34, %33, --> main48
+ main48: store int32, 8("t2"), , %33 --> main47
+ main47: imm_int 55, %32, --> main46
+ main46: store int32, 12("t2"), , %32 --> main45
+ main45: imm_int 89, %31, --> main44
+ main44: store int32, 16("t2"), , %31 --> main43
+ main43: emit c9 --> main42
+ main42: imm_int 0, %26, --> main41
+ main41: imm_addr 0($sp), %27, --> main40
+ main40: imm_int 0, %29, --> main39
+ main4: imm_int 0, %5, --> main3
+ main39: imm_int 4, %30, --> main38
+ main38: mul %28, %29, %30 --> main37
+ main37: store int32, add, %27, %28, %26 --> main36
+ main36: emit c8 --> main35
+ main35: imm_int 0, %21, --> main34
+ main34: imm_addr 0($sp), %22, --> main33
+ main33: imm_int 1, %24, --> main32
+ main32: imm_int 4, %25, --> main31
+ main31: mul %23, %24, %25 --> main30
+ main30: store int32, add, %22, %23, %21 --> main29
+ main3: call "array_double", %2, %3, %4, %5, %0: int -> int -> int -> int -> int --> main2
+ main29: emit c7 --> main28
+ main28: imm_int 0, %16, --> main27
+ main27: imm_addr 0($sp), %17, --> main26
+ main26: imm_int 2, %19, --> main25
+ main25: imm_int 4, %20, --> main24
+ main24: mul %18, %19, %20 --> main23
+ main23: store int32, add, %17, %18, %16 --> main22
+ main22: emit c6 --> main21
+ main21: imm_int 0, %11, --> main20
+ main20: imm_addr 0($sp), %12, --> main19
+ main2: emit c3 --> main1
+ main19: imm_int 3, %14, --> main18
+ main18: imm_int 4, %15, --> main17
+ main17: mul %13, %14, %15 --> main16
+ main16: store int32, add, %12, %13, %11 --> main15
+ main15: emit c5 --> main14
+ main14: imm_int 0, %6, --> main13
+ main13: imm_addr 0($sp), %7, --> main12
+ main12: imm_int 4, %9, --> main11
+ main11: imm_int 4, %10, --> main10
+ main10: mul %8, %9, %10 --> main9
+ main1: mov %1, %0 --> main0
+ main0: return %1
+
+
--- /dev/null
+int t2[5] = {13, 21, 34, 55, 89};\r
+\r
+int array_double (int tableau1[], int tableau2[], int i, int j) {\r
+ int a;\r
+\r
+ a = tableau2[i];\r
+\r
+ tableau1[j] = tableau2[j]+a;\r
+\r
+ return tableau1[j];\r
+}\r
+int main(){\r
+ int t1[5] = {0,0,0,0,0};\r
+ return array_double(t1,t2,0,0);\r
+}\r
--- /dev/null
+int t2[5] = {13, 21, 34, 55, 89};\r
+\r
+int array_double (int tableau1[], int tableau2[], int i, int j) {\r
+ int a;\r
+\r
+ a = tableau2[i];\r
+\r
+ tableau1[j] = tableau2[j]+a;\r
+\r
+ return tableau1[j];\r
+}\r
+int main(){\r
+ int t1[5] = {0,0,0,0,0};\r
+ return array_double(t1,t2,0,0);\r
+}\r
--- /dev/null
+Global Error (Translation RTLabs -> RTL):
+ Constant not supported.
--- /dev/null
+# extern __builtin_varargs_start: int -> void
+# extern __builtin_va_start: int -> int -> void
+# extern __builtin_va_end: int -> void
+# extern __builtin_va_copy: int -> int -> void
+# extern __builtin_va_arg: int -> int -> void
+# extern __builtin_types_compatible_p: int -> int -> int
+# extern __builtin_tanl: float -> float
+# extern __builtin_tanhl: float -> float
+# extern __builtin_tanhf: float -> float
+# extern __builtin_tanh: float -> float
+# extern __builtin_tanf: float -> float
+# extern __builtin_tan: float -> float
+# extern __builtin_strspn: int -> int -> int
+# extern __builtin_strpbrk: int -> int -> int
+# extern __builtin_strncpy: int -> int -> int -> int
+# extern __builtin_strncmp: int -> int -> int -> int
+# extern __builtin_strncat: int -> int -> int -> int
+# extern __builtin_strcspn: int -> int -> int
+# extern __builtin_strcpy: int -> int -> int
+# extern __builtin_strcmp: int -> int -> int
+# extern __builtin_strchr: int -> int -> int
+# extern __builtin_stpcpy: int -> int -> int
+# extern __builtin_stdarg_start: int -> void
+# extern __builtin_sqrtl: float -> float
+# extern __builtin_sqrtf: float -> float
+# extern __builtin_sqrt: float -> float
+# extern __builtin_sinl: float -> float
+# extern __builtin_sinhl: float -> float
+# extern __builtin_sinhf: float -> float
+# extern __builtin_sinh: float -> float
+# extern __builtin_sinf: float -> float
+# extern __builtin_sin: float -> float
+# extern __builtin_return_address: int -> int
+# extern __builtin_return: int -> void
+# extern __builtin_powil: float -> int -> float
+# extern __builtin_powif: float -> int -> float
+# extern __builtin_powi: float -> int -> float
+# extern __builtin_popcountll: int -> int
+# extern __builtin_popcountl: int -> int
+# extern __builtin_popcount: int -> int
+# extern __builtin_parityll: int -> int
+# extern __builtin_parityl: int -> int
+# extern __builtin_parity: int -> int
+# extern __builtin_object_size: int -> int -> int
+# extern __builtin_next_arg: int
+# extern __builtin_nansl: int -> float
+# extern __builtin_nansf: int -> float
+# extern __builtin_nans: int -> float
+# extern __builtin_nanl: int -> float
+# extern __builtin_nanf: int -> float
+# extern __builtin_nan: int -> float
+# extern __builtin_modfl: float -> int -> float
+# extern __builtin_modff: float -> int -> float
+# extern __builtin_mempcpy: int -> int -> int -> int
+# extern __builtin_memcpy: int -> int -> int -> int
+# extern __builtin_logl: float -> float
+# extern __builtin_logf: float -> float
+# extern __builtin_log10l: float -> float
+# extern __builtin_log10f: float -> float
+# extern __builtin_log10: float -> float
+# extern __builtin_log: float -> float
+# extern __builtin_ldexpl: float -> int -> float
+# extern __builtin_ldexpf: float -> int -> float
+# extern __builtin_ldexp: float -> int -> float
+# extern __builtin_infl: float
+# extern __builtin_inff: float
+# extern __builtin_inf: float
+# extern __builtin_huge_vall: float
+# extern __builtin_huge_valf: float
+# extern __builtin_huge_val: float
+# extern __builtin_frexpl: float -> int -> float
+# extern __builtin_frexpf: float -> int -> float
+# extern __builtin_frexp: float -> int -> float
+# extern __builtin_frame_address: int -> int
+# extern __builtin_fmodl: float -> float
+# extern __builtin_fmodf: float -> float
+# extern __builtin_fmod: float -> float
+# extern __builtin_floorl: float -> float
+# extern __builtin_floorf: float -> float
+# extern __builtin_floor: float -> float
+# extern __builtin_ffsll: int -> int
+# extern __builtin_ffsl: int -> int
+# extern __builtin_ffs: int -> int
+# extern __builtin_fabsl: float -> float
+# extern __builtin_fabsf: float -> float
+# extern __builtin_fabs: float -> float
+# extern __builtin_expl: float -> float
+# extern __builtin_expf: float -> float
+# extern __builtin_expect: int -> int -> int
+# extern __builtin_exp: float -> float
+# extern __builtin_ctzll: int -> int
+# extern __builtin_ctzl: int -> int
+# extern __builtin_ctz: int -> int
+# extern __builtin_cosl: float -> float
+# extern __builtin_coshl: float -> float
+# extern __builtin_coshf: float -> float
+# extern __builtin_cosh: float -> float
+# extern __builtin_cosf: float -> float
+# extern __builtin_cos: float -> float
+# extern __builtin_constant_p: int -> int
+# extern __builtin_clzll: int -> int
+# extern __builtin_clzl: int -> int
+# extern __builtin_clz: int -> int
+# extern __builtin_ceill: float -> float
+# extern __builtin_ceilf: float -> float
+# extern __builtin_ceil: float -> float
+# extern __builtin_atanl: float -> float
+# extern __builtin_atanf: float -> float
+# extern __builtin_atan2l: float -> float -> float
+# extern __builtin_atan2f: float -> float -> float
+# extern __builtin_atan2: float -> float -> float
+# extern __builtin_atan: float -> float
+# extern __builtin_asinl: float -> float
+# extern __builtin_asinf: float -> float
+# extern __builtin_asin: float -> float
+# extern __builtin_alloca: int -> int
+# extern __builtin_acosl: float -> float
+# extern __builtin_acosf: float -> float
+# extern __builtin_acos: float -> float
+# extern __builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+# extern __builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+# extern __builtin___vprintf_chk: int -> int -> int -> int
+# extern __builtin___vfprintf_chk: int -> int -> int -> int -> int
+# extern __builtin___strncpy_chk: int -> int -> int -> int -> int
+# extern __builtin___strncat_chk: int -> int -> int -> int -> int
+# extern __builtin___strcpy_chk: int -> int -> int -> int
+# extern __builtin___strcat_chk: int -> int -> int -> int
+# extern __builtin___stpcpy_chk: int -> int -> int -> int
+# extern __builtin___memset_chk: int -> int -> int -> int -> int
+# extern __builtin___mempcpy_chk: int -> int -> int -> int -> int
+# extern __builtin___memmove_chk: int -> int -> int -> int -> int
+# extern __builtin___memcpy_chk: int -> int -> int -> int -> int
+
+# begin preamble
+.data
+globals:
+.space 20
+nl:
+.asciiz "\n"
+.align 2
+.text
+main:
+la $gp, globals
+j main56
+print_int:
+li $v0, 1
+syscall
+jr $ra
+print_intln:
+li $v0, 1
+syscall
+la $a0, nl
+li $v0, 4
+syscall
+jr $ra
+scan_int:
+li $v0, 5
+syscall
+jr $ra
+alloc:
+li $v0, 9
+syscall
+jr $ra
+
+pow2:
+li $v0, 1
+sllv $v0, $v0, $a0
+jr $ra
+
+mod:
+beqz $a0, mod0
+beqz $a1, mod0
+li $t2, 0
+mod_t0:
+bgtz $a0, mod_a0_pos
+neg $t0, $a0
+addi $t2, $t2, 1
+j mod_t1
+mod_a0_pos:
+move $t0, $a0
+mod_t1:
+bgtz $a1, mod_a1_pos
+neg $t1, $a1
+addi $t2, $t2, 2
+j mod_main
+mod_a1_pos:
+move $t1, $a1
+mod_main:
+rem $v0, $t0, $t1
+beqz $t2, mod_exit
+addi $t2, -1
+beqz $t2, mod_case1
+addi $t2, -1
+beqz $t2, mod_case2
+neg $v0, $v0
+j mod_exit
+mod_case1:
+sub $v0, $a1, $v0
+j mod_exit
+mod_case2:
+add $v0, $a1, $v0
+j mod_exit
+mod0:
+li $v0, 0
+mod_exit:
+jr $ra
+
+toint:
+# $a0: size
+# $a1: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+jal pow2
+move $a0, $a1
+move $a1, $v0
+jal mod
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 8
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 16
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+sign_ext:
+# $a0: size
+# $a1: int to extend
+li $v0, 32
+sub $a0, $v0, $a0
+sllv $v0, $a1, $a0
+srav $v0, $v0, $a0
+jr $ra
+
+ofint:
+# $a0: signedness
+# $a1: size
+# $a2: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+beqz $a0, ofint_unsigned
+move $a0, $a1
+move $a1, $a2
+jal sign_ext
+j ofint_exit
+ofint_unsigned:
+move $v0, $a2
+ofint_exit:
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+# end preamble
+
+
+# begin array_ecriture
+array_ecriture35:
+c2:
+li $a3, 1
+li $v0, 4
+mulo $v0, $a1, $v0
+add $v0, $a0, $v0
+sw $a3, 0($v0)
+c1:
+li $a1, 5
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c0:
+li $v0, 0
+jr $ra
+# end array_ecriture
+
+
+# begin _main
+main56:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $v0, $gp
+sw $zero, 0($v0)
+move $v0, $gp
+sw $zero, 4($v0)
+move $v0, $gp
+sw $zero, 8($v0)
+move $v0, $gp
+sw $zero, 12($v0)
+move $v0, $gp
+sw $zero, 16($v0)
+c4:
+move $a0, $gp
+li $a1, 0
+li $a2, 1
+la $v0, array_ecriture35
+jalr $v0
+c3:
+li $a0, 1
+li $v0, 4
+mulo $a0, $a0, $v0
+move $v0, $gp
+add $v0, $v0, $a0
+lw $v0, 0($v0)
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+# end _main
--- /dev/null
+int t[5] = { 0, 0, 0, 0, 0, };
+
+extern void *__builtin___memcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memmove_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___mempcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memset_chk(void *, int, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___stpcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcat_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strncat_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___strncpy_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern int __builtin___vfprintf_chk(void *, int, unsigned char *, void *);
+
+extern int __builtin___vprintf_chk(int, unsigned char *, void *);
+
+extern int __builtin___vsnprintf_chk(unsigned char *, unsigned int, int, unsigned int, unsigned char *, void *);
+
+extern int __builtin___vsprintf_chk(unsigned char *, int, unsigned int, unsigned char *, void *);
+
+extern double __builtin_acos(double);
+
+extern float __builtin_acosf(float);
+
+extern double __builtin_acosl(double);
+
+extern void *__builtin_alloca(unsigned int);
+
+extern double __builtin_asin(double);
+
+extern float __builtin_asinf(float);
+
+extern double __builtin_asinl(double);
+
+extern double __builtin_atan(double);
+
+extern float __builtin_atanf(float);
+
+extern double __builtin_atanl(double);
+
+extern double __builtin_atan2(double, double);
+
+extern float __builtin_atan2f(float, float);
+
+extern double __builtin_atan2l(double, double);
+
+extern double __builtin_ceil(double);
+
+extern float __builtin_ceilf(float);
+
+extern double __builtin_ceill(double);
+
+extern double __builtin_cos(double);
+
+extern float __builtin_cosf(float);
+
+extern double __builtin_cosl(double);
+
+extern double __builtin_cosh(double);
+
+extern float __builtin_coshf(float);
+
+extern double __builtin_coshl(double);
+
+extern int __builtin_clz(unsigned int);
+
+extern int __builtin_clzl(unsigned int);
+
+extern int __builtin_clzll(unsigned int);
+
+extern int __builtin_constant_p(int);
+
+extern int __builtin_ctz(unsigned int);
+
+extern int __builtin_ctzl(unsigned int);
+
+extern int __builtin_ctzll(unsigned int);
+
+extern double __builtin_exp(double);
+
+extern float __builtin_expf(float);
+
+extern double __builtin_expl(double);
+
+extern int __builtin_expect(int, int);
+
+extern double __builtin_fabs(double);
+
+extern float __builtin_fabsf(float);
+
+extern double __builtin_fabsl(double);
+
+extern int __builtin_ffs(unsigned int);
+
+extern int __builtin_ffsl(unsigned int);
+
+extern int __builtin_ffsll(unsigned int);
+
+extern void *__builtin_frame_address(unsigned int);
+
+extern double __builtin_floor(double);
+
+extern float __builtin_floorf(float);
+
+extern double __builtin_floorl(double);
+
+extern double __builtin_huge_val(void);
+
+extern float __builtin_huge_valf(void);
+
+extern double __builtin_huge_vall(void);
+
+extern double __builtin_inf(void);
+
+extern float __builtin_inff(void);
+
+extern double __builtin_infl(void);
+
+extern void *__builtin_memcpy(void *, void *, unsigned int);
+
+extern void *__builtin_mempcpy(void *, void *, unsigned int);
+
+extern double __builtin_fmod(double);
+
+extern float __builtin_fmodf(float);
+
+extern double __builtin_fmodl(double);
+
+extern double __builtin_frexp(double, int *);
+
+extern float __builtin_frexpf(float, int *);
+
+extern double __builtin_frexpl(double, int *);
+
+extern double __builtin_ldexp(double, int);
+
+extern float __builtin_ldexpf(float, int);
+
+extern double __builtin_ldexpl(double, int);
+
+extern double __builtin_log(double);
+
+extern float __builtin_logf(float);
+
+extern double __builtin_logl(double);
+
+extern double __builtin_log10(double);
+
+extern float __builtin_log10f(float);
+
+extern double __builtin_log10l(double);
+
+extern float __builtin_modff(float, float *);
+
+extern double __builtin_modfl(double, double *);
+
+extern double __builtin_nan(unsigned char *);
+
+extern float __builtin_nanf(unsigned char *);
+
+extern double __builtin_nanl(unsigned char *);
+
+extern double __builtin_nans(unsigned char *);
+
+extern float __builtin_nansf(unsigned char *);
+
+extern double __builtin_nansl(unsigned char *);
+
+extern void *__builtin_next_arg(void);
+
+extern unsigned int __builtin_object_size(void *, int);
+
+extern int __builtin_parity(unsigned int);
+
+extern int __builtin_parityl(unsigned int);
+
+extern int __builtin_parityll(unsigned int);
+
+extern int __builtin_popcount(unsigned int);
+
+extern int __builtin_popcountl(unsigned int);
+
+extern int __builtin_popcountll(unsigned int);
+
+extern double __builtin_powi(double, int);
+
+extern float __builtin_powif(float, int);
+
+extern double __builtin_powil(double, int);
+
+extern void __builtin_return(void *);
+
+extern void *__builtin_return_address(unsigned int);
+
+extern double __builtin_sin(double);
+
+extern float __builtin_sinf(float);
+
+extern double __builtin_sinl(double);
+
+extern double __builtin_sinh(double);
+
+extern float __builtin_sinhf(float);
+
+extern double __builtin_sinhl(double);
+
+extern double __builtin_sqrt(double);
+
+extern float __builtin_sqrtf(float);
+
+extern double __builtin_sqrtl(double);
+
+extern unsigned char *__builtin_stpcpy(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strchr(unsigned char *, unsigned char);
+
+extern int __builtin_strcmp(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strcpy(unsigned char *, unsigned char *);
+
+extern unsigned int __builtin_strcspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strncat(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strncmp(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin_strncpy(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strpbrk(unsigned char *, unsigned char *);
+
+extern int __builtin_types_compatible_p(unsigned int, unsigned int);
+
+extern double __builtin_tan(double);
+
+extern float __builtin_tanf(float);
+
+extern double __builtin_tanl(double);
+
+extern double __builtin_tanh(double);
+
+extern float __builtin_tanhf(float);
+
+extern double __builtin_tanhl(double);
+
+extern void __builtin_va_end(void *);
+
+extern void __builtin_varargs_start(void *);
+
+extern void __builtin_va_start(void *, void *);
+
+extern void __builtin_stdarg_start(void *);
+
+extern void __builtin_va_arg(void *, unsigned int);
+
+extern void __builtin_va_copy(void *, void *);
+
+int array_ecriture(int *tabecr, int i, int j)
+{
+ c2:
+ tabecr[i] = 1;
+ c1:
+ tabecr[j] = 5;
+ c0:
+ return 0;
+}
+
+int main(void)
+{
+ int a;
+ c4:
+ a = array_ecriture(t, 0, 1);
+ c3:
+ return t[1];
+}
+
+
--- /dev/null
+
+var "t" {0, 0, 0, 0, 0}
+
+
+extern "__builtin___memcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memmove_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___mempcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memset_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___stpcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcat_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strncat_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___strncpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vfprintf_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vprintf_chk" : int -> int -> int -> int
+
+
+extern "__builtin___vsnprintf_chk" : int -> int -> int -> int -> int -> int -> int
+
+
+extern "__builtin___vsprintf_chk" : int -> int -> int -> int -> int -> int
+
+
+extern "__builtin_acos" : float -> float
+
+
+extern "__builtin_acosf" : float -> float
+
+
+extern "__builtin_acosl" : float -> float
+
+
+extern "__builtin_alloca" : int -> int
+
+
+extern "__builtin_asin" : float -> float
+
+
+extern "__builtin_asinf" : float -> float
+
+
+extern "__builtin_asinl" : float -> float
+
+
+extern "__builtin_atan" : float -> float
+
+
+extern "__builtin_atanf" : float -> float
+
+
+extern "__builtin_atanl" : float -> float
+
+
+extern "__builtin_atan2" : float -> float -> float
+
+
+extern "__builtin_atan2f" : float -> float -> float
+
+
+extern "__builtin_atan2l" : float -> float -> float
+
+
+extern "__builtin_ceil" : float -> float
+
+
+extern "__builtin_ceilf" : float -> float
+
+
+extern "__builtin_ceill" : float -> float
+
+
+extern "__builtin_cos" : float -> float
+
+
+extern "__builtin_cosf" : float -> float
+
+
+extern "__builtin_cosl" : float -> float
+
+
+extern "__builtin_cosh" : float -> float
+
+
+extern "__builtin_coshf" : float -> float
+
+
+extern "__builtin_coshl" : float -> float
+
+
+extern "__builtin_clz" : int -> int
+
+
+extern "__builtin_clzl" : int -> int
+
+
+extern "__builtin_clzll" : int -> int
+
+
+extern "__builtin_constant_p" : int -> int
+
+
+extern "__builtin_ctz" : int -> int
+
+
+extern "__builtin_ctzl" : int -> int
+
+
+extern "__builtin_ctzll" : int -> int
+
+
+extern "__builtin_exp" : float -> float
+
+
+extern "__builtin_expf" : float -> float
+
+
+extern "__builtin_expl" : float -> float
+
+
+extern "__builtin_expect" : int -> int -> int
+
+
+extern "__builtin_fabs" : float -> float
+
+
+extern "__builtin_fabsf" : float -> float
+
+
+extern "__builtin_fabsl" : float -> float
+
+
+extern "__builtin_ffs" : int -> int
+
+
+extern "__builtin_ffsl" : int -> int
+
+
+extern "__builtin_ffsll" : int -> int
+
+
+extern "__builtin_frame_address" : int -> int
+
+
+extern "__builtin_floor" : float -> float
+
+
+extern "__builtin_floorf" : float -> float
+
+
+extern "__builtin_floorl" : float -> float
+
+
+extern "__builtin_huge_val" : float
+
+
+extern "__builtin_huge_valf" : float
+
+
+extern "__builtin_huge_vall" : float
+
+
+extern "__builtin_inf" : float
+
+
+extern "__builtin_inff" : float
+
+
+extern "__builtin_infl" : float
+
+
+extern "__builtin_memcpy" : int -> int -> int -> int
+
+
+extern "__builtin_mempcpy" : int -> int -> int -> int
+
+
+extern "__builtin_fmod" : float -> float
+
+
+extern "__builtin_fmodf" : float -> float
+
+
+extern "__builtin_fmodl" : float -> float
+
+
+extern "__builtin_frexp" : float -> int -> float
+
+
+extern "__builtin_frexpf" : float -> int -> float
+
+
+extern "__builtin_frexpl" : float -> int -> float
+
+
+extern "__builtin_ldexp" : float -> int -> float
+
+
+extern "__builtin_ldexpf" : float -> int -> float
+
+
+extern "__builtin_ldexpl" : float -> int -> float
+
+
+extern "__builtin_log" : float -> float
+
+
+extern "__builtin_logf" : float -> float
+
+
+extern "__builtin_logl" : float -> float
+
+
+extern "__builtin_log10" : float -> float
+
+
+extern "__builtin_log10f" : float -> float
+
+
+extern "__builtin_log10l" : float -> float
+
+
+extern "__builtin_modff" : float -> int -> float
+
+
+extern "__builtin_modfl" : float -> int -> float
+
+
+extern "__builtin_nan" : int -> float
+
+
+extern "__builtin_nanf" : int -> float
+
+
+extern "__builtin_nanl" : int -> float
+
+
+extern "__builtin_nans" : int -> float
+
+
+extern "__builtin_nansf" : int -> float
+
+
+extern "__builtin_nansl" : int -> float
+
+
+extern "__builtin_next_arg" : int
+
+
+extern "__builtin_object_size" : int -> int -> int
+
+
+extern "__builtin_parity" : int -> int
+
+
+extern "__builtin_parityl" : int -> int
+
+
+extern "__builtin_parityll" : int -> int
+
+
+extern "__builtin_popcount" : int -> int
+
+
+extern "__builtin_popcountl" : int -> int
+
+
+extern "__builtin_popcountll" : int -> int
+
+
+extern "__builtin_powi" : float -> int -> float
+
+
+extern "__builtin_powif" : float -> int -> float
+
+
+extern "__builtin_powil" : float -> int -> float
+
+
+extern "__builtin_return" : int -> void
+
+
+extern "__builtin_return_address" : int -> int
+
+
+extern "__builtin_sin" : float -> float
+
+
+extern "__builtin_sinf" : float -> float
+
+
+extern "__builtin_sinl" : float -> float
+
+
+extern "__builtin_sinh" : float -> float
+
+
+extern "__builtin_sinhf" : float -> float
+
+
+extern "__builtin_sinhl" : float -> float
+
+
+extern "__builtin_sqrt" : float -> float
+
+
+extern "__builtin_sqrtf" : float -> float
+
+
+extern "__builtin_sqrtl" : float -> float
+
+
+extern "__builtin_stpcpy" : int -> int -> int
+
+
+extern "__builtin_strchr" : int -> int -> int
+
+
+extern "__builtin_strcmp" : int -> int -> int
+
+
+extern "__builtin_strcpy" : int -> int -> int
+
+
+extern "__builtin_strcspn" : int -> int -> int
+
+
+extern "__builtin_strncat" : int -> int -> int -> int
+
+
+extern "__builtin_strncmp" : int -> int -> int -> int
+
+
+extern "__builtin_strncpy" : int -> int -> int -> int
+
+
+extern "__builtin_strspn" : int -> int -> int
+
+
+extern "__builtin_strpbrk" : int -> int -> int
+
+
+extern "__builtin_types_compatible_p" : int -> int -> int
+
+
+extern "__builtin_tan" : float -> float
+
+
+extern "__builtin_tanf" : float -> float
+
+
+extern "__builtin_tanl" : float -> float
+
+
+extern "__builtin_tanh" : float -> float
+
+
+extern "__builtin_tanhf" : float -> float
+
+
+extern "__builtin_tanhl" : float -> float
+
+
+extern "__builtin_va_end" : int -> void
+
+
+extern "__builtin_varargs_start" : int -> void
+
+
+extern "__builtin_va_start" : int -> int -> void
+
+
+extern "__builtin_stdarg_start" : int -> void
+
+
+extern "__builtin_va_arg" : int -> int -> void
+
+
+extern "__builtin_va_copy" : int -> int -> void
+
+
+"array_ecriture" (tabecr, i, j) : int -> int -> int -> int {
+
+ stack 0;
+
+ c2:
+ int32[tabecr + (i * 4)] = 1;
+ c1:
+ int32[tabecr + (j * 4)] = 5;
+ c0:
+ return 0;
+
+}
+
+
+"main" () : int {
+
+ stack 0;
+
+ var a;
+
+ c4:
+ a = "array_ecriture"("t", 0, 1) : int -> int -> int -> int;
+ c3:
+ return int32["t" + (1 * 4)];
+
+}
+
+
--- /dev/null
+program
+
+globals 20
+
+procedure array_ecriture(3)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20
+entry array_ecriture35
+array_ecriture35: newframe --> array_ecriture34
+array_ecriture34: move %20, $ra --> array_ecriture33
+array_ecriture33: move %19, $s7 --> array_ecriture32
+array_ecriture32: move %18, $s6 --> array_ecriture31
+array_ecriture31: move %17, $s5 --> array_ecriture30
+array_ecriture30: move %16, $s4 --> array_ecriture29
+array_ecriture29: move %15, $s3 --> array_ecriture28
+array_ecriture28: move %14, $s2 --> array_ecriture27
+array_ecriture27: move %13, $s1 --> array_ecriture26
+array_ecriture26: move %12, $s0 --> array_ecriture25
+array_ecriture25: move %0, $a0 --> array_ecriture24
+array_ecriture24: move %1, $a1 --> array_ecriture23
+array_ecriture23: move %2, $a2 --> array_ecriture22
+array_ecriture22: li %4, 0 --> array_ecriture21
+array_ecriture21: li %5, 0 --> array_ecriture20
+array_ecriture20: li %6, 0 --> array_ecriture19
+array_ecriture19: li %7, 0 --> array_ecriture18
+array_ecriture18: li %8, 0 --> array_ecriture17
+array_ecriture17: li %9, 0 --> array_ecriture16
+array_ecriture16: li %10, 0 --> array_ecriture15
+array_ecriture15: li %11, 0 --> array_ecriture12
+array_ecriture12: emit c2 --> array_ecriture11
+array_ecriture11: li %7, 1 --> array_ecriture10
+array_ecriture10: li %9, 4 --> array_ecriture9
+array_ecriture9 : mulo %8, %1, %9 --> array_ecriture8
+array_ecriture8 : add %11, %0, %8 --> array_ecriture14
+array_ecriture14: sw %7, 0(%11) --> array_ecriture7
+array_ecriture7 : emit c1 --> array_ecriture6
+array_ecriture6 : li %4, 5 --> array_ecriture5
+array_ecriture5 : li %6, 4 --> array_ecriture4
+array_ecriture4 : mulo %5, %2, %6 --> array_ecriture3
+array_ecriture3 : add %10, %0, %5 --> array_ecriture13
+array_ecriture13: sw %4, 0(%10) --> array_ecriture2
+array_ecriture2 : emit c0 --> array_ecriture1
+array_ecriture1 : li %3, 0 --> array_ecriture0
+array_ecriture0 : j --> array_ecriture47
+array_ecriture47: move $v0, %3 --> array_ecriture46
+array_ecriture46: move $ra, %20 --> array_ecriture45
+array_ecriture45: move $s7, %19 --> array_ecriture44
+array_ecriture44: move $s6, %18 --> array_ecriture43
+array_ecriture43: move $s5, %17 --> array_ecriture42
+array_ecriture42: move $s4, %16 --> array_ecriture41
+array_ecriture41: move $s3, %15 --> array_ecriture40
+array_ecriture40: move $s2, %14 --> array_ecriture39
+array_ecriture39: move $s1, %13 --> array_ecriture38
+array_ecriture38: move $s0, %12 --> array_ecriture37
+array_ecriture37: delframe --> array_ecriture36
+array_ecriture36: jr $ra (xmits $v0)
+
+procedure _main(0)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27
+entry main56
+main56: newframe --> main55
+main55: move %27, $ra --> main54
+main54: move %26, $s7 --> main53
+main53: move %25, $s6 --> main52
+main52: move %24, $s5 --> main51
+main51: move %23, $s4 --> main50
+main50: move %22, $s3 --> main49
+main49: move %21, $s2 --> main48
+main48: move %20, $s1 --> main47
+main47: move %19, $s0 --> main46
+main46: li %0, 0 --> main45
+main45: li %2, 0 --> main44
+main44: li %3, 0 --> main43
+main43: li %4, 0 --> main42
+main42: li %5, 0 --> main41
+main41: li %6, 0 --> main40
+main40: li %7, 0 --> main39
+main39: li %8, 0 --> main38
+main38: li %9, 0 --> main37
+main37: li %10, 0 --> main36
+main36: li %11, 0 --> main35
+main35: li %12, 0 --> main34
+main34: li %13, 0 --> main33
+main33: li %14, 0 --> main32
+main32: li %15, 0 --> main31
+main31: li %16, 0 --> main30
+main30: li %17, 0 --> main29
+main29: li %18, 0 --> main20
+main20: li %12, 0 --> main19
+main19: move %17, $gp --> main74
+main74: move %17, %17 --> main27
+main27: sw %12, 0(%17) --> main18
+main18: li %11, 0 --> main17
+main17: move %16, $gp --> main73
+main73: move %16, %16 --> main26
+main26: sw %11, 4(%16) --> main16
+main16: li %10, 0 --> main15
+main15: move %15, $gp --> main72
+main72: move %15, %15 --> main25
+main25: sw %10, 8(%15) --> main14
+main14: li %9, 0 --> main13
+main13: move %14, $gp --> main71
+main71: move %14, %14 --> main24
+main24: sw %9, 12(%14) --> main12
+main12: li %8, 0 --> main11
+main11: move %13, $gp --> main70
+main70: move %13, %13 --> main23
+main23: sw %8, 16(%13) --> main10
+main10: emit c4 --> main9
+main9 : move %5, $gp --> main80
+main80: move %5, %5 --> main8
+main8 : li %6, 0 --> main7
+main7 : li %7, 1 --> main6
+main6 : la %18, array_ecriture --> main28
+main28: j --> main79
+main79: move $a0, %5 --> main78
+main78: move $a1, %6 --> main77
+main77: move $a2, %7 --> main76
+main76: call %18(3) --> main75
+main75: move %0, $v0 --> main5
+main5 : emit c3 --> main4
+main4 : li %3, 1 --> main3
+main3 : li %4, 4 --> main2
+main2 : mulo %2, %3, %4 --> main1
+main1 : move %1, $gp --> main69
+main69: move %1, %1 --> main22
+main22: add %1, %1, %2 --> main21
+main21: lw %1, 0(%1) --> main0
+main0 : j --> main68
+main68: move $v0, %1 --> main67
+main67: move $ra, %27 --> main66
+main66: move $s7, %26 --> main65
+main65: move $s6, %25 --> main64
+main64: move $s5, %24 --> main63
+main63: move $s4, %23 --> main62
+main62: move $s3, %22 --> main61
+main61: move $s2, %21 --> main60
+main60: move $s1, %20 --> main59
+main59: move $s0, %19 --> main58
+main58: delframe --> main57
+main57: jr $ra (xmits $v0)
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 20
+
+procedure array_ecriture(3)
+var 0
+array_ecriture35:
+newframe
+c2:
+li $a3, 1
+li $v0, 4
+mulo $v0, $a1, $v0
+add $v0, $a0, $v0
+sw $a3, 0($v0)
+c1:
+li $a1, 5
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c0:
+li $v0, 0
+delframe
+jr $ra
+
+procedure _main(0)
+var 4
+main56:
+newframe
+sw $ra, 0($sp)
+move $v0, $gp
+sw $zero, 0($v0)
+move $v0, $gp
+sw $zero, 4($v0)
+move $v0, $gp
+sw $zero, 8($v0)
+move $v0, $gp
+sw $zero, 12($v0)
+move $v0, $gp
+sw $zero, 16($v0)
+c4:
+move $a0, $gp
+li $a1, 0
+li $a2, 1
+la $v0, array_ecriture
+call $v0
+c3:
+li $a0, 1
+li $v0, 4
+mulo $a0, $a0, $v0
+move $v0, $gp
+add $v0, $v0, $a0
+lw $v0, 0($v0)
+lw $ra, 0($sp)
+delframe
+jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 20
+
+procedure array_ecriture(3)
+var 0
+entry array_ecriture35
+array_ecriture35: newframe --> array_ecriture34
+array_ecriture34: j --> array_ecriture33
+array_ecriture33: j --> array_ecriture32
+array_ecriture32: j --> array_ecriture31
+array_ecriture31: j --> array_ecriture30
+array_ecriture30: j --> array_ecriture29
+array_ecriture29: j --> array_ecriture28
+array_ecriture28: j --> array_ecriture27
+array_ecriture27: j --> array_ecriture26
+array_ecriture26: j --> array_ecriture25
+array_ecriture25: j --> array_ecriture24
+array_ecriture24: j --> array_ecriture23
+array_ecriture23: j --> array_ecriture22
+array_ecriture22: j --> array_ecriture21
+array_ecriture21: j --> array_ecriture20
+array_ecriture20: j --> array_ecriture19
+array_ecriture19: j --> array_ecriture18
+array_ecriture18: j --> array_ecriture17
+array_ecriture17: j --> array_ecriture16
+array_ecriture16: j --> array_ecriture15
+array_ecriture15: j --> array_ecriture12
+array_ecriture12: emit c2 --> array_ecriture11
+array_ecriture11: li $a3, 1 --> array_ecriture10
+array_ecriture10: li $v0, 4 --> array_ecriture9
+array_ecriture9 : mulo $v0, $a1, $v0 --> array_ecriture8
+array_ecriture8 : add $v0, $a0, $v0 --> array_ecriture14
+array_ecriture14: lw $a3, 0($v0) --> array_ecriture7
+array_ecriture7 : emit c1 --> array_ecriture6
+array_ecriture6 : li $a1, 5 --> array_ecriture5
+array_ecriture5 : li $v0, 4 --> array_ecriture4
+array_ecriture4 : mulo $v0, $a2, $v0 --> array_ecriture3
+array_ecriture3 : add $v0, $a0, $v0 --> array_ecriture13
+array_ecriture13: lw $a1, 0($v0) --> array_ecriture2
+array_ecriture2 : emit c0 --> array_ecriture1
+array_ecriture1 : li $v0, 0 --> array_ecriture0
+array_ecriture0 : j --> array_ecriture47
+array_ecriture47: j --> array_ecriture46
+array_ecriture46: j --> array_ecriture45
+array_ecriture45: j --> array_ecriture44
+array_ecriture44: j --> array_ecriture43
+array_ecriture43: j --> array_ecriture42
+array_ecriture42: j --> array_ecriture41
+array_ecriture41: j --> array_ecriture40
+array_ecriture40: j --> array_ecriture39
+array_ecriture39: j --> array_ecriture38
+array_ecriture38: j --> array_ecriture37
+array_ecriture37: delframe --> array_ecriture36
+array_ecriture36: jr $ra
+
+procedure _main(0)
+var 4
+entry main56
+main56: newframe --> main55
+main55: lw $ra, 0($sp) --> main54
+main54: j --> main53
+main53: j --> main52
+main52: j --> main51
+main51: j --> main50
+main50: j --> main49
+main49: j --> main48
+main48: j --> main47
+main47: j --> main46
+main46: j --> main45
+main45: j --> main44
+main44: j --> main43
+main43: j --> main42
+main42: j --> main41
+main41: j --> main40
+main40: j --> main39
+main39: j --> main38
+main38: j --> main37
+main37: j --> main36
+main36: j --> main35
+main35: j --> main34
+main34: j --> main33
+main33: j --> main32
+main32: j --> main31
+main31: j --> main30
+main30: j --> main29
+main29: j --> main20
+main20: j --> main19
+main19: move $v0, $gp --> main74
+main74: j --> main27
+main27: lw $zero, 0($v0) --> main18
+main18: j --> main17
+main17: move $v0, $gp --> main73
+main73: j --> main26
+main26: lw $zero, 4($v0) --> main16
+main16: j --> main15
+main15: move $v0, $gp --> main72
+main72: j --> main25
+main25: lw $zero, 8($v0) --> main14
+main14: j --> main13
+main13: move $v0, $gp --> main71
+main71: j --> main24
+main24: lw $zero, 12($v0) --> main12
+main12: j --> main11
+main11: move $v0, $gp --> main70
+main70: j --> main23
+main23: lw $zero, 16($v0) --> main10
+main10: emit c4 --> main9
+main9 : move $a0, $gp --> main80
+main80: j --> main8
+main8 : li $a1, 0 --> main7
+main7 : li $a2, 1 --> main6
+main6 : la $v0, array_ecriture --> main28
+main28: j --> main79
+main79: j --> main78
+main78: j --> main77
+main77: j --> main76
+main76: call $v0 --> main75
+main75: j --> main5
+main5 : emit c3 --> main4
+main4 : li $a0, 1 --> main3
+main3 : li $v0, 4 --> main2
+main2 : mulo $a0, $a0, $v0 --> main1
+main1 : move $v0, $gp --> main69
+main69: j --> main22
+main22: add $v0, $v0, $a0 --> main21
+main21: lw $v0, 0($v0) --> main0
+main0 : j --> main68
+main68: j --> main67
+main67: lw $ra, 0($sp) --> main66
+main66: j --> main65
+main65: j --> main64
+main64: j --> main63
+main63: j --> main62
+main62: j --> main61
+main61: j --> main60
+main60: j --> main59
+main59: j --> main58
+main58: delframe --> main57
+main57: jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 20
+
+function array_ecriture(%0; %1; %2) : %3
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11
+entry array_ecriture22
+array_ecriture22: li %4, 0 --> array_ecriture21
+array_ecriture21: li %5, 0 --> array_ecriture20
+array_ecriture20: li %6, 0 --> array_ecriture19
+array_ecriture19: li %7, 0 --> array_ecriture18
+array_ecriture18: li %8, 0 --> array_ecriture17
+array_ecriture17: li %9, 0 --> array_ecriture16
+array_ecriture16: li %10, 0 --> array_ecriture15
+array_ecriture15: li %11, 0 --> array_ecriture12
+array_ecriture12: emit c2 --> array_ecriture11
+array_ecriture11: li %7, 1 --> array_ecriture10
+array_ecriture10: li %9, 4 --> array_ecriture9
+array_ecriture9 : mulo %8, %1, %9 --> array_ecriture8
+array_ecriture8 : add %11, %0, %8 --> array_ecriture14
+array_ecriture14: sw %7, 0(%11) --> array_ecriture7
+array_ecriture7 : emit c1 --> array_ecriture6
+array_ecriture6 : li %4, 5 --> array_ecriture5
+array_ecriture5 : li %6, 4 --> array_ecriture4
+array_ecriture4 : mulo %5, %2, %6 --> array_ecriture3
+array_ecriture3 : add %10, %0, %5 --> array_ecriture13
+array_ecriture13: sw %4, 0(%10) --> array_ecriture2
+array_ecriture2 : emit c0 --> array_ecriture1
+array_ecriture1 : li %3, 0 --> array_ecriture0
+array_ecriture0 : return %3
+
+function _main() : %1
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18
+entry main46
+main46: li %0, 0 --> main45
+main45: li %2, 0 --> main44
+main44: li %3, 0 --> main43
+main43: li %4, 0 --> main42
+main42: li %5, 0 --> main41
+main41: li %6, 0 --> main40
+main40: li %7, 0 --> main39
+main39: li %8, 0 --> main38
+main38: li %9, 0 --> main37
+main37: li %10, 0 --> main36
+main36: li %11, 0 --> main35
+main35: li %12, 0 --> main34
+main34: li %13, 0 --> main33
+main33: li %14, 0 --> main32
+main32: li %15, 0 --> main31
+main31: li %16, 0 --> main30
+main30: li %17, 0 --> main29
+main29: li %18, 0 --> main20
+main20: li %12, 0 --> main19
+main19: addi %17, GLOBALS, 0 --> main27
+main27: sw %12, 0(%17) --> main18
+main18: li %11, 0 --> main17
+main17: addi %16, GLOBALS, 0 --> main26
+main26: sw %11, 4(%16) --> main16
+main16: li %10, 0 --> main15
+main15: addi %15, GLOBALS, 0 --> main25
+main25: sw %10, 8(%15) --> main14
+main14: li %9, 0 --> main13
+main13: addi %14, GLOBALS, 0 --> main24
+main24: sw %9, 12(%14) --> main12
+main12: li %8, 0 --> main11
+main11: addi %13, GLOBALS, 0 --> main23
+main23: sw %8, 16(%13) --> main10
+main10: emit c4 --> main9
+main9 : addi %5, GLOBALS, 0 --> main8
+main8 : li %6, 0 --> main7
+main7 : li %7, 1 --> main6
+main6 : la %18, array_ecriture --> main28
+main28: call %0, %18(%5, %6, %7) --> main5
+main5 : emit c3 --> main4
+main4 : li %3, 1 --> main3
+main3 : li %4, 4 --> main2
+main2 : mulo %2, %3, %4 --> main1
+main1 : addi %1, GLOBALS, 0 --> main22
+main22: add %1, %1, %2 --> main21
+main21: lw %1, 0(%1) --> main0
+main0 : return %1
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program: (main function is "main")
+
+
+ globals:
+ "t" = {0, 0, 0, 0, 0}
+
+
+ "__builtin___memcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memmove_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___mempcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memset_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___stpcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strcat_chk": int -> int -> int -> int
+
+
+ "__builtin___strcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strncat_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___strncpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vfprintf_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vprintf_chk": int -> int -> int -> int
+
+
+ "__builtin___vsnprintf_chk": int -> int -> int -> int -> int -> int -> int
+
+
+ "__builtin___vsprintf_chk": int -> int -> int -> int -> int -> int
+
+
+ "__builtin_acos": float -> float
+
+
+ "__builtin_acosf": float -> float
+
+
+ "__builtin_acosl": float -> float
+
+
+ "__builtin_alloca": int -> int
+
+
+ "__builtin_asin": float -> float
+
+
+ "__builtin_asinf": float -> float
+
+
+ "__builtin_asinl": float -> float
+
+
+ "__builtin_atan": float -> float
+
+
+ "__builtin_atanf": float -> float
+
+
+ "__builtin_atanl": float -> float
+
+
+ "__builtin_atan2": float -> float -> float
+
+
+ "__builtin_atan2f": float -> float -> float
+
+
+ "__builtin_atan2l": float -> float -> float
+
+
+ "__builtin_ceil": float -> float
+
+
+ "__builtin_ceilf": float -> float
+
+
+ "__builtin_ceill": float -> float
+
+
+ "__builtin_cos": float -> float
+
+
+ "__builtin_cosf": float -> float
+
+
+ "__builtin_cosl": float -> float
+
+
+ "__builtin_cosh": float -> float
+
+
+ "__builtin_coshf": float -> float
+
+
+ "__builtin_coshl": float -> float
+
+
+ "__builtin_clz": int -> int
+
+
+ "__builtin_clzl": int -> int
+
+
+ "__builtin_clzll": int -> int
+
+
+ "__builtin_constant_p": int -> int
+
+
+ "__builtin_ctz": int -> int
+
+
+ "__builtin_ctzl": int -> int
+
+
+ "__builtin_ctzll": int -> int
+
+
+ "__builtin_exp": float -> float
+
+
+ "__builtin_expf": float -> float
+
+
+ "__builtin_expl": float -> float
+
+
+ "__builtin_expect": int -> int -> int
+
+
+ "__builtin_fabs": float -> float
+
+
+ "__builtin_fabsf": float -> float
+
+
+ "__builtin_fabsl": float -> float
+
+
+ "__builtin_ffs": int -> int
+
+
+ "__builtin_ffsl": int -> int
+
+
+ "__builtin_ffsll": int -> int
+
+
+ "__builtin_frame_address": int -> int
+
+
+ "__builtin_floor": float -> float
+
+
+ "__builtin_floorf": float -> float
+
+
+ "__builtin_floorl": float -> float
+
+
+ "__builtin_huge_val": float
+
+
+ "__builtin_huge_valf": float
+
+
+ "__builtin_huge_vall": float
+
+
+ "__builtin_inf": float
+
+
+ "__builtin_inff": float
+
+
+ "__builtin_infl": float
+
+
+ "__builtin_memcpy": int -> int -> int -> int
+
+
+ "__builtin_mempcpy": int -> int -> int -> int
+
+
+ "__builtin_fmod": float -> float
+
+
+ "__builtin_fmodf": float -> float
+
+
+ "__builtin_fmodl": float -> float
+
+
+ "__builtin_frexp": float -> int -> float
+
+
+ "__builtin_frexpf": float -> int -> float
+
+
+ "__builtin_frexpl": float -> int -> float
+
+
+ "__builtin_ldexp": float -> int -> float
+
+
+ "__builtin_ldexpf": float -> int -> float
+
+
+ "__builtin_ldexpl": float -> int -> float
+
+
+ "__builtin_log": float -> float
+
+
+ "__builtin_logf": float -> float
+
+
+ "__builtin_logl": float -> float
+
+
+ "__builtin_log10": float -> float
+
+
+ "__builtin_log10f": float -> float
+
+
+ "__builtin_log10l": float -> float
+
+
+ "__builtin_modff": float -> int -> float
+
+
+ "__builtin_modfl": float -> int -> float
+
+
+ "__builtin_nan": int -> float
+
+
+ "__builtin_nanf": int -> float
+
+
+ "__builtin_nanl": int -> float
+
+
+ "__builtin_nans": int -> float
+
+
+ "__builtin_nansf": int -> float
+
+
+ "__builtin_nansl": int -> float
+
+
+ "__builtin_next_arg": int
+
+
+ "__builtin_object_size": int -> int -> int
+
+
+ "__builtin_parity": int -> int
+
+
+ "__builtin_parityl": int -> int
+
+
+ "__builtin_parityll": int -> int
+
+
+ "__builtin_popcount": int -> int
+
+
+ "__builtin_popcountl": int -> int
+
+
+ "__builtin_popcountll": int -> int
+
+
+ "__builtin_powi": float -> int -> float
+
+
+ "__builtin_powif": float -> int -> float
+
+
+ "__builtin_powil": float -> int -> float
+
+
+ "__builtin_return": int -> void
+
+
+ "__builtin_return_address": int -> int
+
+
+ "__builtin_sin": float -> float
+
+
+ "__builtin_sinf": float -> float
+
+
+ "__builtin_sinl": float -> float
+
+
+ "__builtin_sinh": float -> float
+
+
+ "__builtin_sinhf": float -> float
+
+
+ "__builtin_sinhl": float -> float
+
+
+ "__builtin_sqrt": float -> float
+
+
+ "__builtin_sqrtf": float -> float
+
+
+ "__builtin_sqrtl": float -> float
+
+
+ "__builtin_stpcpy": int -> int -> int
+
+
+ "__builtin_strchr": int -> int -> int
+
+
+ "__builtin_strcmp": int -> int -> int
+
+
+ "__builtin_strcpy": int -> int -> int
+
+
+ "__builtin_strcspn": int -> int -> int
+
+
+ "__builtin_strncat": int -> int -> int -> int
+
+
+ "__builtin_strncmp": int -> int -> int -> int
+
+
+ "__builtin_strncpy": int -> int -> int -> int
+
+
+ "__builtin_strspn": int -> int -> int
+
+
+ "__builtin_strpbrk": int -> int -> int
+
+
+ "__builtin_types_compatible_p": int -> int -> int
+
+
+ "__builtin_tan": float -> float
+
+
+ "__builtin_tanf": float -> float
+
+
+ "__builtin_tanl": float -> float
+
+
+ "__builtin_tanh": float -> float
+
+
+ "__builtin_tanhf": float -> float
+
+
+ "__builtin_tanhl": float -> float
+
+
+ "__builtin_va_end": int -> void
+
+
+ "__builtin_varargs_start": int -> void
+
+
+ "__builtin_va_start": int -> int -> void
+
+
+ "__builtin_stdarg_start": int -> void
+
+
+ "__builtin_va_arg": int -> int -> void
+
+
+ "__builtin_va_copy": int -> int -> void
+
+
+ "array_ecriture"(%0, %1, %2): int -> int -> int -> int
+ locals: %3, %4, %5, %6, %7, %8, %9
+ result: %3
+ stacksize: 0
+ entry: array_ecriture12
+ exit: array_ecriture0
+
+ array_ecriture9: mul %8, %1, %9 --> array_ecriture8
+ array_ecriture8: store int32, add, %0, %8, %7 --> array_ecriture7
+ array_ecriture7: emit c1 --> array_ecriture6
+ array_ecriture6: imm_int 5, %4, --> array_ecriture5
+ array_ecriture5: imm_int 4, %6, --> array_ecriture4
+ array_ecriture4: mul %5, %2, %6 --> array_ecriture3
+ array_ecriture3: store int32, add, %0, %5, %4 --> array_ecriture2
+ array_ecriture2: emit c0 --> array_ecriture1
+ array_ecriture12: emit c2 --> array_ecriture11
+ array_ecriture11: imm_int 1, %7, --> array_ecriture10
+ array_ecriture10: imm_int 4, %9, --> array_ecriture9
+ array_ecriture1: imm_int 0, %3, --> array_ecriture0
+ array_ecriture0: return %3
+
+
+ "main"(): int
+ locals: %1, %0, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12
+ result: %1
+ stacksize: 0
+ entry: main20
+ exit: main0
+
+ main9: imm_addr "t", %5, --> main8
+ main8: imm_int 0, %6, --> main7
+ main7: imm_int 1, %7, --> main6
+ main6: call "array_ecriture", %5, %6, %7, %0: int -> int -> int -> int --> main5
+ main5: emit c3 --> main4
+ main4: imm_int 1, %3, --> main3
+ main3: imm_int 4, %4, --> main2
+ main20: imm_int 0, %12, --> main19
+ main2: mul %2, %3, %4 --> main1
+ main19: store int32, 0("t"), , %12 --> main18
+ main18: imm_int 0, %11, --> main17
+ main17: store int32, 4("t"), , %11 --> main16
+ main16: imm_int 0, %10, --> main15
+ main15: store int32, 8("t"), , %10 --> main14
+ main14: imm_int 0, %9, --> main13
+ main13: store int32, 12("t"), , %9 --> main12
+ main12: imm_int 0, %8, --> main11
+ main11: store int32, 16("t"), , %8 --> main10
+ main10: emit c4 --> main9
+ main1: load int32, add, 0("t"), %2, %1 --> main0
+ main0: return %1
+
+
--- /dev/null
+int t[5] = {0,0,0,0,0};\r
+\r
+int array_ecriture (int tabecr[], int i, int j) {\r
+\r
+ tabecr[i] = 1;\r
+ tabecr[j] = 5;\r
+\r
+ return 0;\r
+}\r
+\r
+int main(){\r
+ int a = array_ecriture(t,0,1);\r
+ return t[1];\r
+}\r
--- /dev/null
+int t[5] = {0,0,0,0,0};\r
+\r
+int array_ecriture (int tabecr[], int i, int j) {\r
+\r
+ tabecr[i] = 1;\r
+ tabecr[j] = 5;\r
+\r
+ return 0;\r
+}\r
+\r
+int main(){\r
+ int a = array_ecriture(t,0,1);\r
+ return t[1];\r
+}\r
--- /dev/null
+Global Error (Translation RTLabs -> RTL):
+ Load mode not supported.
--- /dev/null
+# extern __builtin_varargs_start: int -> void
+# extern __builtin_va_start: int -> int -> void
+# extern __builtin_va_end: int -> void
+# extern __builtin_va_copy: int -> int -> void
+# extern __builtin_va_arg: int -> int -> void
+# extern __builtin_types_compatible_p: int -> int -> int
+# extern __builtin_tanl: float -> float
+# extern __builtin_tanhl: float -> float
+# extern __builtin_tanhf: float -> float
+# extern __builtin_tanh: float -> float
+# extern __builtin_tanf: float -> float
+# extern __builtin_tan: float -> float
+# extern __builtin_strspn: int -> int -> int
+# extern __builtin_strpbrk: int -> int -> int
+# extern __builtin_strncpy: int -> int -> int -> int
+# extern __builtin_strncmp: int -> int -> int -> int
+# extern __builtin_strncat: int -> int -> int -> int
+# extern __builtin_strcspn: int -> int -> int
+# extern __builtin_strcpy: int -> int -> int
+# extern __builtin_strcmp: int -> int -> int
+# extern __builtin_strchr: int -> int -> int
+# extern __builtin_stpcpy: int -> int -> int
+# extern __builtin_stdarg_start: int -> void
+# extern __builtin_sqrtl: float -> float
+# extern __builtin_sqrtf: float -> float
+# extern __builtin_sqrt: float -> float
+# extern __builtin_sinl: float -> float
+# extern __builtin_sinhl: float -> float
+# extern __builtin_sinhf: float -> float
+# extern __builtin_sinh: float -> float
+# extern __builtin_sinf: float -> float
+# extern __builtin_sin: float -> float
+# extern __builtin_return_address: int -> int
+# extern __builtin_return: int -> void
+# extern __builtin_powil: float -> int -> float
+# extern __builtin_powif: float -> int -> float
+# extern __builtin_powi: float -> int -> float
+# extern __builtin_popcountll: int -> int
+# extern __builtin_popcountl: int -> int
+# extern __builtin_popcount: int -> int
+# extern __builtin_parityll: int -> int
+# extern __builtin_parityl: int -> int
+# extern __builtin_parity: int -> int
+# extern __builtin_object_size: int -> int -> int
+# extern __builtin_next_arg: int
+# extern __builtin_nansl: int -> float
+# extern __builtin_nansf: int -> float
+# extern __builtin_nans: int -> float
+# extern __builtin_nanl: int -> float
+# extern __builtin_nanf: int -> float
+# extern __builtin_nan: int -> float
+# extern __builtin_modfl: float -> int -> float
+# extern __builtin_modff: float -> int -> float
+# extern __builtin_mempcpy: int -> int -> int -> int
+# extern __builtin_memcpy: int -> int -> int -> int
+# extern __builtin_logl: float -> float
+# extern __builtin_logf: float -> float
+# extern __builtin_log10l: float -> float
+# extern __builtin_log10f: float -> float
+# extern __builtin_log10: float -> float
+# extern __builtin_log: float -> float
+# extern __builtin_ldexpl: float -> int -> float
+# extern __builtin_ldexpf: float -> int -> float
+# extern __builtin_ldexp: float -> int -> float
+# extern __builtin_infl: float
+# extern __builtin_inff: float
+# extern __builtin_inf: float
+# extern __builtin_huge_vall: float
+# extern __builtin_huge_valf: float
+# extern __builtin_huge_val: float
+# extern __builtin_frexpl: float -> int -> float
+# extern __builtin_frexpf: float -> int -> float
+# extern __builtin_frexp: float -> int -> float
+# extern __builtin_frame_address: int -> int
+# extern __builtin_fmodl: float -> float
+# extern __builtin_fmodf: float -> float
+# extern __builtin_fmod: float -> float
+# extern __builtin_floorl: float -> float
+# extern __builtin_floorf: float -> float
+# extern __builtin_floor: float -> float
+# extern __builtin_ffsll: int -> int
+# extern __builtin_ffsl: int -> int
+# extern __builtin_ffs: int -> int
+# extern __builtin_fabsl: float -> float
+# extern __builtin_fabsf: float -> float
+# extern __builtin_fabs: float -> float
+# extern __builtin_expl: float -> float
+# extern __builtin_expf: float -> float
+# extern __builtin_expect: int -> int -> int
+# extern __builtin_exp: float -> float
+# extern __builtin_ctzll: int -> int
+# extern __builtin_ctzl: int -> int
+# extern __builtin_ctz: int -> int
+# extern __builtin_cosl: float -> float
+# extern __builtin_coshl: float -> float
+# extern __builtin_coshf: float -> float
+# extern __builtin_cosh: float -> float
+# extern __builtin_cosf: float -> float
+# extern __builtin_cos: float -> float
+# extern __builtin_constant_p: int -> int
+# extern __builtin_clzll: int -> int
+# extern __builtin_clzl: int -> int
+# extern __builtin_clz: int -> int
+# extern __builtin_ceill: float -> float
+# extern __builtin_ceilf: float -> float
+# extern __builtin_ceil: float -> float
+# extern __builtin_atanl: float -> float
+# extern __builtin_atanf: float -> float
+# extern __builtin_atan2l: float -> float -> float
+# extern __builtin_atan2f: float -> float -> float
+# extern __builtin_atan2: float -> float -> float
+# extern __builtin_atan: float -> float
+# extern __builtin_asinl: float -> float
+# extern __builtin_asinf: float -> float
+# extern __builtin_asin: float -> float
+# extern __builtin_alloca: int -> int
+# extern __builtin_acosl: float -> float
+# extern __builtin_acosf: float -> float
+# extern __builtin_acos: float -> float
+# extern __builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+# extern __builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+# extern __builtin___vprintf_chk: int -> int -> int -> int
+# extern __builtin___vfprintf_chk: int -> int -> int -> int -> int
+# extern __builtin___strncpy_chk: int -> int -> int -> int -> int
+# extern __builtin___strncat_chk: int -> int -> int -> int -> int
+# extern __builtin___strcpy_chk: int -> int -> int -> int
+# extern __builtin___strcat_chk: int -> int -> int -> int
+# extern __builtin___stpcpy_chk: int -> int -> int -> int
+# extern __builtin___memset_chk: int -> int -> int -> int -> int
+# extern __builtin___mempcpy_chk: int -> int -> int -> int -> int
+# extern __builtin___memmove_chk: int -> int -> int -> int -> int
+# extern __builtin___memcpy_chk: int -> int -> int -> int -> int
+
+# begin preamble
+.data
+globals:
+.space 20
+nl:
+.asciiz "\n"
+.align 2
+.text
+main:
+la $gp, globals
+j main48
+print_int:
+li $v0, 1
+syscall
+jr $ra
+print_intln:
+li $v0, 1
+syscall
+la $a0, nl
+li $v0, 4
+syscall
+jr $ra
+scan_int:
+li $v0, 5
+syscall
+jr $ra
+alloc:
+li $v0, 9
+syscall
+jr $ra
+
+pow2:
+li $v0, 1
+sllv $v0, $v0, $a0
+jr $ra
+
+mod:
+beqz $a0, mod0
+beqz $a1, mod0
+li $t2, 0
+mod_t0:
+bgtz $a0, mod_a0_pos
+neg $t0, $a0
+addi $t2, $t2, 1
+j mod_t1
+mod_a0_pos:
+move $t0, $a0
+mod_t1:
+bgtz $a1, mod_a1_pos
+neg $t1, $a1
+addi $t2, $t2, 2
+j mod_main
+mod_a1_pos:
+move $t1, $a1
+mod_main:
+rem $v0, $t0, $t1
+beqz $t2, mod_exit
+addi $t2, -1
+beqz $t2, mod_case1
+addi $t2, -1
+beqz $t2, mod_case2
+neg $v0, $v0
+j mod_exit
+mod_case1:
+sub $v0, $a1, $v0
+j mod_exit
+mod_case2:
+add $v0, $a1, $v0
+j mod_exit
+mod0:
+li $v0, 0
+mod_exit:
+jr $ra
+
+toint:
+# $a0: size
+# $a1: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+jal pow2
+move $a0, $a1
+move $a1, $v0
+jal mod
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 8
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 16
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+sign_ext:
+# $a0: size
+# $a1: int to extend
+li $v0, 32
+sub $a0, $v0, $a0
+sllv $v0, $a1, $a0
+srav $v0, $v0, $a0
+jr $ra
+
+ofint:
+# $a0: signedness
+# $a1: size
+# $a2: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+beqz $a0, ofint_unsigned
+move $a0, $a1
+move $a1, $a2
+jal sign_ext
+j ofint_exit
+ofint_unsigned:
+move $v0, $a2
+ofint_exit:
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+# end preamble
+
+
+# begin array_lecture
+array_lecture33:
+c2:
+li $v0, 4
+mulo $v0, $a1, $v0
+add $v0, $a0, $v0
+lw $a1, 0($v0)
+c1:
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+lw $v0, 0($v0)
+c0:
+add $v0, $a1, $v0
+jr $ra
+# end array_lecture
+
+
+# begin _main
+main48:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+li $a0, 1
+move $v0, $gp
+sw $a0, 0($v0)
+li $a0, 2
+move $v0, $gp
+sw $a0, 4($v0)
+li $a0, 3
+move $v0, $gp
+sw $a0, 8($v0)
+li $a0, 5
+move $v0, $gp
+sw $a0, 12($v0)
+li $a0, 8
+move $v0, $gp
+sw $a0, 16($v0)
+c4:
+move $a0, $gp
+li $a1, 0
+li $a2, 4
+la $v0, array_lecture33
+jalr $v0
+c3:
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+# end _main
--- /dev/null
+int t[5] = { 1, 2, 3, 5, 8, };
+
+extern void *__builtin___memcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memmove_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___mempcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memset_chk(void *, int, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___stpcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcat_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strncat_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___strncpy_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern int __builtin___vfprintf_chk(void *, int, unsigned char *, void *);
+
+extern int __builtin___vprintf_chk(int, unsigned char *, void *);
+
+extern int __builtin___vsnprintf_chk(unsigned char *, unsigned int, int, unsigned int, unsigned char *, void *);
+
+extern int __builtin___vsprintf_chk(unsigned char *, int, unsigned int, unsigned char *, void *);
+
+extern double __builtin_acos(double);
+
+extern float __builtin_acosf(float);
+
+extern double __builtin_acosl(double);
+
+extern void *__builtin_alloca(unsigned int);
+
+extern double __builtin_asin(double);
+
+extern float __builtin_asinf(float);
+
+extern double __builtin_asinl(double);
+
+extern double __builtin_atan(double);
+
+extern float __builtin_atanf(float);
+
+extern double __builtin_atanl(double);
+
+extern double __builtin_atan2(double, double);
+
+extern float __builtin_atan2f(float, float);
+
+extern double __builtin_atan2l(double, double);
+
+extern double __builtin_ceil(double);
+
+extern float __builtin_ceilf(float);
+
+extern double __builtin_ceill(double);
+
+extern double __builtin_cos(double);
+
+extern float __builtin_cosf(float);
+
+extern double __builtin_cosl(double);
+
+extern double __builtin_cosh(double);
+
+extern float __builtin_coshf(float);
+
+extern double __builtin_coshl(double);
+
+extern int __builtin_clz(unsigned int);
+
+extern int __builtin_clzl(unsigned int);
+
+extern int __builtin_clzll(unsigned int);
+
+extern int __builtin_constant_p(int);
+
+extern int __builtin_ctz(unsigned int);
+
+extern int __builtin_ctzl(unsigned int);
+
+extern int __builtin_ctzll(unsigned int);
+
+extern double __builtin_exp(double);
+
+extern float __builtin_expf(float);
+
+extern double __builtin_expl(double);
+
+extern int __builtin_expect(int, int);
+
+extern double __builtin_fabs(double);
+
+extern float __builtin_fabsf(float);
+
+extern double __builtin_fabsl(double);
+
+extern int __builtin_ffs(unsigned int);
+
+extern int __builtin_ffsl(unsigned int);
+
+extern int __builtin_ffsll(unsigned int);
+
+extern void *__builtin_frame_address(unsigned int);
+
+extern double __builtin_floor(double);
+
+extern float __builtin_floorf(float);
+
+extern double __builtin_floorl(double);
+
+extern double __builtin_huge_val(void);
+
+extern float __builtin_huge_valf(void);
+
+extern double __builtin_huge_vall(void);
+
+extern double __builtin_inf(void);
+
+extern float __builtin_inff(void);
+
+extern double __builtin_infl(void);
+
+extern void *__builtin_memcpy(void *, void *, unsigned int);
+
+extern void *__builtin_mempcpy(void *, void *, unsigned int);
+
+extern double __builtin_fmod(double);
+
+extern float __builtin_fmodf(float);
+
+extern double __builtin_fmodl(double);
+
+extern double __builtin_frexp(double, int *);
+
+extern float __builtin_frexpf(float, int *);
+
+extern double __builtin_frexpl(double, int *);
+
+extern double __builtin_ldexp(double, int);
+
+extern float __builtin_ldexpf(float, int);
+
+extern double __builtin_ldexpl(double, int);
+
+extern double __builtin_log(double);
+
+extern float __builtin_logf(float);
+
+extern double __builtin_logl(double);
+
+extern double __builtin_log10(double);
+
+extern float __builtin_log10f(float);
+
+extern double __builtin_log10l(double);
+
+extern float __builtin_modff(float, float *);
+
+extern double __builtin_modfl(double, double *);
+
+extern double __builtin_nan(unsigned char *);
+
+extern float __builtin_nanf(unsigned char *);
+
+extern double __builtin_nanl(unsigned char *);
+
+extern double __builtin_nans(unsigned char *);
+
+extern float __builtin_nansf(unsigned char *);
+
+extern double __builtin_nansl(unsigned char *);
+
+extern void *__builtin_next_arg(void);
+
+extern unsigned int __builtin_object_size(void *, int);
+
+extern int __builtin_parity(unsigned int);
+
+extern int __builtin_parityl(unsigned int);
+
+extern int __builtin_parityll(unsigned int);
+
+extern int __builtin_popcount(unsigned int);
+
+extern int __builtin_popcountl(unsigned int);
+
+extern int __builtin_popcountll(unsigned int);
+
+extern double __builtin_powi(double, int);
+
+extern float __builtin_powif(float, int);
+
+extern double __builtin_powil(double, int);
+
+extern void __builtin_return(void *);
+
+extern void *__builtin_return_address(unsigned int);
+
+extern double __builtin_sin(double);
+
+extern float __builtin_sinf(float);
+
+extern double __builtin_sinl(double);
+
+extern double __builtin_sinh(double);
+
+extern float __builtin_sinhf(float);
+
+extern double __builtin_sinhl(double);
+
+extern double __builtin_sqrt(double);
+
+extern float __builtin_sqrtf(float);
+
+extern double __builtin_sqrtl(double);
+
+extern unsigned char *__builtin_stpcpy(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strchr(unsigned char *, unsigned char);
+
+extern int __builtin_strcmp(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strcpy(unsigned char *, unsigned char *);
+
+extern unsigned int __builtin_strcspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strncat(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strncmp(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin_strncpy(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strpbrk(unsigned char *, unsigned char *);
+
+extern int __builtin_types_compatible_p(unsigned int, unsigned int);
+
+extern double __builtin_tan(double);
+
+extern float __builtin_tanf(float);
+
+extern double __builtin_tanl(double);
+
+extern double __builtin_tanh(double);
+
+extern float __builtin_tanhf(float);
+
+extern double __builtin_tanhl(double);
+
+extern void __builtin_va_end(void *);
+
+extern void __builtin_varargs_start(void *);
+
+extern void __builtin_va_start(void *, void *);
+
+extern void __builtin_stdarg_start(void *);
+
+extern void __builtin_va_arg(void *, unsigned int);
+
+extern void __builtin_va_copy(void *, void *);
+
+int array_lecture(int *tablec, int i, int j)
+{
+ int a;
+ int b;
+ c2:
+ a = tablec[i];
+ c1:
+ b = tablec[j];
+ c0:
+ return a + b;
+}
+
+int main(void)
+{
+ int t__1;
+ c4:
+ t__1 = array_lecture(t, 0, 4);
+ c3:
+ return t__1;
+}
+
+
--- /dev/null
+
+var "t" {1, 2, 3, 5, 8}
+
+
+extern "__builtin___memcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memmove_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___mempcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memset_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___stpcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcat_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strncat_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___strncpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vfprintf_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vprintf_chk" : int -> int -> int -> int
+
+
+extern "__builtin___vsnprintf_chk" : int -> int -> int -> int -> int -> int -> int
+
+
+extern "__builtin___vsprintf_chk" : int -> int -> int -> int -> int -> int
+
+
+extern "__builtin_acos" : float -> float
+
+
+extern "__builtin_acosf" : float -> float
+
+
+extern "__builtin_acosl" : float -> float
+
+
+extern "__builtin_alloca" : int -> int
+
+
+extern "__builtin_asin" : float -> float
+
+
+extern "__builtin_asinf" : float -> float
+
+
+extern "__builtin_asinl" : float -> float
+
+
+extern "__builtin_atan" : float -> float
+
+
+extern "__builtin_atanf" : float -> float
+
+
+extern "__builtin_atanl" : float -> float
+
+
+extern "__builtin_atan2" : float -> float -> float
+
+
+extern "__builtin_atan2f" : float -> float -> float
+
+
+extern "__builtin_atan2l" : float -> float -> float
+
+
+extern "__builtin_ceil" : float -> float
+
+
+extern "__builtin_ceilf" : float -> float
+
+
+extern "__builtin_ceill" : float -> float
+
+
+extern "__builtin_cos" : float -> float
+
+
+extern "__builtin_cosf" : float -> float
+
+
+extern "__builtin_cosl" : float -> float
+
+
+extern "__builtin_cosh" : float -> float
+
+
+extern "__builtin_coshf" : float -> float
+
+
+extern "__builtin_coshl" : float -> float
+
+
+extern "__builtin_clz" : int -> int
+
+
+extern "__builtin_clzl" : int -> int
+
+
+extern "__builtin_clzll" : int -> int
+
+
+extern "__builtin_constant_p" : int -> int
+
+
+extern "__builtin_ctz" : int -> int
+
+
+extern "__builtin_ctzl" : int -> int
+
+
+extern "__builtin_ctzll" : int -> int
+
+
+extern "__builtin_exp" : float -> float
+
+
+extern "__builtin_expf" : float -> float
+
+
+extern "__builtin_expl" : float -> float
+
+
+extern "__builtin_expect" : int -> int -> int
+
+
+extern "__builtin_fabs" : float -> float
+
+
+extern "__builtin_fabsf" : float -> float
+
+
+extern "__builtin_fabsl" : float -> float
+
+
+extern "__builtin_ffs" : int -> int
+
+
+extern "__builtin_ffsl" : int -> int
+
+
+extern "__builtin_ffsll" : int -> int
+
+
+extern "__builtin_frame_address" : int -> int
+
+
+extern "__builtin_floor" : float -> float
+
+
+extern "__builtin_floorf" : float -> float
+
+
+extern "__builtin_floorl" : float -> float
+
+
+extern "__builtin_huge_val" : float
+
+
+extern "__builtin_huge_valf" : float
+
+
+extern "__builtin_huge_vall" : float
+
+
+extern "__builtin_inf" : float
+
+
+extern "__builtin_inff" : float
+
+
+extern "__builtin_infl" : float
+
+
+extern "__builtin_memcpy" : int -> int -> int -> int
+
+
+extern "__builtin_mempcpy" : int -> int -> int -> int
+
+
+extern "__builtin_fmod" : float -> float
+
+
+extern "__builtin_fmodf" : float -> float
+
+
+extern "__builtin_fmodl" : float -> float
+
+
+extern "__builtin_frexp" : float -> int -> float
+
+
+extern "__builtin_frexpf" : float -> int -> float
+
+
+extern "__builtin_frexpl" : float -> int -> float
+
+
+extern "__builtin_ldexp" : float -> int -> float
+
+
+extern "__builtin_ldexpf" : float -> int -> float
+
+
+extern "__builtin_ldexpl" : float -> int -> float
+
+
+extern "__builtin_log" : float -> float
+
+
+extern "__builtin_logf" : float -> float
+
+
+extern "__builtin_logl" : float -> float
+
+
+extern "__builtin_log10" : float -> float
+
+
+extern "__builtin_log10f" : float -> float
+
+
+extern "__builtin_log10l" : float -> float
+
+
+extern "__builtin_modff" : float -> int -> float
+
+
+extern "__builtin_modfl" : float -> int -> float
+
+
+extern "__builtin_nan" : int -> float
+
+
+extern "__builtin_nanf" : int -> float
+
+
+extern "__builtin_nanl" : int -> float
+
+
+extern "__builtin_nans" : int -> float
+
+
+extern "__builtin_nansf" : int -> float
+
+
+extern "__builtin_nansl" : int -> float
+
+
+extern "__builtin_next_arg" : int
+
+
+extern "__builtin_object_size" : int -> int -> int
+
+
+extern "__builtin_parity" : int -> int
+
+
+extern "__builtin_parityl" : int -> int
+
+
+extern "__builtin_parityll" : int -> int
+
+
+extern "__builtin_popcount" : int -> int
+
+
+extern "__builtin_popcountl" : int -> int
+
+
+extern "__builtin_popcountll" : int -> int
+
+
+extern "__builtin_powi" : float -> int -> float
+
+
+extern "__builtin_powif" : float -> int -> float
+
+
+extern "__builtin_powil" : float -> int -> float
+
+
+extern "__builtin_return" : int -> void
+
+
+extern "__builtin_return_address" : int -> int
+
+
+extern "__builtin_sin" : float -> float
+
+
+extern "__builtin_sinf" : float -> float
+
+
+extern "__builtin_sinl" : float -> float
+
+
+extern "__builtin_sinh" : float -> float
+
+
+extern "__builtin_sinhf" : float -> float
+
+
+extern "__builtin_sinhl" : float -> float
+
+
+extern "__builtin_sqrt" : float -> float
+
+
+extern "__builtin_sqrtf" : float -> float
+
+
+extern "__builtin_sqrtl" : float -> float
+
+
+extern "__builtin_stpcpy" : int -> int -> int
+
+
+extern "__builtin_strchr" : int -> int -> int
+
+
+extern "__builtin_strcmp" : int -> int -> int
+
+
+extern "__builtin_strcpy" : int -> int -> int
+
+
+extern "__builtin_strcspn" : int -> int -> int
+
+
+extern "__builtin_strncat" : int -> int -> int -> int
+
+
+extern "__builtin_strncmp" : int -> int -> int -> int
+
+
+extern "__builtin_strncpy" : int -> int -> int -> int
+
+
+extern "__builtin_strspn" : int -> int -> int
+
+
+extern "__builtin_strpbrk" : int -> int -> int
+
+
+extern "__builtin_types_compatible_p" : int -> int -> int
+
+
+extern "__builtin_tan" : float -> float
+
+
+extern "__builtin_tanf" : float -> float
+
+
+extern "__builtin_tanl" : float -> float
+
+
+extern "__builtin_tanh" : float -> float
+
+
+extern "__builtin_tanhf" : float -> float
+
+
+extern "__builtin_tanhl" : float -> float
+
+
+extern "__builtin_va_end" : int -> void
+
+
+extern "__builtin_varargs_start" : int -> void
+
+
+extern "__builtin_va_start" : int -> int -> void
+
+
+extern "__builtin_stdarg_start" : int -> void
+
+
+extern "__builtin_va_arg" : int -> int -> void
+
+
+extern "__builtin_va_copy" : int -> int -> void
+
+
+"array_lecture" (tablec, i, j) : int -> int -> int -> int {
+
+ stack 0;
+
+ var b, a;
+
+ c2:
+ a = int32[tablec + (i * 4)];
+ c1:
+ b = int32[tablec + (j * 4)];
+ c0:
+ return a + b;
+
+}
+
+
+"main" () : int {
+
+ stack 0;
+
+ var t__1;
+
+ c4:
+ t__1 = "array_lecture"("t", 0, 4) : int -> int -> int -> int;
+ c3:
+ return t__1;
+
+}
+
+
--- /dev/null
+program
+
+globals 20
+
+procedure array_lecture(3)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20
+entry array_lecture33
+array_lecture33: newframe --> array_lecture32
+array_lecture32: move %20, $ra --> array_lecture31
+array_lecture31: move %19, $s7 --> array_lecture30
+array_lecture30: move %18, $s6 --> array_lecture29
+array_lecture29: move %17, $s5 --> array_lecture28
+array_lecture28: move %16, $s4 --> array_lecture27
+array_lecture27: move %15, $s3 --> array_lecture26
+array_lecture26: move %14, $s2 --> array_lecture25
+array_lecture25: move %13, $s1 --> array_lecture24
+array_lecture24: move %12, $s0 --> array_lecture23
+array_lecture23: move %0, $a0 --> array_lecture22
+array_lecture22: move %1, $a1 --> array_lecture21
+array_lecture21: move %2, $a2 --> array_lecture20
+array_lecture20: li %3, 0 --> array_lecture19
+array_lecture19: li %4, 0 --> array_lecture18
+array_lecture18: li %6, 0 --> array_lecture17
+array_lecture17: li %7, 0 --> array_lecture16
+array_lecture16: li %8, 0 --> array_lecture15
+array_lecture15: li %9, 0 --> array_lecture14
+array_lecture14: li %10, 0 --> array_lecture13
+array_lecture13: li %11, 0 --> array_lecture10
+array_lecture10: emit c2 --> array_lecture9
+array_lecture9 : li %9, 4 --> array_lecture8
+array_lecture8 : mulo %8, %1, %9 --> array_lecture7
+array_lecture7 : add %11, %0, %8 --> array_lecture12
+array_lecture12: lw %4, 0(%11) --> array_lecture6
+array_lecture6 : emit c1 --> array_lecture5
+array_lecture5 : li %7, 4 --> array_lecture4
+array_lecture4 : mulo %6, %2, %7 --> array_lecture3
+array_lecture3 : add %10, %0, %6 --> array_lecture11
+array_lecture11: lw %3, 0(%10) --> array_lecture2
+array_lecture2 : emit c0 --> array_lecture1
+array_lecture1 : add %5, %4, %3 --> array_lecture0
+array_lecture0 : j --> array_lecture45
+array_lecture45: move $v0, %5 --> array_lecture44
+array_lecture44: move $ra, %20 --> array_lecture43
+array_lecture43: move $s7, %19 --> array_lecture42
+array_lecture42: move $s6, %18 --> array_lecture41
+array_lecture41: move $s5, %17 --> array_lecture40
+array_lecture40: move $s4, %16 --> array_lecture39
+array_lecture39: move $s3, %15 --> array_lecture38
+array_lecture38: move $s2, %14 --> array_lecture37
+array_lecture37: move $s1, %13 --> array_lecture36
+array_lecture36: move $s0, %12 --> array_lecture35
+array_lecture35: delframe --> array_lecture34
+array_lecture34: jr $ra (xmits $v0)
+
+procedure _main(0)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24
+entry main48
+main48: newframe --> main47
+main47: move %24, $ra --> main46
+main46: move %23, $s7 --> main45
+main45: move %22, $s6 --> main44
+main44: move %21, $s5 --> main43
+main43: move %20, $s4 --> main42
+main42: move %19, $s3 --> main41
+main41: move %18, $s2 --> main40
+main40: move %17, $s1 --> main39
+main39: move %16, $s0 --> main38
+main38: li %0, 0 --> main37
+main37: li %2, 0 --> main36
+main36: li %3, 0 --> main35
+main35: li %4, 0 --> main34
+main34: li %5, 0 --> main33
+main33: li %6, 0 --> main32
+main32: li %7, 0 --> main31
+main31: li %8, 0 --> main30
+main30: li %9, 0 --> main29
+main29: li %10, 0 --> main28
+main28: li %11, 0 --> main27
+main27: li %12, 0 --> main26
+main26: li %13, 0 --> main25
+main25: li %14, 0 --> main24
+main24: li %15, 0 --> main17
+main17: li %9, 1 --> main16
+main16: move %13, $gp --> main64
+main64: move %13, %13 --> main21
+main21: sw %9, 0(%13) --> main15
+main15: li %8, 2 --> main14
+main14: move %12, $gp --> main63
+main63: move %12, %12 --> main20
+main20: sw %8, 4(%12) --> main13
+main13: li %7, 3 --> main12
+main12: move %11, $gp --> main62
+main62: move %11, %11 --> main19
+main19: sw %7, 8(%11) --> main11
+main11: li %6, 5 --> main10
+main10: move %10, $gp --> main61
+main61: move %10, %10 --> main18
+main18: sw %6, 12(%10) --> main9
+main9 : li %5, 8 --> main8
+main8 : move %15, $gp --> main71
+main71: move %15, %15 --> main23
+main23: sw %5, 16(%15) --> main7
+main7 : emit c4 --> main6
+main6 : move %2, $gp --> main70
+main70: move %2, %2 --> main5
+main5 : li %3, 0 --> main4
+main4 : li %4, 4 --> main3
+main3 : la %14, array_lecture --> main22
+main22: j --> main69
+main69: move $a0, %2 --> main68
+main68: move $a1, %3 --> main67
+main67: move $a2, %4 --> main66
+main66: call %14(3) --> main65
+main65: move %0, $v0 --> main2
+main2 : emit c3 --> main1
+main1 : move %1, %0 --> main0
+main0 : j --> main60
+main60: move $v0, %1 --> main59
+main59: move $ra, %24 --> main58
+main58: move $s7, %23 --> main57
+main57: move $s6, %22 --> main56
+main56: move $s5, %21 --> main55
+main55: move $s4, %20 --> main54
+main54: move $s3, %19 --> main53
+main53: move $s2, %18 --> main52
+main52: move $s1, %17 --> main51
+main51: move $s0, %16 --> main50
+main50: delframe --> main49
+main49: jr $ra (xmits $v0)
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 20
+
+procedure array_lecture(3)
+var 0
+array_lecture33:
+newframe
+c2:
+li $v0, 4
+mulo $v0, $a1, $v0
+add $v0, $a0, $v0
+lw $a1, 0($v0)
+c1:
+li $v0, 4
+mulo $v0, $a2, $v0
+add $v0, $a0, $v0
+lw $v0, 0($v0)
+c0:
+add $v0, $a1, $v0
+delframe
+jr $ra
+
+procedure _main(0)
+var 4
+main48:
+newframe
+sw $ra, 0($sp)
+li $a0, 1
+move $v0, $gp
+sw $a0, 0($v0)
+li $a0, 2
+move $v0, $gp
+sw $a0, 4($v0)
+li $a0, 3
+move $v0, $gp
+sw $a0, 8($v0)
+li $a0, 5
+move $v0, $gp
+sw $a0, 12($v0)
+li $a0, 8
+move $v0, $gp
+sw $a0, 16($v0)
+c4:
+move $a0, $gp
+li $a1, 0
+li $a2, 4
+la $v0, array_lecture
+call $v0
+c3:
+lw $ra, 0($sp)
+delframe
+jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 20
+
+procedure array_lecture(3)
+var 0
+entry array_lecture33
+array_lecture33: newframe --> array_lecture32
+array_lecture32: j --> array_lecture31
+array_lecture31: j --> array_lecture30
+array_lecture30: j --> array_lecture29
+array_lecture29: j --> array_lecture28
+array_lecture28: j --> array_lecture27
+array_lecture27: j --> array_lecture26
+array_lecture26: j --> array_lecture25
+array_lecture25: j --> array_lecture24
+array_lecture24: j --> array_lecture23
+array_lecture23: j --> array_lecture22
+array_lecture22: j --> array_lecture21
+array_lecture21: j --> array_lecture20
+array_lecture20: j --> array_lecture19
+array_lecture19: j --> array_lecture18
+array_lecture18: j --> array_lecture17
+array_lecture17: j --> array_lecture16
+array_lecture16: j --> array_lecture15
+array_lecture15: j --> array_lecture14
+array_lecture14: j --> array_lecture13
+array_lecture13: j --> array_lecture10
+array_lecture10: emit c2 --> array_lecture9
+array_lecture9 : li $v0, 4 --> array_lecture8
+array_lecture8 : mulo $v0, $a1, $v0 --> array_lecture7
+array_lecture7 : add $v0, $a0, $v0 --> array_lecture12
+array_lecture12: lw $a1, 0($v0) --> array_lecture6
+array_lecture6 : emit c1 --> array_lecture5
+array_lecture5 : li $v0, 4 --> array_lecture4
+array_lecture4 : mulo $v0, $a2, $v0 --> array_lecture3
+array_lecture3 : add $v0, $a0, $v0 --> array_lecture11
+array_lecture11: lw $v0, 0($v0) --> array_lecture2
+array_lecture2 : emit c0 --> array_lecture1
+array_lecture1 : add $v0, $a1, $v0 --> array_lecture0
+array_lecture0 : j --> array_lecture45
+array_lecture45: j --> array_lecture44
+array_lecture44: j --> array_lecture43
+array_lecture43: j --> array_lecture42
+array_lecture42: j --> array_lecture41
+array_lecture41: j --> array_lecture40
+array_lecture40: j --> array_lecture39
+array_lecture39: j --> array_lecture38
+array_lecture38: j --> array_lecture37
+array_lecture37: j --> array_lecture36
+array_lecture36: j --> array_lecture35
+array_lecture35: delframe --> array_lecture34
+array_lecture34: jr $ra
+
+procedure _main(0)
+var 4
+entry main48
+main48: newframe --> main47
+main47: lw $ra, 0($sp) --> main46
+main46: j --> main45
+main45: j --> main44
+main44: j --> main43
+main43: j --> main42
+main42: j --> main41
+main41: j --> main40
+main40: j --> main39
+main39: j --> main38
+main38: j --> main37
+main37: j --> main36
+main36: j --> main35
+main35: j --> main34
+main34: j --> main33
+main33: j --> main32
+main32: j --> main31
+main31: j --> main30
+main30: j --> main29
+main29: j --> main28
+main28: j --> main27
+main27: j --> main26
+main26: j --> main25
+main25: j --> main24
+main24: j --> main17
+main17: li $a0, 1 --> main16
+main16: move $v0, $gp --> main64
+main64: j --> main21
+main21: lw $a0, 0($v0) --> main15
+main15: li $a0, 2 --> main14
+main14: move $v0, $gp --> main63
+main63: j --> main20
+main20: lw $a0, 4($v0) --> main13
+main13: li $a0, 3 --> main12
+main12: move $v0, $gp --> main62
+main62: j --> main19
+main19: lw $a0, 8($v0) --> main11
+main11: li $a0, 5 --> main10
+main10: move $v0, $gp --> main61
+main61: j --> main18
+main18: lw $a0, 12($v0) --> main9
+main9 : li $a0, 8 --> main8
+main8 : move $v0, $gp --> main71
+main71: j --> main23
+main23: lw $a0, 16($v0) --> main7
+main7 : emit c4 --> main6
+main6 : move $a0, $gp --> main70
+main70: j --> main5
+main5 : li $a1, 0 --> main4
+main4 : li $a2, 4 --> main3
+main3 : la $v0, array_lecture --> main22
+main22: j --> main69
+main69: j --> main68
+main68: j --> main67
+main67: j --> main66
+main66: call $v0 --> main65
+main65: j --> main2
+main2 : emit c3 --> main1
+main1 : j --> main0
+main0 : j --> main60
+main60: j --> main59
+main59: lw $ra, 0($sp) --> main58
+main58: j --> main57
+main57: j --> main56
+main56: j --> main55
+main55: j --> main54
+main54: j --> main53
+main53: j --> main52
+main52: j --> main51
+main51: j --> main50
+main50: delframe --> main49
+main49: jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program
+
+globals 20
+
+function array_lecture(%0; %1; %2) : %5
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11
+entry array_lecture20
+array_lecture20: li %3, 0 --> array_lecture19
+array_lecture19: li %4, 0 --> array_lecture18
+array_lecture18: li %6, 0 --> array_lecture17
+array_lecture17: li %7, 0 --> array_lecture16
+array_lecture16: li %8, 0 --> array_lecture15
+array_lecture15: li %9, 0 --> array_lecture14
+array_lecture14: li %10, 0 --> array_lecture13
+array_lecture13: li %11, 0 --> array_lecture10
+array_lecture10: emit c2 --> array_lecture9
+array_lecture9 : li %9, 4 --> array_lecture8
+array_lecture8 : mulo %8, %1, %9 --> array_lecture7
+array_lecture7 : add %11, %0, %8 --> array_lecture12
+array_lecture12: lw %4, 0(%11) --> array_lecture6
+array_lecture6 : emit c1 --> array_lecture5
+array_lecture5 : li %7, 4 --> array_lecture4
+array_lecture4 : mulo %6, %2, %7 --> array_lecture3
+array_lecture3 : add %10, %0, %6 --> array_lecture11
+array_lecture11: lw %3, 0(%10) --> array_lecture2
+array_lecture2 : emit c0 --> array_lecture1
+array_lecture1 : add %5, %4, %3 --> array_lecture0
+array_lecture0 : return %5
+
+function _main() : %1
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15
+entry main38
+main38: li %0, 0 --> main37
+main37: li %2, 0 --> main36
+main36: li %3, 0 --> main35
+main35: li %4, 0 --> main34
+main34: li %5, 0 --> main33
+main33: li %6, 0 --> main32
+main32: li %7, 0 --> main31
+main31: li %8, 0 --> main30
+main30: li %9, 0 --> main29
+main29: li %10, 0 --> main28
+main28: li %11, 0 --> main27
+main27: li %12, 0 --> main26
+main26: li %13, 0 --> main25
+main25: li %14, 0 --> main24
+main24: li %15, 0 --> main17
+main17: li %9, 1 --> main16
+main16: addi %13, GLOBALS, 0 --> main21
+main21: sw %9, 0(%13) --> main15
+main15: li %8, 2 --> main14
+main14: addi %12, GLOBALS, 0 --> main20
+main20: sw %8, 4(%12) --> main13
+main13: li %7, 3 --> main12
+main12: addi %11, GLOBALS, 0 --> main19
+main19: sw %7, 8(%11) --> main11
+main11: li %6, 5 --> main10
+main10: addi %10, GLOBALS, 0 --> main18
+main18: sw %6, 12(%10) --> main9
+main9 : li %5, 8 --> main8
+main8 : addi %15, GLOBALS, 0 --> main23
+main23: sw %5, 16(%15) --> main7
+main7 : emit c4 --> main6
+main6 : addi %2, GLOBALS, 0 --> main5
+main5 : li %3, 0 --> main4
+main4 : li %4, 4 --> main3
+main3 : la %14, array_lecture --> main22
+main22: call %0, %14(%2, %3, %4) --> main2
+main2 : emit c3 --> main1
+main1 : move %1, %0 --> main0
+main0 : return %1
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
--- /dev/null
+program: (main function is "main")
+
+
+ globals:
+ "t" = {1, 2, 3, 5, 8}
+
+
+ "__builtin___memcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memmove_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___mempcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memset_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___stpcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strcat_chk": int -> int -> int -> int
+
+
+ "__builtin___strcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strncat_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___strncpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vfprintf_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vprintf_chk": int -> int -> int -> int
+
+
+ "__builtin___vsnprintf_chk": int -> int -> int -> int -> int -> int -> int
+
+
+ "__builtin___vsprintf_chk": int -> int -> int -> int -> int -> int
+
+
+ "__builtin_acos": float -> float
+
+
+ "__builtin_acosf": float -> float
+
+
+ "__builtin_acosl": float -> float
+
+
+ "__builtin_alloca": int -> int
+
+
+ "__builtin_asin": float -> float
+
+
+ "__builtin_asinf": float -> float
+
+
+ "__builtin_asinl": float -> float
+
+
+ "__builtin_atan": float -> float
+
+
+ "__builtin_atanf": float -> float
+
+
+ "__builtin_atanl": float -> float
+
+
+ "__builtin_atan2": float -> float -> float
+
+
+ "__builtin_atan2f": float -> float -> float
+
+
+ "__builtin_atan2l": float -> float -> float
+
+
+ "__builtin_ceil": float -> float
+
+
+ "__builtin_ceilf": float -> float
+
+
+ "__builtin_ceill": float -> float
+
+
+ "__builtin_cos": float -> float
+
+
+ "__builtin_cosf": float -> float
+
+
+ "__builtin_cosl": float -> float
+
+
+ "__builtin_cosh": float -> float
+
+
+ "__builtin_coshf": float -> float
+
+
+ "__builtin_coshl": float -> float
+
+
+ "__builtin_clz": int -> int
+
+
+ "__builtin_clzl": int -> int
+
+
+ "__builtin_clzll": int -> int
+
+
+ "__builtin_constant_p": int -> int
+
+
+ "__builtin_ctz": int -> int
+
+
+ "__builtin_ctzl": int -> int
+
+
+ "__builtin_ctzll": int -> int
+
+
+ "__builtin_exp": float -> float
+
+
+ "__builtin_expf": float -> float
+
+
+ "__builtin_expl": float -> float
+
+
+ "__builtin_expect": int -> int -> int
+
+
+ "__builtin_fabs": float -> float
+
+
+ "__builtin_fabsf": float -> float
+
+
+ "__builtin_fabsl": float -> float
+
+
+ "__builtin_ffs": int -> int
+
+
+ "__builtin_ffsl": int -> int
+
+
+ "__builtin_ffsll": int -> int
+
+
+ "__builtin_frame_address": int -> int
+
+
+ "__builtin_floor": float -> float
+
+
+ "__builtin_floorf": float -> float
+
+
+ "__builtin_floorl": float -> float
+
+
+ "__builtin_huge_val": float
+
+
+ "__builtin_huge_valf": float
+
+
+ "__builtin_huge_vall": float
+
+
+ "__builtin_inf": float
+
+
+ "__builtin_inff": float
+
+
+ "__builtin_infl": float
+
+
+ "__builtin_memcpy": int -> int -> int -> int
+
+
+ "__builtin_mempcpy": int -> int -> int -> int
+
+
+ "__builtin_fmod": float -> float
+
+
+ "__builtin_fmodf": float -> float
+
+
+ "__builtin_fmodl": float -> float
+
+
+ "__builtin_frexp": float -> int -> float
+
+
+ "__builtin_frexpf": float -> int -> float
+
+
+ "__builtin_frexpl": float -> int -> float
+
+
+ "__builtin_ldexp": float -> int -> float
+
+
+ "__builtin_ldexpf": float -> int -> float
+
+
+ "__builtin_ldexpl": float -> int -> float
+
+
+ "__builtin_log": float -> float
+
+
+ "__builtin_logf": float -> float
+
+
+ "__builtin_logl": float -> float
+
+
+ "__builtin_log10": float -> float
+
+
+ "__builtin_log10f": float -> float
+
+
+ "__builtin_log10l": float -> float
+
+
+ "__builtin_modff": float -> int -> float
+
+
+ "__builtin_modfl": float -> int -> float
+
+
+ "__builtin_nan": int -> float
+
+
+ "__builtin_nanf": int -> float
+
+
+ "__builtin_nanl": int -> float
+
+
+ "__builtin_nans": int -> float
+
+
+ "__builtin_nansf": int -> float
+
+
+ "__builtin_nansl": int -> float
+
+
+ "__builtin_next_arg": int
+
+
+ "__builtin_object_size": int -> int -> int
+
+
+ "__builtin_parity": int -> int
+
+
+ "__builtin_parityl": int -> int
+
+
+ "__builtin_parityll": int -> int
+
+
+ "__builtin_popcount": int -> int
+
+
+ "__builtin_popcountl": int -> int
+
+
+ "__builtin_popcountll": int -> int
+
+
+ "__builtin_powi": float -> int -> float
+
+
+ "__builtin_powif": float -> int -> float
+
+
+ "__builtin_powil": float -> int -> float
+
+
+ "__builtin_return": int -> void
+
+
+ "__builtin_return_address": int -> int
+
+
+ "__builtin_sin": float -> float
+
+
+ "__builtin_sinf": float -> float
+
+
+ "__builtin_sinl": float -> float
+
+
+ "__builtin_sinh": float -> float
+
+
+ "__builtin_sinhf": float -> float
+
+
+ "__builtin_sinhl": float -> float
+
+
+ "__builtin_sqrt": float -> float
+
+
+ "__builtin_sqrtf": float -> float
+
+
+ "__builtin_sqrtl": float -> float
+
+
+ "__builtin_stpcpy": int -> int -> int
+
+
+ "__builtin_strchr": int -> int -> int
+
+
+ "__builtin_strcmp": int -> int -> int
+
+
+ "__builtin_strcpy": int -> int -> int
+
+
+ "__builtin_strcspn": int -> int -> int
+
+
+ "__builtin_strncat": int -> int -> int -> int
+
+
+ "__builtin_strncmp": int -> int -> int -> int
+
+
+ "__builtin_strncpy": int -> int -> int -> int
+
+
+ "__builtin_strspn": int -> int -> int
+
+
+ "__builtin_strpbrk": int -> int -> int
+
+
+ "__builtin_types_compatible_p": int -> int -> int
+
+
+ "__builtin_tan": float -> float
+
+
+ "__builtin_tanf": float -> float
+
+
+ "__builtin_tanl": float -> float
+
+
+ "__builtin_tanh": float -> float
+
+
+ "__builtin_tanhf": float -> float
+
+
+ "__builtin_tanhl": float -> float
+
+
+ "__builtin_va_end": int -> void
+
+
+ "__builtin_varargs_start": int -> void
+
+
+ "__builtin_va_start": int -> int -> void
+
+
+ "__builtin_stdarg_start": int -> void
+
+
+ "__builtin_va_arg": int -> int -> void
+
+
+ "__builtin_va_copy": int -> int -> void
+
+
+ "array_lecture"(%0, %1, %2): int -> int -> int -> int
+ locals: %5, %3, %4, %6, %7, %8, %9
+ result: %5
+ stacksize: 0
+ entry: array_lecture10
+ exit: array_lecture0
+
+ array_lecture9: imm_int 4, %9, --> array_lecture8
+ array_lecture8: mul %8, %1, %9 --> array_lecture7
+ array_lecture7: load int32, add, %0, %8, %4 --> array_lecture6
+ array_lecture6: emit c1 --> array_lecture5
+ array_lecture5: imm_int 4, %7, --> array_lecture4
+ array_lecture4: mul %6, %2, %7 --> array_lecture3
+ array_lecture3: load int32, add, %0, %6, %3 --> array_lecture2
+ array_lecture2: emit c0 --> array_lecture1
+ array_lecture10: emit c2 --> array_lecture9
+ array_lecture1: add %5, %4, %3 --> array_lecture0
+ array_lecture0: return %5
+
+
+ "main"(): int
+ locals: %1, %0, %2, %3, %4, %5, %6, %7, %8, %9
+ result: %1
+ stacksize: 0
+ entry: main17
+ exit: main0
+
+ main9: imm_int 8, %5, --> main8
+ main8: store int32, 16("t"), , %5 --> main7
+ main7: emit c4 --> main6
+ main6: imm_addr "t", %2, --> main5
+ main5: imm_int 0, %3, --> main4
+ main4: imm_int 4, %4, --> main3
+ main3: call "array_lecture", %2, %3, %4, %0: int -> int -> int -> int --> main2
+ main2: emit c3 --> main1
+ main17: imm_int 1, %9, --> main16
+ main16: store int32, 0("t"), , %9 --> main15
+ main15: imm_int 2, %8, --> main14
+ main14: store int32, 4("t"), , %8 --> main13
+ main13: imm_int 3, %7, --> main12
+ main12: store int32, 8("t"), , %7 --> main11
+ main11: imm_int 5, %6, --> main10
+ main10: store int32, 12("t"), , %6 --> main9
+ main1: mov %1, %0 --> main0
+ main0: return %1
+
+
--- /dev/null
+int t[5] = {1,2,3,5,8};\r
+\r
+int array_lecture (int tablec[], int i, int j) {\r
+ int a, b;\r
+\r
+ a = tablec[i];\r
+ b = tablec[j];\r
+\r
+ return a+b;\r
+}\r
+\r
+int main(){\r
+ return array_lecture(t,0,4);\r
+}\r
--- /dev/null
+int t[5] = {1,2,3,5,8};\r
+\r
+int array_lecture (int tablec[], int i, int j) {\r
+ int a, b;\r
+\r
+ a = tablec[i];\r
+ b = tablec[j];\r
+\r
+ return a+b;\r
+}\r
+\r
+int main(){\r
+ return array_lecture(t,0,4);\r
+}\r
--- /dev/null
+Global Error (Translation RTLabs -> RTL):
+ Constant not supported.
--- /dev/null
+# extern __builtin_varargs_start: int -> void
+# extern __builtin_va_start: int -> int -> void
+# extern __builtin_va_end: int -> void
+# extern __builtin_va_copy: int -> int -> void
+# extern __builtin_va_arg: int -> int -> void
+# extern __builtin_types_compatible_p: int -> int -> int
+# extern __builtin_tanl: float -> float
+# extern __builtin_tanhl: float -> float
+# extern __builtin_tanhf: float -> float
+# extern __builtin_tanh: float -> float
+# extern __builtin_tanf: float -> float
+# extern __builtin_tan: float -> float
+# extern __builtin_strspn: int -> int -> int
+# extern __builtin_strpbrk: int -> int -> int
+# extern __builtin_strncpy: int -> int -> int -> int
+# extern __builtin_strncmp: int -> int -> int -> int
+# extern __builtin_strncat: int -> int -> int -> int
+# extern __builtin_strcspn: int -> int -> int
+# extern __builtin_strcpy: int -> int -> int
+# extern __builtin_strcmp: int -> int -> int
+# extern __builtin_strchr: int -> int -> int
+# extern __builtin_stpcpy: int -> int -> int
+# extern __builtin_stdarg_start: int -> void
+# extern __builtin_sqrtl: float -> float
+# extern __builtin_sqrtf: float -> float
+# extern __builtin_sqrt: float -> float
+# extern __builtin_sinl: float -> float
+# extern __builtin_sinhl: float -> float
+# extern __builtin_sinhf: float -> float
+# extern __builtin_sinh: float -> float
+# extern __builtin_sinf: float -> float
+# extern __builtin_sin: float -> float
+# extern __builtin_return_address: int -> int
+# extern __builtin_return: int -> void
+# extern __builtin_powil: float -> int -> float
+# extern __builtin_powif: float -> int -> float
+# extern __builtin_powi: float -> int -> float
+# extern __builtin_popcountll: int -> int
+# extern __builtin_popcountl: int -> int
+# extern __builtin_popcount: int -> int
+# extern __builtin_parityll: int -> int
+# extern __builtin_parityl: int -> int
+# extern __builtin_parity: int -> int
+# extern __builtin_object_size: int -> int -> int
+# extern __builtin_next_arg: int
+# extern __builtin_nansl: int -> float
+# extern __builtin_nansf: int -> float
+# extern __builtin_nans: int -> float
+# extern __builtin_nanl: int -> float
+# extern __builtin_nanf: int -> float
+# extern __builtin_nan: int -> float
+# extern __builtin_modfl: float -> int -> float
+# extern __builtin_modff: float -> int -> float
+# extern __builtin_mempcpy: int -> int -> int -> int
+# extern __builtin_memcpy: int -> int -> int -> int
+# extern __builtin_logl: float -> float
+# extern __builtin_logf: float -> float
+# extern __builtin_log10l: float -> float
+# extern __builtin_log10f: float -> float
+# extern __builtin_log10: float -> float
+# extern __builtin_log: float -> float
+# extern __builtin_ldexpl: float -> int -> float
+# extern __builtin_ldexpf: float -> int -> float
+# extern __builtin_ldexp: float -> int -> float
+# extern __builtin_infl: float
+# extern __builtin_inff: float
+# extern __builtin_inf: float
+# extern __builtin_huge_vall: float
+# extern __builtin_huge_valf: float
+# extern __builtin_huge_val: float
+# extern __builtin_frexpl: float -> int -> float
+# extern __builtin_frexpf: float -> int -> float
+# extern __builtin_frexp: float -> int -> float
+# extern __builtin_frame_address: int -> int
+# extern __builtin_fmodl: float -> float
+# extern __builtin_fmodf: float -> float
+# extern __builtin_fmod: float -> float
+# extern __builtin_floorl: float -> float
+# extern __builtin_floorf: float -> float
+# extern __builtin_floor: float -> float
+# extern __builtin_ffsll: int -> int
+# extern __builtin_ffsl: int -> int
+# extern __builtin_ffs: int -> int
+# extern __builtin_fabsl: float -> float
+# extern __builtin_fabsf: float -> float
+# extern __builtin_fabs: float -> float
+# extern __builtin_expl: float -> float
+# extern __builtin_expf: float -> float
+# extern __builtin_expect: int -> int -> int
+# extern __builtin_exp: float -> float
+# extern __builtin_ctzll: int -> int
+# extern __builtin_ctzl: int -> int
+# extern __builtin_ctz: int -> int
+# extern __builtin_cosl: float -> float
+# extern __builtin_coshl: float -> float
+# extern __builtin_coshf: float -> float
+# extern __builtin_cosh: float -> float
+# extern __builtin_cosf: float -> float
+# extern __builtin_cos: float -> float
+# extern __builtin_constant_p: int -> int
+# extern __builtin_clzll: int -> int
+# extern __builtin_clzl: int -> int
+# extern __builtin_clz: int -> int
+# extern __builtin_ceill: float -> float
+# extern __builtin_ceilf: float -> float
+# extern __builtin_ceil: float -> float
+# extern __builtin_atanl: float -> float
+# extern __builtin_atanf: float -> float
+# extern __builtin_atan2l: float -> float -> float
+# extern __builtin_atan2f: float -> float -> float
+# extern __builtin_atan2: float -> float -> float
+# extern __builtin_atan: float -> float
+# extern __builtin_asinl: float -> float
+# extern __builtin_asinf: float -> float
+# extern __builtin_asin: float -> float
+# extern __builtin_alloca: int -> int
+# extern __builtin_acosl: float -> float
+# extern __builtin_acosf: float -> float
+# extern __builtin_acos: float -> float
+# extern __builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+# extern __builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+# extern __builtin___vprintf_chk: int -> int -> int -> int
+# extern __builtin___vfprintf_chk: int -> int -> int -> int -> int
+# extern __builtin___strncpy_chk: int -> int -> int -> int -> int
+# extern __builtin___strncat_chk: int -> int -> int -> int -> int
+# extern __builtin___strcpy_chk: int -> int -> int -> int
+# extern __builtin___strcat_chk: int -> int -> int -> int
+# extern __builtin___stpcpy_chk: int -> int -> int -> int
+# extern __builtin___memset_chk: int -> int -> int -> int -> int
+# extern __builtin___mempcpy_chk: int -> int -> int -> int -> int
+# extern __builtin___memmove_chk: int -> int -> int -> int -> int
+# extern __builtin___memcpy_chk: int -> int -> int -> int -> int
+
+# begin preamble
+.data
+globals:
+.space 40
+nl:
+.asciiz "\n"
+.align 2
+.text
+main:
+la $gp, globals
+j main155
+print_int:
+li $v0, 1
+syscall
+jr $ra
+print_intln:
+li $v0, 1
+syscall
+la $a0, nl
+li $v0, 4
+syscall
+jr $ra
+scan_int:
+li $v0, 5
+syscall
+jr $ra
+alloc:
+li $v0, 9
+syscall
+jr $ra
+
+pow2:
+li $v0, 1
+sllv $v0, $v0, $a0
+jr $ra
+
+mod:
+beqz $a0, mod0
+beqz $a1, mod0
+li $t2, 0
+mod_t0:
+bgtz $a0, mod_a0_pos
+neg $t0, $a0
+addi $t2, $t2, 1
+j mod_t1
+mod_a0_pos:
+move $t0, $a0
+mod_t1:
+bgtz $a1, mod_a1_pos
+neg $t1, $a1
+addi $t2, $t2, 2
+j mod_main
+mod_a1_pos:
+move $t1, $a1
+mod_main:
+rem $v0, $t0, $t1
+beqz $t2, mod_exit
+addi $t2, -1
+beqz $t2, mod_case1
+addi $t2, -1
+beqz $t2, mod_case2
+neg $v0, $v0
+j mod_exit
+mod_case1:
+sub $v0, $a1, $v0
+j mod_exit
+mod_case2:
+add $v0, $a1, $v0
+j mod_exit
+mod0:
+li $v0, 0
+mod_exit:
+jr $ra
+
+toint:
+# $a0: size
+# $a1: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+jal pow2
+move $a0, $a1
+move $a1, $v0
+jal mod
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 8
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+toint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a1, $a0
+li $a0, 16
+jal toint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+sign_ext:
+# $a0: size
+# $a1: int to extend
+li $v0, 32
+sub $a0, $v0, $a0
+sllv $v0, $a1, $a0
+srav $v0, $v0, $a0
+jr $ra
+
+ofint:
+# $a0: signedness
+# $a1: size
+# $a2: int to convert
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+beqz $a0, ofint_unsigned
+move $a0, $a1
+move $a1, $a2
+jal sign_ext
+j ofint_exit
+ofint_unsigned:
+move $v0, $a2
+ofint_exit:
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint8:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 8
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 1
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+
+ofuint16:
+addi $sp, $sp, -4
+sw $ra, 0($sp)
+move $a2, $a0
+li $a1, 16
+li $a0, 0
+jal ofint
+lw $ra, 0($sp)
+addi $sp, $sp, 4
+jr $ra
+# end preamble
+
+
+# begin _main
+main155:
+addi $sp, $sp, -24
+sw $ra, 20($sp)
+li $a0, 1
+move $v0, $gp
+sw $a0, 0($v0)
+li $a0, 2
+move $v0, $gp
+sw $a0, 4($v0)
+li $a0, 3
+move $v0, $gp
+sw $a0, 8($v0)
+li $a0, 5
+move $v0, $gp
+sw $a0, 12($v0)
+li $a0, 8
+move $v0, $gp
+sw $a0, 16($v0)
+li $a0, 13
+move $v0, $gp
+sw $a0, 20($v0)
+li $a0, 21
+move $v0, $gp
+sw $a0, 24($v0)
+li $a0, 34
+move $v0, $gp
+sw $a0, 28($v0)
+li $a0, 55
+move $v0, $gp
+sw $a0, 32($v0)
+li $a0, 89
+move $v0, $gp
+sw $a0, 36($v0)
+c11:
+li $a1, 0
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c10:
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c9:
+move $a1, $sp
+li $a0, 2
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c8:
+move $a1, $sp
+li $a0, 3
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c7:
+move $a1, $sp
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c6:
+move $a0, $gp
+move $a1, $gp
+addi $a1, $a1, 20
+move $a2, $sp
+li $a3, 5
+la $v0, TB_Boucle59
+jalr $v0
+c5:
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $sp, $v0
+lw $v0, 0($v0)
+lw $ra, 20($sp)
+addi $sp, $sp, 24
+jr $ra
+# end _main
+
+
+# begin TB_Boucle
+TB_Boucle59:
+c4:
+c3:
+li $t0, 0
+TB_Boucle20:
+li $t1, 0
+c2:
+slt $v0, $t0, $a3
+seq $v0, $v0, $zero
+beq $v0, $t1, TB_Boucle15
+jr $ra
+TB_Boucle15:
+c0:
+li $v0, 4
+mulo $v0, $t0, $v0
+add $v0, $a0, $v0
+lw $t1, 0($v0)
+li $v0, 4
+mulo $v0, $t0, $v0
+add $v0, $a1, $v0
+lw $v0, 0($v0)
+add $t1, $t1, $v0
+li $v0, 4
+mulo $v0, $t0, $v0
+add $v0, $a2, $v0
+sw $t1, 0($v0)
+c1:
+li $v0, 1
+add $t0, $t0, $v0
+j TB_Boucle20
+# end TB_Boucle
--- /dev/null
+int t1[5] = { 1, 2, 3, 5, 8, };
+
+int t2[5] = { 13, 21, 34, 55, 89, };
+
+extern void *__builtin___memcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memmove_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___mempcpy_chk(void *, void *, unsigned int, unsigned int);
+
+extern void *__builtin___memset_chk(void *, int, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___stpcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcat_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strcpy_chk(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin___strncat_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern unsigned char *__builtin___strncpy_chk(unsigned char *, unsigned char *, unsigned int, unsigned int);
+
+extern int __builtin___vfprintf_chk(void *, int, unsigned char *, void *);
+
+extern int __builtin___vprintf_chk(int, unsigned char *, void *);
+
+extern int __builtin___vsnprintf_chk(unsigned char *, unsigned int, int, unsigned int, unsigned char *, void *);
+
+extern int __builtin___vsprintf_chk(unsigned char *, int, unsigned int, unsigned char *, void *);
+
+extern double __builtin_acos(double);
+
+extern float __builtin_acosf(float);
+
+extern double __builtin_acosl(double);
+
+extern void *__builtin_alloca(unsigned int);
+
+extern double __builtin_asin(double);
+
+extern float __builtin_asinf(float);
+
+extern double __builtin_asinl(double);
+
+extern double __builtin_atan(double);
+
+extern float __builtin_atanf(float);
+
+extern double __builtin_atanl(double);
+
+extern double __builtin_atan2(double, double);
+
+extern float __builtin_atan2f(float, float);
+
+extern double __builtin_atan2l(double, double);
+
+extern double __builtin_ceil(double);
+
+extern float __builtin_ceilf(float);
+
+extern double __builtin_ceill(double);
+
+extern double __builtin_cos(double);
+
+extern float __builtin_cosf(float);
+
+extern double __builtin_cosl(double);
+
+extern double __builtin_cosh(double);
+
+extern float __builtin_coshf(float);
+
+extern double __builtin_coshl(double);
+
+extern int __builtin_clz(unsigned int);
+
+extern int __builtin_clzl(unsigned int);
+
+extern int __builtin_clzll(unsigned int);
+
+extern int __builtin_constant_p(int);
+
+extern int __builtin_ctz(unsigned int);
+
+extern int __builtin_ctzl(unsigned int);
+
+extern int __builtin_ctzll(unsigned int);
+
+extern double __builtin_exp(double);
+
+extern float __builtin_expf(float);
+
+extern double __builtin_expl(double);
+
+extern int __builtin_expect(int, int);
+
+extern double __builtin_fabs(double);
+
+extern float __builtin_fabsf(float);
+
+extern double __builtin_fabsl(double);
+
+extern int __builtin_ffs(unsigned int);
+
+extern int __builtin_ffsl(unsigned int);
+
+extern int __builtin_ffsll(unsigned int);
+
+extern void *__builtin_frame_address(unsigned int);
+
+extern double __builtin_floor(double);
+
+extern float __builtin_floorf(float);
+
+extern double __builtin_floorl(double);
+
+extern double __builtin_huge_val(void);
+
+extern float __builtin_huge_valf(void);
+
+extern double __builtin_huge_vall(void);
+
+extern double __builtin_inf(void);
+
+extern float __builtin_inff(void);
+
+extern double __builtin_infl(void);
+
+extern void *__builtin_memcpy(void *, void *, unsigned int);
+
+extern void *__builtin_mempcpy(void *, void *, unsigned int);
+
+extern double __builtin_fmod(double);
+
+extern float __builtin_fmodf(float);
+
+extern double __builtin_fmodl(double);
+
+extern double __builtin_frexp(double, int *);
+
+extern float __builtin_frexpf(float, int *);
+
+extern double __builtin_frexpl(double, int *);
+
+extern double __builtin_ldexp(double, int);
+
+extern float __builtin_ldexpf(float, int);
+
+extern double __builtin_ldexpl(double, int);
+
+extern double __builtin_log(double);
+
+extern float __builtin_logf(float);
+
+extern double __builtin_logl(double);
+
+extern double __builtin_log10(double);
+
+extern float __builtin_log10f(float);
+
+extern double __builtin_log10l(double);
+
+extern float __builtin_modff(float, float *);
+
+extern double __builtin_modfl(double, double *);
+
+extern double __builtin_nan(unsigned char *);
+
+extern float __builtin_nanf(unsigned char *);
+
+extern double __builtin_nanl(unsigned char *);
+
+extern double __builtin_nans(unsigned char *);
+
+extern float __builtin_nansf(unsigned char *);
+
+extern double __builtin_nansl(unsigned char *);
+
+extern void *__builtin_next_arg(void);
+
+extern unsigned int __builtin_object_size(void *, int);
+
+extern int __builtin_parity(unsigned int);
+
+extern int __builtin_parityl(unsigned int);
+
+extern int __builtin_parityll(unsigned int);
+
+extern int __builtin_popcount(unsigned int);
+
+extern int __builtin_popcountl(unsigned int);
+
+extern int __builtin_popcountll(unsigned int);
+
+extern double __builtin_powi(double, int);
+
+extern float __builtin_powif(float, int);
+
+extern double __builtin_powil(double, int);
+
+extern void __builtin_return(void *);
+
+extern void *__builtin_return_address(unsigned int);
+
+extern double __builtin_sin(double);
+
+extern float __builtin_sinf(float);
+
+extern double __builtin_sinl(double);
+
+extern double __builtin_sinh(double);
+
+extern float __builtin_sinhf(float);
+
+extern double __builtin_sinhl(double);
+
+extern double __builtin_sqrt(double);
+
+extern float __builtin_sqrtf(float);
+
+extern double __builtin_sqrtl(double);
+
+extern unsigned char *__builtin_stpcpy(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strchr(unsigned char *, unsigned char);
+
+extern int __builtin_strcmp(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strcpy(unsigned char *, unsigned char *);
+
+extern unsigned int __builtin_strcspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strncat(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strncmp(unsigned char *, unsigned char *, unsigned int);
+
+extern unsigned char *__builtin_strncpy(unsigned char *, unsigned char *, unsigned int);
+
+extern int __builtin_strspn(unsigned char *, unsigned char *);
+
+extern unsigned char *__builtin_strpbrk(unsigned char *, unsigned char *);
+
+extern int __builtin_types_compatible_p(unsigned int, unsigned int);
+
+extern double __builtin_tan(double);
+
+extern float __builtin_tanf(float);
+
+extern double __builtin_tanl(double);
+
+extern double __builtin_tanh(double);
+
+extern float __builtin_tanhf(float);
+
+extern double __builtin_tanhl(double);
+
+extern void __builtin_va_end(void *);
+
+extern void __builtin_varargs_start(void *);
+
+extern void __builtin_va_start(void *, void *);
+
+extern void __builtin_stdarg_start(void *);
+
+extern void __builtin_va_arg(void *, unsigned int);
+
+extern void __builtin_va_copy(void *, void *);
+
+void TB_Boucle(int *tabEntree1, int *tabEntree2, int *tabSortie, int size)
+{
+ int i;
+ c4:
+ for (({ c3: i = 0; }); (/* c2 */ i < size); ({ c1: i = i + 1; })) {
+ c0:
+ tabSortie[i] = tabEntree1[i] + tabEntree2[i];
+ }
+}
+
+int main(void)
+{
+ int out[5];
+ c11:
+ out[0] = 0;
+ c10:
+ out[1] = 0;
+ c9:
+ out[2] = 0;
+ c8:
+ out[3] = 0;
+ c7:
+ out[4] = 0;
+ c6:
+ TB_Boucle(t1, t2, out, 5);
+ c5:
+ return out[4];
+}
+
+
--- /dev/null
+
+var "t1" {1, 2, 3, 5, 8}
+var "t2" {13, 21, 34, 55, 89}
+
+
+extern "__builtin___memcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memmove_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___mempcpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___memset_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___stpcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcat_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strcpy_chk" : int -> int -> int -> int
+
+
+extern "__builtin___strncat_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___strncpy_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vfprintf_chk" : int -> int -> int -> int -> int
+
+
+extern "__builtin___vprintf_chk" : int -> int -> int -> int
+
+
+extern "__builtin___vsnprintf_chk" : int -> int -> int -> int -> int -> int -> int
+
+
+extern "__builtin___vsprintf_chk" : int -> int -> int -> int -> int -> int
+
+
+extern "__builtin_acos" : float -> float
+
+
+extern "__builtin_acosf" : float -> float
+
+
+extern "__builtin_acosl" : float -> float
+
+
+extern "__builtin_alloca" : int -> int
+
+
+extern "__builtin_asin" : float -> float
+
+
+extern "__builtin_asinf" : float -> float
+
+
+extern "__builtin_asinl" : float -> float
+
+
+extern "__builtin_atan" : float -> float
+
+
+extern "__builtin_atanf" : float -> float
+
+
+extern "__builtin_atanl" : float -> float
+
+
+extern "__builtin_atan2" : float -> float -> float
+
+
+extern "__builtin_atan2f" : float -> float -> float
+
+
+extern "__builtin_atan2l" : float -> float -> float
+
+
+extern "__builtin_ceil" : float -> float
+
+
+extern "__builtin_ceilf" : float -> float
+
+
+extern "__builtin_ceill" : float -> float
+
+
+extern "__builtin_cos" : float -> float
+
+
+extern "__builtin_cosf" : float -> float
+
+
+extern "__builtin_cosl" : float -> float
+
+
+extern "__builtin_cosh" : float -> float
+
+
+extern "__builtin_coshf" : float -> float
+
+
+extern "__builtin_coshl" : float -> float
+
+
+extern "__builtin_clz" : int -> int
+
+
+extern "__builtin_clzl" : int -> int
+
+
+extern "__builtin_clzll" : int -> int
+
+
+extern "__builtin_constant_p" : int -> int
+
+
+extern "__builtin_ctz" : int -> int
+
+
+extern "__builtin_ctzl" : int -> int
+
+
+extern "__builtin_ctzll" : int -> int
+
+
+extern "__builtin_exp" : float -> float
+
+
+extern "__builtin_expf" : float -> float
+
+
+extern "__builtin_expl" : float -> float
+
+
+extern "__builtin_expect" : int -> int -> int
+
+
+extern "__builtin_fabs" : float -> float
+
+
+extern "__builtin_fabsf" : float -> float
+
+
+extern "__builtin_fabsl" : float -> float
+
+
+extern "__builtin_ffs" : int -> int
+
+
+extern "__builtin_ffsl" : int -> int
+
+
+extern "__builtin_ffsll" : int -> int
+
+
+extern "__builtin_frame_address" : int -> int
+
+
+extern "__builtin_floor" : float -> float
+
+
+extern "__builtin_floorf" : float -> float
+
+
+extern "__builtin_floorl" : float -> float
+
+
+extern "__builtin_huge_val" : float
+
+
+extern "__builtin_huge_valf" : float
+
+
+extern "__builtin_huge_vall" : float
+
+
+extern "__builtin_inf" : float
+
+
+extern "__builtin_inff" : float
+
+
+extern "__builtin_infl" : float
+
+
+extern "__builtin_memcpy" : int -> int -> int -> int
+
+
+extern "__builtin_mempcpy" : int -> int -> int -> int
+
+
+extern "__builtin_fmod" : float -> float
+
+
+extern "__builtin_fmodf" : float -> float
+
+
+extern "__builtin_fmodl" : float -> float
+
+
+extern "__builtin_frexp" : float -> int -> float
+
+
+extern "__builtin_frexpf" : float -> int -> float
+
+
+extern "__builtin_frexpl" : float -> int -> float
+
+
+extern "__builtin_ldexp" : float -> int -> float
+
+
+extern "__builtin_ldexpf" : float -> int -> float
+
+
+extern "__builtin_ldexpl" : float -> int -> float
+
+
+extern "__builtin_log" : float -> float
+
+
+extern "__builtin_logf" : float -> float
+
+
+extern "__builtin_logl" : float -> float
+
+
+extern "__builtin_log10" : float -> float
+
+
+extern "__builtin_log10f" : float -> float
+
+
+extern "__builtin_log10l" : float -> float
+
+
+extern "__builtin_modff" : float -> int -> float
+
+
+extern "__builtin_modfl" : float -> int -> float
+
+
+extern "__builtin_nan" : int -> float
+
+
+extern "__builtin_nanf" : int -> float
+
+
+extern "__builtin_nanl" : int -> float
+
+
+extern "__builtin_nans" : int -> float
+
+
+extern "__builtin_nansf" : int -> float
+
+
+extern "__builtin_nansl" : int -> float
+
+
+extern "__builtin_next_arg" : int
+
+
+extern "__builtin_object_size" : int -> int -> int
+
+
+extern "__builtin_parity" : int -> int
+
+
+extern "__builtin_parityl" : int -> int
+
+
+extern "__builtin_parityll" : int -> int
+
+
+extern "__builtin_popcount" : int -> int
+
+
+extern "__builtin_popcountl" : int -> int
+
+
+extern "__builtin_popcountll" : int -> int
+
+
+extern "__builtin_powi" : float -> int -> float
+
+
+extern "__builtin_powif" : float -> int -> float
+
+
+extern "__builtin_powil" : float -> int -> float
+
+
+extern "__builtin_return" : int -> void
+
+
+extern "__builtin_return_address" : int -> int
+
+
+extern "__builtin_sin" : float -> float
+
+
+extern "__builtin_sinf" : float -> float
+
+
+extern "__builtin_sinl" : float -> float
+
+
+extern "__builtin_sinh" : float -> float
+
+
+extern "__builtin_sinhf" : float -> float
+
+
+extern "__builtin_sinhl" : float -> float
+
+
+extern "__builtin_sqrt" : float -> float
+
+
+extern "__builtin_sqrtf" : float -> float
+
+
+extern "__builtin_sqrtl" : float -> float
+
+
+extern "__builtin_stpcpy" : int -> int -> int
+
+
+extern "__builtin_strchr" : int -> int -> int
+
+
+extern "__builtin_strcmp" : int -> int -> int
+
+
+extern "__builtin_strcpy" : int -> int -> int
+
+
+extern "__builtin_strcspn" : int -> int -> int
+
+
+extern "__builtin_strncat" : int -> int -> int -> int
+
+
+extern "__builtin_strncmp" : int -> int -> int -> int
+
+
+extern "__builtin_strncpy" : int -> int -> int -> int
+
+
+extern "__builtin_strspn" : int -> int -> int
+
+
+extern "__builtin_strpbrk" : int -> int -> int
+
+
+extern "__builtin_types_compatible_p" : int -> int -> int
+
+
+extern "__builtin_tan" : float -> float
+
+
+extern "__builtin_tanf" : float -> float
+
+
+extern "__builtin_tanl" : float -> float
+
+
+extern "__builtin_tanh" : float -> float
+
+
+extern "__builtin_tanhf" : float -> float
+
+
+extern "__builtin_tanhl" : float -> float
+
+
+extern "__builtin_va_end" : int -> void
+
+
+extern "__builtin_varargs_start" : int -> void
+
+
+extern "__builtin_va_start" : int -> int -> void
+
+
+extern "__builtin_stdarg_start" : int -> void
+
+
+extern "__builtin_va_arg" : int -> int -> void
+
+
+extern "__builtin_va_copy" : int -> int -> void
+
+
+"TB_Boucle" (tabEntree1, tabEntree2, tabSortie, size) : int -> int -> int -> int -> void {
+
+ stack 0;
+
+ var i;
+
+ c4:
+ c3:
+ i = 0;
+ block {
+ loop {
+ if (!(/* c2 */ i < size)) {
+ exit 0;
+ }
+ else {
+ }
+ block {
+ c0:
+ int32[tabSortie + (i * 4)] = int32[tabEntree1 + (i * 4)] + int32[tabEntree2 + (i * 4)];
+ }
+ c1:
+ i = i + 1;
+ }
+ }
+
+}
+
+
+"main" () : int {
+
+ stack 20;
+
+ c11:
+ int32[&0 + (0 * 4)] = 0;
+ c10:
+ int32[&0 + (1 * 4)] = 0;
+ c9:
+ int32[&0 + (2 * 4)] = 0;
+ c8:
+ int32[&0 + (3 * 4)] = 0;
+ c7:
+ int32[&0 + (4 * 4)] = 0;
+ c6:
+ "TB_Boucle"("t1", "t2", &0, 5) : int -> int -> int -> int -> void;
+ c5:
+ return int32[&0 + (4 * 4)];
+
+}
+
+
--- /dev/null
+program
+
+globals 40
+
+procedure _main(0)
+stacksize 20
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61, %62,
+ %63, %64, %65, %66, %67, %68, %69,
+ %70
+entry main155
+main155: newframe --> main154
+main154: move %70, $ra --> main153
+main153: move %69, $s7 --> main152
+main152: move %68, $s6 --> main151
+main151: move %67, $s5 --> main150
+main150: move %66, $s4 --> main149
+main149: move %65, $s3 --> main148
+main148: move %64, $s2 --> main147
+main147: move %63, $s1 --> main146
+main146: move %62, $s0 --> main145
+main145: li %1, 0 --> main144
+main144: li %2, 0 --> main143
+main143: li %3, 0 --> main142
+main142: li %4, 0 --> main141
+main141: li %5, 0 --> main140
+main140: li %6, 0 --> main139
+main139: li %7, 0 --> main138
+main138: li %8, 0 --> main137
+main137: li %9, 0 --> main136
+main136: li %10, 0 --> main135
+main135: li %11, 0 --> main134
+main134: li %12, 0 --> main133
+main133: li %13, 0 --> main132
+main132: li %14, 0 --> main131
+main131: li %15, 0 --> main130
+main130: li %16, 0 --> main129
+main129: li %17, 0 --> main128
+main128: li %18, 0 --> main127
+main127: li %19, 0 --> main126
+main126: li %20, 0 --> main125
+main125: li %21, 0 --> main124
+main124: li %22, 0 --> main123
+main123: li %23, 0 --> main122
+main122: li %24, 0 --> main121
+main121: li %25, 0 --> main120
+main120: li %26, 0 --> main119
+main119: li %27, 0 --> main118
+main118: li %28, 0 --> main117
+main117: li %29, 0 --> main116
+main116: li %30, 0 --> main115
+main115: li %31, 0 --> main114
+main114: li %32, 0 --> main113
+main113: li %33, 0 --> main112
+main112: li %34, 0 --> main111
+main111: li %35, 0 --> main110
+main110: li %36, 0 --> main109
+main109: li %37, 0 --> main108
+main108: li %38, 0 --> main107
+main107: li %39, 0 --> main106
+main106: li %40, 0 --> main105
+main105: li %41, 0 --> main104
+main104: li %42, 0 --> main103
+main103: li %43, 0 --> main102
+main102: li %44, 0 --> main101
+main101: li %45, 0 --> main100
+main100: li %46, 0 --> main99
+main99 : li %47, 0 --> main98
+main98 : li %48, 0 --> main97
+main97 : li %49, 0 --> main96
+main96 : li %50, 0 --> main95
+main95 : li %51, 0 --> main94
+main94 : li %52, 0 --> main93
+main93 : li %53, 0 --> main92
+main92 : li %54, 0 --> main91
+main91 : li %55, 0 --> main90
+main90 : li %56, 0 --> main89
+main89 : li %57, 0 --> main88
+main88 : li %58, 0 --> main87
+main87 : li %59, 0 --> main86
+main86 : li %60, 0 --> main85
+main85 : li %61, 0 --> main67
+main67 : li %44, 1 --> main66
+main66 : move %60, $gp --> main185
+main185: move %60, %60 --> main83
+main83 : sw %44, 0(%60) --> main65
+main65 : li %43, 2 --> main64
+main64 : move %59, $gp --> main184
+main184: move %59, %59 --> main82
+main82 : sw %43, 4(%59) --> main63
+main63 : li %42, 3 --> main62
+main62 : move %58, $gp --> main183
+main183: move %58, %58 --> main81
+main81 : sw %42, 8(%58) --> main61
+main61 : li %41, 5 --> main60
+main60 : move %57, $gp --> main182
+main182: move %57, %57 --> main80
+main80 : sw %41, 12(%57) --> main59
+main59 : li %40, 8 --> main58
+main58 : move %56, $gp --> main181
+main181: move %56, %56 --> main79
+main79 : sw %40, 16(%56) --> main57
+main57 : li %39, 13 --> main56
+main56 : move %55, $gp --> main180
+main180: move %55, %55 --> main78
+main78 : sw %39, 20(%55) --> main55
+main55 : li %38, 21 --> main54
+main54 : move %54, $gp --> main179
+main179: move %54, %54 --> main77
+main77 : sw %38, 24(%54) --> main53
+main53 : li %37, 34 --> main52
+main52 : move %53, $gp --> main178
+main178: move %53, %53 --> main76
+main76 : sw %37, 28(%53) --> main51
+main51 : li %36, 55 --> main50
+main50 : move %52, $gp --> main177
+main177: move %52, %52 --> main75
+main75 : sw %36, 32(%52) --> main49
+main49 : li %35, 89 --> main48
+main48 : move %51, $gp --> main175
+main175: move %51, %51 --> main74
+main74 : sw %35, 36(%51) --> main47
+main47 : emit c11 --> main46
+main46 : li %30, 0 --> main45
+main45 : move %31, $sp --> main174
+main174: move %31, %31 --> main44
+main44 : li %33, 0 --> main43
+main43 : li %34, 4 --> main42
+main42 : mulo %32, %33, %34 --> main41
+main41 : add %50, %31, %32 --> main73
+main73 : sw %30, 0(%50) --> main40
+main40 : emit c10 --> main39
+main39 : li %25, 0 --> main38
+main38 : move %26, $sp --> main173
+main173: move %26, %26 --> main37
+main37 : li %28, 1 --> main36
+main36 : li %29, 4 --> main35
+main35 : mulo %27, %28, %29 --> main34
+main34 : add %49, %26, %27 --> main72
+main72 : sw %25, 0(%49) --> main33
+main33 : emit c9 --> main32
+main32 : li %20, 0 --> main31
+main31 : move %21, $sp --> main172
+main172: move %21, %21 --> main30
+main30 : li %23, 2 --> main29
+main29 : li %24, 4 --> main28
+main28 : mulo %22, %23, %24 --> main27
+main27 : add %48, %21, %22 --> main71
+main71 : sw %20, 0(%48) --> main26
+main26 : emit c8 --> main25
+main25 : li %15, 0 --> main24
+main24 : move %16, $sp --> main171
+main171: move %16, %16 --> main23
+main23 : li %18, 3 --> main22
+main22 : li %19, 4 --> main21
+main21 : mulo %17, %18, %19 --> main20
+main20 : add %47, %16, %17 --> main70
+main70 : sw %15, 0(%47) --> main19
+main19 : emit c7 --> main18
+main18 : li %10, 0 --> main17
+main17 : move %11, $sp --> main170
+main170: move %11, %11 --> main16
+main16 : li %13, 4 --> main15
+main15 : li %14, 4 --> main14
+main14 : mulo %12, %13, %14 --> main13
+main13 : add %46, %11, %12 --> main69
+main69 : sw %10, 0(%46) --> main12
+main12 : emit c6 --> main11
+main11 : move %5, $gp --> main169
+main169: move %5, %5 --> main10
+main10 : move %6, $gp --> main168
+main168: addi %6, %6, 20 --> main9
+main9 : move %7, $sp --> main192
+main192: move %7, %7 --> main8
+main8 : li %8, 5 --> main7
+main7 : la %61, TB_Boucle --> main84
+main84 : j --> main191
+main191: move $a0, %5 --> main190
+main190: move $a1, %6 --> main189
+main189: move $a2, %7 --> main188
+main188: move $a3, %8 --> main187
+main187: call %61(4) --> main186
+main186: move %9, $v0 --> main6
+main6 : emit c5 --> main5
+main5 : move %1, $sp --> main176
+main176: move %1, %1 --> main4
+main4 : li %3, 4 --> main3
+main3 : li %4, 4 --> main2
+main2 : mulo %2, %3, %4 --> main1
+main1 : add %45, %1, %2 --> main68
+main68 : lw %0, 0(%45) --> main0
+main0 : j --> main167
+main167: move $v0, %0 --> main166
+main166: move $ra, %70 --> main165
+main165: move $s7, %69 --> main164
+main164: move $s6, %68 --> main163
+main163: move $s5, %67 --> main162
+main162: move $s4, %66 --> main161
+main161: move $s3, %65 --> main160
+main160: move $s2, %64 --> main159
+main159: move $s1, %63 --> main158
+main158: move $s0, %62 --> main157
+main157: delframe --> main156
+main156: jr $ra (xmits $v0)
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
+procedure TB_Boucle(4)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30
+entry TB_Boucle59
+TB_Boucle59: newframe --> TB_Boucle58
+TB_Boucle58: move %30, $ra --> TB_Boucle57
+TB_Boucle57: move %29, $s7 --> TB_Boucle56
+TB_Boucle56: move %28, $s6 --> TB_Boucle55
+TB_Boucle55: move %27, $s5 --> TB_Boucle54
+TB_Boucle54: move %26, $s4 --> TB_Boucle53
+TB_Boucle53: move %25, $s3 --> TB_Boucle52
+TB_Boucle52: move %24, $s2 --> TB_Boucle51
+TB_Boucle51: move %23, $s1 --> TB_Boucle50
+TB_Boucle50: move %22, $s0 --> TB_Boucle49
+TB_Boucle49: move %0, $a0 --> TB_Boucle48
+TB_Boucle48: move %1, $a1 --> TB_Boucle47
+TB_Boucle47: move %2, $a2 --> TB_Boucle46
+TB_Boucle46: move %3, $a3 --> TB_Boucle45
+TB_Boucle45: li %4, 0 --> TB_Boucle44
+TB_Boucle44: li %5, 0 --> TB_Boucle43
+TB_Boucle43: li %6, 0 --> TB_Boucle42
+TB_Boucle42: li %7, 0 --> TB_Boucle41
+TB_Boucle41: li %8, 0 --> TB_Boucle40
+TB_Boucle40: li %9, 0 --> TB_Boucle39
+TB_Boucle39: li %10, 0 --> TB_Boucle38
+TB_Boucle38: li %11, 0 --> TB_Boucle37
+TB_Boucle37: li %12, 0 --> TB_Boucle36
+TB_Boucle36: li %13, 0 --> TB_Boucle35
+TB_Boucle35: li %14, 0 --> TB_Boucle34
+TB_Boucle34: li %15, 0 --> TB_Boucle33
+TB_Boucle33: li %16, 0 --> TB_Boucle32
+TB_Boucle32: li %17, 0 --> TB_Boucle31
+TB_Boucle31: li %18, 0 --> TB_Boucle30
+TB_Boucle30: li %19, 0 --> TB_Boucle29
+TB_Boucle29: li %20, 0 --> TB_Boucle28
+TB_Boucle28: li %21, 0 --> TB_Boucle23
+TB_Boucle23: emit c4 --> TB_Boucle22
+TB_Boucle22: emit c3 --> TB_Boucle21
+TB_Boucle21: li %4, 0 --> TB_Boucle1
+TB_Boucle1 : j --> TB_Boucle20
+TB_Boucle20: li %16, 0 --> TB_Boucle19
+TB_Boucle19: emit c2 --> TB_Boucle18
+TB_Boucle18: slt %17, %4, %3 --> TB_Boucle17
+TB_Boucle17: li %19, 0 --> TB_Boucle25
+TB_Boucle25: seq %15, %17, %19 --> TB_Boucle16
+TB_Boucle16: beq %15, %16 --> TB_Boucle15, TB_Boucle0
+TB_Boucle0 : j --> TB_Boucle70
+TB_Boucle70: move $ra, %30 --> TB_Boucle69
+TB_Boucle69: move $s7, %29 --> TB_Boucle68
+TB_Boucle68: move $s6, %28 --> TB_Boucle67
+TB_Boucle67: move $s5, %27 --> TB_Boucle66
+TB_Boucle66: move $s4, %26 --> TB_Boucle65
+TB_Boucle65: move $s3, %25 --> TB_Boucle64
+TB_Boucle64: move $s2, %24 --> TB_Boucle63
+TB_Boucle63: move $s1, %23 --> TB_Boucle62
+TB_Boucle62: move $s0, %22 --> TB_Boucle61
+TB_Boucle61: delframe --> TB_Boucle60
+TB_Boucle60: jr $ra
+TB_Boucle15: emit c0 --> TB_Boucle14
+TB_Boucle14: li %14, 4 --> TB_Boucle13
+TB_Boucle13: mulo %13, %4, %14 --> TB_Boucle12
+TB_Boucle12: add %18, %0, %13 --> TB_Boucle24
+TB_Boucle24: lw %9, 0(%18) --> TB_Boucle11
+TB_Boucle11: li %12, 4 --> TB_Boucle10
+TB_Boucle10: mulo %11, %4, %12 --> TB_Boucle9
+TB_Boucle9 : add %21, %1, %11 --> TB_Boucle27
+TB_Boucle27: lw %10, 0(%21) --> TB_Boucle8
+TB_Boucle8 : add %6, %9, %10 --> TB_Boucle7
+TB_Boucle7 : li %8, 4 --> TB_Boucle6
+TB_Boucle6 : mulo %7, %4, %8 --> TB_Boucle5
+TB_Boucle5 : add %20, %2, %7 --> TB_Boucle26
+TB_Boucle26: sw %6, 0(%20) --> TB_Boucle4
+TB_Boucle4 : emit c1 --> TB_Boucle3
+TB_Boucle3 : li %5, 1 --> TB_Boucle2
+TB_Boucle2 : add %4, %4, %5 --> TB_Boucle1
+
--- /dev/null
+program
+
+globals 40
+
+procedure _main(0)
+var 24
+main155:
+newframe
+sw $ra, 20($sp)
+li $a0, 1
+move $v0, $gp
+sw $a0, 0($v0)
+li $a0, 2
+move $v0, $gp
+sw $a0, 4($v0)
+li $a0, 3
+move $v0, $gp
+sw $a0, 8($v0)
+li $a0, 5
+move $v0, $gp
+sw $a0, 12($v0)
+li $a0, 8
+move $v0, $gp
+sw $a0, 16($v0)
+li $a0, 13
+move $v0, $gp
+sw $a0, 20($v0)
+li $a0, 21
+move $v0, $gp
+sw $a0, 24($v0)
+li $a0, 34
+move $v0, $gp
+sw $a0, 28($v0)
+li $a0, 55
+move $v0, $gp
+sw $a0, 32($v0)
+li $a0, 89
+move $v0, $gp
+sw $a0, 36($v0)
+c11:
+li $a1, 0
+move $a0, $sp
+li $v0, 4
+mulo $v0, $zero, $v0
+add $v0, $a0, $v0
+sw $a1, 0($v0)
+c10:
+move $a1, $sp
+li $a0, 1
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c9:
+move $a1, $sp
+li $a0, 2
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c8:
+move $a1, $sp
+li $a0, 3
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c7:
+move $a1, $sp
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $a1, $v0
+sw $zero, 0($v0)
+c6:
+move $a0, $gp
+move $a1, $gp
+addi $a1, $a1, 20
+move $a2, $sp
+li $a3, 5
+la $v0, TB_Boucle
+call $v0
+c5:
+li $a0, 4
+li $v0, 4
+mulo $v0, $a0, $v0
+add $v0, $sp, $v0
+lw $v0, 0($v0)
+lw $ra, 20($sp)
+delframe
+jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
+procedure TB_Boucle(4)
+var 0
+TB_Boucle59:
+newframe
+c4:
+c3:
+li $t0, 0
+TB_Boucle20:
+li $t1, 0
+c2:
+slt $v0, $t0, $a3
+seq $v0, $v0, $zero
+beq $v0, $t1, TB_Boucle15
+delframe
+jr $ra
+TB_Boucle15:
+c0:
+li $v0, 4
+mulo $v0, $t0, $v0
+add $v0, $a0, $v0
+lw $t1, 0($v0)
+li $v0, 4
+mulo $v0, $t0, $v0
+add $v0, $a1, $v0
+lw $v0, 0($v0)
+add $t1, $t1, $v0
+li $v0, 4
+mulo $v0, $t0, $v0
+add $v0, $a2, $v0
+sw $t1, 0($v0)
+c1:
+li $v0, 1
+add $t0, $t0, $v0
+j TB_Boucle20
+
--- /dev/null
+program
+
+globals 40
+
+procedure _main(0)
+var 24
+entry main155
+main155: newframe --> main154
+main154: lw $ra, 20($sp) --> main153
+main153: j --> main152
+main152: j --> main151
+main151: j --> main150
+main150: j --> main149
+main149: j --> main148
+main148: j --> main147
+main147: j --> main146
+main146: j --> main145
+main145: j --> main144
+main144: j --> main143
+main143: j --> main142
+main142: j --> main141
+main141: j --> main140
+main140: j --> main139
+main139: j --> main138
+main138: j --> main137
+main137: j --> main136
+main136: j --> main135
+main135: j --> main134
+main134: j --> main133
+main133: j --> main132
+main132: j --> main131
+main131: j --> main130
+main130: j --> main129
+main129: j --> main128
+main128: j --> main127
+main127: j --> main126
+main126: j --> main125
+main125: j --> main124
+main124: j --> main123
+main123: j --> main122
+main122: j --> main121
+main121: j --> main120
+main120: j --> main119
+main119: j --> main118
+main118: j --> main117
+main117: j --> main116
+main116: j --> main115
+main115: j --> main114
+main114: j --> main113
+main113: j --> main112
+main112: j --> main111
+main111: j --> main110
+main110: j --> main109
+main109: j --> main108
+main108: j --> main107
+main107: j --> main106
+main106: j --> main105
+main105: j --> main104
+main104: j --> main103
+main103: j --> main102
+main102: j --> main101
+main101: j --> main100
+main100: j --> main99
+main99 : j --> main98
+main98 : j --> main97
+main97 : j --> main96
+main96 : j --> main95
+main95 : j --> main94
+main94 : j --> main93
+main93 : j --> main92
+main92 : j --> main91
+main91 : j --> main90
+main90 : j --> main89
+main89 : j --> main88
+main88 : j --> main87
+main87 : j --> main86
+main86 : j --> main85
+main85 : j --> main67
+main67 : li $a0, 1 --> main66
+main66 : move $v0, $gp --> main185
+main185: j --> main83
+main83 : lw $a0, 0($v0) --> main65
+main65 : li $a0, 2 --> main64
+main64 : move $v0, $gp --> main184
+main184: j --> main82
+main82 : lw $a0, 4($v0) --> main63
+main63 : li $a0, 3 --> main62
+main62 : move $v0, $gp --> main183
+main183: j --> main81
+main81 : lw $a0, 8($v0) --> main61
+main61 : li $a0, 5 --> main60
+main60 : move $v0, $gp --> main182
+main182: j --> main80
+main80 : lw $a0, 12($v0) --> main59
+main59 : li $a0, 8 --> main58
+main58 : move $v0, $gp --> main181
+main181: j --> main79
+main79 : lw $a0, 16($v0) --> main57
+main57 : li $a0, 13 --> main56
+main56 : move $v0, $gp --> main180
+main180: j --> main78
+main78 : lw $a0, 20($v0) --> main55
+main55 : li $a0, 21 --> main54
+main54 : move $v0, $gp --> main179
+main179: j --> main77
+main77 : lw $a0, 24($v0) --> main53
+main53 : li $a0, 34 --> main52
+main52 : move $v0, $gp --> main178
+main178: j --> main76
+main76 : lw $a0, 28($v0) --> main51
+main51 : li $a0, 55 --> main50
+main50 : move $v0, $gp --> main177
+main177: j --> main75
+main75 : lw $a0, 32($v0) --> main49
+main49 : li $a0, 89 --> main48
+main48 : move $v0, $gp --> main175
+main175: j --> main74
+main74 : lw $a0, 36($v0) --> main47
+main47 : emit c11 --> main46
+main46 : li $a1, 0 --> main45
+main45 : move $a0, $sp --> main174
+main174: j --> main44
+main44 : j --> main43
+main43 : li $v0, 4 --> main42
+main42 : mulo $v0, $zero, $v0 --> main41
+main41 : add $v0, $a0, $v0 --> main73
+main73 : lw $a1, 0($v0) --> main40
+main40 : emit c10 --> main39
+main39 : j --> main38
+main38 : move $a1, $sp --> main173
+main173: j --> main37
+main37 : li $a0, 1 --> main36
+main36 : li $v0, 4 --> main35
+main35 : mulo $v0, $a0, $v0 --> main34
+main34 : add $v0, $a1, $v0 --> main72
+main72 : lw $zero, 0($v0) --> main33
+main33 : emit c9 --> main32
+main32 : j --> main31
+main31 : move $a1, $sp --> main172
+main172: j --> main30
+main30 : li $a0, 2 --> main29
+main29 : li $v0, 4 --> main28
+main28 : mulo $v0, $a0, $v0 --> main27
+main27 : add $v0, $a1, $v0 --> main71
+main71 : lw $zero, 0($v0) --> main26
+main26 : emit c8 --> main25
+main25 : j --> main24
+main24 : move $a1, $sp --> main171
+main171: j --> main23
+main23 : li $a0, 3 --> main22
+main22 : li $v0, 4 --> main21
+main21 : mulo $v0, $a0, $v0 --> main20
+main20 : add $v0, $a1, $v0 --> main70
+main70 : lw $zero, 0($v0) --> main19
+main19 : emit c7 --> main18
+main18 : j --> main17
+main17 : move $a1, $sp --> main170
+main170: j --> main16
+main16 : li $a0, 4 --> main15
+main15 : li $v0, 4 --> main14
+main14 : mulo $v0, $a0, $v0 --> main13
+main13 : add $v0, $a1, $v0 --> main69
+main69 : lw $zero, 0($v0) --> main12
+main12 : emit c6 --> main11
+main11 : move $a0, $gp --> main169
+main169: j --> main10
+main10 : move $a1, $gp --> main168
+main168: addi $a1, $a1, 20 --> main9
+main9 : move $a2, $sp --> main192
+main192: j --> main8
+main8 : li $a3, 5 --> main7
+main7 : la $v0, TB_Boucle --> main84
+main84 : j --> main191
+main191: j --> main190
+main190: j --> main189
+main189: j --> main188
+main188: j --> main187
+main187: call $v0 --> main186
+main186: j --> main6
+main6 : emit c5 --> main5
+main5 : j --> main176
+main176: j --> main4
+main4 : li $a0, 4 --> main3
+main3 : li $v0, 4 --> main2
+main2 : mulo $v0, $a0, $v0 --> main1
+main1 : add $v0, $sp, $v0 --> main68
+main68 : lw $v0, 0($v0) --> main0
+main0 : j --> main167
+main167: j --> main166
+main166: lw $ra, 20($sp) --> main165
+main165: j --> main164
+main164: j --> main163
+main163: j --> main162
+main162: j --> main161
+main161: j --> main160
+main160: j --> main159
+main159: j --> main158
+main158: j --> main157
+main157: delframe --> main156
+main156: jr $ra
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
+procedure TB_Boucle(4)
+var 0
+entry TB_Boucle59
+TB_Boucle59: newframe --> TB_Boucle58
+TB_Boucle58: j --> TB_Boucle57
+TB_Boucle57: j --> TB_Boucle56
+TB_Boucle56: j --> TB_Boucle55
+TB_Boucle55: j --> TB_Boucle54
+TB_Boucle54: j --> TB_Boucle53
+TB_Boucle53: j --> TB_Boucle52
+TB_Boucle52: j --> TB_Boucle51
+TB_Boucle51: j --> TB_Boucle50
+TB_Boucle50: j --> TB_Boucle49
+TB_Boucle49: j --> TB_Boucle48
+TB_Boucle48: j --> TB_Boucle47
+TB_Boucle47: j --> TB_Boucle46
+TB_Boucle46: j --> TB_Boucle45
+TB_Boucle45: j --> TB_Boucle44
+TB_Boucle44: j --> TB_Boucle43
+TB_Boucle43: j --> TB_Boucle42
+TB_Boucle42: j --> TB_Boucle41
+TB_Boucle41: j --> TB_Boucle40
+TB_Boucle40: j --> TB_Boucle39
+TB_Boucle39: j --> TB_Boucle38
+TB_Boucle38: j --> TB_Boucle37
+TB_Boucle37: j --> TB_Boucle36
+TB_Boucle36: j --> TB_Boucle35
+TB_Boucle35: j --> TB_Boucle34
+TB_Boucle34: j --> TB_Boucle33
+TB_Boucle33: j --> TB_Boucle32
+TB_Boucle32: j --> TB_Boucle31
+TB_Boucle31: j --> TB_Boucle30
+TB_Boucle30: j --> TB_Boucle29
+TB_Boucle29: j --> TB_Boucle28
+TB_Boucle28: j --> TB_Boucle23
+TB_Boucle23: emit c4 --> TB_Boucle22
+TB_Boucle22: emit c3 --> TB_Boucle21
+TB_Boucle21: li $t0, 0 --> TB_Boucle1
+TB_Boucle1 : j --> TB_Boucle20
+TB_Boucle20: li $t1, 0 --> TB_Boucle19
+TB_Boucle19: emit c2 --> TB_Boucle18
+TB_Boucle18: slt $v0, $t0, $a3 --> TB_Boucle17
+TB_Boucle17: j --> TB_Boucle25
+TB_Boucle25: seq $v0, $v0, $zero --> TB_Boucle16
+TB_Boucle16: beq $v0, $t1 --> TB_Boucle15, TB_Boucle0
+TB_Boucle0 : j --> TB_Boucle70
+TB_Boucle70: j --> TB_Boucle69
+TB_Boucle69: j --> TB_Boucle68
+TB_Boucle68: j --> TB_Boucle67
+TB_Boucle67: j --> TB_Boucle66
+TB_Boucle66: j --> TB_Boucle65
+TB_Boucle65: j --> TB_Boucle64
+TB_Boucle64: j --> TB_Boucle63
+TB_Boucle63: j --> TB_Boucle62
+TB_Boucle62: j --> TB_Boucle61
+TB_Boucle61: delframe --> TB_Boucle60
+TB_Boucle60: jr $ra
+TB_Boucle15: emit c0 --> TB_Boucle14
+TB_Boucle14: li $v0, 4 --> TB_Boucle13
+TB_Boucle13: mulo $v0, $t0, $v0 --> TB_Boucle12
+TB_Boucle12: add $v0, $a0, $v0 --> TB_Boucle24
+TB_Boucle24: lw $t1, 0($v0) --> TB_Boucle11
+TB_Boucle11: li $v0, 4 --> TB_Boucle10
+TB_Boucle10: mulo $v0, $t0, $v0 --> TB_Boucle9
+TB_Boucle9 : add $v0, $a1, $v0 --> TB_Boucle27
+TB_Boucle27: lw $v0, 0($v0) --> TB_Boucle8
+TB_Boucle8 : add $t1, $t1, $v0 --> TB_Boucle7
+TB_Boucle7 : li $v0, 4 --> TB_Boucle6
+TB_Boucle6 : mulo $v0, $t0, $v0 --> TB_Boucle5
+TB_Boucle5 : add $v0, $a2, $v0 --> TB_Boucle26
+TB_Boucle26: lw $t1, 0($v0) --> TB_Boucle4
+TB_Boucle4 : emit c1 --> TB_Boucle3
+TB_Boucle3 : li $v0, 1 --> TB_Boucle2
+TB_Boucle2 : add $t0, $t0, $v0 --> TB_Boucle1
+
--- /dev/null
+program
+
+globals 40
+
+function _main() : %0
+stacksize 20
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21, %22, %23, %24, %25, %26, %27,
+ %28, %29, %30, %31, %32, %33, %34,
+ %35, %36, %37, %38, %39, %40, %41,
+ %42, %43, %44, %45, %46, %47, %48,
+ %49, %50, %51, %52, %53, %54, %55,
+ %56, %57, %58, %59, %60, %61
+entry main145
+main145: li %1, 0 --> main144
+main144: li %2, 0 --> main143
+main143: li %3, 0 --> main142
+main142: li %4, 0 --> main141
+main141: li %5, 0 --> main140
+main140: li %6, 0 --> main139
+main139: li %7, 0 --> main138
+main138: li %8, 0 --> main137
+main137: li %9, 0 --> main136
+main136: li %10, 0 --> main135
+main135: li %11, 0 --> main134
+main134: li %12, 0 --> main133
+main133: li %13, 0 --> main132
+main132: li %14, 0 --> main131
+main131: li %15, 0 --> main130
+main130: li %16, 0 --> main129
+main129: li %17, 0 --> main128
+main128: li %18, 0 --> main127
+main127: li %19, 0 --> main126
+main126: li %20, 0 --> main125
+main125: li %21, 0 --> main124
+main124: li %22, 0 --> main123
+main123: li %23, 0 --> main122
+main122: li %24, 0 --> main121
+main121: li %25, 0 --> main120
+main120: li %26, 0 --> main119
+main119: li %27, 0 --> main118
+main118: li %28, 0 --> main117
+main117: li %29, 0 --> main116
+main116: li %30, 0 --> main115
+main115: li %31, 0 --> main114
+main114: li %32, 0 --> main113
+main113: li %33, 0 --> main112
+main112: li %34, 0 --> main111
+main111: li %35, 0 --> main110
+main110: li %36, 0 --> main109
+main109: li %37, 0 --> main108
+main108: li %38, 0 --> main107
+main107: li %39, 0 --> main106
+main106: li %40, 0 --> main105
+main105: li %41, 0 --> main104
+main104: li %42, 0 --> main103
+main103: li %43, 0 --> main102
+main102: li %44, 0 --> main101
+main101: li %45, 0 --> main100
+main100: li %46, 0 --> main99
+main99 : li %47, 0 --> main98
+main98 : li %48, 0 --> main97
+main97 : li %49, 0 --> main96
+main96 : li %50, 0 --> main95
+main95 : li %51, 0 --> main94
+main94 : li %52, 0 --> main93
+main93 : li %53, 0 --> main92
+main92 : li %54, 0 --> main91
+main91 : li %55, 0 --> main90
+main90 : li %56, 0 --> main89
+main89 : li %57, 0 --> main88
+main88 : li %58, 0 --> main87
+main87 : li %59, 0 --> main86
+main86 : li %60, 0 --> main85
+main85 : li %61, 0 --> main67
+main67 : li %44, 1 --> main66
+main66 : addi %60, GLOBALS, 0 --> main83
+main83 : sw %44, 0(%60) --> main65
+main65 : li %43, 2 --> main64
+main64 : addi %59, GLOBALS, 0 --> main82
+main82 : sw %43, 4(%59) --> main63
+main63 : li %42, 3 --> main62
+main62 : addi %58, GLOBALS, 0 --> main81
+main81 : sw %42, 8(%58) --> main61
+main61 : li %41, 5 --> main60
+main60 : addi %57, GLOBALS, 0 --> main80
+main80 : sw %41, 12(%57) --> main59
+main59 : li %40, 8 --> main58
+main58 : addi %56, GLOBALS, 0 --> main79
+main79 : sw %40, 16(%56) --> main57
+main57 : li %39, 13 --> main56
+main56 : addi %55, GLOBALS, 0 --> main78
+main78 : sw %39, 20(%55) --> main55
+main55 : li %38, 21 --> main54
+main54 : addi %54, GLOBALS, 0 --> main77
+main77 : sw %38, 24(%54) --> main53
+main53 : li %37, 34 --> main52
+main52 : addi %53, GLOBALS, 0 --> main76
+main76 : sw %37, 28(%53) --> main51
+main51 : li %36, 55 --> main50
+main50 : addi %52, GLOBALS, 0 --> main75
+main75 : sw %36, 32(%52) --> main49
+main49 : li %35, 89 --> main48
+main48 : addi %51, GLOBALS, 0 --> main74
+main74 : sw %35, 36(%51) --> main47
+main47 : emit c11 --> main46
+main46 : li %30, 0 --> main45
+main45 : addi %31, STACK, 0 --> main44
+main44 : li %33, 0 --> main43
+main43 : li %34, 4 --> main42
+main42 : mulo %32, %33, %34 --> main41
+main41 : add %50, %31, %32 --> main73
+main73 : sw %30, 0(%50) --> main40
+main40 : emit c10 --> main39
+main39 : li %25, 0 --> main38
+main38 : addi %26, STACK, 0 --> main37
+main37 : li %28, 1 --> main36
+main36 : li %29, 4 --> main35
+main35 : mulo %27, %28, %29 --> main34
+main34 : add %49, %26, %27 --> main72
+main72 : sw %25, 0(%49) --> main33
+main33 : emit c9 --> main32
+main32 : li %20, 0 --> main31
+main31 : addi %21, STACK, 0 --> main30
+main30 : li %23, 2 --> main29
+main29 : li %24, 4 --> main28
+main28 : mulo %22, %23, %24 --> main27
+main27 : add %48, %21, %22 --> main71
+main71 : sw %20, 0(%48) --> main26
+main26 : emit c8 --> main25
+main25 : li %15, 0 --> main24
+main24 : addi %16, STACK, 0 --> main23
+main23 : li %18, 3 --> main22
+main22 : li %19, 4 --> main21
+main21 : mulo %17, %18, %19 --> main20
+main20 : add %47, %16, %17 --> main70
+main70 : sw %15, 0(%47) --> main19
+main19 : emit c7 --> main18
+main18 : li %10, 0 --> main17
+main17 : addi %11, STACK, 0 --> main16
+main16 : li %13, 4 --> main15
+main15 : li %14, 4 --> main14
+main14 : mulo %12, %13, %14 --> main13
+main13 : add %46, %11, %12 --> main69
+main69 : sw %10, 0(%46) --> main12
+main12 : emit c6 --> main11
+main11 : addi %5, GLOBALS, 0 --> main10
+main10 : addi %6, GLOBALS, 20 --> main9
+main9 : addi %7, STACK, 0 --> main8
+main8 : li %8, 5 --> main7
+main7 : la %61, TB_Boucle --> main84
+main84 : call %9, %61(%5, %6, %7, %8) --> main6
+main6 : emit c5 --> main5
+main5 : addi %1, STACK, 0 --> main4
+main4 : li %3, 4 --> main3
+main3 : li %4, 4 --> main2
+main2 : mulo %2, %3, %4 --> main1
+main1 : add %45, %1, %2 --> main68
+main68 : lw %0, 0(%45) --> main0
+main0 : return %0
+
+__builtin_varargs_start: int -> void
+
+
+__builtin_va_start: int -> int -> void
+
+
+__builtin_va_end: int -> void
+
+
+__builtin_va_copy: int -> int -> void
+
+
+__builtin_va_arg: int -> int -> void
+
+
+__builtin_types_compatible_p: int -> int -> int
+
+
+__builtin_tanl: float -> float
+
+
+__builtin_tanhl: float -> float
+
+
+__builtin_tanhf: float -> float
+
+
+__builtin_tanh: float -> float
+
+
+__builtin_tanf: float -> float
+
+
+__builtin_tan: float -> float
+
+
+__builtin_strspn: int -> int -> int
+
+
+__builtin_strpbrk: int -> int -> int
+
+
+__builtin_strncpy: int -> int -> int -> int
+
+
+__builtin_strncmp: int -> int -> int -> int
+
+
+__builtin_strncat: int -> int -> int -> int
+
+
+__builtin_strcspn: int -> int -> int
+
+
+__builtin_strcpy: int -> int -> int
+
+
+__builtin_strcmp: int -> int -> int
+
+
+__builtin_strchr: int -> int -> int
+
+
+__builtin_stpcpy: int -> int -> int
+
+
+__builtin_stdarg_start: int -> void
+
+
+__builtin_sqrtl: float -> float
+
+
+__builtin_sqrtf: float -> float
+
+
+__builtin_sqrt: float -> float
+
+
+__builtin_sinl: float -> float
+
+
+__builtin_sinhl: float -> float
+
+
+__builtin_sinhf: float -> float
+
+
+__builtin_sinh: float -> float
+
+
+__builtin_sinf: float -> float
+
+
+__builtin_sin: float -> float
+
+
+__builtin_return_address: int -> int
+
+
+__builtin_return: int -> void
+
+
+__builtin_powil: float -> int -> float
+
+
+__builtin_powif: float -> int -> float
+
+
+__builtin_powi: float -> int -> float
+
+
+__builtin_popcountll: int -> int
+
+
+__builtin_popcountl: int -> int
+
+
+__builtin_popcount: int -> int
+
+
+__builtin_parityll: int -> int
+
+
+__builtin_parityl: int -> int
+
+
+__builtin_parity: int -> int
+
+
+__builtin_object_size: int -> int -> int
+
+
+__builtin_next_arg: int
+
+
+__builtin_nansl: int -> float
+
+
+__builtin_nansf: int -> float
+
+
+__builtin_nans: int -> float
+
+
+__builtin_nanl: int -> float
+
+
+__builtin_nanf: int -> float
+
+
+__builtin_nan: int -> float
+
+
+__builtin_modfl: float -> int -> float
+
+
+__builtin_modff: float -> int -> float
+
+
+__builtin_mempcpy: int -> int -> int -> int
+
+
+__builtin_memcpy: int -> int -> int -> int
+
+
+__builtin_logl: float -> float
+
+
+__builtin_logf: float -> float
+
+
+__builtin_log10l: float -> float
+
+
+__builtin_log10f: float -> float
+
+
+__builtin_log10: float -> float
+
+
+__builtin_log: float -> float
+
+
+__builtin_ldexpl: float -> int -> float
+
+
+__builtin_ldexpf: float -> int -> float
+
+
+__builtin_ldexp: float -> int -> float
+
+
+__builtin_infl: float
+
+
+__builtin_inff: float
+
+
+__builtin_inf: float
+
+
+__builtin_huge_vall: float
+
+
+__builtin_huge_valf: float
+
+
+__builtin_huge_val: float
+
+
+__builtin_frexpl: float -> int -> float
+
+
+__builtin_frexpf: float -> int -> float
+
+
+__builtin_frexp: float -> int -> float
+
+
+__builtin_frame_address: int -> int
+
+
+__builtin_fmodl: float -> float
+
+
+__builtin_fmodf: float -> float
+
+
+__builtin_fmod: float -> float
+
+
+__builtin_floorl: float -> float
+
+
+__builtin_floorf: float -> float
+
+
+__builtin_floor: float -> float
+
+
+__builtin_ffsll: int -> int
+
+
+__builtin_ffsl: int -> int
+
+
+__builtin_ffs: int -> int
+
+
+__builtin_fabsl: float -> float
+
+
+__builtin_fabsf: float -> float
+
+
+__builtin_fabs: float -> float
+
+
+__builtin_expl: float -> float
+
+
+__builtin_expf: float -> float
+
+
+__builtin_expect: int -> int -> int
+
+
+__builtin_exp: float -> float
+
+
+__builtin_ctzll: int -> int
+
+
+__builtin_ctzl: int -> int
+
+
+__builtin_ctz: int -> int
+
+
+__builtin_cosl: float -> float
+
+
+__builtin_coshl: float -> float
+
+
+__builtin_coshf: float -> float
+
+
+__builtin_cosh: float -> float
+
+
+__builtin_cosf: float -> float
+
+
+__builtin_cos: float -> float
+
+
+__builtin_constant_p: int -> int
+
+
+__builtin_clzll: int -> int
+
+
+__builtin_clzl: int -> int
+
+
+__builtin_clz: int -> int
+
+
+__builtin_ceill: float -> float
+
+
+__builtin_ceilf: float -> float
+
+
+__builtin_ceil: float -> float
+
+
+__builtin_atanl: float -> float
+
+
+__builtin_atanf: float -> float
+
+
+__builtin_atan2l: float -> float -> float
+
+
+__builtin_atan2f: float -> float -> float
+
+
+__builtin_atan2: float -> float -> float
+
+
+__builtin_atan: float -> float
+
+
+__builtin_asinl: float -> float
+
+
+__builtin_asinf: float -> float
+
+
+__builtin_asin: float -> float
+
+
+__builtin_alloca: int -> int
+
+
+__builtin_acosl: float -> float
+
+
+__builtin_acosf: float -> float
+
+
+__builtin_acos: float -> float
+
+
+__builtin___vsprintf_chk: int -> int -> int -> int -> int -> int
+
+
+__builtin___vsnprintf_chk: int -> int -> int -> int -> int -> int -> int
+
+
+__builtin___vprintf_chk: int -> int -> int -> int
+
+
+__builtin___vfprintf_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___strncat_chk: int -> int -> int -> int -> int
+
+
+__builtin___strcpy_chk: int -> int -> int -> int
+
+
+__builtin___strcat_chk: int -> int -> int -> int
+
+
+__builtin___stpcpy_chk: int -> int -> int -> int
+
+
+__builtin___memset_chk: int -> int -> int -> int -> int
+
+
+__builtin___mempcpy_chk: int -> int -> int -> int -> int
+
+
+__builtin___memmove_chk: int -> int -> int -> int -> int
+
+
+__builtin___memcpy_chk: int -> int -> int -> int -> int
+
+
+procedure TB_Boucle(%0; %1; %2; %3)
+stacksize 0
+var %0, %1, %2, %3, %4, %5, %6,
+ %7, %8, %9, %10, %11, %12, %13,
+ %14, %15, %16, %17, %18, %19, %20,
+ %21
+entry TB_Boucle45
+TB_Boucle45: li %4, 0 --> TB_Boucle44
+TB_Boucle44: li %5, 0 --> TB_Boucle43
+TB_Boucle43: li %6, 0 --> TB_Boucle42
+TB_Boucle42: li %7, 0 --> TB_Boucle41
+TB_Boucle41: li %8, 0 --> TB_Boucle40
+TB_Boucle40: li %9, 0 --> TB_Boucle39
+TB_Boucle39: li %10, 0 --> TB_Boucle38
+TB_Boucle38: li %11, 0 --> TB_Boucle37
+TB_Boucle37: li %12, 0 --> TB_Boucle36
+TB_Boucle36: li %13, 0 --> TB_Boucle35
+TB_Boucle35: li %14, 0 --> TB_Boucle34
+TB_Boucle34: li %15, 0 --> TB_Boucle33
+TB_Boucle33: li %16, 0 --> TB_Boucle32
+TB_Boucle32: li %17, 0 --> TB_Boucle31
+TB_Boucle31: li %18, 0 --> TB_Boucle30
+TB_Boucle30: li %19, 0 --> TB_Boucle29
+TB_Boucle29: li %20, 0 --> TB_Boucle28
+TB_Boucle28: li %21, 0 --> TB_Boucle23
+TB_Boucle23: emit c4 --> TB_Boucle22
+TB_Boucle22: emit c3 --> TB_Boucle21
+TB_Boucle21: li %4, 0 --> TB_Boucle1
+TB_Boucle1 : j --> TB_Boucle20
+TB_Boucle20: li %16, 0 --> TB_Boucle19
+TB_Boucle19: emit c2 --> TB_Boucle18
+TB_Boucle18: slt %17, %4, %3 --> TB_Boucle17
+TB_Boucle17: li %19, 0 --> TB_Boucle25
+TB_Boucle25: seq %15, %17, %19 --> TB_Boucle16
+TB_Boucle16: beq %15, %16 --> TB_Boucle15, TB_Boucle0
+TB_Boucle0 : return
+TB_Boucle15: emit c0 --> TB_Boucle14
+TB_Boucle14: li %14, 4 --> TB_Boucle13
+TB_Boucle13: mulo %13, %4, %14 --> TB_Boucle12
+TB_Boucle12: add %18, %0, %13 --> TB_Boucle24
+TB_Boucle24: lw %9, 0(%18) --> TB_Boucle11
+TB_Boucle11: li %12, 4 --> TB_Boucle10
+TB_Boucle10: mulo %11, %4, %12 --> TB_Boucle9
+TB_Boucle9 : add %21, %1, %11 --> TB_Boucle27
+TB_Boucle27: lw %10, 0(%21) --> TB_Boucle8
+TB_Boucle8 : add %6, %9, %10 --> TB_Boucle7
+TB_Boucle7 : li %8, 4 --> TB_Boucle6
+TB_Boucle6 : mulo %7, %4, %8 --> TB_Boucle5
+TB_Boucle5 : add %20, %2, %7 --> TB_Boucle26
+TB_Boucle26: sw %6, 0(%20) --> TB_Boucle4
+TB_Boucle4 : emit c1 --> TB_Boucle3
+TB_Boucle3 : li %5, 1 --> TB_Boucle2
+TB_Boucle2 : add %4, %4, %5 --> TB_Boucle1
+
--- /dev/null
+program: (main function is "main")
+
+
+ globals:
+ "t1" = {1, 2, 3, 5, 8}
+ "t2" = {13, 21, 34, 55, 89}
+
+
+ "__builtin___memcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memmove_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___mempcpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___memset_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___stpcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strcat_chk": int -> int -> int -> int
+
+
+ "__builtin___strcpy_chk": int -> int -> int -> int
+
+
+ "__builtin___strncat_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___strncpy_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vfprintf_chk": int -> int -> int -> int -> int
+
+
+ "__builtin___vprintf_chk": int -> int -> int -> int
+
+
+ "__builtin___vsnprintf_chk": int -> int -> int -> int -> int -> int -> int
+
+
+ "__builtin___vsprintf_chk": int -> int -> int -> int -> int -> int
+
+
+ "__builtin_acos": float -> float
+
+
+ "__builtin_acosf": float -> float
+
+
+ "__builtin_acosl": float -> float
+
+
+ "__builtin_alloca": int -> int
+
+
+ "__builtin_asin": float -> float
+
+
+ "__builtin_asinf": float -> float
+
+
+ "__builtin_asinl": float -> float
+
+
+ "__builtin_atan": float -> float
+
+
+ "__builtin_atanf": float -> float
+
+
+ "__builtin_atanl": float -> float
+
+
+ "__builtin_atan2": float -> float -> float
+
+
+ "__builtin_atan2f": float -> float -> float
+
+
+ "__builtin_atan2l": float -> float -> float
+
+
+ "__builtin_ceil": float -> float
+
+
+ "__builtin_ceilf": float -> float
+
+
+ "__builtin_ceill": float -> float
+
+
+ "__builtin_cos": float -> float
+
+
+ "__builtin_cosf": float -> float
+
+
+ "__builtin_cosl": float -> float
+
+
+ "__builtin_cosh": float -> float
+
+
+ "__builtin_coshf": float -> float
+
+
+ "__builtin_coshl": float -> float
+
+
+ "__builtin_clz": int -> int
+
+
+ "__builtin_clzl": int -> int
+
+
+ "__builtin_clzll": int -> int
+
+
+ "__builtin_constant_p": int -> int
+
+
+ "__builtin_ctz": int -> int
+
+
+ "__builtin_ctzl": int -> int
+
+
+ "__builtin_ctzll": int -> int
+
+
+ "__builtin_exp": float -> float
+
+
+ "__builtin_expf": float -> float
+
+
+ "__builtin_expl": float -> float
+
+
+ "__builtin_expect": int -> int -> int
+
+
+ "__builtin_fabs": float -> float
+
+
+ "__builtin_fabsf": float -> float
+
+
+ "__builtin_fabsl": float -> float
+
+
+ "__builtin_ffs": int -> int
+
+
+ "__builtin_ffsl": int -> int
+
+
+ "__builtin_ffsll": int -> int
+
+
+ "__builtin_frame_address": int -> int
+
+
+ "__builtin_floor": float -> float
+
+
+ "__builtin_floorf": float -> float
+
+
+ "__builtin_floorl": float -> float
+
+
+ "__builtin_huge_val": float
+
+
+ "__builtin_huge_valf": float
+
+
+ "__builtin_huge_vall": float
+
+
+ "__builtin_inf": float
+
+
+ "__builtin_inff": float
+
+
+ "__builtin_infl": float
+
+
+ "__builtin_memcpy": int -> int -> int -> int
+
+
+ "__builtin_mempcpy": int -> int -> int -> int
+
+
+ "__builtin_fmod": float -> float
+
+
+ "__builtin_fmodf": float -> float
+
+
+ "__builtin_fmodl": float -> float
+
+
+ "__builtin_frexp": float -> int -> float
+
+
+ "__builtin_frexpf": float -> int -> float
+
+
+ "__builtin_frexpl": float -> int -> float
+
+
+ "__builtin_ldexp": float -> int -> float
+
+
+ "__builtin_ldexpf": float -> int -> float
+
+
+ "__builtin_ldexpl": float -> int -> float
+
+
+ "__builtin_log": float -> float
+
+
+ "__builtin_logf": float -> float
+
+
+ "__builtin_logl": float -> float
+
+
+ "__builtin_log10": float -> float
+
+
+ "__builtin_log10f": float -> float
+
+
+ "__builtin_log10l": float -> float
+
+
+ "__builtin_modff": float -> int -> float
+
+
+ "__builtin_modfl": float -> int -> float
+
+
+ "__builtin_nan": int -> float
+
+
+ "__builtin_nanf": int -> float
+
+
+ "__builtin_nanl": int -> float
+
+
+ "__builtin_nans": int -> float
+
+
+ "__builtin_nansf": int -> float
+
+
+ "__builtin_nansl": int -> float
+
+
+ "__builtin_next_arg": int
+
+
+ "__builtin_object_size": int -> int -> int
+
+
+ "__builtin_parity": int -> int
+
+
+ "__builtin_parityl": int -> int
+
+
+ "__builtin_parityll": int -> int
+
+
+ "__builtin_popcount": int -> int
+
+
+ "__builtin_popcountl": int -> int
+
+
+ "__builtin_popcountll": int -> int
+
+
+ "__builtin_powi": float -> int -> float
+
+
+ "__builtin_powif": float -> int -> float
+
+
+ "__builtin_powil": float -> int -> float
+
+
+ "__builtin_return": int -> void
+
+
+ "__builtin_return_address": int -> int
+
+
+ "__builtin_sin": float -> float
+
+
+ "__builtin_sinf": float -> float
+
+
+ "__builtin_sinl": float -> float
+
+
+ "__builtin_sinh": float -> float
+
+
+ "__builtin_sinhf": float -> float
+
+
+ "__builtin_sinhl": float -> float
+
+
+ "__builtin_sqrt": float -> float
+
+
+ "__builtin_sqrtf": float -> float
+
+
+ "__builtin_sqrtl": float -> float
+
+
+ "__builtin_stpcpy": int -> int -> int
+
+
+ "__builtin_strchr": int -> int -> int
+
+
+ "__builtin_strcmp": int -> int -> int
+
+
+ "__builtin_strcpy": int -> int -> int
+
+
+ "__builtin_strcspn": int -> int -> int
+
+
+ "__builtin_strncat": int -> int -> int -> int
+
+
+ "__builtin_strncmp": int -> int -> int -> int
+
+
+ "__builtin_strncpy": int -> int -> int -> int
+
+
+ "__builtin_strspn": int -> int -> int
+
+
+ "__builtin_strpbrk": int -> int -> int
+
+
+ "__builtin_types_compatible_p": int -> int -> int
+
+
+ "__builtin_tan": float -> float
+
+
+ "__builtin_tanf": float -> float
+
+
+ "__builtin_tanl": float -> float
+
+
+ "__builtin_tanh": float -> float
+
+
+ "__builtin_tanhf": float -> float
+
+
+ "__builtin_tanhl": float -> float
+
+
+ "__builtin_va_end": int -> void
+
+
+ "__builtin_varargs_start": int -> void
+
+
+ "__builtin_va_start": int -> int -> void
+
+
+ "__builtin_stdarg_start": int -> void
+
+
+ "__builtin_va_arg": int -> int -> void
+
+
+ "__builtin_va_copy": int -> int -> void
+
+
+ "TB_Boucle"(%0, %1, %2, %3): int -> int -> int -> int -> void
+ locals: %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17
+ stacksize: 0
+ entry: TB_Boucle23
+ exit: TB_Boucle0
+
+ TB_Boucle9: load int32, add, %1, %11, %10 --> TB_Boucle8
+ TB_Boucle8: add %6, %9, %10 --> TB_Boucle7
+ TB_Boucle7: imm_int 4, %8, --> TB_Boucle6
+ TB_Boucle6: mul %7, %4, %8 --> TB_Boucle5
+ TB_Boucle5: store int32, add, %2, %7, %6 --> TB_Boucle4
+ TB_Boucle4: emit c1 --> TB_Boucle3
+ TB_Boucle3: imm_int 1, %5, --> TB_Boucle2
+ TB_Boucle23: emit c4 --> TB_Boucle22
+ TB_Boucle22: emit c3 --> TB_Boucle21
+ TB_Boucle21: imm_int 0, %4, --> TB_Boucle1
+ TB_Boucle20: imm_int 0, %16, --> TB_Boucle19
+ TB_Boucle2: add %4, %4, %5 --> TB_Boucle1
+ TB_Boucle19: emit c2 --> TB_Boucle18
+ TB_Boucle18: lt %17, %4, %3 --> TB_Boucle17
+ TB_Boucle17: notbool %15, %17 --> TB_Boucle16
+ TB_Boucle16: eq %15, %16 --> TB_Boucle15, TB_Boucle0
+ TB_Boucle15: emit c0 --> TB_Boucle14
+ TB_Boucle14: imm_int 4, %14, --> TB_Boucle13
+ TB_Boucle13: mul %13, %4, %14 --> TB_Boucle12
+ TB_Boucle12: load int32, add, %0, %13, %9 --> TB_Boucle11
+ TB_Boucle11: imm_int 4, %12, --> TB_Boucle10
+ TB_Boucle10: mul %11, %4, %12 --> TB_Boucle9
+ TB_Boucle1: --> TB_Boucle20
+ TB_Boucle0: return
+
+
+ "main"(): int
+ locals: %0, %1, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, %21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31, %32, %33, %34, %35, %36, %37, %38, %39, %40, %41, %42, %43, %44
+ result: %0
+ stacksize: 20
+ entry: main67
+ exit: main0
+
+ main9: imm_addr 0($sp), %7, --> main8
+ main8: imm_int 5, %8, --> main7
+ main7: call "TB_Boucle", %5, %6, %7, %8, %9: int -> int -> int -> int -> void --> main6
+ main67: imm_int 1, %44, --> main66
+ main66: store int32, 0("t1"), , %44 --> main65
+ main65: imm_int 2, %43, --> main64
+ main64: store int32, 4("t1"), , %43 --> main63
+ main63: imm_int 3, %42, --> main62
+ main62: store int32, 8("t1"), , %42 --> main61
+ main61: imm_int 5, %41, --> main60
+ main60: store int32, 12("t1"), , %41 --> main59
+ main6: emit c5 --> main5
+ main59: imm_int 8, %40, --> main58
+ main58: store int32, 16("t1"), , %40 --> main57
+ main57: imm_int 13, %39, --> main56
+ main56: store int32, 0("t2"), , %39 --> main55
+ main55: imm_int 21, %38, --> main54
+ main54: store int32, 4("t2"), , %38 --> main53
+ main53: imm_int 34, %37, --> main52
+ main52: store int32, 8("t2"), , %37 --> main51
+ main51: imm_int 55, %36, --> main50
+ main50: store int32, 12("t2"), , %36 --> main49
+ main5: imm_addr 0($sp), %1, --> main4
+ main49: imm_int 89, %35, --> main48
+ main48: store int32, 16("t2"), , %35 --> main47
+ main47: emit c11 --> main46
+ main46: imm_int 0, %30, --> main45
+ main45: imm_addr 0($sp), %31, --> main44
+ main44: imm_int 0, %33, --> main43
+ main43: imm_int 4, %34, --> main42
+ main42: mul %32, %33, %34 --> main41
+ main41: store int32, add, %31, %32, %30 --> main40
+ main40: emit c10 --> main39
+ main4: imm_int 4, %3, --> main3
+ main39: imm_int 0, %25, --> main38
+ main38: imm_addr 0($sp), %26, --> main37
+ main37: imm_int 1, %28, --> main36
+ main36: imm_int 4, %29, --> main35
+ main35: mul %27, %28, %29 --> main34
+ main34: store int32, add, %26, %27, %25 --> main33
+ main33: emit c9 --> main32
+ main32: imm_int 0, %20, --> main31
+ main31: imm_addr 0($sp), %21, --> main30
+ main30: imm_int 2, %23, --> main29
+ main3: imm_int 4, %4, --> main2
+ main29: imm_int 4, %24, --> main28
+ main28: mul %22, %23, %24 --> main27
+ main27: store int32, add, %21, %22, %20 --> main26
+ main26: emit c8 --> main25
+ main25: imm_int 0, %15, --> main24
+ main24: imm_addr 0($sp), %16, --> main23
+ main23: imm_int 3, %18, --> main22
+ main22: imm_int 4, %19, --> main21
+ main21: mul %17, %18, %19 --> main20
+ main20: store int32, add, %16, %17, %15 --> main19
+ main2: mul %2, %3, %4 --> main1
+ main19: emit c7 --> main18
+ main18: imm_int 0, %10, --> main17
+ main17: imm_addr 0($sp), %11, --> main16
+ main16: imm_int 4, %13, --> main15
+ main15: imm_int 4, %14, --> main14
+ main14: mul %12, %13, %14 --> main13
+ main13: store int32, add, %11, %12, %10 --> main12
+ main12: emit c6 --> main11
+ main11: imm_addr "t1", %5, --> main10
+ main10: imm_addr "t2", %6, --> main9
+ main1: load int32, add, %1, %2, %0 --> main0
+ main0: return %0
+
+
--- /dev/null
+int t1[5] = {1,2,3,5,8};\r
+int t2[5] = {13,21,34,55,89};\r
+\r
+void TB_Boucle (int tabEntree1[], int tabEntree2[],int tabSortie[], int size) {\r
+ int i;\r
+ for (i = 0; i < size; i++){\r
+ tabSortie[i] = tabEntree1[i]+tabEntree2[i];\r
+ }\r
+}\r
+\r
+int main(){\r
+ int out[5] = {0,0,0,0,0};\r
+ TB_Boucle(t1,t2,out,5);\r
+ return out[4];\r
+}\r
--- /dev/null
+int t1[5] = {1,2,3,5,8};\r
+int t2[5] = {13,21,34,55,89};\r
+\r
+void TB_Boucle (int tabEntree1[], int tabEntree2[],int tabSortie[], int size) {\r
+ int i;\r
+ for (i = 0; i < size; i++){\r
+ tabSortie[i] = tabEntree1[i]+tabEntree2[i];\r
+ }\r
+}\r
+\r
+int main(){\r
+ int out[5] = {0,0,0,0,0};\r
+ TB_Boucle(t1,t2,out,5);\r
+ return out[4];\r
+}\r
--- /dev/null
+Global Error (Translation RTLabs -> RTL):
+ Constant not supported.
--- /dev/null
+
+#define SIZE 5
+
+char min (char tab[], char size, char n) {
+ char i, min_index, min;
+
+ if (size == 0) return 0;
+
+ min_index = n;
+ min = tab[min_index];
+ for (i = n+1 ; i < size ; i++) {
+ if (tab[i] < min) {
+ min_index = i;
+ min = tab[min_index];
+ }
+ }
+
+ return min_index;
+}
+
+void swap (char tab[], char i, char j) {
+ char t;
+ t = tab[i] ; tab[i] = tab[j] ; tab[j] = t;
+}
+
+void bubble_sort(char tab[], char size) {
+ char i, min_index;
+
+ for (i = 0 ; i < size ; i++) {
+ min_index = min(tab, size, i);
+ swap(tab, i, min_index);
+ }
+}
+
+int main () {
+ char tab[] = {26, 21, 43, 62, 8};
+
+ bubble_sort(tab, SIZE);
+
+ return (tab[3]);
+}
--- /dev/null
+#define SIZE 5
+#define NB_FINDS 2
+
+// Searching for the values below
+int to_find[NB_FINDS] = {57, -1};
+
+int search (int tab[], int size, int to_find) {
+ int low = 0, high = size-1, i;
+
+ while (high >= low) {
+ i = (high+low) / 2;
+ if (tab[i] == to_find) return i;
+ if (tab[i] > to_find) high = i-1;
+ if (tab[i] < to_find) low = i+1;
+ }
+
+ return (-1);
+}
+
+int main () {
+ int tab[SIZE] = {-30, -18, 23, 57, 120};
+ int res;
+ int i;
+
+ for (i = 0 ; i < NB_FINDS ; i++)
+ println(search(tab, SIZE, to_find[i]));
+
+ return 0;
+}
--- /dev/null
+
+#define SIZE 5
+
+signed char tab1[SIZE] = {10, -3, 25, 56, -32};
+
+void copy (signed char dst[], signed char src[], signed char size) {
+ signed char i;
+
+ for (i = 0 ; i < size ; i++)
+ dst[i] = src[i];
+}
+
+void print_tab (signed char tab[], signed char size) {
+ signed char i;
+
+ for (i = 0 ; i < size ; i++) {
+ print_schar(tab[i]);
+ space();
+ }
+ newline();
+}
+
+signed char main () {
+ signed char tab2[SIZE];
+ signed char tab3[SIZE] = {0, 1, 2, 3, 4};
+
+ copy(tab2, tab1, SIZE);
+ copy(tab1, tab3, SIZE);
+
+ print_tab(tab1, SIZE);
+ print_tab(tab2, SIZE);
+ print_tab(tab3, SIZE);
+
+ return 0;
+}
--- /dev/null
+
+#define SIZE 5
+
+unsigned char tab1[SIZE] = {10, -3, 25, 56, -32};
+
+void copy (unsigned char dst[], unsigned char src[], unsigned char size) {
+ unsigned char i;
+
+ for (i = 0 ; i < size ; i++)
+ dst[i] = src[i];
+}
+
+void print_tab (unsigned char tab[], unsigned char size) {
+ unsigned char i;
+
+ for (i = 0 ; i < size ; i++) {
+ print_uchar(tab[i]);
+ space();
+ }
+ newline();
+}
+
+unsigned char main () {
+ unsigned char tab2[SIZE];
+ unsigned char tab3[SIZE] = {0, 1, 2, 3, 4};
+
+ copy(tab2, tab1, SIZE);
+ copy(tab1, tab3, SIZE);
+
+ print_tab(tab1, SIZE);
+ print_tab(tab2, SIZE);
+ print_tab(tab3, SIZE);
+
+ return 0;
+}
--- /dev/null
+
+#define SIZE 5
+
+signed char min (signed char tab[], signed char size, signed char n) {
+ signed char i, min_index, min;
+
+ if (size == 0) return 0;
+
+ min_index = n;
+ min = tab[min_index];
+ for (i = n+1 ; i < size ; i++) {
+ if (tab[i] < min) {
+ min_index = i;
+ min = tab[min_index];
+ }
+ }
+
+ return min_index;
+}
+
+void swap (signed char tab[], signed char i, signed char j) {
+ signed char t;
+ t = tab[i] ; tab[i] = tab[j] ; tab[j] = t;
+}
+
+void bubble_sort(signed char tab[], signed char size) {
+ signed char i, min_index;
+
+ for (i = 0 ; i < size ; i++) {
+ min_index = min(tab, size, i);
+ swap(tab, i, min_index);
+ }
+}
+
+void print_tab (signed char tab[], signed char size) {
+ signed char i;
+
+ for (i = 0 ; i < size ; i++) {
+ print_schar(tab[i]);
+ space();
+ }
+ newline();
+}
+
+signed char main () {
+ signed char tab[SIZE] = {26, -21, 43, -62, 8};
+
+ bubble_sort(tab, SIZE);
+ print_tab(tab, SIZE);
+
+ return 0;
+}
--- /dev/null
+
+#define SIZE 5
+
+unsigned char min (unsigned char tab[], unsigned char size, unsigned char n) {
+ unsigned char i, min_index, min;
+
+ if (size == 0) return 0;
+
+ min_index = n;
+ min = tab[min_index];
+ for (i = n+1 ; i < size ; i++) {
+ if (tab[i] < min) {
+ min_index = i;
+ min = tab[min_index];
+ }
+ }
+
+ return min_index;
+}
+
+void swap (unsigned char tab[], unsigned char i, unsigned char j) {
+ unsigned char t;
+ t = tab[i] ; tab[i] = tab[j] ; tab[j] = t;
+}
+
+void bubble_sort(unsigned char tab[], unsigned char size) {
+ unsigned char i, min_index;
+
+ for (i = 0 ; i < size ; i++) {
+ min_index = min(tab, size, i);
+ swap(tab, i, min_index);
+ }
+}
+
+void print_tab (unsigned char tab[], unsigned char size) {
+ unsigned char i;
+
+ for (i = 0 ; i < size ; i++) {
+ print_uchar(tab[i]);
+ space();
+ }
+ newline();
+}
+
+unsigned char main () {
+ unsigned char tab[SIZE] = {26, -21, 43, -62, 8};
+
+ bubble_sort(tab, SIZE);
+ print_tab(tab, SIZE);
+
+ return 0;
+}
--- /dev/null
+
+#define SIZE 5
+
+void swap (signed char a[], signed char i, signed char j) {
+ signed char t;
+ t = a[i] ; a[i] = a[j] ; a[j] = t;
+}
+
+signed char partition (signed char a[], signed char l, signed char r) {
+ signed char pivot, i, j;
+ pivot = a[l];
+ i = l; j = r+1;
+
+ while (1) {
+ while (i <= r && a[i] <= pivot) ++i;
+ do --j; while (a[j] > pivot);
+ if (i >= j) break;
+ swap(a, i, j);
+ }
+ swap(a, l, j);
+ return j;
+}
+
+void quicksort (signed char a[], signed char l, signed char r) {
+ signed char j;
+
+ if (l < r) {
+ j = partition(a, l, r);
+ quicksort(a, l, j-1);
+ quicksort(a, j+1, r);
+ }
+}
+
+void print_tab (signed char tab[], signed char size) {
+ signed char i;
+
+ for (i = 0 ; i < size ; i++) {
+ print_schar(tab[i]);
+ space();
+ }
+ newline();
+}
+
+signed char main () {
+ signed char tab[SIZE] = {26, -21, 43, -62, 8};
+
+ quicksort(tab, 0, SIZE-1);
+ print_tab(tab, SIZE);
+
+ return 0;
+}
--- /dev/null
+
+#define SIZE 5
+
+void swap (unsigned char a[], unsigned char i, unsigned char j) {
+ unsigned char t;
+ t = a[i] ; a[i] = a[j] ; a[j] = t;
+}
+
+unsigned char partition (unsigned char a[], unsigned char l, unsigned char r) {
+ unsigned char pivot, i, j;
+ pivot = a[l];
+ i = l; j = r+1;
+
+ while (1) {
+ while (i <= r && a[i] <= pivot) ++i;
+ do --j; while (a[j] > pivot);
+ if (i >= j) break;
+ swap(a, i, j);
+ }
+ swap(a, l, j);
+ return j;
+}
+
+void quicksort (unsigned char a[], unsigned char l, unsigned char r) {
+ unsigned char j;
+
+ if (l < r) {
+ j = partition(a, l, r);
+ quicksort(a, l, j-1);
+ quicksort(a, j+1, r);
+ }
+}
+
+void print_tab (unsigned char tab[], unsigned char size) {
+ unsigned char i;
+
+ for (i = 0 ; i < size ; i++) {
+ print_uchar(tab[i]);
+ space();
+ }
+ newline();
+}
+
+unsigned char main () {
+ unsigned char tab[SIZE] = {26, -21, 43, -62, 8};
+
+ quicksort(tab, 0, SIZE-1);
+ print_tab(tab, SIZE);
+
+ return 0;
+}
--- /dev/null
+#define SIZE 5
+#define NB_FINDS 2
+
+// Searching for the values below
+signed char to_find[NB_FINDS] = {57, -1};
+
+signed char search (signed char tab[], signed char size, signed char to_find) {
+ signed char low = 0, high = size-1, i;
+
+ while (high >= low) {
+ i = (high+low) / 2;
+ if (tab[i] == to_find) return i;
+ if (tab[i] > to_find) high = i-1;
+ if (tab[i] < to_find) low = i+1;
+ }
+
+ return (-1);
+}
+
+signed char main () {
+ signed char tab[SIZE] = {-30, -18, 23, 57, 120};
+ signed char res;
+ signed char i;
+
+ for (i = 0 ; i < NB_FINDS ; i++) {
+ print_schar(search(tab, SIZE, to_find[i]));
+ space();
+ }
+ newline();
+
+ return 0;
+}
--- /dev/null
+
+typedef struct foo {
+ signed char dummy;
+ signed char x;
+} foo;
+
+foo *p;
+foo save;
+
+signed char fact1 (signed char x) {
+ if (x <= 1) return 1;
+ return (x * fact1(x-1));
+}
+
+signed char fact2 (signed char x) {
+ signed char i, res = 1;
+
+ for (i = 1 ; i <= x ; i++)
+ res *= i;
+
+ return res;
+}
+
+signed char main () {
+ foo x, y;
+ foo* q[3];
+
+ x.x = 5;
+
+ q[1] = &x;
+ p = &x;
+ save = x;
+ x.x = fact1(save.x);
+ y.x = fact2(save.x);
+
+ print_schar((*(q[1])).x == y.x);
+ newline();
+
+ return 0;
+}
--- /dev/null
+
+typedef struct foo {
+ unsigned char dummy;
+ unsigned char x;
+} foo;
+
+foo *p;
+foo save;
+
+unsigned char fact1 (unsigned char x) {
+ if (x <= 1) return 1;
+ return (x * fact1(x-1));
+}
+
+unsigned char fact2 (unsigned char x) {
+ unsigned char i, res = 1;
+
+ for (i = 1 ; i <= x ; i++)
+ res *= i;
+
+ return res;
+}
+
+unsigned char main () {
+ foo x, y;
+ foo* q[3];
+
+ x.x = 5;
+
+ q[1] = &x;
+ p = &x;
+ save = x;
+ x.x = fact1(save.x);
+ y.x = fact2(save.x);
+
+ print_uchar((*(q[1])).x == y.x);
+ newline();
+
+ return 0;
+}
--- /dev/null
+program:
+
+
+ globals:
+ "tab1" { int32[5] }
+
+
+ extern "print_sint": int4s -> void
+
+
+ extern "newline": void
+
+
+ extern "space": void
+
+
+ "copy"(ptr %0, ptr %1, int4s %2)
+ locals: int4s %3, int4s %5, ptr %6, int4s %7, ptr %8, int4s %9, int4s %10, int4s %11, int4s %12, int4s %13, int4s %14, int1s %15
+ result: void %4
+ stacksize: struct {}
+ entry: copy19
+ exit: copy0
+
+ copy9: imm %10, imm_sizeof (int32) --> copy8
+ copy8: mul %9, %3, %10 --> copy7
+ copy7: addp %8, %1, %9 --> copy6
+ copy6: load int32, %8, %7 --> copy5
+ copy5: store int32, %6, %7 --> copy4
+ copy4: imm %5, imm_int 1 --> copy3
+ copy3: add %3, %3, %5 --> copy2
+ copy2: --> copy16
+ copy19: emit _cost2 --> copy18
+ copy18: imm %15, imm_int 0 --> copy17
+ copy17: int1sto4 %3, %15 --> copy2
+ copy16: lt %14, %3, %2 --> copy15
+ copy15: notbool %13, %14 --> copy14
+ copy14: %13? --> copy1, copy13
+ copy13: emit _cost0 --> copy12
+ copy12: imm %12, imm_sizeof (int32) --> copy11
+ copy11: mul %11, %3, %12 --> copy10
+ copy10: addp %6, %0, %11 --> copy9
+ copy1: emit _cost1 --> copy0
+ copy0: return
+
+
+ "print_tab"(ptr %0, int4s %1)
+ locals: int4s %2, int1u %4, int4s %5, int1u %6, int4s %7, int1u %8, ptr %9, int4s %10, int4s %11, int4s %12, int4s %13, int1s %14
+ result: void %3
+ stacksize: struct {}
+ entry: print_tab18
+ exit: print_tab0
+
+ print_tab9: addp %9, %0, %10 --> print_tab8
+ print_tab8: load int32, %9, %7 --> print_tab7
+ print_tab7: call "print_sint", [%7], %8: int4s -> void --> print_tab6
+ print_tab6: call "space", [], %6: void --> print_tab5
+ print_tab5: imm %5, imm_int 1 --> print_tab4
+ print_tab4: add %2, %2, %5 --> print_tab3
+ print_tab3: --> print_tab15
+ print_tab2: emit _cost4 --> print_tab1
+ print_tab18: emit _cost5 --> print_tab17
+ print_tab17: imm %14, imm_int 0 --> print_tab16
+ print_tab16: int1sto4 %2, %14 --> print_tab3
+ print_tab15: lt %13, %2, %1 --> print_tab14
+ print_tab14: notbool %12, %13 --> print_tab13
+ print_tab13: %12? --> print_tab2, print_tab12
+ print_tab12: emit _cost3 --> print_tab11
+ print_tab11: imm %11, imm_sizeof (int32) --> print_tab10
+ print_tab10: mul %10, %2, %11 --> print_tab9
+ print_tab1: call "newline", [], %4: void --> print_tab0
+ print_tab0: return
+
+
+ "main"()
+ locals: int1s %1, ptr %2, int4s %3, int1u %4, int1s %5, ptr %6, offset %7, ptr %8, int4s %9, int1u %10, int1s %11, ptr %12, offset %13, ptr %14, int4s %15, int1u %16, int1s %17, ptr %18, ptr %19, int4s %20, int1u %21, int1s %22, ptr %23, offset %24, ptr %25, ptr %26, int4s %27, int1u %28, int1s %29, ptr %30, offset %31, ptr %32, int4s %33, int1s %34, ptr %35, int1s %36, int1s %37, int1s %38, ptr %39, offset %40, ptr %41, int4s %42, int1s %43, ptr %44, int1s %45, int1s %46, int1s %47, ptr %48, offset %49, ptr %50, int4s %51, int1s %52, ptr %53, int1s %54, int1s %55, int1s %56, ptr %57, offset %58, ptr %59, int4s %60, int1s %61, ptr %62, int1s %63, int1s %64, int1s %65, ptr %66, offset %67, ptr %68, int4s %69, int1s %70, ptr %71, int1s %72, int1s %73, int1s %74, ptr %75, offset %76, ptr %77, int4u %78, ptr %79, offset %80, offset %81, offset %82, ptr %83, int4u %84, ptr %85, offset %86, offset %87, offset %88, ptr %89, int4u %90, ptr %91, offset %92, offset %93, offset %94, ptr %95, int4u %96, ptr %97, offset %98, offset %99, offset %100, ptr %101, int4u %102, ptr %103, offset %104, offset %105, offset %106
+ result: int4s %0
+ stacksize: struct {int32[5], int32[5]}
+ entry: main118
+ exit: main0
+
+ main99: imm %90, imm_int 25 --> main98
+ main98: store int32, %89, %90 --> main97
+ main97: imm %85, imm_addr "tab1" --> main96
+ main96: imm %87, imm_int 0 --> main95
+ main95: imm %88, imm_offset { int32[5], 3 } --> main94
+ main94: add %86, %87, %88 --> main93
+ main93: addp %83, %85, %86 --> main92
+ main92: imm %84, imm_int 56 --> main91
+ main91: store int32, %83, %84 --> main90
+ main90: imm %79, imm_addr "tab1" --> main89
+ main9: call "print_tab", [%8, %9], %10: ptr -> int4s -> void --> main8
+ main89: imm %81, imm_int 0 --> main88
+ main88: imm %82, imm_offset { int32[5], 4 } --> main87
+ main87: add %80, %81, %82 --> main86
+ main86: addp %77, %79, %80 --> main85
+ main85: imm %78, imm_int -32 --> main84
+ main84: store int32, %77, %78 --> main83
+ main83: emit _cost6 --> main82
+ main82: imm %75, imm_addr STACK --> main81
+ main81: imm %76, imm_offset { struct {int32[5], int32[5]}, 1 } --> main80
+ main80: addp %71, %75, %76 --> main79
+ main8: imm %6, imm_addr STACK --> main7
+ main79: imm %73, imm_int 0 --> main78
+ main78: imm %74, imm_sizeof (int32) --> main77
+ main77: mul %72, %73, %74 --> main76
+ main76: addp %68, %71, %72 --> main75
+ main75: imm %70, imm_int 0 --> main74
+ main74: int1sto4 %69, %70 --> main73
+ main73: store int32, %68, %69 --> main72
+ main72: imm %66, imm_addr STACK --> main71
+ main71: imm %67, imm_offset { struct {int32[5], int32[5]}, 1 } --> main70
+ main70: addp %62, %66, %67 --> main69
+ main7: imm %7, imm_offset { struct {int32[5], int32[5]}, 1 } --> main6
+ main69: imm %64, imm_int 1 --> main68
+ main68: imm %65, imm_sizeof (int32) --> main67
+ main67: mul %63, %64, %65 --> main66
+ main66: addp %59, %62, %63 --> main65
+ main65: imm %61, imm_int 1 --> main64
+ main64: int1sto4 %60, %61 --> main63
+ main63: store int32, %59, %60 --> main62
+ main62: imm %57, imm_addr STACK --> main61
+ main61: imm %58, imm_offset { struct {int32[5], int32[5]}, 1 } --> main60
+ main60: addp %53, %57, %58 --> main59
+ main6: addp %2, %6, %7 --> main5
+ main59: imm %55, imm_int 2 --> main58
+ main58: imm %56, imm_sizeof (int32) --> main57
+ main57: mul %54, %55, %56 --> main56
+ main56: addp %50, %53, %54 --> main55
+ main55: imm %52, imm_int 2 --> main54
+ main54: int1sto4 %51, %52 --> main53
+ main53: store int32, %50, %51 --> main52
+ main52: imm %48, imm_addr STACK --> main51
+ main51: imm %49, imm_offset { struct {int32[5], int32[5]}, 1 } --> main50
+ main50: addp %44, %48, %49 --> main49
+ main5: imm %5, imm_int 5 --> main4
+ main49: imm %46, imm_int 3 --> main48
+ main48: imm %47, imm_sizeof (int32) --> main47
+ main47: mul %45, %46, %47 --> main46
+ main46: addp %41, %44, %45 --> main45
+ main45: imm %43, imm_int 3 --> main44
+ main44: int1sto4 %42, %43 --> main43
+ main43: store int32, %41, %42 --> main42
+ main42: imm %39, imm_addr STACK --> main41
+ main41: imm %40, imm_offset { struct {int32[5], int32[5]}, 1 } --> main40
+ main40: addp %35, %39, %40 --> main39
+ main4: int1sto4 %3, %5 --> main3
+ main39: imm %37, imm_int 4 --> main38
+ main38: imm %38, imm_sizeof (int32) --> main37
+ main37: mul %36, %37, %38 --> main36
+ main36: addp %32, %35, %36 --> main35
+ main35: imm %34, imm_int 4 --> main34
+ main34: int1sto4 %33, %34 --> main33
+ main33: store int32, %32, %33 --> main32
+ main32: imm %30, imm_addr STACK --> main31
+ main31: imm %31, imm_offset { struct {int32[5]}, 0 } --> main30
+ main30: addp %25, %30, %31 --> main29
+ main3: call "print_tab", [%2, %3], %4: ptr -> int4s -> void --> main2
+ main29: imm %26, imm_addr "tab1" --> main28
+ main28: imm %29, imm_int 5 --> main27
+ main27: int1sto4 %27, %29 --> main26
+ main26: call "copy", [%25, %26, %27], %28: ptr -> ptr -> int4s -> void --> main25
+ main25: imm %18, imm_addr "tab1" --> main24
+ main24: imm %23, imm_addr STACK --> main23
+ main23: imm %24, imm_offset { struct {int32[5], int32[5]}, 1 } --> main22
+ main22: addp %19, %23, %24 --> main21
+ main21: imm %22, imm_int 5 --> main20
+ main20: int1sto4 %20, %22 --> main19
+ main2: imm %1, imm_int 0 --> main1
+ main19: call "copy", [%18, %19, %20], %21: ptr -> ptr -> int4s -> void --> main18
+ main18: imm %14, imm_addr "tab1" --> main17
+ main17: imm %17, imm_int 5 --> main16
+ main16: int1sto4 %15, %17 --> main15
+ main15: call "print_tab", [%14, %15], %16: ptr -> int4s -> void --> main14
+ main14: imm %12, imm_addr STACK --> main13
+ main13: imm %13, imm_offset { struct {int32[5]}, 0 } --> main12
+ main12: addp %8, %12, %13 --> main11
+ main118: imm %103, imm_addr "tab1" --> main117
+ main117: imm %105, imm_int 0 --> main116
+ main116: imm %106, imm_offset { int32[5], 0 } --> main115
+ main115: add %104, %105, %106 --> main114
+ main114: addp %101, %103, %104 --> main113
+ main113: imm %102, imm_int 10 --> main112
+ main112: store int32, %101, %102 --> main111
+ main111: imm %97, imm_addr "tab1" --> main110
+ main110: imm %99, imm_int 0 --> main109
+ main11: imm %11, imm_int 5 --> main10
+ main109: imm %100, imm_offset { int32[5], 1 } --> main108
+ main108: add %98, %99, %100 --> main107
+ main107: addp %95, %97, %98 --> main106
+ main106: imm %96, imm_int -3 --> main105
+ main105: store int32, %95, %96 --> main104
+ main104: imm %91, imm_addr "tab1" --> main103
+ main103: imm %93, imm_int 0 --> main102
+ main102: imm %94, imm_offset { int32[5], 2 } --> main101
+ main101: add %92, %93, %94 --> main100
+ main100: addp %89, %91, %92 --> main99
+ main10: int1sto4 %9, %11 --> main9
+ main1: int1sto4 %0, %1 --> main0
+ main0: return %0
+
+
--- /dev/null
+
+#define SIZE 5
+
+int tab1[SIZE] = {10, -3, 25, 56, -32};
+
+void copy (int dst[], int src[], int size) {
+ int i;
+
+ for (i = 0 ; i < size ; i++)
+ dst[i] = src[i];
+}
+
+void print_tab (int tab[], int size) {
+ int i;
+
+ for (i = 0 ; i < size ; i++) {
+ print_sint(tab[i]);
+ space();
+ }
+ newline();
+}
+
+int main () {
+ int tab2[SIZE];
+ int tab3[SIZE] = {0, 1, 2, 3, 4};
+
+ copy(tab2, tab1, SIZE);
+ copy(tab1, tab3, SIZE);
+
+ print_tab(tab1, SIZE);
+ print_tab(tab2, SIZE);
+ print_tab(tab3, SIZE);
+
+ return 0;
+}
--- /dev/null
+program:
+
+
+ globals:
+
+
+ extern "print_sint": int4s -> void
+
+
+ extern "newline": void
+
+
+ extern "space": void
+
+
+ "min"(ptr %0, int4s %1, int4s %2)
+ locals: int4s %3, int4s %4, int4s %5, int4s %7, ptr %8, int4s %9, int4s %10, int4s %11, int4s %12, ptr %13, int4s %14, int4s %15, int4s %16, int4s %17, int4s %18, ptr %19, int4s %20, int4s %21, int1s %22, int4s %23, int4s %24
+ result: int4s %6
+ stacksize: struct {}
+ entry: min37
+ exit: min0
+
+ min9: mul %9, %5, %10 --> min8
+ min8: addp %8, %0, %9 --> min7
+ min7: load int32, %8, %4 --> min5
+ min6: emit _cost1 --> min5
+ min5: imm %7, imm_int 1 --> min4
+ min4: add %3, %3, %7 --> min3
+ min37: emit _cost6 --> min36
+ min36: imm %24, imm_int 0 --> min35
+ min35: eq %23, %1, %24 --> min34
+ min34: %23? --> min33, min30
+ min33: emit _cost4 --> min32
+ min32: imm %22, imm_int 0 --> min31
+ min31: int1sto4 %6, %22 --> min0
+ min30: emit _cost5 --> min29
+ min3: --> min22
+ min29: id %5, %2 --> min28
+ min28: imm %21, imm_sizeof (int32) --> min27
+ min27: mul %20, %5, %21 --> min26
+ min26: addp %19, %0, %20 --> min25
+ min25: load int32, %19, %4 --> min24
+ min24: imm %18, imm_int 1 --> min23
+ min23: add %3, %2, %18 --> min3
+ min22: lt %17, %3, %1 --> min21
+ min21: notbool %16, %17 --> min20
+ min20: %16? --> min2, min19
+ min2: emit _cost3 --> min1
+ min19: emit _cost2 --> min18
+ min18: imm %15, imm_sizeof (int32) --> min17
+ min17: mul %14, %3, %15 --> min16
+ min16: addp %13, %0, %14 --> min15
+ min15: load int32, %13, %12 --> min14
+ min14: lt %11, %12, %4 --> min13
+ min13: %11? --> min12, min6
+ min12: emit _cost0 --> min11
+ min11: id %5, %3 --> min10
+ min10: imm %10, imm_sizeof (int32) --> min9
+ min1: id %6, %5 --> min0
+ min0: return %6
+
+
+ "swap"(ptr %0, int4s %1, int4s %2)
+ locals: int4s %3, ptr %5, int4s %6, int4s %7, ptr %8, int4s %9, ptr %10, int4s %11, int4s %12, int4s %13, int4s %14, ptr %15, int4s %16, int4s %17
+ result: void %4
+ stacksize: struct {}
+ entry: swap17
+ exit: swap0
+
+ swap9: imm %12, imm_sizeof (int32) --> swap8
+ swap8: mul %11, %2, %12 --> swap7
+ swap7: addp %10, %0, %11 --> swap6
+ swap6: load int32, %10, %9 --> swap5
+ swap5: store int32, %8, %9 --> swap4
+ swap4: imm %7, imm_sizeof (int32) --> swap3
+ swap3: mul %6, %2, %7 --> swap2
+ swap2: addp %5, %0, %6 --> swap1
+ swap17: emit _cost7 --> swap16
+ swap16: imm %17, imm_sizeof (int32) --> swap15
+ swap15: mul %16, %1, %17 --> swap14
+ swap14: addp %15, %0, %16 --> swap13
+ swap13: load int32, %15, %3 --> swap12
+ swap12: imm %14, imm_sizeof (int32) --> swap11
+ swap11: mul %13, %1, %14 --> swap10
+ swap10: addp %8, %0, %13 --> swap9
+ swap1: store int32, %5, %3 --> swap0
+ swap0: return
+
+
+ "bubble_sort"(ptr %0, int4s %1)
+ locals: int4s %2, int4s %3, int4s %4, int4s %6, int1u %7, int4s %8, int4s %9, int1s %10
+ result: void %5
+ stacksize: struct {}
+ entry: bubble_sort14
+ exit: bubble_sort0
+
+ bubble_sort9: %8? --> bubble_sort1, bubble_sort8
+ bubble_sort8: emit _cost8 --> bubble_sort7
+ bubble_sort7: call "min", [%0, %1, %2], %4: ptr -> int4s -> int4s -> int4s --> bubble_sort6
+ bubble_sort6: id %3, %4 --> bubble_sort5
+ bubble_sort5: call "swap", [%0, %2, %3], %7: ptr -> int4s -> int4s -> void --> bubble_sort4
+ bubble_sort4: imm %6, imm_int 1 --> bubble_sort3
+ bubble_sort3: add %2, %2, %6 --> bubble_sort2
+ bubble_sort2: --> bubble_sort11
+ bubble_sort14: emit _cost10 --> bubble_sort13
+ bubble_sort13: imm %10, imm_int 0 --> bubble_sort12
+ bubble_sort12: int1sto4 %2, %10 --> bubble_sort2
+ bubble_sort11: lt %9, %2, %1 --> bubble_sort10
+ bubble_sort10: notbool %8, %9 --> bubble_sort9
+ bubble_sort1: emit _cost9 --> bubble_sort0
+ bubble_sort0: return
+
+
+ "print_tab"(ptr %0, int4s %1)
+ locals: int4s %2, int1u %4, int4s %5, int1u %6, int4s %7, int1u %8, ptr %9, int4s %10, int4s %11, int4s %12, int4s %13, int1s %14
+ result: void %3
+ stacksize: struct {}
+ entry: print_tab18
+ exit: print_tab0
+
+ print_tab9: addp %9, %0, %10 --> print_tab8
+ print_tab8: load int32, %9, %7 --> print_tab7
+ print_tab7: call "print_sint", [%7], %8: int4s -> void --> print_tab6
+ print_tab6: call "space", [], %6: void --> print_tab5
+ print_tab5: imm %5, imm_int 1 --> print_tab4
+ print_tab4: add %2, %2, %5 --> print_tab3
+ print_tab3: --> print_tab15
+ print_tab2: emit _cost12 --> print_tab1
+ print_tab18: emit _cost13 --> print_tab17
+ print_tab17: imm %14, imm_int 0 --> print_tab16
+ print_tab16: int1sto4 %2, %14 --> print_tab3
+ print_tab15: lt %13, %2, %1 --> print_tab14
+ print_tab14: notbool %12, %13 --> print_tab13
+ print_tab13: %12? --> print_tab2, print_tab12
+ print_tab12: emit _cost11 --> print_tab11
+ print_tab11: imm %11, imm_sizeof (int32) --> print_tab10
+ print_tab10: mul %10, %2, %11 --> print_tab9
+ print_tab1: call "newline", [], %4: void --> print_tab0
+ print_tab0: return
+
+
+ "main"()
+ locals: int1s %1, ptr %2, int4s %3, int1u %4, int1s %5, ptr %6, offset %7, ptr %8, int4s %9, int1u %10, int1s %11, ptr %12, offset %13, ptr %14, int4s %15, int1s %16, ptr %17, int1s %18, int1s %19, int1s %20, ptr %21, offset %22, ptr %23, int4s %24, int1s %25, int1s %26, ptr %27, int1s %28, int1s %29, int1s %30, ptr %31, offset %32, ptr %33, int4s %34, int1s %35, ptr %36, int1s %37, int1s %38, int1s %39, ptr %40, offset %41, ptr %42, int4s %43, int1s %44, int1s %45, ptr %46, int1s %47, int1s %48, int1s %49, ptr %50, offset %51, ptr %52, int4s %53, int1s %54, ptr %55, int1s %56, int1s %57, int1s %58, ptr %59, offset %60
+ result: int4s %0
+ stacksize: struct {int32[5]}
+ entry: main67
+ exit: main0
+
+ main9: call "bubble_sort", [%8, %9], %10: ptr -> int4s -> void --> main8
+ main8: imm %6, imm_addr STACK --> main7
+ main7: imm %7, imm_offset { struct {int32[5]}, 0 } --> main6
+ main67: emit _cost14 --> main66
+ main66: imm %59, imm_addr STACK --> main65
+ main65: imm %60, imm_offset { struct {int32[5]}, 0 } --> main64
+ main64: addp %55, %59, %60 --> main63
+ main63: imm %57, imm_int 0 --> main62
+ main62: imm %58, imm_sizeof (int32) --> main61
+ main61: mul %56, %57, %58 --> main60
+ main60: addp %52, %55, %56 --> main59
+ main6: addp %2, %6, %7 --> main5
+ main59: imm %54, imm_int 26 --> main58
+ main58: int1sto4 %53, %54 --> main57
+ main57: store int32, %52, %53 --> main56
+ main56: imm %50, imm_addr STACK --> main55
+ main55: imm %51, imm_offset { struct {int32[5]}, 0 } --> main54
+ main54: addp %46, %50, %51 --> main53
+ main53: imm %48, imm_int 1 --> main52
+ main52: imm %49, imm_sizeof (int32) --> main51
+ main51: mul %47, %48, %49 --> main50
+ main50: addp %42, %46, %47 --> main49
+ main5: imm %5, imm_int 5 --> main4
+ main49: imm %45, imm_int 21 --> main48
+ main48: negint %44, %45 --> main47
+ main47: int1sto4 %43, %44 --> main46
+ main46: store int32, %42, %43 --> main45
+ main45: imm %40, imm_addr STACK --> main44
+ main44: imm %41, imm_offset { struct {int32[5]}, 0 } --> main43
+ main43: addp %36, %40, %41 --> main42
+ main42: imm %38, imm_int 2 --> main41
+ main41: imm %39, imm_sizeof (int32) --> main40
+ main40: mul %37, %38, %39 --> main39
+ main4: int1sto4 %3, %5 --> main3
+ main39: addp %33, %36, %37 --> main38
+ main38: imm %35, imm_int 43 --> main37
+ main37: int1sto4 %34, %35 --> main36
+ main36: store int32, %33, %34 --> main35
+ main35: imm %31, imm_addr STACK --> main34
+ main34: imm %32, imm_offset { struct {int32[5]}, 0 } --> main33
+ main33: addp %27, %31, %32 --> main32
+ main32: imm %29, imm_int 3 --> main31
+ main31: imm %30, imm_sizeof (int32) --> main30
+ main30: mul %28, %29, %30 --> main29
+ main3: call "print_tab", [%2, %3], %4: ptr -> int4s -> void --> main2
+ main29: addp %23, %27, %28 --> main28
+ main28: imm %26, imm_int 62 --> main27
+ main27: negint %25, %26 --> main26
+ main26: int1sto4 %24, %25 --> main25
+ main25: store int32, %23, %24 --> main24
+ main24: imm %21, imm_addr STACK --> main23
+ main23: imm %22, imm_offset { struct {int32[5]}, 0 } --> main22
+ main22: addp %17, %21, %22 --> main21
+ main21: imm %19, imm_int 4 --> main20
+ main20: imm %20, imm_sizeof (int32) --> main19
+ main2: imm %1, imm_int 0 --> main1
+ main19: mul %18, %19, %20 --> main18
+ main18: addp %14, %17, %18 --> main17
+ main17: imm %16, imm_int 8 --> main16
+ main16: int1sto4 %15, %16 --> main15
+ main15: store int32, %14, %15 --> main14
+ main14: imm %12, imm_addr STACK --> main13
+ main13: imm %13, imm_offset { struct {int32[5]}, 0 } --> main12
+ main12: addp %8, %12, %13 --> main11
+ main11: imm %11, imm_int 5 --> main10
+ main10: int1sto4 %9, %11 --> main9
+ main1: int1sto4 %0, %1 --> main0
+ main0: return %0
+
+
--- /dev/null
+
+#define SIZE 5
+
+int min (int tab[], int size, int n) {
+ int i, min_index, min;
+
+ if (size == 0) return 0;
+
+ min_index = n;
+ min = tab[min_index];
+ for (i = n+1 ; i < size ; i++) {
+ if (tab[i] < min) {
+ min_index = i;
+ min = tab[min_index];
+ }
+ }
+
+ return min_index;
+}
+
+void swap (int tab[], int i, int j) {
+ int t;
+ t = tab[i] ; tab[i] = tab[j] ; tab[j] = t;
+}
+
+void bubble_sort(int tab[], int size) {
+ int i, min_index;
+
+ for (i = 0 ; i < size ; i++) {
+ min_index = min(tab, size, i);
+ swap(tab, i, min_index);
+ }
+}
+
+void print_tab (int tab[], int size) {
+ int i;
+
+ for (i = 0 ; i < size ; i++) {
+ print_sint(tab[i]);
+ space();
+ }
+ newline();
+}
+
+int main () {
+ int tab[SIZE] = {26, -21, 43, -62, 8};
+
+ bubble_sort(tab, SIZE);
+ print_tab(tab, SIZE);
+
+ return 0;
+}
--- /dev/null
+
+int f () { return 0; }
+
+int main () { return (f()); }
--- /dev/null
+program:
+
+
+ globals:
+
+
+ extern "print_sint": int4s -> void
+
+
+ extern "newline": void
+
+
+ extern "space": void
+
+
+ "swap"(ptr %0, int4s %1, int4s %2)
+ locals: int4s %3, ptr %5, int4s %6, int4s %7, ptr %8, int4s %9, ptr %10, int4s %11, int4s %12, int4s %13, int4s %14, ptr %15, int4s %16, int4s %17
+ result: void %4
+ stacksize: struct {}
+ entry: swap17
+ exit: swap0
+
+ swap9: imm %12, imm_sizeof (int32) --> swap8
+ swap8: mul %11, %2, %12 --> swap7
+ swap7: addp %10, %0, %11 --> swap6
+ swap6: load int32, %10, %9 --> swap5
+ swap5: store int32, %8, %9 --> swap4
+ swap4: imm %7, imm_sizeof (int32) --> swap3
+ swap3: mul %6, %2, %7 --> swap2
+ swap2: addp %5, %0, %6 --> swap1
+ swap17: emit _cost0 --> swap16
+ swap16: imm %17, imm_sizeof (int32) --> swap15
+ swap15: mul %16, %1, %17 --> swap14
+ swap14: addp %15, %0, %16 --> swap13
+ swap13: load int32, %15, %3 --> swap12
+ swap12: imm %14, imm_sizeof (int32) --> swap11
+ swap11: mul %13, %1, %14 --> swap10
+ swap10: addp %8, %0, %13 --> swap9
+ swap1: store int32, %5, %3 --> swap0
+ swap0: return
+
+
+ "partition"(ptr %0, int4s %1, int4s %2)
+ locals: int4s %3, int4s %4, int4s %5, int1u %7, int1u %8, int4s %9, int4s %10, int4s %11, int4s %12, ptr %13, int4s %14, int4s %15, int4s %16, int4s %17, int4s %18, int4s %19, int4s %20, int4s %21, ptr %22, int4s %23, int4s %24, int4s %25, int1s %26, int1s %27, int4s %28, ptr %29, int4s %30, int4s %31
+ result: int4s %6
+ stacksize: struct {}
+ entry: partition55
+ exit: partition0
+
+ partition9: ge %9, %3, %4 --> partition8
+ partition8: %9? --> partition7, partition6
+ partition7: emit _cost1 --> partition3
+ partition6: emit _cost2 --> partition5
+ partition55: emit _cost13 --> partition54
+ partition54: imm %31, imm_sizeof (int32) --> partition53
+ partition53: mul %30, %1, %31 --> partition52
+ partition52: addp %29, %0, %30 --> partition51
+ partition51: load int32, %29, %5 --> partition50
+ partition50: id %3, %1 --> partition49
+ partition5: call "swap", [%0, %3, %4], %8: ptr -> int4s -> int4s -> void --> partition4
+ partition49: imm %28, imm_int 1 --> partition48
+ partition48: add %4, %2, %28 --> partition4
+ partition47: imm %27, imm_int 1 --> partition46
+ partition46: notbool %26, %27 --> partition45
+ partition45: %26? --> partition3, partition44
+ partition44: emit _cost11 --> partition23
+ partition43: le %25, %3, %2 --> partition42
+ partition42: %25? --> partition41, partition30
+ partition41: emit _cost8 --> partition40
+ partition40: imm %24, imm_sizeof (int32) --> partition39
+ partition4: --> partition47
+ partition39: mul %23, %3, %24 --> partition38
+ partition38: addp %22, %0, %23 --> partition37
+ partition37: load int32, %22, %21 --> partition36
+ partition36: le %20, %21, %5 --> partition35
+ partition35: %20? --> partition34, partition32
+ partition34: emit _cost6 --> partition33
+ partition33: imm %19, imm_int 1 --> partition28
+ partition32: emit _cost7 --> partition31
+ partition31: imm %19, imm_int 0 --> partition28
+ partition30: emit _cost9 --> partition29
+ partition3: emit _cost12 --> partition2
+ partition29: imm %19, imm_int 0 --> partition28
+ partition28: notbool %18, %19 --> partition27
+ partition27: %18? --> partition22, partition26
+ partition26: emit _cost5 --> partition25
+ partition25: imm %17, imm_int 1 --> partition24
+ partition24: add %3, %3, %17 --> partition23
+ partition23: --> partition43
+ partition22: emit _cost10 --> partition11
+ partition21: emit _cost3 --> partition20
+ partition20: imm %16, imm_int 1 --> partition19
+ partition2: call "swap", [%0, %1, %4], %7: ptr -> int4s -> int4s -> void --> partition1
+ partition19: sub %4, %4, %16 --> partition18
+ partition18: imm %15, imm_sizeof (int32) --> partition17
+ partition17: mul %14, %4, %15 --> partition16
+ partition16: addp %13, %0, %14 --> partition15
+ partition15: load int32, %13, %12 --> partition14
+ partition14: gt %11, %12, %5 --> partition13
+ partition13: notbool %10, %11 --> partition12
+ partition12: %10? --> partition10, partition11
+ partition11: --> partition21
+ partition10: emit _cost4 --> partition9
+ partition1: id %6, %4 --> partition0
+ partition0: return %6
+
+
+ "quicksort"(ptr %0, int4s %1, int4s %2)
+ locals: int4s %3, int4s %4, int4s %6, int1u %7, int4s %8, int4s %9, int1u %10, int4s %11, int4s %12
+ result: void %5
+ stacksize: struct {}
+ entry: quicksort13
+ exit: quicksort0
+
+ quicksort9: call "partition", [%0, %1, %2], %4: ptr -> int4s -> int4s -> int4s --> quicksort8
+ quicksort8: id %3, %4 --> quicksort7
+ quicksort7: imm %11, imm_int 1 --> quicksort6
+ quicksort6: sub %9, %3, %11 --> quicksort5
+ quicksort5: call "quicksort", [%0, %1, %9], %10: ptr -> int4s -> int4s -> void --> quicksort4
+ quicksort4: imm %8, imm_int 1 --> quicksort3
+ quicksort3: add %6, %3, %8 --> quicksort2
+ quicksort2: call "quicksort", [%0, %6, %2], %7: ptr -> int4s -> int4s -> void --> quicksort0
+ quicksort13: emit _cost16 --> quicksort12
+ quicksort12: lt %12, %1, %2 --> quicksort11
+ quicksort11: %12? --> quicksort10, quicksort1
+ quicksort10: emit _cost14 --> quicksort9
+ quicksort1: emit _cost15 --> quicksort0
+ quicksort0: return
+
+
+ "print_tab"(ptr %0, int4s %1)
+ locals: int4s %2, int1u %4, int4s %5, int1u %6, int4s %7, int1u %8, ptr %9, int4s %10, int4s %11, int4s %12, int4s %13, int1s %14
+ result: void %3
+ stacksize: struct {}
+ entry: print_tab18
+ exit: print_tab0
+
+ print_tab9: addp %9, %0, %10 --> print_tab8
+ print_tab8: load int32, %9, %7 --> print_tab7
+ print_tab7: call "print_sint", [%7], %8: int4s -> void --> print_tab6
+ print_tab6: call "space", [], %6: void --> print_tab5
+ print_tab5: imm %5, imm_int 1 --> print_tab4
+ print_tab4: add %2, %2, %5 --> print_tab3
+ print_tab3: --> print_tab15
+ print_tab2: emit _cost18 --> print_tab1
+ print_tab18: emit _cost19 --> print_tab17
+ print_tab17: imm %14, imm_int 0 --> print_tab16
+ print_tab16: int1sto4 %2, %14 --> print_tab3
+ print_tab15: lt %13, %2, %1 --> print_tab14
+ print_tab14: notbool %12, %13 --> print_tab13
+ print_tab13: %12? --> print_tab2, print_tab12
+ print_tab12: emit _cost17 --> print_tab11
+ print_tab11: imm %11, imm_sizeof (int32) --> print_tab10
+ print_tab10: mul %10, %2, %11 --> print_tab9
+ print_tab1: call "newline", [], %4: void --> print_tab0
+ print_tab0: return
+
+
+ "main"()
+ locals: int1s %1, ptr %2, int4s %3, int1u %4, int1s %5, ptr %6, offset %7, ptr %8, int4s %9, int4s %10, int1u %11, int1s %12, int1s %13, int1s %14, int1s %15, ptr %16, offset %17, ptr %18, int4s %19, int1s %20, ptr %21, int1s %22, int1s %23, int1s %24, ptr %25, offset %26, ptr %27, int4s %28, int1s %29, int1s %30, ptr %31, int1s %32, int1s %33, int1s %34, ptr %35, offset %36, ptr %37, int4s %38, int1s %39, ptr %40, int1s %41, int1s %42, int1s %43, ptr %44, offset %45, ptr %46, int4s %47, int1s %48, int1s %49, ptr %50, int1s %51, int1s %52, int1s %53, ptr %54, offset %55, ptr %56, int4s %57, int1s %58, ptr %59, int1s %60, int1s %61, int1s %62, ptr %63, offset %64
+ result: int4s %0
+ stacksize: struct {int32[5]}
+ entry: main71
+ exit: main0
+
+ main9: call "quicksort", [%8, %9, %10], %11: ptr -> int4s -> int4s -> void --> main8
+ main8: imm %6, imm_addr STACK --> main7
+ main71: emit _cost20 --> main70
+ main70: imm %63, imm_addr STACK --> main69
+ main7: imm %7, imm_offset { struct {int32[5]}, 0 } --> main6
+ main69: imm %64, imm_offset { struct {int32[5]}, 0 } --> main68
+ main68: addp %59, %63, %64 --> main67
+ main67: imm %61, imm_int 0 --> main66
+ main66: imm %62, imm_sizeof (int32) --> main65
+ main65: mul %60, %61, %62 --> main64
+ main64: addp %56, %59, %60 --> main63
+ main63: imm %58, imm_int 26 --> main62
+ main62: int1sto4 %57, %58 --> main61
+ main61: store int32, %56, %57 --> main60
+ main60: imm %54, imm_addr STACK --> main59
+ main6: addp %2, %6, %7 --> main5
+ main59: imm %55, imm_offset { struct {int32[5]}, 0 } --> main58
+ main58: addp %50, %54, %55 --> main57
+ main57: imm %52, imm_int 1 --> main56
+ main56: imm %53, imm_sizeof (int32) --> main55
+ main55: mul %51, %52, %53 --> main54
+ main54: addp %46, %50, %51 --> main53
+ main53: imm %49, imm_int 21 --> main52
+ main52: negint %48, %49 --> main51
+ main51: int1sto4 %47, %48 --> main50
+ main50: store int32, %46, %47 --> main49
+ main5: imm %5, imm_int 5 --> main4
+ main49: imm %44, imm_addr STACK --> main48
+ main48: imm %45, imm_offset { struct {int32[5]}, 0 } --> main47
+ main47: addp %40, %44, %45 --> main46
+ main46: imm %42, imm_int 2 --> main45
+ main45: imm %43, imm_sizeof (int32) --> main44
+ main44: mul %41, %42, %43 --> main43
+ main43: addp %37, %40, %41 --> main42
+ main42: imm %39, imm_int 43 --> main41
+ main41: int1sto4 %38, %39 --> main40
+ main40: store int32, %37, %38 --> main39
+ main4: int1sto4 %3, %5 --> main3
+ main39: imm %35, imm_addr STACK --> main38
+ main38: imm %36, imm_offset { struct {int32[5]}, 0 } --> main37
+ main37: addp %31, %35, %36 --> main36
+ main36: imm %33, imm_int 3 --> main35
+ main35: imm %34, imm_sizeof (int32) --> main34
+ main34: mul %32, %33, %34 --> main33
+ main33: addp %27, %31, %32 --> main32
+ main32: imm %30, imm_int 62 --> main31
+ main31: negint %29, %30 --> main30
+ main30: int1sto4 %28, %29 --> main29
+ main3: call "print_tab", [%2, %3], %4: ptr -> int4s -> void --> main2
+ main29: store int32, %27, %28 --> main28
+ main28: imm %25, imm_addr STACK --> main27
+ main27: imm %26, imm_offset { struct {int32[5]}, 0 } --> main26
+ main26: addp %21, %25, %26 --> main25
+ main25: imm %23, imm_int 4 --> main24
+ main24: imm %24, imm_sizeof (int32) --> main23
+ main23: mul %22, %23, %24 --> main22
+ main22: addp %18, %21, %22 --> main21
+ main21: imm %20, imm_int 8 --> main20
+ main20: int1sto4 %19, %20 --> main19
+ main2: imm %1, imm_int 0 --> main1
+ main19: store int32, %18, %19 --> main18
+ main18: imm %16, imm_addr STACK --> main17
+ main17: imm %17, imm_offset { struct {int32[5]}, 0 } --> main16
+ main16: addp %8, %16, %17 --> main15
+ main15: imm %15, imm_int 0 --> main14
+ main14: int1sto4 %9, %15 --> main13
+ main13: imm %13, imm_int 5 --> main12
+ main12: imm %14, imm_int 1 --> main11
+ main11: sub %12, %13, %14 --> main10
+ main10: int1sto4 %10, %12 --> main9
+ main1: int1sto4 %0, %1 --> main0
+ main0: return %0
+
+
--- /dev/null
+
+#define SIZE 5
+
+void swap (int a[], int i, int j) {
+ int t;
+ t = a[i] ; a[i] = a[j] ; a[j] = t;
+}
+
+int partition (int a[], int l, int r) {
+ int pivot, i, j;
+ pivot = a[l];
+ i = l; j = r+1;
+
+ while (1) {
+ while (i <= r && a[i] <= pivot) ++i;
+ do --j; while (a[j] > pivot);
+ if (i >= j) break;
+ swap(a, i, j);
+ }
+ swap(a, l, j);
+ return j;
+}
+
+void quicksort (int a[], int l, int r) {
+ int j;
+
+ if (l < r) {
+ j = partition(a, l, r);
+ quicksort(a, l, j-1);
+ quicksort(a, j+1, r);
+ }
+}
+
+void print_tab (int tab[], int size) {
+ int i;
+
+ for (i = 0 ; i < size ; i++) {
+ print_sint(tab[i]);
+ space();
+ }
+ newline();
+}
+
+int is_sorted (int tab[], int size) {
+ int i, res = 1;
+
+ for (i = 0 ; i < size-1 ; i++) res = res && (tab[i] <= tab[i+1]);
+
+ return res;
+}
+
+int main () {
+ int tab[SIZE] = {26, -21, 43, -62, 8};
+
+ quicksort(tab, 0, SIZE-1);
+ print_tab(tab, SIZE);
+ print_sint(is_sorted(tab, SIZE));
+ newline();
+
+ return (is_sorted(tab, SIZE));
+}
--- /dev/null
+program:
+
+
+ globals:
+ "to_find" { int32[2] }
+
+
+ extern "print_sint": int4s -> void
+
+
+ extern "newline": void
+
+
+ extern "space": void
+
+
+ "search"(ptr %0, int4s %1, int4s %2)
+ locals: int4s %3, int4s %4, int4s %5, int1s %7, int1s %8, int4s %9, int4s %10, int4s %11, ptr %12, int4s %13, int4s %14, int4s %15, int4s %16, int4s %17, ptr %18, int4s %19, int4s %20, int4s %21, int4s %22, ptr %23, int4s %24, int4s %25, int4s %26, int4s %27, int4s %28, int4s %29, int4s %30, int1s %31
+ result: int4s %6
+ stacksize: struct {}
+ entry: search46
+ exit: search0
+
+ search9: emit _cost0 --> search8
+ search8: imm %9, imm_int 1 --> search7
+ search7: add %5, %4, %9 --> search5
+ search6: emit _cost1 --> search5
+ search5: --> search41
+ search46: emit _cost8 --> search45
+ search45: imm %31, imm_int 0 --> search44
+ search44: int1sto4 %5, %31 --> search43
+ search43: imm %30, imm_int 1 --> search42
+ search42: sub %3, %1, %30 --> search5
+ search41: ge %29, %3, %5 --> search40
+ search40: notbool %28, %29 --> search39
+ search4: emit _cost7 --> search3
+ search39: %28? --> search4, search38
+ search38: emit _cost6 --> search37
+ search37: add %26, %3, %5 --> search36
+ search36: imm %27, imm_int 2 --> search35
+ search35: div %4, %26, %27 --> search34
+ search34: imm %25, imm_sizeof (int32) --> search33
+ search33: mul %24, %4, %25 --> search32
+ search32: addp %23, %0, %24 --> search31
+ search31: load int32, %23, %22 --> search30
+ search30: eq %21, %22, %2 --> search29
+ search3: imm %8, imm_int 1 --> search2
+ search29: %21? --> search28, search26
+ search28: emit _cost4 --> search27
+ search27: id %6, %4 --> search0
+ search26: emit _cost5 --> search25
+ search25: imm %20, imm_sizeof (int32) --> search24
+ search24: mul %19, %4, %20 --> search23
+ search23: addp %18, %0, %19 --> search22
+ search22: load int32, %18, %17 --> search21
+ search21: gt %16, %17, %2 --> search20
+ search20: %16? --> search19, search16
+ search2: negint %7, %8 --> search1
+ search19: emit _cost2 --> search18
+ search18: imm %15, imm_int 1 --> search17
+ search17: sub %3, %4, %15 --> search15
+ search16: emit _cost3 --> search15
+ search15: imm %14, imm_sizeof (int32) --> search14
+ search14: mul %13, %4, %14 --> search13
+ search13: addp %12, %0, %13 --> search12
+ search12: load int32, %12, %11 --> search11
+ search11: lt %10, %11, %2 --> search10
+ search10: %10? --> search9, search6
+ search1: int1sto4 %6, %7 --> search0
+ search0: return %6
+
+
+ "main"()
+ locals: int4s %0, int4s %1, int4s %2, int4s %3, int1s %5, int1u %6, int4s %7, int1u %8, int1u %9, ptr %10, int4s %11, int4s %12, ptr %13, ptr %14, int4s %15, int4s %16, int1s %17, ptr %18, offset %19, int4s %20, int4s %21, int4s %22, int1s %23, ptr %24, int4s %25, int1s %26, ptr %27, int1s %28, int1s %29, int1s %30, ptr %31, offset %32, ptr %33, int4s %34, int1s %35, ptr %36, int1s %37, int1s %38, int1s %39, ptr %40, offset %41, ptr %42, int4s %43, int1s %44, ptr %45, int1s %46, int1s %47, int1s %48, ptr %49, offset %50, ptr %51, int4s %52, int1s %53, int1s %54, ptr %55, int1s %56, int1s %57, int1s %58, ptr %59, offset %60, ptr %61, int4s %62, int1s %63, int1s %64, ptr %65, int1s %66, int1s %67, int1s %68, ptr %69, offset %70, ptr %71, int4u %72, ptr %73, offset %74, offset %75, offset %76, ptr %77, int4u %78, ptr %79, offset %80, offset %81, offset %82
+ result: int4s %4
+ stacksize: struct {int32[5]}
+ entry: main95
+ exit: main0
+
+ main95: imm %79, imm_addr "to_find" --> main94
+ main94: imm %81, imm_int 0 --> main93
+ main93: imm %82, imm_offset { int32[2], 0 } --> main92
+ main92: add %80, %81, %82 --> main91
+ main91: addp %77, %79, %80 --> main90
+ main90: imm %78, imm_int 57 --> main89
+ main9: call "print_sint", [%2], %9: int4s -> void --> main8
+ main89: store int32, %77, %78 --> main88
+ main88: imm %73, imm_addr "to_find" --> main87
+ main87: imm %75, imm_int 0 --> main86
+ main86: imm %76, imm_offset { int32[2], 1 } --> main85
+ main85: add %74, %75, %76 --> main84
+ main84: addp %71, %73, %74 --> main83
+ main83: imm %72, imm_int -1 --> main82
+ main82: store int32, %71, %72 --> main81
+ main81: emit _cost11 --> main80
+ main80: imm %69, imm_addr STACK --> main79
+ main8: call "space", [], %8: void --> main7
+ main79: imm %70, imm_offset { struct {int32[5]}, 0 } --> main78
+ main78: addp %65, %69, %70 --> main77
+ main77: imm %67, imm_int 0 --> main76
+ main76: imm %68, imm_sizeof (int32) --> main75
+ main75: mul %66, %67, %68 --> main74
+ main74: addp %61, %65, %66 --> main73
+ main73: imm %64, imm_int 30 --> main72
+ main72: negint %63, %64 --> main71
+ main71: int1sto4 %62, %63 --> main70
+ main70: store int32, %61, %62 --> main69
+ main7: imm %7, imm_int 1 --> main6
+ main69: imm %59, imm_addr STACK --> main68
+ main68: imm %60, imm_offset { struct {int32[5]}, 0 } --> main67
+ main67: addp %55, %59, %60 --> main66
+ main66: imm %57, imm_int 1 --> main65
+ main65: imm %58, imm_sizeof (int32) --> main64
+ main64: mul %56, %57, %58 --> main63
+ main63: addp %51, %55, %56 --> main62
+ main62: imm %54, imm_int 18 --> main61
+ main61: negint %53, %54 --> main60
+ main60: int1sto4 %52, %53 --> main59
+ main6: add %0, %0, %7 --> main5
+ main59: store int32, %51, %52 --> main58
+ main58: imm %49, imm_addr STACK --> main57
+ main57: imm %50, imm_offset { struct {int32[5]}, 0 } --> main56
+ main56: addp %45, %49, %50 --> main55
+ main55: imm %47, imm_int 2 --> main54
+ main54: imm %48, imm_sizeof (int32) --> main53
+ main53: mul %46, %47, %48 --> main52
+ main52: addp %42, %45, %46 --> main51
+ main51: imm %44, imm_int 23 --> main50
+ main50: int1sto4 %43, %44 --> main49
+ main5: --> main26
+ main49: store int32, %42, %43 --> main48
+ main48: imm %40, imm_addr STACK --> main47
+ main47: imm %41, imm_offset { struct {int32[5]}, 0 } --> main46
+ main46: addp %36, %40, %41 --> main45
+ main45: imm %38, imm_int 3 --> main44
+ main44: imm %39, imm_sizeof (int32) --> main43
+ main43: mul %37, %38, %39 --> main42
+ main42: addp %33, %36, %37 --> main41
+ main41: imm %35, imm_int 57 --> main40
+ main40: int1sto4 %34, %35 --> main39
+ main4: emit _cost10 --> main3
+ main39: store int32, %33, %34 --> main38
+ main38: imm %31, imm_addr STACK --> main37
+ main37: imm %32, imm_offset { struct {int32[5]}, 0 } --> main36
+ main36: addp %27, %31, %32 --> main35
+ main35: imm %29, imm_int 4 --> main34
+ main34: imm %30, imm_sizeof (int32) --> main33
+ main33: mul %28, %29, %30 --> main32
+ main32: addp %24, %27, %28 --> main31
+ main31: imm %26, imm_int 120 --> main30
+ main30: int1sto4 %25, %26 --> main29
+ main3: call "newline", [], %6: void --> main2
+ main29: store int32, %24, %25 --> main28
+ main28: imm %23, imm_int 0 --> main27
+ main27: int1sto4 %0, %23 --> main5
+ main26: imm %22, imm_int 2 --> main25
+ main25: lt %21, %0, %22 --> main24
+ main24: notbool %20, %21 --> main23
+ main23: %20? --> main4, main22
+ main22: emit _cost9 --> main21
+ main21: imm %18, imm_addr STACK --> main20
+ main20: imm %19, imm_offset { struct {int32[5]}, 0 } --> main19
+ main2: imm %5, imm_int 0 --> main1
+ main19: addp %10, %18, %19 --> main18
+ main18: imm %17, imm_int 5 --> main17
+ main17: int1sto4 %11, %17 --> main16
+ main16: imm %14, imm_addr "to_find" --> main15
+ main15: imm %16, imm_sizeof (int32) --> main14
+ main14: mul %15, %0, %16 --> main13
+ main13: addp %13, %14, %15 --> main12
+ main12: load int32, %13, %12 --> main11
+ main11: call "search", [%10, %11, %12], %3: ptr -> int4s -> int4s -> int4s --> main10
+ main10: id %2, %3 --> main9
+ main1: int1sto4 %4, %5 --> main0
+ main0: return %4
+
+
--- /dev/null
+#define SIZE 5
+#define NB_FINDS 2
+
+// Searching for the values below
+int to_find[NB_FINDS] = {57, -1};
+
+int search (int tab[], int size, int to_find) {
+ int low = 0, high = size-1, i;
+
+ while (high >= low) {
+ i = (high+low) / 2;
+ if (tab[i] == to_find) return i;
+ if (tab[i] > to_find) high = i-1;
+ if (tab[i] < to_find) low = i+1;
+ }
+
+ return (-1);
+}
+
+int main () {
+ int tab[SIZE] = {-30, -18, 23, 57, 120};
+ int res;
+ int i;
+
+ for (i = 0 ; i < NB_FINDS ; i++) {
+ print_sint(search(tab, SIZE, to_find[i]));
+ space();
+ }
+ newline();
+
+ return 0;
+}
--- /dev/null
+program:
+
+
+ globals:
+ "p" { ptr }
+ "save" { struct {int32, int32} }
+
+
+ extern "print_sint": int4s -> void
+
+
+ extern "newline": void
+
+
+ "fact1"(int4s %0)
+ locals: int4s %1, int4s %2, int4s %4, int4s %5, int1s %6, int4s %7, int4s %8
+ result: int4s %3
+ stacksize: struct {}
+ entry: fact113
+ exit: fact10
+
+ fact19: emit _cost0 --> fact18
+ fact18: imm %6, imm_int 1 --> fact17
+ fact17: int1sto4 %3, %6 --> fact10
+ fact16: emit _cost1 --> fact15
+ fact15: imm %5, imm_int 1 --> fact14
+ fact14: sub %4, %0, %5 --> fact13
+ fact13: call "fact1", [%4], %2: int4s -> int4s --> fact12
+ fact12: id %1, %2 --> fact11
+ fact113: emit _cost2 --> fact112
+ fact112: imm %8, imm_int 1 --> fact111
+ fact111: le %7, %0, %8 --> fact110
+ fact110: %7? --> fact19, fact16
+ fact11: mul %3, %0, %1 --> fact10
+ fact10: return %3
+
+
+ "fact2"(int4s %0)
+ locals: int4s %1, int4s %2, int4s %4, int4s %5, int4s %6, int1s %7, int1s %8
+ result: int4s %3
+ stacksize: struct {}
+ entry: fact215
+ exit: fact20
+
+ fact29: notbool %5, %6 --> fact28
+ fact28: %5? --> fact22, fact27
+ fact27: emit _cost3 --> fact26
+ fact26: mul %2, %2, %1 --> fact25
+ fact25: imm %4, imm_int 1 --> fact24
+ fact24: add %1, %1, %4 --> fact23
+ fact23: --> fact210
+ fact22: emit _cost4 --> fact21
+ fact215: emit _cost5 --> fact214
+ fact214: imm %8, imm_int 1 --> fact213
+ fact213: int1sto4 %2, %8 --> fact212
+ fact212: imm %7, imm_int 1 --> fact211
+ fact211: int1sto4 %1, %7 --> fact23
+ fact210: le %6, %1, %0 --> fact29
+ fact21: id %3, %2 --> fact20
+ fact20: return %3
+
+
+ "main"()
+ locals: int4s %0, int4s %1, int4s %2, int4s %3, int1s %5, int1u %6, int4s %7, int1u %8, int4s %9, int4s %10, ptr %11, ptr %12, offset %13, ptr %14, offset %15, ptr %16, ptr %17, offset %18, ptr %19, ptr %20, int1s %21, int1s %22, int1s %23, ptr %24, offset %25, ptr %26, ptr %27, offset %28, ptr %29, offset %30, int4s %31, ptr %32, ptr %33, offset %34, ptr %35, ptr %36, offset %37, ptr %38, offset %39, int4s %40, ptr %41, ptr %42, offset %43, ptr %44, int4s %45, ptr %46, ptr %47, offset %48, ptr %49, offset %50, ptr %51, offset %52, ptr %53, int4s %54, ptr %55, ptr %56, offset %57, ptr %58, offset %59, ptr %60, offset %61, ptr %62, ptr %63, ptr %64, offset %65, ptr %66, ptr %67, ptr %68, offset %69, ptr %70, int1s %71, int1s %72, int1s %73, ptr %74, offset %75, ptr %76, int4s %77, int1s %78, ptr %79, offset %80, ptr %81, offset %82
+ result: int4s %4
+ stacksize: struct {struct {int32, int32}, struct {int32, int32}, ptr[3]}
+ entry: main91
+ exit: main0
+
+ main91: emit _cost6 --> main90
+ main90: imm %81, imm_addr STACK --> main89
+ main9: addp %12, %14, %15 --> main8
+ main89: imm %82, imm_offset { struct {struct {int32, int32}}, 0 } --> main88
+ main88: addp %79, %81, %82 --> main87
+ main87: imm %80, imm_offset { struct {int32, int32}, 1 } --> main86
+ main86: addp %76, %79, %80 --> main85
+ main85: imm %78, imm_int 5 --> main84
+ main84: int1sto4 %77, %78 --> main83
+ main83: store int32, %76, %77 --> main82
+ main82: imm %74, imm_addr STACK --> main81
+ main81: imm %75, imm_offset { struct {struct {int32, int32}, struct {int32, int32}, ptr[3]}, 2 } --> main80
+ main80: addp %70, %74, %75 --> main79
+ main8: imm %13, imm_offset { struct {int32, int32}, 1 } --> main7
+ main79: imm %72, imm_int 1 --> main78
+ main78: imm %73, imm_sizeof (ptr) --> main77
+ main77: mul %71, %72, %73 --> main76
+ main76: addp %66, %70, %71 --> main75
+ main75: imm %68, imm_addr STACK --> main74
+ main74: imm %69, imm_offset { struct {struct {int32, int32}}, 0 } --> main73
+ main73: addp %67, %68, %69 --> main72
+ main72: store ptr, %66, %67 --> main71
+ main71: imm %62, imm_addr "p" --> main70
+ main70: imm %64, imm_addr STACK --> main69
+ main7: addp %11, %12, %13 --> main6
+ main69: imm %65, imm_offset { struct {struct {int32, int32}}, 0 } --> main68
+ main68: addp %63, %64, %65 --> main67
+ main67: store ptr, %62, %63 --> main66
+ main66: imm %60, imm_addr "save" --> main65
+ main65: imm %61, imm_offset { struct {int32, int32}, 0 } --> main64
+ main64: addp %53, %60, %61 --> main63
+ main63: imm %58, imm_addr STACK --> main62
+ main62: imm %59, imm_offset { struct {struct {int32, int32}}, 0 } --> main61
+ main61: addp %56, %58, %59 --> main60
+ main60: imm %57, imm_offset { struct {int32, int32}, 0 } --> main59
+ main6: load int32, %11, %10 --> main5
+ main59: addp %55, %56, %57 --> main58
+ main58: load int32, %55, %54 --> main57
+ main57: store int32, %53, %54 --> main56
+ main56: imm %51, imm_addr "save" --> main55
+ main55: imm %52, imm_offset { struct {int32, int32}, 1 } --> main54
+ main54: addp %44, %51, %52 --> main53
+ main53: imm %49, imm_addr STACK --> main52
+ main52: imm %50, imm_offset { struct {struct {int32, int32}}, 0 } --> main51
+ main51: addp %47, %49, %50 --> main50
+ main50: imm %48, imm_offset { struct {int32, int32}, 1 } --> main49
+ main5: eq %7, %9, %10 --> main4
+ main49: addp %46, %47, %48 --> main48
+ main48: load int32, %46, %45 --> main47
+ main47: store int32, %44, %45 --> main46
+ main46: imm %42, imm_addr "save" --> main45
+ main45: imm %43, imm_offset { struct {int32, int32}, 1 } --> main44
+ main44: addp %41, %42, %43 --> main43
+ main43: load int32, %41, %40 --> main42
+ main42: call "fact1", [%40], %2: int4s -> int4s --> main41
+ main41: id %1, %2 --> main40
+ main40: imm %38, imm_addr STACK --> main39
+ main4: call "print_sint", [%7], %8: int4s -> void --> main3
+ main39: imm %39, imm_offset { struct {struct {int32, int32}}, 0 } --> main38
+ main38: addp %36, %38, %39 --> main37
+ main37: imm %37, imm_offset { struct {int32, int32}, 1 } --> main36
+ main36: addp %35, %36, %37 --> main35
+ main35: store int32, %35, %1 --> main34
+ main34: imm %33, imm_addr "save" --> main33
+ main33: imm %34, imm_offset { struct {int32, int32}, 1 } --> main32
+ main32: addp %32, %33, %34 --> main31
+ main31: load int32, %32, %31 --> main30
+ main30: call "fact2", [%31], %3: int4s -> int4s --> main29
+ main3: call "newline", [], %6: void --> main2
+ main29: id %0, %3 --> main28
+ main28: imm %29, imm_addr STACK --> main27
+ main27: imm %30, imm_offset { struct {struct {int32, int32}, struct {int32, int32}}, 1 } --> main26
+ main26: addp %27, %29, %30 --> main25
+ main25: imm %28, imm_offset { struct {int32, int32}, 1 } --> main24
+ main24: addp %26, %27, %28 --> main23
+ main23: store int32, %26, %0 --> main22
+ main22: imm %24, imm_addr STACK --> main21
+ main21: imm %25, imm_offset { struct {struct {int32, int32}, struct {int32, int32}, ptr[3]}, 2 } --> main20
+ main20: addp %20, %24, %25 --> main19
+ main2: imm %5, imm_int 0 --> main1
+ main19: imm %22, imm_int 1 --> main18
+ main18: imm %23, imm_sizeof (ptr) --> main17
+ main17: mul %21, %22, %23 --> main16
+ main16: addp %19, %20, %21 --> main15
+ main15: load ptr, %19, %17 --> main14
+ main14: imm %18, imm_offset { struct {int32, int32}, 1 } --> main13
+ main13: addp %16, %17, %18 --> main12
+ main12: load int32, %16, %9 --> main11
+ main11: imm %14, imm_addr STACK --> main10
+ main10: imm %15, imm_offset { struct {struct {int32, int32}, struct {int32, int32}}, 1 } --> main9
+ main1: int1sto4 %4, %5 --> main0
+ main0: return %4
+
+
--- /dev/null
+
+typedef struct foo {
+ int dummy;
+ int x;
+} foo;
+
+foo *p;
+foo save;
+
+int fact1 (int x) {
+ if (x <= 1) return 1;
+ return (x * fact1(x-1));
+}
+
+int fact2 (int x) {
+ int i, res = 1;
+
+ for (i = 1 ; i <= x ; i++)
+ res *= i;
+
+ return res;
+}
+
+int main () {
+ foo x, y;
+ foo* q[3];
+
+ x.x = 5;
+
+ q[1] = &x;
+ p = &x;
+ save = x;
+ x.x = fact1(save.x);
+ y.x = fact2(save.x);
+
+ print_sint((*(q[1])).x == y.x);
+ newline();
+
+ return 0;
+}
--- /dev/null
+<!DOCTYPE HTML>
+<html>
+<head>
+
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+
+<link rel="stylesheet"
+ href="http://closure-library.googlecode.com/svn/trunk/closure/goog/css/common.css" />
+<link rel="stylesheet"
+ href="http://closure-library.googlecode.com/svn/trunk/closure/goog/css/tab.css" />
+ <link rel="stylesheet"
+ href="http://closure-library.googlecode.com/svn/trunk/closure/goog/css/tabbar.css" />
+ <link rel="stylesheet"
+ href="http://closure-library.googlecode.com/svn/trunk/closure/goog/css/toolbar.css" />
+ <link rel="stylesheet"
+ href="http://closure-library.googlecode.com/svn/trunk/closure/goog/css/button.css" />
+ <link rel="stylesheet"
+ href="http://closure-library.googlecode.com/svn/trunk/closure/goog/css/menu.css" />
+ <link rel="stylesheet"
+ href="http://closure-library.googlecode.com/svn/trunk/closure/goog/css/menuitem.css" />
+ <link rel="stylesheet"
+ href="http://closure-library.googlecode.com/svn/trunk/closure/goog/css/menuseparator.css" />
+<link rel="stylesheet"
+ href="http://closure-library.googlecode.com/svn/trunk/closure/goog/css/dialog.css" />
+
+ <style>
+ .goog-tab {
+ width: 15em;
+ }
+
+ .goog-tab-content {
+ margin: 0;
+ border: 1px solid #6b90da;
+ border-top: 0;
+ padding: 1px 0px;
+ background: #fff;
+ overflow: auto;
+ }
+
+ .editor {
+ border: 0px solid #6b90da;
+ width: 100em;
+ height: 50em;
+ padding: 4px 8px;
+ background: #eee;
+ }
+
+ .logo {
+ float: left;
+ overflow: auto;
+ height: 100px;
+ }
+
+ .progress-bar-vertical,
+ .progress-bar-horizontal {
+ position: relative;
+ border: 1px solid #949dad;
+ background: white;
+ padding: 1px;
+ overflow: hidden;
+ margin: 2px;
+ }
+
+ .progress-bar-horizontal {
+ width: 80%;
+ height: 14px;
+ }
+
+ .progress-bar-vertical {
+ width: 14px;
+ height: 200px;
+ }
+
+ .progress-bar-thumb {
+ position: relative;
+ background: #d4e4ff;
+ overflow: hidden;
+ width: 100%;
+ height: 100%;
+ }
+
+ #progressbar {
+ height: 1.3em;
+ }
+
+ </style>
+
+
+<script>
+// Workaround: as soon as Filename is referenced, not even use,
+// getenv is called to obtain OS temporary directories.
+function caml_sys_getenv (arg) {}
+</script>
+
+<script src="accweb_oclosure.js"></script>
+
+</head>
+
+<body>
+
+ <div class="logo">
+ <img height="50px" src="fetopen.png" />
+ </div>
+
+ <h1>
+ CerCo : A cost annotating compiler for the C language.
+ </h1>
+
+<div id="progressbar">
+ <div class="progress-bar-thumb"></div>
+ <div id="progressbarin" style='position:absolute;top:0;text-align:center;width:100%;
+ font:statusbar;padding:2px'>
+ </div>
+ </div>
+
+ <div id="maintoolbar"></div>
+
+ <div id="maintabbar" class="goog-tab-bar goog-tab-bar-top"></div>
+ <div class="goog-tab-bar-clear"></div>
+ <div id="maintabbar_content" class="goog-tab-content">
+
+
+ </div>
+</body>
+
+<script src="accweb.js"></script>
+</html>
--- /dev/null
+#!/usr/bin/zsh
+
+OUTPUT=cerco_input.xml
+
+echo '<div>' > $OUTPUT
+
+foreach i in $*; do
+ echo "<div>" >> $OUTPUT
+ echo "<div>`basename $i`</div>" >> $OUTPUT
+ echo "<![CDATA[" >> $OUTPUT
+ cat $i >> $OUTPUT
+ echo "]]>" >> $OUTPUT
+ echo "</div>" >> $OUTPUT
+done
+
+echo '</div>' >> $OUTPUT
\ No newline at end of file