2017-05-02 01:12:38 +08:00
|
|
|
const builtin = @import("builtin");
|
2017-08-19 04:26:09 +08:00
|
|
|
const is_test = builtin.is_test;
|
2017-05-02 01:12:38 +08:00
|
|
|
|
2017-12-18 22:59:57 +08:00
|
|
|
comptime {
|
|
|
|
const linkage = if (is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.Weak;
|
|
|
|
const strong_linkage = if (is_test) builtin.GlobalLinkage.Internal else builtin.GlobalLinkage.Strong;
|
|
|
|
|
2019-05-07 06:49:49 +08:00
|
|
|
switch (builtin.arch) {
|
|
|
|
.i386, .x86_64 => @export("__zig_probe_stack", @import("compiler_rt/stack_probe.zig").zig_probe_stack, linkage),
|
2019-05-09 08:49:07 +08:00
|
|
|
else => {},
|
2019-05-07 06:49:49 +08:00
|
|
|
}
|
|
|
|
|
2019-04-12 02:20:24 +08:00
|
|
|
@export("__lesf2", @import("compiler_rt/comparesf2.zig").__lesf2, linkage);
|
2019-04-18 02:13:03 +08:00
|
|
|
@export("__ledf2", @import("compiler_rt/comparedf2.zig").__ledf2, linkage);
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__letf2", @import("compiler_rt/comparetf2.zig").__letf2, linkage);
|
2019-04-12 02:20:24 +08:00
|
|
|
|
|
|
|
@export("__gesf2", @import("compiler_rt/comparesf2.zig").__gesf2, linkage);
|
2019-04-18 02:13:03 +08:00
|
|
|
@export("__gedf2", @import("compiler_rt/comparedf2.zig").__gedf2, linkage);
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__getf2", @import("compiler_rt/comparetf2.zig").__getf2, linkage);
|
2017-12-18 22:59:57 +08:00
|
|
|
|
|
|
|
if (!is_test) {
|
|
|
|
// only create these aliases when not testing
|
2019-04-12 02:20:24 +08:00
|
|
|
@export("__cmpsf2", @import("compiler_rt/comparesf2.zig").__lesf2, linkage);
|
2019-04-18 02:13:03 +08:00
|
|
|
@export("__cmpdf2", @import("compiler_rt/comparedf2.zig").__ledf2, linkage);
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__cmptf2", @import("compiler_rt/comparetf2.zig").__letf2, linkage);
|
2019-04-12 02:20:24 +08:00
|
|
|
|
|
|
|
@export("__eqsf2", @import("compiler_rt/comparesf2.zig").__eqsf2, linkage);
|
2019-04-18 02:13:03 +08:00
|
|
|
@export("__eqdf2", @import("compiler_rt/comparedf2.zig").__eqdf2, linkage);
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__eqtf2", @import("compiler_rt/comparetf2.zig").__letf2, linkage);
|
2019-04-12 02:20:24 +08:00
|
|
|
|
|
|
|
@export("__ltsf2", @import("compiler_rt/comparesf2.zig").__ltsf2, linkage);
|
2019-04-18 02:13:03 +08:00
|
|
|
@export("__ltdf2", @import("compiler_rt/comparedf2.zig").__ltdf2, linkage);
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__lttf2", @import("compiler_rt/comparetf2.zig").__letf2, linkage);
|
2019-04-12 02:20:24 +08:00
|
|
|
|
|
|
|
@export("__nesf2", @import("compiler_rt/comparesf2.zig").__nesf2, linkage);
|
2019-04-18 02:13:03 +08:00
|
|
|
@export("__nedf2", @import("compiler_rt/comparedf2.zig").__nedf2, linkage);
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__netf2", @import("compiler_rt/comparetf2.zig").__letf2, linkage);
|
2019-04-12 02:20:24 +08:00
|
|
|
|
|
|
|
@export("__gtsf2", @import("compiler_rt/comparesf2.zig").__gtsf2, linkage);
|
2019-04-18 02:13:03 +08:00
|
|
|
@export("__gtdf2", @import("compiler_rt/comparedf2.zig").__gtdf2, linkage);
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__gttf2", @import("compiler_rt/comparetf2.zig").__getf2, linkage);
|
2019-04-12 02:20:24 +08:00
|
|
|
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__gnu_h2f_ieee", @import("compiler_rt/extendXfYf2.zig").__extendhfsf2, linkage);
|
|
|
|
@export("__gnu_f2h_ieee", @import("compiler_rt/truncXfYf2.zig").__truncsfhf2, linkage);
|
2017-12-18 22:59:57 +08:00
|
|
|
}
|
|
|
|
|
2019-04-12 02:20:24 +08:00
|
|
|
@export("__unordsf2", @import("compiler_rt/comparesf2.zig").__unordsf2, linkage);
|
2019-04-18 02:13:03 +08:00
|
|
|
@export("__unorddf2", @import("compiler_rt/comparedf2.zig").__unorddf2, linkage);
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__unordtf2", @import("compiler_rt/comparetf2.zig").__unordtf2, linkage);
|
2017-12-18 22:59:57 +08:00
|
|
|
|
2019-03-23 11:47:38 +08:00
|
|
|
@export("__addsf3", @import("compiler_rt/addXf3.zig").__addsf3, linkage);
|
|
|
|
@export("__adddf3", @import("compiler_rt/addXf3.zig").__adddf3, linkage);
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__addtf3", @import("compiler_rt/addXf3.zig").__addtf3, linkage);
|
2019-03-23 11:47:38 +08:00
|
|
|
@export("__subsf3", @import("compiler_rt/addXf3.zig").__subsf3, linkage);
|
|
|
|
@export("__subdf3", @import("compiler_rt/addXf3.zig").__subdf3, linkage);
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__subtf3", @import("compiler_rt/addXf3.zig").__subtf3, linkage);
|
2019-02-13 18:24:52 +08:00
|
|
|
|
2019-03-20 02:42:29 +08:00
|
|
|
@export("__mulsf3", @import("compiler_rt/mulXf3.zig").__mulsf3, linkage);
|
|
|
|
@export("__muldf3", @import("compiler_rt/mulXf3.zig").__muldf3, linkage);
|
|
|
|
@export("__multf3", @import("compiler_rt/mulXf3.zig").__multf3, linkage);
|
|
|
|
|
2019-04-04 02:12:31 +08:00
|
|
|
@export("__divsf3", @import("compiler_rt/divsf3.zig").__divsf3, linkage);
|
2019-04-05 10:46:53 +08:00
|
|
|
@export("__divdf3", @import("compiler_rt/divdf3.zig").__divdf3, linkage);
|
2019-04-04 02:12:31 +08:00
|
|
|
|
2019-05-10 18:45:01 +08:00
|
|
|
@export("__ashlti3", @import("compiler_rt/ashlti3.zig").__ashlti3, linkage);
|
2019-05-10 18:46:06 +08:00
|
|
|
@export("__lshrti3", @import("compiler_rt/lshrti3.zig").__lshrti3, linkage);
|
2019-05-10 19:25:54 +08:00
|
|
|
@export("__ashrti3", @import("compiler_rt/ashrti3.zig").__ashrti3, linkage);
|
2019-05-10 18:46:06 +08:00
|
|
|
|
2019-05-09 04:26:54 +08:00
|
|
|
@export("__floatsidf", @import("compiler_rt/floatsiXf.zig").__floatsidf, linkage);
|
|
|
|
@export("__floatsisf", @import("compiler_rt/floatsiXf.zig").__floatsisf, linkage);
|
2019-05-09 04:38:16 +08:00
|
|
|
@export("__floatdidf", @import("compiler_rt/floatdidf.zig").__floatdidf, linkage);
|
2019-05-09 06:25:50 +08:00
|
|
|
@export("__floatsitf", @import("compiler_rt/floatsiXf.zig").__floatsitf, linkage);
|
2019-05-09 04:35:14 +08:00
|
|
|
@export("__floatunsidf", @import("compiler_rt/floatunsidf.zig").__floatunsidf, linkage);
|
|
|
|
@export("__floatundidf", @import("compiler_rt/floatundidf.zig").__floatundidf, linkage);
|
|
|
|
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__floattitf", @import("compiler_rt/floattitf.zig").__floattitf, linkage);
|
|
|
|
@export("__floattidf", @import("compiler_rt/floattidf.zig").__floattidf, linkage);
|
|
|
|
@export("__floattisf", @import("compiler_rt/floattisf.zig").__floattisf, linkage);
|
2018-06-30 15:57:17 +08:00
|
|
|
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__floatunditf", @import("compiler_rt/floatunditf.zig").__floatunditf, linkage);
|
|
|
|
@export("__floatunsitf", @import("compiler_rt/floatunsitf.zig").__floatunsitf, linkage);
|
2018-06-28 17:41:35 +08:00
|
|
|
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__floatuntitf", @import("compiler_rt/floatuntitf.zig").__floatuntitf, linkage);
|
|
|
|
@export("__floatuntidf", @import("compiler_rt/floatuntidf.zig").__floatuntidf, linkage);
|
|
|
|
@export("__floatuntisf", @import("compiler_rt/floatuntisf.zig").__floatuntisf, linkage);
|
2018-06-28 17:41:35 +08:00
|
|
|
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__extenddftf2", @import("compiler_rt/extendXfYf2.zig").__extenddftf2, linkage);
|
|
|
|
@export("__extendsftf2", @import("compiler_rt/extendXfYf2.zig").__extendsftf2, linkage);
|
|
|
|
@export("__extendhfsf2", @import("compiler_rt/extendXfYf2.zig").__extendhfsf2, linkage);
|
2018-06-27 22:20:04 +08:00
|
|
|
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__truncsfhf2", @import("compiler_rt/truncXfYf2.zig").__truncsfhf2, linkage);
|
|
|
|
@export("__truncdfhf2", @import("compiler_rt/truncXfYf2.zig").__truncdfhf2, linkage);
|
|
|
|
@export("__trunctfdf2", @import("compiler_rt/truncXfYf2.zig").__trunctfdf2, linkage);
|
|
|
|
@export("__trunctfsf2", @import("compiler_rt/truncXfYf2.zig").__trunctfsf2, linkage);
|
2018-06-20 04:06:10 +08:00
|
|
|
|
2019-05-09 04:31:07 +08:00
|
|
|
@export("__truncdfsf2", @import("compiler_rt/truncXfYf2.zig").__truncdfsf2, linkage);
|
|
|
|
|
2019-05-09 05:54:43 +08:00
|
|
|
@export("__extendsfdf2", @import("compiler_rt/extendXfYf2.zig").__extendsfdf2, linkage);
|
|
|
|
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__fixunssfsi", @import("compiler_rt/fixunssfsi.zig").__fixunssfsi, linkage);
|
|
|
|
@export("__fixunssfdi", @import("compiler_rt/fixunssfdi.zig").__fixunssfdi, linkage);
|
|
|
|
@export("__fixunssfti", @import("compiler_rt/fixunssfti.zig").__fixunssfti, linkage);
|
2017-12-18 22:59:57 +08:00
|
|
|
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__fixunsdfsi", @import("compiler_rt/fixunsdfsi.zig").__fixunsdfsi, linkage);
|
|
|
|
@export("__fixunsdfdi", @import("compiler_rt/fixunsdfdi.zig").__fixunsdfdi, linkage);
|
|
|
|
@export("__fixunsdfti", @import("compiler_rt/fixunsdfti.zig").__fixunsdfti, linkage);
|
2017-12-18 22:59:57 +08:00
|
|
|
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__fixunstfsi", @import("compiler_rt/fixunstfsi.zig").__fixunstfsi, linkage);
|
|
|
|
@export("__fixunstfdi", @import("compiler_rt/fixunstfdi.zig").__fixunstfdi, linkage);
|
|
|
|
@export("__fixunstfti", @import("compiler_rt/fixunstfti.zig").__fixunstfti, linkage);
|
2017-12-18 22:59:57 +08:00
|
|
|
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__fixdfdi", @import("compiler_rt/fixdfdi.zig").__fixdfdi, linkage);
|
|
|
|
@export("__fixdfsi", @import("compiler_rt/fixdfsi.zig").__fixdfsi, linkage);
|
|
|
|
@export("__fixdfti", @import("compiler_rt/fixdfti.zig").__fixdfti, linkage);
|
|
|
|
@export("__fixsfdi", @import("compiler_rt/fixsfdi.zig").__fixsfdi, linkage);
|
|
|
|
@export("__fixsfsi", @import("compiler_rt/fixsfsi.zig").__fixsfsi, linkage);
|
|
|
|
@export("__fixsfti", @import("compiler_rt/fixsfti.zig").__fixsfti, linkage);
|
|
|
|
@export("__fixtfdi", @import("compiler_rt/fixtfdi.zig").__fixtfdi, linkage);
|
|
|
|
@export("__fixtfsi", @import("compiler_rt/fixtfsi.zig").__fixtfsi, linkage);
|
|
|
|
@export("__fixtfti", @import("compiler_rt/fixtfti.zig").__fixtfti, linkage);
|
Add add compiler_rt routines for float to signed integer conversion
And add std.math.f128_* constants.
The routines are:
__fixdfdi, __fixdfsi, __fixdfti,
__fixsfdi, __fixsfsi, __fixsfti,
__fixtfdi, __fixtfsi, __fixtfti.
These all call fixint which is a generic zig function that does the
conversion:
pub fn fixint(comptime fp_t: type, comptime fixint_t: type, a: fp_t) fixint_t
There are also a set tests:
__fixdfdi_test, __fixdfsi_test, __fixdfti_test,
__fixsfdi_test, __fixsfsi_test, __fixsfti_test,
__fixtfdi_test, __fixtfsi_test, __fixtfti_test.
2018-12-06 08:50:33 +08:00
|
|
|
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__udivmoddi4", @import("compiler_rt/udivmoddi4.zig").__udivmoddi4, linkage);
|
2019-03-06 12:09:00 +08:00
|
|
|
@export("__popcountdi2", @import("compiler_rt/popcountdi2.zig").__popcountdi2, linkage);
|
2017-12-18 22:59:57 +08:00
|
|
|
|
2019-05-09 04:30:20 +08:00
|
|
|
@export("__divmoddi4", __divmoddi4, linkage);
|
2019-04-28 22:12:44 +08:00
|
|
|
@export("__divsi3", __divsi3, linkage);
|
2019-05-03 15:41:46 +08:00
|
|
|
@export("__divdi3", __divdi3, linkage);
|
2017-12-19 15:39:43 +08:00
|
|
|
@export("__udivsi3", __udivsi3, linkage);
|
|
|
|
@export("__udivdi3", __udivdi3, linkage);
|
2019-05-03 21:51:11 +08:00
|
|
|
@export("__modsi3", __modsi3, linkage);
|
2019-05-03 15:41:46 +08:00
|
|
|
@export("__moddi3", __moddi3, linkage);
|
2019-05-03 21:51:11 +08:00
|
|
|
@export("__umodsi3", __umodsi3, linkage);
|
2017-12-19 15:39:43 +08:00
|
|
|
@export("__umoddi3", __umoddi3, linkage);
|
2019-04-29 15:01:57 +08:00
|
|
|
@export("__divmodsi4", __divmodsi4, linkage);
|
2017-12-19 15:39:43 +08:00
|
|
|
@export("__udivmodsi4", __udivmodsi4, linkage);
|
2017-12-18 22:59:57 +08:00
|
|
|
|
2019-03-23 11:51:25 +08:00
|
|
|
@export("__negsf2", @import("compiler_rt/negXf2.zig").__negsf2, linkage);
|
|
|
|
@export("__negdf2", @import("compiler_rt/negXf2.zig").__negdf2, linkage);
|
|
|
|
|
2018-11-18 00:19:46 +08:00
|
|
|
if (is_arm_arch and !is_arm_64) {
|
2019-05-09 05:48:58 +08:00
|
|
|
@export("__aeabi_unwind_cpp_pr0", __aeabi_unwind_cpp_pr0, strong_linkage);
|
|
|
|
@export("__aeabi_unwind_cpp_pr1", __aeabi_unwind_cpp_pr1, linkage);
|
|
|
|
@export("__aeabi_unwind_cpp_pr2", __aeabi_unwind_cpp_pr2, linkage);
|
|
|
|
|
2019-05-09 04:30:20 +08:00
|
|
|
@export("__aeabi_ldivmod", __aeabi_ldivmod, linkage);
|
2017-12-19 15:39:43 +08:00
|
|
|
@export("__aeabi_uldivmod", __aeabi_uldivmod, linkage);
|
2019-04-28 22:12:44 +08:00
|
|
|
|
|
|
|
@export("__aeabi_idiv", __divsi3, linkage);
|
2019-05-09 04:30:20 +08:00
|
|
|
@export("__aeabi_idivmod", __aeabi_idivmod, linkage);
|
2017-12-19 15:39:43 +08:00
|
|
|
@export("__aeabi_uidiv", __udivsi3, linkage);
|
2019-04-29 15:01:57 +08:00
|
|
|
@export("__aeabi_uidivmod", __aeabi_uidivmod, linkage);
|
2019-03-23 11:39:45 +08:00
|
|
|
|
|
|
|
@export("__aeabi_memcpy", __aeabi_memcpy, linkage);
|
|
|
|
@export("__aeabi_memcpy4", __aeabi_memcpy, linkage);
|
|
|
|
@export("__aeabi_memcpy8", __aeabi_memcpy, linkage);
|
|
|
|
|
|
|
|
@export("__aeabi_memmove", __aeabi_memmove, linkage);
|
|
|
|
@export("__aeabi_memmove4", __aeabi_memmove, linkage);
|
|
|
|
@export("__aeabi_memmove8", __aeabi_memmove, linkage);
|
|
|
|
|
|
|
|
@export("__aeabi_memset", __aeabi_memset, linkage);
|
|
|
|
@export("__aeabi_memset4", __aeabi_memset, linkage);
|
|
|
|
@export("__aeabi_memset8", __aeabi_memset, linkage);
|
|
|
|
|
|
|
|
@export("__aeabi_memclr", __aeabi_memclr, linkage);
|
|
|
|
@export("__aeabi_memclr4", __aeabi_memclr, linkage);
|
|
|
|
@export("__aeabi_memclr8", __aeabi_memclr, linkage);
|
|
|
|
|
|
|
|
@export("__aeabi_memcmp", __aeabi_memcmp, linkage);
|
|
|
|
@export("__aeabi_memcmp4", __aeabi_memcmp, linkage);
|
|
|
|
@export("__aeabi_memcmp8", __aeabi_memcmp, linkage);
|
2019-03-23 11:47:38 +08:00
|
|
|
|
2019-05-09 05:54:43 +08:00
|
|
|
@export("__aeabi_f2d", @import("compiler_rt/extendXfYf2.zig").__extendsfdf2, linkage);
|
2019-05-09 04:26:54 +08:00
|
|
|
@export("__aeabi_i2d", @import("compiler_rt/floatsiXf.zig").__floatsidf, linkage);
|
2019-05-09 04:38:16 +08:00
|
|
|
@export("__aeabi_l2d", @import("compiler_rt/floatdidf.zig").__floatdidf, linkage);
|
2019-05-09 04:35:14 +08:00
|
|
|
@export("__aeabi_ui2d", @import("compiler_rt/floatunsidf.zig").__floatunsidf, linkage);
|
|
|
|
@export("__aeabi_ul2d", @import("compiler_rt/floatundidf.zig").__floatundidf, linkage);
|
2019-05-09 04:38:16 +08:00
|
|
|
|
2019-03-23 11:51:25 +08:00
|
|
|
@export("__aeabi_fneg", @import("compiler_rt/negXf2.zig").__negsf2, linkage);
|
|
|
|
@export("__aeabi_dneg", @import("compiler_rt/negXf2.zig").__negdf2, linkage);
|
|
|
|
|
2019-03-23 11:55:40 +08:00
|
|
|
@export("__aeabi_fmul", @import("compiler_rt/mulXf3.zig").__mulsf3, linkage);
|
|
|
|
@export("__aeabi_dmul", @import("compiler_rt/mulXf3.zig").__muldf3, linkage);
|
|
|
|
|
|
|
|
@export("__aeabi_d2h", @import("compiler_rt/truncXfYf2.zig").__truncdfhf2, linkage);
|
|
|
|
|
|
|
|
@export("__aeabi_f2ulz", @import("compiler_rt/fixunssfdi.zig").__fixunssfdi, linkage);
|
|
|
|
@export("__aeabi_d2ulz", @import("compiler_rt/fixunsdfdi.zig").__fixunsdfdi, linkage);
|
|
|
|
|
|
|
|
@export("__aeabi_f2lz", @import("compiler_rt/fixsfdi.zig").__fixsfdi, linkage);
|
|
|
|
@export("__aeabi_d2lz", @import("compiler_rt/fixdfdi.zig").__fixdfdi, linkage);
|
|
|
|
|
|
|
|
@export("__aeabi_d2uiz", @import("compiler_rt/fixunsdfsi.zig").__fixunsdfsi, linkage);
|
|
|
|
|
|
|
|
@export("__aeabi_h2f", @import("compiler_rt/extendXfYf2.zig").__extendhfsf2, linkage);
|
|
|
|
@export("__aeabi_f2h", @import("compiler_rt/truncXfYf2.zig").__truncsfhf2, linkage);
|
|
|
|
|
2019-05-09 04:26:54 +08:00
|
|
|
@export("__aeabi_i2f", @import("compiler_rt/floatsiXf.zig").__floatsisf, linkage);
|
2019-05-09 04:31:07 +08:00
|
|
|
@export("__aeabi_d2f", @import("compiler_rt/truncXfYf2.zig").__truncdfsf2, linkage);
|
|
|
|
|
2019-03-23 11:47:38 +08:00
|
|
|
@export("__aeabi_fadd", @import("compiler_rt/addXf3.zig").__addsf3, linkage);
|
|
|
|
@export("__aeabi_dadd", @import("compiler_rt/addXf3.zig").__adddf3, linkage);
|
|
|
|
@export("__aeabi_fsub", @import("compiler_rt/addXf3.zig").__subsf3, linkage);
|
|
|
|
@export("__aeabi_dsub", @import("compiler_rt/addXf3.zig").__subdf3, linkage);
|
2019-03-23 11:55:40 +08:00
|
|
|
|
|
|
|
@export("__aeabi_f2uiz", @import("compiler_rt/fixunssfsi.zig").__fixunssfsi, linkage);
|
|
|
|
|
|
|
|
@export("__aeabi_f2iz", @import("compiler_rt/fixsfsi.zig").__fixsfsi, linkage);
|
|
|
|
@export("__aeabi_d2iz", @import("compiler_rt/fixdfsi.zig").__fixdfsi, linkage);
|
2019-04-04 02:12:31 +08:00
|
|
|
|
|
|
|
@export("__aeabi_fdiv", @import("compiler_rt/divsf3.zig").__divsf3, linkage);
|
2019-04-05 10:46:53 +08:00
|
|
|
@export("__aeabi_ddiv", @import("compiler_rt/divdf3.zig").__divdf3, linkage);
|
2019-04-12 02:20:24 +08:00
|
|
|
|
|
|
|
@export("__aeabi_fcmpeq", @import("compiler_rt/arm/aeabi_fcmp.zig").__aeabi_fcmpeq, linkage);
|
|
|
|
@export("__aeabi_fcmplt", @import("compiler_rt/arm/aeabi_fcmp.zig").__aeabi_fcmplt, linkage);
|
|
|
|
@export("__aeabi_fcmple", @import("compiler_rt/arm/aeabi_fcmp.zig").__aeabi_fcmple, linkage);
|
|
|
|
@export("__aeabi_fcmpge", @import("compiler_rt/arm/aeabi_fcmp.zig").__aeabi_fcmpge, linkage);
|
|
|
|
@export("__aeabi_fcmpgt", @import("compiler_rt/arm/aeabi_fcmp.zig").__aeabi_fcmpgt, linkage);
|
|
|
|
@export("__aeabi_fcmpun", @import("compiler_rt/comparesf2.zig").__unordsf2, linkage);
|
2019-04-18 02:13:03 +08:00
|
|
|
|
|
|
|
@export("__aeabi_dcmpeq", @import("compiler_rt/arm/aeabi_dcmp.zig").__aeabi_dcmpeq, linkage);
|
|
|
|
@export("__aeabi_dcmplt", @import("compiler_rt/arm/aeabi_dcmp.zig").__aeabi_dcmplt, linkage);
|
|
|
|
@export("__aeabi_dcmple", @import("compiler_rt/arm/aeabi_dcmp.zig").__aeabi_dcmple, linkage);
|
|
|
|
@export("__aeabi_dcmpge", @import("compiler_rt/arm/aeabi_dcmp.zig").__aeabi_dcmpge, linkage);
|
|
|
|
@export("__aeabi_dcmpgt", @import("compiler_rt/arm/aeabi_dcmp.zig").__aeabi_dcmpgt, linkage);
|
|
|
|
@export("__aeabi_dcmpun", @import("compiler_rt/comparedf2.zig").__unorddf2, linkage);
|
2017-12-18 22:59:57 +08:00
|
|
|
}
|
|
|
|
if (builtin.os == builtin.Os.windows) {
|
2019-05-07 06:49:49 +08:00
|
|
|
if (!builtin.link_libc) {
|
|
|
|
@export("_chkstk", @import("compiler_rt/stack_probe.zig")._chkstk, strong_linkage);
|
|
|
|
@export("__chkstk", @import("compiler_rt/stack_probe.zig").__chkstk, strong_linkage);
|
|
|
|
@export("___chkstk", @import("compiler_rt/stack_probe.zig").___chkstk, strong_linkage);
|
|
|
|
@export("__chkstk_ms", @import("compiler_rt/stack_probe.zig").__chkstk_ms, strong_linkage);
|
|
|
|
@export("___chkstk_ms", @import("compiler_rt/stack_probe.zig").___chkstk_ms, strong_linkage);
|
|
|
|
}
|
|
|
|
|
2017-12-18 22:59:57 +08:00
|
|
|
switch (builtin.arch) {
|
|
|
|
builtin.Arch.i386 => {
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("_aulldiv", @import("compiler_rt/aulldiv.zig")._aulldiv, strong_linkage);
|
|
|
|
@export("_aullrem", @import("compiler_rt/aullrem.zig")._aullrem, strong_linkage);
|
2017-12-18 22:59:57 +08:00
|
|
|
},
|
|
|
|
builtin.Arch.x86_64 => {
|
2019-04-11 06:47:14 +08:00
|
|
|
// The "ti" functions must use @Vector(2, u64) parameter types to adhere to the ABI
|
|
|
|
// that LLVM expects compiler-rt to have.
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__divti3", @import("compiler_rt/divti3.zig").__divti3_windows_x86_64, linkage);
|
2019-04-05 03:44:19 +08:00
|
|
|
@export("__modti3", @import("compiler_rt/modti3.zig").__modti3_windows_x86_64, linkage);
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__multi3", @import("compiler_rt/multi3.zig").__multi3_windows_x86_64, linkage);
|
|
|
|
@export("__udivti3", @import("compiler_rt/udivti3.zig").__udivti3_windows_x86_64, linkage);
|
|
|
|
@export("__udivmodti4", @import("compiler_rt/udivmodti4.zig").__udivmodti4_windows_x86_64, linkage);
|
|
|
|
@export("__umodti3", @import("compiler_rt/umodti3.zig").__umodti3_windows_x86_64, linkage);
|
2017-12-18 22:59:57 +08:00
|
|
|
},
|
|
|
|
else => {},
|
|
|
|
}
|
2018-04-29 10:03:07 +08:00
|
|
|
} else {
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__divti3", @import("compiler_rt/divti3.zig").__divti3, linkage);
|
2019-04-05 03:44:19 +08:00
|
|
|
@export("__modti3", @import("compiler_rt/modti3.zig").__modti3, linkage);
|
2019-03-03 05:46:04 +08:00
|
|
|
@export("__multi3", @import("compiler_rt/multi3.zig").__multi3, linkage);
|
|
|
|
@export("__udivti3", @import("compiler_rt/udivti3.zig").__udivti3, linkage);
|
|
|
|
@export("__udivmodti4", @import("compiler_rt/udivmodti4.zig").__udivmodti4, linkage);
|
|
|
|
@export("__umodti3", @import("compiler_rt/umodti3.zig").__umodti3, linkage);
|
2017-12-18 22:59:57 +08:00
|
|
|
}
|
2019-04-11 10:33:33 +08:00
|
|
|
@export("__muloti4", @import("compiler_rt/muloti4.zig").__muloti4, linkage);
|
2019-04-30 01:11:37 +08:00
|
|
|
@export("__mulodi4", @import("compiler_rt/mulodi4.zig").__mulodi4, linkage);
|
2017-12-18 22:59:57 +08:00
|
|
|
}
|
|
|
|
|
2018-05-03 09:34:34 +08:00
|
|
|
const std = @import("std");
|
|
|
|
const assert = std.debug.assert;
|
2019-02-09 07:18:47 +08:00
|
|
|
const testing = std.testing;
|
2017-10-02 12:10:42 +08:00
|
|
|
|
2019-03-03 05:46:04 +08:00
|
|
|
const __udivmoddi4 = @import("compiler_rt/udivmoddi4.zig").__udivmoddi4;
|
2017-01-05 17:20:07 +08:00
|
|
|
|
2018-01-25 14:46:12 +08:00
|
|
|
// Avoid dragging in the runtime safety mechanisms into this .o file,
|
2017-10-01 06:58:41 +08:00
|
|
|
// unless we're trying to test this file.
|
2018-05-31 22:56:59 +08:00
|
|
|
pub fn panic(msg: []const u8, error_return_trace: ?*builtin.StackTrace) noreturn {
|
2018-01-23 11:24:07 +08:00
|
|
|
@setCold(true);
|
2017-10-01 06:58:41 +08:00
|
|
|
if (is_test) {
|
2018-05-03 09:34:34 +08:00
|
|
|
std.debug.panic("{}", msg);
|
2017-10-01 06:58:41 +08:00
|
|
|
} else {
|
|
|
|
unreachable;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-05-09 05:48:58 +08:00
|
|
|
extern fn __aeabi_unwind_cpp_pr0() void {
|
|
|
|
unreachable;
|
|
|
|
}
|
|
|
|
extern fn __aeabi_unwind_cpp_pr1() void {
|
|
|
|
unreachable;
|
|
|
|
}
|
|
|
|
extern fn __aeabi_unwind_cpp_pr2() void {
|
|
|
|
unreachable;
|
|
|
|
}
|
|
|
|
|
2019-05-09 04:30:20 +08:00
|
|
|
extern fn __divmoddi4(a: i64, b: i64, rem: *i64) i64 {
|
|
|
|
@setRuntimeSafety(is_test);
|
|
|
|
|
|
|
|
const d = __divdi3(a, b);
|
|
|
|
rem.* = a -% (d *% b);
|
|
|
|
return d;
|
|
|
|
}
|
|
|
|
|
2019-05-03 15:41:46 +08:00
|
|
|
extern fn __divdi3(a: i64, b: i64) i64 {
|
|
|
|
@setRuntimeSafety(is_test);
|
|
|
|
|
|
|
|
// Set aside the sign of the quotient.
|
|
|
|
const sign = @bitCast(u64, (a ^ b) >> 63);
|
|
|
|
// Take absolute value of a and b via abs(x) = (x^(x >> 63)) - (x >> 63).
|
|
|
|
const abs_a = (a ^ (a >> 63)) -% (a >> 63);
|
|
|
|
const abs_b = (b ^ (b >> 63)) -% (b >> 63);
|
|
|
|
// Unsigned division
|
|
|
|
const res = __udivmoddi4(@bitCast(u64, abs_a), @bitCast(u64, abs_b), null);
|
|
|
|
// Apply sign of quotient to result and return.
|
|
|
|
return @bitCast(i64, (res ^ sign) -% sign);
|
|
|
|
}
|
|
|
|
|
|
|
|
extern fn __moddi3(a: i64, b: i64) i64 {
|
|
|
|
@setRuntimeSafety(is_test);
|
|
|
|
|
|
|
|
// Take absolute value of a and b via abs(x) = (x^(x >> 63)) - (x >> 63).
|
|
|
|
const abs_a = (a ^ (a >> 63)) -% (a >> 63);
|
|
|
|
const abs_b = (b ^ (b >> 63)) -% (b >> 63);
|
|
|
|
// Unsigned division
|
|
|
|
var r: u64 = undefined;
|
|
|
|
_ = __udivmoddi4(@bitCast(u64, abs_a), @bitCast(u64, abs_b), &r);
|
|
|
|
// Apply the sign of the dividend and return.
|
|
|
|
return (@bitCast(i64, r) ^ (a >> 63)) -% (a >> 63);
|
|
|
|
}
|
|
|
|
|
2018-01-25 17:10:11 +08:00
|
|
|
extern fn __udivdi3(a: u64, b: u64) u64 {
|
2018-01-25 14:46:12 +08:00
|
|
|
@setRuntimeSafety(is_test);
|
2017-01-05 17:20:07 +08:00
|
|
|
return __udivmoddi4(a, b, null);
|
|
|
|
}
|
|
|
|
|
2018-01-25 17:10:11 +08:00
|
|
|
extern fn __umoddi3(a: u64, b: u64) u64 {
|
2018-01-25 14:46:12 +08:00
|
|
|
@setRuntimeSafety(is_test);
|
2017-01-05 17:20:07 +08:00
|
|
|
|
2017-08-19 05:20:03 +08:00
|
|
|
var r: u64 = undefined;
|
2017-02-25 04:00:47 +08:00
|
|
|
_ = __udivmoddi4(a, b, &r);
|
2017-01-05 17:20:07 +08:00
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
2019-05-13 00:56:01 +08:00
|
|
|
extern fn __aeabi_uidivmod(n: u32, d: u32) extern struct {
|
|
|
|
q: u32,
|
|
|
|
r: u32,
|
|
|
|
} {
|
2018-01-25 14:46:12 +08:00
|
|
|
@setRuntimeSafety(is_test);
|
2019-05-09 04:30:20 +08:00
|
|
|
|
|
|
|
var result: @typeOf(__aeabi_uidivmod).ReturnType = undefined;
|
|
|
|
result.q = __udivmodsi4(n, d, &result.r);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2019-05-13 00:56:01 +08:00
|
|
|
extern fn __aeabi_uldivmod(n: u64, d: u64) extern struct {
|
|
|
|
q: u64,
|
|
|
|
r: u64,
|
|
|
|
} {
|
2019-05-09 04:30:20 +08:00
|
|
|
@setRuntimeSafety(is_test);
|
|
|
|
|
|
|
|
var result: @typeOf(__aeabi_uldivmod).ReturnType = undefined;
|
|
|
|
result.q = __udivmoddi4(n, d, &result.r);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2019-05-13 00:56:01 +08:00
|
|
|
extern fn __aeabi_idivmod(n: i32, d: i32) extern struct {
|
|
|
|
q: i32,
|
|
|
|
r: i32,
|
|
|
|
} {
|
2019-05-09 04:30:20 +08:00
|
|
|
@setRuntimeSafety(is_test);
|
|
|
|
|
|
|
|
var result: @typeOf(__aeabi_idivmod).ReturnType = undefined;
|
|
|
|
result.q = __divmodsi4(n, d, &result.r);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2019-05-13 00:56:01 +08:00
|
|
|
extern fn __aeabi_ldivmod(n: i64, d: i64) extern struct {
|
|
|
|
q: i64,
|
|
|
|
r: i64,
|
|
|
|
} {
|
2018-01-25 14:46:12 +08:00
|
|
|
@setRuntimeSafety(is_test);
|
2019-05-09 04:30:20 +08:00
|
|
|
|
|
|
|
var result: @typeOf(__aeabi_ldivmod).ReturnType = undefined;
|
|
|
|
result.q = __divmoddi4(n, d, &result.r);
|
2017-12-18 22:59:57 +08:00
|
|
|
return result;
|
2017-08-31 13:39:20 +08:00
|
|
|
}
|
|
|
|
|
2018-11-18 00:19:46 +08:00
|
|
|
const is_arm_64 = switch (builtin.arch) {
|
2019-03-03 13:41:54 +08:00
|
|
|
builtin.Arch.aarch64,
|
|
|
|
builtin.Arch.aarch64_be,
|
2018-11-18 00:19:46 +08:00
|
|
|
=> true,
|
|
|
|
else => false,
|
|
|
|
};
|
|
|
|
|
|
|
|
const is_arm_arch = switch (builtin.arch) {
|
2019-02-27 04:51:32 +08:00
|
|
|
builtin.Arch.arm,
|
|
|
|
builtin.Arch.armeb,
|
|
|
|
builtin.Arch.aarch64,
|
|
|
|
builtin.Arch.aarch64_be,
|
2018-11-18 00:19:46 +08:00
|
|
|
builtin.Arch.thumb,
|
|
|
|
builtin.Arch.thumbeb,
|
|
|
|
=> true,
|
|
|
|
else => false,
|
|
|
|
};
|
2017-02-09 15:50:03 +08:00
|
|
|
|
2019-03-23 11:39:45 +08:00
|
|
|
const is_arm_32 = is_arm_arch and !is_arm_64;
|
|
|
|
|
2019-04-08 11:17:21 +08:00
|
|
|
const use_thumb_1 = usesThumb1(builtin.arch);
|
|
|
|
|
|
|
|
fn usesThumb1(arch: builtin.Arch) bool {
|
|
|
|
return switch (arch) {
|
|
|
|
.arm => switch (arch.arm) {
|
|
|
|
.v6m => true,
|
|
|
|
else => false,
|
|
|
|
},
|
|
|
|
.armeb => switch (arch.armeb) {
|
|
|
|
.v6m => true,
|
|
|
|
else => false,
|
|
|
|
},
|
|
|
|
.thumb => switch (arch.thumb) {
|
|
|
|
.v5,
|
|
|
|
.v5te,
|
|
|
|
.v4t,
|
|
|
|
.v6,
|
|
|
|
.v6m,
|
|
|
|
.v6k,
|
|
|
|
=> true,
|
|
|
|
else => false,
|
|
|
|
},
|
|
|
|
.thumbeb => switch (arch.thumbeb) {
|
|
|
|
.v5,
|
|
|
|
.v5te,
|
|
|
|
.v4t,
|
|
|
|
.v6,
|
|
|
|
.v6m,
|
|
|
|
.v6k,
|
|
|
|
=> true,
|
|
|
|
else => false,
|
|
|
|
},
|
|
|
|
else => false,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
test "usesThumb1" {
|
|
|
|
testing.expect(usesThumb1(builtin.Arch{ .arm = .v6m }));
|
|
|
|
testing.expect(!usesThumb1(builtin.Arch{ .arm = .v5 }));
|
|
|
|
//etc.
|
|
|
|
|
|
|
|
testing.expect(usesThumb1(builtin.Arch{ .armeb = .v6m }));
|
|
|
|
testing.expect(!usesThumb1(builtin.Arch{ .armeb = .v5 }));
|
|
|
|
//etc.
|
|
|
|
|
|
|
|
testing.expect(usesThumb1(builtin.Arch{ .thumb = .v5 }));
|
|
|
|
testing.expect(usesThumb1(builtin.Arch{ .thumb = .v5te }));
|
|
|
|
testing.expect(usesThumb1(builtin.Arch{ .thumb = .v4t }));
|
|
|
|
testing.expect(usesThumb1(builtin.Arch{ .thumb = .v6 }));
|
|
|
|
testing.expect(usesThumb1(builtin.Arch{ .thumb = .v6k }));
|
|
|
|
testing.expect(usesThumb1(builtin.Arch{ .thumb = .v6m }));
|
|
|
|
testing.expect(!usesThumb1(builtin.Arch{ .thumb = .v6t2 }));
|
|
|
|
//etc.
|
|
|
|
|
|
|
|
testing.expect(usesThumb1(builtin.Arch{ .thumbeb = .v5 }));
|
|
|
|
testing.expect(usesThumb1(builtin.Arch{ .thumbeb = .v5te }));
|
|
|
|
testing.expect(usesThumb1(builtin.Arch{ .thumbeb = .v4t }));
|
|
|
|
testing.expect(usesThumb1(builtin.Arch{ .thumbeb = .v6 }));
|
|
|
|
testing.expect(usesThumb1(builtin.Arch{ .thumbeb = .v6k }));
|
|
|
|
testing.expect(usesThumb1(builtin.Arch{ .thumbeb = .v6m }));
|
|
|
|
testing.expect(!usesThumb1(builtin.Arch{ .thumbeb = .v6t2 }));
|
|
|
|
//etc.
|
|
|
|
|
|
|
|
testing.expect(!usesThumb1(builtin.Arch{ .aarch64 = .v8 }));
|
|
|
|
testing.expect(!usesThumb1(builtin.Arch{ .aarch64_be = .v8 }));
|
|
|
|
testing.expect(!usesThumb1(builtin.Arch.x86_64));
|
|
|
|
testing.expect(!usesThumb1(builtin.Arch.riscv32));
|
|
|
|
//etc.
|
|
|
|
}
|
2019-03-23 11:39:45 +08:00
|
|
|
|
|
|
|
nakedcc fn __aeabi_memcpy() noreturn {
|
|
|
|
@setRuntimeSafety(false);
|
|
|
|
if (use_thumb_1) {
|
|
|
|
asm volatile (
|
|
|
|
\\ push {r7, lr}
|
|
|
|
\\ bl memcpy
|
|
|
|
\\ pop {r7, pc}
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
asm volatile (
|
|
|
|
\\ b memcpy
|
|
|
|
);
|
|
|
|
}
|
|
|
|
unreachable;
|
|
|
|
}
|
|
|
|
|
|
|
|
nakedcc fn __aeabi_memmove() noreturn {
|
|
|
|
@setRuntimeSafety(false);
|
|
|
|
if (use_thumb_1) {
|
|
|
|
asm volatile (
|
|
|
|
\\ push {r7, lr}
|
|
|
|
\\ bl memmove
|
|
|
|
\\ pop {r7, pc}
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
asm volatile (
|
|
|
|
\\ b memmove
|
|
|
|
);
|
|
|
|
}
|
|
|
|
unreachable;
|
|
|
|
}
|
|
|
|
|
|
|
|
nakedcc fn __aeabi_memset() noreturn {
|
|
|
|
@setRuntimeSafety(false);
|
|
|
|
if (use_thumb_1) {
|
|
|
|
asm volatile (
|
|
|
|
\\ mov r3, r1
|
|
|
|
\\ mov r1, r2
|
|
|
|
\\ mov r2, r3
|
|
|
|
\\ push {r7, lr}
|
|
|
|
\\ b memset
|
|
|
|
\\ pop {r7, pc}
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
asm volatile (
|
|
|
|
\\ mov r3, r1
|
|
|
|
\\ mov r1, r2
|
|
|
|
\\ mov r2, r3
|
|
|
|
\\ b memset
|
|
|
|
);
|
|
|
|
}
|
|
|
|
unreachable;
|
|
|
|
}
|
|
|
|
|
|
|
|
nakedcc fn __aeabi_memclr() noreturn {
|
|
|
|
@setRuntimeSafety(false);
|
|
|
|
if (use_thumb_1) {
|
|
|
|
asm volatile (
|
|
|
|
\\ mov r2, r1
|
|
|
|
\\ movs r1, #0
|
|
|
|
\\ push {r7, lr}
|
|
|
|
\\ bl memset
|
|
|
|
\\ pop {r7, pc}
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
asm volatile (
|
|
|
|
\\ mov r2, r1
|
|
|
|
\\ movs r1, #0
|
|
|
|
\\ b memset
|
|
|
|
);
|
|
|
|
}
|
|
|
|
unreachable;
|
|
|
|
}
|
|
|
|
|
|
|
|
nakedcc fn __aeabi_memcmp() noreturn {
|
|
|
|
@setRuntimeSafety(false);
|
|
|
|
if (use_thumb_1) {
|
|
|
|
asm volatile (
|
|
|
|
\\ push {r7, lr}
|
|
|
|
\\ bl memcmp
|
|
|
|
\\ pop {r7, pc}
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
asm volatile (
|
|
|
|
\\ b memcmp
|
|
|
|
);
|
|
|
|
}
|
|
|
|
unreachable;
|
|
|
|
}
|
|
|
|
|
2019-04-29 15:01:57 +08:00
|
|
|
extern fn __divmodsi4(a: i32, b: i32, rem: *i32) i32 {
|
|
|
|
@setRuntimeSafety(is_test);
|
|
|
|
|
|
|
|
const d = __divsi3(a, b);
|
|
|
|
rem.* = a -% (d * b);
|
|
|
|
return d;
|
|
|
|
}
|
|
|
|
|
2018-05-31 22:56:59 +08:00
|
|
|
extern fn __udivmodsi4(a: u32, b: u32, rem: *u32) u32 {
|
2018-01-25 14:46:12 +08:00
|
|
|
@setRuntimeSafety(is_test);
|
2017-02-09 15:50:03 +08:00
|
|
|
|
|
|
|
const d = __udivsi3(a, b);
|
2018-06-17 14:57:07 +08:00
|
|
|
rem.* = @bitCast(u32, @bitCast(i32, a) -% (@bitCast(i32, d) * @bitCast(i32, b)));
|
2017-02-09 15:50:03 +08:00
|
|
|
return d;
|
|
|
|
}
|
|
|
|
|
2019-04-28 22:12:44 +08:00
|
|
|
extern fn __divsi3(n: i32, d: i32) i32 {
|
|
|
|
@setRuntimeSafety(is_test);
|
|
|
|
|
|
|
|
// Set aside the sign of the quotient.
|
|
|
|
const sign = @bitCast(u32, (n ^ d) >> 31);
|
|
|
|
// Take absolute value of a and b via abs(x) = (x^(x >> 31)) - (x >> 31).
|
|
|
|
const abs_n = (n ^ (n >> 31)) -% (n >> 31);
|
|
|
|
const abs_d = (d ^ (d >> 31)) -% (d >> 31);
|
|
|
|
// abs(a) / abs(b)
|
|
|
|
const res = @bitCast(u32, abs_n) / @bitCast(u32, abs_d);
|
|
|
|
// Apply sign of quotient to result and return.
|
|
|
|
return @bitCast(i32, (res ^ sign) -% sign);
|
|
|
|
}
|
|
|
|
|
2018-01-25 17:10:11 +08:00
|
|
|
extern fn __udivsi3(n: u32, d: u32) u32 {
|
2018-01-25 14:46:12 +08:00
|
|
|
@setRuntimeSafety(is_test);
|
2017-02-09 15:50:03 +08:00
|
|
|
|
2017-08-19 05:20:03 +08:00
|
|
|
const n_uword_bits: c_uint = u32.bit_count;
|
2017-02-09 15:50:03 +08:00
|
|
|
// special cases
|
2018-05-01 13:53:04 +08:00
|
|
|
if (d == 0) return 0; // ?!
|
|
|
|
if (n == 0) return 0;
|
2017-08-19 04:26:09 +08:00
|
|
|
var sr = @bitCast(c_uint, c_int(@clz(d)) - c_int(@clz(n)));
|
2017-02-09 15:50:03 +08:00
|
|
|
// 0 <= sr <= n_uword_bits - 1 or sr large
|
2018-05-01 13:53:04 +08:00
|
|
|
if (sr > n_uword_bits - 1) {
|
|
|
|
// d > r
|
2017-02-09 15:50:03 +08:00
|
|
|
return 0;
|
2018-05-01 13:53:04 +08:00
|
|
|
}
|
|
|
|
if (sr == n_uword_bits - 1) {
|
|
|
|
// d == 1
|
2017-02-09 15:50:03 +08:00
|
|
|
return n;
|
2018-05-01 13:53:04 +08:00
|
|
|
}
|
2017-02-09 15:50:03 +08:00
|
|
|
sr += 1;
|
|
|
|
// 1 <= sr <= n_uword_bits - 1
|
|
|
|
// Not a special case
|
2018-06-17 14:57:07 +08:00
|
|
|
var q: u32 = n << @intCast(u5, n_uword_bits - sr);
|
|
|
|
var r: u32 = n >> @intCast(u5, sr);
|
2017-08-19 05:20:03 +08:00
|
|
|
var carry: u32 = 0;
|
2017-05-04 06:12:07 +08:00
|
|
|
while (sr > 0) : (sr -= 1) {
|
2017-02-09 15:50:03 +08:00
|
|
|
// r:q = ((r:q) << 1) | carry
|
2018-06-17 14:57:07 +08:00
|
|
|
r = (r << 1) | (q >> @intCast(u5, n_uword_bits - 1));
|
2017-02-09 15:50:03 +08:00
|
|
|
q = (q << 1) | carry;
|
|
|
|
// carry = 0;
|
|
|
|
// if (r.all >= d.all)
|
|
|
|
// {
|
|
|
|
// r.all -= d.all;
|
|
|
|
// carry = 1;
|
|
|
|
// }
|
2018-06-17 14:57:07 +08:00
|
|
|
const s = @intCast(i32, d -% r -% 1) >> @intCast(u5, n_uword_bits - 1);
|
|
|
|
carry = @intCast(u32, s & 1);
|
2017-08-19 05:20:03 +08:00
|
|
|
r -= d & @bitCast(u32, s);
|
2017-02-09 15:50:03 +08:00
|
|
|
}
|
|
|
|
q = (q << 1) | carry;
|
|
|
|
return q;
|
|
|
|
}
|
|
|
|
|
2019-05-03 21:51:11 +08:00
|
|
|
extern fn __modsi3(n: i32, d: i32) i32 {
|
|
|
|
@setRuntimeSafety(is_test);
|
|
|
|
|
|
|
|
return n -% __divsi3(n, d) *% d;
|
|
|
|
}
|
|
|
|
|
|
|
|
extern fn __umodsi3(n: u32, d: u32) u32 {
|
|
|
|
@setRuntimeSafety(is_test);
|
|
|
|
|
|
|
|
return n -% __udivsi3(n, d) *% d;
|
|
|
|
}
|
|
|
|
|
2017-03-17 04:02:35 +08:00
|
|
|
test "test_umoddi3" {
|
2017-01-05 17:20:07 +08:00
|
|
|
test_one_umoddi3(0, 1, 0);
|
|
|
|
test_one_umoddi3(2, 1, 0);
|
|
|
|
test_one_umoddi3(0x8000000000000000, 1, 0x0);
|
|
|
|
test_one_umoddi3(0x8000000000000000, 2, 0x0);
|
|
|
|
test_one_umoddi3(0xFFFFFFFFFFFFFFFF, 2, 0x1);
|
|
|
|
}
|
|
|
|
|
2018-01-25 17:10:11 +08:00
|
|
|
fn test_one_umoddi3(a: u64, b: u64, expected_r: u64) void {
|
2017-01-05 17:20:07 +08:00
|
|
|
const r = __umoddi3(a, b);
|
2019-02-09 07:18:47 +08:00
|
|
|
testing.expect(r == expected_r);
|
2017-01-05 17:20:07 +08:00
|
|
|
}
|
|
|
|
|
2017-03-17 04:02:35 +08:00
|
|
|
test "test_udivsi3" {
|
2018-11-13 21:08:37 +08:00
|
|
|
const cases = [][3]u32{
|
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000000,
|
|
|
|
0x00000001,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000000,
|
|
|
|
0x00000002,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000000,
|
|
|
|
0x00000003,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000000,
|
|
|
|
0x00000010,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000000,
|
|
|
|
0x078644FA,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000000,
|
|
|
|
0x0747AE14,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000000,
|
|
|
|
0x7FFFFFFF,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000000,
|
|
|
|
0x80000000,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000000,
|
|
|
|
0xFFFFFFFD,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000000,
|
|
|
|
0xFFFFFFFE,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000000,
|
|
|
|
0xFFFFFFFF,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000001,
|
|
|
|
0x00000001,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000001,
|
|
|
|
0x00000002,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000001,
|
|
|
|
0x00000003,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000001,
|
|
|
|
0x00000010,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000001,
|
|
|
|
0x078644FA,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000001,
|
|
|
|
0x0747AE14,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000001,
|
|
|
|
0x7FFFFFFF,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000001,
|
|
|
|
0x80000000,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000001,
|
|
|
|
0xFFFFFFFD,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000001,
|
|
|
|
0xFFFFFFFE,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000001,
|
|
|
|
0xFFFFFFFF,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000002,
|
|
|
|
0x00000001,
|
|
|
|
0x00000002,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000002,
|
|
|
|
0x00000002,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000002,
|
|
|
|
0x00000003,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000002,
|
|
|
|
0x00000010,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000002,
|
|
|
|
0x078644FA,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000002,
|
|
|
|
0x0747AE14,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000002,
|
|
|
|
0x7FFFFFFF,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000002,
|
|
|
|
0x80000000,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000002,
|
|
|
|
0xFFFFFFFD,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000002,
|
|
|
|
0xFFFFFFFE,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000002,
|
|
|
|
0xFFFFFFFF,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000003,
|
|
|
|
0x00000001,
|
|
|
|
0x00000003,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000003,
|
|
|
|
0x00000002,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000003,
|
|
|
|
0x00000003,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000003,
|
|
|
|
0x00000010,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000003,
|
|
|
|
0x078644FA,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000003,
|
|
|
|
0x0747AE14,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000003,
|
|
|
|
0x7FFFFFFF,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000003,
|
|
|
|
0x80000000,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000003,
|
|
|
|
0xFFFFFFFD,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000003,
|
|
|
|
0xFFFFFFFE,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000003,
|
|
|
|
0xFFFFFFFF,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000010,
|
|
|
|
0x00000001,
|
|
|
|
0x00000010,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000010,
|
|
|
|
0x00000002,
|
|
|
|
0x00000008,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000010,
|
|
|
|
0x00000003,
|
|
|
|
0x00000005,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000010,
|
|
|
|
0x00000010,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000010,
|
|
|
|
0x078644FA,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000010,
|
|
|
|
0x0747AE14,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000010,
|
|
|
|
0x7FFFFFFF,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000010,
|
|
|
|
0x80000000,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000010,
|
|
|
|
0xFFFFFFFD,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000010,
|
|
|
|
0xFFFFFFFE,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x00000010,
|
|
|
|
0xFFFFFFFF,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x078644FA,
|
|
|
|
0x00000001,
|
|
|
|
0x078644FA,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x078644FA,
|
|
|
|
0x00000002,
|
|
|
|
0x03C3227D,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x078644FA,
|
|
|
|
0x00000003,
|
|
|
|
0x028216FE,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x078644FA,
|
|
|
|
0x00000010,
|
|
|
|
0x0078644F,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x078644FA,
|
|
|
|
0x078644FA,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x078644FA,
|
|
|
|
0x0747AE14,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x078644FA,
|
|
|
|
0x7FFFFFFF,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x078644FA,
|
|
|
|
0x80000000,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x078644FA,
|
|
|
|
0xFFFFFFFD,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x078644FA,
|
|
|
|
0xFFFFFFFE,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x078644FA,
|
|
|
|
0xFFFFFFFF,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x0747AE14,
|
|
|
|
0x00000001,
|
|
|
|
0x0747AE14,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x0747AE14,
|
|
|
|
0x00000002,
|
|
|
|
0x03A3D70A,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x0747AE14,
|
|
|
|
0x00000003,
|
|
|
|
0x026D3A06,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x0747AE14,
|
|
|
|
0x00000010,
|
|
|
|
0x00747AE1,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x0747AE14,
|
|
|
|
0x078644FA,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x0747AE14,
|
|
|
|
0x0747AE14,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x0747AE14,
|
|
|
|
0x7FFFFFFF,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x0747AE14,
|
|
|
|
0x80000000,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x0747AE14,
|
|
|
|
0xFFFFFFFD,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x0747AE14,
|
|
|
|
0xFFFFFFFE,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x0747AE14,
|
|
|
|
0xFFFFFFFF,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x7FFFFFFF,
|
|
|
|
0x00000001,
|
|
|
|
0x7FFFFFFF,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x7FFFFFFF,
|
|
|
|
0x00000002,
|
|
|
|
0x3FFFFFFF,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x7FFFFFFF,
|
|
|
|
0x00000003,
|
|
|
|
0x2AAAAAAA,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x7FFFFFFF,
|
|
|
|
0x00000010,
|
|
|
|
0x07FFFFFF,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x7FFFFFFF,
|
|
|
|
0x078644FA,
|
|
|
|
0x00000011,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x7FFFFFFF,
|
|
|
|
0x0747AE14,
|
|
|
|
0x00000011,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x7FFFFFFF,
|
|
|
|
0x7FFFFFFF,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x7FFFFFFF,
|
|
|
|
0x80000000,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x7FFFFFFF,
|
|
|
|
0xFFFFFFFD,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x7FFFFFFF,
|
|
|
|
0xFFFFFFFE,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x7FFFFFFF,
|
|
|
|
0xFFFFFFFF,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x80000000,
|
|
|
|
0x00000001,
|
|
|
|
0x80000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x80000000,
|
|
|
|
0x00000002,
|
|
|
|
0x40000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x80000000,
|
|
|
|
0x00000003,
|
|
|
|
0x2AAAAAAA,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x80000000,
|
|
|
|
0x00000010,
|
|
|
|
0x08000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x80000000,
|
|
|
|
0x078644FA,
|
|
|
|
0x00000011,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x80000000,
|
|
|
|
0x0747AE14,
|
|
|
|
0x00000011,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x80000000,
|
|
|
|
0x7FFFFFFF,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x80000000,
|
|
|
|
0x80000000,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x80000000,
|
|
|
|
0xFFFFFFFD,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x80000000,
|
|
|
|
0xFFFFFFFE,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0x80000000,
|
|
|
|
0xFFFFFFFF,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFD,
|
|
|
|
0x00000001,
|
|
|
|
0xFFFFFFFD,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFD,
|
|
|
|
0x00000002,
|
|
|
|
0x7FFFFFFE,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFD,
|
|
|
|
0x00000003,
|
|
|
|
0x55555554,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFD,
|
|
|
|
0x00000010,
|
|
|
|
0x0FFFFFFF,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFD,
|
|
|
|
0x078644FA,
|
|
|
|
0x00000022,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFD,
|
|
|
|
0x0747AE14,
|
|
|
|
0x00000023,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFD,
|
|
|
|
0x7FFFFFFF,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFD,
|
|
|
|
0x80000000,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFD,
|
|
|
|
0xFFFFFFFD,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFD,
|
|
|
|
0xFFFFFFFE,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFD,
|
|
|
|
0xFFFFFFFF,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFE,
|
|
|
|
0x00000001,
|
|
|
|
0xFFFFFFFE,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFE,
|
|
|
|
0x00000002,
|
|
|
|
0x7FFFFFFF,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFE,
|
|
|
|
0x00000003,
|
|
|
|
0x55555554,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFE,
|
|
|
|
0x00000010,
|
|
|
|
0x0FFFFFFF,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFE,
|
|
|
|
0x078644FA,
|
|
|
|
0x00000022,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFE,
|
|
|
|
0x0747AE14,
|
|
|
|
0x00000023,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFE,
|
|
|
|
0x7FFFFFFF,
|
|
|
|
0x00000002,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFE,
|
|
|
|
0x80000000,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFE,
|
|
|
|
0xFFFFFFFD,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFE,
|
|
|
|
0xFFFFFFFE,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFE,
|
|
|
|
0xFFFFFFFF,
|
|
|
|
0x00000000,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFF,
|
|
|
|
0x00000001,
|
|
|
|
0xFFFFFFFF,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFF,
|
|
|
|
0x00000002,
|
|
|
|
0x7FFFFFFF,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFF,
|
|
|
|
0x00000003,
|
|
|
|
0x55555555,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFF,
|
|
|
|
0x00000010,
|
|
|
|
0x0FFFFFFF,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFF,
|
|
|
|
0x078644FA,
|
|
|
|
0x00000022,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFF,
|
|
|
|
0x0747AE14,
|
|
|
|
0x00000023,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFF,
|
|
|
|
0x7FFFFFFF,
|
|
|
|
0x00000002,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFF,
|
|
|
|
0x80000000,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFF,
|
|
|
|
0xFFFFFFFD,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFF,
|
|
|
|
0xFFFFFFFE,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2018-11-13 21:08:37 +08:00
|
|
|
[]u32{
|
2018-05-01 13:53:04 +08:00
|
|
|
0xFFFFFFFF,
|
|
|
|
0xFFFFFFFF,
|
|
|
|
0x00000001,
|
|
|
|
},
|
2017-02-09 15:50:03 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
for (cases) |case| {
|
|
|
|
test_one_udivsi3(case[0], case[1], case[2]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-25 17:10:11 +08:00
|
|
|
fn test_one_udivsi3(a: u32, b: u32, expected_q: u32) void {
|
2017-08-19 05:20:03 +08:00
|
|
|
const q: u32 = __udivsi3(a, b);
|
2019-02-09 07:18:47 +08:00
|
|
|
testing.expect(q == expected_q);
|
2017-02-09 15:50:03 +08:00
|
|
|
}
|
2019-04-28 22:12:44 +08:00
|
|
|
|
|
|
|
test "test_divsi3" {
|
|
|
|
const cases = [][3]i32{
|
2019-05-09 08:49:07 +08:00
|
|
|
[]i32{ 0, 1, 0 },
|
|
|
|
[]i32{ 0, -1, 0 },
|
|
|
|
[]i32{ 2, 1, 2 },
|
|
|
|
[]i32{ 2, -1, -2 },
|
|
|
|
[]i32{ -2, 1, -2 },
|
|
|
|
[]i32{ -2, -1, 2 },
|
|
|
|
|
|
|
|
[]i32{ @bitCast(i32, u32(0x80000000)), 1, @bitCast(i32, u32(0x80000000)) },
|
|
|
|
[]i32{ @bitCast(i32, u32(0x80000000)), -1, @bitCast(i32, u32(0x80000000)) },
|
|
|
|
[]i32{ @bitCast(i32, u32(0x80000000)), -2, 0x40000000 },
|
|
|
|
[]i32{ @bitCast(i32, u32(0x80000000)), 2, @bitCast(i32, u32(0xC0000000)) },
|
2019-04-28 22:12:44 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
for (cases) |case| {
|
|
|
|
test_one_divsi3(case[0], case[1], case[2]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_one_divsi3(a: i32, b: i32, expected_q: i32) void {
|
|
|
|
const q: i32 = __divsi3(a, b);
|
|
|
|
testing.expect(q == expected_q);
|
|
|
|
}
|
2019-04-29 15:01:57 +08:00
|
|
|
|
|
|
|
test "test_divmodsi4" {
|
|
|
|
const cases = [][4]i32{
|
2019-05-09 08:49:07 +08:00
|
|
|
[]i32{ 0, 1, 0, 0 },
|
|
|
|
[]i32{ 0, -1, 0, 0 },
|
|
|
|
[]i32{ 2, 1, 2, 0 },
|
|
|
|
[]i32{ 2, -1, -2, 0 },
|
|
|
|
[]i32{ -2, 1, -2, 0 },
|
|
|
|
[]i32{ -2, -1, 2, 0 },
|
|
|
|
[]i32{ 7, 5, 1, 2 },
|
|
|
|
[]i32{ -7, 5, -1, -2 },
|
|
|
|
[]i32{ 19, 5, 3, 4 },
|
|
|
|
[]i32{ 19, -5, -3, 4 },
|
|
|
|
|
|
|
|
[]i32{ @bitCast(i32, u32(0x80000000)), 8, @bitCast(i32, u32(0xf0000000)), 0 },
|
|
|
|
[]i32{ @bitCast(i32, u32(0x80000007)), 8, @bitCast(i32, u32(0xf0000001)), -1 },
|
2019-04-29 15:01:57 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
for (cases) |case| {
|
|
|
|
test_one_divmodsi4(case[0], case[1], case[2], case[3]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_one_divmodsi4(a: i32, b: i32, expected_q: i32, expected_r: i32) void {
|
|
|
|
var r: i32 = undefined;
|
|
|
|
const q: i32 = __divmodsi4(a, b, &r);
|
|
|
|
testing.expect(q == expected_q and r == expected_r);
|
|
|
|
}
|
2019-05-03 15:41:46 +08:00
|
|
|
|
|
|
|
test "test_divdi3" {
|
|
|
|
const cases = [][3]i64{
|
2019-05-09 08:49:07 +08:00
|
|
|
[]i64{ 0, 1, 0 },
|
|
|
|
[]i64{ 0, -1, 0 },
|
|
|
|
[]i64{ 2, 1, 2 },
|
|
|
|
[]i64{ 2, -1, -2 },
|
|
|
|
[]i64{ -2, 1, -2 },
|
|
|
|
[]i64{ -2, -1, 2 },
|
|
|
|
|
|
|
|
[]i64{ @bitCast(i64, u64(0x8000000000000000)), 1, @bitCast(i64, u64(0x8000000000000000)) },
|
|
|
|
[]i64{ @bitCast(i64, u64(0x8000000000000000)), -1, @bitCast(i64, u64(0x8000000000000000)) },
|
|
|
|
[]i64{ @bitCast(i64, u64(0x8000000000000000)), -2, 0x4000000000000000 },
|
|
|
|
[]i64{ @bitCast(i64, u64(0x8000000000000000)), 2, @bitCast(i64, u64(0xC000000000000000)) },
|
2019-05-03 15:41:46 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
for (cases) |case| {
|
|
|
|
test_one_divdi3(case[0], case[1], case[2]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_one_divdi3(a: i64, b: i64, expected_q: i64) void {
|
|
|
|
const q: i64 = __divdi3(a, b);
|
|
|
|
testing.expect(q == expected_q);
|
|
|
|
}
|
|
|
|
|
|
|
|
test "test_moddi3" {
|
|
|
|
const cases = [][3]i64{
|
2019-05-09 08:49:07 +08:00
|
|
|
[]i64{ 0, 1, 0 },
|
|
|
|
[]i64{ 0, -1, 0 },
|
|
|
|
[]i64{ 5, 3, 2 },
|
|
|
|
[]i64{ 5, -3, 2 },
|
|
|
|
[]i64{ -5, 3, -2 },
|
|
|
|
[]i64{ -5, -3, -2 },
|
|
|
|
|
|
|
|
[]i64{ @bitCast(i64, @intCast(u64, 0x8000000000000000)), 1, 0 },
|
|
|
|
[]i64{ @bitCast(i64, @intCast(u64, 0x8000000000000000)), -1, 0 },
|
|
|
|
[]i64{ @bitCast(i64, @intCast(u64, 0x8000000000000000)), 2, 0 },
|
|
|
|
[]i64{ @bitCast(i64, @intCast(u64, 0x8000000000000000)), -2, 0 },
|
|
|
|
[]i64{ @bitCast(i64, @intCast(u64, 0x8000000000000000)), 3, -2 },
|
|
|
|
[]i64{ @bitCast(i64, @intCast(u64, 0x8000000000000000)), -3, -2 },
|
2019-05-03 15:41:46 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
for (cases) |case| {
|
|
|
|
test_one_moddi3(case[0], case[1], case[2]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_one_moddi3(a: i64, b: i64, expected_r: i64) void {
|
|
|
|
const r: i64 = __moddi3(a, b);
|
|
|
|
testing.expect(r == expected_r);
|
|
|
|
}
|
2019-05-03 21:51:11 +08:00
|
|
|
|
|
|
|
test "test_modsi3" {
|
|
|
|
const cases = [][3]i32{
|
2019-05-09 08:49:07 +08:00
|
|
|
[]i32{ 0, 1, 0 },
|
|
|
|
[]i32{ 0, -1, 0 },
|
|
|
|
[]i32{ 5, 3, 2 },
|
|
|
|
[]i32{ 5, -3, 2 },
|
|
|
|
[]i32{ -5, 3, -2 },
|
|
|
|
[]i32{ -5, -3, -2 },
|
|
|
|
[]i32{ @bitCast(i32, @intCast(u32, 0x80000000)), 1, 0x0 },
|
|
|
|
[]i32{ @bitCast(i32, @intCast(u32, 0x80000000)), 2, 0x0 },
|
|
|
|
[]i32{ @bitCast(i32, @intCast(u32, 0x80000000)), -2, 0x0 },
|
|
|
|
[]i32{ @bitCast(i32, @intCast(u32, 0x80000000)), 3, -2 },
|
|
|
|
[]i32{ @bitCast(i32, @intCast(u32, 0x80000000)), -3, -2 },
|
2019-05-03 21:51:11 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
for (cases) |case| {
|
|
|
|
test_one_modsi3(case[0], case[1], case[2]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_one_modsi3(a: i32, b: i32, expected_r: i32) void {
|
|
|
|
const r: i32 = __modsi3(a, b);
|
|
|
|
testing.expect(r == expected_r);
|
|
|
|
}
|
|
|
|
|
|
|
|
test "test_umodsi3" {
|
|
|
|
const cases = [][3]u32{
|
2019-05-09 08:49:07 +08:00
|
|
|
[]u32{ 0x00000000, 0x00000001, 0x00000000 },
|
|
|
|
[]u32{ 0x00000000, 0x00000002, 0x00000000 },
|
|
|
|
[]u32{ 0x00000000, 0x00000003, 0x00000000 },
|
|
|
|
[]u32{ 0x00000000, 0x00000010, 0x00000000 },
|
|
|
|
[]u32{ 0x00000000, 0x078644FA, 0x00000000 },
|
|
|
|
[]u32{ 0x00000000, 0x0747AE14, 0x00000000 },
|
|
|
|
[]u32{ 0x00000000, 0x7FFFFFFF, 0x00000000 },
|
|
|
|
[]u32{ 0x00000000, 0x80000000, 0x00000000 },
|
|
|
|
[]u32{ 0x00000000, 0xFFFFFFFD, 0x00000000 },
|
|
|
|
[]u32{ 0x00000000, 0xFFFFFFFE, 0x00000000 },
|
|
|
|
[]u32{ 0x00000000, 0xFFFFFFFF, 0x00000000 },
|
|
|
|
[]u32{ 0x00000001, 0x00000001, 0x00000000 },
|
|
|
|
[]u32{ 0x00000001, 0x00000002, 0x00000001 },
|
|
|
|
[]u32{ 0x00000001, 0x00000003, 0x00000001 },
|
|
|
|
[]u32{ 0x00000001, 0x00000010, 0x00000001 },
|
|
|
|
[]u32{ 0x00000001, 0x078644FA, 0x00000001 },
|
|
|
|
[]u32{ 0x00000001, 0x0747AE14, 0x00000001 },
|
|
|
|
[]u32{ 0x00000001, 0x7FFFFFFF, 0x00000001 },
|
|
|
|
[]u32{ 0x00000001, 0x80000000, 0x00000001 },
|
|
|
|
[]u32{ 0x00000001, 0xFFFFFFFD, 0x00000001 },
|
|
|
|
[]u32{ 0x00000001, 0xFFFFFFFE, 0x00000001 },
|
|
|
|
[]u32{ 0x00000001, 0xFFFFFFFF, 0x00000001 },
|
|
|
|
[]u32{ 0x00000002, 0x00000001, 0x00000000 },
|
|
|
|
[]u32{ 0x00000002, 0x00000002, 0x00000000 },
|
|
|
|
[]u32{ 0x00000002, 0x00000003, 0x00000002 },
|
|
|
|
[]u32{ 0x00000002, 0x00000010, 0x00000002 },
|
|
|
|
[]u32{ 0x00000002, 0x078644FA, 0x00000002 },
|
|
|
|
[]u32{ 0x00000002, 0x0747AE14, 0x00000002 },
|
|
|
|
[]u32{ 0x00000002, 0x7FFFFFFF, 0x00000002 },
|
|
|
|
[]u32{ 0x00000002, 0x80000000, 0x00000002 },
|
|
|
|
[]u32{ 0x00000002, 0xFFFFFFFD, 0x00000002 },
|
|
|
|
[]u32{ 0x00000002, 0xFFFFFFFE, 0x00000002 },
|
|
|
|
[]u32{ 0x00000002, 0xFFFFFFFF, 0x00000002 },
|
|
|
|
[]u32{ 0x00000003, 0x00000001, 0x00000000 },
|
|
|
|
[]u32{ 0x00000003, 0x00000002, 0x00000001 },
|
|
|
|
[]u32{ 0x00000003, 0x00000003, 0x00000000 },
|
|
|
|
[]u32{ 0x00000003, 0x00000010, 0x00000003 },
|
|
|
|
[]u32{ 0x00000003, 0x078644FA, 0x00000003 },
|
|
|
|
[]u32{ 0x00000003, 0x0747AE14, 0x00000003 },
|
|
|
|
[]u32{ 0x00000003, 0x7FFFFFFF, 0x00000003 },
|
|
|
|
[]u32{ 0x00000003, 0x80000000, 0x00000003 },
|
|
|
|
[]u32{ 0x00000003, 0xFFFFFFFD, 0x00000003 },
|
|
|
|
[]u32{ 0x00000003, 0xFFFFFFFE, 0x00000003 },
|
|
|
|
[]u32{ 0x00000003, 0xFFFFFFFF, 0x00000003 },
|
|
|
|
[]u32{ 0x00000010, 0x00000001, 0x00000000 },
|
|
|
|
[]u32{ 0x00000010, 0x00000002, 0x00000000 },
|
|
|
|
[]u32{ 0x00000010, 0x00000003, 0x00000001 },
|
|
|
|
[]u32{ 0x00000010, 0x00000010, 0x00000000 },
|
|
|
|
[]u32{ 0x00000010, 0x078644FA, 0x00000010 },
|
|
|
|
[]u32{ 0x00000010, 0x0747AE14, 0x00000010 },
|
|
|
|
[]u32{ 0x00000010, 0x7FFFFFFF, 0x00000010 },
|
|
|
|
[]u32{ 0x00000010, 0x80000000, 0x00000010 },
|
|
|
|
[]u32{ 0x00000010, 0xFFFFFFFD, 0x00000010 },
|
|
|
|
[]u32{ 0x00000010, 0xFFFFFFFE, 0x00000010 },
|
|
|
|
[]u32{ 0x00000010, 0xFFFFFFFF, 0x00000010 },
|
|
|
|
[]u32{ 0x078644FA, 0x00000001, 0x00000000 },
|
|
|
|
[]u32{ 0x078644FA, 0x00000002, 0x00000000 },
|
|
|
|
[]u32{ 0x078644FA, 0x00000003, 0x00000000 },
|
|
|
|
[]u32{ 0x078644FA, 0x00000010, 0x0000000A },
|
|
|
|
[]u32{ 0x078644FA, 0x078644FA, 0x00000000 },
|
|
|
|
[]u32{ 0x078644FA, 0x0747AE14, 0x003E96E6 },
|
|
|
|
[]u32{ 0x078644FA, 0x7FFFFFFF, 0x078644FA },
|
|
|
|
[]u32{ 0x078644FA, 0x80000000, 0x078644FA },
|
|
|
|
[]u32{ 0x078644FA, 0xFFFFFFFD, 0x078644FA },
|
|
|
|
[]u32{ 0x078644FA, 0xFFFFFFFE, 0x078644FA },
|
|
|
|
[]u32{ 0x078644FA, 0xFFFFFFFF, 0x078644FA },
|
|
|
|
[]u32{ 0x0747AE14, 0x00000001, 0x00000000 },
|
|
|
|
[]u32{ 0x0747AE14, 0x00000002, 0x00000000 },
|
|
|
|
[]u32{ 0x0747AE14, 0x00000003, 0x00000002 },
|
|
|
|
[]u32{ 0x0747AE14, 0x00000010, 0x00000004 },
|
|
|
|
[]u32{ 0x0747AE14, 0x078644FA, 0x0747AE14 },
|
|
|
|
[]u32{ 0x0747AE14, 0x0747AE14, 0x00000000 },
|
|
|
|
[]u32{ 0x0747AE14, 0x7FFFFFFF, 0x0747AE14 },
|
|
|
|
[]u32{ 0x0747AE14, 0x80000000, 0x0747AE14 },
|
|
|
|
[]u32{ 0x0747AE14, 0xFFFFFFFD, 0x0747AE14 },
|
|
|
|
[]u32{ 0x0747AE14, 0xFFFFFFFE, 0x0747AE14 },
|
|
|
|
[]u32{ 0x0747AE14, 0xFFFFFFFF, 0x0747AE14 },
|
|
|
|
[]u32{ 0x7FFFFFFF, 0x00000001, 0x00000000 },
|
|
|
|
[]u32{ 0x7FFFFFFF, 0x00000002, 0x00000001 },
|
|
|
|
[]u32{ 0x7FFFFFFF, 0x00000003, 0x00000001 },
|
|
|
|
[]u32{ 0x7FFFFFFF, 0x00000010, 0x0000000F },
|
|
|
|
[]u32{ 0x7FFFFFFF, 0x078644FA, 0x00156B65 },
|
|
|
|
[]u32{ 0x7FFFFFFF, 0x0747AE14, 0x043D70AB },
|
|
|
|
[]u32{ 0x7FFFFFFF, 0x7FFFFFFF, 0x00000000 },
|
|
|
|
[]u32{ 0x7FFFFFFF, 0x80000000, 0x7FFFFFFF },
|
|
|
|
[]u32{ 0x7FFFFFFF, 0xFFFFFFFD, 0x7FFFFFFF },
|
|
|
|
[]u32{ 0x7FFFFFFF, 0xFFFFFFFE, 0x7FFFFFFF },
|
|
|
|
[]u32{ 0x7FFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF },
|
|
|
|
[]u32{ 0x80000000, 0x00000001, 0x00000000 },
|
|
|
|
[]u32{ 0x80000000, 0x00000002, 0x00000000 },
|
|
|
|
[]u32{ 0x80000000, 0x00000003, 0x00000002 },
|
|
|
|
[]u32{ 0x80000000, 0x00000010, 0x00000000 },
|
|
|
|
[]u32{ 0x80000000, 0x078644FA, 0x00156B66 },
|
|
|
|
[]u32{ 0x80000000, 0x0747AE14, 0x043D70AC },
|
|
|
|
[]u32{ 0x80000000, 0x7FFFFFFF, 0x00000001 },
|
|
|
|
[]u32{ 0x80000000, 0x80000000, 0x00000000 },
|
|
|
|
[]u32{ 0x80000000, 0xFFFFFFFD, 0x80000000 },
|
|
|
|
[]u32{ 0x80000000, 0xFFFFFFFE, 0x80000000 },
|
|
|
|
[]u32{ 0x80000000, 0xFFFFFFFF, 0x80000000 },
|
|
|
|
[]u32{ 0xFFFFFFFD, 0x00000001, 0x00000000 },
|
|
|
|
[]u32{ 0xFFFFFFFD, 0x00000002, 0x00000001 },
|
|
|
|
[]u32{ 0xFFFFFFFD, 0x00000003, 0x00000001 },
|
|
|
|
[]u32{ 0xFFFFFFFD, 0x00000010, 0x0000000D },
|
|
|
|
[]u32{ 0xFFFFFFFD, 0x078644FA, 0x002AD6C9 },
|
|
|
|
[]u32{ 0xFFFFFFFD, 0x0747AE14, 0x01333341 },
|
|
|
|
[]u32{ 0xFFFFFFFD, 0x7FFFFFFF, 0x7FFFFFFE },
|
|
|
|
[]u32{ 0xFFFFFFFD, 0x80000000, 0x7FFFFFFD },
|
|
|
|
[]u32{ 0xFFFFFFFD, 0xFFFFFFFD, 0x00000000 },
|
|
|
|
[]u32{ 0xFFFFFFFD, 0xFFFFFFFE, 0xFFFFFFFD },
|
|
|
|
[]u32{ 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFD },
|
|
|
|
[]u32{ 0xFFFFFFFE, 0x00000001, 0x00000000 },
|
|
|
|
[]u32{ 0xFFFFFFFE, 0x00000002, 0x00000000 },
|
|
|
|
[]u32{ 0xFFFFFFFE, 0x00000003, 0x00000002 },
|
|
|
|
[]u32{ 0xFFFFFFFE, 0x00000010, 0x0000000E },
|
|
|
|
[]u32{ 0xFFFFFFFE, 0x078644FA, 0x002AD6CA },
|
|
|
|
[]u32{ 0xFFFFFFFE, 0x0747AE14, 0x01333342 },
|
|
|
|
[]u32{ 0xFFFFFFFE, 0x7FFFFFFF, 0x00000000 },
|
|
|
|
[]u32{ 0xFFFFFFFE, 0x80000000, 0x7FFFFFFE },
|
|
|
|
[]u32{ 0xFFFFFFFE, 0xFFFFFFFD, 0x00000001 },
|
|
|
|
[]u32{ 0xFFFFFFFE, 0xFFFFFFFE, 0x00000000 },
|
|
|
|
[]u32{ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFE },
|
|
|
|
[]u32{ 0xFFFFFFFF, 0x00000001, 0x00000000 },
|
|
|
|
[]u32{ 0xFFFFFFFF, 0x00000002, 0x00000001 },
|
|
|
|
[]u32{ 0xFFFFFFFF, 0x00000003, 0x00000000 },
|
|
|
|
[]u32{ 0xFFFFFFFF, 0x00000010, 0x0000000F },
|
|
|
|
[]u32{ 0xFFFFFFFF, 0x078644FA, 0x002AD6CB },
|
|
|
|
[]u32{ 0xFFFFFFFF, 0x0747AE14, 0x01333343 },
|
|
|
|
[]u32{ 0xFFFFFFFF, 0x7FFFFFFF, 0x00000001 },
|
|
|
|
[]u32{ 0xFFFFFFFF, 0x80000000, 0x7FFFFFFF },
|
|
|
|
[]u32{ 0xFFFFFFFF, 0xFFFFFFFD, 0x00000002 },
|
|
|
|
[]u32{ 0xFFFFFFFF, 0xFFFFFFFE, 0x00000001 },
|
|
|
|
[]u32{ 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000 },
|
2019-05-03 21:51:11 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
for (cases) |case| {
|
|
|
|
test_one_umodsi3(case[0], case[1], case[2]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn test_one_umodsi3(a: u32, b: u32, expected_r: u32) void {
|
|
|
|
const r: u32 = __umodsi3(a, b);
|
|
|
|
testing.expect(r == expected_r);
|
|
|
|
}
|