stlxp.xml */
| 25156 | |
| 25157 | /* stlxp.xml */ |
| 25158 | int STLXP(context *ctx, Instruction *instr) |
| 25159 | { |
| 25160 | int rc = DECODE_STATUS_UNMATCHED; |
| 25161 | /* class iclass_base_register */ |
| 25162 | /* 1|sz=x|001000|o2=0|L=0|o1=1|Rs=xxxxx|o0=1|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */ |
| 25163 | if((INSWORD & 0xBFE08000)==0x88208000) { |
| 25164 | decode_fields32(ENC_STLXP_SP32_LDSTEXCLP, ctx, instr); |
| 25165 | ctx->n = UINT(ctx->Rn); |
| 25166 | ctx->t = UINT(ctx->Rt); |
| 25167 | ctx->t2 = UINT(ctx->Rt2); |
| 25168 | ctx->s = UINT(ctx->Rs); |
| 25169 | ctx->acctype = (ctx->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC; |
| 25170 | ctx->pair = TRUE; |
| 25171 | ctx->memop = (ctx->L==1) ? MemOp_LOAD : MemOp_STORE; |
| 25172 | ctx->elsize = (0x20) << (UINT(ctx->sz)); |
| 25173 | ctx->regsize = (ctx->elsize==0x40) ? 0x40 : 0x20; |
| 25174 | ctx->datasize = (ctx->pair) ? (ctx->elsize) * (2) : ctx->elsize; |
| 25175 | ctx->tag_checked = ctx->n!=0x1f; |
| 25176 | ctx->rt_unknown = FALSE; |
| 25177 | ctx->rn_unknown = FALSE; |
| 25178 | if(ctx->memop==MemOp_LOAD && ctx->pair && ctx->t==ctx->t2) { |
| 25179 | ctx->c = ConstrainUnpredictable(Unpredictable_LDPOVERLAP); |
| 25180 | // assert |
| 25181 | // switch on constraint |
| 25182 | } |
| 25183 | if(ctx->memop==MemOp_STORE) { |
| 25184 | if(ctx->s==ctx->t || (ctx->pair && ctx->s==ctx->t2)) { |
| 25185 | ctx->c = ConstrainUnpredictable(Unpredictable_DATAOVERLAP); |
| 25186 | // assert |
| 25187 | // switch on constraint |
| 25188 | } |
| 25189 | if(ctx->s==ctx->n && ctx->n!=0x1f) { |
| 25190 | ctx->c = ConstrainUnpredictable(Unpredictable_BASEOVERLAP); |
| 25191 | // assert |
| 25192 | // switch on constraint |
| 25193 | } |
| 25194 | } |
| 25195 | if(ctx->sz==0) OK(ENC_STLXP_SP32_LDSTEXCLP); |
| 25196 | if(ctx->sz==1) OK(ENC_STLXP_SP64_LDSTEXCLP); |
| 25197 | } |
| 25198 | return rc; |
| 25199 | } |
| 25200 | |
| 25201 | /* stlxr.xml */ |
| 25202 | int STLXR(context *ctx, Instruction *instr) |
no test coverage detected