mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-23 16:58:09 +02:00
Add some alignment tests
This commit is contained in:
@@ -10,7 +10,6 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
"unsafe"
|
|
||||||
|
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
|
|
||||||
@@ -34,19 +33,9 @@ func wait_for_file_to_grow(file_name string, limit int64) (err error) {
|
|||||||
return
|
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) {
|
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
|
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 := make([]byte, buf_capacity)
|
||||||
buf := aligned_slice(buf_storage[:], 64)[:buf_capacity]
|
|
||||||
output_buf := strings.Builder{}
|
output_buf := strings.Builder{}
|
||||||
output_buf.Grow(buf_capacity)
|
output_buf.Grow(buf_capacity)
|
||||||
var err error
|
var err error
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
"github.com/google/go-cmp/cmp"
|
"github.com/google/go-cmp/cmp"
|
||||||
)
|
)
|
||||||
@@ -114,6 +115,18 @@ func get_sizes(t *testing.T) []int {
|
|||||||
return sizes
|
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) {
|
func TestSIMDStringOps(t *testing.T) {
|
||||||
sizes := get_sizes(t)
|
sizes := get_sizes(t)
|
||||||
test := func(haystack []byte, a, b byte) {
|
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) {
|
tests := func(h string, a, b byte) {
|
||||||
for _, sz := range []int{0, 16, 32, 64, 79} {
|
for _, sz := range []int{0, 16, 32, 64, 79} {
|
||||||
q := strings.Repeat(" ", sz) + h
|
q := strings.Repeat(" ", sz) + h
|
||||||
|
|||||||
Reference in New Issue
Block a user