public void visit_dup2_x2(final Instruction inst) {
		// If the two four values are all category 1, then duplicate the
		// top two values and put them four down. If the top value is of
		// category 2 and the next two are of type 1, then dup the top
		// value and put it three down. If the top two values are both
		// category 1 and the third value is type 2, then dup the top two
		// values and put them three down. If the top two values are both
		// category 2, then dup the top one and put it two down.

		final Set top = atDepth(0);
		final int category = checkCategory(top);

		if (category == 1) {
			final Set top1 = atDepth(1);
			final int category1 = checkCategory(top1);
			if (category1 == 1) {
				final Set top2 = atDepth(2);
				final int category2 = checkCategory(top2);
				if (category2 == 1) {
					checkCategory(atDepth(3), 1);

					// Form 1: Dup top two values and put four down
					final int n = currStack.size() - 4;
					currStack.add(n, new HashSet(top1));
					currStack.add(n, new HashSet(top));

				} else {
					// Form 3: Dup top two values and put three down
					final int n = currStack.size() - 3;
					currStack.add(n, new HashSet(top1));
					currStack.add(n, new HashSet(top));

				}

			} else {
				Assert.isTrue(false, "Impossible stack combination for "
						+ "dup2_x1: ... 2 1");
			}

		} else {
			final Set top1 = atDepth(1);
			final int category1 = checkCategory(top1);
			if (category1 == 1) {
				final int category2 = checkCategory(atDepth(2));
				if (category2 == 1) {
					// Form 2: Dup top value and put three down
					currStack.add(currStack.size() - 3, new HashSet(top));

				} else {
					Assert.isTrue(false, "Impossible stack combination for "
							+ "dup2_x1: ... 2 1 2");
				}

			} else {
				// Form 4: Dup top and put two down
				currStack.add(currStack.size() - 2, new HashSet(top));
			}
		}
	}