oscar64/autotest/bitshifttest.c

293 lines
4.3 KiB
C

#include <stdio.h>
#include <assert.h>
unsigned shl1b(int n)
{
return 1 << n;
}
unsigned shl1n(int n)
{
return 1 << n;
}
#pragma native(shl1n)
unsigned shr1b(int n)
{
return 0x8000 >> n;
}
unsigned shr1n(int n)
{
return 0x8000 >> n;
}
#pragma native(shr1n)
unsigned shl4b(int n)
{
return 0x0010 << n;
}
unsigned shl4n(int n)
{
return 0x0010 << n;
}
#pragma native(shl4n)
unsigned shr4b(int n)
{
return 0x0800 >> n;
}
unsigned shr4n(int n)
{
return 0x0800 >> n;
}
#pragma native(shr4n)
unsigned shl8b(int n)
{
return 0x0100 << n;
}
unsigned shl8n(int n)
{
return 0x0100 << n;
}
#pragma native(shl8n)
unsigned shr8b(int n)
{
return 0x0080 >> n;
}
unsigned shr8n(int n)
{
return 0x0080 >> n;
}
#pragma native(shr8n)
void shl16b(unsigned xu, int xi)
{
unsigned ua[16];
int ia[16];
#assign s 0
#repeat
ua[s] = xu << s;
ia[s] = xi << s;
#assign s s + 1
#until s == 16
for(int i=0; i<16; i++)
{
assert(ua[i] == xu << i);
assert(ia[i] == xi << i);
}
}
void shr16b(unsigned xu, int xi)
{
unsigned ua[16];
int ia[16];
#assign s 0
#repeat
ua[s] = xu >> s;
ia[s] = xi >> s;
#assign s s + 1
#until s == 16
for(int i=0; i<16; i++)
{
assert(ua[i] == xu >> i);
assert(ia[i] == xi >> i);
}
}
void shl16n(unsigned xu, int xi)
{
unsigned ua[16];
int ia[16];
#assign s 0
#repeat
ua[s] = xu << s;
ia[s] = xi << s;
#assign s s + 1
#until s == 16
for(int i=0; i<16; i++)
{
assert(ua[i] == xu << i);
assert(ia[i] == xi << i);
}
}
void shr16n(unsigned xu, int xi)
{
unsigned ua[16];
int ia[16];
#assign s 0
#repeat
ua[s] = xu >> s;
ia[s] = xi >> s;
#assign s s + 1
#until s == 16
for(int i=0; i<16; i++)
{
assert(ua[i] == xu >> i);
assert(ia[i] == xi >> i);
}
}
#pragma native(shl16n)
#pragma native(shr16n)
void shl32b(unsigned long xu, long xi)
{
unsigned long ua[32];
long ia[32];
#assign s 0
#repeat
ua[s] = xu << s;
ia[s] = xi << s;
#assign s s + 1
#until s == 32
for(int i=0; i<32; i++)
{
assert(ua[i] == xu << i);
assert(ia[i] == xi << i);
}
}
void shr32b(unsigned long xu, long xi)
{
unsigned long ua[32];
long ia[32];
#assign s 0
#repeat
ua[s] = xu >> s;
ia[s] = xi >> s;
#assign s s + 1
#until s == 32
for(int i=0; i<32; i++)
{
assert(ua[i] == xu >> i);
assert(ia[i] == xi >> i);
}
}
void shl32n(unsigned long xu, long xi)
{
unsigned long ua[32];
long ia[32];
#assign s 0
#repeat
ua[s] = xu << s;
ia[s] = xi << s;
#assign s s + 1
#until s == 32
for(int i=0; i<32; i++)
{
assert(ua[i] == xu << i);
assert(ia[i] == xi << i);
}
}
void shr32n(unsigned long xu, long xi)
{
unsigned long ua[32];
long ia[32];
#assign s 0
#repeat
ua[s] = xu >> s;
ia[s] = xi >> s;
#assign s s + 1
#until s == 32
for(int i=0; i<32; i++)
{
assert(ua[i] == xu >> i);
assert(ia[i] == xi >> i);
}
}
#pragma native(shl32n)
#pragma native(shr32n)
int main(void)
{
for(int i=0; i<32; i++)
{
printf("1: %.4x : %.4x | %.4x : %.4x\n", shl1b(i), shl1n(i), shr1b(i), shr1n(i));
assert(shl1b(i) == shl1n(i));
assert(shr1b(i) == shr1n(i));
}
for(int i=0; i<32; i++)
{
printf("4: %.4x : %.4x | %.4x : %.4x\n", shl4b(i), shl4n(i), shr4b(i), shr4n(i));
assert(shl4b(i) == shl4n(i));
assert(shr4b(i) == shr4n(i));
}
for(int i=0; i<32; i++)
{
printf("8: %.4x : %.4x | %.4x : %.4x\n", shl8b(i), shl8n(i), shr8b(i), shr8n(i));
assert(shl8b(i) == shl8n(i));
assert(shr8b(i) == shr8n(i));
}
shl16b(0x0000, 0x0000);
shl16b(0xffff, 0xffff);
shl16b(0x1234, 0x1234);
shl16b(0xfedc, 0xfedc);
shr16b(0x0000, 0x0000);
shr16b(0xffff, 0xffff);
shr16b(0x1234, 0x1234);
shr16b(0xfedc, 0xfedc);
shl16n(0x0000, 0x0000);
shl16n(0xffff, 0xffff);
shl16n(0x1234, 0x1234);
shl16n(0xfedc, 0xfedc);
shr16n(0x0000, 0x0000);
shr16n(0xffff, 0xffff);
shr16n(0x1234, 0x1234);
shr16n(0xfedc, 0xfedc);
shl32b(0x00000000UL, 0x00000000L);
shl32b(0xffffffffUL, 0xffffffffL);
shl32b(0x12345678UL, 0x12345678L);
shl32b(0xfedcba98UL, 0xfedcba98L);
shr32b(0x00000000UL, 0x00000000L);
shr32b(0xffffffffUL, 0xffffffffL);
shr32b(0x12345678UL, 0x12345678L);
shr32b(0xfedcba98UL, 0xfedcba98L);
shl32n(0x00000000UL, 0x00000000L);
shl32n(0xffffffffUL, 0xffffffffL);
shl32n(0x12345678UL, 0x12345678L);
shl32n(0xfedcba98UL, 0xfedcba98L);
shr32n(0x00000000UL, 0x00000000L);
shr32n(0xffffffffUL, 0xffffffffL);
shr32n(0x12345678UL, 0x12345678L);
shr32n(0xfedcba98UL, 0xfedcba98L);
return 0;
}