From: Julian Seward Date: Thu, 4 Jul 2013 15:29:07 +0000 (+0000) Subject: Add test cases for X-Git-Tag: svn/VALGRIND_3_9_0~246 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0f61834992cfdff536f52ac054a31b7b65577b58;p=thirdparty%2Fvalgrind.git Add test cases for (T1) STRBT reg+#imm8 (T1) STRHT reg+#imm8 (T1) LDRBT reg+#imm8 (T1) LDRSBT reg+#imm8 Pertaining to: 319858 319932 320083 321693 321148 (Vasily, w.golubev@mail.ru) git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13445 --- diff --git a/none/tests/arm/ldrt.c b/none/tests/arm/ldrt.c index 93fdcdc431..0f273a3b7e 100644 --- a/none/tests/arm/ldrt.c +++ b/none/tests/arm/ldrt.c @@ -26,6 +26,42 @@ __attribute__((noinline)) void do_strt_imm_132 ( unsigned char* p, UInt val ) ); } +__attribute__((noinline)) void do_strbt_imm_132 ( unsigned char* p, UInt* val ) +{ + __asm__ __volatile__( + "mov r5, %0 ; ldr r6, [r5] ; mov r5, %1; strbt r6, [r5, #132]" + : : "r"(val), "r"(p) : "r5", "r6", "memory" + ); +} + +__attribute__((noinline)) void do_strht_imm_132 ( unsigned char* p, UInt* val ) +{ + __asm__ __volatile__( + "mov r5, %0 ; ldr r6, [r5] ; mov r5, %1; strht r6, [r5, #132]" + : : "r"(val), "r"(p) : "r5", "r6", "memory" + ); +} + +__attribute__((noinline)) UInt do_ldrbt_imm_2 (unsigned char* val) +{ + UInt res; + __asm__ __volatile__( + "mov r4, %1 ; ldrbt r5, [r4, #2]; mov %0, r5" + : "=r"(res) : "r"(val) : "r4", "r5" + ); + return res; +} + +__attribute__((noinline)) UInt do_ldrsbt_imm_2 (unsigned char* val) +{ + UInt res; + __asm__ __volatile__( + "mov r4, %1 ; ldrsbt r5, [r4, #2]; mov %0, r5" + : "=r"(res) : "r"(val) : "r4", "r5" + ); + return res; +} + int main ( void ) { UInt i; @@ -43,5 +79,30 @@ int main ( void ) c[131], c[132], c[133], c[134], c[135], c[136], 131, 200, 150, 100, 10, 136); free(c); + + UInt val_bt = 0b11111111; + unsigned char* d = malloc(256); + for (i = 0; i < 256; i++) d[i] = (unsigned char)i; + do_strbt_imm_132(d, &val_bt); + printf("result is %u %u %u (should be %u %u %u)\n", + d[131], d[132], d[133], 131, 255, 133); + free(d); + + UInt val_ht = 0xFFFF; + unsigned char* e = malloc(256); + for (i = 0; i < 256; i++) e[i] = (unsigned char)i; + do_strht_imm_132(e, &val_ht); + printf("result is %u %u %u %u (should be %u %u %u %u)\n", + e[131], e[132], e[133], e[134], 131, 255, 255, 134); + free(e); + + UInt val_ldrbt = (200 << 0) | (150 << 8) | (137 << 16) | (10 << 24); + printf("result is %u (should be %u)\n", + do_ldrbt_imm_2((unsigned char*)&val_ldrbt), 137); + + UInt val_ldrsbt = (200 << 0) | (150 << 8) | (254 << 16) | (10 << 24); + printf("result is %u (should be %u)\n", + do_ldrsbt_imm_2((unsigned char*)&val_ldrsbt), 4294967294); + return 0; } diff --git a/none/tests/arm/ldrt.stdout.exp b/none/tests/arm/ldrt.stdout.exp index ed9139ef14..1c4fe2b526 100644 --- a/none/tests/arm/ldrt.stdout.exp +++ b/none/tests/arm/ldrt.stdout.exp @@ -1,2 +1,6 @@ result is 0x87868584 (should be 0x87868584) result is 131 200 150 100 10 136 (should be 131 200 150 100 10 136) +result is 131 255 133 (should be 131 255 133) +result is 131 255 255 134 (should be 131 255 255 134) +result is 137 (should be 137) +result is 4294967294 (should be 4294967294)