|
3 | 3 | // Use of this source code is governed by a BSD-style |
4 | 4 | // license that can be found in the LICENSE file. |
5 | 5 |
|
6 | | -//go:build !arm64 && !amd64 |
| 6 | +//go:build !arm64 |
7 | 7 |
|
8 | 8 | package schulze |
9 | 9 |
|
10 | 10 | import "unsafe" |
11 | 11 |
|
12 | 12 | func relaxRowInt(rowI, rowJ unsafe.Pointer, jip int, n int) { |
13 | | - for k := 0; k < n; k++ { |
14 | | - ikp := (*int)(unsafe.Add(rowI, uintptr(k)*8)) |
15 | | - jkp := (*int)(unsafe.Add(rowJ, uintptr(k)*8)) |
16 | | - m := min(jip, *ikp) |
17 | | - if m > *jkp { |
18 | | - *jkp = m |
| 13 | + rowISlice := unsafe.Slice((*int)(rowI), n) |
| 14 | + rowJSlice := unsafe.Slice((*int)(rowJ), n) |
| 15 | + |
| 16 | + const step = 8 |
| 17 | + mod := n % step |
| 18 | + end := n - mod |
| 19 | + |
| 20 | + for k := 0; k < end; k += step { |
| 21 | + if m := min(jip, rowISlice[k]); m > rowJSlice[k] { |
| 22 | + rowJSlice[k] = m |
| 23 | + } |
| 24 | + if m := min(jip, rowISlice[k+1]); m > rowJSlice[k+1] { |
| 25 | + rowJSlice[k+1] = m |
| 26 | + } |
| 27 | + if m := min(jip, rowISlice[k+2]); m > rowJSlice[k+2] { |
| 28 | + rowJSlice[k+2] = m |
| 29 | + } |
| 30 | + if m := min(jip, rowISlice[k+3]); m > rowJSlice[k+3] { |
| 31 | + rowJSlice[k+3] = m |
| 32 | + } |
| 33 | + if m := min(jip, rowISlice[k+4]); m > rowJSlice[k+4] { |
| 34 | + rowJSlice[k+4] = m |
| 35 | + } |
| 36 | + if m := min(jip, rowISlice[k+5]); m > rowJSlice[k+5] { |
| 37 | + rowJSlice[k+5] = m |
| 38 | + } |
| 39 | + if m := min(jip, rowISlice[k+6]); m > rowJSlice[k+6] { |
| 40 | + rowJSlice[k+6] = m |
| 41 | + } |
| 42 | + if m := min(jip, rowISlice[k+7]); m > rowJSlice[k+7] { |
| 43 | + rowJSlice[k+7] = m |
| 44 | + } |
| 45 | + } |
| 46 | + |
| 47 | + for k := end; k < n; k++ { |
| 48 | + if m := min(jip, rowISlice[k]); m > rowJSlice[k] { |
| 49 | + rowJSlice[k] = m |
19 | 50 | } |
20 | 51 | } |
21 | 52 | } |
0 commit comments