X86: Don't read in dest regs if all bits are replaced.
[gem5.git] / src / arch / x86 / isa / formats / basic.isa
1 // Copyright (c) 2007 The Hewlett-Packard Development Company
2 // All rights reserved.
3 //
4 // The license below extends only to copyright in the software and shall
5 // not be construed as granting a license to any other intellectual
6 // property including but not limited to intellectual property relating
7 // to a hardware implementation of the functionality of the software
8 // licensed hereunder. You may use the software subject to the license
9 // terms below provided that you ensure that this notice is replicated
10 // unmodified and in its entirety in all distributions of the software,
11 // modified or unmodified, in source code or in binary form.
12 //
13 // Copyright (c) 2007 The Regents of The University of Michigan
14 // All rights reserved.
15 //
16 // Redistribution and use in source and binary forms, with or without
17 // modification, are permitted provided that the following conditions are
18 // met: redistributions of source code must retain the above copyright
19 // notice, this list of conditions and the following disclaimer;
20 // redistributions in binary form must reproduce the above copyright
21 // notice, this list of conditions and the following disclaimer in the
22 // documentation and/or other materials provided with the distribution;
23 // neither the name of the copyright holders nor the names of its
24 // contributors may be used to endorse or promote products derived from
25 // this software without specific prior written permission.
26 //
27 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
31 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
32 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
33 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 //
39 // Authors: Gabe Black
40
41 // Declarations for execute() methods.
42 def template BasicExecDeclare {{
43 Fault execute(%(CPU_exec_context)s *, Trace::InstRecord *) const;
44 }};
45
46 // Definitions of execute methods that panic.
47 def template BasicExecPanic {{
48 Fault execute(%(CPU_exec_context)s *, Trace::InstRecord *) const
49 {
50 panic("Execute method called when it shouldn't!");
51 M5_DUMMY_RETURN
52 }
53 }};
54
55 // Basic instruction class declaration template.
56 def template BasicDeclare {{
57 /**
58 * Static instruction class for "%(mnemonic)s".
59 */
60 class %(class_name)s : public %(base_class)s
61 {
62 public:
63 // Constructor.
64 %(class_name)s(ExtMachInst machInst);
65 %(BasicExecDeclare)s
66 };
67 }};
68
69 // Basic instruction class constructor template.
70 def template BasicConstructor {{
71 inline %(class_name)s::%(class_name)s(ExtMachInst machInst)
72 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s)
73 {
74 %(constructor)s;
75 }
76 }};
77
78 // Basic instruction class execute method template.
79 def template BasicExecute {{
80 Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
81 Trace::InstRecord *traceData) const
82 {
83 Fault fault = NoFault;
84
85 %(fp_enable_check)s;
86 %(op_decl)s;
87 %(op_rd)s;
88 %(code)s;
89
90 if(fault == NoFault)
91 {
92 %(op_wb)s;
93 }
94 return fault;
95 }
96 }};
97
98 // Basic decode template.
99 def template BasicDecode {{
100 return new %(class_name)s(machInst);
101 }};
102
103 // Basic decode template, passing mnemonic in as string arg to constructor.
104 def template BasicDecodeWithMnemonic {{
105 return new %(class_name)s("%(mnemonic)s", machInst);
106 }};
107
108 def format BasicOperate(code, *flags) {{
109 iop = InstObjParams(name, Name, 'X86ISA::X86StaticInst', code, flags)
110 header_output = BasicDeclare.subst(iop)
111 decoder_output = BasicConstructor.subst(iop)
112 decode_block = BasicDecode.subst(iop)
113 exec_output = BasicExecute.subst(iop)
114 }};