Skip to content

Commit

Permalink
Add IL implementation for FABS
Browse files Browse the repository at this point in the history
    * Also add `x86_il_{get,set}_st_reg` helper functions
  • Loading branch information
DMaroo committed Sep 16, 2023
1 parent 9130575 commit 487a2ea
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 1 deletion.
20 changes: 20 additions & 0 deletions librz/analysis/arch/x86/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -1077,4 +1077,24 @@ RzILOpEffect *x86_il_set_flags(RZ_OWN RzILOpPure *val, unsigned int size) {
return SEQ2(set_val, eff);
}

static bool check_st_reg(X86Reg reg) {
return reg >= X86_REG_ST0 && reg <= X86_REG_ST7;
}

RzILOpFloat *x86_il_get_st_reg(X86Reg reg) {
if (check_st_reg(reg)) {
return BV2F(RZ_FLOAT_IEEE754_BIN_64, VARG(x86_registers[reg]));
}

return NULL;
}

RzILOpEffect *x86_il_set_st_reg(X86Reg reg, RzILOpFloat *val) {
if (check_st_reg(reg)) {
return SETG(x86_registers[reg], F2BV(val));
}

return NULL;
}

#include <rz_il/rz_il_opbuilder_end.h>
3 changes: 3 additions & 0 deletions librz/analysis/arch/x86/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,4 +104,7 @@ RzILOpEffect *x86_il_set_arithmetic_flags_except_cf_bits(RZ_OWN RzILOpPure *res,
RzILOpPure *x86_il_get_flags(unsigned int size);
RzILOpEffect *x86_il_set_flags(RZ_OWN RzILOpPure *val, unsigned int size);

RzILOpFloat *x86_il_get_st_reg(X86Reg reg);
RzILOpEffect *x86_il_set_st_reg(X86Reg reg, RzILOpFloat *val);

#endif // X86_IL_COMMON_H
14 changes: 14 additions & 0 deletions librz/analysis/arch/x86/il_fp_ops.inc
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,17 @@
* - https://eng.libretexts.org/Bookshelves/Computer_Science/Programming_Languages/x86-64_Assembly_Language_Programming_with_Ubuntu_(Jorgensen)/18%3A_Floating-Point_Instructions
* - https://en.wikibooks.org/wiki/X86_Assembly/Floating_Point#Floating-Point_Instruction_Set
*/

#include "common.h"
#include <rz_il/rz_il_opbuilder_begin.h>

/* Arithmetic instructions */

/**
* FABS
* Clears the sign bit of st(0) to create absolute value
*/
IL_LIFTER(fabs) {
RzILOpFloat *abs_value = FABS(x86_il_get_st_reg(X86_REG_ST0));
return x86_il_set_st_reg(X86_REG_ST0, abs_value);
}
6 changes: 5 additions & 1 deletion librz/analysis/arch/x86/x86_il.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include "x86_il.h"
#include "il_ops.inc"
#include "il_fp_ops.inc"

#define COMMON_REGS \
"cs", /* X86_REG_CS */ \
Expand Down Expand Up @@ -240,7 +241,10 @@ x86_il_ins x86_ins[X86_INS_ENDING] = {
[X86_INS_INSW] = x86_il_unimpl,
[X86_INS_OUTSB] = x86_il_unimpl,
[X86_INS_OUTSW] = x86_il_unimpl,
[X86_INS_LEAVE] = x86_il_leave
[X86_INS_LEAVE] = x86_il_leave,

/* floating-point instructions */
[X86_INS_FABS] = x86_il_fabs
};

void label_int(RzILVM *vm, RzILOpEffect *op);
Expand Down

0 comments on commit 487a2ea

Please sign in to comment.