English Amiga Board


Go Back   English Amiga Board > Coders > Coders. Asm / Hardware

 
 
Thread Tools
Old 19 December 2016, 01:53   #1
Galahad/FLT
Going nowhere
 
Galahad/FLT's Avatar
 
Join Date: Oct 2001
Location: United Kingdom
Age: 50
Posts: 9,017
Optimising a routine for 68000

OK, heres the code example i'm using below.

vertical_offset = $b0

REPT 39
add.w (a5)+,a1 ;Extract sine
move.l colour(pc),a2 ; Pointer to colour table
move.w (a2)+,(a1)
move.w (a2)+,(vertical_offset*1)(a1)
move.w (a2)+,(vertical_offset*2)(a1)
move.w (a2)+,(vertical_offset*3)(a1)
move.w (a2)+,(vertical_offset*4)(a1)
move.w (a2)+,(vertical_offset*5)(a1)
move.w (a2)+,(vertical_offset*6)(a1)
move.w (a2)+,(vertical_offset*7)(a1)
move.w (a2)+,(vertical_offset*8)(a1)
move.w (a2)+,(vertical_offset*9)(a1)
move.w (a2)+,(vertical_offset*10)(a1)
move.w (a2)+,(vertical_offset*11)(a1)
move.w (a2)+,(vertical_offset*12)(a1)
move.w (a2)+,(vertical_offset*13(a1)
addq.w #4,a6
move.l a6,a1
ENDR

Is there a quicker way of writing the above? Its gets repeated lots in the code i'm using, on 68020 it just laughs at the overhead, on 68000 it slows down quite a bit.

Any improvements anyone can see?
Galahad/FLT is offline  
Old 19 December 2016, 04:12   #2
Don_Adan
Registered User
 
Join Date: Jan 2008
Location: Warsaw/Poland
Age: 56
Posts: 2,046
Quote:
Originally Posted by Galahad/FLT View Post
OK, heres the code example i'm using below.

vertical_offset = $b0

REPT 39
add.w (a5)+,a1 ;Extract sine
move.l colour(pc),a2 ; Pointer to colour table
move.w (a2)+,(a1)
move.w (a2)+,(vertical_offset*1)(a1)
move.w (a2)+,(vertical_offset*2)(a1)
move.w (a2)+,(vertical_offset*3)(a1)
move.w (a2)+,(vertical_offset*4)(a1)
move.w (a2)+,(vertical_offset*5)(a1)
move.w (a2)+,(vertical_offset*6)(a1)
move.w (a2)+,(vertical_offset*7)(a1)
move.w (a2)+,(vertical_offset*8)(a1)
move.w (a2)+,(vertical_offset*9)(a1)
move.w (a2)+,(vertical_offset*10)(a1)
move.w (a2)+,(vertical_offset*11)(a1)
move.w (a2)+,(vertical_offset*12)(a1)
move.w (a2)+,(vertical_offset*13(a1)
addq.w #4,a6
move.l a6,a1
ENDR


Is there a quicker way of writing the above? Its gets repeated lots in the code i'm using, on 68020 it just laughs at the overhead, on 68000 it slows down quite a bit.

Any improvements anyone can see?
I will use something like this:

Code:
vertical_offset = $b0
move.l colour(pc),a2 ; Pointer to colour table
movem.l (a2)+,D0-D6
add.w (a5)+,a1 ;Extract sine


move.w D0,(vertical_offset*1)(a1)
swap d0
move.w d0,(a1)
move.w d1,(vertical_offset*3)(a1)
swap d1
move.w d1,(vertical_offset*2)(a1)
move.w d2,(vertical_offset*5)(a1)
swap d2
move.w d2,(vertical_offset*4)(a1)
move.w d3,(vertical_offset*7)(a1)
swap d3
move.w d3,(vertical_offset*6)(a1)
move.w d4,(vertical_offset*9)(a1)
swap d4
move.w d4,(vertical_offset*8)(a1)
move.w d5,(vertical_offset*11)(a1)
swap d5
move.w d5,(vertical_offset*10)(a1)
move.w d6,(vertical_offset*13)(a1)
swap d6
move.w d6,(vertical_offset*12(a1)
addq.w #4,a6
move.l a6,a1
add.w (a5)+,a1 ;Extract sine

move.w D0,(a1)
swap d0
move.w d0,(vertical_offset*1)(a1)
move.w d1,(vertical_offset*2)(a1)
swap d1
move.w d1,(vertical_offset*3)(a1)
move.w d2,(vertical_offset*4)(a1)
swap d2
move.w d2,(vertical_offset*5)(a1)
move.w d3,(vertical_offset*6)(a1)
swap d3
move.w d3,(vertical_offset*7)(a1)
move.w d4,(vertical_offset*8)(a1)
swap d4
move.w d4,(vertical_offset*9)(a1)
move.w d5,(vertical_offset*10)(a1)
swap d5
move.w d5,(vertical_offset*11)(a1)
move.w d6,(vertical_offset*12)(a1)
swap d6
move.w d6,(vertical_offset*13(a1)
addq.w #4,a6
move.l a6,a1


etc

Last edited by Don_Adan; 19 December 2016 at 06:20.
Don_Adan is offline  
Old 19 December 2016, 09:38   #3
meynaf
son of 68k
 
meynaf's Avatar
 
Join Date: Nov 2007
Location: Lyon / France
Age: 51
Posts: 5,355
You can try preloading data with as many registers as possible :
Code:
 move.l colour(pc),a2        ; Pointer to colour table
 movem.l (a2)+,d0-d1
 movem.w (a2),d2-d7/a0/a2-a4
 REPT 39
 add.w (a5)+,a1              ; Extract sine
 swap d0
 swap d1
 move.w d0,(a1)
 move.w d1,(vertical_offset*2)(a1)
 swap d0
 swap d1
 move.w d0,(vertical_offset*1)(a1)
 move.w d1,(vertical_offset*3)(a1)
 move.w d2,(vertical_offset*5)(a1)
 move.w d3,(vertical_offset*4)(a1)
 move.w d4,(vertical_offset*6)(a1)
 move.w d5,(vertical_offset*7)(a1)
 move.w d6,(vertical_offset*8)(a1)
 move.w d7,(vertical_offset*9)(a1)
 move.w a0,(vertical_offset*10)(a1)
 move.w a2,(vertical_offset*11)(a1)
 move.w a3,(vertical_offset*12)(a1)
 move.w a4,(vertical_offset*13(a1)
 addq.w #4,a6
 move.l a6,a1
 ENDR
(u can also spare two swaps by duplicating the code like Don Adan did)
meynaf is offline  
Old 19 December 2016, 14:36   #4
DanScott
Lemon. / Core Design
 
DanScott's Avatar
 
Join Date: Mar 2016
Location: Tier 5
Posts: 1,213
move.w (a2)+,(a1)
move.w (a2)+,(vertical_offset*1)(a1)
move.w (a2)+,(vertical_offset*2)(a1)
move.w (a2)+,(vertical_offset*3)(a1)
move.w (a2)+,(vertical_offset*4)(a1)
move.w (a2)+,(vertical_offset*5)(a1)
move.w (a2)+,(vertical_offset*6)(a1)
move.w (a2)+,(vertical_offset*7)(a1)
move.w (a2)+,(vertical_offset*8)(a1)
move.w (a2)+,(vertical_offset*9)(a1)
move.w (a2)+,(vertical_offset*10)(a1)
move.w (a2)+,(vertical_offset*11)(a1)
move.w (a2)+,(vertical_offset*12)(a1)
move.w (a2)+,(vertical_offset*13)(a1)


use the blitter for this
DanScott is offline  
 


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools

Similar Threads
Thread Thread Starter Forum Replies Last Post
ASM optimising NetSurf arti Coders. Asm / Hardware 40 19 June 2016 18:53
Optimising CD32 Boot Times Amigajay project.CD32 Conversion 11 05 March 2016 13:30
Optimising ILBM decode pmc Coders. Asm / Hardware 21 12 October 2011 20:24
Optimised tile copying routine in 68000 assembly Codetapper Coders. General 16 09 October 2011 19:34
help optimising a section of code h0ffman Coders. General 15 02 March 2011 13:19

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +2. The time now is 14:53.

Top

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.
Page generated in 0.08203 seconds with 15 queries