Skip to content

Commit 325334f

Browse files
committed
[SPIRV] Add sign intrinsic part 1
1 parent 04f6504 commit 325334f

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

llvm/include/llvm/IR/IntrinsicsSPIRV.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,5 @@ let TargetPrefix = "spv" in {
6565
[IntrNoMem, IntrWillReturn] >;
6666
def int_spv_length : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>], [llvm_anyfloat_ty]>;
6767
def int_spv_rsqrt : DefaultAttrsIntrinsic<[LLVMMatchType<0>], [llvm_anyfloat_ty]>;
68+
def int_spv_sign : DefaultAttrsIntrinsic<[LLVMScalarOrSameVectorWidth<0, llvm_i32_ty>], [llvm_any_ty]>;
6869
}

llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "llvm/CodeGen/MachineInstrBuilder.h"
2929
#include "llvm/CodeGen/MachineModuleInfoImpls.h"
3030
#include "llvm/CodeGen/MachineRegisterInfo.h"
31+
#include "llvm/CodeGen/Register.h"
3132
#include "llvm/CodeGen/TargetOpcodes.h"
3233
#include "llvm/IR/IntrinsicsSPIRV.h"
3334
#include "llvm/Support/Debug.h"
@@ -178,6 +179,9 @@ class SPIRVInstructionSelector : public InstructionSelector {
178179
bool selectRsqrt(Register ResVReg, const SPIRVType *ResType,
179180
MachineInstr &I) const;
180181

182+
bool selectSign(Register ResVReg, const SPIRVType *ResType,
183+
MachineInstr &I) const;
184+
181185
void renderImm32(MachineInstrBuilder &MIB, const MachineInstr &I,
182186
int OpIdx) const;
183187
void renderFImm32(MachineInstrBuilder &MIB, const MachineInstr &I,
@@ -1366,6 +1370,52 @@ bool SPIRVInstructionSelector::selectRsqrt(Register ResVReg,
13661370
.constrainAllUses(TII, TRI, RBI);
13671371
}
13681372

1373+
bool SPIRVInstructionSelector::selectSign(Register ResVReg,
1374+
const SPIRVType *ResType,
1375+
MachineInstr &I) const {
1376+
assert(I.getNumOperands() == 3);
1377+
assert(I.getOperand(2).isReg());
1378+
MachineBasicBlock &BB = *I.getParent();
1379+
Register InputRegister = I.getOperand(2).getReg();
1380+
SPIRVType *InputType = GR.getSPIRVTypeForVReg(InputRegister);
1381+
auto &DL = I.getDebugLoc();
1382+
1383+
if (!InputType)
1384+
report_fatal_error("Input Type could not be determined.");
1385+
1386+
bool IsFloatTy = GR.isScalarOrVectorOfType(InputRegister, SPIRV::OpTypeFloat);
1387+
1388+
unsigned SignBitWidth = GR.getScalarOrVectorBitWidth(InputType);
1389+
unsigned ResBitWidth = GR.getScalarOrVectorBitWidth(ResType);
1390+
1391+
bool NeedsConversion = IsFloatTy || SignBitWidth != ResBitWidth;
1392+
1393+
auto SignOpcode = IsFloatTy ? GL::FSign : GL::SSign;
1394+
Register SignReg = NeedsConversion
1395+
? MRI->createVirtualRegister(&SPIRV::IDRegClass)
1396+
: ResVReg;
1397+
1398+
bool Result =
1399+
BuildMI(BB, I, DL, TII.get(SPIRV::OpExtInst))
1400+
.addDef(SignReg)
1401+
.addUse(GR.getSPIRVTypeID(InputType))
1402+
.addImm(static_cast<uint32_t>(SPIRV::InstructionSet::GLSL_std_450))
1403+
.addImm(SignOpcode)
1404+
.addUse(InputRegister)
1405+
.constrainAllUses(TII, TRI, RBI);
1406+
1407+
if (NeedsConversion) {
1408+
auto ConvertOpcode = IsFloatTy ? SPIRV::OpConvertFToS : SPIRV::OpSConvert;
1409+
Result |= BuildMI(*I.getParent(), I, DL, TII.get(ConvertOpcode))
1410+
.addDef(ResVReg)
1411+
.addUse(GR.getSPIRVTypeID(ResType))
1412+
.addUse(SignReg)
1413+
.constrainAllUses(TII, TRI, RBI);
1414+
}
1415+
1416+
return Result;
1417+
}
1418+
13691419
bool SPIRVInstructionSelector::selectBitreverse(Register ResVReg,
13701420
const SPIRVType *ResType,
13711421
MachineInstr &I) const {
@@ -2082,6 +2132,8 @@ bool SPIRVInstructionSelector::selectIntrinsic(Register ResVReg,
20822132
return selectFrac(ResVReg, ResType, I);
20832133
case Intrinsic::spv_rsqrt:
20842134
return selectRsqrt(ResVReg, ResType, I);
2135+
case Intrinsic::spv_sign:
2136+
return selectSign(ResVReg, ResType, I);
20852137
case Intrinsic::spv_lifetime_start:
20862138
case Intrinsic::spv_lifetime_end: {
20872139
unsigned Op = IID == Intrinsic::spv_lifetime_start ? SPIRV::OpLifetimeStart

0 commit comments

Comments
 (0)