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