Advertisement
xerpi

memset test psp

Sep 28th, 2013
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.56 KB | None | 0 0
  1. /*                             Makefile                              */
  2.  
  3.  
  4. TARGET = memset_test
  5. OBJS = main.o mips_memset.o
  6.  
  7. INCDIR =
  8. CFLAGS = -G0 -Wall
  9. CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
  10. ASFLAGS = $(CFLAGS)
  11.  
  12. LIBDIR =
  13. LDFLAGS =
  14. LIBS= -lpsprtc
  15.  
  16. EXTRA_TARGETS = EBOOT.PBP
  17. PSP_EBOOT_TITLE = memset test
  18.  
  19. PSPSDK=$(shell psp-config --pspsdk-path)
  20. include $(PSPSDK)/lib/build.mak
  21.  
  22.  
  23. /*                          mips_memset.S                        */
  24.  
  25. #made by xerpi
  26.  
  27. .text
  28. .global mips_memset
  29.  
  30. mips_memset:
  31.     move $t0, $a0   #backup ptr
  32.     move $t1, $a1   #c8  - $t1
  33.     move $t2, $a1   #c16 - $t2
  34.     sll $t2, $t2, 8
  35.     or $t2, $t2, $a1
  36.     move $t3, $t2   #c32 - $t3
  37.     sll $t3, $t3, 16
  38.     or $t3, $t3, $t2
  39. _loop_memset:
  40.     beqz $a2, _e_memset #if(size==0) return
  41.     bge $a2, 4, _4_memset
  42.     bge $a2, 2, _2_memset
  43.     _1_memset:
  44.         sb $t1, ($a0)
  45.         addi $a1, $a0, 1
  46.         addi $a2, $a2, -1
  47.         j _loop_memset
  48.     _2_memset:
  49.         sh $t2, ($a0)
  50.         addi $a0, $a0, 2
  51.         addi $a2, $a2, -2
  52.         j _loop_memset 
  53.     _4_memset:
  54.         sw $t3, ($a0)
  55.         addi $a0, $a0, 4
  56.         addi $a2, $a2, -4
  57.         j _loop_memset     
  58.    
  59. _e_memset: 
  60.     move $v0, $t0   #return ptr
  61.     jr $ra
  62.  
  63.  
  64. /*                                               main.c                             */
  65.  
  66. //made by xerpi
  67.  
  68. #include <stdio.h>
  69. #include <string.h>
  70. #include <pspkernel.h>
  71. #include <pspdebug.h>
  72. #include <pspdisplay.h>
  73. #include <psprtc.h>
  74.  
  75. #define ARRAY_SIZE 50000
  76. #define LOOPS 5000
  77.  
  78. PSP_MODULE_INFO("memset_test", PSP_MODULE_USER, 0, 1);
  79. PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);
  80.  
  81. #define printf pspDebugScreenPrintf
  82.  
  83. typedef unsigned char  byte;
  84.  
  85. int run = 1;
  86. int exit_callback(int arg1, int arg2, void *common);
  87. int CallbackThread(SceSize args, void *argp);
  88. int SetupCallbacks(void);
  89.  
  90.  
  91. extern void *mips_memset(void *ptr, int c, size_t size);
  92. void *memset1(void *ptr, int c, size_t size);
  93. void *memset2(void *ptr, int c, size_t size);
  94. void *memset3(void *ptr, int c, size_t size);
  95.  
  96. char array[ARRAY_SIZE];
  97.  
  98. int main()
  99. {
  100.     pspDebugScreenInit();
  101.     SetupCallbacks();
  102.    
  103.     u64 before_tick, after_tick;
  104.     u32 res = sceRtcGetTickResolution();
  105.     double time1, time2, time3, timeMips;
  106.     int i;
  107.     printf("memset testing\n");
  108.     sceRtcGetCurrentTick(&before_tick);
  109.         for(i = 0; i < LOOPS; i++)
  110.             memset1(array, 'a', ARRAY_SIZE);       
  111.     sceRtcGetCurrentTick(&after_tick);
  112.     time1 = (after_tick-before_tick)/(double)res;
  113.     printf("memset1 took: %f s\n", time1);
  114.    
  115.     sceRtcGetCurrentTick(&before_tick);
  116.         for(i = 0; i < LOOPS; i++)
  117.             memset2(array, 'a', ARRAY_SIZE);
  118.     sceRtcGetCurrentTick(&after_tick);
  119.     time2 = (after_tick-before_tick)/(double)res;
  120.     printf("memset2 took: %f s\n", time2);
  121.  
  122.     sceRtcGetCurrentTick(&before_tick);
  123.         for(i = 0; i < LOOPS; i++)
  124.             memset3(array, 'a', ARRAY_SIZE);
  125.     sceRtcGetCurrentTick(&after_tick);
  126.     time3 = (after_tick-before_tick)/(double)res;
  127.     printf("memset3 took: %f s\n", time3);
  128.  
  129.     sceRtcGetCurrentTick(&before_tick);
  130.         for(i = 0; i < LOOPS; i++)
  131.             mips_memset(array, 'a', ARRAY_SIZE);
  132.     sceRtcGetCurrentTick(&after_tick);
  133.     timeMips = (after_tick-before_tick)/(double)res;
  134.     printf("mips   took: %f s\n\n", timeMips);
  135.    
  136.    
  137.     printf("memset1 is x%f %s than memset2\n",
  138.         (time1>time2?(time1/(double)time2):(time2/(double)time1)),
  139.         (time1<time2?"faster":"slower"));
  140.     printf("memset1 is x%f %s than memset3\n",
  141.         (time1>time3?(time1/(double)time3):(time3/(double)time1)),
  142.         (time1<time3?"faster":"slower"));
  143.     printf("memset1 is x%f %s than mips_memset\n\n",
  144.         (time1>timeMips?(time1/(double)timeMips):(timeMips/(double)time1)),
  145.         (time1<timeMips?"faster":"slower"));
  146.    
  147.     printf("memset2 is x%f %s than memset1\n",
  148.         (time2>time1?(time2/(double)time1):(time1/(double)time2)),
  149.         (time2<time1?"faster":"slower"));
  150.     printf("memset2 is x%f %s than memset3\n",
  151.         (time2>time3?(time2/(double)time3):(time3/(double)time2)),
  152.         (time2<time3?"faster":"slower"));
  153.     printf("memset2 is x%f %s than mips_memset\n\n",
  154.         (time2>timeMips?(time2/(double)timeMips):(timeMips/(double)time2)),
  155.         (time2<timeMips?"faster":"slower"));
  156.        
  157.     printf("memset3 is x%f %s than memset1\n",
  158.         (time3>time1?(time3/(double)time1):(time1/(double)time3)),
  159.         (time3<time1?"faster":"slower"));
  160.     printf("memset3 is x%f %s than memset1\n",
  161.         (time3>time2?(time3/(double)time2):(time2/(double)time3)),
  162.         (time3<time2?"faster":"slower"));
  163.     printf("memset3 is x%f %s than mips_memset\n\n",
  164.         (time3>timeMips?(time3/(double)timeMips):(timeMips/(double)time3)),
  165.         (time3<timeMips?"faster":"slower"));   
  166.    
  167.     printf("mips_memset is x%f %s than memset1\n",
  168.         (timeMips>time1?(timeMips/(double)time1):(time1/(double)timeMips)),
  169.         (timeMips<time1?"faster":"slower"));
  170.     printf("mips_memset is x%f %s than memset2\n",
  171.         (timeMips>time2?(timeMips/(double)time2):(time2/(double)timeMips)),
  172.         (timeMips<time2?"faster":"slower"));
  173.     printf("mips_memset is x%f %s than memset3\n\n",
  174.         (timeMips>time3?(timeMips/(double)time3):(time3/(double)timeMips)),
  175.         (timeMips<time3?"faster":"slower"));       
  176.  
  177.     while(run) {
  178.         sceKernelDelayThread(100 * 1000);
  179.     }
  180.    
  181.     sceKernelExitGame();
  182.     return 0;
  183. }
  184.  
  185.  
  186.  
  187. void * memset1(void *ptr, int c, size_t size)
  188. {
  189.     byte *p = ptr;
  190.     int c32 = c | (c<<8) | (c<<16) | (c<<24);
  191.     byte *cp = (byte *)&c32;
  192.     while(size) {
  193.         if(size >= 4) {
  194.             *((u32*)p) = *((u32*)cp);
  195.             size -= 4; p += 4;
  196.         } else if(size >= 2) {
  197.             *((u16*)p) = *((u16*)cp);
  198.             size -= 2; p += 2;
  199.         } else {
  200.             *p++ = *cp;
  201.             --size;
  202.         }
  203.     }
  204.     return ptr;
  205. }
  206.  
  207. void * memset2(void *ptr, int c, size_t size)
  208. {
  209.     byte *p = ptr;
  210.     byte c8 = (byte)c;
  211.     u16 c16 = c8  | (c8<<8);
  212.     u32 c32 = c16 | (c16<<16);
  213.     while(size) {
  214.         if(size >= 4) {
  215.             *((u32*)p) = c32;
  216.             size -= 4; p += 4;
  217.         } else if(size >= 2) {
  218.             *((u16*)p) = c16;
  219.             size -= 2; p += 2;
  220.         } else {
  221.             *p++ = c8;
  222.             --size;
  223.         }
  224.     }
  225.     return ptr;
  226. }
  227.  
  228. void * memset3(void *ptr, int c, size_t size)
  229. {
  230.     byte *p1 = ptr;
  231.     byte *p2 = ptr + size;
  232.     while(p1 != p2) {
  233.         *p1 = c;
  234.         p1++;
  235.     }
  236.     return ptr;
  237. }
  238.  
  239.  
  240. /* Exit callback */
  241. int exit_callback(int arg1, int arg2, void *common)
  242. {
  243.     run = 0;
  244.     return 0;
  245. }
  246.  
  247. /* Callback thread */
  248. int CallbackThread(SceSize args, void *argp)
  249. {
  250.     int cbid;
  251.  
  252.     cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
  253.     sceKernelRegisterExitCallback(cbid);
  254.     sceKernelSleepThreadCB();
  255.  
  256.     return 0;
  257. }
  258.  
  259. /* Sets up the callback thread and returns its thread id */
  260. int SetupCallbacks(void)
  261. {
  262.     int thid = 0;
  263.  
  264.     thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
  265.     if(thid >= 0) {
  266.         sceKernelStartThread(thid, 0, 0);
  267.     }
  268.  
  269.     return thid;
  270. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement