xref: /openbmc/qemu/tests/tcg/sh4/test-subv.c (revision 97c872276d147c882296f5da245bd8432f1582f6)
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