tfv: inline the signed multiply

This commit is contained in:
Vince Weaver 2017-11-29 01:04:07 -05:00
parent fa45d4bd72
commit 51befa0f01
4 changed files with 57 additions and 27 deletions

View File

@ -333,11 +333,18 @@ static void init_table(void) {
static unsigned int product[4]; static unsigned int product[4];
static int fixed_mul_unsigned( static void fixed_mul(unsigned char x_i, unsigned char x_f,
unsigned char x_i, unsigned char x_f, unsigned char y_i, unsigned char y_f,
unsigned char y_i, unsigned char y_f,
unsigned char *z_i, unsigned char *z_f, unsigned char *z_i, unsigned char *z_f,
int debug, int reuse) { int reuse) {
int debug=0;
//static int fixed_mul_unsigned(
// unsigned char x_i, unsigned char x_f,
// unsigned char y_i, unsigned char y_f,
// unsigned char *z_i, unsigned char *z_f,
// int debug, int reuse) {
// <T1 * <T2 = AAaa // <T1 * <T2 = AAaa
// <T1 * >T2 = BBbb // <T1 * >T2 = BBbb
@ -551,24 +558,24 @@ static int fixed_mul_unsigned(
// printf("DDdd %02x:%02x\n",_DD,_dd); // printf("DDdd %02x:%02x\n",_DD,_dd);
// } // }
cycles.multiply+=6; // cycles.multiply+=6;
return (product[3]<<24)|(product[2]<<16)|(product[1]<<8)|product[0]; // return (product[3]<<24)|(product[2]<<16)|(product[1]<<8)|product[0];
// rts ; 6 // rts ; 6
} //}
/* signed */ /* signed */
static void fixed_mul(unsigned char x_i, unsigned char x_f, //static void fixed_mul(unsigned char x_i, unsigned char x_f,
unsigned char y_i, unsigned char y_f, // unsigned char y_i, unsigned char y_f,
unsigned char *z_i, unsigned char *z_f, int reuse) { // unsigned char *z_i, unsigned char *z_f, int reuse) {
int a,c;
fixed_mul_unsigned(x_i,x_f,y_i,y_f,z_i,z_f,0,reuse);
// jsr multiply_16bit_unsigned ; 6 // fixed_mul_unsigned(x_i,x_f,y_i,y_f,z_i,z_f,0,reuse);
// jsr multiply_16bit_unsigned ;
a=(x_i&0xff); // lda T1+1 ; 3 a=(x_i&0xff); // lda T1+1 ; 3
cycles.multiply+=12; cycles.multiply+=6;
if ((a&0x80)==0) goto x_positive; // bpl :+ ;^3/2nt if ((a&0x80)==0) goto x_positive; // bpl :+ ;^3/2nt
c=1; // sec ; 2 c=1; // sec ; 2

View File

@ -719,10 +719,15 @@ static void init_table(void) {
static unsigned int product[4]; static unsigned int product[4];
int fixed_mul_unsigned(int x_i,int x_f, int fixed_mul(int x_i,int x_f,
int y_i, int y_f, int y_i, int y_f,
int *z_i, int *z_f,
int debug) { int debug) {
//int fixed_mul_unsigned(int x_i,int x_f,
// int y_i, int y_f,
// int debug) {
// <T1 * <T2 = AAaa // <T1 * <T2 = AAaa
// <T1 * >T2 = BBbb // <T1 * >T2 = BBbb
// >T1 * <T2 = CCcc // >T1 * <T2 = CCcc
@ -935,20 +940,20 @@ int fixed_mul_unsigned(int x_i,int x_f,
// printf("DDdd %02x:%02x\n",_DD,_dd); // printf("DDdd %02x:%02x\n",_DD,_dd);
// } // }
return 0; // return 0;
//(product[3]<<24)|(product[2]<<16)|(product[1]<<8)|product[0]; //(product[3]<<24)|(product[2]<<16)|(product[1]<<8)|product[0];
// rts ; 6 // rts ; 6
} //}
/* signed */ /* signed */
int fixed_mul(int x_i,int x_f, //int fixed_mul(int x_i,int x_f,
int y_i, int y_f, // int y_i, int y_f,
int *z_i, int *z_f, // int *z_i, int *z_f,
int debug) { // int debug) {
int a,c; // int a,c;
fixed_mul_unsigned(x_i,x_f,y_i,y_f,debug); // fixed_mul_unsigned(x_i,x_f,y_i,y_f,debug);
// jsr multiply_16bit_unsigned ; 6 // jsr multiply_16bit_unsigned ; 6
a=(x_i&0xff); // lda T1+1 ; 3 a=(x_i&0xff); // lda T1+1 ; 3

View File

@ -170,5 +170,21 @@ Remove unneeded precision in the 8.8 x 8.8 fixed point multiply
Total = 187,189 Total = 187,189
Frame Rate = 5.34 fps Frame Rate = 5.34 fps
In-line unsigned multiply inside of signed multiply (save 12 cycles)
Multiplying 1.0 * 2.0 = 2.0, took 198 cycles
Multiplying ff.ff * ff.ff = 0.0, took 218 cycles
Cycles: flying= 187
Cycles: getkey= 46
Cycles: page_flip= 26
Cycles: multiply= 40,888
Cycles: mode7= 118,034
Cycles: lookup_map= 22,747
Cycles: put_sprite= 2,561
================================
Total = 184,489
Frame Rate = 5.42 fps
Each cycle removed from inner X loop saves Each cycle removed from inner X loop saves
32*40=1280 cycles 32*40=1280 cycles

View File

@ -114,7 +114,9 @@ second_table:
; ---------- ; ----------
; RESULT ; RESULT
fixed_16x16_mul_unsigned: ;fixed_16x16_mul_unsigned:
multiply:
bcc num1_same_as_last_time ; 2nt/3 bcc num1_same_as_last_time ; 2nt/3
@ -290,16 +292,16 @@ dd_no_carry2:
; *z_i=product[1]; ; *z_i=product[1];
; *z_f=product[0]; ; *z_f=product[0];
rts ; 6 ; rts ; 6
;================= ;=================
; Signed multiply ; Signed multiply
;================= ;=================
multiply: ;multiply:
jsr fixed_16x16_mul_unsigned ; 6 ; jsr fixed_16x16_mul_unsigned ; 6
lda NUM1H ; x_i ; 3 lda NUM1H ; x_i ; 3
;=========== ;===========