summaryrefslogtreecommitdiff
path: root/sys/ia64/disasm/disasm_extract.c
diff options
context:
space:
mode:
authorMarcel Moolenaar <marcel@FreeBSD.org>2006-06-24 01:19:52 +0000
committerMarcel Moolenaar <marcel@FreeBSD.org>2006-06-24 01:19:52 +0000
commita4b606cd184c11641f54687d8f362a9b8fd81bee (patch)
treeb7b8e33f055851e858a2dab4465fb24a46122b92 /sys/ia64/disasm/disasm_extract.c
parent39a0c069fa41c8e873c3905a2a69716ec164f719 (diff)
Notes
Diffstat (limited to 'sys/ia64/disasm/disasm_extract.c')
-rw-r--r--sys/ia64/disasm/disasm_extract.c54
1 files changed, 45 insertions, 9 deletions
diff --git a/sys/ia64/disasm/disasm_extract.c b/sys/ia64/disasm/disasm_extract.c
index 6321ea03027c4..61604f94b23b6 100644
--- a/sys/ia64/disasm/disasm_extract.c
+++ b/sys/ia64/disasm/disasm_extract.c
@@ -817,6 +817,26 @@ asm_normalize(struct asm_inst *i, enum asm_op op)
asm_cmpltr_add(i, ASM_CC_GETF, ASM_CT_SIG);
op = ASM_OP_GETF;
break;
+ case ASM_OP_HINT_B:
+ asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_B);
+ op = ASM_OP_HINT;
+ break;
+ case ASM_OP_HINT_F:
+ asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_F);
+ op = ASM_OP_HINT;
+ break;
+ case ASM_OP_HINT_I:
+ asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_I);
+ op = ASM_OP_HINT;
+ break;
+ case ASM_OP_HINT_M:
+ asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_M);
+ op = ASM_OP_HINT;
+ break;
+ case ASM_OP_HINT_X:
+ asm_cmpltr_add(i, ASM_CC_UNIT, ASM_CT_X);
+ op = ASM_OP_HINT;
+ break;
case ASM_OP_INVALA_:
asm_cmpltr_add(i, ASM_CC_INVALA, ASM_CT_NONE);
op = ASM_OP_INVALA;
@@ -2058,6 +2078,9 @@ asm_extract(enum asm_op op, enum asm_fmt fmt, uint64_t bits,
case ASM_FMT_F15: /* 0 dst */
u_imm(i, 1, bits, 6, 20);
break;
+ case ASM_FMT_F16: /* 0 dst */
+ u_imm(i, 1, bits, 6, 20);
+ break;
case ASM_FMT_I1:
operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
operand(i, 2, ASM_OPER_GREG, bits, 13, 7);
@@ -2161,6 +2184,9 @@ asm_extract(enum asm_op op, enum asm_fmt fmt, uint64_t bits,
operand(i, 3, ASM_OPER_GREG, bits, 20, 7);
i->i_srcidx++;
break;
+ case ASM_FMT_I18:
+ u_immf(i, 1, bits, FRAG(6,20), FRAG(36,1), 0);
+ break;
case ASM_FMT_I19:
u_immf(i, 1, bits, FRAG(6,20), FRAG(36,1), 0);
break;
@@ -2314,8 +2340,7 @@ asm_extract(enum asm_op op, enum asm_fmt fmt, uint64_t bits,
s_immf(i, 2, bits, FRAG(13,7), FRAG(27,1), FRAG(36,1), 0);
i->i_srcidx--;
break;
- case ASM_FMT_M16: {
- int oper;
+ case ASM_FMT_M16:
asm_hint(i, ASM_CC_LDHINT);
operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
operand(i, 2, ASM_OPER_MEM, bits, 20, 7);
@@ -2323,15 +2348,15 @@ asm_extract(enum asm_op op, enum asm_fmt fmt, uint64_t bits,
if (i->i_op == ASM_OP_CMP8XCHG16) {
op_type(i, 4, ASM_OPER_AREG);
op_value(i, 4, AR_CSD);
- oper = 5;
- } else
- oper = 4;
- if (FIELD(bits, 30, 6) < 8) {
- op_type(i, oper, ASM_OPER_AREG);
- op_value(i, oper, AR_CCV);
+ op_type(i, 5, ASM_OPER_AREG);
+ op_value(i, 5, AR_CCV);
+ } else {
+ if (FIELD(bits, 30, 6) < 8) {
+ op_type(i, 4, ASM_OPER_AREG);
+ op_value(i, 4, AR_CCV);
+ }
}
break;
- }
case ASM_FMT_M17:
asm_hint(i, ASM_CC_LDHINT);
operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
@@ -2478,6 +2503,12 @@ asm_extract(enum asm_op op, enum asm_fmt fmt, uint64_t bits,
operand(i, 1, ASM_OPER_GREG, bits, 6, 7);
operand(i, 2, ASM_OPER_GREG, bits, 20, 7);
break;
+ case ASM_FMT_M47:
+ operand(i, 1, ASM_OPER_GREG, bits, 20, 7);
+ break;
+ case ASM_FMT_M48:
+ u_immf(i, 1, bits, FRAG(6,20), FRAG(36,1), 0);
+ break;
case ASM_FMT_X1:
KASSERT(slot == 2, ("foo"));
u_immf(i, 1, bits, FRAG(6,20), FRAG(36,1), 0);
@@ -2510,6 +2541,11 @@ asm_extract(enum asm_op op, enum asm_fmt fmt, uint64_t bits,
i->i_oper[2].o_value <<= 4;
i->i_oper[2].o_type = ASM_OPER_DISP;
break;
+ case ASM_FMT_X5:
+ KASSERT(slot == 2, ("foo"));
+ u_immf(i, 1, bits, FRAG(6,20), FRAG(36,1), 0);
+ combine(&i->i_oper[1].o_value, 21, b->b_inst[1].i_bits, 41, 0);
+ break;
default:
KASSERT(fmt == ASM_FMT_NONE, ("foo"));
return (0);