Revision 32ca04a6

b/target-arm/translate-a64.c
3268 3268
 */
3269 3269
static void disas_fp_ccomp(DisasContext *s, uint32_t insn)
3270 3270
{
3271
    unsupported_encoding(s, insn);
3271
    unsigned int mos, type, rm, cond, rn, op, nzcv;
3272
    TCGv_i64 tcg_flags;
3273
    int label_continue = -1;
3274

  
3275
    mos = extract32(insn, 29, 3);
3276
    type = extract32(insn, 22, 2); /* 0 = single, 1 = double */
3277
    rm = extract32(insn, 16, 5);
3278
    cond = extract32(insn, 12, 4);
3279
    rn = extract32(insn, 5, 5);
3280
    op = extract32(insn, 4, 1);
3281
    nzcv = extract32(insn, 0, 4);
3282

  
3283
    if (mos || type > 1) {
3284
        unallocated_encoding(s);
3285
        return;
3286
    }
3287

  
3288
    if (cond < 0x0e) { /* not always */
3289
        int label_match = gen_new_label();
3290
        label_continue = gen_new_label();
3291
        arm_gen_test_cc(cond, label_match);
3292
        /* nomatch: */
3293
        tcg_flags = tcg_const_i64(nzcv << 28);
3294
        gen_set_nzcv(tcg_flags);
3295
        tcg_temp_free_i64(tcg_flags);
3296
        tcg_gen_br(label_continue);
3297
        gen_set_label(label_match);
3298
    }
3299

  
3300
    handle_fp_compare(s, type, rn, rm, false, op);
3301

  
3302
    if (cond < 0x0e) {
3303
        gen_set_label(label_continue);
3304
    }
3272 3305
}
3273 3306

  
3274 3307
/* C3.6.24 Floating point conditional select

Also available in: Unified diff