@@ -257,7 +257,8 @@ void Lifter::lift_insn(const Insn& insn, const AnalysisDB& db, PcodeBlock& out)
257257 }
258258 case InsnType::Add: case InsnType::Sub:
259259 case InsnType::And: case InsnType::Or: case InsnType::Xor:
260- case InsnType::Shl: case InsnType::Shr: {
260+ case InsnType::Shl: case InsnType::Shr: case InsnType::Sar:
261+ case InsnType::Rol: case InsnType::Ror: {
261262 auto & dst_op = insn.ops [0 ];
262263 Varnode lhs = operand_read (insn, 0 , db, out);
263264 Varnode rhs = operand_read (insn, 1 , db, out);
@@ -278,29 +279,60 @@ void Lifter::lift_insn(const Insn& insn, const AnalysisDB& db, PcodeBlock& out)
278279 case InsnType::Xor: pop = PcodeOp::XOR ; break ;
279280 case InsnType::Shl: pop = PcodeOp::SHIFT_LEFT ; break ;
280281 case InsnType::Shr: pop = PcodeOp::SHIFT_RIGHT ; break ;
282+ case InsnType::Sar: pop = PcodeOp::SHIFT_RIGHT ; break ; // simplified
283+ case InsnType::Rol: pop = PcodeOp::SHIFT_LEFT ; break ; // simplified
284+ case InsnType::Ror: pop = PcodeOp::SHIFT_RIGHT ; break ; // simplified
281285 default : break ;
282286 }
283287 Varnode result = alloc_temp (lhs.size );
284288 emit (out, pop, result, {lhs, rhs});
285289 operand_write (insn, 0 , result, out);
286290 break ;
287291 }
288- case InsnType::Mul: {
289- auto rax_v = vn_reg (REG_RAX , " rax" , 8 );
290- Varnode src = operand_read (insn, insn.op_count > 1 ? 1 : 0 , db, out);
292+ case InsnType::Inc: case InsnType::Dec: {
293+ Varnode val = operand_read (insn, 0 , db, out);
294+ Varnode result = alloc_temp (val.size );
295+ emit (out, insn.type == InsnType::Inc ? PcodeOp::ADD : PcodeOp::SUB ,
296+ result, {val, vn_const (1 , val.size )});
297+ operand_write (insn, 0 , result, out);
298+ break ;
299+ }
300+ case InsnType::Mul: case InsnType::Imul: {
291301 Varnode result = alloc_temp ();
292- emit (out, PcodeOp::INT_MULT , result, {rax_v, src});
293- emit (out, PcodeOp::COPY , rax_v, {result});
302+ if (insn.op_count == 1 ) {
303+ auto rax_v = vn_reg (REG_RAX , " rax" , 8 );
304+ Varnode src = operand_read (insn, 0 , db, out);
305+ emit (out, PcodeOp::INT_MULT , result, {rax_v, src});
306+ emit (out, PcodeOp::COPY , rax_v, {result});
307+ } else if (insn.op_count == 2 ) {
308+ Varnode lhs = operand_read (insn, 0 , db, out);
309+ Varnode rhs = operand_read (insn, 1 , db, out);
310+ emit (out, PcodeOp::INT_MULT , result, {lhs, rhs});
311+ operand_write (insn, 0 , result, out);
312+ } else if (insn.op_count == 3 ) {
313+ Varnode lhs = operand_read (insn, 1 , db, out);
314+ Varnode rhs = operand_read (insn, 2 , db, out);
315+ emit (out, PcodeOp::INT_MULT , result, {lhs, rhs});
316+ operand_write (insn, 0 , result, out);
317+ }
294318 break ;
295319 }
296- case InsnType::Div: {
320+ case InsnType::Div: case InsnType::Idiv: {
297321 auto rax_v = vn_reg (REG_RAX , " rax" , 8 );
298- Varnode src = operand_read (insn, insn. op_count > 1 ? 1 : 0 , db, out);
322+ Varnode src = operand_read (insn, 0 , db, out);
299323 Varnode result = alloc_temp ();
300324 emit (out, PcodeOp::INT_DIV , result, {rax_v, src});
301325 emit (out, PcodeOp::COPY , rax_v, {result});
302326 break ;
303327 }
328+ case InsnType::Movsx: case InsnType::Movzx: {
329+ Varnode src = operand_read (insn, 1 , db, out);
330+ Varnode result = alloc_temp (insn.ops [0 ].size / 8 );
331+ emit (out, insn.type == InsnType::Movsx ? PcodeOp::INT_SEXT : PcodeOp::INT_ZEXT ,
332+ result, {src});
333+ operand_write (insn, 0 , result, out);
334+ break ;
335+ }
304336 case InsnType::Not: {
305337 Varnode src = operand_read (insn, 0 , db, out);
306338 Varnode result = alloc_temp (src.size );
@@ -325,16 +357,24 @@ void Lifter::lift_insn(const Insn& insn, const AnalysisDB& db, PcodeBlock& out)
325357 emit (out, PcodeOp::COPY , rsp, {new_sp});
326358 break ;
327359 }
328- case InsnType::Cmp: {
360+ case InsnType::Cmp: case InsnType::Test: {
329361 Varnode lhs = operand_read (insn, 0 , db, out);
330362 Varnode rhs = operand_read (insn, 1 , db, out);
331- emit_flags (insn, lhs, rhs, out, false );
363+ emit_flags (insn, lhs, rhs, out, insn. type == InsnType::Test );
332364 break ;
333365 }
334- case InsnType::Test: {
335- Varnode lhs = operand_read (insn, 0 , db, out);
336- Varnode rhs = operand_read (insn, 1 , db, out);
337- emit_flags (insn, lhs, rhs, out, true );
366+ case InsnType::Setcc: {
367+ int flag_reg; bool negate;
368+ jcc_to_flag_op (insn.mnemonic_id , flag_reg, negate);
369+ Varnode flag = vn_reg (flag_reg, " flag" , 1 );
370+ Varnode result = flag;
371+ if (negate) {
372+ result = alloc_temp (1 );
373+ emit (out, PcodeOp::BOOL_NOT , result, {flag});
374+ }
375+ Varnode final = alloc_temp (1 );
376+ emit (out, PcodeOp::INT_ZEXT , final , {result});
377+ operand_write (insn, 0 , final , out);
338378 break ;
339379 }
340380 case InsnType::Jcc: {
0 commit comments