@Override
		protected void processNonAnnotatedParameter(Type declClsOpType, Type opType, int i,
				Parameter p) {
			Type pType = p.getParameterizedType();
			if (TypeUtils.isAssignable(Varnode.class, pType)) {
				paramsIn.add(new VarnodeUseropInputParam(i));
			}
			else if (TypeUtils.isAssignable(declClsOpType, pType)) {
				paramsIn.add(new TValUseropInputParam(i));
			}
			else if (pType == byte.class) {
				paramsIn.add(new ByteUseropInputParam(i));
			}
			else if (pType == short.class) {
				paramsIn.add(new ShortUseropInputParam(i));
			}
			else if (pType == int.class) {
				paramsIn.add(new IntUseropInputParam(i));
			}
			else if (pType == long.class) {
				paramsIn.add(new LongUseropInputParam(i));
			}
			else if (pType == float.class) {
				paramsIn.add(new FloatUseropInputParam(i));
			}
			else if (pType == double.class) {
				paramsIn.add(new DoubleUseropInputParam(i));
			}
			else if (pType == boolean.class) {
				paramsIn.add(new BooleanUseropInputParam(i));
			}
			else {
				throw new IllegalArgumentException("""
						Input parameter %s of userop %s must be non-char primitive type, \
						%s, or accept %s. Was %s.
						""".formatted(
					p.getName(), method.getName(), Varnode.class.getSimpleName(), declClsOpType,
					pType));
			}
		}
An annotated userop with a fixed number of arguments

@param <T> the type of data processed by the userop
Ghidra/Framework/Emulation/src/main/java/ghidra/pcode/exec/AnnotatedPcodeUseropLibrary.java