summaryrefslogtreecommitdiffstats
path: root/tester/covoar/Target_aarch64.cc
diff options
context:
space:
mode:
authorAlex White <alex.white@oarcorp.com>2021-02-24 15:53:22 -0600
committerJoel Sherrill <joel@rtems.org>2021-03-30 13:15:57 -0500
commitd9454cae2abe34a189f5956f93f8fb47c4a04834 (patch)
tree48030163aea7e6f93a7ca5c4081f467c6721b510 /tester/covoar/Target_aarch64.cc
parentcovoar/TargetBase: Rename branchInstructions to conditionalBranchInstructions (diff)
downloadrtems-tools-d9454cae2abe34a189f5956f93f8fb47c4a04834.tar.bz2
covoar: Add aarch64 target
Diffstat (limited to 'tester/covoar/Target_aarch64.cc')
-rw-r--r--tester/covoar/Target_aarch64.cc100
1 files changed, 100 insertions, 0 deletions
diff --git a/tester/covoar/Target_aarch64.cc b/tester/covoar/Target_aarch64.cc
new file mode 100644
index 0000000..64472d6
--- /dev/null
+++ b/tester/covoar/Target_aarch64.cc
@@ -0,0 +1,100 @@
+/*! @file Target_aarch64.cc
+ * @brief Target_aarch64 Implementation
+ *
+ * This file contains the implementation of the base class for
+ * functions supporting target unique functionallity.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <rld.h>
+
+#include "Target_aarch64.h"
+
+namespace Target {
+
+ Target_aarch64::Target_aarch64( std::string targetName ):
+ TargetBase( targetName )
+ {
+ conditionalBranchInstructions.push_back("cbnz");
+ conditionalBranchInstructions.push_back("cbz");
+ conditionalBranchInstructions.push_back("tbnz");
+ conditionalBranchInstructions.push_back("tbz");
+ conditionalBranchInstructions.push_back("b.eq");
+ conditionalBranchInstructions.push_back("b.ne");
+ conditionalBranchInstructions.push_back("b.cs");
+ conditionalBranchInstructions.push_back("b.hs");
+ conditionalBranchInstructions.push_back("b.cc");
+ conditionalBranchInstructions.push_back("b.lo");
+ conditionalBranchInstructions.push_back("b.mi");
+ conditionalBranchInstructions.push_back("b.pl");
+ conditionalBranchInstructions.push_back("b.vs");
+ conditionalBranchInstructions.push_back("b.vc");
+ conditionalBranchInstructions.push_back("b.hi");
+ conditionalBranchInstructions.push_back("b.ls");
+ conditionalBranchInstructions.push_back("b.ge");
+ conditionalBranchInstructions.push_back("b.lt");
+ conditionalBranchInstructions.push_back("b.gt");
+ conditionalBranchInstructions.push_back("b.le");
+
+ conditionalBranchInstructions.sort();
+ }
+
+ Target_aarch64::~Target_aarch64()
+ {
+ }
+
+ bool Target_aarch64::isNopLine(
+ const char* const line,
+ int& size
+ )
+ {
+ if (!strcmp( &line[strlen(line)-3], "nop")) {
+ size = 4;
+ return true;
+ }
+
+ if (!strncmp( &line[strlen(line)-6], "udf", 3)) {
+ size = 4;
+ return true;
+ }
+
+ // On ARM, there are literal tables at the end of methods.
+ // We need to avoid them.
+ if (!strncmp( &line[strlen(line)-10], ".byte", 5)) {
+ size = 1;
+ return true;
+ }
+ if (!strncmp( &line[strlen(line)-13], ".short", 6)) {
+ size = 2;
+ return true;
+ }
+ if (!strncmp( &line[strlen(line)-16], ".word", 5)) {
+ size = 4;
+ return true;
+ }
+
+ return false;
+ }
+
+ bool Target_aarch64::isBranch(
+ const char* instruction
+ )
+ {
+ throw rld::error(
+ "DETERMINE BRANCH INSTRUCTIONS FOR THIS ARCHITECTURE! -- fix me",
+ "Target_aarch64::isBranch"
+ );
+ }
+
+ TargetBase *Target_aarch64_Constructor(
+ std::string targetName
+ )
+ {
+ return new Target_aarch64( targetName );
+ }
+
+}