Files
c64-demo-cpp/oscar64/autotest/loopunrolltest.cpp
T
2026-07-18 20:34:55 +02:00

391 lines
6.5 KiB
C++

#include <assert.h>
void unroll1(void)
{
int sum0 = 0;
int sum2 = 0;
int sum3 = 0;
int sum10 = 0;
int sumfull = 0;
for(int i=0; i<100; i++)
sum0 += i;
#pragma unroll(2)
for(int i=0; i<100; i++)
sum2 += i;
#pragma unroll(3)
for(int i=0; i<100; i++)
sum3 += i;
#pragma unroll(10)
for(int i=0; i<100; i++)
sum10 += i;
#pragma unroll(full)
for(int i=0; i<100; i++)
sumfull += i;
assert(sum2 == sum0);
assert(sum3 == sum0);
assert(sum10 == sum0);
assert(sumfull == sum0);
}
void unroll2(void)
{
int sum0 = 0;
int sum2 = 0;
int sum3 = 0;
int sum10 = 0;
int sumfull = 0;
for(int i=0; i<100; i+=2)
sum0 += i;
#pragma unroll(2)
for(int i=0; i<100; i+=2)
sum2 += i;
#pragma unroll(3)
for(int i=0; i<100; i+=2)
sum3 += i;
#pragma unroll(10)
for(int i=0; i<100; i+=2)
sum10 += i;
#pragma unroll(full)
for(int i=0; i<100; i+=2)
sumfull += i;
assert(sum2 == sum0);
assert(sum3 == sum0);
assert(sum10 == sum0);
assert(sumfull == sum0);
}
void unroll3(void)
{
int sum0 = 0;
int sum2 = 0;
int sum3 = 0;
int sum10 = 0;
int sumfull = 0;
for(int i=0; i<100; i+=3)
sum0 += i;
#pragma unroll(2)
for(int i=0; i<100; i+=3)
sum2 += i;
#pragma unroll(3)
for(int i=0; i<100; i+=3)
sum3 += i;
#pragma unroll(10)
for(int i=0; i<100; i+=3)
sum10 += i;
#pragma unroll(full)
for(int i=0; i<100; i+=3)
sumfull += i;
assert(sum2 == sum0);
assert(sum3 == sum0);
assert(sum10 == sum0);
assert(sumfull == sum0);
}
void unroll50(void)
{
int sum0 = 0;
int sum2 = 0;
int sum3 = 0;
int sum10 = 0;
int sumfull = 0;
for(int i=0; i<100; i+=50)
sum0 += i;
#pragma unroll(2)
for(int i=0; i<100; i+=50)
sum2 += i;
#pragma unroll(3)
for(int i=0; i<100; i+=50)
sum3 += i;
#pragma unroll(10)
for(int i=0; i<100; i+=50)
sum10 += i;
#pragma unroll(full)
for(int i=0; i<100; i+=50)
sumfull += i;
assert(sum2 == sum0);
assert(sum3 == sum0);
assert(sum10 == sum0);
assert(sumfull == sum0);
}
void unroll50e(void)
{
int sum0 = 0;
int sum2 = 0;
int sum3 = 0;
int sum10 = 0;
int sumfull = 0;
for(int i=0; i<=100; i+=50)
sum0 += i;
#pragma unroll(2)
for(int i=0; i<=100; i+=50)
sum2 += i;
#pragma unroll(3)
for(int i=0; i<=100; i+=50)
sum3 += i;
#pragma unroll(10)
for(int i=0; i<=100; i+=50)
sum10 += i;
#pragma unroll(full)
for(int i=0; i<=100; i+=50)
sumfull += i;
assert(sum2 == sum0);
assert(sum3 == sum0);
assert(sum10 == sum0);
assert(sumfull == sum0);
}
void unroll100(void)
{
int sum0 = 0;
int sum2 = 0;
int sum3 = 0;
int sum10 = 0;
int sumfull = 0;
for(int i=0; i<100; i+=100)
sum0 += i;
#pragma unroll(2)
for(int i=0; i<100; i+=100)
sum2 += i;
#pragma unroll(3)
for(int i=0; i<100; i+=100)
sum3 += i;
#pragma unroll(10)
for(int i=0; i<100; i+=100)
sum10 += i;
#pragma unroll(full)
for(int i=0; i<100; i+=100)
sumfull += i;
assert(sum2 == sum0);
assert(sum3 == sum0);
assert(sum10 == sum0);
assert(sumfull == sum0);
}
void unrolld1(void)
{
int sum0 = 0;
int sum2 = 0;
int sum3 = 0;
int sum10 = 0;
int sumfull = 0;
for(int i=100; i>0; i--)
sum0 += i;
#pragma unroll(2)
for(int i=100; i>0; i--)
sum2 += i;
#pragma unroll(3)
for(int i=100; i>0; i--)
sum3 += i;
#pragma unroll(10)
for(int i=100; i>0; i--)
sum10 += i;
#pragma unroll(full)
for(int i=100; i>0; i--)
sumfull += i;
assert(sum2 == sum0);
assert(sum3 == sum0);
assert(sum10 == sum0);
assert(sumfull == sum0);
}
void unrolld2(void)
{
int sum0 = 0;
int sum2 = 0;
int sum3 = 0;
int sum10 = 0;
int sumfull = 0;
for(int i=100; i>0; i-=2)
sum0 += i;
#pragma unroll(2)
for(int i=100; i>0; i-=2)
sum2 += i;
#pragma unroll(3)
for(int i=100; i>0; i-=2)
sum3 += i;
#pragma unroll(10)
for(int i=100; i>0; i-=2)
sum10 += i;
#pragma unroll(full)
for(int i=100; i>0; i-=2)
sumfull += i;
assert(sum2 == sum0);
assert(sum3 == sum0);
assert(sum10 == sum0);
assert(sumfull == sum0);
}
void unrolld3(void)
{
int sum0 = 0;
int sum2 = 0;
int sum3 = 0;
int sum10 = 0;
int sumfull = 0;
for(int i=100; i>0; i-=3)
sum0 += i;
#pragma unroll(2)
for(int i=100; i>0; i-=3)
sum2 += i;
#pragma unroll(3)
for(int i=100; i>0; i-=3)
sum3 += i;
#pragma unroll(10)
for(int i=100; i>0; i-=3)
sum10 += i;
#pragma unroll(full)
for(int i=100; i>0; i-=3)
sumfull += i;
assert(sum2 == sum0);
assert(sum3 == sum0);
assert(sum10 == sum0);
assert(sumfull == sum0);
}
void unrolld50(void)
{
int sum0 = 0;
int sum2 = 0;
int sum3 = 0;
int sum10 = 0;
int sumfull = 0;
for(int i=100; i>0; i-=50)
sum0 += i;
#pragma unroll(2)
for(int i=100; i>0; i-=50)
sum2 += i;
#pragma unroll(3)
for(int i=100; i>0; i-=50)
sum3 += i;
#pragma unroll(10)
for(int i=100; i>0; i-=50)
sum10 += i;
#pragma unroll(full)
for(int i=100; i>0; i-=50)
sumfull += i;
assert(sum2 == sum0);
assert(sum3 == sum0);
assert(sum10 == sum0);
assert(sumfull == sum0);
}
void unrolld50e(void)
{
int sum0 = 0;
int sum2 = 0;
int sum3 = 0;
int sum10 = 0;
int sumfull = 0;
for(int i=100; i>=0; i-=50)
sum0 += i;
#pragma unroll(2)
for(int i=100; i>=0; i-=50)
sum2 += i;
#pragma unroll(3)
for(int i=100; i>=0; i-=50)
sum3 += i;
#pragma unroll(10)
for(int i=100; i>=0; i-=50)
sum10 += i;
#pragma unroll(full)
for(int i=100; i>=0; i-=50)
sumfull += i;
assert(sum2 == sum0);
assert(sum3 == sum0);
assert(sum10 == sum0);
assert(sumfull == sum0);
}
void unrolld100(void)
{
int sum0 = 0;
int sum2 = 0;
int sum3 = 0;
int sum10 = 0;
int sumfull = 0;
for(int i=100; i>0; i-=100)
sum0 += i;
#pragma unroll(2)
for(int i=100; i>0; i-=100)
sum2 += i;
#pragma unroll(3)
for(int i=100; i>0; i-=100)
sum3 += i;
#pragma unroll(10)
for(int i=100; i>0; i-=100)
sum10 += i;
#pragma unroll(full)
for(int i=100; i>0; i-=100)
sumfull += i;
assert(sum2 == sum0);
assert(sum3 == sum0);
assert(sum10 == sum0);
assert(sumfull == sum0);
}
char glob[20];
void autounroll(void)
{
char sum0 = 0;
char sum1 = 0;
char sum2 = 0;
char sum3 = 0;
char sum4 = 0;
for(int i=0; i<10; i++)
sum0 += glob[i];
// for(int i=10; i<20; i++)
// sum1 += glob[i - 10];
for(int i=10; i>0; i--)
sum2 += glob[i - 1];
for(int i=9; i>=0; i--)
sum3 += glob[i];
// for(int i=0; i<=9; i++)
// sum4 += glob[i];
// assert(sum1 == sum0);
assert(sum2 == sum0);
#if 0
assert(sum3 == sum0);
assert(sum4 == sum0);
#endif
}
int main(void)
{
for(int i=0; i<20; i++)
glob[i] = i;
#if 0
unroll1();
unroll2();
unroll3();
unroll50();
unroll50e();
unroll100();
unrolld1();
unrolld2();
unrolld3();
unrolld50();
unrolld50e();
unrolld100();
#endif
autounroll();
}