@@ -2113,8 +2113,32 @@ static bool generateSelectInst(const SPIRV::IncomingCall *Call,
2113
2113
static bool generateConstructInst (const SPIRV::IncomingCall *Call,
2114
2114
MachineIRBuilder &MIRBuilder,
2115
2115
SPIRVGlobalRegistry *GR) {
2116
- return buildOpFromWrapper (MIRBuilder, SPIRV::OpCompositeConstruct, Call,
2117
- GR->getSPIRVTypeID (Call->ReturnType ));
2116
+ auto MIB = MIRBuilder.buildInstr (SPIRV::OpCompositeConstruct)
2117
+ .addDef (Call->ReturnRegister )
2118
+ .addUse (GR->getSPIRVTypeID (Call->ReturnType ));
2119
+
2120
+ constexpr unsigned MaxWordCount = UINT16_MAX;
2121
+ const size_t NumElements = Call->Arguments .size ();
2122
+ size_t MaxNumElements = MaxWordCount - 3 ;
2123
+ size_t SPIRVStructNumElements = NumElements;
2124
+
2125
+ if (NumElements > MaxNumElements) {
2126
+ // Do adjustments for continued instructions.
2127
+ SPIRVStructNumElements = MaxNumElements;
2128
+ MaxNumElements = MaxWordCount - 1 ;
2129
+ }
2130
+
2131
+ for (size_t I = 0 ; I < SPIRVStructNumElements; ++I)
2132
+ MIB.addUse (Call->Arguments [I]);
2133
+
2134
+ for (size_t I = SPIRVStructNumElements; I < NumElements;
2135
+ I += MaxNumElements) {
2136
+ auto MIB = MIRBuilder.buildInstr (SPIRV::OpCompositeConstructContinuedINTEL);
2137
+ for (size_t J = I; J < std::min (I + MaxNumElements, NumElements); ++J)
2138
+ MIB.addUse (Call->Arguments [J]);
2139
+ }
2140
+
2141
+ return true ;
2118
2142
}
2119
2143
2120
2144
static bool generateCoopMatrInst (const SPIRV::IncomingCall *Call,
@@ -2230,8 +2254,25 @@ static bool generateSpecConstantInst(const SPIRV::IncomingCall *Call,
2230
2254
auto MIB = MIRBuilder.buildInstr (Opcode)
2231
2255
.addDef (Call->ReturnRegister )
2232
2256
.addUse (GR->getSPIRVTypeID (Call->ReturnType ));
2233
- for (unsigned i = 0 ; i < Call->Arguments .size (); i++)
2234
- MIB.addUse (Call->Arguments [i]);
2257
+
2258
+ constexpr unsigned MaxWordCount = UINT16_MAX;
2259
+ const size_t NumElements = Call->Arguments .size ();
2260
+ size_t MaxNumElements = MaxWordCount - 3 ;
2261
+ size_t SPIRVStructNumElements = NumElements;
2262
+ if (NumElements > MaxNumElements) {
2263
+ SPIRVStructNumElements = MaxNumElements;
2264
+ MaxNumElements = MaxWordCount - 1 ;
2265
+ }
2266
+ for (size_t I = 0 ; I < SPIRVStructNumElements; ++I)
2267
+ MIB.addUse (Call->Arguments [I]);
2268
+
2269
+ for (size_t I = SPIRVStructNumElements; I < NumElements;
2270
+ I += MaxNumElements) {
2271
+ auto MIB =
2272
+ MIRBuilder.buildInstr (SPIRV::OpSpecConstantCompositeContinuedINTEL);
2273
+ for (size_t J = I; J < std::min (I + MaxNumElements, NumElements); ++J)
2274
+ MIB.addUse (Call->Arguments [J]);
2275
+ }
2235
2276
return true ;
2236
2277
}
2237
2278
default :
0 commit comments