+1024 32 * MORECORE
+
+( Print the time passed. )
+: PRINT-TIME ( lsb msb lsb msb -- lsb lsb )
+ ( The test is very short so likely the MSBs will be the same. This
+ makes calculating the time easier (because we can only do 32 bit
+ subtraction). So check MSBs are equal. )
+ 2 PICK <> IF
+ ." MSBs not equal, please repeat the test" CR
+ ELSE
+ NIP
+ SWAP - U. CR
+ THEN
+;
+
+: PERFORM-TEST ( xt -- )
+ ( Get everything in the cache. )
+ DUP EXECUTE DUP EXECUTE DUP EXECUTE DUP EXECUTE DUP EXECUTE DUP EXECUTE
+ 0 0 0 0 PRINT-TIME
+ ( Run the test 10 times. )
+ DUP EXECUTE PRINT-TIME
+ DUP EXECUTE PRINT-TIME
+ DUP EXECUTE PRINT-TIME
+ DUP EXECUTE PRINT-TIME
+ DUP EXECUTE PRINT-TIME
+ DUP EXECUTE PRINT-TIME
+ DUP EXECUTE PRINT-TIME
+ DUP EXECUTE PRINT-TIME
+ DUP EXECUTE PRINT-TIME
+ DUP EXECUTE PRINT-TIME
+ DROP
+;
+
+( ---------------------------------------------------------------------- )
+( Make a word which builds the repeated DUP DROP sequence. )
+: MAKE-DUPDROP ( n -- )
+ BEGIN ?DUP WHILE ' DUP , ' DROP , 1- REPEAT
+;
+
+( Now the actual test routine. )
+: TEST ( -- startlsb startmsb endlsb endmsb )
+ RDTSC ( Start time )
+ [ 1000 MAKE-DUPDROP ] ( 1000 * DUP DROP )
+ RDTSC ( End time )
+;
+
+: RUN ['] TEST PERFORM-TEST ;
+RUN
+
+( ---------------------------------------------------------------------- )
+( Try the inlined alternative. )
+
+( Inline the assembler primitive (cfa) n times. )
+: *(INLINE) ( cfa n -- )
+ BEGIN ?DUP WHILE OVER (INLINE) 1- REPEAT DROP
+;
+
+: DUPDROP INLINE DUP INLINE DROP ;CODE
+
+: TEST
+ INLINE RDTSC
+ [ S" DUPDROP" FIND >CFA 1000 *(INLINE) ]
+ INLINE RDTSC
+;CODE
+
+: RUN ['] TEST PERFORM-TEST ;
+RUN