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,