MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / FRINTA_float

Function FRINTA_float

arch/arm64/disassembler/decode2.c:10597–10645  ·  view source on GitHub ↗

frinta_float.xml */

Source from the content-addressed store, hash-verified

10595
10596/* frinta_float.xml */
10597int FRINTA_float(context *ctx, Instruction *instr)
10598{
10599 int rc = DECODE_STATUS_UNMATCHED;
10600 /* class iclass_float */
10601 /* M=0|0|S=0|11110|ftype=xx|1|opcode[5:3]=001|rmode=100|10000|Rn=xxxxx|Rd=xxxxx */
10602 if((INSWORD & 0xFF3FFC00)==0x1E264000) {
10603 decode_fields32(ENC_FRINTA_H_FLOATDP1, ctx, instr);
10604 ctx->d = UINT(ctx->Rd);
10605 ctx->n = UINT(ctx->Rn);
10606 if(!ctx->ftype) {
10607 ctx->esize = 0x20;
10608 }
10609 else if(ctx->ftype==1) {
10610 ctx->esize = 0x40;
10611 }
10612 else if(ctx->ftype==2) {
10613 UNDEFINED;
10614 }
10615 else if(ctx->ftype==3) {
10616 if(HaveFP16Ext()) {
10617 ctx->esize = 0x10;
10618 }
10619 else {
10620 UNDEFINED;
10621 }
10622 }
10623 ctx->exact = FALSE;
10624 if(!(ctx->rmode&4)) {
10625 ctx->rounding = FPDecodeRounding(SLICE(ctx->rmode,1,0));
10626 }
10627 else if(ctx->rmode==4) {
10628 ctx->rounding = FPRounding_TIEAWAY;
10629 }
10630 else if(ctx->rmode==5) {
10631 UNDEFINED;
10632 }
10633 else if(ctx->rmode==6) {
10634 ctx->rounding = FPRoundingMode(ctx->FPCR);
10635 ctx->exact = TRUE;
10636 }
10637 else if(ctx->rmode==7) {
10638 ctx->rounding = FPRoundingMode(ctx->FPCR);
10639 }
10640 if(ctx->ftype==3) OK(ENC_FRINTA_H_FLOATDP1);
10641 if(ctx->ftype==0) OK(ENC_FRINTA_S_FLOATDP1);
10642 if(ctx->ftype==1) OK(ENC_FRINTA_D_FLOATDP1);
10643 }
10644 return rc;
10645}
10646
10647/* frinti_advsimd.xml */
10648int FRINTI_advsimd(context *ctx, Instruction *instr)

Callers 1

decode_iclass_floatdp1Function · 0.85

Calls 3

decode_fields32Function · 0.85
FPDecodeRoundingFunction · 0.85
FPRoundingModeFunction · 0.85

Tested by

no test coverage detected