Giacomo Travaglini has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/30937 )
Change subject: arch-arm: Use IsPseudo flag in arm m5ops
......................................................................
arch-arm: Use IsPseudo flag in arm m5ops
The patch is adding the IsPseudo flag for both CP15 and semihosting
implementation of pseudo ops
Change-Id: I3b2aa5efe01b6eb2328aad728a21bb826f77c92b
Signed-off-by: Giacomo Travaglini <[email protected]>
---
M src/arch/arm/isa/insts/m5ops.isa
M src/arch/arm/isa/templates/semihost.isa
2 files changed, 68 insertions(+), 45 deletions(-)
diff --git a/src/arch/arm/isa/insts/m5ops.isa
b/src/arch/arm/isa/insts/m5ops.isa
index 4bae7a3..b8f12e7 100644
--- a/src/arch/arm/isa/insts/m5ops.isa
+++ b/src/arch/arm/isa/insts/m5ops.isa
@@ -1,5 +1,5 @@
//
-// Copyright (c) 2010, 2012-2013 ARM Limited
+// Copyright (c) 2010, 2012-2013, 2020 ARM Limited
// All rights reserved
//
// The license below extends only to copyright in the software and shall
@@ -60,7 +60,7 @@
armIop = InstObjParams("arm", "Arm", "PredOp",
{ "code": armCode,
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(armIop)
decoder_output += BasicConstructor.subst(armIop)
exec_output += PredOpExecute.subst(armIop)
@@ -72,7 +72,7 @@
quiesceIop = InstObjParams("quiesce", "Quiesce", "PredOp",
{ "code": quiesceCode,
"predicate_test": predicateTest },
- ["IsNonSpeculative", "IsQuiesce"])
+ ["IsNonSpeculative", "IsQuiesce", "IsPseudo"])
header_output += BasicDeclare.subst(quiesceIop)
decoder_output += BasicConstructor.subst(quiesceIop)
exec_output += QuiescePredOpExecute.subst(quiesceIop)
@@ -88,7 +88,7 @@
quiesceNsIop = InstObjParams("quiesceNs", "QuiesceNs", "PredOp",
{ "code": quiesceNsCode,
"predicate_test": predicateTest },
- ["IsNonSpeculative", "IsQuiesce"])
+ ["IsNonSpeculative", "IsQuiesce", "IsPseudo"])
header_output += BasicDeclare.subst(quiesceNsIop)
decoder_output += BasicConstructor.subst(quiesceNsIop)
exec_output += QuiescePredOpExecute.subst(quiesceNsIop)
@@ -96,7 +96,7 @@
quiesceNsIop = InstObjParams("quiesceNs", "QuiesceNs64", "PredOp",
{ "code": quiesceNsCode64,
"predicate_test": predicateTest },
- ["IsNonSpeculative", "IsQuiesce"])
+ ["IsNonSpeculative", "IsQuiesce", "IsPseudo"])
header_output += BasicDeclare.subst(quiesceNsIop)
decoder_output += BasicConstructor.subst(quiesceNsIop)
exec_output += QuiescePredOpExecute.subst(quiesceNsIop)
@@ -112,7 +112,8 @@
quiesceCyclesIop =
InstObjParams("quiesceCycles", "QuiesceCycles", "PredOp",
{ "code": quiesceCyclesCode,
"predicate_test": predicateTest },
-
["IsNonSpeculative", "IsQuiesce", "IsUnverifiable"])
+ ["IsNonSpeculative", "IsQuiesce",
+ "IsUnverifiable", "IsPseudo"])
header_output += BasicDeclare.subst(quiesceCyclesIop)
decoder_output += BasicConstructor.subst(quiesceCyclesIop)
exec_output += QuiescePredOpExecute.subst(quiesceCyclesIop)
@@ -120,7 +121,8 @@
quiesceCyclesIop =
InstObjParams("quiesceCycles", "QuiesceCycles64", "PredOp",
{ "code": quiesceCyclesCode64,
"predicate_test": predicateTest },
-
["IsNonSpeculative", "IsQuiesce", "IsUnverifiable"])
+ ["IsNonSpeculative", "IsQuiesce",
+ "IsUnverifiable", "IsPseudo"])
header_output += BasicDeclare.subst(quiesceCyclesIop)
decoder_output += BasicConstructor.subst(quiesceCyclesIop)
exec_output += QuiescePredOpExecute.subst(quiesceCyclesIop)
@@ -137,7 +139,8 @@
quiesceTimeIop = InstObjParams("quiesceTime", "QuiesceTime", "PredOp",
{ "code": quiesceTimeCode,
"predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
+ ["IsNonSpeculative", "IsUnverifiable",
+ "IsPseudo"])
header_output += BasicDeclare.subst(quiesceTimeIop)
decoder_output += BasicConstructor.subst(quiesceTimeIop)
exec_output += PredOpExecute.subst(quiesceTimeIop)
@@ -145,7 +148,8 @@
quiesceTimeIop =
InstObjParams("quiesceTime", "QuiesceTime64", "PredOp",
{ "code": quiesceTimeCode64,
"predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
+ ["IsNonSpeculative", "IsUnverifiable",
+ "IsPseudo"])
header_output += BasicDeclare.subst(quiesceTimeIop)
decoder_output += BasicConstructor.subst(quiesceTimeIop)
exec_output += PredOpExecute.subst(quiesceTimeIop)
@@ -162,7 +166,8 @@
rpnsIop = InstObjParams("rpns", "Rpns", "PredOp",
{ "code": rpnsCode,
"predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
+ ["IsNonSpeculative", "IsUnverifiable",
+ "IsPseudo"])
header_output += BasicDeclare.subst(rpnsIop)
decoder_output += BasicConstructor.subst(rpnsIop)
exec_output += PredOpExecute.subst(rpnsIop)
@@ -170,7 +175,8 @@
rpnsIop = InstObjParams("rpns", "Rpns64", "PredOp",
{ "code": rpnsCode64,
"predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
+ ["IsNonSpeculative", "IsUnverifiable",
+ "IsPseudo"])
header_output += BasicDeclare.subst(rpnsIop)
decoder_output += BasicConstructor.subst(rpnsIop)
exec_output += PredOpExecute.subst(rpnsIop)
@@ -186,7 +192,8 @@
wakeCPUIop = InstObjParams("wakeCPU", "WakeCPU", "PredOp",
{ "code": wakeCpuCode,
"predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
+ ["IsNonSpeculative", "IsUnverifiable",
+ "IsPseudo"])
header_output += BasicDeclare.subst(wakeCPUIop)
decoder_output += BasicConstructor.subst(wakeCPUIop)
exec_output += PredOpExecute.subst(wakeCPUIop)
@@ -194,7 +201,8 @@
wakeCPUIop = InstObjParams("wakeCPU", "WakeCPU64", "PredOp",
{ "code": wakeCpuCode64,
"predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
+ ["IsNonSpeculative", "IsUnverifiable",
+ "IsPseudo"])
header_output += BasicDeclare.subst(wakeCPUIop)
decoder_output += BasicConstructor.subst(wakeCPUIop)
exec_output += PredOpExecute.subst(wakeCPUIop)
@@ -237,7 +245,8 @@
m5exitIop = InstObjParams("m5exit", "M5exit", "PredOp",
{ "code": m5exit_code,
"predicate_test": predicateTest },
- ["No_OpClass", "IsNonSpeculative"])
+ ["No_OpClass", "IsNonSpeculative",
+ "IsPseudo"])
header_output += BasicDeclare.subst(m5exitIop)
decoder_output += BasicConstructor.subst(m5exitIop)
exec_output += PredOpExecute.subst(m5exitIop)
@@ -253,7 +262,8 @@
m5failIop = InstObjParams("m5fail", "M5fail", "PredOp",
{ "code": m5fail_code,
"predicate_test": predicateTest },
- ["No_OpClass", "IsNonSpeculative"])
+ ["No_OpClass", "IsNonSpeculative",
+ "IsPseudo"])
header_output += BasicDeclare.subst(m5failIop)
decoder_output += BasicConstructor.subst(m5failIop)
exec_output += PredOpExecute.subst(m5failIop)
@@ -261,7 +271,8 @@
m5failIop = InstObjParams("m5fail", "M5fail64", "PredOp",
{ "code": m5fail_code64,
"predicate_test": predicateTest },
- ["No_OpClass", "IsNonSpeculative"])
+ ["No_OpClass", "IsNonSpeculative",
+ "IsPseudo"])
header_output += BasicDeclare.subst(m5failIop)
decoder_output += BasicConstructor.subst(m5failIop)
exec_output += PredOpExecute.subst(m5failIop)
@@ -270,7 +281,8 @@
m5exitIop = InstObjParams("m5exit", "M5exit64", "PredOp",
{ "code": m5exit_code64,
"predicate_test": predicateTest },
- ["No_OpClass", "IsNonSpeculative"])
+ ["No_OpClass", "IsNonSpeculative",
+ "IsPseudo"])
header_output += BasicDeclare.subst(m5exitIop)
decoder_output += BasicConstructor.subst(m5exitIop)
exec_output += PredOpExecute.subst(m5exitIop)
@@ -282,7 +294,8 @@
loadsymbolIop = InstObjParams("loadsymbol", "Loadsymbol", "PredOp",
{ "code": loadsymbolCode,
"predicate_test": predicateTest },
- ["No_OpClass", "IsNonSpeculative"])
+ ["No_OpClass", "IsNonSpeculative",
+ "IsPseudo"])
header_output += BasicDeclare.subst(loadsymbolIop)
decoder_output += BasicConstructor.subst(loadsymbolIop)
exec_output += PredOpExecute.subst(loadsymbolIop)
@@ -301,7 +314,7 @@
initparamIop = InstObjParams("initparam", "Initparam", "PredOp",
{ "code": initparamCode,
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(initparamIop)
decoder_output += BasicConstructor.subst(initparamIop)
exec_output += PredOpExecute.subst(initparamIop)
@@ -309,7 +322,7 @@
initparamIop = InstObjParams("initparam", "Initparam64", "PredOp",
{ "code": initparamCode64,
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(initparamIop)
decoder_output += BasicConstructor.subst(initparamIop)
exec_output += PredOpExecute.subst(initparamIop)
@@ -324,7 +337,7 @@
resetstatsIop = InstObjParams("resetstats", "Resetstats", "PredOp",
{ "code": resetstats_code,
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(resetstatsIop)
decoder_output += BasicConstructor.subst(resetstatsIop)
exec_output += PredOpExecute.subst(resetstatsIop)
@@ -332,7 +345,7 @@
resetstatsIop = InstObjParams("resetstats", "Resetstats64", "PredOp",
{ "code": resetstats_code64,
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(resetstatsIop)
decoder_output += BasicConstructor.subst(resetstatsIop)
exec_output += PredOpExecute.subst(resetstatsIop)
@@ -348,7 +361,7 @@
dumpstatsIop = InstObjParams("dumpstats", "Dumpstats", "PredOp",
{ "code": dumpstats_code,
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(dumpstatsIop)
decoder_output += BasicConstructor.subst(dumpstatsIop)
exec_output += PredOpExecute.subst(dumpstatsIop)
@@ -356,7 +369,7 @@
dumpstatsIop = InstObjParams("dumpstats", "Dumpstats64", "PredOp",
{ "code": dumpstats_code64,
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(dumpstatsIop)
decoder_output += BasicConstructor.subst(dumpstatsIop)
exec_output += PredOpExecute.subst(dumpstatsIop)
@@ -372,7 +385,7 @@
dumpresetstatsIop =
InstObjParams("dumpresetstats", "Dumpresetstats", "PredOp",
{ "code": dumpresetstats_code,
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(dumpresetstatsIop)
decoder_output += BasicConstructor.subst(dumpresetstatsIop)
exec_output += PredOpExecute.subst(dumpresetstatsIop)
@@ -380,7 +393,7 @@
dumpresetstatsIop =
InstObjParams("dumpresetstats", "Dumpresetstats64", "PredOp",
{ "code": dumpresetstats_code64,
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(dumpresetstatsIop)
decoder_output += BasicConstructor.subst(dumpresetstatsIop)
exec_output += PredOpExecute.subst(dumpresetstatsIop)
@@ -396,7 +409,8 @@
m5checkpointIop =
InstObjParams("m5checkpoint", "M5checkpoint", "PredOp",
{ "code": m5checkpoint_code,
"predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
+ ["IsNonSpeculative", "IsUnverifiable",
+ "IsPseudo"])
header_output += BasicDeclare.subst(m5checkpointIop)
decoder_output += BasicConstructor.subst(m5checkpointIop)
exec_output += PredOpExecute.subst(m5checkpointIop)
@@ -404,7 +418,8 @@
m5checkpointIop =
InstObjParams("m5checkpoint", "M5checkpoint64", "PredOp",
{ "code": m5checkpoint_code64,
"predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
+ ["IsNonSpeculative", "IsUnverifiable",
+ "IsPseudo"])
header_output += BasicDeclare.subst(m5checkpointIop)
decoder_output += BasicConstructor.subst(m5checkpointIop)
exec_output += PredOpExecute.subst(m5checkpointIop)
@@ -425,7 +440,8 @@
m5readfileIop = InstObjParams("m5readfile", "M5readfile", "PredOp",
{ "code": m5readfileCode,
"predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
+ ["IsNonSpeculative", "IsUnverifiable",
+ "IsPseudo"])
header_output += BasicDeclare.subst(m5readfileIop)
decoder_output += BasicConstructor.subst(m5readfileIop)
exec_output += PredOpExecute.subst(m5readfileIop)
@@ -433,7 +449,8 @@
m5readfileIop = InstObjParams("m5readfile", "M5readfile64", "PredOp",
{ "code": m5readfileCode64,
"predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
+ ["IsNonSpeculative", "IsUnverifiable",
+ "IsPseudo"])
header_output += BasicDeclare.subst(m5readfileIop)
decoder_output += BasicConstructor.subst(m5readfileIop)
exec_output += PredOpExecute.subst(m5readfileIop)
@@ -459,7 +476,7 @@
m5writefileIop = InstObjParams("m5writefile", "M5writefile", "PredOp",
{ "code": m5writefileCode,
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(m5writefileIop)
decoder_output += BasicConstructor.subst(m5writefileIop)
exec_output += PredOpExecute.subst(m5writefileIop)
@@ -467,7 +484,7 @@
m5writefileIop =
InstObjParams("m5writefile", "M5writefile64", "PredOp",
{ "code": m5writefileCode64,
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(m5writefileIop)
decoder_output += BasicConstructor.subst(m5writefileIop)
exec_output += PredOpExecute.subst(m5writefileIop)
@@ -475,7 +492,7 @@
m5breakIop = InstObjParams("m5break", "M5break", "PredOp",
{ "code": "PseudoInst::debugbreak(xc->tcBase());",
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(m5breakIop)
decoder_output += BasicConstructor.subst(m5breakIop)
exec_output += PredOpExecute.subst(m5breakIop)
@@ -483,7 +500,7 @@
m5switchcpuIop = InstObjParams("m5switchcpu", "M5switchcpu", "PredOp",
{ "code": "PseudoInst::switchcpu(xc->tcBase());",
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(m5switchcpuIop)
decoder_output += BasicConstructor.subst(m5switchcpuIop)
exec_output += PredOpExecute.subst(m5switchcpuIop)
@@ -497,7 +514,7 @@
m5addsymbolIop = InstObjParams("m5addsymbol", "M5addsymbol", "PredOp",
{ "code": m5addsymbolCode,
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(m5addsymbolIop)
decoder_output += BasicConstructor.subst(m5addsymbolIop)
exec_output += PredOpExecute.subst(m5addsymbolIop)
@@ -505,7 +522,7 @@
m5addsymbolIop =
InstObjParams("m5addsymbol", "M5addsymbol64", "PredOp",
{ "code": m5addsymbolCode64,
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(m5addsymbolIop)
decoder_output += BasicConstructor.subst(m5addsymbolIop)
exec_output += PredOpExecute.subst(m5addsymbolIop)
@@ -516,7 +533,7 @@
m5panicIop = InstObjParams("m5panic", "M5panic", "PredOp",
{ "code": m5panicCode,
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(m5panicIop)
decoder_output += BasicConstructor.subst(m5panicIop)
exec_output += PredOpExecute.subst(m5panicIop)
@@ -536,7 +553,7 @@
m5workbeginIop = InstObjParams("m5workbegin", "M5workbegin", "PredOp",
{ "code": m5workbeginCode,
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(m5workbeginIop)
decoder_output += BasicConstructor.subst(m5workbeginIop)
exec_output += PredOpExecute.subst(m5workbeginIop)
@@ -544,7 +561,7 @@
m5workbeginIop =
InstObjParams("m5workbegin", "M5workbegin64", "PredOp",
{ "code": m5workbeginCode64,
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(m5workbeginIop)
decoder_output += BasicConstructor.subst(m5workbeginIop)
exec_output += PredOpExecute.subst(m5workbeginIop)
@@ -564,7 +581,7 @@
m5workendIop = InstObjParams("m5workend", "M5workend", "PredOp",
{ "code": m5workendCode,
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(m5workendIop)
decoder_output += BasicConstructor.subst(m5workendIop)
exec_output += PredOpExecute.subst(m5workendIop)
@@ -572,7 +589,7 @@
m5workendIop = InstObjParams("m5workend", "M5workend64", "PredOp",
{ "code": m5workendCode64,
"predicate_test": predicateTest },
- ["IsNonSpeculative"])
+ ["IsNonSpeculative", "IsPseudo"])
header_output += BasicDeclare.subst(m5workendIop)
decoder_output += BasicConstructor.subst(m5workendIop)
exec_output += PredOpExecute.subst(m5workendIop)
diff --git a/src/arch/arm/isa/templates/semihost.isa
b/src/arch/arm/isa/templates/semihost.isa
index 0ad84c8..91539c9 100644
--- a/src/arch/arm/isa/templates/semihost.isa
+++ b/src/arch/arm/isa/templates/semihost.isa
@@ -1,5 +1,5 @@
// -*- mode:c++ -*-
-// Copyright (c) 2018 ARM Limited
+// Copyright (c) 2018, 2020 ARM Limited
// All rights reserved
//
// The license below extends only to copyright in the software and shall
@@ -66,6 +66,10 @@
if (_imm == semihost_imm) {
flags[IsMemBarrier] = true;
}
+ if (_imm == ArmSemihosting::Gem5Imm) {
+ flags[IsMemBarrier] = true;
+ flags[IsPseudo] = true;
+ }
}
}};
@@ -75,10 +79,12 @@
{
%(constructor)s;
- // In AArch64 there is only one instruction for issuing
- // semhosting commands: HLT #0xF000
- if (_imm == 0xF000) {
+ if (_imm == ArmSemihosting::A64Imm) {
flags[IsMemBarrier] = true;
}
+ if (_imm == ArmSemihosting::Gem5Imm) {
+ flags[IsMemBarrier] = true;
+ flags[IsPseudo] = true;
+ }
}
}};
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/30937
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I3b2aa5efe01b6eb2328aad728a21bb826f77c92b
Gerrit-Change-Number: 30937
Gerrit-PatchSet: 1
Gerrit-Owner: Giacomo Travaglini <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s