hschumann2/TempleOS-Source-Code
0847
1 2/*"Fixed point" means you use ints3that are scaled by a value. A common4example would be using number of pennies5instead of dollars with a float.6 7Fixed-point used to be much faster,8but modern processors do well with9floats. It also depends on the compiler10and my compiler is poor with floats.11 12I often use 64-bit ints with upper 32-bits13as int and lower 32-bits as fraction.14 15See ::/Demo/SubIntAccess.HC for how16to access upper or lower 32-bits.17*/18 19#define SAMPLE_SIZE 1000000020 21I32 coordinates[65536];22 23asm {24_ASM_FIXED_POINT::25 PUSH RBP26 MOV RBP,RSP27 PUSH RSI28 PUSH RDI29 MOV RSI,coordinates30 MOV RDI,ToI64(Sin(1.0)*0x100000000)31 XOR RBX,RBX //SUM32 MOV RCX,SAMPLE_SIZE-133@@05: XOR RDX,RDX34 MOV DX,CX35 MOVSXD RAX,U32 [RSI+RDX*4]36 IMUL RDI37 SAR RAX,3238 ADD RBX,RAX39 DEC RCX40 JGE @@0541 MOV RAX,RBX42 POP RDI43 POP RSI44 POP RBP45 RET46 47SINE_VAL: DU64 Sin(1.0);48RET_VAL: DU64 0;49 50_ASM_FLOAT::51 PUSH RBP52 MOV RBP,RSP53 PUSH RSI54 MOV RSI,coordinates55 FLD U64 [SINE_VAL]56 FLDZ57 MOV RCX,SAMPLE_SIZE-158@@05: XOR RDX,RDX59 MOV DX,CX60 FILD U32 [RSI+RDX*4]61 FMUL ST0,ST262 FADDP ST1,ST063 DEC RCX64 JGE @@0565 FISTP U64 [RET_VAL]66 MOV RAX,U64 [RET_VAL]67 FFREE ST068 FINCSTP69 POP RSI70 POP RBP71 RET72}73 74_extern _ASM_FIXED_POINT I64 AsmFixedPt();75_extern _ASM_FLOAT I64 AsmFloat();76 77U0 Main()78{79 I64 start,end,overhead_time,test_time;80 F64 d1,fsum;81 I64 reg i,tmp,reg d2,reg sum;82 83 CPURep;84 85 //Set-up some sample coordinates86 for (i=0;i<65536;i++)87 coordinates[i]=RandU32;88 89 //Measure Loop Overhead90 start=GetTSC;91 for (i=SAMPLE_SIZE-1;i>=0;i--) {92 }93 end=GetTSC;94 overhead_time=end-start;95 "$RED$Overhead Cycles :%10.5f$FG$\n",96 ToF64(overhead_time)/SAMPLE_SIZE;97 98 //Measure F64 arithmetic99 // (Some of this is due to crappy100 // compiler code.)101 d1=Sin(1.0);102 fsum=0;103 start=GetTSC;104 for (i=SAMPLE_SIZE-1;i>=0;i--)105 fsum+=d1*coordinates[i&65535];106 end=GetTSC;107 test_time=end-start;108 "Float Sum :%X\n",ToI64(fsum);109 "$RED$Float Cycles :%10.5f$FG$\n",110 ToF64(test_time)/SAMPLE_SIZE;111 112 //Measure fixed point arithmetic113 d2=Sin(1.0)*0x100000000;114 sum=0;115 start=GetTSC;116 for (i=SAMPLE_SIZE-1;i>=0;i--) {117 tmp=d2*coordinates[i&65535];118 sum+=tmp.i32[1];119 }120 end=GetTSC;121 test_time=end-start;122 "Fixed-Point Sum :%X\n",sum;123 "$RED$Fixed-Point Cycles :%10.5f$FG$\n",124 ToF64(test_time)/SAMPLE_SIZE;125 126 //Measure fixed point arithmetic127 start=GetTSC;128 sum=AsmFixedPt;129 end=GetTSC;130 test_time=end-start;131 "Asm Fixed-Point Sum :%X\n",sum;132 "$RED$Asm Fixed-Point Cycles:%10.5f$FG$\n",133 ToF64(test_time)/SAMPLE_SIZE;134 135 //Measure float arithmetic136 start=GetTSC;137 sum=AsmFloat;138 end=GetTSC;139 test_time=end-start;140 "Asm Float Sum :%X\n",sum;141 "$RED$Asm Float Cycles :%10.5f$FG$\n",142 ToF64(test_time)/SAMPLE_SIZE;143 144}145 146Main;147 148/* Program Output149 150Machine 1:1518 Cores 2.660GHz152Overhead Cycles : 2.00814153Float Sum :FFFFE1D361BEED68154Float Cycles : 10.16076155Fixed-Point Sum :FFFFE1D361729914156Fixed-Point Cycles : 5.29392157Asm Fixed-Point Sum :FFFFE1D361729914158Asm Fixed-Point Cycles: 4.20464159Asm Float Sum :FFFFE1D361BEED56160Asm Float Cycles : 3.04635161 162Machine 2:1638 Cores 3.395GHz164Overhead Cycles : 4.87040165Float Sum :D20A01DB177166Float Cycles : 10.11558167Fixed-Point Sum :D209FD18CC7168Fixed-Point Cycles : 4.50618169Asm Fixed-Point Sum :D209FD18CC7170Asm Fixed-Point Cycles: 3.02426171Asm Float Sum :D20A01DB17B172Asm Float Cycles : 3.21070173 174*/175 