changeset 0f869e59c079 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=0f869e59c079
description:
ARM: Use the new DataOp format to simplify the decoder.
diffstat:
4 files changed, 543 insertions(+), 641 deletions(-)
src/arch/arm/insts/static_inst.cc | 2
src/arch/arm/isa/bitfields.isa | 5
src/arch/arm/isa/decoder.isa | 1170 ++++++++++++++++---------------------
src/arch/arm/types.hh | 7
diffs (truncated from 1287 to 300 lines):
diff -r f5edd0f709e4 -r 0f869e59c079 src/arch/arm/insts/static_inst.cc
--- a/src/arch/arm/insts/static_inst.cc Wed Jul 01 22:11:27 2009 -0700
+++ b/src/arch/arm/insts/static_inst.cc Wed Jul 01 22:11:39 2009 -0700
@@ -388,7 +388,7 @@
{
printMnemonic(os, machInst.sField ? "s" : "");
//XXX It would be nice if the decoder figured this all out for us.
- unsigned opcode = machInst.opcode24_21;
+ unsigned opcode = machInst.opcode;
bool firstOp = true;
// Destination
diff -r f5edd0f709e4 -r 0f869e59c079 src/arch/arm/isa/bitfields.isa
--- a/src/arch/arm/isa/bitfields.isa Wed Jul 01 22:11:27 2009 -0700
+++ b/src/arch/arm/isa/bitfields.isa Wed Jul 01 22:11:39 2009 -0700
@@ -34,9 +34,8 @@
//
// Opcode fields
+def bitfield ENCODING encoding;
def bitfield OPCODE opcode;
-def bitfield OPCODE_27_25 opcode27_25;
-def bitfield OPCODE_24_21 opcode24_21;
def bitfield OPCODE_24_23 opcode24_23;
def bitfield OPCODE_24 opcode24;
def bitfield OPCODE_23_20 opcode23_20;
@@ -52,7 +51,7 @@
def bitfield OPCODE_15_12 opcode15_12;
def bitfield OPCODE_15 opcode15;
def bitfield OPCODE_9 opcode9;
-def bitfield OPCODE_7_4 opcode7_4;
+def bitfield MISC_OPCODE miscOpcode;
def bitfield OPCODE_7_5 opcode7_5;
def bitfield OPCODE_7_6 opcode7_6;
def bitfield OPCODE_7 opcode7;
diff -r f5edd0f709e4 -r 0f869e59c079 src/arch/arm/isa/decoder.isa
--- a/src/arch/arm/isa/decoder.isa Wed Jul 01 22:11:27 2009 -0700
+++ b/src/arch/arm/isa/decoder.isa Wed Jul 01 22:11:39 2009 -0700
@@ -39,7 +39,7 @@
//
decode COND_CODE default Unknown::unknown() {
0xf: decode COND_CODE {
- 0x0: decode OPCODE_27_25 {
+ 0x0: decode OPCODE {
// Just a simple trick to allow us to specify our new uops here
0x0: PredImmOp::addi_uop({{ Raddr = Rn + rotated_imm; }},
'IsMicroop');
@@ -56,7 +56,7 @@
0x5: PredImmOp::subi_rd_uop({{ Rd = Rn - rotated_imm; }},
'IsMicroop');
}
- 0x1: decode OPCODE_27_25 {
+ 0x1: decode OPCODE {
0x0: PredIntOp::mvtd_uop({{ Fd.ud = ((uint64_t) Rhi << 32)|Rlo; }},
'IsMicroop');
0x1: PredIntOp::mvfd_uop({{ Rhi = (Fd.ud >> 32) & 0xffffffff;
@@ -77,394 +77,289 @@
}
default: Unknown::unknown(); // TODO: Ignore other NV space for now
}
- format BasicOp{
- default: decode OPCODE_27_25 {
- 0x0: decode OPCODE_4 {
- 0: decode S_FIELD {
- 0: decode OPCODE_24_21 {
- format PredIntOp {
- 0x0: and({{ Rd = Rn & Rm_Imm; }});
- 0x1: eor({{ Rd = Rn ^ Rm_Imm; }});
- 0x2: sub({{ Rd = Rn - Rm_Imm; }});
- 0x3: rsb({{ Rd = Rm_Imm - Rn; }});
- 0x4: add({{ Rd = Rn + Rm_Imm; }});
- 0x5: adc({{ Rd = Rn + Rm_Imm + Cpsr<29:>; }});
- 0x6: sbc({{ Rd = Rn - Rm_Imm + Cpsr<29:> - 1; }});
- 0x7: rsc({{ Rd = Rm_Imm - Rn + Cpsr<29:> - 1; }});
- //0x8:mrs_cpsr -- TODO
- //0x9:msr_cpsr -- TODO
- //0xa:mrs_spsr -- TODO
- //0xb:msr_spsr -- TODO
- 0xc: orr({{ Rd = Rn | Rm_Imm; }});
- 0xd: mov({{ Rd = Rm_Imm; }});
- 0xe: bic({{ Rd = Rn & ~Rm_Imm; }});
- 0xf: mvn({{ Rd = ~Rm_Imm; }});
- }
+default: decode ENCODING {
+format DataOp {
+ 0x0: decode SEVEN_AND_FOUR {
+ 1: decode MISC_OPCODE {
+ 0x9: decode PREPOST {
+ 0: decode OPCODE {
+ 0x0: mul({{ uint32_t resTemp;
+ Rn = resTemp = Rm * Rs; }},
+ {{ Cpsr<29:> }},
+ {{ Cpsr<28:> }});
+ 0x1: mla({{ uint32_t resTemp;
+ Rn = resTemp = Rm * Rs; }},
+ {{ Cpsr<29:> }},
+ {{ Cpsr<28:> }});
+ 0x2: WarnUnimpl::umall();
+ 0x4: umull({{
+ uint64_t resTemp;
+ resTemp = ((uint64_t)Rm)*((uint64_t)Rs);
+ Rd = (uint32_t)(resTemp & 0xffffffff);
+ Rn = (uint32_t)(resTemp >> 32);
+ }}, {{ 1 }}, {{ 1 }});
+ 0x5: WarnUnimpl::smlal();
+ 0x6: smull({{
+ int64_t resTemp;
+ resTemp = ((int64_t)Rm.sw)*((int64_t)Rs.sw);
+ Rd = (int32_t)(resTemp & 0xffffffff);
+ Rn = (int32_t)(resTemp >> 32);
+ }}, {{ 1 }}, {{ 1 }});
+ 0x7: umlal({{
+ uint64_t resTemp;
+ resTemp = ((uint64_t)Rm)*((uint64_t)Rs);
+ resTemp += ((uint64_t)Rn << 32)+((uint64_t)Rd);
+ Rd = (uint32_t)(resTemp & 0xffffffff);
+ Rn = (uint32_t)(resTemp >> 32);
+ }}, {{ 1 }}, {{ 1 }});
}
- 1: decode OPCODE_24_21 {
- format PredIntOpCc {
- 0x0: ands({{
- uint32_t resTemp;
- Rd = resTemp = Rn & Rm_Imm;
- }},
- {{ shift_carry_imm(Rm, shift_size, shift, Cpsr<29:>)
}},
- {{ Cpsr<28:> }});
- 0x1: eors({{
- uint32_t resTemp;
- Rd = resTemp = Rn ^ Rm_Imm;
- }},
- {{ shift_carry_imm(Rm, shift_size, shift, Cpsr<29:>)
}},
- {{ Cpsr<28:> }});
- 0x2: subs({{
- uint32_t resTemp,
- val2 = Rm_Imm;
- Rd = resTemp = Rn - val2;
- }},
- {{ arm_sub_carry(resTemp, Rn, val2) }},
- {{ arm_sub_overflow(resTemp, Rn, val2) }});
- 0x3: rsbs({{
- uint32_t resTemp,
- val2 = Rm_Imm;
- Rd = resTemp = val2 - Rn;
- }},
- {{ arm_sub_carry(resTemp, val2, Rn) }},
- {{ arm_sub_overflow(resTemp, val2, Rn) }});
- 0x4: adds({{
- uint32_t resTemp,
- val2 = Rm_Imm;
- Rd = resTemp = Rn + val2;
- }},
- {{ arm_add_carry(resTemp, Rn, val2) }},
- {{ arm_add_overflow(resTemp, Rn, val2) }});
- 0x5: adcs({{
- uint32_t resTemp,
- val2 = Rm_Imm;
- Rd = resTemp = Rn + val2 + Cpsr<29:>;
- }},
- {{ arm_add_carry(resTemp, Rn, val2) }},
- {{ arm_add_overflow(resTemp, Rn, val2) }});
- 0x6: sbcs({{
- uint32_t resTemp,
- val2 = Rm_Imm;
- Rd = resTemp = Rn - val2 + Cpsr<29:> - 1;
- }},
- {{ arm_sub_carry(resTemp, Rn, val2) }},
- {{ arm_sub_overflow(resTemp, Rn, val2) }});
- 0x7: rscs({{
- uint32_t resTemp,
- val2 = Rm_Imm;
- Rd = resTemp = val2 - Rn + Cpsr<29:> - 1;
- }},
- {{ arm_sub_carry(resTemp, val2, Rn) }},
- {{ arm_sub_overflow(resTemp, val2, Rn) }});
- 0x8: tst({{
- uint32_t resTemp;
- resTemp = Rn & Rm_Imm;
- }},
- {{ shift_carry_imm(Rm, shift_size, shift, Cpsr<29:>)
}},
- {{ Cpsr<28:> }});
- 0x9: teq({{
- uint32_t resTemp;
- resTemp = Rn ^ Rm_Imm;
- }},
- {{ shift_carry_imm(Rm, shift_size, shift, Cpsr<29:>)
}},
- {{ Cpsr<28:> }});
- 0xa: cmp({{
- uint32_t resTemp,
- val2 = Rm_Imm;
- resTemp = Rn - val2;
- }},
- {{ arm_sub_carry(resTemp, Rn, val2) }},
- {{ arm_sub_overflow(resTemp, Rn, val2) }});
- 0xb: cmn({{
- uint32_t resTemp,
- val2 = Rm_Imm;
- resTemp = Rn + val2;
- }},
- {{ arm_add_carry(resTemp, Rn, val2) }},
- {{ arm_add_overflow(resTemp, Rn, val2) }});
- 0xc: orrs({{
- uint32_t resTemp,
- val2 = Rm_Imm;
- Rd = resTemp = Rn | val2;
- }},
- {{ shift_carry_imm(Rm, shift_size, shift, Cpsr<29:>)
}},
- {{ Cpsr<28:> }});
- 0xd: movs({{
- uint32_t resTemp;
- Rd = resTemp = Rm_Imm;
- }},
- {{ shift_carry_imm(Rm, shift_size, shift, Cpsr<29:>)
}},
- {{ Cpsr<28:> }});
- 0xe: bics({{
- uint32_t resTemp;
- Rd = resTemp = Rn & ~Rm_Imm;
- }},
- {{ shift_carry_imm(Rm, shift_size, shift, Cpsr<29:>)
}},
- {{ Cpsr<28:> }});
- 0xf: mvns({{
- uint32_t resTemp;
- Rd = resTemp = ~Rm_Imm;
- }},
- {{ shift_carry_imm(Rm, shift_size, shift, Cpsr<29:>)
}},
- {{ Cpsr<28:> }});
- }
+ 1: decode PUBWL {
+ 0x10: WarnUnimpl::swp();
+ 0x14: WarnUnimpl::swpb();
+ 0x18: WarnUnimpl::strex();
+ 0x19: WarnUnimpl::ldrex();
}
}
- 1: decode OPCODE_7 {
- 0: decode S_FIELD {
- 0: decode OPCODE_24_21 {
- format PredIntOp {
- 0x0: and_rs({{ Rd = Rn & Rm_Rs; }});
- 0x1: eor_rs({{ Rd = Rn ^ Rm_Rs; }});
- 0x2: sub_rs({{ Rd = Rn - Rm_Rs; }});
- 0x3: rsb_rs({{ Rd = Rm_Rs - Rn; }});
- 0x4: add_rs({{ Rd = Rn + Rm_Rs; }});
- 0x5: adc_rs({{ Rd = Rn + Rm_Rs + Cpsr<29:>; }});
- 0x6: sbc_rs({{ Rd = Rn - Rm_Rs + Cpsr<29:> - 1; }});
- 0x7: rsc_rs({{ Rd = Rm_Rs - Rn + Cpsr<29:> - 1; }});
- 0xc: orr_rs({{ Rd = Rn | Rm_Rs; }});
- 0xd: mov_rs({{ Rd = Rm_Rs; }});
- 0xe: bic_rs({{ Rd = Rn & ~Rm_Rs; }});
- 0xf: mvn_rs({{ Rd = ~Rm_Rs; }});
- default: decode OPCODE_7_4 {
- 0x1: decode OPCODE_24_21 {
- 0x9: BranchExchange::bx({{ }});
- 0xb: PredOp::clz({{
- if (Rm == 0)
- Rd = 32;
- else
- {
- int i;
- for (i = 0; i < 32; i++)
- {
- if (Rm & (1<<(31-i)))
- break;
- }
- Rd = i;
- }
- }});
- }
- 0x3: decode OPCODE_24_21 {
- 0x9: BranchExchange::blx({{ }}, Link);
- }
- }
- }
- }
- 1: decode OPCODE_24_21 {
- format PredIntOpCc {
- 0x0: ands_rs({{
- uint32_t resTemp;
- Rd = resTemp = Rn & Rm_Rs;
- }},
- {{ shift_carry_rs(Rm, Rs, shift, Cpsr<29:>) }},
- {{ Cpsr<28:> }});
- 0x1: eors_rs({{
- uint32_t resTemp;
- Rd = resTemp = Rn ^ Rm_Rs;
- }},
- {{ shift_carry_rs(Rm, Rs, shift, Cpsr<29:>) }},
- {{ Cpsr<28:> }});
- 0x2: subs_rs({{
- uint32_t resTemp,
- val2 = Rm_Rs;
- Rd = resTemp = Rn - val2;
- }},
- {{ arm_sub_carry(resTemp, Rn, val2) }},
- {{ arm_sub_overflow(resTemp, Rn, val2) }});
- 0x3: rsbs_rs({{
- uint32_t resTemp,
- val2 = Rm_Rs;
- Rd = resTemp = val2 - Rn;
- }},
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev