public ImmIndReg(ImmIndRegOp operation, long leftOperandImm,
				Register leftOperandReg, Register rightOperand) {
			switch(rightOperand.width()) {
			case Byte:
				if(leftOperandImm < Byte.MIN_VALUE || leftOperandImm > Byte.MAX_VALUE) {
					throw new IllegalArgumentException("immediate operand does not fit into byte");
				}
				break;
			case Word:
				if(leftOperandImm < Short.MIN_VALUE || leftOperandImm > Short.MAX_VALUE) {
					throw new IllegalArgumentException("immediate operand does not fit into word");
				}
				break;
			case Long:
				if(leftOperandImm < Integer.MIN_VALUE || leftOperandImm > Integer.MAX_VALUE) {
					throw new IllegalArgumentException("immediate operand does not fit into double word");
				}
				break;
			default:
				// this case is always true by construction
			}
			this.operation = operation;
			this.baseOperand = leftOperandReg;
			this.immediateOffset = leftOperandImm;
			this.targetOperand = rightOperand;
		}