/* * $Id: instr_word.cc,v 1.1 2002/11/20 20:58:58 misto Exp $ */ #include "instr_word.h" void instr_word::recognize_instr( void ) { if ( format == primary_reg || format == primary_imm){ if ( raw.b(30,31) == 2 ) { group = arlog; switch( opc ) { case 0: instr = add; break; case 1: instr = and; break; case 2: instr = or; break; case 3: instr = xor; break; case 4: instr = sub; break; case 5: instr = andn; break; case 6: instr = orn; break; case 7: instr = xnor; break; case 8: instr = addx; break; case 12: instr = subx; break; case 16: instr = addcc; break; case 17: instr = andcc; break; case 18: instr = orcc; break; case 19: instr = xorcc; break; case 20: instr = subcc; break; case 21: instr = andncc; break; case 22: instr = orncc; break; case 23: instr = xnorcc; break; case 24: instr = addxcc; break; case 28: instr = subxcc; break; case 37: instr = sll; break; case 38: instr = srl; break; case 39: instr = sra; break; case 56: instr = jmpl; break; case 60: instr = save; break; case 61: instr = restore; break; default: throw ex("instr_word::" "recognize_instr: unknown instruction " "(f = 10b)"); } } else if ( raw.b(30,31) == 3 ) { group = mem; switch(opc){ case 0: instr = ld; break; case 1: instr = ldub; break; case 2: instr = lduh; break; case 3: instr = ldd; break; case 4: instr = st; break; case 5: instr = stb; break; case 6: instr = sth; break; case 7: instr = std; break; case 9: instr = ldsb; break; case 10: instr = ldsh; break; case 13: instr = ldstub; break; case 15: instr = swap; break; default: throw ex("instr_word::" "recognize_instr: unknown instruction " "(f = 11b)"); } } } else if ( format == branch_format ) switch( cnd ) { case 0: instr = bn; break; case 1: instr = be; break; case 2: instr = ble; break; case 3: instr = bl; break; case 4: instr = bleu; break; case 5: instr = bcs; break; case 6: instr = bneg; break; case 7: instr = bvs; break; case 8: instr = ba; break; case 9: instr = bne; break; case 10: instr = bg; break; case 11: instr = bge; break; case 12: instr = bgu; break; case 13: instr = bcc; break; case 14: instr = bpos; break; case 15: instr = bvc; break; default: throw ex("instr_word::" "recognize_instr: unknown branch instruction " "(branch_format)"); } } instr_word::instr_word( unsigned long r ) : raw(r) { if ( raw.b(30, 31) == 2 || raw.b(30,31) == 3){ if ( raw.b(13) == 0 ){ format = primary_reg; src2 = raw.b(0,4); } else { format = primary_imm; imm13 = raw.b(0,12); } dst = raw.b(25, 29); opc = raw.b(19, 24); src1 = raw.b(14, 18); } else if ( raw.b(30,31) == 0 && raw.b(22,24) == 2 ){ format = branch_format; group = branch; dsp22 = raw.b(0, 21); cnd = raw.b(25, 28); a = raw.b( 29 ); } else if ( raw.b(30,31) == 0 && raw.b(22,24) == 4 ){ format = sethi_format; instr = sethi; group = other; dsp30 = raw.b(0, 29); } else if ( raw.b(30, 31) == 1 ) { format = call_format; instr = call; group = other; imm22 = raw.b(0, 21); } recognize_instr(); }