diff --git a/luaconf.h b/luaconf.h
index d42d14b7..75647e72 100644
--- a/luaconf.h
+++ b/luaconf.h
@@ -731,7 +731,7 @@
 ** (It must fit into max(size_t)/32.)
 */
 #if LUAI_IS32INT
-#define LUAI_MAXSTACK		1000000
+#define LUAI_MAXSTACK		4096
 #else
 #define LUAI_MAXSTACK		15000
 #endif
diff --git a/makefile b/makefile
index d46e650c..c27e5677 100644
--- a/makefile
+++ b/makefile
@@ -66,13 +66,26 @@ LOCAL = $(TESTS) $(CWARNS)


 # enable Linux goodies
-MYCFLAGS= $(LOCAL) -std=c99 -DLUA_USE_LINUX -DLUA_USE_READLINE
+MYCFLAGS= $(LOCAL) -std=c99 -g -O2 -DLUA_USE_LINUX
-MYLDFLAGS= $(LOCAL) -Wl,-E
+# Commenting out dynamic linking flags because we link statically
+# and this does not work on MacOS: MYLDFLAGS= $(LOCAL) -Wl,-E
-MYLIBS= -ldl -lreadline
+MYLIBS= -ldl

+uname_m := $(shell uname -m)
+
+# equivalent to: if $(uname_m) == x86_64 || $(uname_m) == amd64
+ifneq (, $(filter $(uname_m),x86_64 amd64))
+OPTFLAGS= -march=sandybridge
+else ifneq (, $(filter $(uname_m),aarch64 arm64))
+OPTFLAGS= -march=armv8.2-a+fp16+rcpc+dotprod+crypto
+else ifeq ($(uname_m), s390x)
+OPTFLAGS= -march=native
+else
+  $(error ERROR: unknown architecture $(uname_m))
+endif

 CC= gcc
-CFLAGS= -Wall -O2 $(MYCFLAGS) -fno-stack-protector -fno-common -march=native
+CFLAGS= -Wall -O2 $(MYCFLAGS) -fno-stack-protector -fno-common $(OPTFLAGS)
 AR= ar rc
 RANLIB= ranlib
 RM= rm -f
