From b10de4c1d8fc495b042632d8122b957d5ca09af0 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Mon, 30 Nov 2020 14:46:54 +0000 Subject: aco: allow 64-bit literals if they can be sign/zero-extended from 32-bit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rhys Perry Reviewed-by: Daniel Schürmann Part-of: --- src/amd/compiler/aco_ir.h | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/amd/compiler/aco_ir.h b/src/amd/compiler/aco_ir.h index d6e936c6caa..0b313ca0dfb 100644 --- a/src/amd/compiler/aco_ir.h +++ b/src/amd/compiler/aco_ir.h @@ -421,7 +421,7 @@ public: constexpr Operand() : reg_(PhysReg{128}), isTemp_(false), isFixed_(true), isConstant_(false), isKill_(false), isUndef_(true), isFirstKill_(false), constSize(0), - isLateKill_(false), is16bit_(false), is24bit_(false) {} + isLateKill_(false), is16bit_(false), is24bit_(false), signext(false) {} explicit Operand(Temp r) noexcept { @@ -538,8 +538,10 @@ public: data_.i = 0xc0800000; setFixed(PhysReg{247}); } else { /* Literal Constant: we don't know if it is a long or double.*/ - isConstant_ = 0; - assert(false && "attempt to create a 64-bit literal constant"); + signext = v >> 63; + data_.i = v & 0xffffffffu; + setFixed(PhysReg{255}); + assert(constantValue64() == v && "attempt to create a unrepresentable 64-bit literal constant"); } }; explicit Operand(RegClass type) noexcept @@ -667,6 +669,8 @@ public: return 0x4010000000000000; case 247: return 0xC010000000000000; + case 255: + return (signext && (data_.i & 0x80000000u) ? 0xffffffff00000000ull : 0ull) | data_.i; } unreachable("invalid register for 64-bit constant"); } else { @@ -785,6 +789,7 @@ private: uint8_t isLateKill_:1; uint8_t is16bit_:1; uint8_t is24bit_:1; + uint8_t signext:1; }; /* can't initialize bit-fields in c++11, so work around using a union */ uint16_t control_ = 0; -- cgit v1.2.3