Index: Jenkinsfile
===================================================================
--- Jenkinsfile	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ Jenkinsfile	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -126,5 +126,5 @@
 			}
 
-			sh "${SrcDir}/configure CXX=${Settings.Compiler.CXX} CC=${Settings.Compiler.CC} ${Settings.Architecture.flags} ${targets} --quiet"
+			sh "${SrcDir}/configure CXX=${Settings.Compiler.CXX} CC=${Settings.Compiler.CC} ${Settings.Architecture.flags} AR=gcc-ar RANLIB=gcc-ranlib ${targets} --quiet --prefix=${BuildDir}"
 
 			// Configure libcfa
@@ -155,4 +155,11 @@
 		dir (BuildDir) {
 			sh "make -j 8 --no-print-directory -C libcfa/${Settings.Architecture.name}-nodebug"
+		}
+	}
+
+	build_stage('Build : install', true) {
+		// Build outside of the src tree to ease cleaning
+		dir (BuildDir) {
+			sh "make -j 8 --no-print-directory install"
 		}
 	}
@@ -179,5 +186,5 @@
 		echo "Archiving core dumps"
 		dir (BuildDir) {
-			archiveArtifacts artifacts: "tests/crashes/**/*", fingerprint: true
+			archiveArtifacts artifacts: "tests/crashes/**/*,lib/**/lib*.so*", fingerprint: true
 		}
 		throw err
@@ -325,9 +332,11 @@
 	public String CXX
 	public String CC
-
-	CC_Desc(String name, String CXX, String CC) {
+	public String lto
+
+	CC_Desc(String name, String CXX, String CC, String lto) {
 		this.name = name
 		this.CXX = CXX
-		this.CC = CC
+		this.CC  = CC
+		this.lto = lto
 	}
 }
@@ -364,23 +373,23 @@
 		switch( param.Compiler ) {
 			case 'gcc-9':
-				this.Compiler = new CC_Desc('gcc-9', 'g++-9', 'gcc-9')
+				this.Compiler = new CC_Desc('gcc-9', 'g++-9', 'gcc-9', '-flto=auto')
 			break
 			case 'gcc-8':
-				this.Compiler = new CC_Desc('gcc-8', 'g++-8', 'gcc-8')
+				this.Compiler = new CC_Desc('gcc-8', 'g++-8', 'gcc-8', '-flto=auto')
 			break
 			case 'gcc-7':
-				this.Compiler = new CC_Desc('gcc-7', 'g++-7', 'gcc-7')
+				this.Compiler = new CC_Desc('gcc-7', 'g++-7', 'gcc-7', '-flto=auto')
 			break
 			case 'gcc-6':
-				this.Compiler = new CC_Desc('gcc-6', 'g++-6', 'gcc-6')
+				this.Compiler = new CC_Desc('gcc-6', 'g++-6', 'gcc-6', '-flto=auto')
 			break
 			case 'gcc-5':
-				this.Compiler = new CC_Desc('gcc-5', 'g++-5', 'gcc-5')
+				this.Compiler = new CC_Desc('gcc-5', 'g++-5', 'gcc-5', '-flto=auto')
 			break
 			case 'gcc-4.9':
-				this.Compiler = new CC_Desc('gcc-4.9', 'g++-4.9', 'gcc-4.9')
+				this.Compiler = new CC_Desc('gcc-4.9', 'g++-4.9', 'gcc-4.9', '-flto=auto')
 			break
 			case 'clang':
-				this.Compiler = new CC_Desc('clang', 'clang++-6.0', 'gcc-6')
+				this.Compiler = new CC_Desc('clang', 'clang++-6.0', 'gcc-6', '-flto=thin -flto-jobs=0')
 			break
 			default :
@@ -439,4 +448,10 @@
 	// prepare the properties
 	properties ([ 													\
+		buildDiscarder(logRotator(										\
+			artifactDaysToKeepStr: '',									\
+			artifactNumToKeepStr: '',									\
+			daysToKeepStr: '730',										\
+			numToKeepStr: '1000'										\
+		)),														\
 		[$class: 'ParametersDefinitionProperty', 								\
 			parameterDefinitions: [ 									\
Index: benchmark/Makefile.am
===================================================================
--- benchmark/Makefile.am	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ benchmark/Makefile.am	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 09:08:15 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Sat Jan 25 09:20:44 2020
-## Update Count     : 255
+## Last Modified On : Tue Mar 10 11:41:18 2020
+## Update Count     : 258
 ###############################################################################
 
@@ -108,4 +108,5 @@
 creation_cfa_coroutine_DURATION = 100000000
 creation_cfa_coroutine_eager_DURATION = 10000000
+creation_cfa_generator_DURATION = 1000000000
 creation_upp_coroutine_DURATION = ${creation_cfa_coroutine_eager_DURATION}
 creation_cfa_thread_DURATION = 10000000
Index: benchmark/Makefile.in
===================================================================
--- benchmark/Makefile.in	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ benchmark/Makefile.in	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -447,4 +447,5 @@
 creation_cfa_coroutine_DURATION = 100000000
 creation_cfa_coroutine_eager_DURATION = 10000000
+creation_cfa_generator_DURATION = 1000000000
 creation_upp_coroutine_DURATION = ${creation_cfa_coroutine_eager_DURATION}
 creation_cfa_thread_DURATION = 10000000
Index: benchmark/creation/cfa_gen.cfa
===================================================================
--- benchmark/creation/cfa_gen.cfa	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ benchmark/creation/cfa_gen.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -1,9 +1,9 @@
-#include "bench.h"
+#include "../bench.h"
 
-struct C {
+generator G {
 	volatile int restart; // ensure compiler does not optimize away all the code
 };
-void ?{}( C & c ) { c.restart = 0; }
-void main( C & ) {}
+void ?{}( G & g ) { g.restart = 0; }
+void main( G & ) {}
 
 int main( int argc, char * argv[] ) {
@@ -11,5 +11,5 @@
 	BENCH(
 		for ( times ) {
-			 C c;
+			 G g;
 		},
 		result
Index: benchmark/ctxswitch/cfa_cor.cfa
===================================================================
--- benchmark/ctxswitch/cfa_cor.cfa	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ benchmark/ctxswitch/cfa_cor.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -2,13 +2,14 @@
 #include <thread.hfa>
 
-#include "bench.h"
+#include "../bench.h"
 
-coroutine C {} c;
+coroutine C {};
 void main( __attribute__((unused)) C & ) {
-	while () {
-		suspend();
+	for () {
+		suspend;
 	}
 }
 int main( int argc, char * argv[] ) {
+	C c;
 	BENCH_START()
 	BENCH(
Index: benchmark/ctxswitch/cfa_gen.cfa
===================================================================
--- benchmark/ctxswitch/cfa_gen.cfa	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ benchmark/ctxswitch/cfa_gen.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -1,23 +1,17 @@
 #include "../bench.h"
 
-typedef struct {
-	void * next;
-} C;
-
-void comain( C * c ) {
-	if ( __builtin_expect(c->next != 0, 1) ) goto *(c->next);
-	c->next = &&s1;
+generator G {};
+void main( G & ) {
 	for () {
-		return;
-	  s1: ;
+		suspend;
 	}
 }
 
 int main( int argc, char * argv[] ) {
+	G g;
 	BENCH_START()
-	C c = { 0 };
 	BENCH(
 		for ( times ) {
-			comain( &c );
+			resume( g );
 		},
 		result
Index: configure
===================================================================
--- configure	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ configure	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -2557,4 +2557,5 @@
 # don't use the default CFLAGS as they unconditonnaly add -O2
 : ${CFLAGS=""}
+: ${CXXFLAGS=""}
 
 am__api_version='1.15'
Index: configure.ac
===================================================================
--- configure.ac	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ configure.ac	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -14,4 +14,5 @@
 # don't use the default CFLAGS as they unconditonnaly add -O2
 : ${CFLAGS=""}
+: ${CXXFLAGS=""}
 
 AM_INIT_AUTOMAKE([subdir-objects])
Index: doc/papers/concurrency/Paper.tex
===================================================================
--- doc/papers/concurrency/Paper.tex	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ doc/papers/concurrency/Paper.tex	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -248,8 +248,8 @@
 }
 
-\newbox\myboxA
-\newbox\myboxB
-\newbox\myboxC
-\newbox\myboxD
+\newsavebox{\myboxA}
+\newsavebox{\myboxB}
+\newsavebox{\myboxC}
+\newsavebox{\myboxD}
 
 \title{\texorpdfstring{Advanced Control-flow and Concurrency in \protect\CFA}{Advanced Control-flow in Cforall}}
@@ -2967,7 +2967,8 @@
 \lstset{language=CFA,moredelim=**[is][\color{red}]{@}{@},deletedelim=**[is][]{`}{`}}
 \begin{cfa}[aboveskip=0pt,belowskip=0pt]
-@coroutine@ C {} c;
-void main( C & ) { while () { @suspend;@ } }
+@coroutine@ C {};
+void main( C & ) { for () { @suspend;@ } }
 int main() { // coroutine test
+	C c;
 	BENCH( for ( N ) { @resume( c );@ } )
 	sout | result;
@@ -2989,5 +2990,5 @@
 \multicolumn{1}{@{}c}{} & \multicolumn{1}{c}{Median} &\multicolumn{1}{c}{Average} & \multicolumn{1}{c@{}}{Std Dev} \\
 C function			& 1.8		& 1.8		& 0.0	\\
-\CFA generator		& 1.8		& 1.8		& 0.1	\\
+\CFA generator		& 1.8		& 2.0		& 0.3	\\
 \CFA coroutine		& 32.5		& 32.9		& 0.8	\\
 \CFA thread			& 93.8		& 93.6		& 2.2	\\
Index: doc/theses/andrew_beach_MMath/Makefile
===================================================================
--- doc/theses/andrew_beach_MMath/Makefile	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ doc/theses/andrew_beach_MMath/Makefile	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -5,4 +5,6 @@
 TEXSRC=$(wildcard *.tex)
 BIBSRC=$(wildcard *.bib)
+STYSRC=$(wildcard *.sty)
+CLSSRC=$(wildcard *.cls)
 TEXLIB= .:${BUILD}:
 BIBLIB= .:../../bibliography
@@ -24,5 +26,5 @@
 all: ${DOC}
 
-${BUILD}/${DOC}: ${TEXSRC} ${BIBSRC} Makefile | ${BUILD}
+${BUILD}/${DOC}: ${TEXSRC} ${BIBSRC} ${STYSRC} ${CLSSRC} Makefile | ${BUILD}
 	${LATEX} ${BASE}
 	${BIBTEX} ${BUILD}/${BASE}
Index: doc/theses/andrew_beach_MMath/cfalab.sty
===================================================================
--- doc/theses/andrew_beach_MMath/cfalab.sty	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ doc/theses/andrew_beach_MMath/cfalab.sty	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,29 @@
+% Package for CFA Research Lab.
+%
+% Made by combining and updating
+
+% I don't know what the oldest LaTeX2e version with everything needed is.
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{cfalab}[2020/03/09 v0.1 CFA Laboratory LaTeX Tools]
+
+% Other packages required.
+\RequirePackage{etoolbox}
+\RequirePackage{xspace}
+
+% Symbols: All symbols are zero argument robust commands with special rules
+% about the space following the c.s. token. Normally the space might be
+% re-added according to the rules of the xspace package. They may be followed
+% by a star (which the command will consume) to disable this behaviour.
+
+% \newsymbolcmd{<command>}{<expansion>}
+%    Defines <command> to be a symbol that has the given <expansion>.
+\newrobustcmd*\newsymbolcmd[2]{\newrobustcmd{#1}{\cfalab@symbol{#2}}}
+\def\cfalab@symbol#1{\@ifnextchar*{#1\cfalab@eatstar}{#1\xspace}}
+\def\cfalab@eatstar*{}
+
+% Cforall with the forall symbol.
+\newsymbolcmd\CFA{\textsf{C}\raisebox{\depth}{\rotatebox{180}{\textsf{A}}}}
+
+\newcommand\codeC[1]{\texttt{#1}}
+
+\endinput
Index: doc/theses/andrew_beach_MMath/thesis.tex
===================================================================
--- doc/theses/andrew_beach_MMath/thesis.tex	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ doc/theses/andrew_beach_MMath/thesis.tex	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -1,84 +1,66 @@
-% uWaterloo Thesis Template for LaTeX 
-% Last Updated June 14, 2017 by Stephen Carr, IST Client Services
-% FOR ASSISTANCE, please send mail to rt-IST-CSmathsci@ist.uwaterloo.ca
-
-% Effective October 2006, the University of Waterloo 
-% requires electronic thesis submission. See the uWaterloo thesis regulations at
-% https://uwaterloo.ca/graduate-studies/thesis.
-
-% DON'T FORGET TO ADD YOUR OWN NAME AND TITLE in the "hyperref" package
-% configuration. THIS INFORMATION GETS EMBEDDED IN THE FINAL PDF DOCUMENT.
-% You can view the information if you view Properties of the PDF document.
-
-% Many faculties/departments also require one or more printed
-% copies. This template attempts to satisfy both types of output. 
-% It is based on the standard "book" document class which provides all
-% necessary sectioning structures and allows multi-part theses.
-
-% DISCLAIMER
-% To the best of our knowledge, this template satisfies the current uWaterloo
-% requirements. However, it is your responsibility to assure that you have met
-% all  requirements of the University and your particular department.
-% Many thanks for the feedback from many graduates that assisted the
-% development of this template.
-
-% -----------------------------------------------------------------------
-
-% By default, output is produced that is geared toward generating a PDF 
-% version optimized for viewing on an electronic display, including 
-% hyperlinks within the PDF.
- 
-% E.g. to process a thesis called "mythesis.tex" based on this template, run:
-
-% pdflatex mythesis	-- first pass of the pdflatex processor
-% bibtex mythesis	-- generates bibliography from .bib data file(s)
-% makeindex         -- should be run only if an index is used 
-% pdflatex mythesis	-- fixes numbering in cross-references,
-% pdflatex mythesis --   bibliographic references, glossaries, index, etc.
-
-% N.B. The "pdftex" program allows graphics in the following formats to be
-% included with the "\includegraphics" command: PNG, PDF, JPEG, TIFF
-% Tip 1: Generate your figures and photos in the size you want them to appear
-% in your thesis, rather than scaling them with \includegraphics options.
-% Tip 2: Any drawings you do should be in scalable vector graphic formats:
-% SVG, PNG, WMF, EPS and then converted to PNG or PDF, so they are scalable in
-% the final PDF as well.
-% Tip 3: Photographs should be cropped and compressed so as not to be too large.
-
-% To create a PDF output that is optimized for double-sided printing: 
-%
-% 1) comment-out the \documentclass statement in the preamble below, and
-% un-comment the second \documentclass line.
-%
-% 2) change the value assigned below to the boolean variable
-% "PrintVersion" from "false" to "true".
-
-% --------------------- Start of Document Preamble -----------------------
-
-% Specify the document class, default style attributes, and page dimensions
-% For hyperlinked PDF, suitable for viewing on a computer, use this:
-\documentclass[letterpaper,12pt,titlepage,oneside,final]{book}
- 
-% For PDF, suitable for double-sided printing, change the PrintVersion
-% variable below to "true" and use this \documentclass line instead of the one
-% above:
-%\documentclass[letterpaper,12pt,titlepage,openright,twoside,final]{book}
-
-% Some LaTeX commands I define for my own nomenclature.
-% If you have to, it's better to change nomenclature once here than in a 
-% million places throughout your thesis!
-\newcommand{\package}[1]{\textbf{#1}} % package names in bold text
-\newcommand{\cmmd}[1]{\textbackslash\texttt{#1}} % command name in tt font 
-\newcommand{\href}[1]{#1} % does nothing, but defines the command so the
-  % print-optimized version will ignore \href tags (redefined by hyperref pkg).
-%\newcommand{\texorpdfstring}[2]{#1} % does nothing, but defines the command
-% Anything defined here may be redefined by packages added below...
-
-% This package allows if-then-else control structures.
-\usepackage{ifthen}
-\newboolean{PrintVersion}
-\setboolean{PrintVersion}{false} 
-% CHANGE THIS VALUE TO "true" as necessary, to improve printed results for
-% hard copies by overriding some options of the hyperref package below.
+% Main tex file for thesis document.
+\documentclass[digital]{uw-ethesis}
+\usepackage{comment}
+\usepackage{fullpage}
+\setlength{\textheight}{8.75in}
+\renewcommand\labelitemi{\footnotesize$\bullet$} % shrink bullet for level 1 itemize
+\usepackage{lmodern}				% bold typewriter font
+
+\usepackage{listings}				% format program code
+% Default underscore is too low and wide. Cannot use lstlisting "literate" as replacing underscore
+% removes it as a variable-name character so keywords in variables are highlighted. MUST APPEAR
+% AFTER HYPERREF.
+%\DeclareTextCommandDefault{\textunderscore}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}
+\renewcommand{\textunderscore}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.075ex}}}
+% parindent is relative, i.e., toggled on/off in environments like itemize, so store the value for
+% use rather than use \parident directly.
+\newlength{\parindentlnth}
+\setlength{\parindentlnth}{\parindent}
+
+% CFA programming language, based on ANSI C (with some gcc additions)
+\lstdefinelanguage{CFA}[ANSI]{C}{
+	morekeywords={
+		_Alignas, _Alignof, __alignof, __alignof__, asm, __asm, __asm__, __attribute, __attribute__,
+		auto, _Bool, catch, catchResume, choose, _Complex, __complex, __complex__, __const, __const__,
+		coroutine, disable, dtype, enable, exception, __extension__, fallthrough, fallthru, finally,
+		__float80, float80, __float128, float128, forall, ftype, generator, _Generic, _Imaginary, __imag, __imag__,
+		inline, __inline, __inline__, __int128, int128, __label__, monitor, mutex, _Noreturn, one_t, or,
+		otype, restrict, resume, __restrict, __restrict__, __signed, __signed__, _Static_assert, suspend, thread,
+		_Thread_local, throw, throwResume, timeout, trait, try, ttype, typeof, __typeof, __typeof__,
+		virtual, __volatile, __volatile__, waitfor, when, with, zero_t},
+	moredirectives={defined,include_next},
+	% replace/adjust listing characters that look bad in sanserif
+	literate={-}{\makebox[1ex][c]{\raisebox{0.5ex}{\rule{0.8ex}{0.1ex}}}}1 {^}{\raisebox{0.6ex}{$\scriptstyle\land\,$}}1
+		{~}{\raisebox{0.3ex}{$\scriptstyle\sim\,$}}1 % {`}{\ttfamily\upshape\hspace*{-0.1ex}`}1
+		{<}{\textrm{\textless}}1 {>}{\textrm{\textgreater}}1
+		{<-}{$\leftarrow$}2 {=>}{$\Rightarrow$}2 {->}{\makebox[1ex][c]{\raisebox{0.5ex}{\rule{0.8ex}{0.075ex}}}\kern-0.2ex{\textrm{\textgreater}}}2,
+}
+
+\lstset{
+language=CFA,
+columns=fullflexible,
+basicstyle=\linespread{0.9}\tt,			% reduce line spacing and use sanserif font
+stringstyle=\tt,				% use typewriter font
+tabsize=5,					% N space tabbing
+xleftmargin=\parindentlnth,			% indent code to paragraph indentation
+%mathescape=true,				% LaTeX math escape in CFA code $...$
+escapechar=\$,					% LaTeX escape in CFA code
+keepspaces=true,
+showstringspaces=false,				% do not show spaces with cup
+showlines=true,					% show blank lines at end of code
+aboveskip=4pt,					% spacing above/below code block
+belowskip=3pt,
+moredelim=**[is][\color{red}]{`}{`},
+}% lstset
+
+\lstnewenvironment{cfa}[1][]
+{\lstset{#1}}
+{}
+% inline code @...@
+
+% Commands used in documenting how to use the template. To remove.
+\newcommand{\package}[1]{\textbf{#1}}
+\newcommand{\cmmd}[1]{\textbackslash\texttt{#1}}
+\newcommand{\href}[1]{#1}
 
 % For a nomenclature (optional; available from ctan.org)
@@ -86,97 +68,23 @@
 % Lots of math symbols and environments
 \usepackage{amsmath,amssymb,amstext}
-% For including graphics N.B. pdftex graphics driver 
+% For including graphics, sets the pdftex graphics driver.
 \usepackage[pdftex]{graphicx}
 
-% I believe the general index function is covered by the glossaries.
-% \usepackage{makeidx}
-% \makeindex
-
-% Hyperlinks make it very easy to navigate an electronic document.
-% In addition, this is where you should specify the thesis title
-% and author as they appear in the properties of the PDF document.
-% Use the "hyperref" package 
-% N.B. HYPERREF MUST BE THE LAST PACKAGE LOADED; ADD ADDITIONAL PKGS ABOVE
-% N.B. pagebackref=true provides links back from the References to the body
-% text. This can cause trouble for printing.
-\usepackage[pdftex,pagebackref=false]{hyperref} % with basic options
-\hypersetup{
-    plainpages=false,       % needed if Roman numbers in frontpages
-    unicode=false,          % non-Latin characters in Acrobat’s bookmarks
-    pdftoolbar=true,        % show Acrobat’s toolbar?
-    pdfmenubar=true,        % show Acrobat’s menu?
-    pdffitwindow=false,     % window fit to page when opened
-    pdfstartview={FitH},    % fits the width of the page to the window
-    pdftitle={uWaterloo\ LaTeX\ Thesis\ Template},    % title: CHANGE THIS TEXT!
-%    pdfauthor={Author},    % author: CHANGE THIS TEXT! and uncomment this line
-%    pdfsubject={Subject},  % subject: CHANGE THIS TEXT! and uncomment this line
-%    pdfkeywords={keyword1} {key2} {key3}, % list of keywords, and uncomment this line if desired
-    pdfnewwindow=true,      % links in new window
-    colorlinks=true,        % false: boxed links; true: colored links
-    linkcolor=blue,         % color of internal links
-    citecolor=green,        % color of links to bibliography
-    filecolor=magenta,      % color of file links
-    urlcolor=cyan           % color of external links
-}
-\ifthenelse{\boolean{PrintVersion}}{
-  % for improved print quality, override some hyperref options
-\hypersetup{
-%    colorlinks,%
-    citecolor=black,%
-    filecolor=black,%
-    linkcolor=black,%
-    urlcolor=black}
-}{} % end of ifthenelse (no else)
-
-\usepackage[toc,abbreviations]{glossaries-extra} % Exception to the
-% rule of hyperref being the last add-on package. If glossaries-extra is not
-% in your LaTeX distribution, get it from CTAN
-% (http://ctan.org/pkg/glossaries-extra). 
-
-% Setting up the page margins...
-% uWaterloo thesis requirements specify a minimum of 1 inch (72pt) margin at
-% the top, bottom, and outside page edges and a 1.125 in. (81pt) gutter
-% margin (on binding side). While this is not an issue for electronic
-% viewing, a PDF may be printed, and so we have the same page layout for
-% both printed and electronic versions, we leave the gutter margin in.
-% Set margins to minimum permitted by uWaterloo thesis regulations:
-\setlength{\marginparwidth}{0pt} % width of margin notes
-% N.B. If margin notes are used, you must adjust \textwidth, \marginparwidth
-% and \marginparsep so that the space left between the margin notes and page
-% edge is less than 15 mm (0.6 in.)
-% Width of space between body text and margin notes.
-\setlength{\marginparsep}{0pt}
-\setlength{\evensidemargin}{0.125in} % Adds 1/8 in. to binding side of all 
-% even-numbered pages when the "twoside" printing option is selected
-\setlength{\oddsidemargin}{0.125in} % Adds 1/8 in. to the left of all pages
-% when "oneside" printing is selected, and to the left of all odd-numbered
-% pages when "twoside" printing is selected
-% Assuming US letter paper (8.5 in. x 11 in.) and side margins as above.
-\setlength{\textwidth}{6.375in}
-\raggedbottom
-
-% The following statement specifies the amount of space between paragraphs.
-% Other reasonable specifications are \bigskipamount and \smallskipamount.
-\setlength{\parskip}{\medskipamount}
-
-% The following statement controls the line spacing.  The default
-% spacing corresponds to good typographic conventions and only slight
-% changes (e.g., perhaps "1.2"), if any, should be made.
-\renewcommand{\baselinestretch}{1} % this is the default line space setting
-
-% By default, each chapter will start on a recto (right-hand side)
-% page.  We also force each section of the front pages to start on 
-% a recto page by inserting \cleardoublepage commands.
-% In many cases, this will require that the verso page be
-% blank and, while it should be counted, a page number should not be
-% printed.  The following statements ensure a page number is not
-% printed on an otherwise blank verso page.
-\let\origdoublepage\cleardoublepage
-\newcommand{\clearemptydoublepage}{%
-  \clearpage{\pagestyle{empty}\origdoublepage}}
-\let\cleardoublepage\clearemptydoublepage
-
-% Define Glossary terms (This is properly done here, in the preamble.
-% Could be \input{} from a file...)
+\usepackage{cfalab}
+
+\usehyperrefpackage[pdftex,pagebackref=false]{
+    pdftitle={Exception Handling in CFA},
+    pdfauthor={Andrew James Beach},
+    pdfsubject={Programming Languages},
+    pdfkeywords={exceptions,implementation},
+}
+
+% The \phantomsection is used to help the hyperref package create links.
+
+% Maybe only package that should be loaded after the hyperref package.
+% From http://ctan.org/pkg/glossaries-extra, extends glossaries which replaces
+% glossary and builds off of the makeindex system.
+\usepackage[toc,abbreviations]{glossaries-extra}
+
 % Main glossary entries -- definitions of relevant terminology
 \newglossaryentry{computer}
@@ -194,9 +102,11 @@
 type=nomenclature,
 name=dingledorf,
-description={A person of supposed average intelligence who makes incredibly brainless misjudgments}
+description={A person of supposed average intelligence who makes incredibly
+               brainless misjudgments}
 }
 
 % List of Abbreviations (abbreviations are from the glossaries-extra package)
-\newabbreviation{aaaaz}{AAAAZ}{American Association of Amature Astronomers and Zoologists}
+\newabbreviation{aaaaz}{AAAAZ}{American Association of Amature Astronomers
+               and Zoologists}
 
 % List of Symbols
@@ -207,21 +117,16 @@
 sort={label},
 type=symbols,
-description={Random vector: a location in n-dimensional Cartesian space, where each dimensional component is determined by a random process}
-}
- 
+description={Random vector: a location in n-dimensional Cartesian space, where
+               each dimensional component is determined by a random process}
+}
+
+% Must be here of cause problems with glossaries-extra.
+\lstMakeShortInline$%
+
+% Generate the glossaries defined above.
 \makeglossaries
 
-%======================================================================
-%   L O G I C A L    D O C U M E N T -- the content of your thesis
-%======================================================================
 \begin{document}
 
-% For a large document, it is a good idea to divide your thesis
-% into several files, each one containing one chapter.
-% To illustrate this idea, the "front pages" (i.e., title page,
-% declaration, borrowers' page, abstract, acknowledgements,
-% dedication, table of contents, list of tables, list of figures,
-% nomenclature) are contained within the file "uw-ethesis-frontpgs.tex" which
-% is included into the document by the following statement.
 %----------------------------------------------------------------------
 % FRONT MATERIAL
@@ -232,9 +137,6 @@
 % MAIN BODY
 %----------------------------------------------------------------------
-% Because this is a short document, and to reduce the number of files
-% needed for this template, the chapters are not separate
-% documents as suggested above, but you get the idea. If they were
-% separate documents, they would each start with the \chapter command, i.e, do
-% not contain \documentclass or \begin{document} and \end{document} commands.
+\input{unwinding}
+
 %======================================================================
 \chapter{Introduction}
@@ -327,42 +229,22 @@
 %----------------------------------------------------------------------
 
-% B I B L I O G R A P H Y
-% -----------------------
-
-% The following statement selects the style to use for references. It controls
-% the sort order of the entries in the bibliography and also the formatting
-% for the in-text labels.
-\bibliographystyle{plain}
-% This specifies the location of the file containing the bibliographic
-% information. It assumes you're using BibTeX (if not, why not?).
-
-% This is needed if the book class is used, to place the anchor in the correct
-% page, because the bibliography will start on its own page.
+%----------------------------------------------------------------------
+% BIBLIOGRAPHY
+%----------------------------------------------------------------------
+
 % Use \clearpage instead if the document class uses the "oneside" argument.
 \cleardoublepage
-% With hyperref package, enables hyperlinking from the table of contents to
-% bibliography
 \phantomsection
 
-% The following statement causes the title "References" to be used for the
-% bibliography section:
-\renewcommand*{\bibname}{References}
-
-% Add the References to the Table of Contents
-\addcontentsline{toc}{chapter}{\textbf{References}}
-
-% Tip 5: You can create multiple .bib files to organize your references. Just
-% list them all in the \bibliogaphy command, separated by commas (no spaces).
+% Bibliography setup and creation, renamed to References.
+\addcontentsline{toc}{chapter}{\textbf{\bibname}}
+\bibliographystyle{plain}
 \bibliography{thesis}
 
-% The following statement causes the specified references to be added to the
-% bibliography even if they were not cited in the text. The asterisk is a
-% wildcard that causes all entries in the bibliographic database to be
-% included (optional).
+% Include all uncited entries in the bibliography.
 \nocite{*}
 
-% The \appendix statement indicates the beginning of the appendices.
+% Begin the appendix, add a title and table of contents entry.
 \appendix
-% Add a title page before the appendices and a line in the Table of Contents
 \chapter*{APPENDICES}
 \addcontentsline{toc}{chapter}{APPENDICES}
Index: doc/theses/andrew_beach_MMath/unwinding.tex
===================================================================
--- doc/theses/andrew_beach_MMath/unwinding.tex	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ doc/theses/andrew_beach_MMath/unwinding.tex	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,168 @@
+\chapter{Unwinding in \CFA}
+
+When a function returns, a \emph{single} stack frame is unwound, removing the
+function's parameters and local variables, and control continues in the
+function's caller using the caller's stack frame.  When an exception is raised,
+\emph{multiple} stack frames are unwound, removing the function parameters and
+local variables for called functions from the exception raise-frame to the
+exception catch-frame.
+
+Unwinding multiple levels is simple for a programming languages without object
+destructors or block finalizers because a direct transfer is possible from the
+current stack frame to a prior stack frame, where control continues at a
+location within the prior caller's function. For example, C provides non-local
+transfer using $longjmp$, which stores a function's state including its
+frame pointer and program counter, and simply reloads this information to
+continue at this prior location on the stack.
+
+For programming languages with object destructors or block finalizers it is
+necessary to walk the stack frames from raise to catch, checking for code that
+must be executed as part of terminating each frame. Walking the stack has a
+higher cost, and necessary information must be available to detect
+destructors/finalizers and call them.
+
+A powerful package to provide stack-walking capabilities is $libunwind$,
+which is used in this work to provide exception handling in \CFA. The following
+explains how $libunwind$ works and how it is used.
+
+% Stack unwinding is the process of removing things from the stack from outside
+% the functions there. In languages that don't provide a way to guaranty that
+% code will run when the program leaves a scope or finishes a function, this
+% can be relatively trivial. C does this with $longjmp$ by setting the
+% stack pointer and a few other registers.
+
+\section{libunwind Usage}
+
+\CFA uses two primary functions in $libunwind$ to create most of its
+exceptional control-flow: $_Unwind_RaiseException$ and $_Unwind_ForcedUnwind$.
+Their operation is divided into two phases: search and clean-up. The search
+phase -- phase 1 -- is used to scan the stack but not unwinding it. The
+clean-up phase -- phase 2 -- is used for unwinding.
+
+% Somewhere around here I need to talk about the control structures.
+% $_Unwind_Exception$ is used to carry the API's universal data. Some
+% of this is internal, other fields are used to communicate between different
+% exception handling mechanisms in different runtimes.
+% $_Unwind_Context$ is an opaque data structure that is used to pass
+% information to helper functions.
+
+The raise-exception function uses both phases. It starts by searching for a
+handler, and if found, performs a clean-up phase to unwind the stack to the
+handler. If a handler is not found, control returns allowing the
+exception-handling policy for unhandled exception to be executed.  During both
+phases, the raise-exception function searches down the stack, calling each
+function's \emph{personality function}.
+
+A personality function performs three tasks, although not all have to be
+present. The tasks performed are decided by the actions provided.
+% Something argument something bitmask.
+\begin{itemize}
+\item$_UA_SEARCH_PHASE$ is called during the clean-up phase and means search
+for handlers. If a hander is found, the personality function should return
+$_URC_HANDLER_FOUND$, otherwise it returns $_URC_CONTINUE_UNWIND$.
+{\color{red}What is the connection between finding the handler and the
+personality function?}
+\item$_UA_CLEANUP_PHASE$ is passed in during the clean-up phase and means part
+or all of the stack frame is removed. The personality function should do
+whatever clean-up the language defines (such as running destructors/finalizers)
+and then generally returns $_URC_CONTINUE_UNWIND$.
+\item$_UA_HANDLER_FRAME$ means the personality function must install a
+handler. It is also passed in during the clean-up phase and is in addition to
+the clean-up action. $libunwind$ provides several helpers for the personality
+function here. Once it is done, the personality function must return
+$_URC_INSTALL_CONTEXT$.
+\end{itemize}
+
+Forced unwind only performs the clean-up phase. It is similar to the phase 2
+section of raise exception with a few changes. A simple difference is that it
+passes in an extra action to the personality function $_UA_FORCE_UNWIND$, which
+means a handler cannot be installed. The most difference significant is the
+addition of the $stop$ function, which is passed in as an argument to forced
+unwind.
+
+The $stop$ function is similar to a personality function. It takes an extra
+argument: a $void$ pointer passed into force unwind. It may return
+$_URC_NO_REASON$ to continue unwinding or it can transfer control out of the
+unwind code using its own mechanism.
+% Is there a reason that NO_REASON is used instead of CONTINUE_UNWIND?
+The $stop$ function is called for each stack frame and at the end of the
+stack. In a stack frame, it is called before the personality routine with the
+same arguments (except for the extra $void$ pointer). At the end of the stack,
+the arguments are mostly the same, except the stack pointer stored in the
+context is set to null. Because of this change, both GCC and Clang add an extra
+action in this case $_UA_END_OF_STACK$.  The $stop$ function may not return at
+the end of the stack.
+
+{\color{red}This needs work as I do not understand all of it.}
+
+
+\section{\CFA Implementation}
+
+To use $libunwind$, \CFA provides several wrappers, its own storage,
+personality functions, and a $stop$ function.
+
+The wrappers perform three tasks: set-up, clean-up and controlling the
+unwinding. The set-up allocates a copy of the \CFA exception into a handler to
+control its lifetime, and stores it in the exception context.  Clean-up -- run
+when control exits a catch clause and returns to normal code -- frees the
+exception copy.
+% It however does not set up the unwind exception so we can't use any inter-
+% runtime/language features. Also the exception context is global.
+
+The control code in the middle {\color{red}(In the middle of what?)} is run
+every time a throw or re-throw is called. It uses raise exception to search for
+a handler and to run it, if one is found. Otherwise, it uses forced unwind to
+unwind the stack, running all destructors, before terminating the process.
+
+The $stop$ function is very simple. It checks the end of stack flag to see if
+it is finished unwinding. If so, it calls $exit$ to end the process, otherwise
+it tells the system {\color{red}(What system?)} to continue unwinding.
+% Yeah, this is going to have to change.
+
+The personality routine is more complex because it has to obtain information
+about the function by scanning the LSDA (Language Specific Data Area). This
+step allows a single personality function to be used for multiple functions and
+it accounts for multiple regions{\color{red}(What's a region?)} and possible
+handlers in a single function.
+% Not that we do that yet.
+
+However, generating the LSDA is difficult. It requires knowledge about the
+location of the instruction pointer and stack layout, which varies by
+optimization levels. So for frames where there are only destructors, GCC's
+attribute cleanup with the $-fexception$ flag is sufficient to handle unwinding.
+
+For functions with handlers (defined in the $try$ statement) the function is
+split into several functions. Everything outside the $try$ statement is the
+first function, which only has destructors to be run during unwinding. The
+catch clauses of the $try$ block are then converted into GCC inner functions,
+which are passed via function pointers while still having access to the outer
+function's scope. $catchResume$ and $finally$ clauses are handled separately
+and not discussed here.
+
+The $try$ clause {\color{red}You have $try$ statement, $try$ block, and $try$
+clause, which need clarification.)} is converted to a function directly. The
+$catch$ clauses are combined into two functions. The first is the match
+function, which is used during the search phase to find a handler. The second
+it the catch function, which is a large switch-case for the different
+handlers. These functions do not interact with unwinding except for running
+destructors and so can be handled by GCC.
+
+These three functions are passed into $try_terminate$, an internal function
+that represents the $try$ statement. This function uses the generated
+personality functions as well as assembly statements to create the LSDA.  In
+normal execution, this function only calls the $try$ block closure. However,
+using $libunwind$, its personality function now handles exception matching and
+catching. {\color{red}(I don't understand the last sentence.)}
+
+During the search phase, the personality function retrieves the match function
+from the stack using the saved stack pointer. The function is called, either
+returning 0 for no match or the index (a positive integer) of the handler for a
+match. If a handler is found, the personality function reports it after saving
+the index to the exception context.
+
+During the clean-up phase there is nothing for the personality function to
+clean-up in $try_terminate$. So if this is not the handler frame, unwinding
+continues. If this is the handler frame, control is transferred to the catch
+function, giving it the exception and the handler index.
+
+{\color{red}This needs work as I do not understand all of it.}
Index: doc/theses/andrew_beach_MMath/uw-ethesis.cls
===================================================================
--- doc/theses/andrew_beach_MMath/uw-ethesis.cls	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ doc/theses/andrew_beach_MMath/uw-ethesis.cls	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,137 @@
+% A document class built from the uw-ethesis template, 2017-06-14 version.
+% This link should get to the regulations:
+% https://uwaterloo.ca/graduate-studies/thesis.
+%
+% WIP I am still moving things out of the provided template.
+%
+% This is approximately (check regulations to be sure) the required set up for
+% a thesis at UW. It also adds some other pieces that are likely to be useful.
+%
+% There are several formats you may choose from. These adjust the settings so
+% the document comes out a little better for different uses. "digital" is for
+% pdf documents that will remain on a computer while "print" is for printing
+% paper copies.
+%
+% Options:
+%   <format>
+%     All the formats are options, sets the document's format to that format.
+%     If no format is given digital is the default.
+%
+% Exported Names:
+%   \ifformat{<format>}{<true>}{<false>}
+%     If the document's format is <format> than expands to <true> otherwise
+%     expands to <false>.
+%
+%   \usehyperrefpackage[<options>]{<setup>}
+%     Loads the hyperref package with <options> and preforms set up. The
+%     initial setup depends on the document format but they can be overriden
+%     with options in <setup> (set hyperref's \hypersetup for details).
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesClass{uw-ethesis}[2020/03/09 v0.1 UW E-Thesis Template Document Class]
+
+\RequirePackage{etoolbox}
+
+% Requested Format:
+\newrobustcmd*{\ethesis@format}{digital}
+\DeclareOption{print}{\renewrobustcmd*{\ethesis@format}{print}}
+\DeclareOption{digital}{\renewrobustcmd*{\ethesis@format}{digital}}
+
+\ProcessOptions\relax
+
+\def\ifformat#1#2#3{\ifdefstring{\ethesis@format}{#1}{#2}{#3}}
+
+\ifformat{print}{%
+  \LoadClass[letterpaper,12pt,titlepage,openright,twoside,final]{book}%
+}{%
+  \LoadClass[letterpaper,12pt,titlepage,twoside,final]{book}%
+}
+
+% Setting up the page margins. These are the minimum margins in the uWaterloo
+% thesis requirements. 1in (72pt) on the top, bottom and outside and
+% 1 1/8in (81pt) on the inside/gutter/binding side. Only required for
+% printing but here set for all formats.
+
+% If margin notes are used, you must adjust \textwidth, \marginparwidth and
+% \marginparsep so space between the margin notes and page edge is less than
+% 15mm (0.6in). I don't actually understand that instruction.
+
+\setlength{\marginparwidth}{0pt}
+
+% Width of space between body text and margin notes.
+\setlength{\marginparsep}{0pt}
+
+% Set width of margin on binding side. With oneside all pages are odd.
+\setlength{\evensidemargin}{0.125in}
+\setlength{\oddsidemargin}{0.125in}
+
+% Assuming US letter paper (8.5 in. x 11 in.) and side margins as above.
+\setlength{\textwidth}{6.375in}
+\raggedbottom
+
+% The following statement specifies the amount of space between paragraphs.
+% Other reasonable specifications are \bigskipamount and \smallskipamount.
+\setlength{\parskip}{\medskipamount}
+
+% The following statement controls the line spacing. You should not change
+% this value significantly (e.g. perhaps "1.2").
+\renewcommand{\baselinestretch}{1}
+
+% Normally every chapter will start on a recto (right-hand side) page. This
+% command is used to make sure the each section of the front pages starts on
+% a recto page. This will often require an empty verso (left-hand side) page
+% that should not have the page number printed on it.
+\let\origdoublepage\cleardoublepage
+\newcommand{\clearemptydoublepage}{%
+  \clearpage{\pagestyle{empty}\origdoublepage}}
+\let\cleardoublepage\clearemptydoublepage
+
+% Change the default name of the bibliography.
+\renewcommand*{\bibname}{References}
+
+% Configurations
+\def\setThesisTitle#1{\newrobustcmd*{\ethesis@title}{#1}}
+\def\setThesisAuthor#1{\newrobustcmd*{\ethesis@author}{#1}}
+\def\setThesisSubject#1{\newrobustcmd*{\ethesis@subject}{#1}}
+\def\setThesisKeywords#1{\newrobustcmd*{\ethesis@keywords}{#1}}
+
+% Includes the hyperref package loading a number of defaults.
+\newrobustcmd*{\usehyperrefpackage}[2][]{%
+  \usepackage[#1]{hyperref}
+  \hypersetup{
+    plainpages=false,       % Needed for Roman numbers in frontpages.
+    unicode=false,          % Non-Latin characters in Acrobat ^ ^ s bookmarks.
+    pdftoolbar=true,        % Show Acrobat ^ ^ s toolbar?
+    pdfmenubar=true,        % Show Acrobat ^ ^ s menu?
+    pdffitwindow=false,     % Window is not fit to page when opened.
+    pdfstartview={FitH},    % Fits the width of the page to the window.
+  }
+  \ifdef{\ethesis@title}{\hypersetup{pdftitle={\ethesis@title}}}{}
+  \ifdef{\ethesis@author}{\hypersetup{pdfauthor={\ethesis@author}}}{}
+  \ifdef{\ethesis@subject}{\hypersetup{pdfsubject={\ethesis@subject}}}{}
+  \ifdef{\ethesis@keywords}{\hypersetup{pdfkeywords={\ethesis@keywords}}}{}
+  \ifformat{print}{
+    \hypersetup{
+      %colorlinks=false,
+      colorlinks=true, % I think there is a style difference here.
+      citecolor=black,
+      filecolor=black,
+      linkcolor=black,
+      urlcolor=black
+    }
+  }{
+    \hypersetup{
+      colorlinks=true,        % false: boxed links; true: colored links
+      linkcolor=blue,         % colour of internal links
+      citecolor=green,        % colour of links to bibliography
+      filecolor=magenta,      % colour of file links
+      urlcolor=cyan           % colour of external links
+    }
+  }
+  \notblank{#2}{\hypersetup{#2}}{}
+}
+
+% Includes the glossaries-extra package and sets up some helpers.
+% Except right now I don't really have any helpers to add.
+%\newrobustcmd*{\useglossariesextrapackage}[2][]{%
+%  \usepackage[#1]{glossaries-extra}
+%}
Index: doc/theses/thierry_delisle_PhD/comp_II/comp_II.tex
===================================================================
--- doc/theses/thierry_delisle_PhD/comp_II/comp_II.tex	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ doc/theses/thierry_delisle_PhD/comp_II/comp_II.tex	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -8,7 +8,7 @@
 \usepackage{graphicx}
 \usepackage{epic,eepic}
-\usepackage[hidelinks]{hyperref}
 \usepackage{glossaries}
 \usepackage{textcomp}
+\usepackage[hidelinks]{hyperref}
 %\usepackage[margin=1in]{geometry}
 %\usepackage{float}
@@ -151,7 +151,7 @@
 \begin{table}
 	\begin{center}
-		\begin{tabular}{|c|c|c|}
-			\hline
-			& Many Processors & Few Processors \\
+		\begin{tabular}{|r|l|l|}
+			\cline{2-3}
+			\multicolumn{1}{r|}{} & \multicolumn{1}{c|}{Many Processors} & \multicolumn{1}{c|}{Few Processors} \\
 			\hline
 			Many Threads & A: good performance & B: good performance \\
@@ -260,20 +260,18 @@
 
 
-\cleardoublepage
-
 % B I B L I O G R A P H Y
 % -----------------------------
-\addcontentsline{toc}{chapter}{Bibliography}
+\cleardoublepage
+\phantomsection		% allows hyperref to link to the correct page
+\addcontentsline{toc}{section}{\refname}
 \bibliographystyle{plain}
 \bibliography{pl,local}
+
+% G L O S S A R Y
+% -----------------------------
 \cleardoublepage
 \phantomsection		% allows hyperref to link to the correct page
-
-% G L O S S A R Y
-% -----------------------------
-\addcontentsline{toc}{chapter}{Glossary}
+\addcontentsline{toc}{section}{Glossary}
 \printglossary
-\cleardoublepage
-\phantomsection		% allows hyperref to link to the correct page
 
 \end{document}
Index: libcfa/prelude/builtins.c
===================================================================
--- libcfa/prelude/builtins.c	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ libcfa/prelude/builtins.c	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -48,4 +48,28 @@
 void exit( int status, const char fmt[], ... ) __attribute__ (( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ ));
 void abort( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ ));
+
+forall(dtype T)
+static inline T & identity(T & i) {
+	return i;
+}
+
+// generator support
+struct $generator {
+	inline int;
+};
+
+static inline void  ?{}($generator & this) { ((int&)this) = 0; }
+static inline void ^?{}($generator &) {}
+
+trait is_generator(dtype T) {
+      void main(T & this);
+      $generator * get_generator(T & this);
+};
+
+forall(dtype T | is_generator(T))
+static inline T & resume(T & gen) {
+	main(gen);
+	return gen;
+}
 
 // implicit increment, decrement if += defined, and implicit not if != defined
Index: libcfa/src/Makefile.am
===================================================================
--- libcfa/src/Makefile.am	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ libcfa/src/Makefile.am	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 08:54:01 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Mon Jul 15 22:43:27 2019
-## Update Count     : 241
+## Last Modified On : Mon Mar 16 18:07:59 2020
+## Update Count     : 242
 ###############################################################################
 
@@ -39,5 +39,5 @@
 #----------------------------------------------------------------------------------------------------------------
 if BUILDLIB
-headers_nosrc = math.hfa gmp.hfa time_t.hfa bits/align.hfa bits/containers.hfa bits/defs.hfa bits/debug.hfa bits/locks.hfa
+headers_nosrc = bitmanip.hfa math.hfa gmp.hfa time_t.hfa bits/align.hfa bits/containers.hfa bits/defs.hfa bits/debug.hfa bits/locks.hfa
 headers = fstream.hfa iostream.hfa iterator.hfa limits.hfa rational.hfa time.hfa stdlib.hfa common.hfa \
 	  containers/maybe.hfa containers/pair.hfa containers/result.hfa containers/vector.hfa
Index: libcfa/src/Makefile.in
===================================================================
--- libcfa/src/Makefile.in	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ libcfa/src/Makefile.in	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -237,5 +237,5 @@
 	limits.hfa rational.hfa time.hfa stdlib.hfa common.hfa \
 	containers/maybe.hfa containers/pair.hfa containers/result.hfa \
-	containers/vector.hfa math.hfa gmp.hfa time_t.hfa \
+	containers/vector.hfa bitmanip.hfa math.hfa gmp.hfa time_t.hfa \
 	bits/align.hfa bits/containers.hfa bits/defs.hfa \
 	bits/debug.hfa bits/locks.hfa concurrency/coroutine.hfa \
@@ -432,11 +432,15 @@
 am__v_GOC_0 = @echo "  GOC     " $@;
 am__v_GOC_1 = 
+AM_V_PY = $(am__v_PY_@AM_V@)
+am__v_PY_ = $(am__v_PY_@AM_DEFAULT_V@)
+am__v_PY_0 = @echo "  PYTHON  " $@;
+am__v_PY_1 = 
 AM_V_RUST = $(am__v_RUST_@AM_V@)
 am__v_RUST_ = $(am__v_RUST_@AM_DEFAULT_V@)
-am__v_RUST_0 = @echo "  RUST     " $@;
+am__v_RUST_0 = @echo "  RUST    " $@;
 am__v_RUST_1 = 
 AM_V_NODEJS = $(am__v_NODEJS_@AM_V@)
 am__v_NODEJS_ = $(am__v_NODEJS_@AM_DEFAULT_V@)
-am__v_NODEJS_0 = @echo "  NODEJS     " $@;
+am__v_NODEJS_0 = @echo "  NODEJS  " $@;
 am__v_NODEJS_1 = 
 AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
@@ -457,5 +461,5 @@
 
 #----------------------------------------------------------------------------------------------------------------
-@BUILDLIB_TRUE@headers_nosrc = math.hfa gmp.hfa time_t.hfa bits/align.hfa bits/containers.hfa bits/defs.hfa bits/debug.hfa bits/locks.hfa
+@BUILDLIB_TRUE@headers_nosrc = bitmanip.hfa math.hfa gmp.hfa time_t.hfa bits/align.hfa bits/containers.hfa bits/defs.hfa bits/debug.hfa bits/locks.hfa
 @BUILDLIB_FALSE@headers = 
 @BUILDLIB_TRUE@headers = fstream.hfa iostream.hfa iterator.hfa limits.hfa rational.hfa time.hfa stdlib.hfa common.hfa \
Index: libcfa/src/bitmanip.hfa
===================================================================
--- libcfa/src/bitmanip.hfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ libcfa/src/bitmanip.hfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,86 @@
+//                               -*- Mode: C -*- 
+// 
+// Cforall Version 1.0.0 Copyright (C) 2020 University of Waterloo
+// 
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// bitmanip.hfa -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Sat Mar 14 18:12:27 2020
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Mon Mar 16 14:28:46 2020
+// Update Count     : 49
+// 
+
+#pragma once
+
+// Reference: Bit Twiddling Hacks: http://graphics.stanford.edu/%7Eseander/bithacks.html#CountBitsSetNaive
+
+// Bits are numbered 1-N.
+
+#include <assert.h>
+
+static inline {
+    // Count leading 0 bits.
+    unsigned int cl0( unsigned char n ) { return n != 0 ? __builtin_clz( n ) - (sizeof(unsigned int) * __CHAR_BIT__ - sizeof(n) * __CHAR_BIT__) : sizeof(n) * __CHAR_BIT__; }
+    unsigned int cl0( unsigned short int n ) { return n != 0 ? __builtin_clz( n ) - (sizeof(unsigned int) * __CHAR_BIT__ - sizeof(n) * __CHAR_BIT__) : sizeof(n) * __CHAR_BIT__; }
+    unsigned int cl0( unsigned int n ) { return n != 0 ? __builtin_clz( n ) : sizeof(n) * __CHAR_BIT__; }
+    unsigned int cl0( unsigned long int n ) { return n != 0 ? __builtin_clzl( n ) : sizeof(n) * __CHAR_BIT__; }
+    unsigned int cl0( unsigned long long int n ) { return n != 0 ? __builtin_clzll( n ) : sizeof(n) * __CHAR_BIT__; }
+
+    // Count trailing 0 bits.
+    unsigned int ct0( unsigned char n ) { return n != 0 ? __builtin_ctz( n ) : sizeof(n) * __CHAR_BIT__; }
+    unsigned int ct0( unsigned short int n ) { return n != 0 ? __builtin_ctz( n ) : sizeof(n) * __CHAR_BIT__; }
+    unsigned int ct0( unsigned int n ) { return n != 0 ? __builtin_ctz( n ) : sizeof(n) * __CHAR_BIT__; }
+    unsigned int ct0( unsigned long int n ) { return n != 0 ? __builtin_ctzl( n ) : sizeof(n) * __CHAR_BIT__; }
+    unsigned int ct0( unsigned long long int n ) { return n != 0 ? __builtin_ctzll( n ) : sizeof(n) * __CHAR_BIT__; }
+
+    // Count all 1 bits.
+    unsigned int ca1( unsigned char n ) { return __builtin_popcount( n ); }
+    unsigned int ca1( unsigned short int n ) { return __builtin_popcount( n ); }
+    unsigned int ca1( unsigned int n ) { return __builtin_popcount( n ); }
+    unsigned int ca1( unsigned long int n ) { return __builtin_popcountl( n ); }
+    unsigned int ca1( unsigned long long int n ) { return __builtin_popcountll( n ); }
+
+    // Count all 0 bits.
+    unsigned int ca0( unsigned char n ) { return sizeof(n) * __CHAR_BIT__ - __builtin_popcount( n ); }
+    unsigned int ca0( unsigned short int n ) { return sizeof(n) * __CHAR_BIT__ - __builtin_popcount( n ); }
+    unsigned int ca0( unsigned int n ) { return sizeof(n) * __CHAR_BIT__ - __builtin_popcount( n ); }
+    unsigned int ca0( unsigned long int n ) { return sizeof(n) * __CHAR_BIT__ - __builtin_popcountl( n ); }
+    unsigned int ca0( unsigned long long int n ) { return sizeof(n) * __CHAR_BIT__ - __builtin_popcountll( n ); }
+
+    // Find least significiant set bit. (ffs)
+    unsigned int fls( unsigned int n ) { return __builtin_ffs( n ); }
+    unsigned int fls( unsigned long int n ) { return __builtin_ffsl( n ); }
+    unsigned int fls( unsigned long long int n ) { return __builtin_ffsll( n ); }
+
+    // Find most significiant set bit.
+    unsigned int fms( unsigned char n ) { return n != 0 ? sizeof(unsigned int) * __CHAR_BIT__ - __builtin_clz( n ) : 0; }
+    unsigned int fms( unsigned short int n ) { return n != 0 ? sizeof(unsigned int) * __CHAR_BIT__ - __builtin_clz( n ) : 0; }
+    unsigned int fms( unsigned int n ) { return n != 0 ? sizeof(n) * __CHAR_BIT__ - __builtin_clz( n ) : 0; }
+    unsigned int fms( unsigned long int n ) { return n != 0 ? sizeof(n) * __CHAR_BIT__ - __builtin_clzl( n ) : 0; }
+    unsigned int fms( unsigned long long int n ) { return n != 0 ? sizeof(n) * __CHAR_BIT__ - __builtin_clzll( n ) : 0; }
+
+    // Check for power of 2
+    bool pow2( unsigned long int value ) {
+		return (value & (value - 1)) == 0;				// clears bits below value, rounding down to the next lower multiple of value
+    } // pow2
+
+    // Returns value aligned at the floor of align.
+    unsigned long int floor( unsigned long int value, unsigned long int align ) {
+		assert( pow2( align ) );
+		return value & -align;							// clear bits above or equal to align, giving value % align
+    } // floor
+
+    // Returns value aligned at the ceiling of align.
+    unsigned long int ceiling( unsigned long int value, unsigned long int align ) {
+		assert( pow2( align ) );
+		return -floor( -value, align );					// negate, round down, negate is the same as round up
+    } // ceiling
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// End: //
Index: libcfa/src/concurrency/coroutine.cfa
===================================================================
--- libcfa/src/concurrency/coroutine.cfa	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ libcfa/src/concurrency/coroutine.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -208,5 +208,5 @@
 
 		if(cor->state == Primed) {
-			suspend();
+			__cfactx_suspend();
 		}
 
Index: libcfa/src/concurrency/coroutine.hfa
===================================================================
--- libcfa/src/concurrency/coroutine.hfa	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ libcfa/src/concurrency/coroutine.hfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -46,9 +46,4 @@
 //-----------------------------------------------------------------------------
 // Public coroutine API
-static inline void suspend(void);
-
-forall(dtype T | is_coroutine(T))
-static inline T & resume(T & cor);
-
 forall(dtype T | is_coroutine(T))
 void prime(T & cor);
@@ -96,22 +91,24 @@
 
 // Suspend implementation inlined for performance
-static inline void suspend(void) {
-	// optimization : read TLS once and reuse it
-	// Safety note: this is preemption safe since if
-	// preemption occurs after this line, the pointer
-	// will also migrate which means this value will
-	// stay in syn with the TLS
-	$coroutine * src = TL_GET( this_thread )->curr_cor;
+extern "C" {
+	static inline void __cfactx_suspend(void) {
+		// optimization : read TLS once and reuse it
+		// Safety note: this is preemption safe since if
+		// preemption occurs after this line, the pointer
+		// will also migrate which means this value will
+		// stay in syn with the TLS
+		$coroutine * src = TL_GET( this_thread )->curr_cor;
 
-	assertf( src->last != 0,
-		"Attempt to suspend coroutine \"%.256s\" (%p) that has never been resumed.\n"
-		"Possible cause is a suspend executed in a member called by a coroutine user rather than by the coroutine main.",
-		src->name, src );
-	assertf( src->last->state != Halted,
-		"Attempt by coroutine \"%.256s\" (%p) to suspend back to terminated coroutine \"%.256s\" (%p).\n"
-		"Possible cause is terminated coroutine's main routine has already returned.",
-		src->name, src, src->last->name, src->last );
+		assertf( src->last != 0,
+			"Attempt to suspend coroutine \"%.256s\" (%p) that has never been resumed.\n"
+			"Possible cause is a suspend executed in a member called by a coroutine user rather than by the coroutine main.",
+			src->name, src );
+		assertf( src->last->state != Halted,
+			"Attempt by coroutine \"%.256s\" (%p) to suspend back to terminated coroutine \"%.256s\" (%p).\n"
+			"Possible cause is terminated coroutine's main routine has already returned.",
+			src->name, src, src->last->name, src->last );
 
-	$ctx_switch( src, src->last );
+		$ctx_switch( src, src->last );
+	}
 }
 
Index: libcfa/src/exception.c
===================================================================
--- libcfa/src/exception.c	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ libcfa/src/exception.c	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -252,7 +252,4 @@
 }
 
-#pragma GCC push_options
-#pragma GCC optimize("O0")
-
 // This is our personality routine. For every stack frame annotated with
 // ".cfi_personality 0x3,__gcfa_personality_v0" this function will be called twice when unwinding.
@@ -413,4 +410,7 @@
 	return _URC_CONTINUE_UNWIND;
 }
+
+#pragma GCC push_options
+#pragma GCC optimize("O0")
 
 // Try statements are hoisted out see comments for details. While this could probably be unique
Index: libcfa/src/interpose.cfa
===================================================================
--- libcfa/src/interpose.cfa	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ libcfa/src/interpose.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -10,6 +10,6 @@
 // Created On       : Wed Mar 29 16:10:31 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Mar  2 17:37:00 2020
-// Update Count     : 176
+// Last Modified On : Fri Mar 13 17:35:37 2020
+// Update Count     : 178
 //
 
@@ -234,5 +234,5 @@
 
 	if ( fmt[strlen( fmt ) - 1] != '\n' ) {				// add optional newline if missing at the end of the format text
-		__cfaabi_dbg_write( "\n", 1 );
+		__cfaabi_bits_write( STDERR_FILENO, "\n", 1 );
 	} // if
 	kernel_abort_msg( kernel_data, abort_text, abort_text_size );
Index: libcfa/src/iostream.cfa
===================================================================
--- libcfa/src/iostream.cfa	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ libcfa/src/iostream.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar  5 15:56:16 2020
-// Update Count     : 834
+// Last Modified On : Wed Mar 11 14:35:35 2020
+// Update Count     : 860
 //
 
@@ -534,18 +534,20 @@
 #define IntegralFMTImpl128( T, SIGNED, CODE, IFMTNP, IFMTP ) \
 forall( dtype ostype | ostream( ostype ) ) \
-static void base10_128( ostype & os, _Ostream_Manip(T) fmt ) { \
-	if ( fmt.val > UINT64_MAX ) { \
-		base10_128( os, fmt.val / P10_UINT64 ); /* recursive */ \
-		_Ostream_Manip(unsigned long long int) fmt2 @= { (uint64_t)(fmt.val % P10_UINT64), 0, 19, 'u', { .all : 0 } }; \
-		fmt2.flags.nobsdp = true; \
-		printf( "fmt2 %c %lld %d\n", fmt2.base, fmt2.val, fmt2.all );	\
+static void base10_128( ostype & os, _Ostream_Manip(T) f ) { \
+	if ( f.val > UINT64_MAX ) { \
+		unsigned long long int lsig = f.val % P10_UINT64; \
+		f.val /= P10_UINT64; /* msig */ \
+		base10_128( os, f ); /* recursion */ \
+		_Ostream_Manip(unsigned long long int) fmt @= { lsig, 0, 19, 'u', { .all : 0 } }; \
+		fmt.flags.nobsdp = true; \
+		/* printf( "fmt1 %c %lld %d\n", fmt.base, fmt.val, fmt.all ); */ \
 		sepOff( os ); \
-		(ostype &)(os | fmt2); \
+		(ostype &)(os | fmt); \
 	} else { \
-		printf( "fmt %c %lld %d\n", fmt.base, (unsigned long long int)fmt.val, fmt.all ); \
-		_Ostream_Manip(SIGNED long long int) x @= { (unsigned long long int)fmt.val, fmt.wd, fmt.pc, fmt.base, { .all : fmt.all } }; \
-		(ostype &)(os | x); \
+		/* printf( "fmt2 %c %lld %d\n", f.base, (unsigned long long int)f.val, f.all ); */ \
+		_Ostream_Manip(SIGNED long long int) fmt @= { (SIGNED long long int)f.val, f.wd, f.pc, f.base, { .all : f.all } }; \
+		(ostype &)(os | fmt); \
 	} /* if */ \
-} /* base10_128 */						   \
+} /* base10_128 */ \
 forall( dtype ostype | ostream( ostype ) ) { \
 	ostype & ?|?( ostype & os, _Ostream_Manip(T) f ) { \
@@ -564,4 +566,5 @@
 				if ( f.base == 'b' | f.base == 'B' ) { \
 					if ( f.wd > 64 ) fmt.wd = f.wd - 64; \
+					if ( f.flags.pc && f.pc > 64 ) fmt.pc = f.pc - 64; \
 					fmt2.wd = 64; \
 					(ostype &)(os | fmt | "" | fmt2); \
@@ -569,4 +572,5 @@
 					fmt.val = (unsigned long long int)fmt.val >> 2; \
 					if ( f.wd > 21 ) fmt.wd = f.wd - 21; \
+					if ( f.flags.pc && f.pc > 21 ) fmt.pc = f.pc - 21; \
 					fmt2.wd = 1; \
 					fmt2.val = ((msig & 0x3) << 1) + 1; \
@@ -578,9 +582,10 @@
 				} else { \
 					if ( f.flags.left ) { \
-						if ( f.wd > 16 ) fmt2.wd = f.wd - 16;	\
-						fmt.wd = 16;							\
+						if ( f.wd > 16 ) fmt2.wd = f.wd - 16; \
+						fmt.wd = 16; \
 					} else { \
-						if ( f.wd > 16 ) fmt.wd = f.wd - 16;	\
-						fmt2.wd = 16;							\
+						if ( f.wd > 16 ) fmt.wd = f.wd - 16; \
+						if ( f.flags.pc && f.pc > 16 ) fmt.pc = f.pc - 16; \
+						fmt2.wd = 16; \
 					} /* if */ \
 					(ostype &)(os | fmt | "" | fmt2); \
@@ -588,4 +593,7 @@
 			} /* if */ \
 		} else { \
+			if ( CODE == 'd' ) { \
+				if ( f.val < 0 )  { fmt( os, "-" ); sepOff( os ); f.val = -f.val; f.flags.sign = false; } \
+			} /* if */ \
 			base10_128( os, f ); \
 		} /* if */ \
Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/AST/Convert.cpp	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -493,4 +493,16 @@
 	}
 
+	const ast::Stmt * visit(const ast::SuspendStmt * node ) override final {
+		if ( inCache( node ) ) return nullptr;
+		auto stmt = new SuspendStmt();
+		stmt->then   = get<CompoundStmt>().accept1( node->then   );
+		switch(node->type) {
+			case ast::SuspendStmt::None     : stmt->type = SuspendStmt::None     ; break;
+			case ast::SuspendStmt::Coroutine: stmt->type = SuspendStmt::Coroutine; break;
+			case ast::SuspendStmt::Generator: stmt->type = SuspendStmt::Generator; break;
+		}
+		return stmtPostamble( stmt, node );
+	}
+
 	const ast::Stmt * visit( const ast::WaitForStmt * node ) override final {
 		if ( inCache( node ) ) return nullptr;
@@ -1859,4 +1871,22 @@
 	}
 
+	virtual void visit( const SuspendStmt * old ) override final {
+		if ( inCache( old ) ) return;
+		ast::SuspendStmt::Type type;
+		switch (old->type) {
+			case SuspendStmt::Coroutine: type = ast::SuspendStmt::Coroutine; break;
+			case SuspendStmt::Generator: type = ast::SuspendStmt::Generator; break;
+			case SuspendStmt::None     : type = ast::SuspendStmt::None     ; break;
+			default: abort();
+		}
+		this->node = new ast::SuspendStmt(
+			old->location,
+			GET_ACCEPT_1(then  , CompoundStmt),
+			type,
+			GET_LABELS_V(old->labels)
+		);
+		cache.emplace( old, this->node );
+	}
+
 	virtual void visit( const WaitForStmt * old ) override final {
 		if ( inCache( old ) ) return;
Index: src/AST/Decl.hpp
===================================================================
--- src/AST/Decl.hpp	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/AST/Decl.hpp	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -259,6 +259,7 @@
 
 	bool is_coroutine() { return kind == Coroutine; }
-	bool is_monitor() { return kind == Monitor; }
-	bool is_thread() { return kind == Thread; }
+	bool is_generator() { return kind == Generator; }
+	bool is_monitor  () { return kind == Monitor  ; }
+	bool is_thread   () { return kind == Thread   ; }
 
 	const Decl * accept( Visitor & v ) const override { return v.visit( this ); }
Index: src/AST/Fwd.hpp
===================================================================
--- src/AST/Fwd.hpp	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/AST/Fwd.hpp	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -53,4 +53,5 @@
 class CatchStmt;
 class FinallyStmt;
+class SuspendStmt;
 class WaitForStmt;
 class WithStmt;
Index: src/AST/Pass.hpp
===================================================================
--- src/AST/Pass.hpp	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/AST/Pass.hpp	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -111,4 +111,5 @@
 	const ast::Stmt *             visit( const ast::CatchStmt            * ) override final;
 	const ast::Stmt *             visit( const ast::FinallyStmt          * ) override final;
+	const ast::Stmt *             visit( const ast::SuspendStmt          * ) override final;
 	const ast::Stmt *             visit( const ast::WaitForStmt          * ) override final;
 	const ast::Decl *             visit( const ast::WithStmt             * ) override final;
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/AST/Pass.impl.hpp	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -823,4 +823,17 @@
 
 //--------------------------------------------------------------------------
+// FinallyStmt
+template< typename pass_t >
+const ast::Stmt * ast::Pass< pass_t >::visit( const ast::SuspendStmt * node ) {
+	VISIT_START( node );
+
+	VISIT(
+		maybe_accept( node, &SuspendStmt::then   );
+	)
+
+	VISIT_END( Stmt, node );
+}
+
+//--------------------------------------------------------------------------
 // WaitForStmt
 template< typename pass_t >
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/AST/Print.cpp	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -674,4 +674,23 @@
 		safe_print( node->body );
 		--indent;
+
+		return node;
+	}
+
+	virtual const ast::Stmt * visit( const ast::SuspendStmt * node ) override final {
+		os << "Suspend Statement";
+		switch (node->type) {
+			case ast::SuspendStmt::None     : os << " with implicit target"; break;
+			case ast::SuspendStmt::Generator: os << " for generator"; break;
+			case ast::SuspendStmt::Coroutine: os << " for coroutine"; break;
+		}
+		os << endl;
+
+		++indent;
+		if(node->then) {
+			os << indent << " with post statement :" << endl;
+			safe_print( node->then );
+		}
+		++indent;
 
 		return node;
Index: src/AST/Stmt.hpp
===================================================================
--- src/AST/Stmt.hpp	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/AST/Stmt.hpp	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -342,4 +342,19 @@
 };
 
+/// Suspend statement
+class SuspendStmt final : public Stmt {
+public:
+	ptr<CompoundStmt> then;
+	enum Type { None, Coroutine, Generator } type = None;
+
+	SuspendStmt( const CodeLocation & loc, const CompoundStmt * then, Type type, std::vector<Label> && labels = {} )
+	: Stmt(loc, std::move(labels)), then(then), type(type) {}
+
+	const Stmt * accept( Visitor & v ) const override { return v.visit( this ); }
+private:
+	SuspendStmt * clone() const override { return new SuspendStmt{ *this }; }
+	MUTATE_FRIEND
+};
+
 /// Wait for concurrency statement `when (...) waitfor (... , ...) ... timeout(...) ... else ...`
 class WaitForStmt final : public Stmt {
Index: src/AST/Visitor.hpp
===================================================================
--- src/AST/Visitor.hpp	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/AST/Visitor.hpp	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -47,4 +47,5 @@
     virtual const ast::Stmt *             visit( const ast::CatchStmt            * ) = 0;
     virtual const ast::Stmt *             visit( const ast::FinallyStmt          * ) = 0;
+    virtual const ast::Stmt *             visit( const ast::SuspendStmt          * ) = 0;
     virtual const ast::Stmt *             visit( const ast::WaitForStmt          * ) = 0;
     virtual const ast::Decl *             visit( const ast::WithStmt             * ) = 0;
Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/Common/PassVisitor.h	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -110,4 +110,6 @@
 	virtual void visit( FinallyStmt * finallyStmt ) override final;
 	virtual void visit( const FinallyStmt * finallyStmt ) override final;
+	virtual void visit( SuspendStmt * suspendStmt ) override final;
+	virtual void visit( const SuspendStmt * suspendStmt ) override final;
 	virtual void visit( WaitForStmt * waitforStmt ) override final;
 	virtual void visit( const WaitForStmt * waitforStmt ) override final;
@@ -276,4 +278,5 @@
 	virtual Statement * mutate( CatchStmt * catchStmt ) override final;
 	virtual Statement * mutate( FinallyStmt * finallyStmt ) override final;
+	virtual Statement * mutate( SuspendStmt * suspendStmt ) override final;
 	virtual Statement * mutate( WaitForStmt * waitforStmt ) override final;
 	virtual Declaration * mutate( WithStmt * withStmt ) override final;
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/Common/PassVisitor.impl.h	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -1522,4 +1522,33 @@
 
 //--------------------------------------------------------------------------
+// SuspendStmt
+template< typename pass_type >
+void PassVisitor< pass_type >::visit( SuspendStmt * node ) {
+	VISIT_START( node );
+
+	maybeAccept_impl( node->then  , *this );
+
+	VISIT_END( node );
+}
+
+template< typename pass_type >
+void PassVisitor< pass_type >::visit( const SuspendStmt * node ) {
+	VISIT_START( node );
+
+	maybeAccept_impl( node->then  , *this );
+
+	VISIT_END( node );
+}
+
+template< typename pass_type >
+Statement * PassVisitor< pass_type >::mutate( SuspendStmt * node ) {
+	MUTATE_START( node );
+
+	maybeMutate_impl( node->then  , *this );
+
+	MUTATE_END( Statement, node );
+}
+
+//--------------------------------------------------------------------------
 // WaitForStmt
 template< typename pass_type >
Index: src/Concurrency/Keywords.cc
===================================================================
--- src/Concurrency/Keywords.cc	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/Concurrency/Keywords.cc	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -16,21 +16,22 @@
 #include "Concurrency/Keywords.h"
 
-#include <cassert>                 // for assert
-#include <string>                  // for string, operator==
-
-#include "Common/PassVisitor.h"    // for PassVisitor
-#include "Common/SemanticError.h"  // for SemanticError
-#include "Common/utility.h"        // for deleteAll, map_range
-#include "CodeGen/OperatorTable.h" // for isConstructor
-#include "InitTweak/InitTweak.h"   // for getPointerBase
-#include "SynTree/LinkageSpec.h"   // for Cforall
-#include "SynTree/Constant.h"      // for Constant
-#include "SynTree/Declaration.h"   // for StructDecl, FunctionDecl, ObjectDecl
-#include "SynTree/Expression.h"    // for VariableExpr, ConstantExpr, Untype...
-#include "SynTree/Initializer.h"   // for SingleInit, ListInit, Initializer ...
-#include "SynTree/Label.h"         // for Label
-#include "SynTree/Statement.h"     // for CompoundStmt, DeclStmt, ExprStmt
-#include "SynTree/Type.h"          // for StructInstType, Type, PointerType
-#include "SynTree/Visitor.h"       // for Visitor, acceptAll
+#include <cassert>                        // for assert
+#include <string>                         // for string, operator==
+
+#include "Common/PassVisitor.h"           // for PassVisitor
+#include "Common/SemanticError.h"         // for SemanticError
+#include "Common/utility.h"               // for deleteAll, map_range
+#include "CodeGen/OperatorTable.h"        // for isConstructor
+#include "ControlStruct/LabelGenerator.h" // for LebelGenerator
+#include "InitTweak/InitTweak.h"          // for getPointerBase
+#include "SynTree/LinkageSpec.h"          // for Cforall
+#include "SynTree/Constant.h"             // for Constant
+#include "SynTree/Declaration.h"          // for StructDecl, FunctionDecl, ObjectDecl
+#include "SynTree/Expression.h"           // for VariableExpr, ConstantExpr, Untype...
+#include "SynTree/Initializer.h"          // for SingleInit, ListInit, Initializer ...
+#include "SynTree/Label.h"                // for Label
+#include "SynTree/Statement.h"            // for CompoundStmt, DeclStmt, ExprStmt
+#include "SynTree/Type.h"                 // for StructInstType, Type, PointerType
+#include "SynTree/Visitor.h"              // for Visitor, acceptAll
 
 class Attribute;
@@ -147,4 +148,6 @@
 	};
 
+
+
 	//-----------------------------------------------------------------------------
 	//Handles monitor type declarations :
@@ -180,4 +183,75 @@
 
 	//-----------------------------------------------------------------------------
+	//Handles generator type declarations :
+	// generator MyGenerator {                   struct MyGenerator {
+	// 	int data;                                  int data;
+	// 	a_struct_t more_data;                      a_struct_t more_data;
+	//                                =>             int __gen_next;
+	// };                                        };
+	//
+	class GeneratorKeyword final : public ConcurrentSueKeyword {
+	  public:
+
+	  	GeneratorKeyword() : ConcurrentSueKeyword(
+			"$generator",
+			"__generator_state",
+			"get_generator",
+			"Unable to find builtin type $generator\n",
+			true,
+			AggregateDecl::Generator
+		)
+		{}
+
+		virtual ~GeneratorKeyword() {}
+
+		virtual bool is_target( StructDecl * decl ) override final { return decl->is_generator(); }
+
+		static void implement( std::list< Declaration * > & translationUnit ) {
+			PassVisitor< GeneratorKeyword > impl;
+			mutateAll( translationUnit, impl );
+		}
+	};
+
+
+	//-----------------------------------------------------------------------------
+	class SuspendKeyword final : public WithStmtsToAdd, public WithGuards {
+	public:
+		SuspendKeyword() = default;
+		virtual ~SuspendKeyword() = default;
+
+		void  premutate( FunctionDecl * );
+		DeclarationWithType * postmutate( FunctionDecl * );
+
+		Statement * postmutate( SuspendStmt * );
+
+		static void implement( std::list< Declaration * > & translationUnit ) {
+			PassVisitor< SuspendKeyword > impl;
+			mutateAll( translationUnit, impl );
+		}
+
+	private:
+		DeclarationWithType * is_main( FunctionDecl * );
+		bool is_real_suspend( FunctionDecl * );
+
+		Statement * make_generator_suspend( SuspendStmt * );
+		Statement * make_coroutine_suspend( SuspendStmt * );
+
+		struct LabelPair {
+			Label obj;
+			int   idx;
+		};
+
+		LabelPair make_label() {
+			labels.push_back( gen.newLabel("generator") );
+			return { labels.back(), int(labels.size()) };
+		}
+
+		DeclarationWithType * in_generator = nullptr;
+		FunctionDecl * decl_suspend = nullptr;
+		std::vector<Label> labels;
+		ControlStruct::LabelGenerator & gen = *ControlStruct::LabelGenerator::getGenerator();
+	};
+
+	//-----------------------------------------------------------------------------
 	//Handles mutex routines definitions :
 	// void foo( A * mutex a, B * mutex b,  int i ) {                  void foo( A * a, B * b,  int i ) {
@@ -251,4 +325,6 @@
 		CoroutineKeyword	::implement( translationUnit );
 		MonitorKeyword	::implement( translationUnit );
+		GeneratorKeyword  ::implement( translationUnit );
+		SuspendKeyword    ::implement( translationUnit );
 	}
 
@@ -446,7 +522,236 @@
 
 		declsToAddAfter.push_back( get_decl );
-
-		// get_decl->fixUniqueId();
-	}
+	}
+
+	//=============================================================================================
+	// Suspend keyword implementation
+	//=============================================================================================
+	DeclarationWithType * SuspendKeyword::is_main( FunctionDecl * func) {
+		if(func->name != "main") return nullptr;
+		if(func->type->parameters.size() != 1) return nullptr;
+
+		auto param = func->type->parameters.front();
+
+		auto type  = dynamic_cast<ReferenceType * >(param->get_type());
+		if(!type) return nullptr;
+
+		auto obj   = dynamic_cast<StructInstType *>(type->base);
+		if(!obj) return nullptr;
+
+		if(!obj->baseStruct->is_generator()) return nullptr;
+
+		return param;
+	}
+
+	bool SuspendKeyword::is_real_suspend( FunctionDecl * func ) {
+		if(isMangled(func->linkage)) return false; // the real suspend isn't mangled
+		if(func->name != "__cfactx_suspend") return false; // the real suspend has a specific name
+		if(func->type->parameters.size() != 0) return false; // Too many parameters
+		if(func->type->returnVals.size() != 0) return false; // Too many return values
+
+		return true;
+	}
+
+	void SuspendKeyword::premutate( FunctionDecl * func ) {
+		GuardValue(in_generator);
+		in_generator = nullptr;
+
+		// Is this the real suspend?
+		if(is_real_suspend(func)) {
+			decl_suspend = decl_suspend ? decl_suspend : func;
+			return;
+		}
+
+		// Is this the main of a generator?
+		auto param = is_main( func );
+		if(!param) return;
+
+		if(func->type->returnVals.size() != 0) SemanticError(func->location, "Generator main must return void");
+
+		in_generator = param;
+		GuardValue(labels);
+		labels.clear();
+	}
+
+	DeclarationWithType * SuspendKeyword::postmutate( FunctionDecl * func ) {
+		if( !func->statements ) return func; // Not the actual definition, don't do anything
+		if( !in_generator     ) return func; // Not in a generator, don't do anything
+		if( labels.empty()    ) return func; // Generator has no states, nothing to do, could throw a warning
+
+		// This is a generator main, we need to add the following code to the top
+		// static void * __generator_labels[] = {&&s0, &&s1, ...};
+		// goto * __generator_labels[gen.__generator_state];
+		const auto & loc = func->location;
+
+		const auto first_label = gen.newLabel("generator");
+
+		// for each label add to declaration
+		std::list<Initializer*> inits = { new SingleInit( new LabelAddressExpr( first_label ) ) };
+		for(const auto & label : labels) {
+			inits.push_back(
+				new SingleInit(
+					new LabelAddressExpr( label )
+				)
+			);
+		}
+		auto init = new ListInit(std::move(inits), noDesignators, true);
+		labels.clear();
+
+		// create decl
+		auto decl = new ObjectDecl(
+			"__generator_labels",
+			Type::StorageClasses( Type::Static ),
+			LinkageSpec::AutoGen,
+			nullptr,
+			new ArrayType(
+				Type::Qualifiers(),
+				new PointerType(
+					Type::Qualifiers(),
+					new VoidType( Type::Qualifiers() )
+				),
+				nullptr,
+				false, false
+			),
+			init
+		);
+
+		// create the goto
+		assert(in_generator);
+
+		auto go_decl = new ObjectDecl(
+			"__generator_label",
+			noStorageClasses,
+			LinkageSpec::AutoGen,
+			nullptr,
+			new PointerType(
+				Type::Qualifiers(),
+				new VoidType( Type::Qualifiers() )
+			),
+			new SingleInit(
+				new UntypedExpr(
+					new NameExpr("?[?]"),
+					{
+						new NameExpr("__generator_labels"),
+						new UntypedMemberExpr(
+							new NameExpr("__generator_state"),
+							new VariableExpr( in_generator )
+						)
+					}
+				)
+			)
+		);
+		go_decl->location = loc;
+
+		auto go = new BranchStmt(
+			new VariableExpr( go_decl ),
+			BranchStmt::Goto
+		);
+		go->location = loc;
+		go->computedTarget->location = loc;
+
+		auto noop = new NullStmt({ first_label });
+		noop->location = loc;
+
+		// wrap everything in a nice compound
+		auto body = new CompoundStmt({
+			new DeclStmt( decl ),
+			new DeclStmt( go_decl ),
+			go,
+			noop,
+			func->statements
+		});
+		body->location   = loc;
+		func->statements = body;
+
+		return func;
+	}
+
+	Statement * SuspendKeyword::postmutate( SuspendStmt * stmt ) {
+		SuspendStmt::Type type = stmt->type;
+		if(type == SuspendStmt::None) {
+			// This suspend has a implicit target, find it
+			type = in_generator ? SuspendStmt::Generator : SuspendStmt::Coroutine;
+		}
+
+		// Check that the target makes sense
+		if(!in_generator && type == SuspendStmt::Generator) SemanticError( stmt->location, "'suspend generator' must be used inside main of generator type.");
+
+		// Act appropriately
+		switch(type) {
+			case SuspendStmt::Generator: return make_generator_suspend(stmt);
+			case SuspendStmt::Coroutine: return make_coroutine_suspend(stmt);
+			default: abort();
+		}
+	}
+
+	Statement * SuspendKeyword::make_generator_suspend( SuspendStmt * stmt ) {
+		assert(in_generator);
+		// Target code is :
+		//   gen.__generator_state = X;
+		//   { THEN }
+		//   return;
+		//   __gen_X:;
+
+		// Save the location and delete the old statement, we only need the location from this point on
+		auto loc = stmt->location;
+
+		// Build the label and get its index
+		auto label = make_label();
+
+		// Create the context saving statement
+		auto save = new ExprStmt( new UntypedExpr(
+			new NameExpr( "?=?" ),
+			{
+				new UntypedMemberExpr(
+					new NameExpr("__generator_state"),
+					new VariableExpr( in_generator )
+				),
+				new ConstantExpr(
+					Constant::from_int( label.idx )
+				)
+			}
+		));
+		assert(save->expr);
+		save->location = loc;
+		stmtsToAddBefore.push_back( save );
+
+		// if we have a then add it here
+		auto then = stmt->then;
+		stmt->then = nullptr;
+		delete stmt;
+		if(then) stmtsToAddBefore.push_back( then );
+
+		// Create the return statement
+		auto ret = new ReturnStmt( nullptr );
+		ret->location = loc;
+		stmtsToAddBefore.push_back( ret );
+
+		// Create the null statement with the created label
+		auto noop = new NullStmt({ label.obj });
+		noop->location = loc;
+
+		// Return the null statement to take the place of the previous statement
+		return noop;
+	}
+
+	Statement * SuspendKeyword::make_coroutine_suspend( SuspendStmt * stmt ) {
+		if(stmt->then) SemanticError( stmt->location, "Compound statement following coroutines is not implemented.");
+
+		// Save the location and delete the old statement, we only need the location from this point on
+		auto loc = stmt->location;
+		delete stmt;
+
+		// Create the call expression
+		if(!decl_suspend) SemanticError( loc, "suspend keyword applied to coroutines requires coroutines to be in scope, add #include <coroutine.hfa>\n");
+		auto expr = new UntypedExpr( VariableExpr::functionPointer( decl_suspend ) );
+		expr->location = loc;
+
+		// Change this statement into a regular expr
+		assert(expr);
+		auto nstmt = new ExprStmt( expr );
+		nstmt->location = loc;
+		return nstmt;
+	}
+
 
 	//=============================================================================================
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/Parser/ParseNode.h	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -428,4 +428,5 @@
 Statement * build_asm( bool voltile, Expression * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr );
 Statement * build_directive( std::string * directive );
+SuspendStmt * build_suspend( StatementNode *, SuspendStmt::Type = SuspendStmt::None);
 WaitForStmt * build_waitfor( ExpressionNode * target, StatementNode * stmt, ExpressionNode * when );
 WaitForStmt * build_waitfor( ExpressionNode * target, StatementNode * stmt, ExpressionNode * when, WaitForStmt * existing );
Index: src/Parser/StatementNode.cc
===================================================================
--- src/Parser/StatementNode.cc	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/Parser/StatementNode.cc	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -249,4 +249,19 @@
 } // build_finally
 
+SuspendStmt * build_suspend( StatementNode * then, SuspendStmt::Type type ) {
+	auto node = new SuspendStmt();
+
+	node->type = type;
+
+	std::list< Statement * > stmts;
+	buildMoveList< Statement, StatementNode >( then, stmts );
+	if(!stmts.empty()) {
+		assert( stmts.size() == 1 );
+		node->then = dynamic_cast< CompoundStmt * >( stmts.front() );
+	}
+
+	return node;
+}
+
 WaitForStmt * build_waitfor( ExpressionNode * targetExpr, StatementNode * stmt, ExpressionNode * when ) {
 	auto node = new WaitForStmt();
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/Parser/TypeData.cc	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -769,4 +769,5 @@
 	  case AggregateDecl::Struct:
 	  case AggregateDecl::Coroutine:
+	  case AggregateDecl::Generator:
 	  case AggregateDecl::Monitor:
 	  case AggregateDecl::Thread:
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/Parser/lex.ll	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -65,5 +65,5 @@
 #define FLOATXX(v) KEYWORD_RETURN(v);
 #else
-#define FLOATXX(v) IDENTIFIER_RETURN();	
+#define FLOATXX(v) IDENTIFIER_RETURN();
 #endif // HAVE_KEYWORDS_FLOATXX
 
@@ -301,5 +301,5 @@
 _Static_assert	{ KEYWORD_RETURN(STATICASSERT); }		// C11
 struct			{ KEYWORD_RETURN(STRUCT); }
-	/* suspend			{ KEYWORD_RETURN(SUSPEND); }			// CFA */
+suspend			{ KEYWORD_RETURN(SUSPEND); }			// CFA
 switch			{ KEYWORD_RETURN(SWITCH); }
 thread			{ KEYWORD_RETURN(THREAD); }				// C11
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/Parser/parser.yy	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 26 14:27:39 2020
-// Update Count     : 4472
+// Last Modified On : Fri Mar  6 17:26:45 2020
+// Update Count     : 4474
 //
 
@@ -278,5 +278,6 @@
 %token OTYPE FTYPE DTYPE TTYPE TRAIT					// CFA
 %token SIZEOF OFFSETOF
-// %token SUSPEND RESUME									// CFA
+// %token RESUME									// CFA
+%token SUSPEND									// CFA
 %token ATTRIBUTE EXTENSION								// GCC
 %token IF ELSE SWITCH CASE DEFAULT DO WHILE FOR BREAK CONTINUE GOTO RETURN
@@ -918,5 +919,11 @@
 	conditional_expression
 	| unary_expression assignment_operator assignment_expression
-		{ $$ = new ExpressionNode( build_binary_val( $2, $1, $3 ) ); }
+		{
+			if ( $2 == OperKinds::AtAssn ) {
+				SemanticError( yylloc, "C @= assignment is currently unimplemented." ); $$ = nullptr;
+			} else {
+				$$ = new ExpressionNode( build_binary_val( $2, $1, $3 ) );
+			} // if
+		}
 	| unary_expression '=' '{' initializer_list_opt comma_opt '}'
 		{ SemanticError( yylloc, "Initializer assignment is currently unimplemented." ); $$ = nullptr; }
@@ -1259,8 +1266,16 @@
 	| RETURN '{' initializer_list_opt comma_opt '}' ';'
 		{ SemanticError( yylloc, "Initializer return is currently unimplemented." ); $$ = nullptr; }
-	// | SUSPEND ';'
-	//   	{ SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
-	// | SUSPEND compound_statement ';'
-	//   	{ SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
+	| SUSPEND ';'
+		{ $$ = new StatementNode( build_suspend( nullptr ) ); }
+	| SUSPEND compound_statement
+		{ $$ = new StatementNode( build_suspend( $2 ) ); }
+	| SUSPEND COROUTINE ';'
+		{ $$ = new StatementNode( build_suspend( nullptr, SuspendStmt::Coroutine ) ); }
+	| SUSPEND COROUTINE compound_statement
+		{ $$ = new StatementNode( build_suspend( $3, SuspendStmt::Coroutine ) ); }
+	| SUSPEND GENERATOR ';'
+		{ $$ = new StatementNode( build_suspend( nullptr, SuspendStmt::Generator ) ); }
+	| SUSPEND GENERATOR compound_statement
+		{ $$ = new StatementNode( build_suspend( $3, SuspendStmt::Generator ) ); }
 	| THROW assignment_expression_opt ';'				// handles rethrow
 		{ $$ = new StatementNode( build_throw( $2 ) ); }
@@ -2077,5 +2092,5 @@
 aggregate_control:										// CFA
 	GENERATOR
-		{ SemanticError( yylloc, "generator is currently unimplemented." ); $$ = AggregateDecl::NoAggregate; }
+		{ yyy = true; $$ = AggregateDecl::Generator; }
 	| MONITOR GENERATOR
 		{ SemanticError( yylloc, "monitor generator is currently unimplemented." ); $$ = AggregateDecl::NoAggregate; }
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/SynTree/Declaration.h	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -302,6 +302,7 @@
 
 	bool is_coroutine() { return kind == Coroutine; }
-	bool is_monitor() { return kind == Monitor; }
-	bool is_thread() { return kind == Thread; }
+	bool is_generator() { return kind == Generator; }
+	bool is_monitor  () { return kind == Monitor  ; }
+	bool is_thread   () { return kind == Thread   ; }
 
 	virtual StructDecl * clone() const override { return new StructDecl( *this ); }
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/SynTree/Mutator.h	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -51,4 +51,5 @@
 	virtual Statement * mutate( CatchStmt * catchStmt ) = 0;
 	virtual Statement * mutate( FinallyStmt * catchStmt ) = 0;
+	virtual Statement * mutate( SuspendStmt * suspendStmt ) = 0;
 	virtual Statement * mutate( WaitForStmt * waitforStmt ) = 0;
 	virtual Declaration * mutate( WithStmt * withStmt ) = 0;
Index: src/SynTree/Statement.cc
===================================================================
--- src/SynTree/Statement.cc	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/SynTree/Statement.cc	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -420,4 +420,29 @@
 }
 
+SuspendStmt::SuspendStmt( const SuspendStmt & other )
+	: Statement( other )
+	, then( maybeClone(other.then) )
+{}
+
+SuspendStmt::~SuspendStmt() {
+	delete then;
+}
+
+void SuspendStmt::print( std::ostream & os, Indenter indent ) const {
+	os << "Suspend Statement";
+	switch (type) {
+		case None     : os << " with implicit target"; break;
+		case Generator: os << " for generator"       ; break;
+		case Coroutine: os << " for coroutine"       ; break;
+	}
+	os << endl;
+	indent += 1;
+
+	if(then) {
+		os << indent << " with post statement :" << endl;
+		then->print( os, indent + 1);
+	}
+}
+
 WaitForStmt::WaitForStmt() : Statement() {
 	timeout.time      = nullptr;
Index: src/SynTree/Statement.h
===================================================================
--- src/SynTree/Statement.h	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/SynTree/Statement.h	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -422,4 +422,20 @@
 };
 
+class SuspendStmt : public Statement {
+  public:
+	CompoundStmt * then = nullptr;
+	enum Type { None, Coroutine, Generator } type = None;
+
+	SuspendStmt() = default;
+	SuspendStmt( const SuspendStmt & );
+	virtual ~SuspendStmt();
+
+	virtual SuspendStmt * clone() const override { return new SuspendStmt( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual void accept( Visitor & v ) const override { v.visit( this ); }
+	virtual Statement * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
+};
+
 class WaitForStmt : public Statement {
   public:
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/SynTree/SynTree.h	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -54,4 +54,5 @@
 class CatchStmt;
 class FinallyStmt;
+class SuspendStmt;
 class WaitForStmt;
 class WithStmt;
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ src/SynTree/Visitor.h	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -78,4 +78,6 @@
 	virtual void visit( FinallyStmt * node ) { visit( const_cast<const FinallyStmt *>(node) ); }
 	virtual void visit( const FinallyStmt * finallyStmt ) = 0;
+	virtual void visit( SuspendStmt * node ) { visit( const_cast<const SuspendStmt *>(node) ); }
+	virtual void visit( const SuspendStmt * suspendStmt ) = 0;
 	virtual void visit( WaitForStmt * node ) { visit( const_cast<const WaitForStmt *>(node) ); }
 	virtual void visit( const WaitForStmt * waitforStmt ) = 0;
Index: tests/.expect/bitmanip.x64.txt
===================================================================
--- tests/.expect/bitmanip.x64.txt	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ tests/.expect/bitmanip.x64.txt	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,71 @@
+cl0
+0 8, 1 7, 2 6, 4 5, 8 4, 16 3, 32 2, 64 1, -128 0,
+0 8, 1 7, 2 6, 4 5, 8 4, 16 3, 32 2, 64 1, 128 0,
+0 16, 1 15, 2 14, 4 13, 8 12, 16 11, 32 10, 64 9, 128 8, 256 7, 512 6, 1024 5, 2048 4, 4096 3, 8192 2, 16384 1, -32768 0,
+0 16, 1 15, 2 14, 4 13, 8 12, 16 11, 32 10, 64 9, 128 8, 256 7, 512 6, 1024 5, 2048 4, 4096 3, 8192 2, 16384 1, 32768 0,
+0 32, 1 31, 2 30, 4 29, 8 28, 16 27, 32 26, 64 25, 128 24, 256 23, 512 22, 1024 21, 2048 20, 4096 19, 8192 18, 16384 17, 32768 16, 65536 15, 131072 14, 262144 13, 524288 12, 1048576 11, 2097152 10, 4194304 9, 8388608 8, 16777216 7, 33554432 6, 67108864 5, 134217728 4, 268435456 3, 536870912 2, 1073741824 1, -2147483648 0,
+0 32, 1 31, 2 30, 4 29, 8 28, 16 27, 32 26, 64 25, 128 24, 256 23, 512 22, 1024 21, 2048 20, 4096 19, 8192 18, 16384 17, 32768 16, 65536 15, 131072 14, 262144 13, 524288 12, 1048576 11, 2097152 10, 4194304 9, 8388608 8, 16777216 7, 33554432 6, 67108864 5, 134217728 4, 268435456 3, 536870912 2, 1073741824 1, 2147483648 0,
+0 64, 1 63, 2 62, 4 61, 8 60, 16 59, 32 58, 64 57, 128 56, 256 55, 512 54, 1024 53, 2048 52, 4096 51, 8192 50, 16384 49, 32768 48, 65536 47, 131072 46, 262144 45, 524288 44, 1048576 43, 2097152 42, 4194304 41, 8388608 40, 16777216 39, 33554432 38, 67108864 37, 134217728 36, 268435456 35, 536870912 34, 1073741824 33, 2147483648 32, 4294967296 31, 8589934592 30, 17179869184 29, 34359738368 28, 68719476736 27, 137438953472 26, 274877906944 25, 549755813888 24, 1099511627776 23, 2199023255552 22, 4398046511104 21, 8796093022208 20, 17592186044416 19, 35184372088832 18, 70368744177664 17, 140737488355328 16, 281474976710656 15, 562949953421312 14, 1125899906842624 13, 2251799813685248 12, 4503599627370496 11, 9007199254740992 10, 18014398509481984 9, 36028797018963968 8, 72057594037927936 7, 144115188075855872 6, 288230376151711744 5, 576460752303423488 4, 1152921504606846976 3, 2305843009213693952 2, 4611686018427387904 1, -9223372036854775808 0,
+0 64, 1 63, 2 62, 4 61, 8 60, 16 59, 32 58, 64 57, 128 56, 256 55, 512 54, 1024 53, 2048 52, 4096 51, 8192 50, 16384 49, 32768 48, 65536 47, 131072 46, 262144 45, 524288 44, 1048576 43, 2097152 42, 4194304 41, 8388608 40, 16777216 39, 33554432 38, 67108864 37, 134217728 36, 268435456 35, 536870912 34, 1073741824 33, 2147483648 32, 4294967296 31, 8589934592 30, 17179869184 29, 34359738368 28, 68719476736 27, 137438953472 26, 274877906944 25, 549755813888 24, 1099511627776 23, 2199023255552 22, 4398046511104 21, 8796093022208 20, 17592186044416 19, 35184372088832 18, 70368744177664 17, 140737488355328 16, 281474976710656 15, 562949953421312 14, 1125899906842624 13, 2251799813685248 12, 4503599627370496 11, 9007199254740992 10, 18014398509481984 9, 36028797018963968 8, 72057594037927936 7, 144115188075855872 6, 288230376151711744 5, 576460752303423488 4, 1152921504606846976 3, 2305843009213693952 2, 4611686018427387904 1, 9223372036854775808 0,
+0 64, 1 63, 2 62, 4 61, 8 60, 16 59, 32 58, 64 57, 128 56, 256 55, 512 54, 1024 53, 2048 52, 4096 51, 8192 50, 16384 49, 32768 48, 65536 47, 131072 46, 262144 45, 524288 44, 1048576 43, 2097152 42, 4194304 41, 8388608 40, 16777216 39, 33554432 38, 67108864 37, 134217728 36, 268435456 35, 536870912 34, 1073741824 33, 2147483648 32, 4294967296 31, 8589934592 30, 17179869184 29, 34359738368 28, 68719476736 27, 137438953472 26, 274877906944 25, 549755813888 24, 1099511627776 23, 2199023255552 22, 4398046511104 21, 8796093022208 20, 17592186044416 19, 35184372088832 18, 70368744177664 17, 140737488355328 16, 281474976710656 15, 562949953421312 14, 1125899906842624 13, 2251799813685248 12, 4503599627370496 11, 9007199254740992 10, 18014398509481984 9, 36028797018963968 8, 72057594037927936 7, 144115188075855872 6, 288230376151711744 5, 576460752303423488 4, 1152921504606846976 3, 2305843009213693952 2, 4611686018427387904 1, -9223372036854775808 0,
+0 64, 1 63, 2 62, 4 61, 8 60, 16 59, 32 58, 64 57, 128 56, 256 55, 512 54, 1024 53, 2048 52, 4096 51, 8192 50, 16384 49, 32768 48, 65536 47, 131072 46, 262144 45, 524288 44, 1048576 43, 2097152 42, 4194304 41, 8388608 40, 16777216 39, 33554432 38, 67108864 37, 134217728 36, 268435456 35, 536870912 34, 1073741824 33, 2147483648 32, 4294967296 31, 8589934592 30, 17179869184 29, 34359738368 28, 68719476736 27, 137438953472 26, 274877906944 25, 549755813888 24, 1099511627776 23, 2199023255552 22, 4398046511104 21, 8796093022208 20, 17592186044416 19, 35184372088832 18, 70368744177664 17, 140737488355328 16, 281474976710656 15, 562949953421312 14, 1125899906842624 13, 2251799813685248 12, 4503599627370496 11, 9007199254740992 10, 18014398509481984 9, 36028797018963968 8, 72057594037927936 7, 144115188075855872 6, 288230376151711744 5, 576460752303423488 4, 1152921504606846976 3, 2305843009213693952 2, 4611686018427387904 1, 9223372036854775808 0,
+
+ct0
+0 8, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, -128 7,
+0 8, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, 128 7,
+0 16, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, 128 7, 256 8, 512 9, 1024 10, 2048 11, 4096 12, 8192 13, 16384 14, -32768 15,
+0 16, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, 128 7, 256 8, 512 9, 1024 10, 2048 11, 4096 12, 8192 13, 16384 14, 32768 15,
+0 32, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, 128 7, 256 8, 512 9, 1024 10, 2048 11, 4096 12, 8192 13, 16384 14, 32768 15, 65536 16, 131072 17, 262144 18, 524288 19, 1048576 20, 2097152 21, 4194304 22, 8388608 23, 16777216 24, 33554432 25, 67108864 26, 134217728 27, 268435456 28, 536870912 29, 1073741824 30, -2147483648 31,
+0 32, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, 128 7, 256 8, 512 9, 1024 10, 2048 11, 4096 12, 8192 13, 16384 14, 32768 15, 65536 16, 131072 17, 262144 18, 524288 19, 1048576 20, 2097152 21, 4194304 22, 8388608 23, 16777216 24, 33554432 25, 67108864 26, 134217728 27, 268435456 28, 536870912 29, 1073741824 30, 2147483648 31,
+0 64, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, 128 7, 256 8, 512 9, 1024 10, 2048 11, 4096 12, 8192 13, 16384 14, 32768 15, 65536 16, 131072 17, 262144 18, 524288 19, 1048576 20, 2097152 21, 4194304 22, 8388608 23, 16777216 24, 33554432 25, 67108864 26, 134217728 27, 268435456 28, 536870912 29, 1073741824 30, 2147483648 31, 4294967296 32, 8589934592 33, 17179869184 34, 34359738368 35, 68719476736 36, 137438953472 37, 274877906944 38, 549755813888 39, 1099511627776 40, 2199023255552 41, 4398046511104 42, 8796093022208 43, 17592186044416 44, 35184372088832 45, 70368744177664 46, 140737488355328 47, 281474976710656 48, 562949953421312 49, 1125899906842624 50, 2251799813685248 51, 4503599627370496 52, 9007199254740992 53, 18014398509481984 54, 36028797018963968 55, 72057594037927936 56, 144115188075855872 57, 288230376151711744 58, 576460752303423488 59, 1152921504606846976 60, 2305843009213693952 61, 4611686018427387904 62, -9223372036854775808 63,
+0 64, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, 128 7, 256 8, 512 9, 1024 10, 2048 11, 4096 12, 8192 13, 16384 14, 32768 15, 65536 16, 131072 17, 262144 18, 524288 19, 1048576 20, 2097152 21, 4194304 22, 8388608 23, 16777216 24, 33554432 25, 67108864 26, 134217728 27, 268435456 28, 536870912 29, 1073741824 30, 2147483648 31, 4294967296 32, 8589934592 33, 17179869184 34, 34359738368 35, 68719476736 36, 137438953472 37, 274877906944 38, 549755813888 39, 1099511627776 40, 2199023255552 41, 4398046511104 42, 8796093022208 43, 17592186044416 44, 35184372088832 45, 70368744177664 46, 140737488355328 47, 281474976710656 48, 562949953421312 49, 1125899906842624 50, 2251799813685248 51, 4503599627370496 52, 9007199254740992 53, 18014398509481984 54, 36028797018963968 55, 72057594037927936 56, 144115188075855872 57, 288230376151711744 58, 576460752303423488 59, 1152921504606846976 60, 2305843009213693952 61, 4611686018427387904 62, 9223372036854775808 63,
+0 64, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, 128 7, 256 8, 512 9, 1024 10, 2048 11, 4096 12, 8192 13, 16384 14, 32768 15, 65536 16, 131072 17, 262144 18, 524288 19, 1048576 20, 2097152 21, 4194304 22, 8388608 23, 16777216 24, 33554432 25, 67108864 26, 134217728 27, 268435456 28, 536870912 29, 1073741824 30, 2147483648 31, 4294967296 32, 8589934592 33, 17179869184 34, 34359738368 35, 68719476736 36, 137438953472 37, 274877906944 38, 549755813888 39, 1099511627776 40, 2199023255552 41, 4398046511104 42, 8796093022208 43, 17592186044416 44, 35184372088832 45, 70368744177664 46, 140737488355328 47, 281474976710656 48, 562949953421312 49, 1125899906842624 50, 2251799813685248 51, 4503599627370496 52, 9007199254740992 53, 18014398509481984 54, 36028797018963968 55, 72057594037927936 56, 144115188075855872 57, 288230376151711744 58, 576460752303423488 59, 1152921504606846976 60, 2305843009213693952 61, 4611686018427387904 62, -9223372036854775808 63,
+0 64, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, 128 7, 256 8, 512 9, 1024 10, 2048 11, 4096 12, 8192 13, 16384 14, 32768 15, 65536 16, 131072 17, 262144 18, 524288 19, 1048576 20, 2097152 21, 4194304 22, 8388608 23, 16777216 24, 33554432 25, 67108864 26, 134217728 27, 268435456 28, 536870912 29, 1073741824 30, 2147483648 31, 4294967296 32, 8589934592 33, 17179869184 34, 34359738368 35, 68719476736 36, 137438953472 37, 274877906944 38, 549755813888 39, 1099511627776 40, 2199023255552 41, 4398046511104 42, 8796093022208 43, 17592186044416 44, 35184372088832 45, 70368744177664 46, 140737488355328 47, 281474976710656 48, 562949953421312 49, 1125899906842624 50, 2251799813685248 51, 4503599627370496 52, 9007199254740992 53, 18014398509481984 54, 36028797018963968 55, 72057594037927936 56, 144115188075855872 57, 288230376151711744 58, 576460752303423488 59, 1152921504606846976 60, 2305843009213693952 61, 4611686018427387904 62, 9223372036854775808 63,
+
+ca1
+0 0, 1 1, 3 2, 7 3, 15 4, 31 5, 63 6, 127 7, -1 8,
+0 0, 1 1, 3 2, 7 3, 15 4, 31 5, 63 6, 127 7, 255 8,
+0 0, 1 1, 3 2, 7 3, 15 4, 31 5, 63 6, 127 7, 255 8, 511 9, 1023 10, 2047 11, 4095 12, 8191 13, 16383 14, 32767 15, -1 16,
+0 0, 1 1, 3 2, 7 3, 15 4, 31 5, 63 6, 127 7, 255 8, 511 9, 1023 10, 2047 11, 4095 12, 8191 13, 16383 14, 32767 15, 65535 16,
+0 0, 1 1, 3 2, 7 3, 15 4, 31 5, 63 6, 127 7, 255 8, 511 9, 1023 10, 2047 11, 4095 12, 8191 13, 16383 14, 32767 15, 65535 16, 131071 17, 262143 18, 524287 19, 1048575 20, 2097151 21, 4194303 22, 8388607 23, 16777215 24, 33554431 25, 67108863 26, 134217727 27, 268435455 28, 536870911 29, 1073741823 30, 2147483647 31, -1 32,
+0 0, 1 1, 3 2, 7 3, 15 4, 31 5, 63 6, 127 7, 255 8, 511 9, 1023 10, 2047 11, 4095 12, 8191 13, 16383 14, 32767 15, 65535 16, 131071 17, 262143 18, 524287 19, 1048575 20, 2097151 21, 4194303 22, 8388607 23, 16777215 24, 33554431 25, 67108863 26, 134217727 27, 268435455 28, 536870911 29, 1073741823 30, 2147483647 31, 4294967295 32,
+
+0 0, 1 1, 3 2, 7 3, 15 4, 31 5, 63 6, 127 7, 255 8, 511 9, 1023 10, 2047 11, 4095 12, 8191 13, 16383 14, 32767 15, 65535 16, 131071 17, 262143 18, 524287 19, 1048575 20, 2097151 21, 4194303 22, 8388607 23, 16777215 24, 33554431 25, 67108863 26, 134217727 27, 268435455 28, 536870911 29, 1073741823 30, 2147483647 31, 4294967295 32, 8589934591 33, 17179869183 34, 34359738367 35, 68719476735 36, 137438953471 37, 274877906943 38, 549755813887 39, 1099511627775 40, 2199023255551 41, 4398046511103 42, 8796093022207 43, 17592186044415 44, 35184372088831 45, 70368744177663 46, 140737488355327 47, 281474976710655 48, 562949953421311 49, 1125899906842623 50, 2251799813685247 51, 4503599627370495 52, 9007199254740991 53, 18014398509481983 54, 36028797018963967 55, 72057594037927935 56, 144115188075855871 57, 288230376151711743 58, 576460752303423487 59, 1152921504606846975 60, 2305843009213693951 61, 4611686018427387903 62, 9223372036854775807 63, 18446744073709551615 64,
+0 0, 1 1, 3 2, 7 3, 15 4, 31 5, 63 6, 127 7, 255 8, 511 9, 1023 10, 2047 11, 4095 12, 8191 13, 16383 14, 32767 15, 65535 16, 131071 17, 262143 18, 524287 19, 1048575 20, 2097151 21, 4194303 22, 8388607 23, 16777215 24, 33554431 25, 67108863 26, 134217727 27, 268435455 28, 536870911 29, 1073741823 30, 2147483647 31, 4294967295 32, 8589934591 33, 17179869183 34, 34359738367 35, 68719476735 36, 137438953471 37, 274877906943 38, 549755813887 39, 1099511627775 40, 2199023255551 41, 4398046511103 42, 8796093022207 43, 17592186044415 44, 35184372088831 45, 70368744177663 46, 140737488355327 47, 281474976710655 48, 562949953421311 49, 1125899906842623 50, 2251799813685247 51, 4503599627370495 52, 9007199254740991 53, 18014398509481983 54, 36028797018963967 55, 72057594037927935 56, 144115188075855871 57, 288230376151711743 58, 576460752303423487 59, 1152921504606846975 60, 2305843009213693951 61, 4611686018427387903 62, 9223372036854775807 63, -1 64,
+0 0, 1 1, 3 2, 7 3, 15 4, 31 5, 63 6, 127 7, 255 8, 511 9, 1023 10, 2047 11, 4095 12, 8191 13, 16383 14, 32767 15, 65535 16, 131071 17, 262143 18, 524287 19, 1048575 20, 2097151 21, 4194303 22, 8388607 23, 16777215 24, 33554431 25, 67108863 26, 134217727 27, 268435455 28, 536870911 29, 1073741823 30, 2147483647 31, 4294967295 32, 8589934591 33, 17179869183 34, 34359738367 35, 68719476735 36, 137438953471 37, 274877906943 38, 549755813887 39, 1099511627775 40, 2199023255551 41, 4398046511103 42, 8796093022207 43, 17592186044415 44, 35184372088831 45, 70368744177663 46, 140737488355327 47, 281474976710655 48, 562949953421311 49, 1125899906842623 50, 2251799813685247 51, 4503599627370495 52, 9007199254740991 53, 18014398509481983 54, 36028797018963967 55, 72057594037927935 56, 144115188075855871 57, 288230376151711743 58, 576460752303423487 59, 1152921504606846975 60, 2305843009213693951 61, 4611686018427387903 62, 9223372036854775807 63, 18446744073709551615 64,
+
+ca0
+0 8, 1 7, 3 6, 7 5, 15 4, 31 3, 63 2, 127 1, -1 0,
+0 8, 1 7, 3 6, 7 5, 15 4, 31 3, 63 2, 127 1, 255 0,
+0 16, 1 15, 3 14, 7 13, 15 12, 31 11, 63 10, 127 9, 255 8, 511 7, 1023 6, 2047 5, 4095 4, 8191 3, 16383 2, 32767 1, -1 0,
+0 16, 1 15, 3 14, 7 13, 15 12, 31 11, 63 10, 127 9, 255 8, 511 7, 1023 6, 2047 5, 4095 4, 8191 3, 16383 2, 32767 1, 65535 0,
+0 32, 1 31, 3 30, 7 29, 15 28, 31 27, 63 26, 127 25, 255 24, 511 23, 1023 22, 2047 21, 4095 20, 8191 19, 16383 18, 32767 17, 65535 16, 131071 15, 262143 14, 524287 13, 1048575 12, 2097151 11, 4194303 10, 8388607 9, 16777215 8, 33554431 7, 67108863 6, 134217727 5, 268435455 4, 536870911 3, 1073741823 2, 2147483647 1, -1 0,
+0 32, 1 31, 3 30, 7 29, 15 28, 31 27, 63 26, 127 25, 255 24, 511 23, 1023 22, 2047 21, 4095 20, 8191 19, 16383 18, 32767 17, 65535 16, 131071 15, 262143 14, 524287 13, 1048575 12, 2097151 11, 4194303 10, 8388607 9, 16777215 8, 33554431 7, 67108863 6, 134217727 5, 268435455 4, 536870911 3, 1073741823 2, 2147483647 1, 4294967295 0,
+0 64, 1 63, 3 62, 7 61, 15 60, 31 59, 63 58, 127 57, 255 56, 511 55, 1023 54, 2047 53, 4095 52, 8191 51, 16383 50, 32767 49, 65535 48, 131071 47, 262143 46, 524287 45, 1048575 44, 2097151 43, 4194303 42, 8388607 41, 16777215 40, 33554431 39, 67108863 38, 134217727 37, 268435455 36, 536870911 35, 1073741823 34, 2147483647 33, 4294967295 32, 8589934591 31, 17179869183 30, 34359738367 29, 68719476735 28, 137438953471 27, 274877906943 26, 549755813887 25, 1099511627775 24, 2199023255551 23, 4398046511103 22, 8796093022207 21, 17592186044415 20, 35184372088831 19, 70368744177663 18, 140737488355327 17, 281474976710655 16, 562949953421311 15, 1125899906842623 14, 2251799813685247 13, 4503599627370495 12, 9007199254740991 11, 18014398509481983 10, 36028797018963967 9, 72057594037927935 8, 144115188075855871 7, 288230376151711743 6, 576460752303423487 5, 1152921504606846975 4, 2305843009213693951 3, 4611686018427387903 2, 9223372036854775807 1, -1 0,
+0 64, 1 63, 3 62, 7 61, 15 60, 31 59, 63 58, 127 57, 255 56, 511 55, 1023 54, 2047 53, 4095 52, 8191 51, 16383 50, 32767 49, 65535 48, 131071 47, 262143 46, 524287 45, 1048575 44, 2097151 43, 4194303 42, 8388607 41, 16777215 40, 33554431 39, 67108863 38, 134217727 37, 268435455 36, 536870911 35, 1073741823 34, 2147483647 33, 4294967295 32, 8589934591 31, 17179869183 30, 34359738367 29, 68719476735 28, 137438953471 27, 274877906943 26, 549755813887 25, 1099511627775 24, 2199023255551 23, 4398046511103 22, 8796093022207 21, 17592186044415 20, 35184372088831 19, 70368744177663 18, 140737488355327 17, 281474976710655 16, 562949953421311 15, 1125899906842623 14, 2251799813685247 13, 4503599627370495 12, 9007199254740991 11, 18014398509481983 10, 36028797018963967 9, 72057594037927935 8, 144115188075855871 7, 288230376151711743 6, 576460752303423487 5, 1152921504606846975 4, 2305843009213693951 3, 4611686018427387903 2, 9223372036854775807 1, 18446744073709551615 0,
+0 64, 1 63, 3 62, 7 61, 15 60, 31 59, 63 58, 127 57, 255 56, 511 55, 1023 54, 2047 53, 4095 52, 8191 51, 16383 50, 32767 49, 65535 48, 131071 47, 262143 46, 524287 45, 1048575 44, 2097151 43, 4194303 42, 8388607 41, 16777215 40, 33554431 39, 67108863 38, 134217727 37, 268435455 36, 536870911 35, 1073741823 34, 2147483647 33, 4294967295 32, 8589934591 31, 17179869183 30, 34359738367 29, 68719476735 28, 137438953471 27, 274877906943 26, 549755813887 25, 1099511627775 24, 2199023255551 23, 4398046511103 22, 8796093022207 21, 17592186044415 20, 35184372088831 19, 70368744177663 18, 140737488355327 17, 281474976710655 16, 562949953421311 15, 1125899906842623 14, 2251799813685247 13, 4503599627370495 12, 9007199254740991 11, 18014398509481983 10, 36028797018963967 9, 72057594037927935 8, 144115188075855871 7, 288230376151711743 6, 576460752303423487 5, 1152921504606846975 4, 2305843009213693951 3, 4611686018427387903 2, 9223372036854775807 1, -1 0,
+0 64, 1 63, 3 62, 7 61, 15 60, 31 59, 63 58, 127 57, 255 56, 511 55, 1023 54, 2047 53, 4095 52, 8191 51, 16383 50, 32767 49, 65535 48, 131071 47, 262143 46, 524287 45, 1048575 44, 2097151 43, 4194303 42, 8388607 41, 16777215 40, 33554431 39, 67108863 38, 134217727 37, 268435455 36, 536870911 35, 1073741823 34, 2147483647 33, 4294967295 32, 8589934591 31, 17179869183 30, 34359738367 29, 68719476735 28, 137438953471 27, 274877906943 26, 549755813887 25, 1099511627775 24, 2199023255551 23, 4398046511103 22, 8796093022207 21, 17592186044415 20, 35184372088831 19, 70368744177663 18, 140737488355327 17, 281474976710655 16, 562949953421311 15, 1125899906842623 14, 2251799813685247 13, 4503599627370495 12, 9007199254740991 11, 18014398509481983 10, 36028797018963967 9, 72057594037927935 8, 144115188075855871 7, 288230376151711743 6, 576460752303423487 5, 1152921504606846975 4, 2305843009213693951 3, 4611686018427387903 2, 9223372036854775807 1, 18446744073709551615 0,
+
+fls
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, -128 8,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, -32768 16,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, -2147483648 32,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, 2147483648 32,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, 2147483648 32, 4294967296 33, 8589934592 34, 17179869184 35, 34359738368 36, 68719476736 37, 137438953472 38, 274877906944 39, 549755813888 40, 1099511627776 41, 2199023255552 42, 4398046511104 43, 8796093022208 44, 17592186044416 45, 35184372088832 46, 70368744177664 47, 140737488355328 48, 281474976710656 49, 562949953421312 50, 1125899906842624 51, 2251799813685248 52, 4503599627370496 53, 9007199254740992 54, 18014398509481984 55, 36028797018963968 56, 72057594037927936 57, 144115188075855872 58, 288230376151711744 59, 576460752303423488 60, 1152921504606846976 61, 2305843009213693952 62, 4611686018427387904 63, -9223372036854775808 64,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, 2147483648 32, 4294967296 33, 8589934592 34, 17179869184 35, 34359738368 36, 68719476736 37, 137438953472 38, 274877906944 39, 549755813888 40, 1099511627776 41, 2199023255552 42, 4398046511104 43, 8796093022208 44, 17592186044416 45, 35184372088832 46, 70368744177664 47, 140737488355328 48, 281474976710656 49, 562949953421312 50, 1125899906842624 51, 2251799813685248 52, 4503599627370496 53, 9007199254740992 54, 18014398509481984 55, 36028797018963968 56, 72057594037927936 57, 144115188075855872 58, 288230376151711744 59, 576460752303423488 60, 1152921504606846976 61, 2305843009213693952 62, 4611686018427387904 63, 9223372036854775808 64,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, 2147483648 32, 4294967296 33, 8589934592 34, 17179869184 35, 34359738368 36, 68719476736 37, 137438953472 38, 274877906944 39, 549755813888 40, 1099511627776 41, 2199023255552 42, 4398046511104 43, 8796093022208 44, 17592186044416 45, 35184372088832 46, 70368744177664 47, 140737488355328 48, 281474976710656 49, 562949953421312 50, 1125899906842624 51, 2251799813685248 52, 4503599627370496 53, 9007199254740992 54, 18014398509481984 55, 36028797018963968 56, 72057594037927936 57, 144115188075855872 58, 288230376151711744 59, 576460752303423488 60, 1152921504606846976 61, 2305843009213693952 62, 4611686018427387904 63, -9223372036854775808 64,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, 2147483648 32, 4294967296 33, 8589934592 34, 17179869184 35, 34359738368 36, 68719476736 37, 137438953472 38, 274877906944 39, 549755813888 40, 1099511627776 41, 2199023255552 42, 4398046511104 43, 8796093022208 44, 17592186044416 45, 35184372088832 46, 70368744177664 47, 140737488355328 48, 281474976710656 49, 562949953421312 50, 1125899906842624 51, 2251799813685248 52, 4503599627370496 53, 9007199254740992 54, 18014398509481984 55, 36028797018963968 56, 72057594037927936 57, 144115188075855872 58, 288230376151711744 59, 576460752303423488 60, 1152921504606846976 61, 2305843009213693952 62, 4611686018427387904 63, 9223372036854775808 64,
+
+fms
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, -128 8,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, -32768 16,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, -2147483648 32,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, 2147483648 32,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, 2147483648 32, 4294967296 33, 8589934592 34, 17179869184 35, 34359738368 36, 68719476736 37, 137438953472 38, 274877906944 39, 549755813888 40, 1099511627776 41, 2199023255552 42, 4398046511104 43, 8796093022208 44, 17592186044416 45, 35184372088832 46, 70368744177664 47, 140737488355328 48, 281474976710656 49, 562949953421312 50, 1125899906842624 51, 2251799813685248 52, 4503599627370496 53, 9007199254740992 54, 18014398509481984 55, 36028797018963968 56, 72057594037927936 57, 144115188075855872 58, 288230376151711744 59, 576460752303423488 60, 1152921504606846976 61, 2305843009213693952 62, 4611686018427387904 63, -9223372036854775808 64,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, 2147483648 32, 4294967296 33, 8589934592 34, 17179869184 35, 34359738368 36, 68719476736 37, 137438953472 38, 274877906944 39, 549755813888 40, 1099511627776 41, 2199023255552 42, 4398046511104 43, 8796093022208 44, 17592186044416 45, 35184372088832 46, 70368744177664 47, 140737488355328 48, 281474976710656 49, 562949953421312 50, 1125899906842624 51, 2251799813685248 52, 4503599627370496 53, 9007199254740992 54, 18014398509481984 55, 36028797018963968 56, 72057594037927936 57, 144115188075855872 58, 288230376151711744 59, 576460752303423488 60, 1152921504606846976 61, 2305843009213693952 62, 4611686018427387904 63, 9223372036854775808 64,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, 2147483648 32, 4294967296 33, 8589934592 34, 17179869184 35, 34359738368 36, 68719476736 37, 137438953472 38, 274877906944 39, 549755813888 40, 1099511627776 41, 2199023255552 42, 4398046511104 43, 8796093022208 44, 17592186044416 45, 35184372088832 46, 70368744177664 47, 140737488355328 48, 281474976710656 49, 562949953421312 50, 1125899906842624 51, 2251799813685248 52, 4503599627370496 53, 9007199254740992 54, 18014398509481984 55, 36028797018963968 56, 72057594037927936 57, 144115188075855872 58, 288230376151711744 59, 576460752303423488 60, 1152921504606846976 61, 2305843009213693952 62, 4611686018427387904 63, -9223372036854775808 64,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, 2147483648 32, 4294967296 33, 8589934592 34, 17179869184 35, 34359738368 36, 68719476736 37, 137438953472 38, 274877906944 39, 549755813888 40, 1099511627776 41, 2199023255552 42, 4398046511104 43, 8796093022208 44, 17592186044416 45, 35184372088832 46, 70368744177664 47, 140737488355328 48, 281474976710656 49, 562949953421312 50, 1125899906842624 51, 2251799813685248 52, 4503599627370496 53, 9007199254740992 54, 18014398509481984 55, 36028797018963968 56, 72057594037927936 57, 144115188075855872 58, 288230376151711744 59, 576460752303423488 60, 1152921504606846976 61, 2305843009213693952 62, 4611686018427387904 63, 9223372036854775808 64,
Index: tests/.expect/bitmanip.x86.txt
===================================================================
--- tests/.expect/bitmanip.x86.txt	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ tests/.expect/bitmanip.x86.txt	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,71 @@
+cl0
+0 8, 1 7, 2 6, 4 5, 8 4, 16 3, 32 2, 64 1, -128 0,
+0 8, 1 7, 2 6, 4 5, 8 4, 16 3, 32 2, 64 1, 128 0,
+0 16, 1 15, 2 14, 4 13, 8 12, 16 11, 32 10, 64 9, 128 8, 256 7, 512 6, 1024 5, 2048 4, 4096 3, 8192 2, 16384 1, -32768 0,
+0 16, 1 15, 2 14, 4 13, 8 12, 16 11, 32 10, 64 9, 128 8, 256 7, 512 6, 1024 5, 2048 4, 4096 3, 8192 2, 16384 1, 32768 0,
+0 32, 1 31, 2 30, 4 29, 8 28, 16 27, 32 26, 64 25, 128 24, 256 23, 512 22, 1024 21, 2048 20, 4096 19, 8192 18, 16384 17, 32768 16, 65536 15, 131072 14, 262144 13, 524288 12, 1048576 11, 2097152 10, 4194304 9, 8388608 8, 16777216 7, 33554432 6, 67108864 5, 134217728 4, 268435456 3, 536870912 2, 1073741824 1, -2147483648 0,
+0 32, 1 31, 2 30, 4 29, 8 28, 16 27, 32 26, 64 25, 128 24, 256 23, 512 22, 1024 21, 2048 20, 4096 19, 8192 18, 16384 17, 32768 16, 65536 15, 131072 14, 262144 13, 524288 12, 1048576 11, 2097152 10, 4194304 9, 8388608 8, 16777216 7, 33554432 6, 67108864 5, 134217728 4, 268435456 3, 536870912 2, 1073741824 1, 2147483648 0,
+0 32, 1 31, 2 30, 4 29, 8 28, 16 27, 32 26, 64 25, 128 24, 256 23, 512 22, 1024 21, 2048 20, 4096 19, 8192 18, 16384 17, 32768 16, 65536 15, 131072 14, 262144 13, 524288 12, 1048576 11, 2097152 10, 4194304 9, 8388608 8, 16777216 7, 33554432 6, 67108864 5, 134217728 4, 268435456 3, 536870912 2, 1073741824 1, -2147483648 0,
+0 32, 1 31, 2 30, 4 29, 8 28, 16 27, 32 26, 64 25, 128 24, 256 23, 512 22, 1024 21, 2048 20, 4096 19, 8192 18, 16384 17, 32768 16, 65536 15, 131072 14, 262144 13, 524288 12, 1048576 11, 2097152 10, 4194304 9, 8388608 8, 16777216 7, 33554432 6, 67108864 5, 134217728 4, 268435456 3, 536870912 2, 1073741824 1, 2147483648 0,
+0 64, 1 63, 2 62, 4 61, 8 60, 16 59, 32 58, 64 57, 128 56, 256 55, 512 54, 1024 53, 2048 52, 4096 51, 8192 50, 16384 49, 32768 48, 65536 47, 131072 46, 262144 45, 524288 44, 1048576 43, 2097152 42, 4194304 41, 8388608 40, 16777216 39, 33554432 38, 67108864 37, 134217728 36, 268435456 35, 536870912 34, 1073741824 33, 2147483648 32, 4294967296 31, 8589934592 30, 17179869184 29, 34359738368 28, 68719476736 27, 137438953472 26, 274877906944 25, 549755813888 24, 1099511627776 23, 2199023255552 22, 4398046511104 21, 8796093022208 20, 17592186044416 19, 35184372088832 18, 70368744177664 17, 140737488355328 16, 281474976710656 15, 562949953421312 14, 1125899906842624 13, 2251799813685248 12, 4503599627370496 11, 9007199254740992 10, 18014398509481984 9, 36028797018963968 8, 72057594037927936 7, 144115188075855872 6, 288230376151711744 5, 576460752303423488 4, 1152921504606846976 3, 2305843009213693952 2, 4611686018427387904 1, -9223372036854775808 0,
+0 64, 1 63, 2 62, 4 61, 8 60, 16 59, 32 58, 64 57, 128 56, 256 55, 512 54, 1024 53, 2048 52, 4096 51, 8192 50, 16384 49, 32768 48, 65536 47, 131072 46, 262144 45, 524288 44, 1048576 43, 2097152 42, 4194304 41, 8388608 40, 16777216 39, 33554432 38, 67108864 37, 134217728 36, 268435456 35, 536870912 34, 1073741824 33, 2147483648 32, 4294967296 31, 8589934592 30, 17179869184 29, 34359738368 28, 68719476736 27, 137438953472 26, 274877906944 25, 549755813888 24, 1099511627776 23, 2199023255552 22, 4398046511104 21, 8796093022208 20, 17592186044416 19, 35184372088832 18, 70368744177664 17, 140737488355328 16, 281474976710656 15, 562949953421312 14, 1125899906842624 13, 2251799813685248 12, 4503599627370496 11, 9007199254740992 10, 18014398509481984 9, 36028797018963968 8, 72057594037927936 7, 144115188075855872 6, 288230376151711744 5, 576460752303423488 4, 1152921504606846976 3, 2305843009213693952 2, 4611686018427387904 1, 9223372036854775808 0,
+
+ct0
+0 8, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, -128 7,
+0 8, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, 128 7,
+0 16, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, 128 7, 256 8, 512 9, 1024 10, 2048 11, 4096 12, 8192 13, 16384 14, -32768 15,
+0 16, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, 128 7, 256 8, 512 9, 1024 10, 2048 11, 4096 12, 8192 13, 16384 14, 32768 15,
+0 32, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, 128 7, 256 8, 512 9, 1024 10, 2048 11, 4096 12, 8192 13, 16384 14, 32768 15, 65536 16, 131072 17, 262144 18, 524288 19, 1048576 20, 2097152 21, 4194304 22, 8388608 23, 16777216 24, 33554432 25, 67108864 26, 134217728 27, 268435456 28, 536870912 29, 1073741824 30, -2147483648 31,
+0 32, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, 128 7, 256 8, 512 9, 1024 10, 2048 11, 4096 12, 8192 13, 16384 14, 32768 15, 65536 16, 131072 17, 262144 18, 524288 19, 1048576 20, 2097152 21, 4194304 22, 8388608 23, 16777216 24, 33554432 25, 67108864 26, 134217728 27, 268435456 28, 536870912 29, 1073741824 30, 2147483648 31,
+0 32, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, 128 7, 256 8, 512 9, 1024 10, 2048 11, 4096 12, 8192 13, 16384 14, 32768 15, 65536 16, 131072 17, 262144 18, 524288 19, 1048576 20, 2097152 21, 4194304 22, 8388608 23, 16777216 24, 33554432 25, 67108864 26, 134217728 27, 268435456 28, 536870912 29, 1073741824 30, -2147483648 31,
+0 32, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, 128 7, 256 8, 512 9, 1024 10, 2048 11, 4096 12, 8192 13, 16384 14, 32768 15, 65536 16, 131072 17, 262144 18, 524288 19, 1048576 20, 2097152 21, 4194304 22, 8388608 23, 16777216 24, 33554432 25, 67108864 26, 134217728 27, 268435456 28, 536870912 29, 1073741824 30, 2147483648 31,
+0 64, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, 128 7, 256 8, 512 9, 1024 10, 2048 11, 4096 12, 8192 13, 16384 14, 32768 15, 65536 16, 131072 17, 262144 18, 524288 19, 1048576 20, 2097152 21, 4194304 22, 8388608 23, 16777216 24, 33554432 25, 67108864 26, 134217728 27, 268435456 28, 536870912 29, 1073741824 30, 2147483648 31, 4294967296 32, 8589934592 33, 17179869184 34, 34359738368 35, 68719476736 36, 137438953472 37, 274877906944 38, 549755813888 39, 1099511627776 40, 2199023255552 41, 4398046511104 42, 8796093022208 43, 17592186044416 44, 35184372088832 45, 70368744177664 46, 140737488355328 47, 281474976710656 48, 562949953421312 49, 1125899906842624 50, 2251799813685248 51, 4503599627370496 52, 9007199254740992 53, 18014398509481984 54, 36028797018963968 55, 72057594037927936 56, 144115188075855872 57, 288230376151711744 58, 576460752303423488 59, 1152921504606846976 60, 2305843009213693952 61, 4611686018427387904 62, -9223372036854775808 63,
+0 64, 1 0, 2 1, 4 2, 8 3, 16 4, 32 5, 64 6, 128 7, 256 8, 512 9, 1024 10, 2048 11, 4096 12, 8192 13, 16384 14, 32768 15, 65536 16, 131072 17, 262144 18, 524288 19, 1048576 20, 2097152 21, 4194304 22, 8388608 23, 16777216 24, 33554432 25, 67108864 26, 134217728 27, 268435456 28, 536870912 29, 1073741824 30, 2147483648 31, 4294967296 32, 8589934592 33, 17179869184 34, 34359738368 35, 68719476736 36, 137438953472 37, 274877906944 38, 549755813888 39, 1099511627776 40, 2199023255552 41, 4398046511104 42, 8796093022208 43, 17592186044416 44, 35184372088832 45, 70368744177664 46, 140737488355328 47, 281474976710656 48, 562949953421312 49, 1125899906842624 50, 2251799813685248 51, 4503599627370496 52, 9007199254740992 53, 18014398509481984 54, 36028797018963968 55, 72057594037927936 56, 144115188075855872 57, 288230376151711744 58, 576460752303423488 59, 1152921504606846976 60, 2305843009213693952 61, 4611686018427387904 62, 9223372036854775808 63,
+
+ca1
+0 0, 1 1, 3 2, 7 3, 15 4, 31 5, 63 6, 127 7, -1 8,
+0 0, 1 1, 3 2, 7 3, 15 4, 31 5, 63 6, 127 7, 255 8,
+0 0, 1 1, 3 2, 7 3, 15 4, 31 5, 63 6, 127 7, 255 8, 511 9, 1023 10, 2047 11, 4095 12, 8191 13, 16383 14, 32767 15, -1 16,
+0 0, 1 1, 3 2, 7 3, 15 4, 31 5, 63 6, 127 7, 255 8, 511 9, 1023 10, 2047 11, 4095 12, 8191 13, 16383 14, 32767 15, 65535 16,
+0 0, 1 1, 3 2, 7 3, 15 4, 31 5, 63 6, 127 7, 255 8, 511 9, 1023 10, 2047 11, 4095 12, 8191 13, 16383 14, 32767 15, 65535 16, 131071 17, 262143 18, 524287 19, 1048575 20, 2097151 21, 4194303 22, 8388607 23, 16777215 24, 33554431 25, 67108863 26, 134217727 27, 268435455 28, 536870911 29, 1073741823 30, 2147483647 31, -1 32,
+0 0, 1 1, 3 2, 7 3, 15 4, 31 5, 63 6, 127 7, 255 8, 511 9, 1023 10, 2047 11, 4095 12, 8191 13, 16383 14, 32767 15, 65535 16, 131071 17, 262143 18, 524287 19, 1048575 20, 2097151 21, 4194303 22, 8388607 23, 16777215 24, 33554431 25, 67108863 26, 134217727 27, 268435455 28, 536870911 29, 1073741823 30, 2147483647 31, 4294967295 32,
+
+0 0, 1 1, 3 2, 7 3, 15 4, 31 5, 63 6, 127 7, 255 8, 511 9, 1023 10, 2047 11, 4095 12, 8191 13, 16383 14, 32767 15, 65535 16, 131071 17, 262143 18, 524287 19, 1048575 20, 2097151 21, 4194303 22, 8388607 23, 16777215 24, 33554431 25, 67108863 26, 134217727 27, 268435455 28, 536870911 29, 1073741823 30, 2147483647 31, 4294967295 32,
+0 0, 1 1, 3 2, 7 3, 15 4, 31 5, 63 6, 127 7, 255 8, 511 9, 1023 10, 2047 11, 4095 12, 8191 13, 16383 14, 32767 15, 65535 16, 131071 17, 262143 18, 524287 19, 1048575 20, 2097151 21, 4194303 22, 8388607 23, 16777215 24, 33554431 25, 67108863 26, 134217727 27, 268435455 28, 536870911 29, 1073741823 30, 2147483647 31, 4294967295 32,
+0 0, 1 1, 3 2, 7 3, 15 4, 31 5, 63 6, 127 7, 255 8, 511 9, 1023 10, 2047 11, 4095 12, 8191 13, 16383 14, 32767 15, 65535 16, 131071 17, 262143 18, 524287 19, 1048575 20, 2097151 21, 4194303 22, 8388607 23, 16777215 24, 33554431 25, 67108863 26, 134217727 27, 268435455 28, 536870911 29, 1073741823 30, 2147483647 31, 4294967295 32,
+
+ca0
+0 8, 1 7, 3 6, 7 5, 15 4, 31 3, 63 2, 127 1, -1 0,
+0 8, 1 7, 3 6, 7 5, 15 4, 31 3, 63 2, 127 1, 255 0,
+0 16, 1 15, 3 14, 7 13, 15 12, 31 11, 63 10, 127 9, 255 8, 511 7, 1023 6, 2047 5, 4095 4, 8191 3, 16383 2, 32767 1, -1 0,
+0 16, 1 15, 3 14, 7 13, 15 12, 31 11, 63 10, 127 9, 255 8, 511 7, 1023 6, 2047 5, 4095 4, 8191 3, 16383 2, 32767 1, 65535 0,
+0 32, 1 31, 3 30, 7 29, 15 28, 31 27, 63 26, 127 25, 255 24, 511 23, 1023 22, 2047 21, 4095 20, 8191 19, 16383 18, 32767 17, 65535 16, 131071 15, 262143 14, 524287 13, 1048575 12, 2097151 11, 4194303 10, 8388607 9, 16777215 8, 33554431 7, 67108863 6, 134217727 5, 268435455 4, 536870911 3, 1073741823 2, 2147483647 1, -1 0,
+0 32, 1 31, 3 30, 7 29, 15 28, 31 27, 63 26, 127 25, 255 24, 511 23, 1023 22, 2047 21, 4095 20, 8191 19, 16383 18, 32767 17, 65535 16, 131071 15, 262143 14, 524287 13, 1048575 12, 2097151 11, 4194303 10, 8388607 9, 16777215 8, 33554431 7, 67108863 6, 134217727 5, 268435455 4, 536870911 3, 1073741823 2, 2147483647 1, 4294967295 0,
+0 32, 1 31, 3 30, 7 29, 15 28, 31 27, 63 26, 127 25, 255 24, 511 23, 1023 22, 2047 21, 4095 20, 8191 19, 16383 18, 32767 17, 65535 16, 131071 15, 262143 14, 524287 13, 1048575 12, 2097151 11, 4194303 10, 8388607 9, 16777215 8, 33554431 7, 67108863 6, 134217727 5, 268435455 4, 536870911 3, 1073741823 2, 2147483647 1, -1 0,
+0 32, 1 31, 3 30, 7 29, 15 28, 31 27, 63 26, 127 25, 255 24, 511 23, 1023 22, 2047 21, 4095 20, 8191 19, 16383 18, 32767 17, 65535 16, 131071 15, 262143 14, 524287 13, 1048575 12, 2097151 11, 4194303 10, 8388607 9, 16777215 8, 33554431 7, 67108863 6, 134217727 5, 268435455 4, 536870911 3, 1073741823 2, 2147483647 1, 4294967295 0,
+0 64, 1 63, 3 62, 7 61, 15 60, 31 59, 63 58, 127 57, 255 56, 511 55, 1023 54, 2047 53, 4095 52, 8191 51, 16383 50, 32767 49, 65535 48, 131071 47, 262143 46, 524287 45, 1048575 44, 2097151 43, 4194303 42, 8388607 41, 16777215 40, 33554431 39, 67108863 38, 134217727 37, 268435455 36, 536870911 35, 1073741823 34, 2147483647 33, 4294967295 32,
+0 64, 1 63, 3 62, 7 61, 15 60, 31 59, 63 58, 127 57, 255 56, 511 55, 1023 54, 2047 53, 4095 52, 8191 51, 16383 50, 32767 49, 65535 48, 131071 47, 262143 46, 524287 45, 1048575 44, 2097151 43, 4194303 42, 8388607 41, 16777215 40, 33554431 39, 67108863 38, 134217727 37, 268435455 36, 536870911 35, 1073741823 34, 2147483647 33, 4294967295 32,
+
+fls
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, -128 8,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, -32768 16,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, -2147483648 32,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, 2147483648 32,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, -2147483648 32,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, 2147483648 32,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, 2147483648 32, 4294967296 33, 8589934592 34, 17179869184 35, 34359738368 36, 68719476736 37, 137438953472 38, 274877906944 39, 549755813888 40, 1099511627776 41, 2199023255552 42, 4398046511104 43, 8796093022208 44, 17592186044416 45, 35184372088832 46, 70368744177664 47, 140737488355328 48, 281474976710656 49, 562949953421312 50, 1125899906842624 51, 2251799813685248 52, 4503599627370496 53, 9007199254740992 54, 18014398509481984 55, 36028797018963968 56, 72057594037927936 57, 144115188075855872 58, 288230376151711744 59, 576460752303423488 60, 1152921504606846976 61, 2305843009213693952 62, 4611686018427387904 63, -9223372036854775808 64,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, 2147483648 32, 4294967296 33, 8589934592 34, 17179869184 35, 34359738368 36, 68719476736 37, 137438953472 38, 274877906944 39, 549755813888 40, 1099511627776 41, 2199023255552 42, 4398046511104 43, 8796093022208 44, 17592186044416 45, 35184372088832 46, 70368744177664 47, 140737488355328 48, 281474976710656 49, 562949953421312 50, 1125899906842624 51, 2251799813685248 52, 4503599627370496 53, 9007199254740992 54, 18014398509481984 55, 36028797018963968 56, 72057594037927936 57, 144115188075855872 58, 288230376151711744 59, 576460752303423488 60, 1152921504606846976 61, 2305843009213693952 62, 4611686018427387904 63, 9223372036854775808 64,
+
+fms
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, -128 8,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, -32768 16,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, -2147483648 32,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, 2147483648 32,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, -2147483648 32,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, 2147483648 32,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, 2147483648 32, 4294967296 33, 8589934592 34, 17179869184 35, 34359738368 36, 68719476736 37, 137438953472 38, 274877906944 39, 549755813888 40, 1099511627776 41, 2199023255552 42, 4398046511104 43, 8796093022208 44, 17592186044416 45, 35184372088832 46, 70368744177664 47, 140737488355328 48, 281474976710656 49, 562949953421312 50, 1125899906842624 51, 2251799813685248 52, 4503599627370496 53, 9007199254740992 54, 18014398509481984 55, 36028797018963968 56, 72057594037927936 57, 144115188075855872 58, 288230376151711744 59, 576460752303423488 60, 1152921504606846976 61, 2305843009213693952 62, 4611686018427387904 63, -9223372036854775808 64,
+0 0, 1 1, 2 2, 4 3, 8 4, 16 5, 32 6, 64 7, 128 8, 256 9, 512 10, 1024 11, 2048 12, 4096 13, 8192 14, 16384 15, 32768 16, 65536 17, 131072 18, 262144 19, 524288 20, 1048576 21, 2097152 22, 4194304 23, 8388608 24, 16777216 25, 33554432 26, 67108864 27, 134217728 28, 268435456 29, 536870912 30, 1073741824 31, 2147483648 32, 4294967296 33, 8589934592 34, 17179869184 35, 34359738368 36, 68719476736 37, 137438953472 38, 274877906944 39, 549755813888 40, 1099511627776 41, 2199023255552 42, 4398046511104 43, 8796093022208 44, 17592186044416 45, 35184372088832 46, 70368744177664 47, 140737488355328 48, 281474976710656 49, 562949953421312 50, 1125899906842624 51, 2251799813685248 52, 4503599627370496 53, 9007199254740992 54, 18014398509481984 55, 36028797018963968 56, 72057594037927936 57, 144115188075855872 58, 288230376151711744 59, 576460752303423488 60, 1152921504606846976 61, 2305843009213693952 62, 4611686018427387904 63, 9223372036854775808 64,
Index: tests/bitmanip.cfa
===================================================================
--- tests/bitmanip.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ tests/bitmanip.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,413 @@
+#include <fstream.hfa>
+#include "bitmanip.hfa"
+
+int main() {
+    signed char sc;
+    unsigned char usc;
+    short int si;
+    unsigned short int usi;
+    int i;
+    unsigned int ui;
+    long int li;
+    unsigned long int uli;
+    long long int lli;
+    unsigned long long int ulli;
+
+    sout | nlOff;
+
+    //============================================================
+
+    sout | "cl0" | nl;
+
+    sc = 0;
+    sout | sc | cl0( sc ) | ",";
+    for ( sc = 1; sc != 0; sc <<= 1 ) {
+	sout | sc | cl0( sc ) | ",";
+    }
+    sout | nl;
+    usc = 0;
+    sout | usc | cl0( usc ) | ",";
+    for ( usc = 1; usc != 0; usc <<= 1 ) {
+	sout | usc | cl0( usc ) | ",";
+    }
+    sout | nl;
+
+    si = 0;
+    sout | si | cl0( si ) | ",";
+    for ( si = 1; si != 0; si <<= 1 ) {
+	sout | si | cl0( si ) | ",";
+    }
+    sout | nl;
+    usi = 0;
+    sout | usi | cl0( usi ) | ",";
+    for ( usi = 1; usi != 0; usi <<= 1 ) {
+	sout | usi | cl0( usi ) | ",";
+    }
+    sout | nl;
+
+    i = 0;
+    sout | i | cl0( i ) | ",";
+    for ( i = 1; i != 0; i <<= 1 ) {
+	sout | i | cl0( i ) | ",";
+    }
+    sout | nl;
+    ui = 0;
+    sout | ui | cl0( ui ) | ",";
+    for ( ui = 1; ui != 0; ui <<= 1 ) {
+	sout | ui | cl0( ui ) | ",";
+    }
+    sout | nl;
+
+    li = 0;
+    sout | li | cl0( li ) | ",";
+    for ( li = 1; li != 0; li <<= 1 ) {
+	sout | li | cl0( li ) | ",";
+    }
+    sout | nl;
+    uli = 0;
+    sout | uli | cl0( uli ) | ",";
+    for ( uli = 1; uli != 0; uli <<= 1 ) {
+	sout | uli | cl0( uli ) | ",";
+    }
+    sout | nl;
+
+    lli = 0;
+    sout | lli | cl0( lli ) | ",";
+    for ( lli = 1; lli != 0; lli <<= 1 ) {
+	sout | lli | cl0( lli ) | ",";
+    }
+    sout | nl;
+    ulli = 0;
+    sout | ulli | cl0( ulli ) | ",";
+    for ( ulli = 1; ulli != 0; ulli <<= 1 ) {
+	sout | ulli | cl0( ulli ) | ",";
+    }
+    sout | nl;
+
+    //============================================================
+
+    sout | nl | "ct0" | nl;
+
+    sc = 0;
+    sout | sc | ct0( sc ) | ",";
+    for ( sc = 1; sc != 0; sc <<= 1 ) {
+	sout | sc | ct0( sc ) | ",";
+    }
+    sout | nl;
+    usc = 0;
+    sout | usc | ct0( usc ) | ",";
+    for ( usc = 1; usc != 0; usc <<= 1 ) {
+	sout | usc | ct0( usc ) | ",";
+    }
+    sout | nl;
+
+    si = 0;
+    sout | si | ct0( si ) | ",";
+    for ( si = 1; si != 0; si <<= 1 ) {
+	sout | si | ct0( si ) | ",";
+    }
+    sout | nl;
+    usi = 0;
+    sout | usi | ct0( usi ) | ",";
+    for ( usi = 1; usi != 0; usi <<= 1 ) {
+	sout | usi | ct0( usi ) | ",";
+    }
+    sout | nl;
+
+    i = 0;
+    sout | i | ct0( i ) | ",";
+    for ( i = 1; i != 0; i <<= 1 ) {
+	sout | i | ct0( i ) | ",";
+    }
+    sout | nl;
+    ui = 0;
+    sout | ui | ct0( ui ) | ",";
+    for ( ui = 1; ui != 0; ui <<= 1 ) {
+	sout | ui | ct0( ui ) | ",";
+    }
+    sout | nl;
+
+    li = 0;
+    sout | li | ct0( li ) | ",";
+    for ( li = 1; li != 0; li <<= 1 ) {
+	sout | li | ct0( li ) | ",";
+    }
+    sout | nl;
+    uli = 0;
+    sout | uli | ct0( uli ) | ",";
+    for ( uli = 1; uli != 0; uli <<= 1 ) {
+	sout | uli | ct0( uli ) | ",";
+    }
+    sout | nl;
+
+    lli = 0;
+    sout | lli | ct0( lli ) | ",";
+    for ( lli = 1; lli != 0; lli <<= 1 ) {
+	sout | lli | ct0( lli ) | ",";
+    }
+    sout | nl;
+    ulli = 0;
+    sout | ulli | ct0( ulli ) | ",";
+    for ( ulli = 1; ulli != 0; ulli <<= 1 ) {
+	sout | ulli | ct0( ulli ) | ",";
+    }
+    sout | nl;
+
+    //============================================================
+
+    sout | nl | "ca1" | nl;
+
+    sc = 0;
+    for ( int p = 0; p < sizeof(sc) * __CHAR_BIT__ + 1; p += 1, sc = (sc << 1) + 1 ) {
+	sout | sc | ca1( sc ) | ",";
+    }
+    sout | nl;
+    usc = 0;
+    for ( int p = 0; p < sizeof(sc) * __CHAR_BIT__ + 1; p += 1, usc = (usc << 1) + 1 ) {
+	sout | usc | ca1( usc ) | ",";
+    }
+    sout | nl;
+
+    si = 0;
+    for ( int p = 0; p < sizeof(si) * __CHAR_BIT__ + 1; p += 1, si = (si << 1) + 1 ) {
+	sout | si | ca1( si ) | ",";
+    }
+    sout | nl;
+    usi = 0;
+    for ( int p = 0; p < sizeof(usi) * __CHAR_BIT__ + 1; p += 1, usi = (usi << 1) + 1 ) {
+	sout | usi | ca1( usi ) | ",";
+    }
+    sout | nl;
+
+    i = 0;
+    for ( int p = 0; p < sizeof(i) * __CHAR_BIT__ + 1; p += 1, i = (i << 1) + 1 ) {
+	sout | i | ca1( i ) | ",";
+    }
+    sout | nl;
+    ui = 0;
+    for ( int p = 0; p < sizeof(ui) * __CHAR_BIT__ + 1; p += 1, ui = (ui << 1) + 1 ) {
+	sout | ui | ca1( ui ) | ",";
+    }
+    sout | nl;
+
+    li = 0;
+    for ( int p = 0; i < sizeof(li) * __CHAR_BIT__ + 1; p += 1, li = (li << 1) + 1 ) {
+	sout | li | ca1( li ) | ",";
+    }
+    sout | nl;
+    uli = 0;
+    for ( int p = 0; p < sizeof(li) * __CHAR_BIT__ + 1; p += 1, uli = (uli << 1) + 1 ) {
+	sout | uli | ca1( uli ) | ",";
+    }
+    sout | nl;
+
+    lli = 0;
+    for ( int p = 0; p < sizeof(li) * __CHAR_BIT__ + 1; p += 1, lli = (lli << 1) + 1 ) {
+	sout | lli | ca1( lli ) | ",";
+    }
+    sout | nl;
+    ulli = 0;
+    for ( int p = 0; p < sizeof(li) * __CHAR_BIT__ + 1; p += 1, ulli = (ulli << 1) + 1 ) {
+	sout | ulli | ca1( ulli ) | ",";
+    }
+    sout | nl;
+
+    //============================================================
+
+    sout | nl | "ca0" | nl;
+
+    sc = 0;
+    for ( int p = 0; p < sizeof(sc) * __CHAR_BIT__ + 1; p += 1, sc = (sc << 1) + 1 ) {
+	sout | sc | ca0( sc ) | ",";
+    }
+    sout | nl;
+    usc = 0;
+    for ( int p = 0; p < sizeof(sc) * __CHAR_BIT__ + 1; p += 1, usc = (usc << 1) + 1 ) {
+	sout | usc | ca0( usc ) | ",";
+    }
+    sout | nl;
+
+    si = 0;
+    for ( int p = 0; p < sizeof(si) * __CHAR_BIT__ + 1; p += 1, si = (si << 1) + 1 ) {
+	sout | si | ca0( si ) | ",";
+    }
+    sout | nl;
+    usi = 0;
+    for ( int p = 0; p < sizeof(si) * __CHAR_BIT__ + 1; p += 1, usi = (usi << 1) + 1 ) {
+	sout | usi | ca0( usi ) | ",";
+    }
+    sout | nl;
+
+    i = 0;
+    for ( int p = 0; p < sizeof(i) * __CHAR_BIT__ + 1; p += 1, i = (i << 1) + 1 ) {
+	sout | i | ca0( i ) | ",";
+    }
+    sout | nl;
+    ui = 0;
+    for ( int p = 0; p < sizeof(ui) * __CHAR_BIT__ + 1; p += 1, ui = (ui << 1) + 1 ) {
+	sout | ui | ca0( ui ) | ",";
+    }
+    sout | nl;
+
+    li = 0;
+    for ( int p = 0; p < sizeof(li) * __CHAR_BIT__ + 1; p += 1, li = (li << 1) + 1 ) {
+	sout | li | ca0( li ) | ",";
+    }
+    sout | nl;
+    uli = 0;
+    for ( int p = 0; p < sizeof(li) * __CHAR_BIT__ + 1; p += 1, uli = (uli << 1) + 1 ) {
+	sout | uli | ca0( uli ) | ",";
+    }
+    sout | nl;
+
+    lli = 0;
+    for ( int p = 0; p < sizeof(li) * __CHAR_BIT__ + 1; p += 1, lli = (lli << 1) + 1 ) {
+	sout | lli | ca0( lli ) | ",";
+    }
+    sout | nl;
+    ulli = 0;
+    for ( int p = 0; p < sizeof(li) * __CHAR_BIT__ + 1; p += 1, ulli = (ulli << 1) + 1 ) {
+	sout | ulli | ca0( ulli ) | ",";
+    }
+    sout | nl;
+
+    //============================================================
+
+    sout | nl | "fls" | nl;
+
+    sc = 0;
+    sout | sc | fls( sc ) | ",";
+    for ( sc = 1; sc != 0; sc <<= 1 ) {
+	sout | sc | fls( sc ) | ",";
+    }
+    sout | nl;
+    usc = 0;
+    sout | usc | fls( usc ) | ",";
+    for ( usc = 1; usc != 0; usc <<= 1 ) {
+	sout | usc | fls( usc ) | ",";
+    }
+    sout | nl;
+
+    si = 0;
+    sout | si | fls( si ) | ",";
+    for ( si = 1; si != 0; si <<= 1 ) {
+	sout | si | fls( si ) | ",";
+    }
+    sout | nl;
+    usi = 0;
+    sout | usi | fls( usi ) | ",";
+    for ( usi = 1; usi != 0; usi <<= 1 ) {
+	sout | usi | fls( usi ) | ",";
+    }
+    sout | nl;
+
+    i = 0;
+    sout | i | fls( i ) | ",";
+    for ( i = 1; i != 0; i <<= 1 ) {
+	sout | i | fls( i ) | ",";
+    }
+    sout | nl;
+    ui = 0;
+    sout | ui | fls( ui ) | ",";
+    for ( ui = 1; ui != 0; ui <<= 1 ) {
+	sout | ui | fls( ui ) | ",";
+    }
+    sout | nl;
+
+    li = 0;
+    sout | li | fls( li ) | ",";
+    for ( li = 1; li != 0; li <<= 1 ) {
+	sout | li | fls( li ) | ",";
+    }
+    sout | nl;
+    uli = 0;
+    sout | uli | fls( uli ) | ",";
+    for ( uli = 1; uli != 0; uli <<= 1 ) {
+	sout | uli | fls( uli ) | ",";
+    }
+    sout | nl;
+
+    lli = 0;
+    sout | lli | fls( lli ) | ",";
+    for ( lli = 1; lli != 0; lli <<= 1 ) {
+	sout | lli | fls( lli ) | ",";
+    }
+    sout | nl;
+    ulli = 0;
+    sout | ulli | fls( ulli ) | ",";
+    for ( ulli = 1; ulli != 0; ulli <<= 1 ) {
+	sout | ulli | fls( ulli ) | ",";
+    }
+    sout | nl;
+
+    //============================================================
+
+    sout | nl | "fms" | nl;
+
+    sc = 0;
+    sout | sc | fms( sc ) | ",";
+    for ( sc = 1; sc != 0; sc <<= 1 ) {
+	sout | sc | fms( sc ) | ",";
+    }
+    sout | nl;
+    usc = 0;
+    sout | usc | fms( usc ) | ",";
+    for ( usc = 1; usc != 0; usc <<= 1 ) {
+	sout | usc | fms( usc ) | ",";
+    }
+    sout | nl;
+
+    si = 0;
+    sout | si | fms( si ) | ",";
+    for ( si = 1; si != 0; si <<= 1 ) {
+	sout | si | fms( si ) | ",";
+    }
+    sout | nl;
+    usi = 0;
+    sout | usi | fms( usi ) | ",";
+    for ( usi = 1; usi != 0; usi <<= 1 ) {
+	sout | usi | fms( usi ) | ",";
+    }
+    sout | nl;
+
+    i = 0;
+    sout | i | fms( i ) | ",";
+    for ( i = 1; i != 0; i <<= 1 ) {
+	sout | i | fms( i ) | ",";
+    }
+    sout | nl;
+    ui = 0;
+    sout | ui | fms( ui ) | ",";
+    for ( ui = 1; ui != 0; ui <<= 1 ) {
+	sout | ui | fms( ui ) | ",";
+    }
+    sout | nl;
+
+    li = 0;
+    sout | li | fms( li ) | ",";
+    for ( li = 1; li != 0; li <<= 1 ) {
+	sout | li | fms( li ) | ",";
+    }
+    sout | nl;
+    uli = 0;
+    sout | uli | fms( uli ) | ",";
+    for ( uli = 1; uli != 0; uli <<= 1 ) {
+	sout | uli | fms( uli ) | ",";
+    }
+    sout | nl;
+
+    lli = 0;
+    sout | lli | fms( lli ) | ",";
+    for ( lli = 1; lli != 0; lli <<= 1 ) {
+	sout | lli | fms( lli ) | ",";
+    }
+    sout | nl;
+    ulli = 0;
+    sout | ulli | fms( ulli ) | ",";
+    for ( ulli = 1; ulli != 0; ulli <<= 1 ) {
+	sout | ulli | fms( ulli ) | ",";
+    }
+    sout | nl;
+#if 0
+#endif // 0
+}
Index: tests/concurrent/.expect/suspend_then.txt
===================================================================
--- tests/concurrent/.expect/suspend_then.txt	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ tests/concurrent/.expect/suspend_then.txt	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,4001 @@
+T - took
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
+C - Suspending
+C - Publishing
+T - took
+C - Back
Index: sts/concurrent/coroutineThen.cfa
===================================================================
--- tests/concurrent/coroutineThen.cfa	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ 	(revision )
@@ -1,94 +1,0 @@
-#include <fstream.hfa>
-#include <kernel.hfa>
-#include <monitor.hfa>
-#include <thread.hfa>
-#include <time.hfa>
-#include <stdlib.hfa>
-#include <string.h>
-
-#define __kick_rate 150000ul
-#include "long_tests.hfa"
-
-#ifndef PREEMPTION_RATE
-#define PREEMPTION_RATE 10`ms
-#endif
-
-Duration default_preemption() {
-	return PREEMPTION_RATE;
-}
-
-#ifdef TEST_LONG
-static const unsigned long N = 600_000ul;
-#else
-static const unsigned long N = 1_000ul;
-#endif
-
-#if !defined(TEST_FOREVER)
-	static inline void print(const char * const text ) {
-		write( STDERR_FILENO, text, strlen(text) );
-	}
-#else
-	static inline void print(Printer & this, const char * const text ) {}
-#endif
-
-coroutine Coroutine {};
-
-volatile bool done = false;
-Coroutine * volatile the_cor = 0p;
-
-void store(Coroutine & cor) {
-	__atomic_store_n(&the_cor, &cor, __ATOMIC_SEQ_CST);
-}
-
-Coroutine * take(void) {
-	Coroutine * val = 0p;
-	Coroutine * ret = __atomic_exchange_n(&the_cor, val, __ATOMIC_SEQ_CST);
-	assert(!ret || !the_cor);
-	return ret;
-}
-
-void main(Coroutine& this) {
-	suspend();
-	for(int i = 0; TEST(i < N); i++) {
-
-		print("C - Suspending");
-		void publish() {
-			print("C - Publishing");
-			assert(!the_cor);
-			store( this );
-		}
-		suspend_then(publish);
-		assert(!the_cor);
-		print("Coroutine 2");
-		KICK_WATCHDOG;
-		yield();
-	}
-	done = true;
-	suspend();
-}
-
-thread Thread {};
-void main(Thread & this) {
-	Coroutine * mine = 0p;
-	while(!done) {
-		yield();
-
-		mine = take();
-		if(!mine) continue;
-
-		print("T - took");
-		resume(*mine);
-		print("T - back");
-	}
-}
-
-
-int main(int argc, char* argv[]) {
-	processor p[2];
-	Coroutine c;
-	resume(c); // Prime the coroutine to avoid one of the threads being its starter
-	the_cor = &c;
-	{
-		Thread t[2];
-	}
-}
Index: tests/concurrent/coroutineYield.cfa
===================================================================
--- tests/concurrent/coroutineYield.cfa	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ tests/concurrent/coroutineYield.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -33,5 +33,5 @@
 			sout | "Coroutine 2";
 		#endif
-		suspend();
+		suspend;
 	}
 }
Index: tests/concurrent/suspend_then.cfa
===================================================================
--- tests/concurrent/suspend_then.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ tests/concurrent/suspend_then.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,88 @@
+#include <fstream.hfa>
+#include <kernel.hfa>
+#include <thread.hfa>
+#include <time.hfa>
+#include <stdlib.hfa>
+#include <string.h>
+
+#define __kick_rate 150000ul
+#include "long_tests.hfa"
+
+Duration default_preemption() {
+	return 0;
+}
+
+#ifdef TEST_LONG
+static const unsigned long N = 600_000ul;
+#else
+static const unsigned long N = 1_000ul;
+#endif
+
+#if !defined(TEST_FOREVER)
+	static inline void print(const char * const text ) {
+		write( STDOUT_FILENO, text, strlen(text) );
+	}
+#else
+	static inline void print(Printer & this, const char * const text ) {}
+#endif
+
+generator Coroutine { int i; };
+
+volatile bool done = false;
+Coroutine * volatile the_cor = 0p;
+
+void store(Coroutine & cor) {
+	__atomic_store_n(&the_cor, &cor, __ATOMIC_SEQ_CST);
+}
+
+Coroutine * take(void) {
+	Coroutine * val = 0p;
+	Coroutine * ret = __atomic_exchange_n(&the_cor, val, __ATOMIC_SEQ_CST);
+	assert(!ret || !the_cor);
+	return ret;
+}
+
+void main(Coroutine& this) {
+	this.i = 0;
+	suspend;
+	for(;TEST(this.i < N); this.i++) {
+
+		print("C - Suspending\n");
+		suspend{
+			print("C - Publishing\n");
+			assert(!the_cor);
+			store( this );
+		}
+		assert(!the_cor);
+		print("C - Back\n");
+		KICK_WATCHDOG;
+		yield();
+	}
+	done = true;
+	suspend;
+}
+
+thread Thread {};
+void main(Thread & this) {
+	Coroutine * mine = 0p;
+	while(!done) {
+		yield();
+
+		mine = take();
+		if(!mine) continue;
+
+		print("T - took\n");
+		resume(*mine);
+	}
+}
+
+
+int main(int argc, char* argv[]) {
+	processor p[2];
+	Coroutine c;
+	resume(c); // Prime the coroutine to avoid one of the threads being its starter
+	the_cor = &c;
+	{
+		Thread t[2];
+	}
+}
Index: tests/coroutine/.expect/fmtLines.txt
===================================================================
--- tests/coroutine/.expect/fmtLines.txt	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ tests/coroutine/.expect/fmtLines.txt	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -48,31 +48,31 @@
 {			  				  // f  or n  ewli  
 ne c  hara  cter  s			  		su  
-spen  d();  				  	if   ( fm  
-t.ch   !=   '\n'   ) b  reak  
-;		/  / ig  nore   new  line  
-				  } //   for  				  sout  
- | f  mt.c  h;		  				  	//   
-prin  t ch  arac  ter	  		}   
-// f  or		  	sou  t |   "  "  
-;			  				  	//   prin  t bl  
-ock   sepa  rato  r		}   //   
-for	  	sou  t |   nl;	  				  
-				  // p  rint   gro  up s  
-epar  ator  	} /  / fo  r} /  
-/ ma  invo  id p  rt(   Form  
-at &   fmt  , ch  ar c  h )   
-{      fmt  .ch   = ch  ;     
- res  ume(   fmt   );}   //   
-prti  nt m  ain(  ) {	  Form  
-at f  mt;	  char   ch;  	for  
- ( ;  ; )   {		s  in |   ch;  
-				  				  		//   rea  d on  
-e ch  arac  ter	    if   ( e  
-of(   sin   ) )   brea  k;		  
-				  	//   eof   ?		p  rt(   
-fmt,   ch   );	}   //   for}  
- //   main  // L  ocal   Var  
-iabl  es:   ////   tab  -wid  
-th:   4 //  // c  ompi  le-c  
-omma  nd:   "cfa   fmt  Line  
-s.cf  a" /  ///   End:   //
+spen  d;		  			i  f (   fmt.  
+ch !  = '\  n' )   bre  ak;	  
+	//   igno  re n  ewli  ne		  
+		}   // f  or		  		so  ut |  
+ fmt  .ch;  				  			/  / pr  
+int   char  acte  r			  } //  
+ for  			s  out   | "    ";	  
+				  			/  / pr  int   bloc  
+k se  para  tor	  	} /  / fo  
+r		s  out   | nl  ;			  				  
+		//   pri  nt g  roup   sep  
+arat  or	}   //   for}   //   
+main  void   prt  ( Fo  rmat  
+ & f  mt,   char   ch   ) {   
+   f  mt.c  h =   ch;      r  
+esum  e( f  mt )  ;} /  / pr  
+tint   mai  n()   {	Fo  rmat  
+ fmt  ;	ch  ar c  h;	f  or (  
+ ;;   ) {	  	sin   | c  h;		  
+				  				  // r  ead   one   
+char  acte  r	    if (   eof  
+( si  n )   ) br  eak;  				  
+			/  / eo  f ?	  	prt  ( fm  
+t, c  h );  	} /  / fo  r} /  
+/ ma  in//   Loc  al V  aria  
+bles  : //  // t  ab-w  idth  
+: 4   ////   com  pile  -com  
+mand  : "c  fa f  mtLi  nes.  
+cfa"   ///  / En  d: /  /
Index: tests/coroutine/.in/fmtLines.txt
===================================================================
--- tests/coroutine/.in/fmtLines.txt	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ tests/coroutine/.in/fmtLines.txt	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -35,5 +35,5 @@
 			for ( fmt.b = 0; fmt.b < 4; fmt.b += 1 ) {	// blocks of 4 characters
 				for ( ;; ) {							// for newline characters
-					suspend();
+					suspend;
 					if ( fmt.ch != '\n' ) break;		// ignore newline
 				} // for
Index: tests/coroutine/cntparens.cfa
===================================================================
--- tests/coroutine/cntparens.cfa	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ tests/coroutine/cntparens.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -1,10 +1,10 @@
-// 
+//
 // Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
 //
 // The contents of this file are covered under the licence agreement in the
 // file "LICENCE" distributed with Cforall.
-// 
+//
 // cntparens.cfa -- match left/right parenthesis
-// 
+//
 // Author           : Peter A. Buhr
 // Created On       : Sat Apr 20 11:04:45 2019
@@ -12,5 +12,5 @@
 // Last Modified On : Sat Apr 20 11:06:21 2019
 // Update Count     : 1
-// 
+//
 
 #include <fstream.hfa>
@@ -26,12 +26,12 @@
 void main( CntParens & cpns ) with( cpns ) {
 	for ( ; ch == '('; cnt += 1 ) {						// left parenthesis
-		suspend();
+		suspend;
 	}
 	for ( ; ch == ')' && cnt > 1; cnt -= 1 ) {			// right parenthesis
-		suspend();
+		suspend;
 	}
 	status = ch == ')' ? Match : Error;
 } // main
-	
+
 void ?{}( CntParens & cpns ) with( cpns ) { status = Cont; cnt = 0; }
 
Index: tests/coroutine/devicedriver.cfa
===================================================================
--- tests/coroutine/devicedriver.cfa	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ tests/coroutine/devicedriver.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -1,10 +1,10 @@
-// 
+//
 // Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
 //
 // The contents of this file are covered under the licence agreement in the
 // file "LICENCE" distributed with Cforall.
-// 
-// devicedriver.cfa -- 
-// 
+//
+// devicedriver.cfa --
+//
 // Author           : Peter A. Buhr
 // Created On       : Sat Mar 16 15:30:34 2019
@@ -12,5 +12,5 @@
 // Last Modified On : Sat Apr 20 09:07:19 2019
 // Update Count     : 90
-// 
+//
 
 #include <fstream.hfa>
@@ -29,7 +29,7 @@
 
 void checkCRC( Driver & d, unsigned int sum ) with( d ) {
-	suspend();
+	suspend;
 	unsigned short int crc = byte << 8;					// sign extension over written
-	suspend();
+	suspend;
 	// prevent sign extension for signed char
 	status = (crc | (unsigned char)byte) == sum ? MSG : ECRC;
@@ -41,17 +41,17 @@
 		status = CONT;
 		unsigned int lnth = 0, sum = 0;
-		while ( byte != STX ) suspend();
+		while ( byte != STX ) suspend;
 	  emsg: for () {
-			suspend();
+			suspend;
 			choose ( byte ) {							// process byte
 			  case STX:
-				status = ESTX; suspend(); continue msg;
+				status = ESTX; suspend; continue msg;
 			  case ETX:
 				break emsg;
 			  case ESC:
-				suspend();
+				suspend;
 			} // choose
 			if ( lnth >= MaxMsg ) {						// buffer full ?
-				status = ELNTH; suspend(); continue msg;
+				status = ELNTH; suspend; continue msg;
 			} // if
 			msg[lnth++] = byte;
@@ -60,5 +60,5 @@
 		msg[lnth] = '\0';								// terminate string
 		checkCRC( d, sum );								// refactor CRC check
-		suspend();
+		suspend;
 	} // for
 } // main
Index: tests/coroutine/fibonacci.cfa
===================================================================
--- tests/coroutine/fibonacci.cfa	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ tests/coroutine/fibonacci.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -22,10 +22,10 @@
 	int fn1, fn2;										// retained between resumes
 	fn = 0;  fn1 = fn;									// 1st case
-	suspend();											// restart last resume
+	suspend;											// restart last resume
 	fn = 1;  fn2 = fn1;  fn1 = fn;						// 2nd case
-	suspend();											// restart last resume
+	suspend;											// restart last resume
 	for () {
 		fn = fn1 + fn2;  fn2 = fn1;  fn1 = fn;			// general case
-		suspend();										// restart last resume
+		suspend;										// restart last resume
 	} // for
 }
Index: tests/coroutine/fibonacci_1.cfa
===================================================================
--- tests/coroutine/fibonacci_1.cfa	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ tests/coroutine/fibonacci_1.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -12,5 +12,5 @@
 // Last Modified On : Thu Mar 21 08:10:45 2019
 // Update Count     : 25
-// 
+//
 
 #include <fstream.hfa>
@@ -23,5 +23,5 @@
 	[fn1, fn] = [0, 1];									// precompute first two states
 	for () {
-		suspend();										// restart last resume
+		suspend;										// restart last resume
 		[fn1, fn] = [fn, fn1 + fn];						// general case
 	} // for
Index: tests/coroutine/fmtLines.cfa
===================================================================
--- tests/coroutine/fmtLines.cfa	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ tests/coroutine/fmtLines.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -27,5 +27,5 @@
 			for ( b = 0; b < 4; b += 1 ) {				// blocks of 4 characters
 				for () {								// for newline characters
-					suspend();
+					suspend;
 				  if ( ch != '\n' ) break;				// ignore newline
 				} // for
Index: tests/coroutine/raii.cfa
===================================================================
--- tests/coroutine/raii.cfa	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ tests/coroutine/raii.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -39,5 +39,5 @@
 	Raii raii = { "Coroutine" };
 	sout | "Before Suspend";
-	suspend();
+	suspend;
 	sout | "After Suspend";
 }
Index: tests/coroutine/runningTotal.cfa
===================================================================
--- tests/coroutine/runningTotal.cfa	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ tests/coroutine/runningTotal.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -25,5 +25,5 @@
 void update( RunTotal & rntl, int input ) with( rntl ) { // helper
 	total += input;										// remember between activations
-	suspend();											// inactivate on stack
+	suspend;											// inactivate on stack
 }
 
Index: tests/coroutine/suspend_then.cfa
===================================================================
--- tests/coroutine/suspend_then.cfa	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ tests/coroutine/suspend_then.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -15,21 +15,18 @@
 
 #include <fstream.hfa>
-#include <coroutine.hfa>
 
-void then() {
-	sout | "Then!";
-}
-
-coroutine Fibonacci { int fn; };						// used for communication
+generator Fibonacci {
+	int fn; 									// used for communication
+	int fn1, fn2;								// retained between resumes
+};
 
 void main( Fibonacci & fib ) with( fib ) {				// called on first resume
-	int fn1, fn2;								// retained between resumes
 	fn = 0;  fn1 = fn;							// 1st case
-	suspend_then(then);							// restart last resume
+	suspend { sout | "Then!"; }						// restart last resume
 	fn = 1;  fn2 = fn1;  fn1 = fn;					// 2nd case
-	suspend_then(then);							// restart last resume
+	suspend { sout | "Then!"; }						// restart last resume
 	for () {
 		fn = fn1 + fn2;  fn2 = fn1;  fn1 = fn;			// general case
-		suspend_then(then);						// restart last resume
+		suspend { sout | "Then!"; }					// restart last resume
 	} // for
 }
Index: tests/errors/.expect/completeType.txt
===================================================================
--- tests/errors/.expect/completeType.txt	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ tests/errors/.expect/completeType.txt	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -27,5 +27,5 @@
     void 
   )
-  Environment:( _83_4_DT ) -> instance of struct A with body 0 (no widening)
+  Environment:( _85_4_DT ) -> instance of struct A with body 0 (no widening)
 
 
@@ -50,5 +50,5 @@
     void 
   )
-  Environment:( _83_4_DT ) -> instance of struct B with body 1 (no widening)
+  Environment:( _85_4_DT ) -> instance of struct B with body 1 (no widening)
 
 
@@ -127,13 +127,13 @@
           void 
         )
-        Environment:( _102_0_T ) -> instance of type T (not function type) (no widening)
+        Environment:( _104_0_T ) -> instance of type T (not function type) (no widening)
 
       Could not satisfy assertion:
 ?=?: pointer to function
         ... with parameters
-          reference to instance of type _102_0_T (not function type)
-          instance of type _102_0_T (not function type)
+          reference to instance of type _104_0_T (not function type)
+          instance of type _104_0_T (not function type)
         ... returning
-          _retval__operator_assign: instance of type _102_0_T (not function type)
+          _retval__operator_assign: instance of type _104_0_T (not function type)
           ... with attributes:
             Attribute with name: unused
Index: tests/errors/suspend.cfa
===================================================================
--- tests/errors/suspend.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ tests/errors/suspend.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,36 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// suspend.cfa --
+//
+// Author           : Thierry Delisle
+// Created On       : Thu Mar  5 16:03:16 2020
+// Last Modified By :
+// Last Modified On :
+// Update Count     :
+//
+
+#include <coroutine.hfa>
+
+generator A {};
+
+void main(A & a) {
+	suspend {
+		suspend;
+	}
+
+	suspend{
+		int foo() { return 3; }
+	}
+}
+
+coroutine B {};
+
+void main(B & b) {
+	suspend generator;
+
+	suspend {};
+}
Index: tests/generator/.expect/fibonacci.txt
===================================================================
--- tests/generator/.expect/fibonacci.txt	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ tests/generator/.expect/fibonacci.txt	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,10 @@
+0 0
+1 1
+1 1
+2 2
+3 3
+5 5
+8 8
+13 13
+21 21
+34 34
Index: tests/generator/.expect/fmtLines.txt
===================================================================
--- tests/generator/.expect/fmtLines.txt	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ tests/generator/.expect/fmtLines.txt	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,78 @@
+////   Cfo  rall   Ver  sion  
+ 1.0  .0 C  opyr  ight   (C)  
+ 201  7 Un  iver  sity   of   
+Wate  rloo  ////   The   con  
+tent  s of   thi  s fi  le a  
+re c  over  ed u  nder   the  
+ lic  ence   agr  eeme  nt i  
+n th  e//   file   "LI  CENC  
+E" d  istr  ibut  ed w  ith   
+Cfor  all.  ////   fmt  Line  
+s.cc   --/  ///   Auth  or    
+             : P  eter   A.   
+Buhr  // C  reat  ed O  n     
+      : Su  n Se  p 17   21:  
+56:1  5 20  17//   Las  t Mo  
+difi  ed B  y :   Pete  r A.  
+ Buh  r//   Last   Mod  ifie  
+d On   : F  ri M  ar 2  2 13  
+:41:  03 2  019/  / Up  date  
+ Cou  nt       :   33/  /#in  
+clud  e <f  stre  am.h  fa>#  
+incl  ude   <cor  outi  ne.h  
+fa>c  orou  tine   For  mat   
+{	ch  ar c  h;		  				  				  
+	//   used   for   com  muni  
+cati  on	i  nt g  , b;  				  
+				  			/  / gl  obal   bec  
+ause   use  d in   des  truc  
+tor}  ;voi  d ?{  }( F  orma  
+t &   fmt   ) {      r  esum  
+e( f  mt )  ;			  				  			/  
+/ st  art   coro  utin  e}vo  
+id ^  ?{}(   For  mat   & fm  
+t )   {      if   ( fm  t.g   
+!= 0   ||   fmt.  b !=   0 )  
+ sou  t |   nl;}  void   mai  
+n( F  orma  t &   fmt   ) {	  
+for   ( ;;   ) {  				  				  
+		//   for   as   many   cha  
+ract  ers	  	for   ( f  mt.g  
+ = 0  ; fm  t.g   < 5;   fmt  
+.g +  = 1   ) {	  	//   grou  
+ps o  f 5   bloc  ks		  	for  
+ ( f  mt.b   = 0  ; fm  t.b   
+< 4;   fmt  .b +  = 1   ) {	  
+// b  lock  s of   4 c  hara  
+cter  s			  	for   ( ;  ; )   
+{			  				  // f  or n  ewli  
+ne c  hara  cter  s			  		su  
+spen  d;		  			i  f (   fmt.  
+ch !  = '\  n' )   bre  ak;	  
+	//   igno  re n  ewli  ne		  
+		}   // f  or		  		so  ut |  
+ fmt  .ch;  				  			/  / pr  
+int   char  acte  r			  } //  
+ for  			s  out   | "    ";	  
+				  			/  / pr  int   bloc  
+k se  para  tor	  	} /  / fo  
+r		s  out   | nl  ;			  				  
+		//   pri  nt g  roup   sep  
+arat  or	}   //   for}   //   
+main  void   prt  ( Fo  rmat  
+ & f  mt,   char   ch   ) {   
+   f  mt.c  h =   ch;      r  
+esum  e( f  mt )  ;} /  / pr  
+tint   mai  n()   {	Fo  rmat  
+ fmt  ;	ch  ar c  h;	f  or (  
+ ;;   ) {	  	sin   | c  h;		  
+				  				  // r  ead   one   
+char  acte  r	    if (   eof  
+( si  n )   ) br  eak;  				  
+			/  / eo  f ?	  	prt  ( fm  
+t, c  h );  	} /  / fo  r} /  
+/ ma  in//   Loc  al V  aria  
+bles  : //  // t  ab-w  idth  
+: 4   ////   com  pile  -com  
+mand  : "c  fa f  mtLi  nes.  
+cfa"   ///  / En  d: /  /
Index: tests/generator/.expect/suspend_then.txt
===================================================================
--- tests/generator/.expect/suspend_then.txt	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ tests/generator/.expect/suspend_then.txt	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,30 @@
+Then!
+Then!
+0 0
+Then!
+Then!
+1 1
+Then!
+Then!
+1 1
+Then!
+Then!
+2 2
+Then!
+Then!
+3 3
+Then!
+Then!
+5 5
+Then!
+Then!
+8 8
+Then!
+Then!
+13 13
+Then!
+Then!
+21 21
+Then!
+Then!
+34 34
Index: tests/generator/.in/fmtLines.txt
===================================================================
--- tests/generator/.in/fmtLines.txt	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ tests/generator/.in/fmtLines.txt	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,67 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// fmtLines.cc --
+//
+// Author           : Peter A. Buhr
+// Created On       : Sun Sep 17 21:56:15 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Mar 22 13:41:03 2019
+// Update Count     : 33
+//
+
+#include <fstream.hfa>
+#include <coroutine.hfa>
+
+coroutine Format {
+	char ch;											// used for communication
+	int g, b;											// global because used in destructor
+};
+
+void ?{}( Format & fmt ) {
+    resume( fmt );										// start coroutine
+}
+
+void ^?{}( Format & fmt ) {
+    if ( fmt.g != 0 || fmt.b != 0 ) sout | nl;
+}
+
+void main( Format & fmt ) {
+	for ( ;; ) {										// for as many characters
+		for ( fmt.g = 0; fmt.g < 5; fmt.g += 1 ) {		// groups of 5 blocks
+			for ( fmt.b = 0; fmt.b < 4; fmt.b += 1 ) {	// blocks of 4 characters
+				for ( ;; ) {							// for newline characters
+					suspend;
+					if ( fmt.ch != '\n' ) break;		// ignore newline
+				} // for
+				sout | fmt.ch;							// print character
+			} // for
+			sout | "  ";								// print block separator
+		} // for
+		sout | nl;									// print group separator
+	} // for
+} // main
+
+void prt( Format & fmt, char ch ) {
+    fmt.ch = ch;
+    resume( fmt );
+} // prt
+
+int main() {
+	Format fmt;
+	char ch;
+
+	for ( ;; ) {
+		sin | ch;										// read one character
+	  if ( eof( sin ) ) break;							// eof ?
+		prt( fmt, ch );
+	} // for
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa fmtLines.cfa" //
+// End: //
Index: tests/generator/fibonacci.cfa
===================================================================
--- tests/generator/fibonacci.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ tests/generator/fibonacci.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,41 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// fibonacci.cfa
+//
+// Author           : Thierry Delisle
+// Created On       : Mon Mar  1 16:54:23 2020
+// Last Modified By :
+// Last Modified On :
+// Update Count     :
+//
+
+generator Fib {
+	int fn1, fn;
+};
+
+void main(Fib & b) with (b) {
+	[fn1, fn] = [1, 0];
+	for () {
+		suspend;
+		[fn1, fn] = [fn, fn + fn1];
+	}
+}
+
+int main() {
+	Fib f1, f2;
+	for ( 10 ) {
+		resume( f1 );
+		resume( f2 );
+		printf("%d %d\n", f1.fn, f2.fn);
+	}
+
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa fibonacci.cfa" //
+// End: //
Index: tests/generator/fmtLines.cfa
===================================================================
--- tests/generator/fmtLines.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ tests/generator/fmtLines.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,65 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// fmtLines.cfa -- format characters into blocks of 4 and groups of 5 blocks per line
+//
+// Author           : Thierry Delisle
+// Created On       : Thu Mar  5 16:09:08 2020
+// Last Modified By :
+// Last Modified On :
+// Update Count     :
+//
+
+#include <fstream.hfa>
+
+generator Format {
+	char ch;											// used for communication
+	int g, b;											// global because used in destructor
+};
+
+void main( Format & fmt ) with( fmt ) {
+	for () {											// for as many characters
+		for ( g = 0; g < 5; g += 1 ) {					// groups of 5 blocks
+			for ( b = 0; b < 4; b += 1 ) {				// blocks of 4 characters
+				for () {								// for newline characters
+					suspend;
+				  if ( ch != '\n' ) break;				// ignore newline
+				} // for
+				sout | ch;								// print character
+			} // for
+			sout | "  ";								// print block separator
+		} // for
+		sout | nl;										// print group separator
+	} // for
+} // main
+
+void ?{}( Format & fmt ) {
+	resume( fmt );										// prime (start) coroutine
+}
+
+void ^?{}( Format & fmt ) with( fmt ) {
+	if ( g != 0 || b != 0 ) sout | nl;
+}
+
+void format( Format & fmt ) {
+	resume( fmt );
+} // format
+
+int main() {
+	Format fmt;
+	sout | nlOff;										// turn off auto newline
+
+  eof: for () {											// read until end of file
+		sin | fmt.ch;									// read one character
+	  if ( eof( sin ) ) break eof;						// eof ?
+		format( fmt );									// push character for formatting
+	} // for
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa fmtLines.cfa" //
+// End: //
Index: tests/generator/suspend_then.cfa
===================================================================
--- tests/generator/suspend_then.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ tests/generator/suspend_then.cfa	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,49 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2019 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// suspend_then.cfa --
+//
+// Author           : Peter A. Buhr
+// Created On       : Mon Apr 29 12:01:35 2019
+// Last Modified By :
+// Last Modified On :
+// Update Count     :
+//
+
+#include <fstream.hfa>
+
+generator Fibonacci {
+	int fn1, fn2;								// retained between resumes
+	int fn;									// used for communication
+};
+
+void main( Fibonacci & fib ) with( fib ) {				// called on first resume
+	fn = 0;  fn1 = fn;							// 1st case
+	suspend { sout | "Then!"; }						// restart last resume
+	fn = 1;  fn2 = fn1;  fn1 = fn;					// 2nd case
+	suspend { sout | "Then!"; }						// restart last resume
+	for () {
+		fn = fn1 + fn2;  fn2 = fn1;  fn1 = fn;			// general case
+		suspend { sout | "Then!"; }					// restart last resume
+	} // for
+}
+
+int next( Fibonacci & fib ) with( fib ) {
+	resume( fib );								// restart last suspend
+	return fn;
+}
+
+int main() {
+	Fibonacci f1, f2;
+	for ( 10 ) {								// print N Fibonacci values
+		sout | next( f1 ) | next( f2 );
+	} // for
+}
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa runningTotal.cfa" //
+// End: //
Index: tools/gdb/.gdbinit
===================================================================
--- tools/gdb/.gdbinit	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ tools/gdb/.gdbinit	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,9 @@
+# These signal are necessary for Cforall, so tell gdb to ignore them
+# and pass to through to the program.
+handle SIGALRM nostop noprint pass
+handle SIGUSR1 nostop noprint pass
+# Load macros to make gdb understand uC++ user-threads
+source /home/tdelisle/workspace/gdb/utils-gdb.gdb
+source /home/tdelisle/workspace/gdb/utils-gdb.py
+# Have gdb indent complex values to make them readable.
+set print pretty
Index: tools/gdb/README
===================================================================
--- tools/gdb/README	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ tools/gdb/README	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,19 @@
+These instructions assume the install <prefix> for uC++ is /usr/local/u++-7.0.0.
+If installed elsewhere, change <prefix>.
+
+Copy <prefix>/.gdbinit to your home directory. If installed elsewhere, change
+the <prefix> within .gdbinit. Thereafter, gdb automatically loads the .gdbinit
+file from the home directory making the following new gdb commands available.
+
+New commands:
+
+    clusters                        : print all clusters
+    processors                      : print all processors on all clusters
+    processors  <clusterName>       : print all processors on cluster
+    task                            : print userCluster tasks, application tasks only
+    task <clusterName>              : print cluster tasks, application tasks only
+    task all                        : print all clusters, all tasks
+    task <id>                       : switch stack to task id on userCluster
+    task 0x<address>	            : switch stack to task on any cluster
+    task <id> <clusterName>         : switch stack to task on specified cluster
+    prevtask                        : return to last switched task
Index: tools/gdb/utils-gdb.gdb
===================================================================
--- tools/gdb/utils-gdb.gdb	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ tools/gdb/utils-gdb.gdb	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,69 @@
+# 'server' keyword disables confirmation dialog when re-loading/re-defining
+# 'reset' restores the registers to the stack values at breakpoint to allow the movement commands to work correctly
+server define hook-continue
+reset
+end
+
+server define hook-next
+reset
+end
+
+server define hook-nexti
+reset
+end
+
+server define hook-step
+reset
+end
+
+server define hook-stepi
+reset
+end
+
+server define hook-finish
+reset
+end
+
+server define hook-advance
+reset
+end
+
+server define hook-jump
+reset
+end
+
+server define hook-signal
+reset
+end
+
+server define hook-until
+reset
+end
+
+server define hook-reverse-next
+reset
+end
+
+server define hook-reverse-step
+reset
+end
+
+server define hook-reverse-stepi
+reset
+end
+
+server define hook-reverse-continue
+reset
+end
+
+server define hook-reverse-finish
+reset
+end
+
+server define hook-run
+reset
+end
+
+server define hook-thread
+reset
+end
Index: tools/gdb/utils-gdb.py
===================================================================
--- tools/gdb/utils-gdb.py	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
+++ tools/gdb/utils-gdb.py	(revision bbdb0c643e5e1d39beac9cc933345506b44d7ff5)
@@ -0,0 +1,767 @@
+#
+# Copyright (C) Lynn Tran, Jiachen Zhang 2018
+#
+# utils-gdb.py --
+#
+# Author           : Lynn Tran
+# Created On       : Mon Oct 1 22:06:09 2018
+# Last Modified By : Peter A. Buhr
+# Last Modified On : Sat Jan 19 14:16:10 2019
+# Update Count     : 11
+#
+
+"""
+To run this extension, the python name has to be as same as one of the loaded library
+Additionally, the file must exist in a folder which is in gdb's safe path
+"""
+import collections
+import gdb
+import re
+
+# set these signal handlers with some settings (nostop, noprint, pass)
+gdb.execute('handle SIGALRM nostop noprint pass')
+gdb.execute('handle SIGUSR1 nostop noprint pass')
+
+CfaTypes = collections.namedtuple('CfaTypes', 'cluster_ptr processor_ptr thread_ptr int_ptr thread_state')
+
+class ThreadInfo:
+    tid = 0
+    cluster = None
+    value = None
+
+    def __init__(self, cluster, value):
+        self.cluster = cluster
+        self.value = value
+
+    def is_system(self):
+        return False
+
+# A named tuple representing information about a stack
+StackInfo = collections.namedtuple('StackInfo', 'sp fp pc')
+
+# A global variable to keep track of stack information as one switches from one
+# task to another task
+STACK = []
+
+# A global variable to keep all system task name
+SysTask_Name = ["uLocalDebuggerReader", "uLocalDebugger", "uProcessorTask", "uBootTask", "uSystemTask",
+"uProcessorTask", "uPthread", "uProfiler"]
+
+not_supported_error_msg = "Not a supported command for this language"
+
+def is_cforall():
+    return True
+
+def get_cfa_types():
+    # GDB types for various structures/types in CFA
+    return CfaTypes(cluster_ptr = gdb.lookup_type('struct cluster').pointer(),
+                  processor_ptr = gdb.lookup_type('struct processor').pointer(),
+                     thread_ptr = gdb.lookup_type('struct $thread').pointer(),
+                        int_ptr = gdb.lookup_type('int').pointer(),
+                   thread_state = gdb.lookup_type('enum coroutine_state'))
+
+def get_addr(addr):
+    """
+    NOTE: sketchy solution to retrieve address. There is a better solution...
+    @addr: str of an address that can be in a format 0xfffff <type of the object
+    at this address>
+    Return: str of just the address
+    """
+    str_addr = str(addr)
+    ending_addr_index = str_addr.find('<')
+    if ending_addr_index == -1:
+        return str(addr)
+    return str_addr[:ending_addr_index].strip()
+
+def print_usage(obj):
+    print(obj.__doc__)
+
+def parse(args):
+    """
+    Split the argument list in string format, where each argument is separated
+    by whitespace delimiter, to a list of arguments like argv
+    @args: str of arguments
+    Return:
+        [] if args is an empty string
+        list if args is not empty
+    """
+    # parse the string format of arguments and return a list of arguments
+    argv = args.split(' ')
+    if len(argv) == 1 and argv[0] == '':
+        return []
+    return argv
+
+def get_cluster_root():
+    """
+    Return: gdb.Value of globalClusters.root (is an address)
+    """
+    cluster_root = gdb.parse_and_eval('_X11mainClusterPS7cluster_1')
+    if cluster_root.address == 0x0:
+        print('No clusters, program terminated')
+    return cluster_root
+
+def find_curr_thread():
+    # btstr = gdb.execute('bt', to_string = True).splitlines()
+    # if len(btstr) == 0:
+    #     print('error')
+    #     return None
+    # return btstr[0].split('this=',1)[1].split(',')[0].split(')')[0]
+    return None
+
+def lookup_cluster(name = None):
+    """
+    Look up a cluster given its ID
+    @name: str
+    Return: gdb.Value
+    """
+    if not is_cforall():
+        return None
+
+    root = get_cluster_root()
+    if root.address == 0x0:
+        return None
+
+    if not name:
+        return root
+
+    # lookup for the task associated with the id
+    cluster = None
+    curr = root
+    while True:
+        if curr['_X4namePKc_1'].string() == name:
+            cluster = curr.address
+            break
+        curr = curr['_X4nodeS26__cluster____dbg_node_cltr_1']['_X4nextPS7cluster_1']
+        if curr == root or curr == 0x0:
+            break
+
+    if not cluster:
+        print("Cannot find a cluster with the name: {}.".format(name))
+        return None
+
+    return cluster
+
+def lookup_threads_by_cluster(cluster):
+        # Iterate through a circular linked list of threads and accumulate them in an array
+        threads = []
+
+        cfa_t = get_cfa_types()
+        root = cluster['_X7threadsS8__dllist_S7$thread__1']['_X4headPY15__TYPE_generic__1'].cast(cfa_t.thread_ptr)
+
+        if root == 0x0 or root.address == 0x0:
+            print('There are no tasks for cluster: {}'.format(cluster))
+            return threads
+
+        curr = root
+        tid = 0
+        sid = -1
+
+        while True:
+            t = ThreadInfo(cluster, curr)
+            if t.is_system():
+                t.tid = sid
+                sid -= 1
+            else:
+                t.tid = tid
+                tid += 1
+
+            threads.append(t)
+
+            curr = curr['node']['next']
+            if curr == root or curr == 0x0:
+                break
+
+        return threads
+
+def system_thread(thread):
+    return False
+
+def adjust_stack(pc, fp, sp):
+    # pop sp, fp, pc from global stack
+    gdb.execute('set $pc = {}'.format(pc))
+    gdb.execute('set $rbp = {}'.format(fp))
+    gdb.execute('set $sp = {}'.format(sp))
+
+############################ COMMAND IMPLEMENTATION #########################
+
+class Clusters(gdb.Command):
+    """Cforall: Display currently known clusters
+Usage:
+    info clusters                 : print out all the clusters
+"""
+
+    def __init__(self):
+        super(Clusters, self).__init__('info clusters', gdb.COMMAND_USER)
+
+    def print_cluster(self, cluster_name, cluster_address):
+        print('{:>20}  {:>20}'.format(cluster_name, cluster_address))
+
+    #entry point from gdb
+    def invoke(self, arg, from_tty):
+        if not is_cforall():
+            return
+
+        if arg:
+            print("info clusters does not take arguments")
+            print_usage(self)
+            return
+
+        cluster_root = get_cluster_root()
+        if cluster_root.address == 0x0:
+            return
+
+        curr = cluster_root
+        self.print_cluster('Name', 'Address')
+
+        while True:
+            self.print_cluster(curr['_X4namePKc_1'].string(), str(curr))
+            curr = curr['_X4nodeS26__cluster____dbg_node_cltr_1']['_X4nextPS7cluster_1']
+            if curr == cluster_root:
+                break
+
+        print("")
+
+############
+class Processors(gdb.Command):
+    """Cforall: Display currently known processors
+Usage:
+    info processors                 : print out all the processors in the Main Cluster
+    info processors <cluster_name>  : print out all processors in a given cluster
+"""
+
+    def __init__(self):
+        super(Processors, self).__init__('info processors', gdb.COMMAND_USER)
+
+    def print_processor(self, name, status, pending, address):
+        print('{:>20}  {:>11}  {:>13}  {:>20}'.format(name, status, pending, address))
+
+    def iterate_procs(self, root, active):
+        if root == 0x0:
+            return
+
+        cfa_t = get_cfa_types()
+        curr = root
+
+        while True:
+            processor = curr
+            should_stop = processor['_X12do_terminateVb_1']
+            stop_count  = processor['_X10terminatedS9semaphore_1']['_X5counti_1']
+            if not should_stop:
+                status = 'Active' if active else 'Idle'
+            else:
+                status_str  = 'Last Thread' if stop_count >= 0 else 'Terminating'
+                status      = '{}({},{})'.format(status_str, should_stop, stop_count)
+
+            self.print_processor(processor['_X4namePKc_1'].string(),
+                    status, str(processor['_X18pending_preemptionb_1']), str(processor)
+                )
+
+            curr = curr['_X4nodeS28__processor____dbg_node_proc_1']['_X4nextPS9processor_1']
+
+            if curr == root or curr == 0x0:
+                break
+
+    #entry point from gdb
+    def invoke(self, arg, from_tty):
+        if not is_cforall():
+            return
+
+        cluster = lookup_cluster(arg if arg else None)
+
+        if not cluster:
+            print("No Cluster matching arguments found")
+            return
+
+        cfa_t = get_cfa_types()
+        print('Cluster: "{}"({})'.format(cluster['_X4namePKc_1'].string(), cluster.cast(cfa_t.cluster_ptr)))
+
+        active_root = cluster.cast(cfa_t.cluster_ptr) \
+                ['_X5procsS8__dllist_S9processor__1'] \
+                ['_X4headPY15__TYPE_generic__1'] \
+                .cast(cfa_t.processor_ptr)
+
+        idle_root = cluster.cast(cfa_t.cluster_ptr) \
+                ['_X5idlesS8__dllist_S9processor__1'] \
+                ['_X4headPY15__TYPE_generic__1'] \
+                .cast(cfa_t.processor_ptr)
+
+        if idle_root != 0x0 or active_root != 0x0:
+            self.print_processor('Name', 'Status', 'Pending Yield', 'Address')
+            self.iterate_procs(active_root, True)
+            self.iterate_procs(idle_root, False)
+        else:
+            print("No processors on cluster")
+
+        print()
+
+############
+class Threads(gdb.Command):
+    """Cforall: Display currently known threads
+Usage:
+    cfathreads                           : print Main Cluster threads, application threads only
+    cfathreads all                       : print all clusters, all threads
+    cfathreads <clusterName>             : print cluster threads, application threads only
+    """
+    def __init__(self):
+        # The first parameter of the line below is the name of the command. You
+        # can call it 'uc++ task'
+        super(Threads, self).__init__('info cfathreads', gdb.COMMAND_USER)
+
+    def print_formatted(self, marked, tid, name, state, address):
+        print('{:>1}  {:>4}  {:>20}  {:>10}  {:>20}'.format('*' if marked else ' ', tid, name, state, address))
+
+    def print_thread(self, thread, tid, marked):
+        cfa_t = get_cfa_types()
+        self.print_formatted(marked, tid, thread['self_cor']['name'].string(), str(thread['state'].cast(cfa_t.thread_state)), str(thread))
+
+    def print_formatted_cluster(self, str_format, cluster_name, cluster_addr):
+        print(str_format.format(cluster_name, cluster_addr))
+
+    def print_threads_by_cluster(self, cluster, print_system = False):
+        # Iterate through a circular linked list of tasks and print out its
+        # name along with address associated to each cluster
+        threads = lookup_threads_by_cluster(cluster)
+        if not threads:
+            return
+
+        running_thread = find_curr_thread()
+        if running_thread is None:
+            print('Could not identify current thread')
+
+        self.print_formatted(False, '', 'Name', 'State', 'Address')
+
+        for t in threads:
+            if not t.is_system() or print_system:
+                self.print_thread(t.value, t.tid, t.value == running_thread if running_thread else False)
+
+        print()
+
+    def print_all_threads(self):
+        print("Not implemented")
+
+    def invoke(self, arg, from_tty):
+        """
+        @arg: str
+        @from_tty: bool
+        """
+        if not is_cforall():
+            return
+
+        if not arg:
+            cluster = lookup_cluster()
+            if not cluster:
+                print("Could not find Main Cluster")
+                return
+
+            # only tasks and main
+            self.print_threads_by_cluster(cluster, False)
+
+        elif arg == 'all':
+            # all threads, all clusters
+            self.print_all_threads()
+
+        else:
+            cluster = lookup_cluster(arg)
+            if not cluster:
+                print("Could not find cluster '{}'".format(arg))
+                return
+
+            # all tasks, specified cluster
+            self.print_threads_by_cluster(cluster, True)
+
+
+############
+class Thread(gdb.Command):
+    def __init__(self):
+        # The first parameter of the line below is the name of the command. You
+        # can call it 'uc++ task'
+        super(Threads, self).__init__('cfathread', gdb.COMMAND_USER)
+
+    def print_usage(self):
+        print_usage("""
+    cfathread                            : print userCluster tasks, application tasks only
+    cfathread <clusterName>              : print cluster tasks, application tasks only
+    cfathread all                        : print all clusters, all tasks
+    cfathread <id>                       : switch stack to thread id on userCluster
+    cfathread 0x<address>	             : switch stack to thread on any cluster
+    cfathread <id> <clusterName>         : switch stack to thread on specified cluster
+    """)
+
+    ############################ AUXILIARY FUNCTIONS #########################
+
+    def print_formatted(self, marked, tid, name, state, address):
+        print('{:>1}  {:>4}  {:>20}  {:>10}  {:>20}'.format('*' if marked else ' ', tid, name, state, address))
+
+    def print_thread(self, thread, tid, marked):
+        cfa_t = get_cfa_types()
+        self.print_formatted(marked, tid, thread['self_cor']['name'].string(), str(thread['state'].cast(cfa_t.thread_state)), str(thread))
+
+    def print_formatted_cluster(self, str_format, cluster_name, cluster_addr):
+        print(str_format.format(cluster_name, cluster_addr))
+
+    def print_tasks_by_cluster_all(self, cluster_address):
+        """
+        Display a list of all info about all available tasks on a particular cluster
+        @cluster_address: gdb.Value
+        """
+        cluster_address = cluster_address.cast(uCPPTypes.ucluster_ptr)
+        task_root = cluster_address['tasksOnCluster']['root']
+
+        if task_root == 0x0 or task_root.address == 0x0:
+            print('There are no tasks for cluster at address: {}'.format(cluster_address))
+            return
+
+        self.print_formatted_task('', 'Task Name', 'Address', 'State')
+        curr = task_root
+        task_id = 0
+        systask_id = -1
+
+        breakpoint_addr = self.find_curr_breakpoint_addr()
+        if breakpoint_addr is None:
+            return
+
+        while True:
+            global SysTask_Name
+            if (curr['task_']['name'].string() in SysTask_Name):
+                self.print_formatted_tasks(systask_id, breakpoint_addr, curr)
+                systask_id -= 1
+            else:
+                self.print_formatted_tasks(task_id, breakpoint_addr, curr)
+                task_id += 1
+
+            curr = curr['next'].cast(uCPPTypes.uBaseTaskDL_ptr_type)
+            if curr == task_root:
+                break
+
+    def print_tasks_by_cluster_address_all(self, cluster_address):
+        """
+        Display a list of all info about all available tasks on a particular cluster
+        @cluster_address: str
+        """
+        # Iterate through a circular linked list of tasks and print out its
+        # name along with address associated to each cluster
+
+        # convert hex string to hex number
+        try:
+            hex_addr = int(cluster_address, 16)
+        except:
+            self.print_usage()
+            return
+
+        cluster_address = gdb.Value(hex_addr)
+        if not self.print_tasks_by_cluster_all(cluster_address):
+            return
+
+    def print_threads_by_cluster(self, cluster, print_system = False):
+        """
+        Display a list of limited info about all available threads on a particular cluster
+        @cluster: str
+        @print_system: bool
+        """
+        # Iterate through a circular linked list of tasks and print out its
+        # name along with address associated to each cluster
+
+        threads = self.threads_by_cluster(cluster)
+        if not threads:
+            return
+
+        running_thread = self.find_curr_thread()
+        if running_thread is None:
+            print('Could not identify current thread')
+
+        self.print_formatted(False, '', 'Name', 'State', 'Address')
+
+        for t in threads:
+            if not t.is_system() or print_system:
+                self.print_thread(t.value, t.tid, t.value == running_thread if running_thread else False)
+
+        print()
+
+    ############################ COMMAND FUNCTIONS #########################
+
+    def print_all_threads(self):
+        """Iterate through each cluster, iterate through all tasks and  print out info about all the tasks
+        in those clusters"""
+        uCPPTypes = None
+        try:
+            uCPPTypes = get_uCPP_types()
+        except gdb.error:
+            print(not_supported_error_msg)
+            print(gdb.error)
+            return
+
+        cluster_root = get_cluster_root()
+        if cluster_root.address == 0x0:
+            return
+
+        curr = cluster_root
+        self.print_formatted_cluster(self.cluster_str_format, 'Cluster Name', 'Address')
+
+        while True:
+            addr = str(curr['cluster_'].reference_value())[1:]
+            self.print_formatted_cluster(self.cluster_str_format, curr['cluster_']['name'].string(), addr)
+
+            self.print_tasks_by_cluster_address_all(addr)
+            curr = curr['next'].cast(uCPPTypes.uClusterDL_ptr_type)
+            if curr == cluster_root:
+                break
+
+    def switchto(self, thread):
+        """Change to a new task by switching to a different stack and manually
+        adjusting sp, fp and pc
+        @task_address: str
+            2 supported format:
+                in hex format
+                    <hex_address>: literal hexadecimal address
+                    Ex: 0xffffff
+                in name of the pointer to the task
+                    "task_name": pointer of the variable name of the cluster
+                        Ex: T* s -> task_name = s
+            Return: gdb.value of the cluster's address
+        """
+        # uCPPTypes = None
+        # try:
+        #     uCPPTypes = get_uCPP_types()
+        # except gdb.error:
+        #     print(not_supported_error_msg)
+        #     print(gdb.error)
+        #     return
+
+        # # Task address has a format "task_address", which implies that it is the
+        # # name of the variable, and it needs to be evaluated
+        # if task_address.startswith('"') and task_address.endswith('"'):
+        #     task = gdb.parse_and_eval(task_address.replace('"', ''))
+        # else:
+        # # Task address format does not include the quotation marks, which implies
+        # # that it is a hex address
+        #     # convert hex string to hex number
+        #     try:
+        #         hex_addr = int(task_address, 16)
+        #     except:
+        #         self.print_usage()
+        #         return
+        #     task_address = gdb.Value(hex_addr)
+        #     task = task_address.cast(uCPPTypes.uBaseTask_ptr_type)
+        try:
+            if not gdb.lookup_symbol('__cfactx_switch'):
+                print('__cfactx_switch symbol is unavailable')
+                return
+        except:
+            print('here 3')
+
+        cfa_t = get_cfa_types()
+
+        state = thread['state'].cast(cfa_t.thread_state)
+        try:
+            if state == gdb.parse_and_eval('Halted'):
+                print('Cannot switch to a terminated thread')
+                return
+
+            if state == gdb.parse_and_eval('Start'):
+                print('Cannjot switch to a thread not yet run')
+                return
+        except:
+            print("here 2")
+            return
+
+
+        context = thread['context']
+
+        # lookup for sp,fp and uSwitch
+        xsp = context['SP'] + 48
+        xfp = context['FP']
+
+        # convert string so we can strip out the address
+        try:
+            xpc = get_addr(gdb.parse_and_eval('__cfactx_switch').address + 28)
+        except:
+            print("here")
+            return
+
+        # must be at frame 0 to set pc register
+        gdb.execute('select-frame 0')
+
+        # push sp, fp, pc into a global stack
+        global STACK
+        sp = gdb.parse_and_eval('$sp')
+        fp = gdb.parse_and_eval('$fp')
+        pc = gdb.parse_and_eval('$pc')
+        stack_info = StackInfo(sp = sp, fp = fp, pc = pc)
+        STACK.append(stack_info)
+
+        # update registers for new task
+        print('switching to ')
+        gdb.execute('set $rsp={}'.format(xsp))
+        gdb.execute('set $rbp={}'.format(xfp))
+        gdb.execute('set $pc={}'.format(xpc))
+
+    def find_matching_gdb_thread_id():
+        """
+        Parse the str from info thread to get the number
+        """
+        info_thread_str = gdb.execute('info thread', to_string=True).splitlines()
+        for thread_str in info_thread_str:
+            if thread_str.find('this={}'.format(task)) != -1:
+                thread_id_pattern = r'^\*?\s+(\d+)\s+Thread'
+                # retrive gdb thread id
+                return re.match(thread_id_pattern, thread_str).group(1)
+
+            # check if the task is running or not
+            if task_state == gdb.parse_and_eval('uBaseTask::Running'):
+                # find the equivalent thread from info thread
+                gdb_thread_id = find_matching_gdb_thread_id()
+                if gdb_thread_id is None:
+                    print('cannot find the thread id to switch to')
+                    return
+                # switch to that thread based using thread command
+                gdb.execute('thread {}'.format(gdb_thread_id))
+
+    def switchto_id(self, tid, cluster):
+        """
+        @cluster: cluster object
+        @tid: int
+        """
+        threads = self.threads_by_cluster( cluster )
+
+        for t in threads:
+            if t.tid == tid:
+                self.switchto(t.value)
+                return
+
+        print("Cound not find thread by id '{}'".format(tid))
+
+    def invoke(self, arg, from_tty):
+        """
+        @arg: str
+        @from_tty: bool
+        """
+        if not is_cforall():
+            return
+
+        argv = parse(arg)
+        print(argv)
+        if len(argv) == 0:
+            """
+            Iterate only Main Thread, print only tasks and main
+            """
+            cluster = lookup_cluster()
+            if not cluster:
+                print("Could not find Main Cluster")
+                return
+
+            # only tasks and main
+            self.print_threads_by_cluster(cluster, False)
+
+        elif len(argv) == 1:
+            if argv[0] == 'help':
+                self.print_usage()
+            # push task
+            elif argv[0].isdigit():
+                cluster = lookup_cluster()
+                if not cluster:
+                    print("Could not find Main Cluster")
+                    return
+
+                try:
+                    tid = int(argv[0])
+                except:
+                    print("'{}' not a valid thread id".format(argv[0]))
+                    self.print_usage()
+                    return
+
+                 # by id, userCluster
+                self.switchto_id(tid, cluster)
+
+            elif argv[0].startswith('0x') or argv[0].startswith('0X'):
+                self.switchto(argv[0]) # by address, any cluster
+            # print tasks
+            elif argv[0] == 'all':
+                self.print_all_threads() # all tasks, all clusters
+            else:
+                """
+                Print out all the tasks available in the specified cluster
+                @cluster_name: str
+                """
+                print("cfathread by name")
+                cluster = lookup_cluster(argv[0])
+                if not cluster:
+                    return
+
+                # all tasks, specified cluster
+                self.print_threads_by_cluster(cluster, True)
+
+        elif len(argv) == 2:
+            # push task
+            self.pushtask_by_id(argv[0], argv[1]) # by id, specified cluster
+        else:
+            print('Invalid arguments')
+            self.print_usage()
+
+############
+class PrevThread(gdb.Command):
+    """Switch back to previous task on the stack"""
+    usage_msg = 'prevtask'
+
+    def __init__(self):
+        super(PrevThread, self).__init__('prevtask', gdb.COMMAND_USER)
+
+    def invoke(self, arg, from_tty):
+        """
+        @arg: str
+        @from_tty: bool
+        """
+        global STACK
+        if len(STACK) != 0:
+            # must be at frame 0 to set pc register
+            gdb.execute('select-frame 0')
+
+            # pop stack
+            stack_info = STACK.pop()
+            pc = get_addr(stack_info.pc)
+            sp = stack_info.sp
+            fp = stack_info.fp
+
+            # pop sp, fp, pc from global stack
+            adjust_stack(pc, fp, sp)
+
+            # must be at C++ frame to access C++ vars
+            gdb.execute('frame 1')
+        else:
+            print('empty stack')
+
+class ResetOriginFrame(gdb.Command):
+    """Reset to the origin frame prior to continue execution again"""
+    usage_msg = 'resetOriginFrame'
+    def __init__(self):
+        super(ResetOriginFrame, self).__init__('reset', gdb.COMMAND_USER)
+
+    def invoke(self, arg, from_tty):
+        """
+        @arg: str
+        @from_tty: bool
+        """
+        global STACK
+        if len(STACK) != 0:
+            stack_info = STACK.pop(0)
+            STACK.clear()
+            pc = get_addr(stack_info.pc)
+            sp = stack_info.sp
+            fp = stack_info.fp
+
+            # pop sp, fp, pc from global stack
+            adjust_stack(pc, fp, sp)
+
+            # must be at C++ frame to access C++ vars
+            gdb.execute('frame 1')
+        #else:
+            #print('reset: empty stack') #probably does not have to print msg
+
+Clusters()
+Processors()
+ResetOriginFrame()
+PrevThread()
+Threads()
+
+# Local Variables: #
+# mode: Python #
+# End: #
