139 lines · c
1// RUN: %clang_builtins %s %librt -o %t && %run %t2// REQUIRES: librt_has_mulvsi33 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 __mulvsi3(si_int a, si_int b);12 13int test__mulvsi3(si_int a, si_int b, si_int expected)14{15 si_int x = __mulvsi3(a, b);16 if (x != expected)17 printf("error in __mulvsi3: %d * %d = %d, expected %d\n",18 a, b, x, expected);19 return x != expected;20}21 22int main()23{24 if (test__mulvsi3(0, 0, 0))25 return 1;26 if (test__mulvsi3(0, 1, 0))27 return 1;28 if (test__mulvsi3(1, 0, 0))29 return 1;30 if (test__mulvsi3(0, 10, 0))31 return 1;32 if (test__mulvsi3(10, 0, 0))33 return 1;34 if (test__mulvsi3(0, 0x1234567, 0))35 return 1;36 if (test__mulvsi3(0x1234567, 0, 0))37 return 1;38 39 if (test__mulvsi3(0, -1, 0))40 return 1;41 if (test__mulvsi3(-1, 0, 0))42 return 1;43 if (test__mulvsi3(0, -10, 0))44 return 1;45 if (test__mulvsi3(-10, 0, 0))46 return 1;47 if (test__mulvsi3(0, -0x1234567, 0))48 return 1;49 if (test__mulvsi3(-0x1234567, 0, 0))50 return 1;51 52 if (test__mulvsi3(1, 1, 1))53 return 1;54 if (test__mulvsi3(1, 10, 10))55 return 1;56 if (test__mulvsi3(10, 1, 10))57 return 1;58 if (test__mulvsi3(1, 0x1234567, 0x1234567))59 return 1;60 if (test__mulvsi3(0x1234567, 1, 0x1234567))61 return 1;62 63 if (test__mulvsi3(1, -1, -1))64 return 1;65 if (test__mulvsi3(1, -10, -10))66 return 1;67 if (test__mulvsi3(-10, 1, -10))68 return 1;69 if (test__mulvsi3(1, -0x1234567, -0x1234567))70 return 1;71 if (test__mulvsi3(-0x1234567, 1, -0x1234567))72 return 1;73 74// if (test__mulvsi3(0x7FFFFFFF, -2, 0x80000001)) // abort75// return 1;76// if (test__mulvsi3(-2, 0x7FFFFFFF, 0x80000001)) // abort77// return 1;78 if (test__mulvsi3(0x7FFFFFFF, -1, 0x80000001))79 return 1;80 if (test__mulvsi3(-1, 0x7FFFFFFF, 0x80000001))81 return 1;82 if (test__mulvsi3(0x7FFFFFFF, 0, 0))83 return 1;84 if (test__mulvsi3(0, 0x7FFFFFFF, 0))85 return 1;86 if (test__mulvsi3(0x7FFFFFFF, 1, 0x7FFFFFFF))87 return 1;88 if (test__mulvsi3(1, 0x7FFFFFFF, 0x7FFFFFFF))89 return 1;90// if (test__mulvsi3(0x7FFFFFFF, 2, 0x80000001)) // abort91// return 1;92// if (test__mulvsi3(2, 0x7FFFFFFF, 0x80000001)) // abort93// return 1;94 95// if (test__mulvsi3(0x80000000, -2, 0x80000000)) // abort96// return 1;97// if (test__mulvsi3(-2, 0x80000000, 0x80000000)) // abort98// return 1;99// if (test__mulvsi3(0x80000000, -1, 0x80000000)) // abort100// return 1;101// if (test__mulvsi3(-1, 0x80000000, 0x80000000)) // abort102// return 1;103 if (test__mulvsi3(0x80000000, 0, 0))104 return 1;105 if (test__mulvsi3(0, 0x80000000, 0))106 return 1;107 if (test__mulvsi3(0x80000000, 1, 0x80000000))108 return 1;109 if (test__mulvsi3(1, 0x80000000, 0x80000000))110 return 1;111// if (test__mulvsi3(0x80000000, 2, 0x80000000)) // abort112// return 1;113// if (test__mulvsi3(2, 0x80000000, 0x80000000)) // abort114// return 1;115 116// if (test__mulvsi3(0x80000001, -2, 0x80000001)) // abort117// return 1;118// if (test__mulvsi3(-2, 0x80000001, 0x80000001)) // abort119// return 1;120 if (test__mulvsi3(0x80000001, -1, 0x7FFFFFFF))121 return 1;122 if (test__mulvsi3(-1, 0x80000001, 0x7FFFFFFF))123 return 1;124 if (test__mulvsi3(0x80000001, 0, 0))125 return 1;126 if (test__mulvsi3(0, 0x80000001, 0))127 return 1;128 if (test__mulvsi3(0x80000001, 1, 0x80000001))129 return 1;130 if (test__mulvsi3(1, 0x80000001, 0x80000001))131 return 1;132// if (test__mulvsi3(0x80000001, 2, 0x80000000)) // abort133// return 1;134// if (test__mulvsi3(2, 0x80000001, 0x80000000)) // abort135// return 1;136 137 return 0;138}139