float fSin(float val){ if (val >= 0 && val < PI/2){ return lookup(val * 65536 / (PI/2)); } else if (val >= PI/2 && val < PI){ return 1 - lookup((val - PI/2) * 65536 / (PI/2)); } else if (val >= PI && val < 3 * PI / 2){ return lookup((val - PI) * 65536 / (PI/2)) * -1; } else if (val >= 3 * PI / 2 && val < 2 * PI) { return (1 - lookup((val - 3 * PI / 2) * 65536 / (PI/2))) * -1; } else if (val > 2*PI){ return fSin(val - 2 * PI); } else if (val < 0){ return fSin(val + 2 * PI); } return 0; }
///////////////////////////////////////////////////////// // main testing function ///////////////////////////////////////////////////////// int main(int argc, const char * const argv[]) { (void)argc; (void)argv; boolean_T pass, flag; int coreid; float omega, ampl, runningPhase; float sig[200]; int k; int i; float y; int ix; float xbar; float r; float b_y; float tmp[2]; float golden[4]; boolean_T c_y; boolean_T exitg1; ///////////////////////////////////////////////////////// // main test loop // each core loops over a kernel instance ///////////////////////////////////////////////////////// coreid = get_core_id(); printf("starting %d kernel iterations... (coreid = %d)\n",KERNEL_ITS,coreid); if (coreid>3) coreid=coreid-4; synch_barrier(); perf_begin(); omega = fv1[coreid]; ampl = fv2[coreid]; for(k = 0; k < getKernelIts(); k++) { runningPhase = omega; // matlab kernel for (i = 0; i < 200; i++) { sig[i] = ampl * fSin(runningPhase); runningPhase += omega; if(runningPhase > pi2[0]) { runningPhase -= pi2[0]; } } } synch_barrier(); perf_end(); ///////////////////////////////////////////////////////// // check results ///////////////////////////////////////////////////////// synch_barrier(); y = sig[0]; ix = 0; xbar = sig[0]; for (k = 0; k < 199; k++) { y += sig[k + 1]; ix++; xbar += sig[ix]; } xbar = fDiv(xbar,200.0F); ix = 0; r = sig[0] - xbar; b_y = r * r; for (k = 0; k < 199; k++) { ix++; r = sig[ix] - xbar; b_y += r * r; } b_y = fDiv(b_y,199.0F); tmp[0] = y; tmp[1] = b_y; pass = true; for (k = 0; k < 2; k++) { for (ix = 0; ix < 2; ix++) { golden[ix + (k << 1)] = fv0[(ix + (k << 1)) + (coreid << 2)]; } flag = true; flag = flag && (tmp[k] <= golden[k << 1]); flag = flag && (tmp[k] >= golden[1 + (k << 1)]); printErrors(!flag, k, tmp[k] ,golden[k << 1], golden[1 + (k << 1)]); pass = pass && flag; } flagPassFail(pass, get_core_id()); ///////////////////////////////////////////////////////// // synchronize and exit ///////////////////////////////////////////////////////// return !pass; }
float fTan(float val){ return fSin(val)/fCos(val); }
float fCos(float val){ return fSin(val + PI/2); }
/** * Episode 1 guardian iteration. * * @param ticks Time * * @return Remaining event */ JJ1Event* MedGuardian::step(unsigned int ticks) { fixed sin = fSin(ticks / 2); fixed cos = fCos(ticks / 2); set = prepareStep(ticks); if (!set) return remove(false); if (level->getEventHits(gridX, gridY) >= set->strength / 2) stage = 1; if (level->getEventHits(gridX, gridY) >= set->strength) stage = 2; // Stage 0: Move in an eight shape and fire the occasional shot if (stage == 0) { if (direction == 1) { // Lower right part of the eight setAnimType(E_LEFTANIM); dx = TTOF(gridX) + (sin * 96) - x + ITOF(96); dy = TTOF(gridY) - (cos * 64) - y; if (cos > 0) direction = 2; } if (direction == 2) { // Upper left part of the eight setAnimType(E_LEFTANIM); dx = TTOF(gridX) - (sin * 96) - x - ITOF(96); dy = TTOF(gridY) - (cos * 64) - y; if (cos < 0) direction = 3; } if (direction == 3) { // Lower left part of the eight setAnimType(E_RIGHTANIM); dx = TTOF(gridX) - (sin * 96) - x - ITOF(96); dy = TTOF(gridY) - (cos * 64) - y; if (cos > 0) direction = 4; } if (direction == 4) { // Upper right part of the eight setAnimType(E_RIGHTANIM); dx = TTOF(gridX) + (sin * 96) - x + ITOF(96); dy = TTOF(gridY) - (cos * 64) - y; if (cos < 0) direction = 1; } // Decide if there should be a shot if ((ticks % (set->bulletPeriod * 25) > (unsigned int)(set->bulletPeriod * 25) - 300)) { level->setEventTime(gridX, gridY, ticks + 300); shoot = true; } // Shoot if there is a shot if (level->getEventTime(gridX, gridY) && (ticks > level->getEventTime(gridX, gridY)) && shoot) { if (set->bullet < 32) level->createBullet(NULL, gridX, gridY, x + anim->getAccessoryShootX(), y + anim->getAccessoryShootY(), set->bullet, (animType != E_LEFTANIM), ticks); shoot = false; } } // Stage 1: Hop back and forth destroying the bottom row of tiles if (stage == 1) { fixed startPos = TTOF(gridY) + ITOF(40); if (direction < 5) { // Move up or down towards the starting position for hopping direction = (y > startPos) ? 5 : 6; } // Move up to the correct height if (direction == 5) { if (y > startPos) { dx = 0; dy = ITOF(-2); } else direction = 7; } // Move down to the correct height if (direction == 6) { if (y < startPos) { dx = 0; dy = ITOF(2); } else direction = 7; } // Cosinus should be near zero before we start hopping. if (direction == 7) { dx = 0; dy = 0; if (cos > -100 && cos < 100) direction = 8; } // Start hopping if (direction == 8) { if (level->checkMaskUp(x, y) || level->checkMaskUp(x + width, y)) setAnimType((animType == E_LEFTANIM) ? E_RIGHTANIM : E_LEFTANIM); dy = startPos - abs(cos * 96) - y; dx = abs(cos * 6); if (animType == E_LEFTANIM) dx *= -1; if (cos < 0 && level->checkMaskDown(x + ITOF(anim->getWidth() / 2), y + TTOF(1))) direction = 9; } // Destroy the block underneath if (direction == 9) { // Shake a bit dx = (FTOI(x) % 2) ? ITOF(1) : ITOF(-1); dy = 0; // Remove the tile if (cos > 0 && cos < 100) { level->setTile( FTOT(x + ITOF((anim->getWidth() / 2))), FTOT(y) + 1, set->magnitude); direction = 8; } } } // Stage 2: End of behavior if (stage == 2) { dx = 0; dy = ITOF(4); } x += dx; y += dy; dx = dx << 6; dy = dy << 6; return this; }