Text file src/simd/archsimd/_gen/simdgen/ops/Moves/go_amd64.yaml

     1  !sum
     2  - go: SetElem
     3    asm: "VPINSRB"
     4    in:
     5    - &t
     6      class: vreg
     7      base: $b
     8    - class: greg
     9      base: $b
    10      lanes: 1 # Scalar, darn it!
    11    - class: immediate
    12      immOffset: 0
    13      immMax: 15
    14      name: index
    15    out:
    16    - *t
    17  - go: SetElem
    18    asm: "VPINSRW"
    19    in:
    20    - &t
    21      class: vreg
    22      base: $b
    23    - class: greg
    24      base: $b
    25      lanes: 1 # Scalar, darn it!
    26    - class: immediate
    27      immOffset: 0
    28      immMax: 7
    29      name: index
    30    out:
    31    - *t
    32  - go: SetElem
    33    asm: "VPINSRD"
    34    in:
    35    - &t
    36      class: vreg
    37      base: $b
    38    - class: greg
    39      base: $b
    40      lanes: 1 # Scalar, darn it!
    41    - class: immediate
    42      immOffset: 0
    43      immMax: 3
    44      name: index
    45    out:
    46    - *t
    47  - go: SetElem
    48    asm: "VPINSRQ"
    49    in:
    50    - &t
    51      class: vreg
    52      base: $b
    53    - class: greg
    54      base: $b
    55      lanes: 1 # Scalar, darn it!
    56    - class: immediate
    57      immOffset: 0
    58      immMax: 1
    59      name: index
    60    out:
    61    - *t
    62  
    63  - go: SetElem
    64    asm: "VPINSRD"
    65    in:
    66    - &t
    67      class: vreg
    68      base: int
    69      OverwriteBase: float
    70    - class: greg
    71      base: int
    72      OverwriteBase: float
    73      lanes: 1 # Scalar, darn it!
    74    - class: immediate
    75      immOffset: 0
    76      immMax: 3
    77      name: index
    78    out:
    79    - *t
    80  - go: SetElem
    81    asm: "VPINSRQ"
    82    in:
    83    - &t
    84      class: vreg
    85      base: int
    86      OverwriteBase: float
    87    - class: greg
    88      base: int
    89      OverwriteBase: float
    90      lanes: 1 # Scalar, darn it!
    91    - class: immediate
    92      immOffset: 0
    93      immMax: 1
    94      name: index
    95    out:
    96    - *t
    97  
    98  - go: GetElem # VPEXTRB 128 bit
    99    asm: VPEXTRB
   100    in:
   101    - bits: 128
   102      base: $b
   103      class: vreg
   104      elemBits: 8
   105    - class: immediate
   106      immOffset: 0
   107      immMax: 15
   108      name: index
   109    out:
   110      - bits: 32
   111        base: $b
   112        class: greg
   113        overwriteBits: 8 # The XED data specification is wrong, correct it to the right bits
   114  
   115  - go: GetElem # VPEXTRW 128 bit
   116    asm: VPEXTRW
   117    in:
   118    - bits: 128
   119      base: $b
   120      class: vreg
   121      elemBits: 16
   122    - class: immediate
   123      immOffset: 0
   124      immMax: 7
   125      name: index
   126    out:
   127      - bits: 32
   128        base: $b
   129        class: greg
   130        overwriteBits: 16 # The XED data specification is wrong, correct it to the right bits
   131  
   132  - go: GetElem
   133    asm: "VPEXTRD"
   134    in:
   135    - class: vreg
   136      base: $b
   137      elemBits: $e
   138    - class: immediate
   139      immOffset: 0
   140      immMax: 3
   141      name: index
   142    out:
   143    - class: greg
   144      base: $b
   145      bits: $e
   146  
   147  - go: GetElem
   148    asm: "VPEXTRQ"
   149    in:
   150    - class: vreg
   151      base: $b
   152      elemBits: $e
   153    - class: immediate
   154      immOffset: 0
   155      immMax: 1
   156      name: index
   157    out:
   158    - class: greg
   159      base: $b
   160      bits: $e
   161  
   162  - go: GetElem
   163    asm: "VPEXTRD"
   164    in:
   165    - class: vreg
   166      base: int
   167      elemBits: $e
   168      OverwriteBase: float
   169    - class: immediate
   170      immOffset: 0
   171      immMax: 3
   172      name: index
   173    out:
   174    - class: greg
   175      base: int
   176      bits: $e
   177      OverwriteBase: float
   178  
   179  - go: GetElem
   180    asm: "VPEXTRQ"
   181    in:
   182    - class: vreg
   183      base: int
   184      elemBits: $e
   185      OverwriteBase: float
   186    - class: immediate
   187      immOffset: 0
   188      immMax: 1
   189      name: index
   190    out:
   191    - class: greg
   192      base: int
   193      bits: $e
   194      OverwriteBase: float
   195  
   196  - go: "SetHi|SetLo"
   197    regexpTag: "move"
   198    asm: "VINSERTI128|VINSERTI64X4"
   199    inVariant: []
   200    in:
   201    - &i8x2N
   202      class: vreg
   203      base: $t
   204      OverwriteElementBits: 8
   205    - &i8xN
   206      class: vreg
   207      base: $t
   208      OverwriteElementBits: 8
   209    - &imm01 # This immediate should be only 0 or 1
   210      class: immediate
   211      const: 0 # place holder
   212      name: index
   213    out:
   214    - *i8x2N
   215  
   216  - go: "GetHi|GetLo"
   217    asm: "VEXTRACTI128|VEXTRACTI64X4"
   218    regexpTag: "move"
   219    inVariant: []
   220    in:
   221    - *i8x2N
   222    - *imm01
   223    out:
   224    - *i8xN
   225  
   226  - go: "SetHi|SetLo"
   227    asm: "VINSERTI128|VINSERTI64X4"
   228    regexpTag: "move"
   229    inVariant: []
   230    in:
   231    - &i16x2N
   232      class: vreg
   233      base: $t
   234      OverwriteElementBits: 16
   235    - &i16xN
   236      class: vreg
   237      base: $t
   238      OverwriteElementBits: 16
   239    - *imm01
   240    out:
   241    - *i16x2N
   242  
   243  - go: "GetHi|GetLo"
   244    regexpTag: "move"
   245    asm: "VEXTRACTI128|VEXTRACTI64X4"
   246    inVariant: []
   247    in:
   248    - *i16x2N
   249    - *imm01
   250    out:
   251    - *i16xN
   252  
   253  - go: "SetHi|SetLo"
   254    regexpTag: "move"
   255    asm: "VINSERTI128|VINSERTI64X4"
   256    inVariant: []
   257    in:
   258    - &i32x2N
   259      class: vreg
   260      base: $t
   261      OverwriteElementBits: 32
   262    - &i32xN
   263      class: vreg
   264      base: $t
   265      OverwriteElementBits: 32
   266    - *imm01
   267    out:
   268    - *i32x2N
   269  
   270  - go: "GetHi|GetLo"
   271    regexpTag: "move"
   272    asm: "VEXTRACTI128|VEXTRACTI64X4"
   273    inVariant: []
   274    in:
   275    - *i32x2N
   276    - *imm01
   277    out:
   278    - *i32xN
   279  
   280  - go: "SetHi|SetLo"
   281    regexpTag: "move"
   282    asm: "VINSERTI128|VINSERTI64X4"
   283    inVariant: []
   284    in:
   285    - &i64x2N
   286      class: vreg
   287      base: $t
   288      OverwriteElementBits: 64
   289    - &i64xN
   290      class: vreg
   291      base: $t
   292      OverwriteElementBits: 64
   293    - *imm01
   294    out:
   295    - *i64x2N
   296  
   297  - go: "GetHi|GetLo"
   298    regexpTag: "move"
   299    asm: "VEXTRACTI128|VEXTRACTI64X4"
   300    inVariant: []
   301    in:
   302    - *i64x2N
   303    - *imm01
   304    out:
   305    - *i64xN
   306  
   307  - go: "SetHi|SetLo"
   308    regexpTag: "move"
   309    asm: "VINSERTF128|VINSERTF64X4"
   310    inVariant: []
   311    in:
   312    - &f32x2N
   313      class: vreg
   314      base: $t
   315      OverwriteElementBits: 32
   316    - &f32xN
   317      class: vreg
   318      base: $t
   319      OverwriteElementBits: 32
   320    - *imm01
   321    out:
   322    - *f32x2N
   323  
   324  - go: "GetHi|GetLo"
   325    regexpTag: "move"
   326    asm: "VEXTRACTF128|VEXTRACTF64X4"
   327    inVariant: []
   328    in:
   329    - *f32x2N
   330    - *imm01
   331    out:
   332    - *f32xN
   333  
   334  - go: "SetHi|SetLo"
   335    regexpTag: "move"
   336    asm: "VINSERTF128|VINSERTF64X4"
   337    inVariant: []
   338    in:
   339    - &f64x2N
   340      class: vreg
   341      base: $t
   342      OverwriteElementBits: 64
   343    - &f64xN
   344      class: vreg
   345      base: $t
   346      OverwriteElementBits: 64
   347    - *imm01
   348    out:
   349    - *f64x2N
   350  
   351  - go: "GetHi|GetLo"
   352    regexpTag: "move"
   353    asm: "VEXTRACTF128|VEXTRACTF64X4"
   354    inVariant: []
   355    in:
   356    - *f64x2N
   357    - *imm01
   358    out:
   359    - *f64xN
   360  
   361  - go: Permute
   362    asm: "VPERM[BWDQ]|VPERMP[SD]"
   363    operandOrder: "21Type1"
   364    in:
   365    - &anyindices
   366      class: vreg
   367      name: indices
   368      overwriteBase: uint
   369    - go: $t
   370    out:
   371    - go: $t
   372  
   373  - go: ConcatPermute
   374    asm: "VPERMI2[BWDQ]|VPERMI2P[SD]"
   375    # Because we are overwriting the receiver's type, we
   376    # have to move the receiver to be a parameter so that
   377    # we can have no duplication.
   378    operandOrder: "231Type1"
   379    in:
   380    - *anyindices # result in arg 0
   381    - go: $t
   382    - go: $t
   383    out:
   384    - go: $t
   385  
   386  - go: Compress
   387    asm: "VPCOMPRESS[BWDQ]|VCOMPRESSP[SD]"
   388    in:
   389      # The mask in Compress is a control mask rather than a write mask, so it's not optional.
   390    - class: mask
   391    - go: $t
   392    out:
   393    - go: $t
   394  
   395  # For now a non-public method because
   396  # (1) [OverwriteClass] must be set together with [OverwriteBase]
   397  # (2) "simdgen does not support [OverwriteClass] in inputs".
   398  # That means the signature is wrong.
   399  - go: blend
   400    asm: VPBLENDVB
   401    zeroing: false
   402    in:
   403    - &v
   404      go: $t
   405      class: vreg
   406      base: int
   407    - *v
   408    -
   409      class: vreg
   410      base: int
   411      name: mask
   412    out:
   413    - *v
   414  
   415  # For AVX512
   416  - go: blend
   417    asm: VPBLENDM[BWDQ]
   418    zeroing: false
   419    in:
   420    - &v
   421      go: $t
   422      bits: 512
   423      class: vreg
   424      base: int
   425    - *v
   426    inVariant:
   427    -
   428      class: mask
   429    out:
   430    - *v
   431  
   432    # For AVX512
   433  - go: move
   434    asm: VMOVDQU(8|16|32|64)
   435    zeroing: true
   436    in:
   437    - &v
   438      go: $t
   439      class: vreg
   440      base: int|uint
   441    inVariant:
   442    -
   443      class: mask
   444    out:
   445    - *v
   446  
   447  - go: Expand
   448    asm: "VPEXPAND[BWDQ]|VEXPANDP[SD]"
   449    in:
   450      # The mask in Expand is a control mask rather than a write mask, so it's not optional.
   451    - class: mask
   452    - go: $t
   453    out:
   454    - go: $t
   455  
   456  - go: broadcast1To2
   457    asm: VPBROADCASTQ
   458    in:
   459    - class: vreg
   460      bits: 128
   461      elemBits: 64
   462      base: $b
   463    out:
   464    - class: vreg
   465      bits: 128
   466      elemBits: 64
   467      base: $b
   468  
   469  # weirdly, this one case on AVX2 is memory-operand-only
   470  - go: broadcast1To2
   471    asm: VPBROADCASTQ
   472    in:
   473    - class: vreg
   474      bits: 128
   475      elemBits: 64
   476      base: int
   477      OverwriteBase: float
   478    out:
   479    - class: vreg
   480      bits: 128
   481      elemBits: 64
   482      base: int
   483      OverwriteBase: float
   484  
   485  - go: broadcast1To4
   486    asm: VPBROADCAST[BWDQ]
   487    in:
   488    - class: vreg
   489      bits: 128
   490      base: $b
   491    out:
   492    - class: vreg
   493      lanes: 4
   494      base: $b
   495  
   496  - go: broadcast1To8
   497    asm: VPBROADCAST[BWDQ]
   498    in:
   499    - class: vreg
   500      bits: 128
   501      base: $b
   502    out:
   503    - class: vreg
   504      lanes: 8
   505      base: $b
   506  
   507  - go: broadcast1To16
   508    asm: VPBROADCAST[BWDQ]
   509    in:
   510    - class: vreg
   511      bits: 128
   512      base: $b
   513    out:
   514    - class: vreg
   515      lanes: 16
   516      base: $b
   517  
   518  - go: broadcast1To32
   519    asm: VPBROADCAST[BWDQ]
   520    in:
   521    - class: vreg
   522      bits: 128
   523      base: $b
   524    out:
   525    - class: vreg
   526      lanes: 32
   527      base: $b
   528  
   529  - go: broadcast1To64
   530    asm: VPBROADCASTB
   531    in:
   532    - class: vreg
   533      bits: 128
   534      base: $b
   535    out:
   536    - class: vreg
   537      lanes: 64
   538      base: $b
   539  
   540  - go: broadcast1To4
   541    asm: VBROADCASTS[SD]
   542    in:
   543    - class: vreg
   544      bits: 128
   545      base: float
   546    out:
   547    - class: vreg
   548      lanes: 4
   549      base: float
   550  
   551  - go: broadcast1To8
   552    asm: VBROADCASTS[SD]
   553    in:
   554    - class: vreg
   555      bits: 128
   556      base: float
   557    out:
   558    - class: vreg
   559      lanes: 8
   560      base: float
   561  
   562  - go: broadcast1To16
   563    asm: VBROADCASTS[SD]
   564    in:
   565    - class: vreg
   566      bits: 128
   567      base: float
   568    out:
   569    - class: vreg
   570      lanes: 16
   571      base: float
   572  
   573  # VPSHUFB for 128-bit byte shuffles will be picked with higher priority than VPERMB, given its lower CPU feature requirement. (It's AVX)
   574  - go: PermuteOrZero
   575    asm: VPSHUFB
   576    in:
   577    - &128any
   578      bits: 128
   579      go: $t
   580    - bits: 128
   581      name: indices
   582      base: int # always signed
   583    out:
   584    - *128any
   585  
   586  - go: PermuteOrZeroGrouped
   587    asm: VPSHUFB
   588    in:
   589    - &256Or512any
   590      bits: "256|512"
   591      go: $t
   592    - bits: "256|512"
   593      base: int
   594      name: indices
   595    out:
   596    - *256Or512any
   597  
   598  - go: permuteScalars
   599    asm: VPSHUFD
   600    addDoc: !string |-
   601      //
   602      //   result = {x[indices[0:2]], x[indices[2:4]], x[indices[4:6]], x[indices[6:8]]}
   603      //
   604      // Indices is four 2-bit values packed into a byte, thus indices[0:2] is the first index.
   605    in:
   606    - *128any
   607    - class: immediate
   608      immOffset: 0
   609      name: indices
   610    hideMaskMethods: true
   611    out:
   612    - *128any
   613  
   614  - go: permuteScalarsGrouped
   615    asm: VPSHUFD
   616    addDoc: !string |-
   617      //
   618      //   result = {x_group0[indices[0:2]], x_group0[indices[2:4]], x_group0[indices[4:6]], x_group0[indices[6:8]], x_group1[indices[0:2]], ...}
   619      //
   620      // Indices is four 2-bit values packed into a byte, thus indices[0:2] is the first index.
   621      // Each group is of size 128-bit.
   622    in:
   623    - *256Or512any
   624    - class: immediate
   625      immOffset: 0
   626      name: indices
   627    hideMaskMethods: true
   628    out:
   629    - *256Or512any
   630  
   631  - go: permuteScalarsLo # For AVX
   632    asm: VPSHUFLW
   633    addDoc: !string |-
   634      //
   635      //   result = {x[indices[0:2]], x[indices[2:4]], x[indices[4:6]], x[indices[6:8]], x[4], x[5], x[6], x[7]}
   636      //
   637      // Indices is four 2-bit values packed into a byte, thus indices[0:2] is the first index.
   638    in:
   639    - &32x4To16x8
   640      bits: 128
   641      go: $t
   642      elemBits: 32
   643      OverwriteElementBits: 16 # XED data incorrectly specified this as 32-bit, we need to fix it.
   644    - class: immediate
   645      immOffset: 0
   646      name: indices
   647    hideMaskMethods: true
   648    out:
   649    - *32x4To16x8
   650  
   651  - go: permuteScalarsLo
   652    asm: VPSHUFLW
   653    addDoc: !string |-
   654      //
   655      //   result = {x[indices[0:2]], x[indices[2:4]], x[indices[4:6]], x[indices[6:8]], x[4], x[5], x[6], x[7]}
   656      //
   657      // Indices is four 2-bit values packed into a byte, thus indices[0:2] is the first index.
   658    in:
   659      - &128lanes8
   660        bits: 128
   661        go: $t
   662        elemBits: 16
   663      - class: immediate
   664        immOffset: 0
   665        name: indices
   666    hideMaskMethods: true
   667    out:
   668      - *128lanes8
   669  
   670  - go: permuteScalarsLoGrouped
   671    asm: VPSHUFLW
   672    addDoc: !string |-
   673      //
   674      //   result = {x_group0[indices[0:2]], x_group0[indices[2:4]], x_group0[indices[4:6]], x_group0[indices[6:8]], x[4], x[5], x[6], x[7],
   675      //    x_group1[indices[0:2]], ...}
   676      //
   677      // Indices is four 2-bit values packed into a byte, thus indices[0:2] is the first index.
   678      // Each group is of size 128-bit.
   679    in:
   680    - &256Or512lanes8
   681      bits: "256|512"
   682      go: $t
   683      elemBits: 16
   684    - class: immediate
   685      immOffset: 0
   686      name: indices
   687    hideMaskMethods: true
   688    out:
   689    - *256Or512lanes8
   690  
   691  - go: permuteScalarsHi
   692    asm: VPSHUFHW
   693    addDoc: !string |-
   694      //
   695      //   result = {x[0], x[1], x[2], x[3], x[indices[0:2]+4], x[indices[2:4]+4], x[indices[4:6]+4], x[indices[6:8]+4]}
   696      //
   697      // Indices is four 2-bit values packed into a byte, thus indices[0:2] is the first index.
   698    in:
   699    - *128lanes8
   700    - class: immediate
   701      immOffset: 0
   702      name: indices
   703    hideMaskMethods: true
   704    out:
   705    - *128lanes8
   706  
   707  - go: permuteScalarsHi # For AVX
   708    asm: VPSHUFHW
   709    addDoc: !string |-
   710      //
   711      //   result = {x[0], x[1], x[2], x[3], x[indices[0:2]+4], x[indices[2:4]+4], x[indices[4:6]+4], x[indices[6:8]+4]}
   712      //
   713      // Indices is four 2-bit values packed into a byte, thus indices[0:2] is the first index.
   714    in:
   715    - &32x4To16x8
   716      bits: 128
   717      go: $t
   718      elemBits: 32
   719      OverwriteElementBits: 16 # XED data incorrectly specified this as 32-bit, we need to fix it.
   720    - class: immediate
   721      immOffset: 0
   722      name: indices
   723    hideMaskMethods: true
   724    out:
   725    - *32x4To16x8
   726  
   727  - go: permuteScalarsHiGrouped
   728    asm: VPSHUFHW
   729    addDoc: !string |-
   730      // result =
   731      //
   732      //   {x_group0[0], x_group0[1], x_group0[2], x_group0[3], x_group0[indices[0:2]+4], x_group0[indices[2:4]+4], x_group0[indices[4:6]+4], x_group0[indices[6:8]+4],
   733      //    x_group1[0], x_group1[1], x_group1[2], x_group1[3], x_group1[indices[0:2]+4], ...}
   734      //
   735      // Indices is four 2-bit values packed into a byte, thus indices[0:2] is the first index.
   736      // Each group is of size 128-bit.
   737    in:
   738    - *256Or512lanes8
   739    - class: immediate
   740      immOffset: 0
   741      name: indices
   742    hideMaskMethods: true
   743    out:
   744    - *256Or512lanes8
   745  
   746  - go: InterleaveHi
   747    asm: VPUNPCKH(QDQ|DQ|WD|WB)
   748    in:
   749    - *128any
   750    - *128any
   751    inVariant: []
   752    out:
   753    - *128any
   754  
   755  - go: InterleaveLo
   756    asm: VPUNPCKL(QDQ|DQ|WD|WB)
   757    in:
   758    - *128any
   759    - *128any
   760    inVariant: []
   761    out:
   762    - *128any
   763  
   764  - go: InterleaveHiGrouped
   765    asm: VPUNPCKH(QDQ|DQ|WD|WB)
   766    in:
   767    - *256Or512any
   768    - *256Or512any
   769    inVariant: []
   770    out:
   771    - *256Or512any
   772  
   773  - go: InterleaveLoGrouped
   774    asm: VPUNPCKL(QDQ|DQ|WD|WB)
   775    in:
   776    - *256Or512any
   777    - *256Or512any
   778    inVariant: []
   779    out:
   780    - *256Or512any
   781  
   782  # These are all described separately to carry the name of the constant parameter
   783  
   784  - go: concatSelectedConstant
   785    asm: VSHUFPS
   786    width: 32
   787    in:
   788    - &v
   789      go: $t
   790      class: vreg
   791      base: float
   792      bits: 128
   793    - *v
   794    - class: immediate
   795      immOffset: 0
   796      name: h1h0l1l0
   797    inVariant: []
   798    out:
   799    - *v
   800  
   801  - go: concatSelectedConstant
   802    asm: VSHUFPS
   803    in:
   804    - &v
   805      go: $t
   806      class: vreg
   807      base: float
   808      bits: 128
   809      OverwriteBase: int
   810    - *v
   811    - class: immediate
   812      immOffset: 0
   813      name: h1h0l1l0
   814    inVariant: []
   815    out:
   816    - *v
   817  
   818  - go: concatSelectedConstant
   819    asm: VSHUFPS
   820    in:
   821    - &v
   822      go: $t
   823      class: vreg
   824      base: float
   825      bits: 128
   826      OverwriteBase: uint
   827    - *v
   828    - class: immediate
   829      immOffset: 0
   830      name: h1h0l1l0
   831    inVariant: []
   832    out:
   833    - *v
   834  
   835  
   836  - go: concatSelectedConstantGrouped
   837    asm: VSHUFPS
   838    in:
   839    - &v
   840      go: $t
   841      class: vreg
   842      base: float
   843      bits: "256|512"
   844    - *v
   845    - class: immediate
   846      immOffset: 0
   847      name: h1h0l1l0
   848    inVariant: []
   849    out:
   850    - *v
   851  
   852  - go: concatSelectedConstantGrouped
   853    asm: VSHUFPS
   854    in:
   855    - &v
   856      go: $t
   857      class: vreg
   858      base: float
   859      bits: "256|512"
   860      OverwriteBase: int
   861    - *v
   862    - class: immediate
   863      immOffset: 0
   864      name: h1h0l1l0
   865    inVariant: []
   866    out:
   867    - *v
   868  
   869  - go: concatSelectedConstantGrouped
   870    asm: VSHUFPS
   871    in:
   872    - &v
   873      go: $t
   874      class: vreg
   875      base: float
   876      bits: "256|512"
   877      OverwriteBase: uint
   878    - *v
   879    - class: immediate
   880      immOffset: 0
   881      name: h1h0l1l0
   882    inVariant: []
   883    out:
   884    - *v
   885  
   886  
   887    # 64 bit versions
   888  
   889  - go: concatSelectedConstant
   890    asm: VSHUFPD
   891    in:
   892    - &v
   893      go: $t
   894      class: vreg
   895      base: float
   896      bits: 128
   897    - *v
   898    - class: immediate
   899      immOffset: 0
   900      name: hilo
   901    inVariant: []
   902    out:
   903    - *v
   904  
   905  - go: concatSelectedConstant
   906    asm: VSHUFPD
   907    in:
   908    - &v
   909      go: $t
   910      class: vreg
   911      base: float
   912      bits: 128
   913      OverwriteBase: int
   914    - *v
   915    - class: immediate
   916      immOffset: 0
   917      name: hilo
   918    inVariant: []
   919    out:
   920    - *v
   921  
   922  - go: concatSelectedConstant
   923    asm: VSHUFPD
   924    in:
   925    - &v
   926      go: $t
   927      class: vreg
   928      base: float
   929      bits: 128
   930      OverwriteBase: uint
   931    - *v
   932    - class: immediate
   933      immOffset: 0
   934      name: hilo
   935    inVariant: []
   936    out:
   937    - *v
   938  
   939  - go: concatSelectedConstantGrouped
   940    asm: VSHUFPD
   941    in:
   942    - &v
   943      go: $t
   944      class: vreg
   945      base: float
   946      bits: "256|512"
   947    - *v
   948    - class: immediate
   949      immOffset: 0
   950      name: hilos
   951    inVariant: []
   952    out:
   953    - *v
   954  
   955  - go: concatSelectedConstantGrouped
   956    asm: VSHUFPD
   957    in:
   958    - &v
   959      go: $t
   960      class: vreg
   961      base: float
   962      bits: "256|512"
   963      OverwriteBase: int
   964    - *v
   965    - class: immediate
   966      immOffset: 0
   967      name: hilos
   968    inVariant: []
   969    out:
   970    - *v
   971  
   972  - go: concatSelectedConstantGrouped
   973    asm: VSHUFPD
   974    in:
   975    - &v
   976      go: $t
   977      class: vreg
   978      base: float
   979      bits: "256|512"
   980      OverwriteBase: uint
   981    - *v
   982    - class: immediate
   983      immOffset: 0
   984      name: hilos
   985    inVariant: []
   986    out:
   987    - *v
   988  
   989  - go: ConcatPermute128Scalars
   990    asm: VPERM2F128
   991    operandOrder: II
   992    addDoc: !string |-
   993      // For example,
   994      //
   995      //   {40, 41, 50, 51}.NAME(3, 0, {60, 61, 70, 71})
   996      //
   997      // returns {70, 71, 40, 41}.
   998    in:
   999    - &v
  1000      go: $t
  1001      class: vreg
  1002      base: float
  1003      bits: 256
  1004    - *v
  1005    - class: immediate
  1006      immOffset: 0
  1007      name: "lo, hi"
  1008    inVariant: []
  1009    out:
  1010    - *v
  1011  
  1012  - go: ConcatPermute128Scalars
  1013    asm: VPERM2F128
  1014    operandOrder: II
  1015    addDoc: !string |-
  1016      // For example,
  1017      //
  1018      //   {40, 41, 42, 43, 50, 51, 52, 53}.NAME(3, 0, {60, 61, 62, 63, 70, 71, 72, 73})
  1019      //
  1020      // returns {70, 71, 72, 73, 40, 41, 42, 43}.
  1021    in:
  1022    - &v
  1023      go: $t
  1024      class: vreg
  1025      base: float
  1026      bits: 256
  1027      OverwriteElementBits: 32
  1028    - *v
  1029    - class: immediate
  1030      immOffset: 0
  1031      name: "lo, hi"
  1032    inVariant: []
  1033    out:
  1034    - *v
  1035  
  1036  - go: ConcatPermute128Scalars
  1037    asm: VPERM2I128
  1038    operandOrder: II
  1039    addDoc: !string |-
  1040      // For example,
  1041      //
  1042      //   {40, 41, 50, 51}.NAME(3, 0, {60, 61, 70, 71})
  1043      //
  1044      // returns {70, 71, 40, 41}.
  1045    in:
  1046    - &v
  1047      go: $t
  1048      class: vreg
  1049      base: int|uint
  1050      bits: 256
  1051      OverwriteElementBits: 64
  1052    - *v
  1053    - class: immediate
  1054      immOffset: 0
  1055      name: "lo, hi"
  1056    inVariant: []
  1057    out:
  1058    - *v
  1059  
  1060  - go: ConcatPermute128Scalars
  1061    asm: VPERM2I128
  1062    operandOrder: II
  1063    addDoc: !string |-
  1064      // For example,
  1065      //
  1066      //   {40, 41, 42, 43, 50, 51, 52, 53}.NAME(3, 0, {60, 61, 62, 63, 70, 71, 72, 73})
  1067      //
  1068      // returns {70, 71, 72, 73, 40, 41, 42, 43}.
  1069    in:
  1070    - &v
  1071      go: $t
  1072      class: vreg
  1073      base: int|uint
  1074      bits: 256
  1075      OverwriteElementBits: 32
  1076    - *v
  1077    - class: immediate
  1078      immOffset: 0
  1079      name: "lo, hi"
  1080    inVariant: []
  1081    out:
  1082    - *v
  1083  
  1084  - go: ConcatPermute128Scalars
  1085    asm: VPERM2I128
  1086    operandOrder: II
  1087    addDoc: !string |-
  1088      // For example,
  1089      //
  1090      //   {40, 41, 42, 43, 44, 45, 46, 47, 50, 51, 52, 53, 54, 55, 56, 57}.NAME(3, 0,
  1091      //    {60, 61, 62, 63, 64, 65, 66, 67, 70, 71, 72, 73, 74, 75, 76, 77})
  1092      //
  1093      // returns {70, 71, 72, 73, 74, 75, 76, 77, 40, 41, 42, 43, 44, 45, 46, 47}.
  1094    in:
  1095    - &v
  1096      go: $t
  1097      class: vreg
  1098      base: int|uint
  1099      bits: 256
  1100      OverwriteElementBits: 16
  1101    - *v
  1102    - class: immediate
  1103      immOffset: 0
  1104      name: "lo, hi"
  1105    inVariant: []
  1106    out:
  1107    - *v
  1108  
  1109  - go: ConcatPermute128Scalars
  1110    asm: VPERM2I128
  1111    operandOrder: II
  1112    addDoc: !string |-
  1113      // For example,
  1114      //
  1115      //   {0x40, 0x41, ..., 0x4f, 0x50, 0x51, ..., 0x5f}.NAME(3, 0,
  1116      //        {0x60, 0x61, ..., 0x6f, 0x70, 0x71, ..., 0x7f})
  1117      //
  1118      // returns {0x70, 0x71, ..., 0x7f, 0x40, 0x41, ..., 0x4f}.
  1119    in:
  1120    - &v
  1121      go: $t
  1122      class: vreg
  1123      base: int|uint
  1124      bits: 256
  1125      OverwriteElementBits: 8
  1126    - *v
  1127    - class: immediate
  1128      immOffset: 0
  1129      name: "lo, hi"
  1130    inVariant: []
  1131    out:
  1132    - *v
  1133  
  1134  - go: ConcatShiftBytesRight
  1135    asm: VPALIGNR
  1136    operandOrder: 2I
  1137    in:
  1138    - &uint128
  1139      go: $t
  1140      base: uint
  1141      bits: 128
  1142    - *uint128
  1143    - class: immediate
  1144      immOffset: 0
  1145      name: shift
  1146    out:
  1147    - *uint128
  1148  
  1149  - go: ConcatShiftBytesRightGrouped
  1150    asm: VPALIGNR
  1151    operandOrder: 2I
  1152    in:
  1153    - &uint256512
  1154      go: $t
  1155      base: uint
  1156      bits: 256|512
  1157    - *uint256512
  1158    - class: immediate
  1159      immOffset: 0
  1160      name: shift
  1161    out:
  1162    - *uint256512
  1163  

View as plain text