diff --git a/Makefile b/Makefile index 03dfd77c..e8224d80 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ VERSION = 1.6 PREFIX ?= /usr/local MANPREFIX = $(PREFIX)/share/man -CFLAGS += -Wall -Wextra -Wno-unused-parameter +CFLAGS += -O3 -Wall -Wextra -Wno-unused-parameter LDLIBS = -lreadline ifeq ($(shell pkg-config ncursesw && echo 1),1) @@ -23,7 +23,7 @@ all: $(BIN) $(PLAYER) $(SRC): nnn.h $(BIN): $(SRC) - $(CC) -O2 $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LDLIBS) + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LDLIBS) strip $@ debug: $(SRC) diff --git a/nnn.c b/nnn.c index fb1d5b4e..721ef80b 100644 --- a/nnn.c +++ b/nnn.c @@ -357,11 +357,12 @@ xstrlen(const char *s) static size_t xstrlcpy(char *dest, const char *src, size_t n) { + static ulong *s, *d; static size_t len, blocks; static const uint lsize = sizeof(ulong); static const uint _WSHIFT = (sizeof(ulong) == 8) ? 3 : 2; - if (!src || !dest) + if (!src || !dest || !n) return 0; len = xstrlen(src) + 1; @@ -371,17 +372,15 @@ xstrlcpy(char *dest, const char *src, size_t n) /* Save total number of bytes to copy in len */ len = n; - if (n >= lsize) { - blocks = n >> _WSHIFT; - n -= (blocks << _WSHIFT); - } else - blocks = 0; - - if (blocks) { - static ulong *s, *d; - + /* + * To enable -O3 ensure src and dest are 16-byte aligned + * More info: http://www.felixcloutier.com/x86/MOVDQA.html + */ + if ((n >= lsize) && !((ulong)src & (ulong)dest & 0xF)) { s = (ulong *)src; d = (ulong *)dest; + blocks = n >> _WSHIFT; + n -= (blocks << _WSHIFT); while (blocks) { *d = *s;