Na, a multkorában ugye ott álltunk le a 255-el való osztás optimalizálásában, hogy 16 bitre van módszerünk 32 bitre ugyan van egy képlet a GCC-ből ( (x*0x80808081) >> 39 ), ehhez azonban 64 bites aritmetika kellene. Na én a következőt hoztam össze 68000-es procin 32 bites aritmetikával.; FUCK MICROSOFT
; (x*0x80808081)>>39
; ((x << 31) + (x << 23) + (x << 15) + (x << 7) + x) >> 39
dff: or.l d0, d0
bne dff_0
rts
; d0: x hi, d1: x lo, d2: s hi, d3: s lo
dff_0: move.l d1, -(sp)
move.l d2, -(sp)
move.l d3, -(sp)
move.l d4, -(sp)
move.l d0, d3
move.l d0, d1
moveq #0, d0
moveq #0, d2
; shift s to left by 7, then add to x (x << 7)
move.l d3, d4
asl.l #7, d3
asl.l #7, d2
asr.l #25, d4
or.l d4, d2
add.l d3, d1
bcc dff_1
addq #1, d0
dff_1: add.l d2, d0
; shift s to left by 8, then add to x (x << 15)
move.l d3, d4
asl.l #8, d3
asl.l #8, d2
asr.l #24, d4
or.l d4, d2
add.l d3, d1
bcc dff_2
addq #1, d0
dff_2: add.l d2, d0
; shift s to left by 8, then add to x (x << 23)
move.l d3, d4
asl.l #8, d3
asl.l #8, d2
asr.l #24, d4
or.l d4, d2
add.l d3, d1
bcc dff_3
addq #1, d0
dff_3: add.l d2, d0
; shift s to left by 8, then add to x (x << 31)
move.l d3, d4
asl.l #8, d3
asl.l #8, d2
asr.l #24, d4
or.l d4, d2
add.l d3, d1
bcc dff_4
addq #1, d0
dff_4: add.l d2, d0
; shift upper x to right by 7 and return (x >> 39)
asr.l #7, d0
move.l +(sp), d4
move.l +(sp), d3
move.l +(sp), d2
move.l +(sp), d1
rts
Ezt a közeljövőben ki fogom próbálni Amigán, a 16 bites ALU-s 68000-esen 7.14 MHz-en és a full 32 bites ALU-val bíró 68030-ason is 40 MHz-en. Az egyik kód egy sima div 255 lesz, a másik meg ez. Látatlanban az a saccom, hogy 68000-esen egy osztás 140 ciklus körül van, vagyis ott lehet, hogy gyorsabb lesz, 030-ason, ahol kb. 60 ciklus egy osztás, ott nem lesz gyorsabb. |