From 78524bda5606e1b60615f57ebd6bfe5bcdd71afb Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Tue, 19 Dec 2017 23:14:34 -0800 Subject: [PATCH] alpha,arm,mips,power,riscv,sparc,x86,cpu: Get rid of ISA_HAS_DELAY_SLOT. This constant is, first, a #define, and second only used in one place. In that one place, it appears that the code it guards is no longer necessary in general. It was originally written to avoid refetching a block of data that you're still in, even if you've moved slightly farther in it because you're skipping the next instruction due to an annulled branch delay slot. In reality however, in SPARC, the one ISA I'm aware of which has this sort of branching behavior, the PC state object will correctly determine that no branch is happening in these cases. Code lower down in the loop will then recompute where fetching should continue based on the next PC, automatically skipping the annulled branch slot without misinterpretting the gap as a branch. This change therefore also removes this block of code. Change-Id: I820ebc9df10aeb4fcb69c12f6a784e9ec616743c Reviewed-on: https://gem5-review.googlesource.com/6821 Reviewed-by: Andreas Sandberg Maintainer: Andreas Sandberg --- src/arch/alpha/isa_traits.hh | 3 --- src/arch/arm/isa_traits.hh | 3 --- src/arch/mips/isa_traits.hh | 3 --- src/arch/power/isa_traits.hh | 3 --- src/arch/riscv/isa_traits.hh | 3 --- src/arch/sparc/isa_traits.hh | 3 --- src/arch/x86/isa_traits.hh | 3 --- src/cpu/o3/fetch_impl.hh | 11 ----------- 8 files changed, 32 deletions(-) diff --git a/src/arch/alpha/isa_traits.hh b/src/arch/alpha/isa_traits.hh index 54b8003bec..61688b5c8b 100644 --- a/src/arch/alpha/isa_traits.hh +++ b/src/arch/alpha/isa_traits.hh @@ -45,9 +45,6 @@ using namespace LittleEndianGuest; StaticInstPtr decodeInst(ExtMachInst); -// Alpha Does NOT have a delay slot -#define ISA_HAS_DELAY_SLOT 0 - const Addr PageShift = 13; const Addr PageBytes = ULL(1) << PageShift; const Addr PageMask = ~(PageBytes - 1); diff --git a/src/arch/arm/isa_traits.hh b/src/arch/arm/isa_traits.hh index fa2779558e..5763e7747d 100644 --- a/src/arch/arm/isa_traits.hh +++ b/src/arch/arm/isa_traits.hh @@ -57,9 +57,6 @@ namespace ArmISA StaticInstPtr decodeInst(ExtMachInst); - // ARM DOES NOT have a delay slot - #define ISA_HAS_DELAY_SLOT 0 - const Addr PageShift = 12; const Addr PageBytes = ULL(1) << PageShift; const Addr Page_Mask = ~(PageBytes - 1); diff --git a/src/arch/mips/isa_traits.hh b/src/arch/mips/isa_traits.hh index 7a1607183a..6e08c7e855 100644 --- a/src/arch/mips/isa_traits.hh +++ b/src/arch/mips/isa_traits.hh @@ -47,9 +47,6 @@ using namespace LittleEndianGuest; StaticInstPtr decodeInst(ExtMachInst); -// MIPS DOES have a delay slot -#define ISA_HAS_DELAY_SLOT 1 - const Addr PageShift = 13; const Addr PageBytes = ULL(1) << PageShift; const Addr Page_Mask = ~(PageBytes - 1); diff --git a/src/arch/power/isa_traits.hh b/src/arch/power/isa_traits.hh index 41a8d7d1bc..9afe6803a1 100644 --- a/src/arch/power/isa_traits.hh +++ b/src/arch/power/isa_traits.hh @@ -48,9 +48,6 @@ using namespace BigEndianGuest; StaticInstPtr decodeInst(ExtMachInst); -// POWER DOES NOT have a delay slot -#define ISA_HAS_DELAY_SLOT 0 - const Addr PageShift = 12; const Addr PageBytes = ULL(1) << PageShift; const Addr Page_Mask = ~(PageBytes - 1); diff --git a/src/arch/riscv/isa_traits.hh b/src/arch/riscv/isa_traits.hh index 21e684a258..abafad2e22 100644 --- a/src/arch/riscv/isa_traits.hh +++ b/src/arch/riscv/isa_traits.hh @@ -57,9 +57,6 @@ namespace RiscvISA using namespace LittleEndianGuest; -// Riscv does NOT have a delay slot -#define ISA_HAS_DELAY_SLOT 0 - const Addr PageShift = 12; const Addr PageBytes = ULL(1) << PageShift; diff --git a/src/arch/sparc/isa_traits.hh b/src/arch/sparc/isa_traits.hh index 4f98f75802..58d8437ad7 100644 --- a/src/arch/sparc/isa_traits.hh +++ b/src/arch/sparc/isa_traits.hh @@ -44,9 +44,6 @@ namespace SparcISA // This makes sure the big endian versions of certain functions are used. using namespace BigEndianGuest; -// SPARC has a delay slot -#define ISA_HAS_DELAY_SLOT 1 - // real address virtual mapping // sort of like alpha super page, but less frequently used const Addr SegKPMEnd = ULL(0xfffffffc00000000); diff --git a/src/arch/x86/isa_traits.hh b/src/arch/x86/isa_traits.hh index 2b19b1ba7c..158e2f9e43 100644 --- a/src/arch/x86/isa_traits.hh +++ b/src/arch/x86/isa_traits.hh @@ -53,9 +53,6 @@ namespace X86ISA //are used. using namespace LittleEndianGuest; - // X86 does not have a delay slot -#define ISA_HAS_DELAY_SLOT 0 - const Addr PageShift = 12; const Addr PageBytes = ULL(1) << PageShift; diff --git a/src/cpu/o3/fetch_impl.hh b/src/cpu/o3/fetch_impl.hh index d8793426be..2e8ec67aef 100644 --- a/src/cpu/o3/fetch_impl.hh +++ b/src/cpu/o3/fetch_impl.hh @@ -1277,17 +1277,6 @@ DefaultFetch::fetch(bool &status_change) break; } - if (ISA_HAS_DELAY_SLOT && pcOffset == 0) { - // Walk past any annulled delay slot instructions. - Addr pcAddr = thisPC.instAddr() & BaseCPU::PCMask; - while (fetchAddr != pcAddr && blkOffset < numInsts) { - blkOffset++; - fetchAddr += instSize; - } - if (blkOffset >= numInsts) - break; - } - MachInst inst = TheISA::gtoh(cacheInsts[blkOffset]); decoder[tid]->moreBytes(thisPC, fetchAddr, inst);