1 //===----------- VVPInstrPatternsVec.td - VVP_* SDNode patterns -----------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file describes how VVP_* SDNodes are lowered to machine instructions.
11 //===----------------------------------------------------------------------===//
13 //===----------------------------------------------------------------------===//
15 // VVP SDNode definitions.
17 //===----------------------------------------------------------------------===//
18 include "VVPInstrInfo.td"
20 multiclass VectorStore<ValueType DataVT,
21 ValueType PtrVT, ValueType MaskVT,
22 string STWithMask, string STNoMask> {
23 // Unmasked (imm stride).
25 DataVT:$val, PtrVT:$addr,
26 (i64 simm7:$stride), (MaskVT true_mask), i32:$avl),
27 (!cast<Instruction>(STNoMask#"irvl")
28 (LO7 $stride), $addr, $val, $avl)>;
31 DataVT:$val, PtrVT:$addr,
32 i64:$stride, (MaskVT true_mask), i32:$avl),
33 (!cast<Instruction>(STNoMask#"rrvl")
34 $stride, $addr, $val, $avl)>;
35 // Masked (imm stride).
37 DataVT:$val, PtrVT:$addr,
38 (i64 simm7:$stride), MaskVT:$mask, i32:$avl),
39 (!cast<Instruction>(STWithMask#"irvml")
40 (LO7 $stride), $addr, $val, $mask, $avl)>;
43 DataVT:$val, PtrVT:$addr,
44 i64:$stride, MaskVT:$mask, i32:$avl),
45 (!cast<Instruction>(STWithMask#"rrvml")
46 $stride, $addr, $val, $mask, $avl)>;
49 defm : VectorStore<v256f64, i64, v256i1, "VST", "VST">;
50 defm : VectorStore<v256i64, i64, v256i1, "VST", "VST">;
51 defm : VectorStore<v256f32, i64, v256i1, "VSTU", "VSTU">;
52 defm : VectorStore<v256i32, i64, v256i1, "VSTL", "VSTL">;
54 multiclass VectorLoad<ValueType DataVT,
55 ValueType PtrVT, ValueType MaskVT,
56 string GTWithMask, string LDNoMask> {
57 // Unmasked (imm stride).
58 def : Pat<(DataVT (vvp_load
59 PtrVT:$addr, (i64 simm7:$stride),
60 (MaskVT true_mask), i32:$avl)),
61 (!cast<Instruction>(LDNoMask#"irl")
62 (LO7 $stride), $addr, $avl)>;
64 def : Pat<(DataVT (vvp_load
65 PtrVT:$addr, i64:$stride,
66 (MaskVT true_mask), i32:$avl)),
67 (!cast<Instruction>(LDNoMask#"rrl")
68 $stride, PtrVT:$addr, $avl)>;
69 // Masked (imm stride).
70 def : Pat<(DataVT (vvp_load
71 PtrVT:$addr, (i64 simm7:$stride),
72 MaskVT:$mask, i32:$avl)),
73 (!cast<Instruction>(GTWithMask#"vizml")
75 (VMULULivml (LO7 $stride), (VSEQl $avl), $mask, $avl),
81 def : Pat<(DataVT (vvp_load
82 PtrVT:$addr, i64:$stride, MaskVT:$mask, i32:$avl)),
83 (!cast<Instruction>(GTWithMask#"vizml")
85 (VMULULrvml $stride, (VSEQl $avl), $mask, $avl),
92 defm : VectorLoad<v256f64, i64, v256i1, "VGT", "VLD">;
93 defm : VectorLoad<v256i64, i64, v256i1, "VGT", "VLD">;
94 defm : VectorLoad<v256f32, i64, v256i1, "VGTU", "VLDU">;
95 defm : VectorLoad<v256i32, i64, v256i1, "VGTLZX", "VLDLZX">;
97 // Vector Gather and scatter
98 multiclass VectorGather<ValueType DataVT,
99 ValueType PtrVT, ValueType MaskVT,
102 def : Pat<(DataVT (vvp_gather
103 PtrVT:$addr, (MaskVT true_mask), i32:$avl)),
104 (!cast<Instruction>(GTPrefix#"vizl") $addr, 0, 0, $avl)>;
106 def : Pat<(DataVT (vvp_gather PtrVT:$addr, MaskVT:$mask, i32:$avl)),
107 (!cast<Instruction>(GTPrefix#"vizml") $addr, 0, 0, $mask, $avl)>;
110 defm : VectorGather<v256f64, v256i64, v256i1, "VGT">;
111 defm : VectorGather<v256i64, v256i64, v256i1, "VGT">;
112 defm : VectorGather<v256f32, v256i64, v256i1, "VGTU">;
113 defm : VectorGather<v256i32, v256i64, v256i1, "VGTLZX">;
115 multiclass VectorScatter<ValueType DataVT,
116 ValueType PtrVT, ValueType MaskVT,
119 def : Pat<(vvp_scatter
120 DataVT:$data, PtrVT:$addr, (MaskVT true_mask), i32:$avl),
121 (!cast<Instruction>(SCPrefix#"vizvl") $addr, 0, 0, $data, $avl)>;
123 def : Pat<(vvp_scatter
124 DataVT:$data, PtrVT:$addr, MaskVT:$mask, i32:$avl),
125 (!cast<Instruction>(SCPrefix#"vizvml") $addr, 0, 0, $data, $mask, $avl)>;
128 defm : VectorScatter<v256f64, v256i64, v256i1, "VSC">;
129 defm : VectorScatter<v256i64, v256i64, v256i1, "VSC">;
130 defm : VectorScatter<v256f32, v256i64, v256i1, "VSCU">;
131 defm : VectorScatter<v256i32, v256i64, v256i1, "VSCL">;
135 // Directly modify the sign bit to flip the sign.
137 // Set sign bits in a pack of <2 x f32>.
138 def packed_fneg_imm : OutPatFrag<(ins ),
139 (i64 (SLLri (i64 (ORim 1, (i32 32))), 31))>;
142 multiclass FNeg<ValueType DataVT> {
143 // Masked with select.
144 def : Pat<(vvp_select (vvp_fneg DataVT:$vx, (v256i1 srcvalue), (i32 srcvalue)),
148 (VXORmvml_v (i32 1), $vx, $mask, $avl, $vfalse)>;
151 def : Pat<(vvp_fneg DataVT:$vx, (v256i1 true_mask), i32:$avl),
152 (VXORmvl (i32 1), $vx, $avl)>;
155 def : Pat<(vvp_fneg DataVT:$vx, v256i1:$mask, i32:$avl),
156 (VXORmvml (i32 1), $vx, $mask, $avl)>;
162 ///// Packed FNeg /////
164 // Masked with select.
165 def : Pat<(vvp_select (vvp_fneg v512f32:$vx, (v512i1 srcvalue), (i32 srcvalue)),
169 (v512f32 (PVXORrvml_v (packed_fneg_imm ), $vx, $mask, $avl, $vfalse))>;
172 def : Pat<(vvp_fneg v512f32:$vx, (v512i1 true_mask), i32:$avl),
173 (v512f32 (PVXORrvl (packed_fneg_imm ), $vx, $avl))>;
176 def : Pat<(vvp_fneg v512f32:$vx, v512i1:$mask, i32:$avl),
177 (v512f32 (PVXORrvml (packed_fneg_imm ), $vx, $mask, $avl))>;
181 multiclass Binary_rv<SDPatternOperator OpNode,
182 ValueType ScalarVT, ValueType DataVT,
183 ValueType MaskVT, string OpBaseName> {
184 // Masked with passthru, broadcast.
185 def : Pat<(vvp_select
187 (any_broadcast ScalarVT:$sx),
194 (!cast<Instruction>(OpBaseName#"rvml_v")
201 // Unmasked, broadcast.
203 (any_broadcast ScalarVT:$sx), DataVT:$vy,
206 (!cast<Instruction>(OpBaseName#"rvl")
207 ScalarVT:$sx, $vy, $avl)>;
208 // Masked, broadcast.
210 (any_broadcast ScalarVT:$sx), DataVT:$vy,
213 (!cast<Instruction>(OpBaseName#"rvml")
214 ScalarVT:$sx, $vy, $mask, $avl)>;
217 multiclass Binary_vr<SDPatternOperator OpNode,
218 ValueType ScalarVT, ValueType DataVT,
219 ValueType MaskVT, string OpBaseName> {
220 // Masked with passthru, broadcast.
221 def : Pat<(vvp_select
224 (any_broadcast ScalarVT:$sy),
230 (!cast<Instruction>(OpBaseName#"vrml_v")
237 // Unmasked, broadcast.
239 DataVT:$vx, (any_broadcast ScalarVT:$sy),
242 (!cast<Instruction>(OpBaseName#"vrl")
243 $vx, ScalarVT:$sy, $avl)>;
244 // Masked, broadcast.
246 DataVT:$vx, (any_broadcast ScalarVT:$sy),
249 (!cast<Instruction>(OpBaseName#"vrml")
250 $vx, ScalarVT:$sy, $mask, $avl)>;
253 multiclass Binary_vv<SDPatternOperator OpNode,
255 ValueType MaskVT, string OpBaseName> {
256 // Masked with passthru, broadcast.
257 def : Pat<(vvp_select
266 (!cast<Instruction>(OpBaseName#"vvml_v")
273 // Masked with select.
278 DataVT:$vx, DataVT:$vy,
281 (!cast<Instruction>(OpBaseName#"vvl")
286 DataVT:$vx, DataVT:$vy,
289 (!cast<Instruction>(OpBaseName#"vvml")
290 $vx, $vy, $mask, $avl)>;
293 multiclass Binary_rv_vv<
294 SDPatternOperator OpNode,
295 ValueType ScalarVT, ValueType DataVT, ValueType MaskVT,
297 defm : Binary_rv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
298 defm : Binary_vv<OpNode, DataVT, MaskVT, OpBaseName>;
301 multiclass Binary_vr_vv<
302 SDPatternOperator OpNode,
303 ValueType ScalarVT, ValueType DataVT, ValueType MaskVT,
305 defm : Binary_vr<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
306 defm : Binary_vv<OpNode, DataVT, MaskVT, OpBaseName>;
309 multiclass Binary_rv_vr_vv<
310 SDPatternOperator OpNode,
311 ValueType ScalarVT, ValueType DataVT, ValueType MaskVT,
313 defm : Binary_rv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
314 defm : Binary_vr_vv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
317 // Expand both 64bit and 32 bit variant (256 elements)
318 multiclass Binary_rv_vv_ShortLong<
319 SDPatternOperator OpNode,
320 ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName,
321 ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> {
322 defm : Binary_rv_vv<OpNode,
323 LongScalarVT, LongDataVT, v256i1,
325 defm : Binary_rv_vv<OpNode,
326 ShortScalarVT, ShortDataVT, v256i1,
330 multiclass Binary_vr_vv_ShortLong<
331 SDPatternOperator OpNode,
332 ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName,
333 ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> {
334 defm : Binary_vr_vv<OpNode,
335 LongScalarVT, LongDataVT, v256i1,
337 defm : Binary_vr_vv<OpNode,
338 ShortScalarVT, ShortDataVT, v256i1,
342 multiclass Binary_rv_vr_vv_ShortLong<
343 SDPatternOperator OpNode,
344 ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName,
345 ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> {
346 defm : Binary_rv_vr_vv<OpNode,
347 LongScalarVT, LongDataVT, v256i1,
349 defm : Binary_rv_vr_vv<OpNode,
350 ShortScalarVT, ShortDataVT, v256i1,
354 defm : Binary_rv_vv_ShortLong<c_vvp_add,
355 i64, v256i64, "VADDSL",
356 i32, v256i32, "VADDSWSX">;
357 defm : Binary_rv_vv_ShortLong<vvp_sub,
358 i64, v256i64, "VSUBSL",
359 i32, v256i32, "VSUBSWSX">;
360 defm : Binary_rv_vv_ShortLong<c_vvp_mul,
361 i64, v256i64, "VMULSL",
362 i32, v256i32, "VMULSWSX">;
363 defm : Binary_rv_vr_vv_ShortLong<vvp_sdiv,
364 i64, v256i64, "VDIVSL",
365 i32, v256i32, "VDIVSWSX">;
366 defm : Binary_rv_vr_vv_ShortLong<vvp_udiv,
367 i64, v256i64, "VDIVUL",
368 i32, v256i32, "VDIVUW">;
369 defm : Binary_rv_vv_ShortLong<c_vvp_and,
370 i64, v256i64, "VAND",
371 i32, v256i32, "PVANDLO">;
372 defm : Binary_rv_vv_ShortLong<c_vvp_or,
374 i32, v256i32, "PVORLO">;
375 defm : Binary_rv_vv_ShortLong<c_vvp_xor,
376 i64, v256i64, "VXOR",
377 i32, v256i32, "PVXORLO">;
378 defm : Binary_vr_vv_ShortLong<vvp_shl,
379 i64, v256i64, "VSLL",
380 i32, v256i32, "PVSLLLO">;
381 defm : Binary_vr_vv_ShortLong<vvp_sra,
382 i64, v256i64, "VSRAL",
383 i32, v256i32, "PVSRALO">;
384 defm : Binary_vr_vv_ShortLong<vvp_srl,
385 i64, v256i64, "VSRL",
386 i32, v256i32, "PVSRLLO">;
388 defm : Binary_rv_vv_ShortLong<c_vvp_fadd,
389 f64, v256f64, "VFADDD",
390 f32, v256f32, "PVFADDUP">;
391 defm : Binary_rv_vv_ShortLong<c_vvp_fmul,
392 f64, v256f64, "VFMULD",
393 f32, v256f32, "PVFMULUP">;
394 defm : Binary_rv_vv_ShortLong<vvp_fsub,
395 f64, v256f64, "VFSUBD",
396 f32, v256f32, "PVFSUBUP">;
397 defm : Binary_rv_vr_vv_ShortLong<vvp_fdiv,
398 f64, v256f64, "VFDIVD",
399 f32, v256f32, "VFDIVS">;
401 defm : Binary_rv_vv<c_vvp_and,
402 i64, v512i32, v512i1, "PVAND">;
403 defm : Binary_rv_vv<c_vvp_or,
404 i64, v512i32, v512i1, "PVOR">;
405 defm : Binary_rv_vv<c_vvp_xor,
406 i64, v512i32, v512i1, "PVXOR">;
408 defm : Binary_rv_vv<c_vvp_add,
409 i64, v512i32, v512i1, "PVADDU">;
410 defm : Binary_rv_vv<vvp_sub,
411 i64, v512i32, v512i1, "PVSUBU">;
412 defm : Binary_vr_vv<vvp_srl,
413 i64, v512i32, v512i1, "PVSRL">;
414 defm : Binary_vr_vv<vvp_sra,
415 i64, v512i32, v512i1, "PVSRA">;
416 defm : Binary_vr_vv<vvp_shl,
417 i64, v512i32, v512i1, "PVSLL">;
419 defm : Binary_rv_vv<c_vvp_fadd,
420 i64, v512f32, v512i1, "PVFADD">;
421 defm : Binary_rv_vv<c_vvp_fmul,
422 i64, v512f32, v512i1, "PVFMUL">;
423 defm : Binary_rv_vv<vvp_fsub,
424 i64, v512f32, v512i1, "PVFSUB">;
426 multiclass Ternary_vvv<
427 SDPatternOperator OpNode, ValueType DataVT,
428 ValueType MaskVT, string OpBaseName> {
429 // Masked with passthru.
430 def : Pat<(vvp_select
431 (OpNode DataVT:$vx, DataVT:$vy, DataVT:$vz,
432 (MaskVT srcvalue), (i32 srcvalue)),
436 (!cast<Instruction>(OpBaseName#"vvvml_v")
437 $vx, $vy, $vz, $mask, $avl, $vfalse)>;
440 def : Pat<(OpNode DataVT:$vx, DataVT:$vy, DataVT:$vz,
441 (MaskVT true_mask), i32:$avl),
442 (!cast<Instruction>(OpBaseName#"vvvl")
443 $vx, $vy, $vz, $avl)>;
446 def : Pat<(OpNode DataVT:$vx, DataVT:$vy, DataVT:$vz,
447 MaskVT:$mask, i32:$avl),
448 (!cast<Instruction>(OpBaseName#"vvvml")
449 $vx, $vy, $vz, $mask, $avl)>;
452 multiclass Ternary_rvv<
453 SDPatternOperator OpNode,
454 ValueType ScalarVT, ValueType DataVT,
455 ValueType MaskVT, string OpBaseName> {
456 // Masked with passthru, broadcast first.
457 def : Pat<(vvp_select
459 (any_broadcast ScalarVT:$sx), DataVT:$vy, DataVT:$vz,
460 (MaskVT srcvalue), (i32 srcvalue)),
464 (!cast<Instruction>(OpBaseName#"rvvml_v")
465 $sx, $vy, $vz, $mask, $avl, $vfalse)>;
467 // Unmasked, broadcast first.
469 (any_broadcast ScalarVT:$sx), DataVT:$vy, DataVT:$vz,
470 (MaskVT true_mask), i32:$avl),
471 (!cast<Instruction>(OpBaseName#"rvvl")
472 $sx, $vy, $vz, $avl)>;
474 // Masked, broadcast first.
476 (any_broadcast ScalarVT:$sx), DataVT:$vy, DataVT:$vz,
477 MaskVT:$mask, i32:$avl),
478 (!cast<Instruction>(OpBaseName#"rvvml")
479 $sx, $vy, $vz, $mask, $avl)>;
482 multiclass Ternary_vrv<
483 SDPatternOperator OpNode,
484 ValueType ScalarVT, ValueType DataVT,
485 ValueType MaskVT, string OpBaseName> {
486 // Masked with passthru, broadcast second.
487 def : Pat<(vvp_select
489 DataVT:$vx, (any_broadcast ScalarVT:$sy), DataVT:$vz,
490 (MaskVT srcvalue), (i32 srcvalue)),
494 (!cast<Instruction>(OpBaseName#"vrvml_v")
496 $mask, $avl, $vfalse)>;
498 // Unmasked, broadcast second.
500 DataVT:$vx, (any_broadcast ScalarVT:$sy), DataVT:$vz,
501 (MaskVT true_mask), i32:$avl),
502 (!cast<Instruction>(OpBaseName#"vrvl")
503 $vx, $sy, $vz, $avl)>;
505 // Masked, broadcast second.
507 DataVT:$vx, (any_broadcast ScalarVT:$sy), DataVT:$vz,
508 MaskVT:$mask, i32:$avl),
509 (!cast<Instruction>(OpBaseName#"vrvml")
510 $vx, $sy, $vz, $mask, $avl)>;
513 multiclass Ternary_rvv_vrv_vvv<
514 SDPatternOperator OpNode,
515 ValueType ScalarVT, ValueType DataVT,
516 ValueType MaskVT, string OpBaseName> {
517 defm : Ternary_rvv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
518 defm : Ternary_vrv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
519 defm : Ternary_vvv<OpNode, DataVT, MaskVT, OpBaseName>;
522 // Expand both 64bit and 32 bit variant (256 elements)
523 multiclass Ternary_ShortLong<
524 SDPatternOperator OpNode,
525 ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName,
526 ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> {
527 defm : Ternary_rvv_vrv_vvv<OpNode, LongScalarVT, LongDataVT,
528 v256i1, LongOpBaseName>;
529 defm : Ternary_rvv_vrv_vvv<OpNode, ShortScalarVT, ShortDataVT,
530 v256i1, ShortOpBaseName>;
533 defm : Ternary_ShortLong<c_vvp_ffma,
534 f64, v256f64, "VFMADD", f32, v256f32, "VFMADS">;
535 defm : Ternary_rvv_vrv_vvv<c_vvp_ffma,
536 i64, v512f32, v512i1, "PVFMAD">;
538 multiclass Merge_mvv<
539 SDPatternOperator OpNode,
540 ValueType DataVT, ValueType MaskVT,
544 DataVT:$vtrue, DataVT:$vfalse,
547 (!cast<Instruction>(OpBaseName#"vvml_v")
548 $vfalse, $vtrue, $vm, $avl, $vfalse)>;
551 multiclass Merge_mvv_ShortLong<
552 SDPatternOperator OpNode,
553 ValueType LongDataVT, ValueType ShortDataVT,
555 defm : Merge_mvv<OpNode,
558 defm : Merge_mvv<OpNode,
563 defm : Merge_mvv_ShortLong<vvp_select,
566 defm : Merge_mvv_ShortLong<vvp_select,
570 multiclass Set_CC<ValueType DataVT, string FmkBaseName, string CmpBaseName, SDPatternOperator CCMatcher, SDNodeXForm CCConv> {
572 def : Pat<(v256i1 (vvp_setcc
573 DataVT:$LHS, DataVT:$RHS, CCMatcher:$cond, (v256i1 true_mask), i32:$vl)),
574 (!cast<Instruction>(FmkBaseName#"vl")
576 (!cast<Instruction>(CmpBaseName#"vvl")
580 def : Pat<(v256i1 (vvp_setcc
581 DataVT:$LHS, DataVT:$RHS, CCMatcher:$cond, v256i1:$vm, i32:$vl)),
582 (!cast<Instruction>(FmkBaseName#"vml")
584 (!cast<Instruction>(CmpBaseName#"vvl")
589 defm : Set_CC<v256i64,"VFMKL","VCMPUL",CCUIOp,icond2cc>;
590 defm : Set_CC<v256i64,"VFMKL","VCMPSL",CCSIOp,icond2cc>;
591 defm : Set_CC<v256f64,"VFMKL","VFCMPD",cond,fcond2cc>;
593 defm : Set_CC<v256i32,"VFMKW","VCMPUW",CCUIOp,icond2cc>;
594 defm : Set_CC<v256i32,"VFMKW","VCMPSWZX",CCSIOp,icond2cc>;
595 defm : Set_CC<v256f32,"VFMKS","VFCMPS",cond,fcond2cc>;
597 multiclass Reduce_GenericInt<ValueType VectorVT,
598 RegisterClass ResRC, ValueType ResVT,
599 string VVPRedOp, string RedInstName> {
601 def : Pat <(ResVT (!cast<SDPatternOperator>("vvp_reduce_"#VVPRedOp)
602 VectorVT:$vx, (v256i1 true_mask), i32:$vl)),
604 (!cast<Instruction>("LVSvi")
605 (!cast<Instruction>(RedInstName#"vl") $vx, $vl), 0),
609 def : Pat <(ResVT (!cast<SDPatternOperator>("vvp_reduce_"#VVPRedOp)
610 VectorVT:$vx, v256i1:$vm, i32:$vl)),
612 (!cast<Instruction>("LVSvi")
613 (!cast<Instruction>(RedInstName#"vml") $vx, $vm, $vl), 0),
617 multiclass IntReduce_ShortLong<ValueType VectorVT,
618 RegisterClass ResRC, ValueType ResVT,
619 string SumSuffix, string MinMaxSuffix> {
620 defm: Reduce_GenericInt<VectorVT, ResRC, ResVT, "or", "VROR">;
621 defm: Reduce_GenericInt<VectorVT, ResRC, ResVT, "and", "VRAND">;
622 defm: Reduce_GenericInt<VectorVT, ResRC, ResVT, "xor", "VRXOR">;
623 defm: Reduce_GenericInt<VectorVT, ResRC, ResVT, "add", "VSUM"#SumSuffix>;
624 defm: Reduce_GenericInt<VectorVT, ResRC, ResVT, "smax", "VRMAX"#MinMaxSuffix>;
627 defm: IntReduce_ShortLong<v256i64, I64, i64, "L","SLFST">;
628 defm: IntReduce_ShortLong<v256i32, I32, i32, "WSX","SWFSTSX">;