aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJoe Soroka <gits@joesoroka.com>2011-02-01 15:37:58 -0800
committerJoe Soroka <gits@joesoroka.com>2011-02-01 15:37:58 -0800
commit87d84b7cb8b41a4ebf8dda39edc74acc1382d0e6 (patch)
treeeab7079ea2a0719e3120ac352eb15077fac02075 /tests
parenta25325e9be13e52a198807b443bdfbfbe5dcaf33 (diff)
downloadtinycc-87d84b7cb8b41a4ebf8dda39edc74acc1382d0e6.tar.gz
tinycc-87d84b7cb8b41a4ebf8dda39edc74acc1382d0e6.tar.bz2
tccasm: allow one-line prefix+op things like "rep stosb"
Diffstat (limited to 'tests')
-rw-r--r--tests/asmtest.S18
-rw-r--r--tests/tcctest.c43
2 files changed, 61 insertions, 0 deletions
diff --git a/tests/asmtest.S b/tests/asmtest.S
index 0d4c0fc..452815c 100644
--- a/tests/asmtest.S
+++ b/tests/asmtest.S
@@ -478,6 +478,24 @@ int $0x10
repz
repne
repnz
+ nop
+
+ lock ;negl (%eax)
+ wait ;pushf
+ rep ;stosb
+ repe ;lodsb
+ repz ;cmpsb
+ repne;movsb
+ repnz;outsb
+
+ /* handle one-line prefix + ops */
+ lock negl (%eax)
+ wait pushf
+ rep stosb
+ repe lodsb
+ repz cmpsb
+ repne movsb
+ repnz outsb
invd
wbinvd
diff --git a/tests/tcctest.c b/tests/tcctest.c
index f62983d..3af3d18 100644
--- a/tests/tcctest.c
+++ b/tests/tcctest.c
@@ -2132,6 +2132,27 @@ __asm__ __volatile__(
return dest;
}
+static char * strncat2(char * dest,const char * src,size_t count)
+{
+int d0, d1, d2, d3;
+__asm__ __volatile__(
+ "repne scasb\n\t" /* one-line repne prefix + string op */
+ "decl %1\n\t"
+ "movl %8,%3\n"
+ "1:\tdecl %3\n\t"
+ "js 2f\n\t"
+ "lodsb\n\t"
+ "stosb\n\t"
+ "testb %%al,%%al\n\t"
+ "jne 1b\n"
+ "2:\txorl %2,%2\n\t"
+ "stosb"
+ : "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
+ : "0" (src),"1" (dest),"2" (0),"3" (0xffffffff), "g" (count)
+ : "memory");
+return dest;
+}
+
static inline void * memcpy1(void * to, const void * from, size_t n)
{
int d0, d1, d2;
@@ -2150,6 +2171,24 @@ __asm__ __volatile__(
return (to);
}
+static inline void * memcpy2(void * to, const void * from, size_t n)
+{
+int d0, d1, d2;
+__asm__ __volatile__(
+ "rep movsl\n\t" /* one-line rep prefix + string op */
+ "testb $2,%b4\n\t"
+ "je 1f\n\t"
+ "movsw\n"
+ "1:\ttestb $1,%b4\n\t"
+ "je 2f\n\t"
+ "movsb\n"
+ "2:"
+ : "=&c" (d0), "=&D" (d1), "=&S" (d2)
+ :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
+ : "memory");
+return (to);
+}
+
static __inline__ void sigaddset1(unsigned int *set, int _sig)
{
__asm__("btsl %1,%0" : "=m"(*set) : "Ir"(_sig - 1) : "cc");
@@ -2199,6 +2238,10 @@ void asm_test(void)
strncat1(buf, " worldXXXXX", 3);
printf("%s\n", buf);
+ memcpy2(buf, "hello", 6);
+ strncat2(buf, " worldXXXXX", 3);
+ printf("%s\n", buf);
+
/* 'A' constraint test */
printf("mul64=0x%Lx\n", mul64(0x12345678, 0xabcd1234));
printf("inc64=0x%Lx\n", inc64(0x12345678ffffffff));