ldadd.xml */
| 12797 | |
| 12798 | /* ldadd.xml */ |
| 12799 | int 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 */ |
| 12856 | int LDADDB(context *ctx, Instruction *instr) |
no test coverage detected