summaryrefslogtreecommitdiffstats
path: root/tester/covoar/Target_m68k.cc
blob: 7c761be6aaa27891009bb8d122b37c51243295cd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*! @file Target_m68k.cc
 *  @brief Target_m68k 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_m68k.h"
#include "qemu-traces.h"

namespace Target {

  Target_m68k::Target_m68k( std::string targetName ):
    TargetBase( targetName )
  {
    conditionalBranchInstructions.push_back("bcc");
    conditionalBranchInstructions.push_back("bccs");
    conditionalBranchInstructions.push_back("bccl");
    conditionalBranchInstructions.push_back("bcs");
    conditionalBranchInstructions.push_back("bcss");
    conditionalBranchInstructions.push_back("bcsl");
    conditionalBranchInstructions.push_back("beq");
    conditionalBranchInstructions.push_back("beqs");
    conditionalBranchInstructions.push_back("beql");
    conditionalBranchInstructions.push_back("bge");
    conditionalBranchInstructions.push_back("bges");
    conditionalBranchInstructions.push_back("bgel");
    conditionalBranchInstructions.push_back("bgt");
    conditionalBranchInstructions.push_back("bgts");
    conditionalBranchInstructions.push_back("bgtl");
    conditionalBranchInstructions.push_back("bhi");
    conditionalBranchInstructions.push_back("bhis");
    conditionalBranchInstructions.push_back("bhil");
    conditionalBranchInstructions.push_back("bhs");
    conditionalBranchInstructions.push_back("bhss");
    conditionalBranchInstructions.push_back("bhsl");
    conditionalBranchInstructions.push_back("ble");
    conditionalBranchInstructions.push_back("bles");
    conditionalBranchInstructions.push_back("blel");
    conditionalBranchInstructions.push_back("blo");
    conditionalBranchInstructions.push_back("blos");
    conditionalBranchInstructions.push_back("blol");
    conditionalBranchInstructions.push_back("bls");
    conditionalBranchInstructions.push_back("blss");
    conditionalBranchInstructions.push_back("blsl");
    conditionalBranchInstructions.push_back("blt");
    conditionalBranchInstructions.push_back("blts");
    conditionalBranchInstructions.push_back("bltl");
    conditionalBranchInstructions.push_back("bmi");
    conditionalBranchInstructions.push_back("bmis");
    conditionalBranchInstructions.push_back("bmil");
    conditionalBranchInstructions.push_back("bne");
    conditionalBranchInstructions.push_back("bnes");
    conditionalBranchInstructions.push_back("bnel");
    conditionalBranchInstructions.push_back("bpl");
    conditionalBranchInstructions.push_back("bpls");
    conditionalBranchInstructions.push_back("bpll");
    conditionalBranchInstructions.push_back("bvc");
    conditionalBranchInstructions.push_back("bvcs");
    conditionalBranchInstructions.push_back("bvcl");
    conditionalBranchInstructions.push_back("bvs");
    conditionalBranchInstructions.push_back("bvss");
    conditionalBranchInstructions.push_back("bvsl");

    conditionalBranchInstructions.sort();

  }

  Target_m68k::~Target_m68k()
  {
  }

  bool Target_m68k::isNopLine(
    const std::string& line,
    int&               size
  )
  {
    size_t stringLen = line.length();

    if ( line.substr( stringLen - 3 ) == "nop" ) {
      size = 2;
      return true;
    }

    #define GNU_LD_FILLS_ALIGNMENT_WITH_RTS
    #if defined(GNU_LD_FILLS_ALIGNMENT_WITH_RTS)
      // Until binutils 2.20, binutils would fill with rts not nop
      if ( line.substr( stringLen - 3 ) == "rts" ) {
        size = 4;
        return true;
      }
    #endif

    return false;
  }

  bool Target_m68k::isBranch(
      const std::string& instruction
  )
  {
    throw rld::error(
      "DETERMINE BRANCH INSTRUCTIONS FOR THIS ARCHITECTURE! -- fix me",
      "Target_m68k::isBranch"
    );
  }

  uint8_t Target_m68k::qemuTakenBit(void)
  {
    return TRACE_OP_BR1;
  }

  uint8_t Target_m68k::qemuNotTakenBit(void)
  {
    return TRACE_OP_BR0;
  }

  TargetBase *Target_m68k_Constructor(
    std::string          targetName
  )
  {
    return new Target_m68k( targetName );
  }

}