1*c365e6b0SPhilippe Mathieu-Daudé /* SPDX-License-Identifier: GPL-2.0-or-later */
2*c365e6b0SPhilippe Mathieu-Daudé
3*c365e6b0SPhilippe Mathieu-Daudé #include <limits.h>
4*c365e6b0SPhilippe Mathieu-Daudé #include <stdio.h>
5*c365e6b0SPhilippe Mathieu-Daudé #include <stdlib.h>
6*c365e6b0SPhilippe Mathieu-Daudé
addv(const int a,const int b,const int res,const int carry)7*c365e6b0SPhilippe Mathieu-Daudé static void addv(const int a, const int b, const int res, const int carry)
8*c365e6b0SPhilippe Mathieu-Daudé {
9*c365e6b0SPhilippe Mathieu-Daudé int o = a, c;
10*c365e6b0SPhilippe Mathieu-Daudé
11*c365e6b0SPhilippe Mathieu-Daudé asm volatile("addv %2,%0\n"
12*c365e6b0SPhilippe Mathieu-Daudé "movt %1\n"
13*c365e6b0SPhilippe Mathieu-Daudé : "+r"(o), "=r"(c) : "r"(b) : );
14*c365e6b0SPhilippe Mathieu-Daudé
15*c365e6b0SPhilippe Mathieu-Daudé if (c != carry || o != res) {
16*c365e6b0SPhilippe Mathieu-Daudé printf("ADDV %d, %d = %d/%d [T = %d/%d]\n", a, b, o, res, c, carry);
17*c365e6b0SPhilippe Mathieu-Daudé abort();
18*c365e6b0SPhilippe Mathieu-Daudé }
19*c365e6b0SPhilippe Mathieu-Daudé }
20*c365e6b0SPhilippe Mathieu-Daudé
main(void)21*c365e6b0SPhilippe Mathieu-Daudé int main(void)
22*c365e6b0SPhilippe Mathieu-Daudé {
23*c365e6b0SPhilippe Mathieu-Daudé addv(INT_MAX, 1, INT_MIN, 1);
24*c365e6b0SPhilippe Mathieu-Daudé addv(INT_MAX - 1, 1, INT_MAX, 0);
25*c365e6b0SPhilippe Mathieu-Daudé
26*c365e6b0SPhilippe Mathieu-Daudé return 0;
27*c365e6b0SPhilippe Mathieu-Daudé }
28