From 9b09acee474285c0ee219eea14fb5aa6f48d2b39 Mon Sep 17 00:00:00 2001 From: Merry Date: Mon, 25 Jul 2022 20:58:29 +0100 Subject: [PATCH] oaknut: Implement arranged accessors from DReg and QReg --- externals/oaknut/include/oaknut/impl/reg.hpp | 139 +++++++++++-------- 1 file changed, 80 insertions(+), 59 deletions(-) diff --git a/externals/oaknut/include/oaknut/impl/reg.hpp b/externals/oaknut/include/oaknut/impl/reg.hpp index aad2fd54..0ba88ac4 100644 --- a/externals/oaknut/include/oaknut/impl/reg.hpp +++ b/externals/oaknut/include/oaknut/impl/reg.hpp @@ -200,51 +200,6 @@ private: int m_esize : 8; }; -struct BReg : public VReg { - constexpr explicit BReg(int index_) - : VReg(8, index_) - {} - - template - friend class BasicCodeGenerator; -}; - -struct HReg : public VReg { - constexpr explicit HReg(int index_) - : VReg(16, index_) - {} - - template - friend class BasicCodeGenerator; -}; - -struct SReg : public VReg { - constexpr explicit SReg(int index_) - : VReg(32, index_) - {} - - template - friend class BasicCodeGenerator; -}; - -struct DReg : public VReg { - constexpr explicit DReg(int index_) - : VReg(64, index_) - {} - - template - friend class BasicCodeGenerator; -}; - -struct QReg : public VReg { - constexpr explicit QReg(int index_) - : VReg(128, index_) - {} - - template - friend class BasicCodeGenerator; -}; - struct VReg_8B : public VRegArranged { constexpr explicit VReg_8B(int reg_index_) : VRegArranged(64, reg_index_, 64 / 8) @@ -344,20 +299,6 @@ private: unsigned m_elem_index; }; -template -struct ElemSelector { - constexpr explicit ElemSelector(int reg_index_) - : m_reg_index(reg_index_) - {} - - constexpr int reg_index() const { return m_reg_index; } - - constexpr E operator[](unsigned elem_index) const { return E{m_reg_index, elem_index}; } - -private: - int m_reg_index; -}; - struct BElem : public Elem { constexpr explicit BElem(int reg_, unsigned elem_index_) : Elem(2, reg_, elem_index_) @@ -391,6 +332,86 @@ struct DElem_1 : public DElem { } }; +template +struct ElemSelector { + constexpr explicit ElemSelector(int reg_index_) + : m_reg_index(reg_index_) + {} + + constexpr int reg_index() const { return m_reg_index; } + + constexpr E operator[](unsigned elem_index) const { return E{m_reg_index, elem_index}; } + +private: + int m_reg_index; +}; + +struct BReg : public VReg { + constexpr explicit BReg(int index_) + : VReg(8, index_) + {} + + template + friend class BasicCodeGenerator; +}; + +struct HReg : public VReg { + constexpr explicit HReg(int index_) + : VReg(16, index_) + {} + + template + friend class BasicCodeGenerator; +}; + +struct SReg : public VReg { + constexpr explicit SReg(int index_) + : VReg(32, index_) + {} + + template + friend class BasicCodeGenerator; +}; + +struct DReg : public VReg { + constexpr explicit DReg(int index_) + : VReg(64, index_) + {} + + template + friend class BasicCodeGenerator; + + constexpr ElemSelector Belem() const { return ElemSelector(index()); } + constexpr ElemSelector Helem() const { return ElemSelector(index()); } + constexpr ElemSelector Selem() const { return ElemSelector(index()); } + constexpr ElemSelector Delem() const { return ElemSelector(index()); } + + constexpr VReg_8B B8() const { return VReg_8B{index()}; } + constexpr VReg_4H H4() const { return VReg_4H{index()}; } + constexpr VReg_2S S2() const { return VReg_2S{index()}; } + constexpr VReg_1D D1() const { return VReg_1D{index()}; } +}; + +struct QReg : public VReg { + constexpr explicit QReg(int index_) + : VReg(128, index_) + {} + + template + friend class BasicCodeGenerator; + + constexpr ElemSelector Belem() const { return ElemSelector(index()); } + constexpr ElemSelector Helem() const { return ElemSelector(index()); } + constexpr ElemSelector Selem() const { return ElemSelector(index()); } + constexpr ElemSelector Delem() const { return ElemSelector(index()); } + + constexpr VReg_16B B16() const { return VReg_16B{index()}; } + constexpr VReg_8H H8() const { return VReg_8H{index()}; } + constexpr VReg_4S S4() const { return VReg_4S{index()}; } + constexpr VReg_2D D2() const { return VReg_2D{index()}; } + constexpr VReg_1Q Q1() const { return VReg_1Q{index()}; } +}; + constexpr BReg VReg::toB() const { return BReg{index()};