Various Changes
[tpg/acess2.git] / Kernel / arch / x86 / lib.c
index 2334417..1bbdeab 100644 (file)
@@ -50,11 +50,15 @@ Uint32 ind(Uint16 Port)
 
 /**
  * \fn void *memset(void *Dest, int Val, Uint Num)
- * \brief Do a byte set of Dest
+ * \brief Do a byte granuality set of Dest
  */
 void *memset(void *Dest, int Val, Uint Num)
 {
-       __asm__ __volatile__ ("rep stosb" :: "D" (Dest), "a" (Val), "c" (Num));
+       __asm__ __volatile__ (
+               "rep stosl;\n\t"
+               "mov %3, %%ecx;\n\t"
+               "rep stosb"
+               :: "D" (Dest), "a" (Val), "c" (Num/4), "r" (Num&3));
        return Dest;
 }
 /**
@@ -66,19 +70,41 @@ void *memsetd(void *Dest, Uint Val, Uint Num)
        return Dest;
 }
 
+/**
+ * \fn int memcmp(const void *m1, const void *m2, Uint Num)
+ * \brief Compare two pieces of memory
+ */
+int memcmp(const void *m1, const void *m2, Uint Num)
+{
+       while(Num--)
+       {
+               if(*(Uint8*)m1 != *(Uint8*)m2)  break;
+               m1 ++;
+               m2 ++;
+       }
+       return *(Uint8*)m1 - *(Uint8*)m2;
+}
 
 /**
  * \fn void *memcpy(void *Dest, void *Src, Uint Num)
  */
-void *memcpy(void *Dest, void *Src, Uint Num)
+void *memcpy(void *Dest, const void *Src, Uint Num)
 {
-       __asm__ __volatile__ ("rep movsb" :: "D" (Dest), "S" (Src), "c" (Num));
+       if((Uint)Dest & 3 || (Uint)Src & 3)
+               __asm__ __volatile__ ("rep movsb" :: "D" (Dest), "S" (Src), "c" (Num));
+       else {
+               __asm__ __volatile__ (
+                       "rep movsl;\n\t"
+                       "mov %3, %%ecx;\n\t"
+                       "rep movsb"
+                       :: "D" (Dest), "S" (Src), "c" (Num/4), "r" (Num&3));
+       }
        return Dest;
 }
 /**
  * \fn void *memcpyd(void *Dest, void *Src, Uint Num)
  */
-void *memcpyd(void *Dest, void *Src, Uint Num)
+void *memcpyd(void *Dest, const void *Src, Uint Num)
 {
        __asm__ __volatile__ ("rep movsl" :: "D" (Dest), "S" (Src), "c" (Num));
        return Dest;
@@ -101,6 +127,7 @@ Uint64 __udivdi3(Uint64 Num, Uint64 Den)
        if(Den == 32)   return Num >> 5;        // Speed Hacks
        if(Den == 1024) return Num >> 10;       // Speed Hacks
        if(Den == 2048) return Num >> 11;       // Speed Hacks
+       if(Den == 4096) return Num >> 12;
        
        if(Num >> 32 == 0 && Den >> 32 == 0)
                return (Uint32)Num / (Uint32)Den;
@@ -131,6 +158,7 @@ Uint64 __umoddi3(Uint64 Num, Uint64 Den)
        if(Den == 32)   return Num & 31;        // Speed Hacks
        if(Den == 1024) return Num & 1023;      // Speed Hacks
        if(Den == 2048) return Num & 2047;      // Speed Hacks
+       if(Den == 4096) return Num & 4095;      // Speed Hacks
        
        if(Num >> 32 == 0 && Den >> 32 == 0)
                return (Uint32)Num % (Uint32)Den;
@@ -140,6 +168,15 @@ Uint64 __umoddi3(Uint64 Num, Uint64 Den)
        return Num;
 }
 
+Uint16 LittleEndian16(Uint16 Val)
+{
+       return Val;
+}
+Uint16 BigEndian16(Uint16 Val)
+{
+       return ((Val&0xFF)<<8) | ((Val>>8)&0xFF);
+}
+
 // --- EXPORTS ---
 EXPORT(memcpy);        EXPORT(memset);
 //EXPORT(memcpyw);     EXPORT(memsetw);

UCC git Repository :: git.ucc.asn.au