@@ -43,6 +43,10 @@ static G4_Operand *lscTryPromoteSurfaceImmToExDesc(
43
43
exDesc |= surfaceImm;
44
44
surface = nullptr;
45
45
}
46
+ } else if (addrModel == LSC_ADDR_TYPE_ARG) {
47
+ MUST_BE_TRUE(false, "caller should have fixed this");
48
+ exDesc |= 0xFF << 24;
49
+ surface = nullptr;
46
50
} else {
47
51
// flat address type
48
52
MUST_BE_TRUE(surface->isNullReg() ||
@@ -142,6 +146,34 @@ int IR_Builder::translateLscUntypedInst(
142
146
143
147
const static uint32_t BYTES_PER_REG = COMMON_ISA_GRF_REG_SIZE;
144
148
149
+ if (addrInfo.type == LSC_ADDR_TYPE_ARG) {
150
+ // Translate argument loads to platform specific logic
151
+ MUST_BE_TRUE(addrInfo.size == LSC_ADDR_SIZE_32b,
152
+ "lsc_load... arg[...] must be :a32");
153
+ //
154
+ // (W) and (1) TMP0:ud r0.0:ud 0xFFFFFFC0:ud
155
+ // (W) add (1) TMP1:ud TMP0:ud src0Addr:ud
156
+ // ... load.ugm.a32... bti[255][TMP]
157
+ G4_Declare *argBase = createTempVar(1, Type_UD, Even_Word);
158
+ auto andDst = createDst(argBase->getRegVar(), 0, 0, 1, Type_UD);
159
+ auto andSrc0 = createSrc(getBuiltinR0()->getRegVar(), 0, 0,
160
+ getRegionScalar(),Type_UD);
161
+ auto andSrc1 = createImm(0xFFFFFFC0, Type_UD);
162
+ (void)createBinOp(G4_and, g4::SIMD1,
163
+ andDst, andSrc0, andSrc1, InstOpt_WriteEnable, true);
164
+ auto addDst = createDst(src0Addr->getBase(), src0Addr->getRegOff(),
165
+ src0Addr->getSubRegOff(), 1, Type_UD);
166
+ auto addSrc0 = createSrc(src0Addr->getBase(), src0Addr->getRegOff(),
167
+ src0Addr->getSubRegOff(), src0Addr->getRegion(), src0Addr->getType());
168
+ auto addSrc1 =
169
+ createSrc(argBase->getRegVar(), 0, 0, getRegionScalar(), Type_UD);
170
+ (void)createBinOp(G4_add, g4::SIMD1,
171
+ addDst, addSrc0, addSrc1, InstOpt_WriteEnable, true);
172
+ //
173
+ addrInfo.type = LSC_ADDR_TYPE_BTI;
174
+ surface = createImm(0xFF, Type_UD);
175
+ }
176
+
145
177
// send descriptor
146
178
uint32_t desc = 0;
147
179
uint32_t exDesc = 0;
0 commit comments