@@ -697,7 +697,8 @@ static bool buildAtomicStoreInst(const SPIRV::IncomingCall *Call,
697697 MachineIRBuilder &MIRBuilder,
698698 SPIRVGlobalRegistry *GR) {
699699 if (Call->isSpirvOp ())
700- return buildOpFromWrapper (MIRBuilder, SPIRV::OpAtomicStore, Call, Register (0 ));
700+ return buildOpFromWrapper (MIRBuilder, SPIRV::OpAtomicStore, Call,
701+ Register (0 ));
701702
702703 Register ScopeRegister =
703704 buildConstantIntReg32 (SPIRV::Scope::Device, MIRBuilder, GR);
@@ -2307,6 +2308,77 @@ static bool generateBindlessImageINTELInst(const SPIRV::IncomingCall *Call,
23072308 return buildBindlessImageINTELInst (Call, Opcode, MIRBuilder, GR);
23082309}
23092310
2311+ static bool buildAPFixedPointInst (const SPIRV::IncomingCall *Call,
2312+ unsigned Opcode, MachineIRBuilder &MIRBuilder,
2313+ SPIRVGlobalRegistry *GR) {
2314+ MachineRegisterInfo *MRI = MIRBuilder.getMRI ();
2315+ SmallVector<uint32_t , 1 > ImmArgs;
2316+ Register InputReg = Call->Arguments [0 ];
2317+ const Type *RetTy = GR->getTypeForSPIRVType (Call->ReturnType );
2318+ bool IsSRet = RetTy->isVoidTy ();
2319+
2320+ if (IsSRet) {
2321+ const LLT ValTy = MRI->getType (InputReg);
2322+ Register ActualRetValReg = MRI->createGenericVirtualRegister (ValTy);
2323+ SPIRVType *InstructionType =
2324+ GR->getPointeeType (GR->getSPIRVTypeForVReg (InputReg));
2325+ InputReg = Call->Arguments [1 ];
2326+ auto InputType = GR->getTypeForSPIRVType (GR->getSPIRVTypeForVReg (InputReg));
2327+ Register PtrInputReg;
2328+ if (InputType->getTypeID () == llvm::Type::TypeID::TypedPointerTyID) {
2329+ LLT InputLLT = MRI->getType (InputReg);
2330+ PtrInputReg = MRI->createGenericVirtualRegister (InputLLT);
2331+ SPIRVType *PtrType =
2332+ GR->getPointeeType (GR->getSPIRVTypeForVReg (InputReg));
2333+ MachineMemOperand *MMO1 = MIRBuilder.getMF ().getMachineMemOperand (
2334+ MachinePointerInfo (), MachineMemOperand::MOLoad,
2335+ InputLLT.getSizeInBytes (), Align (4 ));
2336+ MIRBuilder.buildLoad (PtrInputReg, InputReg, *MMO1);
2337+ MRI->setRegClass (PtrInputReg, &SPIRV::iIDRegClass);
2338+ GR->assignSPIRVTypeToVReg (PtrType, PtrInputReg, MIRBuilder.getMF ());
2339+ }
2340+
2341+ for (unsigned index = 2 ; index < 7 ; index++) {
2342+ ImmArgs.push_back (getConstFromIntrinsic (Call->Arguments [index], MRI));
2343+ }
2344+
2345+ // Emit the instruction
2346+ auto MIB = MIRBuilder.buildInstr (Opcode)
2347+ .addDef (ActualRetValReg)
2348+ .addUse (GR->getSPIRVTypeID (InstructionType));
2349+ if (PtrInputReg)
2350+ MIB.addUse (PtrInputReg);
2351+ else
2352+ MIB.addUse (InputReg);
2353+
2354+ for (uint32_t Imm : ImmArgs)
2355+ MIB.addImm (Imm);
2356+ unsigned Size = ValTy.getSizeInBytes ();
2357+ // Store result to the pointer passed in Arg[0]
2358+ MachineMemOperand *MMO = MIRBuilder.getMF ().getMachineMemOperand (
2359+ MachinePointerInfo (), MachineMemOperand::MOStore, Size, Align (4 ));
2360+ MRI->setRegClass (ActualRetValReg, &SPIRV::pIDRegClass);
2361+ MIRBuilder.buildStore (ActualRetValReg, Call->Arguments [0 ], *MMO);
2362+ return true ;
2363+ } else {
2364+ for (unsigned index = 1 ; index < 6 ; index++)
2365+ ImmArgs.push_back (getConstFromIntrinsic (Call->Arguments [index], MRI));
2366+
2367+ return buildOpFromWrapper (MIRBuilder, Opcode, Call,
2368+ GR->getSPIRVTypeID (Call->ReturnType ), ImmArgs);
2369+ }
2370+ }
2371+
2372+ static bool generateAPFixedPointInst (const SPIRV::IncomingCall *Call,
2373+ MachineIRBuilder &MIRBuilder,
2374+ SPIRVGlobalRegistry *GR) {
2375+ const SPIRV::DemangledBuiltin *Builtin = Call->Builtin ;
2376+ unsigned Opcode =
2377+ SPIRV::lookupNativeBuiltin (Builtin->Name , Builtin->Set )->Opcode ;
2378+
2379+ return buildAPFixedPointInst (Call, Opcode, MIRBuilder, GR);
2380+ }
2381+
23102382static bool
23112383generateTernaryBitwiseFunctionINTELInst (const SPIRV::IncomingCall *Call,
23122384 MachineIRBuilder &MIRBuilder,
@@ -2900,6 +2972,8 @@ std::optional<bool> lowerBuiltin(const StringRef DemangledCall,
29002972 return generateExtendedBitOpsInst (Call.get (), MIRBuilder, GR);
29012973 case SPIRV::BindlessINTEL:
29022974 return generateBindlessImageINTELInst (Call.get (), MIRBuilder, GR);
2975+ case SPIRV::ArbitraryPrecisionFixedPoint:
2976+ return generateAPFixedPointInst (Call.get (), MIRBuilder, GR);
29032977 case SPIRV::TernaryBitwiseINTEL:
29042978 return generateTernaryBitwiseFunctionINTELInst (Call.get (), MIRBuilder, GR);
29052979 }
0 commit comments