-
Type:
Bug
-
Resolution: Won't Fix
-
Priority:
P4
-
None
-
Affects Version/s: 1.2.0
-
Component/s: vm-legacy
-
x86
-
windows_98
Name: krT82822 Date: 03/06/99
Place the included source in a file called "foo.java"
Place the "foo.java" file in a directory called "bug"
javac bug\foo.java
java -classpath . bug.foo
The error message is :
A nonfatal internal JIT (3.00.078(x)) error 'GetRegisterA' has occurred in :
'bug/foo.interleave_complex_fft ([FF)V': Interpreting method.
Please report this error in detail to http://java.sun.com/cgi-bin/bugreport.cgi
Note : This works without error for jdk 1.0, jdk 1.1, and Microsoft's jview JIT.
Here's the source for "foo.java" :
package bug;
public final class foo extends Object
{
private static final float FORWARD_FFT = -1.0f;
private static final float INVERSE_FFT = 1.0f;
private static final int FFT_MAX_LOGSIZE = 20;
private static final float[] CosArray = new float[FFT_MAX_LOGSIZE];
private static final float[] SinArray = new float[FFT_MAX_LOGSIZE];
static
{
for(int i = 0; i<FFT_MAX_LOGSIZE ; i++)
{
CosArray[i] = (float) Math.cos(Math.PI / Math.pow(2.0,i));
SinArray[i] = (float) Math.sin(Math.PI / Math.pow(2.0,i));
}
}
/**
* Takes one array containing real and imaginary values that
* are interleaved and performs a forward in-place complex fft (fft length = array length / 2)
* @param interleaved_array floating point array containing real and imaginary parts (fft length is interleaved array length / 2)
*/
public static void interleave_complex(float[] interleaved_array)
{
interleave_complex_fft(interleaved_array,FORWARD_FFT);
}
// Performs an in-place forward or inverse complex fft. Real and
// imaginary values are stored in one interleaved array
// Adapted from Oppenheim & Shafer
private static void interleave_complex_fft(float[] realx,float forrevval)
{
int n = realx.length >> 1;
int logsize = (int) (Math.log(n) / Math.log(2) + .5);
int le = n;
int i,j,ip;
int l,le1,k,nv2,nm1;
float realu,imagu,realw,imagw,realtemp,imagtemp,a,b;
for( l = 1; l <= logsize; l++)
{
le1 = le >> 1;
realu = 1.0f;
imagu = 0.0f;
realw = CosArray[logsize-1];
imagw = forrevval*SinArray[logsize - l];
for( j = 1;j<=le1; j++)
{
for( i=j; i<= n; i = i+ le)
{
ip = i + le1 - 1;
int index_real = 2*(i-1);
int index_imag = index_real+1;
int ip_real = 2*ip;
int ip_imag = ip_real + 1;
realtemp = realx[index_real] + realx[ip_real];
a = realx[index_real] - realx[ip_real];
realx[index_real] = realtemp;
imagtemp = realx[index_imag] + realx[ip_imag];
b = realx[index_imag] - realx[ip_imag];
realx[index_imag] = imagtemp;
realx[ip_real] = ((a*realu) - (b*imagu));
realx[ip_imag] = ((a*imagu) + (b*realu));
}
realtemp = (realu*realw) - (imagu*imagw);
imagu = (imagu*realw)+(realu*imagw);
realu = realtemp;
}
le =le >> 1;
}
nv2 = n >> 1;
nm1 = n - 1;
j = 1;
for (i=1;i<=nm1;i++)
{
if(i < j)
{
int j_real = (j-1)*2;
int j_imag = j_real +1;
int i_real = (i-1)*2;
int i_imag = i_real+1;
realtemp = realx[j_real];
imagtemp = realx[j_imag];
realx[j_real] = realx[i_real];
realx[j_imag] = realx[i_imag];
realx[i_real] = realtemp;
realx[i_imag] = imagtemp;
}
k = nv2;
while(k<j)
{
j = j-k;
k= k >> 1;
}
j = j + k;
}
}
public static void main(String args[])
{
foo.interleave_complex(new float[4]);
}
}
(Review ID: 52800)
======================================================================