1
/* Automatically generated from Squeak on #(19 March 2005 10:08:54 am) */
9
/* Default EXPORT macro that does nothing (see comment in sq.h): */
10
#define EXPORT(returnType) returnType
12
/* Do not include the entire sq.h file but just those parts needed. */
13
/* The virtual machine proxy definition */
14
#include "sqVirtualMachine.h"
15
/* Configuration options */
17
/* Platform specific definitions */
18
#include "sqPlatformSpecific.h"
22
#define null 0 /* using 'null' because nil is predefined in Think C */
23
#ifdef SQUEAK_BUILTIN_PLUGIN
25
// was #undef EXPORT(returnType) but screws NorCroft cc
26
#define EXPORT(returnType) static returnType
29
/* memory access macros */
30
#define byteAt(i) (*((unsigned char *) (i)))
31
#define byteAtput(i, val) (*((unsigned char *) (i)) = val)
32
#define longAt(i) (*((int *) (i)))
33
#define longAtput(i, val) (*((int *) (i)) = val)
38
/*** Function Prototypes ***/
39
static float * checkedFloatPtrOf(int oop);
40
static unsigned int * checkedWordPtrOf(int oop);
42
EXPORT(const char*) getModuleName(void);
44
static int halt(void);
45
static int loadFFTFrom(int fftOop);
46
static int msg(char *s);
47
static int permuteData(void);
49
EXPORT(int) primitiveFFTPermuteData(void);
50
EXPORT(int) primitiveFFTScaleData(void);
51
EXPORT(int) primitiveFFTTransformData(void);
53
static int scaleData(void);
55
EXPORT(int) setInterpreter(struct VirtualMachine* anInterpreter);
57
static int transformData(int forward);
58
static int transformForward(int forward);
61
static float* imagData;
62
static int imagDataSize;
64
#ifdef SQUEAK_BUILTIN_PLUGIN
67
struct VirtualMachine* interpreterProxy;
68
static const char *moduleName =
69
#ifdef SQUEAK_BUILTIN_PLUGIN
70
"FFTPlugin 19 March 2005 (i)"
72
"FFTPlugin 19 March 2005 (e)"
76
static unsigned int* permTable;
77
static int permTableSize;
78
static float* realData;
79
static int realDataSize;
80
static float* sinTable;
81
static int sinTableSize;
85
/* Return the first indexable word of oop which is assumed to be variableWordSubclass */
87
static float * checkedFloatPtrOf(int oop) {
88
interpreterProxy->success(interpreterProxy->isWords(oop));
89
if (interpreterProxy->failed()) {
92
return ((float *) (interpreterProxy->firstIndexableField(oop)));
96
/* Return the first indexable word of oop which is assumed to be variableWordSubclass */
98
static unsigned int * checkedWordPtrOf(int oop) {
99
interpreterProxy->success(interpreterProxy->isWords(oop));
100
return ((unsigned int *) (interpreterProxy->firstIndexableField(oop)));
104
/* Note: This is hardcoded so it can be run from Squeak.
105
The module name is used for validating a module *after*
106
it is loaded to check if it does really contain the module
107
we're thinking it contains. This is important! */
109
EXPORT(const char*) getModuleName(void) {
113
static int halt(void) {
117
static int loadFFTFrom(int fftOop) {
120
interpreterProxy->success((interpreterProxy->slotSizeOf(fftOop)) >= 6);
121
if (interpreterProxy->failed()) {
124
nu = interpreterProxy->fetchIntegerofObject(0, fftOop);
125
fftSize = interpreterProxy->fetchIntegerofObject(1, fftOop);
126
oop = interpreterProxy->fetchPointerofObject(2, fftOop);
127
sinTableSize = interpreterProxy->stSizeOf(oop);
128
/* begin checkedFloatPtrOf: */
129
interpreterProxy->success(interpreterProxy->isWords(oop));
130
if (interpreterProxy->failed()) {
134
sinTable = ((float *) (interpreterProxy->firstIndexableField(oop)));
135
l1: /* end checkedFloatPtrOf: */;
136
oop = interpreterProxy->fetchPointerofObject(3, fftOop);
137
permTableSize = interpreterProxy->stSizeOf(oop);
138
/* begin checkedWordPtrOf: */
139
interpreterProxy->success(interpreterProxy->isWords(oop));
140
permTable = ((unsigned int *) (interpreterProxy->firstIndexableField(oop)));
141
oop = interpreterProxy->fetchPointerofObject(4, fftOop);
142
realDataSize = interpreterProxy->stSizeOf(oop);
143
/* begin checkedFloatPtrOf: */
144
interpreterProxy->success(interpreterProxy->isWords(oop));
145
if (interpreterProxy->failed()) {
149
realData = ((float *) (interpreterProxy->firstIndexableField(oop)));
150
l2: /* end checkedFloatPtrOf: */;
151
oop = interpreterProxy->fetchPointerofObject(5, fftOop);
152
imagDataSize = interpreterProxy->stSizeOf(oop);
153
/* begin checkedFloatPtrOf: */
154
interpreterProxy->success(interpreterProxy->isWords(oop));
155
if (interpreterProxy->failed()) {
159
imagData = ((float *) (interpreterProxy->firstIndexableField(oop)));
160
l3: /* end checkedFloatPtrOf: */;
161
interpreterProxy->success((((((1 << nu) == fftSize) && (((((int) fftSize >> 2)) + 1) == sinTableSize)) && (fftSize == realDataSize)) && (fftSize == imagDataSize)) && (realDataSize == imagDataSize));
162
return (interpreterProxy->failed()) == 0;
165
static int msg(char *s) {
166
fprintf(stderr, "\n%s: %s", moduleName, s);
169
static int permuteData(void) {
179
a = (permTable[i]) - 1;
180
b = (permTable[i + 1]) - 1;
181
if (!((a < realDataSize) && (b < realDataSize))) {
182
return interpreterProxy->success(0);
185
realData[a] = (realData[b]);
188
imagData[a] = (imagData[b]);
194
EXPORT(int) primitiveFFTPermuteData(void) {
197
rcvr = interpreterProxy->stackObjectValue(0);
198
if (!(loadFFTFrom(rcvr))) {
202
if (interpreterProxy->failed()) {
207
EXPORT(int) primitiveFFTScaleData(void) {
210
rcvr = interpreterProxy->stackObjectValue(0);
211
if (!(loadFFTFrom(rcvr))) {
217
EXPORT(int) primitiveFFTTransformData(void) {
221
forward = interpreterProxy->booleanValueOf(interpreterProxy->stackValue(0));
222
rcvr = interpreterProxy->stackObjectValue(1);
223
if (!(loadFFTFrom(rcvr))) {
226
/* begin transformData: */
228
if (interpreterProxy->failed()) {
232
transformForward(forward);
236
l1: /* end transformData: */;
237
if (!(interpreterProxy->failed())) {
238
interpreterProxy->pop(1);
243
/* Scale all elements by 1/n when doing inverse */
245
static int scaleData(void) {
252
realN = ((float) (1.0 / (((double) fftSize))));
253
for (i = 0; i <= (fftSize - 1); i += 1) {
254
realData[i] = ((realData[i]) * realN);
255
imagData[i] = ((imagData[i]) * realN);
260
/* Note: This is coded so that is can be run from Squeak. */
262
EXPORT(int) setInterpreter(struct VirtualMachine* anInterpreter) {
265
interpreterProxy = anInterpreter;
266
ok = interpreterProxy->majorVersion() == VM_PROXY_MAJOR;
270
ok = interpreterProxy->minorVersion() >= VM_PROXY_MINOR;
274
static int transformData(int forward) {
276
if (interpreterProxy->failed()) {
280
transformForward(forward);
286
static int transformForward(int forward) {
303
fftSize2 = ((int) fftSize >> 1);
304
fftSize4 = ((int) fftSize >> 2);
305
for (level = 1; level <= nu; level += 1) {
306
lev = ((level < 0) ? ((unsigned) 1 >> -level) : ((unsigned) 1 << level));
307
lev1 = ((int) lev >> 1);
308
fftScale = fftSize / lev;
309
for (j = 1; j <= lev1; j += 1) {
311
/* pi * (j-1) / lev1 mapped onto 0..n/2 */
313
theta = (j - 1) * fftScale;
314
if (theta < fftSize4) {
315
realU = sinTable[(sinTableSize - theta) - 1];
316
imagU = sinTable[theta];
318
realU = 0.0 - (sinTable[theta - fftSize4]);
319
imagU = sinTable[fftSize2 - theta];
325
while (i <= fftSize) {
328
realT = ((realData[ip]) * realU) - ((imagData[ip]) * imagU);
329
imagT = ((realData[ip]) * imagU) + ((imagData[ip]) * realU);
330
realData[ip] = ((realData[ii]) - realT);
331
imagData[ip] = ((imagData[ii]) - imagT);
332
realData[ii] = ((realData[ii]) + realT);
333
imagData[ii] = ((imagData[ii]) + imagT);
341
#ifdef SQUEAK_BUILTIN_PLUGIN
344
void* FFTPlugin_exports[][3] = {
345
{"FFTPlugin", "primitiveFFTScaleData", (void*)primitiveFFTScaleData},
346
{"FFTPlugin", "primitiveFFTTransformData", (void*)primitiveFFTTransformData},
347
{"FFTPlugin", "primitiveFFTPermuteData", (void*)primitiveFFTPermuteData},
348
{"FFTPlugin", "getModuleName", (void*)getModuleName},
349
{"FFTPlugin", "setInterpreter", (void*)setInterpreter},
354
#endif /* ifdef SQ_BUILTIN_PLUGIN */