/* Test memcmp/strncmp builtin expansion for compilation and proper execution. */ /* { dg-do run } */ /* { dg-options "-O2" } */ /* { dg-require-effective-target ptr32plus } */ /* { dg-timeout-factor 2 } */ #include #include #include #include #define STR1(X) #X #define STR2(X) STR1(X) int lib_memcmp(const void *a, const void *b, size_t n) asm(STR2(__USER_LABEL_PREFIX__) "memcmp"); int lib_strncmp(const char *a, const char *b, size_t n) asm(STR2(__USER_LABEL_PREFIX__) "strncmp"); #ifndef NRAND #ifdef TEST_ALL #define NRAND 10000 #else #define NRAND 500 #endif #endif #ifndef TZONE #ifdef TEST_ALL #define TZONE 16 #else #define TZONE 8 #endif #endif #define MAX_SZ 600 #define DEF_RS(ALIGN) \ static void test_memcmp_runtime_size_ ## ALIGN (const char *str1, \ const char *str2, \ size_t sz, int expect) \ { \ char three[8192] __attribute__ ((aligned (4096))); \ char four[8192] __attribute__ ((aligned (4096))); \ char *a, *b; \ int i,j,a1,a2,r; \ for (j = 0; j < 2; j++) \ { \ for (i = 0; i < 2; i++) \ { \ a = three+i*ALIGN+j*(4096-2*i*ALIGN); \ b = four+i*ALIGN+j*(4096-2*i*ALIGN); \ memcpy(a,str1,sz); \ memcpy(b,str2,sz); \ r = memcmp(a,b,sz); \ if ( r < 0 && !(expect < 0) ) abort(); \ if ( r > 0 && !(expect > 0) ) abort(); \ if ( r == 0 && !(expect == 0) ) abort(); \ } \ } \ } DEF_RS(1) DEF_RS(2) DEF_RS(4) DEF_RS(8) DEF_RS(16) static void test_memcmp_runtime_size (const char *str1, const char *str2, size_t sz, int expect) { char three[8192] __attribute__ ((aligned (4096))); char four[8192] __attribute__ ((aligned (4096))); char *a, *b; int i,j,a1,a2,r; test_memcmp_runtime_size_1 (str1,str2,sz,expect); test_memcmp_runtime_size_2 (str1,str2,sz,expect); test_memcmp_runtime_size_4 (str1,str2,sz,expect); test_memcmp_runtime_size_8 (str1,str2,sz,expect); test_memcmp_runtime_size_16 (str1,str2,sz,expect); for (j = 0; j < 2; j++) { for (i = 0; i < 2; i++) { for (a1=0; a1 < 2*sizeof(void *); a1++) { a = three+i*a1+j*(4096-2*i*a1); memcpy(a,str1,sz); for (a2=0; a2 < 2*sizeof(void *); a2++) { b = four+i*a2+j*(4096-2*i*a2); memcpy(b,str2,sz); r = memcmp(a,b,sz); if ( r < 0 && !(expect < 0) ) abort(); if ( r > 0 && !(expect > 0) ) abort(); if ( r == 0 && !(expect == 0) ) abort(); } } } } } static void test_driver_memcmp (void (test_memcmp)(const char *, const char *, int), void (test_strncmp)(const char *, const char *, int), size_t sz, int align) { char buf1[MAX_SZ*2+TZONE],buf2[MAX_SZ*2+TZONE]; size_t test_sz = (szTZONE)?(test_sz-TZONE):0); diff_pos < test_sz+TZONE; diff_pos++) for(zero_pos = ((test_sz>TZONE)?(test_sz-TZONE):0); zero_pos < test_sz+TZONE; zero_pos++) { memset(buf1, 'A', 2*test_sz); memset(buf2, 'A', 2*test_sz); buf2[diff_pos] = 'B'; buf1[zero_pos] = 0; buf2[zero_pos] = 0; e = lib_memcmp(buf1,buf2,sz); (*test_memcmp)(buf1,buf2,e); (*test_memcmp)(buf2,buf1,-e); (*test_memcmp)(buf2,buf2,0); test_memcmp_runtime_size (buf1, buf2, sz, e); test_memcmp_runtime_size (buf2, buf1, sz, -e); e = lib_strncmp(buf1,buf2,sz); (*test_strncmp)(buf1,buf2,e); (*test_strncmp)(buf2,buf1,-e); (*test_strncmp)(buf2,buf2,0); /* differing length: */ buf2[diff_pos] = 0; e = lib_memcmp(buf1,buf2,sz); (*test_memcmp)(buf1,buf2,e); test_memcmp_runtime_size (buf1, buf2, sz, e); e = lib_strncmp(buf1,buf2,sz); (*test_strncmp)(buf1,buf2,e); memset(buf2+diff_pos,'B',sizeof(buf2)-diff_pos); buf2[zero_pos] = 0; e = lib_memcmp(buf1,buf2,sz); (*test_memcmp)(buf1,buf2,e); (*test_memcmp)(buf2,buf1,-e); test_memcmp_runtime_size (buf1, buf2, sz, e); test_memcmp_runtime_size (buf2, buf1, sz, -e); e = lib_strncmp(buf1,buf2,sz); (*test_strncmp)(buf1,buf2,e); (*test_strncmp)(buf2,buf1,-e); } } #define RUN_TEST(SZ, ALIGN) test_driver_memcmp (test_memcmp_ ## SZ ## _ ## ALIGN, test_strncmp_ ## SZ ## _ ## ALIGN, SZ, ALIGN); #define DEF_TEST(SZ, ALIGN) \ static void test_memcmp_ ## SZ ## _ ## ALIGN (const char *str1, const char *str2, int expect) \ { \ char three[8192] __attribute__ ((aligned (4096))); \ char four[8192] __attribute__ ((aligned (4096))); \ char *a, *b; \ int i,j,r; \ for (j = 0; j < 2; j++) \ { \ for (i = 0; i < 2; i++) \ { \ a = three+i*ALIGN+j*(4096-2*i*ALIGN); \ b = four+i*ALIGN+j*(4096-2*i*ALIGN); \ memcpy(a,str1,SZ); \ memcpy(b,str2,SZ); \ r = memcmp(a,b,SZ); \ if ( r < 0 && !(expect < 0) ) abort(); \ if ( r > 0 && !(expect > 0) ) abort(); \ if ( r == 0 && !(expect == 0) ) abort(); \ } \ } \ } \ static void test_strncmp_ ## SZ ## _ ## ALIGN (const char *str1, const char *str2, int expect) \ { \ char three[8192] __attribute__ ((aligned (4096))); \ char four[8192] __attribute__ ((aligned (4096))); \ char *a, *b; \ int i,j,r; \ for (j = 0; j < 2; j++) \ { \ for (i = 0; i < 2; i++) \ { \ a = three+i*ALIGN+j*(4096-2*i*ALIGN); \ b = four+i*ALIGN+j*(4096-2*i*ALIGN); \ memcpy(a,str1,SZ); \ memcpy(b,str2,SZ); \ r = strncmp(a,b,SZ); \ if ( r < 0 && !(expect < 0) ) abort(); \ if ( r > 0 && !(expect > 0) ) abort(); \ if ( r == 0 && !(expect == 0) ) abort(); \ } \ } \ } #ifdef TEST_ALL DEF_TEST(1,1) DEF_TEST(1,2) DEF_TEST(1,4) DEF_TEST(1,8) DEF_TEST(1,16) DEF_TEST(2,1) DEF_TEST(2,2) DEF_TEST(2,4) DEF_TEST(2,8) DEF_TEST(2,16) DEF_TEST(3,1) DEF_TEST(3,2) DEF_TEST(3,4) DEF_TEST(3,8) DEF_TEST(3,16) DEF_TEST(4,1) DEF_TEST(4,2) DEF_TEST(4,4) DEF_TEST(4,8) DEF_TEST(4,16) DEF_TEST(5,1) DEF_TEST(5,2) DEF_TEST(5,4) DEF_TEST(5,8) DEF_TEST(5,16) DEF_TEST(6,1) DEF_TEST(6,2) DEF_TEST(6,4) DEF_TEST(6,8) DEF_TEST(6,16) DEF_TEST(7,1) DEF_TEST(7,2) DEF_TEST(7,4) DEF_TEST(7,8) DEF_TEST(7,16) DEF_TEST(8,1) DEF_TEST(8,2) DEF_TEST(8,4) DEF_TEST(8,8) DEF_TEST(8,16) DEF_TEST(9,1) DEF_TEST(9,2) DEF_TEST(9,4) DEF_TEST(9,8) DEF_TEST(9,16) DEF_TEST(10,1) DEF_TEST(10,2) DEF_TEST(10,4) DEF_TEST(10,8) DEF_TEST(10,16) DEF_TEST(11,1) DEF_TEST(11,2) DEF_TEST(11,4) DEF_TEST(11,8) DEF_TEST(11,16) DEF_TEST(12,1) DEF_TEST(12,2) DEF_TEST(12,4) DEF_TEST(12,8) DEF_TEST(12,16) DEF_TEST(13,1) DEF_TEST(13,2) DEF_TEST(13,4) DEF_TEST(13,8) DEF_TEST(13,16) DEF_TEST(14,1) DEF_TEST(14,2) DEF_TEST(14,4) DEF_TEST(14,8) DEF_TEST(14,16) DEF_TEST(15,1) DEF_TEST(15,2) DEF_TEST(15,4) DEF_TEST(15,8) DEF_TEST(15,16) DEF_TEST(16,1) DEF_TEST(16,2) DEF_TEST(16,4) DEF_TEST(16,8) DEF_TEST(16,16) DEF_TEST(17,1) DEF_TEST(17,2) DEF_TEST(17,4) DEF_TEST(17,8) DEF_TEST(17,16) DEF_TEST(18,1) DEF_TEST(18,2) DEF_TEST(18,4) DEF_TEST(18,8) DEF_TEST(18,16) DEF_TEST(19,1) DEF_TEST(19,2) DEF_TEST(19,4) DEF_TEST(19,8) DEF_TEST(19,16) DEF_TEST(20,1) DEF_TEST(20,2) DEF_TEST(20,4) DEF_TEST(20,8) DEF_TEST(20,16) DEF_TEST(21,1) DEF_TEST(21,2) DEF_TEST(21,4) DEF_TEST(21,8) DEF_TEST(21,16) DEF_TEST(22,1) DEF_TEST(22,2) DEF_TEST(22,4) DEF_TEST(22,8) DEF_TEST(22,16) DEF_TEST(23,1) DEF_TEST(23,2) DEF_TEST(23,4) DEF_TEST(23,8) DEF_TEST(23,16) DEF_TEST(24,1) DEF_TEST(24,2) DEF_TEST(24,4) DEF_TEST(24,8) DEF_TEST(24,16) DEF_TEST(25,1) DEF_TEST(25,2) DEF_TEST(25,4) DEF_TEST(25,8) DEF_TEST(25,16) DEF_TEST(26,1) DEF_TEST(26,2) DEF_TEST(26,4) DEF_TEST(26,8) DEF_TEST(26,16) DEF_TEST(27,1) DEF_TEST(27,2) DEF_TEST(27,4) DEF_TEST(27,8) DEF_TEST(27,16) DEF_TEST(28,1) DEF_TEST(28,2) DEF_TEST(28,4) DEF_TEST(28,8) DEF_TEST(28,16) DEF_TEST(29,1) DEF_TEST(29,2) DEF_TEST(29,4) DEF_TEST(29,8) DEF_TEST(29,16) DEF_TEST(30,1) DEF_TEST(30,2) DEF_TEST(30,4) DEF_TEST(30,8) DEF_TEST(30,16) DEF_TEST(31,1) DEF_TEST(31,2) DEF_TEST(31,4) DEF_TEST(31,8) DEF_TEST(31,16) DEF_TEST(32,1) DEF_TEST(32,2) DEF_TEST(32,4) DEF_TEST(32,8) DEF_TEST(32,16) DEF_TEST(33,1) DEF_TEST(33,2) DEF_TEST(33,4) DEF_TEST(33,8) DEF_TEST(33,16) DEF_TEST(34,1) DEF_TEST(34,2) DEF_TEST(34,4) DEF_TEST(34,8) DEF_TEST(34,16) DEF_TEST(35,1) DEF_TEST(35,2) DEF_TEST(35,4) DEF_TEST(35,8) DEF_TEST(35,16) DEF_TEST(36,1) DEF_TEST(36,2) DEF_TEST(36,4) DEF_TEST(36,8) DEF_TEST(36,16) DEF_TEST(37,1) DEF_TEST(37,2) DEF_TEST(37,4) DEF_TEST(37,8) DEF_TEST(37,16) DEF_TEST(38,1) DEF_TEST(38,2) DEF_TEST(38,4) DEF_TEST(38,8) DEF_TEST(38,16) DEF_TEST(39,1) DEF_TEST(39,2) DEF_TEST(39,4) DEF_TEST(39,8) DEF_TEST(39,16) DEF_TEST(40,1) DEF_TEST(40,2) DEF_TEST(40,4) DEF_TEST(40,8) DEF_TEST(40,16) DEF_TEST(41,1) DEF_TEST(41,2) DEF_TEST(41,4) DEF_TEST(41,8) DEF_TEST(41,16) DEF_TEST(42,1) DEF_TEST(42,2) DEF_TEST(42,4) DEF_TEST(42,8) DEF_TEST(42,16) DEF_TEST(43,1) DEF_TEST(43,2) DEF_TEST(43,4) DEF_TEST(43,8) DEF_TEST(43,16) DEF_TEST(44,1) DEF_TEST(44,2) DEF_TEST(44,4) DEF_TEST(44,8) DEF_TEST(44,16) DEF_TEST(45,1) DEF_TEST(45,2) DEF_TEST(45,4) DEF_TEST(45,8) DEF_TEST(45,16) DEF_TEST(46,1) DEF_TEST(46,2) DEF_TEST(46,4) DEF_TEST(46,8) DEF_TEST(46,16) DEF_TEST(47,1) DEF_TEST(47,2) DEF_TEST(47,4) DEF_TEST(47,8) DEF_TEST(47,16) DEF_TEST(48,1) DEF_TEST(48,2) DEF_TEST(48,4) DEF_TEST(48,8) DEF_TEST(48,16) DEF_TEST(49,1) DEF_TEST(49,2) DEF_TEST(49,4) DEF_TEST(49,8) DEF_TEST(49,16) DEF_TEST(100,1) DEF_TEST(100,2) DEF_TEST(100,4) DEF_TEST(100,8) DEF_TEST(100,16) DEF_TEST(191,1) DEF_TEST(192,1) DEF_TEST(193,1) DEF_TEST(200,1) DEF_TEST(400,1) #else DEF_TEST(1,1) DEF_TEST(2,1) DEF_TEST(3,1) DEF_TEST(4,1) DEF_TEST(5,1) DEF_TEST(5,8) DEF_TEST(6,1) DEF_TEST(6,4) DEF_TEST(6,8) DEF_TEST(7,1) DEF_TEST(7,2) DEF_TEST(7,4) DEF_TEST(7,8) DEF_TEST(8,1) DEF_TEST(9,1) DEF_TEST(16,1) DEF_TEST(32,1) DEF_TEST(33,8) DEF_TEST(49,1) #endif int main(int argc, char **argv) { #ifdef TEST_ALL RUN_TEST(1,1) RUN_TEST(1,2) RUN_TEST(1,4) RUN_TEST(1,8) RUN_TEST(1,16) RUN_TEST(2,1) RUN_TEST(2,2) RUN_TEST(2,4) RUN_TEST(2,8) RUN_TEST(2,16) RUN_TEST(3,1) RUN_TEST(3,2) RUN_TEST(3,4) RUN_TEST(3,8) RUN_TEST(3,16) RUN_TEST(4,1) RUN_TEST(4,2) RUN_TEST(4,4) RUN_TEST(4,8) RUN_TEST(4,16) RUN_TEST(5,1) RUN_TEST(5,2) RUN_TEST(5,4) RUN_TEST(5,8) RUN_TEST(5,16) RUN_TEST(6,1) RUN_TEST(6,2) RUN_TEST(6,4) RUN_TEST(6,8) RUN_TEST(6,16) RUN_TEST(7,1) RUN_TEST(7,2) RUN_TEST(7,4) RUN_TEST(7,8) RUN_TEST(7,16) RUN_TEST(8,1) RUN_TEST(8,2) RUN_TEST(8,4) RUN_TEST(8,8) RUN_TEST(8,16) RUN_TEST(9,1) RUN_TEST(9,2) RUN_TEST(9,4) RUN_TEST(9,8) RUN_TEST(9,16) RUN_TEST(10,1) RUN_TEST(10,2) RUN_TEST(10,4) RUN_TEST(10,8) RUN_TEST(10,16) RUN_TEST(11,1) RUN_TEST(11,2) RUN_TEST(11,4) RUN_TEST(11,8) RUN_TEST(11,16) RUN_TEST(12,1) RUN_TEST(12,2) RUN_TEST(12,4) RUN_TEST(12,8) RUN_TEST(12,16) RUN_TEST(13,1) RUN_TEST(13,2) RUN_TEST(13,4) RUN_TEST(13,8) RUN_TEST(13,16) RUN_TEST(14,1) RUN_TEST(14,2) RUN_TEST(14,4) RUN_TEST(14,8) RUN_TEST(14,16) RUN_TEST(15,1) RUN_TEST(15,2) RUN_TEST(15,4) RUN_TEST(15,8) RUN_TEST(15,16) RUN_TEST(16,1) RUN_TEST(16,2) RUN_TEST(16,4) RUN_TEST(16,8) RUN_TEST(16,16) RUN_TEST(17,1) RUN_TEST(17,2) RUN_TEST(17,4) RUN_TEST(17,8) RUN_TEST(17,16) RUN_TEST(18,1) RUN_TEST(18,2) RUN_TEST(18,4) RUN_TEST(18,8) RUN_TEST(18,16) RUN_TEST(19,1) RUN_TEST(19,2) RUN_TEST(19,4) RUN_TEST(19,8) RUN_TEST(19,16) RUN_TEST(20,1) RUN_TEST(20,2) RUN_TEST(20,4) RUN_TEST(20,8) RUN_TEST(20,16) RUN_TEST(21,1) RUN_TEST(21,2) RUN_TEST(21,4) RUN_TEST(21,8) RUN_TEST(21,16) RUN_TEST(22,1) RUN_TEST(22,2) RUN_TEST(22,4) RUN_TEST(22,8) RUN_TEST(22,16) RUN_TEST(23,1) RUN_TEST(23,2) RUN_TEST(23,4) RUN_TEST(23,8) RUN_TEST(23,16) RUN_TEST(24,1) RUN_TEST(24,2) RUN_TEST(24,4) RUN_TEST(24,8) RUN_TEST(24,16) RUN_TEST(25,1) RUN_TEST(25,2) RUN_TEST(25,4) RUN_TEST(25,8) RUN_TEST(25,16) RUN_TEST(26,1) RUN_TEST(26,2) RUN_TEST(26,4) RUN_TEST(26,8) RUN_TEST(26,16) RUN_TEST(27,1) RUN_TEST(27,2) RUN_TEST(27,4) RUN_TEST(27,8) RUN_TEST(27,16) RUN_TEST(28,1) RUN_TEST(28,2) RUN_TEST(28,4) RUN_TEST(28,8) RUN_TEST(28,16) RUN_TEST(29,1) RUN_TEST(29,2) RUN_TEST(29,4) RUN_TEST(29,8) RUN_TEST(29,16) RUN_TEST(30,1) RUN_TEST(30,2) RUN_TEST(30,4) RUN_TEST(30,8) RUN_TEST(30,16) RUN_TEST(31,1) RUN_TEST(31,2) RUN_TEST(31,4) RUN_TEST(31,8) RUN_TEST(31,16) RUN_TEST(32,1) RUN_TEST(32,2) RUN_TEST(32,4) RUN_TEST(32,8) RUN_TEST(32,16) RUN_TEST(33,1) RUN_TEST(33,2) RUN_TEST(33,4) RUN_TEST(33,8) RUN_TEST(33,16) RUN_TEST(34,1) RUN_TEST(34,2) RUN_TEST(34,4) RUN_TEST(34,8) RUN_TEST(34,16) RUN_TEST(35,1) RUN_TEST(35,2) RUN_TEST(35,4) RUN_TEST(35,8) RUN_TEST(35,16) RUN_TEST(36,1) RUN_TEST(36,2) RUN_TEST(36,4) RUN_TEST(36,8) RUN_TEST(36,16) RUN_TEST(37,1) RUN_TEST(37,2) RUN_TEST(37,4) RUN_TEST(37,8) RUN_TEST(37,16) RUN_TEST(38,1) RUN_TEST(38,2) RUN_TEST(38,4) RUN_TEST(38,8) RUN_TEST(38,16) RUN_TEST(39,1) RUN_TEST(39,2) RUN_TEST(39,4) RUN_TEST(39,8) RUN_TEST(39,16) RUN_TEST(40,1) RUN_TEST(40,2) RUN_TEST(40,4) RUN_TEST(40,8) RUN_TEST(40,16) RUN_TEST(41,1) RUN_TEST(41,2) RUN_TEST(41,4) RUN_TEST(41,8) RUN_TEST(41,16) RUN_TEST(42,1) RUN_TEST(42,2) RUN_TEST(42,4) RUN_TEST(42,8) RUN_TEST(42,16) RUN_TEST(43,1) RUN_TEST(43,2) RUN_TEST(43,4) RUN_TEST(43,8) RUN_TEST(43,16) RUN_TEST(44,1) RUN_TEST(44,2) RUN_TEST(44,4) RUN_TEST(44,8) RUN_TEST(44,16) RUN_TEST(45,1) RUN_TEST(45,2) RUN_TEST(45,4) RUN_TEST(45,8) RUN_TEST(45,16) RUN_TEST(46,1) RUN_TEST(46,2) RUN_TEST(46,4) RUN_TEST(46,8) RUN_TEST(46,16) RUN_TEST(47,1) RUN_TEST(47,2) RUN_TEST(47,4) RUN_TEST(47,8) RUN_TEST(47,16) RUN_TEST(48,1) RUN_TEST(48,2) RUN_TEST(48,4) RUN_TEST(48,8) RUN_TEST(48,16) RUN_TEST(49,1) RUN_TEST(49,2) RUN_TEST(49,4) RUN_TEST(49,8) RUN_TEST(49,16) RUN_TEST(100,1) RUN_TEST(100,2) RUN_TEST(100,4) RUN_TEST(100,8) RUN_TEST(100,16) RUN_TEST(191,1) RUN_TEST(192,1) RUN_TEST(193,1) RUN_TEST(200,1) RUN_TEST(400,1) #else RUN_TEST(1,1) RUN_TEST(2,1) RUN_TEST(3,1) RUN_TEST(4,1) RUN_TEST(5,1) RUN_TEST(5,8) RUN_TEST(6,1) RUN_TEST(6,4) RUN_TEST(6,8) RUN_TEST(7,1) RUN_TEST(7,2) RUN_TEST(7,4) RUN_TEST(7,8) RUN_TEST(8,1) RUN_TEST(9,1) RUN_TEST(16,1) RUN_TEST(32,1) RUN_TEST(33,8) RUN_TEST(49,1) #endif }