@Override
	public int assignAddress(DataType dt, PrototypePieces proto, int pos, DataTypeManager dtManager,
			int[] status, ParameterPieces res) {
		int[] tmpStatus = status.clone();
		ArrayList<Varnode> pieces = new ArrayList<>();
		ParameterPieces param = new ParameterPieces();
		int sizeLeft = dt.getLength();
		int align = dt.getAlignment();
		int iter = 0;
		int resourcesConsumed = 0;
		while (iter != tiles.length) {
			if (checkFit(iter, sizeLeft, align, resourcesConsumed, tmpStatus)) {
				break;
			}
			ParamEntry entry = tiles[iter];
			if (!allowBackfill) {
				tmpStatus[entry.getGroup()] = -1;	// Consume unaligned register
			}
			resourcesConsumed += entry.getSize();
			++iter;
		}
		while (sizeLeft > 0 && iter != tiles.length) {
			ParamEntry entry = tiles[iter];
			++iter;
			if (tmpStatus[entry.getGroup()] != 0) {
				continue;
			}		// Already consumed
			int trialSize = entry.getSize();
			entry.getAddrBySlot(tmpStatus[entry.getGroup()], trialSize, align, param);
			tmpStatus[entry.getGroup()] = -1;	// Consume the register
			Varnode vn = new Varnode(param.address, trialSize);
			pieces.add(vn);
			sizeLeft -= trialSize;
			align = 1;		// Treat remaining partial pieces as having no alignment requirement
		}
		boolean onePieceJoin = false;
		if (sizeLeft > 0) {				// Have to use stack to get enough bytes
			if (!consumeFromStack) {
				return FAIL;
			}
			int grp = stackEntry.getGroup();
			tmpStatus[grp] = stackEntry.getAddrBySlot(tmpStatus[grp], sizeLeft, align, param);	// Consume all the space we need	
			if (param.address == null) {
				return FAIL;
			}
			Varnode vn = new Varnode(param.address, sizeLeft);
			pieces.add(vn);
		}
		else if (sizeLeft < 0) {			// Have odd data-type size
			if (resourceType == StorageClass.FLOAT && pieces.size() == 1) {
				// Floating-point register holding extended lower precision value
				onePieceJoin = true;		// Treat as "join" of full size register
			}
			else if (justifyRight) {
				// Initial bytes are padding
				Varnode vn = pieces.get(0);
				Address addr = vn.getAddress().add(-sizeLeft);
				int sz = vn.getSize() + sizeLeft;
				vn = new Varnode(addr, sz);
				pieces.set(0, vn);
			}
			else {
				int end = pieces.size() - 1;
				Varnode vn = pieces.get(end);
				int sz = vn.getSize() + sizeLeft;
				vn = new Varnode(vn.getAddress(), sz);
				pieces.set(end, vn);
			}
		}
		System.arraycopy(tmpStatus, 0, status, 0, tmpStatus.length);	// Commit resource usage for all the pieces
		res.type = dt;
		res.assignAddressFromPieces(pieces, consumeMostSig, onePieceJoin, resource.getLanguage());
		return SUCCESS;
	}
Test if a data-type of the given size will fit starting at a particular entry within
the resource list.  If necessary, check
   1)  If the type will be properly aligned
   2)  If there are enough remaining registers, up to the end of the resource list, to
       cover the data-type and that have not been consumed.
@param iter is the first resource entry to use for the data-type
@param sizeLeft initially holds the size of the data-type to cover in bytes
@param align is the alignment requirement for the data-type
@param resourcesConsumed is the number of bytes in resources already consumed/skipped
@param tmpStatus is the current consumption status for the resource list
@return true if the data-type will fit
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/protorules/MultiSlotAssign.java