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