diff --git a/build/gmake/Makefile b/build/gmake/Makefile
index b058bcb..01b5bc8 100644
--- a/build/gmake/Makefile
+++ b/build/gmake/Makefile
@@ -18,6 +18,14 @@ ifeq ($(config),debug_x32)
libjpeg_turbo_config = debug_x32
freetype_config = debug_x32
endif
+ifeq ($(config),debug_x64)
+ cnq3_config = debug_x64
+ cnq3_server_config = debug_x64
+ botlib_config = debug_x64
+ renderer_config = debug_x64
+ libjpeg_turbo_config = debug_x64
+ freetype_config = debug_x64
+endif
ifeq ($(config),release_x32)
cnq3_config = release_x32
cnq3_server_config = release_x32
@@ -26,6 +34,14 @@ ifeq ($(config),release_x32)
libjpeg_turbo_config = release_x32
freetype_config = release_x32
endif
+ifeq ($(config),release_x64)
+ cnq3_config = release_x64
+ cnq3_server_config = release_x64
+ botlib_config = release_x64
+ renderer_config = release_x64
+ libjpeg_turbo_config = release_x64
+ freetype_config = release_x64
+endif
PROJECTS := cnq3 cnq3-server botlib renderer libjpeg-turbo freetype
@@ -82,7 +98,9 @@ help:
@echo ""
@echo "CONFIGURATIONS:"
@echo " debug_x32"
+ @echo " debug_x64"
@echo " release_x32"
+ @echo " release_x64"
@echo ""
@echo "TARGETS:"
@echo " all (default)"
diff --git a/build/gmake/botlib.make b/build/gmake/botlib.make
index 335c3c2..82fdf97 100644
--- a/build/gmake/botlib.make
+++ b/build/gmake/botlib.make
@@ -12,7 +12,7 @@ endif
ifeq ($(config),debug_x32)
RESCOMP = windres
- TARGETDIR = ../../../.bin/debug
+ TARGETDIR = ../../../.bin/debug_x32
TARGET = $(TARGETDIR)/libbotlib.a
OBJDIR = obj/x32/debug/botlib
DEFINES += -DBOTLIB -DDEBUG -D_DEBUG
@@ -24,7 +24,34 @@ ifeq ($(config),debug_x32)
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
LIBS +=
LDDEPS +=
- ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/debug -m32
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/debug_x32 -m32
+ LINKCMD = $(AR) -rcs "$@" $(OBJECTS)
+ define PREBUILDCMDS
+ endef
+ define PRELINKCMDS
+ endef
+ define POSTBUILDCMDS
+ endef
+all: $(TARGETDIR) $(OBJDIR) prebuild prelink $(TARGET)
+ @:
+
+endif
+
+ifeq ($(config),debug_x64)
+ RESCOMP = windres
+ TARGETDIR = ../../../.bin/debug_x64
+ TARGET = $(TARGETDIR)/libbotlib.a
+ OBJDIR = obj/x64/debug/botlib
+ DEFINES += -DBOTLIB -DDEBUG -D_DEBUG
+ INCLUDES +=
+ FORCE_INCLUDE +=
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
+ ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m64 -g -Wno-unused-parameter -Wno-write-strings
+ ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) -fno-exceptions -fno-rtti
+ ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
+ LIBS +=
+ LDDEPS +=
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib64 -L../../../.bin/debug_x64 -m64
LINKCMD = $(AR) -rcs "$@" $(OBJECTS)
define PREBUILDCMDS
endef
@@ -39,7 +66,7 @@ endif
ifeq ($(config),release_x32)
RESCOMP = windres
- TARGETDIR = ../../../.bin/release
+ TARGETDIR = ../../../.bin/release_x32
TARGET = $(TARGETDIR)/libbotlib.a
OBJDIR = obj/x32/release/botlib
DEFINES += -DBOTLIB -DNDEBUG
@@ -51,7 +78,34 @@ ifeq ($(config),release_x32)
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
LIBS +=
LDDEPS +=
- ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/release -m32
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/release_x32 -m32
+ LINKCMD = $(AR) -rcs "$@" $(OBJECTS)
+ define PREBUILDCMDS
+ endef
+ define PRELINKCMDS
+ endef
+ define POSTBUILDCMDS
+ endef
+all: $(TARGETDIR) $(OBJDIR) prebuild prelink $(TARGET)
+ @:
+
+endif
+
+ifeq ($(config),release_x64)
+ RESCOMP = windres
+ TARGETDIR = ../../../.bin/release_x64
+ TARGET = $(TARGETDIR)/libbotlib.a
+ OBJDIR = obj/x64/release/botlib
+ DEFINES += -DBOTLIB -DNDEBUG
+ INCLUDES +=
+ FORCE_INCLUDE +=
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
+ ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m64 -fomit-frame-pointer -ffast-math -Os -g -msse2 -Wno-unused-parameter -Wno-write-strings -g1
+ ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) -fno-exceptions -fno-rtti
+ ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
+ LIBS +=
+ LDDEPS +=
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib64 -L../../../.bin/release_x64 -m64
LINKCMD = $(AR) -rcs "$@" $(OBJECTS)
define PREBUILDCMDS
endef
diff --git a/build/gmake/cnq3-server.make b/build/gmake/cnq3-server.make
index a39e307..e0bc966 100644
--- a/build/gmake/cnq3-server.make
+++ b/build/gmake/cnq3-server.make
@@ -12,7 +12,7 @@ endif
ifeq ($(config),debug_x32)
RESCOMP = windres
- TARGETDIR = ../../../.bin/debug
+ TARGETDIR = ../../../.bin/debug_x32
TARGET = $(TARGETDIR)/cnq3-server-x86
OBJDIR = obj/x32/debug/cnq3-server
DEFINES += -DDEDICATED -DDEBUG -D_DEBUG
@@ -22,9 +22,9 @@ ifeq ($(config),debug_x32)
ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m32 -g -Wno-unused-parameter -Wno-write-strings -x c++
ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) -fno-exceptions -fno-rtti
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
- LIBS += ../../../.bin/debug/libbotlib.a -ldl -lm
- LDDEPS += ../../../.bin/debug/libbotlib.a
- ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/debug -m32
+ LIBS += ../../../.bin/debug_x32/libbotlib.a -ldl -lm
+ LDDEPS += ../../../.bin/debug_x32/libbotlib.a
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/debug_x32 -m32
LINKCMD = $(CXX) -o "$@" $(OBJECTS) $(RESOURCES) $(ALL_LDFLAGS) $(LIBS)
define PREBUILDCMDS
@echo Running prebuild commands
@@ -34,7 +34,38 @@ ifeq ($(config),debug_x32)
endef
define POSTBUILDCMDS
@echo Running postbuild commands
- cp -u "../../../.bin/debug/cnq3-server-x86" "$(QUAKE3DIR)"
+ cp -u "../../../.bin/debug_x32/cnq3-server-x86" "$(QUAKE3DIR)"
+ endef
+all: $(TARGETDIR) $(OBJDIR) prebuild prelink $(TARGET)
+ @:
+
+endif
+
+ifeq ($(config),debug_x64)
+ RESCOMP = windres
+ TARGETDIR = ../../../.bin/debug_x64
+ TARGET = $(TARGETDIR)/cnq3-server-x64
+ OBJDIR = obj/x64/debug/cnq3-server
+ DEFINES += -DDEDICATED -DDEBUG -D_DEBUG
+ INCLUDES +=
+ FORCE_INCLUDE +=
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
+ ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m64 -g -Wno-unused-parameter -Wno-write-strings -x c++
+ ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) -fno-exceptions -fno-rtti
+ ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
+ LIBS += ../../../.bin/debug_x64/libbotlib.a -ldl -lm
+ LDDEPS += ../../../.bin/debug_x64/libbotlib.a
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib64 -L../../../.bin/debug_x64 -m64
+ LINKCMD = $(CXX) -o "$@" $(OBJECTS) $(RESOURCES) $(ALL_LDFLAGS) $(LIBS)
+ define PREBUILDCMDS
+ @echo Running prebuild commands
+ "../../../cnq3tools/git/create_git_header.sh" "../../code/qcommon/git.h"
+ endef
+ define PRELINKCMDS
+ endef
+ define POSTBUILDCMDS
+ @echo Running postbuild commands
+ cp -u "../../../.bin/debug_x64/cnq3-server-x64" "$(QUAKE3DIR)"
endef
all: $(TARGETDIR) $(OBJDIR) prebuild prelink $(TARGET)
@:
@@ -43,7 +74,7 @@ endif
ifeq ($(config),release_x32)
RESCOMP = windres
- TARGETDIR = ../../../.bin/release
+ TARGETDIR = ../../../.bin/release_x32
TARGET = $(TARGETDIR)/cnq3-server-x86
OBJDIR = obj/x32/release/cnq3-server
DEFINES += -DDEDICATED -DNDEBUG
@@ -53,9 +84,9 @@ ifeq ($(config),release_x32)
ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m32 -fomit-frame-pointer -ffast-math -Os -g -msse2 -Wno-unused-parameter -Wno-write-strings -g1 -x c++
ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) -fno-exceptions -fno-rtti
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
- LIBS += ../../../.bin/release/libbotlib.a -ldl -lm
- LDDEPS += ../../../.bin/release/libbotlib.a
- ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/release -m32
+ LIBS += ../../../.bin/release_x32/libbotlib.a -ldl -lm
+ LDDEPS += ../../../.bin/release_x32/libbotlib.a
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/release_x32 -m32
LINKCMD = $(CXX) -o "$@" $(OBJECTS) $(RESOURCES) $(ALL_LDFLAGS) $(LIBS)
define PREBUILDCMDS
@echo Running prebuild commands
@@ -65,7 +96,38 @@ ifeq ($(config),release_x32)
endef
define POSTBUILDCMDS
@echo Running postbuild commands
- cp -u "../../../.bin/release/cnq3-server-x86" "$(QUAKE3DIR)"
+ cp -u "../../../.bin/release_x32/cnq3-server-x86" "$(QUAKE3DIR)"
+ endef
+all: $(TARGETDIR) $(OBJDIR) prebuild prelink $(TARGET)
+ @:
+
+endif
+
+ifeq ($(config),release_x64)
+ RESCOMP = windres
+ TARGETDIR = ../../../.bin/release_x64
+ TARGET = $(TARGETDIR)/cnq3-server-x64
+ OBJDIR = obj/x64/release/cnq3-server
+ DEFINES += -DDEDICATED -DNDEBUG
+ INCLUDES +=
+ FORCE_INCLUDE +=
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
+ ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m64 -fomit-frame-pointer -ffast-math -Os -g -msse2 -Wno-unused-parameter -Wno-write-strings -g1 -x c++
+ ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) -fno-exceptions -fno-rtti
+ ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
+ LIBS += ../../../.bin/release_x64/libbotlib.a -ldl -lm
+ LDDEPS += ../../../.bin/release_x64/libbotlib.a
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib64 -L../../../.bin/release_x64 -m64
+ LINKCMD = $(CXX) -o "$@" $(OBJECTS) $(RESOURCES) $(ALL_LDFLAGS) $(LIBS)
+ define PREBUILDCMDS
+ @echo Running prebuild commands
+ "../../../cnq3tools/git/create_git_header.sh" "../../code/qcommon/git.h"
+ endef
+ define PRELINKCMDS
+ endef
+ define POSTBUILDCMDS
+ @echo Running postbuild commands
+ cp -u "../../../.bin/release_x64/cnq3-server-x64" "$(QUAKE3DIR)"
endef
all: $(TARGETDIR) $(OBJDIR) prebuild prelink $(TARGET)
@:
diff --git a/build/gmake/cnq3.make b/build/gmake/cnq3.make
index 40c5bc9..58a7558 100644
--- a/build/gmake/cnq3.make
+++ b/build/gmake/cnq3.make
@@ -12,7 +12,7 @@ endif
ifeq ($(config),debug_x32)
RESCOMP = windres
- TARGETDIR = ../../../.bin/debug
+ TARGETDIR = ../../../.bin/debug_x32
TARGET = $(TARGETDIR)/cnq3-x86
OBJDIR = obj/x32/debug/cnq3
DEFINES += -DDEBUG -D_DEBUG
@@ -22,9 +22,9 @@ ifeq ($(config),debug_x32)
ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m32 -g -Wno-unused-parameter -Wno-write-strings -pthread -x c++
ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) -fno-exceptions -fno-rtti
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
- LIBS += ../../../.bin/debug/libbotlib.a ../../../.bin/debug/librenderer.a ../../../.bin/debug/libfreetype.a ../../../.bin/debug/liblibjpeg-turbo.a -ldl -lm -lX11 -lpthread
- LDDEPS += ../../../.bin/debug/libbotlib.a ../../../.bin/debug/librenderer.a ../../../.bin/debug/libfreetype.a ../../../.bin/debug/liblibjpeg-turbo.a
- ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/debug -m32 ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jsimdcpu.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctflt-3dn.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctflt-3dn.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquant-3dn.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jccolor-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jcgray-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jcsample-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdcolor-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdmerge-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdsample-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctfst-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctint-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctfst-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctint-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctred-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquant-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctflt-sse.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctflt-sse.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquant-sse.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jccolor-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jcgray-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jchuff-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jcsample-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdcolor-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdmerge-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdsample-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctfst-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctint-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctflt-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctfst-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctint-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctred-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquantf-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquanti-sse2.obj
+ LIBS += ../../../.bin/debug_x32/libbotlib.a ../../../.bin/debug_x32/librenderer.a ../../../.bin/debug_x32/libfreetype.a ../../../.bin/debug_x32/liblibjpeg-turbo.a -ldl -lm -lX11 -lpthread
+ LDDEPS += ../../../.bin/debug_x32/libbotlib.a ../../../.bin/debug_x32/librenderer.a ../../../.bin/debug_x32/libfreetype.a ../../../.bin/debug_x32/liblibjpeg-turbo.a
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/debug_x32 -m32
LINKCMD = $(CXX) -o "$@" $(OBJECTS) $(RESOURCES) $(ALL_LDFLAGS) $(LIBS)
define PREBUILDCMDS
@echo Running prebuild commands
@@ -34,7 +34,38 @@ ifeq ($(config),debug_x32)
endef
define POSTBUILDCMDS
@echo Running postbuild commands
- cp -u "../../../.bin/debug/cnq3-x86" "$(QUAKE3DIR)"
+ cp -u "../../../.bin/debug_x32/cnq3-x86" "$(QUAKE3DIR)"
+ endef
+all: $(TARGETDIR) $(OBJDIR) prebuild prelink $(TARGET)
+ @:
+
+endif
+
+ifeq ($(config),debug_x64)
+ RESCOMP = windres
+ TARGETDIR = ../../../.bin/debug_x64
+ TARGET = $(TARGETDIR)/cnq3-x64
+ OBJDIR = obj/x64/debug/cnq3
+ DEFINES += -DDEBUG -D_DEBUG
+ INCLUDES += -I../../code/freetype/include
+ FORCE_INCLUDE +=
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
+ ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m64 -g -Wno-unused-parameter -Wno-write-strings -pthread -x c++
+ ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) -fno-exceptions -fno-rtti
+ ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
+ LIBS += ../../../.bin/debug_x64/libbotlib.a ../../../.bin/debug_x64/librenderer.a ../../../.bin/debug_x64/libfreetype.a ../../../.bin/debug_x64/liblibjpeg-turbo.a -ldl -lm -lX11 -lpthread
+ LDDEPS += ../../../.bin/debug_x64/libbotlib.a ../../../.bin/debug_x64/librenderer.a ../../../.bin/debug_x64/libfreetype.a ../../../.bin/debug_x64/liblibjpeg-turbo.a
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib64 -L../../../.bin/debug_x64 -m64
+ LINKCMD = $(CXX) -o "$@" $(OBJECTS) $(RESOURCES) $(ALL_LDFLAGS) $(LIBS)
+ define PREBUILDCMDS
+ @echo Running prebuild commands
+ "../../../cnq3tools/git/create_git_header.sh" "../../code/qcommon/git.h"
+ endef
+ define PRELINKCMDS
+ endef
+ define POSTBUILDCMDS
+ @echo Running postbuild commands
+ cp -u "../../../.bin/debug_x64/cnq3-x64" "$(QUAKE3DIR)"
endef
all: $(TARGETDIR) $(OBJDIR) prebuild prelink $(TARGET)
@:
@@ -43,7 +74,7 @@ endif
ifeq ($(config),release_x32)
RESCOMP = windres
- TARGETDIR = ../../../.bin/release
+ TARGETDIR = ../../../.bin/release_x32
TARGET = $(TARGETDIR)/cnq3-x86
OBJDIR = obj/x32/release/cnq3
DEFINES += -DNDEBUG
@@ -53,9 +84,9 @@ ifeq ($(config),release_x32)
ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m32 -fomit-frame-pointer -ffast-math -Os -g -msse2 -Wno-unused-parameter -Wno-write-strings -g1 -pthread -x c++
ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) -fno-exceptions -fno-rtti
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
- LIBS += ../../../.bin/release/libbotlib.a ../../../.bin/release/librenderer.a ../../../.bin/release/libfreetype.a ../../../.bin/release/liblibjpeg-turbo.a -ldl -lm -lX11 -lpthread
- LDDEPS += ../../../.bin/release/libbotlib.a ../../../.bin/release/librenderer.a ../../../.bin/release/libfreetype.a ../../../.bin/release/liblibjpeg-turbo.a
- ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/release -m32 ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jsimdcpu.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctflt-3dn.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctflt-3dn.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquant-3dn.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jccolor-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jcgray-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jcsample-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdcolor-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdmerge-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdsample-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctfst-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctint-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctfst-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctint-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctred-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquant-mmx.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctflt-sse.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctflt-sse.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquant-sse.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jccolor-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jcgray-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jchuff-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jcsample-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdcolor-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdmerge-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdsample-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctfst-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctint-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctflt-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctfst-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctint-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctred-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquantf-sse2.obj ../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquanti-sse2.obj
+ LIBS += ../../../.bin/release_x32/libbotlib.a ../../../.bin/release_x32/librenderer.a ../../../.bin/release_x32/libfreetype.a ../../../.bin/release_x32/liblibjpeg-turbo.a -ldl -lm -lX11 -lpthread
+ LDDEPS += ../../../.bin/release_x32/libbotlib.a ../../../.bin/release_x32/librenderer.a ../../../.bin/release_x32/libfreetype.a ../../../.bin/release_x32/liblibjpeg-turbo.a
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/release_x32 -m32
LINKCMD = $(CXX) -o "$@" $(OBJECTS) $(RESOURCES) $(ALL_LDFLAGS) $(LIBS)
define PREBUILDCMDS
@echo Running prebuild commands
@@ -65,7 +96,38 @@ ifeq ($(config),release_x32)
endef
define POSTBUILDCMDS
@echo Running postbuild commands
- cp -u "../../../.bin/release/cnq3-x86" "$(QUAKE3DIR)"
+ cp -u "../../../.bin/release_x32/cnq3-x86" "$(QUAKE3DIR)"
+ endef
+all: $(TARGETDIR) $(OBJDIR) prebuild prelink $(TARGET)
+ @:
+
+endif
+
+ifeq ($(config),release_x64)
+ RESCOMP = windres
+ TARGETDIR = ../../../.bin/release_x64
+ TARGET = $(TARGETDIR)/cnq3-x64
+ OBJDIR = obj/x64/release/cnq3
+ DEFINES += -DNDEBUG
+ INCLUDES += -I../../code/freetype/include
+ FORCE_INCLUDE +=
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
+ ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m64 -fomit-frame-pointer -ffast-math -Os -g -msse2 -Wno-unused-parameter -Wno-write-strings -g1 -pthread -x c++
+ ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) -fno-exceptions -fno-rtti
+ ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
+ LIBS += ../../../.bin/release_x64/libbotlib.a ../../../.bin/release_x64/librenderer.a ../../../.bin/release_x64/libfreetype.a ../../../.bin/release_x64/liblibjpeg-turbo.a -ldl -lm -lX11 -lpthread
+ LDDEPS += ../../../.bin/release_x64/libbotlib.a ../../../.bin/release_x64/librenderer.a ../../../.bin/release_x64/libfreetype.a ../../../.bin/release_x64/liblibjpeg-turbo.a
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib64 -L../../../.bin/release_x64 -m64
+ LINKCMD = $(CXX) -o "$@" $(OBJECTS) $(RESOURCES) $(ALL_LDFLAGS) $(LIBS)
+ define PREBUILDCMDS
+ @echo Running prebuild commands
+ "../../../cnq3tools/git/create_git_header.sh" "../../code/qcommon/git.h"
+ endef
+ define PRELINKCMDS
+ endef
+ define POSTBUILDCMDS
+ @echo Running postbuild commands
+ cp -u "../../../.bin/release_x64/cnq3-x64" "$(QUAKE3DIR)"
endef
all: $(TARGETDIR) $(OBJDIR) prebuild prelink $(TARGET)
@:
diff --git a/build/gmake/freetype.make b/build/gmake/freetype.make
index 9e60635..5759363 100644
--- a/build/gmake/freetype.make
+++ b/build/gmake/freetype.make
@@ -12,7 +12,7 @@ endif
ifeq ($(config),debug_x32)
RESCOMP = windres
- TARGETDIR = ../../../.bin/debug
+ TARGETDIR = ../../../.bin/debug_x32
TARGET = $(TARGETDIR)/libfreetype.a
OBJDIR = obj/x32/debug/freetype
DEFINES += -D_LIB -DFT2_BUILD_LIBRARY -D_BIND_TO_CURRENT_VCLIBS_VERSION=1 -DDEBUG -D_DEBUG
@@ -24,7 +24,34 @@ ifeq ($(config),debug_x32)
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
LIBS +=
LDDEPS +=
- ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/debug -m32
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/debug_x32 -m32
+ LINKCMD = $(AR) -rcs "$@" $(OBJECTS)
+ define PREBUILDCMDS
+ endef
+ define PRELINKCMDS
+ endef
+ define POSTBUILDCMDS
+ endef
+all: $(TARGETDIR) $(OBJDIR) prebuild prelink $(TARGET)
+ @:
+
+endif
+
+ifeq ($(config),debug_x64)
+ RESCOMP = windres
+ TARGETDIR = ../../../.bin/debug_x64
+ TARGET = $(TARGETDIR)/libfreetype.a
+ OBJDIR = obj/x64/debug/freetype
+ DEFINES += -D_LIB -DFT2_BUILD_LIBRARY -D_BIND_TO_CURRENT_VCLIBS_VERSION=1 -DDEBUG -D_DEBUG
+ INCLUDES += -I../../code/freetype/include
+ FORCE_INCLUDE +=
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
+ ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m64 -g -Wno-unused-parameter -Wno-write-strings
+ ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) -fno-exceptions -fno-rtti
+ ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
+ LIBS +=
+ LDDEPS +=
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib64 -L../../../.bin/debug_x64 -m64
LINKCMD = $(AR) -rcs "$@" $(OBJECTS)
define PREBUILDCMDS
endef
@@ -39,7 +66,7 @@ endif
ifeq ($(config),release_x32)
RESCOMP = windres
- TARGETDIR = ../../../.bin/release
+ TARGETDIR = ../../../.bin/release_x32
TARGET = $(TARGETDIR)/libfreetype.a
OBJDIR = obj/x32/release/freetype
DEFINES += -D_LIB -DFT2_BUILD_LIBRARY -D_BIND_TO_CURRENT_VCLIBS_VERSION=1 -DNDEBUG
@@ -51,7 +78,34 @@ ifeq ($(config),release_x32)
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
LIBS +=
LDDEPS +=
- ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/release -m32
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/release_x32 -m32
+ LINKCMD = $(AR) -rcs "$@" $(OBJECTS)
+ define PREBUILDCMDS
+ endef
+ define PRELINKCMDS
+ endef
+ define POSTBUILDCMDS
+ endef
+all: $(TARGETDIR) $(OBJDIR) prebuild prelink $(TARGET)
+ @:
+
+endif
+
+ifeq ($(config),release_x64)
+ RESCOMP = windres
+ TARGETDIR = ../../../.bin/release_x64
+ TARGET = $(TARGETDIR)/libfreetype.a
+ OBJDIR = obj/x64/release/freetype
+ DEFINES += -D_LIB -DFT2_BUILD_LIBRARY -D_BIND_TO_CURRENT_VCLIBS_VERSION=1 -DNDEBUG
+ INCLUDES += -I../../code/freetype/include
+ FORCE_INCLUDE +=
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
+ ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m64 -fomit-frame-pointer -ffast-math -Os -g -msse2 -Wno-unused-parameter -Wno-write-strings -g1
+ ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) -fno-exceptions -fno-rtti
+ ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
+ LIBS +=
+ LDDEPS +=
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib64 -L../../../.bin/release_x64 -m64
LINKCMD = $(AR) -rcs "$@" $(OBJECTS)
define PREBUILDCMDS
endef
diff --git a/build/gmake/libjpeg-turbo.make b/build/gmake/libjpeg-turbo.make
index af445a8..3345795 100644
--- a/build/gmake/libjpeg-turbo.make
+++ b/build/gmake/libjpeg-turbo.make
@@ -12,7 +12,7 @@ endif
ifeq ($(config),debug_x32)
RESCOMP = windres
- TARGETDIR = ../../../.bin/debug
+ TARGETDIR = ../../../.bin/debug_x32
TARGET = $(TARGETDIR)/liblibjpeg-turbo.a
OBJDIR = obj/x32/debug/libjpeg-turbo
DEFINES += -DWITH_SIMD -DSIZEOF_SIZE_T=4 -DDEBUG -D_DEBUG
@@ -24,45 +24,36 @@ ifeq ($(config),debug_x32)
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
LIBS +=
LDDEPS +=
- ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/debug -m32
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/debug_x32 -m32
+ LINKCMD = $(AR) -rcs "$@" $(OBJECTS)
+ define PREBUILDCMDS
+ endef
+ define PRELINKCMDS
+ endef
+ define POSTBUILDCMDS
+ endef
+all: $(TARGETDIR) $(OBJDIR) prebuild prelink $(TARGET)
+ @:
+
+endif
+
+ifeq ($(config),debug_x64)
+ RESCOMP = windres
+ TARGETDIR = ../../../.bin/debug_x64
+ TARGET = $(TARGETDIR)/liblibjpeg-turbo.a
+ OBJDIR = obj/x64/debug/libjpeg-turbo
+ DEFINES += -DWITH_SIMD -DSIZEOF_SIZE_T=8 -DDEBUG -D_DEBUG
+ INCLUDES += -I../../code/libjpeg-turbo -I../../code/libjpeg-turbo/simd
+ FORCE_INCLUDE +=
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
+ ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m64 -g -Wno-unused-parameter -Wno-write-strings
+ ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) -fno-exceptions -fno-rtti
+ ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
+ LIBS +=
+ LDDEPS +=
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib64 -L../../../.bin/debug_x64 -m64
LINKCMD = $(AR) -rcs "$@" $(OBJECTS)
define PREBUILDCMDS
- @echo Running prebuild commands
- mkdir -p ../../../cnq3/build/nasm/libjpeg-turbo/elf32
- echo jsimdcpu.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jsimdcpu.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jsimdcpu.asm
- echo jfdctflt-3dn.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctflt-3dn.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jfdctflt-3dn.asm
- echo jidctflt-3dn.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctflt-3dn.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jidctflt-3dn.asm
- echo jquant-3dn.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquant-3dn.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jquant-3dn.asm
- echo jccolor-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jccolor-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jccolor-mmx.asm
- echo jcgray-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jcgray-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jcgray-mmx.asm
- echo jcsample-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jcsample-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jcsample-mmx.asm
- echo jdcolor-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdcolor-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jdcolor-mmx.asm
- echo jdmerge-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdmerge-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jdmerge-mmx.asm
- echo jdsample-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdsample-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jdsample-mmx.asm
- echo jfdctfst-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctfst-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jfdctfst-mmx.asm
- echo jfdctint-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctint-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jfdctint-mmx.asm
- echo jidctfst-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctfst-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jidctfst-mmx.asm
- echo jidctint-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctint-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jidctint-mmx.asm
- echo jidctred-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctred-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jidctred-mmx.asm
- echo jquant-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquant-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jquant-mmx.asm
- echo jfdctflt-sse.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctflt-sse.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jfdctflt-sse.asm
- echo jidctflt-sse.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctflt-sse.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jidctflt-sse.asm
- echo jquant-sse.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquant-sse.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jquant-sse.asm
- echo jccolor-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jccolor-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jccolor-sse2.asm
- echo jcgray-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jcgray-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jcgray-sse2.asm
- echo jchuff-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jchuff-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jchuff-sse2.asm
- echo jcsample-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jcsample-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jcsample-sse2.asm
- echo jdcolor-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdcolor-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jdcolor-sse2.asm
- echo jdmerge-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdmerge-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jdmerge-sse2.asm
- echo jdsample-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdsample-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jdsample-sse2.asm
- echo jfdctfst-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctfst-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jfdctfst-sse2.asm
- echo jfdctint-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctint-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jfdctint-sse2.asm
- echo jidctflt-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctflt-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jidctflt-sse2.asm
- echo jidctfst-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctfst-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jidctfst-sse2.asm
- echo jidctint-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctint-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jidctint-sse2.asm
- echo jidctred-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctred-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jidctred-sse2.asm
- echo jquantf-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquantf-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jquantf-sse2.asm
- echo jquanti-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquanti-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jquanti-sse2.asm
endef
define PRELINKCMDS
endef
@@ -75,7 +66,7 @@ endif
ifeq ($(config),release_x32)
RESCOMP = windres
- TARGETDIR = ../../../.bin/release
+ TARGETDIR = ../../../.bin/release_x32
TARGET = $(TARGETDIR)/liblibjpeg-turbo.a
OBJDIR = obj/x32/release/libjpeg-turbo
DEFINES += -DWITH_SIMD -DSIZEOF_SIZE_T=4 -DNDEBUG
@@ -87,45 +78,36 @@ ifeq ($(config),release_x32)
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
LIBS +=
LDDEPS +=
- ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/release -m32
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/release_x32 -m32
+ LINKCMD = $(AR) -rcs "$@" $(OBJECTS)
+ define PREBUILDCMDS
+ endef
+ define PRELINKCMDS
+ endef
+ define POSTBUILDCMDS
+ endef
+all: $(TARGETDIR) $(OBJDIR) prebuild prelink $(TARGET)
+ @:
+
+endif
+
+ifeq ($(config),release_x64)
+ RESCOMP = windres
+ TARGETDIR = ../../../.bin/release_x64
+ TARGET = $(TARGETDIR)/liblibjpeg-turbo.a
+ OBJDIR = obj/x64/release/libjpeg-turbo
+ DEFINES += -DWITH_SIMD -DSIZEOF_SIZE_T=8 -DNDEBUG
+ INCLUDES += -I../../code/libjpeg-turbo -I../../code/libjpeg-turbo/simd
+ FORCE_INCLUDE +=
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
+ ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m64 -fomit-frame-pointer -ffast-math -Os -g -msse2 -Wno-unused-parameter -Wno-write-strings -g1
+ ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) -fno-exceptions -fno-rtti
+ ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
+ LIBS +=
+ LDDEPS +=
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib64 -L../../../.bin/release_x64 -m64
LINKCMD = $(AR) -rcs "$@" $(OBJECTS)
define PREBUILDCMDS
- @echo Running prebuild commands
- mkdir -p ../../../cnq3/build/nasm/libjpeg-turbo/elf32
- echo jsimdcpu.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jsimdcpu.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jsimdcpu.asm
- echo jfdctflt-3dn.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctflt-3dn.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jfdctflt-3dn.asm
- echo jidctflt-3dn.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctflt-3dn.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jidctflt-3dn.asm
- echo jquant-3dn.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquant-3dn.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jquant-3dn.asm
- echo jccolor-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jccolor-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jccolor-mmx.asm
- echo jcgray-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jcgray-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jcgray-mmx.asm
- echo jcsample-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jcsample-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jcsample-mmx.asm
- echo jdcolor-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdcolor-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jdcolor-mmx.asm
- echo jdmerge-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdmerge-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jdmerge-mmx.asm
- echo jdsample-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdsample-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jdsample-mmx.asm
- echo jfdctfst-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctfst-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jfdctfst-mmx.asm
- echo jfdctint-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctint-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jfdctint-mmx.asm
- echo jidctfst-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctfst-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jidctfst-mmx.asm
- echo jidctint-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctint-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jidctint-mmx.asm
- echo jidctred-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctred-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jidctred-mmx.asm
- echo jquant-mmx.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquant-mmx.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jquant-mmx.asm
- echo jfdctflt-sse.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctflt-sse.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jfdctflt-sse.asm
- echo jidctflt-sse.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctflt-sse.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jidctflt-sse.asm
- echo jquant-sse.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquant-sse.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jquant-sse.asm
- echo jccolor-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jccolor-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jccolor-sse2.asm
- echo jcgray-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jcgray-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jcgray-sse2.asm
- echo jchuff-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jchuff-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jchuff-sse2.asm
- echo jcsample-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jcsample-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jcsample-sse2.asm
- echo jdcolor-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdcolor-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jdcolor-sse2.asm
- echo jdmerge-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdmerge-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jdmerge-sse2.asm
- echo jdsample-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jdsample-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jdsample-sse2.asm
- echo jfdctfst-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctfst-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jfdctfst-sse2.asm
- echo jfdctint-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jfdctint-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jfdctint-sse2.asm
- echo jidctflt-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctflt-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jidctflt-sse2.asm
- echo jidctfst-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctfst-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jidctfst-sse2.asm
- echo jidctint-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctint-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jidctint-sse2.asm
- echo jidctred-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jidctred-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jidctred-sse2.asm
- echo jquantf-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquantf-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jquantf-sse2.asm
- echo jquanti-sse2.asm && nasm -o../../../cnq3/build/nasm/libjpeg-turbo/elf32/jquanti-sse2.obj -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../../cnq3/code/libjpeg-turbo/simd/jquanti-sse2.asm
endef
define PRELINKCMDS
endef
@@ -182,12 +164,135 @@ OBJECTS := \
$(OBJDIR)/jquant1.o \
$(OBJDIR)/jquant2.o \
$(OBJDIR)/jutils.o \
- $(OBJDIR)/jsimd_i386.o \
RESOURCES := \
CUSTOMFILES := \
+ifeq ($(config),debug_x32)
+ OBJECTS += \
+ ../../../.bin/debug_x32/jccolor-mmx.o \
+ ../../../.bin/debug_x32/jccolor-sse2.o \
+ ../../../.bin/debug_x32/jcgray-mmx.o \
+ ../../../.bin/debug_x32/jcgray-sse2.o \
+ ../../../.bin/debug_x32/jchuff-sse2.o \
+ ../../../.bin/debug_x32/jcsample-mmx.o \
+ ../../../.bin/debug_x32/jcsample-sse2.o \
+ ../../../.bin/debug_x32/jdcolor-mmx.o \
+ ../../../.bin/debug_x32/jdcolor-sse2.o \
+ ../../../.bin/debug_x32/jdmerge-mmx.o \
+ ../../../.bin/debug_x32/jdmerge-sse2.o \
+ ../../../.bin/debug_x32/jdsample-mmx.o \
+ ../../../.bin/debug_x32/jdsample-sse2.o \
+ ../../../.bin/debug_x32/jfdctflt-3dn.o \
+ ../../../.bin/debug_x32/jfdctflt-sse.o \
+ ../../../.bin/debug_x32/jfdctfst-mmx.o \
+ ../../../.bin/debug_x32/jfdctfst-sse2.o \
+ ../../../.bin/debug_x32/jfdctint-mmx.o \
+ ../../../.bin/debug_x32/jfdctint-sse2.o \
+ ../../../.bin/debug_x32/jidctflt-3dn.o \
+ ../../../.bin/debug_x32/jidctflt-sse.o \
+ ../../../.bin/debug_x32/jidctflt-sse2.o \
+ ../../../.bin/debug_x32/jidctfst-mmx.o \
+ ../../../.bin/debug_x32/jidctfst-sse2.o \
+ ../../../.bin/debug_x32/jidctint-mmx.o \
+ ../../../.bin/debug_x32/jidctint-sse2.o \
+ ../../../.bin/debug_x32/jidctred-mmx.o \
+ ../../../.bin/debug_x32/jidctred-sse2.o \
+ ../../../.bin/debug_x32/jquant-3dn.o \
+ ../../../.bin/debug_x32/jquant-mmx.o \
+ ../../../.bin/debug_x32/jquant-sse.o \
+ ../../../.bin/debug_x32/jquantf-sse2.o \
+ ../../../.bin/debug_x32/jquanti-sse2.o \
+ $(OBJDIR)/jsimd_i386.o \
+ ../../../.bin/debug_x32/jsimdcpu.o \
+
+endif
+
+ifeq ($(config),debug_x64)
+ OBJECTS += \
+ ../../../.bin/debug_x64/jccolor-sse2-64.o \
+ ../../../.bin/debug_x64/jcgray-sse2-64.o \
+ ../../../.bin/debug_x64/jchuff-sse2-64.o \
+ ../../../.bin/debug_x64/jcsample-sse2-64.o \
+ ../../../.bin/debug_x64/jdcolor-sse2-64.o \
+ ../../../.bin/debug_x64/jdmerge-sse2-64.o \
+ ../../../.bin/debug_x64/jdsample-sse2-64.o \
+ ../../../.bin/debug_x64/jfdctflt-sse-64.o \
+ ../../../.bin/debug_x64/jfdctfst-sse2-64.o \
+ ../../../.bin/debug_x64/jfdctint-sse2-64.o \
+ ../../../.bin/debug_x64/jidctflt-sse2-64.o \
+ ../../../.bin/debug_x64/jidctfst-sse2-64.o \
+ ../../../.bin/debug_x64/jidctint-sse2-64.o \
+ ../../../.bin/debug_x64/jidctred-sse2-64.o \
+ ../../../.bin/debug_x64/jquantf-sse2-64.o \
+ ../../../.bin/debug_x64/jquanti-sse2-64.o \
+ $(OBJDIR)/jsimd_x86_64.o \
+
+endif
+
+ifeq ($(config),release_x32)
+ OBJECTS += \
+ ../../../.bin/release_x32/jccolor-mmx.o \
+ ../../../.bin/release_x32/jccolor-sse2.o \
+ ../../../.bin/release_x32/jcgray-mmx.o \
+ ../../../.bin/release_x32/jcgray-sse2.o \
+ ../../../.bin/release_x32/jchuff-sse2.o \
+ ../../../.bin/release_x32/jcsample-mmx.o \
+ ../../../.bin/release_x32/jcsample-sse2.o \
+ ../../../.bin/release_x32/jdcolor-mmx.o \
+ ../../../.bin/release_x32/jdcolor-sse2.o \
+ ../../../.bin/release_x32/jdmerge-mmx.o \
+ ../../../.bin/release_x32/jdmerge-sse2.o \
+ ../../../.bin/release_x32/jdsample-mmx.o \
+ ../../../.bin/release_x32/jdsample-sse2.o \
+ ../../../.bin/release_x32/jfdctflt-3dn.o \
+ ../../../.bin/release_x32/jfdctflt-sse.o \
+ ../../../.bin/release_x32/jfdctfst-mmx.o \
+ ../../../.bin/release_x32/jfdctfst-sse2.o \
+ ../../../.bin/release_x32/jfdctint-mmx.o \
+ ../../../.bin/release_x32/jfdctint-sse2.o \
+ ../../../.bin/release_x32/jidctflt-3dn.o \
+ ../../../.bin/release_x32/jidctflt-sse.o \
+ ../../../.bin/release_x32/jidctflt-sse2.o \
+ ../../../.bin/release_x32/jidctfst-mmx.o \
+ ../../../.bin/release_x32/jidctfst-sse2.o \
+ ../../../.bin/release_x32/jidctint-mmx.o \
+ ../../../.bin/release_x32/jidctint-sse2.o \
+ ../../../.bin/release_x32/jidctred-mmx.o \
+ ../../../.bin/release_x32/jidctred-sse2.o \
+ ../../../.bin/release_x32/jquant-3dn.o \
+ ../../../.bin/release_x32/jquant-mmx.o \
+ ../../../.bin/release_x32/jquant-sse.o \
+ ../../../.bin/release_x32/jquantf-sse2.o \
+ ../../../.bin/release_x32/jquanti-sse2.o \
+ $(OBJDIR)/jsimd_i386.o \
+ ../../../.bin/release_x32/jsimdcpu.o \
+
+endif
+
+ifeq ($(config),release_x64)
+ OBJECTS += \
+ ../../../.bin/release_x64/jccolor-sse2-64.o \
+ ../../../.bin/release_x64/jcgray-sse2-64.o \
+ ../../../.bin/release_x64/jchuff-sse2-64.o \
+ ../../../.bin/release_x64/jcsample-sse2-64.o \
+ ../../../.bin/release_x64/jdcolor-sse2-64.o \
+ ../../../.bin/release_x64/jdmerge-sse2-64.o \
+ ../../../.bin/release_x64/jdsample-sse2-64.o \
+ ../../../.bin/release_x64/jfdctflt-sse-64.o \
+ ../../../.bin/release_x64/jfdctfst-sse2-64.o \
+ ../../../.bin/release_x64/jfdctint-sse2-64.o \
+ ../../../.bin/release_x64/jidctflt-sse2-64.o \
+ ../../../.bin/release_x64/jidctfst-sse2-64.o \
+ ../../../.bin/release_x64/jidctint-sse2-64.o \
+ ../../../.bin/release_x64/jidctred-sse2-64.o \
+ ../../../.bin/release_x64/jquantf-sse2-64.o \
+ ../../../.bin/release_x64/jquanti-sse2-64.o \
+ $(OBJDIR)/jsimd_x86_64.o \
+
+endif
+
SHELLTYPE := msdos
ifeq (,$(ComSpec)$(COMSPEC))
SHELLTYPE := posix
@@ -375,9 +480,512 @@ $(OBJDIR)/jquant2.o: ../../code/libjpeg-turbo/jquant2.c
$(OBJDIR)/jutils.o: ../../code/libjpeg-turbo/jutils.c
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<"
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jccolor-mmx.o: ../../code/libjpeg-turbo/simd/jccolor-mmx.asm
+ @echo "jccolor-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jccolor-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jccolor-mmx.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jccolor-mmx.o: ../../code/libjpeg-turbo/simd/jccolor-mmx.asm
+ @echo "jccolor-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jccolor-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jccolor-mmx.asm
+endif
+ifeq ($(config),debug_x64)
+../../../.bin/debug_x64/jccolor-sse2-64.o: ../../code/libjpeg-turbo/simd/jccolor-sse2-64.asm
+ @echo "jccolor-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x64/jccolor-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jccolor-sse2-64.asm
+endif
+ifeq ($(config),release_x64)
+../../../.bin/release_x64/jccolor-sse2-64.o: ../../code/libjpeg-turbo/simd/jccolor-sse2-64.asm
+ @echo "jccolor-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/release_x64/jccolor-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jccolor-sse2-64.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jccolor-sse2.o: ../../code/libjpeg-turbo/simd/jccolor-sse2.asm
+ @echo "jccolor-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jccolor-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jccolor-sse2.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jccolor-sse2.o: ../../code/libjpeg-turbo/simd/jccolor-sse2.asm
+ @echo "jccolor-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jccolor-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jccolor-sse2.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jcgray-mmx.o: ../../code/libjpeg-turbo/simd/jcgray-mmx.asm
+ @echo "jcgray-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jcgray-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jcgray-mmx.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jcgray-mmx.o: ../../code/libjpeg-turbo/simd/jcgray-mmx.asm
+ @echo "jcgray-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jcgray-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jcgray-mmx.asm
+endif
+ifeq ($(config),debug_x64)
+../../../.bin/debug_x64/jcgray-sse2-64.o: ../../code/libjpeg-turbo/simd/jcgray-sse2-64.asm
+ @echo "jcgray-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x64/jcgray-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jcgray-sse2-64.asm
+endif
+ifeq ($(config),release_x64)
+../../../.bin/release_x64/jcgray-sse2-64.o: ../../code/libjpeg-turbo/simd/jcgray-sse2-64.asm
+ @echo "jcgray-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/release_x64/jcgray-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jcgray-sse2-64.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jcgray-sse2.o: ../../code/libjpeg-turbo/simd/jcgray-sse2.asm
+ @echo "jcgray-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jcgray-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jcgray-sse2.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jcgray-sse2.o: ../../code/libjpeg-turbo/simd/jcgray-sse2.asm
+ @echo "jcgray-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jcgray-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jcgray-sse2.asm
+endif
+ifeq ($(config),debug_x64)
+../../../.bin/debug_x64/jchuff-sse2-64.o: ../../code/libjpeg-turbo/simd/jchuff-sse2-64.asm
+ @echo "jchuff-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x64/jchuff-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jchuff-sse2-64.asm
+endif
+ifeq ($(config),release_x64)
+../../../.bin/release_x64/jchuff-sse2-64.o: ../../code/libjpeg-turbo/simd/jchuff-sse2-64.asm
+ @echo "jchuff-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/release_x64/jchuff-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jchuff-sse2-64.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jchuff-sse2.o: ../../code/libjpeg-turbo/simd/jchuff-sse2.asm
+ @echo "jchuff-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jchuff-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jchuff-sse2.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jchuff-sse2.o: ../../code/libjpeg-turbo/simd/jchuff-sse2.asm
+ @echo "jchuff-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jchuff-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jchuff-sse2.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jcsample-mmx.o: ../../code/libjpeg-turbo/simd/jcsample-mmx.asm
+ @echo "jcsample-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jcsample-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jcsample-mmx.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jcsample-mmx.o: ../../code/libjpeg-turbo/simd/jcsample-mmx.asm
+ @echo "jcsample-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jcsample-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jcsample-mmx.asm
+endif
+ifeq ($(config),debug_x64)
+../../../.bin/debug_x64/jcsample-sse2-64.o: ../../code/libjpeg-turbo/simd/jcsample-sse2-64.asm
+ @echo "jcsample-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x64/jcsample-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jcsample-sse2-64.asm
+endif
+ifeq ($(config),release_x64)
+../../../.bin/release_x64/jcsample-sse2-64.o: ../../code/libjpeg-turbo/simd/jcsample-sse2-64.asm
+ @echo "jcsample-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/release_x64/jcsample-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jcsample-sse2-64.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jcsample-sse2.o: ../../code/libjpeg-turbo/simd/jcsample-sse2.asm
+ @echo "jcsample-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jcsample-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jcsample-sse2.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jcsample-sse2.o: ../../code/libjpeg-turbo/simd/jcsample-sse2.asm
+ @echo "jcsample-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jcsample-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jcsample-sse2.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jdcolor-mmx.o: ../../code/libjpeg-turbo/simd/jdcolor-mmx.asm
+ @echo "jdcolor-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jdcolor-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jdcolor-mmx.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jdcolor-mmx.o: ../../code/libjpeg-turbo/simd/jdcolor-mmx.asm
+ @echo "jdcolor-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jdcolor-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jdcolor-mmx.asm
+endif
+ifeq ($(config),debug_x64)
+../../../.bin/debug_x64/jdcolor-sse2-64.o: ../../code/libjpeg-turbo/simd/jdcolor-sse2-64.asm
+ @echo "jdcolor-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x64/jdcolor-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jdcolor-sse2-64.asm
+endif
+ifeq ($(config),release_x64)
+../../../.bin/release_x64/jdcolor-sse2-64.o: ../../code/libjpeg-turbo/simd/jdcolor-sse2-64.asm
+ @echo "jdcolor-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/release_x64/jdcolor-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jdcolor-sse2-64.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jdcolor-sse2.o: ../../code/libjpeg-turbo/simd/jdcolor-sse2.asm
+ @echo "jdcolor-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jdcolor-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jdcolor-sse2.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jdcolor-sse2.o: ../../code/libjpeg-turbo/simd/jdcolor-sse2.asm
+ @echo "jdcolor-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jdcolor-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jdcolor-sse2.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jdmerge-mmx.o: ../../code/libjpeg-turbo/simd/jdmerge-mmx.asm
+ @echo "jdmerge-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jdmerge-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jdmerge-mmx.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jdmerge-mmx.o: ../../code/libjpeg-turbo/simd/jdmerge-mmx.asm
+ @echo "jdmerge-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jdmerge-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jdmerge-mmx.asm
+endif
+ifeq ($(config),debug_x64)
+../../../.bin/debug_x64/jdmerge-sse2-64.o: ../../code/libjpeg-turbo/simd/jdmerge-sse2-64.asm
+ @echo "jdmerge-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x64/jdmerge-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jdmerge-sse2-64.asm
+endif
+ifeq ($(config),release_x64)
+../../../.bin/release_x64/jdmerge-sse2-64.o: ../../code/libjpeg-turbo/simd/jdmerge-sse2-64.asm
+ @echo "jdmerge-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/release_x64/jdmerge-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jdmerge-sse2-64.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jdmerge-sse2.o: ../../code/libjpeg-turbo/simd/jdmerge-sse2.asm
+ @echo "jdmerge-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jdmerge-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jdmerge-sse2.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jdmerge-sse2.o: ../../code/libjpeg-turbo/simd/jdmerge-sse2.asm
+ @echo "jdmerge-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jdmerge-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jdmerge-sse2.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jdsample-mmx.o: ../../code/libjpeg-turbo/simd/jdsample-mmx.asm
+ @echo "jdsample-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jdsample-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jdsample-mmx.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jdsample-mmx.o: ../../code/libjpeg-turbo/simd/jdsample-mmx.asm
+ @echo "jdsample-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jdsample-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jdsample-mmx.asm
+endif
+ifeq ($(config),debug_x64)
+../../../.bin/debug_x64/jdsample-sse2-64.o: ../../code/libjpeg-turbo/simd/jdsample-sse2-64.asm
+ @echo "jdsample-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x64/jdsample-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jdsample-sse2-64.asm
+endif
+ifeq ($(config),release_x64)
+../../../.bin/release_x64/jdsample-sse2-64.o: ../../code/libjpeg-turbo/simd/jdsample-sse2-64.asm
+ @echo "jdsample-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/release_x64/jdsample-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jdsample-sse2-64.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jdsample-sse2.o: ../../code/libjpeg-turbo/simd/jdsample-sse2.asm
+ @echo "jdsample-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jdsample-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jdsample-sse2.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jdsample-sse2.o: ../../code/libjpeg-turbo/simd/jdsample-sse2.asm
+ @echo "jdsample-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jdsample-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jdsample-sse2.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jfdctflt-3dn.o: ../../code/libjpeg-turbo/simd/jfdctflt-3dn.asm
+ @echo "jfdctflt-3dn.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jfdctflt-3dn.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jfdctflt-3dn.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jfdctflt-3dn.o: ../../code/libjpeg-turbo/simd/jfdctflt-3dn.asm
+ @echo "jfdctflt-3dn.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jfdctflt-3dn.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jfdctflt-3dn.asm
+endif
+ifeq ($(config),debug_x64)
+../../../.bin/debug_x64/jfdctflt-sse-64.o: ../../code/libjpeg-turbo/simd/jfdctflt-sse-64.asm
+ @echo "jfdctflt-sse-64.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x64/jfdctflt-sse-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jfdctflt-sse-64.asm
+endif
+ifeq ($(config),release_x64)
+../../../.bin/release_x64/jfdctflt-sse-64.o: ../../code/libjpeg-turbo/simd/jfdctflt-sse-64.asm
+ @echo "jfdctflt-sse-64.asm"
+ $(SILENT) nasm -o../../../.bin/release_x64/jfdctflt-sse-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jfdctflt-sse-64.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jfdctflt-sse.o: ../../code/libjpeg-turbo/simd/jfdctflt-sse.asm
+ @echo "jfdctflt-sse.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jfdctflt-sse.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jfdctflt-sse.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jfdctflt-sse.o: ../../code/libjpeg-turbo/simd/jfdctflt-sse.asm
+ @echo "jfdctflt-sse.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jfdctflt-sse.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jfdctflt-sse.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jfdctfst-mmx.o: ../../code/libjpeg-turbo/simd/jfdctfst-mmx.asm
+ @echo "jfdctfst-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jfdctfst-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jfdctfst-mmx.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jfdctfst-mmx.o: ../../code/libjpeg-turbo/simd/jfdctfst-mmx.asm
+ @echo "jfdctfst-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jfdctfst-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jfdctfst-mmx.asm
+endif
+ifeq ($(config),debug_x64)
+../../../.bin/debug_x64/jfdctfst-sse2-64.o: ../../code/libjpeg-turbo/simd/jfdctfst-sse2-64.asm
+ @echo "jfdctfst-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x64/jfdctfst-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jfdctfst-sse2-64.asm
+endif
+ifeq ($(config),release_x64)
+../../../.bin/release_x64/jfdctfst-sse2-64.o: ../../code/libjpeg-turbo/simd/jfdctfst-sse2-64.asm
+ @echo "jfdctfst-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/release_x64/jfdctfst-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jfdctfst-sse2-64.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jfdctfst-sse2.o: ../../code/libjpeg-turbo/simd/jfdctfst-sse2.asm
+ @echo "jfdctfst-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jfdctfst-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jfdctfst-sse2.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jfdctfst-sse2.o: ../../code/libjpeg-turbo/simd/jfdctfst-sse2.asm
+ @echo "jfdctfst-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jfdctfst-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jfdctfst-sse2.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jfdctint-mmx.o: ../../code/libjpeg-turbo/simd/jfdctint-mmx.asm
+ @echo "jfdctint-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jfdctint-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jfdctint-mmx.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jfdctint-mmx.o: ../../code/libjpeg-turbo/simd/jfdctint-mmx.asm
+ @echo "jfdctint-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jfdctint-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jfdctint-mmx.asm
+endif
+ifeq ($(config),debug_x64)
+../../../.bin/debug_x64/jfdctint-sse2-64.o: ../../code/libjpeg-turbo/simd/jfdctint-sse2-64.asm
+ @echo "jfdctint-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x64/jfdctint-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jfdctint-sse2-64.asm
+endif
+ifeq ($(config),release_x64)
+../../../.bin/release_x64/jfdctint-sse2-64.o: ../../code/libjpeg-turbo/simd/jfdctint-sse2-64.asm
+ @echo "jfdctint-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/release_x64/jfdctint-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jfdctint-sse2-64.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jfdctint-sse2.o: ../../code/libjpeg-turbo/simd/jfdctint-sse2.asm
+ @echo "jfdctint-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jfdctint-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jfdctint-sse2.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jfdctint-sse2.o: ../../code/libjpeg-turbo/simd/jfdctint-sse2.asm
+ @echo "jfdctint-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jfdctint-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jfdctint-sse2.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jidctflt-3dn.o: ../../code/libjpeg-turbo/simd/jidctflt-3dn.asm
+ @echo "jidctflt-3dn.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jidctflt-3dn.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctflt-3dn.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jidctflt-3dn.o: ../../code/libjpeg-turbo/simd/jidctflt-3dn.asm
+ @echo "jidctflt-3dn.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jidctflt-3dn.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctflt-3dn.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jidctflt-sse.o: ../../code/libjpeg-turbo/simd/jidctflt-sse.asm
+ @echo "jidctflt-sse.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jidctflt-sse.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctflt-sse.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jidctflt-sse.o: ../../code/libjpeg-turbo/simd/jidctflt-sse.asm
+ @echo "jidctflt-sse.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jidctflt-sse.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctflt-sse.asm
+endif
+ifeq ($(config),debug_x64)
+../../../.bin/debug_x64/jidctflt-sse2-64.o: ../../code/libjpeg-turbo/simd/jidctflt-sse2-64.asm
+ @echo "jidctflt-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x64/jidctflt-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctflt-sse2-64.asm
+endif
+ifeq ($(config),release_x64)
+../../../.bin/release_x64/jidctflt-sse2-64.o: ../../code/libjpeg-turbo/simd/jidctflt-sse2-64.asm
+ @echo "jidctflt-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/release_x64/jidctflt-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctflt-sse2-64.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jidctflt-sse2.o: ../../code/libjpeg-turbo/simd/jidctflt-sse2.asm
+ @echo "jidctflt-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jidctflt-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctflt-sse2.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jidctflt-sse2.o: ../../code/libjpeg-turbo/simd/jidctflt-sse2.asm
+ @echo "jidctflt-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jidctflt-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctflt-sse2.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jidctfst-mmx.o: ../../code/libjpeg-turbo/simd/jidctfst-mmx.asm
+ @echo "jidctfst-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jidctfst-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctfst-mmx.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jidctfst-mmx.o: ../../code/libjpeg-turbo/simd/jidctfst-mmx.asm
+ @echo "jidctfst-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jidctfst-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctfst-mmx.asm
+endif
+ifeq ($(config),debug_x64)
+../../../.bin/debug_x64/jidctfst-sse2-64.o: ../../code/libjpeg-turbo/simd/jidctfst-sse2-64.asm
+ @echo "jidctfst-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x64/jidctfst-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctfst-sse2-64.asm
+endif
+ifeq ($(config),release_x64)
+../../../.bin/release_x64/jidctfst-sse2-64.o: ../../code/libjpeg-turbo/simd/jidctfst-sse2-64.asm
+ @echo "jidctfst-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/release_x64/jidctfst-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctfst-sse2-64.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jidctfst-sse2.o: ../../code/libjpeg-turbo/simd/jidctfst-sse2.asm
+ @echo "jidctfst-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jidctfst-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctfst-sse2.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jidctfst-sse2.o: ../../code/libjpeg-turbo/simd/jidctfst-sse2.asm
+ @echo "jidctfst-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jidctfst-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctfst-sse2.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jidctint-mmx.o: ../../code/libjpeg-turbo/simd/jidctint-mmx.asm
+ @echo "jidctint-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jidctint-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctint-mmx.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jidctint-mmx.o: ../../code/libjpeg-turbo/simd/jidctint-mmx.asm
+ @echo "jidctint-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jidctint-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctint-mmx.asm
+endif
+ifeq ($(config),debug_x64)
+../../../.bin/debug_x64/jidctint-sse2-64.o: ../../code/libjpeg-turbo/simd/jidctint-sse2-64.asm
+ @echo "jidctint-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x64/jidctint-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctint-sse2-64.asm
+endif
+ifeq ($(config),release_x64)
+../../../.bin/release_x64/jidctint-sse2-64.o: ../../code/libjpeg-turbo/simd/jidctint-sse2-64.asm
+ @echo "jidctint-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/release_x64/jidctint-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctint-sse2-64.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jidctint-sse2.o: ../../code/libjpeg-turbo/simd/jidctint-sse2.asm
+ @echo "jidctint-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jidctint-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctint-sse2.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jidctint-sse2.o: ../../code/libjpeg-turbo/simd/jidctint-sse2.asm
+ @echo "jidctint-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jidctint-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctint-sse2.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jidctred-mmx.o: ../../code/libjpeg-turbo/simd/jidctred-mmx.asm
+ @echo "jidctred-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jidctred-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctred-mmx.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jidctred-mmx.o: ../../code/libjpeg-turbo/simd/jidctred-mmx.asm
+ @echo "jidctred-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jidctred-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctred-mmx.asm
+endif
+ifeq ($(config),debug_x64)
+../../../.bin/debug_x64/jidctred-sse2-64.o: ../../code/libjpeg-turbo/simd/jidctred-sse2-64.asm
+ @echo "jidctred-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x64/jidctred-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctred-sse2-64.asm
+endif
+ifeq ($(config),release_x64)
+../../../.bin/release_x64/jidctred-sse2-64.o: ../../code/libjpeg-turbo/simd/jidctred-sse2-64.asm
+ @echo "jidctred-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/release_x64/jidctred-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctred-sse2-64.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jidctred-sse2.o: ../../code/libjpeg-turbo/simd/jidctred-sse2.asm
+ @echo "jidctred-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jidctred-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctred-sse2.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jidctred-sse2.o: ../../code/libjpeg-turbo/simd/jidctred-sse2.asm
+ @echo "jidctred-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jidctred-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jidctred-sse2.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jquant-3dn.o: ../../code/libjpeg-turbo/simd/jquant-3dn.asm
+ @echo "jquant-3dn.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jquant-3dn.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jquant-3dn.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jquant-3dn.o: ../../code/libjpeg-turbo/simd/jquant-3dn.asm
+ @echo "jquant-3dn.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jquant-3dn.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jquant-3dn.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jquant-mmx.o: ../../code/libjpeg-turbo/simd/jquant-mmx.asm
+ @echo "jquant-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jquant-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jquant-mmx.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jquant-mmx.o: ../../code/libjpeg-turbo/simd/jquant-mmx.asm
+ @echo "jquant-mmx.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jquant-mmx.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jquant-mmx.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jquant-sse.o: ../../code/libjpeg-turbo/simd/jquant-sse.asm
+ @echo "jquant-sse.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jquant-sse.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jquant-sse.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jquant-sse.o: ../../code/libjpeg-turbo/simd/jquant-sse.asm
+ @echo "jquant-sse.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jquant-sse.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jquant-sse.asm
+endif
+ifeq ($(config),debug_x64)
+../../../.bin/debug_x64/jquantf-sse2-64.o: ../../code/libjpeg-turbo/simd/jquantf-sse2-64.asm
+ @echo "jquantf-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x64/jquantf-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jquantf-sse2-64.asm
+endif
+ifeq ($(config),release_x64)
+../../../.bin/release_x64/jquantf-sse2-64.o: ../../code/libjpeg-turbo/simd/jquantf-sse2-64.asm
+ @echo "jquantf-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/release_x64/jquantf-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jquantf-sse2-64.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jquantf-sse2.o: ../../code/libjpeg-turbo/simd/jquantf-sse2.asm
+ @echo "jquantf-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jquantf-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jquantf-sse2.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jquantf-sse2.o: ../../code/libjpeg-turbo/simd/jquantf-sse2.asm
+ @echo "jquantf-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jquantf-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jquantf-sse2.asm
+endif
+ifeq ($(config),debug_x64)
+../../../.bin/debug_x64/jquanti-sse2-64.o: ../../code/libjpeg-turbo/simd/jquanti-sse2-64.asm
+ @echo "jquanti-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x64/jquanti-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jquanti-sse2-64.asm
+endif
+ifeq ($(config),release_x64)
+../../../.bin/release_x64/jquanti-sse2-64.o: ../../code/libjpeg-turbo/simd/jquanti-sse2-64.asm
+ @echo "jquanti-sse2-64.asm"
+ $(SILENT) nasm -o../../../.bin/release_x64/jquanti-sse2-64.o -felf64 -DELF -D__x86_64__ -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jquanti-sse2-64.asm
+endif
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jquanti-sse2.o: ../../code/libjpeg-turbo/simd/jquanti-sse2.asm
+ @echo "jquanti-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jquanti-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jquanti-sse2.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jquanti-sse2.o: ../../code/libjpeg-turbo/simd/jquanti-sse2.asm
+ @echo "jquanti-sse2.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jquanti-sse2.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jquanti-sse2.asm
+endif
$(OBJDIR)/jsimd_i386.o: ../../code/libjpeg-turbo/simd/jsimd_i386.c
@echo $(notdir $<)
$(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<"
+$(OBJDIR)/jsimd_x86_64.o: ../../code/libjpeg-turbo/simd/jsimd_x86_64.c
+ @echo $(notdir $<)
+ $(SILENT) $(CC) $(ALL_CFLAGS) $(FORCE_INCLUDE) -o "$@" -MF "$(@:%.o=%.d)" -c "$<"
+ifeq ($(config),debug_x32)
+../../../.bin/debug_x32/jsimdcpu.o: ../../code/libjpeg-turbo/simd/jsimdcpu.asm
+ @echo "jsimdcpu.asm"
+ $(SILENT) nasm -o../../../.bin/debug_x32/jsimdcpu.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jsimdcpu.asm
+endif
+ifeq ($(config),release_x32)
+../../../.bin/release_x32/jsimdcpu.o: ../../code/libjpeg-turbo/simd/jsimdcpu.asm
+ @echo "jsimdcpu.asm"
+ $(SILENT) nasm -o../../../.bin/release_x32/jsimdcpu.o -felf32 -DELF -I../../../cnq3/code/libjpeg-turbo/ -I../../../cnq3/code/libjpeg-turbo/win/ -I../../../cnq3/code/libjpeg-turbo/simd/ ../../code/libjpeg-turbo/simd/jsimdcpu.asm
+endif
-include $(OBJECTS:%.o=%.d)
ifneq (,$(PCH))
diff --git a/build/gmake/renderer.make b/build/gmake/renderer.make
index cd48ea4..1346ee7 100644
--- a/build/gmake/renderer.make
+++ b/build/gmake/renderer.make
@@ -12,7 +12,7 @@ endif
ifeq ($(config),debug_x32)
RESCOMP = windres
- TARGETDIR = ../../../.bin/debug
+ TARGETDIR = ../../../.bin/debug_x32
TARGET = $(TARGETDIR)/librenderer.a
OBJDIR = obj/x32/debug/renderer
DEFINES += -DDEBUG -D_DEBUG
@@ -24,7 +24,34 @@ ifeq ($(config),debug_x32)
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
LIBS +=
LDDEPS +=
- ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/debug -m32
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/debug_x32 -m32
+ LINKCMD = $(AR) -rcs "$@" $(OBJECTS)
+ define PREBUILDCMDS
+ endef
+ define PRELINKCMDS
+ endef
+ define POSTBUILDCMDS
+ endef
+all: $(TARGETDIR) $(OBJDIR) prebuild prelink $(TARGET)
+ @:
+
+endif
+
+ifeq ($(config),debug_x64)
+ RESCOMP = windres
+ TARGETDIR = ../../../.bin/debug_x64
+ TARGET = $(TARGETDIR)/librenderer.a
+ OBJDIR = obj/x64/debug/renderer
+ DEFINES += -DDEBUG -D_DEBUG
+ INCLUDES += -I../../code/freetype/include
+ FORCE_INCLUDE +=
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
+ ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m64 -g -Wno-unused-parameter -Wno-write-strings
+ ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) -fno-exceptions -fno-rtti
+ ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
+ LIBS +=
+ LDDEPS +=
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib64 -L../../../.bin/debug_x64 -m64
LINKCMD = $(AR) -rcs "$@" $(OBJECTS)
define PREBUILDCMDS
endef
@@ -39,7 +66,7 @@ endif
ifeq ($(config),release_x32)
RESCOMP = windres
- TARGETDIR = ../../../.bin/release
+ TARGETDIR = ../../../.bin/release_x32
TARGET = $(TARGETDIR)/librenderer.a
OBJDIR = obj/x32/release/renderer
DEFINES += -DNDEBUG
@@ -51,7 +78,34 @@ ifeq ($(config),release_x32)
ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
LIBS +=
LDDEPS +=
- ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/release -m32
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib32 -L../../../.bin/release_x32 -m32
+ LINKCMD = $(AR) -rcs "$@" $(OBJECTS)
+ define PREBUILDCMDS
+ endef
+ define PRELINKCMDS
+ endef
+ define POSTBUILDCMDS
+ endef
+all: $(TARGETDIR) $(OBJDIR) prebuild prelink $(TARGET)
+ @:
+
+endif
+
+ifeq ($(config),release_x64)
+ RESCOMP = windres
+ TARGETDIR = ../../../.bin/release_x64
+ TARGET = $(TARGETDIR)/librenderer.a
+ OBJDIR = obj/x64/release/renderer
+ DEFINES += -DNDEBUG
+ INCLUDES += -I../../code/freetype/include
+ FORCE_INCLUDE +=
+ ALL_CPPFLAGS += $(CPPFLAGS) -MMD -MP $(DEFINES) $(INCLUDES)
+ ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) -m64 -fomit-frame-pointer -ffast-math -Os -g -msse2 -Wno-unused-parameter -Wno-write-strings -g1
+ ALL_CXXFLAGS += $(CXXFLAGS) $(ALL_CFLAGS) -fno-exceptions -fno-rtti
+ ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)
+ LIBS +=
+ LDDEPS +=
+ ALL_LDFLAGS += $(LDFLAGS) -L/usr/lib64 -L../../../.bin/release_x64 -m64
LINKCMD = $(AR) -rcs "$@" $(OBJECTS)
define PREBUILDCMDS
endef
diff --git a/build/premake5.lua b/build/premake5.lua
index 6742ed0..157c84c 100644
--- a/build/premake5.lua
+++ b/build/premake5.lua
@@ -35,43 +35,11 @@ abs_path_q3 = path.getabsolute(_OPTIONS["quake3dir"]) -- os.realpath won't work
extra_warnings = 1
-jpeg_asm_file_names =
-{
- "jsimdcpu",
- "jfdctflt-3dn",
- "jidctflt-3dn",
- "jquant-3dn",
- "jccolor-mmx",
- "jcgray-mmx",
- "jcsample-mmx",
- "jdcolor-mmx",
- "jdmerge-mmx",
- "jdsample-mmx",
- "jfdctfst-mmx",
- "jfdctint-mmx",
- "jidctfst-mmx",
- "jidctint-mmx",
- "jidctred-mmx",
- "jquant-mmx",
- "jfdctflt-sse",
- "jidctflt-sse",
- "jquant-sse",
- "jccolor-sse2",
- "jcgray-sse2",
- "jchuff-sse2",
- "jcsample-sse2",
- "jdcolor-sse2",
- "jdmerge-sse2",
- "jdsample-sse2",
- "jfdctfst-sse2",
- "jfdctint-sse2",
- "jidctflt-sse2",
- "jidctfst-sse2",
- "jidctint-sse2",
- "jidctred-sse2",
- "jquantf-sse2",
- "jquanti-sse2"
-}
+local function GetBinDirName()
+
+ return "%{cfg.buildcfg}_%{cfg.platform}"
+
+end
local function CreateGitPreBuildCommand(scriptExtension)
@@ -83,7 +51,7 @@ end
local function CreateExeCopyPostBuildCommand(copyCommand, exeName, exeExtension)
- local make_path_exe = string.format("%s/%s/%s%s", make_path_bin, "%{cfg.buildcfg}", exeName, exeExtension)
+ local make_path_exe = string.format("%s/%s/%s%s", make_path_bin, GetBinDirName(), exeName, exeExtension)
return string.format("%s \"%s\" \"%s\"", copyCommand, make_path_exe, abs_path_q3)
@@ -91,7 +59,7 @@ end
local function WIN_CreatePdbCopyPostBuildCommand(exeName)
- local make_path_pdb = string.format("%s/%s/%s.pdb", make_path_bin, "%{cfg.buildcfg}", exeName)
+ local make_path_pdb = string.format("%s/%s/%s.pdb", make_path_bin, GetBinDirName(), exeName)
return string.format("copy \"%s\" \"%s\"", make_path_pdb, abs_path_q3)
@@ -131,10 +99,18 @@ local function AddHeaders(dirPath)
end
-local function AddSourcesFromArray(sourceFiles)
+local function AddSourcesFromArray(dir, sourceFiles)
for idx,path in pairs(sourceFiles) do
- files { string.format("%s/%s", path_src, path) }
+ files { string.format("%s/%s/%s", path_src, dir, path) }
+ end
+
+end
+
+local function AddAssemblerSourcesFromArray(dir, fileNames)
+
+ for idx,path in pairs(fileNames) do
+ files { string.format("%s/%s/%s.asm", path_src, dir, path) }
end
end
@@ -145,14 +121,45 @@ local function GetMakePath(premakePath)
end
-local function GetJpegObjPath()
+-- premake tokens for this script:
+-- cfg.buildcfg -> "debug", "release"
+-- cfg.architecture -> "x86", "x86_64"
+-- cfg.system -> "windows", "linux"
+-- cfg.platform -> "x32", "x64"
- local obj_format = "win32"
- if os.is("linux") then
- obj_format = "elf32"
+local function GetLibJpegTurboNasmFlags()
+
+ libjpeg_turbo_nasm_flags_map =
+ {
+ windows_x32 = "-fwin32 -DWIN32",
+ windows_x64 = "-fwin64 -DWIN64 -D__x86_64__",
+ linux_x32 = "-felf32 -DELF",
+ linux_x64 = "-felf64 -DELF -D__x86_64__"
+ }
+
+ return "%{libjpeg_turbo_nasm_flags_map[cfg.system..\"_\"..cfg.platform]}"
+
+end
+
+local function GetCompilerObjectExtension()
+
+ if _ACTION == "gmake" then
+ return ".o"
end
- return string.format("%s/nasm/libjpeg-turbo/%s", GetMakePath(path_build), obj_format)
+ return ".obj"
+
+end
+
+local function GetExeNameSuffix()
+
+ platform_exe_name_suffix_map =
+ {
+ x32 = "-x86",
+ x64 = "-x64"
+ }
+
+ return "%{platform_exe_name_suffix_map[cfg.platform]}"
end
@@ -188,10 +195,8 @@ local function ApplyProjectSettings()
}
-- Build directories
- filter "configurations:debug"
- SetTargetAndLink ( path_bin.."/debug" )
- filter "configurations:release"
- SetTargetAndLink ( path_bin.."/release" )
+ filter { }
+ SetTargetAndLink ( string.format("%s/%s", path_bin, GetBinDirName()) )
--
-- Visual C++
@@ -225,6 +230,11 @@ local function ApplyProjectSettings()
buildoptions { "/GL" }
linkoptions { "" }
+ -- disable the "conversion from 'X' to 'Y', possible loss of data" warning
+ -- this should be removed once the x64 port is complete
+ filter { "action:vs*", "platforms:x64" }
+ buildoptions { "/wd4267" }
+
--
-- GCC
--
@@ -258,7 +268,8 @@ local function ApplyExeProjectSettings(exeName, server)
ApplyProjectSettings()
filter { }
-
+
+ exeName = exeName..GetExeNameSuffix()
targetname(exeName)
local server_sources =
@@ -396,9 +407,9 @@ local function ApplyExeProjectSettings(exeName, server)
links { "botlib" }
if (server == 1) then
- AddSourcesFromArray(server_sources)
+ AddSourcesFromArray(".", server_sources)
else
- AddSourcesFromArray(client_sources)
+ AddSourcesFromArray(".", client_sources)
includedirs { path_src.."/freetype/include" }
AddHeaders("renderer")
links { "renderer", "freetype", "libjpeg-turbo" }
@@ -406,17 +417,17 @@ local function ApplyExeProjectSettings(exeName, server)
filter { "system:windows" }
if (server == 1) then
- AddSourcesFromArray(server_sources_windows)
+ AddSourcesFromArray(".", server_sources_windows)
else
- AddSourcesFromArray(client_sources_windows)
+ AddSourcesFromArray(".", client_sources_windows)
end
AddHeaders("win32")
filter { "system:not windows" }
if (server == 1) then
- AddSourcesFromArray(server_sources_unix)
+ AddSourcesFromArray(".", server_sources_unix)
else
- AddSourcesFromArray(client_sources_unix)
+ AddSourcesFromArray(".", client_sources_unix)
end
-- create git info header
@@ -468,13 +479,6 @@ local function ApplyExeProjectSettings(exeName, server)
-- otherwise, we run into problems (that should really be fixed)
filter "action:gmake"
buildoptions { "-x c++" }
-
- if (server == 0 and os.is("linux")) then
- for idx,name in pairs(jpeg_asm_file_names) do
- local obj_path = string.format("%s/%s.obj", GetJpegObjPath(), name)
- linkoptions { obj_path }
- end
- end
end
@@ -482,118 +486,171 @@ local function ApplyLibJpegTurboProjectSettings()
local jpeg_sources =
{
- "libjpeg-turbo/jcapimin.c",
- "libjpeg-turbo/jcapistd.c",
- "libjpeg-turbo/jccoefct.c",
- "libjpeg-turbo/jccolor.c",
- "libjpeg-turbo/jcdctmgr.c",
- "libjpeg-turbo/jchuff.c",
- "libjpeg-turbo/jcinit.c",
- "libjpeg-turbo/jcmainct.c",
- "libjpeg-turbo/jcmarker.c",
- "libjpeg-turbo/jcmaster.c",
- "libjpeg-turbo/jcomapi.c",
- "libjpeg-turbo/jcparam.c",
- "libjpeg-turbo/jcphuff.c",
- "libjpeg-turbo/jcprepct.c",
- "libjpeg-turbo/jcsample.c",
- "libjpeg-turbo/jctrans.c",
- "libjpeg-turbo/jdapimin.c",
- "libjpeg-turbo/jdapistd.c",
- "libjpeg-turbo/jdatadst.c",
- "libjpeg-turbo/jdatasrc.c",
- "libjpeg-turbo/jdcoefct.c",
- "libjpeg-turbo/jdcolor.c",
- "libjpeg-turbo/jddctmgr.c",
- "libjpeg-turbo/jdhuff.c",
- "libjpeg-turbo/jdinput.c",
- "libjpeg-turbo/jdmainct.c",
- "libjpeg-turbo/jdmarker.c",
- "libjpeg-turbo/jdmaster.c",
- "libjpeg-turbo/jdmerge.c",
- "libjpeg-turbo/jdphuff.c",
- "libjpeg-turbo/jdpostct.c",
- "libjpeg-turbo/jdsample.c",
- "libjpeg-turbo/jdtrans.c",
- "libjpeg-turbo/jerror.c",
- "libjpeg-turbo/jfdctflt.c",
- "libjpeg-turbo/jfdctfst.c",
- "libjpeg-turbo/jfdctint.c",
- "libjpeg-turbo/jidctflt.c",
- "libjpeg-turbo/jidctfst.c",
- "libjpeg-turbo/jidctint.c",
- "libjpeg-turbo/jidctred.c",
- "libjpeg-turbo/jquant1.c",
- "libjpeg-turbo/jquant2.c",
- "libjpeg-turbo/jutils.c",
- "libjpeg-turbo/jmemmgr.c",
- "libjpeg-turbo/simd/jsimd_i386.c"
+ "jcapimin.c",
+ "jcapistd.c",
+ "jccoefct.c",
+ "jccolor.c",
+ "jcdctmgr.c",
+ "jchuff.c",
+ "jcinit.c",
+ "jcmainct.c",
+ "jcmarker.c",
+ "jcmaster.c",
+ "jcomapi.c",
+ "jcparam.c",
+ "jcphuff.c",
+ "jcprepct.c",
+ "jcsample.c",
+ "jctrans.c",
+ "jdapimin.c",
+ "jdapistd.c",
+ "jdatadst.c",
+ "jdatasrc.c",
+ "jdcoefct.c",
+ "jdcolor.c",
+ "jddctmgr.c",
+ "jdhuff.c",
+ "jdinput.c",
+ "jdmainct.c",
+ "jdmarker.c",
+ "jdmaster.c",
+ "jdmerge.c",
+ "jdphuff.c",
+ "jdpostct.c",
+ "jdsample.c",
+ "jdtrans.c",
+ "jerror.c",
+ "jfdctflt.c",
+ "jfdctfst.c",
+ "jfdctint.c",
+ "jidctflt.c",
+ "jidctfst.c",
+ "jidctint.c",
+ "jidctred.c",
+ "jquant1.c",
+ "jquant2.c",
+ "jutils.c",
+ "jmemmgr.c"
}
- AddSourcesFromArray(jpeg_sources)
+ local jpeg_asm_sources_x86 =
+ {
+ "jsimdcpu",
+ "jfdctflt-3dn",
+ "jidctflt-3dn",
+ "jquant-3dn",
+ "jccolor-mmx",
+ "jcgray-mmx",
+ "jcsample-mmx",
+ "jdcolor-mmx",
+ "jdmerge-mmx",
+ "jdsample-mmx",
+ "jfdctfst-mmx",
+ "jfdctint-mmx",
+ "jidctfst-mmx",
+ "jidctint-mmx",
+ "jidctred-mmx",
+ "jquant-mmx",
+ "jfdctflt-sse",
+ "jidctflt-sse",
+ "jquant-sse",
+ "jccolor-sse2",
+ "jcgray-sse2",
+ "jchuff-sse2",
+ "jcsample-sse2",
+ "jdcolor-sse2",
+ "jdmerge-sse2",
+ "jdsample-sse2",
+ "jfdctfst-sse2",
+ "jfdctint-sse2",
+ "jidctflt-sse2",
+ "jidctfst-sse2",
+ "jidctint-sse2",
+ "jidctred-sse2",
+ "jquantf-sse2",
+ "jquanti-sse2"
+ }
+
+ local jpeg_asm_sources_x64 =
+ {
+ "jfdctflt-sse-64",
+ "jccolor-sse2-64",
+ "jcgray-sse2-64",
+ "jchuff-sse2-64",
+ "jcsample-sse2-64",
+ "jdcolor-sse2-64",
+ "jdmerge-sse2-64",
+ "jdsample-sse2-64",
+ "jfdctfst-sse2-64",
+ "jfdctint-sse2-64",
+ "jidctflt-sse2-64",
+ "jidctfst-sse2-64",
+ "jidctint-sse2-64",
+ "jidctred-sse2-64",
+ "jquantf-sse2-64",
+ "jquanti-sse2-64"
+ }
+
+ AddSourcesFromArray("libjpeg-turbo", jpeg_sources)
includedirs { path_src.."/libjpeg-turbo", path_src.."/libjpeg-turbo/simd" }
- defines { "WITH_SIMD", "SIZEOF_SIZE_T=4" }
+ defines { "WITH_SIMD" }
+
+ filter "platforms:x32"
+ AddAssemblerSourcesFromArray("libjpeg-turbo/simd", jpeg_asm_sources_x86)
+ files { path_src.."/libjpeg-turbo/simd/jsimd_i386.c" }
+ defines { "SIZEOF_SIZE_T=4" }
+
+ filter "platforms:x64"
+ AddAssemblerSourcesFromArray("libjpeg-turbo/simd", jpeg_asm_sources_x64)
+ files { path_src.."/libjpeg-turbo/simd/jsimd_x86_64.c" }
+ defines { "SIZEOF_SIZE_T=8" }
local asm_inc_path = GetMakePath(path_src.."/libjpeg-turbo")
- local nasm_flags;
+ local nasm_flags = GetLibJpegTurboNasmFlags()
+ local nasm_includes
if os.is("windows") then
asm_inc_path = path.translate(asm_inc_path, "\\")
- nasm_flags = string.format("-fwin32 -DWIN32 -I%s\\ -I%s\\win\\ -I%s\\simd\\", asm_inc_path, asm_inc_path, asm_inc_path)
+ nasm_includes = string.format("-I%s\\ -I%s\\win\\ -I%s\\simd\\", asm_inc_path, asm_inc_path, asm_inc_path)
else
- nasm_flags = string.format("-felf32 -DELF -I%s/ -I%s/win/ -I%s/simd/", asm_inc_path, asm_inc_path, asm_inc_path)
+ nasm_includes = string.format("-I%s/ -I%s/win/ -I%s/simd/", asm_inc_path, asm_inc_path, asm_inc_path)
end
-
- -- the very first pre-build step is to make sure the output directory exists
- -- no, NASM will not create it for us if it doesn't exist
+
+ local obj_file_path = string.format("%s%s", "%{cfg.targetdir}/%{file.basename}", GetCompilerObjectExtension())
+ local command = string.format("nasm -o%s %s %s %s", obj_file_path, nasm_flags, nasm_includes, "%{file.relpath}")
if os.is("windows") then
- local obj_path = path.translate(string.format("%s/", GetJpegObjPath()), "\\")
- prebuildcommands { string.format("if not exist \"%s\" mkdir \"%s\"", obj_path, obj_path) }
- else
- prebuildcommands { string.format("mkdir -p %s", GetJpegObjPath()) }
+ command = path.translate(command, "\\")
+ obj_file_path = path.translate(obj_file_path, "\\")
end
-
- for idx,name in pairs(jpeg_asm_file_names) do
- local src_path = string.format("%s/libjpeg-turbo/simd/%s.asm", GetMakePath(path_src), name)
- local obj_path = string.format("%s/%s.obj", GetJpegObjPath(), name)
- if os.is("windows") then
- obj_path = path.translate(obj_path, "\\")
- end
- prebuildcommands { string.format("echo %s.asm && nasm -o%s %s %s ", name, obj_path, nasm_flags, src_path) }
- -- on Linux, we link those directly against the client
- if os.is("windows") then
- linkoptions { obj_path }
- end
- end
-
+
+ filter "files:**.asm"
+ buildmessage "%{file.basename}.asm"
+ buildcommands { command }
+ buildoutputs { obj_file_path }
+
extra_warnings = 0
ApplyLibProjectSettings()
extra_warnings = 1
end
-exe_suffix = "";
-if os.is("linux") then
- exe_suffix = "-x86"
-end
-
solution "cnq3"
location ( path_build.."/".._ACTION )
- platforms { "x32" }
+ platforms { "x32", "x64" }
configurations { "debug", "release" }
project "cnq3"
kind "WindowedApp"
language "C++"
- ApplyExeProjectSettings("cnq3"..exe_suffix, 0)
+ ApplyExeProjectSettings("cnq3", 0)
project "cnq3-server"
kind "WindowedApp"
language "C++"
defines { "DEDICATED" }
- ApplyExeProjectSettings("cnq3-server"..exe_suffix, 1)
+ ApplyExeProjectSettings("cnq3-server", 1)
project "botlib"
@@ -610,9 +667,9 @@ solution "cnq3"
AddSourcesAndHeaders("renderer")
includedirs { path_src.."/freetype/include" }
ApplyLibProjectSettings()
-
+
project "libjpeg-turbo"
-
+
kind "StaticLib"
language "C"
ApplyLibJpegTurboProjectSettings()
@@ -621,21 +678,23 @@ solution "cnq3"
local ft_sources =
{
- "freetype/src/base/ftbbox.c",
- "freetype/src/base/ftsynth.c",
- "freetype/src/base/ftbase.c",
- "freetype/src/base/ftglyph.c",
- "freetype/src/base/ftinit.c",
- "freetype/src/base/ftstroke.c",
- "freetype/src/base/ftsystem.c",
- "freetype/src/sfnt/sfnt.c",
- "freetype/src/smooth/smooth.c",
- "freetype/src/truetype/truetype.c"
+ "base/ftbbox.c",
+ "base/ftsynth.c",
+ "base/ftbase.c",
+ "base/ftglyph.c",
+ "base/ftinit.c",
+ "base/ftstroke.c",
+ "base/ftsystem.c",
+ "sfnt/sfnt.c",
+ "smooth/smooth.c",
+ "truetype/truetype.c"
}
kind "StaticLib"
language "C"
- AddSourcesFromArray(ft_sources)
+ AddSourcesFromArray("freetype/src", ft_sources)
includedirs { path_src.."/freetype/include" }
defines { "_LIB", "FT2_BUILD_LIBRARY", "_BIND_TO_CURRENT_VCLIBS_VERSION=1" }
ApplyLibProjectSettings()
+ filter "action:vs*"
+ buildoptions { "/wd4324" } -- "structure was padded due to __declspec(align())"
diff --git a/build/vs2013/botlib.vcxproj b/build/vs2013/botlib.vcxproj
index 09da66d..d746dd7 100644
--- a/build/vs2013/botlib.vcxproj
+++ b/build/vs2013/botlib.vcxproj
@@ -5,10 +5,18 @@
debug
Win32
+
+ debug
+ x64
+
release
Win32
+
+ release
+ x64
+
{A1A792F4-8D49-BDCA-7604-D11E6245441B}
@@ -23,6 +31,12 @@
Unicode
v120
+
+ StaticLibrary
+ true
+ Unicode
+ v120
+
StaticLibrary
false
@@ -30,30 +44,57 @@
v120
true
+
+ StaticLibrary
+ false
+ Unicode
+ v120
+ true
+
+
+
+
+
+
+
- ..\..\..\.bin\debug\
+ ..\..\..\.bin\debug_x32\
obj\x32\debug\botlib\
botlib
.lib
false
+
+ ..\..\..\.bin\debug_x64\
+ obj\x64\debug\botlib\
+ botlib
+ .lib
+ false
+
- ..\..\..\.bin\release\
+ ..\..\..\.bin\release_x32\
obj\x32\release\botlib\
botlib
.lib
false
+
+ ..\..\..\.bin\release_x64\
+ obj\x64\release\botlib\
+ botlib
+ .lib
+ false
+
NotUsing
@@ -75,6 +116,27 @@
%(AdditionalOptions)
+
+
+ NotUsing
+ Level4
+ BOTLIB;DEBUG;_DEBUG;_CRT_SECURE_NO_WARNINGS;WIN32;_WIN32;%(PreprocessorDefinitions)
+ ProgramDatabase
+ Disabled
+ MultiThreadedDebug
+ false
+ false
+ false
+ /Gm /wd4267 %(AdditionalOptions)
+
+
+ Windows
+ true
+
+
+ %(AdditionalOptions)
+
+
NotUsing
@@ -107,6 +169,37 @@
%(AdditionalOptions)
+
+
+ NotUsing
+ Level4
+ Default
+ BOTLIB;NDEBUG;_CRT_SECURE_NO_WARNINGS;WIN32;_WIN32;%(PreprocessorDefinitions)
+ ProgramDatabase
+ MinSpace
+ true
+ true
+ false
+ true
+ true
+ MultiThreaded
+ false
+ false
+ false
+ Fast
+ true
+ /GL /wd4267 %(AdditionalOptions)
+
+
+ Windows
+ true
+ true
+ true
+
+
+ %(AdditionalOptions)
+
+
diff --git a/build/vs2013/cnq3-server.vcxproj b/build/vs2013/cnq3-server.vcxproj
index 3a9ee8b..91ac4fb 100644
--- a/build/vs2013/cnq3-server.vcxproj
+++ b/build/vs2013/cnq3-server.vcxproj
@@ -5,10 +5,18 @@
debug
Win32
+
+ debug
+ x64
+
release
Win32
+
+ release
+ x64
+
{3EA67B52-AA5B-F447-3350-EE1E9F04EB4B}
@@ -23,6 +31,12 @@
Unicode
v120
+
+ Application
+ true
+ Unicode
+ v120
+
Application
false
@@ -30,29 +44,58 @@
v120
true
+
+ Application
+ false
+ Unicode
+ v120
+ true
+
+
+
+
+
+
+
true
- ..\..\..\.bin\debug\
+ ..\..\..\.bin\debug_x32\
obj\x32\debug\cnq3-server\
- cnq3-server
+ cnq3-server-x86
+ .exe
+ false
+
+
+ true
+ ..\..\..\.bin\debug_x64\
+ obj\x64\debug\cnq3-server\
+ cnq3-server-x64
.exe
false
false
- ..\..\..\.bin\release\
+ ..\..\..\.bin\release_x32\
obj\x32\release\cnq3-server\
- cnq3-server
+ cnq3-server-x86
+ .exe
+ false
+
+
+ false
+ ..\..\..\.bin\release_x64\
+ obj\x64\release\cnq3-server\
+ cnq3-server-x64
.exe
false
@@ -73,15 +116,43 @@
Windows
true
Winmm.lib;ws2_32.lib;%(AdditionalDependencies)
- ..\..\..\.bin\debug;%(AdditionalLibraryDirectories)
+ ..\..\..\.bin\debug_x32;%(AdditionalLibraryDirectories)
..\..\cnq3\code\win32\winquake.res /STACK:8388608 %(AdditionalOptions)
"..\..\..\cnq3tools\git\create_git_header.cmd" "..\..\code\qcommon\git.h"
- copy "..\..\..\.bin\debug\cnq3-server.exe" "$(QUAKE3DIR)"
-copy "..\..\..\.bin\debug\cnq3-server.pdb" "$(QUAKE3DIR)"
+ copy "..\..\..\.bin\debug_x32\cnq3-server-x86.exe" "$(QUAKE3DIR)"
+copy "..\..\..\.bin\debug_x32\cnq3-server-x86.pdb" "$(QUAKE3DIR)"
+
+
+
+
+ NotUsing
+ Level4
+ DEDICATED;DEBUG;_DEBUG;_CRT_SECURE_NO_WARNINGS;WIN32;_WIN32;%(PreprocessorDefinitions)
+ ProgramDatabase
+ Disabled
+ MultiThreadedDebug
+ false
+ false
+ false
+ /Gm /wd4267 %(AdditionalOptions)
+
+
+ Windows
+ true
+ Winmm.lib;ws2_32.lib;%(AdditionalDependencies)
+ ..\..\..\.bin\debug_x64;%(AdditionalLibraryDirectories)
+ ..\..\cnq3\code\win32\winquake.res /STACK:8388608 %(AdditionalOptions)
+
+
+ "..\..\..\cnq3tools\git\create_git_header.cmd" "..\..\code\qcommon\git.h"
+
+
+ copy "..\..\..\.bin\debug_x64\cnq3-server-x64.exe" "$(QUAKE3DIR)"
+copy "..\..\..\.bin\debug_x64\cnq3-server-x64.pdb" "$(QUAKE3DIR)"
@@ -112,15 +183,53 @@ copy "..\..\..\.bin\debug\cnq3-server.pdb" "$(QUAKE3DIR)"
true
true
Winmm.lib;ws2_32.lib;%(AdditionalDependencies)
- ..\..\..\.bin\release;%(AdditionalLibraryDirectories)
+ ..\..\..\.bin\release_x32;%(AdditionalLibraryDirectories)
..\..\cnq3\code\win32\winquake.res /STACK:8388608 /OPT:REF /OPT:ICF %(AdditionalOptions)
"..\..\..\cnq3tools\git\create_git_header.cmd" "..\..\code\qcommon\git.h"
- copy "..\..\..\.bin\release\cnq3-server.exe" "$(QUAKE3DIR)"
-copy "..\..\..\.bin\release\cnq3-server.pdb" "$(QUAKE3DIR)"
+ copy "..\..\..\.bin\release_x32\cnq3-server-x86.exe" "$(QUAKE3DIR)"
+copy "..\..\..\.bin\release_x32\cnq3-server-x86.pdb" "$(QUAKE3DIR)"
+
+
+
+
+ NotUsing
+ Level4
+ Default
+ DEDICATED;NDEBUG;_CRT_SECURE_NO_WARNINGS;WIN32;_WIN32;%(PreprocessorDefinitions)
+ ProgramDatabase
+ MinSpace
+ true
+ true
+ false
+ true
+ true
+ MultiThreaded
+ false
+ false
+ false
+ Fast
+ true
+ /GL /wd4267 %(AdditionalOptions)
+
+
+ Windows
+ true
+ true
+ true
+ Winmm.lib;ws2_32.lib;%(AdditionalDependencies)
+ ..\..\..\.bin\release_x64;%(AdditionalLibraryDirectories)
+ ..\..\cnq3\code\win32\winquake.res /STACK:8388608 /OPT:REF /OPT:ICF %(AdditionalOptions)
+
+
+ "..\..\..\cnq3tools\git\create_git_header.cmd" "..\..\code\qcommon\git.h"
+
+
+ copy "..\..\..\.bin\release_x64\cnq3-server-x64.exe" "$(QUAKE3DIR)"
+copy "..\..\..\.bin\release_x64\cnq3-server-x64.pdb" "$(QUAKE3DIR)"
diff --git a/build/vs2013/cnq3.sln b/build/vs2013/cnq3.sln
index aeb7f44..48c1ca9 100644
--- a/build/vs2013/cnq3.sln
+++ b/build/vs2013/cnq3.sln
@@ -16,33 +16,59 @@ EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
debug|Win32 = debug|Win32
+ debug|x64 = debug|x64
release|Win32 = release|Win32
+ release|x64 = release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BA3B957C-A672-960D-4F5F-7C103B75120F}.debug|Win32.ActiveCfg = debug|Win32
{BA3B957C-A672-960D-4F5F-7C103B75120F}.debug|Win32.Build.0 = debug|Win32
+ {BA3B957C-A672-960D-4F5F-7C103B75120F}.debug|x64.ActiveCfg = debug|x64
+ {BA3B957C-A672-960D-4F5F-7C103B75120F}.debug|x64.Build.0 = debug|x64
{BA3B957C-A672-960D-4F5F-7C103B75120F}.release|Win32.ActiveCfg = release|Win32
{BA3B957C-A672-960D-4F5F-7C103B75120F}.release|Win32.Build.0 = release|Win32
+ {BA3B957C-A672-960D-4F5F-7C103B75120F}.release|x64.ActiveCfg = release|x64
+ {BA3B957C-A672-960D-4F5F-7C103B75120F}.release|x64.Build.0 = release|x64
{3EA67B52-AA5B-F447-3350-EE1E9F04EB4B}.debug|Win32.ActiveCfg = debug|Win32
{3EA67B52-AA5B-F447-3350-EE1E9F04EB4B}.debug|Win32.Build.0 = debug|Win32
+ {3EA67B52-AA5B-F447-3350-EE1E9F04EB4B}.debug|x64.ActiveCfg = debug|x64
+ {3EA67B52-AA5B-F447-3350-EE1E9F04EB4B}.debug|x64.Build.0 = debug|x64
{3EA67B52-AA5B-F447-3350-EE1E9F04EB4B}.release|Win32.ActiveCfg = release|Win32
{3EA67B52-AA5B-F447-3350-EE1E9F04EB4B}.release|Win32.Build.0 = release|Win32
+ {3EA67B52-AA5B-F447-3350-EE1E9F04EB4B}.release|x64.ActiveCfg = release|x64
+ {3EA67B52-AA5B-F447-3350-EE1E9F04EB4B}.release|x64.Build.0 = release|x64
{A1A792F4-8D49-BDCA-7604-D11E6245441B}.debug|Win32.ActiveCfg = debug|Win32
{A1A792F4-8D49-BDCA-7604-D11E6245441B}.debug|Win32.Build.0 = debug|Win32
+ {A1A792F4-8D49-BDCA-7604-D11E6245441B}.debug|x64.ActiveCfg = debug|x64
+ {A1A792F4-8D49-BDCA-7604-D11E6245441B}.debug|x64.Build.0 = debug|x64
{A1A792F4-8D49-BDCA-7604-D11E6245441B}.release|Win32.ActiveCfg = release|Win32
{A1A792F4-8D49-BDCA-7604-D11E6245441B}.release|Win32.Build.0 = release|Win32
+ {A1A792F4-8D49-BDCA-7604-D11E6245441B}.release|x64.ActiveCfg = release|x64
+ {A1A792F4-8D49-BDCA-7604-D11E6245441B}.release|x64.Build.0 = release|x64
{9C6AA017-8837-FB22-B150-E9CA9D7C30B1}.debug|Win32.ActiveCfg = debug|Win32
{9C6AA017-8837-FB22-B150-E9CA9D7C30B1}.debug|Win32.Build.0 = debug|Win32
+ {9C6AA017-8837-FB22-B150-E9CA9D7C30B1}.debug|x64.ActiveCfg = debug|x64
+ {9C6AA017-8837-FB22-B150-E9CA9D7C30B1}.debug|x64.Build.0 = debug|x64
{9C6AA017-8837-FB22-B150-E9CA9D7C30B1}.release|Win32.ActiveCfg = release|Win32
{9C6AA017-8837-FB22-B150-E9CA9D7C30B1}.release|Win32.Build.0 = release|Win32
+ {9C6AA017-8837-FB22-B150-E9CA9D7C30B1}.release|x64.ActiveCfg = release|x64
+ {9C6AA017-8837-FB22-B150-E9CA9D7C30B1}.release|x64.Build.0 = release|x64
{DB56484D-4717-C483-1052-0D017CD10860}.debug|Win32.ActiveCfg = debug|Win32
{DB56484D-4717-C483-1052-0D017CD10860}.debug|Win32.Build.0 = debug|Win32
+ {DB56484D-4717-C483-1052-0D017CD10860}.debug|x64.ActiveCfg = debug|x64
+ {DB56484D-4717-C483-1052-0D017CD10860}.debug|x64.Build.0 = debug|x64
{DB56484D-4717-C483-1052-0D017CD10860}.release|Win32.ActiveCfg = release|Win32
{DB56484D-4717-C483-1052-0D017CD10860}.release|Win32.Build.0 = release|Win32
+ {DB56484D-4717-C483-1052-0D017CD10860}.release|x64.ActiveCfg = release|x64
+ {DB56484D-4717-C483-1052-0D017CD10860}.release|x64.Build.0 = release|x64
{89895BD8-7556-B6E3-9E6F-A48B8A9BEB71}.debug|Win32.ActiveCfg = debug|Win32
{89895BD8-7556-B6E3-9E6F-A48B8A9BEB71}.debug|Win32.Build.0 = debug|Win32
+ {89895BD8-7556-B6E3-9E6F-A48B8A9BEB71}.debug|x64.ActiveCfg = debug|x64
+ {89895BD8-7556-B6E3-9E6F-A48B8A9BEB71}.debug|x64.Build.0 = debug|x64
{89895BD8-7556-B6E3-9E6F-A48B8A9BEB71}.release|Win32.ActiveCfg = release|Win32
{89895BD8-7556-B6E3-9E6F-A48B8A9BEB71}.release|Win32.Build.0 = release|Win32
+ {89895BD8-7556-B6E3-9E6F-A48B8A9BEB71}.release|x64.ActiveCfg = release|x64
+ {89895BD8-7556-B6E3-9E6F-A48B8A9BEB71}.release|x64.Build.0 = release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/build/vs2013/cnq3.vcxproj b/build/vs2013/cnq3.vcxproj
index c7dd2a4..53e2fcb 100644
--- a/build/vs2013/cnq3.vcxproj
+++ b/build/vs2013/cnq3.vcxproj
@@ -5,10 +5,18 @@
debug
Win32
+
+ debug
+ x64
+
release
Win32
+
+ release
+ x64
+
{BA3B957C-A672-960D-4F5F-7C103B75120F}
@@ -23,6 +31,12 @@
Unicode
v120
+
+ Application
+ true
+ Unicode
+ v120
+
Application
false
@@ -30,29 +44,58 @@
v120
true
+
+ Application
+ false
+ Unicode
+ v120
+ true
+
+
+
+
+
+
+
true
- ..\..\..\.bin\debug\
+ ..\..\..\.bin\debug_x32\
obj\x32\debug\cnq3\
- cnq3
+ cnq3-x86
+ .exe
+ false
+
+
+ true
+ ..\..\..\.bin\debug_x64\
+ obj\x64\debug\cnq3\
+ cnq3-x64
.exe
false
false
- ..\..\..\.bin\release\
+ ..\..\..\.bin\release_x32\
obj\x32\release\cnq3\
- cnq3
+ cnq3-x86
+ .exe
+ false
+
+
+ false
+ ..\..\..\.bin\release_x64\
+ obj\x64\release\cnq3\
+ cnq3-x64
.exe
false
@@ -74,15 +117,44 @@
Windows
true
Winmm.lib;ws2_32.lib;opengl32.lib;%(AdditionalDependencies)
- ..\..\..\.bin\debug;%(AdditionalLibraryDirectories)
+ ..\..\..\.bin\debug_x32;%(AdditionalLibraryDirectories)
..\..\cnq3\code\win32\winquake.res /STACK:8388608 %(AdditionalOptions)
"..\..\..\cnq3tools\git\create_git_header.cmd" "..\..\code\qcommon\git.h"
- copy "..\..\..\.bin\debug\cnq3.exe" "$(QUAKE3DIR)"
-copy "..\..\..\.bin\debug\cnq3.pdb" "$(QUAKE3DIR)"
+ copy "..\..\..\.bin\debug_x32\cnq3-x86.exe" "$(QUAKE3DIR)"
+copy "..\..\..\.bin\debug_x32\cnq3-x86.pdb" "$(QUAKE3DIR)"
+
+
+
+
+ NotUsing
+ Level4
+ DEBUG;_DEBUG;_CRT_SECURE_NO_WARNINGS;WIN32;_WIN32;%(PreprocessorDefinitions)
+ ..\..\code\freetype\include;%(AdditionalIncludeDirectories)
+ ProgramDatabase
+ Disabled
+ MultiThreadedDebug
+ false
+ false
+ false
+ /Gm /wd4267 %(AdditionalOptions)
+
+
+ Windows
+ true
+ Winmm.lib;ws2_32.lib;opengl32.lib;%(AdditionalDependencies)
+ ..\..\..\.bin\debug_x64;%(AdditionalLibraryDirectories)
+ ..\..\cnq3\code\win32\winquake.res /STACK:8388608 %(AdditionalOptions)
+
+
+ "..\..\..\cnq3tools\git\create_git_header.cmd" "..\..\code\qcommon\git.h"
+
+
+ copy "..\..\..\.bin\debug_x64\cnq3-x64.exe" "$(QUAKE3DIR)"
+copy "..\..\..\.bin\debug_x64\cnq3-x64.pdb" "$(QUAKE3DIR)"
@@ -114,15 +186,54 @@ copy "..\..\..\.bin\debug\cnq3.pdb" "$(QUAKE3DIR)"
true
true
Winmm.lib;ws2_32.lib;opengl32.lib;%(AdditionalDependencies)
- ..\..\..\.bin\release;%(AdditionalLibraryDirectories)
+ ..\..\..\.bin\release_x32;%(AdditionalLibraryDirectories)
..\..\cnq3\code\win32\winquake.res /STACK:8388608 /OPT:REF /OPT:ICF %(AdditionalOptions)
"..\..\..\cnq3tools\git\create_git_header.cmd" "..\..\code\qcommon\git.h"
- copy "..\..\..\.bin\release\cnq3.exe" "$(QUAKE3DIR)"
-copy "..\..\..\.bin\release\cnq3.pdb" "$(QUAKE3DIR)"
+ copy "..\..\..\.bin\release_x32\cnq3-x86.exe" "$(QUAKE3DIR)"
+copy "..\..\..\.bin\release_x32\cnq3-x86.pdb" "$(QUAKE3DIR)"
+
+
+
+
+ NotUsing
+ Level4
+ Default
+ NDEBUG;_CRT_SECURE_NO_WARNINGS;WIN32;_WIN32;%(PreprocessorDefinitions)
+ ..\..\code\freetype\include;%(AdditionalIncludeDirectories)
+ ProgramDatabase
+ MinSpace
+ true
+ true
+ false
+ true
+ true
+ MultiThreaded
+ false
+ false
+ false
+ Fast
+ true
+ /GL /wd4267 %(AdditionalOptions)
+
+
+ Windows
+ true
+ true
+ true
+ Winmm.lib;ws2_32.lib;opengl32.lib;%(AdditionalDependencies)
+ ..\..\..\.bin\release_x64;%(AdditionalLibraryDirectories)
+ ..\..\cnq3\code\win32\winquake.res /STACK:8388608 /OPT:REF /OPT:ICF %(AdditionalOptions)
+
+
+ "..\..\..\cnq3tools\git\create_git_header.cmd" "..\..\code\qcommon\git.h"
+
+
+ copy "..\..\..\.bin\release_x64\cnq3-x64.exe" "$(QUAKE3DIR)"
+copy "..\..\..\.bin\release_x64\cnq3-x64.pdb" "$(QUAKE3DIR)"
diff --git a/build/vs2013/freetype.vcxproj b/build/vs2013/freetype.vcxproj
index 2772495..16da150 100644
--- a/build/vs2013/freetype.vcxproj
+++ b/build/vs2013/freetype.vcxproj
@@ -5,10 +5,18 @@
debug
Win32
+
+ debug
+ x64
+
release
Win32
+
+ release
+ x64
+
{89895BD8-7556-B6E3-9E6F-A48B8A9BEB71}
@@ -23,6 +31,12 @@
Unicode
v120
+
+ StaticLibrary
+ true
+ Unicode
+ v120
+
StaticLibrary
false
@@ -30,30 +44,57 @@
v120
true
+
+ StaticLibrary
+ false
+ Unicode
+ v120
+ true
+
+
+
+
+
+
+
- ..\..\..\.bin\debug\
+ ..\..\..\.bin\debug_x32\
obj\x32\debug\freetype\
freetype
.lib
false
+
+ ..\..\..\.bin\debug_x64\
+ obj\x64\debug\freetype\
+ freetype
+ .lib
+ false
+
- ..\..\..\.bin\release\
+ ..\..\..\.bin\release_x32\
obj\x32\release\freetype\
freetype
.lib
false
+
+ ..\..\..\.bin\release_x64\
+ obj\x64\release\freetype\
+ freetype
+ .lib
+ false
+
NotUsing
@@ -66,7 +107,30 @@
false
false
false
- /Gm %(AdditionalOptions)
+ /Gm /wd4324 %(AdditionalOptions)
+ CompileAsC
+
+
+ Windows
+ true
+
+
+ %(AdditionalOptions)
+
+
+
+
+ NotUsing
+ Level4
+ _LIB;FT2_BUILD_LIBRARY;_BIND_TO_CURRENT_VCLIBS_VERSION=1;DEBUG;_DEBUG;_CRT_SECURE_NO_WARNINGS;WIN32;_WIN32;%(PreprocessorDefinitions)
+ ..\..\code\freetype\include;%(AdditionalIncludeDirectories)
+ ProgramDatabase
+ Disabled
+ MultiThreadedDebug
+ false
+ false
+ false
+ /Gm /wd4267 /wd4324 %(AdditionalOptions)
CompileAsC
@@ -98,7 +162,40 @@
Fast
StreamingSIMDExtensions2
true
- /GL %(AdditionalOptions)
+ /GL /wd4324 %(AdditionalOptions)
+ CompileAsC
+
+
+ Windows
+ true
+ true
+ true
+
+
+ %(AdditionalOptions)
+
+
+
+
+ NotUsing
+ Level4
+ Default
+ _LIB;FT2_BUILD_LIBRARY;_BIND_TO_CURRENT_VCLIBS_VERSION=1;NDEBUG;_CRT_SECURE_NO_WARNINGS;WIN32;_WIN32;%(PreprocessorDefinitions)
+ ..\..\code\freetype\include;%(AdditionalIncludeDirectories)
+ ProgramDatabase
+ MinSpace
+ true
+ true
+ false
+ true
+ true
+ MultiThreaded
+ false
+ false
+ false
+ Fast
+ true
+ /GL /wd4267 /wd4324 %(AdditionalOptions)
CompileAsC
diff --git a/build/vs2013/libjpeg-turbo.vcxproj b/build/vs2013/libjpeg-turbo.vcxproj
index e7f7c5d..3b051ba 100644
--- a/build/vs2013/libjpeg-turbo.vcxproj
+++ b/build/vs2013/libjpeg-turbo.vcxproj
@@ -5,10 +5,18 @@
debug
Win32
+
+ debug
+ x64
+
release
Win32
+
+ release
+ x64
+
{DB56484D-4717-C483-1052-0D017CD10860}
@@ -23,6 +31,12 @@
Unicode
v120
+
+ StaticLibrary
+ true
+ Unicode
+ v120
+
StaticLibrary
false
@@ -30,30 +44,57 @@
v120
true
+
+ StaticLibrary
+ false
+ Unicode
+ v120
+ true
+
+
+
+
+
+
+
- ..\..\..\.bin\debug\
+ ..\..\..\.bin\debug_x32\
obj\x32\debug\libjpeg-turbo\
libjpeg-turbo
.lib
false
+
+ ..\..\..\.bin\debug_x64\
+ obj\x64\debug\libjpeg-turbo\
+ libjpeg-turbo
+ .lib
+ false
+
- ..\..\..\.bin\release\
+ ..\..\..\.bin\release_x32\
obj\x32\release\libjpeg-turbo\
libjpeg-turbo
.lib
false
+
+ ..\..\..\.bin\release_x64\
+ obj\x64\release\libjpeg-turbo\
+ libjpeg-turbo
+ .lib
+ false
+
NotUsing
@@ -74,45 +115,31 @@
true
- ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jsimdcpu.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctflt-3dn.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctflt-3dn.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquant-3dn.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jccolor-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jcgray-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jcsample-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdcolor-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdmerge-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdsample-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctfst-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctint-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctfst-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctint-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctred-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquant-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctflt-sse.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctflt-sse.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquant-sse.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jccolor-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jcgray-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jchuff-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jcsample-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdcolor-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdmerge-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdsample-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctfst-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctint-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctflt-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctfst-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctint-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctred-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquantf-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquanti-sse2.obj %(AdditionalOptions)
+ %(AdditionalOptions)
+
+
+
+
+ NotUsing
+ Level3
+ WITH_SIMD;SIZEOF_SIZE_T=8;DEBUG;_DEBUG;_CRT_SECURE_NO_WARNINGS;WIN32;_WIN32;%(PreprocessorDefinitions)
+ ..\..\code\libjpeg-turbo;..\..\code\libjpeg-turbo\simd;%(AdditionalIncludeDirectories)
+ ProgramDatabase
+ Disabled
+ MultiThreadedDebug
+ false
+ false
+ false
+ /Gm /wd4267 %(AdditionalOptions)
+ CompileAsC
+
+
+ Windows
+ true
+
+
+ %(AdditionalOptions)
-
- if not exist "..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\" mkdir "..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\"
-echo jsimdcpu.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jsimdcpu.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jsimdcpu.asm
-echo jfdctflt-3dn.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctflt-3dn.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jfdctflt-3dn.asm
-echo jidctflt-3dn.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctflt-3dn.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jidctflt-3dn.asm
-echo jquant-3dn.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquant-3dn.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jquant-3dn.asm
-echo jccolor-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jccolor-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jccolor-mmx.asm
-echo jcgray-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jcgray-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jcgray-mmx.asm
-echo jcsample-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jcsample-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jcsample-mmx.asm
-echo jdcolor-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdcolor-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jdcolor-mmx.asm
-echo jdmerge-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdmerge-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jdmerge-mmx.asm
-echo jdsample-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdsample-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jdsample-mmx.asm
-echo jfdctfst-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctfst-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jfdctfst-mmx.asm
-echo jfdctint-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctint-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jfdctint-mmx.asm
-echo jidctfst-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctfst-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jidctfst-mmx.asm
-echo jidctint-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctint-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jidctint-mmx.asm
-echo jidctred-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctred-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jidctred-mmx.asm
-echo jquant-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquant-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jquant-mmx.asm
-echo jfdctflt-sse.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctflt-sse.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jfdctflt-sse.asm
-echo jidctflt-sse.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctflt-sse.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jidctflt-sse.asm
-echo jquant-sse.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquant-sse.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jquant-sse.asm
-echo jccolor-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jccolor-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jccolor-sse2.asm
-echo jcgray-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jcgray-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jcgray-sse2.asm
-echo jchuff-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jchuff-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jchuff-sse2.asm
-echo jcsample-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jcsample-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jcsample-sse2.asm
-echo jdcolor-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdcolor-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jdcolor-sse2.asm
-echo jdmerge-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdmerge-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jdmerge-sse2.asm
-echo jdsample-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdsample-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jdsample-sse2.asm
-echo jfdctfst-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctfst-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jfdctfst-sse2.asm
-echo jfdctint-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctint-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jfdctint-sse2.asm
-echo jidctflt-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctflt-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jidctflt-sse2.asm
-echo jidctfst-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctfst-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jidctfst-sse2.asm
-echo jidctint-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctint-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jidctint-sse2.asm
-echo jidctred-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctred-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jidctred-sse2.asm
-echo jquantf-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquantf-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jquantf-sse2.asm
-echo jquanti-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquanti-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jquanti-sse2.asm
-
@@ -145,45 +172,41 @@ echo jquanti-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\w
true
- ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jsimdcpu.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctflt-3dn.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctflt-3dn.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquant-3dn.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jccolor-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jcgray-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jcsample-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdcolor-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdmerge-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdsample-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctfst-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctint-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctfst-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctint-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctred-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquant-mmx.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctflt-sse.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctflt-sse.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquant-sse.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jccolor-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jcgray-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jchuff-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jcsample-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdcolor-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdmerge-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdsample-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctfst-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctint-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctflt-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctfst-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctint-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctred-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquantf-sse2.obj ..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquanti-sse2.obj %(AdditionalOptions)
+ %(AdditionalOptions)
+
+
+
+
+ NotUsing
+ Level3
+ Default
+ WITH_SIMD;SIZEOF_SIZE_T=8;NDEBUG;_CRT_SECURE_NO_WARNINGS;WIN32;_WIN32;%(PreprocessorDefinitions)
+ ..\..\code\libjpeg-turbo;..\..\code\libjpeg-turbo\simd;%(AdditionalIncludeDirectories)
+ ProgramDatabase
+ MinSpace
+ true
+ true
+ false
+ true
+ true
+ MultiThreaded
+ false
+ false
+ false
+ Fast
+ true
+ /GL /wd4267 %(AdditionalOptions)
+ CompileAsC
+
+
+ Windows
+ true
+ true
+ true
+
+
+ %(AdditionalOptions)
-
- if not exist "..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\" mkdir "..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\"
-echo jsimdcpu.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jsimdcpu.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jsimdcpu.asm
-echo jfdctflt-3dn.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctflt-3dn.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jfdctflt-3dn.asm
-echo jidctflt-3dn.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctflt-3dn.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jidctflt-3dn.asm
-echo jquant-3dn.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquant-3dn.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jquant-3dn.asm
-echo jccolor-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jccolor-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jccolor-mmx.asm
-echo jcgray-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jcgray-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jcgray-mmx.asm
-echo jcsample-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jcsample-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jcsample-mmx.asm
-echo jdcolor-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdcolor-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jdcolor-mmx.asm
-echo jdmerge-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdmerge-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jdmerge-mmx.asm
-echo jdsample-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdsample-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jdsample-mmx.asm
-echo jfdctfst-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctfst-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jfdctfst-mmx.asm
-echo jfdctint-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctint-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jfdctint-mmx.asm
-echo jidctfst-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctfst-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jidctfst-mmx.asm
-echo jidctint-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctint-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jidctint-mmx.asm
-echo jidctred-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctred-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jidctred-mmx.asm
-echo jquant-mmx.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquant-mmx.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jquant-mmx.asm
-echo jfdctflt-sse.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctflt-sse.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jfdctflt-sse.asm
-echo jidctflt-sse.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctflt-sse.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jidctflt-sse.asm
-echo jquant-sse.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquant-sse.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jquant-sse.asm
-echo jccolor-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jccolor-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jccolor-sse2.asm
-echo jcgray-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jcgray-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jcgray-sse2.asm
-echo jchuff-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jchuff-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jchuff-sse2.asm
-echo jcsample-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jcsample-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jcsample-sse2.asm
-echo jdcolor-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdcolor-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jdcolor-sse2.asm
-echo jdmerge-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdmerge-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jdmerge-sse2.asm
-echo jdsample-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jdsample-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jdsample-sse2.asm
-echo jfdctfst-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctfst-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jfdctfst-sse2.asm
-echo jfdctint-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jfdctint-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jfdctint-sse2.asm
-echo jidctflt-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctflt-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jidctflt-sse2.asm
-echo jidctfst-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctfst-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jidctfst-sse2.asm
-echo jidctint-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctint-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jidctint-sse2.asm
-echo jidctred-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jidctred-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jidctred-sse2.asm
-echo jquantf-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquantf-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jquantf-sse2.asm
-echo jquanti-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\win32\jquanti-sse2.obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ ../../../cnq3/code/libjpeg-turbo/simd/jquanti-sse2.asm
-
@@ -231,7 +254,466 @@ echo jquanti-sse2.asm && nasm -o..\..\..\cnq3\build\nasm\libjpeg-turbo\w
-
+
+ true
+ true
+
+
+ true
+ true
+
+
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x64/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x64/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x64/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x64/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x64/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x64/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x64/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x64/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x64/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x64/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x64/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x64/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x64/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x64/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x64/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x64/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x64/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x64/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x64/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x64/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x64/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x64/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x64/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x64/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x64/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x64/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x64/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x64/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x64/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x64/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x64/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x64\%(Filename).obj -fwin64 -DWIN64 -D__x86_64__ -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x64/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
+
+ Document
+ nasm -o../../../.bin/debug_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/debug_x32/%(Filename).obj
+ %(Filename).asm
+ nasm -o../../../.bin/release_x32\%(Filename).obj -fwin32 -DWIN32 -I..\..\..\cnq3\code\libjpeg-turbo\ -I..\..\..\cnq3\code\libjpeg-turbo\win\ -I..\..\..\cnq3\code\libjpeg-turbo\simd\ %(Identity)
+ ../../../.bin/release_x32/%(Filename).obj
+ %(Filename).asm
+
diff --git a/build/vs2013/libjpeg-turbo.vcxproj.filters b/build/vs2013/libjpeg-turbo.vcxproj.filters
index efb7036..f919132 100644
--- a/build/vs2013/libjpeg-turbo.vcxproj.filters
+++ b/build/vs2013/libjpeg-turbo.vcxproj.filters
@@ -54,5 +54,160 @@
simd
+
+ simd
+
+
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
+
+ simd
+
\ No newline at end of file
diff --git a/build/vs2013/renderer.vcxproj b/build/vs2013/renderer.vcxproj
index b29c858..17c7345 100644
--- a/build/vs2013/renderer.vcxproj
+++ b/build/vs2013/renderer.vcxproj
@@ -5,10 +5,18 @@
debug
Win32
+
+ debug
+ x64
+
release
Win32
+
+ release
+ x64
+
{9C6AA017-8837-FB22-B150-E9CA9D7C30B1}
@@ -23,6 +31,12 @@
Unicode
v120
+
+ StaticLibrary
+ true
+ Unicode
+ v120
+
StaticLibrary
false
@@ -30,30 +44,57 @@
v120
true
+
+ StaticLibrary
+ false
+ Unicode
+ v120
+ true
+
+
+
+
+
+
+
- ..\..\..\.bin\debug\
+ ..\..\..\.bin\debug_x32\
obj\x32\debug\renderer\
renderer
.lib
false
+
+ ..\..\..\.bin\debug_x64\
+ obj\x64\debug\renderer\
+ renderer
+ .lib
+ false
+
- ..\..\..\.bin\release\
+ ..\..\..\.bin\release_x32\
obj\x32\release\renderer\
renderer
.lib
false
+
+ ..\..\..\.bin\release_x64\
+ obj\x64\release\renderer\
+ renderer
+ .lib
+ false
+
NotUsing
@@ -76,6 +117,28 @@
%(AdditionalOptions)
+
+
+ NotUsing
+ Level4
+ DEBUG;_DEBUG;_CRT_SECURE_NO_WARNINGS;WIN32;_WIN32;%(PreprocessorDefinitions)
+ ..\..\code\freetype\include;%(AdditionalIncludeDirectories)
+ ProgramDatabase
+ Disabled
+ MultiThreadedDebug
+ false
+ false
+ false
+ /Gm /wd4267 %(AdditionalOptions)
+
+
+ Windows
+ true
+
+
+ %(AdditionalOptions)
+
+
NotUsing
@@ -109,6 +172,38 @@
%(AdditionalOptions)
+
+
+ NotUsing
+ Level4
+ Default
+ NDEBUG;_CRT_SECURE_NO_WARNINGS;WIN32;_WIN32;%(PreprocessorDefinitions)
+ ..\..\code\freetype\include;%(AdditionalIncludeDirectories)
+ ProgramDatabase
+ MinSpace
+ true
+ true
+ false
+ true
+ true
+ MultiThreaded
+ false
+ false
+ false
+ Fast
+ true
+ /GL /wd4267 %(AdditionalOptions)
+
+
+ Windows
+ true
+ true
+ true
+
+
+ %(AdditionalOptions)
+
+
diff --git a/code/botlib/aasfile.h b/code/botlib/aasfile.h
index cd7e144..7f76951 100644
--- a/code/botlib/aasfile.h
+++ b/code/botlib/aasfile.h
@@ -164,10 +164,10 @@ typedef int aas_portalindex_t;
//cluster
typedef struct aas_cluster_s
{
- size_t numareas; //number of areas in the cluster
- size_t numreachabilityareas; //number of areas with reachabilities
- size_t numportals; //number of cluster portals
- size_t firstportal; //first cluster portal in the index
+ unsigned int numareas; //number of areas in the cluster
+ unsigned int numreachabilityareas; //number of areas with reachabilities
+ unsigned int numportals; //number of cluster portals
+ unsigned int firstportal; //first cluster portal in the index
} aas_cluster_t;
//============ 3d definition ============
diff --git a/code/botlib/be_aas_def.h b/code/botlib/be_aas_def.h
index 1929bdf..7619d65 100644
--- a/code/botlib/be_aas_def.h
+++ b/code/botlib/be_aas_def.h
@@ -225,7 +225,7 @@ typedef struct aas_s
int faceindexsize;
aas_faceindex_t *faceindex;
//convex areas
- size_t numareas;
+ unsigned int numareas;
aas_area_t *areas;
//convex area settings
int numareasettings;
@@ -243,7 +243,7 @@ typedef struct aas_s
int portalindexsize;
aas_portalindex_t *portalindex;
//clusters
- size_t numclusters;
+ unsigned int numclusters;
aas_cluster_t *clusters;
//
int numreachabilityareas;
diff --git a/code/botlib/be_ai_goal.cpp b/code/botlib/be_ai_goal.cpp
index 451b9af..27bba21 100644
--- a/code/botlib/be_ai_goal.cpp
+++ b/code/botlib/be_ai_goal.cpp
@@ -133,7 +133,7 @@ typedef struct iteminfo_s
int number; //number of the item info
} iteminfo_t;
-#define ITEMINFO_OFS(x) (int)&(((iteminfo_t *)0)->x)
+#define ITEMINFO_OFS(x) (intptr_t)&(((iteminfo_t *)0)->x)
fielddef_t iteminfo_fields[] =
{
diff --git a/code/botlib/be_ai_weap.cpp b/code/botlib/be_ai_weap.cpp
index 84329eb..b913806 100644
--- a/code/botlib/be_ai_weap.cpp
+++ b/code/botlib/be_ai_weap.cpp
@@ -47,8 +47,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
//#define DEBUG_AI_WEAP
//structure field offsets
-#define WEAPON_OFS(x) (int)&(((weaponinfo_t *)0)->x)
-#define PROJECTILE_OFS(x) (int)&(((projectileinfo_t *)0)->x)
+#define WEAPON_OFS(x) (intptr_t)&(((weaponinfo_t *)0)->x)
+#define PROJECTILE_OFS(x) (intptr_t)&(((projectileinfo_t *)0)->x)
//weapon definition // bk001212 - static
static fielddef_t weaponinfo_fields[] =
diff --git a/code/botlib/l_struct.h b/code/botlib/l_struct.h
index e2c6b03..5cb097f 100644
--- a/code/botlib/l_struct.h
+++ b/code/botlib/l_struct.h
@@ -48,7 +48,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
typedef struct fielddef_s
{
char *name; //name of the field
- int offset; //offset in the structure
+ intptr_t offset; //offset in the structure
int type; //type of the field
//type specific fields
int maxarray; //maximum array size
diff --git a/code/client/cl_cgame.cpp b/code/client/cl_cgame.cpp
index 21592df..4b6bbd0 100644
--- a/code/client/cl_cgame.cpp
+++ b/code/client/cl_cgame.cpp
@@ -562,9 +562,9 @@ void CL_InitCGame()
Com_sprintf( cl.mapname, sizeof( cl.mapname ), "maps/%s.bsp", mapname );
// if sv_pure is set we only allow qvms to be loaded
- vmInterpret_t interpret = cl_connectedToPureServer ? VMI_COMPILED : (vmInterpret_t)Cvar_VariableIntegerValue("vm_cgame");
+ const vmInterpret_t interpret = cl_connectedToPureServer ? VMI_COMPILED : (vmInterpret_t)Cvar_VariableIntegerValue( "vm_cgame" );
- cgvm = VM_Create( "cgame", CL_CgameSystemCalls, interpret );
+ cgvm = VM_Create( VM_CGAME, CL_CgameSystemCalls, interpret );
if ( !cgvm ) {
Com_Error( ERR_DROP, "VM_Create on cgame failed" );
}
@@ -605,7 +605,6 @@ qbool CL_GameCommand()
void CL_CGameRendering( stereoFrame_t stereo )
{
VM_Call( cgvm, CG_DRAW_ACTIVE_FRAME, cl.serverTime, stereo, clc.demoplaying );
- VM_Debug( 0 );
}
diff --git a/code/client/cl_ui.cpp b/code/client/cl_ui.cpp
index 773adc9..f9f9031 100644
--- a/code/client/cl_ui.cpp
+++ b/code/client/cl_ui.cpp
@@ -1104,7 +1104,7 @@ void CL_InitUI()
// if sv_pure is set we only allow qvms to be loaded
vmInterpret_t interpret = cl_connectedToPureServer ? VMI_COMPILED : (vmInterpret_t)Cvar_VariableIntegerValue("vm_ui");
- uivm = VM_Create( "ui", CL_UISystemCalls, interpret );
+ uivm = VM_Create( VM_UI, CL_UISystemCalls, interpret );
if ( !uivm )
Com_Error( ERR_FATAL, "VM_Create on UI failed" );
diff --git a/code/qcommon/common.cpp b/code/qcommon/common.cpp
index 76071f9..1c46eb5 100644
--- a/code/qcommon/common.cpp
+++ b/code/qcommon/common.cpp
@@ -25,6 +25,14 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include "qcommon.h"
#include
+#if (_MSC_VER >= 1400) // Visual C++ 2005 or later
+#define MSVC_CPUID 1
+#include
+#elif (__GNUC__)
+#define GCC_CPUID 1
+#include
+#endif
+
#ifndef _WIN32
#include
#include // umask
@@ -219,14 +227,6 @@ void QDECL Com_Error( int code, const char *fmt, ... )
static int lastErrorTime;
static int errorCount;
-#if defined(_WIN32) && defined(_DEBUG)
- if ( code != ERR_DISCONNECT && code != ERR_NEED_CD ) {
- if (!com_noErrorInterrupt->integer && IsDebuggerPresent()) {
- __debugbreak();
- }
- }
-#endif
-
// when we are running automated scripts, make sure we
// know if anything failed
if ( com_buildScript && com_buildScript->integer ) {
@@ -257,6 +257,14 @@ void QDECL Com_Error( int code, const char *fmt, ... )
vsprintf( com_errorMessage, fmt, argptr );
va_end( argptr );
+#if defined(_WIN32) && defined(_DEBUG)
+ if ( code != ERR_DISCONNECT && code != ERR_NEED_CD ) {
+ if (!com_noErrorInterrupt->integer && IsDebuggerPresent()) {
+ __debugbreak();
+ }
+ }
+#endif
+
if ( code != ERR_DISCONNECT && code != ERR_NEED_CD ) {
Cvar_Set("com_errorMessage", com_errorMessage);
}
@@ -906,7 +914,7 @@ void *Z_TagMalloc( int size, int tag ) {
zone->rover = base->next; // next allocation will start looking here
zone->used += base->size; //
-
+
base->id = ZONEID;
#ifdef ZONE_DEBUG
@@ -1354,13 +1362,18 @@ static void Com_InitHunkMemory()
} else {
s_hunkTotal = cv->integer * 1024 * 1024;
}
-
- s_hunkData = (byte*)calloc( s_hunkTotal + 31, 1 );
+#if defined( _MSC_VER ) && defined( _DEBUG ) && defined( idx64 )
+ // try to allocate at the highest possible address range to help detect errors during development
+ s_hunkData = (byte*)VirtualAlloc( NULL, ( s_hunkTotal + 4095 ) & ( ~4095 ), MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE );
+ Cvar_Get( "sys_hunkBaseAddress", va( "%p", s_hunkData ), 0 );
+#else
+ s_hunkData = (byte*)calloc( s_hunkTotal + 63, 1 );
+#endif
if ( !s_hunkData ) {
Com_Error( ERR_FATAL, "Hunk data failed to allocate %i megs", s_hunkTotal / (1024*1024) );
}
// cacheline align
- s_hunkData = (byte *) ( ( (intptr_t)s_hunkData + 31 ) & ~31 );
+ s_hunkData = (byte *) ( ( (intptr_t)s_hunkData + 63 ) & ( ~63 ) );
Hunk_Clear();
Cmd_AddCommand( "meminfo", Com_Meminfo_f );
@@ -1497,7 +1510,7 @@ void *Hunk_Alloc( int size, ha_pref preference )
#endif
// round to cacheline
- size = (size+31)&~31;
+ size = ( size + 63 ) & ( ~63 );
if ( hunk_low.temp + hunk_high.temp + size > s_hunkTotal ) {
#ifdef HUNK_DEBUG
@@ -1546,8 +1559,7 @@ void* Hunk_AllocateTempMemory( int size )
{
// return a Z_Malloc'd block if the hunk has not been initialized
// this allows the config and product id files ( journal files too ) to be loaded
- // by the file system without redundant routines in the file system utilizing different
- // memory systems
+ // by the file system without redundant routines in the FS utilizing different memory systems
if (!s_hunkData) {
return Z_Malloc(size);
}
@@ -1588,8 +1600,7 @@ void Hunk_FreeTempMemory( void* buf )
{
// free with Z_Free if the hunk has not been initialized
// this allows the config and product id files ( journal files too ) to be loaded
- // by the file system without redunant routines in the file system utilizing different
- // memory systems
+ // by the file system without redundant routines in the FS utilizing different memory systems
if (!s_hunkData) {
Z_Free(buf);
return;
@@ -2000,6 +2011,101 @@ void Com_ReadCDKey( const char *filename ) {
#endif
+// 0=eax 1=ebx 2=ecx 3=edx
+static qbool Com_CPUID( int function, int registers[4] ) {
+#if MSVC_CPUID
+ __cpuid( registers, function );
+ return qtrue;
+#elif GCC_CPUID
+ if( __get_cpuid( (unsigned int)function, (unsigned int*)®isters[0], (unsigned int*)®isters[1],
+ (unsigned int*)®isters[2], (unsigned int*)®isters[3] ) != 1 )
+ return qfalse;
+ return qtrue;
+#else
+ return qfalse;
+#endif
+}
+
+static const char* Com_ProcessorName() {
+ static int regs[4];
+
+ if( !Com_CPUID( 0, regs) ) {
+ return NULL;
+ }
+
+ regs[0] = regs[1];
+ regs[1] = regs[3];
+ regs[3] = 0;
+
+ return (const char*)regs;
+}
+
+typedef struct {
+ const char* s;
+ int reg;
+ int bit;
+ int flag;
+ qbool noTest;
+} cpuFeatureBit_t;
+
+#if idx64
+#define IS_X64 qtrue
+#define BASIC_CPU_FEATURES (CPU_MMX | CPU_SSE | CPU_SSE2)
+#else
+#define IS_X64 qfalse
+#define BASIC_CPU_FEATURES 0
+#endif
+
+static const cpuFeatureBit_t cpu_featureBits[] = {
+ { " MMX", 3, 23, CPU_MMX, IS_X64 },
+ { " SSE", 3, 25, CPU_SSE, IS_X64 },
+ { " SSE2", 3, 26, CPU_SSE2, IS_X64 },
+// the following aren't used anywhere for now:
+// { " SSE3", 2, 0, CPU_SSE3, qfalse },
+// { " SSSE3", 2, 9, CPU_SSSE3, qfalse },
+// { " SSE4.1", 2, 19, CPU_SSE41, qfalse },
+// { " SSE4.2", 2, 20, CPU_SSE42, qfalse },
+// { " AVX", 2, 28, CPU_AVX, qfalse }
+// for AVX2 and later, you'd need to call cpuid with eax=7 and ecx=0 ("extended features")
+};
+
+int cpu_features = BASIC_CPU_FEATURES;
+
+static qbool Com_GetProcessorInfo()
+{
+ Cvar_Get( "sys_cpustring", "unknown", 0 );
+
+ int regs[4];
+ const char* name = Com_ProcessorName();
+ if ( name == NULL || !Com_CPUID( 1, regs ) ) {
+ cpu_features = BASIC_CPU_FEATURES;
+ return qfalse;
+ }
+
+ char s[256] = "";
+ Q_strcat( s, sizeof(s), name );
+
+ int features = BASIC_CPU_FEATURES;
+ for (int i = 0; i < ARRAY_LEN(cpu_featureBits); i++) {
+ const cpuFeatureBit_t* f = cpu_featureBits + i;
+
+ if ( f->noTest || (regs[f->reg] & (1 << f->bit)) ) {
+ Q_strcat( s, sizeof(s), f->s );
+ features |= f->flag;
+ }
+ }
+
+ cpu_features = features;
+
+ Cvar_Set( "sys_cpustring", s );
+
+ return qtrue;
+}
+
+#undef BASIC_CPU_FEATURES
+#undef IS_X64
+
+
#if defined(_MSC_VER)
#pragma warning (disable: 4611) // setjmp + destructors = bad. which it is, but...
#endif
@@ -2117,6 +2223,11 @@ void Com_Init( char *commandLine )
const char* s = Q3_VERSION" "PLATFORM_STRING" "__DATE__;
com_version = Cvar_Get( "version", s, CVAR_ROM | CVAR_SERVERINFO );
+ Cvar_Get( "sys_cpustring", "detect", 0 );
+ if ( Com_GetProcessorInfo() ) {
+ Com_Printf( "CPU: %s\n", Cvar_VariableString( "sys_cpustring" ) );
+ }
+
Sys_Init();
Netchan_Init( Com_Milliseconds() & 0xffff ); // pick a port value that should be nice and random
VM_Init();
@@ -2494,6 +2605,51 @@ static void PrintCvarMatches( const char *s )
}
+/*
+==================
+crc32 routines
+==================
+*/
+
+static unsigned int crc32_table[256];
+static qboolean crc32_inited = qfalse;
+
+void crc32_init( unsigned int *crc )
+{
+ unsigned int c;
+ int i, j;
+
+ if ( !crc32_inited )
+ {
+ for (i = 0; i < 256; i++)
+ {
+ c = i;
+ for ( j = 0; j < 8; j++ )
+ c = c & 1 ? (c >> 1) ^ 0xEDB88320UL : c >> 1;
+ crc32_table[i] = c;
+ }
+ crc32_inited = qtrue;
+ }
+
+ *crc = 0xFFFFFFFFUL;
+}
+
+
+void crc32_update( unsigned int *crc, unsigned char *buf, unsigned int len )
+{
+ while ( len-- )
+ {
+ *crc = crc32_table[(*crc ^ *buf++) & 0xFF] ^ (*crc >> 8);
+ }
+}
+
+
+void crc32_final( unsigned int *crc )
+{
+ *crc = *crc ^ 0xFFFFFFFFUL;
+}
+
+
#if I_EVER_NAG_TIMBO_INTO_FIXING_THIS
@@ -2609,7 +2765,7 @@ static void Field_CompleteFilename( const char *dir,
}
Com_Printf( "]%s\n", completionField->buffer );
-
+
FS_FilenameCompletion( dir, ext, stripExt, PrintMatches );
}
diff --git a/code/qcommon/g_public.h b/code/qcommon/g_public.h
index 96015e5..a71bdfa 100644
--- a/code/qcommon/g_public.h
+++ b/code/qcommon/g_public.h
@@ -611,7 +611,7 @@ typedef enum {
// The game should call G_GET_ENTITY_TOKEN to parse through all the
// entity configuration text and spawn gentities.
- GAME_SHUTDOWN, // (void);
+ GAME_SHUTDOWN, // (int restart);
GAME_CLIENT_CONNECT, // ( int clientNum, qboolean firstTime, qboolean isBot );
// return NULL if the client is allowed to connect, otherwise return
diff --git a/code/qcommon/msg.cpp b/code/qcommon/msg.cpp
index 6dbd228..e3ad439 100644
--- a/code/qcommon/msg.cpp
+++ b/code/qcommon/msg.cpp
@@ -581,8 +581,8 @@ void MSG_ReadDeltaUsercmdKey( msg_t* msg, int key, const usercmd_t* from, usercm
typedef struct {
const char* name;
- int offset;
- int bits; // 0 = float
+ size_t offset;
+ int bits; // 0 = float
} netField_t;
@@ -595,7 +595,7 @@ entityState_t communication
*/
// using the stringizing operator to save typing...
-#define ESF(x) #x,(int)&((entityState_t*)0)->x
+#define ESF(x) #x,(size_t)&((entityState_t*)0)->x
static const netField_t entityStateFields[] =
{
@@ -900,7 +900,7 @@ plyer_state_t communication
*/
// using the stringizing operator to save typing...
-#define PSF(x) #x,(int)&((playerState_t*)0)->x
+#define PSF(x) #x,(size_t)&((playerState_t*)0)->x
static const netField_t playerStateFields[] =
{
diff --git a/code/qcommon/q_platform.h b/code/qcommon/q_platform.h
index 27c69ec..e734b42 100644
--- a/code/qcommon/q_platform.h
+++ b/code/qcommon/q_platform.h
@@ -28,15 +28,22 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#define id386 0
#define idppc 0
+#define idx64 0
#else
-#if (defined _M_IX86 || defined __i386__) && !defined(C_ONLY)
+#if (defined _M_IX86 || defined __i386__ || defined __i386) && !defined(C_ONLY)
#define id386 1
#else
#define id386 0
#endif
+#if (defined _M_AMD64 || defined _M_X64 || defined __amd64__ || defined __amd64 || defined __x86_64__ || defined __x86_64) && !defined(C_ONLY)
+#define idx64 1
+#else
+#define idx64 0
+#endif
+
#if (defined(powerc) || defined(powerpc) || defined(ppc) || \
defined(__ppc) || defined(__ppc__)) && !defined(C_ONLY)
#define idppc 1
@@ -67,8 +74,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#define ID_INLINE __inline
#define PATH_SEP '\\'
-#if defined( _M_IX86 ) || defined( __i386__ )
+#if defined( _M_IX86 ) || defined( __i386__ ) || defined( __i386 )
#define ARCH_STRING "x86"
+#elif defined( _M_AMD64 ) || defined( _M_X64 ) || defined( __amd64__ ) || defined( __amd64 ) || defined( __x86_64__ ) || defined( __x86_64 )
+#define ARCH_STRING "x64"
#elif defined _M_ALPHA
#define ARCH_STRING "AXP"
#endif
diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h
index 6c4ce0a..daff1d1 100644
--- a/code/qcommon/q_shared.h
+++ b/code/qcommon/q_shared.h
@@ -173,6 +173,7 @@ typedef int clipHandle_t;
#define ALIGN(x)
#endif
+#define ARRAY_LEN(x) (sizeof(x) / sizeof(*(x)))
// angle indexes
#define PITCH 0 // up / down
@@ -577,6 +578,10 @@ int Q_PrintStrlen( const char *string );
// removes color sequences from string
char *Q_CleanStr( char *string );
+typedef intptr_t ( *syscall_t )( intptr_t *parms );
+typedef intptr_t ( QDECL *dllSyscall_t )( intptr_t callNum, ... );
+typedef void ( QDECL *dllEntry_t )( dllSyscall_t syscallptr );
+
//
// key / value info strings
diff --git a/code/qcommon/qcommon.h b/code/qcommon/qcommon.h
index 3f87feb..95f9444 100644
--- a/code/qcommon/qcommon.h
+++ b/code/qcommon/qcommon.h
@@ -249,6 +249,14 @@ VIRTUAL MACHINE
==============================================================
*/
+typedef enum {
+ CPU_MMX = (1 << 0),
+ CPU_SSE = (1 << 1),
+ CPU_SSE2 = (1 << 2)
+} cpuFeatureFlags_t;
+
+extern int cpu_features;
+
typedef struct vm_s vm_t;
typedef enum {
@@ -275,12 +283,21 @@ typedef enum {
TRAP_TESTPRINTFLOAT
} sharedTraps_t;
+typedef enum {
+ VM_BAD = -1,
+ VM_GAME = 0,
+ VM_CGAME,
+ VM_UI,
+ VM_COUNT
+} vmIndex_t;
+
void VM_Init();
-vm_t *VM_Create( const char *module, intptr_t (*systemCalls)(intptr_t *), vmInterpret_t interpret );
-// module should be bare: "cgame", not "cgame.dll" or "vm/cgame.qvm"
+vm_t *VM_Create( vmIndex_t index, syscall_t systemCalls, vmInterpret_t interpret );
void VM_Free( vm_t *vm );
void VM_Clear(void);
+void VM_Forced_Unload_Start(void);
+void VM_Forced_Unload_Done(void);
vm_t *VM_Restart( vm_t *vm );
intptr_t QDECL VM_Call( vm_t *vm, int callNum, ... );
@@ -461,6 +478,10 @@ extern int cvar_modifiedFlags;
// etc, variables have been modified since the last check. The bit
// can then be cleared to allow another change detection.
+void crc32_init( unsigned int *crc );
+void crc32_update( unsigned int *crc, unsigned char *buf, unsigned int len );
+void crc32_final( unsigned int *crc );
+
/*
==============================================================
@@ -650,11 +671,6 @@ MISC
// https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=470
extern char cl_cdkey[34];
-// returned by Sys_GetProcessorId
-#define CPUID_GENERIC 0 // anything acceptable
-#define CPUID_AXP 0x10
-#define CPUID_UNSUPPORTED 0x20
-
// TTimo
// centralized and cleaned, that's the max string you can send to a Com_Printf / Com_DPrintf (above gets truncated)
#define MAXPRINTMSG 4096
@@ -902,8 +918,7 @@ void Sys_Init();
void Sys_Quit();
// general development dll loading for virtual machine testing
-void* QDECL Sys_LoadDll( const char* name,
- intptr_t (QDECL **entryPoint)(int, ...), intptr_t (QDECL *systemcalls)(intptr_t, ...) );
+void* QDECL Sys_LoadDll( const char* name, dllSyscall_t *entryPoint, dllSyscall_t systemcalls );
void Sys_UnloadDll( void* dllHandle );
void QDECL Sys_Error( const char *error, ...);
@@ -918,8 +933,6 @@ int Sys_Milliseconds();
// the system console is shown when a dedicated server is running
void Sys_DisplaySystemConsole( qbool show );
-int Sys_GetProcessorId();
-
void Sys_ShowConsole( int level, qbool quitOnClose );
void Sys_SetErrorText( const char *text );
@@ -944,7 +957,6 @@ void Sys_BeginProfiling( void );
void Sys_EndProfiling( void );
qbool Sys_LowPhysicalMemory( void );
-unsigned int Sys_ProcessorCount( void );
/* This is based on the Adaptive Huffman algorithm described in Sayood's Data
diff --git a/code/qcommon/ui_public.h b/code/qcommon/ui_public.h
index 645df97..6990900 100644
--- a/code/qcommon/ui_public.h
+++ b/code/qcommon/ui_public.h
@@ -266,7 +266,7 @@ typedef enum {
// void UI_Shutdown( void );
UI_KEY_EVENT,
-// void UI_KeyEvent( int key );
+// void UI_KeyEvent( int key, int down );
UI_MOUSE_EVENT,
// void UI_MouseEvent( int dx, int dy );
diff --git a/code/qcommon/vm.cpp b/code/qcommon/vm.cpp
index 6c0ea0c..be35418 100644
--- a/code/qcommon/vm.cpp
+++ b/code/qcommon/vm.cpp
@@ -23,92 +23,129 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
/*
+
intermix code and data
symbol table
a dll has one imported function: VM_SystemCall
and one exported function: Perform
+
*/
#include "vm_local.h"
+opcode_info_t ops[ OP_MAX ] =
+{
+ { 0, 0, 0, 0 }, // undef
+ { 0, 0, 0, 0 }, // ignore
+ { 0, 0, 0, 0 }, // break
-int vm_debugLevel;
-vm_t* currentVM = NULL;
-static vm_t* lastVM; // only used by profiling, which is useless anyway
+ { 4, 0, 0, 0 }, // enter
+ { 4,-4, 0, 0 }, // leave
+ { 0, 0, 1, 0 }, // call
+ { 0, 4, 0, 0 }, // push
+ { 0,-4, 1, 0 }, // pop
+
+ { 4, 4, 0, 0 }, // const
+ { 4, 4, 0, 0 }, // local
+ { 0,-4, 1, 0 }, // jump
+
+ { 4,-8, 2, VM_OF_JUMP }, // eq
+ { 4,-8, 2, VM_OF_JUMP }, // ne
+
+ { 4,-8, 2, VM_OF_JUMP }, // lti
+ { 4,-8, 2, VM_OF_JUMP }, // lei
+ { 4,-8, 2, VM_OF_JUMP }, // gti
+ { 4,-8, 2, VM_OF_JUMP }, // gei
+
+ { 4,-8, 2, VM_OF_JUMP }, // ltu
+ { 4,-8, 2, VM_OF_JUMP }, // leu
+ { 4,-8, 2, VM_OF_JUMP }, // gtu
+ { 4,-8, 2, VM_OF_JUMP }, // geu
+
+ { 4,-8, 2, VM_OF_JUMP }, // eqf
+ { 4,-8, 2, VM_OF_JUMP }, // nef
+
+ { 4,-8, 2, VM_OF_JUMP }, // ltf
+ { 4,-8, 2, VM_OF_JUMP }, // lef
+ { 4,-8, 2, VM_OF_JUMP }, // gtf
+ { 4,-8, 2, VM_OF_JUMP }, // gef
+
+ { 0, 0, 1, 0 }, // load1
+ { 0, 0, 1, 0 }, // load2
+ { 0, 0, 1, 0 }, // load4
+ { 0,-8, 2, 0 }, // store1
+ { 0,-8, 2, 0 }, // store2
+ { 0,-8, 2, 0 }, // store4
+ { 1,-4, 1, 0 }, // arg
+ { 4,-8, 2, 0 }, // bcopy
+
+ { 0, 0, 1, 0 }, // sex8
+ { 0, 0, 1, 0 }, // sex16
+
+ { 0, 0, 1, 0 }, // negi
+ { 0,-4, 3, 0 }, // add
+ { 0,-4, 3, 0 }, // sub
+ { 0,-4, 3, 0 }, // divi
+ { 0,-4, 3, 0 }, // divu
+ { 0,-4, 3, 0 }, // modi
+ { 0,-4, 3, 0 }, // modu
+ { 0,-4, 3, 0 }, // muli
+ { 0,-4, 3, 0 }, // mulu
+
+ { 0,-4, 3, 0 }, // band
+ { 0,-4, 3, 0 }, // bor
+ { 0,-4, 3, 0 }, // bxor
+ { 0, 0, 1, 0 }, // bcom
+
+ { 0,-4, 3, 0 }, // lsh
+ { 0,-4, 3, 0 }, // rshi
+ { 0,-4, 3, 0 }, // rshu
+
+ { 0, 0, 1, 0 }, // negf
+ { 0,-4, 3, 0 }, // addf
+ { 0,-4, 3, 0 }, // subf
+ { 0,-4, 3, 0 }, // divf
+ { 0,-4, 3, 0 }, // mulf
+
+ { 0, 0, 1, 0 }, // cvif
+ { 0, 0, 1, 0 } // cvfi
+};
+
+
+vm_t *currentVM = NULL;
+vm_t *lastVM = NULL;
#define MAX_VM 3
-static vm_t vmTable[MAX_VM];
+vm_t vmTable[MAX_VM];
+
+static const char *vmName[ VM_COUNT ] = {
+ "qagame",
+ "cgame",
+ "ui"
+};
-static void VM_VmInfo_f( void );
-static void VM_VmProfile_f( void );
-
-
-void VM_Init()
-{
+/*
+==============
+VM_Init
+==============
+*/
+void VM_Init( void ) {
Cvar_Get( "vm_cgame", "2", CVAR_ARCHIVE );
Cvar_Get( "vm_game", "2", CVAR_ARCHIVE );
Cvar_Get( "vm_ui", "2", CVAR_ARCHIVE );
- Cmd_AddCommand( "vmprofile", VM_VmProfile_f );
- Cmd_AddCommand( "vminfo", VM_VmInfo_f );
-
Com_Memset( vmTable, 0, sizeof( vmTable ) );
}
-void VM_Debug( int level )
-{
- vm_debugLevel = level;
-}
-
-
-// assumes a program counter value
-
-const char* VM_ValueToSymbol( const vm_t* vm, int value )
-{
- const vmSymbol_t* sym = vm->symbols;
- if ( !sym ) {
- return "NO SYMBOLS";
- }
-
- // find the symbol
- while ( sym->next && sym->next->symValue <= value ) {
- sym = sym->next;
- }
-
- if ( value == sym->symValue ) {
- return sym->symName;
- }
-
- static char text[MAX_TOKEN_CHARS];
- Com_sprintf( text, sizeof( text ), "%s+%i", sym->symName, value - sym->symValue );
-
- return text;
-}
-
-
-// for profiling, find the symbol behind this value
-
-const vmSymbol_t* VM_ValueToFunctionSymbol( const vm_t* vm, int value )
-{
- static vmSymbol_t nullSym;
-
- const vmSymbol_t* sym = vm->symbols;
- if ( !sym ) {
- return &nullSym;
- }
-
- while ( sym->next && sym->next->symValue <= value ) {
- sym = sym->next;
- }
-
- return sym;
-}
-
-
+/*
+===============
+ParseHex
+===============
+*/
static int ParseHex( const char* text )
{
int value = 0, c;
@@ -132,38 +169,44 @@ static int ParseHex( const char* text )
return value;
}
+/*
+===============
+VM_LoadSymbols
+===============
+*/
+void VM_LoadSymbols( vm_t *vm ) {
+ union {
+ char *c;
+ void *v;
+ } mapfile;
+ const char *text_p;
+ const char *token;
+ char name[MAX_QPATH];
+ char symbols[MAX_QPATH];
+ vmSymbol_t **prev, *sym;
+ int count;
+ int value;
+ int chars;
+ int segment;
+ int numInstructions;
-static void VM_LoadSymbols( vm_t* vm )
-{
// don't load symbols if not developer
if ( !com_developer->integer ) {
return;
}
- int len;
- char *mapfile;
- char name[MAX_QPATH];
- char symbols[MAX_QPATH];
- vmSymbol_t **prev, *sym;
- int count;
- int value;
- int chars;
- int segment;
- int numInstructions;
-
COM_StripExtension(vm->name, name, sizeof(name));
Com_sprintf( symbols, sizeof( symbols ), "vm/%s.map", name );
- len = FS_ReadFile( symbols, (void **)&mapfile );
- if ( !mapfile ) {
+ FS_ReadFile( symbols, &mapfile.v );
+ if ( !mapfile.c ) {
Com_Printf( "Couldn't load symbol file: %s\n", symbols );
return;
}
- numInstructions = vm->instructionPointersLength >> 2;
+ numInstructions = vm->instructionCount;
// parse the symbols
- const char* token;
- const char* text_p = mapfile;
+ text_p = mapfile.c;
prev = &vm->symbols;
count = 0;
@@ -198,7 +241,7 @@ static void VM_LoadSymbols( vm_t* vm )
sym->next = NULL;
// convert value from an instruction number to a code offset
- if ( value >= 0 && value < numInstructions ) {
+ if ( vm->instructionPointers && value >= 0 && value < numInstructions ) {
value = vm->instructionPointers[value];
}
@@ -210,7 +253,7 @@ static void VM_LoadSymbols( vm_t* vm )
vm->numSymbols = count;
Com_Printf( "%i symbols parsed from %s\n", count, symbols );
- FS_FreeFile( mapfile );
+ FS_FreeFile( mapfile.v );
}
@@ -222,7 +265,7 @@ Dlls will call this directly
rcg010206 The horror; the horror.
- The syscall mechanism relies on stack manipulation to get it's args.
+ The syscall mechanism relies on stack manipulation to get its args.
This is likely due to C's inability to pass "..." parameters to
a function in one clean chunk. On PowerPC Linux, these parameters
are not necessarily passed on the stack, so while (&arg[0] == arg)
@@ -249,95 +292,172 @@ Dlls will call this directly
For speed, we just grab 15 arguments, and don't worry about exactly
how many the syscall actually needs; the extra is thrown away.
-
+
============
*/
-static intptr_t QDECL VM_DllSyscall( intptr_t arg, ... )
-{
-#if !id386
- // rcg010206 - see commentary above
- intptr_t args[16];
- int i;
- va_list ap;
+intptr_t QDECL VM_DllSyscall( intptr_t arg, ... ) {
+#if !id386 || defined __clang__
+ // rcg010206 - see commentary above
+ intptr_t args[16];
+ int i;
+ va_list ap;
- args[0] = arg;
+ args[0] = arg;
- va_start(ap, arg);
- for (i = 1; i < sizeof (args) / sizeof (args[i]); i++)
- args[i] = va_arg(ap, intptr_t);
- va_end(ap);
+ va_start(ap, arg);
+ for (i = 1; i < ARRAY_LEN (args); i++)
+ args[i] = va_arg(ap, intptr_t);
+ va_end(ap);
- return currentVM->systemCall( args );
+ return currentVM->systemCall( args );
#else // original id code
return currentVM->systemCall( &arg );
#endif
}
-static vmHeader_t* VM_LoadQVM( vm_t* vm, qbool alloc )
+/*
+=================
+VM_ValidateHeader
+=================
+*/
+static char *VM_ValidateHeader( vmHeader_t *header, int fileSize )
{
+ static char errMsg[128];
+
+ // truncated
+ if ( fileSize < ( sizeof( vmHeader_t ) - sizeof( int ) ) ) {
+ sprintf( errMsg, "truncated image header (%i bytes long)", fileSize );
+ return errMsg;
+ }
+
+ // bad magic
+ if ( LittleLong( header->vmMagic ) != VM_MAGIC ) {
+ sprintf( errMsg, "bad VM header tag %08x, expected %08x", LittleLong( header->vmMagic ), LittleLong( VM_MAGIC ) );
+ return errMsg;
+ }
+
+ // truncated
+ if ( fileSize < sizeof( vmHeader_t ) ) {
+ sprintf( errMsg, "truncated image header (%i bytes long)", fileSize );
+ return errMsg;
+ }
+
+ const int n = ( sizeof( vmHeader_t ) - sizeof( int ) ) / sizeof( int );
+
+ // byte swap the header
+ for ( int i = 0 ; i < n ; i++ ) {
+ ((int *)header)[i] = LittleLong( ((int *)header)[i] );
+ }
+
+ // bad code offset
+ if ( header->codeOffset >= fileSize ) {
+ sprintf( errMsg, "bad code segment offset %i", header->codeOffset );
+ return errMsg;
+ }
+
+ // bad code length
+ if ( header->codeLength <= 0 || header->codeOffset + header->codeLength > fileSize ) {
+ sprintf( errMsg, "bad code segment length %i", header->codeLength );
+ return errMsg;
+ }
+
+ // bad data offset
+ if ( header->dataOffset >= fileSize || header->dataOffset != header->codeOffset + header->codeLength ) {
+ sprintf( errMsg, "bad data segment offset %i", header->dataOffset );
+ return errMsg;
+ }
+
+ // bad data length
+ if ( header->dataOffset + header->dataLength > fileSize ) {
+ sprintf( errMsg, "bad data segment length %i", header->dataLength );
+ return errMsg;
+ }
+
+ // bad lit length
+ if ( header->dataOffset + header->dataLength + header->litLength != fileSize )
+ {
+ sprintf( errMsg, "bad lit segment length %i", header->litLength );
+ return errMsg;
+ }
+
+ return NULL;
+}
+
+
+/*
+=================
+VM_LoadQVM
+
+Load a .qvm file
+
+if ( alloc )
+ - Validate header, swap data
+ - Alloc memory for data/instructions
+ - Alloc memory for instructionPointers - NOT NEEDED
+ - Load instructions
+ - Clear/load data
+else
+ - Check for header changes
+ - Clear/load data
+
+=================
+*/
+vmHeader_t *VM_LoadQVM( vm_t *vm, qboolean alloc ) {
int length;
int dataLength;
int i;
- char filename[MAX_QPATH];
- vmHeader_t* header;
+ char filename[MAX_QPATH], *errorMsg;
+ unsigned int crc32sum;
+ vmHeader_t *header;
+ // load the image
Com_sprintf( filename, sizeof(filename), "vm/%s.qvm", vm->name );
+ Com_Printf( "Loading vm file %s...\n", filename );
length = FS_ReadFile( filename, (void **)&header );
- if ( !header )
- Com_Error( ERR_FATAL, "Failed to load %s", filename );
- Com_Printf( "Loaded %s\n", filename );
-
- if( LittleLong( header->vmMagic ) == VM_MAGIC_VER2 ) {
- Com_Printf( "...which has vmMagic VM_MAGIC_VER2\n" );
-
- // byte swap the header
- for ( i = 0 ; i < sizeof( vmHeader_t ) / 4 ; i++ ) {
- ((int *)header)[i] = LittleLong( ((int *)header)[i] );
- }
-
- // validate
- if ( header->jtrgLength < 0
- || header->bssLength < 0
- || header->dataLength < 0
- || header->litLength < 0
- || header->codeLength <= 0 ) {
- VM_Free( vm );
- Com_Error( ERR_FATAL, "%s has bad header", filename );
- }
- } else if( LittleLong( header->vmMagic ) == VM_MAGIC ) {
- // byte swap the header
- // sizeof( vmHeader_t ) - sizeof( int ) is the 1.32b vm header size
- for ( i = 0 ; i < ( sizeof( vmHeader_t ) - sizeof( int ) ) / 4 ; i++ ) {
- ((int *)header)[i] = LittleLong( ((int *)header)[i] );
- }
-
- // validate
- if ( header->bssLength < 0
- || header->dataLength < 0
- || header->litLength < 0
- || header->codeLength <= 0 ) {
- VM_Free( vm );
- Com_Error( ERR_FATAL, "%s has bad header", filename );
- }
- } else {
+ if ( !header ) {
+ Com_Printf( "Failed.\n" );
VM_Free( vm );
- Com_Error( ERR_FATAL, "%s: Invalid header ID", filename );
+ return NULL;
}
+ crc32_init( &crc32sum );
+ crc32_update( &crc32sum, (unsigned char*)header, length );
+ crc32_final( &crc32sum );
+
+ // will also swap header
+ errorMsg = VM_ValidateHeader( header, length );
+ if ( errorMsg ) {
+ VM_Free( vm );
+ FS_FreeFile( header );
+ Com_Error( ERR_FATAL, "%s", errorMsg );
+ return NULL;
+ }
+
+ vm->crc32sum = crc32sum;
+
+ dataLength = header->dataLength + header->litLength + header->bssLength;
+ vm->dataLength = dataLength;
+
// round up to next power of 2 so all data operations can
// be mask protected
- dataLength = header->dataLength + header->litLength + header->bssLength;
for ( i = 0 ; dataLength > ( 1 << i ) ; i++ ) {
}
dataLength = 1 << i;
if( alloc ) {
// allocate zero filled space for initialized and uninitialized data
- vm->dataBase = (byte*)Hunk_Alloc( dataLength, h_high );
+ vm->dataBase = (byte *)Hunk_Alloc( dataLength, h_high );
vm->dataMask = dataLength - 1;
} else {
- // clear the data
+ // clear the data, but make sure we're not clearing more than allocated
+ if( vm->dataMask + 1 != dataLength ) {
+ VM_Free( vm );
+ FS_FreeFile( header );
+ Com_Printf( S_COLOR_YELLOW "Warning: Data region size of %s not matching after"
+ "VM_Restart()\n", filename );
+ return NULL;
+ }
Com_Memset( vm->dataBase, 0, dataLength );
}
@@ -349,28 +469,377 @@ static vmHeader_t* VM_LoadQVM( vm_t* vm, qbool alloc )
*(int *)(vm->dataBase + i) = LittleLong( *(int *)(vm->dataBase + i ) );
}
- if( header->vmMagic == VM_MAGIC_VER2 ) {
- vm->numJumpTableTargets = header->jtrgLength >> 2;
- Com_Printf( "Loading %d jump table targets\n", vm->numJumpTableTargets );
+ return header;
+}
- if( alloc ) {
- vm->jumpTableTargets = (byte*)Hunk_Alloc( header->jtrgLength, h_high );
+
+/*
+=================
+VM_LoadInstructions
+
+loads instructions in structured format
+=================
+*/
+const char *VM_LoadInstructions( const vmHeader_t *header, instruction_t *buf )
+{
+ static char errBuf[ 128 ];
+ byte *code_pos, *code_start, *code_end;
+ int i, n, op0, op1, opStack;
+ instruction_t *ci;
+
+ code_pos = (byte *) header + header->codeOffset;
+ code_start = code_pos; // for printing
+ code_end = (byte *) header + header->codeOffset + header->codeLength;
+
+ ci = buf;
+ opStack = 0;
+ op1 = OP_UNDEF;
+
+ // load instructions and perform some initial calculations/checks
+ for ( i = 0; i < header->instructionCount; i++, ci++, op1 = op0 ) {
+ op0 = *code_pos;
+ if ( op0 < 0 || op0 >= OP_MAX ) {
+ sprintf( errBuf, "bad opcode %02X at offset %ld", op0, code_pos - code_start );
+ return errBuf;
+ }
+ n = ops[ op0 ].size;
+ if ( code_pos + 1 + n > code_end ) {
+ sprintf( errBuf, "code_pos > code_end" );
+ return errBuf;
+ }
+ code_pos++;
+ ci->op = op0;
+ if ( n == 4 ) {
+ ci->value = LittleLong( *((int*)code_pos) );
+ code_pos += 4;
+ } else if ( n == 1 ) {
+ ci->value = *((unsigned char*)code_pos);
+ code_pos += 1;
} else {
- Com_Memset( vm->jumpTableTargets, 0, header->jtrgLength );
+ ci->value = 0;
}
- Com_Memcpy( vm->jumpTableTargets, (byte *)header + header->dataOffset +
- header->dataLength + header->litLength, header->jtrgLength );
+ // setup jump value from previous const
+ if ( op0 == OP_JUMP && op1 == OP_CONST ) {
+ ci->value = (ci-1)->value;
+ }
- // byte swap the longs
- for ( i = 0 ; i < header->jtrgLength ; i += 4 ) {
- *(int *)(vm->jumpTableTargets + i) = LittleLong( *(int *)(vm->jumpTableTargets + i ) );
+ ci->opStack = opStack;
+ opStack += ops[ op0 ].stack;
+ }
+
+ return NULL;
+}
+
+
+/*
+===============================
+VM_CheckInstructions
+
+performs additional consistency and security checks
+===============================
+*/
+const char *VM_CheckInstructions( instruction_t *buf,
+ int instructionCount,
+ const byte *jumpTableTargets,
+ int numJumpTableTargets,
+ int dataLength )
+{
+ static char errBuf[ 128 ];
+ int i, n, v, op0, op1, opStack, pstack;
+ instruction_t *ci, *proc;
+ int startp, endp;
+
+ ci = buf;
+ opStack = 0;
+
+ // opstack checks
+ for ( i = 0; i < instructionCount; i++, ci++ ) {
+ opStack += ops[ ci->op ].stack;
+ if ( opStack < 0 ) {
+ sprintf( errBuf, "opStack underflow at %i", i );
+ return errBuf;
+ }
+ if ( opStack >= PROC_OPSTACK_SIZE * 4 ) {
+ sprintf( errBuf, "opStack overflow at %i", i );
+ return errBuf;
}
}
- return header;
+ ci = buf;
+ pstack = 0;
+ op1 = OP_UNDEF;
+ proc = NULL;
+
+ startp = 0;
+ endp = instructionCount - 1;
+
+ // Additional security checks
+
+ for ( i = 0; i < instructionCount; i++, ci++, op1 = op0 ) {
+ op0 = ci->op;
+
+ // function entry
+ if ( op0 == OP_ENTER ) {
+ // missing block end
+ if ( proc || ( pstack && op1 != OP_LEAVE ) ) {
+ sprintf( errBuf, "missing proc end before %i", i );
+ return errBuf;
+ }
+ if ( ci->opStack != 0 ) {
+ v = ci->opStack;
+ sprintf( errBuf, "bad entry opstack %i at %i", v, i );
+ return errBuf;
+ }
+ v = ci->value;
+ if ( v < 0 || v >= PROGRAM_STACK_SIZE || (v & 3) ) {
+ sprintf( errBuf, "bad entry programStack %i at %i", v, i );
+ return errBuf;
+ }
+
+ pstack = ci->value;
+
+ // mark jump target
+ ci->jused = 1;
+ proc = ci;
+ startp = i + 1;
+
+ // locate endproc
+ for ( endp = 0, n = i+1 ; n < instructionCount; n++ ) {
+ if ( buf[n].op == OP_PUSH && buf[n+1].op == OP_LEAVE ) {
+ endp = n;
+ break;
+ }
+ }
+
+ if ( endp == 0 ) {
+ sprintf( errBuf, "missing end proc for %i", i );
+ return errBuf;
+ }
+
+ continue;
+ }
+
+ // proc opstack will carry max.possible opstack value
+ if ( proc && ci->opStack > proc->opStack )
+ proc->opStack = ci->opStack;
+
+ // function return
+ if ( op0 == OP_LEAVE ) {
+ // bad return programStack
+ if ( pstack != ci->value ) {
+ v = ci->value;
+ sprintf( errBuf, "bad programStack %i at %i", v, i );
+ return errBuf;
+ }
+ // bad opStack before return
+ if ( ci->opStack != 4 ) {
+ v = ci->opStack;
+ sprintf( errBuf, "bad opStack %i at %i", v, i );
+ return errBuf;
+ }
+ v = ci->value;
+ if ( v < 0 || v >= PROGRAM_STACK_SIZE || (v & 3) ) {
+ sprintf( errBuf, "bad return programStack %i at %i", v, i );
+ return errBuf;
+ }
+ if ( op1 == OP_PUSH ) {
+ if ( proc == NULL ) {
+ sprintf( errBuf, "unexpected proc end at %i", i );
+ return errBuf;
+ }
+ proc = NULL;
+ startp = i + 1; // next instruction
+ endp = instructionCount - 1; // end of the image
+ }
+ continue;
+ }
+
+ // conditional jumps
+ if ( ops[ ci->op ].flags & VM_OF_JUMP ) {
+ v = ci->value;
+ // conditional jumps should have opStack == 8
+ if ( ci->opStack != 8 ) {
+ sprintf( errBuf, "bad jump opStack %i at %i", ci->opStack, i );
+ return errBuf;
+ }
+ //if ( v >= header->instructionCount ) {
+ // allow only local proc jumps
+ if ( v < startp || v > endp ) {
+ sprintf( errBuf, "jump target %i at %i is out of range (%i,%i)", v, i-1, startp, endp );
+ return errBuf;
+ }
+ if ( buf[v].opStack != 0 ) {
+ n = buf[v].opStack;
+ sprintf( errBuf, "jump target %i has bad opStack %i", v, n );
+ return errBuf;
+ }
+ // mark jump target
+ buf[v].jused = 1;
+ continue;
+ }
+
+ // unconditional jumps
+ if ( op0 == OP_JUMP ) {
+ // jumps should have opStack == 4
+ if ( ci->opStack != 4 ) {
+ sprintf( errBuf, "bad jump opStack %i at %i", ci->opStack, i );
+ return errBuf;
+ }
+ if ( op1 == OP_CONST ) {
+ v = buf[i-1].value;
+ // allow only local jumps
+ if ( v < startp || v > endp ) {
+ sprintf( errBuf, "jump target %i at %i is out of range (%i,%i)", v, i-1, startp, endp );
+ return errBuf;
+ }
+ if ( buf[v].opStack != 0 ) {
+ n = buf[v].opStack;
+ sprintf( errBuf, "jump target %i has bad opStack %i", v, n );
+ return errBuf;
+ }
+ if ( buf[v].op == OP_ENTER ) {
+ n = buf[v].op;
+ sprintf( errBuf, "jump target %i has bad opcode %i", v, n );
+ return errBuf;
+ }
+ if ( v == (i-1) ) {
+ sprintf( errBuf, "self loop at %i", v );
+ return errBuf;
+ }
+ // mark jump target
+ buf[v].jused = 1;
+ } else {
+ if ( proc )
+ proc->swtch = 1;
+ else
+ ci->swtch = 1;
+ }
+ continue;
+ }
+
+ if ( op0 == OP_CALL ) {
+ if ( ci->opStack < 4 ) {
+ sprintf( errBuf, "bad call opStack at %i", i );
+ return errBuf;
+ }
+ if ( op1 == OP_CONST ) {
+ v = buf[i-1].value;
+ // analyse only local function calls
+ if ( v >= 0 ) {
+ if ( v >= instructionCount ) {
+ sprintf( errBuf, "call target %i is out of range", v );
+ return errBuf;
+ }
+ if ( buf[v].op != OP_ENTER ) {
+ n = buf[v].op;
+ sprintf( errBuf, "call target %i has bad opcode %i", v, n );
+ return errBuf;
+ }
+ if ( v == 0 ) {
+ sprintf( errBuf, "explicit vmMain call inside VM" );
+ return errBuf;
+ }
+ // mark jump target
+ buf[v].jused = 1;
+ }
+ }
+ continue;
+ }
+
+ if ( ci->op == OP_ARG ) {
+ v = ci->value & 255;
+ // argument can't exceed programStack frame
+ if ( v < 8 || v > pstack - 4 || (v & 3) ) {
+ sprintf( errBuf, "bad argument address %i at %i", v, i );
+ return errBuf;
+ }
+ continue;
+ }
+
+ if ( ci->op == OP_LOCAL ) {
+ v = ci->value;
+ if ( proc == NULL ) {
+ sprintf( errBuf, "missing proc frame for local %i at %i", v, i );
+ return errBuf;
+ }
+ if ( (ci+1)->op == OP_LOAD1 || (ci+1)->op == OP_LOAD2 || (ci+1)->op == OP_LOAD4 ) {
+ // FIXME: alloc 256 bytes of programStack in VM_CallCompiled()?
+ if ( v < 8 || v >= proc->value + 256 ) {
+ sprintf( errBuf, "bad local address %i at %i", v, i );
+ return errBuf;
+ }
+ }
+ }
+
+ if ( ci->op == OP_LOAD4 && op1 == OP_CONST ) {
+ v = (ci-1)->value;
+ if ( v < 0 || v > dataLength - 4 ) {
+ sprintf( errBuf, "bad load4 address %i at %i", v, i - 1 );
+ return errBuf;
+ }
+ }
+
+ if ( ci->op == OP_LOAD2 && op1 == OP_CONST ) {
+ v = (ci-1)->value;
+ if ( v < 0 || v > dataLength - 2 ) {
+ sprintf( errBuf, "bad load2 address %i at %i", v, i - 1 );
+ return errBuf;
+ }
+ }
+
+ if ( ci->op == OP_LOAD1 && op1 == OP_CONST ) {
+ v = (ci-1)->value;
+ if ( v < 0 || v > dataLength - 1 ) {
+ sprintf( errBuf, "bad load1 address %i at %i", v, i - 1 );
+ return errBuf;
+ }
+ }
+ }
+
+ if ( op1 != OP_UNDEF && op1 != OP_LEAVE ) {
+ sprintf( errBuf, "missing return instruction at the end of the image" );
+ return errBuf;
+ }
+
+ // ensure that the optimization pass knows about all the jump table targets
+ if ( jumpTableTargets ) {
+ for( i = 0; i < numJumpTableTargets; i++ ) {
+ n = *(int *)(jumpTableTargets + ( i * sizeof( int ) ) );
+ if ( n < 0 || n >= instructionCount ) {
+ sprintf( errBuf, "jump target %i at %i is out of range [0..%i]", n, i, instructionCount - 1 );
+ return errBuf;
+ }
+ if ( buf[n].opStack != 0 ) {
+ opStack = buf[n].opStack;
+ sprintf( errBuf, "jump target set on instruction %i with bad opStack %i", n, opStack );
+ return errBuf;
+ }
+ buf[n].jused = 1;
+ }
+ } else {
+ v = 0;
+ // instructions with opStack > 0 can't be jump labels so its safe to optimize/merge
+ for ( i = 0, ci = buf; i < instructionCount; i++, ci++ ) {
+ if ( ci->op == OP_ENTER ) {
+ v = ci->swtch;
+ continue;
+ }
+ // if there is a switch statement in function -
+ // mark all potential jump labels
+ if ( ci->swtch )
+ v = ci->swtch;
+ if ( ci->opStack > 0 )
+ ci->jused = 0;
+ else if ( v )
+ ci->jused = 1;
+ }
+ }
+
+ return NULL;
}
+
/*
=================
VM_Restart
@@ -384,23 +853,23 @@ vm_t *VM_Restart( vm_t *vm ) {
// DLL's can't be restarted in place
if ( vm->dllHandle ) {
- char name[MAX_QPATH];
- intptr_t (*systemCall)( intptr_t *parms );
+ char name[MAX_QPATH];
+ syscall_t systemCall;
systemCall = vm->systemCall;
Q_strncpyz( name, vm->name, sizeof( name ) );
VM_Free( vm );
- vm = VM_Create( name, systemCall, VMI_NATIVE );
+ vm = VM_Create( vm->index, systemCall, VMI_NATIVE );
return vm;
}
// load the image
Com_Printf( "VM_Restart()\n" );
- if( !( header = VM_LoadQVM( vm, qfalse ) ) ) {
- Com_Error( ERR_DROP, "VM_Restart failed.\n" );
+ if( ( header = VM_LoadQVM( vm, qfalse ) ) == NULL ) {
+ Com_Error( ERR_DROP, "VM_Restart failed" );
return NULL;
}
@@ -410,6 +879,7 @@ vm_t *VM_Restart( vm_t *vm ) {
return vm;
}
+
/*
================
VM_Create
@@ -418,77 +888,100 @@ If image ends in .qvm it will be interpreted, otherwise
it will attempt to load as a system dll
================
*/
-
-#define STACK_SIZE 0x20000
-
-vm_t* VM_Create( const char *module, intptr_t (*systemCalls)(intptr_t *), vmInterpret_t interpret )
-{
- vm_t *vm;
+vm_t *VM_Create( vmIndex_t index, syscall_t systemCalls, vmInterpret_t interpret ) {
+ int remaining;
+ const char *name;
vmHeader_t *header;
- int i, remaining;
+ vm_t *vm;
- if ( !module || !module[0] || !systemCalls ) {
+ if ( !systemCalls ) {
Com_Error( ERR_FATAL, "VM_Create: bad parms" );
}
+ if ( (unsigned)index >= VM_COUNT ) {
+ Com_Error( ERR_FATAL, "VM_Create: bad vm index %i", index );
+ }
+
remaining = Hunk_MemoryRemaining();
+ vm = &vmTable[ index ];
+
// see if we already have the VM
- for ( i = 0 ; i < MAX_VM ; i++ ) {
- if (!Q_stricmp(vmTable[i].name, module)) {
- vm = &vmTable[i];
- return vm;
+ if ( vm->name ) {
+ if ( vm->index != index ) {
+ Com_Error( ERR_FATAL, "VM_Create: bad allocated vm index %i", vm->index );
+ return NULL;
}
+ return vm;
}
- // find a free vm
- for ( i = 0 ; i < MAX_VM ; i++ ) {
- if ( !vmTable[i].name[0] ) {
- break;
- }
- }
+ name = vmName[ index ];
- if ( i == MAX_VM ) {
- Com_Error( ERR_FATAL, "VM_Create: no free vm_t" );
- }
-
- vm = &vmTable[i];
-
- Q_strncpyz( vm->name, module, sizeof( vm->name ) );
+ vm->name = name;
+ vm->index = index;
vm->systemCall = systemCalls;
+ // never allow dll loading with a demo
+ if ( interpret == VMI_NATIVE ) {
+ if ( Cvar_VariableValue( "fs_restrict" ) ) {
+ interpret = VMI_COMPILED;
+ }
+ }
+
if ( interpret == VMI_NATIVE ) {
// try to load as a system dll
- Com_DPrintf( "Loading dll file %s\n", vm->name );
- vm->dllHandle = Sys_LoadDll( module, &vm->entryPoint, VM_DllSyscall );
- if ( vm->dllHandle )
+ Com_Printf( "Loading dll file %s.\n", name );
+ vm->dllHandle = Sys_LoadDll( name, &vm->entryPoint, VM_DllSyscall );
+ if ( vm->dllHandle ) {
return vm;
- Com_DPrintf( "Failed to load dll, looking for qvm.\n" );
+ }
+
+ Com_Printf( "Failed to load dll, looking for qvm.\n" );
+ interpret = VMI_COMPILED;
}
// load the image
- if( !( header = VM_LoadQVM( vm, qtrue ) ) ) {
+ if( ( header = VM_LoadQVM( vm, qtrue ) ) == NULL ) {
return NULL;
}
// allocate space for the jump targets, which will be filled in by the compile/prep functions
- vm->instructionPointersLength = header->instructionCount * 4;
- vm->instructionPointers = (int*)Hunk_Alloc( vm->instructionPointersLength, h_high );
+ vm->instructionCount = header->instructionCount;
+ //vm->instructionPointers = Hunk_Alloc(vm->instructionCount * sizeof(*vm->instructionPointers), h_high);
+ vm->instructionPointers = NULL;
// copy or compile the instructions
vm->codeLength = header->codeLength;
-#if defined(NO_VM_COMPILED)
- Com_Printf("Architecture doesn't have a bytecode compiler, using interpreter\n");
+ // the stack is implicitly at the end of the image
+ vm->programStack = vm->dataMask + 1;
+ vm->stackBottom = vm->programStack - PROGRAM_STACK_SIZE;
+
vm->compiled = qfalse;
- VM_PrepareInterpreter( vm, header );
+
+#ifdef NO_VM_COMPILED
+ if(interpret >= VMI_COMPILED) {
+ Com_Printf("Architecture doesn't have a bytecode compiler, using interpreter\n");
+ interpret = VMI_BYTECODE;
+ }
#else
- vm->compiled = qtrue;
- VM_Compile( vm, header );
- // VM_Compile will have reset vm->compiled if compilation failed
- if (!vm->compiled)
- Com_Error( ERR_FATAL, "ERROR: QVM compilation failed\n" );
+ if ( interpret >= VMI_COMPILED ) {
+ vm->compiled = qtrue;
+ if ( !VM_Compile( vm, header ) ) {
+ FS_FreeFile( header ); // free the original file
+ VM_Free( vm );
+ return NULL;
+ }
+ }
#endif
+ // VM_Compile may have reset vm->compiled if compilation failed
+ if ( !vm->compiled ) {
+ if ( !VM_PrepareInterpreter2( vm, header ) ) {
+ FS_FreeFile( header ); // free the original file
+ VM_Free( vm );
+ return NULL;
+ }
+ }
// free the original file
FS_FreeFile( header );
@@ -496,15 +989,12 @@ vm_t* VM_Create( const char *module, intptr_t (*systemCalls)(intptr_t *), vmInte
// load the map file
VM_LoadSymbols( vm );
- // the stack is implicitly at the end of the image
- vm->programStack = vm->dataMask + 1;
- vm->stackBottom = vm->programStack - STACK_SIZE;
-
- Com_DPrintf("%s loaded in %d bytes on the hunk\n", module, remaining - Hunk_MemoryRemaining());
+ Com_Printf( "%s loaded in %d bytes on the hunk\n", vm->name, remaining - Hunk_MemoryRemaining() );
return vm;
}
+
/*
==============
VM_Free
@@ -512,40 +1002,28 @@ VM_Free
*/
void VM_Free( vm_t *vm ) {
- if(vm->destroy)
- vm->destroy(vm);
+ if( !vm ) {
+ return;
+ }
- if ( vm->dllHandle ) {
+ if ( vm->destroy )
+ vm->destroy( vm );
+
+ if ( vm->dllHandle )
Sys_UnloadDll( vm->dllHandle );
- Com_Memset( vm, 0, sizeof( *vm ) );
- }
-#if 0 // now automatically freed by hunk
- if ( vm->codeBase ) {
- Z_Free( vm->codeBase );
- }
- if ( vm->dataBase ) {
- Z_Free( vm->dataBase );
- }
- if ( vm->instructionPointers ) {
- Z_Free( vm->instructionPointers );
- }
-#endif
+
Com_Memset( vm, 0, sizeof( *vm ) );
currentVM = NULL;
lastVM = NULL;
}
-void VM_Clear(void) {
+
+void VM_Clear( void ) {
int i;
- for (i=0;ientryPoint ) {
return (intptr_t)(vm->dataBase + intValue);
@@ -604,182 +1082,68 @@ an OP_ENTER instruction, which will subtract space for
locals from sp
==============
*/
-#define MAX_STACK 256
-#define STACK_MASK (MAX_STACK-1)
-
-intptr_t QDECL VM_Call( vm_t *vm, int callnum, ... ) {
- vm_t *oldVM;
- intptr_t r;
- int i;
+intptr_t QDECL VM_Call( vm_t *vm, int callnum, ... )
+{
if ( !vm ) {
Com_Error( ERR_FATAL, "VM_Call with NULL vm" );
}
- oldVM = currentVM;
+ vm_t *oldVM = currentVM;
currentVM = vm;
lastVM = vm;
- if ( vm_debugLevel ) {
- Com_Printf( "VM_Call( %ld )\n", callnum );
- }
+ ++vm->callLevel;
+ intptr_t r;
// if we have a dll loaded, call it directly
- if ( vm->entryPoint ) {
+ if ( vm->entryPoint )
+ {
//rcg010207 - see dissertation at top of VM_DllSyscall() in this file.
- int args[10];
+ int args[VMMAIN_CALL_ARGS-1];
va_list ap;
- va_start(ap, callnum);
- for (i = 0; i < sizeof (args) / sizeof (args[i]); i++) {
+ va_start( ap, callnum );
+ for ( int i = 0; i < ARRAY_LEN( args ); i++ ) {
args[i] = va_arg(ap, int);
}
va_end(ap);
- r = vm->entryPoint( callnum, args[0], args[1], args[2], args[3],
- args[4], args[5], args[6], args[7],
- args[8], args[9]);
+ r = vm->entryPoint( callnum, args[0], args[1], args[2], args[3],
+ args[4], args[5], args[6], args[7],
+ args[8], args[9], args[10], args[11] );
} else {
-#if id386 // i386 calling convention doesn't need conversion
-#if !defined(NO_VM_COMPILED)
- r = VM_CallCompiled( vm, (int*)&callnum );
-#else
- r = VM_CallInterpreted( vm, (int*)&callnum );
+#if id386 && !defined __clang__ // calling convention doesn't need conversion in some cases
+#ifndef NO_VM_COMPILED
+ if ( vm->compiled )
+ r = VM_CallCompiled( vm, (int*)&callnum );
+ else
#endif
+ r = VM_CallInterpreted2( vm, (int*)&callnum );
#else
struct {
int callnum;
- int args[10];
+ int args[VMMAIN_CALL_ARGS-1];
} a;
va_list ap;
a.callnum = callnum;
va_start(ap, callnum);
- for (i = 0; i < sizeof (a.args) / sizeof (a.args[0]); i++) {
- a.args[i] = va_arg(ap, int);
+ for (int i = 0; i < ARRAY_LEN( a.args ); i++ ) {
+ a.args[i] = va_arg( ap, int );
}
va_end(ap);
-#if !defined(NO_VM_COMPILED)
- r = VM_CallCompiled( vm, &a.callnum );
-#else
- r = VM_CallInterpreted( vm, &a.callnum );
+#ifndef NO_VM_COMPILED
+ if ( vm->compiled )
+ r = VM_CallCompiled( vm, &a.callnum );
+ else
#endif
+ r = VM_CallInterpreted2( vm, &a.callnum );
#endif
}
+ --vm->callLevel;
- if ( oldVM != NULL ) // bk001220 - assert(currentVM!=NULL) for oldVM==NULL
- currentVM = oldVM;
+ if ( oldVM != NULL )
+ currentVM = oldVM;
return r;
}
-
-///////////////////////////////////////////////////////////////
-
-
-static int QDECL VM_ProfileSort( const void *a, const void *b )
-{
- const vmSymbol_t *sa, *sb;
-
- sa = *(vmSymbol_t **)a;
- sb = *(vmSymbol_t **)b;
-
- if ( sa->profileCount < sb->profileCount ) {
- return -1;
- }
- if ( sa->profileCount > sb->profileCount ) {
- return 1;
- }
- return 0;
-}
-
-
-static void VM_VmProfile_f( void )
-{
- vmSymbol_t **sorted, *sym;
- int i;
- double total;
-
- if ( !lastVM ) {
- return;
- }
-
- const vm_t* vm = lastVM;
- if ( !vm->numSymbols ) {
- return;
- }
-
- sorted = (vmSymbol_t**)Z_Malloc( vm->numSymbols * sizeof( *sorted ) );
- sorted[0] = vm->symbols;
- total = sorted[0]->profileCount;
- for ( i = 1 ; i < vm->numSymbols ; i++ ) {
- sorted[i] = sorted[i-1]->next;
- total += sorted[i]->profileCount;
- }
-
- qsort( sorted, vm->numSymbols, sizeof( *sorted ), VM_ProfileSort );
-
- for ( i = 0 ; i < vm->numSymbols ; i++ ) {
- int perc;
-
- sym = sorted[i];
-
- perc = 100 * (float) sym->profileCount / total;
- Com_Printf( "%2i%% %9i %s\n", perc, sym->profileCount, sym->symName );
- sym->profileCount = 0;
- }
-
- Com_Printf(" %9.0f total\n", total );
-
- Z_Free( sorted );
-}
-
-
-static void VM_VmInfo_f( void )
-{
- Com_Printf( "Registered virtual machines:\n" );
-
- for (int i = 0; i < MAX_VM; ++i) {
- const vm_t* vm = &vmTable[i];
- if ( !vm->name[0] ) {
- break;
- }
- Com_Printf( "%s : ", vm->name );
-
- if ( vm->dllHandle ) {
- Com_Printf( "native\n" );
- continue;
- }
-
- if ( vm->compiled ) {
- Com_Printf( "compiled on load\n" );
- } else {
- Com_Printf( "interpreted\n" );
- }
-
- Com_Printf( " code length : %7i\n", vm->codeLength );
- Com_Printf( " table length: %7i\n", vm->instructionPointersLength );
- Com_Printf( " data length : %7i\n", vm->dataMask + 1 );
- }
-}
-
-
-///////////////////////////////////////////////////////////////
-
-
-/*
-===============
-VM_LogSyscalls
-
-Insert calls to this while debugging the vm compiler
-===============
-*/
-void VM_LogSyscalls( int *args ) {
- static int callnum;
- static FILE *f;
-
- if ( !f ) {
- f = fopen("syscalls.log", "w" );
- }
- callnum++;
- fprintf(f, "%i: %p (%i) = %i %i %i %i\n", callnum, (void*)(args - (int *)currentVM->dataBase),
- args[0], args[1], args[2], args[3], args[4] );
-}
diff --git a/code/qcommon/vm_interpreted.cpp b/code/qcommon/vm_interpreted.cpp
index a11f337..4300da3 100644
--- a/code/qcommon/vm_interpreted.cpp
+++ b/code/qcommon/vm_interpreted.cpp
@@ -1,11 +1,3 @@
-
-/* the QVM interpreter has never, ever been used by anyone
-because aside from the bugs that meant it simply didn't work, it's just a bad idea anyway
-the only time you'd ever want it is if you're on a platform that doesn't SUPPORT compiled VMs
-*/
-
-#if defined(NO_VM_COMPILED)
-
/*
===========================================================================
Copyright (C) 1999-2005 Id Software, Inc.
@@ -31,10 +23,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
//#define DEBUG_VM
#ifdef DEBUG_VM // bk001204
-static char *opnames[256] = {
- "OP_UNDEF",
+static const char *opnames[256] = {
+ "OP_UNDEF",
- "OP_IGNORE",
+ "OP_IGNORE",
"OP_BREAK",
@@ -120,189 +112,35 @@ static char *opnames[256] = {
};
#endif
-#if idppc
-//FIXME: these, um... look the same to me
-#if defined(__GNUC__)
-static ID_INLINE unsigned int loadWord(void *addr) {
- unsigned int word;
-
- asm("lwbrx %0,0,%1" : "=r" (word) : "r" (addr));
- return word;
-}
-#else
-static ID_INLINE unsigned int __lwbrx(register void *addr,
- register int offset) {
- register unsigned int word;
-
- asm("lwbrx %0,%2,%1" : "=r" (word) : "r" (addr), "b" (offset));
- return word;
-}
-#define loadWord(addr) __lwbrx(addr,0)
-#endif
-
-#else
- static ID_INLINE int loadWord(void *addr) {
- int word;
- memcpy(&word, addr, 4);
- return LittleLong(word);
- }
-#endif
-
-char *VM_Indent( vm_t *vm ) {
- static char *string = " ";
- if ( vm->callLevel > 20 ) {
- return string;
- }
- return string + 2 * ( 20 - vm->callLevel );
-}
-
-void VM_StackTrace( vm_t *vm, int programCounter, int programStack ) {
- int count;
-
- count = 0;
- do {
- Com_Printf( "%s\n", VM_ValueToSymbol( vm, programCounter ) );
- programStack = *(int *)&vm->dataBase[programStack+4];
- programCounter = *(int *)&vm->dataBase[programStack];
- } while ( programCounter != -1 && ++count < 32 );
-
-}
-
-
-void VM_PrepareInterpreter( vm_t* vm, const vmHeader_t* header )
+/*
+====================
+VM_PrepareInterpreter2
+====================
+*/
+qboolean VM_PrepareInterpreter2( vm_t *vm, vmHeader_t *header )
{
- int op;
- int pc;
- byte *code;
- int instruction;
- int *codeBase;
-
- vm->codeBase = (byte*)Hunk_Alloc( vm->codeLength*4, h_high ); // we're now int aligned
-// memcpy( vm->codeBase, (byte *)header + header->codeOffset, vm->codeLength );
-
- // we don't need to translate the instructions, but we still need
- // to find each instructions starting point for jumps
- pc = 0;
- instruction = 0;
- code = (byte *)header + header->codeOffset;
- codeBase = (int *)vm->codeBase;
-
- while ( instruction < header->instructionCount ) {
- vm->instructionPointers[ instruction ] = pc;
- instruction++;
-
- op = code[ pc ];
- codeBase[pc] = op;
- if ( pc > header->codeLength ) {
- Com_Error( ERR_FATAL, "VM_PrepareInterpreter: pc > header->codeLength" );
- }
-
- pc++;
-
- // these are the only opcodes that aren't a single byte
- switch ( op ) {
- case OP_ENTER:
- case OP_CONST:
- case OP_LOCAL:
- case OP_LEAVE:
- case OP_EQ:
- case OP_NE:
- case OP_LTI:
- case OP_LEI:
- case OP_GTI:
- case OP_GEI:
- case OP_LTU:
- case OP_LEU:
- case OP_GTU:
- case OP_GEU:
- case OP_EQF:
- case OP_NEF:
- case OP_LTF:
- case OP_LEF:
- case OP_GTF:
- case OP_GEF:
- case OP_BLOCK_COPY:
- codeBase[pc+0] = loadWord(&code[pc]);
- pc += 4;
- break;
- case OP_ARG:
- codeBase[pc+0] = code[pc];
- pc += 1;
- break;
- default:
- break;
- }
+ const char *errMsg;
+ instruction_t *buf;
+ buf = ( instruction_t *) Hunk_Alloc( (vm->instructionCount + 8) * sizeof( instruction_t ), h_high );
+ errMsg = VM_LoadInstructions( header, buf );
+ if ( !errMsg ) {
+ errMsg = VM_CheckInstructions( buf, vm->instructionCount, vm->jumpTableTargets, vm->numJumpTableTargets, vm->dataLength );
}
- pc = 0;
- instruction = 0;
- code = (byte *)header + header->codeOffset;
- codeBase = (int *)vm->codeBase;
-
- while ( instruction < header->instructionCount ) {
- op = code[ pc ];
- instruction++;
- pc++;
- switch ( op ) {
- case OP_ENTER:
- case OP_CONST:
- case OP_LOCAL:
- case OP_LEAVE:
- case OP_EQ:
- case OP_NE:
- case OP_LTI:
- case OP_LEI:
- case OP_GTI:
- case OP_GEI:
- case OP_LTU:
- case OP_LEU:
- case OP_GTU:
- case OP_GEU:
- case OP_EQF:
- case OP_NEF:
- case OP_LTF:
- case OP_LEF:
- case OP_GTF:
- case OP_GEF:
- case OP_BLOCK_COPY:
- switch(op) {
- case OP_EQ:
- case OP_NE:
- case OP_LTI:
- case OP_LEI:
- case OP_GTI:
- case OP_GEI:
- case OP_LTU:
- case OP_LEU:
- case OP_GTU:
- case OP_GEU:
- case OP_EQF:
- case OP_NEF:
- case OP_LTF:
- case OP_LEF:
- case OP_GTF:
- case OP_GEF:
- codeBase[pc] = vm->instructionPointers[codeBase[pc]];
- break;
- default:
- break;
- }
- pc += 4;
- break;
- case OP_ARG:
- pc += 1;
- break;
- default:
- break;
- }
-
+ if ( errMsg ) {
+ Com_Printf( "VM_PrepareInterpreter2 error: %s\n", errMsg );
+ return qfalse;
}
+
+ vm->codeBase.ptr = (byte*)buf;
+ return qtrue;
}
+
/*
==============
-VM_Call
+VM_CallInterpreted2
Upon a system call, the stack will look like:
@@ -323,24 +161,26 @@ an OP_ENTER instruction, which will subtract space for
locals from sp
==============
*/
-#define MAX_STACK 256
-#define STACK_MASK (MAX_STACK-1)
+int VM_CallInterpreted2( vm_t *vm, int *args ) {
+ typedef union floatint_u {
+ int i;
+ unsigned int u;
+ float f;
+ byte b[4];
+ } floatint_t;
-#define DEBUGSTR va("%s%i", VM_Indent(vm), opStack-stack )
-
-int VM_CallInterpreted( vm_t *vm, int *args ) {
- int stack[MAX_STACK];
- int *opStack;
- int programCounter;
+ int stack[MAX_OPSTACK_SIZE];
+ int *opStack, *opStackTop;
int programStack;
int stackOnEntry;
byte *image;
- int *codeImage;
- int v1;
+ int v1, v0;
int dataMask;
-#ifdef DEBUG_VM
- vmSymbol_t *profileSymbol;
-#endif
+ instruction_t *inst, *ci;
+ floatint_t r0, r1;
+ int opcode;
+ int *img;
+ int i;
// interpret the code
vm->currentlyInterpreting = qtrue;
@@ -348,283 +188,139 @@ int VM_CallInterpreted( vm_t *vm, int *args ) {
// we might be called recursively, so this might not be the very top
programStack = stackOnEntry = vm->programStack;
-#ifdef DEBUG_VM
- profileSymbol = VM_ValueToFunctionSymbol( vm, 0 );
- // uncomment this for debugging breakpoints
- vm->breakFunction = 0;
-#endif
- // set up the stack frame
-
+ // set up the stack frame
image = vm->dataBase;
- codeImage = (int *)vm->codeBase;
+ inst = (instruction_t *)vm->codeBase.ptr;
dataMask = vm->dataMask;
-
+
// leave a free spot at start of stack so
// that as long as opStack is valid, opStack-1 will
// not corrupt anything
opStack = stack;
- programCounter = 0;
+ opStackTop = stack + ARRAY_LEN( stack ) - 1;
- programStack -= 48;
+ programStack -= 8 + (VMMAIN_CALL_ARGS*4);
+ img = (int*)&image[ programStack ];
+ for ( i = 0; i < VMMAIN_CALL_ARGS; i++ ) {
+ img[ i + 2 ] = args[ i ];
+ }
+ img[ 1 ] = 0; // return stack
+ img[ 0 ] = -1; // will terminate the loop on return
- *(int *)&image[ programStack + 44] = args[9];
- *(int *)&image[ programStack + 40] = args[8];
- *(int *)&image[ programStack + 36] = args[7];
- *(int *)&image[ programStack + 32] = args[6];
- *(int *)&image[ programStack + 28] = args[5];
- *(int *)&image[ programStack + 24] = args[4];
- *(int *)&image[ programStack + 20] = args[3];
- *(int *)&image[ programStack + 16] = args[2];
- *(int *)&image[ programStack + 12] = args[1];
- *(int *)&image[ programStack + 8 ] = args[0];
- *(int *)&image[ programStack + 4 ] = 0; // return stack
- *(int *)&image[ programStack ] = -1; // will terminate the loop on return
+ ci = inst;
- vm->callLevel = 0;
-
- VM_Debug(0);
-
-// vm_debugLevel=2;
// main interpreter loop, will exit when a LEAVE instruction
// grabs the -1 program counter
-#define r2 codeImage[programCounter]
-
while ( 1 ) {
- int opcode, r0, r1;
-// unsigned int r2;
-nextInstruction:
- r0 = ((int *)opStack)[0];
- r1 = ((int *)opStack)[-1];
+ r0.i = opStack[0];
+ r1.i = opStack[-1];
+
nextInstruction2:
- opcode = codeImage[ programCounter++ ];
-#ifdef DEBUG_VM
- if ( (unsigned)programCounter > vm->codeLength ) {
- Com_Error( ERR_DROP, "VM pc out of range" );
- }
- if ( opStack < stack ) {
- Com_Error( ERR_DROP, "VM opStack underflow" );
- }
- if ( opStack >= stack+MAX_STACK ) {
- Com_Error( ERR_DROP, "VM opStack overflow" );
- }
-
- if ( programStack <= vm->stackBottom ) {
- Com_Error( ERR_DROP, "VM stack overflow" );
- }
-
- if ( programStack & 3 ) {
- Com_Error( ERR_DROP, "VM program stack misaligned" );
- }
-
- if ( vm_debugLevel > 1 ) {
- Com_Printf( "%s %s\n", DEBUGSTR, opnames[opcode] );
- }
- profileSymbol->profileCount++;
-#endif
+ v0 = ci->value;
+ opcode = ci->op;
+ ci++;
switch ( opcode ) {
-#ifdef DEBUG_VM
- default:
- Com_Error( ERR_DROP, "Bad VM instruction" ); // this should be scanned on load!
-#endif
+
case OP_BREAK:
vm->breakCount++;
goto nextInstruction2;
- case OP_CONST:
- opStack++;
- r1 = r0;
- r0 = *opStack = r2;
-
- programCounter += 4;
- goto nextInstruction2;
- case OP_LOCAL:
- opStack++;
- r1 = r0;
- r0 = *opStack = r2+programStack;
- programCounter += 4;
- goto nextInstruction2;
-
- case OP_LOAD4:
-#ifdef DEBUG_VM
- if ( *opStack & 3 ) {
- Com_Error( ERR_DROP, "OP_LOAD4 misaligned" );
+ case OP_ENTER:
+ // get size of stack frame
+ programStack -= v0;
+ if ( programStack <= vm->stackBottom ) {
+ Com_Error( ERR_DROP, "VM programStack overflow" );
}
-#endif
- r0 = *opStack = *(int *)&image[ r0&dataMask ];
- goto nextInstruction2;
- case OP_LOAD2:
- r0 = *opStack = *(unsigned short *)&image[ r0&dataMask ];
- goto nextInstruction2;
- case OP_LOAD1:
- r0 = *opStack = image[ r0&dataMask ];
- goto nextInstruction2;
-
- case OP_STORE4:
- *(int *)&image[ r1&(dataMask & ~3) ] = r0;
- opStack -= 2;
- goto nextInstruction;
- case OP_STORE2:
- *(short *)&image[ r1&(dataMask & ~1) ] = r0;
- opStack -= 2;
- goto nextInstruction;
- case OP_STORE1:
- image[ r1&dataMask ] = r0;
- opStack -= 2;
- goto nextInstruction;
-
- case OP_ARG:
- // single byte offset from programStack
- *(int *)&image[ codeImage[programCounter] + programStack ] = r0;
- opStack--;
- programCounter += 1;
- goto nextInstruction;
-
- case OP_BLOCK_COPY:
- {
- int *src, *dest;
- int i, count, srci, desti;
-
- count = r2;
- // MrE: copy range check
- srci = r0 & dataMask;
- desti = r1 & dataMask;
- count = ((srci + count) & dataMask) - srci;
- count = ((desti + count) & dataMask) - desti;
-
- src = (int *)&image[ r0&dataMask ];
- dest = (int *)&image[ r1&dataMask ];
- if ( ( (intptr_t)src | (intptr_t)dest | count ) & 3 ) {
- // happens in westernq3
- Com_Printf( S_COLOR_YELLOW "Warning: OP_BLOCK_COPY not dword aligned\n");
- }
- count >>= 2;
- for ( i = count-1 ; i>= 0 ; i-- ) {
- dest[i] = src[i];
- }
- programCounter += 4;
- opStack -= 2;
+ if ( opStack + ((ci-1)->opStack/4) >= opStackTop ) {
+ Com_Error( ERR_DROP, "VM opStack overflow" );
}
- goto nextInstruction;
+ break;
+
+ case OP_LEAVE:
+ // remove our stack frame
+ programStack += v0;
+
+ // grab the saved program counter
+ v1 = *(int *)&image[ programStack ];
+ // check for leaving the VM
+ if ( v1 == -1 ) {
+ goto done;
+ } else if ( (unsigned)v1 >= vm->instructionCount ) {
+ Com_Error( ERR_DROP, "VM program counter out of range in OP_LEAVE" );
+ }
+ ci = inst + v1;
+ break;
case OP_CALL:
// save current program counter
- *(int *)&image[ programStack ] = programCounter;
-
+ *(int *)&image[ programStack ] = ci - inst;
+
// jump to the location on the stack
- programCounter = r0;
- opStack--;
- if ( programCounter < 0 ) {
+ if ( r0.i < 0 ) {
// system call
- int r;
- int temp;
-#ifdef DEBUG_VM
- int stomped;
-
- if ( vm_debugLevel ) {
- Com_Printf( "%s---> systemcall(%i)\n", DEBUGSTR, -1 - programCounter );
- }
-#endif
// save the stack to allow recursive VM entry
- temp = vm->callLevel;
vm->programStack = programStack - 4;
-#ifdef DEBUG_VM
- stomped = *(int *)&image[ programStack + 4 ];
-#endif
- *(int *)&image[ programStack + 4 ] = -1 - programCounter;
-
-//VM_LogSyscalls( (int *)&image[ programStack + 4 ] );
+ *(int *)&image[ programStack + 4 ] = ~r0.i;
{
- intptr_t* argptr = (intptr_t *)&image[ programStack + 4 ];
- #if __WORDSIZE == 64
- // the vm has ints on the stack, we expect
- // longs so we have to convert it
+#if idx64 //__WORDSIZE == 64
+ // the vm has ints on the stack, we expect
+ // longs so we have to convert it
intptr_t argarr[16];
- int i;
- for (i = 0; i < 16; ++i) {
- argarr[i] = *(int*)&image[ programStack + 4 + 4*i ];
+ int argn;
+ for ( argn = 0; argn < ARRAY_LEN( argarr ); ++argn ) {
+ argarr[ argn ] = *(int*)&image[ programStack + 4 + 4*argn ];
}
- argptr = argarr;
- #endif
- r = vm->systemCall( argptr );
- }
-
-#ifdef DEBUG_VM
- // this is just our stack frame pointer, only needed
- // for debugging
- *(int *)&image[ programStack + 4 ] = stomped;
+ v0 = vm->systemCall( &argarr[0] );
+#else
+ v0 = vm->systemCall( (intptr_t *)&image[ programStack + 4 ] );
#endif
+ }
// save return value
- opStack++;
- *opStack = r;
- programCounter = *(int *)&image[ programStack ];
- vm->callLevel = temp;
-#ifdef DEBUG_VM
- if ( vm_debugLevel ) {
- Com_Printf( "%s<--- %s\n", DEBUGSTR, VM_ValueToSymbol( vm, programCounter ) );
- }
-#endif
+ //opStack++;
+ ci = inst + *(int *)&image[ programStack ];
+ *opStack = v0;
+ } else if ( r0.u < vm->instructionCount ) {
+ // vm call
+ ci = inst + r0.i;
+ opStack--;
} else {
- programCounter = vm->instructionPointers[ programCounter ];
+ Com_Error( ERR_DROP, "VM program counter out of range in OP_CALL" );
}
- goto nextInstruction;
+ break;
// push and pop are only needed for discarded or bad function return values
case OP_PUSH:
opStack++;
- goto nextInstruction;
+ break;
+
case OP_POP:
opStack--;
- goto nextInstruction;
+ break;
- case OP_ENTER:
-#ifdef DEBUG_VM
- profileSymbol = VM_ValueToFunctionSymbol( vm, programCounter );
-#endif
- // get size of stack frame
- v1 = r2;
+ case OP_CONST:
+ opStack++;
+ r1.i = r0.i;
+ r0.i = *opStack = v0;
+ goto nextInstruction2;
- programCounter += 4;
- programStack -= v1;
-#ifdef DEBUG_VM
- // save old stack frame for debugging traces
- *(int *)&image[programStack+4] = programStack + v1;
- if ( vm_debugLevel ) {
- Com_Printf( "%s---> %s\n", DEBUGSTR, VM_ValueToSymbol( vm, programCounter - 5 ) );
- if ( vm->breakFunction && programCounter - 5 == vm->breakFunction ) {
- // this is to allow setting breakpoints here in the debugger
- vm->breakCount++;
-// vm_debugLevel = 2;
-// VM_StackTrace( vm, programCounter, programStack );
- }
- vm->callLevel++;
+ case OP_LOCAL:
+ opStack++;
+ r1.i = r0.i;
+ r0.i = *opStack = v0 + programStack;
+ goto nextInstruction2;
+
+ case OP_JUMP:
+ if ( r0.u >= vm->instructionCount ) {
+ Com_Error( ERR_DROP, "VM program counter out of range in OP_JUMP" );
}
-#endif
- goto nextInstruction;
- case OP_LEAVE:
- // remove our stack frame
- v1 = r2;
-
- programStack += v1;
-
- // grab the saved program counter
- programCounter = *(int *)&image[ programStack ];
-#ifdef DEBUG_VM
- profileSymbol = VM_ValueToFunctionSymbol( vm, programCounter );
- if ( vm_debugLevel ) {
- vm->callLevel--;
- Com_Printf( "%s<--- %s\n", DEBUGSTR, VM_ValueToSymbol( vm, programCounter ) );
- }
-#endif
- // check for leaving the VM
- if ( programCounter == -1 ) {
- goto done;
- }
- goto nextInstruction;
+ ci = inst + r0.i;
+ opStack--;
+ break;
/*
===================================================================
@@ -632,286 +328,282 @@ nextInstruction2:
===================================================================
*/
- case OP_JUMP:
- programCounter = r0;
- programCounter = vm->instructionPointers[ programCounter ];
- opStack--;
- goto nextInstruction;
-
case OP_EQ:
opStack -= 2;
- if ( r1 == r0 ) {
- programCounter = r2; //vm->instructionPointers[r2];
- goto nextInstruction;
- } else {
- programCounter += 4;
- goto nextInstruction;
- }
+ if ( r1.i == r0.i )
+ ci = inst + v0;
+ break;
case OP_NE:
opStack -= 2;
- if ( r1 != r0 ) {
- programCounter = r2; //vm->instructionPointers[r2];
- goto nextInstruction;
- } else {
- programCounter += 4;
- goto nextInstruction;
- }
+ if ( r1.i != r0.i )
+ ci = inst + v0;
+ break;
case OP_LTI:
opStack -= 2;
- if ( r1 < r0 ) {
- programCounter = r2; //vm->instructionPointers[r2];
- goto nextInstruction;
- } else {
- programCounter += 4;
- goto nextInstruction;
- }
+ if ( r1.i < r0.i )
+ ci = inst + v0;
+ break;
case OP_LEI:
opStack -= 2;
- if ( r1 <= r0 ) {
- programCounter = r2; //vm->instructionPointers[r2];
- goto nextInstruction;
- } else {
- programCounter += 4;
- goto nextInstruction;
- }
+ if ( r1.i <= r0.i )
+ ci = inst + v0;
+ break;
case OP_GTI:
opStack -= 2;
- if ( r1 > r0 ) {
- programCounter = r2; //vm->instructionPointers[r2];
- goto nextInstruction;
- } else {
- programCounter += 4;
- goto nextInstruction;
- }
+ if ( r1.i > r0.i )
+ ci = inst + v0;
+ break;
case OP_GEI:
opStack -= 2;
- if ( r1 >= r0 ) {
- programCounter = r2; //vm->instructionPointers[r2];
- goto nextInstruction;
- } else {
- programCounter += 4;
- goto nextInstruction;
- }
+ if ( r1.i >= r0.i )
+ ci = inst + v0;
+ break;
case OP_LTU:
opStack -= 2;
- if ( ((unsigned)r1) < ((unsigned)r0) ) {
- programCounter = r2; //vm->instructionPointers[r2];
- goto nextInstruction;
- } else {
- programCounter += 4;
- goto nextInstruction;
- }
+ if ( r1.u < r0.u )
+ ci = inst + v0;
+ break;
case OP_LEU:
opStack -= 2;
- if ( ((unsigned)r1) <= ((unsigned)r0) ) {
- programCounter = r2; //vm->instructionPointers[r2];
- goto nextInstruction;
- } else {
- programCounter += 4;
- goto nextInstruction;
- }
+ if ( r1.u <= r0.u )
+ ci = inst + v0;
+ break;
case OP_GTU:
opStack -= 2;
- if ( ((unsigned)r1) > ((unsigned)r0) ) {
- programCounter = r2; //vm->instructionPointers[r2];
- goto nextInstruction;
- } else {
- programCounter += 4;
- goto nextInstruction;
- }
+ if ( r1.u > r0.u )
+ ci = inst + v0;
+ break;
case OP_GEU:
opStack -= 2;
- if ( ((unsigned)r1) >= ((unsigned)r0) ) {
- programCounter = r2; //vm->instructionPointers[r2];
- goto nextInstruction;
- } else {
- programCounter += 4;
- goto nextInstruction;
- }
+ if ( r1.u >= r0.u )
+ ci = inst + v0;
+ break;
case OP_EQF:
- if ( ((float *)opStack)[-1] == *(float *)opStack ) {
- programCounter = r2; //vm->instructionPointers[r2];
- opStack -= 2;
- goto nextInstruction;
- } else {
- programCounter += 4;
- opStack -= 2;
- goto nextInstruction;
- }
+ opStack -= 2;
+ if ( r1.f == r0.f )
+ ci = inst + v0;
+ break;
case OP_NEF:
- if ( ((float *)opStack)[-1] != *(float *)opStack ) {
- programCounter = r2; //vm->instructionPointers[r2];
- opStack -= 2;
- goto nextInstruction;
- } else {
- programCounter += 4;
- opStack -= 2;
- goto nextInstruction;
- }
+ opStack -= 2;
+ if ( r1.f != r0.f )
+ ci = inst + v0;
+ break;
case OP_LTF:
- if ( ((float *)opStack)[-1] < *(float *)opStack ) {
- programCounter = r2; //vm->instructionPointers[r2];
- opStack -= 2;
- goto nextInstruction;
- } else {
- programCounter += 4;
- opStack -= 2;
- goto nextInstruction;
- }
+ opStack -= 2;
+ if ( r1.f < r0.f )
+ ci = inst + v0;
+ break;
case OP_LEF:
- if ( ((float *)opStack)[-1] <= *(float *)opStack ) {
- programCounter = r2; //vm->instructionPointers[r2];
- opStack -= 2;
- goto nextInstruction;
- } else {
- programCounter += 4;
- opStack -= 2;
- goto nextInstruction;
- }
+ opStack -= 2;
+ if ( r1.f <= r0.f )
+ ci = inst + v0;
+ break;
case OP_GTF:
- if ( ((float *)opStack)[-1] > *(float *)opStack ) {
- programCounter = r2; //vm->instructionPointers[r2];
- opStack -= 2;
- goto nextInstruction;
- } else {
- programCounter += 4;
- opStack -= 2;
- goto nextInstruction;
- }
+ opStack -= 2;
+ if ( r1.f > r0.f )
+ ci = inst + v0;
+ break;
case OP_GEF:
- if ( ((float *)opStack)[-1] >= *(float *)opStack ) {
- programCounter = r2; //vm->instructionPointers[r2];
- opStack -= 2;
- goto nextInstruction;
- } else {
- programCounter += 4;
- opStack -= 2;
- goto nextInstruction;
- }
-
+ opStack -= 2;
+ if ( r1.f >= r0.f )
+ ci = inst + v0;
+ break;
//===================================================================
- case OP_NEGI:
- *opStack = -r0;
- goto nextInstruction;
- case OP_ADD:
- opStack[-1] = r1 + r0;
- opStack--;
- goto nextInstruction;
- case OP_SUB:
- opStack[-1] = r1 - r0;
- opStack--;
- goto nextInstruction;
- case OP_DIVI:
- opStack[-1] = r1 / r0;
- opStack--;
- goto nextInstruction;
- case OP_DIVU:
- opStack[-1] = ((unsigned)r1) / ((unsigned)r0);
- opStack--;
- goto nextInstruction;
- case OP_MODI:
- opStack[-1] = r1 % r0;
- opStack--;
- goto nextInstruction;
- case OP_MODU:
- opStack[-1] = ((unsigned)r1) % (unsigned)r0;
- opStack--;
- goto nextInstruction;
- case OP_MULI:
- opStack[-1] = r1 * r0;
- opStack--;
- goto nextInstruction;
- case OP_MULU:
- opStack[-1] = ((unsigned)r1) * ((unsigned)r0);
- opStack--;
- goto nextInstruction;
+ case OP_LOAD1:
+ r0.i = *opStack = image[ r0.i & dataMask ];
+ goto nextInstruction2;
- case OP_BAND:
- opStack[-1] = ((unsigned)r1) & ((unsigned)r0);
- opStack--;
- goto nextInstruction;
- case OP_BOR:
- opStack[-1] = ((unsigned)r1) | ((unsigned)r0);
- opStack--;
- goto nextInstruction;
- case OP_BXOR:
- opStack[-1] = ((unsigned)r1) ^ ((unsigned)r0);
- opStack--;
- goto nextInstruction;
- case OP_BCOM:
- opStack[-1] = ~ ((unsigned)r0);
- goto nextInstruction;
+ case OP_LOAD2:
+ r0.i = *opStack = *(unsigned short *)&image[ r0.i & ( dataMask & ~1 ) ];
+ goto nextInstruction2;
- case OP_LSH:
- opStack[-1] = r1 << r0;
- opStack--;
- goto nextInstruction;
- case OP_RSHI:
- opStack[-1] = r1 >> r0;
- opStack--;
- goto nextInstruction;
- case OP_RSHU:
- opStack[-1] = ((unsigned)r1) >> r0;
- opStack--;
- goto nextInstruction;
+ case OP_LOAD4:
+ r0.i = *opStack = *(int *)&image[ r0.i & ( dataMask & ~3 ) ];
+ goto nextInstruction2;
- case OP_NEGF:
- *(float *)opStack = -*(float *)opStack;
- goto nextInstruction;
- case OP_ADDF:
- *(float *)(opStack-1) = *(float *)(opStack-1) + *(float *)opStack;
- opStack--;
- goto nextInstruction;
- case OP_SUBF:
- *(float *)(opStack-1) = *(float *)(opStack-1) - *(float *)opStack;
- opStack--;
- goto nextInstruction;
- case OP_DIVF:
- *(float *)(opStack-1) = *(float *)(opStack-1) / *(float *)opStack;
- opStack--;
- goto nextInstruction;
- case OP_MULF:
- *(float *)(opStack-1) = *(float *)(opStack-1) * *(float *)opStack;
- opStack--;
- goto nextInstruction;
+ case OP_STORE1:
+ image[ r1.i & dataMask ] = r0.i;
+ opStack -= 2;
+ break;
+
+ case OP_STORE2:
+ *(short *)&image[ r1.i & (dataMask & ~1) ] = r0.i;
+ opStack -= 2;
+ break;
+
+ case OP_STORE4:
+ *(int *)&image[ r1.i & (dataMask & ~3) ] = r0.i;
+ opStack -= 2;
+ break;
+
+ case OP_ARG:
+ // single byte offset from programStack
+ *(int *)&image[ ( v0 + programStack ) /*& ( dataMask & ~3 ) */ ] = r0.i;
+ opStack--;
+ break;
+
+ case OP_BLOCK_COPY:
+ {
+ int *src, *dest;
+ int count, srci, desti;
+
+ count = v0;
+ // MrE: copy range check
+ srci = r0.i & dataMask;
+ desti = r1.i & dataMask;
+ count = ((srci + count) & dataMask) - srci;
+ count = ((desti + count) & dataMask) - desti;
+
+ src = (int *)&image[ srci ];
+ dest = (int *)&image[ desti ];
+
+ memcpy( dest, src, count );
+ opStack -= 2;
+ }
+ break;
- case OP_CVIF:
- *(float *)opStack = (float)*opStack;
- goto nextInstruction;
- case OP_CVFI:
- *opStack = (int) *(float *)opStack;
- goto nextInstruction;
case OP_SEX8:
*opStack = (signed char)*opStack;
- goto nextInstruction;
+ break;
+
case OP_SEX16:
*opStack = (short)*opStack;
- goto nextInstruction;
+ break;
+
+ case OP_NEGI:
+ *opStack = -r0.i;
+ break;
+
+ case OP_ADD:
+ opStack[-1] = r1.i + r0.i;
+ opStack--;
+ break;
+
+ case OP_SUB:
+ opStack[-1] = r1.i - r0.i;
+ opStack--;
+ break;
+
+ case OP_DIVI:
+ opStack[-1] = r1.i / r0.i;
+ opStack--;
+ break;
+
+ case OP_DIVU:
+ opStack[-1] = r1.u / r0.u;
+ opStack--;
+ break;
+
+ case OP_MODI:
+ opStack[-1] = r1.i % r0.i;
+ opStack--;
+ break;
+
+ case OP_MODU:
+ opStack[-1] = r1.u % r0.u;
+ opStack--;
+ break;
+
+ case OP_MULI:
+ opStack[-1] = r1.i * r0.i;
+ opStack--;
+ break;
+
+ case OP_MULU:
+ opStack[-1] = r1.u * r0.u;
+ opStack--;
+ break;
+
+ case OP_BAND:
+ opStack[-1] = r1.u & r0.u;
+ opStack--;
+ break;
+
+ case OP_BOR:
+ opStack[-1] = r1.u | r0.u;
+ opStack--;
+ break;
+
+ case OP_BXOR:
+ opStack[-1] = r1.u ^ r0.u;
+ opStack--;
+ break;
+
+ case OP_BCOM:
+ *opStack = ~ r0.u; // id bug: was writing to opStack[-1]
+ break;
+
+ case OP_LSH:
+ opStack[-1] = r1.i << r0.i;
+ opStack--;
+ break;
+
+ case OP_RSHI:
+ opStack[-1] = r1.i >> r0.i;
+ opStack--;
+ break;
+
+ case OP_RSHU:
+ opStack[-1] = r1.u >> r0.i;
+ opStack--;
+ break;
+
+ case OP_NEGF:
+ *(float *)opStack = - r0.f;
+ break;
+
+ case OP_ADDF:
+ *(float *)(opStack-1) = r1.f + r0.f;
+ opStack--;
+ break;
+
+ case OP_SUBF:
+ *(float *)(opStack-1) = r1.f - r0.f;
+ opStack--;
+ break;
+
+ case OP_DIVF:
+ *(float *)(opStack-1) = r1.f / r0.f;
+ opStack--;
+ break;
+
+ case OP_MULF:
+ *(float *)(opStack-1) = r1.f * r0.f;
+ opStack--;
+ break;
+
+ case OP_CVIF:
+ *(float *)opStack = (float) r0.i;
+ break;
+
+ case OP_CVFI:
+ *opStack = (int) r0.f;
+ break;
}
}
done:
- vm->currentlyInterpreting = qfalse;
+ //vm->currentlyInterpreting = qfalse;
if ( opStack != &stack[1] ) {
- Com_Error( ERR_DROP, "Interpreter error: opStack = %i", opStack - stack );
+ Com_Error( ERR_DROP, "Interpreter error: opStack = %ld", (long int) (opStack - stack) );
}
vm->programStack = stackOnEntry;
@@ -919,6 +611,3 @@ done:
// return the result
return *opStack;
}
-
-
-#endif
diff --git a/code/qcommon/vm_local.h b/code/qcommon/vm_local.h
index 2c8402d..ecd53a5 100644
--- a/code/qcommon/vm_local.h
+++ b/code/qcommon/vm_local.h
@@ -22,6 +22,13 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include "q_shared.h"
#include "qcommon.h"
+#define MAX_OPSTACK_SIZE 512
+#define PROC_OPSTACK_SIZE 30
+
+#define VMMAIN_CALL_ARGS 13
+
+// hardcoded in q3asm and reserved at end of bss
+#define PROGRAM_STACK_SIZE 0x10000
typedef enum {
OP_UNDEF,
@@ -107,9 +114,33 @@ typedef enum {
OP_MULF,
OP_CVIF,
- OP_CVFI
+ OP_CVFI,
+
+ OP_MAX
} opcode_t;
+// macro opcode sequences
+typedef enum {
+ MOP_UNDEF = OP_MAX,
+ MOP_IGNORE4,
+ MOP_ADD4,
+ MOP_SUB4,
+ MOP_BAND4,
+ MOP_BOR4,
+ MOP_CALCF4,
+} macro_op_t;
+
+typedef struct {
+ int value;
+ byte op;
+ byte opStack;
+ byte jused; // boolean
+ byte swtch; // boolean
+} instruction_t;
+
+extern const char *opname[OP_MAX];
+
+typedef int vmptr_t;
typedef struct vmSymbol_s {
struct vmSymbol_s *next;
@@ -118,52 +149,62 @@ typedef struct vmSymbol_s {
char symName[1]; // variable sized
} vmSymbol_t;
-#define VM_OFFSET_PROGRAM_STACK 0
-#define VM_OFFSET_SYSTEM_CALL 4
+typedef union vmFunc_u {
+ byte *ptr;
+ void (*func)(void);
+} vmFunc_t;
struct vm_s {
// DO NOT MOVE OR CHANGE THESE WITHOUT CHANGING THE VM_OFFSET_* DEFINES
// USED BY THE ASM CODE
int programStack; // the vm may be recursively entered
- intptr_t (*systemCall)( intptr_t *parms );
+ syscall_t systemCall;
+ byte *dataBase;
+ int *opStack; // pointer to local function stack
+
+ int instructionCount;
+ intptr_t *instructionPointers;
//------------------------------------
- char name[MAX_QPATH];
+ const char *name;
// for dynamic linked modules
void *dllHandle;
- intptr_t (QDECL *entryPoint)( int callNum, ... );
- void (*destroy)(vm_t* self);
+ dllSyscall_t entryPoint;
+ void (*destroy)(vm_t* self);
- qbool compiled;
- byte *codeBase;
+ // for interpreted modules
+ qboolean currentlyInterpreting;
+
+ qboolean compiled;
+
+ vmFunc_t codeBase;
int codeLength;
- int *instructionPointers;
- int instructionPointersLength;
-
- byte *dataBase;
int dataMask;
+ int dataLength; // exact data segment length
+
+ int stackBottom; // if programStack < stackBottom, error
+ int *opStackTop;
int numSymbols;
vmSymbol_t *symbols;
- int stackBottom; // if programStack < stackBottom, error
-#if defined(NO_VM_COMPILED)
- int callLevel; // for debug indenting
+ int callLevel; // counts recursive VM_Call
int breakFunction; // increment breakCount on function entry to this
int breakCount;
-#endif
byte *jumpTableTargets;
int numJumpTableTargets;
+
+ uint32_t crc32sum;
+ vmIndex_t index;
};
+extern vm_t *currentVM;
#define VM_MAGIC 0x12721444
-#define VM_MAGIC_VER2 0x12721445
-
typedef struct {
int vmMagic;
@@ -176,26 +217,19 @@ typedef struct {
int dataLength;
int litLength; // ( dataLength - litLength ) should be byteswapped on load
int bssLength; // zero filled memory appended to datalength
-
- //!!! below here is VM_MAGIC_VER2 !!!
- int jtrgLength; // number of jump table targets
} vmHeader_t;
+qboolean VM_Compile( vm_t *vm, vmHeader_t *header );
+int VM_CallCompiled( vm_t *vm, int *args );
-extern vm_t *currentVM;
-extern int vm_debugLevel;
+qboolean VM_PrepareInterpreter2( vm_t *vm, vmHeader_t *header );
+int VM_CallInterpreted2( vm_t *vm, int *args );
-void VM_Compile( vm_t* vm, const vmHeader_t* header );
-int VM_CallCompiled( vm_t* vm, int* args );
-
-#if defined(NO_VM_COMPILED)
-void VM_PrepareInterpreter( vm_t* vm, const vmHeader_t* header );
-int VM_CallInterpreted( vm_t *vm, int *args );
-#endif
-
-const char* VM_ValueToSymbol( const vm_t* vm, int value );
-const vmSymbol_t* VM_ValueToFunctionSymbol( const vm_t* vm, int value );
-void VM_LogSyscalls( int *args );
+const char *VM_LoadInstructions( const vmHeader_t *header, instruction_t *buf );
+const char *VM_CheckInstructions( instruction_t *buf, int instructionCount,
+ const byte *jumpTableTargets,
+ int numJumpTableTargets,
+ int dataLength );
intptr_t VM_ArgPtr( intptr_t intValue );
intptr_t VM_ExplicitArgPtr( const vm_t* vm, intptr_t intValue );
@@ -211,3 +245,15 @@ static ID_INLINE float _vmf(intptr_t x)
}
#define VMF(x) _vmf(args[x])
+#define VM_OF_JUMP (1<<0)
+
+typedef struct opcode_info_s
+{
+ int size;
+ int stack;
+ int nargs;
+ int flags;
+} opcode_info_t ;
+
+extern opcode_info_t ops[ OP_MAX ];
+
diff --git a/code/qcommon/vm_none.cpp b/code/qcommon/vm_none.cpp
index c7e5ba0..c59d4d4 100644
--- a/code/qcommon/vm_none.cpp
+++ b/code/qcommon/vm_none.cpp
@@ -1,10 +1,10 @@
#include "vm_local.h"
int VM_CallCompiled( vm_t *vm, int *args ) {
- exit(99);
+ Com_Error(ERR_FATAL, "VM compiler N/A");
return 0;
}
-void VM_Compile( vm_t *vm, vmHeader_t *header ) {
- exit(99);
+void VM_Compile( vm_t *vm, const vmHeader_t *header ) {
+ Com_Error(ERR_FATAL, "VM compiler N/A");
}
diff --git a/code/qcommon/vm_x86.cpp b/code/qcommon/vm_x86.cpp
index 240450b..9bf6f35 100644
--- a/code/qcommon/vm_x86.cpp
+++ b/code/qcommon/vm_x86.cpp
@@ -19,314 +19,244 @@ along with Quake III Arena source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
-// vm_x86.c -- load time compiler and execution environment for x86
+// load time compiler and execution environment for x86, 32-bit and 64-bit
#include "vm_local.h"
-
#ifdef _WIN32
-#include "../win32/windows.h"
+#include
+#endif
+
+#ifdef __FreeBSD__
+#include
#endif
#ifndef _WIN32
#include // for PROT_ stuff
-// need this on NX enabled systems (i386 with PAE kernel or noexec32=on x86_64)
-#ifdef __linux__
+#endif
+
+/* need this on NX enabled systems (i386 with PAE kernel or
+ * noexec32=on x86_64) */
+#if defined(__linux__) || defined(__FreeBSD__)
#define VM_X86_MMAP
#endif
-#endif
+// bit mask:
+// 1 - program stack overflow
+// 2 - opcode stack overflow
+// 4 - jump target range
+// 8 - data read / write range
+static const int vm_rtChecks = -1;
+
+static void *VM_Alloc_Compiled( vm_t *vm, int codeLength, int tableLength );
+static void VM_Destroy_Compiled( vm_t *vm );
/*
-
+ -------------
eax scratch
- ebx scratch
+ ebx* dataBase
ecx scratch (required for shifts)
edx scratch (required for divisions)
- esi program stack
- edi opstack
+ esi* program stack
+ edi* opstack
+ ebp* current proc stack ( dataBase + program stack )
+ -------------
+ rax scratch
+ rbx* dataBase
+ rcx scratch (required for shifts)
+ rdx scratch (required for divisions)
+ rsi* programStack
+ rdi* opstack
+ rbp* current proc stack ( dataBase + program stack )
+ r8 instructionPointers
+ r9 dataMask
+ r12* systemCall
+ r13* stackBottom
+ r14* opStackTop
+ xmm0 scratch
+ xmm1 scratch
+ xmm2 scratch
+ xmm3 scratch
+ xmm4 scratch
+ xmm5 scratch
+
+ Windows ABI: you are required to preserve the XMM6-XMM15 registers
+ System V ABI: you don't have to preserve any of the XMM registers
+
+ Example how data segment will look like during vmMain execution:
+ | .... |
+ |------| vm->programStack -=36 (8+12+16) // set by vmMain
+ | ???? | +0 - unused
+ | ???? | +4 - unused
+ |-------
+ | arg0 | +8 \
+ | arg4 | +12 | - passed arguments, accessible from subroutines
+ | arg8 | +16 /
+ |------|
+ | loc0 | +20 \
+ | loc4 | +24 \ - locals, accessible only from local scope
+ | loc8 | +28 /
+ | lc12 | +32 /
+ |------| vm->programStack -= 48 (8+40) // set by VM_CallCompiled()
+ | ???? | +0 - unused
+ | ???? | +4 - unused
+ | arg0 | +8
+ | arg1 | +12
+ | arg2 | +16
+ | arg3 | +20
+ | arg4 | +24
+ | arg5 | +28
+ | arg6 | +32
+ | arg7 | +36
+ | arg8 | +40
+ | arg9 | +44
+ |------| vm->programStack = vm->dataMask + 1 // set by VM_Create()
+
+ jump/call opStack rules:
+
+ 1) opStack must be 8 before conditional jump
+ 2) opStack must be 4 before unconditional jump
+ 3) opStack must be >=4 before OP_CALL
+ 4) opStack must remain the same after OP_CALL
+ 5) you may not jump in/call locations with opStack != 0
*/
-// TTimo: initialised the statics, this fixes a crash when entering a compiled VM
-static byte *buf = NULL;
-static byte *jused = NULL;
-static int compiledOfs = 0;
-static byte *code = NULL;
-static int pc = 0;
+#define ISS8(V) ( (V) >= -128 && (V) <= 127 )
+#define ISU8(V) ( (V) >= 0 && (V) <= 127 )
-static int *instructionPointers = NULL;
-
-static int instruction, pass;
-static int lastConst = 0;
-static int oc0, oc1, pop0, pop1;
+#define REWIND(N) { compiledOfs -= (N); instructionOffsets[ ip-1 ] = compiledOfs; };
typedef enum
{
- LAST_COMMAND_NONE = 0,
+ REG_EAX = 0,
+ REG_ECX
+} reg_t;
+
+
+typedef enum
+{
+ LAST_COMMAND_NONE = 0,
LAST_COMMAND_MOV_EDI_EAX,
+ LAST_COMMAND_MOV_EDI_CONST,
+ LAST_COMMAND_MOV_EAX_EDI,
+ LAST_COMMAND_MOV_EAX_EDI_CALL,
LAST_COMMAND_SUB_DI_4,
LAST_COMMAND_SUB_DI_8,
+ LAST_COMMAND_STORE_FLOAT_EDI
} ELastCommand;
+typedef enum
+{
+ FUNC_ENTR = 0,
+ FUNC_CALL,
+ FUNC_SYSC,
+#if id386
+ FUNC_FTOL,
+#endif
+ FUNC_BCPY,
+ FUNC_PSOF,
+ FUNC_OSOF,
+ FUNC_BADJ,
+ FUNC_ERRJ,
+ FUNC_DATA,
+ FUNC_LAST
+} func_t;
+
+static byte *code;
+static int compiledOfs;
+static int *instructionOffsets;
+static intptr_t *instructionPointers;
+
+static instruction_t *inst = NULL;
+static instruction_t *ci;
+static instruction_t *ni;
+
+#if id386
+static int fp_cw[2] = { 0x0000, 0x0F7F }; // [0] - current value, [1] - round towards zero
+#endif
+
+static int ip;
+static int lastConst;
+static opcode_t pop1;
+
static ELastCommand LastCommand;
+static int floatStoreInstLength; // so we know by how much to rewind
+int funcOffset[FUNC_LAST];
-#ifdef _MSC_VER
+#ifdef DEBUG_VM
+static int errParam = 0;
+#endif
-static int callMask = 0;
-
-__declspec( naked ) void AsmCall()
+static void ErrJump( void )
{
- int programStack;
- int *opStack;
- int syscallNum;
- vm_t* savedVM;
-
- __asm {
- mov eax, dword ptr [edi]
- sub edi, 4
- or eax, eax
- jl systemCall
- // calling another vm function
- shl eax, 2
- add eax, dword ptr [instructionPointers]
- call dword ptr [eax]
- mov eax, dword ptr [edi]
- and eax, [callMask]
- ret
-
- systemCall:
- // convert negative num to system call number
- // and store right before the first arg
- neg eax
- dec eax
-
- push ebp
- mov ebp, esp
- sub esp, __LOCAL_SIZE
-
- mov dword ptr syscallNum, eax // so C code can get at it
- mov dword ptr programStack, esi // so C code can get at it
- mov dword ptr opStack, edi
-
- push ecx
- push esi // we may call recursively, so the
- push edi // statics aren't guaranteed to be around
- }
-
- savedVM = currentVM;
-
- // save the stack to allow recursive VM entry
- currentVM->programStack = programStack - 4;
- *(int *)((byte *)currentVM->dataBase + programStack + 4) = syscallNum;
- //VM_LogSyscalls( (int *)((byte *)currentVM->dataBase + programStack + 4) );
- *(opStack+1) = currentVM->systemCall( (int *)((byte *)currentVM->dataBase + programStack + 4) );
-
- currentVM = savedVM;
-
- _asm {
- pop edi
- pop esi
- pop ecx
- add edi, 4 // we added the return value
-
- mov esp, ebp
- pop ebp
-
- ret
- }
+ Com_Error( ERR_DROP, "program tried to execute code outside VM" );
}
-static int asmCallPtr = (int)AsmCall;
-#else //!_MSC_VER
+static void BadJump( void )
+{
+ Com_Error( ERR_DROP, "program tried to execute code at bad location inside VM" );
+}
-#if defined(__MINGW32__) || defined(MACOS_X) // _ is prepended to compiled symbols
-#define CMANG(sym) "_"#sym
+
+static void BadStack( void )
+{
+ Com_Error( ERR_DROP, "program tried to overflow program stack" );
+}
+
+
+static void BadOpStack( void )
+{
+ Com_Error( ERR_DROP, "program tried to overflow opcode stack" );
+}
+
+
+static void BadData( void )
+{
+#ifdef DEBUG_VM
+ Com_Error( ERR_DROP, "program tried to read/write out of data segment at %i", errParam );
#else
-#define CMANG(sym) #sym
-#endif
-
-extern "C" {
-
-int callMask = 0; // SHOULD be static, can't be because gcc sucks
-static int callProgramStack;
-static int* callOpStack;
-static int callSyscallNum;
-
-void callAsmCall() // SHOULD be static, can't be because gcc sucks
-{
- vm_t* savedVM = currentVM;
-
- // save the stack to allow recursive VM entry
- currentVM->programStack = callProgramStack - 4;
- *(int *)((byte *)currentVM->dataBase + callProgramStack + 4) = callSyscallNum;
- //VM_LogSyscalls( (int *)((byte *)currentVM->dataBase + callProgramStack + 4) );
- *(callOpStack+1) = currentVM->systemCall( (intptr_t *)((byte *)currentVM->dataBase + callProgramStack + 4) );
-
- currentVM = savedVM;
-}
-
-void doAsmCall();
-// Note the C space function AsmCall is never actually called, and is in fact
-// arbitrarily named (though this is not true for the MSC version). When a vm
-// makes a system call, control jumps straight to the doAsmCall label.
-void AsmCall( void ) {
- asm volatile(
- CMANG(doAsmCall) ": \n" \
- " movl (%%edi),%%eax \n" \
- " subl $4,%%edi \n" \
- " orl %%eax,%%eax \n" \
- " jl systemCall \n" \
- " shll $2,%%eax \n" \
- " addl %3,%%eax \n" \
- " call *(%%eax) \n" \
- " movl (%%edi),%%eax \n" \
- " andl " CMANG(callMask) ", %%eax \n" \
- " ret \n" \
- "systemCall: \n" \
- " negl %%eax \n" \
- " decl %%eax \n" \
- " movl %%eax,%0 \n" \
- " movl %%esi,%1 \n" \
- " movl %%edi,%2 \n" \
- " pushl %%ecx \n" \
- " pushl %%esi \n" \
- " pushl %%edi \n" \
- " call " CMANG(callAsmCall) " \n" \
- " popl %%edi \n" \
- " popl %%esi \n" \
- " popl %%ecx \n" \
- " addl $4,%%edi \n" \
- " ret \n" \
- : "=m" (callSyscallNum), "=m" (callProgramStack), "=m" (callOpStack) \
- : "m" (instructionPointers) \
- : "ax", "di", "si", "cx" \
- );
-}
-
-};
-
-#undef CMANG
-
-static int asmCallPtr = (int)doAsmCall;
-
-#endif
-
-
-// this function is called directly by the generated code, as well as by the VM itself
-
-int VM_CallCompiled( vm_t* vm, int* args )
-{
- int stack[4096];
-
- int* const oldInstructionPointers = instructionPointers;
-
- currentVM = vm;
- instructionPointers = vm->instructionPointers;
-
- callMask = vm->dataMask;
-
- // we might be called recursively, so this might not be the very top
- int programStack = vm->programStack;
- int stackOnEntry = programStack;
-
- // set up the stack frame
- byte* const image = vm->dataBase;
-
- programStack -= 48;
-
- *(int *)&image[ programStack + 44] = args[9];
- *(int *)&image[ programStack + 40] = args[8];
- *(int *)&image[ programStack + 36] = args[7];
- *(int *)&image[ programStack + 32] = args[6];
- *(int *)&image[ programStack + 28] = args[5];
- *(int *)&image[ programStack + 24] = args[4];
- *(int *)&image[ programStack + 20] = args[3];
- *(int *)&image[ programStack + 16] = args[2];
- *(int *)&image[ programStack + 12] = args[1];
- *(int *)&image[ programStack + 8 ] = args[0];
- *(int *)&image[ programStack + 4 ] = 0; // return stack
- *(int *)&image[ programStack ] = -1; // will terminate the loop on return
-
- // off we go into generated code...
- void* opStack = &stack;
-
-#ifdef _MSC_VER
- void* codeBase = vm->codeBase; // dunno WHY vc needs this deref'd by hand, but it does
- __asm {
- pushad
- mov esi, programStack
- mov edi, opStack
- call codeBase
- mov programStack, esi
- mov opStack, edi
- popad
- }
-#else
- unsigned eax;
- unsigned ebx;
- unsigned ecx;
- unsigned edx;
-
- __asm__ volatile(
- "call *%6"
- : "+S" (programStack), "+D" (opStack),
- "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
- : "mr" (vm->codeBase)
- : "cc", "memory"
- );
-#endif
-
- if ( opStack != &stack[1] ) {
- Com_Error( ERR_DROP, "opStack corrupted in compiled code" );
- }
- if ( programStack != stackOnEntry - 48 ) {
- Com_Error( ERR_DROP, "programStack corrupted in compiled code" );
- }
-
- vm->programStack = stackOnEntry;
-
- // in case we were recursively called by another vm
- instructionPointers = oldInstructionPointers;
- int result = stack[1];//*(int *)opStack;
- return result;
-}
-
-
-static void VM_Destroy_Compiled(vm_t* self)
-{
-#ifdef VM_X86_MMAP
- munmap(self->codeBase, self->codeLength);
-#elif _WIN32
- VirtualFree(self->codeBase, 0, MEM_RELEASE);
-#else
- free(self->codeBase);
+ Com_Error( ERR_DROP, "program tried to read/write out of data segment" );
#endif
}
-static int Constant4()
+static void (*const errJumpPtr)(void) = ErrJump;
+static void (*const badJumpPtr)(void) = BadJump;
+static void (*const badStackPtr)(void) = BadStack;
+static void (*const badOpStackPtr)(void) = BadOpStack;
+static void (*const badDataPtr)(void) = BadData;
+
+
+static void VM_FreeBuffers( void )
{
- int v = code[pc] | (code[pc+1]<<8) | (code[pc+2]<<16) | (code[pc+3]<<24);
- pc += 4;
- return v;
+ // should be freed in reversed allocation order
+ Z_Free( instructionOffsets );
+ Z_Free( inst );
}
-static int Constant1()
+
+#if id386
+static qbool HasSSEFP( void )
{
- int v = code[pc];
- pc += 1;
- return v;
+ return ( cpu_features & CPU_SSE ) && ( cpu_features & CPU_SSE2 );
}
+#endif
+
static void Emit1( int v )
{
- buf[ compiledOfs ] = v;
+ if ( code )
+ {
+ code[ compiledOfs ] = v;
+ }
compiledOfs++;
+
LastCommand = LAST_COMMAND_NONE;
}
+
static void Emit4( int v )
{
Emit1( v & 255 );
@@ -335,23 +265,53 @@ static void Emit4( int v )
Emit1( ( v >> 24 ) & 255 );
}
-static int Hex( int c ) {
- if ( c >= 'a' && c <= 'f' ) {
- return 10 + c - 'a';
+
+#if idx64
+static void Emit8( int64_t v )
+{
+ Emit1( ( v >> 0 ) & 255 );
+ Emit1( ( v >> 8 ) & 255 );
+ Emit1( ( v >> 16 ) & 255 );
+ Emit1( ( v >> 24 ) & 255 );
+ Emit1( ( v >> 32 ) & 255 );
+ Emit1( ( v >> 40 ) & 255 );
+ Emit1( ( v >> 48 ) & 255 );
+ Emit1( ( v >> 56 ) & 255 );
+}
+#endif
+
+
+static void EmitPtr( const void *ptr )
+{
+#if idx64
+ Emit8( (intptr_t)ptr );
+#else
+ Emit4( (intptr_t)ptr );
+#endif
+}
+
+
+static int Hex( int c )
+{
+ if ( c >= '0' && c <= '9' ) {
+ return c - '0';
}
if ( c >= 'A' && c <= 'F' ) {
return 10 + c - 'A';
}
- if ( c >= '0' && c <= '9' ) {
- return c - '0';
+ if ( c >= 'a' && c <= 'f' ) {
+ return 10 + c - 'a';
}
+ VM_FreeBuffers();
Com_Error( ERR_DROP, "Hex: bad char '%c'", c );
return 0;
}
-static void EmitString( const char *string ) {
+
+static void EmitString( const char *string )
+{
int c1, c2;
int v;
@@ -370,800 +330,2128 @@ static void EmitString( const char *string ) {
}
-static void EmitCommand(ELastCommand command)
+static void EmitRexString( const char *string )
{
- switch(command)
+#if idx64
+ Emit1( 0x48 );
+#endif
+ EmitString( string );
+}
+
+
+static void EmitAlign( int align )
+{
+ int i, n;
+
+ n = compiledOfs & ( align - 1 );
+
+ for ( i = 0; i < n ; i++ )
+ EmitString( "90" ); // nop
+}
+
+
+static void EmitCommand( ELastCommand command )
+{
+ switch( command )
{
case LAST_COMMAND_MOV_EDI_EAX:
EmitString( "89 07" ); // mov dword ptr [edi], eax
break;
+ case LAST_COMMAND_MOV_EAX_EDI:
+ EmitString( "8B 07" ); // mov eax, dword ptr [edi]
+ break;
+
case LAST_COMMAND_SUB_DI_4:
- EmitString( "83 EF 04" ); // sub edi, 4
+ EmitRexString( "83 EF 04" ); // sub edi, 4
break;
case LAST_COMMAND_SUB_DI_8:
- EmitString( "83 EF 08" ); // sub edi, 8
+ EmitRexString( "83 EF 08" ); // sub edi, 8
break;
+
+ case LAST_COMMAND_STORE_FLOAT_EDI:
+ {
+ const int oldOffset = compiledOfs;
+#if id386
+ if ( HasSSEFP() )
+#endif
+ EmitString( "f3 0f 11 07" ); // movss dword ptr [edi], xmm0
+#if id386
+ else
+ EmitString( "D9 1F" ); // fstp dword ptr [edi]
+#endif
+ floatStoreInstLength = compiledOfs - oldOffset;
+ break;
+ }
+
default:
break;
}
LastCommand = command;
}
-static void EmitAddEDI4(vm_t *vm) {
- if (LastCommand == LAST_COMMAND_SUB_DI_4 && jused[instruction-1] == 0)
- { // sub di,4
- compiledOfs -= 3;
- vm->instructionPointers[ instruction-1 ] = compiledOfs;
+
+static void EmitAddEDI4( vm_t *vm )
+{
+ if ( LastCommand == LAST_COMMAND_NONE )
+ {
+ EmitRexString( "83 C7 04" ); // add edi,4
return;
}
- if (LastCommand == LAST_COMMAND_SUB_DI_8 && jused[instruction-1] == 0)
- { // sub di,8
- compiledOfs -= 3;
- vm->instructionPointers[ instruction-1 ] = compiledOfs;
- EmitString( "83 EF 04" ); // sub edi,4
+
+ if ( LastCommand == LAST_COMMAND_SUB_DI_4 ) // sub edi, 4
+ {
+#if idx64
+ REWIND( 4 );
+#else
+ REWIND( 3 );
+#endif
+ LastCommand = LAST_COMMAND_NONE;
return;
}
- EmitString( "83 C7 04" ); // add edi,4
+
+ if ( LastCommand == LAST_COMMAND_SUB_DI_8 ) // sub edi, 8
+ {
+#if idx64
+ REWIND( 4 );
+#else
+ REWIND( 3 );
+#endif
+ EmitCommand( LAST_COMMAND_SUB_DI_4 );
+ return;
+ }
+
+ EmitRexString( "83 C7 04" ); // add edi,4
}
-static void EmitMovEAXEDI(vm_t *vm) {
- if (LastCommand == LAST_COMMAND_MOV_EDI_EAX)
- { // mov [edi], eax
- compiledOfs -= 2;
- vm->instructionPointers[ instruction-1 ] = compiledOfs;
+
+static void EmitMovEAXEDI( vm_t *vm )
+{
+ opcode_t pop = pop1;
+ pop1 = OP_UNDEF;
+
+ if ( LastCommand == LAST_COMMAND_NONE )
+ {
+ EmitString( "8B 07" ); // mov eax, dword ptr [edi]
return;
}
- if (pop1 == OP_DIVI || pop1 == OP_DIVU || pop1 == OP_MULI || pop1 == OP_MULU ||
- pop1 == OP_STORE4 || pop1 == OP_STORE2 || pop1 == OP_STORE1 )
+
+ if ( LastCommand == LAST_COMMAND_MOV_EAX_EDI )
+ return;
+
+ if ( LastCommand == LAST_COMMAND_MOV_EAX_EDI_CALL )
+ return;
+
+ if ( LastCommand == LAST_COMMAND_MOV_EDI_EAX ) // mov [edi], eax
+ {
+ REWIND( 2 );
+ LastCommand = LAST_COMMAND_NONE;
+ return;
+ }
+
+ if ( pop == OP_DIVI || pop == OP_DIVU || pop == OP_MULI || pop == OP_MULU ||
+ pop == OP_STORE4 || pop == OP_STORE2 || pop == OP_STORE1 )
{
return;
}
- if (pop1 == OP_CONST && buf[compiledOfs-6] == 0xC7 && buf[compiledOfs-5] == 0x07 )
- { // mov edi, 0x123456
- compiledOfs -= 6;
- vm->instructionPointers[ instruction-1 ] = compiledOfs;
- EmitString( "B8" ); // mov eax, 0x12345678
+
+ if ( LastCommand == LAST_COMMAND_MOV_EDI_CONST ) // mov dword ptr [edi], 0x12345678
+ {
+ REWIND( 6 );
+ if ( lastConst == 0 ) {
+ EmitString( "31 C0" ); // xor eax, eax
+ } else {
+ EmitString( "B8" ); // mov eax, 0x12345678
+ Emit4( lastConst );
+ }
+ return;
+ }
+
+ EmitString( "8B 07" ); // mov eax, dword ptr [edi]
+}
+
+
+void EmitMovECXEDI( vm_t *vm )
+{
+ opcode_t pop = pop1;
+ pop1 = OP_UNDEF;
+
+ if ( LastCommand == LAST_COMMAND_NONE )
+ {
+ EmitString( "8B 0F" ); // mov ecx, dword ptr [edi]
+ return;
+ }
+
+ if ( LastCommand == LAST_COMMAND_MOV_EAX_EDI_CALL )
+ {
+ EmitString( "89 C1" ); // mov ecx, eax
+ return;
+ }
+
+ if ( LastCommand == LAST_COMMAND_MOV_EAX_EDI ) // mov eax, dword ptr [edi]
+ {
+ REWIND( 2 );
+ EmitString( "8B 0F" ); // mov ecx, dword ptr [edi]
+ return;
+ }
+
+ if ( LastCommand == LAST_COMMAND_MOV_EDI_EAX ) // mov [edi], eax
+ {
+ REWIND( 2 );
+ EmitString( "89 C1" ); // mov ecx, eax
+ return;
+ }
+
+ if (pop == OP_DIVI || pop == OP_DIVU || pop == OP_MULI || pop == OP_MULU ||
+ pop == OP_STORE4 || pop == OP_STORE2 || pop == OP_STORE1 )
+ {
+ EmitString( "89 C1" ); // mov ecx, eax
+ return;
+ }
+
+ if ( LastCommand == LAST_COMMAND_MOV_EDI_CONST ) // mov dword ptr [edi], 0x12345678
+ {
+ REWIND( 6 );
+ EmitString( "B9" ); // mov ecx, 0x12345678
Emit4( lastConst );
return;
}
- EmitString( "8B 07" ); // mov eax, dword ptr [edi]
+
+ EmitString( "8B 0F" ); // mov ecx, dword ptr [edi]
}
-static qbool EmitMovEBXEDI(vm_t *vm, int andit) {
- if (LastCommand == LAST_COMMAND_MOV_EDI_EAX)
- { // mov [edi], eax
- compiledOfs -= 2;
- vm->instructionPointers[ instruction-1 ] = compiledOfs;
- EmitString( "8B D8"); // mov bx, eax
- return qfalse;
- }
- if (pop1 == OP_DIVI || pop1 == OP_DIVU || pop1 == OP_MULI || pop1 == OP_MULU ||
- pop1 == OP_STORE4 || pop1 == OP_STORE2 || pop1 == OP_STORE1 )
+
+static void EmitCheckReg( vm_t *vm, int reg, int size )
+{
+ int n;
+
+ if ( !( vm_rtChecks & 8 ) )
+ return;
+
+#ifdef DEBUG_VM
+ EmitString( "50" ); // push eax
+ EmitRexString( "B8" ); // mov eax, &errParam
+ EmitPtr( &errParam );
+ EmitString( "C7 00" ); // mov [rax], ip-1
+ Emit4( ip-1 );
+ EmitString( "58" ); // pop eax
+#endif
+
+ if ( reg == REG_EAX )
+ EmitString( "3D" ); // cmp eax, 0x12345678
+ else
+ EmitString( "81 F9" ); // cmp ecx, 0x12345678
+
+ Emit4( vm->dataMask - ( size - 1 ) ); // FIXME: use vm->dataSize?
+
+ // error reporting
+ EmitString( "0F 87" ); // ja +errorFunction
+ n = funcOffset[FUNC_DATA] - compiledOfs;
+ Emit4( n - 6 );
+}
+
+
+static int EmitLoadFloatEDI_SSE( vm_t *vm )
+{
+ // movss dword ptr [edi], xmm0
+ if ( LastCommand == LAST_COMMAND_STORE_FLOAT_EDI )
{
- EmitString( "8B D8"); // mov bx, eax
- return qfalse;
- }
- if (pop1 == OP_CONST && buf[compiledOfs-6] == 0xC7 && buf[compiledOfs-5] == 0x07 )
- { // mov edi, 0x123456
- compiledOfs -= 6;
- vm->instructionPointers[ instruction-1 ] = compiledOfs;
- EmitString( "BB" ); // mov ebx, 0x12345678
- if (andit) {
- Emit4( lastConst & andit );
- } else {
- Emit4( lastConst );
- }
- return qtrue;
+ if ( !vm )
+ return 1;
+ REWIND( floatStoreInstLength );
+ LastCommand = LAST_COMMAND_NONE;
+ return 1;
+ }
+
+ EmitString( "f3 0f 10 07" ); // movss xmm0, dword ptr [edi]
+ return 0;
+}
+
+
+#if id386
+static int EmitLoadFloatEDI_X87( vm_t *vm )
+{
+ // fstp dword ptr [edi]
+ if ( LastCommand == LAST_COMMAND_STORE_FLOAT_EDI )
+ {
+ if ( !vm )
+ return 1;
+ REWIND( 2 );
+ LastCommand = LAST_COMMAND_NONE;
+ return 1;
+ }
+
+ EmitString( "D9 07" ); // fld dword ptr [edi]
+ return 0;
+}
+#endif
+
+
+static int EmitLoadFloatEDI( vm_t *vm )
+{
+#if id386
+ if ( !HasSSEFP() )
+ return EmitLoadFloatEDI_X87( vm );
+#endif
+
+ return EmitLoadFloatEDI_SSE( vm );
+}
+
+
+const char *FarJumpStr( int op, int *n )
+{
+ switch ( op )
+ {
+ case OP_EQF:
+ case OP_EQ: *n = 2; return "0F 84"; // je
+
+ case OP_NEF:
+ case OP_NE: *n = 2; return "0F 85"; // jne
+
+ case OP_LTI: *n = 2; return "0F 8C"; // jl
+ case OP_LEI: *n = 2; return "0F 8E"; // jle
+ case OP_GTI: *n = 2; return "0F 8F"; // jg
+ case OP_GEI: *n = 2; return "0F 8D"; // jge
+
+ case OP_LTF:
+ case OP_LTU: *n = 2; return "0F 82"; // jb
+
+ case OP_LEF:
+ case OP_LEU: *n = 2; return "0F 86"; // jbe
+
+ case OP_GTF:
+ case OP_GTU: *n = 2; return "0F 87"; // ja
+
+ case OP_GEF:
+ case OP_GEU: *n = 2; return "0F 83"; // jae
+
+ case OP_JUMP: *n = 1; return "E9"; // jmp
+ };
+ return NULL;
+}
+
+
+void EmitJump( vm_t *vm, instruction_t *i, int op, int addr )
+{
+ const char *str;
+ int v, jump_size;
+
+ v = instructionOffsets[ addr ] - compiledOfs;
+
+ str = FarJumpStr( op, &jump_size );
+ EmitString( str );
+ Emit4( v - 4 - jump_size );
+}
+
+
+static void EmitCallAddr( vm_t *vm, int addr )
+{
+ int v;
+ v = instructionOffsets[ addr ] - compiledOfs;
+ EmitString( "E8" );
+ Emit4( v - 5 );
+}
+
+
+static void EmitCallOffset(func_t Func)
+{
+ int v;
+ v = funcOffset[ Func ] - compiledOfs;
+ EmitString( "E8" ); // call +funcOffset[ Func ]
+ Emit4( v - 5 );
+}
+
+
+#ifdef _WIN32
+#define SHADOW_BASE 40
+#else // linux/*BSD ABI
+#define SHADOW_BASE 8
+#endif
+
+#define PUSH_STACK 32
+#define PARAM_STACK 128
+
+static void EmitCallFunc(vm_t *vm)
+{
+ static int sysCallOffset = 0;
+ int n;
+
+ EmitString( "85 C0" ); // test eax, eax
+ EmitString( "7C" ); // jl +offset (SystemCall)
+ Emit1( sysCallOffset ); // will be valid after first pass
+ sysCallOffset = compiledOfs;
+
+ // jump target range check
+ if ( vm_rtChecks & 4 ) {
+ EmitString( "3D" ); // cmp eax, vm->instructionCount
+ Emit4( vm->instructionCount );
+ EmitString( "0F 83" ); // jae +funcOffset[FUNC_ERRJ]
+ n = funcOffset[FUNC_ERRJ] - compiledOfs;
+ Emit4( n - 6 );
+ }
+
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
+
+ // save proc base and programStack
+ EmitString( "55" ); // push ebp
+ EmitString( "56" ); // push esi
+
+ // calling another vm function
+#if idx64
+ EmitString( "41 FF 14 C0" ); // call dword ptr [r8+rax*8]
+#else
+ EmitString( "8D 0C 85" ); // lea ecx, [vm->instructionPointers+eax*4]
+ EmitPtr( instructionPointers );
+ EmitString( "FF 11" ); // call dword ptr [ecx]
+#endif
+
+ // restore proc base and programStack so there is
+ // no need to validate programStack anymore
+ EmitString( "5E" ); // pop esi
+ EmitString( "5D" ); // pop ebp
+
+ EmitString( "C3" ); // ret
+
+sysCallOffset = compiledOfs - sysCallOffset;
+
+ // systemCall:
+ // convert negative num to system call number
+ // and store right before the first arg
+ EmitString( "F7 D0" ); // not eax
+
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
+
+ // we may jump here from ConstOptimize() also
+funcOffset[FUNC_SYSC] = compiledOfs;
+
+#if idx64
+ // allocate stack for shadow(win32)+parameters
+ EmitString( "48 81 EC" ); // sub rsp, 200
+ Emit4( SHADOW_BASE + PUSH_STACK + PARAM_STACK );
+
+ // save scratch registers
+ EmitString( "48 8D 54 24" ); // lea rdx, [rsp+SHADOW_BASE]
+ Emit1( SHADOW_BASE );
+ EmitString( "48 89 32" ); // mov [rdx+00], rsi
+ EmitString( "48 89 7A 08" ); // mov [rdx+08], rdi
+ EmitString( "4C 89 42 10" ); // mov [rdx+16], r8
+ EmitString( "4C 89 4A 18" ); // mov [rdx+24], r9
+
+ // ecx = &int64_params[0]
+ EmitString( "48 8D 4C 24" ); // lea rcx, [rsp+SHADOW_BASE+PUSH_STACK]
+ Emit1( SHADOW_BASE + PUSH_STACK );
+
+ // save syscallNum
+ EmitString( "48 89 01" ); // mov [rcx], rax
+
+ // vm->programStack = programStack - 4;
+ EmitString( "48 BA" ); // mov rdx, &vm->programStack
+ EmitPtr( &vm->programStack );
+ EmitString( "8D 46 FC" ); // lea eax, [esi-4]
+ EmitString( "89 02" ); // mov [rdx], eax
+
+ // params = (vm->dataBase + programStack + 8);
+ EmitString( "48 8D 74 33 08" ); // lea rsi, [rbx+rsi+8]
+
+ // rcx = &int64_params[1]
+ EmitString( "48 83 C1 08" ); // add rcx, 8
+
+ // dest_params[1-15] = params[1-15];
+ EmitString( "31 D2" ); // xor edx, edx
+ // loop
+ EmitString( "48 63 04 96" ); // movsxd rax, dword [rsi+rdx*4]
+ EmitString( "48 89 04 D1" ); // mov qword ptr[rcx+rdx*8], rax
+ EmitString( "48 83 C2 01" ); // add rdx, 1
+ EmitString( "48 83 FA" ); // cmp rdx, 15
+ Emit1( (PARAM_STACK/8) - 1 );
+ EmitString( "7C EE" ); // jl -18
+
+#ifdef _WIN32
+ // rcx = &int64_params[0]
+ EmitString( "48 83 E9 08" ); // sub rcx, 8
+#else // linux/*BSD ABI
+ // rdi = &int64_params[0]
+ EmitString( "48 8D 79 F8" ); // lea rdi, [rcx-8]
+#endif
+
+ // currentVm->systemCall( param );
+ EmitString( "41 FF 14 24" ); // call qword [r12]
+
+ // restore registers
+ EmitString( "48 8D 54 24" ); // lea rdx, [rsp+SHADOW_BASE]
+ Emit1( SHADOW_BASE );
+ EmitString( "48 8B 32" ); // mov rsi, [rdx+00]
+ EmitString( "48 8B 7A 08" ); // mov rdi, [rdx+08]
+ EmitString( "4C 8B 42 10" ); // mov r8, [rdx+16]
+ EmitString( "4C 8B 4A 18" ); // mov r9, [rdx+24]
+
+ // we added the return value: *(opstack+1) = eax
+ EmitAddEDI4( vm ); // add edi, 4
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );// mov [edi], eax
+
+ // return stack
+ EmitString( "48 81 C4" ); // add rsp, 200
+ Emit4( SHADOW_BASE + PUSH_STACK + PARAM_STACK );
+
+ EmitRexString( "8D 2C 33" ); // lea rbp, [rbx+rsi]
+
+ EmitString( "C3" ); // ret
+
+#else // i386
+
+ // params = (int *)((byte *)currentVM->dataBase + programStack + 4);
+ EmitString( "8D 4D 04" ); // lea ecx, [ebp+4]
+
+ // function prologue
+ EmitString( "55" ); // push ebp
+ EmitRexString( "89 E5" ); // mov ebp, esp
+ EmitRexString( "83 EC 04" ); // sub esp, 4
+ // align stack before call
+ EmitRexString( "83 E4 F0" ); // and esp, -16
+
+ // ABI note: esi/edi must not change during call!
+
+ // currentVM->programStack = programStack - 4;
+ EmitString( "8D 56 FC" ); // lea edx, [esi-4]
+ EmitString( "89 15" ); // mov [&vm->programStack], edx
+ EmitPtr( &vm->programStack );
+
+ // params[0] = syscallNum
+ EmitString( "89 01" ); // mov [ecx], eax
+
+ // cdecl - set params
+ EmitString( "89 0C 24" ); // mov [esp], ecx
+
+ // currentVm->systemCall( param );
+ EmitString( "FF 15" ); // call dword ptr [¤tVM->systemCall]
+ EmitPtr( &vm->systemCall );
+
+ // we added the return value: *(opstack+1) = eax
+#if 0
+ EmitAddEDI4( vm ); // add edi, 4
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );// mov [edi], eax
+#else // break dependency from edi value?
+ EmitString( "89 47 04" ); // mov [edi+4], eax
+ EmitAddEDI4( vm ); // add edi, 4
+#endif
+
+ // function epilogue
+ EmitRexString( "89 EC" ); // mov esp, ebp
+ EmitString( "5D" ); // pop ebp
+ EmitString( "C3" ); // ret
+#endif
+}
+
+
+#if id386
+static void EmitFTOLFunc(vm_t *vm)
+{
+ EmitRexString( "B8" ); // mov eax, &fp_cw[0]
+ EmitPtr( &fp_cw[0] );
+ EmitString( "9B D9 38" ); // fnstcw word ptr [eax]
+ EmitString( "D9 68 04" ); // fldcw word ptr [eax+4]
+ EmitString( "DB 1F" ); // fistp dword ptr [edi]
+ EmitString( "D9 28" ); // fldcw word ptr [eax]
+ EmitString( "C3" ); // ret
+}
+#endif
+
+
+static void EmitBCPYFunc(vm_t *vm)
+{
+ // FIXME: range check
+ EmitString( "56" ); // push esi
+ EmitString( "57" ); // push edi
+ EmitString( "8B 37" ); // mov esi,[edi]
+ EmitString( "8B 7F FC" ); // mov edi,[edi-4]
+ EmitString( "B8" ); // mov eax, datamask
+ Emit4( vm->dataMask );
+ EmitString( "21 C6" ); // and esi, eax
+ EmitString( "21 C7" ); // and edi, eax
+#if idx64
+ EmitString( "48 01 DE" ); // add rsi, rbx
+ EmitString( "48 01 DF" ); // add rdi, rbx
+#else
+ EmitString( "03 F3" ); // add esi, ebx
+ EmitString( "03 FB" ); // add edi, ebx
+#endif
+ EmitString( "F3 A5" ); // rep movsd
+ EmitString( "5F" ); // pop edi
+ EmitString( "5E" ); // pop esi
+ EmitCommand( LAST_COMMAND_SUB_DI_8 ); // sub edi, 8
+ EmitString( "C3" ); // ret
+}
+
+
+static void EmitPSOFFunc(vm_t *vm)
+{
+ EmitRexString( "B8" ); // mov eax, badJumpPtr
+ EmitPtr( &badStackPtr );
+ EmitString( "FF 10" ); // call [eax]
+ EmitString( "C3" ); // ret
+}
+
+
+static void EmitOSOFFunc(vm_t *vm)
+{
+ EmitRexString( "B8" ); // mov eax, badOptackPtr
+ EmitPtr( &badOpStackPtr );
+ EmitString( "FF 10" ); // call [eax]
+ EmitString( "C3" ); // ret
+}
+
+
+static void EmitBADJFunc(vm_t *vm)
+{
+ EmitRexString( "B8" ); // mov eax, badJumpPtr
+ EmitPtr( &badJumpPtr );
+ EmitString( "FF 10" ); // call [eax]
+ EmitString( "C3" ); // ret
+}
+
+
+static void EmitERRJFunc(vm_t *vm)
+{
+ EmitRexString( "B8" ); // mov eax, badJumpPtr
+ EmitPtr( &errJumpPtr );
+ EmitString( "FF 10" ); // call [eax]
+ EmitString( "C3" ); // ret
+}
+
+
+static void EmitDATAFunc(vm_t *vm)
+{
+ EmitRexString( "B8" ); // mov eax, badDataPtr
+ EmitPtr( &badDataPtr );
+ EmitString( "FF 10" ); // call [eax]
+ EmitString( "C3" ); // ret
+}
+
+
+#if id386
+/*
+=================
+EmitFCalcEDI
+=================
+*/
+static void EmitFCalcEDI(int op)
+{
+ switch ( op )
+ {
+ case OP_ADDF: EmitString( "D8 07" ); break; // fadd dword ptr [edi]
+ case OP_SUBF: EmitString( "D8 27" ); break; // fsub dword ptr [edi]
+ case OP_MULF: EmitString( "D8 0F" ); break; // fmul dword ptr [edi]
+ case OP_DIVF: EmitString( "D8 37" ); break; // fdiv dword ptr [edi]
+ default: Com_Error( ERR_DROP, "bad float op" ); break;
+ };
+}
+
+
+/*
+=================
+EmitFCalcPop
+=================
+*/
+static void EmitFCalcPop(int op)
+{
+ switch ( op )
+ {
+ case OP_ADDF: EmitString( "DE C1" ); break; // faddp
+ case OP_SUBF: EmitString( "DE E9" ); break; // fsubp
+ case OP_MULF: EmitString( "DE C9" ); break; // fmulp
+ case OP_DIVF: EmitString( "DE F9" ); break; // fdivp
+ default: Com_Error( ERR_DROP, "bad opcode %02x", op ); break;
+ };
+}
+
+
+/*
+=================
+CommuteFloatOp
+=================
+*/
+static int CommuteFloatOp( int op )
+{
+ switch ( op ) {
+ case OP_LEF: return OP_GEF;
+ case OP_LTF: return OP_GTF;
+ case OP_GEF: return OP_LEF;
+ case OP_GTF: return OP_LTF;
+ default: return op;
+ }
+}
+#endif
+
+
+/*
+=================
+ConstOptimize
+=================
+*/
+static qboolean ConstOptimize(vm_t *vm)
+{
+ int v;
+ int op1;
+
+ op1 = ni->op;
+
+ switch ( op1 ) {
+
+ case OP_LOAD4:
+ EmitAddEDI4( vm );
+ if ( ISS8( ci->value ) ) {
+ EmitString( "8B 43" ); // mov eax, dword ptr [ebx+0x7F]
+ Emit1( ci->value );
+ } else {
+ EmitString( "8B 83" ); // mov eax, dword ptr [ebx+0x12345678]
+ Emit4( ci->value );
+ }
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX ); // mov dword ptr [edi], eax
+ ip += 1;
+ return qtrue;
+
+ case OP_LOAD2:
+ EmitAddEDI4( vm );
+ if ( ISS8( ci->value ) ) {
+ EmitString( "0F B7 43" ); // movzx eax, word ptr [ebx+0x7F]
+ Emit1( ci->value );
+ } else {
+ EmitString( "0F B7 83" ); // movzx eax, word ptr [ebx+0x12345678]
+ Emit4( ci->value );
+ }
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX ); // mov dword ptr [edi], eax
+ ip += 1;
+ return qtrue;
+
+ case OP_LOAD1:
+ EmitAddEDI4( vm );
+ if ( ISS8( ci->value ) ) {
+ EmitString( "0F B6 43" ); // movzx eax, byte ptr [ebx+0x7F]
+ Emit1( ci->value );
+ } else {
+ EmitString( "0F B6 83" ); // movzx eax, word ptr [ebx+0x12345678]
+ Emit4( ci->value );
+ }
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX ); // mov dword ptr [edi], eax
+ ip += 1;
+ return qtrue;
+
+ case OP_STORE4:
+ EmitMovEAXEDI( vm );
+ if ( !ci->value ) {
+ EmitString( "31 C9" ); // xor ecx, ecx
+ } else {
+ EmitString( "B9" ); // mov ecx, 0x12345678
+ Emit4( ci->value );
+ }
+ EmitCheckReg( vm, REG_EAX, 4 );
+ EmitString( "89 0C 03" ); // mov dword ptr [ebx + eax], ecx
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
+ ip += 1;
+ return qtrue;
+
+ case OP_STORE2:
+ EmitMovEAXEDI( vm );
+ if ( !ci->value ) {
+ EmitString( "31 C9" ); // xor ecx, ecx
+ } else {
+ EmitString( "B9" ); // mov ecx, 0x12345678
+ Emit4( ci->value );
+ }
+ EmitCheckReg( vm, REG_EAX, 2 );
+ EmitString( "66 89 0C 03" ); // mov word ptr [ebx + eax], cx
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
+ ip += 1;
+ return qtrue;
+
+ case OP_STORE1:
+ EmitMovEAXEDI( vm );
+ if ( !ci->value ) {
+ EmitString( "31 C9" ); // xor ecx, ecx
+ } else {
+ EmitString( "B9" ); // mov ecx, 0x12345678
+ Emit4( ci->value );
+ }
+ EmitCheckReg( vm, REG_EAX, 1 );
+ EmitString( "88 0C 03" ); // mov byte ptr [ebx + eax], cl
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
+ ip += 1;
+ return qtrue;
+
+ case OP_ADD:
+ v = ci->value;
+ EmitMovEAXEDI( vm );
+ if ( ISS8( v ) ) {
+ EmitString( "83 C0" ); // add eax, 0x7F
+ Emit1( v );
+ } else {
+ EmitString( "05" ); // add eax, 0x12345678
+ Emit4( v );
+ }
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );
+ ip += 1; // OP_ADD
+ return qtrue;
+
+ case OP_SUB:
+ v = ci->value;
+ EmitMovEAXEDI( vm );
+ if ( ISS8( v ) ) {
+ EmitString( "83 E8" ); // sub eax, 0x7F
+ Emit1( v );
+ } else {
+ EmitString( "2D" ); // sub eax, 0x12345678
+ Emit4( v );
+ }
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );
+ ip += 1;
+ return qtrue;
+
+ case OP_MULI:
+ v = ci->value;
+ EmitMovEAXEDI( vm );
+ if ( ISS8( v ) ) {
+ EmitString( "6B C0" ); // imul eax, 0x7F
+ Emit1( v );
+ } else {
+ EmitString( "69 C0" ); // imul eax, 0x12345678
+ Emit4( v );
+ }
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );
+ ip += 1;
+ return qtrue;
+
+ case OP_MULF:
+ case OP_DIVF:
+ case OP_ADDF:
+ case OP_SUBF:
+ v = ci->value;
+#if id386
+ if ( HasSSEFP() ) {
+#endif
+ EmitLoadFloatEDI( vm );
+ EmitString( "C7 45 00" ); // mov dword ptr [ebp], v
+ Emit4( v );
+ EmitString( "f3 0f 10 4d 00" ); // movss xmm1, dword ptr [ebp]
+ switch( op1 ) {
+ case OP_ADDF: EmitString( "0f 58 c1" ); break; // addps xmm0, xmm1
+ case OP_SUBF: EmitString( "0f 5c c1" ); break; // subps xmm0, xmm1
+ case OP_MULF: EmitString( "0f 59 c1" ); break; // mulps xmm0, xmm1
+ case OP_DIVF: EmitString( "0f 5e c1" ); break; // divps xmm0, xmm1
+ }
+#if id386
+ } else {
+ EmitLoadFloatEDI( vm );
+ EmitString( "C7 45 00" ); // mov [ebp], 0x12345678
+ Emit4( v );
+ EmitString( "D9 45 00" ); // fld dword ptr [ebp]
+ EmitFCalcPop( op1 ); // fmulp/fdivp/faddp/fsubp
+ }
+#endif
+ EmitCommand( LAST_COMMAND_STORE_FLOAT_EDI );
+ ip +=1;
+ return qtrue;
+
+ case OP_LSH:
+ v = ci->value;
+ if ( v < 0 || v > 31 )
+ break;
+ EmitMovEAXEDI( vm );
+ EmitString( "C1 E0" ); // shl eax, 0x12
+ Emit1( v );
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );
+ ip += 1; // OP_LSH
+ return qtrue;
+
+ case OP_RSHI:
+ v = ci->value;
+ if ( v < 0 || v > 31 )
+ break;
+ EmitMovEAXEDI( vm );
+ EmitString( "C1 F8" ); // sar eax, 0x12
+ Emit1( v );
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );
+ ip += 1;
+ return qtrue;
+
+ case OP_RSHU:
+ v = ci->value;
+ if ( v < 0 || v > 31 )
+ break;
+ EmitMovEAXEDI( vm );
+ EmitString( "C1 E8" ); // shr eax, 0x12
+ Emit1( v );
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );
+ ip += 1;
+ return qtrue;
+
+ case OP_BAND:
+ v = ci->value;
+ EmitMovEAXEDI( vm );
+ if ( ISU8( v ) ) {
+ EmitString( "83 E0" ); // and eax, 0x7F
+ Emit1( v );
+ } else {
+ EmitString( "25" ); // and eax, 0x12345678
+ Emit4( v );
+ }
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );
+ ip += 1;
+ return qtrue;
+
+ case OP_BOR:
+ v = ci->value;
+ EmitMovEAXEDI( vm );
+ if ( ISU8( v ) ) {
+ EmitString( "83 C8" ); // or eax, 0x7F
+ Emit1( v );
+ } else {
+ EmitString( "0D" ); // or eax, 0x12345678
+ Emit4( v );
+ }
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );
+ ip += 1;
+ return qtrue;
+
+ case OP_BXOR:
+ v = ci->value;
+ EmitMovEAXEDI( vm );
+ if ( ISU8( v ) ) {
+ EmitString( "83 F0" ); // xor eax, 0x7F
+ Emit1( v );
+ } else {
+ EmitString( "35" ); // xor eax, 0x12345678
+ Emit4( v );
+ }
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );
+ ip += 1;
+ return qtrue;
+
+ case OP_JUMP:
+ EmitJump( vm, ni, ni->op, ci->value );
+ ip += 1; // OP_JUMP
+ return qtrue;
+
+ case OP_CALL:
+#ifdef VM_LOG_SYSCALLS
+ // [dataBase + programStack + 0] = ip;
+ EmitString( "C7 45 00" ); // mov dword ptr [ebp], 0x12345678
+ Emit4( ip );
+#endif
+ v = ci->value;
+ // try to inline some syscalls
+#if id386
+ if ( HasSSEFP() ) {
+#endif
+ // we let the C run-time handle sin/cos because they'll do better than the x87 crap
+ if ( v == ~TRAP_SQRT ) {
+ EmitString( "f3 0f 10 45 08" ); // movss xmm0, dword ptr [ebp + 8]
+ EmitAddEDI4( vm );
+ EmitString( "f3 0f 51 c0" ); // sqrtss xmm0, xmm0
+ EmitCommand( LAST_COMMAND_STORE_FLOAT_EDI );
+ ip += 1;
+ return qtrue;
+ }
+#if id386
+ } else if ( v == ~TRAP_SIN || v == ~TRAP_COS || v == ~TRAP_SQRT ) {
+ EmitString( "D9 45 08" ); // fld dword ptr [ebp + 8]
+ switch ( v ) {
+ case ~TRAP_SQRT: EmitString( "D9 FA" ); break;
+ case ~TRAP_SIN: EmitString( "D9 FE" ); break;
+ case ~TRAP_COS: EmitString( "D9 FF" ); break;
+ }
+ EmitAddEDI4( vm );
+ EmitCommand( LAST_COMMAND_STORE_FLOAT_EDI ); // fstp dword ptr[edi]
+ ip += 1;
+ return qtrue;
+ }
+#endif
+
+ if ( v < 0 ) // syscall
+ {
+ EmitString( "B8" ); // mov eax, 0x12345678
+ Emit4( ~v );
+ EmitCallOffset( FUNC_SYSC );
+ LastCommand = LAST_COMMAND_MOV_EAX_EDI_CALL;
+ ip += 1; // OP_CALL
+ return qtrue;
+ }
+ EmitString( "55" ); // push ebp
+ EmitString( "56" ); // push rsi
+ EmitString( "53" ); // push rbx
+ EmitCallAddr( vm, v ); // call +addr
+ EmitString( "5B" ); // pop rbx
+ EmitString( "5E" ); // pop rsi
+ EmitString( "5D" ); // pop ebp
+ ip += 1; // OP_CALL
+ return qtrue;
+
+ case OP_EQF:
+ case OP_NEF:
+ case OP_LTF:
+ case OP_LEF:
+ case OP_GTF:
+ case OP_GEF:
+#if id386
+ if ( HasSSEFP() ) {
+#endif
+ EmitLoadFloatEDI( vm );
+ EmitCommand( LAST_COMMAND_SUB_DI_4 );
+ v = ci->value;
+ if ( v == 0 ) {
+ EmitString( "0f 57 c9" ); // xorps xmm1, xmm1
+ } else {
+ EmitString( "C7 45 00" ); // mov dword ptr [ebp], v
+ Emit4( v );
+ EmitString( "f3 0f 10 4d 00" ); // movss xmm1, dword ptr [ebp]
+ }
+ EmitString( "0f 2f c1" ); // comiss xmm0, xmm1
+ EmitJump( vm, ni, ni->op, ni->value );
+#if id386
+ } else {
+ EmitLoadFloatEDI( vm );
+ EmitCommand( LAST_COMMAND_SUB_DI_4 );
+ v = ci->value;
+ if ( v == 0 ) {
+ EmitString( "D9 EE" ); // fldz
+ } else {
+ EmitString( "C7 45 00" ); // mov [ebp], 0x12345678
+ Emit4( v );
+ EmitString( "D9 45 00" ); // fld dword ptr [ebp]
+ }
+ EmitString( "DF E9" ); // fucomip - requires a P6 class CPU (Pentium Pro)
+ EmitString( "DD D8" ); // fstp st(0)
+ EmitJump( vm, ni, CommuteFloatOp( ni->op ), ni->value );
+ }
+#endif
+ ip +=1;
+ return qtrue;
+
+ case OP_EQ:
+ case OP_NE:
+ case OP_GEI:
+ case OP_GTI:
+ case OP_GTU:
+ case OP_GEU:
+ case OP_LTU:
+ case OP_LEU:
+ case OP_LEI:
+ case OP_LTI:
+ EmitMovEAXEDI( vm );
+ EmitCommand( LAST_COMMAND_SUB_DI_4 );
+ v = ci->value;
+ if ( v == 0 && ( op1 == OP_EQ || op1 == OP_NE ) ) {
+ EmitString( "85 C0" ); // test eax, eax
+ } else {
+ if ( ISS8( v ) ) {
+ EmitString( "83 F8" ); // cmp eax, 0x7F
+ Emit1( v );
+ } else {
+ EmitString( "3D" ); // cmp eax, 0xFFFFFFFF
+ Emit4( v );
+ }
+ }
+ EmitJump( vm, ni, ni->op, ni->value );
+ ip += 1;
+ return qtrue;
+
+ default:
+ break;
}
- EmitString( "8B 1F" ); // mov ebx, dword ptr [edi]
return qfalse;
}
-void VM_Compile( vm_t* vm, const vmHeader_t* header )
+/*
+=================
+VM_FindMOps
+
+Search for known macro-op sequences
+=================
+*/
+static void VM_FindMOps(instruction_t *buf, int instructionCount)
{
- // floating point control word, for OP_CVFI
- // [0] used for saving the current mode
- // [1] all exceptions bits set, single-precision, round towards 0
- static int fpcw[2] = { 0x0000, 0x0F7F };
+ int i, v, op0;
+ instruction_t *ci;
- int op;
- int maxLength;
- int v;
- int i;
- qbool opt;
+ ci = buf;
+ i = 0;
- // allocate a very large temp buffer, we will shrink it later
- maxLength = header->codeLength * 8;
- buf = (byte*)Z_Malloc( maxLength );
- jused = (byte*)Z_Malloc(header->instructionCount + 2 );
+ while ( i < instructionCount )
+ {
+ op0 = ci->op;
+ if ( op0 == OP_LOCAL ) {
+ // OP_LOCAL + OP_LOCAL + OP_LOAD4 + OP_CONST + OP_XXX + OP_STORE4
+ if ( (ci+1)->op == OP_LOCAL && ci->value == (ci+1)->value && (ci+2)->op == OP_LOAD4 && (ci+3)->op == OP_CONST && (ci+4)->op != OP_UNDEF && (ci+5)->op == OP_STORE4 ) {
+ v = (ci+4)->op;
+ if ( v == OP_ADD ) {
+ ci->op = MOP_ADD4;
+ ci += 6; i += 6;
+ continue;
+ }
+ if ( v == OP_SUB ) {
+ ci->op = MOP_SUB4;
+ ci += 6; i += 6;
+ continue;
+ }
+ if ( v == OP_BAND ) {
+ ci->op = MOP_BAND4;
+ ci += 6; i += 6;
+ continue;
+ }
+ if ( v == OP_BOR ) {
+ ci->op = MOP_BOR4;
+ ci += 6; i += 6;
+ continue;
+ }
+ }
- Com_Memset(jused, 0, header->instructionCount+2);
+ // skip useless sequences
+ if ( (ci+1)->op == OP_LOCAL && (ci+0)->value == (ci+1)->value && (ci+2)->op == OP_LOAD4 && (ci+3)->op == OP_STORE4 ) {
+ ci->op = MOP_IGNORE4;
+ ci += 4; i += 4;
+ continue;
+ }
+ }
- // ensure that the optimisation pass knows about all the jump
- // table targets
- for( i = 0; i < vm->numJumpTableTargets; i++ ) {
- jused[ *(int *)(vm->jumpTableTargets + ( i * sizeof( int ) ) ) ] = 1;
+ ci++;
+ i++;
+ }
+}
+
+
+/*
+=================
+EmitMOPs
+=================
+*/
+static qboolean EmitMOPs(vm_t *vm, int op)
+{
+ int v, n;
+ switch ( op )
+ {
+ //[local] += CONST
+ case MOP_ADD4:
+ n = inst[ip+2].value;
+ v = ci->value; // local variable address
+ if ( ISS8( n ) ) {
+ if ( ISS8( v ) ) {
+ EmitString( "83 45" ); // add dword ptr [ebp + 0x7F], 0x12
+ Emit1( v );
+ Emit1( n );
+ } else {
+ EmitString( "83 85" ); // add dword ptr [ebp + 0x12345678], 0x12
+ Emit4( v );
+ Emit1( n );
+ }
+ } else {
+ if ( ISS8( v ) ) {
+ EmitString( "81 45" ); // add dword ptr [ebp + 0x7F], 0x12345678
+ Emit1( v );
+ Emit4( n );
+ } else {
+ EmitString( "81 85" ); // add dword ptr [ebp + 0x12345678], 0x12345678
+ Emit4( v );
+ Emit4( n );
+ }
+ }
+ ip += 5;
+ return qtrue;
+
+ //[local] -= CONST
+ case MOP_SUB4:
+ n = inst[ip+2].value;
+ v = ci->value; // local variable address
+ if ( ISS8( n ) ) {
+ if ( ISS8( v ) ) {
+ EmitString( "83 6D" ); // sub dword ptr [ebp + 0x7F], 0x12
+ Emit1( v );
+ Emit1( n );
+ } else {
+ EmitString( "83 AD" ); // sub dword ptr [ebp + 0x12345678], 0x12
+ Emit4( v );
+ Emit1( n );
+ }
+ } else {
+ if ( ISS8( v ) ) {
+ EmitString( "81 6D" ); // sub dword ptr [ebp + 0x7F], 0x12345678
+ Emit1( v );
+ Emit4( n );
+ } else {
+ EmitString( "81 AD" ); // sub dword ptr[esi+0x12345678], 0x12345678
+ Emit4( v );
+ Emit4( n );
+ }
+ }
+ ip += 5;
+ return qtrue;
+
+ //[local] &= CONST
+ case MOP_BAND4:
+ n = inst[ip+2].value;
+ v = ci->value; // local variable address
+ if ( ISS8( n ) ) {
+ if ( ISS8( v ) ) {
+ EmitString( "83 65" ); // and dword ptr [ebp + 0x7F], 0x12
+ Emit1( v );
+ Emit1( n );
+ } else {
+ EmitString( "83 A5" ); // and dword ptr [ebp + 0x12345678], 0x12
+ Emit4( v );
+ Emit1( n );
+ }
+ } else {
+ if ( ISS8( v ) ) {
+ EmitString( "81 65" ); // and dword ptr [ebp + 0x7F], 0x12345678
+ Emit1( v );
+ Emit4( n );
+ } else {
+ EmitString( "81 A5" ); // and dword ptr [ebp + 0x12345678], 0x12345678
+ Emit4( v );
+ Emit4( n );
+ }
+ }
+ ip += 5;
+ return qtrue;
+
+ //[local] |= CONST
+ case MOP_BOR4:
+ n = inst[ip+2].value;
+ v = ci->value; // local variable address
+ if ( ISS8( n ) ) {
+ if ( ISS8( v ) ) {
+ EmitString( "83 4D" ); // or dword ptr [ebp + 0x7F], 0x12
+ Emit1( v );
+ Emit1( n );
+ } else {
+ EmitString( "83 8D" ); // or dword ptr [ebp + 0x12345678], 0x12
+ Emit4( v );
+ Emit1( n );
+ }
+ } else {
+ if ( ISS8( v ) ) {
+ EmitString( "81 4D" ); // or dword ptr [ebp + 0x7F], 0x12345678
+ Emit1( v );
+ Emit4( n );
+ } else {
+ EmitString( "81 8D" ); // or dword ptr [ebp + 0x12345678], 0x12345678
+ Emit4( v );
+ Emit4( n );
+ }
+ }
+ ip += 5;
+ return qtrue;
+
+ // [local] = [local]
+ case MOP_IGNORE4:
+ ip += 3;
+ return qtrue;
+
+ };
+ return qfalse;
+}
+
+
+/*
+=================
+VM_Compile
+=================
+*/
+qboolean VM_Compile( vm_t *vm, vmHeader_t *header ) {
+ const char *errMsg;
+ int instructionCount;
+ int proc_base;
+ int proc_len;
+ int i, n, v;
+
+ inst = (instruction_t*)Z_Malloc((header->instructionCount + 8) * sizeof(instruction_t));
+ instructionOffsets = (int*)Z_Malloc( header->instructionCount * sizeof( int ) );
+
+ errMsg = VM_LoadInstructions( header, inst );
+ if ( !errMsg ) {
+ errMsg = VM_CheckInstructions( inst, vm->instructionCount, vm->jumpTableTargets, vm->numJumpTableTargets, vm->dataLength );
+ }
+ if ( errMsg ) {
+ VM_FreeBuffers();
+ Com_Printf( "VM_CompileX86 error: %s\n", errMsg );
+ return qfalse;
}
- for(pass=0;pass<2;pass++) {
- oc0 = -23423;
- oc1 = -234354;
- pop0 = -43435;
- pop1 = -545455;
+ VM_FindMOps( inst, vm->instructionCount );
+
+ code = NULL; // we will allocate memory later, after last defined pass
+ instructionPointers = NULL;
+
+ memset( funcOffset, 0, sizeof( funcOffset ) );
+
+ instructionCount = header->instructionCount;
+
+__compile:
+ pop1 = OP_UNDEF;
+ lastConst = 0;
// translate all instructions
- pc = 0;
- instruction = 0;
- code = (byte *)header + header->codeOffset;
+ ip = 0;
compiledOfs = 0;
-
LastCommand = LAST_COMMAND_NONE;
- while ( instruction < header->instructionCount ) {
- if ( compiledOfs > maxLength - 16 ) {
- Com_Error( ERR_FATAL, "VM_CompileX86: maxLength exceeded" );
+ proc_base = -1;
+ proc_len = 0;
+
+#if idx64
+ EmitString( "53" ); // push rbx
+ EmitString( "56" ); // push rsi
+ EmitString( "57" ); // push rdi
+ EmitString( "55" ); // push rbp
+ EmitString( "41 54" ); // push r12
+ EmitString( "41 55" ); // push r13
+ EmitString( "41 56" ); // push r14
+ EmitString( "41 57" ); // push r15
+
+ EmitRexString( "BB" ); // mov rbx, vm->dataBase
+ EmitPtr( vm->dataBase );
+
+ EmitString( "49 B8" ); // mov r8, vm->instructionPointers
+ EmitPtr( instructionPointers );
+
+ EmitString( "49 C7 C1" ); // mov r9, vm->dataMask
+ Emit4( vm->dataMask );
+
+ EmitString( "49 BC" ); // mov r12, vm->systemCall
+ EmitPtr( &vm->systemCall );
+
+ EmitString( "49 C7 C5" ); // mov r13, vm->stackBottom
+ Emit4( vm->stackBottom );
+
+ EmitRexString( "B8" ); // mov rax, &vm->programStack
+ EmitPtr( &vm->programStack );
+ EmitString( "8B 30" ); // mov esi, [rax]
+
+ EmitRexString( "B8" ); // mov rax, &vm->opStack
+ EmitPtr( &vm->opStack );
+ EmitRexString( "8B 38" ); // mov rdi, [rax]
+
+ EmitRexString( "B8" ); // mov rax, &vm->opStackTop
+ EmitPtr( &vm->opStackTop );
+ EmitString( "4C 8B 30" ); // mov r14, [rax]
+
+#else
+ EmitString( "60" ); // pushad
+
+ EmitRexString( "BB" ); // mov ebx, vm->dataBase
+ EmitPtr( vm->dataBase );
+
+ EmitString( "8B 35" ); // mov esi, [vm->programStack]
+ EmitPtr( &vm->programStack );
+
+ EmitString( "8B 3D" ); // mov edi, [vm->opStack]
+ EmitPtr( &vm->opStack );
+#endif
+
+ EmitCallOffset( FUNC_ENTR );
+
+#if idx64
+
+#ifdef DEBUG_VM
+ EmitRexString( "B8" ); // mov rax, &vm->programStack
+ EmitPtr( &vm->programStack );
+ EmitString( "89 30" ); // mov [rax], esi
+#endif
+
+ EmitRexString( "B8" ); // mov rax, &vm->opStack
+ EmitPtr( &vm->opStack );
+ EmitRexString( "89 38" ); // mov [rax], rdi
+
+ EmitString( "41 5F" ); // pop r15
+ EmitString( "41 5E" ); // pop r14
+ EmitString( "41 5D" ); // pop r13
+ EmitString( "41 5C" ); // pop r12
+ EmitString( "5D" ); // pop rbp
+ EmitString( "5F" ); // pop rdi
+ EmitString( "5E" ); // pop rsi
+ EmitString( "5B" ); // pop rbx
+#else
+
+#ifdef DEBUG_VM
+ EmitString( "89 35" ); // [vm->programStack], esi
+ EmitPtr( &vm->programStack );
+#endif
+
+ EmitString( "89 3D" ); // [vm->opStack], edi
+ EmitPtr( &vm->opStack );
+
+ EmitString( "61" ); // popad
+#endif
+
+ EmitString( "C3" ); // ret
+
+ EmitAlign( 4 );
+
+ // main function entry offset
+ funcOffset[FUNC_ENTR] = compiledOfs;
+
+ while ( ip < instructionCount )
+ {
+ instructionOffsets[ ip ] = compiledOfs;
+
+ ci = &inst[ ip ];
+ ni = &inst[ ip + 1 ];
+ ip++;
+
+ if ( ci->jused ) {
+ LastCommand = LAST_COMMAND_NONE;
+ pop1 = OP_UNDEF;
}
- vm->instructionPointers[ instruction ] = compiledOfs;
- instruction++;
+ switch ( ci->op ) {
- if ( pc > header->codeLength ) {
- Com_Error( ERR_FATAL, "VM_CompileX86: pc > header->codeLength" );
- }
-
- op = code[ pc ];
- pc++;
- switch ( op ) {
- case 0:
+ case OP_UNDEF:
+ case OP_IGNORE:
break;
+
case OP_BREAK:
- EmitString( "CC" ); // int 3
+ EmitString( "CC" ); // int 3
break;
+
case OP_ENTER:
- EmitString( "81 EE" ); // sub esi, 0x12345678
- Emit4( Constant4() );
+ v = ci->value;
+ if ( ISS8( v ) ) {
+ EmitString( "83 EE" ); // sub esi, 0x12
+ Emit1( v );
+ } else {
+ EmitString( "81 EE" ); // sub esi, 0x12345678
+ Emit4( v );
+ }
+
+ // locate endproc
+ for ( n = -1, i = ip + 1; i < instructionCount; i++ ) {
+ if ( inst[ i ].op == OP_PUSH && inst[ i + 1 ].op == OP_LEAVE ) {
+ n = i;
+ break;
+ }
+ }
+
+ // should never happen because equal check in VM_LoadInstructions() but anyway
+ if ( n == -1 ) {
+ VM_FreeBuffers();
+ Com_Printf( "VM_CompileX86 error: %s\n", "missing proc end" );
+ return qfalse;
+ }
+
+ proc_base = ip + 1;
+ proc_len = n - proc_base + 1 ;
+
+ // programStack overflow check
+ if ( vm_rtChecks & 1 ) {
+#if idx64
+ EmitString( "4C 39 EE" ); // cmp rsi, r13
+#else
+ EmitString( "81 FE" ); // cmp esi, vm->stackBottom
+ Emit4( vm->stackBottom );
+#endif
+ EmitString( "0F 82" ); // jb +funcOffset[FUNC_PSOF]
+ n = funcOffset[FUNC_PSOF] - compiledOfs;
+ Emit4( n - 6 );
+ }
+
+ // opStack overflow check
+ if ( vm_rtChecks & 2 ) {
+ EmitRexString( "8D 47" ); // lea eax, [edi+0x7F]
+ Emit1( ci->opStack );
+#if idx64
+ EmitString( "4C 39 F0" ); // cmp rax, r14
+#else
+ EmitString( "3B 05" ); // cmp eax, [&vm->opStackTop]
+ EmitPtr( &vm->opStackTop );
+#endif
+ EmitString( "0F 87" ); // ja +funcOffset[FUNC_OSOF]
+ n = funcOffset[FUNC_OSOF] - compiledOfs;
+ Emit4( n - 6 );
+ }
+
+ EmitRexString( "8D 2C 33" ); // lea ebp, [ebx+esi]
break;
+
case OP_CONST:
- if (code[pc+4] == OP_LOAD4) {
- EmitAddEDI4(vm);
- EmitString( "BB" ); // mov ebx, 0x12345678
- Emit4( (Constant4()&vm->dataMask) + (int)vm->dataBase);
- EmitString( "8B 03" ); // mov eax, dword ptr [ebx]
- EmitCommand(LAST_COMMAND_MOV_EDI_EAX); // mov dword ptr [edi], eax
- pc++; // OP_LOAD4
- instruction += 1;
+
+ // we can safely perform optimizations only in case if
+ // we are 100% sure that next instruction is not a jump label
+ if ( !ni->jused && ConstOptimize( vm ) )
break;
- }
- if (code[pc+4] == OP_LOAD2) {
- EmitAddEDI4(vm);
- EmitString( "BB" ); // mov ebx, 0x12345678
- Emit4( (Constant4()&vm->dataMask) + (int)vm->dataBase);
- EmitString( "0F B7 03" ); // movzx eax, word ptr [ebx]
- EmitCommand(LAST_COMMAND_MOV_EDI_EAX); // mov dword ptr [edi], eax
- pc++; // OP_LOAD4
- instruction += 1;
- break;
- }
- if (code[pc+4] == OP_LOAD1) {
- EmitAddEDI4(vm);
- EmitString( "BB" ); // mov ebx, 0x12345678
- Emit4( (Constant4()&vm->dataMask) + (int)vm->dataBase);
- EmitString( "0F B6 03" ); // movzx eax, byte ptr [ebx]
- EmitCommand(LAST_COMMAND_MOV_EDI_EAX); // mov dword ptr [edi], eax
- pc++; // OP_LOAD4
- instruction += 1;
- break;
- }
- if (code[pc+4] == OP_STORE4) {
- opt = EmitMovEBXEDI(vm, (vm->dataMask & ~3));
- EmitString( "B8" ); // mov eax, 0x12345678
- Emit4( Constant4() );
-// if (!opt) {
-// EmitString( "81 E3" ); // and ebx, 0x12345678
-// Emit4( vm->dataMask & ~3 );
-// }
- EmitString( "89 83" ); // mov dword ptr [ebx+0x12345678], eax
- Emit4( (int)vm->dataBase );
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
- pc++; // OP_STORE4
- instruction += 1;
- break;
- }
- if (code[pc+4] == OP_STORE2) {
- opt = EmitMovEBXEDI(vm, (vm->dataMask & ~1));
- EmitString( "B8" ); // mov eax, 0x12345678
- Emit4( Constant4() );
-// if (!opt) {
-// EmitString( "81 E3" ); // and ebx, 0x12345678
-// Emit4( vm->dataMask & ~1 );
-// }
- EmitString( "66 89 83" ); // mov word ptr [ebx+0x12345678], eax
- Emit4( (int)vm->dataBase );
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
- pc++; // OP_STORE4
- instruction += 1;
- break;
- }
- if (code[pc+4] == OP_STORE1) {
- opt = EmitMovEBXEDI(vm, vm->dataMask);
- EmitString( "B8" ); // mov eax, 0x12345678
- Emit4( Constant4() );
-// if (!opt) {
-// EmitString( "81 E3" ); // and ebx, 0x12345678
-// Emit4( vm->dataMask );
-// }
- EmitString( "88 83" ); // mov byte ptr [ebx+0x12345678], eax
- Emit4( (int)vm->dataBase );
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
- pc++; // OP_STORE4
- instruction += 1;
- break;
- }
- if (code[pc+4] == OP_ADD) {
- EmitString( "81 07" ); // add dword ptr [edi], 0x1234567
- Emit4( Constant4() );
- pc++; // OP_ADD
- instruction += 1;
- break;
- }
- if (code[pc+4] == OP_SUB) {
- EmitString( "81 2F" ); // sub dword ptr [edi], 0x1234567
- Emit4( Constant4() );
- pc++; // OP_ADD
- instruction += 1;
- break;
- }
- EmitAddEDI4(vm);
- EmitString( "C7 07" ); // mov dword ptr [edi], 0x12345678
- lastConst = Constant4();
+
+ EmitAddEDI4( vm ); // add edi, 4
+ EmitString( "C7 07" ); // mov dword ptr [edi], 0x12345678
+ lastConst = ci->value;
Emit4( lastConst );
- if (code[pc] == OP_JUMP) {
- jused[lastConst] = 1;
- }
+ LastCommand = LAST_COMMAND_MOV_EDI_CONST;
break;
+
case OP_LOCAL:
- EmitAddEDI4(vm);
- EmitString( "8D 86" ); // lea eax, [0x12345678 + esi]
- oc0 = oc1;
- oc1 = Constant4();
- Emit4( oc1 );
- EmitCommand(LAST_COMMAND_MOV_EDI_EAX); // mov dword ptr [edi], eax
+ // optimization: merge OP_LOCAL + OP_LOAD4
+ if ( ni->op == OP_LOAD4 ) {
+ EmitAddEDI4( vm ); // add edi, 4
+ v = ci->value;
+ if ( ISS8( v ) ) {
+ EmitString( "8B 45" ); // mov eax, dword ptr [ebp + 0x7F]
+ Emit1( v );
+ } else {
+ EmitString( "8B 85" ); // mov eax, dword ptr [ebp + 0x12345678]
+ Emit4( v );
+ }
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX ); // mov dword ptr [edi], eax
+ ip++;
+ break;
+ }
+
+ // optimization: merge OP_LOCAL + OP_LOAD2
+ if ( ni->op == OP_LOAD2 ) {
+ EmitAddEDI4( vm ); // add edi, 4
+ v = ci->value;
+ if ( ISS8( v ) ) {
+ EmitString( "0F B7 45" ); // movzx eax, word ptr [ebp + 0x7F]
+ Emit1( v );
+ } else {
+ EmitString( "0F B7 85" ); // movzx eax, word ptr [ebp + 0x12345678]
+ Emit4( v );
+ }
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX ); // mov dword ptr [edi], eax
+ ip++;
+ break;
+ }
+
+ // optimization: merge OP_LOCAL + OP_LOAD1
+ if ( ni->op == OP_LOAD1 ) {
+ EmitAddEDI4( vm ); // add edi, 4
+ v = ci->value;
+ if ( ISS8( v ) ) {
+ EmitString( "0F B6 45" ); // movzx eax, byte ptr [ebp + 0x7F]
+ Emit1( v );
+ } else {
+ EmitString( "0F B6 85" ); // movzx eax, byte ptr [ebp + 0x12345678]
+ Emit4( v );
+ }
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX ); // mov dword ptr [edi], eax
+ ip++;
+ break;
+ }
+
+ EmitAddEDI4( vm ); // add edi, 4
+ v = ci->value;
+ if ( ISS8( v ) ) {
+ EmitString( "8D 46" ); // lea eax, [esi + 0x7F]
+ Emit1( v );
+ } else {
+ EmitString( "8D 86" ); // lea eax, [esi + 0x12345678]
+ Emit4( v );
+ }
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );// mov dword ptr [edi], eax
break;
+
case OP_ARG:
- EmitMovEAXEDI(vm); // mov eax,dword ptr [edi]
- EmitString( "89 86" ); // mov dword ptr [esi+database],eax
- // FIXME: range check
- Emit4( Constant1() + (int)vm->dataBase );
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
+ EmitMovEAXEDI( vm ); // mov eax, dword ptr [edi]
+ v = ci->value;
+ if ( ISS8( v ) ) {
+ EmitString( "89 45" ); // mov dword ptr [ebp + 0x7F], eax
+ Emit1( v );
+ } else {
+ EmitString( "89 85" ); // mov dword ptr [ebp + 0x12345678], eax
+ Emit4( v );
+ }
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
break;
+
case OP_CALL:
- EmitString( "C7 86" ); // mov dword ptr [esi+database],0x12345678
- Emit4( (int)vm->dataBase );
- Emit4( pc );
- EmitString( "FF 15" ); // call asmCallPtr
- Emit4( (int)&asmCallPtr );
+ EmitMovEAXEDI( vm ); // mov eax, dword ptr [edi]
+ EmitCallOffset( FUNC_CALL ); // call +FUNC_CALL
break;
+
case OP_PUSH:
- EmitAddEDI4(vm);
+ EmitAddEDI4( vm ); // add edi, 4
break;
+
case OP_POP:
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
break;
+
case OP_LEAVE:
- v = Constant4();
- EmitString( "81 C6" ); // add esi, 0x12345678
- Emit4( v );
- EmitString( "C3" ); // ret
+#ifdef DEBUG_VM
+ v = ci->value;
+ if ( ISS8( v ) ) {
+ EmitString( "83 C6" ); // add esi, 0x12
+ Emit1( v );
+ } else {
+ EmitString( "81 C6" ); // add esi, 0x12345678
+ Emit4( v );
+ }
+#endif
+ EmitString( "C3" ); // ret
break;
+
case OP_LOAD4:
- if (code[pc] == OP_CONST && code[pc+5] == OP_ADD && code[pc+6] == OP_STORE4) {
- if (oc0 == oc1 && pop0 == OP_LOCAL && pop1 == OP_LOCAL) {
- compiledOfs -= 11;
- vm->instructionPointers[ instruction-1 ] = compiledOfs;
- }
- pc++; // OP_CONST
- v = Constant4();
- EmitMovEBXEDI(vm, vm->dataMask);
- if (v == 1 && oc0 == oc1 && pop0 == OP_LOCAL && pop1 == OP_LOCAL) {
- EmitString( "FF 83"); // inc dword ptr [ebx + 0x12345678]
- Emit4( (int)vm->dataBase );
- } else {
- EmitString( "8B 83" ); // mov eax, dword ptr [ebx + 0x12345678]
- Emit4( (int)vm->dataBase );
- EmitString( "05" ); // add eax, const
- Emit4( v );
- if (oc0 == oc1 && pop0 == OP_LOCAL && pop1 == OP_LOCAL) {
- EmitString( "89 83" ); // mov dword ptr [ebx+0x12345678], eax
- Emit4( (int)vm->dataBase );
- } else {
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
- EmitString( "8B 1F" ); // mov ebx, dword ptr [edi]
- EmitString( "89 83" ); // mov dword ptr [ebx+0x12345678], eax
- Emit4( (int)vm->dataBase );
- }
- }
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
- pc++; // OP_ADD
- pc++; // OP_STORE
- instruction += 3;
+ if ( LastCommand == LAST_COMMAND_MOV_EDI_EAX ) {
+ REWIND( 2 );
+ EmitCheckReg( vm, REG_EAX, 4 ); // range check eax
+ EmitString( "8B 04 03" ); // mov eax, dword ptr [ebx + eax]
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );// mov dword ptr [edi], eax
break;
}
-
- if (code[pc] == OP_CONST && code[pc+5] == OP_SUB && code[pc+6] == OP_STORE4) {
- if (oc0 == oc1 && pop0 == OP_LOCAL && pop1 == OP_LOCAL) {
- compiledOfs -= 11;
- vm->instructionPointers[ instruction-1 ] = compiledOfs;
- }
- EmitMovEBXEDI(vm, vm->dataMask);
- EmitString( "8B 83" ); // mov eax, dword ptr [ebx + 0x12345678]
- Emit4( (int)vm->dataBase );
- pc++; // OP_CONST
- v = Constant4();
- if (v == 1 && oc0 == oc1 && pop0 == OP_LOCAL && pop1 == OP_LOCAL) {
- EmitString( "FF 8B"); // dec dword ptr [ebx + 0x12345678]
- Emit4( (int)vm->dataBase );
- } else {
- EmitString( "2D" ); // sub eax, const
- Emit4( v );
- if (oc0 == oc1 && pop0 == OP_LOCAL && pop1 == OP_LOCAL) {
- EmitString( "89 83" ); // mov dword ptr [ebx+0x12345678], eax
- Emit4( (int)vm->dataBase );
- } else {
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
- EmitString( "8B 1F" ); // mov ebx, dword ptr [edi]
- EmitString( "89 83" ); // mov dword ptr [ebx+0x12345678], eax
- Emit4( (int)vm->dataBase );
- }
- }
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
- pc++; // OP_SUB
- pc++; // OP_STORE
- instruction += 3;
- break;
- }
-
- if (buf[compiledOfs-2] == 0x89 && buf[compiledOfs-1] == 0x07) {
- compiledOfs -= 2;
- vm->instructionPointers[ instruction-1 ] = compiledOfs;
- EmitString( "8B 80"); // mov eax, dword ptr [eax + 0x1234567]
- Emit4( (int)vm->dataBase );
- EmitCommand(LAST_COMMAND_MOV_EDI_EAX); // mov dword ptr [edi], eax
- break;
- }
- EmitMovEBXEDI(vm, vm->dataMask);
- EmitString( "8B 83" ); // mov eax, dword ptr [ebx + 0x12345678]
- Emit4( (int)vm->dataBase );
- EmitCommand(LAST_COMMAND_MOV_EDI_EAX); // mov dword ptr [edi], eax
+ EmitMovECXEDI( vm ); // mov ecx, dword ptr [edi]
+ EmitCheckReg( vm, REG_ECX, 4 ); // range check ecx
+ EmitString( "8B 04 0B" ); // mov eax, dword ptr [ebx + ecx]
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX ); // mov dword ptr [edi], eax
break;
+
case OP_LOAD2:
- EmitMovEBXEDI(vm, vm->dataMask);
- EmitString( "0F B7 83" ); // movzx eax, word ptr [ebx + 0x12345678]
- Emit4( (int)vm->dataBase );
- EmitCommand(LAST_COMMAND_MOV_EDI_EAX); // mov dword ptr [edi], eax
+ if ( LastCommand == LAST_COMMAND_MOV_EDI_EAX ) {
+ REWIND( 2 );
+ EmitCheckReg( vm, REG_EAX, 2 ); // range check eax
+ EmitString( "0F B7 04 03" ); // movzx eax, word ptr [ebx + eax]
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );// mov dword ptr [edi], eax
+ break;
+ }
+ EmitMovECXEDI( vm ); // mov ecx, dword ptr [edi]
+ EmitCheckReg( vm, REG_ECX, 2 ); // range check ecx
+ EmitString( "0F B7 04 0B" ); // movzx eax, word ptr [ebx + ecx]
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX ); // mov dword ptr [edi], eax
break;
+
case OP_LOAD1:
- EmitMovEBXEDI(vm, vm->dataMask);
- EmitString( "0F B6 83" ); // movzx eax, byte ptr [ebx + 0x12345678]
- Emit4( (int)vm->dataBase );
- EmitCommand(LAST_COMMAND_MOV_EDI_EAX); // mov dword ptr [edi], eax
+ if ( LastCommand == LAST_COMMAND_MOV_EDI_EAX ) {
+ REWIND( 2 );
+ EmitCheckReg( vm, REG_EAX, 1 ); // range check eax
+ EmitString( "0F B6 04 03" ); // movzx eax, byte ptr [ebx + eax]
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );// mov dword ptr [edi], eax
+ break;
+ }
+ EmitMovECXEDI( vm ); // mov ecx, dword ptr [edi]
+ EmitCheckReg( vm, REG_ECX, 1 ); // range check ecx
+ EmitString( "0F B6 04 0B" ); // movzx eax, byte ptr [ebx + ecx]
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX ); // mov dword ptr [edi], eax
break;
+
case OP_STORE4:
- EmitMovEAXEDI(vm);
- EmitString( "8B 5F FC" ); // mov ebx, dword ptr [edi-4]
-// if (pop1 != OP_CALL) {
-// EmitString( "81 E3" ); // and ebx, 0x12345678
-// Emit4( vm->dataMask & ~3 );
-// }
- EmitString( "89 83" ); // mov dword ptr [ebx+0x12345678], eax
- Emit4( (int)vm->dataBase );
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
+ EmitMovEAXEDI( vm ); // mov eax, dword ptr [edi]
+ EmitString( "8B 4F FC" ); // mov ecx, dword ptr [edi-4]
+ EmitCheckReg( vm, REG_ECX, 4 ); // range check
+ EmitString( "89 04 0B" ); // mov dword ptr [ebx + ecx], eax
+ EmitCommand( LAST_COMMAND_SUB_DI_8 ); // sub edi, 8
break;
+
case OP_STORE2:
- EmitMovEAXEDI(vm);
- EmitString( "8B 5F FC" ); // mov ebx, dword ptr [edi-4]
-// EmitString( "81 E3" ); // and ebx, 0x12345678
-// Emit4( vm->dataMask & ~1 );
- EmitString( "66 89 83" ); // mov word ptr [ebx+0x12345678], eax
- Emit4( (int)vm->dataBase );
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
+ EmitMovEAXEDI( vm ); // mov eax, dword ptr [edi]
+ EmitString( "8B 4F FC" ); // mov ecx, dword ptr [edi-4]
+ EmitCheckReg( vm, REG_ECX, 2 ); // range check
+ EmitString( "66 89 04 0B" ); // mov word ptr [ebx + ecx], ax
+ EmitCommand( LAST_COMMAND_SUB_DI_8 ); // sub edi, 8
break;
+
case OP_STORE1:
- EmitMovEAXEDI(vm);
- EmitString( "8B 5F FC" ); // mov ebx, dword ptr [edi-4]
-// EmitString( "81 E3" ); // and ebx, 0x12345678
-// Emit4( vm->dataMask );
- EmitString( "88 83" ); // mov byte ptr [ebx+0x12345678], eax
- Emit4( (int)vm->dataBase );
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
+ EmitMovEAXEDI( vm ); // mov eax, dword ptr [edi]
+ EmitString( "8B 4F FC" ); // mov ecx, dword ptr [edi-4]
+ EmitCheckReg( vm, REG_ECX, 1 ); // range check
+ EmitString( "88 04 0B" ); // mov byte ptr [ebx + ecx], eax
+ EmitCommand( LAST_COMMAND_SUB_DI_8 ); // sub edi, 8
break;
case OP_EQ:
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
- EmitString( "8B 47 04" ); // mov eax, dword ptr [edi+4]
- EmitString( "3B 47 08" ); // cmp eax, dword ptr [edi+8]
- EmitString( "75 06" ); // jne +6
- EmitString( "FF 25" ); // jmp [0x12345678]
- v = Constant4();
- jused[v] = 1;
- Emit4( (int)vm->instructionPointers + v*4 );
- break;
case OP_NE:
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
- EmitString( "8B 47 04" ); // mov eax, dword ptr [edi+4]
- EmitString( "3B 47 08" ); // cmp eax, dword ptr [edi+8]
- EmitString( "74 06" ); // je +6
- EmitString( "FF 25" ); // jmp [0x12345678]
- v = Constant4();
- jused[v] = 1;
- Emit4( (int)vm->instructionPointers + v*4 );
- break;
case OP_LTI:
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
- EmitString( "8B 47 04" ); // mov eax, dword ptr [edi+4]
- EmitString( "3B 47 08" ); // cmp eax, dword ptr [edi+8]
- EmitString( "7D 06" ); // jnl +6
- EmitString( "FF 25" ); // jmp [0x12345678]
- v = Constant4();
- jused[v] = 1;
- Emit4( (int)vm->instructionPointers + v*4 );
- break;
case OP_LEI:
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
- EmitString( "8B 47 04" ); // mov eax, dword ptr [edi+4]
- EmitString( "3B 47 08" ); // cmp eax, dword ptr [edi+8]
- EmitString( "7F 06" ); // jnle +6
- EmitString( "FF 25" ); // jmp [0x12345678]
- v = Constant4();
- jused[v] = 1;
- Emit4( (int)vm->instructionPointers + v*4 );
- break;
case OP_GTI:
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
- EmitString( "8B 47 04" ); // mov eax, dword ptr [edi+4]
- EmitString( "3B 47 08" ); // cmp eax, dword ptr [edi+8]
- EmitString( "7E 06" ); // jng +6
- EmitString( "FF 25" ); // jmp [0x12345678]
- v = Constant4();
- jused[v] = 1;
- Emit4( (int)vm->instructionPointers + v*4 );
- break;
case OP_GEI:
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
- EmitString( "8B 47 04" ); // mov eax, dword ptr [edi+4]
- EmitString( "3B 47 08" ); // cmp eax, dword ptr [edi+8]
- EmitString( "7C 06" ); // jnge +6
- EmitString( "FF 25" ); // jmp [0x12345678]
- v = Constant4();
- jused[v] = 1;
- Emit4( (int)vm->instructionPointers + v*4 );
- break;
case OP_LTU:
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
- EmitString( "8B 47 04" ); // mov eax, dword ptr [edi+4]
- EmitString( "3B 47 08" ); // cmp eax, dword ptr [edi+8]
- EmitString( "73 06" ); // jnb +6
- EmitString( "FF 25" ); // jmp [0x12345678]
- v = Constant4();
- jused[v] = 1;
- Emit4( (int)vm->instructionPointers + v*4 );
- break;
case OP_LEU:
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
- EmitString( "8B 47 04" ); // mov eax, dword ptr [edi+4]
- EmitString( "3B 47 08" ); // cmp eax, dword ptr [edi+8]
- EmitString( "77 06" ); // jnbe +6
- EmitString( "FF 25" ); // jmp [0x12345678]
- v = Constant4();
- jused[v] = 1;
- Emit4( (int)vm->instructionPointers + v*4 );
- break;
case OP_GTU:
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
- EmitString( "8B 47 04" ); // mov eax, dword ptr [edi+4]
- EmitString( "3B 47 08" ); // cmp eax, dword ptr [edi+8]
- EmitString( "76 06" ); // jna +6
- EmitString( "FF 25" ); // jmp [0x12345678]
- v = Constant4();
- jused[v] = 1;
- Emit4( (int)vm->instructionPointers + v*4 );
- break;
case OP_GEU:
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
- EmitString( "8B 47 04" ); // mov eax, dword ptr [edi+4]
- EmitString( "3B 47 08" ); // cmp eax, dword ptr [edi+8]
- EmitString( "72 06" ); // jnae +6
- EmitString( "FF 25" ); // jmp [0x12345678]
- v = Constant4();
- jused[v] = 1;
- Emit4( (int)vm->instructionPointers + v*4 );
+ EmitMovEAXEDI( vm ); // mov eax, dword ptr [edi]
+ EmitCommand( LAST_COMMAND_SUB_DI_8 ); // sub edi, 8
+ EmitString( "39 47 04" ); // cmp dword ptr [edi+4], eax
+ EmitJump( vm, ci, ci->op, ci->value );
break;
+
case OP_EQF:
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
- EmitString( "D9 47 04" ); // fld dword ptr [edi+4]
- EmitString( "D8 5F 08" ); // fcomp dword ptr [edi+8]
- EmitString( "DF E0" ); // fnstsw ax
- EmitString( "F6 C4 40" ); // test ah,0x40
- EmitString( "74 06" ); // je +6
- EmitString( "FF 25" ); // jmp [0x12345678]
- v = Constant4();
- jused[v] = 1;
- Emit4( (int)vm->instructionPointers + v*4 );
- break;
case OP_NEF:
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
- EmitString( "D9 47 04" ); // fld dword ptr [edi+4]
- EmitString( "D8 5F 08" ); // fcomp dword ptr [edi+8]
- EmitString( "DF E0" ); // fnstsw ax
- EmitString( "F6 C4 40" ); // test ah,0x40
- EmitString( "75 06" ); // jne +6
- EmitString( "FF 25" ); // jmp [0x12345678]
- v = Constant4();
- jused[v] = 1;
- Emit4( (int)vm->instructionPointers + v*4 );
- break;
case OP_LTF:
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
- EmitString( "D9 47 04" ); // fld dword ptr [edi+4]
- EmitString( "D8 5F 08" ); // fcomp dword ptr [edi+8]
- EmitString( "DF E0" ); // fnstsw ax
- EmitString( "F6 C4 01" ); // test ah,0x01
- EmitString( "74 06" ); // je +6
- EmitString( "FF 25" ); // jmp [0x12345678]
- v = Constant4();
- jused[v] = 1;
- Emit4( (int)vm->instructionPointers + v*4 );
- break;
case OP_LEF:
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
- EmitString( "D9 47 04" ); // fld dword ptr [edi+4]
- EmitString( "D8 5F 08" ); // fcomp dword ptr [edi+8]
- EmitString( "DF E0" ); // fnstsw ax
- EmitString( "F6 C4 41" ); // test ah,0x41
- EmitString( "74 06" ); // je +6
- EmitString( "FF 25" ); // jmp [0x12345678]
- v = Constant4();
- jused[v] = 1;
- Emit4( (int)vm->instructionPointers + v*4 );
- break;
case OP_GTF:
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
- EmitString( "D9 47 04" ); // fld dword ptr [edi+4]
- EmitString( "D8 5F 08" ); // fcomp dword ptr [edi+8]
- EmitString( "DF E0" ); // fnstsw ax
- EmitString( "F6 C4 41" ); // test ah,0x41
- EmitString( "75 06" ); // jne +6
- EmitString( "FF 25" ); // jmp [0x12345678]
- v = Constant4();
- jused[v] = 1;
- Emit4( (int)vm->instructionPointers + v*4 );
- break;
case OP_GEF:
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
- EmitString( "D9 47 04" ); // fld dword ptr [edi+4]
- EmitString( "D8 5F 08" ); // fcomp dword ptr [edi+8]
- EmitString( "DF E0" ); // fnstsw ax
- EmitString( "F6 C4 01" ); // test ah,0x01
- EmitString( "75 06" ); // jne +6
- EmitString( "FF 25" ); // jmp [0x12345678]
- v = Constant4();
- jused[v] = 1;
- Emit4( (int)vm->instructionPointers + v*4 );
- break;
+#if id386
+ if ( HasSSEFP() ) {
+#endif
+ EmitLoadFloatEDI( vm );
+ EmitString( "f3 0f 10 4f fc" ); // movss xmm1, dword ptr [edi-4]
+ EmitCommand( LAST_COMMAND_SUB_DI_8 ); // sub edi, 8
+ EmitString( "0f 2f c8" ); // comiss xmm1, xmm0
+ EmitJump( vm, ci, ci->op, ci->value );
+#if id386
+ } else {
+ EmitLoadFloatEDI( vm ); // fld dword ptr [edi]
+ EmitCommand( LAST_COMMAND_SUB_DI_8 ); // sub edi, 8
+ EmitString( "D9 47 04" ); // fld dword ptr [edi+4]
+ EmitString( "DF E9" ); // fucomip - requires a P6 class CPU (Pentium Pro)
+ EmitString( "DD D8" ); // fstp st(0)
+ EmitJump( vm, ci, ci->op, ci->value );
+ }
+#endif
+ pop1 = OP_UNDEF;
+ break;
+
case OP_NEGI:
- EmitString( "F7 1F" ); // neg dword ptr [edi]
+ EmitMovEAXEDI( vm ); // mov eax, dword ptr [edi]
+ EmitString( "F7 D8" ); // neg eax
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );// mov dword ptr [edi], eax
break;
+
case OP_ADD:
- EmitMovEAXEDI(vm); // mov eax, dword ptr [edi]
- EmitString( "01 47 FC" ); // add dword ptr [edi-4],eax
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
+ EmitMovEAXEDI( vm ); // mov eax, dword ptr [edi]
+ EmitString( "01 47 FC" ); // add dword ptr [edi-4],eax
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
break;
+
case OP_SUB:
- EmitMovEAXEDI(vm); // mov eax, dword ptr [edi]
- EmitString( "29 47 FC" ); // sub dword ptr [edi-4],eax
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
+ EmitMovEAXEDI( vm ); // mov eax, dword ptr [edi]
+ EmitString( "29 47 FC" ); // sub dword ptr [edi-4],eax
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
break;
+
case OP_DIVI:
- EmitString( "8B 47 FC" ); // mov eax,dword ptr [edi-4]
- EmitString( "99" ); // cdq
- EmitString( "F7 3F" ); // idiv dword ptr [edi]
- EmitString( "89 47 FC" ); // mov dword ptr [edi-4],eax
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
+ EmitString( "8B 47 FC" ); // mov eax,dword ptr [edi-4]
+ EmitString( "99" ); // cdq
+ EmitString( "F7 3F" ); // idiv dword ptr [edi]
+ EmitString( "89 47 FC" ); // mov dword ptr [edi-4],eax
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
break;
+
case OP_DIVU:
- EmitString( "8B 47 FC" ); // mov eax,dword ptr [edi-4]
- EmitString( "33 D2" ); // xor edx, edx
- EmitString( "F7 37" ); // div dword ptr [edi]
- EmitString( "89 47 FC" ); // mov dword ptr [edi-4],eax
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
+ EmitString( "8B 47 FC" ); // mov eax,dword ptr [edi-4]
+ EmitString( "33 D2" ); // xor edx, edx
+ EmitString( "F7 37" ); // div dword ptr [edi]
+ EmitString( "89 47 FC" ); // mov dword ptr [edi-4],eax
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
break;
+
case OP_MODI:
- EmitString( "8B 47 FC" ); // mov eax,dword ptr [edi-4]
- EmitString( "99" ); // cdq
- EmitString( "F7 3F" ); // idiv dword ptr [edi]
- EmitString( "89 57 FC" ); // mov dword ptr [edi-4],edx
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
+ EmitString( "8B 47 FC" ); // mov eax,dword ptr [edi-4]
+ EmitString( "99" ); // cdq
+ EmitString( "F7 3F" ); // idiv dword ptr [edi]
+ EmitString( "89 57 FC" ); // mov dword ptr [edi-4],edx
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
break;
+
case OP_MODU:
- EmitString( "8B 47 FC" ); // mov eax,dword ptr [edi-4]
- EmitString( "33 D2" ); // xor edx, edx
- EmitString( "F7 37" ); // div dword ptr [edi]
- EmitString( "89 57 FC" ); // mov dword ptr [edi-4],edx
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
+ EmitString( "8B 47 FC" ); // mov eax,dword ptr [edi-4]
+ EmitString( "33 D2" ); // xor edx, edx
+ EmitString( "F7 37" ); // div dword ptr [edi]
+ EmitString( "89 57 FC" ); // mov dword ptr [edi-4],edx
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
break;
+
case OP_MULI:
- EmitString( "8B 47 FC" ); // mov eax,dword ptr [edi-4]
- EmitString( "F7 2F" ); // imul dword ptr [edi]
- EmitString( "89 47 FC" ); // mov dword ptr [edi-4],eax
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
+ EmitMovEAXEDI( vm ); // mov eax, dword ptr [edi]
+ EmitString( "F7 6F FC" ); // imul eax, dword ptr [edi-4]
+ EmitString( "89 47 FC" ); // mov dword ptr [edi-4],eax
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
break;
+
case OP_MULU:
- EmitString( "8B 47 FC" ); // mov eax,dword ptr [edi-4]
- EmitString( "F7 27" ); // mul dword ptr [edi]
- EmitString( "89 47 FC" ); // mov dword ptr [edi-4],eax
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
+ EmitString( "8B 47 FC" ); // mov eax,dword ptr [edi-4]
+ EmitString( "F7 27" ); // mul dword ptr [edi]
+ EmitString( "89 47 FC" ); // mov dword ptr [edi-4],eax
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
break;
+
case OP_BAND:
- EmitMovEAXEDI(vm); // mov eax, dword ptr [edi]
- EmitString( "21 47 FC" ); // and dword ptr [edi-4],eax
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
+ EmitMovEAXEDI( vm ); // mov eax, dword ptr [edi]
+ EmitString( "21 47 FC" ); // and dword ptr [edi-4],eax
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
break;
+
case OP_BOR:
- EmitMovEAXEDI(vm); // mov eax, dword ptr [edi]
- EmitString( "09 47 FC" ); // or dword ptr [edi-4],eax
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
+ EmitMovEAXEDI( vm ); // mov eax, dword ptr [edi]
+ EmitString( "09 47 FC" ); // or dword ptr [edi-4],eax
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
break;
+
case OP_BXOR:
- EmitMovEAXEDI(vm); // mov eax, dword ptr [edi]
- EmitString( "31 47 FC" ); // xor dword ptr [edi-4],eax
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
+ EmitMovEAXEDI( vm ); // mov eax, dword ptr [edi]
+ EmitString( "31 47 FC" ); // xor dword ptr [edi-4],eax
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
break;
+
case OP_BCOM:
- EmitString( "F7 17" ); // not dword ptr [edi]
+ EmitMovEAXEDI( vm ); // mov eax, dword ptr [edi]
+ EmitString( "F7 D0" ); // not eax
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );// mov dword ptr [edi], eax
break;
+
case OP_LSH:
- EmitString( "8B 0F" ); // mov ecx, dword ptr [edi]
- EmitString( "D3 67 FC" ); // shl dword ptr [edi-4], cl
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
+ EmitMovECXEDI( vm ); // mov ecx, dword ptr [edi]
+ EmitString( "D3 67 FC" ); // shl dword ptr [edi-4], cl
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
break;
+
case OP_RSHI:
- EmitString( "8B 0F" ); // mov ecx, dword ptr [edi]
- EmitString( "D3 7F FC" ); // sar dword ptr [edi-4], cl
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
+ EmitMovECXEDI( vm ); // mov ecx, dword ptr [edi]
+ EmitString( "D3 7F FC" ); // sar dword ptr [edi-4], cl
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
break;
+
case OP_RSHU:
- EmitString( "8B 0F" ); // mov ecx, dword ptr [edi]
- EmitString( "D3 6F FC" ); // shr dword ptr [edi-4], cl
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
+ EmitMovECXEDI( vm ); // mov ecx, dword ptr [edi]
+ EmitString( "D3 6F FC" ); // shr dword ptr [edi-4], cl
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
break;
+
case OP_NEGF:
- EmitString( "D9 07" ); // fld dword ptr [edi]
- EmitString( "D9 E0" ); // fchs
- EmitString( "D9 1F" ); // fstp dword ptr [edi]
+ EmitLoadFloatEDI( vm );
+#if id386
+ if ( HasSSEFP() ) {
+#endif
+ EmitString( "0f 57 c9" ); // xorps xmm1, xmm1
+ EmitString( "0f 5c c8" ); // subps xmm1, xmm0
+ EmitString( "0f 28 c1" ); // movaps xmm0, xmm1
+#if id386
+ } else {
+ EmitString( "D9 E0" ); // fchs
+ }
+#endif
+ EmitCommand( LAST_COMMAND_STORE_FLOAT_EDI );
break;
+
case OP_ADDF:
- EmitString( "D9 47 FC" ); // fld dword ptr [edi-4]
- EmitString( "D8 07" ); // fadd dword ptr [edi]
- EmitString( "D9 5F FC" ); // fstp dword ptr [edi-4]
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
- break;
case OP_SUBF:
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
- EmitString( "D9 07" ); // fld dword ptr [edi]
- EmitString( "D8 67 04" ); // fsub dword ptr [edi+4]
- EmitString( "D9 1F" ); // fstp dword ptr [edi]
- break;
case OP_DIVF:
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
- EmitString( "D9 07" ); // fld dword ptr [edi]
- EmitString( "D8 77 04" ); // fdiv dword ptr [edi+4]
- EmitString( "D9 1F" ); // fstp dword ptr [edi]
- break;
case OP_MULF:
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
- EmitString( "D9 07" ); // fld dword ptr [edi]
- EmitString( "D8 4f 04" ); // fmul dword ptr [edi+4]
- EmitString( "D9 1F" ); // fstp dword ptr [edi]
+#if id386
+ if ( HasSSEFP() ) {
+#endif
+ EmitString( "f3 0f 10 47 fc" ); // movss xmm0, dword ptr [edi-4]
+ EmitString( "f3 0f 10 0f" ); // movss xmm1, dword ptr [edi]
+ switch( ci->op ) {
+ case OP_ADDF: EmitString( "0f 58 c1" ); break; // addps xmm0, xmm1
+ case OP_SUBF: EmitString( "0f 5c c1" ); break; // subps xmm0, xmm1
+ case OP_MULF: EmitString( "0f 59 c1" ); break; // mulps xmm0, xmm1
+ case OP_DIVF: EmitString( "0f 5e c1" ); break; // divps xmm0, xmm1
+ }
+ EmitString( "f3 0f 11 47 fc" ); // movss dword ptr [edi-4], xmm0
+#if id386
+ } else {
+ EmitString( "D9 47 FC" ); // fld dword ptr [edi-4]
+ EmitFCalcEDI( ci->op ); // fadd|fsub|fmul|fdiv dword ptr [edi]
+ EmitString( "D9 5F FC" ); // fstp dword ptr [edi-4]
+ }
+#endif
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
break;
+
case OP_CVIF:
- EmitString( "DB 07" ); // fild dword ptr [edi]
- EmitString( "D9 1F" ); // fstp dword ptr [edi]
+#if id386
+ if ( HasSSEFP() ) {
+#endif
+ EmitString( "f3 0f 2a 07" ); // cvtsi2ss xmm0, dword ptr [edi]
+#if id386
+ } else {
+ EmitString( "DB 07" ); // fild dword ptr [edi]
+ }
+#endif
+ EmitCommand( LAST_COMMAND_STORE_FLOAT_EDI );
break;
+
case OP_CVFI:
- EmitString( "D9 07" ); // fld dword ptr [edi]
- EmitString( "B8" ); // mov eax, &fp_cw[0]
- Emit4( (int)&fpcw[0] );
- EmitString( "9B D9 38" ); // fnstcw word ptr [eax]
- EmitString( "D9 68 04" ); // fldcw word ptr [eax+4]
- EmitString( "DB 1F" ); // fistp dword ptr [edi]
- EmitString( "D9 28" ); // fldcw word ptr [eax]
+#if id386
+ if ( HasSSEFP() ) {
+#endif
+ EmitLoadFloatEDI( vm );
+ EmitString( "f3 0f 2c c0" ); // cvttss2si eax, xmm0
+ EmitString( "89 07" ); // mov dword ptr [edi], eax
+#if id386
+ } else {
+ EmitLoadFloatEDI( vm ); // fld dword ptr [edi]
+ // call the library conversion function
+ EmitCallOffset( FUNC_FTOL ); // call +FUNC_FTOL
+ }
+#endif
break;
+
case OP_SEX8:
- EmitString( "0F BE 07" ); // movsx eax, byte ptr [edi]
- EmitCommand(LAST_COMMAND_MOV_EDI_EAX); // mov dword ptr [edi], eax
+ EmitString( "0F BE 07" ); // movsx eax, byte ptr [edi]
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );// mov dword ptr [edi], eax
break;
+
case OP_SEX16:
- EmitString( "0F BF 07" ); // movsx eax, word ptr [edi]
- EmitCommand(LAST_COMMAND_MOV_EDI_EAX); // mov dword ptr [edi], eax
+ EmitString( "0F BF 07" ); // movsx eax, word ptr [edi]
+ EmitCommand( LAST_COMMAND_MOV_EDI_EAX );// mov dword ptr [edi], eax
break;
case OP_BLOCK_COPY:
- // FIXME: range check
- EmitString( "56" ); // push esi
- EmitString( "57" ); // push edi
- EmitString( "8B 37" ); // mov esi,[edi]
- EmitString( "8B 7F FC" ); // mov edi,[edi-4]
- EmitString( "B9" ); // mov ecx,0x12345678
- Emit4( Constant4() >> 2 );
- EmitString( "B8" ); // mov eax, datamask
- Emit4( vm->dataMask );
- EmitString( "BB" ); // mov ebx, database
- Emit4( (int)vm->dataBase );
- EmitString( "23 F0" ); // and esi, eax
- EmitString( "03 F3" ); // add esi, ebx
- EmitString( "23 F8" ); // and edi, eax
- EmitString( "03 FB" ); // add edi, ebx
- EmitString( "F3 A5" ); // rep movsd
- EmitString( "5F" ); // pop edi
- EmitString( "5E" ); // pop esi
- EmitCommand(LAST_COMMAND_SUB_DI_8); // sub edi, 8
+ EmitString( "B9" ); // mov ecx, 0x12345678
+ Emit4( ci->value >> 2 );
+ EmitCallOffset( FUNC_BCPY );
break;
case OP_JUMP:
- EmitCommand(LAST_COMMAND_SUB_DI_4); // sub edi, 4
- EmitString( "8B 47 04" ); // mov eax,dword ptr [edi+4]
- // FIXME: range check
- EmitString( "FF 24 85" ); // jmp dword ptr [instructionPointers + eax * 4]
- Emit4( (int)vm->instructionPointers );
- break;
- default:
- Com_Error( ERR_DROP, "VM_CompileX86: bad opcode %i at offset %i", op, pc );
- }
- pop0 = pop1;
- pop1 = op;
- }
- }
+ EmitMovEAXEDI( vm ); // mov eax, dword ptr [edi]
+ EmitCommand( LAST_COMMAND_SUB_DI_4 ); // sub edi, 4
- // copy to an exact size buffer on the hunk
- vm->codeLength = compiledOfs;
-#ifdef VM_X86_MMAP
- vm->codeBase = (byte*)mmap(NULL, compiledOfs, PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
- if(vm->codeBase == (void*)-1)
- Com_Error(ERR_DROP, "VM_CompileX86: can't mmap memory");
-#elif _WIN32
- // allocate memory with EXECUTE permissions under windows.
- vm->codeBase = (byte*)VirtualAlloc(NULL, compiledOfs, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- if(!vm->codeBase)
- Com_Error(ERR_DROP, "VM_CompileX86: VirtualAlloc failed");
+ // jump target range check
+ if ( vm_rtChecks & 4 ) {
+ if ( proc_base != -1 ) {
+ // allow jump within local function scope only
+ EmitString( "89 C2" ); // mov edx, eax
+ if ( ISS8( proc_base ) ) {
+ EmitString( "83 EA" ); // sub edx, 0x7F
+ Emit1( proc_base );
+ } else {
+ EmitString( "81 EA" ); // sub edx, 0x12345678
+ Emit4( proc_base );
+ }
+ if ( ISS8( proc_len ) ) {
+ EmitString( "83 FA" ); // cmp edx, 0x7F
+ Emit1( proc_len );
+ } else {
+ EmitString( "81 FA" ); // cmp edx, 0x12345678
+ Emit4( proc_len );
+ }
+ } else {
+ EmitString( "3D" ); // cmp eax, 0x12345678
+ Emit4( vm->instructionCount );
+ }
+ EmitString( "0F 83" ); // jae +funcOffset[FUNC_BADJ]
+ n = funcOffset[FUNC_BADJ] - compiledOfs;
+ Emit4( n - 6 );
+ }
+#if idx64
+ EmitString( "41 FF 24 C0" ); // jmp dword ptr [r8 + rax*8]
#else
- vm->codeBase = malloc(compiledOfs);
+ EmitString( "FF 24 85" ); // jmp dword ptr [instructionPointers + eax * 4]
+ EmitPtr( instructionPointers );
+#endif
+ break;
+
+ case MOP_IGNORE4:
+ case MOP_ADD4:
+ case MOP_SUB4:
+ case MOP_BAND4:
+ case MOP_BOR4:
+
+ if ( !EmitMOPs( vm, ci->op ) )
+ Com_Error( ERR_FATAL, "VM_CompileX86: bad opcode %02X", ci->op );
+ break;
+
+ default:
+ Com_Error( ERR_FATAL, "VM_CompileX86: bad opcode %02X", ci->op );
+ VM_FreeBuffers();
+ return qfalse;
+ }
+
+ pop1 = (opcode_t)ci->op;
+ } // while( ip < header->instructionCount )
+
+ // ****************
+ // system functions
+ // ****************
+ EmitAlign( 4 );
+ funcOffset[FUNC_CALL] = compiledOfs;
+ EmitCallFunc( vm );
+
+#if id386
+ EmitAlign( 4 );
+ funcOffset[FUNC_FTOL] = compiledOfs;
+ EmitFTOLFunc( vm );
#endif
- Com_Memcpy( vm->codeBase, buf, compiledOfs );
+ EmitAlign( 4 );
+ funcOffset[FUNC_BCPY] = compiledOfs;
+ EmitBCPYFunc( vm );
-#ifdef VM_X86_MMAP
- if(mprotect(vm->codeBase, compiledOfs, PROT_READ|PROT_EXEC))
- Com_Error(ERR_DROP, "VM_CompileX86: mprotect failed");
-#elif _WIN32
- {
- DWORD oldProtect;
- // remove write permissions.
- if(!VirtualProtect(vm->codeBase, compiledOfs, PAGE_EXECUTE_READ, &oldProtect))
- Com_Error(ERR_DROP, "VM_CompileX86: VirtualProtect failed");
+ // ***************
+ // error functions
+ // ***************
+
+ // bad jump
+ EmitAlign( 4 );
+ funcOffset[FUNC_BADJ] = compiledOfs;
+ EmitBADJFunc( vm );
+
+ // error jump
+ EmitAlign( 4 );
+ funcOffset[FUNC_ERRJ] = compiledOfs;
+ EmitERRJFunc( vm );
+
+ // programStack overflow
+ EmitAlign( 4 );
+ funcOffset[FUNC_PSOF] = compiledOfs;
+ EmitPSOFFunc( vm );
+
+ // opStack overflow
+ EmitAlign( 4 );
+ funcOffset[FUNC_OSOF] = compiledOfs;
+ EmitOSOFFunc( vm );
+
+ // read/write access violation
+ EmitAlign( 4 );
+ funcOffset[FUNC_DATA] = compiledOfs;
+ EmitDATAFunc( vm );
+
+ EmitAlign( sizeof( intptr_t ) ); // for instructionPointers
+
+ n = header->instructionCount * sizeof( intptr_t );
+
+ if ( code == NULL ) {
+ code = (byte*)VM_Alloc_Compiled( vm, compiledOfs, n );
+ if ( code == NULL ) {
+ return qfalse;
+ }
+ instructionPointers = (intptr_t*)(byte*)(code + compiledOfs);
+ goto __compile;
}
-#endif
-
- Z_Free( buf );
- Z_Free( jused );
- Com_DPrintf( "VM file %s compiled to %i bytes of code\n", vm->name, compiledOfs );
-
- vm->destroy = VM_Destroy_Compiled;
// offset all the instruction pointers for the new location
for ( i = 0 ; i < header->instructionCount ; i++ ) {
- vm->instructionPointers[i] += (int)vm->codeBase;
+ if ( !inst[i].jused ) {
+ instructionPointers[ i ] = (intptr_t)badJumpPtr;
+ continue;
+ }
+ instructionPointers[ i ] = (intptr_t)vm->codeBase.ptr + instructionOffsets[ i ];
}
+
+ VM_FreeBuffers();
+
+#ifdef VM_X86_MMAP
+ if ( mprotect( vm->codeBase.ptr, compiledOfs + n, PROT_READ|PROT_EXEC ) ) {
+ VM_Destroy_Compiled( vm );
+ Com_Error( ERR_FATAL, "VM_CompileX86: mprotect failed" );
+ return qfalse;
+ }
+#elif _WIN32
+ {
+ DWORD oldProtect = 0;
+
+ // remove write permissions.
+ if ( !VirtualProtect( vm->codeBase.ptr, compiledOfs + n, PAGE_EXECUTE_READ, &oldProtect ) ) {
+ VM_Destroy_Compiled( vm );
+ Com_Error( ERR_FATAL, "VM_CompileX86: VirtualProtect failed" );
+ return qfalse;
+ }
+ }
+#endif
+
+ vm->destroy = VM_Destroy_Compiled;
+
+ Com_Printf( "VM file %s compiled to %i bytes of code\n", vm->name, compiledOfs );
+
+ return qtrue;
+}
+
+
+/*
+=================
+VM_Alloc_Compiled
+=================
+*/
+static void *VM_Alloc_Compiled(vm_t *vm, int codeLength, int tableLength)
+{
+ void *ptr;
+ int length;
+
+ length = codeLength + tableLength;
+#ifdef VM_X86_MMAP
+ ptr = mmap( NULL, length, PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0 );
+ if ( ptr == MAP_FAILED ) {
+ Com_Error( ERR_FATAL, "VM_CompileX86: mmap failed" );
+ return NULL;
+ }
+#elif _WIN32
+ // allocate memory with EXECUTE permissions under windows.
+ ptr = VirtualAlloc( NULL, length, MEM_COMMIT, PAGE_EXECUTE_READWRITE );
+ if ( !ptr ) {
+ Com_Error( ERR_FATAL, "VM_CompileX86: VirtualAlloc failed" );
+ return NULL;
+ }
+#else
+ ptr = malloc( length );
+ if ( !ptr ) {
+ Com_Error( ERR_FATAL, "VM_CompileX86: malloc failed" );
+ return NULL;
+ }
+#endif
+ vm->codeBase.ptr = (byte*)ptr;
+ vm->codeLength = codeLength;
+ return vm->codeBase.ptr;
+}
+
+
+/*
+==============
+VM_Destroy_Compiled
+==============
+*/
+static void VM_Destroy_Compiled(vm_t* vm)
+{
+#ifdef VM_X86_MMAP
+ munmap( vm->codeBase.ptr, vm->codeLength );
+#elif _WIN32
+ VirtualFree( vm->codeBase.ptr, 0, MEM_RELEASE );
+#else
+ free( vm->codeBase.ptr );
+#endif
+ vm->codeBase.ptr = NULL;
+}
+
+
+/*
+==============
+VM_CallCompiled
+
+This function is called directly by the generated code
+==============
+*/
+int VM_CallCompiled( vm_t *vm, int *args )
+{
+ int opStack[MAX_OPSTACK_SIZE];
+ int stackOnEntry;
+ int *image;
+ vm_t *oldVM;
+ int *oldOpTop;
+ int i;
+
+ oldVM = currentVM;
+ currentVM = vm;
+
+ // we might be called recursively, so this might not be the very top
+ stackOnEntry = vm->programStack;
+ oldOpTop = vm->opStackTop;
+ vm->programStack -= 8 + (VMMAIN_CALL_ARGS*4);
+
+ // set up the stack frame
+ image = (int*)( vm->dataBase + vm->programStack );
+ for ( i = 0; i < VMMAIN_CALL_ARGS; i++ ) {
+ image[ i + 2 ] = args[ i ];
+ }
+ image[1] = 0; // return stack
+ image[0] = -1; // will terminate loop on return
+
+ vm->opStack = opStack;
+ vm->opStackTop = opStack + ARRAY_LEN( opStack ) - 1;
+
+ vm->codeBase.func(); // go into generated code
+
+ if ( vm->opStack != &opStack[1] ) {
+ Com_Error( ERR_DROP, "opStack corrupted in compiled code" );
+ }
+
+#ifdef DEBUG_VM
+ if ( vm->programStack != stackOnEntry - CALL_PSTACK ) {
+ Com_Error( ERR_DROP, "programStack corrupted in compiled code" );
+ }
+#endif
+
+ vm->programStack = stackOnEntry;
+ vm->opStackTop = oldOpTop;
+
+ // in case we were recursively called by another vm
+ currentVM = oldVM;
+
+ return vm->opStack[0];
}
diff --git a/code/qcommon/vm_x86_64.cpp b/code/qcommon/vm_x86_64.cpp
deleted file mode 100644
index 69229f9..0000000
--- a/code/qcommon/vm_x86_64.cpp
+++ /dev/null
@@ -1,1004 +0,0 @@
-/*
-===========================================================================
-Copyright (C) 1999-2005 Id Software, Inc.
-Copyright (C) 2005 Ludwig Nussel
-
-This file is part of Quake III Arena source code.
-
-Quake III Arena source code is free software; you can redistribute it
-and/or modify it under the terms of the GNU General Public License as
-published by the Free Software Foundation; either version 2 of the License,
-or (at your option) any later version.
-
-Quake III Arena source code is distributed in the hope that it will be
-useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with Quake III Arena source code; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-===========================================================================
-*/
-// vm_x86_64.c -- load time compiler and execution environment for x86-64
-
-#include "vm_local.h"
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#ifdef DEBUG_VM
-#define Dfprintf(fd, args...) fprintf(fd, ##args)
-static FILE* qdasmout;
-#else
-#define Dfprintf(args...)
-#endif
-
-static void VM_Destroy_Compiled(vm_t* self);
-
-/*
-
- eax scratch
- ebx scratch
- ecx scratch (required for shifts)
- edx scratch (required for divisions)
- rsi stack pointer
- rdi program frame pointer
- r8 pointer to begin of real stack memory
- r9 return address to real program
- r10 start of generated code
-*/
-
-
-static long callAsmCall(long callProgramStack, long callSyscallNum)
-{
- vm_t *savedVM;
- long ret = 0x77;
- long args[11];
-// int iargs[11];
- int i;
-
-// Dfprintf(stderr, "callAsmCall(%ld, %ld)\n", callProgramStack, callSyscallNum);
-// Com_Printf("-> callAsmCall %s, level %d, num %ld\n", currentVM->name, currentVM->callLevel, callSyscallNum);
-
- savedVM = currentVM;
-
- // save the stack to allow recursive VM entry
- currentVM->programStack = callProgramStack - 4;
-
- args[0] = callSyscallNum;
-// iargs[0] = callSyscallNum;
- for(i = 0; i < 10; ++i)
- {
-// iargs[i+1] = *(int *)((byte *)currentVM->dataBase + callProgramStack + 8 + 4*i);
- args[i+1] = *(int *)((byte *)currentVM->dataBase + callProgramStack + 8 + 4*i);
- }
- ret = currentVM->systemCall(args);
-
- currentVM = savedVM;
-// Com_Printf("<- callAsmCall %s, level %d, num %ld\n", currentVM->name, currentVM->callLevel, callSyscallNum);
-
- return ret;
-}
-
-#ifdef DEBUG_VM // bk001204
-static char *opnames[256] = {
- "OP_UNDEF",
-
- "OP_IGNORE",
-
- "OP_BREAK",
-
- "OP_ENTER",
- "OP_LEAVE",
- "OP_CALL",
- "OP_PUSH",
- "OP_POP",
-
- "OP_CONST",
-
- "OP_LOCAL",
-
- "OP_JUMP",
-
- //-------------------
-
- "OP_EQ",
- "OP_NE",
-
- "OP_LTI",
- "OP_LEI",
- "OP_GTI",
- "OP_GEI",
-
- "OP_LTU",
- "OP_LEU",
- "OP_GTU",
- "OP_GEU",
-
- "OP_EQF",
- "OP_NEF",
-
- "OP_LTF",
- "OP_LEF",
- "OP_GTF",
- "OP_GEF",
-
- //-------------------
-
- "OP_LOAD1",
- "OP_LOAD2",
- "OP_LOAD4",
- "OP_STORE1",
- "OP_STORE2",
- "OP_STORE4",
- "OP_ARG",
-
- "OP_BLOCK_COPY",
-
- //-------------------
-
- "OP_SEX8",
- "OP_SEX16",
-
- "OP_NEGI",
- "OP_ADD",
- "OP_SUB",
- "OP_DIVI",
- "OP_DIVU",
- "OP_MODI",
- "OP_MODU",
- "OP_MULI",
- "OP_MULU",
-
- "OP_BAND",
- "OP_BOR",
- "OP_BXOR",
- "OP_BCOM",
-
- "OP_LSH",
- "OP_RSHI",
- "OP_RSHU",
-
- "OP_NEGF",
- "OP_ADDF",
- "OP_SUBF",
- "OP_DIVF",
- "OP_MULF",
-
- "OP_CVIF",
- "OP_CVFI"
-};
-#endif // DEBUG_VM
-
-static unsigned char op_argsize[256] =
-{
- [OP_ENTER] = 4,
- [OP_LEAVE] = 4,
- [OP_CONST] = 4,
- [OP_LOCAL] = 4,
- [OP_EQ] = 4,
- [OP_NE] = 4,
- [OP_LTI] = 4,
- [OP_LEI] = 4,
- [OP_GTI] = 4,
- [OP_GEI] = 4,
- [OP_LTU] = 4,
- [OP_LEU] = 4,
- [OP_GTU] = 4,
- [OP_GEU] = 4,
- [OP_EQF] = 4,
- [OP_NEF] = 4,
- [OP_LTF] = 4,
- [OP_LEF] = 4,
- [OP_GTF] = 4,
- [OP_GEF] = 4,
- [OP_ARG] = 1,
- [OP_BLOCK_COPY] = 4,
-};
-
-#define emit(x...) \
- do { fprintf(fh_s, ##x); fputc('\n', fh_s); } while(0)
-
-// integer compare and jump
-#define IJ(op) \
- emit("subq $8, %%rsi"); \
- emit("movl 4(%%rsi), %%eax"); \
- emit("cmpl 8(%%rsi), %%eax"); \
- emit(op " i_%08x", instruction+1); \
- emit("jmp i_%08x", iarg);
-
-#ifdef USE_X87
-#define FJ(bits, op) \
- emit("subq $8, %%rsi");\
- emit("flds 4(%%rsi)");\
- emit("fcomps 8(%%rsi)");\
- emit("fnstsw %%ax");\
- emit("testb $" #bits ", %%ah");\
- emit(op " i_%08x", instruction+1);\
- emit("jmp i_%08x", iarg);
-#define XJ(x)
-#else
-#define FJ(x, y)
-#define XJ(op) \
- emit("subq $8, %%rsi");\
- emit("movss 4(%%rsi), %%xmm0");\
- emit("ucomiss 8(%%rsi), %%xmm0");\
- emit("jp i_%08x", instruction+1);\
- emit(op " i_%08x", instruction+1);\
- emit("jmp i_%08x", iarg);
-#endif
-
-#define SIMPLE(op) \
- emit("subq $4, %%rsi"); \
- emit("movl 4(%%rsi), %%eax"); \
- emit(op " %%eax, 0(%%rsi)");
-
-#ifdef USE_X87
-#define FSIMPLE(op) \
- emit("subq $4, %%rsi"); \
- emit("flds 0(%%rsi)"); \
- emit(op " 4(%%rsi)"); \
- emit("fstps 0(%%rsi)");
-#define XSIMPLE(op)
-#else
-#define FSIMPLE(op)
-#define XSIMPLE(op) \
- emit("subq $4, %%rsi"); \
- emit("movss 0(%%rsi), %%xmm0"); \
- emit(op " 4(%%rsi), %%xmm0"); \
- emit("movss %%xmm0, 0(%%rsi)");
-#endif
-
-#define SHIFT(op) \
- emit("subq $4, %%rsi"); \
- emit("movl 4(%%rsi), %%ecx"); \
- emit("movl 0(%%rsi), %%eax"); \
- emit(op " %%cl, %%eax"); \
- emit("movl %%eax, 0(%%rsi)");
-
-#if 1
-#define RANGECHECK(reg) \
- emit("andl $0x%x, %%" #reg, vm->dataMask);
-#else
-#define RANGECHECK(reg)
-#endif
-
-#ifdef DEBUG_VM
-#define NOTIMPL(x) \
- do { Com_Error(ERR_DROP, "instruction not implemented: %s\n", opnames[x]); } while(0)
-#else
-#define NOTIMPL(x) \
- do { Com_Printf(S_COLOR_RED "instruction not implemented: %x\n", x); vm->compiled = qfalse; return; } while(0)
-#endif
-
-static void* getentrypoint(vm_t* vm)
-{
- return vm->codeBase+64; // skip ELF header
-}
-
-char* mmapfile(const char* fn, size_t* size)
-{
- int fd = -1;
- char* mem = NULL;
- struct stat stb;
-
- fd = open(fn, O_RDONLY);
- if(fd == -1)
- goto out;
-
- if(fstat(fd, &stb) == -1)
- goto out;
-
- *size = stb.st_size;
-
- mem = mmap(NULL, stb.st_size, PROT_READ|PROT_EXEC, MAP_SHARED, fd, 0);
- if(mem == (void*)-1)
- mem = NULL;
-
-out:
- if(fd != -1)
- close(fd);
-
- return mem;
-}
-
-static int doas(char* in, char* out, unsigned char** compiledcode)
-{
- unsigned char* mem;
- size_t size = -1;
- pid_t pid;
-
- Com_Printf("running assembler < %s > %s\n", in, out);
- pid = fork();
- if(pid == -1)
- {
- Com_Printf(S_COLOR_RED "can't fork\n");
- return -1;
- }
-
- if(!pid)
- {
- char* const argv[] = {
- "as",
- "-o",
- out,
- in,
- NULL
- };
-
- execvp(argv[0], argv);
- _exit(-1);
- }
- else
- {
- int status;
- if(waitpid(pid, &status, 0) == -1)
- {
- Com_Printf(S_COLOR_RED "can't wait for as: %s\n", strerror(errno));
- return -1;
- }
-
- if(!WIFEXITED(status))
- {
- Com_Printf(S_COLOR_RED "as died\n");
- return -1;
- }
- if(WEXITSTATUS(status))
- {
- Com_Printf(S_COLOR_RED "as failed with status %d\n", WEXITSTATUS(status));
- return -1;
- }
- }
-
- Com_Printf("done\n");
-
- mem = (unsigned char*)mmapfile(out, &size);
- if(!mem)
- {
- Com_Printf(S_COLOR_RED "can't mmap object file %s: %s\n", out, strerror(errno));
- return -1;
- }
-
- *compiledcode = mem;
-
- return size;
-}
-
-static void block_copy_vm(unsigned dest, unsigned src, unsigned count)
-{
- unsigned dataMask = currentVM->dataMask;
-
- if ((dest & dataMask) != dest
- || (src & dataMask) != src
- || ((dest+count) & dataMask) != dest + count
- || ((src+count) & dataMask) != src + count)
- {
- Com_Error(ERR_DROP, "OP_BLOCK_COPY out of range!\n");
- }
-
- memcpy(currentVM->dataBase+dest, currentVM->dataBase+src, count);
-}
-
-/*
-=================
-VM_Compile
-=================
-*/
-void VM_Compile( vm_t *vm, vmHeader_t *header ) {
- unsigned char op;
- int pc;
- unsigned instruction;
- char* code;
- unsigned iarg = 0;
- unsigned char barg = 0;
- void* entryPoint;
-
- char fn_s[2*MAX_QPATH]; // output file for assembler code
- char fn_o[2*MAX_QPATH]; // file written by as
-#ifdef DEBUG_VM
- char fn_d[MAX_QPATH]; // disassembled
-#endif
- FILE* fh_s;
- int fd_s, fd_o;
- byte* compiledcode;
- int compiledsize;
-
- Com_Printf("compiling %s\n", vm->name);
-
- snprintf(fn_s, sizeof(fn_s), "/tmp/%.63s.s_XXXXXX", vm->name);
- snprintf(fn_o, sizeof(fn_o), "/tmp/%.63s.o_XXXXXX", vm->name);
- fd_s = mkstemp(fn_s);
- fd_o = mkstemp(fn_o);
- if(fd_s == -1 || fd_o == -1)
- {
- if(fd_s != -1) close(fd_s);
- if(fd_o != -1) close(fd_o);
- unlink(fn_s);
- unlink(fn_o);
-
- Com_Printf(S_COLOR_RED "can't create temporary files for vm\n", fn_s);
- vm->compiled = qfalse;
- return;
- }
-
-#ifdef DEBUG_VM
- strcpy(fn_d,vm->name);
- strcat(fn_d, ".qdasm");
-
- qdasmout = fopen(fn_d, "w");
-#endif
-
- fh_s = fdopen(fd_s, "wb");
- if(!fh_s)
- {
- Com_Printf(S_COLOR_RED "can't write %s\n", fn_s);
- vm->compiled = qfalse;
- return;
- }
-
- // translate all instructions
- pc = 0;
- code = (char *)header + header->codeOffset;
-
- emit("start:");
- emit("or %%r8, %%r8"); // check whether to set up instruction pointers
- emit("jnz main");
- emit("jmp setupinstructionpointers");
- emit("exit:");
- emit("jmp *%%r9");
-
- emit("main:");
-
- for ( instruction = 0; instruction < header->instructionCount; ++instruction )
- {
- op = code[ pc ];
- ++pc;
-
- vm->instructionPointers[instruction] = pc;
-
-#if 0
- emit("nop");
- emit("movq $%d, %%r15", instruction);
- emit("nop");
-#endif
-
- if(op_argsize[op] == 4)
- {
- iarg = *(int*)(code+pc);
- pc += 4;
- Dfprintf(qdasmout, "%s %8u\n", opnames[op], iarg);
- }
- else if(op_argsize[op] == 1)
- {
- barg = code[pc++];
- Dfprintf(qdasmout, "%s %8hhu\n", opnames[op], barg);
- }
- else
- {
- Dfprintf(qdasmout, "%s\n", opnames[op]);
- }
- emit("i_%08x:", instruction);
- switch ( op )
- {
- case OP_UNDEF:
- NOTIMPL(op);
- break;
- case OP_IGNORE:
- emit("nop");
- break;
- case OP_BREAK:
- emit("int3");
- break;
- case OP_ENTER:
- emit("subl $%d, %%edi", iarg);
- RANGECHECK(edi);
- break;
- case OP_LEAVE:
- emit("addl $%d, %%edi", iarg); // get rid of stack frame
- RANGECHECK(edi);
- emit("movl 0(%%r8, %%rdi, 1), %%eax"); // get return address
- emit("movq $%lu, %%rbx", (unsigned long)vm->instructionPointers);
- emit("cmp $-1, %%eax");
- emit("je jumptoexit%d", instruction);
- emit("movl (%%rbx, %%rax, 4), %%eax"); // load new relative jump address
- emit("addq %%r10, %%rax");
- emit("jmp *%%rax");
- emit("jumptoexit%d:", instruction);
- emit("jmp exit");
- break;
- case OP_CALL:
- emit("movl 0(%%rsi), %%eax"); // get instr from stack
- emit("subq $4, %%rsi");
- emit("movl $%d, 0(%%r8, %%rdi, 1)", instruction+1); // save next instruction
- emit("orl %%eax, %%eax");
- emit("jl callSyscall%d", instruction);
- emit("movq $%lu, %%rbx", (unsigned long)vm->instructionPointers);
- emit("movl (%%rbx, %%rax, 4), %%eax"); // load new relative jump address
- emit("addq %%r10, %%rax");
- emit("jmp *%%rax");
- emit("callSyscall%d:", instruction);
-// emit("fnsave 4(%%rsi)");
- emit("push %%rsi");
- emit("push %%rdi");
- emit("push %%r8");
- emit("push %%r9");
- emit("push %%r10");
- emit("push %%r10"); // align!
- emit("negl %%eax"); // convert to actual number
- emit("decl %%eax");
- // first argument already in rdi
- emit("movq %%rax, %%rsi"); // second argument in rsi
- emit("movq $%lu, %%rax", (unsigned long)callAsmCall);
- emit("callq *%%rax");
- emit("pop %%r10");
- emit("pop %%r10");
- emit("pop %%r9");
- emit("pop %%r8");
- emit("pop %%rdi");
- emit("pop %%rsi");
-// emit("frstor 4(%%rsi)");
- emit("addq $4, %%rsi");
- emit("movl %%eax, (%%rsi)");
- break;
- case OP_PUSH:
- emit("addq $4, %%rsi");
- break;
- case OP_POP:
- emit("subq $4, %%rsi");
- break;
- case OP_CONST:
- emit("addq $4, %%rsi");
- emit("movl $%d, 0(%%rsi)", iarg);
- break;
- case OP_LOCAL:
- emit("movl %%edi, %%ebx");
- emit("addl $%d,%%ebx", iarg);
- emit("addq $4, %%rsi");
- emit("movl %%ebx, 0(%%rsi)");
- break;
- case OP_JUMP:
- emit("movl 0(%%rsi), %%eax"); // get instr from stack
- emit("subq $4, %%rsi");
- emit("movq $%lu, %%rbx", (unsigned long)vm->instructionPointers);
- emit("movl (%%rbx, %%rax, 4), %%eax"); // load new relative jump address
- emit("addq %%r10, %%rax");
- emit("jmp *%%rax");
- break;
- case OP_EQ:
- IJ("jne");
- break;
- case OP_NE:
- IJ("je");
- break;
- case OP_LTI:
- IJ("jnl");
- break;
- case OP_LEI:
- IJ("jnle");
- break;
- case OP_GTI:
- IJ("jng");
- break;
- case OP_GEI:
- IJ("jnge");
- break;
- case OP_LTU:
- IJ("jnb");
- break;
- case OP_LEU:
- IJ("jnbe");
- break;
- case OP_GTU:
- IJ("jna");
- break;
- case OP_GEU:
- IJ("jnae");
- break;
- case OP_EQF:
- FJ(0x40, "jz");
- XJ("jnz");
- break;
- case OP_NEF:
- FJ(0x40, "jnz");
-#ifndef USE_X87
- emit("subq $8, %%rsi");
- emit("movss 4(%%rsi), %%xmm0");
- emit("ucomiss 8(%%rsi), %%xmm0");
- emit("jp dojump_i_%08x", instruction);
- emit("jz i_%08x", instruction+1);
- emit("dojump_i_%08x:", instruction);
- emit("jmp i_%08x", iarg);
-#endif
- break;
- case OP_LTF:
- FJ(0x01, "jz");
- XJ("jnc");
- break;
- case OP_LEF:
- FJ(0x41, "jz");
- XJ("ja");
- break;
- case OP_GTF:
- FJ(0x41, "jnz");
- XJ("jbe");
- break;
- case OP_GEF:
- FJ(0x01, "jnz");
- XJ("jb");
- break;
- case OP_LOAD1:
- emit("movl 0(%%rsi), %%eax"); // get pointer from stack
- RANGECHECK(eax);
- emit("movb 0(%%r8, %%rax, 1), %%al"); // deref into eax
- emit("andq $255, %%rax");
- emit("movl %%eax, 0(%%rsi)"); // store on stack
- break;
- case OP_LOAD2:
- emit("movl 0(%%rsi), %%eax"); // get pointer from stack
- RANGECHECK(eax);
- emit("movw 0(%%r8, %%rax, 1), %%rax"); // deref into eax
- emit("movl %%eax, 0(%%rsi)"); // store on stack
- break;
- case OP_LOAD4:
- emit("movl 0(%%rsi), %%eax"); // get pointer from stack
- RANGECHECK(eax);
- emit("movl 0(%%r8, %%rax, 1), %%eax"); // deref into eax
- emit("movl %%eax, 0(%%rsi)"); // store on stack
- break;
- case OP_STORE1:
- emit("movl 0(%%rsi), %%eax"); // get value from stack
- emit("andq $255, %%rax");
- emit("movl -4(%%rsi), %%ebx"); // get pointer from stack
- RANGECHECK(ebx);
- emit("movb %%al, 0(%%r8, %%rbx, 1)"); // store in memory
- emit("subq $8, %%rsi");
- break;
- case OP_STORE2:
- emit("movl 0(%%rsi), %%eax"); // get value from stack
- emit("movl -4(%%rsi), %%ebx"); // get pointer from stack
- RANGECHECK(ebx);
- emit("movw %%rax, 0(%%r8, %%rbx, 1)"); // store in memory
- emit("subq $8, %%rsi");
- break;
- case OP_STORE4:
- emit("movl -4(%%rsi), %%ebx"); // get pointer from stack
- RANGECHECK(ebx);
- emit("movl 0(%%rsi), %%ecx"); // get value from stack
- emit("movl %%ecx, 0(%%r8, %%rbx, 1)"); // store in memory
- emit("subq $8, %%rsi");
- break;
- case OP_ARG:
- emit("subq $4, %%rsi");
- emit("movl 4(%%rsi), %%eax"); // get value from stack
- emit("movl $0x%hhx, %%ebx", barg);
- emit("addl %%edi, %%ebx");
- RANGECHECK(ebx);
- emit("movl %%eax, 0(%%r8,%%rbx, 1)"); // store in args space
- break;
- case OP_BLOCK_COPY:
-
- emit("subq $8, %%rsi");
- emit("push %%rsi");
- emit("push %%rdi");
- emit("push %%r8");
- emit("push %%r9");
- emit("push %%r10");
- emit("movl 4(%%rsi), %%edi"); // 1st argument dest
- emit("movl 8(%%rsi), %%esi"); // 2nd argument src
- emit("movl $%d, %%edx", iarg); // 3rd argument count
- emit("movq $%lu, %%rax", (unsigned long)block_copy_vm);
- emit("callq *%%rax");
- emit("pop %%r10");
- emit("pop %%r9");
- emit("pop %%r8");
- emit("pop %%rdi");
- emit("pop %%rsi");
-
- break;
- case OP_SEX8:
- emit("movw 0(%%rsi), %%rax");
- emit("andq $255, %%rax");
- emit("cbw");
- emit("cwde");
- emit("movl %%eax, 0(%%rsi)");
- break;
- case OP_SEX16:
- emit("movw 0(%%rsi), %%rax");
- emit("cwde");
- emit("movl %%eax, 0(%%rsi)");
- break;
- case OP_NEGI:
- emit("negl 0(%%rsi)");
- break;
- case OP_ADD:
- SIMPLE("addl");
- break;
- case OP_SUB:
- SIMPLE("subl");
- break;
- case OP_DIVI:
- emit("subq $4, %%rsi");
- emit("movl 0(%%rsi), %%eax");
- emit("cdq");
- emit("idivl 4(%%rsi)");
- emit("movl %%eax, 0(%%rsi)");
- break;
- case OP_DIVU:
- emit("subq $4, %%rsi");
- emit("movl 0(%%rsi), %%eax");
- emit("xorq %%rdx, %%rdx");
- emit("divl 4(%%rsi)");
- emit("movl %%eax, 0(%%rsi)");
- break;
- case OP_MODI:
- emit("subq $4, %%rsi");
- emit("movl 0(%%rsi), %%eax");
- emit("xorl %%edx, %%edx");
- emit("divl 4(%%rsi)");
- emit("movl %%edx, 0(%%rsi)");
- break;
- case OP_MODU:
- emit("subq $4, %%rsi");
- emit("movl 0(%%rsi), %%eax");
- emit("xorl %%edx, %%edx");
- emit("idivl 4(%%rsi)");
- emit("movl %%edx, 0(%%rsi)");
- break;
- case OP_MULI:
- emit("subq $4, %%rsi");
- emit("movl 0(%%rsi), %%eax");
- emit("imull 4(%%rsi)");
- emit("movl %%eax, 0(%%rsi)");
- break;
- case OP_MULU:
- emit("subq $4, %%rsi");
- emit("movl 0(%%rsi), %%eax");
- emit("mull 4(%%rsi)");
- emit("movl %%eax, 0(%%rsi)");
- break;
- case OP_BAND:
- SIMPLE("andl");
- break;
- case OP_BOR:
- SIMPLE("orl");
- break;
- case OP_BXOR:
- SIMPLE("xorl");
- break;
- case OP_BCOM:
- emit("notl 0(%%rsi)");
- break;
- case OP_LSH:
- SHIFT("shl");
- break;
- case OP_RSHI:
- SHIFT("sarl");
- break;
- case OP_RSHU:
- SHIFT("shrl");
- break;
- case OP_NEGF:
-#ifdef USE_X87
- emit("flds 0(%%rsi)");
- emit("fchs");
- emit("fstps 0(%%rsi)");
-#else
- emit("movl $0x80000000, %%eax");
- emit("xorl %%eax, 0(%%rsi)");
-#endif
- break;
- case OP_ADDF:
- FSIMPLE("fadds");
- XSIMPLE("addss");
- break;
- case OP_SUBF:
- FSIMPLE("fsubs");
- XSIMPLE("subss");
- break;
- case OP_DIVF:
- FSIMPLE("fdivs");
- XSIMPLE("divss");
- break;
- case OP_MULF:
- FSIMPLE("fmuls");
- XSIMPLE("mulss");
- break;
- case OP_CVIF:
-#ifdef USE_X87
- emit("filds 0(%%rsi)");
- emit("fstps 0(%%rsi)");
-#else
- emit("movl 0(%%rsi), %%eax");
- emit("cvtsi2ss %%eax, %%xmm0");
- emit("movss %%xmm0, 0(%%rsi)");
-#endif
- break;
- case OP_CVFI:
-#ifdef USE_X87
- emit("flds 0(%%rsi)");
- emit("fnstcw 4(%%rsi)");
- emit("movw $0x0F7F, 8(%%rsi)"); // round toward zero
- emit("fldcw 8(%%rsi)");
- emit("fistpl 0(%%rsi)");
- emit("fldcw 4(%%rsi)");
-#else
- emit("movss 0(%%rsi), %%xmm0");
- emit("cvttss2si %%xmm0, %%eax");
- emit("movl %%eax, 0(%%rsi)");
-#endif
- break;
- default:
- NOTIMPL(op);
- break;
- }
- }
-
-
- emit("setupinstructionpointers:");
- emit("movq $%lu, %%rax", (unsigned long)vm->instructionPointers);
- for ( instruction = 0; instruction < header->instructionCount; ++instruction )
- {
- emit("movl $i_%08x-start, %d(%%rax)", instruction, instruction*4);
- }
- emit("jmp exit");
-
- emit("debugger:");
- if(1);
- {
- int i = 6;
- while(i--)
- {
- emit("nop");
- emit("int3");
- }
- }
-
- fflush(fh_s);
- fclose(fh_s);
-
- compiledsize = doas(fn_s, fn_o, &compiledcode);
- if(compiledsize == -1)
- {
- vm->compiled = qfalse;
- goto out;
- }
-
- vm->codeBase = compiledcode; // remember to skip ELF header!
- vm->codeLength = compiledsize;
-
- vm->destroy = VM_Destroy_Compiled;
-
- entryPoint = getentrypoint(vm);
-
-// __asm__ __volatile__ ("int3");
- Com_Printf("computing jump table\n");
-
- // call code with r8 set to zero to set up instruction pointers
- __asm__ __volatile__ (
- " xorq %%r8,%%r8 \r\n" \
- " movq $doneinit,%%r9 \r\n" \
- " movq %0,%%r10 \r\n" \
- " jmp *%%r10 \r\n" \
- "doneinit: \r\n" \
- :
- : "m" (entryPoint)
- : "%r8", "%r9", "%r10", "%rax"
- );
-
-#ifdef DEBUG_VM
- fflush(qdasmout);
-#endif
-
- Com_Printf( "VM file %s compiled to %i bytes of code (0x%lx - 0x%lx)\n", vm->name, vm->codeLength, vm->codeBase, vm->codeBase+vm->codeLength );
-
-out:
- close(fd_o);
- if(!com_developer->integer)
- {
- unlink(fn_o);
- unlink(fn_s);
- }
-}
-
-
-void VM_Destroy_Compiled(vm_t* self)
-{
- munmap(self->codeBase, self->codeLength);
-}
-
-/*
-==============
-VM_CallCompiled
-
-This function is called directly by the generated code
-==============
-*/
-
-#ifdef DEBUG_VM
-static char* memData;
-#endif
-
-int VM_CallCompiled( vm_t *vm, int *args ) {
- int programCounter;
- int programStack;
- int stackOnEntry;
- byte *image;
- void *entryPoint;
- void *opStack;
- int stack[1024] = { 0xDEADBEEF };
-
- currentVM = vm;
-
- ++vm->callLevel;
-// Com_Printf("entering %s level %d, call %d, arg1 = 0x%x\n", vm->name, vm->callLevel, args[0], args[1]);
-
- // interpret the code
- vm->currentlyInterpreting = qtrue;
-
-// callMask = vm->dataMask;
-
- // we might be called recursively, so this might not be the very top
- programStack = vm->programStack;
- stackOnEntry = programStack;
-
- // set up the stack frame
- image = vm->dataBase;
-#ifdef DEBUG_VM
- memData = (char*)image;
-#endif
-
- programCounter = 0;
-
- programStack -= 48;
-
- *(int *)&image[ programStack + 44] = args[9];
- *(int *)&image[ programStack + 40] = args[8];
- *(int *)&image[ programStack + 36] = args[7];
- *(int *)&image[ programStack + 32] = args[6];
- *(int *)&image[ programStack + 28] = args[5];
- *(int *)&image[ programStack + 24] = args[4];
- *(int *)&image[ programStack + 20] = args[3];
- *(int *)&image[ programStack + 16] = args[2];
- *(int *)&image[ programStack + 12] = args[1];
- *(int *)&image[ programStack + 8 ] = args[0];
- *(int *)&image[ programStack + 4 ] = 0x77777777; // return stack
- *(int *)&image[ programStack ] = -1; // will terminate the loop on return
-
- // off we go into generated code...
- entryPoint = getentrypoint(vm);
- opStack = &stack;
-
- __asm__ __volatile__ (
- " movq %5,%%rsi \r\n" \
- " movl %4,%%edi \r\n" \
- " movq $done,%%r9 \r\n" \
- " movq %2,%%r10 \r\n" \
- " movq %3,%%r8 \r\n" \
- " jmp *%%r10 \r\n" \
- "done: \r\n" \
- " movl %%edi, %0 \r\n" \
- " movq %%rsi, %1 \r\n" \
- : "=m" (programStack), "=m" (opStack)
- : "m" (entryPoint), "m" (vm->dataBase), "m" (programStack), "m" (opStack)
- : "%rsi", "%rdi", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r15", "%xmm0"
- );
-
- if ( opStack != &stack[1] ) {
- Com_Error( ERR_DROP, "opStack corrupted in compiled code (offset %d)\n", (void*)&stack[1] - opStack);
- }
- if ( programStack != stackOnEntry - 48 ) {
- Com_Error( ERR_DROP, "programStack corrupted in compiled code\n" );
- }
-
-// Com_Printf("exiting %s level %d\n", vm->name, vm->callLevel);
- --vm->callLevel;
- vm->programStack = stackOnEntry;
-
- return *(int *)opStack;
-}
diff --git a/code/renderer/tr_image.cpp b/code/renderer/tr_image.cpp
index bd2df59..6a9bed1 100644
--- a/code/renderer/tr_image.cpp
+++ b/code/renderer/tr_image.cpp
@@ -154,7 +154,7 @@ Used to resample images in a more general than quartering fashion.
This will only be filtered properly if the resampled size
is greater than half the original size.
-If a larger shrinking is needed, use the mipmap function
+If a larger shrinking is needed, use the mipmap function
before or after.
================
*/
@@ -262,7 +262,7 @@ static void R_MipMap( unsigned* in, int inWidth, int inHeight )
for ( j = 0 ; j < outWidth ; j++ ) {
outpix = (byte *) ( temp + i * outWidth + j );
for ( k = 0 ; k < 4 ; k++ ) {
- total =
+ total =
1 * ((byte *)&in[ ((i*2-1)&inHeightMask)*inWidth + ((j*2-1)&inWidthMask) ])[k] +
2 * ((byte *)&in[ ((i*2-1)&inHeightMask)*inWidth + ((j*2)&inWidthMask) ])[k] +
2 * ((byte *)&in[ ((i*2-1)&inHeightMask)*inWidth + ((j*2+1)&inWidthMask) ])[k] +
@@ -1104,7 +1104,7 @@ qhandle_t RE_RegisterSkin( const char* name )
// lowercase the surface name so skin compares are faster
Q_strlwr( surfName );
- if (*p == ',')
+ if (*p == ',')
++p;
if ( strstr( token, "tag_" ) )
diff --git a/code/renderer/tr_init.cpp b/code/renderer/tr_init.cpp
index 2d01ecd..76219ae 100644
--- a/code/renderer/tr_init.cpp
+++ b/code/renderer/tr_init.cpp
@@ -633,7 +633,7 @@ void R_Init()
Com_Memset( &backEnd, 0, sizeof( backEnd ) );
Com_Memset( &tess, 0, sizeof( tess ) );
- if ((int)tess.xyz & 15)
+ if ((intptr_t)tess.xyz & 15)
Com_Printf( "WARNING: tess.xyz not 16 byte aligned\n" );
// init function tables
diff --git a/code/server/sv_game.cpp b/code/server/sv_game.cpp
index 1070a75..cac64b9 100644
--- a/code/server/sv_game.cpp
+++ b/code/server/sv_game.cpp
@@ -844,8 +844,10 @@ void SV_InitGameProgs()
cvar_t* var = Cvar_Get( "bot_enable", "1", CVAR_LATCH );
bot_enable = (var && var->integer);
+ const vmInterpret_t interpret = (vmInterpret_t)Cvar_VariableIntegerValue( "vm_game" );
+
// load the dll or bytecode
- gvm = VM_Create( "qagame", SV_GameSystemCalls, (vmInterpret_t)Cvar_VariableIntegerValue( "vm_game" ) );
+ gvm = VM_Create( VM_GAME, SV_GameSystemCalls, interpret );
SV_InitGameVM( qfalse );
}
diff --git a/code/unix/unix_main.cpp b/code/unix/unix_main.cpp
index 6cacab9..36ffa33 100644
--- a/code/unix/unix_main.cpp
+++ b/code/unix/unix_main.cpp
@@ -549,9 +549,7 @@ static void* try_dlopen( const char* base, const char* gamedir, const char* file
// in release builds, the load procedure matches the VFS logic (fs_homepath, then fs_basepath)
// in debug builds, the current working directory is tried first
-void* Sys_LoadDll( const char* name,
- intptr_t (**entryPoint)(intptr_t, ...),
- intptr_t (*systemcalls)(intptr_t, ...) )
+void* QDECL Sys_LoadDll( const char* name, dllSyscall_t *entryPoint, dllSyscall_t systemcalls )
{
char filename[MAX_QPATH];
Com_sprintf( filename, sizeof( filename ), "%s" ARCH_STRING DLL_EXT, name );
@@ -575,14 +573,12 @@ void* Sys_LoadDll( const char* name,
if ( !libHandle )
return NULL;
- void (QDECL *dllEntry)( int (QDECL *syscallptr)(int, ...) );
-
#if USE_SDL_VIDEO
- dllEntry = (void (QDECL *)( int (QDECL *)( int, ... ) ) )SDL_LoadFunction( libHandle, "dllEntry" );
- *entryPoint = (int (QDECL *)(intptr_t,...))SDL_LoadFunction( libHandle, "vmMain" );
+ dllEntry_t dllEntry = (dllEntry_t)SDL_LoadFunction( libHandle, "dllEntry" );
+ *entryPoint = (dllSyscall_t)SDL_LoadFunction( libHandle, "vmMain" );
#else
- dllEntry = (void (QDECL *)( int (QDECL *)( int, ... ) ) )dlsym( libHandle, "dllEntry" );
- *entryPoint = (int (QDECL *)(intptr_t,...))dlsym( libHandle, "vmMain" );
+ dllEntry_t dllEntry = (dllEntry_t)dlsym( libHandle, "dllEntry" );
+ *entryPoint = (dllSyscall_t)dlsym( libHandle, "vmMain" );
#endif
if ( !*entryPoint || !dllEntry ) {
diff --git a/code/unix/unix_shared.cpp b/code/unix/unix_shared.cpp
index 02676a6..a26c7ae 100644
--- a/code/unix/unix_shared.cpp
+++ b/code/unix/unix_shared.cpp
@@ -345,11 +345,6 @@ const char* Sys_DefaultHomePath()
//============================================
-int Sys_GetProcessorId()
-{
- return CPUID_GENERIC;
-}
-
void Sys_ShowConsole( int visLevel, qboolean quitOnClose )
{
}
@@ -363,13 +358,3 @@ const char* Sys_GetCurrentUser()
return p->pw_name;
}
-
-
-#if defined(__linux__) || defined(__FreeBSD__)
-// TTimo
-// sysconf() in libc, POSIX.1 compliant
-unsigned int Sys_ProcessorCount(void)
-{
- return sysconf(_SC_NPROCESSORS_ONLN);
-}
-#endif
diff --git a/code/win32/win_local.h b/code/win32/win_local.h
index 212741a..7d0fb03 100644
--- a/code/win32/win_local.h
+++ b/code/win32/win_local.h
@@ -41,7 +41,7 @@ void IN_Shutdown();
void SNDDMA_Activate();
-LONG WINAPI MainWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+LRESULT CALLBACK MainWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
typedef struct
{
diff --git a/code/win32/win_main.cpp b/code/win32/win_main.cpp
index a6f1a8b..d91eb55 100644
--- a/code/win32/win_main.cpp
+++ b/code/win32/win_main.cpp
@@ -343,8 +343,7 @@ void Sys_UnloadDll( void *dllHandle )
// used to load a development dll instead of a virtual machine
-void* QDECL Sys_LoadDll( const char* name,
- intptr_t (QDECL **entryPoint)(intptr_t, ...), intptr_t (QDECL *systemcalls)(intptr_t, ...) )
+void* QDECL Sys_LoadDll( const char* name, dllSyscall_t *entryPoint, dllSyscall_t systemcalls )
{
char filename[MAX_QPATH];
Com_sprintf( filename, sizeof( filename ), "%sx86.dll", name );
@@ -381,9 +380,8 @@ void* QDECL Sys_LoadDll( const char* name,
if ( !libHandle )
return NULL;
- void (QDECL *dllEntry)( intptr_t (QDECL *syscallptr)(intptr_t, ...) );
- dllEntry = ( void (QDECL *)(intptr_t (QDECL *)( intptr_t, ... ) ) )GetProcAddress( libHandle, "dllEntry" );
- *entryPoint = (intptr_t (QDECL *)(intptr_t,...))GetProcAddress( libHandle, "vmMain" );
+ dllEntry_t dllEntry = ( dllEntry_t ) GetProcAddress( libHandle, "dllEntry" );
+ *entryPoint = ( dllSyscall_t ) GetProcAddress( libHandle, "vmMain" );
if ( !*entryPoint || !dllEntry ) {
FreeLibrary( libHandle );
return NULL;
@@ -537,30 +535,6 @@ void Sys_Init()
// save out a couple things in rom cvars for the renderer to access
Cvar_Get( "win_hinstance", va("%i", (int)g_wv.hInstance), CVAR_ROM );
- //
- // figure out our CPU
- //
- Cvar_Get( "sys_cpustring", "detect", 0 );
- if ( !Q_stricmp( Cvar_VariableString( "sys_cpustring"), "detect" ) )
- {
- int cpuid = Sys_GetProcessorId();
- switch ( cpuid )
- {
- case CPUID_GENERIC:
- break;
- case CPUID_AXP:
- Cvar_Set( "sys_cpustring", "Alpha AXP" );
- break;
- case CPUID_UNSUPPORTED:
- Com_Error( ERR_FATAL, "Unsupported cpu type %s\n", Cvar_VariableString( "sys_cpustring" ) );
- break;
- default:
- Com_Error( ERR_FATAL, "Unknown cpu type %d\n", cpuid );
- break;
- }
- }
- Com_Printf( "CPU: %s\n", Cvar_VariableString( "sys_cpustring" ) );
-
//Cvar_Set( "username", Sys_GetCurrentUser() );
}
diff --git a/code/win32/win_shared.cpp b/code/win32/win_shared.cpp
index 6a4d076..505fabe 100644
--- a/code/win32/win_shared.cpp
+++ b/code/win32/win_shared.cpp
@@ -23,7 +23,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include "../qcommon/q_shared.h"
#include "../qcommon/qcommon.h"
#include "win_local.h"
-#include
int Sys_Milliseconds()
@@ -37,56 +36,6 @@ int Sys_Milliseconds()
}
-static const char* CPU_Name()
-{
- static int regs[4];
-
- __cpuid( regs, 0 );
- regs[0] = regs[1];
- regs[1] = regs[3];
- regs[3] = 0;
-
- return (const char*)regs;
-}
-
-
-struct CPU_FeatureBit { const char* s; int reg, bit; } CPU_FeatureBits[] =
-{
-#if id386 // x64 always has those anyway
- { " MMX", 3, 23 },
- { " SSE", 3, 25 },
- { " SSE2", 3, 26 },
-#endif
- { " SSE3", 2, 0 },
- { " SSSE3", 2, 9 },
- { " SSE4.1", 2, 19 },
- { " SSE4.2", 2, 20 },
- { " AVX", 2, 28 }
- // for AVX2 and later, you'd need to call cpuid with eax=7 and ecx=0 ("extended features")
-};
-static const int CPU_FeatureBitCount = sizeof(CPU_FeatureBits) / sizeof(CPU_FeatureBits[0]);
-
-
-int Sys_GetProcessorId()
-{
- char s[256] = "";
- Q_strcat( s, sizeof(s), CPU_Name() );
-
- int regs[4];
- __cpuid( regs, 1 );
-
- for (int i = 0; i < CPU_FeatureBitCount; ++i) {
- if (regs[CPU_FeatureBits[i].reg] & (1 << regs[CPU_FeatureBits[i].bit])) {
- Q_strcat( s, sizeof(s), CPU_FeatureBits[i].s );
- }
- }
-
- Cvar_Set( "sys_cpustring", s );
-
- return CPUID_GENERIC;
-}
-
-
const char* Sys_GetCurrentUser()
{
return "player";
diff --git a/code/win32/win_syscon.cpp b/code/win32/win_syscon.cpp
index 6db0848..6318295 100644
--- a/code/win32/win_syscon.cpp
+++ b/code/win32/win_syscon.cpp
@@ -416,7 +416,7 @@ void Sys_CreateConsole( void )
g_wv.hInstance, NULL );
SendMessage( s_wcd.hwndBuffer, WM_SETFONT, ( WPARAM ) s_wcd.hfBufferFont, 0 );
- s_wcd.SysInputLineWndProc = ( WNDPROC ) SetWindowLong( s_wcd.hwndInputLine, GWL_WNDPROC, ( long ) InputLineWndProc );
+ s_wcd.SysInputLineWndProc = ( WNDPROC ) SetWindowLongPtr( s_wcd.hwndInputLine, GWLP_WNDPROC, ( LONG_PTR ) InputLineWndProc );
SendMessage( s_wcd.hwndInputLine, WM_SETFONT, ( WPARAM ) s_wcd.hfBufferFont, 0 );
ShowWindow( s_wcd.hWnd, SW_SHOWDEFAULT);
diff --git a/code/win32/win_wndproc.cpp b/code/win32/win_wndproc.cpp
index f9b8033..3b6eb10 100644
--- a/code/win32/win_wndproc.cpp
+++ b/code/win32/win_wndproc.cpp
@@ -201,7 +201,7 @@ main window procedure
====================
*/
-LONG WINAPI MainWndProc (
+LRESULT CALLBACK MainWndProc (
HWND hWnd,
UINT uMsg,
WPARAM wParam,