5 #ifndef V8_COMPILER_BACKEND_CODE_GENERATOR_IMPL_H_ 6 #define V8_COMPILER_BACKEND_CODE_GENERATOR_IMPL_H_ 8 #include "src/code-stubs.h" 9 #include "src/compiler/backend/code-generator.h" 10 #include "src/compiler/backend/instruction.h" 11 #include "src/compiler/linkage.h" 12 #include "src/compiler/opcodes.h" 13 #include "src/macro-assembler.h" 26 : gen_(gen), instr_(instr) {}
30 Register InputRegister(
size_t index) {
31 return ToRegister(instr_->InputAt(index));
35 return ToFloatRegister(instr_->InputAt(index));
39 return ToDoubleRegister(instr_->InputAt(index));
43 return ToSimd128Register(instr_->InputAt(index));
46 double InputDouble(
size_t index) {
return ToDouble(instr_->InputAt(index)); }
48 float InputFloat32(
size_t index) {
return ToFloat32(instr_->InputAt(index)); }
50 int32_t InputInt32(
size_t index) {
51 return ToConstant(instr_->InputAt(index)).ToInt32();
55 return bit_cast<
uint32_t>(InputInt32(index));
58 int64_t InputInt64(
size_t index) {
59 return ToConstant(instr_->InputAt(index)).ToInt64();
62 int8_t InputInt8(
size_t index) {
63 return static_cast<int8_t
>(InputInt32(index));
66 int16_t InputInt16(
size_t index) {
67 return static_cast<int16_t
>(InputInt32(index));
70 uint8_t InputInt3(
size_t index) {
71 return static_cast<uint8_t
>(InputInt32(index) & 0x7);
74 uint8_t InputInt4(
size_t index) {
75 return static_cast<uint8_t
>(InputInt32(index) & 0xF);
78 uint8_t InputInt5(
size_t index) {
79 return static_cast<uint8_t
>(InputInt32(index) & 0x1F);
82 uint8_t InputInt6(
size_t index) {
83 return static_cast<uint8_t
>(InputInt32(index) & 0x3F);
87 return ToExternalReference(instr_->InputAt(index));
91 return ToCode(instr_->InputAt(index));
94 Label* InputLabel(
size_t index) {
return ToLabel(instr_->InputAt(index)); }
97 return ToRpoNumber(instr_->InputAt(index));
100 Register OutputRegister(
size_t index = 0) {
101 return ToRegister(instr_->OutputAt(index));
104 Register TempRegister(
size_t index) {
105 return ToRegister(instr_->TempAt(index));
109 return ToFloatRegister(instr_->Output());
113 return ToDoubleRegister(instr_->Output());
117 return ToSimd128Register(instr_->Output());
123 return gen_->GetLabel(ToRpoNumber(op));
127 return ToConstant(op).ToRpoNumber();
131 return LocationOperand::cast(op)->GetRegister();
135 return LocationOperand::cast(op)->GetFloatRegister();
139 return LocationOperand::cast(op)->GetDoubleRegister();
143 return LocationOperand::cast(op)->GetSimd128Register();
147 if (op->IsImmediate()) {
148 return gen_->code()->GetImmediate(ImmediateOperand::cast(op));
150 return gen_->code()->GetConstant(
151 ConstantOperand::cast(op)->virtual_register());
155 return ToConstant(op).ToFloat64().value();
161 return ToConstant(op).ToExternalReference();
165 return ToConstant(op).ToCode();
168 const Frame* frame()
const {
return gen_->frame(); }
170 return gen_->frame_access_state();
172 Isolate* isolate()
const {
return gen_->isolate(); }
173 Linkage* linkage()
const {
return gen_->linkage(); }
184 : deoptimization_id_(deoptimization_id), pos_(pos) {}
186 int deoptimization_id()
const {
return deoptimization_id_; }
187 Label* label() {
return &label_; }
191 int const deoptimization_id_;
202 virtual void Generate() = 0;
204 Label* entry() {
return &entry_; }
205 Label* exit() {
return &exit_; }
206 const Frame* frame()
const {
return frame_; }
213 const Frame*
const frame_;
218 inline bool HasCallDescriptorFlag(
Instruction* instr,
219 CallDescriptor::Flag flag) {
220 return MiscField::decode(instr->opcode()) & flag;
227 #endif // V8_COMPILER_BACKEND_CODE_GENERATOR_IMPL_H_