void CCaeIsa::CaepInst(int aeId, int opcode, int immed, uint32 inst, uint64 scalar) // F7,0,20-3F { switch (opcode) { // CAEP00 - M[a1] + M[a2] -> M[a3] case 0x20: { uint64 length, a1, a2, a3,a4; uint64 val1, val2, val3, val4, sum = 0; length = ReadAeg(aeId, AEG_CNT); // printf("Sum init : %lld\n",sum); for (uint64 i = 0; i < NUM_AEPIPES; i++) { int fpnum = (aeId << 4) + i; int fp_offset = fpnum*8; a1 = ReadAeg(aeId, AEG_MA1) + fp_offset; a2 = ReadAeg(aeId, AEG_MA2) + fp_offset; a3 = ReadAeg(aeId, AEG_MA3) + fp_offset; a4 = ReadAeg(aeId, AEG_MA4) + fp_offset; uint64 last_a1 = ReadAeg(aeId, AEG_MA1) + length*8; while ((a1 < last_a1) && (fpnum<NUM_FPS)) { #ifdef DEBUG printf("AE=%d fpnum=%d fpnum*64=%d a1=%llx a2=%llx a3=%llx mc_nums(1,2,3) = %lld,%lld,%lld\n", aeId, fpnum, fpnum*64, a1, a2, a3, (a1>>6)&7, (a2>>6)&7, (a3>>6)&7); #endif AeMemLoad(aeId, McNum(a1), a1, MEM_REQ_SIZE, false, val1); AeMemLoad(aeId, McNum(a2), a2, MEM_REQ_SIZE, false, val2); AeMemLoad(aeId, McNum(a4), a4, MEM_REQ_SIZE, false, val4); // printf("a4: %lld\n",val4); // printf("AE: %d a3: %lld i:%lld\n",aeId,val3,i); val3 = val1 + val2 + val4; sum += val3; // printf("AE: %d a3: %lld i:%lld sum: %lld\n",aeId,val3,i,sum); #ifdef DEBUG printf("AE=%d: i = %lld val1=%lld val2=%lld val3=%lld sum=%lld\n",aeId,i, val1, val2, val3, sum); #endif AeMemStore(aeId, McNum(a3), a3, MEM_REQ_SIZE, false, val3); // increment addresses a1 += NUM_FPS*8; // number of pipes * 8 bytes a2 += NUM_FPS*8; a3 += NUM_FPS*8; a4 += NUM_FPS*8; } } WriteAeg(aeId, AEG_SAE_BASE+aeId, sum); break; } default:{ printf("Default case hit - opcode = %x\n", opcode); for (int aeId = 0; aeId < CAE_AE_CNT; aeId += 1) SetException(aeId, AEUIE); } } }
void CCaeIsa::CaepInst(int aeId, int opcode, int immed, uint32 inst, uint64 scalar) // F7,0,20-3F { switch (opcode) { case 0x20: cout << "Hello World from emulated ae" << aeId << endl; break; default: printf("Default case hit - opcode = %x\n", opcode); for (int aeId = 0; aeId < CAE_AE_CNT; aeId += 1) SetException(aeId, AEUIE); } }
static void HandleException( struct TDebug *obj, struct TExceptionEvent *event, int thread ) { struct TDebugThread *Thread; RdosEnterSection( obj->FSection ); Thread = obj->ThreadList; while( Thread && Thread->ThreadID != thread ) Thread = Thread->Next; if( Thread ) SetException( Thread, event ); RdosLeaveSection( obj->FSection ); }