dis_handler_return SPARCFPop3( dis_handle *h, void *d, dis_dec_ins *ins ) { sparc_ins code; code.full = _SparcIns( ins->opcode ); ins->op[ 0 ].type = DO_REG; ins->op[ 0 ].base = _SparcFReg( code.op3opf.rs1 ); ins->op[ 1 ].type = DO_REG; ins->op[ 1 ].base = _SparcFReg( code.op3opf.rs2 ); ins->op[ 2 ].type = DO_REG; ins->op[ 2 ].base = _SparcFReg( code.op3opf.rd ); ins->num_ops = 3; return( DHR_DONE ); }
dis_handler_return SPARCFPop2( dis_handle *h, void *d, dis_dec_ins *ins ) { sparc_ins code; code.full = _SparcIns( ins->opcode ); if( code.op3opf.opcode_3 == 0x35 ) { // fcmp ins->op[ 0 ].type = DO_REG; ins->op[ 0 ].base = _SparcFReg( code.op3opf.rs1 ); ins->op[ 1 ].type = DO_REG; ins->op[ 1 ].base = _SparcFReg( code.op3opf.rs2 ); } else { ins->op[ 0 ].type = DO_REG; ins->op[ 0 ].base = _SparcFReg( code.op3opf.rs2 ); ins->op[ 1 ].type = DO_REG; ins->op[ 1 ].base = _SparcFReg( code.op3opf.rd ); } ins->num_ops = 2; return( DHR_DONE ); }
dis_handler_return SPARCMemF( dis_handle *h, void *d, dis_dec_ins *ins ) { sparc_ins code; int mem_op; int reg_op; code.full = _SparcIns( ins->opcode ); getOpIndices( code, &mem_op, ®_op ); ins->op[ reg_op ].type = DO_REG; ins->op[ reg_op ].base = _SparcFReg( code.op3.rd ); ins->op[ mem_op ].ref_type = floatRefTypes[ code.op3.opcode_3 & 0x03 ]; doSparcMem( h, d, &ins->op[ mem_op ], code ); if( code.op3.opcode_3 == 0x21 || code.op3.opcode_3 == 0x25 ) { // special case for ldfsr/stfsr instructions ins->op[ reg_op ].base = DR_SPARC_fsr; } if( code.op3.opcode_3 == 0x26 ) { // another special case - stdfq instruction ins->op[ reg_op ].base = DR_SPARC_fq; } ins->num_ops = 2; return( DHR_DONE ); }