Add some alignment tests

This commit is contained in:
Kovid Goyal 2024-02-11 07:25:04 +05:30
parent bbdb0b15f3
commit 7467307200
No known key found for this signature in database
GPG key ID: 06BC317B515ACE7C
2 changed files with 26 additions and 12 deletions

View file

@ -10,7 +10,6 @@ import (
"os"
"strings"
"time"
"unsafe"
"golang.org/x/sys/unix"
@ -34,19 +33,9 @@ func wait_for_file_to_grow(file_name string, limit int64) (err error) {
return
}
func aligned_slice(b []byte, alignment uintptr) []byte {
addr := uintptr(unsafe.Pointer(&b))
extra := addr & (alignment - 1)
if extra > 0 {
return b[alignment-extra:]
}
return b
}
func read_input(input_file *os.File, input_file_name string, input_channel chan<- input_line_struct, follow bool, count_carriage_returns bool) {
const buf_capacity = 8192
var buf_storage [buf_capacity + 128]byte // ensure we have an 64 byte aligned slice with at least 64 bytes after it
buf := aligned_slice(buf_storage[:], 64)[:buf_capacity]
buf := make([]byte, buf_capacity)
output_buf := strings.Builder{}
output_buf.Grow(buf_capacity)
var err error

View file

@ -8,6 +8,7 @@ import (
"runtime"
"strings"
"testing"
"unsafe"
"github.com/google/go-cmp/cmp"
)
@ -114,6 +115,18 @@ func get_sizes(t *testing.T) []int {
return sizes
}
func addressof_data(b []byte) uintptr {
return uintptr(unsafe.Pointer(&b[0]))
}
func aligned_slice(sz, alignment int) []byte {
ans := make([]byte, sz+alignment)
a := addressof_data(ans)
a &= uintptr(alignment - 1)
extra := uintptr(alignment) - a
return ans[extra : extra+uintptr(sz)]
}
func TestSIMDStringOps(t *testing.T) {
sizes := get_sizes(t)
test := func(haystack []byte, a, b byte) {
@ -136,6 +149,18 @@ func TestSIMDStringOps(t *testing.T) {
}
}
// test alignment issues
for sz := 0; sz < 32; sz++ {
q := aligned_slice(sz+3, 64)[sz:]
q[0] = 'a'
q[1] = 'b'
q[2] = 'c'
test(q, '<', '>')
test(q, '<', 'a')
test(q, '<', 'b')
test(q, 'c', '>')
}
tests := func(h string, a, b byte) {
for _, sz := range []int{0, 16, 32, 64, 79} {
q := strings.Repeat(" ", sz) + h