github.com/segmentio/parquet-go@v0.0.0-20230712180008-5d42db8f0d47/page_bounds_amd64.s (about)

     1  //go:build !purego
     2  
     3  #include "textflag.h"
     4  
     5  #define bswap128lo 0x08080A0B0C0D0E0F
     6  #define bswap128hi 0x0001020304050607
     7  
     8  DATA bswap128+0(SB)/8, $bswap128lo
     9  DATA bswap128+8(SB)/8, $bswap128hi
    10  DATA bswap128+16(SB)/8, $bswap128lo
    11  DATA bswap128+24(SB)/8, $bswap128hi
    12  DATA bswap128+32(SB)/8, $bswap128lo
    13  DATA bswap128+40(SB)/8, $bswap128hi
    14  DATA bswap128+48(SB)/8, $bswap128lo
    15  DATA bswap128+56(SB)/8, $bswap128hi
    16  GLOBL bswap128(SB), RODATA|NOPTR, $64
    17  
    18  DATA indexes128+0(SB)/8, $0
    19  DATA indexes128+8(SB)/8, $0
    20  DATA indexes128+16(SB)/8, $1
    21  DATA indexes128+24(SB)/8, $1
    22  DATA indexes128+32(SB)/8, $2
    23  DATA indexes128+40(SB)/8, $2
    24  DATA indexes128+48(SB)/8, $3
    25  DATA indexes128+56(SB)/8, $3
    26  GLOBL indexes128(SB), RODATA|NOPTR, $64
    27  
    28  DATA swap64+0(SB)/8, $4
    29  DATA swap64+8(SB)/8, $5
    30  DATA swap64+16(SB)/8, $6
    31  DATA swap64+24(SB)/8, $7
    32  DATA swap64+32(SB)/8, $2
    33  DATA swap64+40(SB)/8, $3
    34  DATA swap64+48(SB)/8, $0
    35  DATA swap64+56(SB)/8, $1
    36  GLOBL swap64(SB), RODATA|NOPTR, $64
    37  
    38  DATA swap32+0(SB)/4, $8
    39  DATA swap32+4(SB)/4, $9
    40  DATA swap32+8(SB)/4, $10
    41  DATA swap32+12(SB)/4, $11
    42  DATA swap32+16(SB)/4, $12
    43  DATA swap32+20(SB)/4, $13
    44  DATA swap32+24(SB)/4, $14
    45  DATA swap32+28(SB)/4, $15
    46  DATA swap32+32(SB)/4, $4
    47  DATA swap32+36(SB)/4, $5
    48  DATA swap32+40(SB)/4, $6
    49  DATA swap32+44(SB)/4, $7
    50  DATA swap32+48(SB)/4, $2
    51  DATA swap32+52(SB)/4, $3
    52  DATA swap32+56(SB)/4, $0
    53  DATA swap32+60(SB)/4, $1
    54  GLOBL swap32(SB), RODATA|NOPTR, $64
    55  
    56  // func combinedBoundsInt32(data []int32) (min, max int32)
    57  TEXT ·combinedBoundsInt32(SB), NOSPLIT, $-32
    58      MOVQ data_base+0(FP), AX
    59      MOVQ data_len+8(FP), CX
    60      XORQ R8, R8
    61      XORQ R9, R9
    62  
    63      CMPQ CX, $0
    64      JE done
    65      XORQ SI, SI
    66      MOVLQZX (AX), R8 // min
    67      MOVLQZX (AX), R9 // max
    68  
    69      CMPB ·hasAVX512VL(SB), $0
    70      JE loop
    71  
    72      CMPQ CX, $32
    73      JB loop
    74  
    75      MOVQ CX, DI
    76      SHRQ $5, DI
    77      SHLQ $5, DI
    78      VPBROADCASTD (AX), Z0
    79      VPBROADCASTD (AX), Z3
    80  loop32:
    81      VMOVDQU32 (AX)(SI*4), Z1
    82      VMOVDQU32 64(AX)(SI*4), Z2
    83      VPMINSD Z1, Z0, Z0
    84      VPMINSD Z2, Z0, Z0
    85      VPMAXSD Z1, Z3, Z3
    86      VPMAXSD Z2, Z3, Z3
    87      ADDQ $32, SI
    88      CMPQ SI, DI
    89      JNE loop32
    90  
    91      VMOVDQU32 swap32+0(SB), Z1
    92      VMOVDQU32 swap32+0(SB), Z2
    93      VPERMI2D Z0, Z0, Z1
    94      VPERMI2D Z3, Z3, Z2
    95      VPMINSD Y1, Y0, Y0
    96      VPMAXSD Y2, Y3, Y3
    97  
    98      VMOVDQU32 swap32+32(SB), Y1
    99      VMOVDQU32 swap32+32(SB), Y2
   100      VPERMI2D Y0, Y0, Y1
   101      VPERMI2D Y3, Y3, Y2
   102      VPMINSD X1, X0, X0
   103      VPMAXSD X2, X3, X3
   104  
   105      VMOVDQU32 swap32+48(SB), X1
   106      VMOVDQU32 swap32+48(SB), X2
   107      VPERMI2D X0, X0, X1
   108      VPERMI2D X3, X3, X2
   109      VPMINSD X1, X0, X0
   110      VPMAXSD X2, X3, X3
   111      VZEROUPPER
   112  
   113      MOVQ X0, BX
   114      MOVQ X3, DX
   115      MOVL BX, R8
   116      MOVL DX, R9
   117      SHRQ $32, BX
   118      SHRQ $32, DX
   119      CMPL BX, R8
   120      CMOVLLT BX, R8
   121      CMPL DX, R9
   122      CMOVLGT DX, R9
   123  
   124      CMPQ SI, CX
   125      JE done
   126  loop:
   127      MOVLQZX (AX)(SI*4), DX
   128      CMPL DX, R8
   129      CMOVLLT DX, R8
   130      CMPL DX, R9
   131      CMOVLGT DX, R9
   132      INCQ SI
   133      CMPQ SI, CX
   134      JNE loop
   135  done:
   136      MOVL R8, min+24(FP)
   137      MOVL R9, max+28(FP)
   138      RET
   139  
   140  // func combinedBoundsInt64(data []int64) (min, max int64)
   141  TEXT ·combinedBoundsInt64(SB), NOSPLIT, $-40
   142      MOVQ data_base+0(FP), AX
   143      MOVQ data_len+8(FP), CX
   144      XORQ R8, R8
   145      XORQ R9, R9
   146  
   147      CMPQ CX, $0
   148      JE done
   149      XORQ SI, SI
   150      MOVQ (AX), R8 // min
   151      MOVQ (AX), R9 // max
   152  
   153      CMPB ·hasAVX512VL(SB), $0
   154      JE loop
   155  
   156      CMPQ CX, $16
   157      JB loop
   158  
   159      MOVQ CX, DI
   160      SHRQ $4, DI
   161      SHLQ $4, DI
   162      VPBROADCASTQ (AX), Z0
   163      VPBROADCASTQ (AX), Z3
   164  loop16:
   165      VMOVDQU64 (AX)(SI*8), Z1
   166      VMOVDQU64 64(AX)(SI*8), Z2
   167      VPMINSQ Z1, Z0, Z0
   168      VPMINSQ Z2, Z0, Z0
   169      VPMAXSQ Z1, Z3, Z3
   170      VPMAXSQ Z2, Z3, Z3
   171      ADDQ $16, SI
   172      CMPQ SI, DI
   173      JNE loop16
   174  
   175      VMOVDQU32 swap32+0(SB), Z1
   176      VMOVDQU32 swap32+0(SB), Z2
   177      VPERMI2D Z0, Z0, Z1
   178      VPERMI2D Z3, Z3, Z2
   179      VPMINSQ Y1, Y0, Y0
   180      VPMAXSQ Y2, Y3, Y3
   181  
   182      VMOVDQU32 swap32+32(SB), Y1
   183      VMOVDQU32 swap32+32(SB), Y2
   184      VPERMI2D Y0, Y0, Y1
   185      VPERMI2D Y3, Y3, Y2
   186      VPMINSQ X1, X0, X0
   187      VPMAXSQ X2, X3, X3
   188  
   189      VMOVDQU32 swap32+48(SB), X1
   190      VMOVDQU32 swap32+48(SB), X2
   191      VPERMI2D X0, X0, X1
   192      VPERMI2D X3, X3, X2
   193      VPMINSQ X1, X0, X0
   194      VPMAXSQ X2, X3, X3
   195      VZEROUPPER
   196  
   197      MOVQ X0, R8
   198      MOVQ X3, R9
   199      CMPQ SI, CX
   200      JE done
   201  loop:
   202      MOVQ (AX)(SI*8), DX
   203      CMPQ DX, R8
   204      CMOVQLT DX, R8
   205      CMPQ DX, R9
   206      CMOVQGT DX, R9
   207      INCQ SI
   208      CMPQ SI, CX
   209      JNE loop
   210  done:
   211      MOVQ R8, min+24(FP)
   212      MOVQ R9, max+32(FP)
   213      RET
   214  
   215  // func combinedBoundsUint32(data []uint32) (min, max uint32)
   216  TEXT ·combinedBoundsUint32(SB), NOSPLIT, $-32
   217      MOVQ data_base+0(FP), AX
   218      MOVQ data_len+8(FP), CX
   219      XORQ R8, R8
   220      XORQ R9, R9
   221  
   222      CMPQ CX, $0
   223      JE done
   224      XORQ SI, SI
   225      MOVLQZX (AX), R8 // min
   226      MOVLQZX (AX), R9 // max
   227  
   228      CMPB ·hasAVX512VL(SB), $0
   229      JE loop
   230  
   231      CMPQ CX, $32
   232      JB loop
   233  
   234      MOVQ CX, DI
   235      SHRQ $5, DI
   236      SHLQ $5, DI
   237      VPBROADCASTD (AX), Z0
   238      VPBROADCASTD (AX), Z3
   239  loop32:
   240      VMOVDQU32 (AX)(SI*4), Z1
   241      VMOVDQU32 64(AX)(SI*4), Z2
   242      VPMINUD Z1, Z0, Z0
   243      VPMINUD Z2, Z0, Z0
   244      VPMAXUD Z1, Z3, Z3
   245      VPMAXUD Z2, Z3, Z3
   246      ADDQ $32, SI
   247      CMPQ SI, DI
   248      JNE loop32
   249  
   250      VMOVDQU32 swap32+0(SB), Z1
   251      VMOVDQU32 swap32+0(SB), Z2
   252      VPERMI2D Z0, Z0, Z1
   253      VPERMI2D Z3, Z3, Z2
   254      VPMINUD Y1, Y0, Y0
   255      VPMAXUD Y2, Y3, Y3
   256  
   257      VMOVDQU32 swap32+32(SB), Y1
   258      VMOVDQU32 swap32+32(SB), Y2
   259      VPERMI2D Y0, Y0, Y1
   260      VPERMI2D Y3, Y3, Y2
   261      VPMINUD X1, X0, X0
   262      VPMAXUD X2, X3, X3
   263  
   264      VMOVDQU32 swap32+48(SB), X1
   265      VMOVDQU32 swap32+48(SB), X2
   266      VPERMI2D X0, X0, X1
   267      VPERMI2D X3, X3, X2
   268      VPMINUD X1, X0, X0
   269      VPMAXUD X2, X3, X3
   270      VZEROUPPER
   271  
   272      MOVQ X0, BX
   273      MOVQ X3, DX
   274      MOVL BX, R8
   275      MOVL DX, R9
   276      SHRQ $32, BX
   277      SHRQ $32, DX
   278      CMPL BX, R8
   279      CMOVLCS BX, R8
   280      CMPL DX, R9
   281      CMOVLHI DX, R9
   282  
   283      CMPQ SI, CX
   284      JE done
   285  loop:
   286      MOVLQZX (AX)(SI*4), DX
   287      CMPL DX, R8
   288      CMOVLCS DX, R8
   289      CMPL DX, R9
   290      CMOVLHI DX, R9
   291      INCQ SI
   292      CMPQ SI, CX
   293      JNE loop
   294  done:
   295      MOVL R8, min+24(FP)
   296      MOVL R9, max+28(FP)
   297      RET
   298  
   299  // func combinedBoundsUint64(data []uint64) (min, max uint64)
   300  TEXT ·combinedBoundsUint64(SB), NOSPLIT, $-40
   301      MOVQ data_base+0(FP), AX
   302      MOVQ data_len+8(FP), CX
   303      XORQ R8, R8
   304      XORQ R9, R9
   305  
   306      CMPQ CX, $0
   307      JE done
   308      XORQ SI, SI
   309      MOVQ (AX), R8 // min
   310      MOVQ (AX), R9 // max
   311  
   312      CMPB ·hasAVX512VL(SB), $0
   313      JE loop
   314  
   315      CMPQ CX, $16
   316      JB loop
   317  
   318      MOVQ CX, DI
   319      SHRQ $4, DI
   320      SHLQ $4, DI
   321      VPBROADCASTQ (AX), Z0
   322      VPBROADCASTQ (AX), Z3
   323  loop16:
   324      VMOVDQU64 (AX)(SI*8), Z1
   325      VMOVDQU64 64(AX)(SI*8), Z2
   326      VPMINUQ Z1, Z0, Z0
   327      VPMINUQ Z2, Z0, Z0
   328      VPMAXUQ Z1, Z3, Z3
   329      VPMAXUQ Z2, Z3, Z3
   330      ADDQ $16, SI
   331      CMPQ SI, DI
   332      JNE loop16
   333  
   334      VMOVDQU32 swap32+0(SB), Z1
   335      VMOVDQU32 swap32+0(SB), Z2
   336      VPERMI2D Z0, Z0, Z1
   337      VPERMI2D Z3, Z3, Z2
   338      VPMINUQ Y1, Y0, Y0
   339      VPMAXUQ Y2, Y3, Y3
   340  
   341      VMOVDQU32 swap32+32(SB), Y1
   342      VMOVDQU32 swap32+32(SB), Y2
   343      VPERMI2D Y0, Y0, Y1
   344      VPERMI2D Y3, Y3, Y2
   345      VPMINUQ X1, X0, X0
   346      VPMAXUQ X2, X3, X3
   347  
   348      VMOVDQU32 swap32+48(SB), X1
   349      VMOVDQU32 swap32+48(SB), X2
   350      VPERMI2D X0, X0, X1
   351      VPERMI2D X3, X3, X2
   352      VPMINUQ X1, X0, X0
   353      VPMAXUQ X2, X3, X3
   354      VZEROUPPER
   355  
   356      MOVQ X0, R8
   357      MOVQ X3, R9
   358      CMPQ SI, CX
   359      JE done
   360  loop:
   361      MOVQ (AX)(SI*8), DX
   362      CMPQ DX, R8
   363      CMOVQCS DX, R8
   364      CMPQ DX, R9
   365      CMOVQHI DX, R9
   366      INCQ SI
   367      CMPQ SI, CX
   368      JNE loop
   369  done:
   370      MOVQ R8, min+24(FP)
   371      MOVQ R9, max+32(FP)
   372      RET
   373  
   374  // func combinedBoundsFloat32(data []float32) (min, max float32)
   375  TEXT ·combinedBoundsFloat32(SB), NOSPLIT, $-32
   376      MOVQ data_base+0(FP), AX
   377      MOVQ data_len+8(FP), CX
   378      XORQ R8, R8
   379      XORQ R9, R9
   380  
   381      CMPQ CX, $0
   382      JE done
   383      XORPS X0, X0
   384      XORPS X1, X1
   385      XORQ SI, SI
   386      MOVLQZX (AX), R8 // min
   387      MOVLQZX (AX), R9 // max
   388      MOVQ R8, X0
   389      MOVQ R9, X1
   390  
   391      CMPB ·hasAVX512VL(SB), $0
   392      JE loop
   393  
   394      CMPQ CX, $32
   395      JB loop
   396  
   397      MOVQ CX, DI
   398      SHRQ $5, DI
   399      SHLQ $5, DI
   400      VPBROADCASTD (AX), Z0
   401      VPBROADCASTD (AX), Z3
   402  loop32:
   403      VMOVDQU32 (AX)(SI*4), Z1
   404      VMOVDQU32 64(AX)(SI*4), Z2
   405      VMINPS Z1, Z0, Z0
   406      VMINPS Z2, Z0, Z0
   407      VMAXPS Z1, Z3, Z3
   408      VMAXPS Z2, Z3, Z3
   409      ADDQ $32, SI
   410      CMPQ SI, DI
   411      JNE loop32
   412  
   413      VMOVDQU32 swap32+0(SB), Z1
   414      VMOVDQU32 swap32+0(SB), Z2
   415      VPERMI2D Z0, Z0, Z1
   416      VPERMI2D Z3, Z3, Z2
   417      VMINPS Y1, Y0, Y0
   418      VMAXPS Y2, Y3, Y3
   419  
   420      VMOVDQU32 swap32+32(SB), Y1
   421      VMOVDQU32 swap32+32(SB), Y2
   422      VPERMI2D Y0, Y0, Y1
   423      VPERMI2D Y3, Y3, Y2
   424      VMINPS X1, X0, X0
   425      VMAXPS X2, X3, X3
   426  
   427      VMOVDQU32 swap32+48(SB), X1
   428      VMOVDQU32 swap32+48(SB), X2
   429      VPERMI2D X0, X0, X1
   430      VPERMI2D X3, X3, X2
   431      VMINPS X1, X0, X0
   432      VMAXPS X2, X3, X3
   433      VZEROUPPER
   434  
   435      MOVAPS X0, X1
   436      MOVAPS X3, X2
   437  
   438      PSRLQ $32, X1
   439      MOVQ X0, R8
   440      MOVQ X1, R10
   441      UCOMISS X0, X1
   442      CMOVLCS R10, R8
   443  
   444      PSRLQ $32, X2
   445      MOVQ X3, R9
   446      MOVQ X2, R11
   447      UCOMISS X3, X2
   448      CMOVLHI R11, R9
   449  
   450      CMPQ SI, CX
   451      JE done
   452      MOVQ R8, X0
   453      MOVQ R9, X1
   454  loop:
   455      MOVLQZX (AX)(SI*4), DX
   456      MOVQ DX, X2
   457      UCOMISS X0, X2
   458      CMOVLCS DX, R8
   459      UCOMISS X1, X2
   460      CMOVLHI DX, R9
   461      MOVQ R8, X0
   462      MOVQ R9, X1
   463      INCQ SI
   464      CMPQ SI, CX
   465      JNE loop
   466  done:
   467      MOVL R8, min+24(FP)
   468      MOVL R9, max+28(FP)
   469      RET
   470  
   471  // func combinedBoundsFloat64(data []float64) (min, max float64)
   472  TEXT ·combinedBoundsFloat64(SB), NOSPLIT, $-40
   473      MOVQ data_base+0(FP), AX
   474      MOVQ data_len+8(FP), CX
   475      XORQ R8, R8
   476      XORQ R9, R9
   477  
   478      CMPQ CX, $0
   479      JE done
   480      XORPD X0, X0
   481      XORPD X1, X1
   482      XORQ SI, SI
   483      MOVQ (AX), R8 // min
   484      MOVQ (AX), R9 // max
   485      MOVQ R8, X0
   486      MOVQ R9, X1
   487  
   488      CMPB ·hasAVX512VL(SB), $0
   489      JE loop
   490  
   491      CMPQ CX, $16
   492      JB loop
   493  
   494      MOVQ CX, DI
   495      SHRQ $4, DI
   496      SHLQ $4, DI
   497      VPBROADCASTQ (AX), Z0
   498      VPBROADCASTQ (AX), Z3
   499  loop16:
   500      VMOVDQU64 (AX)(SI*8), Z1
   501      VMOVDQU64 64(AX)(SI*8), Z2
   502      VMINPD Z1, Z0, Z0
   503      VMINPD Z2, Z0, Z0
   504      VMAXPD Z1, Z3, Z3
   505      VMAXPD Z2, Z3, Z3
   506      ADDQ $16, SI
   507      CMPQ SI, DI
   508      JNE loop16
   509  
   510      VMOVDQU64 swap32+0(SB), Z1
   511      VMOVDQU64 swap32+0(SB), Z2
   512      VPERMI2D Z0, Z0, Z1
   513      VPERMI2D Z3, Z3, Z2
   514      VMINPD Y1, Y0, Y0
   515      VMAXPD Y2, Y3, Y3
   516  
   517      VMOVDQU64 swap32+32(SB), Y1
   518      VMOVDQU64 swap32+32(SB), Y2
   519      VPERMI2D Y0, Y0, Y1
   520      VPERMI2D Y3, Y3, Y2
   521      VMINPD X1, X0, X0
   522      VMAXPD X2, X3, X3
   523  
   524      VMOVDQU64 swap32+48(SB), X1
   525      VMOVDQU64 swap32+48(SB), X2
   526      VPERMI2D X0, X0, X1
   527      VPERMI2D X3, X3, X2
   528      VMINPD X1, X0, X0
   529      VMAXPD X2, X3, X1
   530      VZEROUPPER
   531  
   532      MOVQ X0, R8
   533      MOVQ X1, R9
   534      CMPQ SI, CX
   535      JE done
   536  loop:
   537      MOVQ (AX)(SI*8), DX
   538      MOVQ DX, X2
   539      UCOMISD X0, X2
   540      CMOVQCS DX, R8
   541      UCOMISD X1, X2
   542      CMOVQHI DX, R9
   543      MOVQ R8, X0
   544      MOVQ R9, X1
   545      INCQ SI
   546      CMPQ SI, CX
   547      JNE loop
   548  done:
   549      MOVQ R8, min+24(FP)
   550      MOVQ R9, max+32(FP)
   551      RET