/* { dg-do run } */ /* { dg-options "-O2 -msse2" } */ /* { dg-require-effective-target sse2 } */ /* scalar 64-bit DImode rotations. */ unsigned long long rot1(unsigned long long x) { return (x>>1) | (x<<63); } unsigned long long rot2(unsigned long long x) { return (x>>2) | (x<<62); } unsigned long long rot3(unsigned long long x) { return (x>>3) | (x<<61); } unsigned long long rot4(unsigned long long x) { return (x>>4) | (x<<60); } unsigned long long rot5(unsigned long long x) { return (x>>5) | (x<<59); } unsigned long long rot6(unsigned long long x) { return (x>>6) | (x<<58); } unsigned long long rot7(unsigned long long x) { return (x>>7) | (x<<57); } unsigned long long rot8(unsigned long long x) { return (x>>8) | (x<<56); } unsigned long long rot9(unsigned long long x) { return (x>>9) | (x<<55); } unsigned long long rot10(unsigned long long x) { return (x>>10) | (x<<54); } unsigned long long rot15(unsigned long long x) { return (x>>15) | (x<<49); } unsigned long long rot16(unsigned long long x) { return (x>>16) | (x<<48); } unsigned long long rot17(unsigned long long x) { return (x>>17) | (x<<47); } unsigned long long rot20(unsigned long long x) { return (x>>20) | (x<<44); } unsigned long long rot24(unsigned long long x) { return (x>>24) | (x<<40); } unsigned long long rot30(unsigned long long x) { return (x>>30) | (x<<34); } unsigned long long rot31(unsigned long long x) { return (x>>31) | (x<<33); } unsigned long long rot32(unsigned long long x) { return (x>>32) | (x<<32); } unsigned long long rot33(unsigned long long x) { return (x>>33) | (x<<31); } unsigned long long rot34(unsigned long long x) { return (x>>34) | (x<<30); } unsigned long long rot40(unsigned long long x) { return (x>>40) | (x<<24); } unsigned long long rot42(unsigned long long x) { return (x>>42) | (x<<22); } unsigned long long rot48(unsigned long long x) { return (x>>48) | (x<<16); } unsigned long long rot50(unsigned long long x) { return (x>>50) | (x<<14); } unsigned long long rot56(unsigned long long x) { return (x>>56) | (x<<8); } unsigned long long rot58(unsigned long long x) { return (x>>58) | (x<<6); } unsigned long long rot60(unsigned long long x) { return (x>>60) | (x<<4); } unsigned long long rot61(unsigned long long x) { return (x>>61) | (x<<3); } unsigned long long rot62(unsigned long long x) { return (x>>62) | (x<<2); } unsigned long long rot63(unsigned long long x) { return (x>>63) | (x<<1); } /* DImode mem-to-mem rotations. These STV with -m32. */ void mem1(unsigned long long *p) { *p = rot1(*p); } void mem2(unsigned long long *p) { *p = rot2(*p); } void mem3(unsigned long long *p) { *p = rot3(*p); } void mem4(unsigned long long *p) { *p = rot4(*p); } void mem5(unsigned long long *p) { *p = rot5(*p); } void mem6(unsigned long long *p) { *p = rot6(*p); } void mem7(unsigned long long *p) { *p = rot7(*p); } void mem8(unsigned long long *p) { *p = rot8(*p); } void mem9(unsigned long long *p) { *p = rot9(*p); } void mem10(unsigned long long *p) { *p = rot10(*p); } void mem15(unsigned long long *p) { *p = rot15(*p); } void mem16(unsigned long long *p) { *p = rot16(*p); } void mem17(unsigned long long *p) { *p = rot17(*p); } void mem20(unsigned long long *p) { *p = rot20(*p); } void mem24(unsigned long long *p) { *p = rot24(*p); } void mem30(unsigned long long *p) { *p = rot30(*p); } void mem31(unsigned long long *p) { *p = rot31(*p); } void mem32(unsigned long long *p) { *p = rot32(*p); } void mem33(unsigned long long *p) { *p = rot33(*p); } void mem34(unsigned long long *p) { *p = rot34(*p); } void mem40(unsigned long long *p) { *p = rot40(*p); } void mem42(unsigned long long *p) { *p = rot42(*p); } void mem48(unsigned long long *p) { *p = rot48(*p); } void mem50(unsigned long long *p) { *p = rot50(*p); } void mem56(unsigned long long *p) { *p = rot56(*p); } void mem58(unsigned long long *p) { *p = rot58(*p); } void mem60(unsigned long long *p) { *p = rot60(*p); } void mem61(unsigned long long *p) { *p = rot61(*p); } void mem62(unsigned long long *p) { *p = rot62(*p); } void mem63(unsigned long long *p) { *p = rot63(*p); } /* Check that rotN and memN give the same result. */ typedef unsigned long long (*rotN)(unsigned long long); typedef void (*memN)(unsigned long long*); void eval(rotN s, memN v, unsigned long long x) { unsigned long long r = s(x); unsigned long long t = x; v(&t); if (t != r) __builtin_abort (); } void test(rotN s, memN v) { eval(s,v,0x0000000000000000ll); eval(s,v,0x0000000000000001ll); eval(s,v,0x0000000000000002ll); eval(s,v,0x0000000000000004ll); eval(s,v,0x0000000000000008ll); eval(s,v,0x0000000000000010ll); eval(s,v,0x0000000000000020ll); eval(s,v,0x0000000000000040ll); eval(s,v,0x0000000000000080ll); eval(s,v,0x0000000000000100ll); eval(s,v,0x0000000000000200ll); eval(s,v,0x0000000000000400ll); eval(s,v,0x0000000000000800ll); eval(s,v,0x0000000000001000ll); eval(s,v,0x0000000000002000ll); eval(s,v,0x0000000000004000ll); eval(s,v,0x0000000000008000ll); eval(s,v,0x0000000000010000ll); eval(s,v,0x0000000000020000ll); eval(s,v,0x0000000000040000ll); eval(s,v,0x0000000000080000ll); eval(s,v,0x0000000000100000ll); eval(s,v,0x0000000000200000ll); eval(s,v,0x0000000000400000ll); eval(s,v,0x0000000000800000ll); eval(s,v,0x0000000001000000ll); eval(s,v,0x0000000002000000ll); eval(s,v,0x0000000004000000ll); eval(s,v,0x0000000008000000ll); eval(s,v,0x0000000010000000ll); eval(s,v,0x0000000020000000ll); eval(s,v,0x0000000040000000ll); eval(s,v,0x0000000080000000ll); eval(s,v,0x0000000100000000ll); eval(s,v,0x0000000200000000ll); eval(s,v,0x0000000400000000ll); eval(s,v,0x0000000800000000ll); eval(s,v,0x0000001000000000ll); eval(s,v,0x0000002000000000ll); eval(s,v,0x0000004000000000ll); eval(s,v,0x0000008000000000ll); eval(s,v,0x0000010000000000ll); eval(s,v,0x0000020000000000ll); eval(s,v,0x0000040000000000ll); eval(s,v,0x0000080000000000ll); eval(s,v,0x0000100000000000ll); eval(s,v,0x0000200000000000ll); eval(s,v,0x0000400000000000ll); eval(s,v,0x0000800000000000ll); eval(s,v,0x0001000000000000ll); eval(s,v,0x0002000000000000ll); eval(s,v,0x0004000000000000ll); eval(s,v,0x0008000000000000ll); eval(s,v,0x0010000000000000ll); eval(s,v,0x0020000000000000ll); eval(s,v,0x0040000000000000ll); eval(s,v,0x0080000000000000ll); eval(s,v,0x0100000000000000ll); eval(s,v,0x0200000000000000ll); eval(s,v,0x0400000000000000ll); eval(s,v,0x0800000000000000ll); eval(s,v,0x1000000000000000ll); eval(s,v,0x2000000000000000ll); eval(s,v,0x4000000000000000ll); eval(s,v,0x8000000000000000ll); eval(s,v,0x0123456789abcdefll); eval(s,v,0x1111111111111111ll); eval(s,v,0x5555555555555555ll); eval(s,v,0x8888888888888888ll); eval(s,v,0xaaaaaaaaaaaaaaaall); eval(s,v,0xcafebabecafebabell); eval(s,v,0xdeadbeefdeadbeefll); eval(s,v,0xfedcba9876543210ll); eval(s,v,0xffffffffffffffffll); } int main() { test(rot1,mem1); test(rot2,mem2); test(rot3,mem3); test(rot4,mem4); test(rot5,mem5); test(rot6,mem6); test(rot7,mem7); test(rot8,mem8); test(rot9,mem9); test(rot10,mem10); test(rot15,mem15); test(rot16,mem16); test(rot17,mem17); test(rot20,mem20); test(rot24,mem24); test(rot30,mem30); test(rot31,mem31); test(rot32,mem32); test(rot33,mem33); test(rot34,mem34); test(rot40,mem40); test(rot42,mem42); test(rot48,mem48); test(rot50,mem50); test(rot56,mem56); test(rot58,mem58); test(rot60,mem60); test(rot61,mem61); test(rot62,mem62); test(rot63,mem63); return 0; }