147 lines · c
1// RUN: %clang_builtins %s %librt -o %t && %run %t2// REQUIRES: librt_has_mulosi43 4#include "int_lib.h"5#include <stdio.h>6 7// Returns: a * b8 9// Effects: aborts if a * b overflows10 11COMPILER_RT_ABI si_int __mulosi4(si_int a, si_int b, int *overflow);12 13int test__mulosi4(si_int a, si_int b, si_int expected, int expected_overflow)14{15 int ov;16 si_int x = __mulosi4(a, b, &ov);17 if (ov != expected_overflow)18 printf("error in __mulosi4: overflow=%d expected=%d\n",19 ov, expected_overflow);20 else if (!expected_overflow && x != expected) {21 printf("error in __mulosi4: 0x%X * 0x%X = 0x%X (overflow=%d), "22 "expected 0x%X (overflow=%d)\n",23 a, b, x, ov, expected, expected_overflow);24 return 1;25 }26 return 0;27}28 29 30int main()31{32 if (test__mulosi4(0, 0, 0, 0))33 return 1;34 if (test__mulosi4(0, 1, 0, 0))35 return 1;36 if (test__mulosi4(1, 0, 0, 0))37 return 1;38 if (test__mulosi4(0, 10, 0, 0))39 return 1;40 if (test__mulosi4(10, 0, 0, 0))41 return 1;42 if (test__mulosi4(0, 0x1234567, 0, 0))43 return 1;44 if (test__mulosi4(0x1234567, 0, 0, 0))45 return 1;46 47 if (test__mulosi4(0, -1, 0, 0))48 return 1;49 if (test__mulosi4(-1, 0, 0, 0))50 return 1;51 if (test__mulosi4(0, -10, 0, 0))52 return 1;53 if (test__mulosi4(-10, 0, 0, 0))54 return 1;55 if (test__mulosi4(0, -0x1234567, 0, 0))56 return 1;57 if (test__mulosi4(-0x1234567, 0, 0, 0))58 return 1;59 60 if (test__mulosi4(1, 1, 1, 0))61 return 1;62 if (test__mulosi4(1, 10, 10, 0))63 return 1;64 if (test__mulosi4(10, 1, 10, 0))65 return 1;66 if (test__mulosi4(1, 0x1234567, 0x1234567, 0))67 return 1;68 if (test__mulosi4(0x1234567, 1, 0x1234567, 0))69 return 1;70 71 if (test__mulosi4(1, -1, -1, 0))72 return 1;73 if (test__mulosi4(1, -10, -10, 0))74 return 1;75 if (test__mulosi4(-10, 1, -10, 0))76 return 1;77 if (test__mulosi4(1, -0x1234567, -0x1234567, 0))78 return 1;79 if (test__mulosi4(-0x1234567, 1, -0x1234567, 0))80 return 1;81 82 if (test__mulosi4(0x7FFFFFFF, -2, 0x80000001, 1))83 return 1;84 if (test__mulosi4(-2, 0x7FFFFFFF, 0x80000001, 1))85 return 1;86 if (test__mulosi4(0x7FFFFFFF, -1, 0x80000001, 0))87 return 1;88 if (test__mulosi4(-1, 0x7FFFFFFF, 0x80000001, 0))89 return 1;90 if (test__mulosi4(0x7FFFFFFF, 0, 0, 0))91 return 1;92 if (test__mulosi4(0, 0x7FFFFFFF, 0, 0))93 return 1;94 if (test__mulosi4(0x7FFFFFFF, 1, 0x7FFFFFFF, 0))95 return 1;96 if (test__mulosi4(1, 0x7FFFFFFF, 0x7FFFFFFF, 0))97 return 1;98 if (test__mulosi4(0x7FFFFFFF, 2, 0x80000001, 1))99 return 1;100 if (test__mulosi4(2, 0x7FFFFFFF, 0x80000001, 1))101 return 1;102 103 if (test__mulosi4(0x80000000, -2, 0x80000000, 1))104 return 1;105 if (test__mulosi4(-2, 0x80000000, 0x80000000, 1))106 return 1;107 if (test__mulosi4(0x80000000, -1, 0x80000000, 1))108 return 1;109 if (test__mulosi4(-1, 0x80000000, 0x80000000, 1))110 return 1;111 if (test__mulosi4(0x80000000, 0, 0, 0))112 return 1;113 if (test__mulosi4(0, 0x80000000, 0, 0))114 return 1;115 if (test__mulosi4(0x80000000, 1, 0x80000000, 0))116 return 1;117 if (test__mulosi4(1, 0x80000000, 0x80000000, 0))118 return 1;119 if (test__mulosi4(0x80000000, 2, 0x80000000, 1))120 return 1;121 if (test__mulosi4(2, 0x80000000, 0x80000000, 1))122 return 1;123 124 if (test__mulosi4(0x80000001, -2, 0x80000001, 1))125 return 1;126 if (test__mulosi4(-2, 0x80000001, 0x80000001, 1))127 return 1;128 if (test__mulosi4(0x80000001, -1, 0x7FFFFFFF, 0))129 return 1;130 if (test__mulosi4(-1, 0x80000001, 0x7FFFFFFF, 0))131 return 1;132 if (test__mulosi4(0x80000001, 0, 0, 0))133 return 1;134 if (test__mulosi4(0, 0x80000001, 0, 0))135 return 1;136 if (test__mulosi4(0x80000001, 1, 0x80000001, 0))137 return 1;138 if (test__mulosi4(1, 0x80000001, 0x80000001, 0))139 return 1;140 if (test__mulosi4(0x80000001, 2, 0x80000000, 1))141 return 1;142 if (test__mulosi4(2, 0x80000001, 0x80000000, 1))143 return 1;144 145 return 0;146}147