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

		if (Tree.USE_STACK) {
			saveStack();

			final Expr[] s12 = stack.pop2();
			final StackExpr s0 = (StackExpr) stack.pop1();

			if (s12.length == 2) {
				// 0 1 2 -> 1 2 0 1 2
				final StackExpr[] s = new StackExpr[] { s0, (StackExpr) s12[0],
						(StackExpr) s12[1] };
				manip(s, new int[] { 1, 2, 0, 1, 2 }, StackManipStmt.DUP2_X1);
			} else {
				// 0 1-2 -> 1-2 0 1-2
				final StackExpr[] s = new StackExpr[] { s0, (StackExpr) s12[0] };
				manip(s, new int[] { 1, 0, 1 }, StackManipStmt.DUP2_X1);
			}
		} else {
			final Expr[] s12 = stack.pop2();
			final StackExpr s0 = (StackExpr) stack.pop1();

			if (s12.length == 2) {
				// 0 1 2 -> 1 2 0 1 2
				final LocalExpr t0 = newStackLocal(stack.height(), s0.type());
				final LocalExpr t1 = newStackLocal(stack.height() + 1, s12[0]
						.type());
				final LocalExpr t2 = newStackLocal(stack.height() + 2, s12[1]
						.type());

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

				if (!t1.equalsExpr(s12[0])) {
					addStore(t1, s12[0]);
				}

				if (!t2.equalsExpr(s12[1])) {
					addStore(t2, s12[1]);
				}

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

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

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

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

				copy = (Expr) t2.clone();
				copy.setDef(null);
				stack.push(copy);
			} else {
				// 0 1-2 -> 1-2 0 1-2
				final LocalExpr t0 = newStackLocal(stack.height(), s0.type());
				final LocalExpr t1 = newStackLocal(stack.height() + 1, s12[0]
						.type());

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

				if (!t1.equalsExpr(s12[0])) {
					addStore(t1, s12[0]);
				}

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

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

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