private void generateMpIntAdd(JitCodeGenerator gen, MpIntJitType type, MethodVisitor mv) {
		/**
		 * The strategy is to allocate a temp local for each leg of the result. First, we'll pop the
		 * right operand into the temp. Then, as we work with each leg of the left operand, we'll
		 * execute the algorithm. Convert both right and left legs to a long and add them (along
		 * with a possible carry in). Store the result back into the temp locals. Shift the leg
		 * right 32 to get the carry out, then continue to the next leg up. The final carry out can
		 * be dropped (overflow). The result legs are then pushed back to the stack.
		 */
		// [lleg1,...,llegN,rleg1,rlegN] (N is least-significant leg)
		int legCount = type.legsAlloc();
		int firstIndex = gen.getAllocationModel().nextFreeLocal();
		Label start = new Label();
		Label end = new Label();
		mv.visitLabel(start);
		for (int i = 0; i < legCount; i++) {
			mv.visitLocalVariable("result" + i, Type.getDescriptor(int.class), null, start, end,
				firstIndex + i);
			mv.visitVarInsn(ISTORE, firstIndex + i);
			// NOTE: More significant legs have higher indices (reverse of stack)
		}
		// [lleg1,...,llegN:INT]
		for (int i = 0; i < legCount; i++) {
			boolean isLast = i == legCount - 1;
			boolean takesCarry = i != 0; // not first
			generateMpIntLegAdd(gen, firstIndex + i, takesCarry, !isLast, mv);
		}

		// Push it all back, in reverse order
		for (int i = 0; i < legCount; i++) {
			mv.visitVarInsn(ILOAD, firstIndex + legCount - i - 1);
		}
		mv.visitLabel(end);
	}
NB. The store will perform the masking
Ghidra/Framework/Emulation/src/main/java/ghidra/pcode/emu/jit/gen/op/IntAddOpGen.java