OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 19 matching lines...) Expand all Loading... |
30 #if V8_TARGET_ARCH_A64 | 30 #if V8_TARGET_ARCH_A64 |
31 | 31 |
32 #include "globals.h" | 32 #include "globals.h" |
33 #include "utils.h" | 33 #include "utils.h" |
34 #include "a64/decoder-a64.h" | 34 #include "a64/decoder-a64.h" |
35 | 35 |
36 | 36 |
37 namespace v8 { | 37 namespace v8 { |
38 namespace internal { | 38 namespace internal { |
39 | 39 |
| 40 |
| 41 void DispatchingDecoderVisitor::AppendVisitor(DecoderVisitor* new_visitor) { |
| 42 visitors_.remove(new_visitor); |
| 43 visitors_.push_front(new_visitor); |
| 44 } |
| 45 |
| 46 |
| 47 void DispatchingDecoderVisitor::PrependVisitor(DecoderVisitor* new_visitor) { |
| 48 visitors_.remove(new_visitor); |
| 49 visitors_.push_back(new_visitor); |
| 50 } |
| 51 |
| 52 |
| 53 void DispatchingDecoderVisitor::InsertVisitorBefore( |
| 54 DecoderVisitor* new_visitor, DecoderVisitor* registered_visitor) { |
| 55 visitors_.remove(new_visitor); |
| 56 std::list<DecoderVisitor*>::iterator it; |
| 57 for (it = visitors_.begin(); it != visitors_.end(); it++) { |
| 58 if (*it == registered_visitor) { |
| 59 visitors_.insert(it, new_visitor); |
| 60 return; |
| 61 } |
| 62 } |
| 63 // We reached the end of the list. The last element must be |
| 64 // registered_visitor. |
| 65 ASSERT(*it == registered_visitor); |
| 66 visitors_.insert(it, new_visitor); |
| 67 } |
| 68 |
| 69 |
| 70 void DispatchingDecoderVisitor::InsertVisitorAfter( |
| 71 DecoderVisitor* new_visitor, DecoderVisitor* registered_visitor) { |
| 72 visitors_.remove(new_visitor); |
| 73 std::list<DecoderVisitor*>::iterator it; |
| 74 for (it = visitors_.begin(); it != visitors_.end(); it++) { |
| 75 if (*it == registered_visitor) { |
| 76 it++; |
| 77 visitors_.insert(it, new_visitor); |
| 78 return; |
| 79 } |
| 80 } |
| 81 // We reached the end of the list. The last element must be |
| 82 // registered_visitor. |
| 83 ASSERT(*it == registered_visitor); |
| 84 visitors_.push_back(new_visitor); |
| 85 } |
| 86 |
| 87 |
| 88 void DispatchingDecoderVisitor::RemoveVisitor(DecoderVisitor* visitor) { |
| 89 visitors_.remove(visitor); |
| 90 } |
| 91 |
| 92 |
| 93 #define DEFINE_VISITOR_CALLERS(A) \ |
| 94 void DispatchingDecoderVisitor::Visit##A(Instruction* instr) { \ |
| 95 if (!(instr->Mask(A##FMask) == A##Fixed)) { \ |
| 96 ASSERT(instr->Mask(A##FMask) == A##Fixed); \ |
| 97 } \ |
| 98 std::list<DecoderVisitor*>::iterator it; \ |
| 99 for (it = visitors_.begin(); it != visitors_.end(); it++) { \ |
| 100 (*it)->Visit##A(instr); \ |
| 101 } \ |
| 102 } |
| 103 VISITOR_LIST(DEFINE_VISITOR_CALLERS) |
| 104 #undef DEFINE_VISITOR_CALLERS |
| 105 |
| 106 |
40 // Top-level instruction decode function. | 107 // Top-level instruction decode function. |
41 void Decoder::Decode(Instruction *instr) { | 108 void Decoder::Decode(Instruction *instr) { |
42 if (instr->Bits(28, 27) == 0) { | 109 if (instr->Bits(28, 27) == 0) { |
43 VisitUnallocated(instr); | 110 VisitUnallocated(instr); |
44 } else { | 111 } else { |
45 switch (instr->Bits(27, 24)) { | 112 switch (instr->Bits(27, 24)) { |
46 // 0: PC relative addressing. | 113 // 0: PC relative addressing. |
47 case 0x0: DecodePCRelAddressing(instr); break; | 114 case 0x0: DecodePCRelAddressing(instr); break; |
48 | 115 |
49 // 1: Add/sub immediate. | 116 // 1: Add/sub immediate. |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 // Advanced SIMD. | 176 // Advanced SIMD. |
110 // F: FP data processing 3 source. | 177 // F: FP data processing 3 source. |
111 // Advanced SIMD. | 178 // Advanced SIMD. |
112 case 0xE: | 179 case 0xE: |
113 case 0xF: DecodeFP(instr); break; | 180 case 0xF: DecodeFP(instr); break; |
114 } | 181 } |
115 } | 182 } |
116 } | 183 } |
117 | 184 |
118 | 185 |
119 void Decoder::AppendVisitor(DecoderVisitor* new_visitor) { | |
120 visitors_.remove(new_visitor); | |
121 visitors_.push_front(new_visitor); | |
122 } | |
123 | |
124 | |
125 void Decoder::PrependVisitor(DecoderVisitor* new_visitor) { | |
126 visitors_.remove(new_visitor); | |
127 visitors_.push_back(new_visitor); | |
128 } | |
129 | |
130 | |
131 void Decoder::InsertVisitorBefore(DecoderVisitor* new_visitor, | |
132 DecoderVisitor* registered_visitor) { | |
133 visitors_.remove(new_visitor); | |
134 std::list<DecoderVisitor*>::iterator it; | |
135 for (it = visitors_.begin(); it != visitors_.end(); it++) { | |
136 if (*it == registered_visitor) { | |
137 visitors_.insert(it, new_visitor); | |
138 return; | |
139 } | |
140 } | |
141 // We reached the end of the list. The last element must be | |
142 // registered_visitor. | |
143 ASSERT(*it == registered_visitor); | |
144 visitors_.insert(it, new_visitor); | |
145 } | |
146 | |
147 | |
148 void Decoder::InsertVisitorAfter(DecoderVisitor* new_visitor, | |
149 DecoderVisitor* registered_visitor) { | |
150 visitors_.remove(new_visitor); | |
151 std::list<DecoderVisitor*>::iterator it; | |
152 for (it = visitors_.begin(); it != visitors_.end(); it++) { | |
153 if (*it == registered_visitor) { | |
154 it++; | |
155 visitors_.insert(it, new_visitor); | |
156 return; | |
157 } | |
158 } | |
159 // We reached the end of the list. The last element must be | |
160 // registered_visitor. | |
161 ASSERT(*it == registered_visitor); | |
162 visitors_.push_back(new_visitor); | |
163 } | |
164 | |
165 | |
166 void Decoder::RemoveVisitor(DecoderVisitor* visitor) { | |
167 visitors_.remove(visitor); | |
168 } | |
169 | |
170 | |
171 void Decoder::DecodePCRelAddressing(Instruction* instr) { | 186 void Decoder::DecodePCRelAddressing(Instruction* instr) { |
172 ASSERT(instr->Bits(27, 24) == 0x0); | 187 ASSERT(instr->Bits(27, 24) == 0x0); |
173 // We know bit 28 is set, as <b28:b27> = 0 is filtered out at the top level | 188 // We know bit 28 is set, as <b28:b27> = 0 is filtered out at the top level |
174 // decode. | 189 // decode. |
175 ASSERT(instr->Bit(28) == 0x1); | 190 ASSERT(instr->Bit(28) == 0x1); |
176 VisitPCRelAddressing(instr); | 191 VisitPCRelAddressing(instr); |
177 } | 192 } |
178 | 193 |
179 | 194 |
180 void Decoder::DecodeBranchSystemException(Instruction* instr) { | 195 void Decoder::DecodeBranchSystemException(Instruction* instr) { |
(...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
700 } | 715 } |
701 | 716 |
702 | 717 |
703 void Decoder::DecodeAdvSIMDDataProcessing(Instruction* instr) { | 718 void Decoder::DecodeAdvSIMDDataProcessing(Instruction* instr) { |
704 // TODO(all): Implement Advanced SIMD data processing instruction decode. | 719 // TODO(all): Implement Advanced SIMD data processing instruction decode. |
705 ASSERT(instr->Bits(27, 25) == 0x7); | 720 ASSERT(instr->Bits(27, 25) == 0x7); |
706 VisitUnimplemented(instr); | 721 VisitUnimplemented(instr); |
707 } | 722 } |
708 | 723 |
709 | 724 |
710 #define DEFINE_VISITOR_CALLERS(A) \ | |
711 void Decoder::Visit##A(Instruction *instr) { \ | |
712 if (!(instr->Mask(A##FMask) == A##Fixed)) { \ | |
713 ASSERT(instr->Mask(A##FMask) == A##Fixed); \ | |
714 } \ | |
715 std::list<DecoderVisitor*>::iterator it; \ | |
716 for (it = visitors_.begin(); it != visitors_.end(); it++) { \ | |
717 (*it)->Visit##A(instr); \ | |
718 } \ | |
719 } | |
720 VISITOR_LIST(DEFINE_VISITOR_CALLERS) | |
721 #undef DEFINE_VISITOR_CALLERS | |
722 | |
723 | |
724 } } // namespace v8::internal | 725 } } // namespace v8::internal |
725 | 726 |
726 #endif // V8_TARGET_ARCH_A64 | 727 #endif // V8_TARGET_ARCH_A64 |
OLD | NEW |