gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

md5-util_amd64.go (2045B)


      1 //+build !noasm,!appengine,gc
      2 
      3 // Copyright (c) 2020 MinIO Inc. All rights reserved.
      4 // Use of this source code is governed by a license that can be
      5 // found in the LICENSE file.
      6 
      7 package md5simd
      8 
      9 // Helper struct for sorting blocks based on length
     10 type lane struct {
     11 	len uint
     12 	pos uint
     13 }
     14 
     15 type digest struct {
     16 	s [4]uint32
     17 }
     18 
     19 // Helper struct for generating number of rounds in combination with mask for valid lanes
     20 type maskRounds struct {
     21 	mask   uint64
     22 	rounds uint64
     23 }
     24 
     25 func generateMaskAndRounds8(input [8][]byte, mr *[8]maskRounds) (rounds int) {
     26 	// Sort on blocks length small to large
     27 	var sorted [8]lane
     28 	for c, inpt := range input[:] {
     29 		sorted[c] = lane{uint(len(inpt)), uint(c)}
     30 		for i := c - 1; i >= 0; i-- {
     31 			// swap so largest is at the end...
     32 			if sorted[i].len > sorted[i+1].len {
     33 				sorted[i], sorted[i+1] = sorted[i+1], sorted[i]
     34 				continue
     35 			}
     36 			break
     37 		}
     38 	}
     39 
     40 	// Create mask array including 'rounds' (of processing blocks of 64 bytes) between masks
     41 	m, round := uint64(0xff), uint64(0)
     42 
     43 	for _, s := range sorted[:] {
     44 		if s.len > 0 {
     45 			if uint64(s.len)>>6 > round {
     46 				mr[rounds] = maskRounds{m, (uint64(s.len) >> 6) - round}
     47 				rounds++
     48 			}
     49 			round = uint64(s.len) >> 6
     50 		}
     51 		m = m & ^(1 << uint(s.pos))
     52 	}
     53 	return
     54 }
     55 
     56 func generateMaskAndRounds16(input [16][]byte, mr *[16]maskRounds) (rounds int) {
     57 	// Sort on blocks length small to large
     58 	var sorted [16]lane
     59 	for c, inpt := range input[:] {
     60 		sorted[c] = lane{uint(len(inpt)), uint(c)}
     61 		for i := c - 1; i >= 0; i-- {
     62 			// swap so largest is at the end...
     63 			if sorted[i].len > sorted[i+1].len {
     64 				sorted[i], sorted[i+1] = sorted[i+1], sorted[i]
     65 				continue
     66 			}
     67 			break
     68 		}
     69 	}
     70 
     71 	// Create mask array including 'rounds' (of processing blocks of 64 bytes) between masks
     72 	m, round := uint64(0xffff), uint64(0)
     73 
     74 	for _, s := range sorted[:] {
     75 		if s.len > 0 {
     76 			if uint64(s.len)>>6 > round {
     77 				mr[rounds] = maskRounds{m, (uint64(s.len) >> 6) - round}
     78 				rounds++
     79 			}
     80 			round = uint64(s.len) >> 6
     81 		}
     82 		m = m & ^(1 << uint(s.pos))
     83 	}
     84 	return
     85 }