#include "mir/MIR.h" #include namespace mir { namespace { const char* kWRegNames[] = { "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30"}; const char* kXRegNames[] = { "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28", "x29", "x30"}; const char* kSRegNames[] = { "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31"}; } // namespace bool IsGPR(ValueType type) { return type == ValueType::I1 || type == ValueType::I32 || type == ValueType::Ptr; } bool IsFPR(ValueType type) { return type == ValueType::F32; } int GetValueSize(ValueType type) { switch (type) { case ValueType::Void: return 0; case ValueType::I1: case ValueType::I32: case ValueType::F32: return 4; case ValueType::Ptr: return 8; } return 0; } int GetValueAlign(ValueType type) { switch (type) { case ValueType::Void: return 1; case ValueType::Ptr: return 8; case ValueType::I1: case ValueType::I32: case ValueType::F32: return 4; } return 1; } const char* GetPhysRegName(PhysReg reg, ValueType type) { if (!reg.IsValid()) { throw std::runtime_error("invalid physical register"); } if (reg.reg_class == RegClass::FPR) { if (reg.index < 0 || reg.index >= 32) { throw std::runtime_error("float register index out of range"); } return kSRegNames[reg.index]; } if (reg.index < 0 || reg.index >= 31) { throw std::runtime_error("gpr register index out of range"); } return type == ValueType::Ptr ? kXRegNames[reg.index] : kWRegNames[reg.index]; } } // namespace mir