public void visit_swap(final Instruction inst) {
		// 0 1 -> 1 0

		if (Tree.USE_STACK) {
			saveStack();

			final StackExpr s1 = (StackExpr) stack.pop1();
			final StackExpr s0 = (StackExpr) stack.pop1();

			final StackExpr[] s = new StackExpr[] { s0, s1 };
			manip(s, new int[] { 1, 0 }, StackManipStmt.SWAP);
		} else {
			final Expr s1 = stack.pop1();
			final Expr s0 = stack.pop1();

			final LocalExpr t0 = newStackLocal(stack.height(), s0.type());
			final LocalExpr t1 = newStackLocal(stack.height() + 1, s1.type());

			if (!t0.equalsExpr(s0)) {
				addStore(t0, s0);
			}

			if (!t1.equalsExpr(s1)) {
				addStore(t1, s1);
			}

			Expr copy = (Expr) t1.clone();
			copy.setDef(null);
			stack.push(copy);

			copy = (Expr) t0.clone();
			copy.setDef(null);
			stack.push(copy);
		}
	}