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

Reply via email to