Skip to content
Snippets Groups Projects
Commit d0084464 authored by Tom Stellard's avatar Tom Stellard
Browse files

R600/SI: Fix implementation of isInlineConstant() used by the verifier


The type of the immediates should not matter as long as the encoding is
equivalent to the encoding of one of the legal inline constants.

Tested-by: default avatarMichel Dänzer <michel.daenzer@amd.com>
llvm-svn: 204056
parent fbe435de
No related branches found
No related tags found
No related merge requests found
......@@ -349,21 +349,32 @@ bool SIInstrInfo::isSALUInstr(const MachineInstr &MI) const {
}
bool SIInstrInfo::isInlineConstant(const MachineOperand &MO) const {
if(MO.isImm()) {
return MO.getImm() >= -16 && MO.getImm() <= 64;
}
if (MO.isFPImm()) {
return MO.getFPImm()->isExactlyValue(0.0) ||
MO.getFPImm()->isExactlyValue(0.5) ||
MO.getFPImm()->isExactlyValue(-0.5) ||
MO.getFPImm()->isExactlyValue(1.0) ||
MO.getFPImm()->isExactlyValue(-1.0) ||
MO.getFPImm()->isExactlyValue(2.0) ||
MO.getFPImm()->isExactlyValue(-2.0) ||
MO.getFPImm()->isExactlyValue(4.0) ||
MO.getFPImm()->isExactlyValue(-4.0);
union {
int32_t I;
float F;
} Imm;
if (MO.isImm()) {
Imm.I = MO.getImm();
} else if (MO.isFPImm()) {
Imm.F = MO.getFPImm()->getValueAPF().convertToFloat();
} else {
return false;
}
return false;
// The actual type of the operand does not seem to matter as long
// as the bits match one of the inline immediate values. For example:
//
// -nan has the hexadecimal encoding of 0xfffffffe which is -2 in decimal,
// so it is a legal inline immediate.
//
// 1065353216 has the hexadecimal encoding 0x3f800000 which is 1.0f in
// floating-point, so it is a legal inline immediate.
return (Imm.I >= -16 && Imm.I <= 64) ||
Imm.F == 0.0f || Imm.F == 0.5f || Imm.F == -0.5f || Imm.F == 1.0f ||
Imm.F == -1.0f || Imm.F == 2.0f || Imm.F == -2.0f || Imm.F == 4.0f ||
Imm.F == -4.0f;
}
bool SIInstrInfo::isLiteralConstant(const MachineOperand &MO) const {
......
; RUN: llc < %s -march=r600 -mcpu=SI -verify-machineinstrs | FileCheck --check-prefix=SI %s
; SI: @v_cnd_nan
; SI: V_CNDMASK_B32_e64 v{{[0-9]}},
; SI-DAG: v{{[0-9]}}
; SI-DAG: -nan
define void @v_cnd_nan(float addrspace(1)* %out, i32 %c, float %f) {
entry:
%0 = icmp ne i32 %c, 0
%1 = select i1 %0, float 0xFFFFFFFFE0000000, float %f
store float %1, float addrspace(1)* %out
ret void
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment