@@ -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);
@@ -2282,6 +2283,77 @@ static bool generateBindlessImageINTELInst(const SPIRV::IncomingCall *Call,
22822283 return buildBindlessImageINTELInst (Call, Opcode, MIRBuilder, GR);
22832284}
22842285
2286+ static bool buildAPFixedPointInst (const SPIRV::IncomingCall *Call,
2287+ unsigned Opcode, MachineIRBuilder &MIRBuilder,
2288+ SPIRVGlobalRegistry *GR) {
2289+ MachineRegisterInfo *MRI = MIRBuilder.getMRI ();
2290+ SmallVector<uint32_t , 1 > ImmArgs;
2291+ Register InputReg = Call->Arguments [0 ];
2292+ const Type *RetTy = GR->getTypeForSPIRVType (Call->ReturnType );
2293+ bool IsSRet = RetTy->isVoidTy ();
2294+
2295+ if (IsSRet) {
2296+ const LLT ValTy = MRI->getType (InputReg);
2297+ Register ActualRetValReg = MRI->createGenericVirtualRegister (ValTy);
2298+ SPIRVType *InstructionType =
2299+ GR->getPointeeType (GR->getSPIRVTypeForVReg (InputReg));
2300+ InputReg = Call->Arguments [1 ];
2301+ auto InputType = GR->getTypeForSPIRVType (GR->getSPIRVTypeForVReg (InputReg));
2302+ Register PtrInputReg;
2303+ if (InputType->getTypeID () == llvm::Type::TypeID::TypedPointerTyID) {
2304+ LLT InputLLT = MRI->getType (InputReg);
2305+ PtrInputReg = MRI->createGenericVirtualRegister (InputLLT);
2306+ SPIRVType *PtrType =
2307+ GR->getPointeeType (GR->getSPIRVTypeForVReg (InputReg));
2308+ MachineMemOperand *MMO1 = MIRBuilder.getMF ().getMachineMemOperand (
2309+ MachinePointerInfo (), MachineMemOperand::MOLoad,
2310+ InputLLT.getSizeInBytes (), Align (4 ));
2311+ MIRBuilder.buildLoad (PtrInputReg, InputReg, *MMO1);
2312+ MRI->setRegClass (PtrInputReg, &SPIRV::iIDRegClass);
2313+ GR->assignSPIRVTypeToVReg (PtrType, PtrInputReg, MIRBuilder.getMF ());
2314+ }
2315+
2316+ for (unsigned index = 2 ; index < 7 ; index++) {
2317+ ImmArgs.push_back (getConstFromIntrinsic (Call->Arguments [index], MRI));
2318+ }
2319+
2320+ // Emit the instruction
2321+ auto MIB = MIRBuilder.buildInstr (Opcode)
2322+ .addDef (ActualRetValReg)
2323+ .addUse (GR->getSPIRVTypeID (InstructionType));
2324+ if (PtrInputReg)
2325+ MIB.addUse (PtrInputReg);
2326+ else
2327+ MIB.addUse (InputReg);
2328+
2329+ for (uint32_t Imm : ImmArgs)
2330+ MIB.addImm (Imm);
2331+ unsigned Size = ValTy.getSizeInBytes ();
2332+ // Store result to the pointer passed in Arg[0]
2333+ MachineMemOperand *MMO = MIRBuilder.getMF ().getMachineMemOperand (
2334+ MachinePointerInfo (), MachineMemOperand::MOStore, Size, Align (4 ));
2335+ MRI->setRegClass (ActualRetValReg, &SPIRV::pIDRegClass);
2336+ MIRBuilder.buildStore (ActualRetValReg, Call->Arguments [0 ], *MMO);
2337+ return true ;
2338+ } else {
2339+ for (unsigned index = 1 ; index < 6 ; index++)
2340+ ImmArgs.push_back (getConstFromIntrinsic (Call->Arguments [index], MRI));
2341+
2342+ return buildOpFromWrapper (MIRBuilder, Opcode, Call,
2343+ GR->getSPIRVTypeID (Call->ReturnType ), ImmArgs);
2344+ }
2345+ }
2346+
2347+ static bool generateAPFixedPointInst (const SPIRV::IncomingCall *Call,
2348+ MachineIRBuilder &MIRBuilder,
2349+ SPIRVGlobalRegistry *GR) {
2350+ const SPIRV::DemangledBuiltin *Builtin = Call->Builtin ;
2351+ unsigned Opcode =
2352+ SPIRV::lookupNativeBuiltin (Builtin->Name , Builtin->Set )->Opcode ;
2353+
2354+ return buildAPFixedPointInst (Call, Opcode, MIRBuilder, GR);
2355+ }
2356+
22852357static bool
22862358generateTernaryBitwiseFunctionINTELInst (const SPIRV::IncomingCall *Call,
22872359 MachineIRBuilder &MIRBuilder,
@@ -2875,6 +2947,8 @@ std::optional<bool> lowerBuiltin(const StringRef DemangledCall,
28752947 return generateExtendedBitOpsInst (Call.get (), MIRBuilder, GR);
28762948 case SPIRV::BindlessINTEL:
28772949 return generateBindlessImageINTELInst (Call.get (), MIRBuilder, GR);
2950+ case SPIRV::ArbitraryPrecisionFixedPoint:
2951+ return generateAPFixedPointInst (Call.get (), MIRBuilder, GR);
28782952 case SPIRV::TernaryBitwiseINTEL:
28792953 return generateTernaryBitwiseFunctionINTELInst (Call.get (), MIRBuilder, GR);
28802954 }
0 commit comments