44 lines
857 B
C
44 lines
857 B
C
#include "mmio.h"
|
|
|
|
#define GCD_STATUS 0x4000
|
|
#define GCD_X 0x4004
|
|
#define GCD_Y 0x4008
|
|
#define GCD_GCD 0x400C
|
|
|
|
unsigned int gcd_ref(unsigned int x, unsigned int y) {
|
|
while (y != 0) {
|
|
if (x > y)
|
|
x = x - y;
|
|
else
|
|
y = y - x;
|
|
}
|
|
return x;
|
|
}
|
|
|
|
// DOC include start: GCD test
|
|
int main(void)
|
|
{
|
|
uint32_t result, ref, x = 20, y = 15;
|
|
|
|
// wait for peripheral to be ready
|
|
while ((reg_read8(GCD_STATUS) & 0x2) == 0) ;
|
|
|
|
reg_write32(GCD_X, x);
|
|
reg_write32(GCD_Y, y);
|
|
|
|
|
|
// wait for peripheral to complete
|
|
while ((reg_read8(GCD_STATUS) & 0x1) == 0) ;
|
|
|
|
result = reg_read32(GCD_GCD);
|
|
ref = gcd_ref(x, y);
|
|
|
|
if (result != ref) {
|
|
printf("Hardware result %d does not match reference value %d\n", result, ref);
|
|
return 1;
|
|
}
|
|
printf("Hardware result %d is correct for GCD\n", result);
|
|
return 0;
|
|
}
|
|
// DOC include end: GCD test
|