blob: 4620bf6795699d402fde6ae8c7a39fbc511a0a9f [file] [log] [blame]
/*
* This file is used to test shift right operations in conjunction with
* the Signless Types features. The SHR instruction was replaced with
* LSHR, ASHR instructions. The tests here are aimed at triggering
* InstructionCombining transforms to exercise them and ensure they are
* not altering the computed values.
*/
#include <stdio.h>
unsigned ShrTest1(unsigned X, unsigned C1, unsigned C2) {
// (ushr X, C1) & C2 == 0 iff (-1 >> C1) & C2 == 0
return (X >> C1) & C2;
}
int ShrTest2(int X, unsigned C1, int C2) {
// (ashr X, C1) & C2 -> (lshr X, C1) & C2 if C2 only has low-bit set
return (X >> C1) & C2;
}
int ShrTest3(int X) {
// -((uint)X >> 31) -> ((int)X >> 31)
return -((unsigned)X >> 31);
}
unsigned ShrTest4(int X) {
// -((int)X >> 31) -> ((uint)X >> 31)
return -(X >> 31);
}
unsigned ShrTest5(unsigned X, unsigned C) {
// (X >> C) & AndRHS) -> X >> C if AndRHS == AllOne >> C
unsigned AndRHS = (unsigned)0xFFFFFFFF >> C;
return (X >> C) & AndRHS;
}
unsigned ShrTest6(int X, unsigned C) {
// (X >>s C) & AndRHS) -> X >> C if AndRHS == AllOne >> C
int AndRHS = (unsigned)0xFFFFFFFF >> C;
return (X >> C) & AndRHS;
}
int ShrTest7(int X) {
// shr X, 0 == X
return X >> 0;
}
int ShrTest8(unsigned C) {
// ashr -1, C == -1
return -1 >> C;
}
int ShrTest9(int Y, int X, unsigned C) {
// (Y + (X >> C)) << C -> (X + (Y << C) & (~0 << C)
return (Y + (X >> C)) << C;
}
int ShrTest10(int Y, int X, unsigned C) {
// (Y & (X >> C)) << C -> (X & (Y << C) & (~0 << C)
return (Y & (X >> C)) << C;
}
int ShrTest11(int Y, int X, unsigned C) {
// (Y | (X >> C)) << C -> (X | (Y << C) & (~0 << C)
return (Y | (X >> C)) << C;
}
int ShrTest12(int Y, int X, unsigned C, int CC) {
// (Y + ((X >> C) & CC)) << C -> ((X & (CC << C)) + (Y << C))
return (Y + ((X >> C) & CC)) << C;
}
int ShrTest13(int Y, int X, unsigned C, int CC) {
// (Y & ((X >> C) & CC)) << C -> ((X & (CC << C)) & (Y << C))
return (Y & ((X >> C) & CC)) << C;
}
int ShrTest14(int Y, int X, unsigned C, int CC) {
// (Y | ((X >> C) & CC)) << C -> ((X & (CC << C)) | (Y << C))
return (Y | ((X >> C) & CC)) << C;
}
unsigned ShrTest15(unsigned A, unsigned C1, unsigned C2) {
// (A << C1) >> C2 -> (A & (0xFFFFFFFF >>u C2)) << |C1-C2|
return (A << C1) >> C2;
}
int ShrTest16(int X, unsigned C1, unsigned C2) {
// (X >>s C1) << C2 where C1 > C2 -> (X >>s (C1-C2)) & mask
// mask = X & (0xFFFFFFFF << C2)
return (X >> C1) << C2;
}
int main(int argc, char **argv) {
printf("ShrTest1(-1, 11, 0xFF000000) = %d\n",
ShrTest1(0xFFFFFFFF, 11, 0xFF000000));
printf("ShrTest2(-73, 11, 1) = %d\n", ShrTest2(-73, 11, 1));
printf("ShrTest3(-73) = %d\n", ShrTest3(-73));
printf("ShrTest4(-73) = %d\n", ShrTest4(-73));
printf("ShrTest5(7773, 11) = %d\n", ShrTest5(7773, 11));
printf("ShrTest6(-73, 11) = %d\n", ShrTest6(-73, 11));
printf("ShrTest7(-737) = %d\n", ShrTest7(-737));
printf("ShrTest8(73) = %d\n", ShrTest8(73));
printf("ShrTest9(13, 7773, 11) = %d\n", ShrTest9(13, 7773, 11));
printf("ShrTest10(13, 7773, 11) = %d\n", ShrTest10(13, 7773, 11));
printf("ShrTest11(13, 7773, 11) = %d\n", ShrTest11(13, 7773, 11));
printf("ShrTest12(7773, -73, 11, 3773) = %d\n", ShrTest12(7773, -73, 11, 3773));
printf("ShrTest13(7773, -73, 11, 3773) = %d\n", ShrTest13(7773, -73, 11, 3773));
printf("ShrTest14(7773, -73, 11, 3773) = %d\n", ShrTest14(7773, -73, 11, 3773));
printf("ShrTest15(7773, 13, 11) = %d\n", ShrTest15(7773, 13, 11));
printf("ShrTest16(-73, 11, 13) = %d\n", ShrTest16(-73, 11, 13));
return 0;
}