Team Ai
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes847downloads
FixedPointAdvanced.txt175 linesDownload Raw Back to Lectures
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