|
15 | 15 |
|
16 | 16 | include "AIEBaseInstrPatterns.td"
|
17 | 17 |
|
| 18 | + |
18 | 19 | // Placeholder for a bare frameindex. This pseudo represents the
|
19 | 20 | // pointer register to be allocated, initialized with the address
|
20 | 21 | // represented by the frameindex in its only operand.
|
@@ -1257,26 +1258,52 @@ defm : Extract_512<i64, v8i64, (i32 c6u:$idx), VEXTRACT_64_vec_extract_imm_vaddS
|
1257 | 1258 | // instruction. Modes 0, 2, and 4 correspond to the deinterleaved operation of
|
1258 | 1259 | // 1, 2, and 4 bytes respectively on the concatenated src0 and src1 input
|
1259 | 1260 | // vectors of the VSHUFFLE instruction.
|
1260 |
| -class Trunc1024Pat<ValueType DstTy, ValueType SrcTy, Instruction ShuffleInstOpc, int Mode> : |
| 1261 | + |
| 1262 | +// | 1024-bits -> 512-bits | 512-bits -> 256-bits | 1024-bits -> 256-bits | |
| 1263 | +// +=======================+=======================+=======================| |
| 1264 | +// | v16i64 -> v16i32 | v8i32 -> v8i16 | v16i64 -> v16i16 | |
| 1265 | +// | v32i32 -> v32i16 | v16i16 -> v16i8 | v32i32 -> v32i8 | |
| 1266 | +// | v64i16 -> v64i8 | v32i8 -> v32i4 | | |
| 1267 | +// +=======================+=======================+=======================| |
| 1268 | +class Trunc1024To512Pat<ValueType DstTy, ValueType SrcTy, Instruction ShuffleInstOpc, int Mode> : |
1261 | 1269 | Pat<(DstTy (trunc SrcTy:$s1)),
|
1262 | 1270 | (ShuffleInstOpc
|
1263 | 1271 | (EXTRACT_SUBREG VEC1024:$s1, sub_512_lo ),
|
1264 | 1272 | (EXTRACT_SUBREG VEC1024:$s1, sub_512_hi ),
|
1265 | 1273 | (MOV_RLC_imm11_pseudo (i32 Mode)))>;
|
1266 | 1274 |
|
1267 |
| -def : Trunc1024Pat<v16i32, v16i64, VSHUFFLE_vec_shuffle_x, 4>; |
1268 |
| -def : Trunc1024Pat<v16i32, v16i64, VSHUFFLE_vec_shuffle_bm, 4>; |
1269 |
| -def : Trunc1024Pat<v32i16, v32i32, VSHUFFLE_vec_shuffle_x, 2>; |
1270 |
| -def : Trunc1024Pat<v64i8, v64i16, VSHUFFLE_vec_shuffle_x, 0>; |
| 1275 | +def : Trunc1024To512Pat<v16i32, v16i64, VSHUFFLE_vec_shuffle_x, 4>; |
| 1276 | +def : Trunc1024To512Pat<v16i32, v16i64, VSHUFFLE_vec_shuffle_bm, 4>; |
| 1277 | +def : Trunc1024To512Pat<v32i16, v32i32, VSHUFFLE_vec_shuffle_x, 2>; |
| 1278 | +def : Trunc1024To512Pat<v64i8, v64i16, VSHUFFLE_vec_shuffle_x, 0>; |
1271 | 1279 |
|
1272 |
| -class Trunc512Pat<ValueType DstTy, ValueType SrcTy, int Mode> : |
| 1280 | +class Trunc512To256Pat<ValueType DstTy, ValueType SrcTy, int Mode> : |
1273 | 1281 | Pat<(DstTy (trunc SrcTy:$s1)),
|
1274 | 1282 | (EXTRACT_SUBREG
|
1275 | 1283 | (VSHUFFLE_vec_shuffle_x VEC512:$s1, VEC512:$s1, (MOV_RLC_imm11_pseudo (i32 Mode))),
|
1276 | 1284 | sub_256_lo)>;
|
1277 |
| -def : Trunc512Pat<v8i32, v8i64, 4>; |
1278 |
| -def : Trunc512Pat<v16i16, v16i32, 2>; |
1279 |
| -def : Trunc512Pat<v32i8, v32i16, 0>; |
| 1285 | +def : Trunc512To256Pat<v8i32, v8i64, 4>; |
| 1286 | +def : Trunc512To256Pat<v16i16, v16i32, 2>; |
| 1287 | +def : Trunc512To256Pat<v32i8, v32i16, 0>; |
| 1288 | + |
| 1289 | +// This is effectively Trunc1024To512 followed by Trunc512To256. |
| 1290 | +class Trunc1024To256Pat<ValueType DstTy, ValueType SrcTy, int LargeMode, int SmallMode> : |
| 1291 | + Pat<(DstTy (trunc SrcTy:$s1)), |
| 1292 | + (EXTRACT_SUBREG |
| 1293 | + (VSHUFFLE_vec_shuffle_x |
| 1294 | + (VSHUFFLE_vec_shuffle_x |
| 1295 | + (EXTRACT_SUBREG VEC1024:$s1, sub_512_lo), |
| 1296 | + (EXTRACT_SUBREG VEC1024:$s1, sub_512_hi), |
| 1297 | + (MOV_RLC_imm11_pseudo (i32 LargeMode))), |
| 1298 | + (VSHUFFLE_vec_shuffle_x |
| 1299 | + (EXTRACT_SUBREG VEC1024:$s1, sub_512_lo), |
| 1300 | + (EXTRACT_SUBREG VEC1024:$s1, sub_512_hi), |
| 1301 | + (MOV_RLC_imm11_pseudo (i32 LargeMode))), |
| 1302 | + (MOV_RLC_imm11_pseudo (i32 SmallMode))), |
| 1303 | + sub_256_lo)>; |
| 1304 | + |
| 1305 | +def : Trunc1024To256Pat<v32i8, v32i32, 2, 0>; |
| 1306 | +def : Trunc1024To256Pat<v16i16, v16i64, 4, 2>; |
1280 | 1307 |
|
1281 | 1308 | class EventPat<AIE2PInst Inst, dag Imm> :
|
1282 | 1309 | Pat<(int_aie2p_event Imm), (Inst)>;
|
|
0 commit comments