wok annotate linld/stuff/src/pipehole.awk @ rev 21750

tazboot: shrink
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Jun 15 16:18:19 2019 +0200 (2019-06-15)
parents f9e283da869a
children 74a62a08433a
rev   line source
pascal@21750 1 BEGIN { hold=0; is386=0; isload=0; isiso=0; istazboot=0; wascall=0 }
pascal@20458 2 function isnum(n) { return match(n,/^[0-9+-]/) }
pascal@20458 3 {
pascal@20632 4 sub(/segment word public/,"segment byte public")
pascal@20634 5
pascal@21576 6 if (/^@.*:$/ || / endp$/) afterjmp=0
pascal@21729 7 if (/dword ptr/) is386=1
pascal@21750 8 if (/vid_mode = vid_mode/) isload=2
pascal@21750 9 if (isload == 2) { # LOAD.LST
pascal@21750 10 sub(/,0/,""); sub(/cmp /,"mov cx,")
pascal@21750 11 sub(/je/,"jcxz")
pascal@21750 12 if (/ax,word/) next
pascal@21750 13 sub(/,ax/,",cx")
pascal@21750 14 if (/version_string/) isload=0
pascal@21750 15 }
pascal@21729 16 if (/heap_top = _rm_buf/) isload=1
pascal@21750 17 if (isload == 1) { # LOAD.LST
pascal@21729 18 if (/mov al,byte ptr/ && is386) {
pascal@21729 19 print " movzx eax,byte ptr [si]"
pascal@21729 20 next
pascal@21729 21 }
pascal@21729 22 if (/ax,word ptr/) next
pascal@21729 23 if (/^ call/) isload=0
pascal@21729 24 }
pascal@21735 25 if (/x->curdirsize == 0xFFFF/) isiso=4
pascal@21735 26 if (isiso == 4) { # ISO9660.LST
pascal@21747 27 sub(/DGROUP:_isostate\+14/,"[si+14]")
pascal@21747 28 sub(/DGROUP:_isostate\+16/,"[si+16]")
pascal@21747 29 if (/goto restarted/) isiso=0
pascal@21735 30 }
pascal@21750 31 if (/c = \*s; \*s = 0;/) isiso=3
pascal@21750 32 if (isiso == 3) { # ISO9660.LST, TAZBOOT.LST
pascal@21735 33 if (/al,byte ptr/) {
pascal@21735 34 print " mov al,0"
pascal@21735 35 sub(/mov/,"xchg")
pascal@21735 36 }
pascal@21750 37 if (/byte ptr \[.*\],0/) {
pascal@21735 38 isiso=0
pascal@21735 39 next
pascal@21735 40 }
pascal@21735 41 }
pascal@21735 42 if (/endname = NULL/) isiso=2
pascal@21735 43 if (isiso == 2) { # ISO9660.LST
pascal@21735 44 if (/mov bx,cx/) next
pascal@21735 45 gsub(/cx/,"bx")
pascal@21747 46 sub(/DGROUP:_isostate\+31/,"[si+31]")
pascal@21735 47 }
pascal@21735 48 if (/const char \*n = name/) isiso=1
pascal@21735 49 if (isiso == 1) { # ISO9660.LST
pascal@21735 50 if ((/mov word ptr \[si\+32\],ax/ ) ||
pascal@21735 51 (/mov ax,word ptr \[si\+28\]/) ||
pascal@21735 52 (/bx,word ptr \[si\+32\]/) || (/ax,dx/)) next
pascal@21729 53 if (/dx,/) sub(/dx/,"ax")
pascal@21735 54 if ((/sub ax,word ptr \[si\+28\]/) ||
pascal@21735 55 (/\[si\+12\]/) || (/ax,di/)) sub(/ax/,"bx")
pascal@21735 56 if (/add word ptr \[si\+32\],ax/) $0=" add bx,word ptr [si+12]"
pascal@21735 57 if (/al,/ || /,al/) sub(/al/,"cl")
pascal@21735 58 if (/cmp byte ptr \[si\+30\],0/) $0=" or cl,cl"
pascal@21735 59 if (/jne @@0$/) next
pascal@21735 60 if (/jmp @3@58$/) $0=" je @3@58"
pascal@21729 61 }
pascal@21750 62 if (/isoopen\(s\+7\) != -1/) isotazboot=8
pascal@21750 63 if (isotazboot == 8) { # TAZBOOT.LST
pascal@21750 64 if (/ax,si/) next
pascal@21750 65 sub(/ax,ax/,"si,si")
pascal@21750 66 if (/magic/) isotazboot=0
pascal@21750 67 }
pascal@21750 68 if (/\+\+isknoppix/) isotazboot=7
pascal@21750 69 if (isotazboot == 7) { # TAZBOOT.LST
pascal@21750 70 if (/al,byte/) sub (/al,byte ptr DGROUP:/,"bx,offset ")
pascal@21750 71 if (/inc/) sub (/al/,"word ptr [bx]")
pascal@21750 72 if (/,al/) next
pascal@21750 73 if (/isokernel/) isotazboot=0
pascal@21750 74 }
pascal@21750 75 if (/if \(c\) s\+\+;/) isotazboot=6
pascal@21750 76 if (isotazboot == 6) { # TAZBOOT.LST
pascal@21750 77 if (/cmp/) {
pascal@21750 78 $0=" cmp al,0"
pascal@21750 79 isotazboot=0
pascal@21750 80 }
pascal@21750 81 }
pascal@21750 82 if (/initrd_state.info\[m->state\]/) isotazboot=5
pascal@21750 83 if (isotazboot == 5) { # TAZBOOT.LST
pascal@21750 84 if (/cx,ax/) $0=" xchg ax,bx"
pascal@21750 85 if (/mov ax,word ptr \[si\]/) $0=" lodsw"
pascal@21750 86 if (/ax,word ptr \[si\+28\]/) next
pascal@21750 87 if (/bx,cx/) next
pascal@21750 88 if (/endp/) isotazboot=0
pascal@21750 89 }
pascal@21750 90 if (/0x7FF0/) isotazboot=4
pascal@21750 91 if (isotazboot == 4) { # TAZBOOT.LST
pascal@21750 92 if (/ax,word ptr/) {
pascal@21750 93 print " mov ax,32752"
pascal@21750 94 sub(/mov/,"sub")
pascal@21750 95 }
pascal@21750 96 if (/bx,/ || /cx,/ || /dx,/) next
pascal@21750 97 sub(/,bx/,",0")
pascal@21750 98 sub(/,cx/,",ax")
pascal@21750 99 if (/short/) isotazboot=0
pascal@21750 100 }
pascal@21750 101 if (/c = x->filename/) isotazboot=3
pascal@21750 102 if (isotazboot == 3) { # TAZBOOT.LST
pascal@21750 103 if (/ax,/) $0=" xchg ax,bx"
pascal@21750 104 if (/\]$/) next
pascal@21750 105 if (/@strcpy\$qpxzct1/) isotazboot=0
pascal@21750 106 }
pascal@21750 107 if (/memtop/) isotazboot=2
pascal@21750 108 if (isotazboot == 2) { # TAZBOOT.LST
pascal@21750 109 if (/DGROUP:_base_himem\+2,dx/) print " mov bx,offset _base_himem"
pascal@21750 110 sub(/DGROUP:_base_himem,/,"[bx],")
pascal@21750 111 sub(/DGROUP:_base_himem\+2,/,"[bx+2],")
pascal@21750 112 sub(/DGROUP:_base_himem\+3,/,"[bx+3],")
pascal@21750 113 if (/ax,word ptr \[bx\+2\]/ || /\[bp-4\],ax/) sub(/ax/,"bx")
pascal@21750 114 if (/bx,ax/) next
pascal@21750 115 if (/@strcmp\$qpxzct1/) isotazboot=0
pascal@21750 116 }
pascal@21750 117 if (/static void addinitrd/) isotazboot=1
pascal@21750 118 if (isotazboot == 1 || isotazboot == 100) { # TAZBOOT.LST
pascal@21750 119 if (/m->next_chunk = next_chunk/) isotazboot=100
pascal@21750 120 if (/load_initrd/) isotazboot=1
pascal@21750 121 if (/push si/ && isotazboot == 1) next
pascal@21750 122 if (/pop si/) next
pascal@21750 123 sub(/\[si\]/,"[bx]")
pascal@21750 124 sub(/si,/,"bx,")
pascal@21750 125 sub(/si\+/,"bx+")
pascal@21750 126 if (/mov cx,ax/) $0=" xchg ax,bx"
pascal@21750 127 if (/bx,cx/) next
pascal@21750 128 sub(/cx/,"bx")
pascal@21750 129 sub(/DGROUP:_imgs\+38/,"[bx+38]")
pascal@21750 130 sub(/DGROUP:_imgs\+40/,"[bx+40]")
pascal@21750 131 if (/static void bootiso/) isotazboot=0
pascal@21750 132 }
pascal@21729 133 if (wascall) {
pascal@21729 134 if (rcall != "") {
pascal@21729 135 if (/,ax$/) print " mov " rcall ",ax"
pascal@21729 136 else print " xchg ax," rcall
pascal@21729 137 wascall=0
pascal@21729 138 }
pascal@21729 139 else if (/^ mov .i,ax$/) {
pascal@21729 140 split($2,y,",")
pascal@21729 141 rcall=y[1]
pascal@21729 142 next
pascal@21729 143 }
pascal@21729 144 else wascall=0
pascal@21729 145 }
pascal@21729 146 if (/^ call /) { wascall=1; rcall="" }
pascal@20458 147 if (hold == 0) {
pascal@20458 148 s=$0
pascal@20534 149 if (/^ mov .[ix],bx$/ || /^ mov .[ix],.i$/) {
pascal@20543 150 r=$2; kept=0
pascal@20458 151 hold=1; split($2,regs,","); next
pascal@20458 152 }
pascal@21729 153 if (/^ inc e?.[ixhl]/ || /^ dec e?.[ixhl]/) {
pascal@20458 154 hold=2; r=$2; next
pascal@20458 155 }
pascal@20458 156 if (/^ mov [abcds][ix],/ && ! /,.s/) {
pascal@20458 157 hold=3; split($2,regs,","); next
pascal@20458 158 }
pascal@20458 159 if (/^ movzx eax,ax$/) { hold=4; next }
pascal@20544 160 if (/^ cmp word ptr/ || /^ cmp [bcd]x,/) {
pascal@20543 161 split($0,regs,",")
pascal@20543 162 if (isnum(regs[2]) && regs[2] != 0 &&
pascal@20543 163 (regs[2] % 256) == 0) {
pascal@20549 164 hold=5; next
pascal@20543 165 }
pascal@20543 166 }
pascal@20630 167 if (/^ mov ax,cs$/) { hold=6; kept=0; next }
pascal@20630 168 if (/^ mov cl,4$/) { hold=7; next }
pascal@20630 169 if (/^ cmp word ptr DGROUP:.*,0$/) {
pascal@20630 170 hold=8; split($2,regs,","); next
pascal@20630 171 }
pascal@20634 172 if (/^ cbw/) { hold=11; kept=0; next }
pascal@20634 173 if (/^ add [abcds][ix],2$/) {
pascal@20634 174 split($2,regs,","); hold=12; next
pascal@20634 175 }
pascal@20634 176 if (/^ sub [abcds][ix],2$/) {
pascal@20634 177 split($2,regs,","); hold=13; next
pascal@20634 178 }
pascal@21569 179 if (/^ push dx$/) {
pascal@21569 180 hold=14; next;
pascal@21569 181 }
pascal@20458 182 }
pascal@20458 183 else if (hold == 1) {
pascal@20543 184 if (/^ ;/) { line[kept++]=$0; next }
pascal@20458 185 hold=0; split($2,args,","); op=""
pascal@20458 186 if ($1 == "add") op="+"
pascal@20458 187 if ($1 == "sub") op="-"
pascal@20751 188 if ($1 == "inc") { op="+"; args[2]="1"; }
pascal@20751 189 if ($1 == "dec") { op="-"; args[2]="1"; }
pascal@20543 190 if (op != "" && regs[1] == args[1]) {
pascal@20543 191 if (isnum(args[2])) {
pascal@20630 192 for (i = kept++; i > 0; i--) line[i] = line[i-1]
pascal@20630 193 line[0] = "\tlea\t" regs[1] ",[" regs[2] op args[2] "]"
pascal@20630 194 hold=10; next
pascal@20543 195 }
pascal@20543 196 line[kept++]=$0
pascal@20543 197 hold=1
pascal@20458 198 next
pascal@20458 199 }
pascal@20520 200 if (/^ pop [ds]i/ && regs[2] ~ /^[ds]i$/) {
pascal@20520 201 print " xchg " r
pascal@20520 202 }
pascal@20543 203 else print s
pascal@20543 204 for (i = 0; i < kept; i++) print line[i]; kept=0
pascal@20458 205 }
pascal@20458 206 else if (hold == 2) {
pascal@21729 207 split($0,args,",")
pascal@21729 208 if (/^ mov / && r == args[2]) { print s; s=$0; next }
pascal@21729 209 split($2,args,",")
pascal@21729 210 hold=0; print s
pascal@20458 211 if ($1 == "or" && r == args[1] && r == args[2]) next # don't clear C ...
pascal@20458 212 }
pascal@20458 213 else if (hold == 3) {
pascal@20458 214 hold=0
pascal@21576 215 if (/^ call / && regs[2] == "ax") s=" xchg ax," regs[1]
pascal@20542 216 if (/^ add [abcds][ix],/) {
pascal@20458 217 split($2,regs2,",")
pascal@20458 218 if (regs[1] == regs2[1] && (regs2[2] == "offset" || isnum(regs2[2]))) {
pascal@20549 219 t=$0; sub(/mov/,$1,s); sub(/add/,"mov",t)
pascal@20458 220 print t; print s; next
pascal@20458 221 }
pascal@20458 222 }
pascal@20458 223 print s
pascal@20458 224 }
pascal@20458 225 else if (hold == 4) {
pascal@20458 226 hold=0
pascal@20458 227 if (/^ push eax$/) {
pascal@20458 228 print " push 0"; print " push ax"; next
pascal@20458 229 } else { print s }
pascal@20458 230 }
pascal@20543 231 else if (hold == 5) {
pascal@20543 232 hold=0
pascal@20543 233 if ($1 == "jae" || $1 == "jb") {
pascal@20544 234 sub(/word ptr/,"byte ptr",s); sub(/x,/,"h,",s) ||
pascal@20543 235 sub(/\],/,"+1],",s) || sub(/,/,"+1,",s)
pascal@20543 236 s = s "/256"
pascal@20543 237 }
pascal@20543 238 print s
pascal@20543 239 }
pascal@20630 240 else if (hold == 6) {
pascal@20630 241 if (($1 == "and" || $1 == "add") && $2 ~ /^ax,/) {
pascal@20630 242 line[kept++]=$0
pascal@20630 243 next
pascal@20630 244 }
pascal@20630 245 p=$0
pascal@20630 246 if (/^ movzx eax,ax$/) {
pascal@20630 247 s=" mov eax,cs"; p=""
pascal@20630 248 }
pascal@20630 249 print s
pascal@20630 250 for (i = 0; i < kept; i++) print line[i]; kept=0
pascal@20630 251 if (p != "") print p
pascal@20630 252 hold=0; next
pascal@20630 253 }
pascal@20630 254 else if (hold == 7) {
pascal@20458 255 hold=0
pascal@20520 256 if (/^ call near ptr N_LXURSH@$/) {
pascal@20520 257 print " extrn N_LXURSH@4:near"
pascal@20520 258 print " call near ptr N_LXURSH@4"
pascal@20520 259 next
pascal@20520 260 }
pascal@20528 261 if (/^ call near ptr N_LXLSH@$/) {
pascal@20528 262 print " extrn N_LXLSH@4:near"
pascal@20528 263 print " call near ptr N_LXLSH@4"
pascal@20528 264 next
pascal@20528 265 }
pascal@20520 266 print s
pascal@20458 267 }
pascal@20630 268 else if (hold == 8) {
pascal@20630 269 if ($1 == "je" || $1 == "jne") { p=$0; hold=9; next }
pascal@20630 270 hold=0
pascal@20630 271 print s
pascal@20630 272 }
pascal@20630 273 else if (hold == 9) {
pascal@20630 274 hold=0; split($2,args,",")
pascal@20630 275 if (/^ mov ax,/ && args[2] == regs[1]) {
pascal@20630 276 print; print " or ax,ax"; print p; next
pascal@20630 277 }
pascal@20630 278 print s; print p;
pascal@20630 279 }
pascal@20630 280 else if (hold == 10) {
pascal@20751 281 split($2,args,","); op=""
pascal@20751 282 if ($1 == "add") op="+"
pascal@20751 283 if ($1 == "sub") op="-"
pascal@20751 284 if ($1 == "inc") { op="+"; args[2]="1"; }
pascal@20751 285 if ($1 == "dec") { op="-"; args[2]="1"; }
pascal@20751 286 if (op != "" && isnum(args[2])) {
pascal@20751 287 split(line[0],reg,",")
pascal@20751 288 if (substr(reg[1],length(reg[1])-1,2) == args[1]) {
pascal@20751 289 line[0] = substr(line[0],1,length(line[0])-1) op args[2] "]"
pascal@20751 290 next
pascal@20751 291 }
pascal@20751 292 }
pascal@20630 293 hold=0
pascal@20630 294 if (/^ mov [sd]i,ax$/) {
pascal@20630 295 split($2,args,",")
pascal@20630 296 for (i = 0; i < kept; i++) {
pascal@20630 297 sub(/ax/,args[1],line[i]); print line[i]
pascal@20630 298 }
pascal@20630 299 next
pascal@20630 300 }
pascal@20630 301 for (i = 0; i < kept; i++) print line[i]
pascal@20630 302 }
pascal@20634 303 else if (hold == 11) {
pascal@20634 304 if (/^ inc ax$/ || /^ dec ax$/) {
pascal@20634 305 line[kept++]=$0; next
pascal@20634 306 }
pascal@20634 307 split($2,args,",")
pascal@20634 308 if (/^ mov cl,/) {
pascal@20634 309 split($2,args,",")
pascal@20634 310 if (args[2] >= 8) {
pascal@20634 311 line[kept++]=$0; next
pascal@20634 312 }
pascal@20634 313 }
pascal@20634 314 if (!/^ shl ax,/ || (args[2] != "cl" && args[2] < 8)) {
pascal@20634 315 print " cbw "
pascal@20634 316 }
pascal@20634 317 for (i = 0; i < kept; i++) print line[i]
pascal@20634 318 hold=kept=0
pascal@20634 319 }
pascal@20634 320 else if (hold == 12) {
pascal@20634 321 hold=0
pascal@20634 322 if ($1 != "adc" && $1 != "sbb" && ! /^ jn?[abc]/) {
pascal@20634 323 print " inc " regs[1]
pascal@20634 324 print " inc " regs[1]
pascal@20634 325 }
pascal@20634 326 else print " add " regs[1] ",2"
pascal@20634 327 }
pascal@20634 328 else if (hold == 13) {
pascal@20634 329 hold=0
pascal@20634 330 if ($1 != "adc" && $1 != "sbb" && ! /^ jn?[abc]/) {
pascal@20634 331 print " dec " regs[1]
pascal@20634 332 print " dec " regs[1]
pascal@20634 333 }
pascal@20634 334 else print " sub " regs[1] ",2"
pascal@20634 335 }
pascal@21569 336 else if (hold == 14) {
pascal@21569 337 if (/^ push ax$/) { hold++; next; }
pascal@21569 338 print " push dx";
pascal@21569 339 hold=0;
pascal@21569 340 }
pascal@21569 341 else if (hold == 15) {
pascal@21569 342 if (/^ pop eax$/) { hold++; next; }
pascal@21569 343 print " push dx";
pascal@21569 344 print " push ax";
pascal@21569 345 hold=0;
pascal@21569 346 }
pascal@21569 347 else if (hold == 16) {
pascal@21569 348 hold=0;
pascal@21569 349 if (/^ shr eax,16$/) { print " xchg ax,dx"; next; }
pascal@21569 350 print " push dx";
pascal@21569 351 print " push ax";
pascal@21569 352 print " pop eax";
pascal@21569 353 }
pascal@21569 354 else if (hold == 17) {
pascal@21569 355 hold=0;
pascal@21569 356 if (/^ cmp ax,-1$/) { print " inc ax"; next; }
pascal@21569 357 }
pascal@21576 358 if (/^ call near ptr @fileexist\$/ || # return boolean :
pascal@21576 359 /^ call near ptr @isoreaddir\$/ || # 0=true, -1=false
pascal@21628 360 /^ call near ptr @isoreset\$/ ||
pascal@21628 361 /^ call near ptr @isoopen\$/ ||
pascal@21628 362 /^ call near ptr @isoreadsector\$/ ||
pascal@21628 363 /^ call near ptr @strhead\$/ ||
pascal@21576 364 /^ call near ptr @argstr\$/ ||
pascal@21576 365 /^ call near ptr @argnum\$/) { print; hold=17; next; }
pascal@20458 366 s=$0
pascal@20458 367 # These optimisation may break ZF or CF
pascal@20485 368 if (/^ sub sp,2$/) { print " push ax"; next }
pascal@20485 369 if (/^ sub sp,4$/) { print " push ax"; print " push ax"; next }
pascal@20485 370 if (/^ add sp,4$/) { print " pop cx"; print " pop cx"; next }
pascal@20458 371 if (/^ mov d*word ptr .*,0$/ || /^ mov dword ptr .*,large 0$/) {
pascal@20458 372 sub(/mov/,"and",s); print s; next # slower
pascal@20458 373 }
pascal@20458 374 if (/^ mov d*word ptr .*,-1$/ || /^ mov dword ptr .*,large -1$/) {
pascal@20458 375 sub(/mov/,"or",s); print s; next # slower
pascal@20458 376 }
pascal@20458 377 if (/^ or .*,0$/ || /^ and .*,-1$/) next
pascal@20458 378 if (/^ or [abcd]x,/) {
pascal@20458 379 split($2,args,",")
pascal@20458 380 if (isnum(args[2]) && args[2] >= 0 && args[2] < 256) {
pascal@20458 381 print " or " substr(args[1],1,1) "l," args[2]; next
pascal@20458 382 }
pascal@20458 383 }
pascal@20458 384 if (/^ and [abcd]x,/) {
pascal@20458 385 split($2,args,",")
pascal@20459 386 if (isnum(args[2]) && args[2] >= -256 && args[2] < 0) {
pascal@20458 387 print " and " substr(args[1],1,1) "l," args[2]; next
pascal@20458 388 }
pascal@20458 389 }
pascal@20458 390 if (/^ or e[abcd]x,/) {
pascal@20458 391 split($2,args,",")
pascal@20458 392 if (args[2] == "large") { args[2] = $3 }
pascal@20458 393 if (isnum(args[2]) && args[2] >= 0 && args[2] < 256) {
pascal@20458 394 print " or " substr(args[1],2,1) "l," args[2]; next
pascal@20458 395 }
pascal@20458 396 }
pascal@20458 397 if (/^ and e[abcd]x,/) {
pascal@20458 398 split($2,args,",")
pascal@20458 399 if (args[2] == "large") { args[2] = $3 }
pascal@20459 400 if (isnum(args[2]) && args[2] >= -256 && args[2] < 0) {
pascal@20458 401 print " and " substr(args[1],2,1) "l," args[2]; next
pascal@20458 402 }
pascal@20458 403 }
pascal@20458 404 if (/^ or e[abcds][ix],/) {
pascal@20458 405 split($2,args,",")
pascal@20458 406 if (args[2] == "large") { args[2] = $3 }
pascal@20458 407 if (isnum(args[2]) && args[2] >= 0 && args[2] < 65536) {
pascal@20458 408 print " or " substr(args[1],2) "," args[2]; next
pascal@20458 409 }
pascal@20458 410 }
pascal@20458 411 if (/^ and e[abcds][ix],/) {
pascal@20458 412 split($2,args,",")
pascal@20458 413 if (args[2] == "large") { args[2] = $3 }
pascal@20459 414 if (isnum(args[2]) && args[2] >= -65536 && args[2] < 0) {
pascal@20458 415 print " and " substr(args[1],2) "," args[2]; next
pascal@20458 416 }
pascal@20458 417 }
pascal@20543 418 if (/^ add word ptr/ || /^ sub word ptr/ ||
pascal@20544 419 /^ add [bcd]x,/ || /^ sub [bcd]x,/) {
pascal@20542 420 split($0,args,",")
pascal@20542 421 if (isnum(args[2]) && (args[2] % 256 == 0)) {
pascal@20544 422 sub(/word ptr/,"byte ptr",s); sub(/x,/,"h,",s) ||
pascal@20543 423 sub(/\],/,"+1],",s) || sub(/,/,"+1,",s)
pascal@20542 424 print s "/256"; next
pascal@20542 425 }
pascal@20542 426 }
pascal@20546 427 if (/^ add dword ptr/ || /^ sub dword ptr/) {
pascal@20458 428 split($0,args,",")
pascal@20543 429 if (args[2] == "large") { args[2] = $3 }
pascal@20458 430 if (isnum(args[2])) {
pascal@20546 431 if (args[2] % 16777216 == 0) {
pascal@20546 432 sub(/dword/,"byte",s)
pascal@20543 433 sub(/\],/,"+3],",s) || sub(/,/,"+3,",s)
pascal@20458 434 print s "/16777216"; next
pascal@20458 435 }
pascal@20458 436 if (args[2] % 65536 == 0) {
pascal@20546 437 sub(/dword/,"word",s)
pascal@20543 438 sub(/\],/,"+2],",s) || sub(/,/,"+2,",s)
pascal@20458 439 print s "/65536"; next
pascal@20458 440 }
pascal@20458 441 }
pascal@20458 442 }
pascal@20458 443 if (/^ mov e.x,/) {
pascal@20458 444 split($2,args,",")
pascal@20458 445 r=args[1]
pascal@20458 446 if (args[2] == "large") { args[2] = $3 }
pascal@20458 447 if (isnum(args[2]) && args[2] % 65536 == args[2]) {
pascal@20458 448 if (args[2] % 256 == args[2] || args[2] % 256 == 0) {
pascal@20458 449 print " xor " r "," r
pascal@20458 450 if (args[2] == 0) next
pascal@20458 451 x=" mov " substr(r,2,1)
pascal@20458 452 if (args[2] % 256 == 0) {
pascal@20458 453 print x "h," args[2] "/256"
pascal@20458 454 }
pascal@20458 455 else { print x "l," args[2] }
pascal@20458 456 next
pascal@20458 457 }
pascal@20458 458 }
pascal@20458 459 }
pascal@21576 460 if (afterjmp) print ";" $0
pascal@21576 461 else print
pascal@21576 462 if (/^ jmp /) afterjmp=1
pascal@20458 463 }