stp_fpsimd.xml */
| 25397 | |
| 25398 | /* stp_fpsimd.xml */ |
| 25399 | int STP_fpsimd(context *ctx, Instruction *instr) |
| 25400 | { |
| 25401 | int rc = DECODE_STATUS_UNMATCHED; |
| 25402 | /* class iclass_post_indexed */ |
| 25403 | /* opc=xx|101|V=1|001|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */ |
| 25404 | if((INSWORD & 0x3FC00000)==0x2C800000) { |
| 25405 | decode_fields32(ENC_STP_S_LDSTPAIR_POST, ctx, instr); |
| 25406 | if(ctx->opc==0) OK(ENC_STP_S_LDSTPAIR_POST); |
| 25407 | if(ctx->opc==1) OK(ENC_STP_D_LDSTPAIR_POST); |
| 25408 | if(ctx->opc==2) OK(ENC_STP_Q_LDSTPAIR_POST); |
| 25409 | } |
| 25410 | /* class iclass_pre_indexed */ |
| 25411 | /* opc=xx|101|V=1|011|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */ |
| 25412 | if((INSWORD & 0x3FC00000)==0x2D800000) { |
| 25413 | decode_fields32(ENC_STP_S_LDSTPAIR_PRE, ctx, instr); |
| 25414 | if(ctx->opc==0) OK(ENC_STP_S_LDSTPAIR_PRE); |
| 25415 | if(ctx->opc==1) OK(ENC_STP_D_LDSTPAIR_PRE); |
| 25416 | if(ctx->opc==2) OK(ENC_STP_Q_LDSTPAIR_PRE); |
| 25417 | } |
| 25418 | /* class iclass_signed_scaled_offset */ |
| 25419 | /* opc=xx|101|V=1|010|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */ |
| 25420 | if((INSWORD & 0x3FC00000)==0x2D000000) { |
| 25421 | decode_fields32(ENC_STP_S_LDSTPAIR_OFF, ctx, instr); |
| 25422 | if(ctx->opc==0) OK(ENC_STP_S_LDSTPAIR_OFF); |
| 25423 | if(ctx->opc==1) OK(ENC_STP_D_LDSTPAIR_OFF); |
| 25424 | if(ctx->opc==2) OK(ENC_STP_Q_LDSTPAIR_OFF); |
| 25425 | } |
| 25426 | /* post-decode pcode */ |
| 25427 | ctx->n = UINT(ctx->Rn); |
| 25428 | ctx->t = UINT(ctx->Rt); |
| 25429 | ctx->t2 = UINT(ctx->Rt2); |
| 25430 | ctx->acctype = ctx->AccType_VEC; |
| 25431 | ctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE; |
| 25432 | if(ctx->opc==3) { |
| 25433 | UNDEFINED; |
| 25434 | } |
| 25435 | ctx->scale = 2+UINT(ctx->opc); |
| 25436 | ctx->datasize = (8) << (ctx->scale); |
| 25437 | ctx->offset = LSL(SignExtend(ctx->imm7,7),ctx->scale); |
| 25438 | ctx->tag_checked = ctx->wback || ctx->n!=0x1f; |
| 25439 | ctx->rt_unknown = FALSE; |
| 25440 | if(ctx->memop==MemOp_LOAD && ctx->t==ctx->t2) { |
| 25441 | ctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); |
| 25442 | // assert |
| 25443 | // switch on constraint |
| 25444 | } |
| 25445 | return rc; |
| 25446 | } |
| 25447 | |
| 25448 | /* stp_gen.xml */ |
| 25449 | int STP_gen(context *ctx, Instruction *instr) |
no test coverage detected