Optimize merge

This commit is contained in:
Gabriel Tofvesson 2019-04-19 23:52:09 +02:00
parent 4db5192579
commit 150906141f

144
bsrt.uc
View File

@ -2,7 +2,8 @@
#define HASH_MASK 0b1111 #define HASH_MASK 0b1111
#define BUCKET_SIZE 13 #define BUCKET_SIZE 13
#define FIRST_BUCKET_ADDRESS 0x10 #define FIRST_BUCKET_ADDRESS 0x10
#define LAST_BUCKET_ADDRESS 0xe0 #define LAST_BUCKET_ADDRESS 0xE0
#define LAST_BUCKET_START_ADDR 0xD3
// PM initial state // PM initial state
#data 0x00 0x78 #data 0x00 0x78
@ -87,15 +88,13 @@ mov pm ar
sub gr sub gr
adn gr; brn @DANK_INSERT_FIRST_BOTTOM adn gr; brn @DANK_INSERT_FIRST_BOTTOM
mov gr pm mov gr pm; incpc
$DANK_INSERT_FIRST_SHIFT $DANK_INSERT_FIRST_SHIFT
incpc; bls @DANK_INSERT_SECOND_START mov pc asr; bls @DANK_INSERT_SECOND_START
mov pc asr
mov pm gr mov pm gr
mov ar pm mov ar pm
mov gr ar; declc mov gr ar; declc; incpc; bra @DANK_INSERT_FIRST_SHIFT
bra @DANK_INSERT_FIRST_SHIFT
$DANK_INSERT_FIRST_BOTTOM $DANK_INSERT_FIRST_BOTTOM
declc; bra @DANK_INSERT_FIRST_START declc; bra @DANK_INSERT_FIRST_START
@ -133,15 +132,13 @@ mov pm ar
sub gr sub gr
adn gr; brn @DANK_INSERT_SECOND_BOTTOM adn gr; brn @DANK_INSERT_SECOND_BOTTOM
mov gr pm mov gr pm; incpc
$DANK_INSERT_SECOND_SHIFT $DANK_INSERT_SECOND_SHIFT
incpc; bls @DANK_INSERT_SECOND_END_NUMLET mov pc asr; bls @DANK_INSERT_SECOND_END_NUMLET
mov pc asr
mov pm gr mov pm gr
mov ar pm mov ar pm
mov gr ar; declc mov gr ar; declc; incpc; bra @DANK_INSERT_SECOND_SHIFT
bra @DANK_INSERT_SECOND_SHIFT
$DANK_INSERT_SECOND_BOTTOM $DANK_INSERT_SECOND_BOTTOM
declc; bra @DANK_INSERT_SECOND_LOOP declc; bra @DANK_INSERT_SECOND_LOOP
@ -161,59 +158,96 @@ bra @DANK_SORT; incpc
$BUCKET_SORT_END $BUCKET_SORT_END
// PC is 0 here. Data is sorted smallest-to largest in memory: just spread out into buckets ;)
// Perform final merge here
// Set PC to write index // New merge-algo. Saves about 100 cycles over previous version
const 0xE0 const LAST_BUCKET_START_ADDR
mov ar pc mov ar hr
// ######## INSERTION ##########
// COPY NEGATIVE
// Initialize GR as bucket pointer and IR as element pointer
const FIRST_BUCKET_ADDRESS const FIRST_BUCKET_ADDRESS
mov ar pc
const LIST_START
$MERGE
mov pc ir
mov ar gr mov ar gr
mov pc asr; incpc
$LOOP
// Dereference GR into IR and compute length
mov gr asr
mov pm ar mov pm ar
sub ir
// Subtract start from end and save (the resultant length) into LC
sub gr
mov ar lc mov ar lc
// Calcuate the first element of the array and store in IR
mov gr ar mov gr ar
$MERGE_MOVE
mov pc asr; bls @MERGE_BOTTOM
mov pm gr
mov ar asr
add 1 add 1
mov ar ir mov gr pm; declc; incpc; bra @MERGE_MOVE
$COPY_BUCKET $MERGE_BOTTOM
bls @NEXT_BUCKET
mov ir asr; mov ir ar
mov pm hr
add 1
mov ar ir
// Write value to be copied into write index (data[pc] = data[ir])
mov pc asr
mov hr pm; incpc; declc
bra @COPY_BUCKET
$NEXT_BUCKET
mov gr ar
add BUCKET_SIZE
mov ar gr mov ar gr
sub LAST_BUCKET_ADDRESS mov ir ar
bnz @LOOP sub hr
adn hr; brz @MERGE_END
add BUCKET_SIZE
mov ar pc
mov gr ar; bra @MERGE
$MERGE_END
$BREAK $BREAK
halt halt
// Old merge-algo
// Set PC to write index
//const 0xE0
//mov ar pc
//
//
//// ######## INSERTION ##########
//
//// COPY NEGATIVE
//
//// Initialize GR as bucket pointer and IR as element pointer
//const FIRST_BUCKET_ADDRESS
//mov ar gr
//
//
//$LOOP
//// Dereference GR into IR and compute length
//mov gr asr
//mov pm ar
//
//// Subtract start from end and save (the resultant length) into LC
//sub gr
//mov ar lc
//
//// Calcuate the first element of the array and store in IR
//mov gr ar
//add 1
//mov ar ir
//
//$COPY_BUCKET
//bls @NEXT_BUCKET
//
//mov ir asr; mov ir ar
//mov pm hr
//
//add 1
//mov ar ir
//
//// Write value to be copied into write index (data[pc] = data[ir])
//mov pc asr
//mov hr pm; incpc; declc
//bra @COPY_BUCKET
//$NEXT_BUCKET
//
//
//mov gr ar
//add BUCKET_SIZE
//mov ar gr
//sub LAST_BUCKET_ADDRESS
//bnz @LOOP
//
//
//$BREAK
//halt