@Override
	public void generateRunCode(JitCodeGenerator gen, JitSubPieceOp op, JitBlock block,
			MethodVisitor rv) {
		JitType vType = gen.generateValReadCode(op.u(), op.uType());
		JitType outType;
		switch (vType) {
			case IntJitType vIType -> {
				rv.visitLdcInsn(op.offset() * Byte.SIZE);
				rv.visitInsn(IUSHR);
				outType = vIType;
			}
			case LongJitType vLType -> {
				rv.visitLdcInsn(op.offset() * Byte.SIZE);
				rv.visitInsn(LUSHR);
				outType = vLType;
			}
			case MpIntJitType vMpType -> {
				// WIP
				MpIntJitType outMpType = MpIntJitType.forSize(op.out().size());
				int outLegCount = outMpType.legsAlloc();
				int legsLeft = vMpType.legsAlloc();
				int popCount = op.offset() / Integer.BYTES;
				int byteShift = op.offset() % Integer.BYTES;
				for (int i = 0; i < popCount; i++) {
					rv.visitInsn(POP);
				}
				int firstIndex = gen.getAllocationModel().nextFreeLocal();
				Label start = new Label();
				Label end = new Label();
				rv.visitLabel(start);
				for (int i = 0; i < outLegCount; i++) {
					rv.visitLocalVariable("subpiece" + i, Type.getDescriptor(int.class), null,
						start, end, firstIndex + i);
					rv.visitVarInsn(ISTORE, firstIndex + i);
					// NOTE: More significant legs have higher indices (reverse of stack)
					legsLeft--;
				}

				if (byteShift > 0) {
					int curLeg = outLegCount - 1;
					if (legsLeft > 0) {
						// [...,prevLegIn]
						generateShiftWithPrevLeg(rv, byteShift * Byte.SIZE, firstIndex + curLeg);
						// [...,legIn]
						legsLeft--;
						curLeg--;
					}
					else {
						// [...]
						rv.visitVarInsn(ILOAD, firstIndex + curLeg);
						// [...,legIn]
						rv.visitInsn(DUP);
						// [...,legIn,legIn]
						rv.visitLdcInsn(byteShift * Byte.SIZE);
						rv.visitInsn(IUSHR);
						// [...,legIn,legOut]
						rv.visitVarInsn(ISTORE, firstIndex + curLeg);
						// [...,legIn]
						curLeg--;
					}
					while (curLeg >= 0) {
						generateShiftWithPrevLeg(rv, byteShift * Byte.SIZE, firstIndex + curLeg);
						legsLeft--;
						curLeg--;
					}
				}
				while (legsLeft > 0) {
					rv.visitInsn(POP);
					legsLeft--;
				}
				// NOTE: More significant legs have higher indices
				for (int i = outLegCount - 1; i >= 0; i--) {
					rv.visitVarInsn(ILOAD, firstIndex + i);
				}
				rv.visitLabel(end);
				outType = outMpType;
			}
			default -> throw new AssertionError();
		}
		gen.generateVarWriteCode(op.out(), outType);
	}
<b>WIP</b>: Assumes the previous (next more significant) leg is on the stack and the current
(unshifted) leg is in the given variable. Computes the resulting output leg and puts in into
the given local variable, but leaves a copy of the current unshifted leg on the stack.

@param rv the method visitor
@param bitShift the number of <em>bits</em> to shift
@param index the index of the local variable for the current leg
Ghidra/Framework/Emulation/src/main/java/ghidra/pcode/emu/jit/gen/op/SubPieceOpGen.java