Index: src/SynTree/Constant.cc
===================================================================
--- src/SynTree/Constant.cc	(revision 1db21619127c2047acc4bad02dd9a5234cf88d00)
+++ src/SynTree/Constant.cc	(revision 7f5566b3fe2cd28774da6eb330d767776dd50ea4)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Jun 10 14:41:03 2015
-// Update Count     : 8
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Jul 30 15:18:38 2015
+// Update Count     : 12
 //
 
@@ -22,7 +22,12 @@
 Constant::Constant( Type *type_, std::string value_ ) : type( type_ ), value( value_ ) {}
 
-Constant::~Constant() {}
+Constant::Constant( const Constant &other ) {
+	type = other.type->clone();
+	value = other.value;
+}
 
-Constant *Constant::clone() const { return 0; }
+Constant::~Constant() { delete type; }
+
+Constant *Constant::clone() const { assert( false ); return 0; }
 
 void Constant::print( std::ostream &os ) const {
Index: src/SynTree/Constant.h
===================================================================
--- src/SynTree/Constant.h	(revision 1db21619127c2047acc4bad02dd9a5234cf88d00)
+++ src/SynTree/Constant.h	(revision 7f5566b3fe2cd28774da6eb330d767776dd50ea4)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon May 18 08:46:37 2015
-// Update Count     : 2
+// Last Modified On : Thu Jul 30 15:19:16 2015
+// Update Count     : 5
 //
 
@@ -24,4 +24,5 @@
   public:
 	Constant( Type *type, std::string value );
+	Constant( const Constant &other );
 	virtual ~Constant();
 
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 1db21619127c2047acc4bad02dd9a5234cf88d00)
+++ src/SynTree/Expression.cc	(revision 7f5566b3fe2cd28774da6eb330d767776dd50ea4)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Jun  7 08:40:46 2015
-// Update Count     : 16
+// Last Modified On : Tue Jul 28 16:27:17 2015
+// Update Count     : 22
 //
 
@@ -38,5 +38,5 @@
 Expression::~Expression() {
 	delete env;
-	// delete argName;	// xxx -- there's a problem in cloning ConstantExpr I still don't know how to fix
+	delete argName;	// xxx -- there's a problem in cloning ConstantExpr I still don't know how to fix
 	deleteAll( results );
 }
@@ -332,4 +332,11 @@
 }
 
+void AsmExpr::print( std::ostream &os, int indent ) const {
+	os << "Asm Expression: " << std::endl;
+	if ( inout ) inout->print( os, indent + 2 );
+	if ( constraint ) constraint->print( os, indent + 2 );
+	if ( operand ) operand->print( os, indent + 2 );
+}
+
 void UntypedValofExpr::print( std::ostream &os, int indent ) const {
 	os << std::string( indent, ' ' ) << "Valof Expression: " << std::endl;
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 1db21619127c2047acc4bad02dd9a5234cf88d00)
+++ src/SynTree/Expression.h	(revision 7f5566b3fe2cd28774da6eb330d767776dd50ea4)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Jun  7 22:03:44 2015
-// Update Count     : 4
+// Last Modified On : Fri Jul 24 13:49:28 2015
+// Update Count     : 18
 //
 
@@ -30,5 +30,5 @@
 
 	std::list<Type *>& get_results() { return results; }
-	void add_result(Type *t);
+	void add_result( Type *t );
 
 	TypeSubstitution *get_env() const { return env; }
@@ -446,4 +446,30 @@
 };
 
+// AsmExpr represents a GCC 'asm constraint operand' used in an asm statement: [output] "=f" (result)
+class AsmExpr : public Expression {
+  public:
+	AsmExpr( Expression *inout, ConstantExpr *constraint, Expression *operand ) : inout( inout ), constraint( constraint ), operand( operand ) {}
+	virtual ~AsmExpr() { delete inout; delete constraint; delete operand; };
+
+	Expression *get_inout() const { return inout; }
+	void set_inout( Expression *newValue ) { inout = newValue; }
+
+	ConstantExpr *get_constraint() const { return constraint; }
+	void set_constraint( ConstantExpr *newValue ) { constraint = newValue; }
+
+	Expression *get_operand() const { return operand; }
+	void set_operand( Expression *newValue ) { operand = newValue; }
+
+	virtual AsmExpr *clone() const { return new AsmExpr( *this ); }
+	virtual void accept( Visitor &v ) { v.visit( this ); }
+	virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
+	virtual void print( std::ostream &os, int indent = 0 ) const;
+  private:
+	// https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Machine-Constraints.html#Machine-Constraints
+	Expression *inout;
+	ConstantExpr *constraint;
+	Expression *operand;
+};
+
 // ValofExpr represents a GCC 'lambda expression'
 class UntypedValofExpr : public Expression {
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision 1db21619127c2047acc4bad02dd9a5234cf88d00)
+++ src/SynTree/Mutator.cc	(revision 7f5566b3fe2cd28774da6eb330d767776dd50ea4)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 16 16:10:54 2015
-// Update Count     : 3
+// Last Modified On : Sat Jul 25 19:21:33 2015
+// Update Count     : 11
 //
 
@@ -95,4 +95,12 @@
 }
 
+Statement *Mutator::mutate( AsmStmt *asmStmt ) {
+	asmStmt->set_instruction( maybeMutate( asmStmt->get_instruction(), *this ) );
+	mutateAll( asmStmt->get_output(), *this );
+	mutateAll( asmStmt->get_input(), *this );
+	mutateAll( asmStmt->get_clobber(), *this );
+	return asmStmt;
+}
+
 Statement *Mutator::mutate( IfStmt *ifStmt ) {
 	ifStmt->set_condition( maybeMutate( ifStmt->get_condition(), *this ) );
@@ -291,4 +299,11 @@
 	typeExpr->set_type( maybeMutate( typeExpr->get_type(), *this ) );
 	return typeExpr;
+}
+
+Expression *Mutator::mutate( AsmExpr *asmExpr ) {
+	asmExpr->set_inout( maybeMutate( asmExpr->get_inout(), *this ) );
+	asmExpr->set_constraint( maybeMutate( asmExpr->get_constraint(), *this ) );
+	asmExpr->set_operand( maybeMutate( asmExpr->get_operand(), *this ) );
+	return asmExpr;
 }
 
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision 1db21619127c2047acc4bad02dd9a5234cf88d00)
+++ src/SynTree/Mutator.h	(revision 7f5566b3fe2cd28774da6eb330d767776dd50ea4)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jul 13 18:14:47 2015
-// Update Count     : 5
+// Last Modified On : Thu Jul 23 23:24:18 2015
+// Update Count     : 7
 //
 #include <cassert>
@@ -37,4 +37,5 @@
 	virtual CompoundStmt* mutate( CompoundStmt *compoundStmt );
 	virtual Statement* mutate( ExprStmt *exprStmt );
+	virtual Statement* mutate( AsmStmt *asmStmt );
 	virtual Statement* mutate( IfStmt *ifStmt );
 	virtual Statement* mutate( WhileStmt *whileStmt );
@@ -70,4 +71,5 @@
 	virtual Expression* mutate( SolvedTupleExpr *tupleExpr );
 	virtual Expression* mutate( TypeExpr *typeExpr );
+	virtual Expression* mutate( AsmExpr *asmExpr );
 	virtual Expression* mutate( UntypedValofExpr *valofExpr );
 
Index: src/SynTree/Statement.cc
===================================================================
--- src/SynTree/Statement.cc	(revision 1db21619127c2047acc4bad02dd9a5234cf88d00)
+++ src/SynTree/Statement.cc	(revision 7f5566b3fe2cd28774da6eb330d767776dd50ea4)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Jul 15 14:57:40 2015
-// Update Count     : 27
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sat Jul 25 12:19:50 2015
+// Update Count     : 53
 //
 
@@ -42,4 +42,33 @@
 	expr->print( os, indent + 2 );
 } 
+
+
+AsmStmt::AsmStmt( std::list<Label> labels, bool voltile, ConstantExpr *instruction, std::list<Expression *> output, std::list<Expression *> input, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels ) : Statement( labels ), voltile( voltile ), instruction( instruction ), output( output ), input( input ), clobber( clobber ), gotolabels( gotolabels ) {}
+
+AsmStmt::~AsmStmt() {
+	delete instruction;
+	deleteAll( output );
+	deleteAll( input );
+	deleteAll( clobber );
+}
+
+void AsmStmt::print( std::ostream &os, int indent ) const {
+	os << "Assembler Statement:" << endl;
+	os << std::string( indent, ' ' ) << "instruction: " << endl << std::string( indent, ' ' );
+	instruction->print( os, indent + 2 );
+	if ( ! output.empty() ) {
+		os << endl << std::string( indent, ' ' ) << "output: " << endl;
+		printAll( output, os, indent + 2 );
+	} // if 
+	if ( ! input.empty() ) {
+		os << std::string( indent, ' ' ) << "input: " << endl << std::string( indent, ' ' );
+		printAll( input, os, indent + 2 );
+	} // if
+	if ( ! clobber.empty() ) {
+		os << std::string( indent, ' ' ) << "clobber: " << endl;
+		printAll( clobber, os, indent + 2 );
+	} // if
+} 
+
 
 const char *BranchStmt::brType[] = { "Goto", "Break", "Continue" };
Index: src/SynTree/Statement.h
===================================================================
--- src/SynTree/Statement.h	(revision 1db21619127c2047acc4bad02dd9a5234cf88d00)
+++ src/SynTree/Statement.h	(revision 7f5566b3fe2cd28774da6eb330d767776dd50ea4)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Tue Jul 14 12:14:54 2015
-// Update Count     : 24
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sat Jul 25 18:25:37 2015
+// Update Count     : 44
 //
 
@@ -70,4 +70,34 @@
 };
 
+class AsmStmt : public Statement {
+  public:
+	AsmStmt( std::list<Label> labels, bool voltile, ConstantExpr *instruction, std::list<Expression *> input, std::list<Expression *> output, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels );
+	virtual ~AsmStmt();
+
+	bool get_voltile() { return voltile; }
+	void set_voltile( bool newValue ) { voltile = newValue; }
+	ConstantExpr *get_instruction() { return instruction; }
+	void set_instruction( ConstantExpr *newValue ) { instruction = newValue; }
+	std::list<Expression *> &get_output() { return output; }
+	void set_output( const std::list<Expression *> &newValue ) { output = newValue; }
+	std::list<Expression *> &get_input() { return input; }
+	void set_input( const std::list<Expression *> &newValue ) { input = newValue; }
+	std::list<ConstantExpr *> &get_clobber() { return clobber; }
+	void set_clobber( const std::list<ConstantExpr *> &newValue ) { clobber = newValue; }
+	std::list<Label> &get_gotolabels() { return gotolabels; }
+	void set_gotolabels( const std::list<Label> &newValue ) { gotolabels = newValue; }
+
+	virtual AsmStmt *clone() const { return new AsmStmt( *this ); }
+	virtual void accept( Visitor &v ) { v.visit( this ); }
+	virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
+	virtual void print( std::ostream &os, int indent = 0 ) const;
+  private:
+	bool voltile;
+	ConstantExpr *instruction;
+	std::list<Expression *> output, input;
+	std::list<ConstantExpr *> clobber;
+	std::list<Label> gotolabels;
+};
+
 class IfStmt : public Statement {
   public:
@@ -100,5 +130,5 @@
 	void set_condition( Expression *newValue ) { condition = newValue; }
 
-	std::list<Statement *>& get_branches() { return branches; }
+	std::list<Statement *> & get_branches() { return branches; }
 	void add_case( CaseStmt * );
 
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision 1db21619127c2047acc4bad02dd9a5234cf88d00)
+++ src/SynTree/SynTree.h	(revision 7f5566b3fe2cd28774da6eb330d767776dd50ea4)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon May 18 10:58:22 2015
-// Update Count     : 1
+// Last Modified On : Thu Jul 23 23:25:04 2015
+// Update Count     : 3
 //
 
@@ -40,4 +40,5 @@
 class CompoundStmt;
 class ExprStmt;
+class AsmStmt;
 class IfStmt;
 class WhileStmt;
@@ -75,4 +76,5 @@
 class SolvedTupleExpr;
 class TypeExpr;
+class AsmExpr;
 class UntypedValofExpr;
 
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision 1db21619127c2047acc4bad02dd9a5234cf88d00)
+++ src/SynTree/Visitor.cc	(revision 7f5566b3fe2cd28774da6eb330d767776dd50ea4)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Rob Schluntz
-// Last Modified On : Tue Jul 14 12:31:03 2015
-// Update Count     : 3
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri Jul 24 16:11:05 2015
+// Update Count     : 15
 //
 
@@ -82,4 +82,11 @@
 }
 
+void Visitor::visit( AsmStmt *asmStmt ) {
+	maybeAccept( asmStmt->get_instruction(), *this );
+	acceptAll( asmStmt->get_output(), *this );
+	acceptAll( asmStmt->get_input(), *this );
+	acceptAll( asmStmt->get_clobber(), *this );
+}
+
 void Visitor::visit( IfStmt *ifStmt ) {
 	maybeAccept( ifStmt->get_condition(), *this );
@@ -246,4 +253,10 @@
 }
 
+void Visitor::visit( AsmExpr *asmExpr ) {
+	maybeAccept( asmExpr->get_inout(), *this );
+	maybeAccept( asmExpr->get_constraint(), *this );
+	maybeAccept( asmExpr->get_operand(), *this );
+}
+
 void Visitor::visit( UntypedValofExpr *valofExpr ) {
 	acceptAll( valofExpr->get_results(), *this );
@@ -282,22 +295,22 @@
 
 void Visitor::visit( StructInstType *aggregateUseType ) {
-	visit( static_cast< ReferenceToType* >( aggregateUseType ) );
+	visit( static_cast< ReferenceToType * >( aggregateUseType ) );
 }
 
 void Visitor::visit( UnionInstType *aggregateUseType ) {
-	visit( static_cast< ReferenceToType* >( aggregateUseType ) );
+	visit( static_cast< ReferenceToType * >( aggregateUseType ) );
 }
 
 void Visitor::visit( EnumInstType *aggregateUseType ) {
-	visit( static_cast< ReferenceToType* >( aggregateUseType ) );
+	visit( static_cast< ReferenceToType * >( aggregateUseType ) );
 }
 
 void Visitor::visit( ContextInstType *aggregateUseType ) {
-	visit( static_cast< ReferenceToType* >( aggregateUseType ) );
+	visit( static_cast< ReferenceToType * >( aggregateUseType ) );
 	acceptAll( aggregateUseType->get_members(), *this );
 }
 
 void Visitor::visit( TypeInstType *aggregateUseType ) {
-	visit( static_cast< ReferenceToType* >( aggregateUseType ) );
+	visit( static_cast< ReferenceToType * >( aggregateUseType ) );
 }
 
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 1db21619127c2047acc4bad02dd9a5234cf88d00)
+++ src/SynTree/Visitor.h	(revision 7f5566b3fe2cd28774da6eb330d767776dd50ea4)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon May 18 11:15:55 2015
-// Update Count     : 2
+// Last Modified On : Thu Jul 23 23:22:23 2015
+// Update Count     : 4
 //
 
@@ -37,4 +37,5 @@
 	virtual void visit( CompoundStmt *compoundStmt );
 	virtual void visit( ExprStmt *exprStmt );
+	virtual void visit( AsmStmt *asmStmt );
 	virtual void visit( IfStmt *ifStmt );
 	virtual void visit( WhileStmt *whileStmt );
@@ -70,4 +71,5 @@
 	virtual void visit( SolvedTupleExpr *tupleExpr );
 	virtual void visit( TypeExpr *typeExpr );
+	virtual void visit( AsmExpr *asmExpr );
 	virtual void visit( UntypedValofExpr *valofExpr );
 
