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

Function LDADD

arch/arm64/disassembler/decode2.c:12799–12853  ·  view source on GitHub ↗

ldadd.xml */

Source from the content-addressed store, hash-verified

12797
12798/* ldadd.xml */
12799int LDADD(context *ctx, Instruction *instr)
12800{
12801 int rc = DECODE_STATUS_UNMATCHED;
12802 /* class iclass_general */
12803 /* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=000|00|Rn=xxxxx|Rt=xxxxx */
12804 if((INSWORD & 0xBF20FC00)==0xB8200000) {
12805 decode_fields32(ENC_LDADD_32_MEMOP, ctx, instr);
12806 if(!HaveAtomicExt()) {
12807 UNDEFINED;
12808 }
12809 ctx->t = UINT(ctx->Rt);
12810 ctx->n = UINT(ctx->Rn);
12811 ctx->s = UINT(ctx->Rs);
12812 ctx->datasize = (8) << (UINT(ctx->size));
12813 ctx->regsize = (ctx->datasize==0x40) ? 0x40 : 0x20;
12814 ctx->ldacctype = (ctx->A==1 && ctx->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
12815 ctx->stacctype = (ctx->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
12816 if(!ctx->opc) {
12817 ctx->op = MemAtomicOp_ADD;
12818 }
12819 else if(ctx->opc==1) {
12820 ctx->op = MemAtomicOp_BIC;
12821 }
12822 else if(ctx->opc==2) {
12823 ctx->op = MemAtomicOp_EOR;
12824 }
12825 else if(ctx->opc==3) {
12826 ctx->op = MemAtomicOp_ORR;
12827 }
12828 else if(ctx->opc==4) {
12829 ctx->op = MemAtomicOp_SMAX;
12830 }
12831 else if(ctx->opc==5) {
12832 ctx->op = MemAtomicOp_SMIN;
12833 }
12834 else if(ctx->opc==6) {
12835 ctx->op = MemAtomicOp_UMAX;
12836 }
12837 else if(ctx->opc==7) {
12838 ctx->op = MemAtomicOp_UMIN;
12839 }
12840 ctx->tag_checked = ctx->n!=0x1f;
12841 /* regular aliases */
12842 if(ctx->A==0 && ctx->Rt==0x1f) return STADD_LDADD(ctx, instr);
12843 if(ctx->size==2 && ctx->A==0 && ctx->R==0) OK(ENC_LDADD_32_MEMOP);
12844 if(ctx->size==2 && ctx->A==1 && ctx->R==0) OK(ENC_LDADDA_32_MEMOP);
12845 if(ctx->size==2 && ctx->A==1 && ctx->R==1) OK(ENC_LDADDAL_32_MEMOP);
12846 if(ctx->size==2 && ctx->A==0 && ctx->R==1) OK(ENC_LDADDL_32_MEMOP);
12847 if(ctx->size==3 && ctx->A==0 && ctx->R==0) OK(ENC_LDADD_64_MEMOP);
12848 if(ctx->size==3 && ctx->A==1 && ctx->R==0) OK(ENC_LDADDA_64_MEMOP);
12849 if(ctx->size==3 && ctx->A==1 && ctx->R==1) OK(ENC_LDADDAL_64_MEMOP);
12850 if(ctx->size==3 && ctx->A==0 && ctx->R==1) OK(ENC_LDADDL_64_MEMOP);
12851 }
12852 return rc;
12853}
12854
12855/* ldaddb.xml */
12856int LDADDB(context *ctx, Instruction *instr)

Callers 1

decode_iclass_memopFunction · 0.85

Calls 2

decode_fields32Function · 0.85
STADD_LDADDFunction · 0.85

Tested by

no test coverage detected