docs: void passfg(final int nac[], final int ido, final int ip, final int l1, final int idl1, final float in[], final int in_off, final float out[], final int out_off, final int offset, final int isign) {
  		int idij, idlj, idot, ipph, l, jc, lc, idj, idl, inc, idp;
  		float w1r, w1i, w2i, w2r;
  		int iw1;
  
  		iw1 = offset;
  		idot = ido / 2;
  		ipph = (ip + 1) / 2;
  		idp = ip * ido;
  		if (ido >= l1) {
  			for (int j = 1; j < ipph; j++) {
  				jc = ip - j;
  				int idx1 = j * ido;
  				int idx2 = jc * ido;
  				for (int k = 0; k < l1; k++) {
  					int idx3 = k * ido;
  					int idx4 = idx3 + idx1 * l1;
  					int idx5 = idx3 + idx2 * l1;
  					int idx6 = idx3 * ip;
  					for (int i = 0; i < ido; i++) {
  						int oidx1 = out_off + i;
  						float i1r = in[in_off + i + idx1 + idx6];
  						float i2r = in[in_off + i + idx2 + idx6];
  						out[oidx1 + idx4] = i1r + i2r;
  						out[oidx1 + idx5] = i1r - i2r;
  					}
  				}
  			}
  			for (int k = 0; k < l1; k++) {
  				int idxt1 = k * ido;
  				int idxt2 = idxt1 * ip;
  				for (int i = 0; i < ido; i++) {
  					out[out_off + i + idxt1] = in[in_off + i + idxt2];
  				}
  			}
  		} else {
  			for (int j = 1; j < ipph; j++) {
  				jc = ip - j;
  				int idxt1 = j * l1 * ido;
  				int idxt2 = jc * l1 * ido;
  				int idxt3 = j * ido;
  				int idxt4 = jc * ido;
  				for (int i = 0; i < ido; i++) {
  					for (int k = 0; k < l1; k++) {
  						int idx1 = k * ido;
  						int idx2 = idx1 * ip;
  						int idx3 = out_off + i;
  						int idx4 = in_off + i;
  						float i1r = in[idx4 + idxt3 + idx2];
  						float i2r = in[idx4 + idxt4 + idx2];
  						out[idx3 + idx1 + idxt1] = i1r + i2r;
  						out[idx3 + idx1 + idxt2] = i1r - i2r;
  					}
  				}
  			}
  			for (int i = 0; i < ido; i++) {
  				for (int k = 0; k < l1; k++) {
  					int idx1 = k * ido;
  					out[out_off + i + idx1] = in[in_off + i + idx1 * ip];
  				}
  			}
  		}
  
  		idl = 2 - ido;
  		inc = 0;
  		int idxt0 = (ip - 1) * idl1;
  		for (l = 1; l < ipph; l++) {
  			lc = ip - l;
  			idl += ido;
  			int idxt1 = l * idl1;
  			int idxt2 = lc * idl1;
  			int idxt3 = idl + iw1;
  			w1r = wtable[idxt3 - 2];
  			w1i = isign * wtable[idxt3 - 1];
  			for (int ik = 0; ik < idl1; ik++) {
  				int idx1 = in_off + ik;
  				int idx2 = out_off + ik;
  				in[idx1 + idxt1] = out[idx2] + w1r * out[idx2 + idl1];
  				in[idx1 + idxt2] = w1i * out[idx2 + idxt0];
  			}
  			idlj = idl;
  			inc += ido;
  			for (int j = 2; j < ipph; j++) {
  				jc = ip - j;
  				idlj += inc;
  				if (idlj > idp)
  					idlj -= idp;
  				int idxt4 = idlj + iw1;
  				w2r = wtable[idxt4 - 2];
  				w2i = isign * wtable[idxt4 - 1];
  				int idxt5 = j * idl1;
  				int idxt6 = jc * idl1;
  				for (int ik = 0; ik < idl1; ik++) {
  					int idx1 = in_off + ik;
  					int idx2 = out_off + ik;
  					in[idx1 + idxt1] += w2r * out[idx2 + idxt5];
  					in[idx1 + idxt2] += w2i * out[idx2 + idxt6];
  				}
  			}
  		}
  		for (int j = 1; j < ipph; j++) {
  			int idxt1 = j * idl1;
  			for (int ik = 0; ik < idl1; ik++) {
  				int idx1 = out_off + ik;
  				out[idx1] += out[idx1 + idxt1];
  			}
  		}
  		for (int j = 1; j < ipph; j++) {
  			jc = ip - j;
  			int idx1 = j * idl1;
  			int idx2 = jc * idl1;
  			for (int ik = 1; ik < idl1; ik += 2) {
  				int idx3 = out_off + ik;
  				int idx4 = in_off + ik;
  				int iidx1 = idx4 + idx1;
  				int iidx2 = idx4 + idx2;
  				float i1i = in[iidx1 - 1];
  				float i1r = in[iidx1];
  				float i2i = in[iidx2 - 1];
  				float i2r = in[iidx2];
  
  				int oidx1 = idx3 + idx1;
  				int oidx2 = idx3 + idx2;
  				out[oidx1 - 1] = i1i - i2r;
  				out[oidx2 - 1] = i1i + i2r;
  				out[oidx1] = i1r + i2i;
  				out[oidx2] = i1r - i2i;
  			}
  		}
  		nac[0] = 1;
  		if (ido == 2)
  			return;
  		nac[0] = 0;
  		System.arraycopy(out, out_off, in, in_off, idl1);
  		int idx0 = l1 * ido;
  		for (int j = 1; j < ip; j++) {
  			int idx1 = j * idx0;
  			for (int k = 0; k < l1; k++) {
  				int idx2 = k * ido;
  				int oidx1 = out_off + idx2 + idx1;
  				int iidx1 = in_off + idx2 + idx1;
  				in[iidx1] = out[oidx1];
  				in[iidx1 + 1] = out[oidx1 + 1];
  			}
  		}
  		if (idot <= l1) {
  			idij = 0;
  			for (int j = 1; j < ip; j++) {
  				idij += 2;
  				int idx1 = j * l1 * ido;
  				for (int i = 3; i < ido; i += 2) {
  					idij += 2;
  					int idx2 = idij + iw1 - 1;
  					w1r = wtable[idx2 - 1];
  					w1i = isign * wtable[idx2];
  					int idx3 = in_off + i;
  					int idx4 = out_off + i;
  					for (int k = 0; k < l1; k++) {
  						int idx5 = k * ido + idx1;
  						int iidx1 = idx3 + idx5;
  						int oidx1 = idx4 + idx5;
  						float o1i = out[oidx1 - 1];
  						float o1r = out[oidx1];
  						in[iidx1 - 1] = w1r * o1i - w1i * o1r;
  						in[iidx1] = w1r * o1r + w1i * o1i;
  					}
  				}
  			}
  		} else {
  			idj = 2 - ido;
  			for (int j = 1; j < ip; j++) {
  				idj += ido;
  				int idx1 = j * l1 * ido;
  				for (int k = 0; k < l1; k++) {
  					idij = idj;
  					int idx3 = k * ido + idx1;
  					for (int i = 3; i < ido; i += 2) {
  						idij += 2;
  						int idx2 = idij - 1 + iw1;
  						w1r = wtable[idx2 - 1];
  						w1i = isign * wtable[idx2];
  						int iidx1 = in_off + i + idx3;
  						int oidx1 = out_off + i + idx3;
  						float o1i = out[oidx1 - 1];
  						float o1r = out[oidx1];
  						in[iidx1 - 1] = w1r * o1i - w1i * o1r;
  						in[iidx1] = w1r * o1r + w1i * o1i;
  					}
  				}
  			}
  		}
  	}