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é 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é 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