1
0
mirror of https://github.com/upx/upx synced 2025-10-05 19:20:23 +08:00
This commit is contained in:
John Reiser 2007-02-18 09:09:17 -08:00
commit a5a80e41b8
12 changed files with 8123 additions and 8462 deletions

View File

@ -140,6 +140,8 @@ RTRIM := sed -e 's/[ $(tab)]*$$//'
BLSQUEEZE := $(RTRIM) | cat --squeeze-blank | sed -e '1{/^$$/d}' -e '$${/^$$/d}'
# delete blank lines
BLDEL := $(RTRIM) | sed -e '/^$$/d'
#
UNIX2DOS := perl -i -pe 's/$$/\r/;'
# clear some vars, just in case
LABEL_PREFIX =

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,10 @@
#
# highly experimental support for i086 using Digital Mars C/C++
#
# $(DM849DIR)
# $(WATCOM)
# /usr/bin/wine
#
MAKEFLAGS += -rR
.SUFFIXES:
@ -29,85 +33,19 @@ include $(top_srcdir)/src/stub/Makefile
# /***********************************************************************
# // method-lzma
# //
# ************************************************************************/
lzma_d_c% : tc_list = method-lzma arch-i086 default
lzma_d_c% : tc_bfdname =
DOSBOX = true
DOSBOX = dosbox
DOSBOX = /usr/bin/time -p dosbox -exit
# gcc
c := tc.arch-i086.gcc
$c += -MF /dev/null
$c += -Wall -W
$c += -I$(UPX_LZMADIR)
$c += -I$(top_srcdir)/src
# Digital Mars C/C++ 8.49
# http://www.digitalmars.com/download/freecompiler.html
ifneq ($(wildcard $(DM849DIR)/bin/.),)
c := tc.method-lzma.dmc
$c = @$(WINEENV) CFLAGS='$(DMC)' wine cmd.exe /c tmp/dmc.bat
$c += -ms -R
$c += -NS
$c += -w- -w7 -r
DMC := -o -0
DMC += -D__INT_MAX__=32767
DMC += -I$(shell winepath -s z:$(realpath $(UPX_LZMADIR)))
DMC += -I$(shell winepath -s z:$(realpath $(top_srcdir)/src))
endif
TMP_DEPS = tmp/.tmp-stamp tmp/bcc.bat tmp/cl.bat tmp/dmc.bat
lzma_d_c%.S : lzma_d_c%.i cleanasm.py $(MAKEFILE_LIST)
python cleanasm.py --label-prefix=$(LABEL_PREFIX) $< $@
ifneq ($(wildcard $(UPX_LZMADIR)/C/7zip/.),)
ifneq ($(wildcard $(DM849DIR)/bin/.),)
ifneq ($(wildcard $(WATCOM)/binl/.),)
ifneq ($(wildcard /usr/bin/wine),)
lzma_d_c%.i : tmp/lzma_d_c%.i
cp $< $@
tmp/lzma_d_c%.i : lzma_d_c.c wdis2gas.py $(MAKEFILE_LIST) $(TMP_DEPS)
rm -f tmp/$T.a tmp/$T.o tmp/$T.obj
# compile
$(call tc,dmc) $(PP_FLAGS) -c -otmp/$T_dm.obj $<
$(call tc,wdis) tmp/$T_dm.obj | $(RTRIM) > tmp/$T_dm.obj.disasm
## $(call tc,wcl) $(PP_FLAGS) -c -fo=tmp/$T_wc.obj $<
## $(call tc,wdis) tmp/$T_wc.obj | $(RTRIM) > tmp/$T.obj.disasm
## $(call tc,bcc) $(PP_FLAGS) -c -otmp/$T_bc.obj $<
## $(call tc,wdis) tmp/$T_bc.obj | $(RTRIM) > tmp/$T_bc.obj.disasm
## $(call tc,cl) $(PP_FLAGS) -c -Fotmp/$T_vc.obj $<
## $(call tc,wdis) tmp/$T_vc.obj | $(RTRIM) > tmp/$T_vc.obj.disasm
# convert
python wdis2gas.py tmp/$T_dm.obj.disasm tmp/$T.S
$(call tc,gcc) -c -o tmp/$T.o tmp/$T.S
$(call tc,f-objstrip,tmp/$T.o)
$(call tc,objdump) -b elf32-i386 -m i8086 -M intel -dr -j .text.LzmaDecode --no-show -w tmp/$T.o | $(RTRIM) | perl -pe 's/DWORD/dword/g; s/WORD/word/g; s/BYTE/byte/g; s/PTR/ptr/g;' > $@
.PRECIOUS: lzma_d_cf.i lzma_d_cs.i
.PRECIOUS: tmp/lzma_d_cf.i tmp/lzma_d_cs.i
lzma_d_cf.% : PP_FLAGS = -DFAST
lzma_d_cs.% : PP_FLAGS = -DSMALL
lzma_d_cf.% : LABEL_PREFIX = .Lf
lzma_d_cs.% : LABEL_PREFIX = .Ls
endif
endif
endif
endif
# /***********************************************************************
# // cc_test
# ************************************************************************/
CC_TEST_DEPS = $(MAKEFILE_LIST) $(TMP_DEPS)
WINEENV = env
WINEENV = env -i DISPLAY='$(DISPLAY)' HOME='$(HOME)' PATH='$(PATH)' USER='$(USER)'
winedir_s = $(shell winepath -s z:$(realpath $1))
winedir_w = $(shell winepath -w $(realpath $1))
# work around limitations of wine's cmd.exe
define mkbat
echo -E '@set PATH=$3;%PATH%' > $1
@ -120,19 +58,76 @@ define mkbat
echo -e '@shift\n@shift\n@shift\n@shift\n@shift' >> $1
echo -e '@shift\n@shift\n@shift\n@shift' >> $1
echo -E '$2 %a% %b% %1 %2 %3 %4 %5 %6 %7 %8 %9' >> $1
unix2dos -q $1
$(UNIX2DOS) $1
endef
TMP_DEPS = tmp/.tmp-stamp tmp/bcc.bat tmp/cl.bat tmp/dmc.bat
tmp/bcc.bat: tmp/.tmp-stamp $(MAKEFILE_LIST)
@$(call mkbat,$@,bcc.exe,$(BC502WINDIR)\bin,,)
@$(call mkbat,$@,bcc.exe,$(call winedir_w,$(BC502DIR)/bin))
tmp/cl.bat: tmp/.tmp-stamp $(MAKEFILE_LIST)
@$(call mkbat,$@,cl.exe,$(VC152WINDIR)\bin,$(VC152WINDIR)\include,$(VC152WINDIR)\lib)
@$(call mkbat,$@,cl.exe,$(call winedir_w,$(VC152DIR)/bin),$(call winedir_w,$(VC152DIR)/include),$(call winedir_w,$(VC152DIR)/lib))
tmp/dmc.bat: tmp/.tmp-stamp $(MAKEFILE_LIST)
@$(call mkbat,$@,dmc.exe,$(shell winepath -w $(DM849DIR)/bin),,)
@$(call mkbat,$@,dmc.exe,$(call winedir_w,$(DM849DIR)/bin))
# /***********************************************************************
# // method-lzma
# ************************************************************************/
lzma_d_c% : tc_list = method-lzma arch-i086 default
lzma_d_c% : tc_bfdname =
# gcc
c := tc.arch-i086.gcc
$c += -MF /dev/null
$c += -Wall -W
$c += -I$(UPX_LZMADIR)
$c += -I$(top_srcdir)/src
# Borland C/C++ 5.02
ifneq ($(wildcard $(BC502DIR)/bin/bcc.exe),)
c := tc.method-lzma.bcc
$c = @$(WINEENV) wine cmd.exe /c tmp/bcc.bat
$c += -ms
$c += -O1 -1
$c += -w
$c += -D__INT_MAX__=32767
$c += -I$(subst \,/,$(call winedir_w,$(UPX_LZMADIR)/C/7zip/Compress/LZMA_C))
$c += -I$(top_srcdir)/src
endif
# Digital Mars C/C++ 8.49
# http://www.digitalmars.com/download/freecompiler.html
ifneq ($(wildcard $(DM849DIR)/bin/dmc.exe),)
c := tc.method-lzma.dmc
$c = @$(WINEENV) CFLAGS='$(DMC)' wine cmd.exe /c tmp/dmc.bat
$c += -ms -R
$c += -NS
$c += -w- -w7 -r
DMC := -o -0
DMC += -D__INT_MAX__=32767
DMC += -I$(call winedir_w,$(UPX_LZMADIR))
DMC += -I$(call winedir_w,$(top_srcdir)/src)
endif
# Visual C/C++ 1.52 (8.00c)
ifneq ($(wildcard $(VC152DIR)/bin/cl.exe),)
c := tc.method-lzma.cl
$c = @$(WINEENV) CL='$(CL)' wine cmd.exe /c tmp/cl.bat
$c += -AS -Gd
$c += -Gy
$c += -O2 -Gf -Gs -G0
$c += -W4
CL := -nologo
CL += -D__INT_MAX__=32767
CL += -I$(call winedir_s,$(UPX_LZMADIR))
CL += -I$(call winedir_s,$(top_srcdir)/src)
endif
# Open Watcom C/C++ 1.6
# http://openwatcom.com/
ifneq ($(wildcard $(WATCOM)/binl/.),)
ifneq ($(wildcard $(WATCOM)/binl/wcl),)
c := tc.method-lzma.wcl
$c = PATH='$(WATCOM)/binl:$(PATH)' $(WATCOM)/binl/wcl -zq -bt=dos
$c += -ms -ecc
@ -144,103 +139,148 @@ $c += -I$(UPX_LZMADIR)
$c += -I$(top_srcdir)/src
endif
# Borland C/C++ 5.02
ifneq ($(wildcard $(BC502DIR)/bin/.),)
c := tc.method-lzma.bcc
$c = @$(WINEENV) wine cmd.exe /c tmp/bcc.bat
$c += -ms
$c += -O1 -1
$c += -w
$c += -D__INT_MAX__=32767
##$c += -I$(subst \,/,$(shell winepath -s z:$(realpath $(UPX_LZMADIR))))
$c += -I$(subst \,/,$(shell winepath -s z:$(realpath $(UPX_LZMADIR)/C/7zip/Compress/LZMA_C)))
$c += -I$(top_srcdir)/src
lzma_d_c%.S : lzma_d_c%.i cleanasm.py $(MAKEFILE_LIST)
python cleanasm.py --label-prefix=$(LABEL_PREFIX) $< $@
ifneq ($(wildcard $(UPX_LZMADIR)/C/7zip/.),)
##ifneq ($(wildcard $(DM849DIR)/bin/dmc.exe),)
ifneq ($(wildcard $(WATCOM)/binl/wcl),)
ifneq ($(wildcard /usr/bin/wine),)
lzma_d_c%.i : tmp/lzma_d_c%.i
cp $< $@
tmp/lzma_d_c%.i : lzma_d_c.c wdis2gas.py $(MAKEFILE_LIST) $(TMP_DEPS)
rm -f tmp/$T*.i tmp/$T*.o tmp/$T*.obj tmp/$T*.S
# compile
ifneq ($(wildcard $(BC502DIR)/bin/bcc.exe),)
## $(call tc,bcc) $(PP_FLAGS) -c -otmp/$T_bc.obj $<
## $(call tc,wdis) tmp/$T_bc.obj | $(RTRIM) > tmp/$T_bc.obj.disasm
endif
ifneq ($(wildcard $(DM849DIR)/bin/dmc.exe),)
$(call tc,dmc) $(PP_FLAGS) -c -otmp/$T_dm.obj $<
$(call tc,wdis) tmp/$T_dm.obj | $(RTRIM) > tmp/$T_dm.obj.disasm
endif
ifneq ($(wildcard $(VC152DIR)/bin/cl.exe),)
$(call tc,cl) $(PP_FLAGS) -c -Fotmp/$T_vc.obj $<
$(call tc,wdis) tmp/$T_vc.obj | $(RTRIM) > tmp/$T_vc.obj.disasm
endif
ifneq ($(wildcard $(WATCOM)/binl/wcl),)
$(call tc,wcl) $(PP_FLAGS) -c -fo=tmp/$T_wc.obj $<
$(call tc,wdis) tmp/$T_wc.obj | $(RTRIM) > tmp/$T_wc.obj.disasm
endif
# convert
python wdis2gas.py tmp/$T_wc.obj.disasm tmp/$T.S
$(call tc,gcc) -c -o tmp/$T.o tmp/$T.S
$(call tc,f-objstrip,tmp/$T.o)
$(call tc,objdump) -b elf32-i386 -m i8086 -M intel -dr -j .text.LzmaDecode --no-show -w tmp/$T.o | $(RTRIM) | perl -pe 's/DWORD/dword/g; s/WORD/word/g; s/BYTE/byte/g; s/PTR/ptr/g;' > $@
.PRECIOUS: lzma_d_cf.i lzma_d_cs.i
.PRECIOUS: tmp/lzma_d_cf.i tmp/lzma_d_cs.i
endif
endif
##endif
endif
# Visual C/C++ 1.52 (8.00c)
ifneq ($(wildcard $(VC152DIR)/bin/.),)
c := tc.method-lzma.cl
$c = @$(WINEENV) CL='$(CL)' wine cmd.exe /c tmp/cl.bat
$c += -AS -Gd
$c += -Gy
$c += -O2 -Gf -Gs -G0
$c += -W4
CL := -nologo
CL += -D__INT_MAX__=32767
CL += -I$(shell winepath -s z:$(realpath $(UPX_LZMADIR)))
CL += -I$(shell winepath -s z:$(realpath $(top_srcdir)/src))
endif
lzma_d_cf.% : PP_FLAGS = -DFAST
lzma_d_cs.% : PP_FLAGS = -DSMALL
lzma_d_cf.% : LABEL_PREFIX = .Lf
lzma_d_cs.% : LABEL_PREFIX = .Ls
ifneq ($(wildcard $(WATCOM)/binl/.),)
cc_test_wc : tc_list = method-lzma arch-i086 default
cc_test_wc: cc_test.c $(CC_TEST_DEPS)
$(call tc,wcl) $(PP_FLAGS) -c -fo=tmp/$T.obj $<
$(call tc,wdis) tmp/$T.obj | $(RTRIM) > tmp/$T.obj.disasm
## cat tmp/$T.obj.disasm
endif
# /***********************************************************************
# // cc_test
# ************************************************************************/
ifneq ($(wildcard $(BC502DIR)/bin/.),)
ifneq ($(wildcard $(WATCOM)/binl/wdis),)
CC_TEST_DEPS = $(MAKEFILE_LIST) $(TMP_DEPS)
ifneq ($(wildcard $(BC502DIR)/bin/bcc.exe),)
cc_test_bc : tc_list = method-lzma arch-i086 default
cc_test_bc: cc_test.c $(CC_TEST_DEPS)
$(call tc,bcc) $(PP_FLAGS) -c -otmp/$T.obj $<
$(call tc,wdis) tmp/$T.obj | $(RTRIM) > tmp/$T.obj.disasm
## cat tmp/$T.obj.disasm
cc_test_all: cc_test_bc
endif
ifneq ($(wildcard $(DM849DIR)/bin/.),)
ifneq ($(wildcard $(DM849DIR)/bin/dmc.exe),)
cc_test_dm : tc_list = method-lzma arch-i086 default
cc_test_dm: cc_test.c $(CC_TEST_DEPS)
$(call tc,dmc) $(PP_FLAGS) -c -otmp/$T.obj $<
$(call tc,wdis) tmp/$T.obj | $(RTRIM) > tmp/$T.obj.disasm
## cat tmp/$T.obj.disasm
cc_test_all: cc_test_dm
endif
ifneq ($(wildcard $(VC152DIR)/bin/.),)
ifneq ($(wildcard $(VC152DIR)/bin/cl.exe),)
cc_test_vc : tc_list = method-lzma arch-i086 default
cc_test_vc: cc_test.c $(CC_TEST_DEPS)
$(call tc,cl) $(PP_FLAGS) -c -Fotmp/$T.obj $<
$(call tc,wdis) tmp/$T.obj | $(RTRIM) > tmp/$T.obj.disasm
## cat tmp/$T.obj.disasm
cc_test_all: cc_test_vc
endif
ifneq ($(wildcard $(WATCOM)/binl/wcl),)
cc_test_wc : tc_list = method-lzma arch-i086 default
cc_test_wc: cc_test.c $(CC_TEST_DEPS)
$(call tc,wcl) $(PP_FLAGS) -c -fo=tmp/$T.obj $<
$(call tc,wdis) tmp/$T.obj | $(RTRIM) > tmp/$T.obj.disasm
cc_test_all: cc_test_wc
endif
.PHONY: cc_test_all
endif # wdis
# /***********************************************************************
# // l_test
# ************************************************************************/
L_TEST_DEPS = lzma_d_c.c $(MAKEFILE_LIST) $(TMP_DEPS)
DOSBOX = /usr/bin/time -v dosbox -exit
DOSBOX = dosbox
tmp/l_t_gcc_i386.% : tc_list = arch-i086 default
tmp/l_t_gcc_i386.out: l_test.c $(L_TEST_DEPS)
tmp/l_test_gcc_i386.% : tc_list = arch-i086 default
tmp/l_test_gcc_i386.out: l_test.c $(L_TEST_DEPS)
$(call tc,gcc) -O0 -g -o $@ $<
./$@
l_test_all: tmp/l_test_gcc_i386.out
tmp/l_t_bc.% : tc_list = method-lzma arch-i086 default
tmp/l_t_bc.exe: l_test.c $(L_TEST_DEPS)
ifneq ($(wildcard $(BC502DIR)/bin/bcc.exe),)
tmp/l_test_bc.% : tc_list = method-lzma arch-i086 default
tmp/l_test_bc.exe: l_test.c $(L_TEST_DEPS)
$(call tc,bcc) -o$(subst /,\\,$@) $<
@rm -f l_test.o l_test.obj
$(DOSBOX) $@
cp -p $@ tmp/test.exe && $(DOSBOX) tmp/test.exe
##l_test_all: tmp/l_test_bc.exe
endif
tmp/l_t_dm.% : tc_list = method-lzma arch-i086 default
tmp/l_t_dm.exe: l_test.c $(L_TEST_DEPS)
ifneq ($(wildcard $(DM849DIR)/bin/dmc.exe),)
tmp/l_test_dm.% : tc_list = method-lzma arch-i086 default
tmp/l_test_dm.exe: l_test.c $(L_TEST_DEPS)
$(call tc,dmc) -ml -o$(subst /,\\,$@) $<
@rm -f l_test.o l_test.obj
$(DOSBOX) $@
cp -p $@ tmp/test.exe && $(DOSBOX) tmp/test.exe
l_test_all: tmp/l_test_dm.exe
endif
tmp/l_t_wc.% : tc_list = method-lzma arch-i086 default
tmp/l_t_wc.exe: l_test.c $(L_TEST_DEPS)
$(call tc,wcl) -fe=$@ $<
@rm -f l_test.o l_test.obj
$(DOSBOX) $@
tmp/l_t_vc.% : tc_list = method-lzma arch-i086 default
tmp/l_t_vc.exe: l_test.c $(L_TEST_DEPS)
ifneq ($(wildcard $(VC152DIR)/bin/cl.exe),)
tmp/l_test_vc.% : tc_list = method-lzma arch-i086 default
tmp/l_test_vc.exe: l_test.c $(L_TEST_DEPS)
$(call tc,cl) -Fe$(subst /,\\,$@) $<
@rm -f l_test.o l_test.obj
$(DOSBOX) $@
cp -p $@ tmp/test.exe && $(DOSBOX) tmp/test.exe
l_test_all: tmp/l_test_vc.exe
endif
.PHONY: tmp/l_t_gcc_i386.out tmp/l_t_bc.exe tmp/l_t_dm.exe tmp/l_t_wc.exe tmp/l_t_vc.exe
ifneq ($(wildcard $(WATCOM)/binl/wcl),)
tmp/l_test_wc.% : tc_list = method-lzma arch-i086 default
tmp/l_test_wc.exe: l_test.c $(L_TEST_DEPS)
$(call tc,wcl) -fe=$@ $<
@rm -f l_test.o l_test.obj
cp -p $@ tmp/test.exe && $(DOSBOX) tmp/test.exe
l_test_all: tmp/l_test_wc.exe
endif
.PHONY: l_test_all

View File

@ -41,8 +41,12 @@ class opts:
inline_map = {
"__aNNalshl": "M_aNNalshl",
"__aNahdiff": "M_aNahdiff",
"__aNNalshl": ["M_aNNalshl", 1],
"__aNahdiff": ["M_aNahdiff", 1],
"__PIA": ["M_PIA", 999],
"__PTS": ["M_PTS", 999],
"__PTC": ["M_PTC", 999],
"__U4M": ["M_U4M", 999],
}
@ -63,6 +67,7 @@ def main(argv):
else: assert 0, ("getopt problem:", opt, optarg, xopts, args)
#
assert opts.label_prefix
assert len(args) == 2
ifile = args[0]
ofile = args[1]
@ -100,30 +105,54 @@ def main(argv):
return k
olines = []
def omatch(pos, m):
i = 0
dpos = []
while i < len(m):
def omatch(pos, mlen, m, debug=0):
assert len(m) >= abs(mlen)
def sgn(x):
if x < 0: return -1
if x > 0: return 1
return 0
def match(a, b):
if b is None:
return False
if "^" in a or "*" in a:
# regexp
return re.search(a, b.lower())
else:
return a.lower() == b.lower()
mpos = []
while len(mpos) != abs(mlen):
if pos < 0 or pos >= len(olines):
return []
dpos.append(pos)
o = olines[pos][1:3]
o = olines[pos]
if o[1] != "*DEL*":
mpos.append(pos)
pos += sgn(mlen)
if mlen < 0:
mpos.reverse()
if debug and 1: print mlen, m, [olines[x] for x in mpos]
dpos = []
i = -abs(mlen)
while i < 0:
pos = mpos[i]
o = olines[pos]
assert o[1] != "*DEL*"
assert len(m[i]) == 2, (i, m)
if o[0].lower() != m[i][0].lower():
m0 = match(m[i][0], o[1])
m1 = match(m[i][1], o[2])
if not m0 or not m1:
return []
if o[1].lower() != m[i][1].lower():
return []
pos += 1
dpos.append([pos, m0, m1])
i += 1
assert len(dpos) == abs(mlen)
return dpos
def orewrite_inst(i, inst, args, dpos):
for pos in dpos:
for pos, m0, m1 in dpos:
olines[pos][1] = "*DEL*"
olines[i][1] = inst
olines[i][2] = args
olines[i][3] = None
def orewrite_call(i, k, v, dpos):
for pos in dpos:
for pos, m0, m1 in dpos:
olines[pos][1] = "*DEL*"
v[2] = k
olines[i][2] = None
@ -166,11 +195,16 @@ def main(argv):
if opts.call_rewrite and inst in ["call"]:
k, v = parse_label(inst, args)
if v[:2] == [1, 2]: # external 2-byte
if k == "__LMUL":
if k in ["__LMUL", "__U4M",]:
s = [
["mov", "bx,word ptr [bx]"],
["xor", "cx,cx"],
]
dpos = omatch(i - 1, s[-1:])
dpos = omatch(i-1, -2, s, debug=0)
if 0 and dpos:
orewrite_inst(i, "M_LMUL_dxax_00bx_ptr", "", dpos)
continue
dpos = omatch(i-1, -1, s)
if dpos:
orewrite_inst(i, "M_LMUL_dxax_00bx", "", dpos)
continue
@ -181,37 +215,93 @@ def main(argv):
["push", "word ptr [bp-66]"],
["push", "word ptr [bp-68]"],
]
dpos = omatch(i - 4, s[-4:])
dpos = omatch(i-1, -4, s)
if dpos:
orewrite_inst(i, "*DEL*", "", dpos)
continue
if k == "__PIA":
s = [
["mov", "bx,0x1"],
["xor", "cx,cx"],
]
dpos = omatch(i-1, -2, s)
if dpos:
orewrite_inst(i, "M_PIA1", "", dpos)
continue
if k == "__PTC":
s = [
["jne", "(.*)"],
]
dpos = omatch(i+1, 1, s)
if dpos:
olines[i][1] = "M_PTC_JNE"
k, v = parse_label("jne", dpos[0][2].group(1))
orewrite_call(i, k, v, dpos)
continue
if opts.loop_rewrite and inst in ["loop"]:
s = [
["mov", "cx,0xb"],
["mov", r"^c[lx],0xb$"],
["shr", "dx,1"],
["rcr", "ax,1"],
]
dpos = omatch(i - 3, s[-3:])
dpos = omatch(i-1, -3, s)
if dpos:
orewrite_inst(i, "M_shrd_11", "", dpos)
continue
s = [
["mov", "cl,0x8"],
["mov", r"^c[lx],0x8$"],
["shl", "ax,1"],
["rcl", "dx,1"],
]
dpos = omatch(i - 3, s[-3:])
dpos = omatch(i-1, -3, s)
if dpos:
orewrite_inst(i, "M_shld_8", "", dpos)
continue
s = [
["mov", "cx,0x8"],
["shl", "ax,1"],
["rcl", "dx,1"],
s1 = [
["mov", r"^c[lx],0x8$"],
["shl", r"^word ptr \[bp([+-]\d+)\],1$"],
["rcl", r"^word ptr \[bp([+-]\d+)\],1$"],
]
dpos = omatch(i - 3, s[-3:])
if dpos:
orewrite_inst(i, "M_shld_8", "", dpos)
s2 = [
["mov", r"^dx,word ptr"],
["mov", r"^ax,word ptr"],
]
s3 = [
["mov", r"^ax,word ptr"],
["mov", r"^dx,word ptr"],
]
dpos1 = omatch(i-1, -3, s1)
dpos2 = omatch(i+1, 2, s2)
dpos3 = omatch(i+1, 2, s3)
if dpos1 and (dpos2 or dos3):
bp_dx, bp_ax = dpos1[-1][2].group(1), dpos1[-2][2].group(1)
m = "M_shld_8_bp %s %s" % (bp_dx, bp_ax)
orewrite_inst(i, m, "", dpos1)
continue
s1 = [
["mov", r"^word ptr \[bp([+-]\d+)\],si$"],
["mov", r"^word ptr \[bp([+-]\d+)\],di$"],
["mov", r"^c[lx],0xb$"],
["shr", r"^word ptr \[bp([+-]\d+)\],1$"],
["rcr", r"^word ptr \[bp([+-]\d+)\],1$"],
]
s2 = [
["mov", r"^bx,word ptr"],
["mov", r"^bx,word ptr"],
["mov", r"^ax,word ptr \[bp([+-]\d+)\]$"],
["mov", r"^dx,word ptr \[bp([+-]\d+)\]$"],
]
dpos1 = omatch(i-1, -5, s1)
dpos2 = omatch(i+1, 4, s2)
if dpos1 and dpos2:
bp_dx, bp_ax = dpos1[-2][2].group(1), dpos1[-1][2].group(1)
bp_di, bp_si = dpos1[-4][2].group(1), dpos1[-5][2].group(1)
assert bp_dx == dpos2[-1][2].group(1)
assert bp_ax == dpos2[-2][2].group(1)
assert bp_dx == bp_di
assert bp_ax == bp_si
m = "M_shrd_11_disi_bp %s %s" % (bp_dx, bp_ax)
orewrite_inst(i, m, "", dpos1 + dpos2[-2:])
continue
#
if inst in [
@ -241,11 +331,11 @@ def main(argv):
if opts.auto_inline and inst == "call":
v = labels[args_label]
if v[:2] == [1, 2]: # external 2-byte
if v[3] == 1: # only one call
x = inline_map.get(v[2])
x = inline_map.get(v[2])
if x and v[3] <= x[1]: # max. number of calls
##print "inline", v, x
if x:
olines[i][1] = x
olines[i][1] = x[0]
olines[i][2] = "/* inlined */"
olines[i][2] = ""
olines[i][3] = None

View File

@ -52,16 +52,29 @@
// umul32: dx:ax = dx:ax * 00:bx
.macro M_LMUL_dxax_00bx
// mult high-word
mov cx, ax // cx: save ax
mov cx, ax // save ax
mov ax, dx
mul bx
xchg ax, cx // save high-word result, get orig ax
xchg ax, cx // save high-word result, get saved ax
// mult low-word
mul bx // dx:ax := ax * bx
// add high-word
add dx, cx // add high-word result
.endm
// umul32: dx:ax = dx:ax * word ptr [bx]
.macro M_LMUL_dxax_00bx_ptr
// mult high-word
mov cx, ax // save ax
mov ax, dx
mul word ptr [bx]
xchg ax, cx // save high-word result, get saved ax
// mult low-word
mul word ptr [bx]
// add high-word
add dx, cx // add high-word result
.endm
// umul32: dx:ax = ax:cx * 00:bx
.macro M_LMUL_axcx_00bx
@ -81,13 +94,20 @@
mov dl, ah
mov ah, al
xor al, al
//xor cx, cx // FIXME - do we need this ?
.endm
.macro M_shld_8_bp h l
mov dx, word ptr[bp+h]
mov ax, word ptr[bp+l]
M_shld_8
mov word ptr[bp+h], dx
mov word ptr[bp+l], ax
.endm
// shld: dx:ax >>= 11
.macro M_shrd_11
#if 1
#if 0
mov al, ah
mov ah, dl
mov dl, dh
@ -99,33 +119,69 @@
shr dx
rcr ax
#else
mov bx, dx
// WARNING: this trashes "bx" !
mov cl, 11
shr dx, cl
mov bx, dx // save dx
shr ax, cl
mov cl, 5
shr dx, cl
mov cl, 5 // cl = 16 - cl
shl bx, cl
or ax, bx
#endif
//xor cx, cx // FIXME - do we need this ?
.endm
.macro M_shrd_11_bp h l
mov dx, word ptr[bp+h]
mov ax, word ptr[bp+l]
M_shrd_11
mov word ptr[bp+h], dx
mov word ptr[bp+l], ax
.endm
.macro M_shrd_11_disi_bp h l
mov dx, di
mov ax, si
M_shrd_11
mov word ptr[bp+h], dx
mov word ptr[bp+l], ax
.endm
#if 0
// shld: dx:ax <<= cl; trashes register "r1" (bx, di, si or bp)
// REQUIRED: 0 <= cl < 32
// FIXME - this does not work yet
.macro M_shld r1
local L1
// shld: dx:ax <<= cl; trashes cl and register "r1" (bx, di, si or bp)
// REQUIRED: 0 <= cl <= 15
.macro M_shld_00_15 r1
mov r1, ax // save ax
shl dx, cl
shl ax, cl
neg cl
and cl, 15 // the 8086 uses all eight bits of the shift count
sub cl, 16
neg cl // cl = 16 - cl
shr r1, cl
or dx, r1
.endm
#endif
// shld: dx:ax <<= cl; trashes cl
// REQUIRED: 16 <= cl <= 32
.macro M_shld_16_32
sub cl, 16
shr ax, cl
mov dx, ax
xor ax, ax
.endm
// shld: dx:ax <<= cl; trashes cl and register "r1" (bx, di, si or bp)
// REQUIRED: 0 <= cl <= 32
.macro M_shld r1
local L1, L2
cmp cl, 16
jaes L1
// 0 <= cl <= 15
M_shld_00_15 r1
jmps L2
L1:
// 16 <= cl <= 32
M_shld_16_32
L2:
.endm
/*************************************************************************
@ -134,6 +190,36 @@
section LZMA_DEC99
.macro M_PIA
M_WCC_PIA
.endm
.macro M_PIA1
#if 1
local L1
inc ax
jnes L1
//add dx, __AHINCR
add dh, __AHINCR >> 8
L1:
#else
add ax, 1
sbb bl, bl
and bl, __AHINCR >> 8
add dh, bl
#endif
.endm
.macro M_PTC
M_WCC_PTC
.endm
.macro M_PTC_JNE l
cmp ax, bx
jnes l
cmp dx, cx
jnes l
.endm
.macro M_PTS
.endm
/*************************************************************************
//
@ -145,7 +231,7 @@ section LZMA_DEC00
push ds
mov bp, sp
#if 1
#if 0
// DEBUG - check for enough stack
lea bx, [bp + lzma_stack_adjust - 256]
cmp bp, bx
@ -229,5 +315,4 @@ section LZMA_DEC31
mov es, ax
// vi:ts=4:et

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -139,7 +139,7 @@
#define __AHINCR (1 << __AHSHIFT) /* 4096 */
#if 0
#if 1
// huge pointer add: dx:ax = dx:ax + cx:bx
.macro M_WCC_PIA
add ax, bx
@ -177,7 +177,7 @@
#endif
#if 0
#if 1
// huge pointer compare: set zero and carry flags: dx:ax cmp cx:bx
.macro M_WCC_PTC
// FIXME: should we normalize the pointers ???

View File

@ -111,7 +111,7 @@ def main(argv):
olines.append(" call " + f)
elif 1:
s = m.group(3).strip()
s = re.sub("L\$(\d+)", opts.label_prefix + "\g<1>", s)
s = re.sub(r"L\$(\d+)", opts.label_prefix + r"\g<1>", s)
olines.append(" " + s)
else:
s = re.split(r"\s+", m.group(1).strip())

View File

@ -45,26 +45,26 @@ Idx Name Size VMA LMA File off Algn Flags
40 N2E64K02 0000000b 00000000 00000000 00000290 2**0 CONTENTS, READONLY
41 NRV2EEX9 00000004 00000000 00000000 0000029b 2**0 CONTENTS, READONLY
42 LZMA_DEC99 00000000 00000000 00000000 0000029f 2**0 CONTENTS, READONLY
43 LZMA_DEC00 00000043 00000000 00000000 0000029f 2**0 CONTENTS, RELOC, READONLY
44 LZMA_DEC10 00001203 00000000 00000000 000002e2 2**0 CONTENTS, READONLY
45 LZMA_DEC20 00001203 00000000 00000000 000014e5 2**0 CONTENTS, READONLY
46 LZMA_DEC30 00000006 00000000 00000000 000026e8 2**0 CONTENTS, RELOC, READONLY
47 LZMA_DEC31 00000007 00000000 00000000 000026ee 2**0 CONTENTS, RELOC, READONLY
48 EXEMAIN5 00000001 00000000 00000000 000026f5 2**0 CONTENTS, READONLY
49 EXEADJUS 00000007 00000000 00000000 000026f6 2**0 CONTENTS, READONLY
50 EXENOADJ 00000002 00000000 00000000 000026fd 2**0 CONTENTS, READONLY
51 EXERELO1 0000001e 00000000 00000000 000026ff 2**0 CONTENTS, RELOC, READONLY
52 EXEREL9A 00000012 00000000 00000000 0000271d 2**0 CONTENTS, RELOC, READONLY
53 EXERELO2 00000004 00000000 00000000 0000272f 2**0 CONTENTS, READONLY
54 EXEREBIG 00000002 00000000 00000000 00002733 2**0 CONTENTS, RELOC, READONLY
55 EXERELO3 00000002 00000000 00000000 00002735 2**0 CONTENTS, RELOC, READONLY
56 EXEMAIN8 00000003 00000000 00000000 00002737 2**0 CONTENTS, READONLY
57 DEVICEEND 00000013 00000000 00000000 0000273a 2**0 CONTENTS, READONLY
58 EXESTACK 00000006 00000000 00000000 0000274d 2**0 CONTENTS, RELOC, READONLY
59 EXESTASP 00000003 00000000 00000000 00002753 2**0 CONTENTS, RELOC, READONLY
60 EXEJUMPF 00000005 00000000 00000000 00002756 2**0 CONTENTS, RELOC, READONLY
61 EXERCSPO 00000004 00000000 00000000 0000275b 2**0 CONTENTS, RELOC, READONLY
62 EXERETIP 00000006 00000000 00000000 0000275f 2**0 CONTENTS, RELOC, READONLY
43 LZMA_DEC00 0000003b 00000000 00000000 0000029f 2**0 CONTENTS, RELOC, READONLY
44 LZMA_DEC10 000011a4 00000000 00000000 000002da 2**0 CONTENTS, READONLY
45 LZMA_DEC20 000011a4 00000000 00000000 0000147e 2**0 CONTENTS, READONLY
46 LZMA_DEC30 00000006 00000000 00000000 00002622 2**0 CONTENTS, RELOC, READONLY
47 LZMA_DEC31 00000007 00000000 00000000 00002628 2**0 CONTENTS, RELOC, READONLY
48 EXEMAIN5 00000001 00000000 00000000 0000262f 2**0 CONTENTS, READONLY
49 EXEADJUS 00000007 00000000 00000000 00002630 2**0 CONTENTS, READONLY
50 EXENOADJ 00000002 00000000 00000000 00002637 2**0 CONTENTS, READONLY
51 EXERELO1 0000001e 00000000 00000000 00002639 2**0 CONTENTS, RELOC, READONLY
52 EXEREL9A 00000012 00000000 00000000 00002657 2**0 CONTENTS, RELOC, READONLY
53 EXERELO2 00000004 00000000 00000000 00002669 2**0 CONTENTS, READONLY
54 EXEREBIG 00000002 00000000 00000000 0000266d 2**0 CONTENTS, RELOC, READONLY
55 EXERELO3 00000002 00000000 00000000 0000266f 2**0 CONTENTS, RELOC, READONLY
56 EXEMAIN8 00000003 00000000 00000000 00002671 2**0 CONTENTS, READONLY
57 DEVICEEND 00000013 00000000 00000000 00002674 2**0 CONTENTS, READONLY
58 EXESTACK 00000006 00000000 00000000 00002687 2**0 CONTENTS, RELOC, READONLY
59 EXESTASP 00000003 00000000 00000000 0000268d 2**0 CONTENTS, RELOC, READONLY
60 EXEJUMPF 00000005 00000000 00000000 00002690 2**0 CONTENTS, RELOC, READONLY
61 EXERCSPO 00000004 00000000 00000000 00002695 2**0 CONTENTS, RELOC, READONLY
62 EXERETIP 00000006 00000000 00000000 00002699 2**0 CONTENTS, RELOC, READONLY
SYMBOL TABLE:
00000000 l d DEVICEENTRY 00000000 DEVICEENTRY
00000000 l d EXEENTRY 00000000 EXEENTRY
@ -255,15 +255,14 @@ OFFSET TYPE VALUE
RELOCATION RECORDS FOR [LZMA_DEC00]:
OFFSET TYPE VALUE
00000005 R_386_16 lzma_stack_adjust
0000000d R_386_16 lzma_stack_adjust
00000015 R_386_16 lzma_u_len_hi
00000019 R_386_16 lzma_u_len
00000023 R_386_16 lzma_c_len_hi
00000027 R_386_16 lzma_c_len
00000033 R_386_16 lzma_properties_hi
00000039 R_386_16 lzma_properties
0000003e R_386_PC16 LZMA_DEC10
00000041 R_386_PC16 LZMA_DEC30
0000000d R_386_16 lzma_u_len_hi
00000011 R_386_16 lzma_u_len
0000001b R_386_16 lzma_c_len_hi
0000001f R_386_16 lzma_c_len
0000002b R_386_16 lzma_properties_hi
00000031 R_386_16 lzma_properties
00000036 R_386_PC16 LZMA_DEC10
00000039 R_386_PC16 LZMA_DEC30
RELOCATION RECORDS FOR [LZMA_DEC30]:
OFFSET TYPE VALUE