/**
* \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;
}
/**
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;
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;
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;
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);